Authored by htoooth

add api and service

... ... @@ -5,27 +5,184 @@
'use strict';
const _ = require('lodash');
const library = '../../../library';
const helpers = require(`${library}/helpers`);
const service = require('../models/back-service');
/**
* 通过邮箱找回密码
* @param req
* @param res
*/
module.exports.byEmail = (req, res) => {
module.exports.indexByEmail = (req, res) => {
let data = {
backUrl: helpers.urlFormat('/signin.html'),
backUrl: helpers.urlFormat('signin.html'),
headerText: '找回密码',
isPassportPage: true,
backEmail: true
};
res.render('back/by-email', {
result: data,
res.render('back/by-email', Object.assign({
module: 'passport',
page: 'back',
title: data.backUrl
title: '找回密码-通过邮箱'
}, data)
);
};
/**
* 发送验证码到邮箱
*/
module.exports.sendEmail = (req, res, next) => {
let email = req.body.email || '';
if (!helpers.verifyEmail(email)) {
res.json({
code: 400,
message: '邮箱格式不正确,请重新输入',
data: ''
});
return;
}
service.sendCodeToEmailAsync(email).then(result => {
if (result.code === 200) {
result.data = helpers.urlFormat('passport/back/success', {email: email});
}
res.json(result);
}).catch(next);
};
/**
* 重新发送邮箱验证码
*/
module.exports.resendEmail = (req, res) => {
let email = req.params.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.success = (req, res) => {
let email = req.params.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('email-success', {
backUrl: helpers.urlFormat('emailback.html'),
headerText: '找回密码',
isPassportPage: true,
backEmailSuccess: true,
goEmail: emailUrl,
resendUrl: helpers.urlFormat('passport/back/resendemail', {email: email}),
title: '找回密码-通过邮箱'
});
};
/**
* 根据邮箱修改密码
*/
module.exports.success = (req, res) => {
let pwd = req.body.password || '';
let code = req.body.code || '';
let data = {
code: 200,
data: helpers.urlFormat('signin.html')
};
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.indexByMobile = (req, res) => {
service.getAreaDataAsync().then(result => {
res.render('mobile', {
backUrl: helpers.urlFormat('signin.html'),
headerText: '找回密码',
isPassportPage: true,
backMobile: true,
countrys: result,
areaCode: '+86',
title: '找回密码-通过手机号'
});
});
};
/**
* 发送手机验证码
*/
module.exports.sendVerifyCodeBySMS = (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);
}
service.sendCodeToMobileAsync(phoneNum, areaCode).then(data=> {
if (_.isEmpty(data)) {
return Promise.rejected('发送验证码出错');
}
if (data.code === 200) {
result.data = helpers.urlFormat('passport/back/mobilecode', {
phoneNum: phoneNum,
areaCode: areaCode
});
res.json(result);
} else {
return Promise.rejected('发送验证码出错');
}
}).catch(err => {
result.message = err;
res.json(result);
});
};
... ...
/**
* Created by TaoHuang on 2016/6/14.
*/
'use strict';
var API = require('../../../library/api').API;
const library = '../../../library';
const sign = require(`${library}/sign`);
var api = new API();
const YOHOBUY_URL = 'http://www.yohobuy.com/';
/**
* 获取地区数据
*/
module.exports.getAreaDataAsync = () => {
return api.get('', sign.apiSign({
method: 'app.passport.getArea'
}));
};
/**
* 通过邮箱找回密码
*
* @param string mail 邮箱地址
*/
module.exports.sendCodeToEmailAsync = (email) => {
return api.get('', sign.apiSign({
method: 'app.register.backpwdByEmail',
email: email
}));
};
/**
* 根据邮箱验证码修改密码(调用www.yohobuy.com接口)
*
* @param string pwd 新密码
* @param string code 邮箱验证码
*/
module.exports.modifyPasswordByEmailAsync = (pwd, code) => {
const options = {
url: `${YOHOBUY_URL}passport/back/update`,
form: {
pwd: pwd,
're-input': pwd,
code: code
},
timeout: 3000
};
return api._requestFromAPI(options);
};
/**
* 通过手机找回密码
*
* @param string mobile 手机号
* @param integer area 地区码ID
*/
module.exports.sendCodeToMobileAsync = (mobile, area) => {
area = area || 86;
return api.get('', sign.apiSign({
mobile: mobile,
area: area,
method: 'app.register.sendBackpwdCodeToMobile'
}));
};
/**
* 校验密码修改手机验证码
*
* @param string mobile 手机号
* @param string code 验证码
* @param integer area 地区码ID
*/
module.exports.validateMobileCodeAsync = (mobile, code, area) => {
area = area || 86;
return api.get('', sign.apiSign({
mobile: mobile,
code: code,
area: area,
method: 'app.register.validBackpwdCode'
}));
};
/**
* 根据手机验证码修改密码
*
* @param string mobile 手机号
* @param string token 验证手机验证码返回的token
* @param integer area 地区码ID
*/
module.exports.modifyPasswordByMobileAsync = (mobile, token, newpwd, area)=> {
area = area || 86;
return api.get('', sign.apiSign({
mobile: mobile,
token: token,
newpwd: newpwd,
area: area,
method: 'app.register.changepwdByMobileCode'
}));
};
/**
* 验证找回邮件code
*/
module.exports.checkEmailCodeAsync = (code) => {
return api.get('', sign.apiSign({
code: code,
method: 'web.passport.checkCodeValid'
}));
};
/**
* 根据邮箱code修改密码
*/
module.exports.modifyPasswordByEmailCodeAsync = (code, password) => {
return api.get('', sign.apiSign({
code: code,
newPwd: password,
method: 'app.register.resetPwdByCode'
}));
};
... ...
/**
* Created by TaoHuang on 2016/6/14.
*/
'use strict';
const api = require('./back-api');
module.exports = api;
... ...
... ... @@ -163,3 +163,116 @@ exports.dateDiffFormat = (format, diff, type) => {
return format;
}
};
/**
* 验证邮箱是否合法
*
* @param string email
* @return boolean
*/
exports.verifyEmail = (email) => {
if (!email) {
return false;
}
const emailRegExp = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
return emailRegExp.test(email);
};
/**
* 各国手机号规则
*/
function areaMobileVerify(phone, area) {
area = area || '86';
phone = phone.trim();
let verify = {
86: {
name: '中国',
match: /^1[3|4|5|8|7][0-9]{9}$/.test(phone)
},
852: {
name: '中国香港',
match: /^[9|6|5][0-9]{7}$/.test(phone)
},
853: {
name: '中国澳门',
match: /^[0-9]{8}$/.test(phone)
},
886:{
name: '中国台湾',
match: /^[0-9]{10}$/.test(phone)
},
65: {
name: '新加坡',
match: /^[9|8][0-9]{7}$/.test(phone)
},
60: {
name: '马来西亚',
match: /^1[1|2|3|4|6|7|9][0-9]{8}$/.test(phone)
},
1: {
name: '加拿大&美国',
match: /^[0-9]{10}$/.test(phone)
},
82: {
name: '韩国',
match: /^01[0-9]{9}$/.test(phone)
},
44: {
name: '英国',
match: /^7[7|8|9][0-9]{8}$/.test(phone)
},
81: {
name: '日本',
match: /^0[9|8|7][0-9]{9}$/.test(phone)
},
61: {
name: '澳大利亚',
match: /^[0-9]{11}$/.test(phone)
}
};
if (verify[area]) {
return verify[area].match;
} else {
return false;
}
}
/**
* 验证国际手机号是否合法
*/
exports.verifyAreaMobile = (areaMobile) => {
if (!areaMobile) {
return false;
}
let mobile = {
area: '86',
phone: ''
};
let splitMobile = areaMobile.split('-');
if (splitMobile.length === 2) {
mobile.area = splitMobile[0];
mobile.phone = splitMobile[1];
} else {
mobile.phone = splitMobile[0];
}
return areaMobileVerify(mobile.phone, mobile.area);
};
/**
* 验证手机是否合法
*/
exports.verifyMobile = (phone) => {
if (!phone) {
return false;
}
return /^1[3|4|5|8|7][0-9]{9}$/.test(phone);
};
... ...