分支: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

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

  1. 基于原生的 html css js php ajax做的一个 web登录和注册系统

    完整代码下载: 百度网盘地址 https://pan.baidu.com/s/1D1gqHSyjgfoOtYCZm7ofJg 提取码 :nf0b 永久有效 注意: 1 如果要正常运行此示例, 本地需要 ...

  2. node.js 初学(二)—— 搭建注册/登录服务器

    node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...

  3. Node.js原生及Express方法实现注册登录原理

    由于本文只是实现其原理,所以没有使用数据库,只是在js里面模拟数据库,当然是种中还是需要用数据库的. 1.node.js原生方法 ①html页面,非常简单,没有一丝美化~我们叫它user.html & ...

  4. HTML+CSS+JS(+Vue)写一个通讯录组件

    求各位大大的Star(*/ω\*). 没有录屏,所以上传的是图片.后面已补充录屏效果. 效果:(主要是参考小米Note3的通讯录的效果做的) 主要功能: 1. 滚动后,通讯录的模块标题会固定在顶部(图 ...

  5. 个人博客制作如何选择前端模板 thinkcmf后台加载新模板 CSS js文件

    我们的博客后台已经搭建好了,接下来我就要选择一个合适的模板做自己的博客,首先要定位你的博客是做什么用的,是属于什么行业,根据自己博客的定位选择适合的模板. 如果你是设计师,又会前端设计开发,那就可以自 ...

  6. Gulp:静态资源(css,js)版本控制

    为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩合并) 文件目录 ...

  7. Underscore.js 的模板功能介绍与应用

    Underscore是一个非常实用的JavaScript库,提供许多编程时需要的功能的支持,他在不扩展任何JavaScript的原生对象的情况下提供很多实用的功能,需要了解的朋友可以详细参考下   U ...

  8. Vue.js项目模板搭建

    前言 从今年(2017年)年初起,我们团队开始引入「Vue.js」开发移动端的产品.作为团队的领头人,我的首要任务就是设计 整体的架构 .一个良好的架构必定是具备丰富的开发经验后才能搭建出来的.虽然我 ...

  9. 【每天半小时学框架】——React.js的模板语法与组件概念

           [重点提前说:组件化与虚拟DOM是React.js的核心理念!]        先抛出一个论题:在React.js中,JSX语法提倡将 HTML 和 CSS 全都写入到JavaScrip ...

随机推荐

  1. 记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

    今天在工程中遇到Hibernate查询的时候,bean中的字段和数据库中的字段不符合(bean中有pageTime字段,但是数据库中没有此列)报错问题. 具体问题环境: 在auto_off表中,off ...

  2. 免小号QQ空间说说刷赞器

    小伙伴们赶紧用等待免小号QQ空间说说刷赞器,几分钟就可以刷好几百赞了噢, 给大家一个下载地址:http://www.dedewl.com/TA/gotoB.php?id=770319205B

  3. Pick two points at random from the interior of a unit square, what is the expected distance between them?

    My solution is as folllowing. This integration is hard to solve. I googled it, and found the result ...

  4. mysql出现错误“ Every derived table must have its own alias”

    Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时 ...

  5. Linux 删除空行

    在Linux上处理一些数据文件时,有时候需要将其中的空行过滤掉,系统中提供的各种工具都可以完成这个功能.将常用的介绍如下吧:1. grep grep . data.txt grep -v '^$' d ...

  6. Linux企业级项目实践之网络爬虫(19)——epoll接口

    由于要实现爬虫程序的快速抓取,显然如果采用阻塞型的I/O方式,那么系统可能很长时间都处在等待内核响应的状态中,这样爬虫程序将大大地降低效率.然而,如果采用非阻塞I/O,那么就要一直调用应用进程,反复对 ...

  7. hdu4085

    http://acm.hdu.edu.cn/showproblem.php?pid=4085 斯坦纳树. 用状压DP. 一共有2K个关键点:1,2...,K和N-K+1,N-K+2...,N,我们用一 ...

  8. 前端开发利器—FIDDLER 转

    http://www.cnblogs.com/yuzhongwusan/archive/2012/07/20/2601306.html 前端开发利器—FIDDLER 1.Fiddler相对其他调试工具 ...

  9. python3-day6(模块)

    一.OS模块 1.os.system('ls -l') #子shell运行,获取返回值,不是结果. 2.os.popen('ls -l').read() #获取结果. 二.sys模块 1.sys.ar ...

  10. WebGIS在行业中应用的演变

    结合我本身的项目及WebGIS在公检法行业中的应用,对此作了一个演变过程的总结:         第一阶段:GIS基本功能的应用:Data Show(数据展示):Search(搜索):Search b ...