ch4-注册 登陆 实现 cookie使用
1 mysql 回调函数优化
1.1 mysql代码:
config.query(handlerStr, value, function (err, data) {
callback && callback(err, data); //回调函数优化
});
1.2 一些请求后还是要指定 回调
如果 post 请求 还是要指定res
reg.js代码
router.post('/', function (req, res) {
var sqlInsert = 'INSERT INTO `user` (`id`, `username`, `pass`, `admin`) VALUES (0, ?, ?)', //?????????????
sqlSelect = 'SELECT * FROM user where username = ?',
user = req.body.userName,
pass = req.body.pass;
sql(sqlSelect, [user], function (err, data) {
//console.log(data);
var md5 = crypto.createHash('md5');//指定编码
if(data.length == 0){ //未存在与当前数据用户名相同的可以注册
//最后插入时候加密
var newpass = md5.update(pass).digest('hex');
sql(sqlInsert, [user, newpass], function (err, data) {
if(err){
res.locals.result = '<p class="err">注册失败,请重试</p>';
return;
}
res.locals.result = '<p class="ok">恭喜注册成功</p>';
res.render('login');
})
}else{ //已存在同用户名 不能注册 或直接登录
res.locals.result = '<p class="err">该用户名已被注册</p>';
res.render('reg'); //
}
});
})
2 注册 form post 提交
router/index.js代码
//注册页面
router.use('/reg', require('./reg')); //当地址为/reg的时候使用reg.js的路由
router/reg.js代码
var express = require('express'),
sql = require('../module/mysql'),
router = express.Router();
//注册页面 即地址为/reg的时候
router.get('/', function (req, res) {
res.render('reg'); //渲染到reg.ejs
});
地址为/reg的时候
router.post('/', function (req, res) {
var sqlInsert = 'INSERT INTO `user` (`id`, `username`, `pass`, `admin`) VALUES (0, ?, ?)', //?????????????
sqlSelect = 'SELECT * FROM user where username = ?',
user = req.body.userName,
pass = req.body.pass;
sql(sqlSelect, [user], function (err, data) {
//console.log(data);
if(data.length == 0){ //未存在与当前数据用户名相同的可以注册
sql(sqlInsert, [user, pass], function (err, data) {
if(err){
res.locals.result = '<p class="err">注册失败,请重试</p>';
return;
}
res.locals.result = '<p class="ok">恭喜注册成功</p>';
res.render('login'); //调到登录页面
})
}else{ //已存在同用户名 不能注册 或直接登录
res.locals.result = '<p class="err">该用户名已被注册</p>';
res.render('reg'); //保留在当前页面
}
});
})
//导出这个模块
module.exports = router;
views/reg.ejs代码
<div><%- locals.result %></div>
<form action="/reg" method="post">
<input type="text" name="userName">
<input type="text" name="pass">
<input type="submit" value="注册">
</form>
</div>
3 登录 reg 地址为/?
3.1
router/index.js代码
//登录页面
router.use('/login', require('./login'));
router/login.js代码
var express = require('express'),
router = express.Router(),
sql = require('../module/mysql');
//登录页面
router.get('/', function (req, res) {
console.log(req.cookies);
res.render('login');//渲染到login.ejs页面
});
router.post('/', function (req, res) {
var sqlOptStr = 'SELECT * FROM `user` WHERE username = ?',
user = req.body['userName'],
pass = req.body['pass'];
sql(sqlOptStr, [user], function (err, data) {
//console.log(data);
if(data.length == 0){ //查询结果不存在即该用户名未被注册
res.json({result: 0});
}else{ //存在相同的用户名
var newpass = md5.update(pass).digest('hex');
if( data[0]['pass'] == pass ){
res.cookie('login', {name: user}, {maxAge: 1000*60*60*24}); //设置cookie
//session 所有后台页面都是可用访问到得
//保存在服务器上的
//当关闭页面 session都会清空
req.session.admin = Number(data[0]['admin']); //Number 将字符串转换为数字
console.log('管理员'+ req.session.admin);
res.json({result: 2}); //成功登陆
}else{
res.json({result: 1});// 密码不对
}
}
})
})
//导出模块
module.exports = router;
views/login.ejs代码
<div><%- locals.result %></div>
<input class="userName form-control" type="text">
<input class="pass" type="password">
<input class="submit btn btn-success" type="submit" value="登录">
//ajax提交
$('.submit').click(function(){
$('#loginAjax input').trigger('blur');
var numError = $('#loginAjax em.err').length;
if(numError){ //有错误
return false;
}else{
$.ajax({
url: '/login',
type: 'post',
dataType: 'json',
data: {
userName: $('.userName').val(),
pass: $('.pass').val()
},
success: function(data){
//console.log('success: '+ data);
//console.log(data.result);
var result = data.result,
userName = $('.userName').val();
switch(result){
case 0: //未注册过
$('.result').empty()
.html('<p>用户名未注册<a href="/reg">请先注册</a></p>');
break;
case 1: //密码不存在
$('.result').empty()
.html('<p>密码不正确,请重新输入</p>');
break;
case 2:
$('.result').empty()
.html('<p>欢迎回来 '+ userName +'!!!</p>');
setTimeout(function(){
window.location.href="/";;
},500)
}
},
error: function(data){
console.log('error: '+ data);
}
})
}
});
3.2
后台 返回的数据不是 ajax指定的数据的时候 即使成功 也走error
res.json({ //返回给ajax() success用
result: '成功'
}) 4 登录成功后保存成功状态
3.1 cookie方式 安装 cookie-parser时 3.2 安装
"cookie-parser": "latest" 3.3 在cookie存在时和不存在不同显示
ch4-注册 登陆 实现 cookie使用的更多相关文章
- SetCookies, cookie规范注册表和cookie存储将会优先于设置在HTTP客户端级别中默认的那些
遇到下面问题解决方法: Hey? 404 抱歉,你输入的网址可能不正确,或者该网页不存在. 7 秒后返回首页 使用独立的本地执行上下文来实现对每个用户(或每个线程)状态的管理. 定义在本地内容中的co ...
- APP注册&登陆 逻辑细节
前言:有多少用户愿意注册登陆,决定了一款产品的最大活跃度. 用户登陆注册系统分为两大类: 自建用户系统:邮箱/手机号/用户名/二维码/人脸识别/指纹 第三方授权用户系统:微信/微博/支付包/豆瓣/Fa ...
- 1_python小程序之实现用户的注册登陆验证功能
python小程序之实现用户的注册登陆验证功能 程序扼要简述: 一.程序流程:1.程序开始2.判断本地文件/数据库是否已存在用户信息,存在则跳转到登陆,否则跳转到注册,注册成功后后跳转到登陆3.判断 ...
- Django项目:CRM(客户关系管理系统)--53--44PerfectCRM实现账号快速注册登陆
# gbacc_ajax_urls.py # ————————42PerfectCRM实现AJAX全局账号注册———————— from django.conf.urls import url fro ...
- Django笔记-登陆、注册(利用cookie实现)
1.项目结构: 2.关键代码: settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'djang ...
- 用JDBC做账号注册登陆
一.先用JDBC做账号登陆 方法一:用createStatement方法做账号登陆 测试结果:当输入正确账号密码时:当输入错误账号密码时: 当用注入攻击输入账号密码时: 注入攻击的原理是 输入任意值' ...
- IOS safari浏览器登陆时Cookie无法保存的问题
近期完成了一个儿童的测评项目,测试到最后的时候发现在ipad mini上登陆成功之后无法跳转页面,而安卓和pc端都可以,找了大半天bug,发现其他的苹果设备都没问题,只能一个一个的调试,结果发现设备的 ...
- python模拟---注册登陆查看个人信息
需求:1.模拟注册: 2.模拟登陆: 3.模拟登陆成功显示登陆成功的用户账号: 一.注册 代码如下: def regetist(): ''' :param username: 注册的账号 :param ...
- jsp+servlet实现最基本的注册登陆功能
源码和数据库下载地址:http://download.csdn.net/detail/biexiansheng/9759722 1:首先需要设计好数据库和数据表,这里简单截图说明我创建的字段和类型. ...
随机推荐
- tkinter第三章(单选和多选)RadioButton CheckButton
最简单的CheckButton多选类 import tkinter as tk #checkButton的内容,多选 root = tk.Tk() v = tk.IntVar()#装整形变量的 #va ...
- .opt,frm,.MYD,.MYI文件如何转为.sql文件?
假如你是网站测试人员,数据库管理员从服务器上导出数据库,如下图: 你会发现这不是.sql文件,需要将其转化. 其实很简单,只要你本地比如D盘有安装“phpstudy”和“SQLyog”就可以,你可以直 ...
- 【2017集美大学1412软工实践_助教博客】团队作业5——测试与发布(Alpha版本)
第五次团队作业成绩公布 题目 团队作业5: http://www.cnblogs.com/happyzm/p/6788792.html 团队成绩 成绩公示如下: 检查项 测试报告 Alpha版本发布说 ...
- 团队作业4——第一次项目冲刺(Alpha版本)4.26
一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度,分配各自接口编写任务. 二.每个人的工作 三.燃尽图 横坐标:工作日,以天为单位,一共七天,代表着Alpha冲刺阶段的时间 ...
- 201521123065《java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学 ...
- javascript面向对象编程笔记
对象:一切事物皆是对象.对象是一个整体,对外提供一些操作.比如说一个收音机是一个对象,我们不需要知道它的内部结构是什么,只需要会使用外部的按钮就可以使用收音机. 面向对象:面向对象语言的标志是他们都有 ...
- 纳税服务系统【统计图Fusionchart】
需求 我们在投诉模块中还有一个功能没有实现: 统计:根据年度将相应年度的每个月的投诉数进行统计,并以图表的形式展示在页面中:在页面中可以选择查看当前年度及其前4年的投诉数.在页面中可以选择不同的年度, ...
- Struts2第九篇【OGNL、valueStack详解】
什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式. Struts2框架使用OGNL作为默认的表达式语言. 为什么我们学 ...
- 解决python第三方插件下载慢的方法
在CMD中输入: pip install 插件名字 --trusted-host pypi.douban.com -i http://pypi.douban.com/simple 就是更换国内源
- MyBatis的俩种事务管理器的类型
JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置. 它依赖于从数据源得 到的连接来管理事务范围. MANAGED从来不回滚或提交一个连接而它会让 容器来管理事务的整个生命周期(比如 S ...