back.js 7.16 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_URL = helpers.urlFormat('/signin.html');

/**
 * 通过邮箱找回密码页面
 */
module.exports.indexByEmailPage = (req, res) => {

    let data = {
        backUrl: SIGN_IN_URL,
        headerText: '找回密码',
        isPassportPage: true,
        backEmail: true
    };

    res.render('back/email', Object.assign({
        module: 'passport',
        page: 'back-email',
        title: '找回密码-通过邮箱'
    }, data));
};

/**
 * 发送验证码到邮箱
 */
module.exports.sendCodeToEmailAPI = (req, res) => {
    let email = req.body.email || '';

    let error = {
        code: 400,
        message: '邮箱格式不正确,请重新输入',
        data: ''
    };

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

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

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

/**
 * 重新发送验证码到邮箱
 */
module.exports.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
        });
    });
};

/**
 * 邮箱找回密码-返回成功页面
 */
module.exports.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.html'),
        headerText: '找回密码',
        isPassportPage: true,
        backEmailSuccess: true,
        goEmail: emailUrl,
        resendUrl: helpers.urlFormat('/passport/back/resendemail', {email: email})
    }));
};


/**
 * 根据邮箱修改密码
 */
module.exports.setNewPasswordByEmailAPI = (req, res) => {
    let pwd = req.body.password || '';

    let code = req.body.code || '';

    let data = {
        code: 200,
        data: SIGN_IN_URL
    };

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

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

/**
 * 找回密码页面-通过手机号
 */
module.exports.indexByMobilePage = (req, res, next) => {

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

/**
 * 发送手机验证码
 */
module.exports.sendCodeToMobileAPI = (req, res) => {
    let result = {
        code: 400,
        message: '密码只能使用数字、字母和半角标点符号,请重新输入',
        data: ''
    };

    let phoneNum = req.body.phoneNum || '';

    let areaCode = req.body.areaCode || '86';

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

    service.sendCodeToMobileAsync(phoneNum, areaCode).then(data=> {
        if (_.isEmpty(data)) {
            return Promise.rejected('发送验证码出错');
        }

        if (data.code === 200) {
            result.data = helpers.urlFormat('/passport/back/verifycode', {
                phoneNum: phoneNum,
                areaCode: areaCode
            });

            res.json(result);
        } else {
            return Promise.rejected('发送验证码出错');
        }
    }).catch(err => {
        result.message = err;
        res.json(result);
    });

};

/**
 * 校验验证码页面
 */
module.exports.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.html'),
        headerText: '找回密码',
        isPassportPage: true,
        backCode: true,
        areaCode: areaCode,
        phoneNum: phoneNum

    }));
};

/**
 * 校验手机验证码
 */
module.exports.verifyCodeByMobileAPI = (req, res) => {
    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) {
                result.data = helpers.urlFormat('/passport/back/backcode.html', {
                    phoneNum: phoneNum,
                    token: result.data.token,
                    areaCode: areaCode
                });
            }

            res.json(result);
        }).catch(() => res.json({code: 400, message: '验证码失败'}));
};

/**
 * 找回密码页面,设置新密码页面-手机
 */
module.exports.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 (!token || (!helpers.verifyMobile(phoneNum) && !code)) {
        res.redirect(400);
        return;
    }

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

/**
 * 根据手机验证码修改密码
 */
module.exports.setNewPasswordByMobileAPI = (req, res) => {
    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) {
                result.data = SIGN_IN_URL;
            }

            res.json(result);
        }).catch(() => res.json({code: 400, message: '修改密码失败'}));
};