Authored by 徐炜

installment2

... ... @@ -9,8 +9,16 @@ const installmentModel = require('../models/installment');
const _ = require('lodash');
const helpers = global.yoho.helpers;
// 服务器报错页面
const _serverCrash = (res, url) => {
res.render('installment/server-crash', {
url: url
});
};
// 判断是否已经获取到了开通的状态值
const _reviewStatus = (uid, status, next) => {
const _reviewStatus = (res, req, uid, status) => {
let jumpUrl = helpers.appUrlFormat('/product/new', 'go.new');
if (status === '1') {
... ... @@ -33,7 +41,9 @@ const _reviewStatus = (uid, status, next) => {
url: jumpUrl
}
};
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
} else if (status === '3') {
return {
... ... @@ -41,11 +51,17 @@ const _reviewStatus = (uid, status, next) => {
url: jumpUrl
}
};
} else if (status === '4') {
return {
cancel: {
url: jumpUrl
}
};
}
};
// 还款列表公共处理块
const _repaymentList = (req, res, next, title, params) => {
const _repaymentList = (req, res, title, params) => {
params = _.assign({
uid: req.cookies.installmentUid || 1
}, params);
... ... @@ -58,11 +74,13 @@ const _repaymentList = (req, res, next, title, params) => {
title: title,
data: result
});
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 开通分期首页
const index = (req, res, next) => {
const index = (req, res) => {
let uid = req.query.uid;
Promise.all([installmentModel.getStauts(uid), installmentModel.getSearchIntallment({
... ... @@ -105,7 +123,7 @@ const index = (req, res, next) => {
return params;
});
} else if (openStatus === 1 || openStatus === 3) {
} else if (openStatus === '1' || openStatus === '3' || openStatus === '4') {
res.redirect('/home/installment/review?status=' + openStatus);
}
}).then((result) => {
... ... @@ -115,11 +133,13 @@ const index = (req, res, next) => {
isInstallmentPage: true,
title: '有货分期'
}, result));
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// ajax 请求分期专享商品
const getInstallmentGoods = (req, res, next) => {
const getInstallmentGoods = (req, res) => {
let params = req.query || {};
installmentModel.getSearchIntallment(params).then((result) => {
... ... @@ -131,11 +151,13 @@ const getInstallmentGoods = (req, res, next) => {
} else {
res.json();
}
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 开通结果显示
const review = (req, res, next) => {
const review = (req, res) => {
let openStatus = req.query.status || false;
let uid = req.query.uid;
let data = {
... ... @@ -145,38 +167,38 @@ const review = (req, res, next) => {
};
if (openStatus !== '2') {
res.render('installment/open-result', _.assign(data, _reviewStatus(uid, openStatus)));
res.render('installment/open-result', _.assign(data, _reviewStatus(res, req, uid, openStatus)));
} else {
_reviewStatus(uid, openStatus, next).then((params) => {
_reviewStatus(res, req, uid, openStatus).then((params) => {
res.render('installment/open-result', _.assign(data, params));
});
}
};
// 逾期未还款列表
const overdueList = (req, res, next) => {
_repaymentList(req, res, next, '逾期未还金额', {
const overdueList = (req, res) => {
_repaymentList(req, res, '逾期未还金额', {
queryDays: -1
});
};
// 7日待还款列表
const sevenDayList = (req, res, next) => {
_repaymentList(req, res, next, '近7日待还款', {
const sevenDayList = (req, res) => {
_repaymentList(req, res, '近7日待还款', {
queryDays: 7
});
};
// 本月待还款列表
const monthRepayList = (req, res, next) => {
_repaymentList(req, res, next, '本月待还金额', {
const monthRepayList = (req, res) => {
_repaymentList(req, res, '本月待还金额', {
queryDays: 30
});
};
// 待还总金额列表
const totalRepayList = (req, res, next) => {
_repaymentList(req, res, next, '待还总金额', {
const totalRepayList = (req, res) => {
_repaymentList(req, res, '待还总金额', {
queryDays: 0
});
};
... ... @@ -192,7 +214,7 @@ const repayRecordPage = (req, res) => {
};
// ajax 请求还款记录
const getRepayRecord = (req, res, next) => {
const getRepayRecord = (req, res) => {
let params = _.assign({
uid: req.cookies.installmentUid || 1,
pageNo: req.query.page || 1
... ... @@ -207,21 +229,43 @@ const getRepayRecord = (req, res, next) => {
} else {
res.json();
}
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 账号管理
const account = (req, res, next) => {
let uid = req.cookies.installmentUid || 512579468;
const account = (req, res) => {
res.render('installment/account', {
title: '账号管理',
isInstallmentPage: true
});
};
installmentModel.getBankCards(uid).then((result) => {
res.render('installment/account', {
accountList: result,
title: '账号管理',
isInstallmentPage: true,
repaymentList: result
});
}).catch(next);
// 添加新银行卡
const bindCard = (req, res) => {
res.render('installment/bind-card', {
module: 'home',
page: 'bind-card',
title: '使用新卡还款',
bindCard: {
userName: req.query.name
},
isInstallmentPage: true
});
};
// 添加新银行卡请求
const postAccount = (req, res) => {
var params = _.assign({
uid: req.cookies.installmentUid
}, req.query);
installmentModel.postAccount(params).then((result) => {
res.json(result);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
const startingService = (req, res) => {
... ... @@ -247,7 +291,7 @@ function getRealIP(req) {
return realIP || forwardedFor.split(',')[0] || req.connection.remoteAddress;
}
const activateService = (req, res, next) => {
const activateService = (req, res) => {
installmentModel.activateService({
uid: req.cookies.installmentUid || 532892,
... ... @@ -263,22 +307,28 @@ const activateService = (req, res, next) => {
ip: getRealIP(req)
}).then((result)=> {
res.json(result);
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
const getBankInfo = (req, res, next) => {
const getBankInfo = (req, res) => {
installmentModel.getBankInfo({
cardNo: req.query.cardNo,
uid: req.cookies.installmentUid || 512579468 // TODO: fix uid
}).then((result)=> {
res.json(result);
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
const verifyCode = (req, res, next) => {
const verifyCode = (req, res) => {
installmentModel.sendVerifyCode(req.cookies.installmentUid || 1, req.query.mobile).then((result)=> {
res.json(result);
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
const orderIndex = (req, res) => {
... ... @@ -291,7 +341,7 @@ const orderIndex = (req, res) => {
});
};
const orderList = (req, res, next) => {
const orderList = (req, res) => {
const params = {
uid: req.cookies.installmentUid || 8041876, // TODO: fix me
type: req.query.type || 1,
... ... @@ -319,10 +369,12 @@ const orderList = (req, res, next) => {
layout: false,
isInstallmentPage: true
});
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
const orderDetail = (req, res, next) => {
const orderDetail = (req, res) => {
const params = {
uid: req.cookies.installmentUid || 8041876, // TODO: fix me
orderCode: req.params.id
... ... @@ -368,6 +420,12 @@ const orderDetail = (req, res, next) => {
return options.inverse(this);
},
isRepaymentAllCompleted: function(status, options) {
if (status === 2) { // 已结清/已取消
return options.fn(this);
}
return options.inverse(this);
},
greaterThanZero: function(value, options) {
if (value && parseFloat(value) > 0) {
return options.fn(this);
... ... @@ -377,11 +435,13 @@ const orderDetail = (req, res, next) => {
}
}
});
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 还款详情
const repayDetail = (req, res, next) => {
const repayDetail = (req, res) => {
let params = {
uid: req.cookies.installmentUid || 512579468,
rePayNo: req.query.id || '',
... ... @@ -394,7 +454,9 @@ const repayDetail = (req, res, next) => {
isInstallmentPage: true,
isOne: true
}, result[0]));
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 帮助静态页面
... ... @@ -412,17 +474,41 @@ const agreement = (req, res) => {
};
// 计算金额
const totalAmount = (req, res, next) => {
const totalAmount = (req, res) => {
installmentModel.totalAmount(req.query.prices).then((result) => {
res.json(result);
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 检查验证码
const checkVerifyCode = (req, res, next) => {
const checkVerifyCode = (req, res) => {
installmentModel.checkVerifyCode(req.cookies.installmentUid, req.query.mobile, req.query.code).then((result) => {
res.json(result);
}).catch(next);
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
// 服务器崩溃
const serverCrash = (req, res) => {
res.render('installment/server-crash');
};
// 银行卡列表
const bankCard = (req, res) => {
let uid = req.cookies.installmentUid || 512579468;
installmentModel.getBankCards(uid).then((result) => {
res.render('installment/bank-card', {
title: '我的银行卡',
isInstallmentPage: true,
accountList: result
});
}).catch(() => {
_serverCrash(res, req.originalUrl);
});
};
module.exports = {
... ... @@ -447,5 +533,9 @@ module.exports = {
agreement,
totalAmount,
checkVerifyCode,
getInstallmentGoods
getInstallmentGoods,
bindCard,
serverCrash,
bankCard,
postAccount
};
... ...
... ... @@ -117,8 +117,12 @@ const _processRepayList = (list) => {
data.isThree = true;
delete data.desc;
} else if (data.status === 2) {
data.repayStatus = '还款失败';
data.txt = `还款失败,${data.desc}`;
data.txt = '还款失败';
if (data.desc || data.desc !== '') {
data.txt += `,${data.desc}`;
}
data.isTwo = true;
data.isThree = true;
} else {
... ... @@ -320,7 +324,7 @@ const activateService = (params) => {
method: 'user.instalment.activate',
debug: 'XYZ' // TODO: remove this
}, params), {
timeout: API_TIMEOUT
timeout: 30000
});
};
... ...
... ... @@ -29,6 +29,8 @@ router.get('/installment/repay/get-record', installment.getRepayRecord); // ajax
router.get('/installment/repay/detail', installment.repayDetail); // 还款详情
router.get('/installment/account', installment.account); // 账户管理
router.get('/installment/bind-card', installment.bindCard); // 添加新银行卡
router.get('/installment/post-account', installment.postAccount); // 添加新卡请求
router.get('/installment/bank-info', installment.getBankInfo);
router.post('/installment/activate-service', installment.activateService);
router.get('/installment/order', installment.orderIndex);
... ... @@ -39,4 +41,6 @@ router.get('/installment/total-amount.json', installment.totalAmount);
router.get('/installment/help', installment.help);// 帮助静态页面
router.get('/installment/agreement', installment.agreement);// 服务协议\服务条款静态页面
router.get('/installment/server-crash', installment.serverCrash); // 服务器崩溃
router.get('/installment/bank-card', installment.bankCard); // 银行卡列表
module.exports = router;
... ...
<div class="account-page">
<ul class="account-list">
{{#accountList}}
<li>我的银行卡:<div class="list-right">{{cardNo}}</div></li>
{{/accountList}}
<li><a href="/home/installment/bank-card">我的银行卡:<div class="list-right"><span class="iconfont">&#xe604;</span></div></a></li>
</ul>
</div>
\ No newline at end of file
</div>
... ...
<div class="bank-card-page">
<ul class="bank-card-list">
{{#accountList}}
<li class="card-bg"><span>{{cardNo}}</span></li>
{{/accountList}}
</ul>
</div>
... ...
... ... @@ -26,4 +26,13 @@
<a href="{{url}}" class="open-btn">去逛逛</a>
</div>
{{/ error}}
{{#cancel}}
<div class="cancel">
<i class="cancel-icon"></i>
<p class="cancel-txt1">账户已注销</p>
<p class="cancel-txt2">您的有货分期账户经本人确认已注销,<br>如有疑问,请联系客服。<br>提示:已注销用户不可再开通</p>
<p></p>
<a href="{{url}}" class="open-btn">先去逛逛</a>
</div>
{{/cancel}}
</div>
... ...
<div class="installment-page">
<div class="server-crash">
<i class="refresh-icon"></i>
<p>接口调用失败,服务器可能累了,<br>重新加载给个鼓励吧!</p>
<a href="{{url}}" class="open-btn">重新加载</a>
</div>
</div>
... ...
... ... @@ -23,6 +23,7 @@
<label for="name">卡号:</label>
<input id="cardNo" name="cardNo" type="tel" placeholder="银行卡号" size="26" maxlength="23"/>
<span class="iconfont notice">&#xe639;</span>
<div class="clearfix"></div>
</div>
... ... @@ -72,4 +73,16 @@
</div>
</div>
</form>
<div class="installment-overdue-notice">
<div class="mask-bg"></div>
<div class="notice-area">
<div class="notice-cont">
<h2>支持银行</h2>
<p>农业银行、中国银行、工商银行、建设银行、</p>
<p>光大银行、兴业银行、邮储银行、民生银行、</p>
<p>平安银行、中信银行、广发银行</p>
</div>
<div class="think-ok">我知道了</div>
</div>
</div>
</div>
... ...
/**
* 银行卡校验
* @author: wsl<shuiling.wang@yoho.cn>
* @date: 2016/08/25
*/
var $ = require('yoho-jquery');
var tip = require('../plugin/tip');
var debounce = require('lodash/debounce');
var debounceFn = debounce(function(cardNo, formModel) {
formModel.bankCode = '';
formModel.bankName = '';
// 获取银行信息
$.get('/home/installment/bank-info', {cardNo: cardNo}).then(function(result) {
if (result.code === 200) {
if (result.data.bankCode) {
formModel.bankCode = result.data.bankCode;
formModel.bankName = result.data.bankName;
// 设置银行名称
$('#bank-name').text(result.data.bankName);
// 设置银行图标
$('#bank-icon').show().attr('src',
window.STATIC_RESOURCE_PATH +
'/img/home/bank-icons/' + result.data.bankCode + '.png');
$('#bank-desc').show();
}
// 返回1不支持, 孟令阶
if (result && result.data && result.data.businessSupport === '1') {
$('#bank-name').text('暂不支持此银行卡');
$('#bank-desc').show();
$('#bank-icon').hide();
}
} else {
tip.show(result.message);
$('#bank-desc').hide();
}
});
}, 1000);
var checkCard = function(formModel) {
// 银行卡格式化
$('#cardNo').keyup(function() {
var value = $(this).val();
$(this).val(value.replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')).trigger('change');
}).change(function() {
var cardNo = $(this).val().replace(/\s/g, '');
if (cardNo && cardNo.length >= 16) {
debounceFn(cardNo, formModel);
} else {
$('#bank-desc').hide();
}
});
};
module.exports = checkCard;
... ...
/**
* 新增银行卡
* @author: wsl<shuiling.wang@yoho.cn>
* @date: 2016/08/25
*/
var $ = require('yoho-jquery');
var tip = require('../plugin/tip');
var checkCard = require('./bind-card-check');
var applyButton = $('.open-btn');
var flag = true;
var formData = {
cardNo: '',
mobile: '',
bankName: '',
bankCode: ''
};
var validateForm = function() {
var ret = false;
if (formData.cardNo &&
formData.mobile &&
formData.bankName &&
formData.bankCode) {
applyButton.removeClass('disabled');
ret = true;
} else {
applyButton.addClass('disabled');
ret = false;
}
return ret;
};
checkCard(formData);
// 输入框改变时同时更新模型
$('input').on('change', function() {
var name = $(this).attr('name');
formData[name] = $(this).val();
validateForm();
});
applyButton.on('click', function() {
var self = this;
if (!flag || $(this).hasClass('disabled') || !validateForm()) {
return false;
}
if (!/^1[3|4|5|8|7][0-9]{9}$/.test(formData.mobile)) {
tip.show('手机号输入不正确!');
return false;
}
flag = false;
$.ajax({
type: 'GET',
url: '/home/installment/post-account',
data: formData,
async: false,
success: function(data) {
var params = {
action: 'go.bindCardResult',
params: {
status: 0
}
};
var url = location.href + '&openby:yohobuy=';
if (data.code === 200) {
params.params.status = 1;
}
url += encodeURIComponent(JSON.stringify(params));
$(self).attr('href', url);
return true;
},
error: function() {
tip.show('网络断开连接了~');
flag = true;
return false;
}
});
});
... ...
var $ = require('yoho-jquery');
var tip = require('../plugin/tip');
var debounce = require('lodash/debounce');
var Timer = function() {
this.counter = 0;
... ... @@ -46,44 +45,48 @@ var validateForm = function() {
return ret;
};
var checkCard = require('./bind-card-check');
const clearVerifyCode = function() {
formModel.snsCheckCode = '';
$('#sns-check-code').val('');
};
var debounceFn = debounce(function(cardNo) {
formModel.bankCode = '';
formModel.bankName = '';
// 获取银行信息
$.get('/home/installment/bank-info', {cardNo: cardNo}).then(function(result) {
if (result.code === 200) {
if (result.data.bankCode) {
formModel.bankCode = result.data.bankCode;
formModel.bankName = result.data.bankName;
// 设置银行名称
$('#bank-name').text(result.data.bankName);
// 设置银行图标
$('#bank-icon').show().attr('src',
window.STATIC_RESOURCE_PATH +
'/img/home/bank-icons/' + result.data.bankCode + '.png');
$('#bank-desc').show();
}
// 返回1不支持, 孟令阶
if (result && result.data && result.data.businessSupport === '1') {
$('#bank-name').text('暂不支持此银行卡');
$('#bank-desc').show();
$('#bank-icon').hide();
}
} else {
tip.show(result.message);
$('#bank-desc').hide();
}
});
}, 1000);
checkCard(formModel);
// var debounceFn = debounce(function(cardNo) {
// formModel.bankCode = '';
// formModel.bankName = '';
//
// // 获取银行信息
// $.get('/home/installment/bank-info', {cardNo: cardNo}).then(function(result) {
// if (result.code === 200) {
// if (result.data.bankCode) {
// formModel.bankCode = result.data.bankCode;
// formModel.bankName = result.data.bankName;
//
// // 设置银行名称
// $('#bank-name').text(result.data.bankName);
//
// // 设置银行图标
// $('#bank-icon').show().attr('src',
// window.STATIC_RESOURCE_PATH +
// '/img/home/bank-icons/' + result.data.bankCode + '.png');
// $('#bank-desc').show();
// }
//
// // 返回1不支持, 孟令阶
// if (result && result.data && result.data.businessSupport === '1') {
// $('#bank-name').text('暂不支持此银行卡');
// $('#bank-desc').show();
// $('#bank-icon').hide();
// }
// } else {
// tip.show(result.message);
// $('#bank-desc').hide();
// }
// });
// }, 1000);
/**
* 倒计时
... ... @@ -181,18 +184,20 @@ $('#send-sms').click(function() {
/**
* 银行卡格式化
*/
$('#cardNo').keyup(function() {
var value = $(this).val();
var cardNo = $(this).val().replace(/\s/g, '');
$(this).val(value.replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')).trigger('change');
if (cardNo && cardNo.length >= 16) {
debounceFn(cardNo);
} else {
$('#bank-desc').hide();
}
});
// $('#cardNo').keyup(function() {
// var value = $(this).val();
//
// $(this).val(value.replace(/[^\d]/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')).trigger('change');
//
// }).change(function() {
// var cardNo = $(this).val().replace(/\s/g, '');
//
// if (cardNo && cardNo.length >= 16) {
// debounceFn(cardNo);
// } else {
// $('#bank-desc').hide();
// }
// });
// 输入框改变时同时更新模型
... ... @@ -321,3 +326,5 @@ $('#agreements').click(function() {
$(this).attr('href', location.pathname + '?openby:yohobuy=' + encodeURIComponent(JSON.stringify(params)));
});
require('./overdue-notice');
... ...
... ... @@ -9,3 +9,10 @@ $('.repay-list .notice').on('click', function() {
$('.think-ok, .mask-bg').on('click', function() {
$notice.hide();
});
$('.installment-starting-service-page .notice').on('click', function() {
$notice.show();
return false;
});
... ...
.bank-card-page {
.bank-card-list {
padding: 30px 30px 0;
}
li {
width: 580px;
height: 200px;
margin-bottom: 30px;
position: relative;
background: #000;
border-radius: 10px;
background-size: contain;
span {
position: absolute;
right: 30px;
bottom: 30px;
color: #fff;
font-size: 40px;
}
}
}
... ...
... ... @@ -3,6 +3,7 @@
@import "repayment-list";
@import "order";
@import "help";
@import "bank-card";
.no-result {
.result-icon {
... ...
... ... @@ -40,7 +40,7 @@
.open-icon-2 {
background: url("/home/installment-icon2.png") no-repeat;
width: 67px;
height: 72px;
height: 67px;
display: block;
margin: 0 auto 34px;
}
... ... @@ -48,7 +48,7 @@
.open-icon-3 {
background: url("/home/installment-icon3.png") no-repeat;
width: 67px;
height: 68px;
height: 67px;
display: block;
margin: 0 auto 34px;
}
... ... @@ -101,6 +101,33 @@
margin: 94px auto 60px;
}
.success-icon {
background: resolve("home/review-img-4.png") no-repeat;
background-size: contain;
width: 208px;
height: 208px;
display: block;
margin: 94px auto 60px;
}
.cancel-icon {
background: resolve("home/review-img-5.png") no-repeat;
background-size: contain;
width: 208px;
height: 208px;
display: block;
margin: 196px auto 60px;
}
.refresh-icon {
background: resolve("home/review-img-6.png") no-repeat;
background-size: contain;
width: 168px;
height: 168px;
display: block;
margin: 225px auto 35px;
}
.font-b {
font-size: 30px;
text-align: center;
... ... @@ -153,6 +180,33 @@
}
}
.cancel {
p {
text-align: center;
}
.cancel-txt1 {
font-size: 24px;
color: #444;
}
.cancel-txt2 {
color: #bbb;
font-size: 22px;
line-height: 40px;
margin: 10px 0 65px;
}
}
.server-crash {
p {
text-align: center;
color: #444;
font-size: 24px;
margin-bottom: 100px;
}
}
.detail-tab {
background: #000;
height: 90px;
... ...
... ... @@ -99,6 +99,7 @@
input[type=text],
input[type=number],
input[type=tel] {
width: 422px;
font-size: 27px;
height: 40px;
color: #444;
... ... @@ -121,6 +122,20 @@
text-align: center;
margin-top: 30px;
}
.notice {
float: right;
font-size: 28px;
color: #444;
padding: 2px 10px 10px;
}
.installment-overdue-notice {
.notice-area {
width: 560px;
margin: -165px 0 0 -280px;
}
}
}
.installment-check-btn {
... ...