后台管理员的管理功能,它主要用来管理后台的登录账号,绑定权限,当然如果想将后台管理扩展成企业相关管理系统,比如用于公司人事管理,在这个基础上进行适当扩展就可以了。

  我们先看看界面效果(也可以看着数据字典来写页面和接口)

  看起来功能项还是不少,管理员也可以直接改为员工管理。列表没有什么特别的地方,所以接口也比较简单,不详细讲解。当然你也可以在这个基础上增加一下按姓名、手机、账号、部门和职位等查询条件上去

  1. @get('/api/system/manager/')
  2. def callback():
  3. """
  4. 获取列表数据
  5. """
  6. # 页面索引
  7. page_number = convert_helper.to_int1(web_helper.get_query('page', '', is_check_null=False))
  8. # 页面页码与显示记录数量
  9. page_size = convert_helper.to_int0(web_helper.get_query('rows', '', is_check_null=False))
  10. sidx = web_helper.get_query('sidx', '', is_check_null=False)
  11. sord = web_helper.get_query('sord', '', is_check_null=False)
  12. # 初始化排序字段
  13. order_by = 'id asc'
  14. if sidx:
  15. order_by = sidx + ' ' + sord
  16.  
  17. _manager_logic = manager_logic.ManagerLogic()
  18. # 读取记录
  19. result = _manager_logic.get_list('*', '', page_number, page_size, order_by)
  20. if result:
  21. return json.dumps(result, cls=json_helper.CJsonEncoder)
  22. else:
  23. return web_helper.return_msg(-1, "查询失败")

  由于在设计管理员数据表时,字段也有不少,所以我们在管理新增与编辑页面上,可以改为标签分类方式查看,这样会比较容易找到自己想要的东西,而不是全部罗列下来一大堆

  我们将管理员信息分为基本信息、权限信息和账户安全设置三类,这样看起来会清晰很多。

  在新增与编辑页面,由于我们的管理员权限需要绑定部门与职位,所以页面上需要增加部门树列表获取与职位列表获取接口的访问,在添加菜单时大家也要记得将这两个调用接口加上,不然等底层权限加上以后,这些页面数据都获取不了。

  1. @get('/api/system/manager/<id:int>/')
  2. def callback(id):
  3. """
  4. 获取指定记录
  5. """
  6. _manager_logic = manager_logic.ManagerLogic()
  7. # 读取记录
  8. result = _manager_logic.get_model_for_cache(id)
  9. if result:
  10. return web_helper.return_msg(0, '成功', result)
  11. else:
  12. return web_helper.return_msg(-1, "查询失败")
  13.  
  14. @post('/api/system/manager/')
  15. def callback():
  16. """
  17. 新增记录
  18. """
  19. name = web_helper.get_form('name', '管理员名称')
  20. sex = web_helper.get_form('sex', '性别', is_check_null=False)
  21. if sex != '男':
  22. sex = '女'
  23. mobile = web_helper.get_form('mobile', '手机号码', is_check_null=False)
  24. if mobile and not string_helper.is_mobile(mobile):
  25. return web_helper.return_msg(-1, '手机号码格式不正确')
  26. birthday = web_helper.get_form('birthday', '出生日期', is_check_null=False)
  27. if birthday:
  28. birthday = convert_helper.to_date(birthday)
  29. email = web_helper.get_form('email', 'email', is_check_null=False)
  30. if email and not string_helper.is_email(email):
  31. return web_helper.return_msg(-1, 'Email格式不正确')
  32. remark = web_helper.get_form('remark', '备注', is_check_null=False)
  33. department_id = convert_helper.to_int0(web_helper.get_form('department_id', '所属部门'))
  34. positions_id = convert_helper.to_int0(web_helper.get_form('positions_id', '所属职位'))
  35. is_work = convert_helper.to_int0(web_helper.get_form('is_work', '工作状态'))
  36. is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False)
  37. login_name = web_helper.get_form('login_name', '登录账号')
  38. login_password = web_helper.get_form('login_password1', '登录密码', is_check_special_char=False)
  39. if len(login_password) < 6:
  40. return web_helper.return_msg(-1, '登录密码长度必须大于等于6位')
  41. login_password = encrypt_helper.md5(encrypt_helper.md5(login_password)[2:24])
  42.  
  43. # 判断提交的部门id是否正确
  44. _department_logic = department_logic.DepartmentLogic()
  45. department_result = _department_logic.get_model_for_cache(department_id)
  46. if not department_result:
  47. return web_helper.return_msg(-1, '所属部门不存在')
  48. # 判断提交的职位id是否正确
  49. _positions_logic = positions_logic.PositionsLogic()
  50. positions_result = _positions_logic.get_model_for_cache(positions_id)
  51. if not positions_result or positions_result.get('department_id') != department_id:
  52. return web_helper.return_msg(-1, '所属职位不存在')
  53.  
  54. _manager_logic = manager_logic.ManagerLogic()
  55. # 组合更新字段
  56. fields = {
  57. 'name': string(name),
  58. 'sex': string(sex),
  59. 'mobile': string(mobile),
  60. 'email': string(email),
  61. 'remark': string(remark),
  62. 'department_id': department_id,
  63. 'department_code': string(department_result.get('code', '')),
  64. 'department_name': string(department_result.get('name', '')),
  65. 'positions_id': positions_id,
  66. 'positions_name': string(positions_result.get('name', '')),
  67. 'is_work': is_work,
  68. 'is_enabled': is_enabled,
  69. 'login_name': string(login_name),
  70. 'login_password': string(login_password),
  71. }
  72. if birthday:
  73. fields['birthday'] = string(str(birthday))
  74. # 添加记录
  75. result = _manager_logic.add_model(fields)
  76. if result:
  77. return web_helper.return_msg(0, '成功')
  78. else:
  79. return web_helper.return_msg(-1, "提交失败")
  80.  
  81. @put('/api/system/manager/<id:int>/')
  82. def callback(id):
  83. """
  84. 修改记录
  85. """
  86. name = web_helper.get_form('name', '管理员名称')
  87. sex = web_helper.get_form('sex', '性别', is_check_null=False)
  88. if sex != '男':
  89. sex = '女'
  90. mobile = web_helper.get_form('mobile', '手机号码', is_check_null=False)
  91. if mobile and not string_helper.is_mobile(mobile):
  92. return web_helper.return_msg(-1, '手机号码格式不正确')
  93. birthday = web_helper.get_form('birthday', '出生日期', is_check_null=False)
  94. if birthday:
  95. birthday = convert_helper.to_date(birthday)
  96. email = web_helper.get_form('email', 'email', is_check_null=False)
  97. if email and not string_helper.is_email(email):
  98. return web_helper.return_msg(-1, 'Email格式不正确')
  99. remark = web_helper.get_form('remark', '备注', is_check_null=False)
  100. department_id = convert_helper.to_int0(web_helper.get_form('department_id', '所属部门'))
  101. positions_id = convert_helper.to_int0(web_helper.get_form('positions_id', '所属职位'))
  102. is_work = web_helper.get_form('is_work', '工作状态')
  103. is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False)
  104. login_name = web_helper.get_form('login_name', '登录账号')
  105. login_password1 = web_helper.get_form('login_password1', '新密码', is_check_null=False, is_check_special_char=False)
  106. # 判断用户是否修改密码
  107. if login_password1:
  108. if len(login_password1) < 6:
  109. return web_helper.return_msg(-1, '新密码长度必须大于等于6位')
  110. login_password1 = encrypt_helper.md5(encrypt_helper.md5(login_password1)[2:24])
  111.  
  112. # 判断提交的部门id是否正确
  113. _department_logic = department_logic.DepartmentLogic()
  114. department_result = _department_logic.get_model_for_cache(department_id)
  115. if not department_result:
  116. return web_helper.return_msg(-1, '所属部门不存在')
  117. # 判断提交的职位id是否正确
  118. _positions_logic = positions_logic.PositionsLogic()
  119. positions_result = _positions_logic.get_model_for_cache(positions_id)
  120. if not positions_result or positions_result.get('department_id') != department_id:
  121. return web_helper.return_msg(-1, '所属职位不存在')
  122.  
  123. _manager_logic = manager_logic.ManagerLogic()
  124. result = _manager_logic.get_model_for_cache(id)
  125. if not result:
  126. return web_helper.return_msg(-1, '管理员账号不存在')
  127.  
  128. # 组合更新字段
  129. fields = {
  130. 'name': string(name),
  131. 'sex': string(sex),
  132. 'mobile': string(mobile),
  133. 'email': string(email),
  134. 'remark': string(remark),
  135. 'department_id': department_id,
  136. 'department_code': string(department_result.get('code', '')),
  137. 'department_name': string(department_result.get('name', '')),
  138. 'positions_id': positions_id,
  139. 'positions_name': string(positions_result.get('name', '')),
  140. 'is_work': is_work,
  141. 'is_enabled': is_enabled,
  142. 'login_name': string(login_name),
  143. }
  144. if birthday:
  145. fields['birthday'] = string(str(birthday))
  146. if login_password1:
  147. fields['login_password'] = string(login_password1)
  148. # 修改记录
  149. result = _manager_logic.edit_model(id, fields)
  150. if result:
  151. return web_helper.return_msg(0, '成功', result)
  152. else:
  153. return web_helper.return_msg(-1, "提交失败")

  这里有三个接口,第一个是管理员记录实体获取接口,用于编辑管理员时,要先从接口读取管理员的相关信息。

  第二个是新增管理员接口,代码看起来很多,其实有一半是处理AJAX提交上来的数据的,大家如果熟悉common工具函数的话,会觉得这些代码非常熟悉,可以直接阅读,当然如果你对工具函数不熟的话,看起来可能会有点蒙,所以说要学好一个陌生框架,最好先熟悉它的工具函数有什么功能。前面让大家一定要反复使用单元测试和手打代码,就是让大家能更容易熟悉这些函数,在后面查看代码时一点都不会吃力。

  第三个是编辑管理员信息接口,代码同新增接口只有很小的差别。

  然后是删除接口,在删除管理员时,我们需要做个限制,判断它是否在职,在职的不能直接删除,以避免误操作。对于管理员账号,如果离职了,最好不要删除,可以留着有需要时查询,当然如果离职员工很多,相关人员又有强迫症不想查看到的话,可以将管理员管理分为两部分(两个单独的页面),一个是在职员工管理,一个是离职页面管理。

  1. @delete('/api/system/manager/<id:int>/')
  2. def callback(id):
  3. """
  4. 删除指定记录
  5. """
  6. _manager_logic = manager_logic.ManagerLogic()
  7. # 删除记录
  8. result = _manager_logic.get_model_for_cache(id)
  9. if result:
  10. # 未离职管理员不能直接删除
  11. if result.get('is_work') == 1:
  12. return web_helper.return_msg(-1, '未离职管理员不能直接删除')
  13.  
  14. result = _manager_logic.delete_model(id)
  15. if result:
  16. return web_helper.return_msg(0, '删除成功')
  17.  
  18. return web_helper.return_msg(-1, "删除失败")

  除了增改删之外,对于管理员来说还会存在离职和复职的情况,所以我们还需要这两个接口,它们相对来说比较简单,离职就是将管理员的账号状态和工作状态都设置为false,复职就将它们改为true就可以了

  可能有人会问,为什么还要增加工作状态和账号状态,用一个来管理不就可以了。如果后台管理系统做的简单的话,一个账号状态就够用了,如果将它拿来管理员工的话,有可能会出现有的员工在职中,但不给它登录系统,所以就需要两个不同的状态来进行管理。

  1. @put('/api/system/manager/<id:int>/dimission/')
  2. def callback(id):
  3. """
  4. 设置用户离职
  5. """
  6. _manager_logic = manager_logic.ManagerLogic()
  7. fields = {
  8. 'is_work': False,
  9. 'is_enabled': False,
  10. }
  11. # 读取记录
  12. result = _manager_logic.edit_model(id, fields)
  13. if result:
  14. return web_helper.return_msg(0, '成功')
  15. else:
  16. return web_helper.return_msg(-1, "管理员不存在")
  17.  
  18. @put('/api/system/manager/<id:int>/reinstated/')
  19. def callback(id):
  20. """
  21. 设置用户复职
  22. """
  23. _manager_logic = manager_logic.ManagerLogic()
  24. # 读取记录
  25. result = _manager_logic.get_model_for_cache(id)
  26. if result:
  27. if result.get('is_work'):
  28. return web_helper.return_msg(-1, '该管理员工作状态正常,不需要复职')
  29.  
  30. fields = {
  31. 'is_work': True,
  32. 'is_enabled': True,
  33. }
  34. # 读取记录
  35. result = _manager_logic.edit_model(id, fields)
  36. if result:
  37. return web_helper.return_msg(0, '成功')
  38.  
  39. return web_helper.return_msg(-1, "管理员不存在")

  完成以上代码后,记得在菜单管理中添加对应的菜单项哦。

  本文对应的源码下载 

版权声明:本文原创发表于 博客园,作者为 AllEmpty 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

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

我的第一个python web开发框架(38)——管理员管理功能的更多相关文章

  1. 我的第一个python web开发框架(41)——总结

    我的第一个python web开发框架系列博文从17年6.7月份开始写(存了近十章稿留到9月份才开始发布),到今天结束,一年多时间,想想真不容易啊. 整个过程断断续续,中间有段时间由于工作繁忙停了好长 ...

  2. 我的第一个python web开发框架(14)——后台管理系统登录功能

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  3. 我的第一个python web开发框架(21)——小结

    这个小网站终于成功上线,小白除了收获一笔不多的费用外,还得到女神小美的赞赏,心中满满的成就感.这一天下班后,他请老菜一起下馆子,兑现请吃饭的承诺,顺便让老菜点评一下. 小白:老大,在你的指导下终于完成 ...

  4. 我的第一个python web开发框架(39)——后台接口权限访问控制处理

    前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处 ...

  5. 我的第一个python web开发框架(1)——前言

    由于之前经验不是很丰富,写的C#系统太过复杂,所以一直想重写,但学的越多越觉得自己懂的越少,越觉的底气不足.所以一直不敢动手,在内心深处对自己讲,要静下心来认真学习,继续沉淀沉淀.这两年多以来找各种机 ...

  6. 我的第一个python web开发框架(3)——怎么开始?

    小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...

  7. 我的第一个python web开发框架(22)——一个安全小事故

    在周末的一个早上,小白还在做着美梦,就收到了小美的连环追魂call,电话一直响个不停. 小白打着哈欠拿起电话:早上好美女. 小美:出事了出事了,我们公司网站一早访问是一片空白,什么内容都没有了,你赶急 ...

  8. 我的第一个python web开发框架(4)——数据库结构设计与创建

    小白做好前端html设计后,马上开始进入数据库结构设计步骤. 在开始之前,小白回忆了一下老大在公司里培训时讲过的数据库设计解说: 对于初学者来说,很多拿到原型时不知道怎么设计数据表结构,这是很正常的事 ...

  9. 我的第一个python web开发框架(8)——项目结构与RESTful接口风格说明

    PS:再次说明一下,原本不想写的太啰嗦的,可之前那个系列发布后发现,好多朋友都想马上拿到代码立即能上手开发自己的项目,对代码结构.基础常识.分类目录与文件功能结构.常用函数......等等什么都不懂, ...

随机推荐

  1. 2017-12-24 为新语言编写Visual Studio Code语法高亮插件

    本文源码库: program-in-chinese/quan4-highlighter 语法高亮是一个开发环境的基本功能. 此文尝试为之前的"圈4"语言(详见编程语言试验之Antl ...

  2. 关于ORACLE的各种操作~持续汇总~

    增.删.改: 增加所有 INSERT INTO 表名 VALUES(序列名.NEXTVAL,'值1','值2','值3','值4','值5'); 指定增加 INSERT INTO 表名(字段1,字段2 ...

  3. python进程、进程池(二)代码部分

    第一种创建进程的方式: from multiprocessing import Process def f(name): print(name,"在子进程") if __name_ ...

  4. 微信小程序去除Button默认样式

    在小程序开发过程中,使用率蛮高的组件button,因为经常要去除默认样式,然后再自定义样式,所以经常写,自己也总结分享一下简单的实现步骤. (一)实现效果1.实现前(默认样式): 2.实现后(去除默认 ...

  5. JavaScript 执行机制

    一.宏任务与微任务 macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTi ...

  6. java双重检测或枚举类实现线程安全单例(懒汉模式)

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

  7. python的进程与线程(二)

    线程 之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:         进程:本质上就是一段程序的运行过程(抽象的概念)         线程:最小的执行单元,是进程的实体     ...

  8. 【Linux篇】--sed的用法

    一.前述 Sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 ...

  9. 《前端之路》之三 数组的属性 && 操作方法(上)

    目录 03:数组的属性 && 操作方法(上) 03:数组的属性 && 操作方法(上) 一.Array property 数组的属性 1.constructor 返回对创 ...

  10. 前端笔记之移动端&响应式(中)视口&百分比布局&弹性盒模型&rem&fillpage

    一.viewport视口 1.1什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕尺寸:指屏幕的对角线的长度,单位是英寸,常见的屏幕尺寸有3.5.3.7.4.2.4.7.5.0.5.5.6.0等. 屏幕 ...