對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。 為了方便職位管理,我們可以將頁面設計成下麵這個樣子 左邊顯示部分列表,點擊其中一 ...
對於職位管理,我們可以理解它為角色許可權的管理,就像前面所說的一樣,有了職位管理,後臺管理系統綁定好對應的許可權以後,新進員工、離職或崗位調整,管理員操作起來就非常的便捷了,只需要重新綁定對應職位就可以做好許可權的切換工作。
為了方便職位管理,我們可以將頁面設計成下麵這個樣子
左邊顯示部分列表,點擊其中一個項後,右邊顯示對應部門的職位,然後再對職位進行增、改、刪等操作
左邊我們可以直接使用上一章的部門列表介面,然後將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 作者博客:http://www.cnblogs.com/EmptyFS/