Authored by 刘传洋

m

... ... @@ -9,7 +9,7 @@
const _ = require('lodash');
const helpers = global.yoho.helpers;
const passportHelper = require('../models/passport-helper');
const bindService = require('../models/bind-service');
const certService = require('../models/cert-service');
const loginService = require('../models/login-service');
const userService = require('../models/user-service');
... ... @@ -25,144 +25,106 @@ const Sources = {
douban: '豆瓣'
};
const bind = {
const cert = {
tip: (req, res) => {
let refer = req.query.refer;
res.render('cert/tip', {
refer: refer
simpleHeader: simpleHeaderModel.setSimpleHeaderData(),
refer: refer,
certUrl: helpers.urlFormat('/passport/cert/index ')
});
},
indexPage: (req, res) => {
let openId = req.query.openId;
let sourceType = req.query.sourceType;
index: (req, res) => {
res.render('bind', {
thirdLogin: true,
openId: openId,
sourceType: sourceType,
res.render('cert/index', {
region: passportHelper.getCountry(),
serviceUrl: helpers.urlFormat('/help', {
category_id: 9
}),
simpleHeader: simpleHeaderModel.setSimpleHeaderData(),
module: 'passport',
page: 'bind',
page: 'cert',
title: '联合登录补全信息'
});
},
noregist: (req, res) => {
cert: (req, res) => {
let mobile = req.body.mobile;
let sourceType = req.body.sourceType;
let openId = req.body.openId;
let area = req.body.area;
res.render('bind/noregist', {
res.render('cert/cert', {
enablePerfectInformation: true,
mobile: mobile,
sourceType: sourceType,
openId: openId,
area: area,
module: 'passport',
page: 'noregist',
page: 'cert-cert',
simpleHeader: simpleHeaderModel.setSimpleHeaderData(),
title: '登录绑定'
});
},
relate: (req, res, next) => {
let mobile = req.body.mobile;
let sourceType = req.body.sourceType;
let openId = req.body.openId;
let area = req.body.area;
// UserService.findByMobileAsync(area, mobile).then(user => {
// if (user) {
// return {
// thumb: user.headImg,
// userName: user.username,
// loginHref: user.bindLogin
// };
// } else {
// return {};
// }
// })
userService.getUserInfo(area, mobile).then(user => {
let data = _.assign(user, {
phoneNum: mobile,
areaCode: area,
openId: openId,
sourceType: sourceType,
changeHref: helpers.urlFormat('/passport/thirdlogin/index', {openId: openId, sourceType: sourceType}),
changeHref: helpers.urlFormat('/passport/cert/index'),
simpleHeader: simpleHeaderModel.setSimpleHeaderData(),
module: 'passport',
page: 'relate',
page: 'cert-relate',
title: '账号关联'
});
res.render('bind/relate', data);
}).catch(next);
},
bindSuccess: (req, res) => {
success: (req, res) => {
let sourceType = _.trim(req.query.sourceType);
let sourceInfo = sourceType.split('_');
let sourceName = Sources[sourceInfo[0]];
let isRelate = (sourceInfo[1] === 'relate');
let data = {
thirdLogin: true,
goShopping: helpers.urlFormat('/'),
sourceName: sourceName,
relate: isRelate,
module: 'passport',
page: 'bind-success',
page: 'cert-success',
simpleHeader: simpleHeaderModel.setSimpleHeaderData(),
title: '绑定手机号'
};
res.render('bind/success', data);
},
bindCheck: (req, res, next) => {
check: (req, res, next) => {
let mobile = req.body.mobile;
let openId = req.body.openId;
// let openId = req.body.openId;
let area = req.body.area || '86';
let sourceType = req.body.sourceType;
if (mobile && openId && area && sourceType) {
// let sourceType = req.body.sourceType;
if (mobile && area) {
/**
* 接口绑定返回值:
* code:200,is_register=0 // 绑定流程:未注册,可绑定
* code:200,is_register=1 // 绑定流程:已注册绑定过其他第三方
* code:200:is_register=3 // 关联流程
* code:505 // 手机号码注册过,而且该第三方也已经绑定过手机号
* code:506 // 手机号码注册过,而且该手机号码也已经绑定过该类型第三方
* code:200,isCanBind=Y // 可绑定
* code:200,isCanBind=Y // 不可绑定
*/
bindService.bindCheck(mobile, openId, sourceType, area).then(result => {
certService.certCheck(mobile, area).then(result => {
if (!result || !result.code) {
return {code: 400, message: '', data: ''};
} else if (result.code === 200 && result.data.is_register === 0) {
let nextUrl = helpers.urlFormat('/passport/thirdlogin/noregist');
} else if (result.code === 200) {
let nextUrl;
// 绑定流程:code=200 未注册,可绑定
if (_.get(result, 'data.isCanBind') === 'Y') {
nextUrl = helpers.urlFormat('/passport/cert/cert');
} else {
nextUrl = helpers.urlFormat('/passport/cert/relate');
}
return {code: 200, message: result.message, data: {next: nextUrl}};
} else if (result.code === 200 && result.data.is_register === 1) {
return userService.getUserInfo(area, mobile).then(user => {
// 绑定流程:code=201 已注册 绑定过其他第三方
return {code: 201, message: result.message, data: {user: user}};
});
} else if (result.code === 200 && result.data.is_register === 3) {
let nextUrl = helpers.urlFormat('/passport/thirdlogin/relate');
// 关联流程
return {code: 203, message: result.message, data: {next: nextUrl}};
} else if (result.code === 506 || result.code === 505) {
return userService.getUserInfo(area, mobile).then(user => {
// 绑定流程:code=506 手机号码注册过,而且该手机号码也已经绑定过该类型第三方
// code=505 手机号码注册过,而且该第三方也已经绑定过手机号
return {code: 205, message: result.message, data: {user: user}};
});
} else {
return {code: result.code, message: result.message, data: result.data ? result.data : ''};
}
... ... @@ -173,24 +135,11 @@ const bind = {
return res.json({code: 400, message: '', data: ''});
}
},
sendBindMsg: (req, res, next) => {
let mobile = req.body.mobile;
let area = req.body.area;
bindService.sendBindMsg(area, mobile).then(result => {
if (result && result.code) {
return res.json(result);
} else {
return res.json({code: 400, message: '', data: ''});
}
}).catch(next);
},
checkBindMsg: (req, res, next) => {
sendCertMsg: (req, res, next) => {
let mobile = req.body.mobile;
let area = req.body.area;
let code = req.body.code;
bindService.checkBindCode(area, mobile, code).then(result => {
certService.sendCertMsg(area, mobile).then(result => {
if (result && result.code) {
return res.json(result);
} else {
... ... @@ -198,7 +147,7 @@ const bind = {
}
}).catch(next);
},
bindMobile: (req, res, next) => {
certMobile: (req, res, next) => {
let mobile = _.trim(req.body.mobile);
let area = _.trim(req.body.area) || '86';
let openId = _.trim(req.body.openId);
... ... @@ -271,4 +220,4 @@ const bind = {
}
};
module.exports = bind;
module.exports = cert;
... ...
/**
* @author liuchuanyang chuanyang.liu@yoho.cn
*/
'use strict';
const api = global.yoho.API;
const certCheck = (mobile, area) => {
let params = {
method: 'app.passport.checkIsCanBind',
area: area,
mobile: mobile
};
return api.get('', params);
};
const sendCertMsg = (mobile, area) => {
let params = {
method: 'app.passport.smsbind',
mobile: mobile,
area: area
};
return api.get('', params);
};
/* const checkCertCode = (area, mobile, code) => {
return api.get('', {
method: 'app.register.validRegCode',
mobile: mobile,
area: area,
code: code
});
};*/
const certMobile = (uid, mobile, code, area) => {
let params = {
method: 'app.passport.changeMobile',
uid: uid,
mobile: mobile,
area: area,
code: code
};
return api.get('', params);
};
const relateMobile = (uid, email, code, mobile, area) => {
return api.get('', {
method: 'app.passport.relatedMobileAndEmail',
uid: uid,
email: email,
mobile: mobile,
code: code,
area: area
});
};
/* const changeCheck = (mobile, area) => {
return api.get('', {
method: 'app.passport.changeCheck',
mobile: mobile,
area: area
});
};*/
/* const changeMobile = (uid, mobile, area, code) => {
return api.get('', {
method: 'app.passport.changeMobile',
mobile: mobile,
uid: uid,
code: code,
area: area
});
};*/
module.exports = {
certCheck,
sendCertMsg,
certMobile,
relateMobile
};
... ...
'use strict';
const api = require('./cert-api');
module.exports = api;
... ...
... ... @@ -76,16 +76,17 @@ router.post('/passport/autouserinfo/bindMobile', bind.bindMobile);
router.post('/passport/autouserinfo/relateMobile', bind.relateMobile);
// 未实名认证的老邮箱用户登录
router.get('/passport/cert/tip', cert.tip);
router.get('/passport/cert/index', cert.index);
router.get('/passport/cert/bindsuccess', cert.bindSuccess);
router.post('/passport/cert/noregist', cert.noregist);
router.post('/passport/cert/relate', cert.relate);
router.post('/passport/cert/bindCheck', cert.bindCheck);
router.post('/passport/cert/sendBindMsg', cert.sendBindMsg);
router.post('/passport/cert/checkBindMsg', cert.checkBindMsg);
router.post('/passport/cert/bindMobile', cert.bindMobile);
router.get('/passport/cert/tip', cert.tip); /** 提示是否完善资料页面 **/
router.get('/passport/cert/index', cert.index); /** 输入手机号码页面 **/
router.post('/passport/cert/cert', cert.cert); /** 认证页面 **/
router.post('/passport/cert/relate', cert.relate); /** 关联页面 **/
router.get('/passport/cert/success', cert.success); /** 成功提示页面 **/
router.post('/passport/cert/check', cert.check);
router.post('/passport/cert/sendCertMsg', cert.sendCertMsg);
/* router.post('/passport/cert/checkBindMsg', cert.checkBindMsg);*/
router.post('/passport/cert/certMobile', cert.certMobile);
router.post('/passport/cert/relateMobile', cert.relateMobile);
/**
... ...
<div class="bindwrapper">
<h3 class="welcomeword">
欢迎来到
<span class="yoho">YOHO!FAMILY</span>
</h3>
<p class="safeword">为了您的账户安全,请您完善账户信息,以便为您提供更优质的服务</p>
<p class="sendnotify">
验证码已发送至
<span class="sendphone">{{mobile}}</span>
</p>
<form action="infoform" method="post">
<div class="validaterow">
<div class="name phonetag">短信验证码</div>
<div class="content">
<div class="yohophonewrapper">
<input type="text" class="validatenum phonenum" value="" id="validatenum" maxlength="4"/>
<span class="err-tip code-err-tip hide">
<i></i>
<em></em>
</span>
</div>
</div>
<div class="validatewrapper">
<a href="javascript:void(0)" class="yohobindbtn" id="sendmessage">免费获取短信验证码</a>
</div>
<div class="hide" id="nopermissionmessage">
<span class="second">60</span>
秒后可重新操作
</div>
</div>
<div class="btnwrapper confirmwrapper">
<a href="javascript:void(0)" class="yohobindbtn" id="confirmsubmit" >确定</a>
</div>
<input type="hidden" value="{{mobile}}" id="mobile" name="mobile"/>
<input type="hidden" value="{{area}}" id="area"/>
</form>
</div>
... ...
<div class="bindwrapper">
<h3 class="welcomeword">
欢迎来到
<span class="yoho">YOHO!FAMILY</span>
</h3>
<p class="safeword">为了您的账户安全,请您完善账户信息,以便为您提供更优质的服务</p>
<form action="" id="bindmobileform" method="post">
<input type="hidden" value="86" id="areacode" name="area"/>
<div class="yohobindrow">
<div class="name areatag">地区</div>
<div class="content">
<div class="yohoselectarea">
<div class="optionshow">
<span class="areaname" id="areaname">中国</span>
<span class="righttag"></span>
</div>
<div class="optionslist hide">
{{#each region}}
<div class="optionitem" areanum="{{areaCode}}">{{name}}</div>
{{/each}}
</div>
</div>
</div>
</div>
<div class="yohobindrow">
<div class="name phonetag">手机号码</div>
<div class="content">
<div class="yohophonewrapper">
<div class="areanum" >
+
<span id="areanum">86</span>
</div>
<input type="text" class="phonenum" name="mobile" id="mobile"/>
<span class="err-tip phone-err-tip hide">
<i></i>
<em></em>
</span>
</div>
</div>
</div>
</form>
<div class="protoctolwrapper">
<div class="choosewrapper">
<input type="checkbox" class="choosetag" checked='checked'></div>
<span>
我已阅读并同意遵守
<a target="_blank" href="{{serviceUrl}}" class="protoctol">YOHO!BUY 有货服务条款</a>
</span>
</div>
<div class="btnwrapper">
<a href="javascript:void(0)" class="yohobindbtn" id="bindfirststep">下一步</a>
</div>
</div>
<!--<div id="bindconfirm" style="display:none">
<div class="mask">
<div class="bindconfrimwrapper">
<div class="topwrapper">
<img src="" alt="" class="userphoto" id="userphoto1">
<span class="username">
用户名: <i id="username1"></span>
</div>
<h2 class="usertaginfo">
手机号
<span id="registphonetwo"></span>
已经被以上账户注册,请确认是否归您本人所有
</h2>
<h1 class="usertagremind">您可以使用该手机号码直接登录或更换一个新的手机号码绑定该账号</h1>
<a href="javascript:;" class="yohobindbtn otherphone" id="yohobindbtn">绑定其他手机号</a>
<a href="" class="logindirectly" id="logindirectly">使用手机号直接登录</a>
</div>
</div>
</div>
<div class="backdrop" style="display:none"></div>
</div>-->
<div id="alreayregist" style="display:none">
<div class="mask">
<div class="bindconfrimwrapper">
<div class="topwrapper">
<img src="" alt="" class="userphoto" id="userphoto">
<span class="username">
用户名: <i id="username"></i>
</span>
</div>
<h2 class="usertaginfo">
手机号
<span id="registphone"></span>
已经被以上账户注册,请确认是否归您本人所有
</h2>
<h1 class="usertagremind">您可以绑定该手机号码或更换一个新的手机号码绑定该账号,也可以使用该手机号码直接登录</h1>
<form id="gobindform" action="/passport/autouserinfo/bindMobile" method="post">
<div class="gobindwrapper">
<div class="validaterow">
<div class="content">
<input type="text" class="validatacode" placeholder="验证码" maxlength="4" id="validatenum"/>
</div>
<div class="validatewrapper">
<a href="javascript:void(0)" class="yohobindbtn" id="sendmessage">免费获取短信验证码</a>
</div>
<div class="hide" id="nopermissionmessage">
<span class="second">60</span>
秒后可重新操作
</div>
</div>
<input type="hidden" name="area" value="" id="inarea"/>
<input type="hidden" name="mobile" value="" id="inmobile"/>
<input type="hidden" name="openId" value="{{openId}}"/>
<input type="hidden" name="sourceType" value="{{sourceType}}"/>
<a href="javascript:;" class="yohobindbtn myphone" id="gotobindphone">是的我绑定该手机号</a>
</div>
<div class="gobindbottomwrapper">
<a href="javascript:;" class="logindirectly" id="yohobindbtn2">绑定其他手机号</a>
<a href="javascript:;" class="logindirectly" id="logindirectly2">使用手机号直接登录</a>
</div>
</form>
</div>
</div>
<div class="backdrop" style="display:none"></div>
</div>
... ...
<div class="third-relate-page passport-page yoho-page clearfix">
<div id="relate-main" class="relate-main">
<div class="user-wrapper">
<div class="user-thumb">
<img src="{{headImg}}">
</div>
<label>用户名: {{username}}</label>
</div>
<div class="remind-info">
<h3>手机号
<span>{{phoneNum}}</span>
已经被以上账户注册,点击
<a href="{{bindLogin}}" target="_blank">登录该账号</a>
</h3>
<p>您可以使用此号码进行账户关联或更换一个新的手机号码</p>
</div>
<div class="option-btn">
<a id="next-step-btn">关联此手机号</a>
<a href="{{changeHref}}">更换新手机号</a>
</div>
<p class="remind-tips">注:关联的手机号码不能用来登录此账户</p>
</div>
<div id="code-validate" class="code-validate hide">
<div class="action-link">短信验证码已发送至<span>{{phoneNum}}</span></div>
<div class="validate-wrapper action-link">
<div class="code-name">短信验证码</div>
<input type="text" class="msg-code">
<label class="get-code">免费获取短信验证码</label>
<label class="count-down"><span>60</span>秒后可重新操作</label>
<div class="code-error hide">
<i></i>
验证码错误
</div>
</div>
<div class="action-link">
<button id="relate-btn" class="relate-btn">确定</button>
</div>
<p class="remind-tips">
<span class="left">注:关联的手机号码不能用来登录此账户</span>
<a class="perv-step right">返回上一步</a>
</p>
</div>
<div id="hide-info" data-mobile="{{phoneNum}}" data-area="{{areaCode}}" data-openid="{{openId}}" data-source="{{sourceType}}"></div>
</div>
\ No newline at end of file
... ...
<div class="bindsuccesswrapper">
<div class="successwrapper">
<span class="successtag"></span>
<span class="congratulation">恭喜!</span>
{{#if relate}}
<span class="successnotify">您的手机号码已经关联成功</span>
{{^}}
<span class="successnotify">您的号码已经绑定成功</span>
{{/if}}
</div>
{{#if relate}}
<h3 class="info">该手机号码不能用来登录此账户,您可以选择继续使用{{sourceName}}登录</h3>
{{^}}
<h3 class="info">今后您可以选择{{sourceName}}或绑定的手机号码+密码的方式登录此账户</h3>
{{/if}}
<a href="{{goShopping}}" class="yohobindbtn gobuynow">立即购物</a>
</div>
\ No newline at end of file
... ...
<div class="welcome-item passport-page clearfix">
<div class="welcome-body-left passport-cover">
<div class="cover-content">
<div class="img"></div>
</div>
</div>
<div class="welcome-body-right">
<h2>欢迎来到<em>YOHO!FAMILY</em></h2>
<p>为了您的账号安全,请您完善个人信息,以便为您提供更优质的服务!</p>
<div class="welcome-a">
<a href="{{refer}}">前往购物</a>
<a href="{{certUrl}}">完善资料</a>
</div>
</div>
</div>
... ...
require('./cert/bind-info');
require('../common');
... ...
require('./cert/relate');
require('../common');
... ...
/**
* 绑定成功页面
**/
require('../simple-header');
require('../common');
... ...
require('./cert/cert');
require('../common');
... ...
/**
* 第三方绑定完善个人信息
* @author: wq
* @date: 2016/1/27
*/
var $ = require('yoho-jquery');
var dovalidate = false; // 校验验证码的标识
var isvalidatecode = false; // 是否验证成功的标识
var isvalidatepwd = false; // 密码验证是否通过的标识
var second = ''; // 倒计时时间
var nopermissionoption = ''; // 倒计时的dom
var sendmessagehtml = ''; // 发送短信的dom
var $pwd,
$pwdParent,
$pwdTip1,
$pwdIntensity;
require('../../simple-header');
nopermissionoption = $('#nopermissionmessage').html();
sendmessagehtml = $('.validatewrapper').html();
second = +$('.second').text();
function gettype(str, i) {
if (str.charCodeAt(i) >= 48 && str.charCodeAt(i) <= 57) {
return 1;
} else if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 122) {
return 2;
} else if (str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90) {
return 3;
}
return 4;
}
function isregular(cur, pre, type) {
var curCode = cur.charCodeAt(0);
var preCode = pre.charCodeAt(0);
if (curCode - preCode === 0) {
return true;
}
if (type !== 4 && (curCode - preCode === 1 || curCode - preCode === -1)) {
return true;
}
return false;
}
function getcomplex(curType, preType) {
if (preType === 0 || curType === preType) {
return 0;
} else if (curType === 4 || preType === 4) {
return 2;
} else {
return 1;
}
}
/**
* @desc: 计算密码复杂度(from:http://www.oschina.net/code/snippet_127301_17269)
* @author: xuqi(qi.xu@yoho.cn)
* @date: 2015/5/6
*/
function computeComplex(password) {
var complex = 0;
var length = password.length;
var pre = '';
var preType = 0;
var i = 0;
var cur = '';
var curType = '';
for (i; i < length; i++) {
cur = password.charAt(i);
curType = gettype(password, i);
if (preType !== curType || !isregular(cur, pre, curType)) {
complex += curType + getcomplex(curType, preType);
}
pre = cur;
preType = curType;
}
return complex;
}
function changeSecond() {
second -= 1;
if (second < 0) {
second = 60;
$('.validatewrapper').html(sendmessagehtml);
return;
} else {
$('.second').text(second);
window.setTimeout(changeSecond, 1000);
}
}
/**
* 启动倒计时
* @return {[type]} [description]
*/
function circleTime() {
$('.validatewrapper').html(nopermissionoption);
window.setTimeout(changeSecond, 1000);
}
function sendMessageValidate() {
var mobile = '';
var area = '';
$(document).on('click', '#sendmessage', function() {
circleTime();
mobile = $('#mobile').val();
area = $('#area').val();
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/sendBindMsg',
data: {
mobile: mobile,
area: area
}
}).then(function(data) {
if (data.code !== 200) {
alert(data.message);
}
});
});
}
function codeValidate() {
var validatenum = '';
$(document).on('keyup', '#validatenum', function() {
$('#err-info').hide();
validatenum = $(this).val();
if (validatenum.length === 4) {
if (!dovalidate) {
dovalidate = true;
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/checkBindMsg',
data: {
code: validatenum,
mobile: $('#mobile').val(),
area: $('#area').val()
}
}).then(function(data) {
dovalidate = false;
if (data.code !== 200) {
$('#err-info').show();
} else {
isvalidatecode = true;
}
});
}
}
});
}
function pwdKeyupEvt() {
var pwd = $pwd.val(),
pwdStrength = computeComplex(pwd),
level = 0;
if (pwdStrength === 0) {
level = 0;
} else if (pwdStrength <= 10) {
level = 1;
} else if (pwdStrength <= 20) {
level = 2;
} else {
level = 3;
}
switch (level) {
case 0:
$pwdParent.removeClass('red yellow green');
$pwdIntensity.removeClass('color');
break;
case 1:
$pwdParent.addClass('red').removeClass('yellow green');
$pwdIntensity.filter('.low').addClass('color');
$pwdIntensity.filter('.mid,.high').removeClass('color');
break;
case 2:
$pwdParent.addClass('yellow').removeClass('red green');
$pwdIntensity.filter('.low,.mid').addClass('color');
$pwdIntensity.filter('.high').removeClass('color');
break;
case 3:
$pwdParent.addClass('green').removeClass('yellow red');
$pwdIntensity.addClass('color');
break;
default:
break;
}
if (pwd === '') {
isvalidatepwd = false;
$pwdTip1.removeClass('red yes no').addClass('default');
} else {
if (pwd.length < 6 || pwd.length > 20) {
isvalidatepwd = false;
$pwdTip1.removeClass('default yes').addClass('no red');
} else {
isvalidatepwd = true;
$pwdTip1.removeClass('default no red').addClass('yes');
}
}
}
function validatePwd() {
$(document).on('keyup', '.pwdcontent', function() {
pwdKeyupEvt($(this));
});
$(document).on('focus', '.pwdcontent', function() {
$('#pwd-tips').removeClass('hide');
});
$(document).on('blur', '.pwdcontent', function() {
$('#pwd-tips').addClass('hide');
});
}
/**
* 最终提交表单
*/
function actionSubmit() {
var mobile = '';
var area = '';
var pwd = '';
var code = '';
area = $('#area').val();
pwd = $('#pwd').val();
mobile = $('#mobile').val();
code = $('#validatenum').val();
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/bindMobile',
data: {
area: area,
openId: $('#openId').val(),
sourceType: $('#sourceType').val(),
mobile: mobile,
password: pwd,
code: code
}
}).then(function(data) {
if (data.code === 200) {
window.location.href = '/passport/thirdlogin/bindsuccess';
} else {
alert(data.message);
}
});
}
/**
* 确定完善信息
* @return {[type]} [description]
*/
function actionConfirm() {
var validatenum = '';
var pwd = '';
$('#confirmsubmit').on('click', function() {
validatenum = $('#validatenum').val();
pwd = $('#pwd').val();
if (validatenum === '') {
alert('短信验证码不能为空');
return;
}
if (pwd === '') {
alert('密码不能为空');
return;
}
if (!/^(?![^a-zA-Z]+$)(?!\D+$).{6,20}$/.test(pwd)) {
alert('密码只支持6-20位字符,建议字母+数字的组合。');
return;
}
if (isvalidatecode === false) {
alert('请输入正确的验证码');
return;
}
if (isvalidatepwd === false) {
alert('请输入符合强度的密码');
return;
}
actionSubmit();
});
}
function init() {
circleTime(); // 倒计时
$pwd = $('#pwd');
$pwdParent = $('.safelevel');
$pwdIntensity = $('.pwd-intensity');
$pwdTip1 = $('#pwd-tip1');
sendMessageValidate();
codeValidate();
validatePwd();
actionConfirm();
}
init();
... ...
/**
* 第三方登录首页
* @author: wq
* @date: 2016/1/21
*/
var $ = require('yoho-jquery');
var phoneRegx = require('../common/mail-phone-regx').phoneRegx;
var nopermissionoption = $('#nopermissionmessage').html(); // 倒计时dom
var sendmessagehtml = $('.validatewrapper').html(); // 发送短信dom
var second = +$('.second').text(); // 倒计时秒数
var dovalidate = false; // 校验验证码标识
var validatecode = false; // 验证码是否通过
var choosedpic = 'http://cdn.yoho.cn/yohobuy/assets/img/passport/choosed.png';// 已选择图片
var $wrapper = $('.bindwrapper'),
$phoneTip = $wrapper.find('.phone-err-tip'),
$nextBtn = $wrapper.find('.yohobindbtn');
require('../../simple-header');
/**
* 选择协议
* @return {[type]} [description]
*/
function chooseProtocol() {
$('.choosetag').on('change', function() {
var btnColor = '#f02200';
if ($(this).attr('checked') === 'checked') {
$('.choosewrapper').css({
'background-image': 'url("' + choosedpic + '")'
});
} else {
$('.choosewrapper').css({
'background-image': 'none'
});
btnColor = '#CCCCCC';
}
$nextBtn.css({
'background-color': btnColor
});
});
}
/**
* 判断是否同意协议
* @return {[type]} [description]
*/
function isagree() {
return $('.choosetag').attr('checked') === 'checked';
}
/**
* 选择区域的开关
* @return {[type]} [description]
*/
function chooseAreaToogle() {
$('.optionshow').on('click', function() {
$('.optionslist').toggleClass('hide');
});
}
/**
* 验证码校验
* @return {[type]} [description]
*/
function codeValidate() {
var validatenum = '';
$(document).on('keyup', '#validatenum', function() {
validatenum = $(this).val();
if (validatenum.length === 4) {
if (!dovalidate) {
dovalidate = true;
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/checkBindMsg',
data: {
code: validatenum,
mobile: $('#mobile').val(),
area: $('#areacode').val()
}
}).then(function(data) {
dovalidate = false;
if (data.code === 200) {
validatecode = true;
} else {
alert(data.message);
}
});
}
}
});
$('#validatenum').focus(function() {
$(this).removeAttr('placeholder');
}).blur(function() {
$(this).attr('placeholder', '验证码');
});
}
/**
* 选择区域
* @return {[type]} [description]
*/
function chooseArea() {
$('.optionitem').on('click', function() {
var $option = $(this);
var areanum = $option.attr('areanum');
var areaname = $option.text();
$('#areaname').text(areaname);
$('#areanum').text(areanum);
$('#areacode').val(areanum);
$('.optionslist').addClass('hide');
});
}
/**
* 取消选择区域
* @return {[type]} [description]
*/
function cancelChooseArea() {
$(document).on('click', 'body', function(e) {
var $target = $(e.target);
if ($target.hasClass('yohoselectarea') ||
$target.hasClass('areaname') ||
$target.hasClass('righttag') ||
$target.hasClass('optionslist') ||
$target.hasClass('optionitem')) {
return;
} else {
$('.optionslist').addClass('hide');
}
});
}
/**
* 去掉区域号的加号
* @return {[type]} [description]
*/
function fixAreaNum() {
var $opitem = '';
var itemarecode = '';
$('.optionitem').each(function() {
$opitem = $(this);
itemarecode = $opitem.attr('areanum').replace(/\+/g, '');
$opitem.attr('areanum', itemarecode);
});
}
/**
* 关闭蒙层
* @return {[type]} [description]
*/
function closeMask() {
var $target;
$(document).on('click', '#alreayregist', function(e) {
$target = $(e.target);
if ($target.hasClass('mask') || $target.hasClass('backdrop')) {
$('#alreayregist').hide();
$('.backdrop').hide();
}
});
/* $(document).on('click', '#bindconfirm', function(e) {
$target = $(e.target);
if ($target.hasClass('mask') || $target.hasClass('backdrop')) {
$('#bindconfirm').hide();
$('.backdrop').hide();
}
});*/
}
/**
* 绑定其他手机号
* @return {[type]} [description]
*/
function yohoBindBtn() {
/* $(document).on('click', '#yohobindbtn', function() {
$('.phonenum').val('');
$('#bindconfirm').hide();
$('.backdrop').hide();
});*/
$(document).on('click', '#yohobindbtn2', function() {
$('.phonenum').val('');
$('#alreayregist').hide();
$('.backdrop').hide();
});
}
/**
* 发送短信的时间变换动画
* @return {[type]} [description]
*/
function changeSecond() {
second -= 1;
if (second < 0) {
second = 60;
$('.validatewrapper').html(sendmessagehtml);
return;
} else {
$('.second').text(second);
window.setTimeout(changeSecond, 1000);
}
}
/**
* 时间循环
* @param {[type]} phonenum [description]
* @return {[type]} [description]
*/
function circleTime(phonenum) {
$('.validatewrapper').html(nopermissionoption);
window.setTimeout(changeSecond, 1000);
}
/**
* 发送短信
* @return {[type]} [description]
*/
function sendMessageValidate() {
$(document).on('click', '#sendmessage', function() {
if ($('#sendmessage').attr('disabled') === 'disabled') {
return;
}
circleTime($('#mobile').val());
$.ajax({
type: 'POST',
url: '/passport/cert/sendCertMsg',
data: {
mobile: $('#mobile').val(),
area: $('#areacode').val()
}
}).then(function(data) {
if (data.code !== 200) {
alert(data.message);
}
});
});
}
/**
* 最终提交表单
*/
function actionSubmit() {
var mobile = '';
var area = '';
area = $('#areacode').val();
mobile = $('#mobile').val();
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/bindMobile',
data: {
area: area,
openId: $('#openId').val(),
sourceType: $('#sourceType').val(),
mobile: mobile,
code: $('#validatenum').val()
}
}).then(function(data) {
if (data.code === 200) {
if (data.data && data.data.refer) {
window.location.href = data.data.refer;
} else {
window.location.href = '/passport/thirdlogin/bindsuccess';
}
} else {
alert(data.message);
}
});
}
/**
* 确认去绑定
* @return {[type]} [description]
*/
function goToBindPhone() {
$(document).on('click', '#gotobindphone', function() {
if (validatecode === true) {
$('#inarea').val($('#areacode').val());
$('#inmobile').val($('#mobile').val());
actionSubmit();
} else {
alert('请输入正确验证码');
}
});
}
/**
* 点击下一步
* @return {[type]} [description]
*/
function nextStep() {
var mobile = '';
var areaCode = '';
var username = '';
var headImg = '';
$('#bindfirststep').on('click', function(e) {
var regx;
e.preventDefault();
mobile = $('.phonenum').val();
areaCode = $('#areanum').text();
regx = phoneRegx['+' + areaCode];
if (!isagree()) {
return;
}
if (mobile === '' || !regx || !regx.test(mobile)) {
$phoneTip.find('em').text('手机格式错误');
$phoneTip.removeClass('hide');
return;
}
$.ajax({
type: 'post',
url: '/passport/cert/check',
data: {
mobile: mobile,
area: areaCode
},
dataType: 'json',
success: function(data) {
if (data.code === 200) { // 绑定/关联
$('#bindmobileform').attr('action', data.data.next);
$('#bindmobileform').submit();
} else if (data.code === 402) {
$phoneTip.find('em').text('手机格式错误');
$phoneTip.removeClass('hide');
} else {
if (data && data.message) {
alert(data.message);
}
}
}
});
});
}
$wrapper.on('keydown', '.phonenum', function(e) {
if (e.keyCode === 13) {
$nextBtn.trigger('click');
return false;
}
});
function init() {
fixAreaNum(); // 去掉所有区域的+
sendMessageValidate(); // 有交互的发送短信
chooseProtocol(); // 选择协议
chooseArea(); // 选择区域
chooseAreaToogle(); // 选择区域展示或关闭
cancelChooseArea(); // 取消选择区域
nextStep(); // 下一步
closeMask(); // 关闭蒙层
yohoBindBtn(); // 绑定其他手机号点击
goToBindPhone(); // 绑定手机
codeValidate(); // 验证码校验
}
init();
... ...
/**
* 第三方关联
* @author: yyqing<yanqing.yang@yoho.cn>
* @date: 2016/4/11
*/
var $ = require('yoho-jquery');
var $relateMain = $('#relate-main'),
$codeValidate = $('#code-validate'),
$vaWrapper = $codeValidate.find('.validate-wrapper'),
$msgCode = $codeValidate.find('.msg-code'),
$second = $codeValidate.find('.count-down span'),
$errTip = $codeValidate.find('.code-error'),
$hideDom = $('#hide-info');
var relate = {};
var circleTime = {};
require('../../simple-header');
relate = $hideDom.data();
$hideDom.remove();
// 倒计时
circleTime = {
init: function() {
if (this.timer) {
window.clearTimeout(this.timer);
}
this.second = 60;
$vaWrapper.addClass('waiting');
this.changeTime();
},
changeTime: function() {
var that = this;
if (this.second && this.second > 0) {
$second.text(this.second);
this.second--;
this.timer = window.setTimeout(function() {
that.changeTime();
}, 1000);
} else {
this.clearTime();
}
},
clearTime: function() {
if (this.timer) {
window.clearTimeout(this.timer);
}
$vaWrapper.removeClass('waiting');
}
};
function sendVerifyMsg() {
circleTime.init();
$.ajax({
type: 'POST',
url: '/passport/cert/sendCertMsg',
data: {
mobile: relate.mobile,
area: relate.area
}
}).then(function(jsonData) {
if (jsonData && jsonData.code !== 200) {
circleTime.clearTime();
alert(jsonData.message);
}
});
}
function relateMobile() {
var code = $msgCode.val();
if (!code) {
return;
}
$.ajax({
type: 'POST',
url: '/passport/cert/relateMobile',
data: {
mobile: relate.mobile,
area: relate.area,
code: code
}
}).then(function(jsonData) {
if (jsonData.code === 200) {
window.location.href = jsonData.data.refer;
} else if (jsonData.code === 402) {
$errTip.removeClass('hide');
} else {
$errTip.addClass('hide');
alert(jsonData.message);
}
});
}
$('#next-step-btn').click(function() {
sendVerifyMsg();
$relateMain.addClass('hide');
$errTip.addClass('hide');
$codeValidate.removeClass('hide');
});
$codeValidate.on('keydown', '.msg-code', function(e) {
if (e.keyCode === 13) {
relateMobile();
return false;
}
});
$codeValidate.on('click', '.get-code', function() {
sendVerifyMsg();
});
$codeValidate.on('click', '.perv-step', function() {
circleTime.clearTime();
$relateMain.removeClass('hide');
$codeValidate.addClass('hide');
$msgCode.val('');
});
$('#relate-btn').click(function() {
relateMobile();
});
... ...
/**
* 第三方绑定完善个人信息
* @author: wq
* @date: 2016/1/27
*/
var $ = require('yoho-jquery');
var dovalidate = false; // 校验验证码的标识
var isvalidatecode = false; // 是否验证成功的标识
var isvalidatepwd = false; // 密码验证是否通过的标识
var second = ''; // 倒计时时间
var nopermissionoption = ''; // 倒计时的dom
var sendmessagehtml = ''; // 发送短信的dom
var submitStatus = false; // 信息提交状态
var $wrapper = $('.bindwrapper'),
$codeTip = $wrapper.find('.code-err-tip'),
$pwdTip = $wrapper.find('.pwd-err-tip'),
$pwdTip2 = $('#pwd-tip2'),
$sendMsgBtn = $('#sendmessage');
var $pwd,
$pwdParent,
$pwdTip1,
$pwdIntensity;
var pwdRegx = require('./mail-phone-regx').pwdValidateRegx;
var mobile = $('#mobile').val(),
area = $('#area').val();
nopermissionoption = $('#nopermissionmessage').html();
sendmessagehtml = $('.validatewrapper').html();
second = +$('.second').text();
function gettype(str, i) {
if (str.charCodeAt(i) >= 48 && str.charCodeAt(i) <= 57) {
return 1;
} else if (str.charCodeAt(i) >= 97 && str.charCodeAt(i) <= 122) {
return 2;
} else if (str.charCodeAt(i) >= 65 && str.charCodeAt(i) <= 90) {
return 3;
}
return 4;
}
function isregular(cur, pre, type) {
var curCode = cur.charCodeAt(0);
var preCode = pre.charCodeAt(0);
if (curCode - preCode === 0) {
return true;
}
if (type !== 4 && (curCode - preCode === 1 || curCode - preCode === -1)) {
return true;
}
return false;
}
function getcomplex(curType, preType) {
if (preType === 0 || curType === preType) {
return 0;
} else if (curType === 4 || preType === 4) {
return 2;
} else {
return 1;
}
}
/**
* @desc: 计算密码复杂度(from:http://www.oschina.net/code/snippet_127301_17269)
* @author: xuqi(qi.xu@yoho.cn)
* @date: 2015/5/6
*/
function computeComplex(password) {
var complex = 0;
var length = password.length;
var pre = '';
var preType = 0;
var i = 0;
var cur = '';
var curType = '';
for (i; i < length; i++) {
cur = password.charAt(i);
curType = gettype(password, i);
if (preType !== curType || !isregular(cur, pre, curType)) {
complex += curType + getcomplex(curType, preType);
}
pre = cur;
preType = curType;
}
return complex;
}
function showErrTip($dom, info) {
$dom.find('em').text(info);
$dom.removeClass('hide');
}
function changeSecond() {
second -= 1;
if (second < 0) {
second = 60;
$('.validatewrapper').html(sendmessagehtml);
return;
} else {
$('.second').text(second);
window.setTimeout(changeSecond, 1000);
}
}
/**
* 启动倒计时
* @return {[type]} [description]
*/
function circleTime() {
$('.validatewrapper').html(nopermissionoption);
window.setTimeout(changeSecond, 1000);
}
function sendMessageValidate() {
$(document).on('click', '#sendmessage', function() {
circleTime();
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/sendBindMsg',
data: {
mobile: mobile,
area: area
}
}).then(function(data) {
if (data.code !== 200) {
alert(data.message);
}
});
});
}
function codeValidate() {
var validatenum = '';
$(document).on('keyup', '#validatenum', function() {
$('#err-info').hide();
validatenum = $(this).val();
if (validatenum.length === 4) {
if (!dovalidate) {
dovalidate = true;
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/checkBindMsg',
data: {
code: validatenum,
mobile: mobile,
area: area
}
}).then(function(data) {
dovalidate = false;
if (data.code !== 200) {
$('#err-info').show();
} else {
isvalidatecode = true;
}
});
}
}
});
}
function pwdKeyupEvt() {
var pwd = $pwd.val(),
pwdStrength = computeComplex(pwd),
level = 0;
if (pwdStrength === 0) {
level = 0;
} else if (pwdStrength <= 10) {
level = 1;
} else if (pwdStrength <= 20) {
level = 2;
} else {
level = 3;
}
switch (level) {
case 0:
$pwdParent.removeClass('red yellow green');
$pwdIntensity.removeClass('color');
break;
case 1:
$pwdParent.addClass('red').removeClass('yellow green');
$pwdIntensity.filter('.low').addClass('color');
$pwdIntensity.filter('.mid,.high').removeClass('color');
break;
case 2:
$pwdParent.addClass('yellow').removeClass('red green');
$pwdIntensity.filter('.low,.mid').addClass('color');
$pwdIntensity.filter('.high').removeClass('color');
break;
case 3:
$pwdParent.addClass('green').removeClass('yellow red');
$pwdIntensity.addClass('color');
break;
default:
break;
}
if (pwd === '') {
isvalidatepwd = false;
$pwdTip1.removeClass('red yes no').addClass('default');
} else {
if (pwd.length < 6 || pwd.length > 20) {
isvalidatepwd = false;
$pwdTip1.removeClass('default yes').addClass('no red');
} else {
isvalidatepwd = true;
$pwdTip1.removeClass('default no red').addClass('yes');
}
if (/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]*$/.test(pwd)) {
$pwdTip2.removeClass('default no red').addClass('yes');
} else {
$pwdTip2.removeClass('default yes').addClass('no red');
}
}
}
function validatePwd() {
$(document).on('keyup', '.pwdcontent', function() {
pwdKeyupEvt($(this));
});
$(document).on('focus', '.pwdcontent', function() {
$('#pwd-tips').removeClass('hide');
});
$(document).on('blur', '.pwdcontent', function() {
$('#pwd-tips').addClass('hide');
});
}
/**
* 最终提交表单
*/
function actionSubmit() {
var pwd = '';
var code = '';
// 查看提交状态,避免重复提交
if (submitStatus) {
return;
}
submitStatus = true;
setTimeout(function() {
submitStatus = false;
}, 50000);
pwd = $('#pwd').val();
code = $('#validatenum').val();
$.ajax({
type: 'POST',
url: '/passport/autouserinfo/bindMobile',
data: {
area: area,
openId: $('#openId').val(),
sourceType: $('#sourceType').val(),
mobile: mobile,
password: pwd,
code: code
}
}).then(function(data) {
submitStatus = false;
if (data.code === 200) {
if (data.data && data.data.refer) {
window.location.href = data.data.refer;
} else {
window.location.href = '/passport/thirdlogin/bindsuccess';
}
} else {
alert(data.message);
}
});
}
/**
* 确定完善信息
* @return {[type]} [description]
*/
function actionConfirm() {
var validatenum = '';
var pwd = '';
$('#confirmsubmit').on('click', function() {
var isAssess = true;
validatenum = $('#validatenum').val();
pwd = $('#pwd').val();
if (validatenum === '') {
showErrTip($codeTip, '短信验证码不能为空');
isAssess = false;
} else if (isvalidatecode === false) {
showErrTip($codeTip, '请输入正确的验证码');
isAssess = false;
}
if (pwd === '') {
showErrTip($pwdTip, '密码不能为空');
isAssess = false;
} else if (pwd.length < 6 || pwd.length > 20) {
showErrTip($pwdTip, '密码只支持6-20位字符');
isAssess = false;
} else if (!pwdRegx.test(pwd)) {
showErrTip($pwdTip, '密码须由字母和数字组合');
isAssess = false;
} else if (isvalidatepwd === false) {
showErrTip($pwdTip, '请输入符合强度的密码');
isAssess = false;
}
if (!isAssess) {
return;
}
actionSubmit();
});
}
function init() {
$pwd = $('#pwd');
$pwdParent = $('.safelevel');
$pwdIntensity = $('.pwd-intensity');
$pwdTip1 = $('#pwd-tip1');
sendMessageValidate();
codeValidate();
validatePwd();
actionConfirm();
if (mobile && area) {
$sendMsgBtn.click();
}
}
init();
... ...
... ... @@ -12,12 +12,13 @@
text-align: center;
}
img{
.img{
display: inline-block;
margin-top: 50px;
width: 240px;
max-width: 240px;
height:200px;
background: resolve('passport/welcome.jpg') no-repeat;
}
}
... ... @@ -66,4 +67,4 @@
}
}
}
}
\ No newline at end of file
}
... ...
... ... @@ -219,4 +219,4 @@
@import "welcome";
@import "relate";
@import "third";
@import "_bind-tip.css";
\ No newline at end of file
@import "_bind-tip.css";
... ...