Tornado笔记——用Tornado搭建假单统计考勤系统(七)

在上一篇博客中,我们对项目结构进行了一些调整,并且实现了查看考勤功能。今天我们来补全一些用户系统的功能:用户管理、批准用户、注销用户、用户登出这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">
                <!-- =========&#