Authored by 王水玲

sale

@@ -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">&#xe603;</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">&#xe603;</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 -});  
  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 +});
  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);