分支: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. Spring boot构建基于rest的Web服务

    一.介绍:使用Spring Boot我们可以很容易的创建一个可独立运行的Rest web服务,其中内嵌tomact,我们只需“run”就可以查看效果了. Spring Boot利用Gradle或Mav ...

  2. Kafka笔记--分布式环境搭建

    部署: http://www.cnblogs.com/likehua/p/3999538.html http://blog.csdn.net/kimmking/article/details/8263 ...

  3. Spring AOP 原理

    AOP将应用系统分为两部分,核心业务逻辑(Core businessconcerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中 ...

  4. zabbix如何选择适合的监控类型(107)

    zabbix agent zabbix自带的客户端程序(被动模式),zabbix server主动向它收集监控数据.agent提供丰富的key,包括不限于cpu.内存.网络.磁盘.web等等.如果你不 ...

  5. 浅谈JVM内存区域划分

    好吧,虽说真的有看过<深入分析Java Web技术内幕>一书,但当时看的时候还是一知半解,稀里糊涂的看完了.本来是打算暑假拿起来再看一遍的,但是早两天一个阿里学长给我做了个小面试,让我颇受 ...

  6. XSS初体验

    主要内容 什么是XSS? XSS的危害有哪些? 常见的XSS漏洞 如何防范XSS?   什么是XSS? 跨站脚本攻击(Cross Site Scripting),是一种 Web 应用程序的漏洞,当来自 ...

  7. 【转】修改Android工程的名称、安装路径

    申明:转载自:http://blog.csdn.net/hcj116/article/details/21712353 在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总 ...

  8. mysql 中文乱码的解决方法

    添加或修改my.ini 配置文件,设置编码字符为utf8 ,默认为latin1,见红色字体 [mysql]# 设置mysql客户端默认字符集default-character-set=utf8 [my ...

  9. AngularJs学习笔记3——自定义指令

    指令 概述: 前面也说过一些常用指令,用于快速入门.现在详细总结一下:指令用于实现各种页面的操作,是对于底层DOM操作的封装,扩展了HTML的行为,实现页面交互以及数据绑定. 指令是一种执行的信号,一 ...

  10. [置顶] 【VB.NET2010】注册表写入方法

    这里,以添加启动项为例: Imports Microsoft.Win32 Imports System.Reflection.Assembly   Private Sub SetAuto_Click( ...