【7】使用css/js/html模板来实现一个注册、登录和管理的功能

时间:2023-12-21 20:31:32

分支:auth

static添加文件

css文件夹:

app.css    自定义css样式【*】

bootstrap.min.cs    bootstrap样式

compomemts文件夹: 插件用到的样式

animate.min.css    弹出提示框要到的样式

bootstrap-datepicker3.min.css    日期选择控件用到的样式

select2.min.css    下拉选择框用到的样式

fonts文件夹

bootstrap用到的字体

images文件夹

用到的一些图片

js文件夹

bootstrap.min.js    bootstrap

common.js    一些通用的方法【*】

jquery-2.1.4.min.js     bootstrap依赖jquery

auth文件夹:   用户管理界面用到的js

account.js【*】

compomemts文件夹:

bootstrap-datepicker.min.js    日期控件

bootstrap-notify.min.js    提示控件

jquery.bootstrap.min.js    jquery

jquery.twbsPagination.min.js    分页控件

json2.js    处理json

select2.min.js    下拉框

【*】需要自己动手更改的部分

templates文件夹

base.htm模板文件

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="description" content="Jakey's Blog">
<meta name="keywords" content="Jakey's Blog">
<meta name="author" content="Jakey.Chen">
<link rel='shortcut icon' type='image/x-icon' href="{{ static_url('favicon.ico') }}"/>
<title>Jakey's Blog</title> <link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/app.css">
<link rel="stylesheet" href="/static/css/components/animate.min.css"> <script src="/static/js/jquery-2.1.4.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/common.js"></script>
<script src="/static/js/components/bootstrap-notify.min.js"></script>
<script src="/static/js/components/jquery.bootstrap.min.js"></script>
</head> </head> <body>
{%block header%}
{%end%} {%block content%}
{%end%} {%block footer%}
{%end%}
</body>
</html>

footer.htm 页脚

 <!-- footer -->
<footer class="main-footer">
<div class="container">
<div class="row">
<div class="col-sm-4">
<div class="widget">
<h4 class="title">友情链接</h4>
<div class="content friend-links">
<a href="http://www.cnblogs.com" title="博客园" onclick="_hmt.push(['_trackEvent', 'link', 'click', '博客园'])" target="_blank">博客园</a>
<a href="http://www.bootcss.com/" title="Bootstrap中文网" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'Bootstrap中文网'])" target="_blank">Bootstrap中文网</a>
</div>
</div>
</div> <div class="col-sm-4">
<div class="widget">
<h4 class="title">使用到的技术</h4>
<div class="content tag-cloud">
<a href="http://www.bootcss.com/" title="Bootstrap 3.3.5" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'Bootstrap中文网 3.3.5'])" target="_blank">Bootstrap</a>
<a href="http://www.jquery123.com/" title="jQuery 2.1.4" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'jQuery中文文档'])" target="_blank">jQuery</a>
<a href="https://www.python.org/" title="Python 2.7" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'Python官网'])" target="_blank">Python</a>
<a href="http://www.mysql.com/" title="MySQL 5.5" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'MySQL官网'])" target="_blank">MySQL</a>
<a href="http://www.tornadoweb.org/en/stable/" title="TornadoWeb 4.2" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'TornadoWeb官网'])" target="_blank">Tornado</a>
<a href="http://www.ubuntu.org.cn/server" title="Ubuntu Server 14.04 LTS" onclick="_hmt.push(['_trackEvent', 'link', 'click', 'Ubuntu Server'])" target="_blank">Ubuntu Server</a>
</div>
</div>
</div> <div class="col-sm-4">
<div class="widget">
<h4 class="title">联系我们</h4>
<div class="content friend-links">
<a href="mailto:Jakey.Chen@tpk.com" class='text-muted '>Jakey.Chen</a>
</div>
<div class="content friend-links">
<a href="mailto:281743668@qq.com" class='text-muted '>Orochimaru</a>
</div>
</div>
</div>
</div>
</div>
</footer> <div class="copyright">
<div class="container">
<div class="row">
<div class="col-sm-12">
<span>Copyright &copy; <a href="http://git.oschina.net">开源中国</a></span> |
<span><a href="http://git.oschina.net/jakey.chen/Blog" target="_blank">Jakey.Chen</a></span>
</div>
</div>
</div>
</div>

header.htm 页眉导航

 <!-- header navbar-inverse navbar-fixed-top-->
<div class="container">
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/"><span class="glyphicon glyphicon-cloud" aria-hidden="true"> <strong>BLOG</strong></span></a>
</div> <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
{% if admin is 1%}
<li><a href="/manage/blogs" aria-hidden="true">日 志</a></li>
<li><a href="/manage/comments" aria-hidden="true">评 论</a></li>
<li><a href="/account/info" aria-hidden="true">用 户</a></li>
{% end %}
</ul> {% if not user %}
<ul class="nav navbar-nav navbar-right">
<li><a href="/">注 册</a></li>
<li><a href="/">登 录</a></li>
</ul>
{% else %}
<ul class="nav navbar-nav navbar-right">
<li><a href="/help"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"> 帮助</span></a></li> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><span class="glyphicon glyphicon-user" id="current_user" aria-hidden="true"> {{user}}</span></a>
<ul class="dropdown-menu">
<li><a href="/changepasswd"><span class="glyphicon glyphicon-th-list" aria-hidden="true"> 修 改 密 码</span></a></li>
<li><a href="/login"><span class="glyphicon glyphicon-repeat" aria-hidden="true"> 切 换 账 户</span></a></li>
<li><a href="/logout"><span class="glyphicon glyphicon-off" aria-hidden="true"> 退 出 登 录</span></a></li>
</ul>
</li>
</ul>
{% end %}
</div>
</div>
</div>
</nav>
</div>

index.htm 主页

 {% extends "base.htm" %}

 {%block header%}
{%include 'header.htm'%}
{%end%} {%block content%}
<div class="bs-docs-container">
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<ol class="carousel-indicators">
<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
<li data-target="#myCarousel" data-slide-to="1"></li>
<li data-target="#myCarousel" data-slide-to="2"></li>
</ol> <div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide img-full" src="{{ static_url('images/s-2.jpg') }}" alt="First slide">
<div class="container">
<div class="carousel-caption">
<h1>Younger World Better Future</h1>
<p>更好的世界,更好的未来。</p>
<p><a class="btn btn-lg btn-danger" href="/register" role="button">注册账号</a></p>
</div>
</div>
</div> <div class="item">
<img class="second-slide img-full" src="{{ static_url('images/s-3.jpg') }}" alt="Second slide">
<div class="container">
<div class="carousel-caption">
<h1>Beyond Coding, Social Collaboration</h1>
<p>不只是编码,我们更注重社会化协作!</p>
<p><a class="btn btn-lg btn-primary" href="/login" role="button">已有账号?登陆 >></a></p>
</div>
</div>
</div> <div class="item">
<img class="third-slide img-full" src="{{ static_url('images/s-4.jpg') }}" alt="Third slide">
<div class="container">
<div class="carousel-caption">
<h1>Share Games,Share Dreams.</h1>
<p>分享青春,共筑未来。</p>
<p><a class="btn btn-lg btn-success" href="mailto:Jakey.Chen@tpk.com" role="button">联系我们</a></p>
</div>
</div>
</div>
</div> <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
<span class="sr-only">Previous</span>
</a> <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
{%end%} {%block footer%}
{%include 'footer.htm'%}
{%end%}

auth文件夹里面存放关于注册登录等的html

register.htm 注册页面

 {% extends "../base.htm" %}

 {%block header%}
{%include '../header.htm'%}
{%end%} {%block content%}
<div class="bs-docs-container">
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide img-full" src="{{ static_url('images/auth/bg_3.jpg') }}" alt="First slide"> <div class="container">
<div class="carousel-caption">
<h1 id="register_info" style="color: red">{{error}}</h1>
<form class="form-signin" role="form" name="register_form" action="/register" method="POST">
{% raw xsrf_form_html() %}
<h2 class="form-signin-heading">用 户 注 册</h2>
<p></p> <input type="email" name="input_email" class="form-control" value='{{input_email}}' placeholder="邮 箱" required autofocus>
<p></p> <input type="text" name="input_user" class="form-control" value='{{input_user}}' placeholder="用 户 名" required> <input type="password" name="input_passwd" class="form-control" placeholder="密 码" required>
<p></p> <button class="btn btn-lg btn-primary btn-block" type="submit">注 册</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{%end%} {%block footer%}
{%include '../footer.htm'%}
{%end%}

login.htm  登录界面

 {% extends "../base.htm" %}

 {%block header%}
{%include '../header.htm'%}
{%end%} {%block content%}
<div class="bs-docs-container">
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide img-full" src="{{ static_url('images/auth/bg_3.jpg') }}" alt="First slide"> <div class="container">
<div class="carousel-caption">
<h1 id="register_info" style="color: red">{{error}}</h1>
<form class="form-signin" role="form" name="register_form" action="/register" method="POST">
{% raw xsrf_form_html() %}
<h2 class="form-signin-heading">用 户 注 册</h2>
<p></p> <input type="email" name="input_email" class="form-control" value='{{input_email}}' placeholder="邮 箱" required autofocus>
<p></p> <input type="text" name="input_user" class="form-control" value='{{input_user}}' placeholder="用 户 名" required> <input type="password" name="input_passwd" class="form-control" placeholder="密 码" required>
<p></p> <button class="btn btn-lg btn-primary btn-block" type="submit">注 册</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
{%end%} {%block footer%}
{%include '../footer.htm'%}
{%end%}

changepasswd.htm   修改密码界面

 {% extends "../base.htm" %}

 {%block header%}
{%include '../header.htm'%}
{%end%} {%block content%}
<div class="bs-docs-container">
<div id="myCarousel" class="carousel slide" data-ride="carousel">
<div class="carousel-inner" role="listbox">
<div class="item active">
<img class="first-slide img-full" src="{{ static_url('images/auth/bg_1.jpg') }}" alt="First slide"> <div class="container">
<div class="carousel-caption">
<h1 id="changepasswd_info" style="color: red">{{error}}</h1>
<form class="form-signin" role="form" name="register_form" action="/changepasswd" method="POST">
{% raw xsrf_form_html() %}
<h2 class="form-signin-heading">修 改 密 码</h2>
<p></p> <input type="text" name="input_user" class="form-control" placeholder="NickName" value='{{user}}' required readonly>
<p></p> <input type="password" name="input_old_passwd" class="form-control" placeholder="旧密码" value="" required autofocus>
<p></p> <input type="password" name="input_new_passwd" class="form-control" placeholder="新密码" value="" required>
<p></p> <button class="btn btn-lg btn-primary btn-block" type="submit">修 改</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div> {%end%} {%block footer%}
{%include '../footer.htm'%}
{%end%}

account.htm  用户管理界面

 {% extends "../base.htm" %}

 {%block header%}
{%include '../header.htm'%}
{%end%} {%block content%}
<script src="{{ static_url('js/knockout/knockout-2.1.0.js') }}"></script>
<script src="{{ static_url('js/knockout/knockout.mapping-2.4.1.js') }}"></script>
<script src="{{ static_url('js/auth/account.js') }}"></script>
<script src="{{ static_url('js/components/jquery.twbsPagination.min.js') }}"></script> <div class="bs-docs-container">
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="row" style="margin-top: 10px; margin-bottom: 10px">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-btn">
<div href="#modal_adduser" role="button" class="btn btn-info" data-toggle="modal"><span class="glyphicon glyphicon-plus"> 增加</span></div>
</span>
</div>
</div>
</div> <div style="min-height: 550px">
<table class="table table-hover table-bordered">
<thead>
<tr>
<th colspan="7">
<h3 class="table_title" id="table_title">用 户 列 表</h3>
</th>
</tr> <tr class="table_header">
<td>序号</td>
{% if admin is 1%}
<td>ID</td>
{% end %}
<td>用户名</td>
<td>邮箱</td>
<td>权限</td>
<td>状态</td>
<td></td>
</tr>
</thead>
<tbody>
<!-- ko foreach: $data -->
<tr data-bind="css: { 'danger': status() == 0, '': status() == 1 }">
<td data-bind="text: $index() + 1"></td>
{% if admin is 1%}
<td >
<span id="user_id" data-bind="text: id" />
</td>
{% end %}
<td >
<span id="user_name" data-bind="text: name" />
</td>
<td >
<span id="email" data-bind="text: email" />
</td>
<td >
<select id="admin" data-bind="value: admin">
<option value="0">普通用户</option>
<option value="1">管理员</option>
</select>
</td>
<td >
<select id="status" data-bind="value: status">
<option value="0">禁用</option>
<option value="1">可用</option>
</select>
</td>
<td>
<button class="btn btn-link" id="deleteButton" data-bind="click:function(name){update_user(name)}"><span class="glyphicon glyphicon-edit">更新</span></button> <button class="btn btn-link" id="deleteButton" data-bind="click:function(name){delete_user(name)}"><span class="glyphicon glyphicon-trash">删除</span></button>
</td>
</tr>
<!-- /ko -->
</tbody>
</table>
</div>
<div id="pagination_box" class="pull-right">
<ul id="pagination_zc" class="pagination-sm"></ul>
</div>
</div>
</div>
</div> <!-- 模态框 -->
<div class="modal fade" id="modal_adduser" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog" >
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="modal_title">新增用户</h4>
</div>
<div class="modal-body">
<form class="form-horizontal">
<fieldset>
<div class="control-group">
<label class="control-label">邮 箱</label>
<div class="controls">
<input class="input-xlarge" placeholder="邮箱" id="add_email" type="email"/>
</div>
</div>
<div class="control-group">
<label class="control-label">用户名</label>
<div class="controls">
<input class="input-xlarge" placeholder="用户名" id="add_usename" type="text"/>
</div>
</div>
<div class="control-group">
<label class="control-label">密 码</label>
<div class="controls">
<input class="input-xlarge" placeholder="密码" id="add_password" type="password"/>
</div>
</div>
<div class="control-group">
<label class="control-label">权 限</label>
<div class="controls">
<select class="input-xlarge" id="permission">
<option value="1">管理员</option>
<option value="0">普通用户</option>
</select>
</div>
</div>
</fieldset>
</form>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true"><span class="glyphicon glyphicon-remove"> 关闭</span></button>
<button class="btn btn-info" data-dismiss="modal" aria-hidden="true" id="btn_add_user"><span class="glyphicon glyphicon-floppy-save"> 保存</span></button>
</div>
</div>
</div>
</div>
</div>
{%end%} {%block footer%}
{%include '../footer.htm'%}
{%end%}

主函数 main.py

 #!/usr/bin/env python
# coding:utf-8 import logging.config import yaml
import torndb
import tornado.ioloop
import tornado.options
import tornado.httpserver
import tornado.web
from tornado.options import define, options from url import url
from application import settings define("port", default="", help="run on the given port", type=int)
define("mysql_host", default="localhost:3306", help="database host")
define("mysql_user", default="jakey", help="database user")
define("mysql_password", default="", help="database password")
define("mysql_database", default="blog", help="database name") # logging.config.dictConfig(yaml.load(open('logging.yaml', 'r'))) class Application(tornado.web.Application): def __init__(self):
tornado.web.Application.__init__(self, url, **settings) self.db = torndb.Connection(
host=options.mysql_host,
database=options.mysql_database,
user=options.mysql_user,
password=options.mysql_password) if __name__ == '__main__':
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

url.py

 #!/usr/bin/env python
# coding:utf-8 import tornado.web
import application url = [(r"^/(favicon\.ico)", tornado.web.StaticFileHandler,
dict(path=application.settings['static_path']))] url += [(r"^/", "handlers.index.IndexHandler")] url += [(r'^/register', "handlers.auth.RegisterHandler")]
url += [(r'^/login', "handlers.auth.LoginHandler")]
url += [(r'^/logout', "handlers.auth.LogoutHandler")]
url += [(r'^/changepasswd', "handlers.auth.ChangePasswdHandler")]
url += [(r'^/account/(\w+)', "handlers.auth.AccountHandler")]

base.py

 #!/usr/bin/env python
# coding: utf-8 from datetime import date, datetime
import json
import tornado.web
import tornado.gen class BaseHandler(tornado.web.RequestHandler):
'''
所有Handler的基类
'''
@property
def db(self):
'''
数据库对象,用于操作数据库
'''
return self.application.db def json(self, status, info):
self.write({
"status": status,
"info": info
}) def get_current_user(self):
'''
获取当前用户
'''
return self.get_secure_cookie("user") def get_current_permission(self):
'''
获取当前用户是否为管理员(1--管理员)
'''
if self.get_current_user():
lst = self.db.query('''select
admin
from
users
where
name=%s''', self.current_user)
return int(lst[0].get('admin', 0))
else:
return 0

auth.py

 #!/usr/bin/env python
#-*- coding:utf-8 -*- import tornado.web
import logging
import datetime
import base64 from base import BaseHandler class RegisterHandler(BaseHandler): '''
注册处理类
''' def get(self, *args, **kwargs):
self.error = {"exists": "用户名或者邮箱已被使用!"}
user = None
error = self.get_argument("error", default="")
input_user = self.get_argument("user", default="")
input_email = self.get_argument("email", default="")
self.render("auth/register.htm",
user=user,
error=self.error.get(error, ""),
input_user=input_user,
input_email=input_email,
admin=0) def post(self):
username = self.get_body_argument("input_user", default="")
email = self.get_body_argument("input_email", default="")
password = self.get_body_argument("input_passwd", default="")
passwd = base64.b64encode(password) # 判断用户名或者邮箱是否已被使用
if not self._checkusername_action(username, email):
self.db.execute('''insert into users
(
name,
email,
password,
image,
admin,
created_at
)
values
(
%s,
%s,
%s,
'none',
'0',
%s
)''',
username,
email,
passwd,
datetime.datetime.now())
self.redirect("/login")
else:
self.redirect(
"/register?error=exists&user={0}&email={1}".format(username, email)) def _checkusername_action(self, username, email):
'''
检查是否有该用户
'''
user = self.db.query(
"select id from users where (name=%s or email=%s)", username, email)
if len(user) == 0:
return False
else:
return True class LoginHandler(BaseHandler): '''
登录处理类
''' def get(self, *args, **kwargs):
self.error = {
"not_exists": "用户名或者邮箱不存在!",
"disable": "该用户名已经停用,若有疑问请联系管理员!",
"passwd_error": "密码错误!"
}
user = None
error = self.get_argument("error", default="")
input_user = self.get_argument("user", default="")
self.render("auth/login.htm",
user=user,
input_user=input_user,
error=self.error.get(error, ""),
admin=0) def post(self):
username = self.get_body_argument("input_user")
password = self.get_body_argument("input_passwd")
cbox_remember = self.get_body_argument("cbox_remember", default="off")
passwd = base64.b64encode(password) if not self._checkusername_action(username):
if not self._has_cn(username):
self.redirect(
"/login?error=not_exists&user={0}".format(username))
else:
self.redirect("/login?error=not_exists") if not self._checkpasswd_action(username, passwd):
if not self._has_cn(username):
self.redirect(
"/login?error=passwd_error&user={0}".format(username))
else:
self.redirect("/login?error=passwd_error")
else:
if self.user[0].status == 0:
if not self._has_cn(username):
self.redirect(
"/login?error=disable&user={0}".format(username))
else:
self.redirect("/login?error=disable")
else:
if cbox_remember == "on":
self.set_secure_cookie(
"user", self.user[0].name, expires_days=30)
else:
self.set_secure_cookie(
"user", self.user[0].name, expires_days=1)
self.redirect("/") def _checkusername_action(self, username):
'''
检查是否有该用户
'''
user = self.db.query(
"select id from users where (name=%s or email=%s)", username, username)
if len(user) == 0:
return False
else:
return True def _checkpasswd_action(self, username, password):
'''
检查用户密码是否正确
'''
user = self.db.query(
"select id,name,status from users where (name=%s and password=%s)", username, password)
if len(user) == 0:
return False
else:
self.user = user
return True def _has_cn(self, text):
'''
万恶的中文
'''
import re
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
return zhPattern.search(text) class LogoutHandler(BaseHandler): '''
退出登录,清除cookie
''' def get(self):
self.clear_cookie('user')
self.redirect("/") class ChangePasswdHandler(BaseHandler): '''
修改用户密码
''' @tornado.web.authenticated
def get(self, *args, **kwargs):
self.error = {"passwd_error": "密码错误!"}
error = self.get_argument("error", default="") self.render("auth/changepasswd.htm",
user=self.current_user,
error=self.error.get(error, ""),
admin=self.get_current_permission()) @tornado.web.authenticated
def post(self):
username = self.get_body_argument("input_user")
old_password = self.get_body_argument("input_old_passwd")
new_password = self.get_body_argument("input_new_passwd")
old_passwd = base64.b64encode(old_password)
new_passwd = base64.b64encode(new_password) if not self._checkpasswd_action(username, old_passwd):
self.redirect("/changepasswd?error=passwd_error")
else:
self.db.execute('''update
users
set
password = %s
where
name = %s''', new_passwd, username)
self.clear_cookie("user")
self.redirect("/login") def _checkpasswd_action(self, username, password):
user = self.db.query(
"select id,name from users where (name=%s and password=%s)", username, password)
if len(user) == 0:
return False
else:
return True class AccountHandler(BaseHandler): '''
用户管理(新增用户,权限更改)
''' @tornado.web.authenticated
def get(self, *args, **kwargs):
self.render("auth/account.htm",
user=self.current_user,
admin=self.get_current_permission()) @tornado.web.authenticated
def post(self, *args, **kwargs):
action = "_%s_action" % args[0]
if hasattr(self, action):
getattr(self, action)()
else:
self.json("fail", "no action!") def _query_all_action(self):
'''
查询用户表
'''
page_record = 10
current_page = self.get_body_argument("current_page", default="")
page_dict = dict() try:
ret = self.db.query('''select count(id) as count from users''')
if ret[0].count%page_record == 0:
total_pages = ret[0].count//page_record
else:
total_pages = ret[0].count//page_record + 1
page_dict["total_pages"] = str(total_pages)
page_dict["total_count"] = str(ret[0].count)
ret = self.db.query('''select
id,
name,
email,
admin,
status
from
users
order by admin desc limit %s, %s''',
(int(current_page)-1)*page_record, page_record)
page_dict["current_page"] = current_page
page_dict["current_data"] = ret
self.json("success", page_dict)
except Exception as e:
self.json("error", str(e)) def _add_user_action(self):
'''
新增用户
'''
username = self.get_body_argument("username", default="")
email = self.get_body_argument("email", default="")
password = self.get_body_argument("password", default="")
admin = self.get_body_argument("permission_id", default="")
passwd = base64.b64encode(password) # 判断用户名或者邮箱是否已被使用
if not self._checkusername_action(username, email):
self.db.execute('''insert into users
(
name,
email,
password,
admin,
status,
image,
created_at
)
values
(
%s,
%s,
%s,
%s,
1,
'none',
%s
)''',
username,
email,
passwd,
admin,
datetime.datetime.now())
ret = self.db.execute('''SELECT LAST_INSERT_ID()''');
user_dict = dict()
user_dict["id"] = str(ret)
user_dict["admin"] = admin
user_dict["email"] = email
user_dict["status"] = ""
user_dict["name"] = username self.json("success", user_dict)
else:
self.json("fail", "exists") def _update_user_action(self):
user_id = self.get_body_argument("user_id", default="")
admin = self.get_body_argument("permission_id", default="")
status_id = self.get_body_argument("status_id", default="") try:
self.db.execute('''update
users
set
admin = %s,
status = %s
where
id = %s''',
admin,
status_id,
user_id)
self.json("success", "success")
except Exception as e:
self.json("error", str(e)) def _delete_user_action(self):
user_id = self.get_body_argument("user_id", default="")
try:
record = self.db.query('''select id from blogs
where user_id = %s limit 0,1''', user_id)
if len(record) == 0:
self.db.execute('''delete from users where id = %s''', user_id)
self.json("success", "success")
else:
self.json("disable", "disable")
except Exception as e:
self.json("error", str(e)) def _checkusername_action(self, username, email):
'''
检查是否有该用户
'''
user = self.db.query(
"select id from users where (name=%s or email=%s)", username, email)
if len(user) == 0:
return False
else:
return True