Authored by zhangxiaoru

brandSearch

... ... @@ -104,9 +104,10 @@ const _shop = (req, res, shopId) => {
shopHeadHide: true,
gender: req.query.gender,
channel: req.query.channel,
pageHeader: headerModel.setNav({
navTitle: result.storeName
}),
// pageHeader: headerModel.setNav({
// navTitle: result.storeName
// }),
title: result.storeName + '|' + result.storeName + '潮流服装服饰-Yoho!Buy有货',
keywords: result.storeName + ',' + result.storeName + '服装服饰,' + result.storeName + '潮流服装服饰',
description: result.storeName + '|Yoho!Buy有货' + result.storeName + '潮流服饰官方授权店!100%品牌正品保证,支持货到付款。',
... ... @@ -305,7 +306,10 @@ const shopIntro = (req, res, next) => {
* opt 操作标识("ok":表示收藏,"cancel":表示取消收藏)
*/
const favoriteBrand = (req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', req.protocol + '://' + req.headers.origin);
let allowOrigin = _.get(req, 'headers.origin', null) ?
req.headers.origin : req.protocol + '://' + req.headers.host;
res.setHeader('Access-Control-Allow-Origin', allowOrigin);
res.setHeader('Access-Control-Allow-Credentials', 'true');
let id = req.query.id;
... ... @@ -313,29 +317,28 @@ const favoriteBrand = (req, res, next) => {
let opt = req.query.opt || 'ok';
let type = req.query.type || 'product';
let appVersion = req.query.appVersion || false;
let url = helpers.urlFormat('/signin.html') + '?refer=' + decodeURI(req.cookies.refer);
let refer = req.get('Referer') || `${global.yoho.config.siteUrl}/${req.cookies._Channel || ''}`;
let url = helpers.urlFormat('/signin.html') + '?refer=' + refer;
if (appVersion === 'true') {
uid = req.cookies.appUid;
url = `${url}&openby:yohobuy={"action":"go.weblogin","params":{"jumpurl":{"url":${decodeURI(req.cookies.refer)},"param":{}},"requesturl":{"param":{},"url":""},"priority":"Y"}}`; // eslint-disable-line
}
if (_.isNumber(id)) {
res.json({
if (!id) {
return res.json({
code: 401,
message: '参数不正确',
data: false
});
return false;
}
if (!uid) {
res.json({
return res.json({
code: 400,
message: '未登录',
data: url
});
return false;
}
if (opt !== 'ok') { // 取消收藏
... ... @@ -349,6 +352,31 @@ const favoriteBrand = (req, res, next) => {
}
};
/**
* 店铺品类页面
* @param req
* @param res
* @param next
*/
const shopCategory = (req, res, next) => {
listModel.getShopCategory({
shopId: req.query.shop_id,
channel: req.yoho.channel,
gender: req.query.gender || '1,3'
}).then(result => {
res.render('shop/category', {
content: result,
allProduct: result.allProduct,
module: 'product',
page: 'category',
pageHeader: headerModel.setNav({
navTitle: '品类'
}),
});
}).catch(next);
};
module.exports = {
category,
brand,
... ... @@ -360,4 +388,5 @@ module.exports = {
shopAppCookie,
shopFav,
baseShopFav,
shopCategory
};
... ...
... ... @@ -11,6 +11,17 @@ const helpers = global.yoho.helpers;
const api = global.yoho.API;
const searchModel = require('./search');
/**
* 频道
* @type {{}}
*/
const yhChannel = {
boys: 1,
girls: 2,
kids: 3,
lifestyle: 4
};
/* 多品牌店铺列表数据信息处理*/
const _processBrandShops = (list) => {
const formatDat = [];
... ... @@ -119,12 +130,13 @@ const _getShopInfo = (shopId, uid) => {
* @param {string} channel 频道
* @return array
*/
const _getShopCategory = (shopId, channel) => {
const _getShopCategory = (shopId, channel, gender) => {
return api.get('', {
method: 'app.shop.getSortInfo',
yh_channel: channel,
yh_channel: yhChannel[channel],
gender: gender || '1,3',
shop_id: shopId
}).then((result) => {
}).then(result => {
if (result && result.code === 200) {
return camelCase(result.data);
} else {
... ... @@ -652,6 +664,46 @@ const getShopIntro = (shopId) => {
});
};
/**
* 处理店铺品类
* @param params
*/
const getShopCategory = (params) => {
let finalResult = {
class: [],
category: []
};
return _getShopCategory(params.shopId, params.channel, params.gender).then(result => {
let resultCopy = _.cloneDeep(result);
_.forEach(resultCopy, value => {
finalResult.class.push({
name: value.categoryName
});
_.forEach(value.sub, (subValue, subKey) => {
value.sub[subKey].url = helpers.urlFormat('/product/search/list', {
shop_id: params.shopId,
sort: _.get(value, 'relationParameter.sort', ''),
title: subValue.categoryName,
query: subValue.categoryName
});
});
finalResult.category.push({
subcategory: value.sub
});
});
finalResult.allProduct = helpers.urlFormat('/product/search/list', {
shop_id: params.shopId
});
return finalResult;
});
};
module.exports = {
getBaseShopData,
getShopData,
... ... @@ -662,5 +714,6 @@ module.exports = {
setFavorite,
setFavoriteCancel,
getShopIntro,
getShopBrands
getShopBrands,
getShopCategory
};
... ...
... ... @@ -100,6 +100,7 @@ router.get('/index/brandFav', list.brandFav);
router.get('/index/shopAppCookie', list.shopAppCookie);
router.get('/index/shopFav', list.shopFav);
router.get('/index/baseShopFav', list.baseShopFav);
router.get('/index/category', list.shopCategory);
// 店铺介绍
router.get('/index/intro', list.shopIntro);
... ...
<div class="product-category yoho-page">
<div id="allproduct" class="allproduct">
<a href={{allProduct}}>
<p class="allproductParagaraph buriedpoint" data-bp-id ="shop_category_all_1">全部商品</p>
<i class="arrow-icon iconfont">&#xe614;</i>
</a>
</div>
<div class="margin-under-allproduct">
</div>
<div class="category-container clearfix">
<div class="content">
{{# content}}
<ul class="primary-level">
{{# class}}
<li class="p-level-item buriedpoint" data-bp-id="shop_primarylevel_{{name}}_1">{{name}}
<div class="primary-level-trilangle trilanglefont hide">&#xe64a;</div>
</li>
{{/ class}}
</ul>
<div class="sub-level-container hide">
{{# category}}
<ul class="sub-level">
{{# subcategory}}
<li class="buriedpoint" data-bp-id="shop_sublevel_{{categoryName}}_1">
<a href={{url}}>
{{categoryName}}
</a>
</li>
{{/ subcategory}}
</ul>
{{/ category}}
</div>
{{/ content}}
</div>
</div>
</div>
\ No newline at end of file
... ...
... ... @@ -22,7 +22,7 @@
{{^}}
<div class="banner-top-single">
<a href={{url}}>
<img class="img" src="{{image src 450 600}}">
<img class="img" src="{{image img 450 600}}">
</a>
</div>
{{/if}}
... ...

7.97 KB | W: | H:

8.86 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
/**
* 分类
* @author: berry<lixia.zhang@yoho.cn>
* @date: 2016/4/25
*/
var $ = require('yoho-jquery');
var $allProductCell = $('.allproduct'),
$categoryContainer = $('.category-container'),
$contents = $categoryContainer.children('.content'),
$subLevelItem = $categoryContainer.find('.sub-level li'),
$trilangle = $categoryContainer.find('.primary-level-trilangle');
require('../common');
//初始化container高度
(function() {
var $header = $('.yoho-header');
var h = $(window).height() - $header.outerHeight() - $allProductCell.outerHeight();
var trilangleRightMargin = $(window).width() * 0.55;
$categoryContainer.css('min-height', h);
$trilangle.css('margin-right', trilangleRightMargin);
$contents.height(h);
}());
$categoryContainer.on('touchend', function(e) {
var $this = $(e.target),
$subLevel,
$cur, index,
$subLevelContainer, $trilangleItem;
$cur = $this.closest('.p-level-item');
$subLevelContainer = $this.closest('.content').find('.sub-level-container');
$subLevelContainer.removeClass('hide');
if ($cur.length > 0) {
index = $cur.index();
$subLevel = $this.closest('.content').find('.sub-level');
$trilangleItem = $this.closest('.content').find('.primary-level-trilangle');
if ($this.hasClass('focus')) {
return;
}
$subLevel.not('.hide').addClass('hide');
$subLevel.eq(index).removeClass('hide');
$trilangleItem.not('.hide').addClass('hide');
$trilangleItem.eq(index).removeClass('hide');
}
});
$categoryContainer.find('.sub-level').on('touchstart', 'li', function() {
$subLevelItem.removeClass('highlight');
$(this).addClass('highlight');
}).on('touchend touchcancel', 'li', function() {
$(this).removeClass('highlight');
});
$allProductCell.on('touchstart', function() {
$(this).addClass('highlight');
}).on('touchend touchcancel', function() {
$(this).removeClass('highlight');
});
\ No newline at end of file
... ...
... ... @@ -33,7 +33,7 @@ var $input = $('#search-input input'),
$buriedpoint = $('.buriedpoint'),
$search = $('#search');
var shopId, sort, brand, outlets, app_type;
var shopId, sort, brand, outlets, app_type, age_level, msort, misort;
// 默认筛选条件
var defaultOpt = require('../../common/query-param');
... ... @@ -141,7 +141,7 @@ function inputAction() {
if (data.length > 0) {
for (i = 0; i < data.length; i++) {
ajaxHtml += '<li><span class="keyword">' + data[i].keyword + '</span><span class="count">' +
data[i].count + ' items<i class="iconfont">&#xe614;</i></span></li>';
data[i].count + ' items<i class="iconfont">&#xe614;</i></span></li>';
}
$searchAssociate.html(ajaxHtml);
... ... @@ -194,6 +194,8 @@ sort = getQueryString('sort');
outlets = getQueryString('outlets');
age_level = getQueryString('ageLevel');
app_type = getQueryString('app_type');
msort = getQueryString('msort');
misort = getQueryString('misort');
/**
* 筛选注册的回调,筛选子项点击后逻辑
... ... @@ -335,6 +337,14 @@ function search(opt) {
params.app_type = app_type;
}
if (msort) {
params.msort = msort;
}
if (misort) {
params.misort = misort;
}
$.extend(setting, defaultOpt, params);
searching = true;
... ... @@ -403,15 +413,15 @@ function search(opt) {
switch (navType) {
case 'newest':
window._yas(1 * new Date(), '1.0.16', 'yohobuy_m', window._ozuid,
'', $('.new-goods .good-info .good-detail-img .good-thumb'));
'', $('.new-goods .good-info .good-detail-img .good-thumb'));
break;
case 'price':
window._yas(1 * new Date(), '1.0.16', 'yohobuy_m', window._ozuid,
'', $('.price-goods .good-info .good-detail-img .good-thumb'));
'', $('.price-goods .good-info .good-detail-img .good-thumb'));
break;
case 'discount':
window._yas(1 * new Date(), '1.0.16', 'yohobuy_m', window._ozuid,
'', $('.discount-goods .good-info .good-detail-img .good-thumb'));
'', $('.discount-goods .good-info .good-detail-img .good-thumb'));
break;
default:
break;
... ... @@ -617,9 +627,9 @@ if ($brandHeader.length > 0) {
opt: opt,
type: $brandHeader.data('isbaseshop') ? 'shop' : 'brand'
},
xhrFields: {
withCredentials: true
},
xhrFields: {
withCredentials: true
},
success: function(data) {
if (data.code === 200) {
$this.toggleClass('coled');
... ...
... ... @@ -43,7 +43,7 @@ var winH = $(window).height(),
require('../../common');
// pagecache判断app设置cookie,判断是否收藏
(function() {
(function () {
var param = location.search;
var isApp = param.indexOf('app_version') > -1 || param.indexOf('appVersion') > -1;
... ... @@ -51,7 +51,7 @@ require('../../common');
$.ajax({
type: 'GET',
url: '/product/index/shopAppCookie',
error: function() {
error: function () {
tip.show('网络断开连接了~');
}
});
... ... @@ -63,12 +63,12 @@ require('../../common');
data: {
shopId: $('.shopid').val(),
},
success: function(data) {
success: function (data) {
if (data.collect) {
$collect.attr('class', 'already-collect');
}
},
error: function() {
error: function () {
tip.show('网络断开连接了~');
}
});
... ... @@ -191,14 +191,14 @@ function getPageGoods(info) {
type: 'GET',
url: info.url,
data: info.data,
success: function(data) {
success: function (data) {
if (data === ' ') {
nav.end = true;
}
info.callBack(data);
},
error: function() {
error: function () {
tip.show('网络断开连接了~');
searching = false;
}
... ... @@ -228,7 +228,7 @@ function newData(callback) {
getParam(req);
req.callBack = function(data) {
req.callBack = function (data) {
$('#new-arrival').append(data);
navInfo.new.page++;
myScroll && myScroll.refresh();
... ... @@ -253,7 +253,7 @@ function hotData(callback) {
getParam(req);
req.callBack = function(data) {
req.callBack = function (data) {
$('#popularity').append(data);
navInfo.hot.page++;
myScroll && myScroll.refresh();
... ... @@ -273,12 +273,10 @@ function tabChange(dom, index) {
}
// 首页导航
(function(nav, posNav, main) {
(function (nav, posNav, main) {
$(nav + ' li, ' + posNav + ' li').not('li.all-goods').on('touchstart', function() {
$(nav + ' li, ' + posNav + ' li').not('li.all-goods').on('touchstart', function () {
var index = $(this).index(),
activeTab = $(this).attr('tab');
... ... @@ -376,7 +374,7 @@ function scrollHandler() {
}
if (sTop + winH * 2 > scH) {
scrollCall = function() {
scrollCall = function () {
var translate = 'translate3d(0, ' + (-scH) + 'px, 0)';
$nav1.css({
transform: translate,
... ... @@ -468,7 +466,7 @@ function scrollHandler() {
$('#scroller').trigger('scroll');
}
document.addEventListener('touchmove', function(e) {
document.addEventListener('touchmove', function (e) {
// sub classify不阻止默认事件
if ($(e.target).closest('.sub-classify').length === 0) {
e.preventDefault();
... ... @@ -476,12 +474,12 @@ document.addEventListener('touchmove', function(e) {
}, false);
/* if (!isIphone) {
return;
}*/
return;
}*/
// window ready 后重新refresh iscroll
$(window).ready(function() {
$(window).ready(function () {
// myScroll && myScroll.refresh();
imgH = $('#nav-top').outerHeight();
nav1H = $('#nav').outerHeight();
... ... @@ -497,14 +495,14 @@ $(window).ready(function() {
click: true
});
setTimeout(function() {
setTimeout(function () {
scH = $('#scroller').outerHeight();
}, 500);
myScroll.on('scroll', scrollHandler);
myScroll.on('scrollStart', function() {
myScroll.on('scrollStart', function () {
// stop auto play when scroll
bannerSwiper && bannerSwiper.stopAutoplay();
... ... @@ -512,7 +510,7 @@ $(window).ready(function() {
multiSwiper && multiSwiper.stopAutoplay();
});
myScroll.on('scrollEnd', function() {
myScroll.on('scrollEnd', function () {
// start auto play when scroll end
bannerSwiper && bannerSwiper.startAutoplay();
... ... @@ -657,7 +655,7 @@ function search(opt) {
type: 'GET',
url: opt.url ? opt.url : '',
data: setting,
success: function(data) {
success: function (data) {
var $container,
num;
... ... @@ -707,7 +705,7 @@ function search(opt) {
bindGoodThumbClick();
},
error: function() {
error: function () {
tip.show('网络断开连接了~');
searching = false;
loading.hideLoadingMask();
... ... @@ -716,11 +714,11 @@ function search(opt) {
}
$listNav.bind('contextmenu', function(e) {
$listNav.bind('contextmenu', function (e) {
return false;
});
$subNav.on('touchend touchcancel', function(e) {
$subNav.on('touchend touchcancel', function (e) {
var $this = $(e.target).closest('li'),
cname,
nav,
... ... @@ -863,11 +861,11 @@ $subNav.on('touchend touchcancel', function(e) {
});
filter.initFilter({
fCbFn: function(option) {
fCbFn: function (option) {
search(option);
myScroll && myScroll.enable();
},
hCbFn: function() {
hCbFn: function () {
// 切换active状态到$pre上
$pre.addClass('active');
... ... @@ -878,17 +876,17 @@ filter.initFilter({
missStatus: true
});
$listNav.on('touchstart', 'li', function(e) {
$listNav.on('touchstart', 'li', function (e) {
$(this).addClass('bytouch');
}).on('touchend touchcancel', function() {
}).on('touchend touchcancel', function () {
$listNav.find('li').removeClass('bytouch');
// myScroll && myScroll.refresh();
});
$nav2.on('touchstart', 'li', function(e) {
$nav2.on('touchstart', 'li', function (e) {
$(this).addClass('bytouch');
}).on('touchend touchcancel', function() {
}).on('touchend touchcancel', function () {
$nav2.find('li').removeClass('bytouch');
// myScroll && myScroll.refresh();
... ... @@ -896,7 +894,7 @@ $nav2.on('touchstart', 'li', function(e) {
// 底部导航点击
function fotterClick(group) {
$(group + ' li').on('touchstart', function() {
$(group + ' li').on('touchstart', function () {
$('.sub-group').addClass('hide');
$(this).find('.sub-group').removeClass('hide');
});
... ... @@ -912,16 +910,16 @@ function stopPropagation(e) {
}
}
$(document).bind('touchstart', function() {
$(document).bind('touchstart', function () {
$('.sub-group').addClass('hide');
});
$('.shop-foot-wrapper').bind('touchstart', function(e) {
$('.shop-foot-wrapper').bind('touchstart', function (e) {
stopPropagation(e);
});
// 店铺收藏 || 取消收藏
$collect.on('touchstart', function() {
$collect.on('touchstart', function () {
var opt;
if (searching) {
... ... @@ -944,10 +942,10 @@ $collect.on('touchstart', function() {
opt: opt,
type: 'shop'
},
xhrFields: {
withCredentials: true
},
success: function(data) {
xhrFields: {
withCredentials: true
},
success: function (data) {
var url = '';
if (data.code === 200) {
... ... @@ -961,20 +959,20 @@ $collect.on('touchstart', function() {
}
if (data.code === 400) {
url = data;
url = data.data;
if ($('#jump-login').length <= 0) {
$('body').append('<a href=\'' + url + '\'><span id="jump-login"><span></a>');
}
$('#jump-login').click();
}
setTimeout(function() {
setTimeout(function () {
myScroll && myScroll.refresh();
scH = $('#scroller').outerHeight();
}, 500);
searching = false;
},
error: function() {
error: function () {
tip.show('网络断开连接了~');
searching = false;
}
... ...
@import "shop-index";
@import "shop-prodfile";
@import "product-category";
\ No newline at end of file
... ...
.product-category {
font-size: 30px;
background-color: #fff;
.allproduct {
padding: 0px 30px;
display: block;
height: 89px;
line-height: 89px;
&.highlight {
background: #dbdbdb;
}
}
.margin-under-allproduct{
width: 100%;
height: 30px;
background-color: #f0f0f0;
}
.category-container{
border-top: 1px solid #e6e6e6;
}
.arrow-icon {
position: relative;
float: right;
font-size: 30px;
top: 0px;
color: #e1e1e1;
padding: 0px 10px;
}
.allproductParagaraph {
font-size: 18px;
left: 20px;
}
.content {
background: #fff;
&.hide {
display: none;
}
}
.primary-level {
float: left;
box-sizing: border-box;
width: 100%;
position: absolute;
> li {
position:relative;
height: 89px;
line-height: 89px;
box-sizing: border-box;
border-bottom: 1px solid #e6e6e6;
background-color: #fff;
margin-left: 30px;
}
}
.primary-level-trilangle{
float: right;
background: url(/product/arrow.png) no-repeat;
margin-top: 22px;
width: 20px;
height: 46px;
}
.trilanglefont {
font-family: "iconfont" !important;
font-size: 30px;
font-style: normal;
text-decoration: none;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
color: #f4f4f4;
}
.sub-level-container {
float: right;
box-sizing: border-box;
background: #f4f4f4;
width: 55%;
height: 100%;
position: relative;
}
.sub-level {
width: 100%;
&.hide {
display: none;
}
> li {
box-sizing: border-box;
height: 89px;
line-height: 89px;
border-bottom: 1px solid #e6e6e6;
margin-left: 30px;
padding-left: 0;
&.highlight {
background: #dbdbdb;
margin-left: 0;
padding-left: 30px;
}
&:last-child {
border-bottom: none;
}
}
a {
display: block;
height: 100%;
width: 100%;
color: #afafaf;
}
}
}
... ...