欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

我的第一个python web开发框架(37)——职位管理功能

程序员文章站 2023-01-11 14:30:09
对于职位管理,我们可以理解它为角色权限的管理,就像前面所说的一样,有了职位管理,后台管理系统绑定好对应的权限以后,新进员工、离职或岗位调整,管理员操作起来就非常的便捷了,只需要重新绑定对应职位就可以做好权限的切换工作。 为了方便职位管理,我们可以将页面设计成下面这个样子 左边显示部分列表,点击其中一 ......

  对于职位管理,我们可以理解它为角色权限的管理,就像前面所说的一样,有了职位管理,后台管理系统绑定好对应的权限以后,新进员工、离职或岗位调整,管理员操作起来就非常的便捷了,只需要重新绑定对应职位就可以做好权限的切换工作。

  为了方便职位管理,我们可以将页面设计成下面这个样子

我的第一个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方法和调用方法,写起代码来就非常便捷,代码的可读性也大大增强了。

 

  接着我们来处理新增职位操作,新增职位时,需要管理填写的内容只有职位名称,因为所属部门与部门编码在页面中可以直接带过来,另一个操作就是设置访问权限了,这也是我们整个权限管理中最重要的一个环节

我的第一个python web开发框架(37)——职位管理功能

  由上图可以看到,设置访问权限它是一个树列表,它使用的是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/