瀏覽代碼

add 登录 退出 修改密码 api

maguohua 8 年之前
父節點
當前提交
71cc9988eb
共有 10 個文件被更改,包括 295 次插入29 次删除
  1. 4 4
      README.md
  2. 20 18
      app.js
  3. 2 2
      config/default.js
  4. 3 4
      controller/v1/captchas.js
  5. 203 0
      controller/v2/user.js
  6. 15 0
      models/v2/user.js
  7. 38 0
      models/v2/userInfo.js
  8. 1 0
      package.json
  9. 4 0
      routes/v1.js
  10. 5 1
      routes/v2.js

+ 4 - 4
README.md

@@ -58,14 +58,14 @@ npm run dev (需开启本地mongodb,如果没有安装mongodb,可以运行 n
 - [x] 食品详情
 - [x] 商家详情
 - [x] 购物车功能
-- [ ] 登录、注册
-- [ ] 修改密码
-- [ ] 用户信息
+- [x] 登录、注册
+- [x] 修改密码
+- [x] 用户信息
+- [ ] 添加、删除、修改收货地址
 - [ ] 下单功能 
 - [ ] 订单列表
 - [ ] 订单详情
 - [ ] 下载App
-- [ ] 添加、删除、修改收货地址
 - [ ] 帐户信息
 - [ ] 服务中心
 - [ ] 红包

+ 20 - 18
app.js

@@ -2,6 +2,7 @@ import express from 'express';
 import db from './mongodb/db.js';
 import config from 'config-lite';
 import router from './routes/index.js';
+import cookieParser from 'cookie-parser'
 import session from 'express-session';
 import connectMongo from 'connect-mongo';
 import winston from 'winston';
@@ -13,28 +14,29 @@ const app = express();
 app.use(express.static('./public'));
 
 app.all('*', (req, res, next) => {
-  	res.header("Access-Control-Allow-Origin", req.headers.origin);
-  	res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
-  	res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
-    res.header("Access-Control-Allow-Credentials", true); //可以带cookies
-  	res.header("X-Powered-By",' 3.2.1')
-    if (req.method == 'OPTIONS') {
-      res.send(200);
-    } else {
-      next();
-    }
+	res.header("Access-Control-Allow-Origin", req.headers.origin);
+	res.header("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With");
+	res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
+  res.header("Access-Control-Allow-Credentials", true); //可以带cookies
+	res.header("X-Powered-By",' 3.2.1')
+  if (req.method == 'OPTIONS') {
+    res.send(200);
+  } else {
+    next();
+  }
 });
 
 const MongoStore = connectMongo(session);
-
+app.use(cookieParser());
 app.use(session({
-  	secret: config.session.secret,
-  	resave: true,
-  	saveUninitialized: false,
-  	cookie: config.session.cookie,
-  	store: new MongoStore({
-    	url: config.url
-  	})
+  name: config.session.name,
+	secret: config.session.secret,
+	resave: true,
+	saveUninitialized: false,
+	cookie: config.session.cookie,
+	store: new MongoStore({
+  	url: config.url
+	})
 }))
 
 // app.use(expressWinston.logger({

+ 2 - 2
config/default.js

@@ -4,8 +4,8 @@ module.exports = {
 	port: 8001,
 	url: 'mongodb://localhost:27017/elm',
 	session: {
-		name: 'elm',
-		secret: 'elm',
+		name: 'SID',
+		secret: 'SID',
 		cookie: {
 			httpOnly: true,
 		    secure:   false,

+ 3 - 4
controller/v1/captchas.js

@@ -8,13 +8,12 @@ class Captchas {
 	}
 	//验证码
 	async getCaptchas(req, res, next){
-		const cap = parseInt(Math.random()*9000+1000);
-		const p = new captchapng(80,30, cap);
+    	const cap = parseInt(Math.random()*9000+1000);
+    	const p = new captchapng(80,30, cap);
         p.color(0, 0, 0, 0); 
         p.color(80, 80, 80, 255);
         const base64 = p.getBase64();
-        req.session.cookie.maxAge = 300000;
-        req.session.cap = cap;
+        res.cookie('cap', cap, { maxAge: 300000, httpOnly: true });
         res.send({
         	code: 'data:image/png;base64,' + base64
         });

+ 203 - 0
controller/v2/user.js

@@ -0,0 +1,203 @@
+'use strict';
+
+import BaseComponent from '../../prototype/baseComponent'
+import formidable from 'formidable'
+import UserInfoModel from '../../models/v2/userInfo'
+import UserModel from '../../models/v2/user'
+import crypto from 'crypto'
+
+class User extends BaseComponent {
+	constructor(){
+		super()
+		this.login = this.login.bind(this);
+		this.encryption = this.encryption.bind(this);
+		this.chanegPassword = this.chanegPassword.bind(this);
+	}
+	async login(req, res, next){
+		const cap = req.cookies.cap;
+		if (!cap) {
+			res.send({
+				status: 0,
+				type: 'ERROR_CAPTCHA',
+				message: '验证码失效',
+			})
+			return
+		}
+		const form = new formidable.IncomingForm();
+		form.parse(req, async (err, fields, files) => {
+			const {username, password, captcha_code} = fields;
+			try{
+				if (!username) {
+					throw new Error('用户名参数错误');
+				}else if(!password){
+					throw new Error('密码参数错误');
+				}else if(!captcha_code){
+					throw new Error('验证码参数错误');
+				}
+			}catch(err){
+				console.log('登陆参数错误', err);
+				res.send({
+					status: 0,
+					type: 'ERROR_QUERY',
+					message: err.message,
+				})
+				return
+			}
+			if (cap.toString() !== captcha_code.toString()) {
+				res.send({
+					status: 0,
+					type: 'ERROR_CAPTCHA',
+					message: '验证码不正确',
+				})
+				return
+			}
+			const newpassword = this.encryption(password);
+			try{
+				const user = await UserModel.findOne({username});
+				if (!user) {
+					const user_id = await this.getId('user_id');
+					const newUser = {username, password: newpassword, user_id};
+					const newUserInfo = {username, user_id, id: user_id};
+					UserModel.create(newUser);
+					UserInfoModel.create(newUserInfo);
+					const userinfo = await UserInfoModel.findOne({user_id}, '-_id');
+					req.session.user_id = user_id;
+					res.send(userinfo);
+				}else if (user.password.toString() !== newpassword.toString()) {
+					res.send({
+						status: 0,
+						type: 'ERROR_PASSWORD',
+						message: '密码错误',
+					})
+					return 
+				}else{
+					req.session.user_id = user.user_id;
+					const userinfo = await UserInfoModel.findOne({user_id: user.user_id}, '-_id');
+					res.send(userinfo) 
+				}
+			}catch(err){
+				console.log('登陆失败', err);
+				res.send({
+					status: 0,
+					type: 'SAVE_USER_FAILED',
+					message: '登陆失败',
+				})
+			}
+		})
+	}
+	async getInfo(req, res, next){
+		const user_id = req.session.user_id;
+		if (!user_id) {
+			res.send({
+				status: 0,
+				type: 'GET_USER_INFO_FAIELD',
+				message: '获取用户信息失败',
+			})
+			return 
+		}
+		try{
+			const userinfo = await UserInfoModel.findOne({user_id}, '-_id');
+			res.send(userinfo) 
+		}catch(err){
+			console.log('获取用户信息失败', err);
+			res.send({
+				status: 0,
+				type: 'GET_USER_INFO_FAIELD',
+				message: '获取用户信息失败',
+			})
+		}
+	}
+	async signout(req, res, next){
+		req.session.user_id = null;
+		res.send({
+			message: '退出成功'
+		})
+	}
+	async chanegPassword(req, res, next){
+		const cap = req.cookies.cap;
+		if (!cap) {
+			res.send({
+				status: 0,
+				type: 'ERROR_CAPTCHA',
+				message: '验证码失效',
+			})
+			return
+		}
+		const form = new formidable.IncomingForm();
+		form.parse(req, async (err, fields, files) => {
+			const {username, oldpassWord, newpassword, confirmpassword, captcha_code} = fields;
+			try{
+				if (!username) {
+					throw new Error('用户名参数错误');
+				}else if(!oldpassWord){
+					throw new Error('必须添加旧密码');
+				}else if(!newpassword){
+					throw new Error('必须填写新密码');
+				}else if(!confirmpassword){
+					throw new Error('必须填写确认密码');
+				}else if(newpassword !== confirmpassword){
+					throw new Error('两次密码不一致');
+				}else if(!captcha_code){
+					throw new Error('请填写验证码');
+				}
+			}catch(err){
+				console.log('修改密码参数错误', err);
+				res.send({
+					status: 0,
+					type: 'ERROR_QUERY',
+					message: err.message,
+				})
+				return
+			}
+			if (cap.toString() !== captcha_code.toString()) {
+				res.send({
+					status: 0,
+					type: 'ERROR_CAPTCHA',
+					message: '验证码不正确',
+				})
+				return
+			}
+			const md5password = this.encryption(oldpassWord);
+			try{
+				const user = await UserModel.findOne({username});
+				if (!user) {
+					res.send({
+						status: 0,
+						type: 'USER_NOT_FOUND',
+						message: '未找到当前用户',
+					})
+				}else if(user.password.toString() !== md5password.toString()){
+					res.send({
+						status: 0,
+						type: 'ERROR_PASSWORD',
+						message: '密码不正确',
+					})
+				}else{
+					user.password = this.encryption(newpassword);
+					user.save();
+					res.send({
+						status: 1,
+						success: '密码修改生效',
+					})
+				}
+			}catch(err){
+				console.log('修改密码失败', err);
+				res.send({
+					status: 0,
+					type: 'ERROR_CHANGE_PASSWORD',
+					message: '修改密码失败',
+				})
+			}
+		})
+	}
+	encryption(password){
+		const newpassword = this.Md5(this.Md5(password).substr(2, 7) + this.Md5(password));
+		return newpassword
+	}
+	Md5(password){
+		const md5 = crypto.createHash('md5');
+		return md5.update(password).digest('base64');
+	}
+} 
+
+export default new User()

+ 15 - 0
models/v2/user.js

@@ -0,0 +1,15 @@
+'use strict';
+
+import mongoose from 'mongoose'
+
+const Schema = mongoose.Schema;
+
+const userSchema = new Schema({
+	user_id: Number,
+	username: String,
+	password: String,
+})
+
+const User = mongoose.model('User', userSchema);
+
+export default User

+ 38 - 0
models/v2/userInfo.js

@@ -0,0 +1,38 @@
+'use strict';
+
+import mongoose from 'mongoose'
+
+const Schema = mongoose.Schema;
+
+const userInfoSchema = new Schema({
+	avatar: {type: String, default: '/img/default/default.jpg'},
+	balance: {type: Number, default: 0},
+	brand_member_new: {type: Number, default: 0},
+	current_address_id: {type: Number, default: 0},
+	current_invoice_id: {type: Number, default: 0},
+	delivery_card_expire_days: {type: Number, default: 0},
+	email: {type: String, default: ''},
+	gift_amount: {type: Number, default: 3},
+	id: Number,
+	user_id: Number,
+	is_active: {type: Number, default: 1},
+	is_email_valid: {type: Boolean, default: false},
+	is_mobile_valid: {type: Boolean, default: true},
+	mobile: {type: String, default: ''},
+	point: {type: Number, default: 0},
+	username: String,
+	column_desc: {
+		game_desc: {type: String, default: '玩游戏领红包'},
+		game_image_hash: {type: String, default: '05f108ca4e0c543488799f0c7c708cb1jpeg'},
+		game_is_show: {type: Number, default: 1},
+		game_link: {type: String, default: 'https://gamecenter.faas.ele.me'},
+		gift_mall_desc: {type: String, default: '0元好物在这里'},
+	},
+})
+
+userInfoSchema.index({id: 1});
+
+
+const UserInfo = mongoose.model('UserInfo', userInfoSchema);
+
+export default UserInfo

+ 1 - 0
package.json

@@ -30,6 +30,7 @@
     "config-lite": "^1.5.0",
     "connect-flash": "^0.1.1",
     "connect-mongo": "^1.3.2",
+    "cookie-parser": "^1.4.3",
     "express": "^4.15.2",
     "express-session": "^1.15.2",
     "express-winston": "^2.3.0",

+ 4 - 0
routes/v1.js

@@ -8,6 +8,7 @@ import Address from '../controller/v1/address'
 import Remark from '../controller/v1/remark'
 import BaseComponent from '../prototype/baseComponent'
 import Captchas from '../controller/v1/captchas'
+import User from '../controller/v2/user'
 const baseHandle = new BaseComponent();
 const router = express.Router();
 
@@ -20,5 +21,8 @@ router.post('/carts/checkout', Carts.checkout);
 router.get('/carts/:cart_id/addresses', Address.getAddress);
 router.get('/carts/:cart_id/remarks', Remark.getRemarks);
 router.post('/captchas', Captchas.getCaptchas);
+router.get('/user', User.getInfo);
+router.post('/changepassword', User.chanegPassword);
 
+ 
 export default router

+ 5 - 1
routes/v2.js

@@ -2,10 +2,14 @@
 
 import express from 'express';
 import Entry from '../controller/v2/entry'
-import CityHandle from '../controller/v1/cities';
+import CityHandle from '../controller/v1/cities'
+import User from '../controller/v2/user'
 const router = express.Router();
 
 router.get('/index_entry', Entry.getEntry);
 router.get('/pois/:geohash', CityHandle.pois);
+router.post('/login', User.login);
+router.get('/signout', User.signout);
+
 
 export default router