Authored by 郝肖肖

Merge branch 'release/5.5' of git.yoho.cn:fe/yohobuywap-node into release/5.5

... ... @@ -7,8 +7,7 @@ const _getProductBySkns = function(productObj) {
productSkn: productObj.defaultSkns,
method: 'h5.product.batch'
}).then((result) => {
let nskns = [];
productObj.defaultPros = [];
if (result && result.data && result.data.product_list && result.code === 200) {
result.data.product_list.forEach(function(val) {
var goods_id = Array.isArray(val.goods_list) && val.goods_list.length ? val.goods_list[0].goods_id : null;
... ... @@ -27,11 +26,8 @@ const _getProductBySkns = function(productObj) {
obj.brandurl = `//m.yohobuy.com/product/index/brand?domain=${val.brand_domain}&openby:yohobuy={"action":"go.brand","params":{"brand_id":${val.brand_id}}}`;
}
nskns.push(obj);
productObj.defaultPros.push(obj);
});
productObj.defaultSkns = nskns;
} else {
delete productObj.defaultSkns;
}
});
};
... ...
<div class="feature-page yoho-page">
{{#content.share}}
<input id="shareLink" type="hidden" value="{{shareUrl}}">
<input id="shareDesc" type="hidden" value="{{shareTitleSub}}">
<input id="shareImg" type="hidden" value="{{shareImage}}">
<input id="shareTitle" type="hidden" value="{{shareTitleMain}}">
{{#content.share}}
{{#content.floors}}
{{#isEqualOr type 'sidebar'}}
{{! 侧悬浮}}
... ... @@ -66,10 +72,10 @@
{{#isEqualOr type 'productGroup'}}
{{! 商品池}}
<div class="product-container item{{numOfOneRow}}" {{#if proBgImg}}style="background:url({{proBgImg}})repeat;"{{/if}}>
<div class="product-source" {{#if searchCondition}}cloneitem="{{searchCondition.limit}}" condition='{{stringify searchCondition}}'{{/if}} fp="{{getAnalysis ../this @index}}">
<div class="product-source" {{#unless defaultPros.length}} {{#if searchCondition }}cloneitem="{{searchCondition.limit}}"{{/if}}{{/unless}} condition='{{stringify searchCondition}}' fp="{{getAnalysis ../this @index}}">
<input class="imgwh" type="hidden" value="193x257">
{{#ifand defaultSkns defaultSkns.length}}
{{#defaultSkns}}
{{#if defaultPros.length}}
{{#defaultPros}}
<div class="feature-product-info {{#if ../condition}}novisible{{/if}}">
<a class="first-part product-detail" href='{{producturl}}'>
<div class="product-detail-imgbox">
... ... @@ -94,7 +100,7 @@
</a>
{{/if}}
</div>
{{/defaultSkns}}
{{/defaultPros}}
{{else}}
<div class="feature-product-info novisible">
<a class="first-part product-detail" href=''>
... ... @@ -103,7 +109,7 @@
{{#if rigTopImg}}<img class="rigtopimg" src="{{image2 rigTopImg q=60}}">{{/if}}
<img class="product-detail-img" src="">
</div>
{{#isEqualOr showpname '1'}}<p class="product-name"></p>{{/isEqualOr}}
{{#isEqualOr showPrdName '1'}}<p class="product-name"></p>{{/isEqualOr}}
<div class="product-detail-text">
<div class="price">
<span class="sale-price"{{#if fontColor}}style="color:{{fontColor}};"{{/if}}></span>
... ... @@ -120,7 +126,7 @@
</a>
{{/if}}
</div>
{{/ifand}}
{{/if}}
</div>
</div>
{{/isEqualOr}}
... ...
... ... @@ -7,6 +7,7 @@
const _ = require('lodash');
const api = global.yoho.API;
const helpers = global.yoho.helpers;
const utils = require('../../../utils');
const genderMap = {
boys: '1,3',
... ... @@ -33,27 +34,27 @@ let _processCateData = (list, channel) => {
// 如果有二级菜单,二级菜单跳转,否则一级菜单跳转
if (firstItem.sub && firstItem.sub.length) {
_.map(firstItem.sub, function(secondItem) {
secondItem.url = helpers.urlFormat('/', {
secondItem.url = helpers.urlFormat('/', utils.mapSort({
sort: _.get(secondItem, 'relation_parameter.sort'),
sort_name: secondItem.category_name,
gender: genderMap[key] || ''
}, 'list');
}), 'list');
});
firstItem.sub.unshift({
category_name: `全部${firstItem.category_name}`,
url: helpers.urlFormat('/', {
url: helpers.urlFormat('/', utils.mapSort({
sort: _.get(firstItem, 'relation_parameter.sort'),
sort_name: firstItem.category_name,
gender: genderMap[key] || ''
}, 'list')
}), 'list')
});
} else {
firstItem.url = helpers.urlFormat('/', {
firstItem.url = helpers.urlFormat('/', utils.mapSort({
sort: _.get(firstItem, 'relation_parameter.sort'),
sort_name: firstItem.category_name,
gender: genderMap[key] || ''
}, 'list');
}), 'list');
}
});
});
... ...
... ... @@ -103,7 +103,7 @@ const editorRedirect = (req, res, next) => {
param = '?' + param;
}
redirectUrl += `-${id}/${param}`;
res.redirect(redirectUrl);
res.redirect(301, redirectUrl);
} else {
return next();
}
... ...
... ... @@ -469,7 +469,7 @@ const indexRedirect = (req, res, next) => {
param = '?' + param;
}
redirectUrl += `${id}.html${param}`;
res.redirect(redirectUrl);
res.redirect(301, redirectUrl);
} else {
return next();
}
... ...
... ... @@ -86,7 +86,7 @@ const newDetail = {
reject();
}
}).then(skn => {
return res.redirect(`/product/${skn}.html${param}`);
return res.redirect(301, `/product/${skn}.html${param}`);
}, () => {
return next();
});
... ...
... ... @@ -130,7 +130,7 @@ router.get('/seckill/get-product-list', seckill.getProductList); // 秒杀列表
router.get('/search/index', search.index);
// 搜索落地页
router.get('/search/list', search.list);
router.get('/search/list', rewrite.sortParams, search.list);
// filter
router.get('/search/filter', search.filter);
... ... @@ -142,8 +142,8 @@ router.get('/search/fuzzyDatas', search.fuzzyDatas);
router.get('/search/search', search.search);
// 品类
router.get('/index/index', list.category);
router.get('/list/index', list.category); // 兼容 PC 的链接
router.get('/index/index', rewrite.sortParams, list.category);
router.get('/list/index', rewrite.sortParams, list.category); // 兼容 PC 的链接
// 品牌 | 店铺
router.get('/index/shopAppCookie', list.shopAppCookie);
... ...
... ... @@ -4,8 +4,8 @@
<div id="search-input" class="search-input">
<form id="search-form" action="{{url}}" method="get">
<i class="search-icon iconfont">&#xe60f;</i>
<input type="text" placeholder="{{#if defaultTerms}}{{defaultTerms}}{{else}}搜索商品、品牌{{/if}}" name="query" data-bp-id="search_page_input_1" class="buriedpoint" autocomplete="off">
<input type="hidden" name="from" value="search">
<input type="text" placeholder="{{#if defaultTerms}}{{defaultTerms}}{{else}}搜索商品、品牌{{/if}}" name="query" data-bp-id="search_page_input_1" class="buriedpoint" autocomplete="off">
<i class="clear-input iconfont hide">&#xe626;</i>
<span id="search" class="search buriedpoint" type="submit" data-bp-id="search_index_one_0">搜索</span>
</form>
... ...
... ... @@ -3,8 +3,8 @@
<div id="search-input" class="search-input">
<form id="search-form" action="{{url}}" method="get">
<i class="search-icon iconfont">&#xe60f;</i>
<input type="text" value="{{default}}" name="query" class="buriedpoint" data-bp-id="shop-search_input_1" autocomplete="off">
<input type="hidden" value="search" name="from">
<input type="text" value="{{default}}" name="query" class="buriedpoint" data-bp-id="shop-search_input_1" autocomplete="off">
<input type="hidden" name="shop_id" value="{{@root.shopId}}">
<i class="clear-input iconfont hide">&#xe626;</i>
<span id="search" class="search buriedpoint" type="submit" data-bp-id="shop-search_btn_0">搜索</span>
... ...
... ... @@ -7,7 +7,13 @@
const typeLib = require('../../config/type-lib');
const _ = require('lodash');
const utils = require('../../utils');
const helpers = global.yoho.helpers;
/**
* 解析url规则中的参数
*/
const resolve = (req, res, next) => {
let path,
params = {
... ... @@ -44,6 +50,9 @@ const resolve = (req, res, next) => {
next();
};
/**
* 简介channel参数
*/
const channel = (req, res, next) => {
let channelName;
... ... @@ -79,7 +88,26 @@ const channel = (req, res, next) => {
next();
};
/**
* 参数排序
*/
const sortParams = (req, res, next) => {
let sorts = utils.mapSort(req.query);
let queryKeys = _.keys(req.query);
let index = 0;
let matched = _.map(sorts, (val, key) => {
return key === queryKeys[index++];
});
if (_.every(matched, match => match)) {
return next();
} else {
return res.redirect(helpers.urlFormat('/', sorts, 'list'));
}
};
module.exports = {
resolve,
channel
channel,
sortParams
};
... ...
... ... @@ -9,7 +9,7 @@ var isWechat = /micromessenger/i.test(navigator.userAgent);
function swiperInit() {
$('.swiper-container').each(function() {
var opt = {
loop: $(this).data('loop') === '1' ? true : false,
loop: $(this).data('loop') === 1 ? true : false,
slidesPerView: 'auto'
};
var spacebetween = $(this).data('spacebetween');
... ...
... ... @@ -166,6 +166,22 @@ function queryString() {
return vars;
}
/**
* 对象字段排序
*/
function mapSort (obj) {
if (!obj) {
return {};
}
let data = {};
Object.keys(obj).sort().forEach(k => {
data[k] = obj[k];
});
return data;
}
// 给jQuery 扩展 queryString函数
$.extend({
queryString: queryString
... ... @@ -462,3 +478,5 @@ window.givePoint = givePoint;
window._ChannelVary = _ChannelVary;
window.downLoadApp = downLoadApp;
window.mapSort = mapSort;
... ...
... ... @@ -2,7 +2,7 @@ const $ = require('yoho-jquery');
const Vue = require('vue');
const tip = require('../plugin/tip');
require('home/order-address-modify.css');
require('home/order-address-modify.page.css');
require('common.css');
require('../common');
... ...
... ... @@ -60,6 +60,10 @@
line-height: 34px;
height: 34px;
}
.sale-price {
font-size: 26px;
}
}
.brand-name {
... ...
... ... @@ -58,14 +58,17 @@ module.exports = {
return style;
},
stringify: function(obj) {
if (!obj) {
return '';
}
return JSON.stringify(obj);
},
repeat: function(n, options) {
if (n) {
var str = '';
let str = '';
for (var i = 0; i < n; i++) {
var opt = {
for (let i = 0; i < n; i++) {
let opt = {
index: i,
first: i === 0
};
... ...
... ... @@ -30,3 +30,19 @@ exports.refererLimit = (referer, blacklist) => { // eslint-disable-line
return result;
};
/**
* 对象字段排序
*/
exports.mapSort = obj => {
if (!obj) {
return {};
}
let data = {};
Object.keys(obj).sort().forEach(k => {
data[k] = obj[k];
});
return data;
};
... ...