对于职位管理,咱们能够理解它为角色权限的管理,就像前面所说的同样,有了职位管理,后台管理系统绑定好对应的权限之后,新进员工、离职或岗位调整,管理员操做起来就很是的便捷了,只须要从新绑定对应职位就能够作好权限的切换工做。前端
为了方便职位管理,咱们能够将页面设计成下面这个样子python
左边显示部分列表,点击其中一个项后,右边显示对应部门的职位,而后再对职位进行增、改、删等操做web
左边咱们能够直接使用上一章的部门列表接口,而后将jqGrid前端组件修改一下,只显示名称一列就能够了json
而后在前端代码中的jqGrid组件中,增长onSelectRow方法,点击列表项时执行右边列表查询和刷新操做就能够了。api
右边须要增长职位列表查询接口,查询时须要提交部门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方法和调用方法,写起代码来就很是便捷,代码的可读性也大大加强了。工具
接着咱们来处理新增职位操做,新增职位时,须要管理填写的内容只有职位名称,由于所属部门与部门编码在页面中能够直接带过来,另外一个操做就是设置访问权限了,这也是咱们整个权限管理中最重要的一个环节post
由上图能够看到,设置访问权限它是一个树列表,它使用的是ztree控件,按它要求的格式,将列表值传给ztree控件就能够自动生成这样的树列表了,而后前端代码经过ztree控件的onCheck方法,获取全部勾选项对应的菜单项id,组合成权限字串提交到接口,更新到数据表中,该职位就拥有了咱们所勾选的全部权限了。编码
对于访问权限树列表的展现,首先,它须要读取菜单列表,输出ztree控件要求的格式;其次,咱们在编辑职位权限时,须要对已拥有权限的项自动打上勾,这个咱们也能够直接在接口中输出对应的参数来进行设置。spa
因此咱们能够在上一章的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/