back.js 7.99 KB
/**
 * 找回密码
 * Created by Tao.Huang on 2016/6/12.
 */

'use strict';

const _       = require('lodash');
const library = '../../../library';
const helpers = require(`${library}/helpers`);
const service = require('../models/back-service');

const SIGN_IN = helpers.urlFormat('/passport/login');

/**
 * 通过邮箱找回密码页面
 */
const indexEmailPage = (req, res) => {
    res.render('back/email', Object.assign({
        module: 'passport',
        page  : 'back-email',
        title : '找回密码-通过邮箱'
    }, {
        backUrl       : SIGN_IN,
        headerText    : '找回密码',
        isPassportPage: true,
        backEmail     : true
    }));
};

/**
 * 发送验证码到邮箱
 */
const sendCodeToEmailAPI = (req, res) => {
    let email = req.body.email || '';
    const ERR = {
        code   : 400,
        message: '邮箱格式不正确,请重新输入',
        data   : ''
    };

    if (!helpers.verifyEmail(email)) {
        res.json(ERR);
        return;
    }

    service.sendCodeToEmailAsync(email)
        .then(result => {
            if (result.code === 200) {
                result.data = helpers.urlFormat('/passport/back/success', {email: email});
            }

            res.json(result);
        })
        .catch(() => {
            res.json(ERR);
        });
};

/**
 * 重新发送验证码到邮箱
 */
const resendCodeToEmailAPI = (req, res) => {
    let email = req.query.email || '';

    service.sendCodeToEmailAsync(email)
        .then(result => {
            if (_.isEmpty(result)) {
                return Promise.rejected('重新发邮件失败');
            }

            res.json(result);
        })
        .catch(err => {
            res.json({
                code   : 400,
                message: err
            });
        });
};

/**
 * 邮箱找回密码-返回成功页面
 */
const backSuccessByEmailPage = (req, res) => {
    let email = req.query.email || '';

    if (!helpers.verifyEmail(email)) {
        res.redirect(400);
    }

    let domain   = email.split('@')[1];
    let emailUrl = `http://${domain === 'gmail.com' ? 'mail.google.com' : 'mail.'}${domain}`;

    res.render('back/email-success', Object.assign({
        module: 'passport',
        page  : 'back-email-success',
        title : '找回密码-通过邮箱'
    }, {
        backUrl         : helpers.urlFormat('/passport/back/email'),
        headerText      : '找回密码',
        isPassportPage  : true,
        backEmailSuccess: true,
        goEmail         : emailUrl,
        resendUrl       : helpers.urlFormat('/passport/back/resendemail', {email: email})
    }));
};

/**
 * 根据邮箱修改密码
 */
const setNewPasswordByEmailAPI = (req, res) => {
    let pwd  = req.body.password || '';
    let code = req.body.code || '';
    let data = {
        code: 200,
        data: SIGN_IN
    };

    service.modifyPasswordByEmailAsync(pwd, code)
        .then(result => {
            if (result.includes('history.back')) {
                data.code    = 400;
                data.message = '修改失败';
            }

            res.json(data);
        })
        .catch(() => {
            res.json(data);
        });
};

/**
 * 找回密码页面-通过手机号
 */
const indexMobilePage = (req, res, next) => {
    service.getAreaDataAsync()
        .then(result => {
            res.render('back/mobile', Object.assign({
                module: 'passport',
                page  : 'back-mobile',
                title : '找回密码-通过手机号'
            }, {
                backUrl       : SIGN_IN,
                headerText    : '找回密码',
                isPassportPage: true,
                backMobile    : true,
                countrys      : result.data,
                areaCode      : '+86'
            }));
        })
        .catch(next);
};

/**
 * 发送手机验证码
 */
const sendCodeToMobileAPI = (req, res, next) => {
    let phoneNum = req.body.phoneNum || '';
    let areaCode = req.body.areaCode || '86';
    let ERR      = {
        code   : 400,
        message: '输入手机号码出错'
    };

    if (!helpers.verifyMobile(phoneNum)) {
        return res.json(ERR);
    }

    service.sendCodeToMobileAsync(phoneNum, areaCode)
        .then(result => {
            if (_.isEmpty(result) || result.code !== 200) {
                ERR.message = "发送验证码出错";
                res.json(ERR);
            }

            if (result.code === 200) {
                return res.json({
                    code: 200,
                    data: helpers.urlFormat('/passport/back/mobilecode', {
                        phoneNum: phoneNum,
                        areaCode: areaCode
                    })
                });
            }
        })
        .catch(next);
};

/**
 * 校验验证码页面
 */
const verifyCodeByMobilePage = (req, res) => {
    let phoneNum = req.query.phoneNum || '';
    let areaCode = req.query.areaCode || '86';

    res.render('back/mobile-code', Object.assign({
        module: 'passport',
        page  : 'back-code',
        title : '找回密码-通过手机号'
    }, {
        backUrl       : helpers.urlFormat('/passport/back/mobile'),
        headerText    : '找回密码',
        isPassportPage: true,
        backCode      : true,
        areaCode      : areaCode,
        phoneNum      : phoneNum

    }));
};

/**
 * 校验手机验证码
 */
const verifyCodeByMobileAPI = (req, res, next) => {
    let phoneNum = req.body.phoneNum || '';
    let code     = req.body.code || '';
    let areaCode = req.body.areaCode || '86';

    service.validateMobileCodeAsync(phoneNum, code, areaCode)
        .then(result => {
            if (result.code === 200) {
                res.json({
                    code: 200,
                    data: helpers.urlFormat('/passport/back/backcode', {
                        phoneNum: phoneNum,
                        token   : result.data.token,
                        areaCode: areaCode
                    })
                })
            } else {
                res.json({
                    code   : 400,
                    message: '验证码失败'
                })
            }
        })
        .catch(next);
};

/**
 * 找回密码页面,设置新密码页面-手机
 */
const setNewPasswordByMobilePage = (req, res) => {
    let phoneNum = req.query.phoneNum || '';
    let token    = req.query.token || '';
    let areaCode = req.query.areaCode || '86';
    let code     = req.query.code || '';

    if (!(code || (token && helpers.verifyMobile(phoneNum)))) {
        res.redirect(400);
        return;
    }

    res.render('back/new-password', Object.assign({
        module: 'passport',
        page  : 'back-new-password',
        title : '找回密码-输入新密码'
    }, {
        backUrl       : SIGN_IN,
        headerText    : '找回密码',
        isPassportPage: true,
        backNewPwd    : true,
        phoneNum      : phoneNum,
        token         : token,
        areaCode      : areaCode,
        code          : code
    }));
};

/**
 * 根据手机验证码修改密码
 */
const setNewPasswordByMobileAPI = (req, res, next) => {
    let phoneNum = req.body.phoneNum || '';
    let token    = req.body.token || '';
    let areaCode = req.body.areaCode || '86';
    let newPwd   = req.body.password || '';

    service.modifyPasswordByMobileAsync(phoneNum, token, newPwd, areaCode)
        .then(result => {
            console.log(result);
            if (result.code === 200) {
                res.json({
                    code: 200,
                    data: SIGN_IN
                });
            } else {
                res.json({
                    code   : 400,
                    message: "修改密码失败"
                })
            }
        })
        .catch(next);
};

module.exports = {
    indexEmailPage,
    sendCodeToEmailAPI,
    resendCodeToEmailAPI,
    backSuccessByEmailPage,
    setNewPasswordByEmailAPI,
    indexMobilePage,
    sendCodeToMobileAPI,
    verifyCodeByMobilePage,
    verifyCodeByMobileAPI,
    setNewPasswordByMobilePage,
    setNewPasswordByMobileAPI
};