我的第一個python web開發框架(37)——職位管理功能


  對於職位管理,我們可以理解它為角色權限的管理,就像前面所說的一樣,有了職位管理,后台管理系統綁定好對應的權限以后,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好權限的切換工作。

  為了方便職位管理,我們可以將頁面設計成下面這個樣子

  左邊顯示部分列表,點擊其中一個項后,右邊顯示對應部門的職位,然后再對職位進行增、改、刪等操作

  左邊我們可以直接使用上一章的部門列表接口,然后將jqGrid前端組件修改一下,只顯示名稱一列就可以了

  然后在前端代碼中的jqGrid組件中,增加onSelectRow方法,點擊列表項時執行右邊列表查詢和刷新操作就可以了。

  右邊需要增加職位列表查詢接口,查詢時需要提交部門id作為查詢條件,具體接口代碼如下:

 1 @get('/system/positions/')
 2 def callback():
 3     """
 4     獲取列表數據
 5     """
 6     # 部門id
 7     department_id = convert_helper.to_int0(web_helper.get_query('department_id', '部門id'))
 8     # 頁面索引
 9     page_number = convert_helper.to_int1(web_helper.get_query('page', '', is_check_null=False))
10     # 頁面頁碼與顯示記錄數量
11     page_size = convert_helper.to_int0(web_helper.get_query('rows', '', is_check_null=False))
12     sidx = web_helper.get_query('sidx', '', is_check_null=False)
13     sord = web_helper.get_query('sord', '', is_check_null=False)
14     # 初始化排序字段
15     order_by = 'id asc'
16     if sidx:
17         order_by = sidx + ' ' + sord
18 
19     _positions_logic = positions_logic.PositionsLogic()
20     # 讀取記錄
21     wheres = ''
22     if department_id:
23         wheres = 'department_id=' + str(department_id)
24     result = _positions_logic.get_list('*', wheres, page_number, page_size, order_by)
25     if result:
26         # 直接輸出json
27         return json.dumps(result)
28     else:
29         return web_helper.return_msg(-1, "查詢失敗")

  代碼看起來是否感覺很熟悉,和前端列表查詢的代碼差不多,只是接收參數、查詢條件和調用的類不一樣而已。所以我們只需要熟悉工具函數、底層ORM方法和調用方法,寫起代碼來就非常便捷,代碼的可讀性也大大增強了。

 

  接着我們來處理新增職位操作,新增職位時,需要管理填寫的內容只有職位名稱,因為所屬部門與部門編碼在頁面中可以直接帶過來,另一個操作就是設置訪問權限了,這也是我們整個權限管理中最重要的一個環節

  由上圖可以看到,設置訪問權限它是一個樹列表,它使用的是ztree控件,按它要求的格式,將列表值傳給ztree控件就可以自動生成這樣的樹列表了,然后前端代碼通過ztree控件的onCheck方法,獲取所有勾選項對應的菜單項id,組合成權限字串提交到接口,更新到數據表中,該職位就擁有了我們所勾選的所有權限了。

  對於訪問權限樹列表的展示,首先,它需要讀取菜單列表,輸出ztree控件要求的格式;其次,我們在編輯職位權限時,需要對已擁有權限的項自動打上勾,這個我們也可以直接在接口中輸出對應的參數來進行設置。

  所以我們可以在上一章的menu_info.py文件中,增加下面接口來處理,通過提交過來的職位id,來獲取該職位擁有的權限,然后通過逐項判斷菜單項與權限的關系,來判斷是否打勾。

 1 @get('/api/system/menu_info/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     根據用戶職位權限獲取列表數據(樹列表),為已有權限的數據賦值
 5     """
 6     _menu_info_logic = menu_info_logic.MenuInfoLogic()
 7     # 讀取記錄(ztree控件需要輸出記錄id、父id、樹節點名稱、節點是否擴開這幾項參數)
 8     result = _menu_info_logic.get_list('id, parent_id, name, not is_leaf as open, false as checked')
 9     if result and result.get('rows'):
10         # 獲取指定的職位記錄
11         _positions_logic = positions_logic.PositionsLogic()
12         positions_logic_model = _positions_logic.get_model_for_cache(id)
13         if positions_logic_model:
14             # 讀取該職位權限字串
15             page_power = positions_logic_model.get('page_power', '')
16             # 判斷當前菜單項id是否存在於該職位的權限字串中
17             for model in result.get('rows'):
18                 # 如果存在,則表示當前職位擁有該菜單項的權限,即在菜單權限列表中需要打勾
19                 if ',' + str(model.get('id', 0)) + ',' in page_power:
20                     model['checked'] = True
21 
22         return web_helper.return_msg(0, "成功", {'tree_list': result.get('rows')})
23     else:
24         return web_helper.return_msg(-1, "查詢失敗")

  我們再來看看點擊保存后,執行新增職位記錄接口代碼是怎么實現的

 1 @post('/system/positions/')
 2 def callback():
 3     """
 4     新增記錄
 5     """
 6     name = web_helper.get_form('name', '角色名稱')
 7     department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部門id'))
 8     page_power = web_helper.get_form('page_power', '權限列表', is_check_null=False)
 9 
10     _department_logic = department_logic.DepartmentLogic()
11     # 讀取對應的部門記錄
12     department_result = _department_logic.get_model_for_cache(department_id)
13     if not department_result:
14         return web_helper.return_msg(-1, "部門不存在")
15 
16     _positions_logic = positions_logic.PositionsLogic()
17     # 組合更新字段
18     fields = {
19         'name': string(name),
20         'department_id': department_id,
21         'department_code': string(department_result.get('code', '')),
22         'department_name': string(department_result.get('name', '')),
23         'page_power': string(page_power),
24     }
25     # 讀取記錄
26     result = _positions_logic.add_model(fields)
27     if result:
28         # 直接輸出json
29         return web_helper.return_msg(0, '提交成功')
30     else:
31         return web_helper.return_msg(-1, "提交失敗")

  這段代碼跟之前的新增也差不多,先是接收提交的參數,然后組合更新字典,再調用提交到數據表。

 

  修改職位權限功能跟上面的類似,不過接口中需要增加一個獲取職位記錄實體的接口

 1 @get('/system/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     獲取指定記錄
 5     """
 6     _positions_logic = positions_logic.PositionsLogic()
 7     # 讀取記錄
 8     result = _positions_logic.get_model_for_cache(id)
 9     if result:
10         # 直接輸出json
11         return web_helper.return_msg(0, '成功', result)
12     else:
13         return web_helper.return_msg(-1, "查詢失敗")
14 
15 
16 @put('/system/positions/<id:int>/')
17 def callback(id):
18     """
19     修改記錄
20     """
21     name = web_helper.get_form('name', '角色名稱')
22     department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部門id'))
23     page_power = web_helper.get_form('page_power', '權限列表', is_check_null=False)
24     if page_power == ',':
25         page_power = ''
26 
27     _positions_logic = positions_logic.PositionsLogic()
28     positions_result = _positions_logic.get_model_for_cache(id)
29     if department_id != positions_result.get('department_id'):
30         return web_helper.return_msg(-1, '該角色所屬部門錯誤,請與管理員聯系')
31 
32     # 組合更新字段
33     fields = {
34         'name': string(name),
35         'page_power': string(page_power),
36     }
37 
38     # 讀取記錄
39     result = _positions_logic.edit_model(id, fields)
40     if result:
41         # 直接輸出json
42         return web_helper.return_msg(0, '提交成功', result)
43     else:
44         return web_helper.return_msg(-1, "提交失敗")

 

  最后是刪除接口,我們在執行刪除操作時,一定要判斷它是否已綁定了管理員賬號,不然直接刪除后,管理員登錄后台系統以后將沒有任何權限,無法做任何操作。

 1 @delete('/system/positions/<id:int>/')
 2 def callback(id):
 3     """
 4     刪除指定記錄
 5     """
 6     # 判斷要刪除的記錄是否被引用,是的話不能刪除
 7     _manager_logic = manager_logic.ManagerLogic()
 8     if _manager_logic.exists('positions_id=' + str(id)):
 9         return web_helper.return_msg(-1, "當前職位已綁定相關管理員,不能直接刪除")
10 
11     # 刪除記錄
12     _positions_logic = positions_logic.PositionsLogic()
13     result = _positions_logic.delete_model(id)
14     if result:
15         # 直接輸出json
16         return web_helper.return_msg(0, '刪除成功')
17     else:
18         return web_helper.return_msg(-1, "刪除失敗")

 

  最后,大家參照上一章節,在菜單中添加對應的職位管理菜單和控件就可以開始使用了

   

 

  本文對應的源碼下載 

 

版權聲明:本文原創發表於 博客園,作者為 AllEmpty 本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。

python開發QQ群:669058475(本群已滿)、733466321(可以加2群)    作者博客:http://www.cnblogs.com/EmptyFS/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM