Authored by yyq

sale vip

... ... @@ -10,8 +10,6 @@ const mRoot = '../models';
const sale = require(`${mRoot}/sale`); // sale model
const detailHelper = require(`${mRoot}/detail-helper`);
const channelList = ['boys', 'girls', 'kids', 'lifestyle'];
/**
* sale 首页
* @param {[type]} req [description]
... ... @@ -19,12 +17,7 @@ const channelList = ['boys', 'girls', 'kids', 'lifestyle'];
* @return {[type]} [description]
*/
exports.index = (req, res, next) => {
let channel = req.yoho.channel;
// SEO url 改造
if (req.params && req.params[0] && channelList.indexOf(req.params[0]) > -1) {
channel = req.params[0];
}
let channel = req.query.channel || req.yoho.channel;
// 真实数据输出
req.ctx(sale).getSaleIndexData(channel).then(result => {
... ... @@ -79,7 +72,7 @@ exports.vip = (req, res, next) => {
saleType: '2'
}, req.query);
let channel = req.yoho.channel;
let channel = req.query.channel || req.yoho.channel;
params.uid = req.user.uid || 0;
... ...
... ... @@ -10,7 +10,10 @@
'use strict';
const _ = require('lodash');
const helpers = global.yoho.helpers;
const queryString = require('querystring');
const parameter = require(`${global.utils}/parameter`);
const handleStaticFilterUrl = parameter.fullParamToMinPath;
/**
... ... @@ -206,7 +209,7 @@ const handleBrandCheckedData = (params, origin) => {
* @param extra 什么都可以传进来,多个参数传Object
* @returns {{}}
*/
exports.handleSaleOptsData = (params, total, extra) => {
exports.handleSaleOptsData = (params, total, extra, baseUrl) => {
let dest = {
sortType: []
};
... ... @@ -217,7 +220,7 @@ exports.handleSaleOptsData = (params, total, extra) => {
if (extra === 'default') {
let defaultOpt = {};
defaultOpt.href = handleFilterUrl(params, {order: ''});
defaultOpt.href = handleStaticFilterUrl(baseUrl, params, {}, {order: true});
defaultOpt.name = '默认';
defaultOpt.hasSortOrient = true;
if (_.isEmpty(params.order)) {
... ... @@ -229,12 +232,14 @@ exports.handleSaleOptsData = (params, total, extra) => {
dest.sortType.push(defaultOpt);
}
const orderHref = handleStaticFilterUrl(baseUrl, params, {order: '{order}'});
for (let i = 0; i < count; i++) {
let opt = {};
switch (i) {
case 0:
opt.href = handleFilterUrl(params, {order: 's_t_desc'});
opt.href = orderHref.replace('{order}', 's_t_desc');
if (extra === 'discont') { // 如果是折扣专场
opt.name = '全部';
if (_.isEmpty(params.order) || params.order === 's_t_desc') {
... ... @@ -254,16 +259,16 @@ exports.handleSaleOptsData = (params, total, extra) => {
break;
case 1:
if (params.order !== 's_p_desc' && params.order !== 's_p_asc') {
opt.href = handleFilterUrl(params, {order: 's_p_desc'});
opt.href = orderHref.replace('{order}', 's_p_desc');
opt.hasSortOrient = true;
} else {
opt.hasSortOrient = true;
opt.active = true;
if (params.order === 's_p_desc') {
opt.href = handleFilterUrl(params, {order: 's_p_asc'});
opt.href = orderHref.replace('{order}', 's_p_asc');
opt.desc = false;
} else {
opt.href = handleFilterUrl(params, {order: 's_p_desc'});
opt.href = orderHref.replace('{order}', 's_p_desc');
opt.desc = true;
}
}
... ... @@ -272,16 +277,16 @@ exports.handleSaleOptsData = (params, total, extra) => {
break;
case 2:
if (params.order !== 'p_d_desc' && params.order !== 'p_d_asc') {
opt.href = handleFilterUrl(params, {order: 'p_d_desc'});
opt.href = orderHref.replace('{order}', 'p_d_desc');
opt.hasSortOrient = true;
} else {
opt.hasSortOrient = true;
opt.active = true;
if (params.order === 'p_d_desc') {
opt.href = handleFilterUrl(params, {order: 'p_d_asc'});
opt.href = orderHref.replace('{order}', 'p_d_asc');
opt.desc = false;
} else {
opt.href = handleFilterUrl(params, {order: 'p_d_desc'});
opt.href = orderHref.replace('{order}', 'p_d_desc');
opt.desc = true;
}
}
... ... @@ -290,16 +295,16 @@ exports.handleSaleOptsData = (params, total, extra) => {
break;
case 3:
if (params.order !== 's_n_desc' && params.order !== 's_n_asc') {
opt.href = handleFilterUrl(params, {order: 's_n_desc'});
opt.href = orderHref.replace('{order}', 's_n_desc');
opt.hasSortOrient = true;
} else {
opt.hasSortOrient = true;
opt.active = true;
if (params.order === 's_n_desc') {
opt.href = handleFilterUrl(params, {order: 's_n_asc'});
opt.href = orderHref.replace('{order}', 's_n_asc');
opt.desc = false;
} else {
opt.href = handleFilterUrl(params, {order: 's_n_desc'});
opt.href = orderHref.replace('{order}', 's_n_desc');
opt.desc = true;
}
}
... ... @@ -313,15 +318,17 @@ exports.handleSaleOptsData = (params, total, extra) => {
dest.sortType.push(opt);
}
const limitHref = handleStaticFilterUrl(baseUrl, params, {limit: '{limit}'});
// 上下翻页数据处理
dest.pageCounts = [{
href: handleFilterUrl(params, {limit: 200}),
href: limitHref.replace('{limit}', 200),
count: 200
}, {
href: handleFilterUrl(params, {limit: 100}),
href: limitHref.replace('{limit}', 100),
count: 100
}, {
href: handleFilterUrl(params, {limit: 60}),
href: limitHref.replace('{limit}', 60),
count: 60
}];
... ... @@ -341,14 +348,16 @@ exports.handleSaleOptsData = (params, total, extra) => {
parseInt(params.page, 10) - 1 : 1;
let nextHref = (!_.isEmpty(params.page)) ? parseInt(params.page, 10) + 1 : 2;
const pageHref = handleStaticFilterUrl(baseUrl, params, {page: '{page}'});
if (dest.pageCount > 1 && (parseInt(params.page, 10) !== 1) &&
(parseInt(params.page, 10) !== dest.pageCount)) {
dest.preHref = handleFilterUrl(params, {page: preHref});
dest.nextHref = handleFilterUrl(params, {page: nextHref});
dest.preHref = pageHref.replace('{page}', preHref);
dest.nextHref = pageHref.replace('{page}', nextHref);
} else if (dest.pageCount > 1 && (parseInt(params.page, 10) === 1)) {
dest.nextHref = handleFilterUrl(params, {page: nextHref});
dest.nextHref = pageHref.replace('{page}', nextHref);
} else if (dest.pageCount > 1 && (parseInt(params.page, 10) === dest.pageCount)) {
dest.preHref = handleFilterUrl(params, {page: preHref});
dest.preHref = pageHref.replace('{page}', preHref);
}
// 全部商品数
... ... @@ -373,7 +382,7 @@ exports.handleSaleOptsData = (params, total, extra) => {
* @param extra 可以任意传值用来处理特殊情况
* @returns {{}}
*/
exports.handleSaleSortData = (origin, params, extra) => {
exports.handleSaleSortData = (origin, params, extra, baseUrl) => {
let leftContent = {};
leftContent.allSort = {};
... ... @@ -390,23 +399,24 @@ exports.handleSaleSortData = (origin, params, extra) => {
leftContent.allSort.all = {
name: '全部品类',
href: handleFilterUrl(tempParams, {sort: ''}),
href: handleStaticFilterUrl(baseUrl, tempParams, {}, {sort: true}),
active: _.isEmpty(params.sort)
};
} else {
leftContent.allSort.all = {
name: '全部品类',
href: handleFilterUrl(params, {sort: ''})
href: handleStaticFilterUrl(baseUrl, params, {}, {sort: true})
};
}
_.forEach(origin, value => {
const sortHref = handleStaticFilterUrl(baseUrl, params, {sort: '{sort}'});
_.forEach(origin, value => {
let category = {
name: value.category_name,
num: value.node_count,
childList: [],
href: handleFilterUrl(params, {sort: value.relation_parameter.sort}),
href: sortHref.replace('{sort}', value.relation_parameter.sort),
active: params.sort === value.relation_parameter.sort
};
... ... @@ -414,13 +424,13 @@ exports.handleSaleSortData = (origin, params, extra) => {
category.childList.push({
name: subValue.category_name,
num: subValue.node_count,
href: handleFilterUrl(params, {sort: subValue.relation_parameter.sort}),
href: sortHref.replace('{sort}', subValue.relation_parameter.sort),
childActive: params.sort === subValue.relation_parameter.sort
});
if (params.sort === subValue.relation_parameter.sort) {
category.active = true;
}
});
leftContent.allSort.list.push(category);
... ... @@ -435,7 +445,7 @@ exports.handleSaleSortData = (origin, params, extra) => {
* @param params 当前 URL 中已有的参数,处理选中状态使用
* @returns {{}}
*/
exports.handleSaleFilterData = (origin, params) => {
exports.handleSaleFilterData = (origin, params, baseUrl) => {
let dest = {
brand: {
default: [],
... ... @@ -482,7 +492,7 @@ exports.handleSaleFilterData = (origin, params) => {
checked: (typeof _.find(intBrands, o => {
return _.isEqual(o, value.id);
}) !== 'undefined'),
href: handleFilterUrl(params, {brand: value.id}),
href: handleStaticFilterUrl(baseUrl, params, {brand: value.id}),
name: value.brand_name,
key: value.brand_domain,
id: value.id
... ... @@ -525,7 +535,7 @@ exports.handleSaleFilterData = (origin, params) => {
}
let price = {
checked: params.price === key,
href: handleFilterUrl(params, {price: key}),
href: handleStaticFilterUrl(baseUrl, params, {price: key}),
name: value
};
... ... @@ -544,7 +554,7 @@ exports.handleSaleFilterData = (origin, params) => {
};
dest.checkedConditions.conditions.push({
name: '¥ ' + customPrice[0] + '-' + customPrice[1],
href: handleFilterUrl(params, {price: ''})
href: handleStaticFilterUrl(baseUrl, params, {price: ''})
});
}
}
... ... @@ -552,11 +562,11 @@ exports.handleSaleFilterData = (origin, params) => {
// 处理性别数据
dest.gender = [{
name: 'BOYS',
href: handleFilterUrl(params, {gender: '1,3'}),
href: handleStaticFilterUrl(baseUrl, params, {gender: '1,3'}),
checked: params.gender === '1,3'
}, {
name: 'GIRLS',
href: handleFilterUrl(params, {gender: '2,3'}),
href: handleStaticFilterUrl(baseUrl, params, {gender: '2,3'}),
checked: params.gender === '2,3'
}];
... ... @@ -582,7 +592,7 @@ exports.handleSaleFilterData = (origin, params) => {
_.forEach(origin.size, value => {
dest.size.push({
checked: parseInt(params.size, 10) === parseInt(value.size_id, 10),
href: handleFilterUrl(params, {
href: handleStaticFilterUrl(baseUrl, params, {
size: value.size_id
}),
name: value.size_name
... ... @@ -591,7 +601,7 @@ exports.handleSaleFilterData = (origin, params) => {
} else {
dest.size.push({
checked: parseInt(params.size, 10) === parseInt(origin.size.size_id, 10),
href: handleFilterUrl(params, {
href: handleStaticFilterUrl(baseUrl, params, {
size: origin.size.size_id
}),
name: origin.size.size_name
... ... @@ -609,7 +619,7 @@ exports.handleSaleFilterData = (origin, params) => {
_.forEach(dest.ageLevel, item => {
item.href = handleFilterUrl(params, {age_level: item.id});
item.href = handleStaticFilterUrl(baseUrl, params, {age_level: item.id});
item.checked = params.age_level === item.id;
... ... @@ -626,7 +636,7 @@ exports.handleSaleFilterData = (origin, params) => {
if (params.id) {
remainParams.id = params.id;
}
dest.checkedConditions.clearUrl = '?' + queryString.stringify(remainParams);
dest.checkedConditions.clearUrl = handleStaticFilterUrl(baseUrl, remainParams);
// 处理频道筛选数据
dest.checkedConditions.conditions = _.union(dest.checkedConditions.conditions,
... ...
... ... @@ -16,6 +16,7 @@ const SearchApiModel = require('./search-api');
const publicHandler = require('./public-handler');
const saleHandler = require('./sale-handler');
const searchHandler = require('./search-handler');
const listHandler = require('./list-handler');
const productProcess = require(`${global.utils}/product-process`);
const pager = require(`${global.utils}/pager`).setPager;
const imageHandler = require(`${global.utils}/images`).getImageUrl;
... ... @@ -57,7 +58,6 @@ const contentCode = {
}
};
/**
* 获取Sale首页商品列表数据 仅 Ajax 调用 Controller 调用
* @return {[type]} [description]
... ... @@ -228,10 +228,12 @@ function getSaleIndexData(channel) {
* @return {[type]} [description]
*/
function getSaleOthersData(params, channel) {
let promiseObject;
let baseUrl = `/${_.toLower(channel)}-sale`;
// saleType: 1表示断码区,2表示会员专区,3 折扣专区,4表示奥莱,0最新降价
//
if (!_.isEmpty(params)) {
if (params.saleType === '2') {
promiseObject = [
... ... @@ -241,6 +243,7 @@ function getSaleOthersData(params, channel) {
this.saleApi.getSaleGoodsList({saleType: '2', limit: '1', channel: channel}),
this.saleApi.getUserProfile(params.uid)
];
baseUrl += '/vip';
} else {
promiseObject = [
headerModel.requestHeaderData(channel),
... ... @@ -260,13 +263,13 @@ function getSaleOthersData(params, channel) {
if (!_.isEmpty(result[1].data.filter)) {
// 顶部筛选条件
finalResult.filters = publicHandler.handleSaleFilterData(result[1].data.filter, params);
finalResult.filters = publicHandler.handleSaleFilterData(result[1].data.filter, params, baseUrl);
}
// 处理排序数据
finalResult.opts = publicHandler.handleSaleOptsData(params, result[1].data.total);
finalResult.opts = publicHandler.handleSaleOptsData(params, result[1].data.total, baseUrl);
finalResult.totalCount = result[1].data.total;
finalResult.footPager = publicHandler.handlePagerData(result[1].data.total, params);
finalResult.footPager = listHandler.handlePagerData(finalResult.totalCount, params, true, baseUrl);
// 处理所有商品标题数据
finalResult.saleTitle = {
... ... @@ -295,7 +298,8 @@ function getSaleOthersData(params, channel) {
if (result[3].code === 200) {
// 获取左侧类目数据
finalResult.leftContent = publicHandler.handleSaleSortData(result[3].data.filter.group_sort, params);
finalResult.leftContent = publicHandler.handleSaleSortData(result[3].data.filter.group_sort,
params, '', baseUrl);
}
... ...
... ... @@ -55,9 +55,9 @@ const shop = require(`${cRoot}/shop`);
// 商品促销routers
router.get('/sale', sale.index); // sale 首页
router.get(/\/(.*)-sale/, sale.index); // sale 首页(SEO改造)
router.get('/sale/discount/detail', sale.discount); // 折扣专场详情页
router.get('/sale/vip', sale.vip); // VIP 活动专区
router.get('/sale/vip/:pathQs', paramParse, sale.vip); // VIP 活动专区
router.get('/sale/discount/detail', sale.discount); // 折扣专场详情页
router.get('/sale/breakingYards', sale.breakingYards); // 断码区
router.get('/sale/newSale', sale.newSale); // 最新降价
router.get('/sale/special/detail', sale.special); // sale活动页 原PHP sale.yohobuy.com
... ...
... ... @@ -20,6 +20,13 @@ module.exports = [
},
{
type: TYPE.redirect,
origin: /^\/product\/(boys|girls|kids|lifestyle)-sale(.*)$/,
target: (req, match, channel, url) => {
return helpers.urlFormat(`/${channel}-sale${url}`);
}
},
{
type: TYPE.redirect,
origin: '/product/sale/?msort=10',
target: helpers.urlFormat('/product/lifestyle-sale/')
},
... ... @@ -173,11 +180,13 @@ module.exports = [
// sale页
{
type: TYPE.rewrite,
origin: /^\/(boys|girls|kids|lifestyle)-sale(\/*)$/,
target: (req) => {
return `/product/${req.url}`;
origin: /^\/(boys|girls|kids|lifestyle)-sale(.*)$/,
target: (req, match, channel, url) => {
req.query.channel = channel;
return `/product/sale${url}`;
}
},
{
type: TYPE.rewrite,
origin: /^\/shop([\d]+)-about/,
... ...
... ... @@ -41,6 +41,7 @@ const minToFullMap = {
si: 'specialsale_id',
sn: 'sort_name',
so: 'sort',
sp: 'saleType',
st: 'style',
sz: 'size',
tp: 'type'
... ...