Authored by 周少峰

sort list

/*
* @Author: Targaryen
* @Date: 2016-05-21 10:59:20
* @Last Modified by: Targaryen
* @Last Modified time: 2016-06-08 13:37:17
* @Author: sefon
* @Date: 2016-07-24 11:40:21
*/
'use strict';
const mRoot = '../models';
// list 页 model
const list = require(`${mRoot}/list`);
const headerModel = require('../../../doraemon/models/header');
exports.getProductPic = (req, res) => {
res.jsonp();
};
/**
* 商品列表页
* 商品分类列表页
* @param {[type]} req [description]
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.index = (req, res, next) => {
let params = Object.assign({
order: 's_t_asc,s_s_asc'
}, req.query);
let resData = {};
let channel = req.query.channel || req.cookies._Channel || 'boys';
params.uid = req.user.uid || 0;
let responseData = {
module: 'product',
page: 'sale',
footerTop: true
};
list.getListData(req.query).then(result => {
Object.assign(resData, result);
res.render('list/index', resData);
}).catch(next);
let headerData = {};
};
headerModel.requestHeaderData(channel).then(result => {
headerData = result.headerData;
});
/**
* 新品到着
* @param {[type]} req [description]
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.new = (req, res, next) => {
let resData = {};
list.getSaleOthersData(params, channel).then((result) => {
responseData.saleList = result;
responseData.resultShow = JSON.stringify(result, null, 4);
responseData.headerData = headerData;
res.render('sale/other', responseData);
list.getListData(req.query).then(result => {
Object.assign(resData, result);
res.render('list/index', resData);
}).catch(next);
};
... ...
/*
* @Author: Targaryen
* @Date: 2016-05-21 10:59:20
* @Last Modified by: Targaryen
* @Last Modified time: 2016-06-08 13:37:17
*/
'use strict';
const mRoot = '../models';
// list 页 model
const list = require(`${mRoot}/outletsList`);
const headerModel = require('../../../doraemon/models/header');
exports.getProductPic = (req, res) => {
res.jsonp();
};
/**
* 商品列表页
* @param {[type]} req [description]
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.index = (req, res, next) => {
let params = Object.assign({
order: 's_t_asc,s_s_asc'
}, req.query);
let channel = req.query.channel || req.cookies._Channel || 'boys';
params.uid = req.user.uid || 0;
let responseData = {
module: 'product',
page: 'sale',
footerTop: true
};
let headerData = {};
headerModel.requestHeaderData(channel).then(result => {
headerData = result.headerData;
});
list.getListData(params, channel).then((result) => {
responseData.saleList = result;
responseData.resultShow = JSON.stringify(result, null, 4);
responseData.headerData = headerData;
res.render('sale/other', responseData);
}).catch(next);
};
... ...
... ... @@ -17,7 +17,6 @@ const search = require(`${mRoot}/search`);
exports.index = (req, res, next) => {
let resData = {};
// req.cookie._channel;//频道
search.getSearchData(req.query).then(result => {
Object.assign(resData, result);
res.render('search/index', resData);
... ...
/*
* @Author: Targaryen
* @Date: 2016-06-02 15:11:15
* @Last Modified by: Targaryen
* @Last Modified time: 2016-06-08 14:57:54
* @Author: sefon
* @Date: 2016-07-24 11:48:22
*/
'use strict';
const utils = '../../../utils';
const api = global.yoho.API;
const saleApi = require('./sale-api');
const outletsApi = require('./outlets-api');
const searchApi = require('./search-api');
const headerModel = require('../../../doraemon/models/header');
const productProcess = require(`${utils}/product-process`);
const publicHandler = require('./public-handler');
const searchHandler = require('./search-handler');
// 搜索分类信息需要的参数
const positionId = 10;
/**
* 获取商品列表商品数据 Controller 调用
* @param {[type]} params [常规参数]
* @param {[type]} extra [左侧列表额外要拼接的参数]
* @return {[type]} [description]
* 获取商品分类列表数据
*/
exports.getListData = (params, channel) => {
let apiArr = [];
if (params.productPool) {
// 奥莱活动页调用app.search.sales
apiArr = [
saleApi.getSaleGoodsList({limit: '1', channel: channel }),
saleApi.getSaleGoodsList(Object.assign(params, { channel: channel }))
];
} else {
// 奥莱品类页调用app.search.li
apiArr = [
outletsApi.getOutletsGoodsList({limit: '1', channel: channel }),
outletsApi.getOutletsGoodsList(Object.assign(params, { channel: channel }))
];
}
return api.all(apiArr).then(result => {
let finalResult = {};
exports.getListData = (params) => {
// 调用接口
let apiMethod = [
headerModel.requestHeaderData(),
searchApi.getSortList(),
searchApi.getProductList(params)
];
// 获取商品数据和顶部筛选条件
if (result[0].code === 200) {
finalResult.leftContent = publicHandler.handleSaleSortData(result[0].data.filter.group_sort, params);
finalResult.pathNav = publicHandler.handlePathNavData(result[0].data.filter.group_sort, params);
// 搜索分类介绍和广告
if (params.msort && params.misort) {
let IntroParams = {
position_id: positionId,
max_sort_id: params.msort,
middle_sort_id: params.misort,
gender: params.gender || '1,3'
};
}
apiMethod.push(searchApi.getSortIntro(IntroParams));
apiMethod.push(searchApi.getSortAds(IntroParams));
}
return api.all(apiMethod).then(result => {
let finalResult = {
headerData: Object.assign(result[0].headerData, {
header: true
}),
search: {}
};
// 获取左侧类目数据
if (result[1].code === 200) {
Object.assign(finalResult, {
filters: publicHandler.handleSaleFilterData(result[1].data.filter, params),
opts: publicHandler.handleSaleOptsData(params, result[1].data.total),
totalCount: result[1].data.total,
footPager: publicHandler.handlePagerData(result[1].data.total, params),
goods: productProcess.processProductList(result[1].data.product_list)
finalResult.search = {
leftContent: searchHandler.handleSortData(result[1].data.sort, params),
pathNav: searchHandler.handlePathNavData(result[1].data.sort, params, 'sort')
};
}
// 获取商品数据和顶部筛选条件
if (result[2].code === 200) {
Object.assign(finalResult.search, {
filters: searchHandler.handleFilterData(result[2].data.filter, params),
opts: searchHandler.handleOptsData(params, result[2].data.total, result[2].data.filter),
totalCount: result[2].data.total,
footPager: searchHandler.handlePagerData(result[2].data.total, params),
goods: productProcess.processProductList(result[2].data.product_list,
Object.assign({showDiscount: false}, params))
});
}
// 分类介绍
if (result[3] && result[3].code === 200) {
finalResult.sortIntro = searchHandler.handleSortIntro(result[3].data);
}
// 分类广告
if (result[4] && result[4].code === 200) {
finalResult.sortIntro = searchHandler.handleSortAds(result[4].data);
}
return finalResult;
});
};
... ...
/*
* @Author: Targaryen
* @Date: 2016-06-02 15:11:15
* @Last Modified by: Targaryen
* @Last Modified time: 2016-06-08 14:57:54
*/
'use strict';
const utils = '../../../utils';
const api = global.yoho.API;
const saleApi = require('./sale-api');
const outletsApi = require('./outlets-api');
const productProcess = require(`${utils}/product-process`);
const publicHandler = require('./public-handler');
/**
* 获取商品列表商品数据 Controller 调用
* @param {[type]} params [常规参数]
* @param {[type]} extra [左侧列表额外要拼接的参数]
* @return {[type]} [description]
*/
exports.getListData = (params, channel) => {
let apiArr = [];
if (params.productPool) {
// 奥莱活动页调用app.search.sales
apiArr = [
saleApi.getSaleGoodsList({limit: '1', channel: channel }),
saleApi.getSaleGoodsList(Object.assign(params, { channel: channel }))
];
} else {
// 奥莱品类页调用app.search.li
apiArr = [
outletsApi.getOutletsGoodsList({limit: '1', channel: channel }),
outletsApi.getOutletsGoodsList(Object.assign(params, { channel: channel }))
];
}
return api.all(apiArr).then(result => {
let finalResult = {};
// 获取商品数据和顶部筛选条件
if (result[0].code === 200) {
finalResult.leftContent = publicHandler.handleSaleSortData(result[0].data.filter.group_sort, params);
finalResult.pathNav = publicHandler.handlePathNavData(result[0].data.filter.group_sort, params);
}
// 获取左侧类目数据
if (result[1].code === 200) {
Object.assign(finalResult, {
filters: publicHandler.handleSaleFilterData(result[1].data.filter, params),
opts: publicHandler.handleSaleOptsData(params, result[1].data.total),
totalCount: result[1].data.total,
footPager: publicHandler.handlePagerData(result[1].data.total, params),
goods: productProcess.processProductList(result[1].data.product_list)
});
}
return finalResult;
});
};
... ...
... ... @@ -13,6 +13,9 @@ const getSortByConditionAsync = (condition) => {
return api.get('sortgroup.json', condition);
};
// 获取list页广告
const adsUrl = 'shops/api/v1/ads/getList';
/**
* 获取商品列表
* @return
... ... @@ -33,8 +36,9 @@ const getProductList = (params) => {
*/
const getSortList = (params) => {
let finalParams = {
// method: 'web.regular.groupsort'
method: 'app.search.li'
method: 'web.regular.groupsort'
// method: 'app.search.li'
};
Object.assign(finalParams, params);
... ... @@ -45,16 +49,21 @@ const getSortList = (params) => {
* 获取分类图文介绍
* @return
*/
const getSortIntroList = (params) => {
return yohoApi.get('', params);
const getSortIntro = (params) => {
let finalParams = {
method: 'web.search.banner'
};
Object.assign(finalParams, params);
return yohoApi.get('', finalParams);
};
/**
* 获取分类左侧广告
* 获取分类广告
* @return
*/
const getSortads = (params) => {
return yohoApi.get('', params);
const getSortAds = (params) => {
return yohoApi.get(adsUrl, params);
};
/**
... ... @@ -92,8 +101,8 @@ module.exports = {
getSortByConditionAsync,
getProductList,
getSortList,
getSortIntroList,
getSortads,
getSortIntro,
getSortAds,
getBrandFolder,
getWeekNew,
getBrandShop
... ...
... ... @@ -48,10 +48,10 @@ const handleFilterUrl = (originParam, newParam) => {
const handleCheckedData = (params, origin, param) => {
let dest = [];
// 品牌选中数据
if (!_.isEmpty(origin)) {
_.forEach(origin, value => {
if (value.checked) {
console.log(value);
let tempPatam = {};
tempPatam[param] = '';
... ... @@ -63,7 +63,6 @@ const handleCheckedData = (params, origin, param) => {
}
});
}
return dest;
};
... ... @@ -331,7 +330,7 @@ exports.handleOptsData = (params, total, extra) => {
* @param extra 可以任意传值用来处理特殊情况
* @returns {{}}
*/
exports.handleSortData = (origin, params, extra) => {
exports.handleSortData = (origin, params) => {
let leftContent = {};
leftContent.allSort = {};
... ... @@ -341,41 +340,47 @@ exports.handleSortData = (origin, params, extra) => {
// delete params.msort;
// delete params.misort;
if (extra === 'discount') {
let tempParams = _.cloneDeep(params);
// if (extra === 'discount') {
// let tempParams = _.cloneDeep(params);
delete tempParams.sort;
// delete tempParams.sort;
leftContent.allSort.all = {
name: '全部品类',
href: handleFilterUrl(tempParams, {sort: ''}),
active: _.isEmpty(params.sort)
};
} else {
leftContent.allSort.all = {
name: '全部品类',
href: handleFilterUrl(params, {sort: ''})
};
}
// leftContent.allSort.all = {
// name: '全部品类',
// href: handleFilterUrl(tempParams, {sort: ''}),
// active: _.isEmpty(params.sort)
// };
// } else {
// leftContent.allSort.all = {
// name: '全部品类',
// href: handleFilterUrl(params, {sort: ''})
// };
// }
_.forEach(origin, value => {
let category = {
name: value.category_name,
num: value.node_count,
childList: [],
href: handleFilterUrl(params, {sort: value.relation_parameter.sort}),
active: params.sort === value.relation_parameter.sort
name: value.sort_name,
num: value.count,
childList: [
{
name: '全部' + value.sort_name,
num: value.count,
href: handleFilterUrl(params, {msort: value.sort_id}),
childActive: params.misort === value.sort_id
}
],
href: handleFilterUrl(params, {msort: value.sort_id}),
active: params.msort === value.sort_id
};
_.forEach(value.sub, subValue => {
category.childList.push({
name: subValue.category_name,
num: subValue.node_count,
href: handleFilterUrl(params, {sort: subValue.relation_parameter.sort}),
childActive: params.sort === subValue.relation_parameter.sort
name: subValue.sort_name,
num: subValue.count,
href: handleFilterUrl(params, {msort: value.sort_id, misort: subValue.sort_id}),
childActive: params.misort === subValue.sort_id
});
if (params.sort === subValue.relation_parameter.sort) {
if (params.misort === subValue.sort_id) {
category.active = true;
}
... ... @@ -551,29 +556,40 @@ exports.handleFilterData = (origin, params) => {
// 处理颜色筛选数据
if (!_.isEmpty(origin.color)) {
_.forEach(origin.color, (value, key) => {
_.forEach(origin.color, (value) => {
let color = {
checked: params.price === key,
checked: parseInt(params.color, 10) === parseInt(value.color_id, 10),
href: handleFilterUrl(params, {color: value.color_id}),
name: value.color_name,
rgb: value.color_value ? 'url(' + value.color_value + ')' : '#' + value.color_code
};
// 处理颜色选中数据
if (color.checked) {
dest.checkedConditions.conditions.push(color);
}
dest.color.push(color);
});
}
//处理年龄段
// 处理年龄段
if (!_.isEmpty(origin.ageLevel)) {
_.forEach(origin.ageLevel, (value, key) => {
_.forEach(origin.ageLevel, (value) => {
let ageLevel = {
checked: params.ageLevel === key,
checked: params.ageLevel === value.id,
href: handleFilterUrl(params, {ageLevel: value.id}),
name: value.name
};
// 处理颜色年龄段数据
if (ageLevel.checked) {
dest.checkedConditions.conditions.push(ageLevel);
}
dest.ageLevel.push(ageLevel);
});
console.log(dest.ageLevel);
}
// 清除所有选中数据
... ... @@ -647,23 +663,23 @@ exports.handlePathNavData = (data, params, page) => {
default :
// 分类
_.forEach(data, (sort) => {
if (sort.relation_parameter.sort === params.sort) {
if (sort.sort_id === params.msort) {
console.log(params.msort);
pathNav.push({
name: sort.category_name,
pathTitle: sort.category_name
name: sort.sort_name,
href: helpers.urlFormat('/product/outlets/list', {msort: sort.sort_id}),
pathTitle: sort.sort_name
});
}
if (!_.isEmpty(sort.sub)) {
_.forEach(sort.sub, misort => {
if (misort.relation_parameter.sort === params.sort) {
if (misort.sort_id === params.misort) {
pathNav.push({
href: helpers.urlFormat('/product/outlets/list', {sort: sort.relation_parameter.sort}),
name: sort.category_name,
pathTitle: sort.category_name
}, {
name: misort.category_name,
pathTitle: misort.category_name
name: misort.sort_name,
pathTitle: misort.sort_name
});
}
});
}
... ... @@ -784,6 +800,44 @@ exports.handlePagerData = (total, params) => {
};
/**
* 处理分类介绍
* @type {[type]}
*/
exports.handleSortIntro = (data, params) => {
let sortIntro = {
name: data.title,
enName: data.subtitle,
description: data.intro,
img: data.logo,
keyEntry: []
};
_.forEach(data.keyword, function(value) {
sortIntro.keyEntry.push({
name: value.word,
url: helpers.urlFormat(value.url, params)
});
});
return sortIntro;
};
/**
* 处理分类页左侧广告
* @type {[type]}
*/
exports.handleSortAds = (data, params) => {
let sortAds = {
data: data,
params: params
};
return sortAds;
};
/**
* 筛选类链接处理的对外接口
* @type {[type]}
*/
... ...
... ... @@ -41,7 +41,7 @@ exports.getSearchData = (params) => {
// 获取左侧类目数据
if (result[1].code === 200) {
finalResult.search = {
leftContent: searchHandler.handleSortData(result[1].data.filter.group_sort, params),
leftContent: searchHandler.handleSortData(result[1].data.sort, params),
pathNav: searchHandler.handlePathNavData({total: result[1].data.total }, params, 'search')
};
}
... ...
... ... @@ -22,6 +22,9 @@ const sale = require(`${cRoot}/sale`);
const outlets = require(`${cRoot}/outlets`);
// 商品促销controller
const outletsList = require(`${cRoot}/outletsList`);
// 商品分类列表
const list = require(`${cRoot}/list`);
// 搜索页
... ... @@ -42,18 +45,23 @@ router.get('/outlets/special/detail', outlets.special); // 奥莱活动页
router.get('/outlets/list', outlets.list); // 奥莱品类页
router.get('/outlets/:channel', outlets.channel); // 奥莱频道页
// 商品列表页
router.get('/list', list.index); // 商品列表页
// 商品分类列表页
router.get('/list', outletsList.index);
router.get(/\/pro_([\d]+)_([\d]+)\/(.*)/, detail.showMain); // 商品详情routers
router.get('/detail/comment', detail.indexComment);// 商品评论
router.get('/detail/consult', detail.indexConsult);// 商品咨询
router.post('/detail/consult', detail.createConsult);// 创建咨询
router.get('/detail/hotarea', detail.indexHotArea);// 商品热区
router.post('/index/favoriteBrand', favorite.changeFavoriteBrand);// 收藏品牌
router.post('/item/togglecollect', favorite.collectProduct); //收藏商品
router.post('/item/togglecollect', favorite.collectProduct); // 收藏商品
// 搜索
router.get('/search/index', search.index);
// 商品分类列表页
router.get('/list/index', list.index);
// 新品到着
router.get('/list/new', list.new);
module.exports = router;
... ...
{{> list/list}}
\ No newline at end of file
... ...
<div class="product-page yoho-page">
{{# search}}
<div class="center-content clearfix">
{{# pathNav}}
{{> common/path-nav}}
{{/ pathNav}}
<div class="list-left pull-left">
{{> product/left-content}}
</div>
<div class="list-right pull-right">
{{# sortIntro}}
<div class="sort-intro clearfix">
<div class="texts pull-left">
<p class="name">{{name}}</p>
<p class="en-name">{{enName}}</p>
<p class="desc">{{{description}}}</p>
<div class="key-entry">
{{#each keyEntry}}
<a href="{{url}}">{{name}}</a>
{{/each}}
</div>
</div>
<img class="pull-right img" src="{{img}}">
</div>
{{/ sortIntro}}
{{> list/shop-entry}}
{{> product/standard-content}}
</div>
</div>
{{/search}}
</div>
{{> list/list}}
\ No newline at end of file
... ...
<div class="product-page yoho-page">
{{# search}}
<div class="center-content clearfix">
{{# pathNav}}
{{> common/path-nav}}
{{/ pathNav}}
<div class="list-left pull-left">
{{> product/left-content}}
</div>
<div class="list-right pull-right">
{{# sortIntro}}
<div class="sort-intro clearfix">
<div class="texts pull-left">
<p class="name">{{name}}</p>
<p class="en-name">{{enName}}</p>
<p class="desc">{{{description}}}</p>
<div class="key-entry">
{{#each keyEntry}}
<a href="{{url}}">{{name}}</a>
{{/each}}
</div>
</div>
<img class="pull-right img" src="{{img}}">
</div>
{{/ sortIntro}}
{{> list/shop-entry}}
{{> product/standard-content}}
</div>
</div>
{{/search}}
</div>
... ...
... ... @@ -14,11 +14,14 @@ module.exports = {
port: 6002,
siteUrl: 'http://www.yohobuy.com',
domains: {
api: 'http://api.yoho.yohoops.org',
// api: 'http://devapi.yoho.cn:58078/',
api: 'http://testapi.yoho.cn:28078/',
// api: 'http://testapi.yoho.cn:28078/',
service: 'http://devservice.yoho.cn:58077/',
// service: 'http://devservice.yoho.cn:58077/',
service: 'http://testservice.yoho.cn:28077/',
// service: 'http://testservice.yoho.cn:28077/',
search: 'http://192.168.102.216:8080/yohosearch/'
},
subDomains: {
... ...
/**
* search
* @author: sefon 2016-7-12 15:28:22
*/
var $ = require('yoho-jquery'),
lazyLoad = require('yoho-jquery-lazyload');
var product = require('./index/product');
require('../common');
require('../plugins/filter');
require('../plugins/sort-pager');
product.init(4);
lazyLoad($('img.lazy'), {
failure_limit: 20
});
... ...