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,80 +27,80 @@ const ticketCacheKey = 'wechatShare:ticket'; @@ -27,80 +27,80 @@ 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* () {  
32 - let accessToken = yield cache.get(accessTokenCacheKey);  
33 -  
34 - if (accessToken) {  
35 - return accessToken;  
36 - }  
37 -  
38 - logger.info('调用微信 API 获取 accessToken');  
39 - return request({  
40 - url: 'https://api.weixin.qq.com/cgi-bin/token',  
41 - qs: {  
42 - grant_type: 'client_credential',  
43 - appid: appId,  
44 - secret: secret  
45 - },  
46 - json: true  
47 - }).then((res) => {  
48 -  
49 - // accessToken 有效期 7200s,缓存 7100s  
50 - cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => {  
51 - logger.error('微信分享 Token, 缓存 accessToken 时出错', JSON.stringify(err));  
52 - });  
53 - return res.access_token;  
54 - }).catch((err) => {  
55 - logger.error('微信分享 Token, 获取 accessToken 时出错', JSON.stringify(err)); 30 +let _getAccessToken = Promise.coroutine(function* () {
  31 + let accessToken = yield cache.get(accessTokenCacheKey);
  32 +
  33 + if (accessToken) {
  34 + return accessToken;
  35 + }
  36 +
  37 + logger.info('get accessToken from wechat API');
  38 + return request({
  39 + url: 'https://api.weixin.qq.com/cgi-bin/token',
  40 + qs: {
  41 + grant_type: 'client_credential',
  42 + appid: appId,
  43 + secret: secret
  44 + },
  45 + json: true
  46 + }).then((res) => {
  47 +
  48 + // accessToken 有效期 7200s,缓存 7100s
  49 + cache.set(accessTokenCacheKey, res.access_token, 7100).catch((err) => {
  50 + logger.error('set wechat accessToken cache error', JSON.stringify(err));
56 }); 51 });
57 - }),  
58 -  
59 - getTicket: Promise.coroutine(function* () {  
60 - let ticket = yield cache.get(ticketCacheKey);  
61 -  
62 - if (ticket) {  
63 - return ticket;  
64 - }  
65 -  
66 - logger.info('调用微信 API 获取 ticket');  
67 - return request({  
68 - url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',  
69 - qs: {  
70 - access_token: yield this.getAccessToken(),  
71 - type: 'jsapi'  
72 - },  
73 - json: true  
74 - }).then(res => { 52 + return res.access_token;
  53 + }).catch((err) => {
  54 + logger.error('get accessToken from wechat API error', JSON.stringify(err));
  55 + });
  56 +});
  57 +
  58 +let _getTicket = Promise.coroutine(function* () {
  59 + let ticket = yield cache.get(ticketCacheKey);
  60 +
  61 + if (ticket) {
  62 + return ticket;
  63 + }
  64 +
  65 + logger.info('get ticket from wechat API');
  66 + return request({
  67 + url: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
  68 + qs: {
  69 + access_token: yield _getAccessToken(),
  70 + type: 'jsapi'
  71 + },
  72 + json: true
  73 + }).then(res => {
75 74
76 // ticket 有效期 7200s,缓存 7100s 75 // ticket 有效期 7200s,缓存 7100s
77 - cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => {  
78 - logger.error('微信分享 Token, 缓存 ticket 时出错', JSON.stringify(err));  
79 - });  
80 - return res.ticket;  
81 - }).catch((err) => {  
82 - logger.error('微信分享 Token, 获取 ticket 时出错', JSON.stringify(err)); 76 + cache.set(ticketCacheKey, res.ticket, 7100).catch((err) => {
  77 + logger.error('set wechat Token cache error', JSON.stringify(err));
83 }); 78 });
84 - }),  
85 -  
86 - calcSignature: Promise.coroutine(function* (data) {  
87 - data = Object.assign({  
88 - nonceStr: Math.random().toString(36).substr(2, 15),  
89 - timestamp: Math.floor(Date.now() / 1000) + '',  
90 - ticket: yield this.getTicket(),  
91 - appId: appId  
92 - }, data);  
93 -  
94 - const str = `jsapi_ticket=${data.ticket}&noncestr=${data.nonceStr}&timestamp=${data.timestamp}&url=${data.url}`;  
95 -  
96 - data.signature = sha1(str);  
97 - return data;  
98 - })  
99 -}; 79 + return res.ticket;
  80 + }).catch((err) => {
  81 + logger.error('get ticket from wechat API error', JSON.stringify(err));
  82 + });
  83 +});
  84 +
  85 +let calcSignature = Promise.coroutine(function* (data) {
  86 + data = Object.assign({
  87 + nonceStr: Math.random().toString(36).substr(2, 15),
  88 + timestamp: Math.floor(Date.now() / 1000) + '',
  89 + ticket: yield _getTicket(),
  90 + appId: appId
  91 + }, data);
  92 +
  93 + const str = `jsapi_ticket=${data.ticket}&noncestr=${data.nonceStr}&timestamp=${data.timestamp}&url=${data.url}`;
  94 +
  95 + data.signature = sha1(str);
  96 + return data;
  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 +};
@@ -15,7 +15,7 @@ const RegService = require('../models/reg-service'); @@ -15,7 +15,7 @@ const RegService = require('../models/reg-service');
15 const AuthHelper = require('../models/auth-helper'); 15 const AuthHelper = require('../models/auth-helper');
16 16
17 let index = (req, res) => { 17 let index = (req, res) => {
18 - // 设置注册有效时间30分钟, 防机器刷 18 + // 设置注册有效时间30分钟, 防机器刷
19 req.session._REG_EXPIRE = Date.now() + 1800000; 19 req.session._REG_EXPIRE = Date.now() + 1800000;
20 20
21 let refer = req.query.refer; 21 let refer = req.query.refer;
@@ -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
@@ -82,7 +82,7 @@ let codeAction = (req, res, next) => { @@ -82,7 +82,7 @@ let codeAction = (req, res, next) => {
82 let mobile = +req.query.phoneNum; 82 let mobile = +req.query.phoneNum;
83 let area = +(req.query.areaCode || 86); 83 let area = +(req.query.areaCode || 86);
84 84
85 - // 判断是否允许访问, 不允许则跳转到错误页面 85 + // 判断是否允许访问, 不允许则跳转到错误页面
86 if (!_.isString(token) || !_.isNumber(mobile) || !sign.verifyToken(mobile, token)) { 86 if (!_.isString(token) || !_.isNumber(mobile) || !sign.verifyToken(mobile, token)) {
87 return next({ 87 return next({
88 code: 403, 88 code: 403,
@@ -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
@@ -183,7 +183,7 @@ let passwordAction = (req, res, next) => { @@ -183,7 +183,7 @@ let passwordAction = (req, res, next) => {
183 let mobile = +req.query.phoneNum; 183 let mobile = +req.query.phoneNum;
184 let area = +(req.query.areaCode || 86); 184 let area = +(req.query.areaCode || 86);
185 185
186 - // 判断是否允许访问, 不允许则跳转到错误页面 186 + // 判断是否允许访问, 不允许则跳转到错误页面
187 if (!_.isString(token) || !_.isNumber(mobile) || !_.isNumber(area) || !sign.verifyToken(mobile, token)) { 187 if (!_.isString(token) || !_.isNumber(mobile) || !_.isNumber(area) || !sign.verifyToken(mobile, token)) {
188 return next({ 188 return next({
189 code: 403, 189 code: 403,
@@ -214,27 +214,27 @@ let setPassword = (req, res, next) => { @@ -214,27 +214,27 @@ 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 }
233 233
234 - // 购物车key 234 + // 购物车key
235 let shoppingKey = cookie.getShoppingKey(req); 235 let shoppingKey = cookie.getShoppingKey(req);
236 236
237 - // 验证注册的标识码是否有效 237 + // 验证注册的标识码是否有效
238 RegService.regMobile(area, mobile, password, shoppingKey).then((result) => { 238 RegService.regMobile(area, mobile, password, shoppingKey).then((result) => {
239 if (!result.code || result.code !== 200) { 239 if (!result.code || result.code !== 200) {
240 return Promise.reject(result); 240 return Promise.reject(result);
@@ -245,7 +245,7 @@ let setPassword = (req, res, next) => { @@ -245,7 +245,7 @@ let setPassword = (req, res, next) => {
245 245
246 return AuthHelper.syncUserSession(result.data.uid, req, res); 246 return AuthHelper.syncUserSession(result.data.uid, req, res);
247 }).then(() => { 247 }).then(() => {
248 - // 返回跳转到来源页面 248 + // 返回跳转到来源页面
249 let refer = req.cookies.refer; 249 let refer = req.cookies.refer;
250 250
251 if (refer) { 251 if (refer) {
@@ -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";