在上一篇博客中,我们对项目结构进行了一些调整,并且实现了查看考勤功能。今天我们来补全一些用户系统的功能:用户管理、批准用户、注销用户、用户登出这4个功能。
9 用户管理、批准、注销及登出
此功能的作用是批准用户的注册,并同时调整其用户组。只有得到了批准的用户在之后的权限系统中才能使用相关功能。该功能的页面如下:
在这个页面,我们可以看到所有的用户(除了Root用户外),也会显示出每个用户的邮箱、所属用户组、状态、注册时间和最后登录时间。在每行的最后,可以对用户进行注销或批准的操作。从图上可知,test用户和test1用户已经被批准,状态为Approved,最后的操作栏显示为注销;test2用户被注销,状态为Logoff;而test3用户为待批准状态,所以其最后的操作按钮显示批准。 用户组的下拉框将列出除Root和Visitor之外的所有用户组。
我们打开user_app.py,来实现UserManage的get请求:
# util/users/userutil.py
def getallusergroup():
usergroup = session.query(UserGroup).filter(and_(UserGroup.groupname != 'Root',UserGroup.groupname != 'Visitor'))
return usergroup
# user_app.py
class UserManage(BaseHandler):
def get(self):
usermanagepath = gettemplatepath('usermanage.html')
users = session.query(User).filter(User.username != 'Root')
usergroups = getallusergroup()
userInfos = []
for user in users:
userInfo = {}
usergrouplist = []
userInfo['username'] = user.username
userInfo['email'] = user.email
userInfo['usergroup'] = user.usergroup
if user.usergroup not in usergrouplist:
usergrouplist.append(user.usergroup)
userInfo['state'] = user.state
userInfo['registerdate'] = user.registerdate
userInfo['lastlogintime'] = user.lastlogintime
if user.state == 'Approved':
userInfo['submit'] = '/logoff'
else:
userInfo['submit'] = '/approve'
userInfo['formid'] = user.id
userInfo['groupid'] = str(user.id)+'_group'
for othergroup in usergroups:
if othergroup.groupname not in usergrouplist:
usergrouplist.append(othergroup.groupname)
userInfo['usergrouplist'] = usergrouplist
userInfos.append(userInfo)
self.render(usermanagepath,userInfos=userInfos,usergroups=usergrouplist)
# main.py
routelist = [
# ...
(r"/usermanage",UserManage),
# ...
]
在UserManage这个RequestHandler中,只包含一个get方法,它会把每个用户的相关信息组成字典,存入userInfos这个list中。值得注意的是formid和groupid这两个值,由于我们在一个页面上有多个表单,因此需要构造formid和groupid来区分每个表单,否则在获取表单值的时候会取错数据;此外,我们还要根据用户状态的不同来决定submit所对应的url是批准还是注销。
前端usermanage.html的代码如下:
<!--usermanage.html-->
{% block content %}
<div class="page-wrapper">
<!-- ============================================================== -->
<!-- Container fluid -->
<!-- ============================================================== -->
<div class="container-fluid">
<!-- =========&#