Showing
9 changed files
with
502 additions
and
482 deletions
@@ -38,7 +38,7 @@ exports.index = (req, res) => { | @@ -38,7 +38,7 @@ exports.index = (req, res) => { | ||
38 | pageFooter: true | 38 | pageFooter: true |
39 | }; | 39 | }; |
40 | 40 | ||
41 | - saleModel.getSaleResources().then((result) => { | 41 | + saleModel.getSaleData().then((result) => { |
42 | res.render('sale', Object.assign(renderData, { | 42 | res.render('sale', Object.assign(renderData, { |
43 | content: result | 43 | content: result |
44 | })); | 44 | })); |
@@ -60,7 +60,6 @@ exports.breakCode = (req, res) => { | @@ -60,7 +60,6 @@ exports.breakCode = (req, res) => { | ||
60 | }; | 60 | }; |
61 | 61 | ||
62 | saleModel.getBreakCodeData().then((result) => { | 62 | saleModel.getBreakCodeData().then((result) => { |
63 | - console.log(result); | ||
64 | res.render('break-code', Object.assign(renderData, result)); | 63 | res.render('break-code', Object.assign(renderData, result)); |
65 | }).catch((err) => { | 64 | }).catch((err) => { |
66 | saleLogger(err, res); | 65 | saleLogger(err, res); |
@@ -91,33 +90,17 @@ exports.special = (req, res) => { | @@ -91,33 +90,17 @@ exports.special = (req, res) => { | ||
91 | * 折扣专场专题详情 | 90 | * 折扣专场专题详情 |
92 | */ | 91 | */ |
93 | exports.specialDetail = (req, res) => { | 92 | exports.specialDetail = (req, res) => { |
94 | - let headerData = headerModel.setNavHeader('折扣专场'); | 93 | + let headerData = headerModel.setNavHeader(); |
94 | + let id = req.query.id; | ||
95 | let renderData = { | 95 | let renderData = { |
96 | module: 'product', | 96 | module: 'product', |
97 | - page: 'special', | ||
98 | - pageHeader: headerData, | 97 | + page: 'special-detail', |
99 | pageFooter: true | 98 | pageFooter: true |
100 | }; | 99 | }; |
101 | 100 | ||
102 | - saleModel.getSpecialDetailData().then((result) => { | ||
103 | - result = { | ||
104 | - src: 'http://img12.static.yhbimg.com/yhb-img01/2016/04/18/05/0239e814b8121913aa67b9ad509bd4e310.jpg?imageView2/2/w/{width}/h/{height}', | ||
105 | - goods: { | ||
106 | - url: 'http://m.yohobuy.com/product/pro_320421_412063/SYSTAGYuanLingWeiYiSYSA601HC09.html', | ||
107 | - thumb: 'http://img10.static.yhbimg.com/goodsimg/2015/12/07/09/01ced0e2ed6a4f2a6d95be70cd0a6c5a56.jpg?imageView/2/w/235/h/314', | ||
108 | - name: 'NEFF ONE OF US RAGLAN L/S 男款森林风连帽卫衣', | ||
109 | - salePrice: '759.00', | ||
110 | - price: '799.00', | ||
111 | - tags: { | ||
112 | - isNew: true, | ||
113 | - isAdvance: false, | ||
114 | - isDiscount: false, | ||
115 | - isYohoood: false, | ||
116 | - isLimited: false | ||
117 | - }, | ||
118 | - isSoonSoldOut: true | ||
119 | - } | ||
120 | - }; | 101 | + saleModel.getSpecialDetailData(id).then((result) => { |
102 | + headerData.navTitle = result.title; | ||
103 | + renderData.pageHeader = headerData; | ||
121 | res.render('special-detail', Object.assign(renderData, result)); | 104 | res.render('special-detail', Object.assign(renderData, result)); |
122 | }).catch((err) => { | 105 | }).catch((err) => { |
123 | saleLogger(err, res); | 106 | saleLogger(err, res); |
@@ -137,25 +120,9 @@ exports.vip = (req, res) => { | @@ -137,25 +120,9 @@ exports.vip = (req, res) => { | ||
137 | }; | 120 | }; |
138 | 121 | ||
139 | saleModel.getVipData().then((result) => { | 122 | saleModel.getVipData().then((result) => { |
140 | - result = { | ||
141 | - src: 'http://img12.static.yhbimg.com/yhb-img01/2016/04/18/05/0239e814b8121913aa67b9ad509bd4e310.jpg?imageView2/2/w/{width}/h/{height}', | ||
142 | - goods: { | ||
143 | - url: 'http://m.yohobuy.com/product/pro_320421_412063/SYSTAGYuanLingWeiYiSYSA601HC09.html', | ||
144 | - thumb: 'http://img10.static.yhbimg.com/goodsimg/2015/12/07/09/01ced0e2ed6a4f2a6d95be70cd0a6c5a56.jpg?imageView/2/w/235/h/314', | ||
145 | - name: 'NEFF ONE OF US RAGLAN L/S 男款森林风连帽卫衣', | ||
146 | - salePrice: '759.00', | ||
147 | - price: '799.00', | ||
148 | - tags: { | ||
149 | - isNew: true, | ||
150 | - isAdvance: false, | ||
151 | - isDiscount: false, | ||
152 | - isYohoood: false, | ||
153 | - isLimited: false | ||
154 | - }, | ||
155 | - isSoonSoldOut: true | ||
156 | - } | ||
157 | - }; | ||
158 | - res.render('vip', Object.assign(renderData, result)); | 123 | + res.render('vip', Object.assign(renderData, { |
124 | + content: result | ||
125 | + })); | ||
159 | }).catch((err) => { | 126 | }).catch((err) => { |
160 | saleLogger(err, res); | 127 | saleLogger(err, res); |
161 | }); | 128 | }); |
@@ -20,6 +20,26 @@ const anHour = 3600000; | @@ -20,6 +20,26 @@ const anHour = 3600000; | ||
20 | const aDay = anHour * 24; | 20 | const aDay = anHour * 24; |
21 | 21 | ||
22 | /** | 22 | /** |
23 | + * 过期时间处理 | ||
24 | + */ | ||
25 | +const processTime = (time) => { | ||
26 | + let data = {}; | ||
27 | + | ||
28 | + if (time < anHour) { | ||
29 | + data.warnColor = true; | ||
30 | + data.time = '低于1小时'; | ||
31 | + } else { | ||
32 | + if (time > aDay) { | ||
33 | + data.time = helpers.dateDiffFormat('剩{d}天{h}小时', time, 'ms'); | ||
34 | + } else { | ||
35 | + data.time = helpers.dateDiffFormat('剩{h}小时', time, 'ms'); | ||
36 | + } | ||
37 | + } | ||
38 | + | ||
39 | + return data; | ||
40 | +} | ||
41 | + | ||
42 | +/** | ||
23 | * 折扣专场列表数据处理 | 43 | * 折扣专场列表数据处理 |
24 | */ | 44 | */ |
25 | const processSpecial = (list) => { | 45 | const processSpecial = (list) => { |
@@ -31,16 +51,8 @@ const processSpecial = (list) => { | @@ -31,16 +51,8 @@ const processSpecial = (list) => { | ||
31 | _.forEach(list, (data) => { | 51 | _.forEach(list, (data) => { |
32 | data.specialUrl = `/product/specialDetail?id=${data.id}`; | 52 | data.specialUrl = `/product/specialDetail?id=${data.id}`; |
33 | 53 | ||
34 | - if (data.leftTime < anHour) { | ||
35 | - data.warnColor = true; | ||
36 | - data.leftTime = '低于1小时'; | ||
37 | - } else { | ||
38 | - if (data.leftTime > aDay) { | ||
39 | - data.leftTime = helpers.dateDiffFormat('剩{d}天{h}小时', data.leftTime, 'ms'); | ||
40 | - } else { | ||
41 | - data.leftTime = helpers.dateDiffFormat('剩{h}小时', data.leftTime, 'ms'); | ||
42 | - } | ||
43 | - } | 54 | + _.merge(data, processTime(data.leftTime)); |
55 | + | ||
44 | formatData.push(data); | 56 | formatData.push(data); |
45 | }); | 57 | }); |
46 | 58 | ||
@@ -48,6 +60,27 @@ const processSpecial = (list) => { | @@ -48,6 +60,27 @@ const processSpecial = (list) => { | ||
48 | }; | 60 | }; |
49 | 61 | ||
50 | /** | 62 | /** |
63 | + * 折扣专场详情数据处理 | ||
64 | + */ | ||
65 | +const processSpecialDetail = (data) => { | ||
66 | + let activityData = {}; | ||
67 | + | ||
68 | + data[0] = data[0] || {}; | ||
69 | + data[0] = camelCase(data[0]); | ||
70 | + | ||
71 | + _.merge(data[0], processTime(data[0].leftTime)); | ||
72 | + | ||
73 | + return activityData = { | ||
74 | + title: data[0].title, | ||
75 | + activity: { | ||
76 | + coverUrl: data[0].coverUrl, | ||
77 | + time: data[0].time, | ||
78 | + leftTime: data[0].leftTime | ||
79 | + } | ||
80 | + }; | ||
81 | +} | ||
82 | + | ||
83 | +/** | ||
51 | * 断码区分类数据处理 | 84 | * 断码区分类数据处理 |
52 | */ | 85 | */ |
53 | const processBreakingSort = (list) => { | 86 | const processBreakingSort = (list) => { |
@@ -132,7 +165,8 @@ exports.getSearchData = (params) => { | @@ -132,7 +165,8 @@ exports.getSearchData = (params) => { | ||
132 | const getResources = (page) => { | 165 | const getResources = (page) => { |
133 | const contentCode = { | 166 | const contentCode = { |
134 | sale: '7c2b77093421efa8ae9302c91460db73', | 167 | sale: '7c2b77093421efa8ae9302c91460db73', |
135 | - breakCode: '7c2b77093421efa8ae9302c91460db73' | 168 | + breakCode: '7c2b77093421efa8ae9302c91460db73', |
169 | + vip: '7c2b77093421efa8ae9302c91460db73' | ||
136 | }; | 170 | }; |
137 | 171 | ||
138 | return serviceAPI.get('operations/api/v5/resource/get', sign.apiSign({ | 172 | return serviceAPI.get('operations/api/v5/resource/get', sign.apiSign({ |
@@ -213,14 +247,15 @@ exports.getSpecialData = (params) => { | @@ -213,14 +247,15 @@ exports.getSpecialData = (params) => { | ||
213 | * @param {[object]} params | 247 | * @param {[object]} params |
214 | * @return {[object]} | 248 | * @return {[object]} |
215 | */ | 249 | */ |
216 | -exports.getSpecialDetailData = (params) => { | ||
217 | - return api.get('', sign.apiSign(Object.assign({ | 250 | +exports.getSpecialDetailData = (id) => { |
251 | + return api.get('', sign.apiSign({ | ||
218 | method: 'app.activity.get', | 252 | method: 'app.activity.get', |
219 | sort: 2, | 253 | sort: 2, |
220 | - plateform: 2 | ||
221 | - }, params))).then((result) => { | 254 | + plateform: 2, |
255 | + id: id | ||
256 | + })).then((result) => { | ||
222 | if (result && result.code === 200) { | 257 | if (result && result.code === 200) { |
223 | - return camelCase(result.data); | 258 | + return processSpecialDetail(result.data); |
224 | } else { | 259 | } else { |
225 | return Promise.reject('error'); | 260 | return Promise.reject('error'); |
226 | } | 261 | } |
@@ -234,15 +269,5 @@ exports.getSpecialDetailData = (params) => { | @@ -234,15 +269,5 @@ exports.getSpecialDetailData = (params) => { | ||
234 | * @return {[object]} | 269 | * @return {[object]} |
235 | */ | 270 | */ |
236 | exports.getVipData = (params) => { | 271 | exports.getVipData = (params) => { |
237 | - return api.get('', sign.apiSign(Object.assign({ | ||
238 | - method: 'app.activity.get', | ||
239 | - sort: 2, | ||
240 | - plateform: 2 | ||
241 | - }, params))).then((result) => { | ||
242 | - if (result && result.code === 200) { | ||
243 | - return camelCase(result.data); | ||
244 | - } else { | ||
245 | - return Promise.reject('error'); | ||
246 | - } | ||
247 | - }); | 272 | + return getResources('vip'); |
248 | }; | 273 | }; |
@@ -6,7 +6,7 @@ | @@ -6,7 +6,7 @@ | ||
6 | <img class="lazy" data-original="{{image coverUrl 640 250}}" /> | 6 | <img class="lazy" data-original="{{image coverUrl 640 250}}" /> |
7 | <p class="special-cont"> | 7 | <p class="special-cont"> |
8 | <span class="special-title">{{title}}</span> | 8 | <span class="special-title">{{title}}</span> |
9 | - <span class="special-time {{#if warnColor}}red-color{{/if}}">{{leftTime}}</span> | 9 | + <span class="special-time {{#if warnColor}}red-color{{/if}}">{{time}}</span> |
10 | </p> | 10 | </p> |
11 | </a> | 11 | </a> |
12 | </li> | 12 | </li> |
1 | <div class="banner"> | 1 | <div class="banner"> |
2 | - <img src="{{image src 640 200}}"/> | ||
3 | - {{# activityTime}} | ||
4 | - <p class="activity-time" data-time-ms = '{{msTime}}'><i class="iconfont time-ico"></i><span>剩1天2小时38分4秒</span></p> | ||
5 | - {{/ activityTime}} | 2 | + {{#content}} |
3 | + {{! 头部banner}} | ||
4 | + {{#if focus}} | ||
5 | + {{> resources/banner-top}} | ||
6 | + {{/if}} | ||
7 | + {{/content}} | ||
8 | + {{# activity}} | ||
9 | + <img src="{{image coverUrl 640 200}}"/> | ||
10 | + <p class="activity-time" data-time-ms="{{leftTime}}"><i class="iconfont time-ico"></i><span>{{time}}</span></p> | ||
11 | + {{/ activity}} | ||
6 | </div> | 12 | </div> |
7 | <ul id="list-nav" class="list-nav clearfix"> | 13 | <ul id="list-nav" class="list-nav clearfix"> |
8 | <li class="new active"> | 14 | <li class="new active"> |
@@ -35,7 +35,7 @@ | @@ -35,7 +35,7 @@ | ||
35 | {{#if saleViplogin}} | 35 | {{#if saleViplogin}} |
36 | <i class="vip-grade-{{vipGrade}}"></i> | 36 | <i class="vip-grade-{{vipGrade}}"></i> |
37 | {{/if}} | 37 | {{/if}} |
38 | - <span class="sale-price {{^marketPrice}}no-price{{/price}}">¥{{salesPrice}}</span> | 38 | + <span class="sale-price {{^marketPrice}}no-price{{/marketPrice}}">¥{{salesPrice}}</span> |
39 | {{#marketPrice}} | 39 | {{#marketPrice}} |
40 | <span class="market-price">¥{{.}}</span> | 40 | <span class="market-price">¥{{.}}</span> |
41 | {{/marketPrice}} | 41 | {{/marketPrice}} |
@@ -5,57 +5,9 @@ | @@ -5,57 +5,9 @@ | ||
5 | */ | 5 | */ |
6 | 6 | ||
7 | var $ = require('yoho-jquery'), | 7 | var $ = require('yoho-jquery'), |
8 | - Swiper = require('yoho-swiper'), | ||
9 | - ellipsis = require('yoho-mlellipsis'), | ||
10 | - lazyLoad = require('yoho-jquery-lazyload'), | ||
11 | - tip = require('../plugin/tip'), | ||
12 | - filter = require('../plugin/filter'), | ||
13 | - loading = require('../plugin/loading'); | 8 | + Swiper = require('yoho-swiper'); |
14 | 9 | ||
15 | -var $goodsContainer = $('#goods-container'), | ||
16 | - $goodsChildren = $goodsContainer.children(), | ||
17 | - $ngc = $($goodsChildren.get(0)), | ||
18 | - $pgc = $($goodsChildren.get(1)), | ||
19 | - $dgc = $($goodsChildren.get(2)); | ||
20 | - | ||
21 | -var winH = $(window).height(), | ||
22 | - noResult = '<p class="no-result">未找到相关搜索结果</p>'; | ||
23 | - | ||
24 | -// 默认筛选条件 | ||
25 | -var defaultOpt = require('./query-param'); | ||
26 | - | ||
27 | -var $listNav = $('#list-nav'), | ||
28 | - | ||
29 | - // 导航数据信息 | ||
30 | - navInfo = { | ||
31 | - newest: { | ||
32 | - order: 1, | ||
33 | - reload: true, | ||
34 | - page: 0, | ||
35 | - end: false | ||
36 | - }, | ||
37 | - price: { | ||
38 | - order: 1, | ||
39 | - reload: true, | ||
40 | - page: 0, | ||
41 | - end: false | ||
42 | - }, | ||
43 | - discount: { | ||
44 | - order: 1, | ||
45 | - reload: true, | ||
46 | - page: 0, | ||
47 | - end: false | ||
48 | - } | ||
49 | - }, | ||
50 | - $pre = $listNav.find('.active'), // 纪录进入筛选前的active项,初始为选中项 | ||
51 | - searching; | ||
52 | - | ||
53 | -require('./suspend-cart'); // 悬浮购物车 | ||
54 | -require('../common'); | ||
55 | - | ||
56 | -ellipsis.init(); | ||
57 | - | ||
58 | -lazyLoad($('img.lazy')); | 10 | +require('./search'); |
59 | 11 | ||
60 | if ($('.swiper-container .swiper-slide').length > 1) { | 12 | if ($('.swiper-container .swiper-slide').length > 1) { |
61 | new Swiper('.swiper-container', { | 13 | new Swiper('.swiper-container', { |
@@ -68,326 +20,3 @@ if ($('.swiper-container .swiper-slide').length > 1) { | @@ -68,326 +20,3 @@ if ($('.swiper-container .swiper-slide').length > 1) { | ||
68 | pagination: '.banner-top .pagination-inner' | 20 | pagination: '.banner-top .pagination-inner' |
69 | }); | 21 | }); |
70 | } | 22 | } |
71 | - | ||
72 | -/** | ||
73 | - * 筛选注册的回调,筛选子项点击后逻辑 | ||
74 | - * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载 | ||
75 | - * @param opt {type, id} | ||
76 | - */ | ||
77 | -function search(opt) { | ||
78 | - var setting = {}, | ||
79 | - ext, | ||
80 | - att, | ||
81 | - nav, navType, | ||
82 | - page; | ||
83 | - | ||
84 | - if (searching) { | ||
85 | - return; | ||
86 | - } | ||
87 | - | ||
88 | - if (opt) { | ||
89 | - | ||
90 | - // 筛选项变更则重置reload为true | ||
91 | - for (att in navInfo) { | ||
92 | - if (navInfo.hasOwnProperty(att)) { | ||
93 | - navInfo[att].reload = true; | ||
94 | - } | ||
95 | - } | ||
96 | - | ||
97 | - // 处理active状态 | ||
98 | - $listNav.children('.active').removeClass('active'); | ||
99 | - $pre.addClass('active'); | ||
100 | - | ||
101 | - switch (opt.type) { | ||
102 | - case 'gender': | ||
103 | - ext = { | ||
104 | - gender: opt.id | ||
105 | - }; | ||
106 | - break; | ||
107 | - case 'brand': | ||
108 | - ext = { | ||
109 | - brand: opt.id | ||
110 | - }; | ||
111 | - break; | ||
112 | - case 'sort': | ||
113 | - ext = { | ||
114 | - sort: opt.id | ||
115 | - }; | ||
116 | - break; | ||
117 | - case 'color': | ||
118 | - ext = { | ||
119 | - color: opt.id | ||
120 | - }; | ||
121 | - break; | ||
122 | - case 'size': | ||
123 | - ext = { | ||
124 | - size: opt.id | ||
125 | - }; | ||
126 | - break; | ||
127 | - case 'price': | ||
128 | - ext = { | ||
129 | - price: opt.id | ||
130 | - }; | ||
131 | - break; | ||
132 | - case 'discount': | ||
133 | - ext = { | ||
134 | - discount: opt.id | ||
135 | - }; | ||
136 | - break; | ||
137 | - default: | ||
138 | - break; | ||
139 | - } | ||
140 | - | ||
141 | - $.extend(defaultOpt, ext); // 扩展筛选项 | ||
142 | - } | ||
143 | - | ||
144 | - | ||
145 | - // 导航类别 | ||
146 | - if ($pre.hasClass('new')) { | ||
147 | - navType = 'newest'; | ||
148 | - } else if ($pre.hasClass('price')) { | ||
149 | - navType = 'price'; | ||
150 | - } else if ($pre.hasClass('discount')) { | ||
151 | - navType = 'discount'; | ||
152 | - } | ||
153 | - | ||
154 | - nav = navInfo[navType]; | ||
155 | - page = nav.page + 1; | ||
156 | - if (nav.reload) { | ||
157 | - page = 1; | ||
158 | - } else if (nav.end) { | ||
159 | - | ||
160 | - // 不需要重新加载并且数据请求结束 | ||
161 | - return; | ||
162 | - } | ||
163 | - | ||
164 | - $.extend(setting, defaultOpt, { | ||
165 | - type: navType, | ||
166 | - order: nav.order, | ||
167 | - page: page | ||
168 | - }); | ||
169 | - | ||
170 | - searching = true; | ||
171 | - loading.showLoadingMask(); | ||
172 | - | ||
173 | - $.ajax({ | ||
174 | - type: 'GET', | ||
175 | - url: '/product/sale/search', | ||
176 | - data: setting, | ||
177 | - success: function(data) { | ||
178 | - var $container, | ||
179 | - num; | ||
180 | - | ||
181 | - console.log(data); | ||
182 | - | ||
183 | - switch (navType) { | ||
184 | - case 'newest': | ||
185 | - $container = $ngc; | ||
186 | - break; | ||
187 | - case 'price': | ||
188 | - $container = $pgc; | ||
189 | - break; | ||
190 | - case 'discount': | ||
191 | - $container = $dgc; | ||
192 | - break; | ||
193 | - default: | ||
194 | - break; | ||
195 | - } | ||
196 | - | ||
197 | - if (data === ' ') { | ||
198 | - nav.end = true; | ||
199 | - | ||
200 | - if (nav.reload) { | ||
201 | - $container.html(noResult); | ||
202 | - } | ||
203 | - } else { | ||
204 | - if (nav.reload) { | ||
205 | - $container.html(data); | ||
206 | - lazyLoad($container.find('.lazy')); | ||
207 | - } else { | ||
208 | - num = $container.find('.good-info').length; | ||
209 | - $container.append(data); | ||
210 | - | ||
211 | - // lazy good-infos who append in | ||
212 | - lazyLoad($container.find('.good-info:gt(' + (num - 1) + ') .lazy')); | ||
213 | - } | ||
214 | - } | ||
215 | - | ||
216 | - nav.reload = false; | ||
217 | - nav.page = page; | ||
218 | - | ||
219 | - searching = false; | ||
220 | - loading.hideLoadingMask(); | ||
221 | - | ||
222 | - window.rePosFooter(); | ||
223 | - | ||
224 | - $('.good-detail-text .name').each(function() { | ||
225 | - var $this = $(this), | ||
226 | - $title = $this.find('a'); | ||
227 | - | ||
228 | - $title[0].mlellipsis(2); | ||
229 | - }); | ||
230 | - }, | ||
231 | - error: function() { | ||
232 | - tip.show('网络断开连接了~'); | ||
233 | - searching = false; | ||
234 | - loading.hideLoadingMask(); | ||
235 | - } | ||
236 | - }); | ||
237 | - | ||
238 | -} | ||
239 | - | ||
240 | -$.ajax({ | ||
241 | - type: 'GET', | ||
242 | - url: '/product/newsale/filter', | ||
243 | - data: defaultOpt, | ||
244 | - success: function(data) { | ||
245 | - $goodsContainer.append(data); | ||
246 | - | ||
247 | - // 初始化filter&注册filter回调 | ||
248 | - filter.initFilter({ | ||
249 | - fCbFn: search, | ||
250 | - hCbFn: function() { | ||
251 | - | ||
252 | - // 切换active状态到$pre上 | ||
253 | - $pre.addClass('active'); | ||
254 | - $pre.siblings('.filter').removeClass('active'); | ||
255 | - }, | ||
256 | - missStatus: true | ||
257 | - }); | ||
258 | - } | ||
259 | -}); | ||
260 | -lazyLoad($('.lazy')); | ||
261 | - | ||
262 | -// 导航栏点击逻辑说明: | ||
263 | -// 1.点击非active项时切换active状态 | ||
264 | -// 2.价格和折扣active状态时继续点击切换排序 | ||
265 | -// 3.筛选无active时点击展开筛选面板 | ||
266 | -// 4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态 | ||
267 | -// 5.当前active为筛选并且点击其他项时,隐藏筛选面板 | ||
268 | -$listNav.bind('contextmenu', function() { | ||
269 | - return false; | ||
270 | -}); | ||
271 | - | ||
272 | -$listNav.on('touchend touchcancel', function(e) { | ||
273 | - var $this = $(e.target).closest('li'), | ||
274 | - nav, | ||
275 | - navType, | ||
276 | - $active; | ||
277 | - | ||
278 | - e.preventDefault(); | ||
279 | - | ||
280 | - if (typeof $this === 'undefined' || $this.length === 0) { | ||
281 | - return; | ||
282 | - } | ||
283 | - | ||
284 | - if ($this.hasClass('filter')) { | ||
285 | - | ||
286 | - // 筛选面板切换状态 | ||
287 | - if ($this.hasClass('active')) { | ||
288 | - filter.hideFilter(); | ||
289 | - | ||
290 | - // 点击筛选钱的active项回复active | ||
291 | - $pre.addClass('active'); | ||
292 | - $this.removeClass('active'); | ||
293 | - } else { | ||
294 | - $pre = $this.siblings('.active'); | ||
295 | - | ||
296 | - $pre.removeClass('active'); | ||
297 | - $this.addClass('active'); | ||
298 | - | ||
299 | - filter.showFilter(); | ||
300 | - } | ||
301 | - } else { | ||
302 | - | ||
303 | - if ($this.hasClass('new')) { | ||
304 | - navType = 'newest'; | ||
305 | - } else if ($this.hasClass('price')) { | ||
306 | - navType = 'price'; | ||
307 | - } else if ($this.hasClass('discount')) { | ||
308 | - navType = 'discount'; | ||
309 | - } | ||
310 | - | ||
311 | - nav = navInfo[navType]; | ||
312 | - | ||
313 | - if ($this.hasClass('active')) { | ||
314 | - | ||
315 | - // 最新无排序切换 | ||
316 | - if ($this.hasClass('new')) { | ||
317 | - return; | ||
318 | - } | ||
319 | - | ||
320 | - if ($this.hasClass('price') || $this.hasClass('discount')) { | ||
321 | - | ||
322 | - // 价格/折扣切换排序状态 | ||
323 | - $this.find('.icon > .iconfont').toggleClass('cur'); | ||
324 | - $pre = $this; // 更新pre为当前项 | ||
325 | - nav.reload = true; // 重置reload,HTML会被替换为逆序的HTML | ||
326 | - nav.order = nav.order === 0 ? 1 : 0; // 切换排序 | ||
327 | - } | ||
328 | - } else { | ||
329 | - $active = $this.siblings('.active'); | ||
330 | - | ||
331 | - $pre = $this; // $pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项 | ||
332 | - | ||
333 | - if ($active.hasClass('filter')) { | ||
334 | - | ||
335 | - // 若之前active项为筛选,则隐藏筛选面板 | ||
336 | - filter.hideFilter(); | ||
337 | - } else { | ||
338 | - | ||
339 | - // 切换container显示 | ||
340 | - $goodsContainer.children('.container:not(.hide)').addClass('hide'); | ||
341 | - | ||
342 | - switch (navType) { | ||
343 | - case 'newest': | ||
344 | - $ngc.removeClass('hide'); | ||
345 | - break; | ||
346 | - | ||
347 | - case 'price': | ||
348 | - $pgc.removeClass('hide'); | ||
349 | - break; | ||
350 | - | ||
351 | - case 'discount': | ||
352 | - $dgc.removeClass('hide'); | ||
353 | - break; | ||
354 | - default: | ||
355 | - break; | ||
356 | - } | ||
357 | - } | ||
358 | - | ||
359 | - $active.removeClass('active'); | ||
360 | - $this.addClass('active'); | ||
361 | - } | ||
362 | - | ||
363 | - if (nav.reload) { | ||
364 | - search(); | ||
365 | - } | ||
366 | - } | ||
367 | - e.stopPropagation(); | ||
368 | -}); | ||
369 | - | ||
370 | -function scrollHandler() { | ||
371 | - | ||
372 | - // 当scroll到1/4$goodsContainer高度后继续请求下一页数据 | ||
373 | - if ($(window).scrollTop() + winH > | ||
374 | - $(document).height() - 0.25 * $goodsContainer.height() - 50) { | ||
375 | - if (typeof($pre) !== 'undefined') { | ||
376 | - search(); | ||
377 | - } | ||
378 | - } | ||
379 | -} | ||
380 | - | ||
381 | -// srcoll to load more | ||
382 | -$(window).scroll(function() { | ||
383 | - window.requestAnimationFrame(scrollHandler); | ||
384 | -}); | ||
385 | - | ||
386 | -// 初始请求最新第一页数据 | ||
387 | -search(); | ||
388 | - | ||
389 | -$listNav.on('touchstart', 'li', function() { | ||
390 | - $(this).addClass('bytouch'); | ||
391 | -}).on('touchend touchcancel', function() { | ||
392 | - $listNav.find('li').removeClass('bytouch'); | ||
393 | -}); |
public/js/product/search.js
0 → 100644
1 | +/** | ||
2 | + * 商品列表搜索 | ||
3 | + * @author: wsl<shuiling.wang@yoho.cn> | ||
4 | + * @date: 2016/5/23 | ||
5 | + */ | ||
6 | +var $ = require('yoho-jquery'), | ||
7 | + ellipsis = require('yoho-mlellipsis'), | ||
8 | + lazyLoad = require('yoho-jquery-lazyload'), | ||
9 | + tip = require('../plugin/tip'), | ||
10 | + filter = require('../plugin/filter'), | ||
11 | + loading = require('../plugin/loading'); | ||
12 | + | ||
13 | +var $goodsContainer = $('#goods-container'), | ||
14 | + $goodsChildren = $goodsContainer.children(), | ||
15 | + $ngc = $($goodsChildren.get(0)), | ||
16 | + $pgc = $($goodsChildren.get(1)), | ||
17 | + $dgc = $($goodsChildren.get(2)); | ||
18 | + | ||
19 | +var winH = $(window).height(), | ||
20 | + noResult = '<p class="no-result">未找到相关搜索结果</p>'; | ||
21 | + | ||
22 | +// 默认筛选条件 | ||
23 | +var defaultOpt = require('./query-param'); | ||
24 | + | ||
25 | +var $listNav = $('#list-nav'), | ||
26 | + | ||
27 | + // 导航数据信息 | ||
28 | + navInfo = { | ||
29 | + newest: { | ||
30 | + order: 1, | ||
31 | + reload: true, | ||
32 | + page: 0, | ||
33 | + end: false | ||
34 | + }, | ||
35 | + price: { | ||
36 | + order: 1, | ||
37 | + reload: true, | ||
38 | + page: 0, | ||
39 | + end: false | ||
40 | + }, | ||
41 | + discount: { | ||
42 | + order: 1, | ||
43 | + reload: true, | ||
44 | + page: 0, | ||
45 | + end: false | ||
46 | + } | ||
47 | + }, | ||
48 | + $pre = $listNav.find('.active'), // 纪录进入筛选前的active项,初始为选中项 | ||
49 | + searching; | ||
50 | + | ||
51 | +require('./suspend-cart'); // 悬浮购物车 | ||
52 | +require('../common'); | ||
53 | + | ||
54 | +ellipsis.init(); | ||
55 | + | ||
56 | +lazyLoad($('img.lazy')); | ||
57 | + | ||
58 | +/** | ||
59 | + * 筛选注册的回调,筛选子项点击后逻辑 | ||
60 | + * 需要执行search的场景:1.点选筛选项;2.relaod为true时切换导航;3.下拉加载 | ||
61 | + * @param opt {type, id} | ||
62 | + */ | ||
63 | +function search(opt) { | ||
64 | + var setting = {}, | ||
65 | + ext, | ||
66 | + att, | ||
67 | + nav, navType, | ||
68 | + page; | ||
69 | + | ||
70 | + if (searching) { | ||
71 | + return; | ||
72 | + } | ||
73 | + | ||
74 | + if (opt) { | ||
75 | + | ||
76 | + // 筛选项变更则重置reload为true | ||
77 | + for (att in navInfo) { | ||
78 | + if (navInfo.hasOwnProperty(att)) { | ||
79 | + navInfo[att].reload = true; | ||
80 | + } | ||
81 | + } | ||
82 | + | ||
83 | + // 处理active状态 | ||
84 | + $listNav.children('.active').removeClass('active'); | ||
85 | + $pre.addClass('active'); | ||
86 | + | ||
87 | + switch (opt.type) { | ||
88 | + case 'gender': | ||
89 | + ext = { | ||
90 | + gender: opt.id | ||
91 | + }; | ||
92 | + break; | ||
93 | + case 'brand': | ||
94 | + ext = { | ||
95 | + brand: opt.id | ||
96 | + }; | ||
97 | + break; | ||
98 | + case 'sort': | ||
99 | + ext = { | ||
100 | + sort: opt.id | ||
101 | + }; | ||
102 | + break; | ||
103 | + case 'color': | ||
104 | + ext = { | ||
105 | + color: opt.id | ||
106 | + }; | ||
107 | + break; | ||
108 | + case 'size': | ||
109 | + ext = { | ||
110 | + size: opt.id | ||
111 | + }; | ||
112 | + break; | ||
113 | + case 'price': | ||
114 | + ext = { | ||
115 | + price: opt.id | ||
116 | + }; | ||
117 | + break; | ||
118 | + case 'discount': | ||
119 | + ext = { | ||
120 | + discount: opt.id | ||
121 | + }; | ||
122 | + break; | ||
123 | + default: | ||
124 | + break; | ||
125 | + } | ||
126 | + | ||
127 | + $.extend(defaultOpt, ext); // 扩展筛选项 | ||
128 | + } | ||
129 | + | ||
130 | + | ||
131 | + // 导航类别 | ||
132 | + if ($pre.hasClass('new')) { | ||
133 | + navType = 'newest'; | ||
134 | + } else if ($pre.hasClass('price')) { | ||
135 | + navType = 'price'; | ||
136 | + } else if ($pre.hasClass('discount')) { | ||
137 | + navType = 'discount'; | ||
138 | + } | ||
139 | + | ||
140 | + nav = navInfo[navType]; | ||
141 | + page = nav.page + 1; | ||
142 | + if (nav.reload) { | ||
143 | + page = 1; | ||
144 | + } else if (nav.end) { | ||
145 | + | ||
146 | + // 不需要重新加载并且数据请求结束 | ||
147 | + return; | ||
148 | + } | ||
149 | + | ||
150 | + $.extend(setting, defaultOpt, { | ||
151 | + type: navType, | ||
152 | + order: nav.order, | ||
153 | + page: page | ||
154 | + }); | ||
155 | + | ||
156 | + searching = true; | ||
157 | + loading.showLoadingMask(); | ||
158 | + | ||
159 | + $.ajax({ | ||
160 | + type: 'GET', | ||
161 | + url: '/product/sale/search', | ||
162 | + data: setting, | ||
163 | + success: function(data) { | ||
164 | + var $container, | ||
165 | + num; | ||
166 | + | ||
167 | + console.log(data); | ||
168 | + | ||
169 | + switch (navType) { | ||
170 | + case 'newest': | ||
171 | + $container = $ngc; | ||
172 | + break; | ||
173 | + case 'price': | ||
174 | + $container = $pgc; | ||
175 | + break; | ||
176 | + case 'discount': | ||
177 | + $container = $dgc; | ||
178 | + break; | ||
179 | + default: | ||
180 | + break; | ||
181 | + } | ||
182 | + | ||
183 | + if (data === ' ') { | ||
184 | + nav.end = true; | ||
185 | + | ||
186 | + if (nav.reload) { | ||
187 | + $container.html(noResult); | ||
188 | + } | ||
189 | + } else { | ||
190 | + if (nav.reload) { | ||
191 | + $container.html(data); | ||
192 | + lazyLoad($container.find('.lazy')); | ||
193 | + } else { | ||
194 | + num = $container.find('.good-info').length; | ||
195 | + $container.append(data); | ||
196 | + | ||
197 | + // lazy good-infos who append in | ||
198 | + lazyLoad($container.find('.good-info:gt(' + (num - 1) + ') .lazy')); | ||
199 | + } | ||
200 | + } | ||
201 | + | ||
202 | + nav.reload = false; | ||
203 | + nav.page = page; | ||
204 | + | ||
205 | + searching = false; | ||
206 | + loading.hideLoadingMask(); | ||
207 | + | ||
208 | + window.rePosFooter(); | ||
209 | + | ||
210 | + $('.good-detail-text .name').each(function() { | ||
211 | + var $this = $(this), | ||
212 | + $title = $this.find('a'); | ||
213 | + | ||
214 | + $title[0].mlellipsis(2); | ||
215 | + }); | ||
216 | + }, | ||
217 | + error: function() { | ||
218 | + tip.show('网络断开连接了~'); | ||
219 | + searching = false; | ||
220 | + loading.hideLoadingMask(); | ||
221 | + } | ||
222 | + }); | ||
223 | + | ||
224 | +} | ||
225 | + | ||
226 | +$.ajax({ | ||
227 | + type: 'GET', | ||
228 | + url: '/product/newsale/filter', | ||
229 | + data: defaultOpt, | ||
230 | + success: function(data) { | ||
231 | + $goodsContainer.append(data); | ||
232 | + | ||
233 | + // 初始化filter&注册filter回调 | ||
234 | + filter.initFilter({ | ||
235 | + fCbFn: search, | ||
236 | + hCbFn: function() { | ||
237 | + | ||
238 | + // 切换active状态到$pre上 | ||
239 | + $pre.addClass('active'); | ||
240 | + $pre.siblings('.filter').removeClass('active'); | ||
241 | + }, | ||
242 | + missStatus: true | ||
243 | + }); | ||
244 | + } | ||
245 | +}); | ||
246 | +lazyLoad($('.lazy')); | ||
247 | + | ||
248 | +// 导航栏点击逻辑说明: | ||
249 | +// 1.点击非active项时切换active状态 | ||
250 | +// 2.价格和折扣active状态时继续点击切换排序 | ||
251 | +// 3.筛选无active时点击展开筛选面板 | ||
252 | +// 4.筛选有active时点击隐藏筛选面板并恢复点击筛选前active项的active状态 | ||
253 | +// 5.当前active为筛选并且点击其他项时,隐藏筛选面板 | ||
254 | +$listNav.bind('contextmenu', function() { | ||
255 | + return false; | ||
256 | +}); | ||
257 | + | ||
258 | +$listNav.on('touchend touchcancel', function(e) { | ||
259 | + var $this = $(e.target).closest('li'), | ||
260 | + nav, | ||
261 | + navType, | ||
262 | + $active; | ||
263 | + | ||
264 | + e.preventDefault(); | ||
265 | + | ||
266 | + if (typeof $this === 'undefined' || $this.length === 0) { | ||
267 | + return; | ||
268 | + } | ||
269 | + | ||
270 | + if ($this.hasClass('filter')) { | ||
271 | + | ||
272 | + // 筛选面板切换状态 | ||
273 | + if ($this.hasClass('active')) { | ||
274 | + filter.hideFilter(); | ||
275 | + | ||
276 | + // 点击筛选钱的active项回复active | ||
277 | + $pre.addClass('active'); | ||
278 | + $this.removeClass('active'); | ||
279 | + } else { | ||
280 | + $pre = $this.siblings('.active'); | ||
281 | + | ||
282 | + $pre.removeClass('active'); | ||
283 | + $this.addClass('active'); | ||
284 | + | ||
285 | + filter.showFilter(); | ||
286 | + } | ||
287 | + } else { | ||
288 | + | ||
289 | + if ($this.hasClass('new')) { | ||
290 | + navType = 'newest'; | ||
291 | + } else if ($this.hasClass('price')) { | ||
292 | + navType = 'price'; | ||
293 | + } else if ($this.hasClass('discount')) { | ||
294 | + navType = 'discount'; | ||
295 | + } | ||
296 | + | ||
297 | + nav = navInfo[navType]; | ||
298 | + | ||
299 | + if ($this.hasClass('active')) { | ||
300 | + | ||
301 | + // 最新无排序切换 | ||
302 | + if ($this.hasClass('new')) { | ||
303 | + return; | ||
304 | + } | ||
305 | + | ||
306 | + if ($this.hasClass('price') || $this.hasClass('discount')) { | ||
307 | + | ||
308 | + // 价格/折扣切换排序状态 | ||
309 | + $this.find('.icon > .iconfont').toggleClass('cur'); | ||
310 | + $pre = $this; // 更新pre为当前项 | ||
311 | + nav.reload = true; // 重置reload,HTML会被替换为逆序的HTML | ||
312 | + nav.order = nav.order === 0 ? 1 : 0; // 切换排序 | ||
313 | + } | ||
314 | + } else { | ||
315 | + $active = $this.siblings('.active'); | ||
316 | + | ||
317 | + $pre = $this; // $pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项 | ||
318 | + | ||
319 | + if ($active.hasClass('filter')) { | ||
320 | + | ||
321 | + // 若之前active项为筛选,则隐藏筛选面板 | ||
322 | + filter.hideFilter(); | ||
323 | + } else { | ||
324 | + | ||
325 | + // 切换container显示 | ||
326 | + $goodsContainer.children('.container:not(.hide)').addClass('hide'); | ||
327 | + | ||
328 | + switch (navType) { | ||
329 | + case 'newest': | ||
330 | + $ngc.removeClass('hide'); | ||
331 | + break; | ||
332 | + | ||
333 | + case 'price': | ||
334 | + $pgc.removeClass('hide'); | ||
335 | + break; | ||
336 | + | ||
337 | + case 'discount': | ||
338 | + $dgc.removeClass('hide'); | ||
339 | + break; | ||
340 | + default: | ||
341 | + break; | ||
342 | + } | ||
343 | + } | ||
344 | + | ||
345 | + $active.removeClass('active'); | ||
346 | + $this.addClass('active'); | ||
347 | + } | ||
348 | + | ||
349 | + if (nav.reload) { | ||
350 | + search(); | ||
351 | + } | ||
352 | + } | ||
353 | + e.stopPropagation(); | ||
354 | +}); | ||
355 | + | ||
356 | +function scrollHandler() { | ||
357 | + | ||
358 | + // 当scroll到1/4$goodsContainer高度后继续请求下一页数据 | ||
359 | + if ($(window).scrollTop() + winH > | ||
360 | + $(document).height() - 0.25 * $goodsContainer.height() - 50) { | ||
361 | + if (typeof($pre) !== 'undefined') { | ||
362 | + search(); | ||
363 | + } | ||
364 | + } | ||
365 | +} | ||
366 | + | ||
367 | +// srcoll to load more | ||
368 | +$(window).scroll(function() { | ||
369 | + window.requestAnimationFrame(scrollHandler); | ||
370 | +}); | ||
371 | + | ||
372 | +// 初始请求最新第一页数据 | ||
373 | +search(); | ||
374 | + | ||
375 | +$listNav.on('touchstart', 'li', function() { | ||
376 | + $(this).addClass('bytouch'); | ||
377 | +}).on('touchend touchcancel', function() { | ||
378 | + $listNav.find('li').removeClass('bytouch'); | ||
379 | +}); |
public/js/product/special-detail.page.js
0 → 100644
1 | +/** | ||
2 | + * 折扣专场详情 | ||
3 | + * @author: wsl<shuiling.wang@yoho.cn> | ||
4 | + * @date: 2016/5/20 | ||
5 | + */ | ||
6 | +var $ = require('yoho-jquery'), | ||
7 | + lazyLoad = require('yoho-jquery-lazyload'); | ||
8 | + | ||
9 | +var $activityTime = $('.activity-time'), | ||
10 | + endTime = $activityTime.data('time-ms'); | ||
11 | + | ||
12 | +require('./search'); | ||
13 | + | ||
14 | +lazyLoad($('img.lazy')); | ||
15 | + | ||
16 | + | ||
17 | +// 倒计时 | ||
18 | +function getRTime() { | ||
19 | + var anHour = 3600000, | ||
20 | + anMinute = 60000, | ||
21 | + anSecond = 1000, | ||
22 | + showTime = '', | ||
23 | + d = 0, | ||
24 | + h = 0, | ||
25 | + m = 0, | ||
26 | + s = 0; | ||
27 | + | ||
28 | + endTime = endTime - 1000; | ||
29 | + | ||
30 | + if (endTime > 1000) { | ||
31 | + d = Math.floor(endTime / anHour / 24); | ||
32 | + h = Math.floor(endTime / anHour % 24); | ||
33 | + m = Math.floor(endTime / anMinute % 60); | ||
34 | + s = Math.floor(endTime / anSecond % 60); | ||
35 | + } | ||
36 | + | ||
37 | + showTime += d > 0 ? d + '剩天' : ''; | ||
38 | + showTime += h > 0 ? h + '小时' : ''; | ||
39 | + showTime += m > 0 ? m + '分钟' : ''; | ||
40 | + showTime += s > 0 ? s + '秒' : ''; | ||
41 | + | ||
42 | + $activityTime.find('span').html(showTime); | ||
43 | + | ||
44 | + $activityTime.attr('data-time-ms', endTime); | ||
45 | +} | ||
46 | + | ||
47 | +setInterval(getRTime, 1000); |
@@ -6,37 +6,4 @@ | @@ -6,37 +6,4 @@ | ||
6 | var $ = require('yoho-jquery'), | 6 | var $ = require('yoho-jquery'), |
7 | lazyLoad = require('yoho-jquery-lazyload'); | 7 | lazyLoad = require('yoho-jquery-lazyload'); |
8 | 8 | ||
9 | -var $activityTime = $('.activity-time'); | ||
10 | - | ||
11 | lazyLoad($('img.lazy')); | 9 | lazyLoad($('img.lazy')); |
12 | - | ||
13 | -function getRTime() { | ||
14 | - // var EndTime = $activityTime.data('time-ms'), | ||
15 | - var EndTime = 1463743993785, | ||
16 | - NowTime = new Date(), | ||
17 | - t = EndTime - NowTime.getTime(), | ||
18 | - anHour = 3600000, | ||
19 | - anMinute = 60000, | ||
20 | - anSecond = 1000, | ||
21 | - showTime = '', | ||
22 | - d = 0, | ||
23 | - h = 0, | ||
24 | - m = 0, | ||
25 | - s = 0; | ||
26 | - | ||
27 | - if (t >= 0) { | ||
28 | - d = Math.floor(t / anHour / 24); | ||
29 | - h = Math.floor(t / anHour % 24); | ||
30 | - m = Math.floor(t / anMinute % 60); | ||
31 | - s = Math.floor(t / anSecond % 60); | ||
32 | - } | ||
33 | - | ||
34 | - showTime += d > 0 ? d + '剩天' : ''; | ||
35 | - showTime += h > 0 ? h + '小时' : ''; | ||
36 | - showTime += m > 0 ? m + '分钟' : ''; | ||
37 | - showTime += s > 0 ? s + '秒' : ''; | ||
38 | - | ||
39 | - $activityTime.find('span').html(showTime); | ||
40 | -} | ||
41 | - | ||
42 | -setInterval(getRTime, 0); |
-
Please register or login to post a comment