Authored by htoooth

Merge remote-tracking branch 'origin/release/1.0' into release/1.0

Conflicts:
	apps/passport/controllers/reg.js
  1 +/**
  2 + * 微信分享签名
  3 + * Bi Kai <kai.bi@yoho.cn>
  4 + */
1 'use strict'; 5 'use strict';
2 const wechatModel = require('../models/wechat'); 6 const wechatModel = require('../models/wechat');
3 7
@@ -27,15 +27,14 @@ const ticketCacheKey = 'wechatShare:ticket'; @@ -27,15 +27,14 @@ const ticketCacheKey = 'wechatShare:ticket';
27 27
28 // 微信 JS 接口签名校验工具 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 28 // 微信 JS 接口签名校验工具 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
29 29
30 -const wechat = {  
31 - getAccessToken: Promise.coroutine(function* () { 30 +let _getAccessToken = Promise.coroutine(function* () {
32 let accessToken = yield cache.get(accessTokenCacheKey); 31 let accessToken = yield cache.get(accessTokenCacheKey);
33 32
34 if (accessToken) { 33 if (accessToken) {
35 return accessToken; 34 return accessToken;
36 } 35 }
37 36
38 - logger.info('调用微信 API 获取 accessToken'); 37 + logger.info('get accessToken from wechat API');
39 return request({ 38 return request({
40 url: 'https://api.weixin.qq.com/cgi-bin/token', 39 url: 'https://api.weixin.qq.com/cgi-bin/token',
41 qs: { 40 qs: {
@@ -48,26 +47,26 @@ const wechat = { @@ -48,26 +47,26 @@ const wechat = {
48 47
49 // accessToken 有效期 7200s,缓存 7100s 48 // accessToken 有效期 7200s,缓存 7100s
50 cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => { 49 cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => {
51 - logger.error('微信分享 Token, 缓存 accessToken 时出错', JSON.stringify(err)); 50 + logger.error('set wechat accessToken cache error', JSON.stringify(err));
52 }); 51 });
53 return res.access_token; 52 return res.access_token;
54 }).catch((err) => { 53 }).catch((err) => {
55 - logger.error('微信分享 Token, 获取 accessToken 时出错', JSON.stringify(err)); 54 + logger.error('get accessToken from wechat API error', JSON.stringify(err));
56 }); 55 });
57 - }), 56 +});
58 57
59 - getTicket: Promise.coroutine(function* () { 58 +let _getTicket = Promise.coroutine(function* () {
60 let ticket = yield cache.get(ticketCacheKey); 59 let ticket = yield cache.get(ticketCacheKey);
61 60
62 if (ticket) { 61 if (ticket) {
63 return ticket; 62 return ticket;
64 } 63 }
65 64
66 - logger.info('调用微信 API 获取 ticket'); 65 + logger.info('get ticket from wechat API');
67 return request({ 66 return request({
68 url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket', 67 url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
69 qs: { 68 qs: {
70 - access_token: yield this.getAccessToken(), 69 + access_token: yield _getAccessToken(),
71 type: 'jsapi' 70 type: 'jsapi'
72 }, 71 },
73 json: true 72 json: true
@@ -75,19 +74,19 @@ const wechat = { @@ -75,19 +74,19 @@ const wechat = {
75 74
76 // ticket 有效期 7200s,缓存 7100s 75 // ticket 有效期 7200s,缓存 7100s
77 cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => { 76 cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => {
78 - logger.error('微信分享 Token, 缓存 ticket 时出错', JSON.stringify(err)); 77 + logger.error('set wechat Token cache error', JSON.stringify(err));
79 }); 78 });
80 return res.ticket; 79 return res.ticket;
81 }).catch((err) => { 80 }).catch((err) => {
82 - logger.error('微信分享 Token, 获取 ticket 时出错', JSON.stringify(err)); 81 + logger.error('get ticket from wechat API error', JSON.stringify(err));
83 }); 82 });
84 - }), 83 +});
85 84
86 - calcSignature: Promise.coroutine(function* (data) { 85 +let calcSignature = Promise.coroutine(function* (data) {
87 data = Object.assign({ 86 data = Object.assign({
88 nonceStr: Math.random().toString(36).substr(2, 15), 87 nonceStr: Math.random().toString(36).substr(2, 15),
89 timestamp: Math.floor(Date.now() / 1000) + '', 88 timestamp: Math.floor(Date.now() / 1000) + '',
90 - ticket: yield this.getTicket(), 89 + ticket: yield _getTicket(),
91 appId: appId 90 appId: appId
92 }, data); 91 }, data);
93 92
@@ -95,12 +94,13 @@ const wechat = { @@ -95,12 +94,13 @@ const wechat = {
95 94
96 data.signature = sha1(str); 95 data.signature = sha1(str);
97 return data; 96 return data;
98 - })  
99 -}; 97 +});
100 98
101 // 测试 99 // 测试
102 -// wechat.calcSignature({ 100 +// calcSignature({
103 // url: 'http://www.yohobuy.com/' 101 // url: 'http://www.yohobuy.com/'
104 // }).then(console.log); 102 // }).then(console.log);
105 103
106 -module.exports = wechat; 104 +module.exports = {
  105 + calcSignature
  106 +};
@@ -43,13 +43,13 @@ let verifyMobile = (req, res, next) => { @@ -43,13 +43,13 @@ let verifyMobile = (req, res, next) => {
43 let mobile = +req.body.phoneNum; 43 let mobile = +req.body.phoneNum;
44 let area = +(req.body.areaCode || 86); 44 let area = +(req.body.areaCode || 86);
45 45
46 - /* 判断参数是否合法 */ 46 + // 判断参数是否合法
47 if (!_.isNumber(mobile) || !_.isNumber(area)) { 47 if (!_.isNumber(mobile) || !_.isNumber(area)) {
48 data.message = '手机号错误'; 48 data.message = '手机号错误';
49 return res.json(data); 49 return res.json(data);
50 } 50 }
51 51
52 - /* 设置注册有效时间30分钟, 防机器刷 */ 52 + // 设置注册有效时间30分钟, 防机器刷
53 let expire = req.session._REG_EXPIRE; 53 let expire = req.session._REG_EXPIRE;
54 54
55 if (!expire || expire < Date.now()) { 55 if (!expire || expire < Date.now()) {
@@ -57,13 +57,13 @@ let verifyMobile = (req, res, next) => { @@ -57,13 +57,13 @@ let verifyMobile = (req, res, next) => {
57 return res.json(data); 57 return res.json(data);
58 } 58 }
59 59
60 - /* 向手机发送注册验证码 */ 60 + // 向手机发送注册验证码
61 RegService.sendCodeToMobile(area, mobile).then((result) => { 61 RegService.sendCodeToMobile(area, mobile).then((result) => {
62 if (!result.code) { 62 if (!result.code) {
63 return res.json(data); 63 return res.json(data);
64 } 64 }
65 65
66 - /* 返回跳转到验证页面的链接 */ 66 + // 返回跳转到验证页面的链接
67 if (result.code === 200) { 67 if (result.code === 200) {
68 let token = sign.makeToken(mobile); 68 let token = sign.makeToken(mobile);
69 69
@@ -112,13 +112,13 @@ let sendCode = (req, res, next) => { @@ -112,13 +112,13 @@ let sendCode = (req, res, next) => {
112 let mobile = +req.body.phoneNum; 112 let mobile = +req.body.phoneNum;
113 let area = +(req.body.areaCode || 86); 113 let area = +(req.body.areaCode || 86);
114 114
115 - /* 判断参数是否合法 */ 115 + // 判断参数是否合法
116 if (!_.isNumber(mobile) || !_.isNumber(area)) { 116 if (!_.isNumber(mobile) || !_.isNumber(area)) {
117 data.message = '手机号错误'; 117 data.message = '手机号错误';
118 return res.json(data); 118 return res.json(data);
119 } 119 }
120 120
121 - /* 设置注册有效时间30分钟, 防机器刷 */ 121 + // 设置注册有效时间30分钟, 防机器刷
122 let expire = req.session._REG_EXPIRE; 122 let expire = req.session._REG_EXPIRE;
123 123
124 if (!expire || expire < Date.now()) { 124 if (!expire || expire < Date.now()) {
@@ -126,7 +126,7 @@ let sendCode = (req, res, next) => { @@ -126,7 +126,7 @@ let sendCode = (req, res, next) => {
126 return res.json(data); 126 return res.json(data);
127 } 127 }
128 128
129 - /* 向手机发送注册验证码 */ 129 + // 向手机发送注册验证码
130 RegService.sendCodeToMobile(area, mobile).then((result) => { 130 RegService.sendCodeToMobile(area, mobile).then((result) => {
131 return result.code ? res.json(result) : res.json(data); 131 return result.code ? res.json(result) : res.json(data);
132 }).catch(next); 132 }).catch(next);
@@ -148,7 +148,7 @@ let verifyCode = (req, res, next) => { @@ -148,7 +148,7 @@ let verifyCode = (req, res, next) => {
148 return res.json(data); 148 return res.json(data);
149 } 149 }
150 150
151 - /* 设置注册有效时间30分钟, 防机器刷 */ 151 + // 设置注册有效时间30分钟, 防机器刷
152 let expire = req.session._REG_EXPIRE; 152 let expire = req.session._REG_EXPIRE;
153 153
154 if (!expire || expire < Date.now()) { 154 if (!expire || expire < Date.now()) {
@@ -156,13 +156,13 @@ let verifyCode = (req, res, next) => { @@ -156,13 +156,13 @@ let verifyCode = (req, res, next) => {
156 return res.json(data); 156 return res.json(data);
157 } 157 }
158 158
159 - /* 验证注册的标识码是否有效 */ 159 + // 验证注册的标识码是否有效
160 RegService.validMobileCode(area, mobile, code).then((result) => { 160 RegService.validMobileCode(area, mobile, code).then((result) => {
161 if (!result.code) { 161 if (!result.code) {
162 return res.json(data); 162 return res.json(data);
163 } 163 }
164 164
165 - /* 返回跳转到设置密码的链接 */ 165 + // 返回跳转到设置密码的链接
166 if (result.code === 200) { 166 if (result.code === 200) {
167 let token = sign.makeToken(mobile); 167 let token = sign.makeToken(mobile);
168 168
@@ -214,19 +214,19 @@ let setPassword = (req, res, next) => { @@ -214,19 +214,19 @@ let setPassword = (req, res, next) => {
214 let password = req.body.password; 214 let password = req.body.password;
215 let token = req.body.token; 215 let token = req.body.token;
216 216
217 - /* 判断参数是否合法 */ 217 + // 判断参数是否合法
218 if (!_.isString(token) || !_.isNumber(mobile) || !_.isNumber(area) || !password) { 218 if (!_.isString(token) || !_.isNumber(mobile) || !_.isNumber(area) || !password) {
219 data.message = '请求参数不合法'; 219 data.message = '请求参数不合法';
220 return res.json(data); 220 return res.json(data);
221 } 221 }
222 222
223 - /* 判断是否允许访问 */ 223 + // 判断是否允许访问
224 if (!sign.verifyToken(mobile, token)) { 224 if (!sign.verifyToken(mobile, token)) {
225 data.message = '非法 token'; 225 data.message = '非法 token';
226 return res.json(data); 226 return res.json(data);
227 } 227 }
228 228
229 - /* 判断密码是否符合规则 */ 229 + // 判断密码是否符合规则
230 if (!helpers.verifyPassword(password)) { 230 if (!helpers.verifyPassword(password)) {
231 return res.json(data); 231 return res.json(data);
232 } 232 }
@@ -27,7 +27,7 @@ const saleModel = require(`${mRoot}/sale`); @@ -27,7 +27,7 @@ const saleModel = require(`${mRoot}/sale`);
27 * @param {[string]} page js文件page名称 27 * @param {[string]} page js文件page名称
28 * @return {[type]} 28 * @return {[type]}
29 */ 29 */
30 -const processPublicData = (req, title, page) => { 30 +const _processPublicData = (req, title, page) => {
31 let data = {}; 31 let data = {};
32 let headerData = headerModel.setNav({ 32 let headerData = headerModel.setNav({
33 navTitle: title 33 navTitle: title
@@ -53,8 +53,8 @@ const processPublicData = (req, title, page) => { @@ -53,8 +53,8 @@ const processPublicData = (req, title, page) => {
53 * @param {[object]} res 53 * @param {[object]} res
54 * @return {[type]} 54 * @return {[type]}
55 */ 55 */
56 -exports.index = (req, res, next) => {  
57 - let params = processPublicData(req, 'SALE', 'sale'); 56 +let index = (req, res, next) => {
  57 + let params = _processPublicData(req, 'SALE', 'sale');
58 58
59 saleModel.getSaleData(params.channel).then((result) => { 59 saleModel.getSaleData(params.channel).then((result) => {
60 res.render('sale/index', Object.assign(params.renderData, { 60 res.render('sale/index', Object.assign(params.renderData, {
@@ -74,8 +74,8 @@ exports.index = (req, res, next) => { @@ -74,8 +74,8 @@ exports.index = (req, res, next) => {
74 * @param {[object]} res 74 * @param {[object]} res
75 * @return {[type]} 75 * @return {[type]}
76 */ 76 */
77 -exports.breakingYards = (req, res, next) => {  
78 - let params = processPublicData(req, '断码区', 'break-code'); 77 +let breakingYards = (req, res, next) => {
  78 + let params = _processPublicData(req, '断码区', 'break-code');
79 79
80 saleModel.getBreakCodeData({ 80 saleModel.getBreakCodeData({
81 yhChannel: params.channel 81 yhChannel: params.channel
@@ -90,8 +90,8 @@ exports.breakingYards = (req, res, next) => { @@ -90,8 +90,8 @@ exports.breakingYards = (req, res, next) => {
90 * @param {[object]} res 90 * @param {[object]} res
91 * @return {[type]} 91 * @return {[type]}
92 */ 92 */
93 -exports.discount = (req, res, next) => {  
94 - let params = processPublicData(req, '折扣专场', 'discount'); 93 +let discount = (req, res, next) => {
  94 + let params = _processPublicData(req, '折扣专场', 'discount');
95 95
96 saleModel.getDiscountData(params.channel).then((result) => { 96 saleModel.getDiscountData(params.channel).then((result) => {
97 res.render('sale/discount', Object.assign(params.renderData, result)); 97 res.render('sale/discount', Object.assign(params.renderData, result));
@@ -105,9 +105,9 @@ exports.discount = (req, res, next) => { @@ -105,9 +105,9 @@ exports.discount = (req, res, next) => {
105 * @param {[object]} res 105 * @param {[object]} res
106 * @return {[type]} 106 * @return {[type]}
107 */ 107 */
108 -exports.discountDetail = (req, res, next) => { 108 +let discountDetail = (req, res, next) => {
109 let id = req.query.id; 109 let id = req.query.id;
110 - let params = processPublicData(req, '', 'discount-detail'); 110 + let params = _processPublicData(req, '', 'discount-detail');
111 111
112 saleModel.getDiscountDetailData(id, params.channel).then((result) => { 112 saleModel.getDiscountDetailData(id, params.channel).then((result) => {
113 params.renderData.pageHeader.navTitle = result.title; 113 params.renderData.pageHeader.navTitle = result.title;
@@ -121,8 +121,8 @@ exports.discountDetail = (req, res, next) => { @@ -121,8 +121,8 @@ exports.discountDetail = (req, res, next) => {
121 * @param {[object]} res 121 * @param {[object]} res
122 * @return {[type]} 122 * @return {[type]}
123 */ 123 */
124 -exports.vip = (req, res, next) => {  
125 - let params = processPublicData(req, '会员专享', 'vip'); 124 +let vip = (req, res, next) => {
  125 + let params = _processPublicData(req, '会员专享', 'vip');
126 126
127 saleModel.getVipData(params.channel).then((result) => { 127 saleModel.getVipData(params.channel).then((result) => {
128 res.render('sale/vip', Object.assign(params.renderData, { 128 res.render('sale/vip', Object.assign(params.renderData, {
@@ -137,7 +137,7 @@ exports.vip = (req, res, next) => { @@ -137,7 +137,7 @@ exports.vip = (req, res, next) => {
137 * @param {[object]} res 137 * @param {[object]} res
138 * @return {[type]} 138 * @return {[type]}
139 */ 139 */
140 -exports.filter = (req, res, next) => { 140 +let filter = (req, res, next) => {
141 let params = Object.assign({}, req.query); 141 let params = Object.assign({}, req.query);
142 142
143 saleModel.getFilterData(params).then((result) => { 143 saleModel.getFilterData(params).then((result) => {
@@ -156,7 +156,7 @@ exports.filter = (req, res, next) => { @@ -156,7 +156,7 @@ exports.filter = (req, res, next) => {
156 * @param {[object]} res 156 * @param {[object]} res
157 * @return {[type]} 157 * @return {[type]}
158 */ 158 */
159 -exports.search = (req, res, next) => { 159 +let search = (req, res, next) => {
160 let params = Object.assign({}, req.query); 160 let params = Object.assign({}, req.query);
161 161
162 // uid = 9239279 162 // uid = 9239279
@@ -184,3 +184,13 @@ exports.search = (req, res, next) => { @@ -184,3 +184,13 @@ exports.search = (req, res, next) => {
184 }, vipObj)); 184 }, vipObj));
185 }).catch(next); 185 }).catch(next);
186 }; 186 };
  187 +
  188 +module.exports = {
  189 + index,
  190 + breakingYards,
  191 + discount,
  192 + discountDetail,
  193 + vip,
  194 + filter,
  195 + search
  196 +};
@@ -353,11 +353,11 @@ const getDiscountDetailData = (id, yhChannel) => { @@ -353,11 +353,11 @@ const getDiscountDetailData = (id, yhChannel) => {
353 }; 353 };
354 354
355 module.exports = { 355 module.exports = {
356 - getSaleData: getSaleData,  
357 - getBreakCodeData: getBreakCodeData,  
358 - getDiscountData: getDiscountData,  
359 - getDiscountDetailData: getDiscountDetailData,  
360 - getVipData: getVipData,  
361 - getFilterData: getFilterData,  
362 - getSearchData: getSearchData 356 + getSaleData,
  357 + getBreakCodeData,
  358 + getDiscountData,
  359 + getDiscountDetailData,
  360 + getVipData,
  361 + getFilterData,
  362 + getSearchData
363 }; 363 };
@@ -31,6 +31,8 @@ module.exports = function(specificGender) { @@ -31,6 +31,8 @@ module.exports = function(specificGender) {
31 31
32 var $footer; 32 var $footer;
33 33
  34 + var bottomBannerLoaded;
  35 +
34 // ajax url 36 // ajax url
35 if (kidsType) { 37 if (kidsType) {
36 url = '/product/recom/maylikekids'; 38 url = '/product/recom/maylikekids';
@@ -95,12 +97,14 @@ module.exports = function(specificGender) { @@ -95,12 +97,14 @@ module.exports = function(specificGender) {
95 }, 97 },
96 success: function(data) { 98 success: function(data) {
97 99
98 - if (data === ' ') {  
99 - searching = false; 100 + if (!data.length) {
100 loading.hideLoadingMask(); 101 loading.hideLoadingMask();
101 102
102 // 有货币页面不加载底部 103 // 有货币页面不加载底部
103 if (gender && !specificGender) { 104 if (gender && !specificGender) {
  105 + if (bottomBannerLoaded) {
  106 + return;
  107 + }
104 url = '/channel/bottomBanner'; 108 url = '/channel/bottomBanner';
105 $.ajax({ 109 $.ajax({
106 type: 'GET', 110 type: 'GET',
@@ -109,6 +113,8 @@ module.exports = function(specificGender) { @@ -109,6 +113,8 @@ module.exports = function(specificGender) {
109 gender: gender 113 gender: gender
110 }, 114 },
111 success: function(res) { 115 success: function(res) {
  116 + res = res.data;
  117 + bottomBannerLoaded = true;
112 if (res && res.img) { 118 if (res && res.img) {
113 $('#load-more-img').show(); 119 $('#load-more-img').show();
114 $('#load-more-img a').attr('href', res.url); 120 $('#load-more-img a').attr('href', res.url);
@@ -35,6 +35,10 @@ @@ -35,6 +35,10 @@
35 z-index: 2; 35 z-index: 2;
36 background: #f0f0f0; 36 background: #f0f0f0;
37 transition: transform 0.3s; 37 transition: transform 0.3s;
  38 +
  39 + .creative-life .classify-name {
  40 + display: none;
  41 + }
38 } 42 }
39 43
40 .mobile-wrap.menu-open { 44 .mobile-wrap.menu-open {
@@ -189,4 +189,4 @@ @@ -189,4 +189,4 @@
189 } 189 }
190 } 190 }
191 191
192 -@import "home" ; 192 +@import "home";