对于职位管理, 我们可以理解它为角色权限的管理, 就像前面所说的一样, 有了职位管理, 后台管理系统绑定好对应的权限以后, 新进员工, 离职或岗位调整, 管理员操作起来就非常的便捷了, 只需要重新绑定对应职位就可以做好权限的切换工作.
为了方便职位管理, 我们可以将页面设计成下面这个样子
左边显示部分列表, 点击其中一个项后, 右边显示对应部门的职位, 然后再对职位进行增, 改, 删等操作
左边我们可以直接使用上一章的部门列表接口, 然后将 jqGrid 前端组件修改一下, 只显示名称一列就可以了
然后在前端代码中的 jqGrid 组件中, 增加 onSelectRow 方法, 点击列表项时执行右边列表查询和刷新操作就可以了.
右边需要增加职位列表查询接口, 查询时需要提交部门 id 作为查询条件, 具体接口代码如下:
- @get('/system/positions/')
- def callback():
- """
- 获取列表数据
- """
- # 部门 id
- department_id = convert_helper.to_int0(web_helper.get_query('department_id', '部门 id'))
- # 页面索引
- page_number = convert_helper.to_int1(web_helper.get_query('page', '', is_check_null=False))
- # 页面页码与显示记录数量
- page_size = convert_helper.to_int0(web_helper.get_query('rows', '', is_check_null=False))
- sidx = web_helper.get_query('sidx', '', is_check_null=False)
- sord = web_helper.get_query('sord', '', is_check_null=False)
- # 初始化排序字段
- order_by = 'id asc'
- if sidx:
- order_by = sidx + ' ' + sord
- _positions_logic = positions_logic.PositionsLogic()
- # 读取记录
- wheres = ''
- if department_id:
- wheres = 'department_id=' + str(department_id)
- result = _positions_logic.get_list('*', wheres, page_number, page_size, order_by)
- if result:
- # 直接输出 json
- return json.dumps(result)
- else:
- return web_helper.return_msg(-1, "查询失败")
- 代码看起来是否感觉很熟悉, 和前端列表查询的代码差不多, 只是接收参数, 查询条件和调用的类不一样而已. 所以我们只需要熟悉工具函数, 底层 ORM 方法和调用方法, 写起代码来就非常便捷, 代码的可读性也大大增强了.
- 接着我们来处理新增职位操作, 新增职位时, 需要管理填写的内容只有职位名称, 因为所属部门与部门编码在页面中可以直接带过来, 另一个操作就是设置访问权限了, 这也是我们整个权限管理中最重要的一个环节
- 由上图可以看到, 设置访问权限它是一个树列表, 它使用的是 ztree 控件, 按它要求的格式, 将列表值传给 ztree 控件就可以自动生成这样的树列表了, 然后前端代码通过 ztree 控件的 onCheck 方法, 获取所有勾选项对应的菜单项 id, 组合成权限字串提交到接口, 更新到数据表中, 该职位就拥有了我们所勾选的所有权限了.
- 对于访问权限树列表的展示, 首先, 它需要读取菜单列表, 输出 ztree 控件要求的格式; 其次, 我们在编辑职位权限时, 需要对已拥有权限的项自动打上勾, 这个我们也可以直接在接口中输出对应的参数来进行设置.
- 所以我们可以在上一章的 menu_info.py 文件中, 增加下面接口来处理, 通过提交过来的职位 id, 来获取该职位拥有的权限, 然后通过逐项判断菜单项与权限的关系, 来判断是否打勾.
- @get('/api/system/menu_info/positions/<id:int>/')
- def callback(id):
- """
- 根据用户职位权限获取列表数据 (树列表), 为已有权限的数据赋值
- """
- _menu_info_logic = menu_info_logic.MenuInfoLogic()
- # 读取记录 (ztree 控件需要输出记录 id, 父 id, 树节点名称, 节点是否扩开这几项参数)
- result = _menu_info_logic.get_list('id, parent_id, name, not is_leaf as open, false as checked')
- if result and result.get('rows'):
- # 获取指定的职位记录
- _positions_logic = positions_logic.PositionsLogic()
- positions_logic_model = _positions_logic.get_model_for_cache(id)
- if positions_logic_model:
- # 读取该职位权限字串
- page_power = positions_logic_model.get('page_power', '')
- # 判断当前菜单项 id 是否存在于该职位的权限字串中
- for model in result.get('rows'):
- # 如果存在, 则表示当前职位拥有该菜单项的权限, 即在菜单权限列表中需要打勾
- if ',' + str(model.get('id', 0)) + ',' in page_power:
- model['checked'] = True
- return web_helper.return_msg(0, "成功", {'tree_list': result.get('rows')})
- else:
- return web_helper.return_msg(-1, "查询失败")
- 我们再来看看点击保存后, 执行新增职位记录接口代码是怎么实现的
- @post('/system/positions/')
- def callback():
- """
- 新增记录
- """ name = web_helper.get_form('name','角色名称')
- department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部门 id'))
- page_power = web_helper.get_form('page_power', '权限列表', is_check_null=False)
- _department_logic = department_logic.DepartmentLogic()
- # 读取对应的部门记录
- department_result = _department_logic.get_model_for_cache(department_id)
- if not department_result:
- return web_helper.return_msg(-1, "部门不存在")
- _positions_logic = positions_logic.PositionsLogic()
- # 组合更新字段
- fields = {
- 'name': string(name),
- 'department_id': department_id,
- 'department_code': string(department_result.get('code', '')),
- 'department_name': string(department_result.get('name', '')),
- 'page_power': string(page_power),
- }
- # 读取记录
- result = _positions_logic.add_model(fields)
- if result:
- # 直接输出 json
- return web_helper.return_msg(0, '提交成功')
- else:
- return web_helper.return_msg(-1, "提交失败")
- 这段代码跟之前的新增也差不多, 先是接收提交的参数, 然后组合更新字典, 再调用提交到数据表.
- 修改职位权限功能跟上面的类似, 不过接口中需要增加一个获取职位记录实体的接口
- @get('/system/positions/<id:int>/')
- def callback(id):
- """
- 获取指定记录
- """
- _positions_logic = positions_logic.PositionsLogic()
- # 读取记录
- result = _positions_logic.get_model_for_cache(id)
- if result:
- # 直接输出 json
- return web_helper.return_msg(0, '成功', result)
- else:
- return web_helper.return_msg(-1, "查询失败")
- @put('/system/positions/<id:int>/')
- def callback(id):
- """
- 修改记录
- """ name = web_helper.get_form('name','角色名称')
- department_id = convert_helper.to_int0(web_helper.get_form('department_id', '部门 id'))
- page_power = web_helper.get_form('page_power', '权限列表', is_check_null=False)
- if page_power == ',':
- page_power = ''
- _positions_logic = positions_logic.PositionsLogic()
- positions_result = _positions_logic.get_model_for_cache(id)
- if department_id != positions_result.get('department_id'):
- return web_helper.return_msg(-1, '该角色所属部门错误, 请与管理员联系')
- # 组合更新字段
- fields = {
- 'name': string(name),
- 'page_power': string(page_power),
- }
- # 读取记录
- result = _positions_logic.edit_model(id, fields)
- if result:
- # 直接输出 json
- return web_helper.return_msg(0, '提交成功', result)
- else:
- return web_helper.return_msg(-1, "提交失败")
- 最后是删除接口, 我们在执行删除操作时, 一定要判断它是否已绑定了管理员账号, 不然直接删除后, 管理员登录后台系统以后将没有任何权限, 无法做任何操作.
- @delete('/system/positions/<id:int>/')
- def callback(id):
- """
- 删除指定记录
- """
- # 判断要删除的记录是否被引用, 是的话不能删除
- _manager_logic = manager_logic.ManagerLogic()
- if _manager_logic.exists('positions_id=' + str(id)):
- return web_helper.return_msg(-1, "当前职位已绑定相关管理员, 不能直接删除")
- # 删除记录
- _positions_logic = positions_logic.PositionsLogic()
- result = _positions_logic.delete_model(id)
- if result:
- # 直接输出 json
- return web_helper.return_msg(0, '删除成功')
- else:
- return web_helper.return_msg(-1, "删除失败")
本文对应的源码下载
来源: https://www.cnblogs.com/EmptyFS/p/9601845.html