diff --git a/apps/passport/controllers/back.js b/apps/passport/controllers/back.js index 1ee7926..5d614ed 100644 --- a/apps/passport/controllers/back.js +++ b/apps/passport/controllers/back.js @@ -10,6 +10,7 @@ const helpers = require(`${library}/helpers`); const service = require('../models/back-service'); const sessionService = require('../models/session-service'); +const passportHelper = require('../models/passport-helper'); // 本地地址 localhost helpers.urlFormat = helpers.fakeUrlFormat; @@ -30,17 +31,19 @@ module.exports.indexPage = (req, res, next) => { /** * 校验用户输入信息,是否是已经注册的用户 */ -module.exports.validateUserInputAPI = (req, res, next) => { +module.exports.validateInputAPI = (req, res, next) => { let userInput = req.body.phoneNum || ''; - let areaCode = req.body.area || '86'; + let areaCode = (req.body.area || '86').replace('+', ''); service.validateEmailOrMobileAsync(userInput, areaCode) .then(result => { req.inputInfo = result; + console.log(result); next(); }) .catch(err => { + console.log(err); res.json({ code: 400, message: err @@ -48,6 +51,26 @@ module.exports.validateUserInputAPI = (req, res, next) => { }); }; +/** + * 校验用户输入信息,是否是已经注册的用户 + */ +module.exports.validateInputPage = (req, res, next) => { + let userInput = req.body.phoneNum || ''; + + let areaCode = (req.body.area || '86').replace('+', ''); + + console.log(userInput, areaCode); + + service.validateEmailOrMobileAsync(userInput, areaCode) + .then(result => { + req.inputInfo = result; + next(); + }) + .catch(()=> { + res.redirect('/passport/back/index.html'); + }); +}; + module.exports.getUserInfoAPI = (req, res, next) => { let inputInfo = req.inputInfo; @@ -57,55 +80,100 @@ module.exports.getUserInfoAPI = (req, res, next) => { }).catch(next); }; -module.exports.sendCodeAPI = (req, res, next) => { +module.exports.sendCodePage = (req, res, next) => { let inputInfo = req.inputInfo; - service.sendCodeToUserAsync(inputInfo.type, inputInfo.mobile, inputInfo.area).then(result => { - switch (inputInfo.type) { - case 'email': - { - res.redirect('/passport/back/sendEmail.html'); - break; - } - case 'mobile': - { - res.redirect('/passport/back/verification.html'); - break; - } - default: - { - res.redirect('/passport/back/index.html'); - } + service.sendCodeToUserAsync(inputInfo.type, inputInfo.phone, inputInfo.area).then(result => { + if (_.isEmpty(result)) { + res.redirect('/passport/back/index.html'); + } else { + next(); } - }).catch(next); -}; -module.exports.sendBackMobileAPI = (req, res, next) => { - let mobile = req.param('mobile', ''); + }).catch(() => { + res.redirect('/passport/back/index.html'); + }); +}; - let area = req.param('area', '86'); +module.exports.saveInSession = (req, res) => { + switch (req.inputInfo.type) { + case 'email': + { + req.session.email = req.inputInfo.phone; + res.redirect('/passport/back/sendEmail.html'); + break; + } + case 'mobile': + { + req.session.mobile = req.inputInfo.phone; + req.session.area = req.inputInfo.area; + res.redirect('/passport/back/verification.html'); + break; + } + default: + { + res.redirect('/passport/back/index.html'); + } + } +}; +module.exports.sendBackMobileAPI = (req, res, next) => { service.sendCodeToMobileAsync(area, mobile) .then(result => { res.json(result); }).catch(next); }; +module.exports.validateMobileAPI = (req, res, next) => { + let mobile = req.body.mobile || ''; + + let area = req.body.area || '86'; + + const ERR = {code: 400, message: '验证失败'}; + + if (!helpers.verifyAreaMobile(helpers.makeAreaMobile(area, mobile))) { + res.json(ERR); + } else { + next(); + } +}; + +module.exports.validateEmailInSession = (req, res, next) => { + let email = req.session.email || ''; + + if (!email) { + res.redirect('/passport/back/index.html'); + } + + const mapperEmailISP = { + 'yoho.cn': 'http://smail.yoho.cn' + }; + + let isp = email.split('@')[1]; + + req.body.emailUrl = mapperEmailISP[isp] || `http://mail.${isp}`; + next(); +}; + module.exports.sendEmailPage = (req, res, next) => { - service.getSendEmailPageDataAsync() + passportHelper.getLeftBannerAsync() .then(result => { res.render('back/send-email', Object.assign({ - module: 'passport', - page: 'back-send-email-ok', - title: "邮件发送成功" - }, result - )); + module: 'passport', + page: 'back-send-email-ok', + title: "邮件发送成功" + }, { + email: req.body.emailUrl + }, { + coverHref: result.url, + coverImg: result.img + })); }).catch(next); }; -module.exports.checkCodePage = (req, res, next) => { - let code = req.param('code', ''); +module.exports.verifyCodeByEmailPage = (req, res, next) => { + let code = req.query.code || ''; service.checkEmailCodeAsync(code) .then(result => { @@ -118,17 +186,22 @@ module.exports.checkCodePage = (req, res, next) => { }; module.exports.resetPasswordPage = (req, res, next) => { - let code = res.query.code || ''; + let code = req.query.code || ''; - service.getLeftBannerAsync() + passportHelper.getLeftBannerAsync() .then(result => { res.render('back/reset-pwd', Object.assign({ module: 'passport', page: 'back-reset-pwd', - title:'重新设置密码' + title: '重新设置密码' }, { code: code - }, result)) + }, { + resetPwd: { + coverHref: result.url, + coverImg: result.img + } + })) }).catch(next); }; @@ -137,19 +210,20 @@ module.exports.resetPasswordPage = (req, res, next) => { */ module.exports.verifyCodeByMobilePage = (req, res, next) => { - service.getVerifyCodeByMobilePageDataAsync() + passportHelper.getLeftBannerAsync() .then(result => { res.render('back/verification', Object.assign({ module: 'passport', page: 'back-verify-mobile-code', title: '手机验证' }, { + mobile: req.body.mobile, + area: req.body.area, + verifyCode: req.body.verifyCode + }, { verification: { coverHref: result.url, - coverImg: result.img, - mobile: result.mobile, - area: result.area, - verifyCode: result.verifyCode + coverImg: result.img } })); }).catch(next); @@ -160,10 +234,10 @@ module.exports.verifyCodeByMobileAPI = (req, res, next) => { }; module.exports.checkSuccessStatusPage = (req, res, next) => { - let successType = sessionService.get('successType', ''); + let successType = req.session.successType || ''; if (successType) { - sessionService.set('successType', ''); + delete req.session.successType; next(); } else { res.redirect('/passport/back/index.html'); @@ -171,17 +245,22 @@ module.exports.checkSuccessStatusPage = (req, res, next) => { }; module.exports.resetPwdSuccessPage = (req, res, next) => { - service.getLeftBannerAsync() + passportHelper.getLeftBannerAsync() .then(result => { - res.render('back/email-reset-success', Object.assign({ + res.render('back/reset-success', Object.assign({ module: 'passport', - page: 'back-reset-success', + page: 'back-index', title: '重置密码成功' - }, result)) + }, { + resetSuccess: { + coverHref: result.url, + coverImg: result.img + } + })) }).catch(next); }; -module.exports.verifyCodyByMobileAPI = (req, res, next) => { +module.exports.verifyCodeByMobileAPI = (req, res, next) => { let mobile = req.param('mobile', ''); @@ -210,18 +289,31 @@ module.exports.tokenCheckPage = (req, res, next) => { }; module.exports.validationPwdPage = (req, res, next) => { - let pwd = req.param('pwd', ''); + let pwd = req.body.pwd || ''; - if (helpers.verifyPassword(pwd)) { - res.redirect('/passport/back/index.html'); - } else { + if (helpers.isPassword(pwd)) { next(); + } else { + res.redirect('/passport/back/index.html'); } }; module.exports.updatePwdPage = (req, res, next) => { - let code = req.param('code', ''); - + let code = req.body.code || ''; let auth = req.authInfo; + + +}; + +module.exports.validateMobileInSession = (req, res, next) => { + req.body.mobile = req.session.mobile || ""; + req.body.verifyCode = req.session.verifyCode || ""; + req.body.area = req.session.area || ""; + + if (req.body.mobile && req.body.verifyCode) { + next() + } else { + res.redirect('/passport/back/index.html'); + } }; diff --git a/apps/passport/controllers/captcha.js b/apps/passport/controllers/captcha.js index 85b5ee0..3f4c476 100644 --- a/apps/passport/controllers/captcha.js +++ b/apps/passport/controllers/captcha.js @@ -10,7 +10,7 @@ const sessionService = require('../models/session-service'); const captcha = require('../models/captcha-service')(sessionService); const helpers = require(library + '/helpers'); -exports.checkAPI = (req, res, next) => { +exports.validateAPI = (req, res, next) => { let captchaToken = req.body.verifyCode || ''; captcha.findByContentAsync(captchaToken) @@ -26,7 +26,7 @@ exports.checkAPI = (req, res, next) => { }); }; -exports.checkPage = (req, res, next) => { +exports.validatePage = (req, res, next) => { let captchaToken = req.body.verifyCode || ''; captcha.findByContentAsync(captchaToken) diff --git a/apps/passport/models/back-service.js b/apps/passport/models/back-service.js index 6472c47..202a474 100644 --- a/apps/passport/models/back-service.js +++ b/apps/passport/models/back-service.js @@ -12,7 +12,6 @@ const _ = require('lodash'); const moment = require('moment'); const userService = require('./user-service'); -const sessionService = require('./session-service'); const passportHelper = require('./passport-helper'); const BACK_LEFT_BANNER_CODE = '3bbaf502c447a2ddad60879042e286d8'; //找回密码左边的banner @@ -22,7 +21,6 @@ module.exports.validateEmailOrMobileAsync = (userInput, areaCode) => { let result = {type: 'email', area: '', phone: ''}; if (helpers.verifyEmail(userInput)) { - result.type = 'email'; result.area = ''; result.phone = userInput; @@ -108,12 +106,6 @@ module.exports.sendCodeToUserAsync = (type, mobile, areaCode) => { * 发送找回手机号短信 */ module.exports.sendCodeToMobileAsync = (areaCode, mobile) => { - const ERR = {code: 400, message: '验证失败'}; - - if (!helpers.verifyAreaMobile(helpers.makeAreaMobile(areaCode, mobile))) { - return ERR; - } - return api.sendCodeToMobileAsync(mobile, areaCode); }; @@ -143,7 +135,14 @@ module.exports.indexPageDataAsync = () => { }; module.exports.getVerifyCodeByMobilePageDataAsync = () => { - + return co(function * () { + return { + verification: { + coverHref: '', + coverImg: '' + } + } + })(); }; module.exports.getSendEmailPageDataAsync = () => { diff --git a/apps/passport/models/passport-helper.js b/apps/passport/models/passport-helper.js index 891cc2b..e565788 100644 --- a/apps/passport/models/passport-helper.js +++ b/apps/passport/models/passport-helper.js @@ -5,7 +5,6 @@ 'use strict'; -const Cache = require(library + '/cache'); const helpers = require(library + '/helpers'); const Promise = require('bluebird'); const co = Promise.coroutine; diff --git a/apps/passport/models/session-service.js b/apps/passport/models/session-service.js index 0c012a7..61ed672 100644 --- a/apps/passport/models/session-service.js +++ b/apps/passport/models/session-service.js @@ -15,3 +15,5 @@ module.exports.findCaptchaByTokenAsync = (token) => { } })(); }; + + diff --git a/apps/passport/router.js b/apps/passport/router.js index 68ff602..e927573 100644 --- a/apps/passport/router.js +++ b/apps/passport/router.js @@ -25,34 +25,37 @@ router.get('/login/wechat/callback', login.wechat.callback); router.get('/back/index.html', Back.indexPage); // 实时验证输入是否正确 -router.post('/back/authcode', Captcha.checkAPI, Back.validateUserInputAPI, Back.getUserInfoAPI); +router.post('/back/authcode', Captcha.validateAPI, Back.validateInputAPI, Back.getUserInfoAPI); -// 提交按钮确定 -router.post('/back/mobile', Captcha.checkPage, Back.validateUserInputAPI, Back.sendCodeAPI); +// 提交按钮邮件API +router.post('/back/email', Captcha.validatePage, Back.validateInputPage, Back.sendCodePage, Back.saveInSession); + +// 提交按钮手机API +router.post('/back/mobile', Captcha.validatePage, Back.validateInputPage, Back.sendCodePage, Back.saveInSession); /** * 邮件找回密码 */ // 发送邮件成功页面 -router.get('/back/sendEmail.html', Back.sendEmailPage); +router.get('/back/sendEmail.html', Back.validateEmailInSession, Back.sendEmailPage); /** * 短信找回密码 */ // 验证手机短信页面 -router.get('/back/verification.html', Back.verifyCodeByMobilePage); +router.get('/back/verification.html', Back.validateMobileInSession, Captcha.validatePage, Back.verifyCodeByMobilePage); // 重新发送短信接口 -router.post('/back/sendBackMobile', Captcha.checkAPI, Back.sendBackMobileAPI); +router.post('/back/sendBackMobile', Captcha.validateAPI, Back.validateMobileAPI, Back.sendBackMobileAPI); // 验证手机验证码接口 -router.post('/back/backMobile', Captcha.checkAPI, Back.verifyCodyByMobileAPI); +router.post('/back/backMobile', Captcha.validateAPI, Back.verifyCodeByMobileAPI); /** * 重置密码 */ // 重置密码页面 -router.get('/back/backcode', Back.tokenCheckPage, Back.checkCodePage, Back.resetPasswordPage); +router.get('/back/backcode', Back.tokenCheckPage, Back.verifyCodeByEmailPage, Back.resetPasswordPage); // 重置密码接口 router.post('/back/update', Back.tokenCheckPage, Back.validationPwdPage, Back.updatePwdPage); diff --git a/apps/passport/views/action/back/reset-success.hbs b/apps/passport/views/action/back/reset-success.hbs index 1f1f02e..ca0d71e 100644 --- a/apps/passport/views/action/back/reset-success.hbs +++ b/apps/passport/views/action/back/reset-success.hbs @@ -9,7 +9,6 @@ </div> {{/ resetSuccess}} </div> -{{> layout/footer}} <script type="text/javascript"> (function() { var count = 5, diff --git a/library/helpers.js b/library/helpers.js index a5002dc..e4f0345 100644 --- a/library/helpers.js +++ b/library/helpers.js @@ -319,3 +319,14 @@ exports.makeAreaMobile = (area, mobile) => { return `${area}-${mobile}`; }; + +exports.isPassword = (pwd) => { + if(!pwd){ + return false; + } + + // TODO + let pwdRegexp = /^([a-zA-Z0-9\-\+_!@\#$%\^&\*\(\)\:\;\.=\[\]\\\',\?]){6,20}$/; + + return pwdRegexp.test(_.trim(pwd)); +}; diff --git a/public/js/passport/back-index.page.js b/public/js/passport/back-index.page.js index cfd6ec2..ad52ef8 100644 --- a/public/js/passport/back-index.page.js +++ b/public/js/passport/back-index.page.js @@ -3,4 +3,3 @@ */ require('./back/back'); -require('./') diff --git a/public/js/passport/back-reset-pwd.page.js b/public/js/passport/back-reset-pwd.page.js index fb5a4cb..9eb28de 100644 --- a/public/js/passport/back-reset-pwd.page.js +++ b/public/js/passport/back-reset-pwd.page.js @@ -1,3 +1,5 @@ /** * Created by TaoHuang on 2016/6/21. */ + +require('./back/reset');