Authored by 毕凯

Merge branch 'gray' into 'master'

Gray



See merge request !425
... ... @@ -10,7 +10,6 @@ exports.index = (req, res) => {
};
exports.submit = (req, res) => {
let captchaCode = _.get(req.session, 'captcha');
let remoteIp = req.get('X-Forwarded-For') || req.ip;
if (remoteIp.indexOf(',') > 0) {
... ... @@ -19,21 +18,16 @@ exports.submit = (req, res) => {
remoteIp = arr[0];
}
if (req.body.captcha === captchaCode) {
let key = `pc:limiter:${remoteIp}`;
cache.delAsync(key).then(() => {
return res.json({
code: 200
});
}).catch(() => {
return res.json({
code: 400
});
let key = `pc:limiter:${remoteIp}`;
cache.delAsync(key).then(() => {
return res.json({
code: 200
});
} else {
}).catch(() => {
return res.json({
code: 400
});
}
});
};
... ...
... ... @@ -10,11 +10,12 @@ const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
const ads = require(`${cRoot}/ads`);
const check = require(`${cRoot}/check`);
const validateCode = require('../passport/controllers/validateCode');
// routers
router.get('/ads', ads.index);
router.get('/check', check.index);
router.post('/check/submit', check.submit);
router.get('/check', validateCode.load, check.index);
router.post('/check/submit', validateCode.check, check.submit);
module.exports = router;
... ...
<div class="check-page">
<div class="title">请输入正确的验证码,继续访问</div>
<div id="js-img-check"></div>
<div class="title">请确认之后,继续访问</div>
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<div class="submit">
确认
</div>
... ...
... ... @@ -502,7 +502,7 @@
</ul>
</p>
<p>
第二十二条 借款利率一般情形下按以下标准计收,不排除因特殊情况实际的利率与下列利率存在差异,具体利息标准以借款订单所示信息为准
第二十二条 日息一般情形下为0.06%,不排除因特殊情况实际的日息与上述日息存在差异,具体利息标准以借款订单所示信息为准。如借款发生逾期,则您需要根据如下标准按日向信而富支付延迟还款服务费:如借款金额为500元以内(含500元),则延迟还款服务费为1元/天;如借款金额为501—1000元(含1000元),则延迟还款服务费为2元/天;如借款金额为1001—1500元(含1500元),则延迟还款服务费为3元/天; 如借款金额为1501-2000元(含2000元),则延迟还款服务费为4元/天,以此类推,以500元为一个梯度,借款金额每增加一个梯度,延迟还款服务费每天增加1元。逾期3天免收逾期费用,逾期超过3天,按实际逾期总天数收取逾期费用。同时,一旦逾期费用和利息之和超过借款金额的50%,则之后的延迟还款服务费将不再计收。利息和延迟还款服务费的具体数值以信而富平台借款订单详情为准,有特别说明的除外
<table>
<tr>
<td>分期</td>
... ...
... ... @@ -101,7 +101,7 @@
9、如果我没有按时还款会有什么影响?
</p>
<p>
如您在还款日24:00之前未能支付全部到期应付款而导致您信用违约时,您需支付逾期所产生的服务费和利息。服务费根据您当期应还本金,如当期应还本金在1-500元内,收取1元/天,501-1000元内,收取2元/天,借款本金每增加500元,逾期服务费增加1元;利息为您应付但未付金额×日利率(0.025%)×逾期天数。还款日后有3天的宽限日,宽限日内免收逾期服务费,宽限日结束后如您尚未还款将补收前三天的逾期服务费。请您在还款日前还款,避免对您的个人信用造成损失。
如您在还款日24:00之前未能支付全部到期应付款而导致您信用违约时,您需支付逾期所产生的服务费和利息。服务费根据您当期应还本金,如当期应还本金在1-500元内,收取1元/天,501-1000元内,收取2元/天,借款本金每增加500元,逾期服务费增加1元;利息为您应付但未付金额×日利率(一般情形下为0.06%)×逾期天数。还款日后有3天的宽限日,宽限日内免收逾期服务费,宽限日结束后如您尚未还款将补收前三天的逾期服务费。同时,一旦逾期费用和利息之和超过借款本金的50%,则之后的逾期费用将不再计收。请您在还款日前还款,避免对您的个人信用造成损失。
</p>
<p>
10、逾期还款会影响个人信用吗?
... ...
... ... @@ -195,50 +195,8 @@ const generateCodeImg = (req, res) => {
* 发送手机验证码
*/
const sendCodeToMobileAPI = (req, res, next) => {
let verifyCode = req.body.verifyCode || '';
let phoneNum = req.body.phoneNum || '';
let areaCode = req.body.areaCode || '86';
let testCode = req.body.yohobuy;
let errorCount = _.get(req.session, 'captchaValidCount', 4); // 初始1次 + 后续4次, 同一个验证码 共5次
if (!errorCount) {
_.set(req.session, 'captchaValidCount', 4);
} else {
--req.session.captchaValidCount;
}
if (verifyCode) {
let captcha = _.get(req, 'session.captcha');
logger.info(`captcha validate result${verifyCode.toString() === captcha},user:${verifyCode};server:${captcha}`);
if ((captcha && verifyCode.toString() === captcha) || (testCode === config.testCode)) {
_.set(req.session, 'backupCaptch.verifyResult', true);
} else {
let jsonData = {
code: 400,
message: '请将图片旋转到正确位置'
};
if (req.session.captchaValidCount === 0) {
req.session.captcha = null; // 验证码 用过就扔
jsonData.changeCaptcha = true;
}
return res.json(jsonData);
}
_.set(req.session, 'captcha', null);
} else if (!req.session.backupCaptch.verifyResult) {
return res.json({
code: 409,
message: '非法请求!',
refer: helpers.urlFormat('/')
});
}
let ERR = {
code: 400,
... ... @@ -266,7 +224,7 @@ const sendCodeToMobileAPI = (req, res, next) => {
}
}
_.set(req.session, 'backupCaptch.verifyResult', true);
service.sendCodeToMobileAsync(phoneNum, areaCode)
.then(result => {
if (_.isEmpty(result) || result.code !== 200) {
... ...
... ... @@ -57,7 +57,8 @@ const bind = {
serviceUrl: serviceUrl, // 在线客服
module: 'passport',
page: 'bind',
title: '绑定手机号'
title: '绑定手机号',
width750: true
});
},
... ... @@ -90,58 +91,35 @@ const bind = {
let openId = req.body.openId;
let areaCode = req.body.areaCode || '86';
let sourceType = req.body.sourceType;
let verify = req.body.verify || '';
let testCode = req.body.yohobuy;
if (_.isNumber(parseInt(phoneNum, 0)) && openId && areaCode && sourceType) {
if (verify) {
let captcha = _.get(req, 'session.captcha');
logger.info(`captcha validate result${verify.toString() === captcha},user:${verify};server:${captcha}`);
if ((captcha && verify.toString() === captcha) || (testCode === config.testCode)) {
BindService.bindCheck(phoneNum, openId, sourceType, areaCode).then(result => {
let data = {
code: result.code,
message: result.message,
data: {}
};
if (result.code === 200) {
let nextUrl = helpers.urlFormat('/passport/bind/code', {
isReg: result.data.is_register, // esline-disable-line
openId: openId,
sourceType: sourceType,
areaCode: areaCode,
phoneNum: phoneNum
});
data.data.isReg = result.data.is_register;
data.data.next = nextUrl;
_.set(req.session, 'bind.area', areaCode);
_.set(req.session, 'bind.phoneNum', phoneNum);
} else {
data.data = result.data;
}
BindService.bindCheck(phoneNum, openId, sourceType, areaCode).then(result => {
let data = {
code: result.code,
message: result.message,
data: {}
};
if (result.code === 200) {
let nextUrl = helpers.urlFormat('/passport/bind/code', {
isReg: result.data.is_register, // esline-disable-line
openId: openId,
sourceType: sourceType,
areaCode: areaCode,
phoneNum: phoneNum
});
res.json(data);
}).catch(next);
} else {
let jsonData = {
code: 400,
message: '请将图片旋转到正确方向'
};
if (req.session.captchaValidCount === 0) {
req.session.captcha = null; // 验证码 用过就扔
jsonData.changeCaptcha = true;
}
data.data.isReg = result.data.is_register;
data.data.next = nextUrl;
return res.json(jsonData);
_.set(req.session, 'bind.area', areaCode);
_.set(req.session, 'bind.phoneNum', phoneNum);
} else {
data.data = result.data;
}
_.set(req.session, 'captcha', null);
}
res.json(data);
}).catch(next);
} else {
res.json({
code: 400,
... ...
'use strict';
const _ = require('lodash');
const logger = global.yoho.logger;
let imgCheckAPI = require('../models/imgcheck');
const request = require('request');
const uuid = require('uuid');
... ... @@ -43,3 +45,37 @@ exports.imgCheck = (req, res, next) => {
next();
}).catch(next);
};
/**
* 验证img-check验证码
*/
exports.validate = (req, res, next) => {
let captchaInput = req.body.captcha;
let captchaCode = _.get(req.session, 'captcha');
let errorCount = _.get(req.session, 'captchaValidCount'); // 初始1次 + 后续4次, 同一个验证码 共5次
let jsonData = {
code: 400,
message: '请将图片旋转到正确方向',
captchaShow: true
};
logger.info(`captcha validate result${
captchaInput.toString() === captchaCode},user:${captchaInput};server:${captchaCode}`);
_.set(req.session, 'captchaValidCount', errorCount - 1);
if (!errorCount) {
_.set(req.session, 'captchaValidCount', 5);
req.session.captcha = null;
jsonData.changeCaptcha = true;
}
if (!(captchaInput && captchaCode && captchaInput === captchaCode)) {
return res.json(jsonData);
}
req.session.captcha = null;
req.session.captchaValidCount = null;
return next();
};
... ...
'use strict';
const _ = require('lodash');
const Geetest = require('geetest');
const logger = global.yoho.logger;
const config = global.yoho.config;
const captcha = new Geetest({
geetest_id: 'bce95d796bc3058615fdf2ec2c0aef29',
... ... @@ -27,8 +25,7 @@ const geetest = {
validate(req, res, next) {
let challenge = req.body.geetest_challenge,
validate = req.body.geetest_validate,
seccode = req.body.geetest_seccode,
testCode = req.body.yohobuy;
seccode = req.body.geetest_seccode;
let errRes = {
code: 400,
... ... @@ -37,21 +34,11 @@ const geetest = {
changeCaptcha: true
};
if (testCode === config.testCode) {
return next();
}
// 使用极验证
let useGeetest = !_.get(req.app.locals.wap, 'geetest.validation', false);
if (!useGeetest) {
return next();
}
if (!challenge || !validate || !seccode) {
return res.send(errRes);
return res.json(errRes);
}
captcha.validate({
return captcha.validate({
challenge,
validate,
seccode
... ... @@ -61,7 +48,7 @@ const geetest = {
return next();
}
logger.info('geetest faild');
return res.send(errRes);
return res.json(errRes);
});
}
};
... ...
... ... @@ -17,7 +17,6 @@ const config = global.yoho.config;
const utils = require(global.utils);
const RegService = require('../models/reg-service');
const AuthHelper = require('../models/auth-helper');
const logger = global.yoho.logger;
const loginPage = `${config.siteUrl}/signin.html`;
... ... @@ -118,7 +117,6 @@ const local = {
res.render('login', {
width750: true,
loginIndex: true, // 模板中使用JS的标识
useGeetest: !_.get(req.app.locals.wap, 'geetest.validation', false), // 使用极验证
captchaShow: true, // 170306 因为暴力破解密码问题,要求每次都展示验证码
backUrl: 'javascript:history.go(-1)', // eslint-disable-line
showHeaderImg: true, // 控制显示头部图片
... ... @@ -135,12 +133,7 @@ const local = {
module: 'passport',
page: 'login',
title: '登录',
reg: true,
loadJs: [
{
src: global.yoho.config.geetestJs
}
]
reg: true
});
},
international: (req, res) => {
... ... @@ -181,7 +174,6 @@ const local = {
width750: true,
backUrl: 'javascript:history.go(-1)', // eslint-disable-line
loginInternational: true, // 模板中使用JS的标识
useGeetest: !_.get(req.app.locals.wap, 'geetest.validation', false), // 使用极验证
captchaShow: true, // 170306 因为暴力破解密码问题,要求每次都展示验证码
isPassportPage: true, // 模板中模块标识
headerText: '登录',
... ... @@ -189,12 +181,7 @@ const local = {
countrys: RegService.getAreaData(), // 地区信息列表
module: 'passport',
page: 'international',
title: '国际账号登录',
loadJs: [
{
src: global.yoho.config.geetestJs
}
]
title: '国际账号登录'
});
},
login: (req, res, next) => {
... ... @@ -208,47 +195,6 @@ const local = {
});
}
// 使用极验证
let useGeetest = !_.get(req.app.locals.wap, 'geetest.validation', false);
// 关闭极验证的时候使用有货自有验证码
if (!useGeetest) {
let captchaInput = req.body.captcha;
let captchaCode = _.get(req.session, 'captcha');
let testCode = req.body.yohobuy;
let errorCount = _.get(req.session, 'captchaValidCount'); // 初始1次 + 后续4次, 同一个验证码 共5次
let jsonData = {
code: 400,
message: '请将图片旋转到正确方向',
captchaShow: true
};
logger.info(`captcha validate result${captchaInput.toString() === captchaCode},user:${captchaInput};server:${captchaCode}`);
--req.session.captchaValidCount;
if (!errorCount) {
_.set(req.session, 'captchaValidCount', 5);
// delete req.session.captcha; // 验证码 用过就扔
req.session.captcha = null;
jsonData.changeCaptcha = true;
}
if (
!(
(captchaInput && captchaCode && captchaInput === captchaCode) ||
(testCode === config.testCode)
)
) {
res.json(jsonData);
return;
}
}
passport.authenticate('local', (err, user) => {
if (err || !user) {
let obj = {
... ...
... ... @@ -118,37 +118,6 @@ let verifyMobile = (req, res, next) => {
let mobile = +req.body.phoneNum;
let area = +(req.body.areaCode || 86);
let captcha = (req.body.captcha || '').trim();
let testCode = req.body.yohobuy;
let diffCaptcha = _.get(req.session, 'captcha');
let errorCount = _.get(req.session, 'captchaValidCount', 4);
// error case: 没有验证码
if (!diffCaptcha) {
data.message = '非法请求';
data.changeCaptcha = true;
return res.json(data);
}
if (req.session.captchaValidCount) {
--req.session.captchaValidCount;
}
if (!errorCount) {
_.set(req.session, 'captchaValidCount', 4);
req.session.captcha = null;
data.changeCaptcha = true;
}
logger.info(`captcha validate result${captcha.toString() === diffCaptcha},user:${captcha};server:${diffCaptcha}`);
// error case: 验证码不匹配
if (!(captcha === diffCaptcha || testCode === config.testCode)) {
data.message = '请将图片旋转到正确方向';
return res.json(data);
}
// 判断参数是否合法
if (!_.isNumber(mobile) || !_.isNumber(area)) {
... ... @@ -468,19 +437,6 @@ let setPassword = (req, res, next) => {
}).catch(next);
};
/**
* 生成 校验码
*/
const genCaptcha = (req, res) => {
let captcha = captchaService.generateCaptcha(90, 52, 4);
_.set(req.session, 'phoneReg.captcha', captcha.text);
res.type('png')
.set('Cache-Control', 'no-cache')
.status(200)
.send(captcha.image);
};
module.exports = {
guardStep,
... ... @@ -491,6 +447,5 @@ module.exports = {
sendCode,
verifyCode,
password: passwordAction,
setPassword,
genCaptcha
setPassword
};
... ...
... ... @@ -4,13 +4,11 @@ const _ = require('lodash');
const moment = require('moment');
const helpers = global.yoho.helpers;
const cookie = global.yoho.cookie;
const config = global.yoho.config;
const EventEmitter = require('events');
const utils = require(global.utils);
const RegService = require('../models/reg-service');
const PhoneService = require('../models/phone-service');
const AuthHelper = require('../models/auth-helper');
const logger = global.yoho.logger;
// constrant
const CODE_REQUIRED = '请输入校验码';
... ... @@ -147,24 +145,12 @@ exports.indexCheck = (req, res, next) => {
let area = req.body.area = (req.body.area || '').trim();
let mobile = req.body.mobile = (req.body.mobile || '').trim();
let captcode = (req.body.captcode || '').trim();
let captcodeValid = _.get(req.session, 'captcha');
let testCode = req.body.yohobuy;
let em = new EventEmitter();
let errorCount = _.get(req.session, 'captchaValidCount', 4 - 1); // 初始1次 + 后续4次, 同一个验证码 共5次
let errorData = {
code: 400,
message: ''
};
if (!errorCount) {
_.set(req.session, 'captchaValidCount', 3);
} else {
--req.session.captchaValidCount;
}
let em = new EventEmitter();
// 校验 成功
em.on('resolve', () => {
... ... @@ -190,24 +176,9 @@ exports.indexCheck = (req, res, next) => {
res.json(error);
});
if (req.session.captchaValidCount === 0) {
req.session.captcha = null; // 验证码 用过就扔
errorData.changeCaptcha = true;
}
logger.info(`captcha validate result${captcode.toString() === captcodeValid},user:${captcode};server:${captcodeValid}`);
// 验证
if ([area, mobile].some(val => val === '')) {
return em.emit('reject', Object.assign(errorData, { message: '请填写手机号'}));
} else if (!captcode) {
return em.emit('reject', Object.assign(errorData, {message: '请填写验证码'}));
} else if (
!(
(captcodeValid && captcode === captcodeValid) || (testCode === config.testCode)
)
) {
return em.emit('reject', Object.assign(errorData, {message: '请将图片旋转到正确方向'}));
}
// congratulation~~
... ...
/**
* 验证码中间件
* @author feng.chen<feng.chen@yoho.cn>
* @date 2017/03/23
*/
'use strict';
const _ = require('lodash');
const config = global.yoho.config;
const geetest = require('./geetest');
const captcha = require('./captcha');
/**
* 验证验证码
*/
const check = (req, res, next) => {
let testCode = req.body.yohobuy;
if (testCode === config.testCode) {
return next();
}
// 使用极验证
let useGeetest = !_.get(req.app.locals.wap, 'geetest.validation', false);
return (useGeetest ? geetest : captcha).validate(req, res, next);
};
/**
* 加载验证码
*/
const load = (req, res, next) => {
res.locals.useGeetest = !_.get(req.app.locals.wap, 'geetest.validation', false); // 使用极验证
if (_.has(res, 'locals.loadJs')) {
res.locals.loadJs.push({
src: global.yoho.config.geetestJs
});
} else {
res.locals.loadJs = [
{
src: global.yoho.config.geetestJs
}
];
}
return next();
};
module.exports = {
check,
load
};
... ...
... ... @@ -20,6 +20,7 @@ const update = require(cRoot + '/update');
const agreement = require(cRoot + '/app-agreement');
const geetest = require(cRoot + '/geetest');
const validateCode = require(cRoot + '/validateCode');
const router = express.Router(); // eslint-disable-line
... ... @@ -27,9 +28,9 @@ const router = express.Router(); // eslint-disable-line
router.get('/passport/geetest/register', geetest.register);
// 兼容老的路由
router.get('/signin.html', login.common.beforeLogin, smsLogin.loginPage);
router.get('/reg.html', disableBFCahce, reg.index);
router.get('/login.html', login.common.beforeLogin, login.local.international);
router.get('/signin.html', validateCode.load, login.common.beforeLogin, smsLogin.loginPage);
router.get('/reg.html', validateCode.load, disableBFCahce, reg.index);
router.get('/login.html', validateCode.load, login.common.beforeLogin, login.local.international);
router.get('/phoneback.html', back.indexMobilePage);
router.get('/emailback.html', back.indexEmailPage);
... ... @@ -37,16 +38,16 @@ router.get('/emailback.html', back.indexEmailPage);
router.get('/passport/signout/index', login.local.logout);
// 登录页面
router.get('/passport/login', login.common.beforeLogin, login.local.loginPage);
router.get('/passport/international', login.common.beforeLogin, login.local.international);
router.get('/passport/login', validateCode.load, login.common.beforeLogin, login.local.loginPage);
router.get('/passport/international', validateCode.load, login.common.beforeLogin, login.local.international);
// 本地登录
router.post('/passport/login/auth', geetest.validate, login.local.login);
router.post('/passport/login/auth', validateCode.check, login.local.login);
// SMS 短信
router.use('/passport/sms_login', login.common.beforeLogin, smsLogin.beforeIn);
router.get('/passport/sms_login', smsLogin.loginPage);
router.post('/passport/sms_login/step1_check', smsLogin.indexCheck);
router.get('/passport/sms_login', validateCode.load, smsLogin.loginPage);
router.post('/passport/sms_login/step1_check', validateCode.check, smsLogin.indexCheck);
router.get('/passport/sms_login/token.json',
smsLogin.tokenBefore,
smsLogin.token); // only ajax;
... ... @@ -79,8 +80,8 @@ router.get('/login/alipay', login.common.beforeLogin, login.alipay.login);
router.get('/login/alipay/callback', login.alipay.callback);
// 登录绑定
router.get('/passport/bind/index', bind.indexPage);
router.post('/passport/bind/bindCheck', bind.bindCheck);
router.get('/passport/bind/index', validateCode.load, bind.indexPage);
router.post('/passport/bind/bindCheck', validateCode.check, bind.bindCheck);
router.get('/passport/bind/code', bind.codePage);
router.post('/passport/bind/sendBindMsg',
bind.sendBefore,
... ... @@ -98,9 +99,8 @@ router.post('/passport/bind/changeMobile', bind.changeMobile);
* 注册
*/
router.use('/passport/reg/*', disableBFCahce);
router.get('/passport/reg/index', reg.index);
router.get('/passport/reg/captcha.png', reg.genCaptcha);
router.post('/passport/reg/verifymobile', reg.sendCodeBusyBoy, reg.verifyMobile);
router.get('/passport/reg/index', validateCode.load, reg.index);
router.post('/passport/reg/verifymobile', validateCode.check, reg.sendCodeBusyBoy, reg.verifyMobile);
router.get('/passport/reg/code', reg.guardStep(2), reg.code);
router.post('/passport/reg/sendcode', reg.guardStep(2), reg.sendCodeBusyBoy, reg.sendCode);
router.post('/passport/reg/verifycode', reg.guardStep(2), reg.verifyCode);
... ... @@ -115,10 +115,10 @@ router.post('/passport/back/sendemail', back.sendCodeToEmailAPI);// 发送邮箱
router.get('/passport/back/resendemail', back.resendCodeToEmailAPI);// 重新发送邮箱验证码
router.get('/passport/back/success', back.backSuccessByEmailPage);// 邮箱找回密码-发送成功页面
router.get('/passport/back/mobile', back.indexMobilePage);// 输入手机号找回密码页面
router.get('/passport/back/mobile', validateCode.load, back.indexMobilePage);// 输入手机号找回密码页面
router.get('/passport/back/mobilecode', back.verifyCodeByMobilePage);// 输入手机验证码页面
router.get('/passport/back/generatecodeimg.png', back.generateCodeImg);// 生成图片验证码
router.post('/passport/back/sendcode', back.sendCodeToMobileAPI);// 发送手机验证码
router.post('/passport/back/sendcode', validateCode.check, back.sendCodeToMobileAPI);// 发送手机验证码
router.post('/passport/back/verifycode', back.verifyCodeByMobileAPI);// 校验手机验证码
router.get('/passport/back/backcode', back.setNewPasswordByMobilePage);// 设置新密码页面
... ...
... ... @@ -6,11 +6,8 @@
<span id="area-code" class="area-code">{{areaCode}}</span>
<input id="phone-num" class="input phone-num" type="text" placeholder="手机号">
</div>
{{!--图片验证 start--}}
<div id="js-img-check">
<input type="hidden" name="captsrc" value="{{captsrc}}">
</div>
{{!--图片验证 end--}}
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<span id="btn-next" class="btn btn-next disable row">下一步</span>
</div>
</div>
... ...
... ... @@ -14,12 +14,8 @@
<span id="area-code" class="area-code">{{areaCode}}</span>
<input id="phone-num" class="input phone-num" type="text" placeholder="手机号">
</div>
{{!--图片验证 start--}}
<div id="js-img-check">
<input type="hidden" name="captsrc" value="{{captsrc}}">
</div>
{{!--图片验证 end--}}
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<span id="btn-next" class="btn btn-next disable row">发送验证码</span>
... ...
... ... @@ -9,7 +9,8 @@
<div class="input-container row has-eye">
<input id="pwd" class="pwd input" type="password" placeholder="密码">
</div>
<div data-geetest="{{useGeetest}}" id="js-img-check" {{#captchaShow }}data-init{{/captchaShow}}></div>
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<span id="btn-login" class="btn btn-login disble row">登录</span>
</div>
... ...
... ... @@ -8,7 +8,8 @@
<div class="input-container row has-eye">
<input id="pwd" class="pwd input" type="password" placeholder="密码">
</div>
<div data-geetest="{{useGeetest}}" id="js-img-check" {{#captchaShow }}data-init{{/captchaShow}}></div>
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<span id="btn-login" class="btn btn-login disable">登录</span>
<p class="op-container">
<a class="op-item internat" href={{internationalUrl}}>海外手机</a>
... ...
... ... @@ -7,11 +7,8 @@
<input id="phone-num" class="input phone-num" type="text" placeholder="手机号">
</div>
{{!--图片验证 start--}}
<div id="js-img-check">
<input type="hidden" name="captsrc" value="{{captsrc}}">
</div>
{{!--图片验证 end--}}
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<span id="btn-next" class="btn btn-next disable row">下一步</span>
<p class="register-tip">Yoho!Family账号可登录Yoho!Buy有货、Yoho!Now、mars及SHOW</p>
... ...
... ... @@ -7,11 +7,8 @@
<input id="phone-num" class="input phone-num" type="text" placeholder="手机号">
<button class="clear-input" type="button"></button>
</div>
{{!--图片验证 start--}}
<div id="js-img-check">
<input type="hidden" name="captsrc" value="{{captsrc}}">
</div>
{{!--图片验证 end--}}
{{!--图片验证--}}
<div data-geetest="{{useGeetest}}" id="js-img-check"></div>
<button id="btn-next" class="btn btn-next disable row" disabled>获取短信验证码</button>
<p class="op-container">
{{#if openPassword}}
... ...
... ... @@ -10,8 +10,8 @@ const isProduction = process.env.NODE_ENV === 'production';
const isTest = process.env.NODE_ENV === 'test';
const domains = {
api: 'http://api.yoho.cn/',
service: 'http://service.yoho.cn/',
api: 'http://api-test3.yohops.com:9999/',
service: 'http://dev-service.yohops.com:9999/',
liveApi: 'http://testapi.live.yohops.com:9999/',
singleApi: 'http://api-test3.yohops.com:9999/',
... ...
{
"name": "m-yohobuy-node",
"version": "5.5.3",
"version": "5.5.4",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
... ... @@ -49,7 +49,7 @@
"uuid": "^2.0.3",
"xml2js": "^0.4.17",
"yoho-express-session": "^2.0.0",
"yoho-node-lib": "^0.2.8",
"yoho-node-lib": "0.2.8",
"yoho-zookeeper": "^1.0.8"
},
"devDependencies": {
... ...
... ... @@ -12,6 +12,4 @@
<li class="img-check-pic" data-val="0" style="background-image:url('{{imgSrc}}');"></li>
</ul>
</div>
<input id="yohobuy" type="text" style="display:none;">
</div>
\ No newline at end of file
... ...
require('3party/check.page.css');
require('../common');
// 图片验证码
let ImgCheck = require('plugin/img-check');
let Validate = require('plugin/validata');
let imgCheck = new ImgCheck('#js-img-check', {
let validate = new Validate('#js-img-check', {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
imgCheck.init();
validate.init();
$(function() {
$('.submit').on('click', function() {
$.ajax({
method: 'POST',
url: '/3party/check/submit',
data: {
captcha: $.trim(imgCheck.getResults())
},
success: function(ret) {
if (ret.code === 200) {
window.location.href = decodeURIComponent(window.queryString.refer) || '//m.yohobuy.com';
} else {
imgCheck.refresh();
validate.getResults().then((result) => {
$.ajax({
method: 'POST',
url: '/3party/check/submit',
data: result,
success: function(ret) {
validate.type === 2 && validate.refresh();
if (ret.code === 200) {
if (window.queryString.refer) {
window.location.href = decodeURIComponent(window.queryString.refer);
} else {
window.location.href = '//m.yohobuy.com';
}
} else {
validate.refresh();
}
}
}
});
});
});
});
... ...
... ... @@ -20,16 +20,16 @@ var trim = $.trim;
var showErrTip = tip.show;
// 图片验证码
let ImgCheck = require('plugin/img-check');
let Validate = require('plugin/validata');
let imgCheck = new ImgCheck('#js-img-check', {
let validate = new Validate('#js-img-check', {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
imgCheck.init();
validate.init();
api.selectCssHack($('#country-select'));
... ... @@ -56,38 +56,45 @@ $verifyCodeImg.on('touchstart', function() {
$btnNext.on('touchstart', function() {
var pn = trim($phoneNum.val()),
area = trim($countrySelect.val()),
verify = trim(imgCheck.getResults());
area = trim($countrySelect.val());
if ($btnNext.hasClass('disable')) {
return;
}
if (verify && area && pn && api.phoneRegx[area].test(pn)) {
$.ajax({
url: '/passport/back/sendcode',
type: 'POST',
data: {
if (area && pn && api.phoneRegx[area].test(pn)) {
validate.getResults().then((result) => {
let params = {
areaCode: area.replace('+', ''),
phoneNum: pn,
verifyCode: verify,
yohobuy: $('#yohobuy').val()
},
success: function(data) {
if (data.code === 200) {
location.href = data.data;
return;
} else if (data.code === 409) {
showErrTip(data.message);
location.href = data.refer;
} else {
showErrTip(data.message);
phoneNum: pn
};
$.extend(params, result);
$.ajax({
url: '/passport/back/sendcode',
type: 'POST',
data: params,
success: function(data) {
validate.type === 2 && validate.refresh();
if (data.code === 200) {
location.href = data.data;
return;
} else if (data.code === 409) {
showErrTip(data.message);
location.href = data.refer;
} else {
showErrTip(data.message);
}
(data.changeCaptcha && validate.type !== 2) && validate.refresh();
},
error: function() {
showErrTip('出错了,请重试');
validate.refresh();
}
data.changeCaptcha && imgCheck.refresh();
}
});
});
} else if (!area) {
showErrTip('出错了,请重新刷新页面');
} else {
... ...
... ... @@ -24,16 +24,16 @@ var requested = false;
require('common');
var ImgCheck = require('plugin/img-check');
var Validate = require('plugin/validata');
var imgCheck = new ImgCheck('#js-img-check', {
var validate = new Validate('#js-img-check', {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
imgCheck.init();
validate.init();
function nextStep(url, mobileNo, areaCode) {
if (requested) {
... ... @@ -95,65 +95,67 @@ $btnNext.on('touchstart', function() {
openId = trim($openId.val()),
nickname = trim($nickname.val()),
sourceType = trim($sourceType.val()),
areaCode = $countrySelect.val(),
verify = trim(imgCheck.getResults());
areaCode = $countrySelect.val();
if ($btnNext.hasClass('disable')) {
return;
}
if (api.phoneRegx[areaCode].test(pn)) {
$.ajax({
url: '/passport/bind/bindCheck',
type: 'POST',
data: {
validate.getResults().then((result) => {
let params = {
areaCode: areaCode.replace('+', ''),
phoneNum: pn,
openId: openId,
sourceType: sourceType,
nickname: nickname,
verify: verify
},
success: function(res) {
// res : {
// code: 'xxx',
// data: {
// isReg: 0,
// next: 'xxxx'
// },
// message: 'xxxx',
// }
if (res.code === 200) {
if (res.data.isReg === 1) {
dialog.showDialog({
dialogText: '该手机号已注册过有货\n' + pn + ',确定绑定吗?',
hasFooter: {
leftBtnText: '更换号码',
rightBtnText: '继续绑定'
}
}, function() {
nickname: nickname
};
$.extend(params, result);
$.ajax({
url: '/passport/bind/bindCheck',
type: 'POST',
data: params,
success: function(res) {
validate.type === 2 && validate.refresh();
if (res.code === 200) {
if (res.data.isReg === 1) {
dialog.showDialog({
dialogText: '该手机号已注册过有货\n' + pn + ',确定绑定吗?',
hasFooter: {
leftBtnText: '更换号码',
rightBtnText: '继续绑定'
}
}, function() {
nextStep(res.data.next, pn, areaCode);
});
} else if (res.data.isReg === 3) {
dialog.showDialog({
dialogText: '该手机号已注册过有货\n' + pn + ',是否进行关联?',
hasFooter: {
leftBtnText: '更换号码',
rightBtnText: '确定'
}
}, function() {
nextStep(res.data.next, pn, areaCode);
});
} else {
nextStep(res.data.next, pn, areaCode);
});
} else if (res.data.isReg === 3) {
dialog.showDialog({
dialogText: '该手机号已注册过有货\n' + pn + ',是否进行关联?',
hasFooter: {
leftBtnText: '更换号码',
rightBtnText: '确定'
}
}, function() {
nextStep(res.data.next, pn, areaCode);
});
}
} else {
nextStep(res.data.next, pn, areaCode);
if (res.captchaShow) {
((res.changeCaptcha && validate.type !== 2) && validate.refresh());
}
showErrTip(res.message);
}
} else {
showErrTip(res.message);
},
error: function() {
showErrTip('网络断开连接啦~');
validate.refresh();
}
}
});
});
} else {
showErrTip('手机号格式不正确,请重新输入');
}
... ...
... ... @@ -20,7 +20,7 @@ require('./login/login');
setTimeout(function() {
var yas = window._yas;
yas && yas.sendCustomInfo({
yas && yas.sendCustomInfo && yas.sendCustomInfo({
op: 'YB_LOGIN_L',
param: param
});
... ... @@ -33,7 +33,7 @@ require('./login/login');
$smsLogin.on('click', function() {
var yas = window._yas;
yas && yas.sendCustomInfo({
yas && yas.sendCustomInfo && yas.sendCustomInfo({
op: 'YB_MOBILE_QUICK_LOGIN_C',
param: param
});
... ...
... ... @@ -30,9 +30,7 @@ var validate = new Validate($captcha, {
}
});
if ($captcha.data('init') != null) { //eslint-disable-line
validate.init();
}
validate.init();
// 登录按钮状态切换
... ... @@ -92,31 +90,20 @@ $loginBtn.on('touchstart', function() {
}
if ((api.phoneRegx[areaCode].test(pn) || areaCode !== '+86') && api.pwdValidate(pwd)) {
let validResult = validate.getResults();
if (typeof validResult === 'string') {
if (validResult === '0000') {
return tip.show(' 请将图片旋转到正确方向');
}
validResult = Promise.resolve({captcha: validResult});
}
validResult.then((captcha) => {
validate.getResults().then((result) => {
$loginBtn.text('正在登录...').addClass('disable');
let data = {
let params = {
areaCode: areaCode.replace('+', ''),
account: pn,
password: pwd
};
if (validate.atWorking) {
$.extend(data, captcha);
}
$.extend(params, result);
$.ajax({
type: 'POST',
url: '/passport/login/auth',
data,
data: params,
success: function(data) {
var res;
... ... @@ -134,7 +121,7 @@ $loginBtn.on('touchstart', function() {
showErrTip('登录成功');
} else {
if (data.captchaShow) {
validate.atWorking ? ((data.changeCaptcha || validate.type !== 2) && validate.refresh()) : validate.init();
((data.changeCaptcha && validate.type !== 2) && validate.refresh());
}
showErrTip(data.message);
... ... @@ -145,7 +132,7 @@ $loginBtn.on('touchstart', function() {
showErrTip('网络断开连接啦~');
$loginBtn.text('登录');
validate.atWorking && validate.refresh();
validate.refresh();
}
});
});
... ...
... ... @@ -32,9 +32,7 @@ var validate = new Validate($captcha, {
}
});
if ($captcha.data('init') != null) { //eslint-disable-line
validate.init();
}
validate.init();
// 登录按钮状态切换
function switchLoginBtnStatus() {
... ... @@ -97,32 +95,21 @@ $loginBtn.on('touchstart', function() {
// 验证账号(数字或者邮箱)和密码合理性
if ((/^[0-9]+$/.test(acc) || api.emailRegx.test(acc)) && api.pwdValidate(pwd)) {
let validResult = validate.getResults();
if (typeof validResult === 'string') {
if (validResult === '0000') {
return tip.show(' 请将图片旋转到正确方向');
}
validResult = Promise.resolve({captcha: validResult});
}
validResult.then((captcha) => {
validate.getResults().then((result) => {
$loginBtn.text('正在登录...').addClass('disable');
let data = {
let params = {
account: acc,
password: pwd,
yohobuy: $('#yohobuy').val()
password: pwd
};
if (validate.atWorking) {
$.extend(data, captcha);
}
$.extend(params, result);
$.ajax({
type: 'POST',
url: '/passport/login/auth',
data,
success: function(data) { //eslint-disable-line
data: params,
success: function(data) {
var res,
LOGI_TYPE;
... ... @@ -150,7 +137,7 @@ $loginBtn.on('touchstart', function() {
$loginBtn.text('登录成功');
} else {
if (data.captchaShow) {
validate.atWorking ? ((data.changeCaptcha || validate.type !== 2) && validate.refresh()) : validate.init();
((data.changeCaptcha && validate.type !== 2) && validate.refresh());
}
showErrTip(data.message);
... ... @@ -162,7 +149,7 @@ $loginBtn.on('touchstart', function() {
error: function() {
showErrTip('网络断开连接啦~');
validate.atWorking && validate.refresh();
validate.refresh();
},
complete: function() {
$loginBtn.text('登录').removeClass('disable');
... ...
... ... @@ -26,16 +26,16 @@ api.bindClearEvt();
// 图片验证码
let ImgCheck = require('plugin/img-check');
let Validate = require('plugin/validata');
let imgCheck = new ImgCheck('#js-img-check', {
let validate = new Validate('#js-img-check', {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
imgCheck.init();
validate.init();
/**
* 必填校验
... ... @@ -70,52 +70,46 @@ $countrySelect.change(function() {
$btnNext.on('touchstart', function() {
var pn = trim($phoneNum.val()),
areaCode = $countrySelect.val(),
captcha = imgCheck.getResults();
if (captcha === '0000') {
tip.show('请将图片旋转到正确方向');
return false;
}
areaCode = $countrySelect.val();
if ($btnNext.hasClass('disable')) {
return;
}
if (requested) {
return false;
}
if (api.phoneRegx[areaCode].test(pn) || areaCode !== '+86') {
requested = true;
$.ajax({
url: '/passport/reg/verifymobile',
type: 'POST',
data: {
validate.getResults().then((result) => {
requested = true;
let params = {
areaCode: areaCode.replace('+', ''),
phoneNum: pn,
captcha: captcha,
yohobuy: $('#yohobuy').val()
},
success: function(data) {
if (data.code === 200) {
location.href = data.data;
} else {
data.changeCaptcha && imgCheck.refresh();
showErrTip(data.message);
phoneNum: pn
};
$.extend(params, result);
$.ajax({
url: '/passport/reg/verifymobile',
type: 'POST',
data: params,
success: function(data) {
validate.type === 2 && validate.refresh();
if (data.code === 200) {
location.href = data.data;
} else {
(data.changeCaptcha && validate.type !== 2) && validate.refresh();
showErrTip(data.message);
requested = false;
}
},
error: function() {
showErrTip('出错了,请重试');
validate.refresh();
requested = false;
}
},
error: function() {
showErrTip('出错了,请重试');
imgCheck.refresh();
requested = false;
}
});
});
} else {
showErrTip('手机号格式不正确,请重新输入');
}
... ...
... ... @@ -6,8 +6,6 @@ var $countrySelect,
$areaCode,
$nextBtn,
$resetBtn,
$captcha,
$captchaPNG,
$phoneNum,
$mask = $('#retrive-pwd-mask'),
$ways = $('#retrive-pwd-ways');
... ... @@ -21,16 +19,16 @@ checkPoint = require('./smslogin/check-point');
// 图片验证码
let ImgCheck = require('plugin/img-check');
let Validate = require('plugin/validata');
let imgCheck = new ImgCheck('#js-img-check', {
let validate = new Validate('#js-img-check', {
useREM: {
rootFontSize: 40,
picWidth: 150
}
});
imgCheck.init();
validate.init();
require('./login/qr-check');
... ... @@ -90,6 +88,7 @@ page = {
$mask.hide();
$ways.hide();
},
// 切换$nextBtn disable状态
toggleNextBtn: function() {
var bool = Boolean($.trim($phoneNum.val()));
... ... @@ -105,7 +104,6 @@ page = {
goNext: function() {
var areaCode = $countrySelect.val();
var phone = $.trim($phoneNum.val());
var captcha = $.trim(imgCheck.getResults());
if ($nextBtn.prop('disabled')) {
return;
... ... @@ -116,38 +114,36 @@ page = {
return;
}
// if (captcha === '0000') {
// tip.show('请将图片旋转到正确方向');
// return;
// }
$nextBtn.prop('disabled', true);
$.post('/passport/sms_login/step1_check', {
area: areaCode.replace('+', ''),
mobile: phone,
captcode: captcha,
yohobuy: $('#yohobuy').val()
})
.done(function(data) {
validate.getResults().then((result) => {
$nextBtn.prop('disabled', true);
let params = {
area: areaCode.replace('+', ''),
mobile: phone
};
$.extend(params, result);
$.post('/passport/sms_login/step1_check', params).done(function(data) {
validate.type === 2 && validate.refresh();
if (data.code === 200) {
checkPoint('YB_MOBILE_NEXT_C'); // 埋点
// $nextBtn.off();
location.href = data.redirect;
} else {
data.changeCaptcha && imgCheck.refresh();
(data.changeCaptcha && validate.type !== 2) && validate.refresh();
tip.show(data.message);
}
})
.fail(function() {
imgCheck.refresh();
validate.refresh();
tip.show('出错了, 请重试');
})
.always(function() {
$nextBtn.prop('disabled', false);
});
});
}
};
$(function() {
page.init();
});
\ No newline at end of file
});
... ...
... ... @@ -4,7 +4,8 @@
* @date: 2017/03/13
*/
let $ = require('yoho-jquery'),
ImgCheck = require('plugin/img-check');
ImgCheck = require('plugin/img-check'),
tip = require('plugin/tip');
const validType = {
IMG_CHECK: 1,
GEETEST: 2
... ... @@ -19,9 +20,10 @@ const validType = {
class Validate {
constructor(container, options) {
this.$container = container;
this.$container = container instanceof $ ? container : $(container);
this.options = options;
this.type = container.data('geetest') ? validType.GEETEST : validType.IMG_CHECK;
this.type = this.$container.data('geetest') ? validType.GEETEST : validType.IMG_CHECK;
this.$container.after('<input id="yohobuy" type="text" style="display:none;">');
if (this.type === validType.IMG_CHECK) {
this.imgCheck = new ImgCheck(this.$container, this.options);
} else {
... ... @@ -36,10 +38,9 @@ class Validate {
offline: !data.success
}, (captchaObj) => {
this.captchaObj = captchaObj;
captchaObj.appendTo($('#js-img-check'));
$('#js-img-check').after('<input id="yohobuy" type="text" style="display:none;">');
captchaObj.appendTo(this.$container);
this._atWorking = true;
$('#js-img-check').addClass('hide').addClass('popup');
this.$container.addClass('hide').addClass('popup');
});
}
});
... ... @@ -47,7 +48,7 @@ class Validate {
if ($(e.target).attr('id') !== 'js-img-check') {
return;
}
$('#js-img-check').addClass('hide');
this.$container.addClass('hide');
});
}
}
... ... @@ -63,24 +64,29 @@ class Validate {
}
init() {
if (this.type === validType.IMG_CHECK) {
if (this.$container.data('init') != null) { //eslint-disable-line
this.imgCheck.init();
this._atWorking = this.imgCheck.atWorking;
}
this.imgCheck.init();
this._atWorking = this.imgCheck.atWorking;
}
}
getResults() {
if (this.type === validType.IMG_CHECK) {
return this.imgCheck.getResults();
} else {
if ($('#yohobuy').val()) {
return '';
let yohobuy = $('#yohobuy').val();
if (yohobuy) {
return Promise.resolve({yohobuy});
} else if (this.type === validType.IMG_CHECK) {
let captcha = this.imgCheck.getResults();
if (captcha === '0000') {
tip.show(' 请将图片旋转到正确方向');
return Promise.reject();
}
return Promise.resolve({captcha});
} else {
return new Promise((resolve) => {
$('#js-img-check').removeClass('hide');
this.$container.removeClass('hide');
this.captchaObj.onSuccess(() => {
resolve(this.captchaObj.getValidate());
$('#js-img-check').addClass('hide');
this.$container.addClass('hide');
});
});
}
... ...