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

'use strict';

const _ = require('lodash');

const helpers = global.yoho.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 => {
            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
};