Authored by 王水玲

sale

... ... @@ -40,7 +40,10 @@ exports.index = (req, res) => {
saleModel.getSaleData().then((result) => {
res.render('sale', Object.assign(renderData, {
content: result
content: result,
title: {
title: '最新降价'
}
}));
}).catch((err) => {
saleLogger(err, res);
... ...
... ... @@ -16,30 +16,71 @@ const resourcesProcess = require(`${utils}/resources-process`);
const _ = require('lodash');
const api = new API();
const serviceAPI = new ServiceAPI();
const aMinute = 60000;
const anHour = 3600000;
const aDay = anHour * 24;
const timeFormat = {
d: '剩{d}天',
h: '剩{h}小时',
m: '剩{m}分钟',
s: '剩{s}秒',
dh: '剩{d}天{h}小时',
dhms: '剩{d}天{h}小时{m}分钟{s}秒',
hms: '剩{h}小时{m}分钟{s}秒',
ms: '剩{m}分钟{s}秒'
};
/**
* 过期时间处理
* 折扣专场专题列表过期时间处理
*/
const processTime = (time) => {
let data = {};
let type = '';
if (time < anHour) {
data.warnColor = true;
data.time = '低于1小时';
} else {
if (time > aDay) {
data.time = helpers.dateDiffFormat('剩{d}天{h}小时', time, 'ms');
type = 'dh';
} else {
data.time = helpers.dateDiffFormat('剩{h}小时', time, 'ms');
type = 'h';
}
data.time = helpers.dateDiffFormat(timeFormat[type], time, 'ms');
}
return data;
};
/**
* 折扣专场专题详情过期时间处理
*/
const processTimes = (time) => {
let data = {};
let type = '';
if (time > aDay) {
type = 'dhms';
} else {
if (time > anHour) {
type = 'hms';
} else {
if (time > aMinute) {
type = 'ms';
} else {
type = 's';
}
}
}
data.time = helpers.dateDiffFormat(timeFormat[type], time, 'ms');
return data;
};
/**
* 折扣专场列表数据处理
*/
const processSpecial = (list) => {
... ... @@ -56,19 +97,30 @@ const processSpecial = (list) => {
_.forEach(list, (data) => {
if (flag === true) {
data.specialUrl = `/product/specialDetail?id=${data.id}`;
_.merge(data, processTime(data.leftTime));
} else {
_.merge(data, processTimes(data.leftTime));
}
_.merge(data, processTime(data.leftTime));
formatData.push(data);
});
return formatData;
};
const procProductImg = (product) => {
product;
return '1';
/**
* 根据性别来决定 默认图片获取字段 如果是 2、3
*
* 则优先从cover2 --》 cover1 -- 》 images_url
* 否则优先从cover1 --》 cover2 -- 》 images_url
*
*/
const procProductImg = (product, gender) => {
if (gender === '2,3') {
return product.cover2 || product.cover1 || product.imagesUrl || '';
}
return product.cover1 || product.cover2 || product.imagesUrl || '';
};
... ... @@ -85,7 +137,8 @@ const processSearch = (list, options) => {
width: 290,
height: 388,
isApp: false,
showPoint: true
showPoint: true,
gender: '2,3'
}, options);
list = camelCase(list);
... ... @@ -262,21 +315,23 @@ const processSearch = (list, options) => {
*/
const processBreakingSort = (list) => {
const formatData = {};
const sortName = [];
const sort = [];
const sub = [];
list = list || [];
list = camelCase(list);
_.forEach(list, (data, index) => {
sortName.push(data.sortName);
sort.push({
sortName: data.sortName,
sortId: data.sortId
});
data.sub.key = index;
sub.push(data.sub);
});
formatData.sortName = sortName;
formatData.sortData = sort;
formatData.sub = sub;
return formatData;
};
... ...
... ... @@ -8,13 +8,13 @@
{{# nav}}
<ul id="list-nav" class="list-nav clearfix">
{{# sortName}}
<li {{#if @first}} class="active" {{/if}}>
{{# sortData}}
<li {{#if @first}} class="active" {{/if}} data-id="{{sortId}}">
<a href="javascript:void(0);">
<span class="span-test">{{.}}</span>
<span class="span-test">{{sortName}}</span>
</a>
</li>
{{/ sortName}}
{{/ sortData}}
<li class="filter">
<a href="javascript:void(0);">
<span class="span-test">筛选</span>
... ... @@ -35,13 +35,14 @@
{{/ nav}}
<div id="goods-container" class="goods-container">
<div class="new-goods container clearfix">
<div class="coat-goods container clearfix">
{{# goods}}
{{> common/goods}}
{{/ goods}}
</div>
<div class="price-goods container hide clearfix"></div>
<div class="discount-goods container hide clearfix"></div>
<div class="trouser-goods container hide clearfix"></div>
<div class="shoes-goods container hide clearfix"></div>
<div class="other-goods container hide clearfix"></div>
{{> common/filter}}
</div>
... ...
{{log goods}}
{{# goods}}
{{> common/goods}}
{{/ goods}}
... ...
... ... @@ -7,7 +7,7 @@
{{/content}}
{{# activity}}
<img src="{{image coverUrl 640 200}}"/>
<p class="activity-time" data-time-ms="{{leftTime}}"><i class="iconfont time-ico">&#xe603;</i><span></span></p>
<p class="activity-time" data-time-ms="{{leftTime}}"><i class="iconfont time-ico">&#xe603;</i><span>{{time}}</span></p>
{{/ activity}}
</div>
<ul id="list-nav" class="list-nav clearfix">
... ...
... ... @@ -20,8 +20,8 @@
{{/ tags}}
</div>
<div class="good-detail-img">
<a class="good-thumb" href="{{url}}">
<img class="lazy" data-original="{{thumb}}">
<a class="good-thumb" href="{{url}}" data-img={{defaultImages}}>
<img class="lazy" data-original="{{image defaultImages 235 314}}">
</a>
{{# isSoonSoldOut}}
<p class="few-tag">即将售罄</p>
... ...
... ... @@ -14,9 +14,10 @@ var $ = require('yoho-jquery'),
var $goodsContainer = $('#goods-container'),
$goodsChildren = $goodsContainer.children(),
$ngc = $($goodsChildren.get(0)),
$pgc = $($goodsChildren.get(1)),
$dgc = $($goodsChildren.get(2));
$coatGc = $($goodsChildren.get(0)),
$trouserGc = $($goodsChildren.get(1)),
$shoesgc = $($goodsChildren.get(2)),
$othergc = $($goodsChildren.get(3));
var winH = $(window).height(),
noResult = '<p class="no-result">未找到相关搜索结果</p>';
... ... @@ -28,19 +29,25 @@ var $listNav = $('#list-nav'),
// 导航数据信息
navInfo = {
newest: {
coat: {
order: 1,
reload: true,
page: 0,
end: false
},
price: {
trouser: {
order: 1,
reload: true,
page: 0,
end: false
},
discount: {
shoes: {
order: 1,
reload: true,
page: 0,
end: false
},
other: {
order: 1,
reload: true,
page: 0,
... ... @@ -50,7 +57,8 @@ var $listNav = $('#list-nav'),
$pre = $listNav.find('.active'), // 纪录进入筛选前的active项,初始为选中项
searching;
var swipers = [];
var swipers = [],
goodsType = ['coat', 'trouser', 'shoes', 'other'];
require('./suspend-cart'); // 悬浮购物车
require('../common');
... ... @@ -65,6 +73,9 @@ $.each($('.swiper-container'), function(key) {
});
});
$.each($listNav.find('li'), function(key, item) {
$(item).addClass(goodsType[key]);
});
/**
* 筛选注册的回调,筛选子项点击后逻辑
... ... @@ -140,12 +151,14 @@ function search(opt) {
// 导航类别
if ($pre.hasClass('new')) {
navType = 'newest';
} else if ($pre.hasClass('price')) {
navType = 'price';
} else if ($pre.hasClass('discount')) {
navType = 'discount';
if ($pre.hasClass('coat')) {
navType = 'coat';
} else if ($pre.hasClass('trouser')) {
navType = 'trouser';
} else if ($pre.hasClass('shoes')) {
navType = 'shoes';
} else {
navType = 'other';
}
nav = navInfo[navType];
... ... @@ -167,6 +180,8 @@ function search(opt) {
searching = true;
loading.showLoadingMask();
console.log(setting);
$.ajax({
type: 'GET',
url: '/product/sale/search',
... ... @@ -175,19 +190,18 @@ function search(opt) {
var $container,
num;
console.log(data);
switch (navType) {
case 'newest':
$container = $ngc;
case 'coat':
$container = $coatGc;
break;
case 'price':
$container = $pgc;
case 'trouser':
$container = $trouserGc;
break;
case 'discount':
$container = $dgc;
case 'shoes':
$container = $shoesgc;
break;
default:
$container = $othergc;
break;
}
... ... @@ -262,7 +276,7 @@ $listNav.bind('contextmenu', function() {
$listNav.on('touchend touchcancel', function(e) {
var $this = $(e.target).closest('li'),
nav;
nav, sortId, navType, $active;
e.preventDefault();
... ... @@ -288,18 +302,66 @@ $listNav.on('touchend touchcancel', function(e) {
filter.showFilter();
}
} else {
if ($this.hasClass('coat')) {
navType = 'coat';
} else if ($this.hasClass('trouser')) {
navType = 'trouser';
} else if ($this.hasClass('shoes')) {
navType = 'shoes';
} else {
navType = 'other';
}
nav = navInfo[navType];
if ($this.hasClass('active')) {
nav.reload = true;
return;
} else {
$this.siblings().removeClass('active');
$active = $this.siblings('.active');
$pre = $this; // $pre为除筛选导航的其他导航项,若当前active的为筛选,则把$pre置为当前点击项
if ($active.hasClass('filter')) {
// 若之前active项为筛选,则隐藏筛选面板
filter.hideFilter();
} else {
// 切换container显示
$goodsContainer.children('.container:not(.hide)').addClass('hide');
switch (navType) {
case 'coat':
$coatGc.removeClass('hide');
break;
case 'trouser':
$trouserGc.removeClass('hide');
break;
case 'shoes':
$shoesgc.removeClass('hide');
break;
default:
$othergc.removeClass('hide');
break;
}
}
$active.removeClass('active');
$this.addClass('active');
sortId = $this.data('id');
$('.swiper-container').hide();
$('#size-swiper-' + $this.index()).show();
swipers[$this.index()].onResize();
}
if (nav.reload) {
search();
search({
type: 'sort',
id: sortId
});
}
}
e.stopPropagation();
... ... @@ -322,7 +384,10 @@ $(window).scroll(function() {
});
// 初始请求最新第一页数据
search();
search({
type: 'sort',
id: $('.coat').data('id')
});
$listNav.on('touchstart', 'li', function() {
$(this).addClass('bytouch');
... ...
... ... @@ -164,8 +164,6 @@ function search(opt) {
var $container,
num;
console.log(data);
switch (navType) {
case 'newest':
$container = $ngc;
... ...
... ... @@ -17,8 +17,8 @@ lazyLoad($('img.lazy'));
// 倒计时
function getRTime() {
var anHour = 3600000,
anMinute = 60000,
anSecond = 1000,
aMinute = 60000,
aSecond = 1000,
showTime = '',
d = 0,
h = 0,
... ... @@ -30,15 +30,19 @@ function getRTime() {
if (endTime > 1000) {
d = Math.floor(endTime / anHour / 24);
h = Math.floor(endTime / anHour % 24);
m = Math.floor(endTime / anMinute % 60);
s = Math.floor(endTime / anSecond % 60);
m = Math.floor(endTime / aMinute % 60);
s = Math.floor(endTime / aSecond % 60);
}
showTime += d > 0 ? d + '天' : '';
showTime += d > 0 ? d + '天' : '';
showTime += h > 0 ? h + '小时' : '';
showTime += m > 0 ? m + '分钟' : '';
showTime += s > 0 ? s + '秒' : '';
if (showTime.length !== '') {
showTime = '剩' + showTime;
}
$activityTime.find('span').html(showTime);
$activityTime.attr('data-time-ms', endTime);
... ...
require('./search');
... ...