Authored by 毕凯

注册流程优化

... ... @@ -3,6 +3,7 @@
*/
'use strict';
const _ = require('lodash');
const Promise = require('bluebird');
const passportHelper = require('../models/passport-helper');
const regService = require('../models/reg-service');
const userService = require('../models/user-service');
... ... @@ -45,6 +46,22 @@ let checkMobileMiddleware = (req, res, next) => {
};
/**
* 检查密码格式
*/
let checkPassword = (req, res, next) => {
/* 判断密码是否符合规则 */
let password = req.body.password;
if (!helpers.verifyPassword(password)) {
return res.json({
code: 400,
message: '密码不正确'
});
}
next();
};
/**
* 注册首页
*/
let index = (req, res, next) => {
... ... @@ -128,57 +145,46 @@ let picCaptcha = (req, res) => {
* 发送验证码
*/
let sendBindMsg = (req, res, next) => {
let data = {
code: 400,
message: '',
data: ''
};
let mobile = +req.body.mobile;
let area = +req.body.area;
Promise.coroutine(function*() {
let data = {
code: 400,
message: '',
data: ''
};
// 检查是否检查过
let regCheckKey = 'regCheckMobileNum_' + passportHelper.makeAreaMobile(area, mobile);
let mobile = +req.body.mobile;
let area = +req.body.area;
// 校验是否发送过多
let sendCodeKey = `send_code_${area}_${mobile}`;
// 检查是否检查过
let checkNum = yield cache.get(`regCheckMobileNum_${passportHelper.makeAreaMobile(area, mobile)}`);
cache.get(regCheckKey).then((checkNum) => {
if (!checkNum) {
data.message = '发送失败';
return res.json(data);
}
return cache.get(sendCodeKey).then((sendCodeTimes) => {
if (!sendCodeTimes) {
sendCodeTimes = 0;
} else {
sendCodeTimes = +sendCodeTimes;
}
// 校验是否发送过多
let sendCodeKey = `send_code_${area}_${mobile}`;
let sendCodeTimes = yield cache.get(sendCodeKey);
if (sendCodeTimes >= 10) {
data.message = '您已多次提交验证码,请尽快联系客服解决';
return res.json(data);
}
sendCodeTimes = +(sendCodeTimes || 0);
if (sendCodeTimes >= 5) {
data.message = sendCodeTimes >= 10 ? '您已多次提交验证码,请尽快联系客服解决' : '您收到的验证码短信已超过本日限定最多次数,请您耐心等待';
return res.json(data);
}
/* 向手机发送注册验证码 */
let result = yield regService.sendCodeToMobile(area, mobile);
if (sendCodeTimes >= 5) {
data.message = '您收到的验证码短信已超过本日限定最多次数,请您耐心等待';
return cache.set(sendCodeKey, sendCodeTimes + 1, 3600).then(() => {
if (result.code) {
return res.json(result);
} else {
data.message = '发送失败';
return res.json(data);
}
/* 向手机发送注册验证码 */
return regService.sendCodeToMobile(area, mobile).then((result) => {
return cache.set(sendCodeKey, sendCodeTimes + 1, 3600).then(() => {
if (result.code) {
return res.json(result);
} else {
data.message = '发送失败';
return res.json(data);
}
});
});
});
}).catch(next);
})().catch(next);
};
/**
... ... @@ -208,36 +214,25 @@ let msgCaptcha = (req, res, next) => {
* 注册接口
*/
let mobileRegister = (req, res, next) => {
let data = {
code: 400,
message: '',
data: ''
};
let area = +req.body.area;
let mobile = +req.body.mobile;
/* 判断是否是有效的注册方式,防注册机刷 */
let regExpireTime = req.session._REG_EXPIRE;
if (!regExpireTime || regExpireTime < Date.now()) {
data.message = '注册超时';
return res.json(data);
}
Promise.coroutine(function*() {
let data = {
code: 400,
message: '',
data: ''
};
/* 判断密码是否符合规则 */
let code = +req.body.code; // 短信验证码
let password = req.body.password;
/* 判断是否是有效的注册方式,防注册机刷 */
let regExpireTime = req.session._REG_EXPIRE;
if (!helpers.verifyPassword(password)) {
data.message = '密码不正确';
return res.json(data);
}
if (!regExpireTime || regExpireTime < Date.now()) {
data.message = '注册超时';
return res.json(data);
}
/* IP仅允许点击注册500次/时 */
let ip = req.ip;
let ipKey = 'ip_register_' + ip;
/* IP仅允许点击注册500次/时 */
let ipKey = 'ip_register_' + req.ip;
let ipTimes = yield cache.get(ipKey);
cache.get(ipKey).then((ipTimes) => {
if (!ipTimes) {
ipTimes = 0;
} else {
... ... @@ -249,39 +244,40 @@ let mobileRegister = (req, res, next) => {
return res.json(data);
}
return cache.set(ipKey, ipTimes + 1, 3600).then(() => {
/* 验证注册的标识码是否有效 */
return regService.validMobileCode(area, mobile, code).then((result) => {
if (!result.code || result.code !== 200) {
data.message = '验证码错误';
return res.json(data);
}
yield cache.set(ipKey, ipTimes + 1, 3600);
let area = +req.body.area;
let mobile = +req.body.mobile;
let code = +req.body.code; // 短信验证码
let password = req.body.password;
let result = yield regService.validMobileCode(area, mobile, code); // 验证注册的标识码是否有效
if (!result.code || result.code !== 200) {
data.message = '验证码错误';
return res.json(data);
}
/* 手机注册: 调用注册接口*/
let regResult = yield regService.regMobile(area, mobile, password, cookie.getShoppingKey(req));
if (!regResult.code || regResult.code !== 200) {
data.message = '注册失败';
return res.json(data);
}
let shoppingKey = cookie.getShoppingKey(req);
/* 手机注册: 调用注册接口*/
return regService.regMobile(area, mobile, password, shoppingKey).then((regResult) => {
if (!regResult.code || regResult.code !== 200) {
data.message = '注册失败';
return res.json(data);
}
return authHelper.syncUserSession(regResult.data.uid, req, res).then(() => {
return res.json({
code: 200,
message: '注册成功',
data: {
href: helpers.urlFormat('/passport/reg/success', {
next: cookie.getRefer(req, '/?go=1'),
goShoppingUrl: config.siteUrl
})
}
});
});
});
return authHelper.syncUserSession(regResult.data.uid, req, res).then(() => {
return res.json({
code: 200,
message: '注册成功',
data: {
href: helpers.urlFormat('/passport/reg/success', {
next: cookie.getRefer(req, '/?go=1'),
goShoppingUrl: config.siteUrl
})
}
});
});
}).catch(next);
})().catch(next);
};
let success = (req, res, next) => {
... ... @@ -304,6 +300,7 @@ let success = (req, res, next) => {
module.exports = {
checkCode,
checkMobileMiddleware,
checkPassword,
index,
success,
checkMobile,
... ...
... ... @@ -66,7 +66,7 @@ router.post('/reg/checkmobile', reg.checkMobileMiddleware, reg.checkMobile);
router.post('/reg/piccaptcha', reg.checkCode, reg.picCaptcha);
router.post('/reg/msgcaptcha', reg.checkMobileMiddleware, reg.msgCaptcha);
router.post('/reg/sendBindMsg', reg.checkMobileMiddleware, reg.checkCode, reg.sendBindMsg);
router.post('/reg/mobileregister', reg.checkMobileMiddleware, reg.checkCode, reg.mobileRegister);
router.post('/reg/mobileregister', reg.checkMobileMiddleware, reg.checkPassword, reg.checkCode, reg.mobileRegister);
router.get('/reg/success', reg.success);
/**
... ...