Authored by ccbikai(👎🏻🍜)

Merge branch 'master' into release/wap-optim

@@ -2,6 +2,11 @@ @@ -2,6 +2,11 @@
2 <div class="ma-header"> 2 <div class="ma-header">
3 <div>{{headerTip}}</div> 3 <div>{{headerTip}}</div>
4 </div> 4 </div>
  5 + {{# download}}
  6 + <a href="{{url}}" class="down">
  7 + <img src="{{img}}" alt="{{alt}}" />
  8 + </a>
  9 + {{/ download}}
5 <div class="tab"> 10 <div class="tab">
6 <div class="swiper-container"> 11 <div class="swiper-container">
7 <div class="swiper-wrapper"> 12 <div class="swiper-wrapper">
@@ -42,9 +47,4 @@ @@ -42,9 +47,4 @@
42 <p>{{title}}</p> 47 <p>{{title}}</p>
43 </div> 48 </div>
44 {{/ newsList}} 49 {{/ newsList}}
45 - {{# download}}  
46 - <a href="{{url}}" class="down">  
47 - <img src="{{img}}" alt="{{alt}}" />  
48 - </a>  
49 - {{/ download}}  
50 </div> 50 </div>
@@ -50,7 +50,6 @@ const _repaymentList = (req, res, opt, params) => { @@ -50,7 +50,6 @@ const _repaymentList = (req, res, opt, params) => {
50 // 开通分期首页 50 // 开通分期首页
51 const index = (req, res) => { 51 const index = (req, res) => {
52 let uid = req.query.uid; 52 let uid = req.query.uid;
53 -  
54 Promise.all([ 53 Promise.all([
55 installmentModel.getStauts(uid), 54 installmentModel.getStauts(uid),
56 installmentModel.getSearchIntallment({ 55 installmentModel.getSearchIntallment({
@@ -309,14 +308,23 @@ const getRepayRecord = (req, res) => { @@ -309,14 +308,23 @@ const getRepayRecord = (req, res) => {
309 // 账号管理 308 // 账号管理
310 const account = (req, res) => { 309 const account = (req, res) => {
311 var url = req.yoho.isApp || req.cookies.appVersion ? '/home/installment/account' : '/home/installment/bank-card'; 310 var url = req.yoho.isApp || req.cookies.appVersion ? '/home/installment/account' : '/home/installment/bank-card';
312 - 311 + if (req.cookies.appVersion) {
  312 + var versions = req.cookies.appVersion.split('.');
  313 + if (versions.length >= 2) {
  314 + if (versions[0] < 5 || (parseInt(versions[0], 10)===5 && versions[1] <= 1)) {
  315 + url = '/home/installment/bank-card';
  316 + } else {
  317 + url = helpers.appUrlFormat(url, 'go.instalmentMyCard')
  318 + }
  319 + }
  320 + }
313 res.render('installment/account', { 321 res.render('installment/account', {
314 module: 'home', 322 module: 'home',
315 page: 'account', 323 page: 'account',
316 title: '账号管理', 324 title: '账号管理',
317 isInstallmentPage: true, 325 isInstallmentPage: true,
318 posId: 7, 326 posId: 7,
319 - url: helpers.appUrlFormat(url, 'go.instalmentMyCard') 327 + url: url
320 }); 328 });
321 }; 329 };
322 330
@@ -4,13 +4,19 @@ const model = require('../models/myqrcode'), @@ -4,13 +4,19 @@ const model = require('../models/myqrcode'),
4 headerModel = require('../../../doraemon/models/header'); // 头部model 4 headerModel = require('../../../doraemon/models/header'); // 头部model
5 5
6 exports.index = (req, res, next) => { 6 exports.index = (req, res, next) => {
7 - let params = req.query; 7 + let params = req.query,
  8 + esc = false,
  9 + appversion = req.query.app_version;
  10 +
  11 + if (Number(appversion.substr(0, 1) < 5) || (Number(appversion.substr(0, 1)) === 5 && Number(appversion.substr(2, 1)) < 2)) {
  12 + esc = true;
  13 + }
8 14
9 model.getQr({ 15 model.getQr({
10 token: params.token, 16 token: params.token,
11 }).then(result => { 17 }).then(result => {
12 params.token = result; 18 params.token = result;
13 - params.uname = decodeURIComponent(params.uname.replace(/\%/g, escape('%'))); 19 + params.uname = esc ? decodeURIComponent(params.uname) : decodeURIComponent(params.uname.replace(/\%/g, escape('%')));
14 params.icon = params.icon || 'https://img11.static.yhbimg.com/yhb-img01/2016/07/05/13/017ec560b82c132ab2fdb22f7cf6f42b83.png?imageView/2/w/{width}/h/{height}'; 20 params.icon = params.icon || 'https://img11.static.yhbimg.com/yhb-img01/2016/07/05/13/017ec560b82c132ab2fdb22f7cf6f42b83.png?imageView/2/w/{width}/h/{height}';
15 res.render('myqrcode', { 21 res.render('myqrcode', {
16 title: '查看二维码', 22 title: '查看二维码',
@@ -9,8 +9,8 @@ exports.getQr = (params) => { @@ -9,8 +9,8 @@ exports.getQr = (params) => {
9 9
10 try { 10 try {
11 uid = crypto.decrypt(PASSWORD, decodeURIComponent(params.token)); 11 uid = crypto.decrypt(PASSWORD, decodeURIComponent(params.token));
  12 + uid = parseInt(uid, 10)
12 } catch (e) { 13 } catch (e) {
13 - console.error(e);  
14 uid = params.token; 14 uid = params.token;
15 } 15 }
16 16
1 <div class="repayment-list-page installment-order-page yoho-page" data-pos-id="{{posId}}"> 1 <div class="repayment-list-page installment-order-page yoho-page" data-pos-id="{{posId}}">
2 - {{> resources/banner-top}}  
3 <ul class="header-tab"> 2 <ul class="header-tab">
4 <li class="active"> 3 <li class="active">
5 <a href="/home/installment/order.html?type=1" data-type="1">全部</a> 4 <a href="/home/installment/order.html?type=1" data-type="1">全部</a>
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <div class="field"> 15 <div class="field">
16 <label for="identityCardNo">身份证号:</label> 16 <label for="identityCardNo">身份证号:</label>
17 17
18 - <input id="identityCardNo" name="identityCardNo" type="tel" placeholder="请填写身份证号" maxlength="18"/> 18 + <input id="identityCardNo" name="identityCardNo" type="text" placeholder="请填写身份证号" maxlength="18"/>
19 <div class="clearfix"></div> 19 <div class="clearfix"></div>
20 </div> 20 </div>
21 21
@@ -14,6 +14,7 @@ const cookie = global.yoho.cookie; @@ -14,6 +14,7 @@ const cookie = global.yoho.cookie;
14 const helpers = global.yoho.helpers; 14 const helpers = global.yoho.helpers;
15 const log = global.yoho.logger; 15 const log = global.yoho.logger;
16 const config = global.yoho.config; 16 const config = global.yoho.config;
  17 +const utils = require(global.utils);
17 const RegService = require('../models/reg-service'); 18 const RegService = require('../models/reg-service');
18 const AuthHelper = require('../models/auth-helper'); 19 const AuthHelper = require('../models/auth-helper');
19 20
@@ -32,6 +33,9 @@ function doPassportCallback(openId, nickname, sourceType, req, res) { @@ -32,6 +33,9 @@ function doPassportCallback(openId, nickname, sourceType, req, res) {
32 if (/signin|login/.test(refer)) { 33 if (/signin|login/.test(refer)) {
33 refer = `${config.siteUrl}/home`; 34 refer = `${config.siteUrl}/home`;
34 } 35 }
  36 +
  37 + refer = utils.refererLimit(refer);
  38 +
35 if (openId && nickname) { 39 if (openId && nickname) {
36 return AuthHelper.signinByOpenID(nickname, openId, sourceType, shoppingKey).then((result) => { 40 return AuthHelper.signinByOpenID(nickname, openId, sourceType, shoppingKey).then((result) => {
37 if (result.code !== 200) { 41 if (result.code !== 200) {
@@ -64,6 +68,8 @@ const common = { @@ -64,6 +68,8 @@ const common = {
64 refer = req.get('Referer'); 68 refer = req.get('Referer');
65 } 69 }
66 70
  71 + refer = utils.refererLimit(refer);
  72 +
67 73
68 refer && !/signin|login|passport/.test(refer) && res.cookie('refer', encodeURI(refer), { 74 refer && !/signin|login|passport/.test(refer) && res.cookie('refer', encodeURI(refer), {
69 domain: 'yohobuy.com' 75 domain: 'yohobuy.com'
@@ -112,7 +118,7 @@ const local = { @@ -112,7 +118,7 @@ const local = {
112 }); 118 });
113 }, 119 },
114 international: (req, res) => { 120 international: (req, res) => {
115 - // 先清除cookie 121 + // 先清除cookie
116 // res.clearCookie('LE' + md5('_LOGIN_EXPIRE'), { 122 // res.clearCookie('LE' + md5('_LOGIN_EXPIRE'), {
117 // domain: 'yohobuy.com' 123 // domain: 'yohobuy.com'
118 // }); 124 // });
@@ -161,6 +167,9 @@ const local = { @@ -161,6 +167,9 @@ const local = {
161 if (/sign|login/.test(refer)) { 167 if (/sign|login/.test(refer)) {
162 refer = `${config.siteUrl}/home`; 168 refer = `${config.siteUrl}/home`;
163 } 169 }
  170 +
  171 + refer = utils.refererLimit(refer);
  172 +
164 user.session = refer; 173 user.session = refer;
165 user.href = refer; 174 user.href = refer;
166 AuthHelper.syncUserSession(user.uid, req, res, user.session_key).then(() => { 175 AuthHelper.syncUserSession(user.uid, req, res, user.session_key).then(() => {
@@ -184,6 +193,8 @@ const local = { @@ -184,6 +193,8 @@ const local = {
184 res.clearCookie('_SPK'); 193 res.clearCookie('_SPK');
185 let refer = req.get('Referer') || config.siteUrl; 194 let refer = req.get('Referer') || config.siteUrl;
186 195
  196 + refer = utils.refererLimit(refer);
  197 +
187 res.redirect(refer); 198 res.redirect(refer);
188 } 199 }
189 }; 200 };
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 'use strict'; 8 'use strict';
9 9
10 const _ = require('lodash'); 10 const _ = require('lodash');
  11 +const utils = require(global.utils);
11 const helpers = global.yoho.helpers; 12 const helpers = global.yoho.helpers;
12 const sign = global.yoho.sign; 13 const sign = global.yoho.sign;
13 const cookie = global.yoho.cookie; 14 const cookie = global.yoho.cookie;
@@ -61,6 +62,8 @@ let index = (req, res) => { @@ -61,6 +62,8 @@ let index = (req, res) => {
61 // req.session.REG_EXPIRE = Date.now() + 1800000; 62 // req.session.REG_EXPIRE = Date.now() + 1800000;
62 let refer = req.query.refer; 63 let refer = req.query.refer;
63 64
  65 + refer = utils.refererLimit(refer);
  66 +
64 refer && res.cookie('refer', encodeURI(refer), { 67 refer && res.cookie('refer', encodeURI(refer), {
65 domain: 'yohobuy.com' 68 domain: 'yohobuy.com'
66 }); 69 });
@@ -402,6 +405,8 @@ let setPassword = (req, res, next) => { @@ -402,6 +405,8 @@ let setPassword = (req, res, next) => {
402 refer = '/home'; 405 refer = '/home';
403 } 406 }
404 407
  408 + refer = utils.refererLimit(refer);
  409 +
405 delete req.session.phoneNum; 410 delete req.session.phoneNum;
406 411
407 return res.json({ 412 return res.json({
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 const _ = require('lodash'); 3 const _ = require('lodash');
4 const helpers = global.yoho.helpers; 4 const helpers = global.yoho.helpers;
5 const cookie = global.yoho.cookie; 5 const cookie = global.yoho.cookie;
  6 +const utils = require(global.utils);
6 const RegService = require('../models/reg-service'); 7 const RegService = require('../models/reg-service');
7 const PhoneService = require('../models/phone-service'); 8 const PhoneService = require('../models/phone-service');
8 const AuthHelper = require('../models/auth-helper'); 9 const AuthHelper = require('../models/auth-helper');
@@ -24,8 +25,10 @@ exports.beforeIn = (req, res, next) => { @@ -24,8 +25,10 @@ exports.beforeIn = (req, res, next) => {
24 Expires: 0 25 Expires: 0
25 }); 26 });
26 27
  28 + let refer = utils.refererLimit(req.cookies.refer);
  29 +
27 if (!req.xhr && req.user.uid) { 30 if (!req.xhr && req.user.uid) {
28 - return res.redirect(req.cookies.refer || '/'); 31 + return res.redirect(refer);
29 } 32 }
30 33
31 next(); 34 next();
@@ -300,7 +303,7 @@ exports.check = (req, res, next) => { @@ -300,7 +303,7 @@ exports.check = (req, res, next) => {
300 res.json({ 303 res.json({
301 code: 200, 304 code: 200,
302 message: LOGIN_SUCCSS, 305 message: LOGIN_SUCCSS,
303 - redirect: req.cookies.refer 306 + redirect: utils.refererLimit(req.cookies.refer)
304 }); 307 });
305 308
306 delete req.session.smsLogin; 309 delete req.session.smsLogin;
@@ -363,7 +366,7 @@ exports.password = (req, res, next) => { @@ -363,7 +366,7 @@ exports.password = (req, res, next) => {
363 res.json({ 366 res.json({
364 code: 200, 367 code: 200,
365 message: LOGIN_SUCCSS, 368 message: LOGIN_SUCCSS,
366 - redirect: req.cookies.refer || '/' 369 + redirect: utils.refererLimit(req.cookies.refer)
367 }); 370 });
368 delete req.session.smsLogin; 371 delete req.session.smsLogin;
369 }).catch(next); 372 }).catch(next);
@@ -119,6 +119,10 @@ const _searchGoods = (params) => { @@ -119,6 +119,10 @@ const _searchGoods = (params) => {
119 delete params.channel; 119 delete params.channel;
120 } 120 }
121 121
  122 + if (params.query) {
  123 + params.query = params.query.replace(/\+/g, ',');
  124 + }
  125 +
122 params = _.assign({ 126 params = _.assign({
123 limit: '60', 127 limit: '60',
124 status: 1, 128 status: 1,
@@ -34,5 +34,5 @@ @@ -34,5 +34,5 @@
34 </ul> 34 </ul>
35 35
36 {{> sale/common}} 36 {{> sale/common}}
37 - 37 + <input type="hidden" id="discount" value="discount">
38 </div> 38 </div>
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 <ul class="address-list"> 11 <ul class="address-list">
12 {{# sub}} 12 {{# sub}}
13 <li class="address-last" data-id="{{code}}"> 13 <li class="address-last" data-id="{{code}}">
14 - <span class="caption">{{caption}}</span> 14 + <span class="caption" data-id="{{code}}">{{caption}}</span>
15 </li> 15 </li>
16 {{/ sub}} 16 {{/ sub}}
17 </ul> 17 </ul>
@@ -68,7 +68,7 @@ function render(data) { @@ -68,7 +68,7 @@ function render(data) {
68 var cartInfo = data.cartInfo; 68 var cartInfo = data.cartInfo;
69 var thumbClone = $chosePanel.find('.thumb').remove(); 69 var thumbClone = $chosePanel.find('.thumb').remove();
70 70
71 - for (var i = 0; i < cartInfo.thumbs.length; i++) { 71 + for (var i = cartInfo.thumbs.length - 1; i >= 0; i--) {
72 var thumbEle = thumbClone.clone(); 72 var thumbEle = thumbClone.clone();
73 73
74 thumbEle.attr('src', cartInfo.thumbs[i].img); 74 thumbEle.attr('src', cartInfo.thumbs[i].img);
@@ -20,8 +20,7 @@ var $addressForm = $('.edit-address'), @@ -20,8 +20,7 @@ var $addressForm = $('.edit-address'),
20 $area = $('.area'), 20 $area = $('.area'),
21 isSubmiting, 21 isSubmiting,
22 currentPage = 'edit', 22 currentPage = 'edit',
23 - newArea = [],  
24 - chinaAddressList; 23 + newArea = [];
25 24
26 require('../common.js'); 25 require('../common.js');
27 26
@@ -193,27 +192,28 @@ function bindAddressListEvent(html) { @@ -193,27 +192,28 @@ function bindAddressListEvent(html) {
193 } 192 }
194 193
195 // 读取省市区列表缓存 194 // 读取省市区列表缓存
196 -if (window.localStorage && window.localStorage.getItem) {  
197 - chinaAddressList = window.localStorage.getItem('chinaAddressList');  
198 -} 195 +// if (window.localStorage && window.localStorage.getItem) {
  196 +// chinaAddressList = window.localStorage.getItem('chinaAddressList');
  197 +// }
199 198
200 -if (chinaAddressList) {  
201 - bindAddressListEvent(chinaAddressList);  
202 -} else { 199 +// if (chinaAddressList) {
  200 +// bindAddressListEvent(chinaAddressList);
  201 +// } else {
203 202
204 // 省市区列表异步加载 203 // 省市区列表异步加载
205 - $.ajax({  
206 - method: 'GET',  
207 - url: '/home/locationList',  
208 - timeout: 60000,  
209 - cache: true  
210 - }).then(function(html) {  
211 - bindAddressListEvent(html); 204 +$.ajax({
  205 + method: 'GET',
  206 + url: '/home/locationList',
  207 + timeout: 60000,
  208 + cache: true
  209 +}).then(function(html) {
  210 + bindAddressListEvent(html);
212 211
213 // if (window.localStorage && window.localStorage.setItem) { 212 // if (window.localStorage && window.localStorage.setItem) {
214 // window.localStorage.setItem('chinaAddressList', html); 213 // window.localStorage.setItem('chinaAddressList', html);
215 // } 214 // }
216 - }).fail(function() {  
217 - tip.show('获取省市区列表失败');  
218 - });  
219 -} 215 +}).fail(function() {
  216 + tip.show('获取省市区列表失败');
  217 +});
  218 +
  219 +// }
@@ -61,8 +61,8 @@ var $listNav = $('#list-nav'), @@ -61,8 +61,8 @@ var $listNav = $('#list-nav'),
61 var swipers = [], 61 var swipers = [],
62 goodsType = ['coat', 'trouser', 'shoes', 'other']; 62 goodsType = ['coat', 'trouser', 'shoes', 'other'];
63 63
64 -require('../common/suspend-cart'); // 悬浮购物车  
65 require('../common'); 64 require('../common');
  65 +require('../common/suspend-cart'); // 悬浮购物车
66 66
67 ellipsis.init(); 67 ellipsis.init();
68 68
@@ -242,6 +242,13 @@ function search(opt, params, isScroll) { @@ -242,6 +242,13 @@ function search(opt, params, isScroll) {
242 242
243 searching = true; 243 searching = true;
244 loading.showLoadingMask(); 244 loading.showLoadingMask();
  245 +
  246 + /* TODO tar add 161125 sale dicount no yh_channel*/
  247 + var discount = $('#discount').val();
  248 + if (discount === 'discount') {
  249 + delete setting.yh_channel;
  250 + }
  251 +
245 $.ajax({ 252 $.ajax({
246 type: 'GET', 253 type: 'GET',
247 url: '/product/sale/search', 254 url: '/product/sale/search',
@@ -626,6 +626,11 @@ function search(opt) { @@ -626,6 +626,11 @@ function search(opt) {
626 age_level: opt.id 626 age_level: opt.id
627 }; 627 };
628 break; 628 break;
  629 + case 'p_d':
  630 + ext = {
  631 + p_d: opt.id
  632 + };
  633 + break;
629 default: 634 default:
630 break; 635 break;
631 } 636 }
@@ -37,11 +37,11 @@ @@ -37,11 +37,11 @@
37 37
38 .banner-swiper { 38 .banner-swiper {
39 position: static; 39 position: static;
40 - height: 312px; 40 + max-height: 312px;
41 41
42 ul { 42 ul {
43 position: relative; 43 position: relative;
44 - height: 312px; 44 + max-height: 312px;
45 45
46 li { 46 li {
47 float: left; 47 float: left;
  1 +'use strict';
  2 +
  3 +const url = require('url');
  4 +
  5 +/**
  6 + * refer限制
  7 + * @param referer string
  8 + * @param blacklist [array|function] refer黑名单 TODO: 未实现
  9 + * 1. array: ['/login', '/signin'] 如果referer 在array中,将返回 /home
  10 + * 2. function: 如果返回true, 返回/home
  11 + * @return referer
  12 + */
  13 +exports.refererLimit = (referer, blacklist) => { // eslint-disable-line
  14 + let result = decodeURIComponent(referer || '/home');
  15 +
  16 + let urlObj = url.parse(result, false, true);
  17 +
  18 +
  19 + if (urlObj.hostname && !/(?:yohobuy\.com$)|(?:yoho\.cn$)/.test(urlObj.hostname)) {
  20 + result = '/home';
  21 + }
  22 +
  23 + // TODO: blacklist;
  24 +
  25 + return result;
  26 +};