Authored by 王水玲

搜索相关代码优化

@@ -29,7 +29,7 @@ const _getResources = (page) => { @@ -29,7 +29,7 @@ const _getResources = (page) => {
29 if (result && result.code === 200) { 29 if (result && result.code === 200) {
30 return resourcesProcess(result.data); 30 return resourcesProcess(result.data);
31 } else { 31 } else {
32 - logger.error('星潮教室页面资源位返回 code 不是 200'); 32 + logger.error('star index resources return code is not 200');
33 return []; 33 return [];
34 } 34 }
35 }); 35 });
@@ -37,7 +37,7 @@ const _getResources = (page) => { @@ -37,7 +37,7 @@ const _getResources = (page) => {
37 37
38 /** 38 /**
39 * 星潮教室首页数据处理 39 * 星潮教室首页数据处理
40 - * @param {[array]} list 40 + * @param {[array]} dataList
41 * @return {[array]} 41 * @return {[array]}
42 */ 42 */
43 const _processIndexData = (dataList) => { 43 const _processIndexData = (dataList) => {
@@ -158,7 +158,7 @@ const getIndexData = () => { @@ -158,7 +158,7 @@ const getIndexData = () => {
158 if (result && result.code === 200) { 158 if (result && result.code === 200) {
159 return _processIndexData(result); 159 return _processIndexData(result);
160 } else { 160 } else {
161 - logger.error('星潮教室首页数据返回 code 不是 200'); 161 + logger.error('get star index data return is not 200');
162 return {}; 162 return {};
163 } 163 }
164 }); 164 });
@@ -183,7 +183,7 @@ const getDetailData = (params, uid) => { @@ -183,7 +183,7 @@ const getDetailData = (params, uid) => {
183 return _processGuangData(result.data.list, true); 183 return _processGuangData(result.data.list, true);
184 } 184 }
185 } else { 185 } else {
186 - logger.error('明星专题文章数据返回 code 不是 200'); 186 + logger.error('get star feature article data return code is not 200');
187 return []; 187 return [];
188 } 188 }
189 }); 189 });
@@ -227,7 +227,7 @@ const getCollocationListData = (params, uid) => { @@ -227,7 +227,7 @@ const getCollocationListData = (params, uid) => {
227 if (result && result.code === 200) { 227 if (result && result.code === 200) {
228 return _processGuangData(result.data.list.artList); 228 return _processGuangData(result.data.list.artList);
229 } else { 229 } else {
230 - logger.error('获取星搭配文章列表返回 code 不是 200'); 230 + logger.error('get Collocation article list return code is not 200');
231 return []; 231 return [];
232 } 232 }
233 }); 233 });
@@ -198,7 +198,6 @@ const _formShopData = (data, shopId, isApp) => { @@ -198,7 +198,6 @@ const _formShopData = (data, shopId, isApp) => {
198 198
199 // 店铺下面的所有分类 199 // 店铺下面的所有分类
200 if (data.shopCategory) { 200 if (data.shopCategory) {
201 - console.log(data.shopCategory);  
202 let total = data.shopCategory.length; 201 let total = data.shopCategory.length;
203 let shopCategory = { 202 let shopCategory = {
204 list: [] 203 list: []
@@ -278,8 +277,6 @@ const _baseShop = (req, res, data) => { @@ -278,8 +277,6 @@ const _baseShop = (req, res, data) => {
278 Promise.all([listModel.getShopDecorator(data.shopsId), listModel.getShopBrands(data.shopsId)]).then((result) => { 277 Promise.all([listModel.getShopDecorator(data.shopsId), listModel.getShopBrands(data.shopsId)]).then((result) => {
279 result[0] = result[0] || {}; 278 result[0] = result[0] || {};
280 279
281 - console.log(result[0], result[1]);  
282 -  
283 _.forEach(result[0], (item) => { 280 _.forEach(result[0], (item) => {
284 if (item.resourceName === 'shopTopBanner_base') { 281 if (item.resourceName === 'shopTopBanner_base') {
285 let banner = JSON.parse(item.resourceData); 282 let banner = JSON.parse(item.resourceData);
@@ -383,8 +380,8 @@ const category = (req, res) => { @@ -383,8 +380,8 @@ const category = (req, res) => {
383 // 品牌|店铺落地页 380 // 品牌|店铺落地页
384 const brand = (req, res, next) => { 381 const brand = (req, res, next) => {
385 let params = Object.assign({}, req.query); 382 let params = Object.assign({}, req.query);
386 - let domain = 'colormad';  
387 - let uid = req.user.uid || 20000032; 383 + let domain = req.query.domain || 'colormad';
  384 + let uid = req.user.uid;
388 let brandId = 0; 385 let brandId = 0;
389 let brandLogo = {}; 386 let brandLogo = {};
390 let title = ''; 387 let title = '';
@@ -486,13 +483,15 @@ const shopIntro = (req, res, next) => { @@ -486,13 +483,15 @@ const shopIntro = (req, res, next) => {
486 */ 483 */
487 const favoriteBrand = (req, res, next) => { 484 const favoriteBrand = (req, res, next) => {
488 let id = req.body.id; 485 let id = req.body.id;
489 - let uid = req.user.uid || 20000032; 486 + let uid = req.user.uid;
490 let opt = req.body.opt || 'ok'; 487 let opt = req.body.opt || 'ok';
491 let type = req.body.type || 'product'; 488 let type = req.body.type || 'product';
492 let appVersion = req.body.appVersion || false; 489 let appVersion = req.body.appVersion || false;
  490 + let url = helpers.urlFormat('/signin.html') + '?refer=' + decodeURI(req.cookies.refer);
493 491
494 if (appVersion === 'true') { 492 if (appVersion === 'true') {
495 uid = req.cookies.appUid; 493 uid = req.cookies.appUid;
  494 + url = `${url}&openby:yohobuy={"action":"go.weblogin","params":{"jumpurl":{"url":${decodeURI(req.cookies.refer)},"param":{}},"requesturl":{"param":{},"url":""},"priority":"Y"}}`; // eslint-disable-line
496 } 495 }
497 496
498 if (_.isNumber(id)) { 497 if (_.isNumber(id)) {
@@ -503,12 +502,12 @@ const favoriteBrand = (req, res, next) => { @@ -503,12 +502,12 @@ const favoriteBrand = (req, res, next) => {
503 }); 502 });
504 return false; 503 return false;
505 } else if (!uid) { 504 } else if (!uid) {
  505 +
  506 +
506 res.json({ 507 res.json({
507 code: 400, 508 code: 400,
508 message: '未登录', 509 message: '未登录',
509 - data: helpers.urlFormat('/signin.html', {  
510 - refer: decodeURI(req.cookies.refer)  
511 - }) 510 + data: url
512 }); 511 });
513 return false; 512 return false;
514 } else if (opt !== 'ok') { // 取消收藏 513 } else if (opt !== 'ok') { // 取消收藏
@@ -11,19 +11,23 @@ const searchModel = require(`${mRoot}/search`); @@ -11,19 +11,23 @@ const searchModel = require(`${mRoot}/search`);
11 const _ = require('lodash'); 11 const _ = require('lodash');
12 const helpers = global.yoho.helpers; 12 const helpers = global.yoho.helpers;
13 13
14 -// 搜索落地页 14 +/**
  15 + * 搜索落地页
  16 + */
15 const list = (req, res, next) => { 17 const list = (req, res, next) => {
16 - let params = Object.assign({}, req.query); 18 + let params = Object.assign({
  19 + isSearch: true, // 搜索列表将最新改成默认的标识
  20 + cartUrl: helpers.urlFormat('/cart/index/index')
  21 + }, req.query);
17 let title = ''; 22 let title = '';
18 let query = req.query.query; 23 let query = req.query.query;
19 let isQueryFirstClass = false; // 标识用户搜的是不是一级品类 24 let isQueryFirstClass = false; // 标识用户搜的是不是一级品类
20 let isQuerySecondClass = false; // 标识用户搜的是不是二级品类 25 let isQuerySecondClass = false; // 标识用户搜的是不是二级品类
21 let domain = null; 26 let domain = null;
22 27
23 - params = _.assign({  
24 - isSearch: true,  
25 - cartUrl: helpers.urlFormat('/cart/index/index')  
26 - }, params); 28 + if (params.shop_id) {
  29 + params.shopId = params.shop_id;
  30 + }
27 31
28 /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */ 32 /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */
29 Promise.all([searchModel.getAllBrandNames(), searchModel.getClassNames()]).then((result) => { 33 Promise.all([searchModel.getAllBrandNames(), searchModel.getClassNames()]).then((result) => {
@@ -85,28 +89,33 @@ const list = (req, res, next) => { @@ -85,28 +89,33 @@ const list = (req, res, next) => {
85 } else if (isQuerySecondClass) { // 搜索是二级品类 89 } else if (isQuerySecondClass) { // 搜索是二级品类
86 title = query; 90 title = query;
87 } else { // 搜索其它内容 91 } else { // 搜索其它内容
88 - if (query) { 92 + if (query || params.form) {
89 params.search = { 93 params.search = {
90 default: query === '' ? false : query, 94 default: query === '' ? false : query,
91 - url: '' 95 + url: helpers.urlFormat('', null, 'search')
92 }; 96 };
93 } 97 }
94 title = '搜索'; 98 title = '搜索';
95 } 99 }
96 100
  101 + title = params.title ? params.title : title;
  102 +
97 res.render('search/list', { 103 res.render('search/list', {
98 module: 'product', 104 module: 'product',
99 page: 'search-list', 105 page: 'search-list',
100 pageHeader: headerModel.setNav({ 106 pageHeader: headerModel.setNav({
101 navTitle: title 107 navTitle: title
102 }), 108 }),
  109 + title: title,
103 goodList: params, 110 goodList: params,
104 pageFooter: true 111 pageFooter: true
105 }); 112 });
106 }).catch(next); 113 }).catch(next);
107 }; 114 };
108 115
109 -// ajax 商品数据请求 116 +/**
  117 + * ajax 商品数据请求
  118 + */
110 const search = (req, res, next) => { 119 const search = (req, res, next) => {
111 let params = Object.assign({}, req.query); 120 let params = Object.assign({}, req.query);
112 121
@@ -120,9 +129,6 @@ const search = (req, res, next) => { @@ -120,9 +129,6 @@ const search = (req, res, next) => {
120 129
121 /** 130 /**
122 * 筛选 131 * 筛选
123 - * @param {[object]} req  
124 - * @param {[object]} res  
125 - * @return {[type]}  
126 */ 132 */
127 let filter = (req, res, next) => { 133 let filter = (req, res, next) => {
128 let params = Object.assign({}, req.query); 134 let params = Object.assign({}, req.query);
@@ -10,59 +10,6 @@ const _ = require('lodash'); @@ -10,59 +10,6 @@ const _ = require('lodash');
10 const helpers = global.yoho.helpers; 10 const helpers = global.yoho.helpers;
11 const api = global.yoho.API; 11 const api = global.yoho.API;
12 12
13 -/**  
14 - * 品牌名称处理  
15 - * @param {[object]} list  
16 - * @return {[object]}  
17 - */  
18 -const _processBrandNames = (list) => {  
19 - const formatData = [];  
20 -  
21 - list = list || [];  
22 - list = camelCase(list);  
23 -  
24 - _.forEach(list, (item) => {  
25 - _.forEach(item, (obj) => {  
26 - formatData.push({  
27 - brandDomain: obj.brandDomain,  
28 - brandName: obj.brandName  
29 - });  
30 - });  
31 - });  
32 -  
33 - return formatData;  
34 -};  
35 -  
36 -/**  
37 - * 品牌名称处理  
38 - * @param {[object]} list  
39 - * @return {[object]}  
40 - */  
41 -const _processClassNames = (list) => {  
42 - const formatData = {  
43 - first: {},  
44 - second: {}  
45 - };  
46 -  
47 - list = list || [];  
48 - list = camelCase(list);  
49 -  
50 - _.forEach(list, (item) => {  
51 - _.forEach(item, (obj) => {  
52 - formatData.first[obj.categoryId] = obj.categoryName;  
53 -  
54 - if (obj.sub) {  
55 - _.forEach(obj.sub, (sub) => {  
56 - formatData.second[sub.categoryId] = sub.categoryName;  
57 - });  
58 - }  
59 -  
60 - });  
61 - });  
62 -  
63 - return formatData;  
64 -};  
65 -  
66 /* 多品牌店铺列表数据信息处理*/ 13 /* 多品牌店铺列表数据信息处理*/
67 const _processBrandShops = (list) => { 14 const _processBrandShops = (list) => {
68 const formatDat = []; 15 const formatDat = [];
@@ -147,42 +94,6 @@ const getBrandBanner = (brandId) => { @@ -147,42 +94,6 @@ const getBrandBanner = (brandId) => {
147 }; 94 };
148 95
149 /** 96 /**
150 - * 获取所有的品牌名称  
151 - **/  
152 -const getAllBrandNames = () => {  
153 - return api.get('', {  
154 - method: 'app.brand.brandlist'  
155 - }, {  
156 - cache: true  
157 - }).then((result) => {  
158 - if (result && result.code === 200) {  
159 - return _processBrandNames(result.data.brands);  
160 - } else {  
161 - logger.error('get brand all name data api return code is not 200');  
162 - return {};  
163 - }  
164 - });  
165 -};  
166 -  
167 -/**  
168 - * 获取所有的品类名称  
169 - **/  
170 -const getClassNames = () => {  
171 - return api.get('', {  
172 - method: 'app.sort.get'  
173 - }, {  
174 - cache: true  
175 - }).then((result) => {  
176 - if (result && result.code === 200) {  
177 - return _processClassNames(result.data);  
178 - } else {  
179 - logger.error('get category name api return code is not 200');  
180 - return {};  
181 - }  
182 - });  
183 -};  
184 -  
185 -/**  
186 * 根据品牌域名获取品牌LOGO 97 * 根据品牌域名获取品牌LOGO
187 * @param {string} domain 品牌域名 98 * @param {string} domain 品牌域名
188 * @return array | false 99 * @return array | false
@@ -375,8 +286,6 @@ const getShopBrands = (shopId) => { @@ -375,8 +286,6 @@ const getShopBrands = (shopId) => {
375 286
376 287
377 module.exports = { 288 module.exports = {
378 - getAllBrandNames,  
379 - getClassNames,  
380 getBrandLogoByDomain, 289 getBrandLogoByDomain,
381 getBrandIntro, 290 getBrandIntro,
382 getBrandShops, 291 getBrandShops,
@@ -250,7 +250,7 @@ const _getBreakingSort = (yhChannel) => { @@ -250,7 +250,7 @@ const _getBreakingSort = (yhChannel) => {
250 if (result && result.code === 200) { 250 if (result && result.code === 200) {
251 return _processBreakingSort(result.data); 251 return _processBreakingSort(result.data);
252 } else { 252 } else {
253 - logger.error('get BreakingSort classify return code is not 200'); 253 + logger.error('get sale BreakingSort classify return code is not 200');
254 return {}; 254 return {};
255 } 255 }
256 }); 256 });
@@ -276,7 +276,7 @@ const getSearchData = (params, uid) => { @@ -276,7 +276,7 @@ const getSearchData = (params, uid) => {
276 if (result && result.code === 200) { 276 if (result && result.code === 200) {
277 return result.data.vip_info ? camelCase(result.data.vip_info) : {}; 277 return result.data.vip_info ? camelCase(result.data.vip_info) : {};
278 } else { 278 } else {
279 - logger.error('获取用户信息返回 code 不是 200'); 279 + logger.error('get user info return code is not 200');
280 return {}; 280 return {};
281 } 281 }
282 }) 282 })
@@ -296,7 +296,7 @@ const getFilterData = (params) => { @@ -296,7 +296,7 @@ const getFilterData = (params) => {
296 hideSort: params.saleType === '1' 296 hideSort: params.saleType === '1'
297 }); 297 });
298 } else { 298 } else {
299 - logger.error('SALE 商品搜索返回 code 不是 200'); 299 + logger.error('get filter data return code is not 200');
300 return []; 300 return [];
301 } 301 }
302 }); 302 });
@@ -350,7 +350,7 @@ const getDiscountData = (yhChannel) => { @@ -350,7 +350,7 @@ const getDiscountData = (yhChannel) => {
350 list: _processDiscount(result.data) 350 list: _processDiscount(result.data)
351 }; 351 };
352 } else { 352 } else {
353 - logger.error('折扣专场专题列表返回 code 不是 200'); 353 + logger.error('get sale discount data return code is not 200');
354 return {}; 354 return {};
355 } 355 }
356 }); 356 });
@@ -383,7 +383,7 @@ const getDiscountDetailData = (id, yhChannel) => { @@ -383,7 +383,7 @@ const getDiscountDetailData = (id, yhChannel) => {
383 } 383 }
384 }; 384 };
385 } else { 385 } else {
386 - logger.error('折扣专场专题详情返回 code 不是 200'); 386 + logger.error('get sale discount detail return code is not 200');
387 return {}; 387 return {};
388 } 388 }
389 }); 389 });
@@ -5,21 +5,64 @@ @@ -5,21 +5,64 @@
5 */ 5 */
6 'use strict'; 6 'use strict';
7 const utils = '../../../utils'; 7 const utils = '../../../utils';
8 -const logger = global.yoho.logger;  
9 const productProcess = require(`${utils}/product-process`); 8 const productProcess = require(`${utils}/product-process`);
  9 +const searchProcess = require(`${utils}/search-process`);
  10 +const _ = require('lodash');
  11 +const logger = global.yoho.logger;
10 const api = global.yoho.API; 12 const api = global.yoho.API;
  13 +const camelCase = global.yoho.camelCase;
11 14
12 /** 15 /**
13 - * 排序转换 16 + * 品牌名称处理
  17 + * @param {[object]} list
  18 + * @return {[object]}
14 */ 19 */
15 -const typeCont = {  
16 - price: ['s_p_desc', 's_p_asc'],  
17 - discount: ['p_d_desc', 'p_d_asc'],  
18 - sale: ['s_n_desc', 's_n_asc'],  
19 - newest: ['s_t_desc', 's_t_asc'],  
20 - stock: ['s_s_desc', 's_s_asc'],  
21 - all: ['d_s_desc', 'd_s_asc'],  
22 - category: ['s_t_desc', 's_t_asc'] 20 +const _processBrandNames = (list) => {
  21 + const formatData = [];
  22 +
  23 + list = list || [];
  24 + list = camelCase(list);
  25 +
  26 + _.forEach(list, (item) => {
  27 + _.forEach(item, (obj) => {
  28 + formatData.push({
  29 + brandDomain: obj.brandDomain,
  30 + brandName: obj.brandName
  31 + });
  32 + });
  33 + });
  34 +
  35 + return formatData;
  36 +};
  37 +
  38 +/**
  39 + * 品牌名称处理
  40 + * @param {[object]} list
  41 + * @return {[object]}
  42 + */
  43 +const _processClassNames = (list) => {
  44 + const formatData = {
  45 + first: {},
  46 + second: {}
  47 + };
  48 +
  49 + list = list || [];
  50 + list = camelCase(list);
  51 +
  52 + _.forEach(list, (item) => {
  53 + _.forEach(item, (obj) => {
  54 + formatData.first[obj.categoryId] = obj.categoryName;
  55 +
  56 + if (obj.sub) {
  57 + _.forEach(obj.sub, (sub) => {
  58 + formatData.second[sub.categoryId] = sub.categoryName;
  59 + });
  60 + }
  61 +
  62 + });
  63 + });
  64 +
  65 + return formatData;
23 }; 66 };
24 67
25 /** 68 /**
@@ -37,9 +80,12 @@ const _searchGoods = (params) => { @@ -37,9 +80,12 @@ const _searchGoods = (params) => {
37 } 80 }
38 } 81 }
39 82
40 - // params.yh_channel = channelType[params.yh_channel]; 83 + if (params.channel) {
  84 + params.yh_channel = searchProcess.getChannelType(params.channel);
  85 + delete params.channel;
  86 + }
41 87
42 - params = Object.assign({ 88 + params = _.assign({
43 limit: '60', 89 limit: '60',
44 status: 1, 90 status: 1,
45 sales: 'Y', 91 sales: 'Y',
@@ -47,11 +93,11 @@ const _searchGoods = (params) => { @@ -47,11 +93,11 @@ const _searchGoods = (params) => {
47 attribute_not: 2 93 attribute_not: 2
48 }, params); 94 }, params);
49 95
50 - if (typeCont[params.type]) {  
51 - params.order = typeCont[params.type][params.order]; 96 + if (params.order) {
  97 + params.order = searchProcess.getTypeCont(params.type || '', params.order);
52 } 98 }
53 99
54 - return api.get('', Object.assign({ 100 + return api.get('', _.assign({
55 method: method 101 method: method
56 }, params), { 102 }, params), {
57 cache: true 103 cache: true
@@ -88,7 +134,45 @@ const getFilterData = (params) => { @@ -88,7 +134,45 @@ const getFilterData = (params) => {
88 }); 134 });
89 }; 135 };
90 136
  137 +/**
  138 + * 获取所有的品类名称
  139 + **/
  140 +const getClassNames = () => {
  141 + return api.get('', {
  142 + method: 'app.sort.get'
  143 + }, {
  144 + cache: true
  145 + }).then((result) => {
  146 + if (result && result.code === 200) {
  147 + return _processClassNames(result.data);
  148 + } else {
  149 + logger.error('get category name api return code is not 200');
  150 + return {};
  151 + }
  152 + });
  153 +};
  154 +
  155 +/**
  156 + * 获取所有的品牌名称
  157 + **/
  158 +const getAllBrandNames = () => {
  159 + return api.get('', {
  160 + method: 'app.brand.brandlist'
  161 + }, {
  162 + cache: true
  163 + }).then((result) => {
  164 + if (result && result.code === 200) {
  165 + return _processBrandNames(result.data.brands);
  166 + } else {
  167 + logger.error('get brand all name data api return code is not 200');
  168 + return {};
  169 + }
  170 + });
  171 +};
  172 +
91 module.exports = { 173 module.exports = {
92 getSearchData, 174 getSearchData,
93 - getFilterData 175 + getFilterData,
  176 + getAllBrandNames,
  177 + getClassNames
94 }; 178 };
  1 +@import "suggest";
@@ -38,7 +38,30 @@ const getChannelType = (channel) => { @@ -38,7 +38,30 @@ const getChannelType = (channel) => {
38 } 38 }
39 }; 39 };
40 40
  41 +// 排序转换
  42 +const getTypeCont = (type, order) => {
  43 + switch (type) {
  44 + case 'price':
  45 + return order === '0' ? 's_p_desc' : 's_p_asc';
  46 + case 'discount':
  47 + return order === '0' ? 'p_d_desc' : 'p_d_asc';
  48 + case 'sale':
  49 + return order === '0' ? 's_n_desc' : 's_n_asc';
  50 + case 'newest':
  51 + return order === '0' ? 's_t_desc' : 's_t_asc';
  52 + case 'stock':
  53 + return order === '0' ? 's_s_desc' : 's_s_asc';
  54 + case 'all':
  55 + return order === '0' ? 'd_s_desc' : 'd_s_asc';
  56 + case 'category':
  57 + return order === '0' ? 's_t_desc' : 's_t_asc';
  58 + default:
  59 + return order === '0' ? 's_t_desc' : 's_t_asc';
  60 + }
  61 +};
  62 +
41 module.exports = { 63 module.exports = {
42 getGenderByChannel, 64 getGenderByChannel,
43 - getChannelType 65 + getChannelType,
  66 + getTypeCont
44 }; 67 };