Authored by 郝肖肖

'绑定手机号'

... ... @@ -322,9 +322,26 @@ const bind = {
res.json({ code: 400, message: '', data: '' });
}
},
// 通过邮箱强制绑定手机号
forceBindMobile: (req, res, next) => {
// 绑定手机号发送短信
sendMsgApi: (req, res, next) => {
req.ctx(BindServiceModel).sendChangeBindMobileCodeOnly(req.body).then(result => {
if (_.get(result, 'code', 400) === 200) {
return next();
}
return res.json(result);
}).catch(next);
},
// 检查手机是否绑定
forceMobileCheckApi: (req, res, next) => {
req.ctx(BindServiceModel).changeMobileCheck(req.body).then(result => {
if (_.get(result, 'code', 400) === 200) {
return next();
}
return res.json(result);
}).catch(next);
},
// 通过邮箱强制绑定手机号页面
forceBindMobilePage: (req, res, next) => {
let headerData = headerModel.setNav({
navTitle: '绑定手机号', // 标题
navBack: true, // 是否显示返回按钮
... ... @@ -342,7 +359,21 @@ const bind = {
areaCode: '+86', // 默认区号
countrys: req.ctx(RegServiceModel).getAreaData(), // 国别码
});
}
},
forceSendMsg: (req, res) => {
return res.json({code: 200, data: {}, message: 'success'});
},
// 调用绑定接口
forceBindMobileApi: (req, res, next) => {
req.ctx(BindServiceModel).bindEmailLoginMobile(req.body).then(result => {
if (_.get(result, 'code', 400) === 200) {
return next();
}
return res.json(result);
}).catch(next);
},
};
module.exports = bind;
... ...
... ... @@ -99,6 +99,38 @@ class BindServiceModel extends global.yoho.BaseModel {
area: area
}});
}
// 强制绑定手机↓↓↓↓ -> 邮件登录绑定手机号发送短信
sendChangeBindMobileCodeOnly(params) {
return this.get({data: {
method: 'app.bind.sendChangeBindMobileCodeOnly',
business_line: 'yohobuy',
mobile: params.mobile || '',
area: params.area || '86'
}});
}
// 校验手机号,判断这个手机号是否已经注册,是否下面有第三方
changeMobileCheck(params) {
return this.get({data: {
method: 'app.bind.changeMobileCheck',
business_line: 'yohobuy',
mobile: params.mobile || '',
area: params.area || '86',
code: params.code || ''
}});
}
// 邮箱强制绑定手机号(邮箱强制绑定手机号场景使用)
bindEmailLoginMobile(params) {
return this.get({data: {
method: 'app.bind.bindEmailLoginMobile',
business_line: 'yohobuy',
mobile: params.mobile || '',
area: params.area || '86',
code: params.code,
email: params.email,
password: params.password
}});
}
}
module.exports = BindServiceModel;
... ...
... ... @@ -82,7 +82,9 @@ router.post('/passport/password/reset', reset.passwordReset); // 重置密码
router.get('/passport/password/resetsuccess', reset.passwordResetOkPage); // 重置成功
// 通过邮箱登录绑定手机号
router.get('/passport/bind/forceBindMobile', bind.forceBindMobile);
router.get('/passport/bind/forceBindMobile', bind.forceBindMobilePage);
router.post('/passport/bind/forceSendMsg', bind.sendMsgApi, bind.forceSendMsg);
router.post('/passport/bind/forceMobileCheck', bind.forceMobileCheckApi, bind.forceBindMobileApi);
/**
* 密码找回
*/
... ...
import $ from 'yoho-jquery';
import tip from 'plugin/tip';
import Page from 'yoho-page';
import api from '../api';
import Validate from 'plugin/validata';
const $captcha = $('#js-img-check');
const validate = new Validate($captcha, {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
const showErrTip = tip.show;
class EmailMobile extends Page {
constructor() {
super();
this.selector = {
itime: 0,
countrySelect: $('.mobile-form-login select.country-select'),
mobileInput: $('.mobile-form-login input.mobile-input'),
clearMobile: $('.mobile-form-login .clear'),
verifyCodeInput: $('.mobile-form-login input.verify-code-input'),
verifyCodeBtn: $('.mobile-form-login .get-verify-code'),
loginBtn: $('.mobile-form-login .sms-login-btn'),
};
this.init();
}
init() {
if ($captcha.data('userverify')) {
validate.init();
}
this.bindEvents();
}
bindEvents() {
this.selector.countrySelect.on('change', this.changeBtnStatus.bind(this));
this.selector.mobileInput.on('input', this.changeBtnStatus.bind(this));
this.selector.clearMobile.on('click', this.clearMobile.bind(this));
this.selector.verifyCodeInput.on('input', this.changeBtnStatus.bind(this, true));
this.selector.verifyCodeBtn.on('click', this.getVerifyCode.bind(this));
this.selector.loginBtn.on('click', this.login.bind(this));
}
/**
* 清除输入的手机号
*/
clearMobile() {
this.selector.mobileInput.val('');
this.selector.verifyCodeInput.val('');
this.selector.clearMobile.addClass('hide');
this.selector.countrySelect.trigger('change');
}
/**
* 输入监听,改变按钮状态
*/
changeBtnStatus(isVerifycode) {
let areaCode = $.trim(this.selector.countrySelect.val());
let phoneNum = $.trim(this.selector.mobileInput.val());
let verifyCode = $.trim(this.selector.verifyCodeInput.val());
if (!api.phoneRegx[areaCode]) {
return showErrTip('出错了,请重新刷新页面');
}
if (phoneNum) {
this.selector.clearMobile.removeClass('hide');
}
// 验证码输入框单独处理
if (isVerifycode === true) {
// 提交表单按钮激活
if (verifyCode && api.phoneRegx[areaCode].test(phoneNum)) {
this.selector.loginBtn.addClass('active');
} else {
this.selector.loginBtn.removeClass('active');
}
return;
}
clearInterval(this.selector.itime);
this.selector.verifyCodeBtn.text('获取验证码');
if (api.phoneRegx[areaCode].test(phoneNum)) {
this.selector.verifyCodeBtn.addClass('active');
if (verifyCode) {
this.selector.loginBtn.addClass('active');
}
} else {
this.selector.verifyCodeBtn.removeClass('active');
this.selector.loginBtn.removeClass('active');
}
}
/**
* 获取验证码倒计时
*/
countDown(during) {
let count = parseInt(during, 10) || 59;
if (!this.selector.verifyCodeBtn.hasClass('active')) {
return ;
}
this.selector.verifyCodeBtn.removeClass('active');
this.selector.itime = setInterval(() => {
window.setCookie('intTimer', count, {path: '/' });
if (count <= 0) {
this.selector.verifyCodeBtn.text('重新获取').addClass('active');
clearInterval(this.selector.itime);
} else {
this.selector.verifyCodeBtn.text('重新获取 (' + count-- + '秒)');
}
}, 1000);
}
/**
* 获取验证码
*/
getVerifyCode() {
let pn = $.trim(this.selector.mobileInput.val());
let area = $.trim(this.selector.countrySelect.val());
if (!this.selector.loginBtn.hasClass('active') ||
this.selector.loginBtn.data('oneClick')) {
return;
}
if (!api.phoneRegx[area]) {
return showErrTip('出错了,请重新刷新页面');
} else if (!api.phoneRegx[area].test(pn)) {
return showErrTip('手机号格式不正确,请重新输入');
}
this.selector.loginBtn.data('oneClick', true);
let params = {
areaCode: area.replace('+', ''),
phoneNum: pn
};
this.ajax({
url: '/passport/bind/forceSendMsg',
type: 'POST',
data: params
}).then(codeResult => {
if (codeResult.code === 200) {
this.countDown();
return;
} else {
showErrTip(codeResult.message);
}
}).catch(() => {
showErrTip('出错了,请重试');
});
}
login() {
let pn = $.trim(this.selector.mobileInput.val());
let area = $.trim(this.selector.countrySelect.val());
if (!this.selector.loginBtn.hasClass('active')) {
return;
}
this.selector.loginBtn.data('oneClick', true);
if (area && pn && api.phoneRegx[area].test(pn)) {
validate.getResults().then(result => {
let params = {
areaCode: area.replace('+', ''),
phoneNum: pn
};
$.extend(params, result);
this.ajax({
url: '/passport/bind/forceMobileCheck',
type: 'POST',
data: params
}).then(codeResult => {
validate.type === 2 && validate.refresh();
if (codeResult.code === 200) {
this.countDown();
return;
} else if (codeResult.code === 409) {
showErrTip(codeResult.message);
} else {
showErrTip(codeResult.message);
}
(codeResult.changeCaptcha && validate.type !== 2) && validate.refresh();
}).catch(() => {
showErrTip('出错了,请重试');
validate.refresh();
});
});
} else if (!area) {
showErrTip('出错了,请重新刷新页面');
} else {
showErrTip('手机号格式不正确,请重新输入');
}
}
}
module.exports = EmailMobile;
... ...