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

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

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

 @get('/api/system/manager/')
def callback():
"""
获取列表数据
"""
# 页面索引
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 _manager_logic = manager_logic.ManagerLogic()
# 读取记录
result = _manager_logic.get_list('*', '', page_number, page_size, order_by)
if result:
return json.dumps(result, cls=json_helper.CJsonEncoder)
else:
return web_helper.return_msg(-1, "查询失败")

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

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

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

 @get('/api/system/manager/<id:int>/')
def callback(id):
"""
获取指定记录
"""
_manager_logic = manager_logic.ManagerLogic()
# 读取记录
result = _manager_logic.get_model_for_cache(id)
if result:
return web_helper.return_msg(0, '成功', result)
else:
return web_helper.return_msg(-1, "查询失败") @post('/api/system/manager/')
def callback():
"""
新增记录
"""
name = web_helper.get_form('name', '管理员名称')
sex = web_helper.get_form('sex', '性别', is_check_null=False)
if sex != '男':
sex = '女'
mobile = web_helper.get_form('mobile', '手机号码', is_check_null=False)
if mobile and not string_helper.is_mobile(mobile):
return web_helper.return_msg(-1, '手机号码格式不正确')
birthday = web_helper.get_form('birthday', '出生日期', is_check_null=False)
if birthday:
birthday = convert_helper.to_date(birthday)
email = web_helper.get_form('email', 'email', is_check_null=False)
if email and not string_helper.is_email(email):
return web_helper.return_msg(-1, 'Email格式不正确')
remark = web_helper.get_form('remark', '备注', is_check_null=False)
department_id = convert_helper.to_int0(web_helper.get_form('department_id', '所属部门'))
positions_id = convert_helper.to_int0(web_helper.get_form('positions_id', '所属职位'))
is_work = convert_helper.to_int0(web_helper.get_form('is_work', '工作状态'))
is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False)
login_name = web_helper.get_form('login_name', '登录账号')
login_password = web_helper.get_form('login_password1', '登录密码', is_check_special_char=False)
if len(login_password) < 6:
return web_helper.return_msg(-1, '登录密码长度必须大于等于6位')
login_password = encrypt_helper.md5(encrypt_helper.md5(login_password)[2:24]) # 判断提交的部门id是否正确
_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, '所属部门不存在')
# 判断提交的职位id是否正确
_positions_logic = positions_logic.PositionsLogic()
positions_result = _positions_logic.get_model_for_cache(positions_id)
if not positions_result or positions_result.get('department_id') != department_id:
return web_helper.return_msg(-1, '所属职位不存在') _manager_logic = manager_logic.ManagerLogic()
# 组合更新字段
fields = {
'name': string(name),
'sex': string(sex),
'mobile': string(mobile),
'email': string(email),
'remark': string(remark),
'department_id': department_id,
'department_code': string(department_result.get('code', '')),
'department_name': string(department_result.get('name', '')),
'positions_id': positions_id,
'positions_name': string(positions_result.get('name', '')),
'is_work': is_work,
'is_enabled': is_enabled,
'login_name': string(login_name),
'login_password': string(login_password),
}
if birthday:
fields['birthday'] = string(str(birthday))
# 添加记录
result = _manager_logic.add_model(fields)
if result:
return web_helper.return_msg(0, '成功')
else:
return web_helper.return_msg(-1, "提交失败") @put('/api/system/manager/<id:int>/')
def callback(id):
"""
修改记录
"""
name = web_helper.get_form('name', '管理员名称')
sex = web_helper.get_form('sex', '性别', is_check_null=False)
if sex != '男':
sex = '女'
mobile = web_helper.get_form('mobile', '手机号码', is_check_null=False)
if mobile and not string_helper.is_mobile(mobile):
return web_helper.return_msg(-1, '手机号码格式不正确')
birthday = web_helper.get_form('birthday', '出生日期', is_check_null=False)
if birthday:
birthday = convert_helper.to_date(birthday)
email = web_helper.get_form('email', 'email', is_check_null=False)
if email and not string_helper.is_email(email):
return web_helper.return_msg(-1, 'Email格式不正确')
remark = web_helper.get_form('remark', '备注', is_check_null=False)
department_id = convert_helper.to_int0(web_helper.get_form('department_id', '所属部门'))
positions_id = convert_helper.to_int0(web_helper.get_form('positions_id', '所属职位'))
is_work = web_helper.get_form('is_work', '工作状态')
is_enabled = web_helper.get_form('is_enabled', '是否启用', is_check_null=False)
login_name = web_helper.get_form('login_name', '登录账号')
login_password1 = web_helper.get_form('login_password1', '新密码', is_check_null=False, is_check_special_char=False)
# 判断用户是否修改密码
if login_password1:
if len(login_password1) < 6:
return web_helper.return_msg(-1, '新密码长度必须大于等于6位')
login_password1 = encrypt_helper.md5(encrypt_helper.md5(login_password1)[2:24]) # 判断提交的部门id是否正确
_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, '所属部门不存在')
# 判断提交的职位id是否正确
_positions_logic = positions_logic.PositionsLogic()
positions_result = _positions_logic.get_model_for_cache(positions_id)
if not positions_result or positions_result.get('department_id') != department_id:
return web_helper.return_msg(-1, '所属职位不存在') _manager_logic = manager_logic.ManagerLogic()
result = _manager_logic.get_model_for_cache(id)
if not result:
return web_helper.return_msg(-1, '管理员账号不存在') # 组合更新字段
fields = {
'name': string(name),
'sex': string(sex),
'mobile': string(mobile),
'email': string(email),
'remark': string(remark),
'department_id': department_id,
'department_code': string(department_result.get('code', '')),
'department_name': string(department_result.get('name', '')),
'positions_id': positions_id,
'positions_name': string(positions_result.get('name', '')),
'is_work': is_work,
'is_enabled': is_enabled,
'login_name': string(login_name),
}
if birthday:
fields['birthday'] = string(str(birthday))
if login_password1:
fields['login_password'] = string(login_password1)
# 修改记录
result = _manager_logic.edit_model(id, fields)
if result:
return web_helper.return_msg(0, '成功', result)
else:
return web_helper.return_msg(-1, "提交失败")

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

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

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

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

 @delete('/api/system/manager/<id:int>/')
def callback(id):
"""
删除指定记录
"""
_manager_logic = manager_logic.ManagerLogic()
# 删除记录
result = _manager_logic.get_model_for_cache(id)
if result:
# 未离职管理员不能直接删除
if result.get('is_work') == 1:
return web_helper.return_msg(-1, '未离职管理员不能直接删除') result = _manager_logic.delete_model(id)
if result:
return web_helper.return_msg(0, '删除成功') return web_helper.return_msg(-1, "删除失败")

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

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

 @put('/api/system/manager/<id:int>/dimission/')
def callback(id):
"""
设置用户离职
"""
_manager_logic = manager_logic.ManagerLogic()
fields = {
'is_work': False,
'is_enabled': False,
}
# 读取记录
result = _manager_logic.edit_model(id, fields)
if result:
return web_helper.return_msg(0, '成功')
else:
return web_helper.return_msg(-1, "管理员不存在") @put('/api/system/manager/<id:int>/reinstated/')
def callback(id):
"""
设置用户复职
"""
_manager_logic = manager_logic.ManagerLogic()
# 读取记录
result = _manager_logic.get_model_for_cache(id)
if result:
if result.get('is_work'):
return web_helper.return_msg(-1, '该管理员工作状态正常,不需要复职') fields = {
'is_work': True,
'is_enabled': True,
}
# 读取记录
result = _manager_logic.edit_model(id, fields)
if result:
return web_helper.return_msg(0, '成功') 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. windows设置照片查看器为默认的照片查看软件

    复制一下内容到记事本中: 文件名:PotoView.bat 文件内容: @echo off set reg_dir=hklm\SOFTWARE\Microsoft\Windows Photo View ...

  2. Lenovo System x3650 设置管理接口地址

    1.开启服务器. 2.显示<F1> Setup提示后,按 F1.(此提示在屏幕上仅显示几秒钟.必须迅速按 F1.) 如果同时设置了开机密码和管理员密码,则必须输入管理员密码才能访问完整的 ...

  3. windows 安装zookeeper

    1 .下载 java sdk 和zookeeper  安装包 因为zookeeper是依赖java sdk,运行zookeeper先要,安装javaSDK . 2.安装zookeeper,zookee ...

  4. 有人WIFI模块使用详解

    补充 模块在连接路由器时如果希望模块固定IP 不过发现固定IP之后好像连接路由器的等待时间增加了 用的这一款 看一下现在可能用到了引脚 这个模块也有三种模式AP,STA,AP+STA 先说一下模块在A ...

  5. ASP.NET Core 快速入门(环境篇)

    [申明]:本人.NET Core小白.Linux小白.MySql小白.nginx小白.而今天要说是让你精通Linux ... 的开机与关机.nginx安装与部署.Core的Hello World .. ...

  6. 为什么要重写 hashcode 和 equals 方法?

    引言 以前面试的时候被面试官问到过这样一个问题: 你有没有重写过 hashCode 方法? 心里想着我没事重写哪玩意干啥,能不写就不写.嘴上当然没敢这么说,只能略表遗憾的说抱歉,我没写过. 撇了面试官 ...

  7. Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

    目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...

  8. Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...

  9. FragmentTabHostTopDemo【FragmentTabHost固定宽度且居中】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(居中且宽度非全屏)展现. 备注:该Demo主要是演示FragmentTabHost ...

  10. springcloud~服务注册与发现Eureka的使用

    服务注册与发现是微服务里的概念,也是一个基本的组件,负责服务组件的认证,即实现『你是谁』的功能,在服务注册与发现里,存在两种模式,即服务端发现和客户端发现,咱们今天说的eureka属于客户端发现! 下 ...