Authored by 郝肖肖

'修复冲突'

... ... @@ -145,7 +145,7 @@ const formatCartGoods = (cartGoods, isAdvanceCart, inValid, isOffShelves, analys
};
// 划线的价格
if (it.last_vip_price < it.sales_price) {
if (+it.last_vip_price < +it.sales_price) {
goods.productPrice = transPrice(it.last_vip_price);
goods.linePrice = transPrice(it.sales_price); // 划线的价格
}
... ...
... ... @@ -780,13 +780,13 @@ const getRecommendProduct = (channelNum, uid, udid, page) => {
img: it.default_images ? helpers.image(it.default_images, 190, 250) : '',
alt: it.product_name,
price: '¥' + chelper.transPrice(it.sales_price),
marketPrice: (it.market_price && it.market_price > it.sales_price) ?
marketPrice: (it.market_price && +it.market_price > +it.sales_price) ?
'¥' + chelper.transPrice(it.market_price) : ''
};
item.href = helpers.getUrlBySkc(it.product_skn);
if (it.sales_price !== it.market_price) {
if (+it.sales_price !== +it.market_price) {
it.marketPrice = chelper.transPrice(it.market_price);
}
return item;
... ...
... ... @@ -53,9 +53,9 @@
<p{{#isEqual is_support 'N'}} class="unsp-way"{{/isEqual}}>
<label class="check-btn{{#isY default}} checked{{/isY}}" data-id="{{delivery_way_id}}"
title="{{delivery_way_name}}:运费 ¥ {{delivery_way_cost}}">{{delivery_way_name}}:运费 ¥ {{delivery_way_cost}}</label>
{{#isEqual delivery_way_id 2}}
<span>您所选择的区域暂不在支持顺丰派送范围内</span>
{{/isEqual}}
{{#if is_support_message}}
<span>{{is_support_message}}</span>
{{/if}}
</p>
{{/ deliveryWay}}
<p class="default-line">注:配送会由于天气,交通等不可抗拒的客观因素造成您收货时间延迟,请您知悉。</p>
... ...
... ... @@ -395,13 +395,12 @@ module.exports = class extends global.yoho.BaseModel {
newGood.name = good.product_name;
newGood.color = good.factory_color_name;
newGood.size = good.size_name;
newGood.price = that.transPrice(good.sales_price);// 默认显示销售价
newGood.isVipPrice = good.discount_tag === 'V';
newGood.isStuPrice = good.discount_tag === 'S';
// 划线的价格
if (good.real_pay_price < good.sales_price) {
if (+good.real_pay_price < +good.sales_price) {
newGood.price = that.transPrice(good.real_pay_price);// 显示分摊价
newGood.linePrice = that.transPrice(good.sales_price); // 划线的价格
}
... ... @@ -829,7 +828,7 @@ module.exports = class extends global.yoho.BaseModel {
};
// 划线的价格
if (good.real_pay_price < good.sales_price) {
if (+good.real_pay_price < +good.sales_price) {
newGood.price = that.transPrice(good.real_pay_price);// 显示分摊价
newGood.linePrice = that.transPrice(good.sales_price); // 划线的价格
}
... ...
... ... @@ -7,7 +7,6 @@
*/
'use strict';
const _ = require('lodash');
const aes = require('./aes-pwd');
const api = global.yoho.API;
... ... @@ -47,7 +46,7 @@ let regMobileAes = (area, mobile, password, code, shoppingKey, extParam)=> {
if (extParam) {
if (extParam.inviteCode) {
params.inviteCode = _.replace(extParam.inviteCode, /[^(0-9a-zA-Z)]/ig, '');
params.inviteCode = extParam.inviteCode;
}
}
... ...
... ... @@ -9,87 +9,10 @@ const list = require(`${mRoot}/list`);
const listSeoMap = require(`${global.middleware}/seo/listSeoMap`);
const helpers = global.yoho.helpers;
const _ = require('lodash');
const tdk = require('../../../utils/getTDK');
// 搜索相关接口
const searchApi = require(`${mRoot}/search-api`);
// 店铺页
const shop = (shopId, req, res, next, brandInfo) => {
let domain = req.query.domain,
params = req.query;
_.unset(params, 'domain');
shopId = parseInt(shopId, 10);
Object.assign(params, {shopId: shopId});
tdk('shop', shopId, req).then(TDKObj => {
if (TDKObj[0]) {
req.tdk = {
title: TDKObj[1],
keywords: TDKObj[2],
description: TDKObj[3]
};
}
return list.getShopInfo(shopId, req.user.uid).then(shopInfo => {
let pjax = params._pjax;
// 获取不到店铺信息跳转至首页
if (!shopInfo || _.isEmpty(shopInfo)) {
return res.redirect(helpers.urlFormat('', null, ''));
}
// 比较品牌域名与店铺域名是否一致,不一致跳转至店铺域名
if (!pjax && shopInfo.domain && domain && domain !== _.toLower(shopInfo.domain)) {
res.redirect(helpers.urlFormat('', params, shopInfo.domain));
return;
}
if (+shopInfo.shopTemplateType === 2) { // 经典模板
if (pjax) {
list.getShopGoodsData(shopId, req.yoho.channel, params, shopInfo).then(result => {
Object.assign(result, {
shopId: shopId,
layout: false
});
res.render('list/goods-list', result);
}).catch(next);
return;
}
list.getShopData(shopId, req.yoho.channel, params, shopInfo).then(result => {
Object.assign(result, {
page: 'shop',
shopId: shopId
});
// 店铺装修为空则不cache
if (!result.shopTopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('list/shop-index', result);
}).catch(next);
} else { // 基础模板
list.getBaseShopData(params, Object.assign({uid: req.user.uid}, brandInfo),
req.yoho.channel, shopId).then(result => {
Object.assign(result, {page: 'list'});
// 基础店铺装修为空则不cache
if (!result.brand || !result.brand.shopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('list/brand', result);
}).catch(next);
}
});
}).catch(next);
};
/**
* 商品分类列表页
* @param {[type]} req [description]
... ... @@ -186,47 +109,6 @@ exports.newWithChannel = (req, res, next) => {
};
/**
* 品牌页
* @param {[type]} req [description]
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.brand = (req, res, next) => {
let brandDomain = req.query.domain;
let shopId = req.query.shopId;
// shopId存在,直接走店铺
if (shopId) {
return shop(shopId, req, res, next);
}
if (!brandDomain) {
return next();
}
// 获取品牌信息
list.getBrandInfo({domain: brandDomain}).then(brandInfo => {
if (!brandInfo.hasOwnProperty('type')) {
return res.redirect(helpers.urlFormat(''));
}
switch (parseInt(brandInfo.type, 10)) {
case 1: // 搜索
res.redirect(helpers.urlFormat('', {query: brandInfo.brandDomain}, 'search'));
break;
case 2: // 店铺
return shop(brandInfo.shopId, req, res, next, brandInfo);
default: // 品牌
res.redirect(helpers.urlFormat('', {
query: brandInfo.brandDomain,
brand: brandInfo.brandId
}, 'search'));
break;
}
}).catch(next);
};
/**
* 品牌介绍页
* @param {[type]} req [description]
* @param {[type]} res [description]
... ... @@ -252,36 +134,6 @@ exports.brandAbout = (req, res, next) => {
};
/**
* 店铺商品列表页
* @param {[type]} req [description]
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.shopList = (req, res, next) => {
let shopId = req.query.shopId;
if (!shopId) {
return next();
}
list.getShopListData(req.yoho.channel, req.query, req.user.uid).then(result => {
Object.assign(result, {
page: 'shop',
shopId: shopId
});
if (req.query.query) {
result.shopKey = req.query.query;
}
// 店铺装修为空则不cache
if (!result.shopTopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('list/shop-list', result);
}).catch(next);
};
/**
* ajax调用品牌页左侧水牌
* @param {[type]} req [description]
* @param {[type]} res [description]
... ...
'use strict';
const mRoot = '../models';
const shopModel = require(`${mRoot}/shop-service`);
const tdk = require('../../../utils/getTDK');
// 店铺首页(经典&基础)
exports.index = (req, res, next) => {
let domain = req.query.domain;
let shopId = req.query.shopId;
if (!domain) {
return next();
}
if (req.xhr && req.query._pjax && shopId) {
return shopModel.getShopGoodsData(shopId, req.yoho.channel, req.query).then(result => {
Object.assign(result, {
shopId: shopId,
layout: false
});
res.render('list/goods-list', result);
});
}
return Promise.all([
tdk('shop', shopId, req),
shopModel.getShopInfoAsync(domain, req.yoho.channel, req.query)
]).then(result => {
let TDKObj = result[0],
shopObj = result[1];
if (TDKObj && TDKObj[0]) {
req.tdk = {
title: TDKObj[1],
keywords: TDKObj[2],
description: TDKObj[3]
};
}
// 数据异常,重定向
if (shopObj.redirect) {
return res.redirect(shopObj.redirect);
}
if (shopObj.templateType === 2) { // 经典模板
Object.assign(shopObj, {page: 'shop'});
// 店铺装修为空则不cache
if (!shopObj.shopTopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('shop/index', shopObj);
} else { // 基础模版
Object.assign(shopObj, {page: 'list'});
// 基础店铺装修为空则不cache
if (!shopObj.brand || !shopObj.brand.shopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('list/brand', shopObj);
}
}).catch(next);
};
// 经典店铺列表
exports.list = (req, res, next) => {
let shopId = req.query.shopId;
if (!shopId) {
return next();
}
return shopModel.getShopListInfoAsync(req.yoho.channel, req.query).then(result => {
Object.assign(result, {
page: 'shop',
shopId: shopId,
shopKey: req.query.query || ''
});
// 店铺装修为空则不cache
if (!result.shopTopBanner) {
res.set('Cache-Control', 'no-cache');
}
res.render('shop/list', result);
}).catch(next);
};
// 经典店铺推荐文章
exports.article = (req, res, next) => {
let brands = req.query.brands;
if (!brands) {
return next();
}
return shopModel.getShopArticleByBrandsAsync(brands).then(result => {
res.render('shop/article', Object.assign(result, {layout: false}));
}).catch(next);
};
... ...
... ... @@ -155,7 +155,7 @@ const getLikeAsync = (skn, limit) => {
method: 'app.search.findLike',
limit: limit || 10,
product_skn: skn
});
}, {cache: 86400});
};
// 根据small_sort从redis获取分类下的关键词
... ...
... ... @@ -1050,11 +1050,11 @@ const _getSeoByGoodsInfo = (goodsInfo, navs) => {
title += goodsInfo.name + '正品 | YOHO!BUY 有货';
let keywords = brandName + sortName + ',' + brandName + '官网专卖店,' + brandName + '官方授权店,' +
let keywords = brandName + sortName + ',' + brandName + '专卖店,' + brandName + '官方授权店,' +
brandName + '正品,' + brandName + '打折,' + brandName + '折扣店,' + brandName + '真品,' + brandName + '代购';
let description = `YOHO!BUY 有货-${brandName}官方授权店,${goodsInfo.name}图片、报价、介绍。` +
`YOHO!BUY 有货${brandName}官网专卖店提供${brandName}正品、${brandName}真品、 ${brandName}打折、${brandName}代购等。`;
`YOHO!BUY 有货${brandName}专卖店提供${brandName}正品、${brandName}真品、 ${brandName}打折、${brandName}代购等。`;
let cononicalURL = goodsInfo.productUrl;
... ... @@ -1145,6 +1145,9 @@ const _detailDataPkg = (origin, uid, vipLevel, cookies) => {
// 定金预售
result.deposit = propOrigin('is_deposit_advance', 'N');
// 定金定时预售商品
result.limitTime = propOrigin('is_limit_time_advance', 'N');
// 秒杀商品
result.secKill = propOrigin('is_secKill', 'N');
... ... @@ -1445,6 +1448,11 @@ const _detailDataPkg = (origin, uid, vipLevel, cookies) => {
result.addToCart = false;
}
// 定金定时预售商品
if (result.limitTime === 'Y') {
result.addToCart = false;
}
// 线下店商品类型
result.storeStatus = propOrigin('store_show_status', 1);
... ...
... ... @@ -149,8 +149,8 @@ const _getProductSeoData = (detail) => {
resData = {
title: `${bn} | ${gn}正品 | YOHO!BUY 有货`,
keywords: `${bn},${bn}官网专卖店,${bn}官方授权店,${bn}正品,${bn}打折,${bn}折扣店,${bn}真品,${bn}代购`,
description: `YOHO!BUY 有货-${bn}官方授权店,${gn}图片、报价、介绍。YOHO!BUY 有货${bn}官网专卖店提供${bn}正品、${bn}真品、 ${bn}打折、${bn}代购等。` // eslint-disable-line
keywords: `${bn},${bn}专卖店,${bn}官方授权店,${bn}正品,${bn}打折,${bn}折扣店,${bn}真品,${bn}代购`,
description: `YOHO!BUY 有货-${bn}官方授权店,${gn}图片、报价、介绍。YOHO!BUY 有货${bn}专卖店提供${bn}正品、${bn}真品、 ${bn}打折、${bn}代购等。` // eslint-disable-line
};
}
... ...
... ... @@ -23,34 +23,12 @@ const brandFolderSeries = '经典系列';
const folderTitle = '经典款型';
const seriesTitle = '经典系列';
// 经典店铺list url
const shopListUrl = '/product/shoplist';
// 搜索分类信息需要的参数
const positionId = 10;
// 获取分类左侧广告id
const sortAdsId = 79;
const _getGender = (channel) => {
let gender;
switch (channel) {
case 'boys':
gender = '1,3';
break;
case 'girls':
gender = '2,3';
break;
default:
gender = '1,2,3';
break;
}
return gender;
};
/**
* 获取商品分类列表数据
*/
... ... @@ -566,402 +544,6 @@ const getShopInfo = (shopId, uid) => {
});
};
/**
* 获取经典模板店铺数据
* @param shopId
* @param uid
* @param params
* @param shopInfo 店铺介绍
*/
const getShopData = (shopId, channel, params, shopInfo) => {
let gender = _getGender(channel);
params = params || {};
params.shopId = shopId;
return Promise.all([
headerModel.requestHeaderData(channel), // 头部数据
searchApi.getShopDecorator(shopId), // 店铺装修数据
searchApi.getProductList(Object.assign({
shop_id: shopId
}, params), 'shop'), // 搜索店铺商品
searchApi.getShopBrands(shopId), // 店铺品牌数据
shopApi.shopCouponListAsync(shopId) // 店铺优惠券数据
]).then(result => {
let finalResult = {};
Object.assign(finalResult,
result[0], // 头部数据
searchHandler.handlePathNavData(shopInfo, params, 'shop', channel), // 面包屑导航
searchHandler.getBrandShopSeo(channel, {shopName: shopInfo.shopName || shopInfo.brandName}, params) // 店铺SEO
);
_.set(finalResult, 'headerData.header', true);
// 店铺装修
if (result[1].code === 200) {
Object.assign(finalResult, shopHandler.getShopDecorator(result[1].data, params, shopId));
_.set(finalResult, 'shopTopBanner.brandIntro', {
shopId: shopId,
brandName: shopInfo.brandName || '',
isFavorite: shopInfo.isFavorite || false,
brandCont: shopInfo.brandCont || ''
});
} else {
return Promise.reject('No ShopDecorator data');
}
// 获取商品数据和顶部筛选条件
if (result[2].code === 200) {
let allGoods = {
name: '全部商品 ALL',
sort: searchHandler.handleOptsData(params, _.get(result[2], 'data.total', 0)),
list: productProcess.processProductList(_.get(result[2], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
}),
href: `/product/shoplist?navBar=1&shopId=${shopId}`
};
_.set(allGoods, 'sort.newPage', true); // 启用新的分页导航
finalResult.allGoods = allGoods;
}
let sknList = []; // 资源位配置商品skn
let prodList = _.concat(_.get(finalResult, 'newArrivel.list', []),
_.get(finalResult, 'hotSingle.list', []));
_.forEach(prodList, value => {
sknList.push(value.productSkn);
});
let articleApiMethod = [], // 通过品牌获取相关文章接口
apiMethod = [
searchApi.getProductList({
viewNum: sknList.length,
query: _.join(_.uniq(sknList), ',')
}, 'shop')
];
if (result[3].code === 200 && result[3].data) {
_.forEach(result[3].data, value => {
articleApiMethod.push(
searchApi.getArticleByBrand(value.brand_id, 'udid') // 品牌推荐文章
);
});
}
if (result[4].data && !_.isEmpty(result[4].data)) {
finalResult.coupon = searchHandler.handleBrandShopCoupons(result[4].data, {shopId: shopId});
}
// 根据店铺id获取分类
apiMethod.push(searchApi.getSortList({shop_id: shopId}));
apiMethod = _.concat(apiMethod, articleApiMethod);
return Promise.all(apiMethod).then(subRes => {
// 设置资源位商品封面图
if (subRes[0].code === 200) {
let list = {};
prodList = productProcess.processProductList(_.get(subRes[0], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
});
_.forEach(prodList, value => {
list[value.product_skn] = {
img: value.default_images,
title: value.product_name,
price: ${value.sales_price}`
};
});
if (_.has(finalResult, 'newArrivel.list')) {
_.forEach(finalResult.newArrivel.list, value => {
if (list[value.productSkn]) {
Object.assign(value, list[value.productSkn]);
}
});
}
if (_.has(finalResult, 'hotSingle.list')) {
_.forEach(finalResult.hotSingle.list, value => {
if (list[value.productSkn]) {
Object.assign(value, list[value.productSkn]);
}
});
}
}
if (subRes[1].code === 200) {
let groupSort = _.get(subRes[1], 'data', []);
finalResult.leftContent = searchHandler.handleSortData(groupSort, params, params, '/product/shoplist');
_.set(finalResult, 'brandShopAd', {baseUrl: shopListUrl});
if (finalResult.allGoods) {
Object.assign(finalResult.allGoods, searchHandler.setShopSort(groupSort, Object.assign({},
params, {page: 1})), searchHandler.setGenderFilter(params));
}
}
let articleList = [];
for (let i = 2; i < subRes.length; i++) {
articleList = _.concat(articleList, _.get(subRes[i], 'data', []));
}
if (articleList.length >= 3) {
let trendList = [];
for (let i = 0; i < 3; i++) {
trendList.push({
href: helpers.urlFormat(`/guang/${articleList[i].id}.html`, null),
src: helpers.getForceSourceUrl(articleList[i].src) +
'?imageView2/1/w/{width}/h/{height}',
mainTitle: articleList[i].title,
Subtitle: articleList[i].intro
});
articleList = _.concat(articleList, _.get(subRes[i], 'data', []));
}
finalResult.trendInfo = {
name: '潮流资讯 HOT ITEMS',
trendList: trendList
};
}
return finalResult;
});
});
};
/**
* 获取店铺商品数据
*/
const getShopGoodsData = (shopId, channel, params) => {
let gender = _getGender(channel);
let resData = {};
_.unset(params, '_pjax');
return Promise.all([
searchApi.getProductList(Object.assign({
shop_id: shopId
}, params), 'shop'), // 搜索店铺商品
searchApi.getSortList({shop_id: shopId}) // 根据店铺id获取分类
]).then(result => {
// 获取商品数据和顶部筛选条件
if (result[0].code === 200) {
Object.assign(resData, {
sort: searchHandler.handleOptsData(params, _.get(result[0], 'data.total', 0)),
list: productProcess.processProductList(_.get(result[0], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
})
});
_.set(resData, 'sort.newPage', true); // 启用新的分页导航
}
if (result[1].code === 200) {
let groupSort = _.get(result[1], 'data', []);
Object.assign(resData, searchHandler.setShopSort(groupSort, Object.assign({}, params,
{page: 1})), searchHandler.setGenderFilter(params));
}
return resData;
});
};
const getShopListData = (channel, params, uid) => {
let gender = _getGender(channel),
shopId = params.shopId,
navBar = params.navBar || 1;
let apiArr = [
headerModel.requestHeaderData(channel), // 头部数据
searchApi.getShopDecorator(shopId), // 店铺装修数据
searchApi.getShopInfo(shopId, uid), // 店铺介绍
searchApi.getProductList(Object.assign({shop_id: shopId}, params,
{limit: (params.limit || 60) - 1}), 'shop'), // 搜索店铺商品
searchApi.getSortList({shop_id: shopId}) // 店铺分类
];
if (_.has(params, 'query')) {
// 如果有店内搜索,则并行查询店铺所有商品,搜索不到商品则显示所有商品
apiArr.push(searchApi.getProductList(Object.assign({shop_id: shopId},
params, {query: ''}), 'shop')); // 搜索店铺所有商品
}
return Promise.all(apiArr).then(result => {
let finalResult = {
headerData: Object.assign(result[0].headerData, {header: true})
};
// 面包屑导航
Object.assign(finalResult, searchHandler.handlePathNavData({}, params, 'shop', channel));
// 店铺装修
if (result[1].code === 200) {
Object.assign(finalResult, shopHandler.getShopDecorator(result[1].data, params, shopId));
// 设置shop nav选中状态
_.set(finalResult, `navigationBar[${navBar}].current`, true);
if (result[2].code === 200) {
let data = _.get(result[2], 'data', {});
_.set(finalResult, 'shopTopBanner.brandIntro', {
shopId: shopId,
brandName: data.shop_name || '',
isFavorite: data.is_favorite === 'Y',
brandCont: data.shop_intro || ''
});
// 店铺SEO
Object.assign(finalResult, searchHandler.getBrandShopSeo(channel, {
shopName: data.shop_name
}, params));
}
} else {
return Promise.reject('No ShopDecorator data');
}
// 获取商品数据和顶部筛选条件
if (result[3].code === 200) {
let info = result[3];
let goodsList = _.get(info, 'data.product_list', []);
if (goodsList.length) {
let totalPage = _.get(info, 'data.total', 1);
Object.assign(finalResult, {
filters: searchHandler.handleFilterDataAll(info.data, params),
opts: searchHandler.handleOptsData(params, totalPage),
goods: productProcess.processProductList(goodsList, {
newCoverSort: true,
showDiscount: false,
gender: _getGender(channel),
query: params.query
}),
hasNextPage: searchHandler.handleNextPage(params, totalPage),
footPager: searchHandler.handlePagerData(totalPage, params)
});
_.set(finalResult, 'filters.checkedConditions.clearUrl',
`?navBar=${params.navBar}&shopId=${params.shopId}`);
} else {
finalResult.searchEmpty = true;
if (result[5] && result[5].code === 200) {
let allGoods = {
name: '全部商品 ALL',
sort: searchHandler.handleOptsData(params, _.get(result[5], 'data.total', 0)),
list: productProcess.processProductList(_.get(result[5], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
})
};
_.set(allGoods, 'sort.newPage', true); // 启用新的分页导航
finalResult.allGoods = allGoods;
}
}
}
if (result[4].code === 200) {
let groupSort = _.get(result[4], 'data', []),
noPageQs = Object.assign({}, params, {page: 1});
finalResult.leftContent = searchHandler.handleSortData(groupSort, noPageQs, params);
_.set(finalResult, 'brandShopAd', {baseUrl: shopListUrl});
if (finalResult.allGoods) {
Object.assign(finalResult.allGoods, searchHandler.setShopSort(groupSort, noPageQs));
}
}
finalResult.criteo = {skn: searchHandler.getCriteo(_.get(finalResult, 'goods'))};
return finalResult;
});
};
/**
* 获取基础模板店铺数据
*/
const getBaseShopData = (params, extra, channel, shopId) => {
let resData = {};
params.shopId = shopId;
return Promise.all([
getBrandData(params, extra, channel),
searchApi.getShopDecorator(shopId), // 店铺装修数据
searchApi.getShopInfo(shopId, extra.uid),
shopApi.shopCouponListAsync(shopId) // 店铺优惠券数据
]).then(result => {
let brand = result[0] || {};
Object.assign(resData, brand);
if (result[1].code === 200) {
let data = result[1].data || {},
decorator = shopHandler.getShopDecorator(data, {}, shopId, true);
Object.assign(decorator.shopTopBannerBase || {}, {
shopId: shopId,
bannerHeight: 150,
shopHome: `/?shopId=${shopId}`,
shopIntro: `/shop${shopId}-about`,
coled: _.get(result[2], 'data.is_favorite', 'N') === 'Y'
});
_.set(resData, 'brand.shopBanner', decorator.shopTopBannerBase);
_.unset(resData, 'brand.brandBanner');
if (decorator.signboard) {
_.unset(resData, 'brand.node');
_.set(resData, 'brand.signboard', decorator.signboard);
}
}
if (result[2].code === 200) {
let shopName = _.get(result[2], 'data.shop_name', '');
_.set(resData, 'brand.shopBanner.shopName', shopName);
_.set(resData, 'brand.pathNav[2]', {
name: shopName,
pathTitle: shopName
});
// 店铺SEO
Object.assign(resData, searchHandler.getBrandShopSeo(channel, {
shopName: shopName
}, params));
}
_.unset(resData, 'brand.coupon');
if (result[3].data && !_.isEmpty(result[3].data)) {
_.set(resData, 'brand.coupon',
searchHandler.handleBrandShopCoupons(result[3].data, {shopId: shopId}));
}
return resData;
});
};
const getUserCoupunStatus = (id, uid, type) => {
if (type === 'shop') {
return shopApi.shopCouponListAsync(id, uid).then(result => {
... ... @@ -1004,9 +586,5 @@ module.exports = {
getNodeContentData,
getAdnav,
getShopInfo,
getShopData,
getShopGoodsData,
getShopListData,
getBaseShopData,
getUserCoupunStatus
};
... ...
... ... @@ -1595,8 +1595,8 @@ exports.getBrandShopSeo = (channel, info, qs) => {
});
} else {
Object.assign(resData, {
title: `${params.nameEn} | ${params.name}官网`,
keywords: `${params.nameEn}, ${params.name}官网`,
title: `${params.nameEn} | ${params.name}旗舰店`,
keywords: `${params.nameEn}, ${params.name}旗舰店`,
description: `${params.nameEn}正品网购。${params.name}官方授权!`
});
}
... ...
... ... @@ -49,3 +49,18 @@ exports.queryShopsByBrandId = (sid, bid) => {
shop_id: sid
});
};
/**
* 根据shopId获取店铺基本信息
* @return
*/
exports.getShopInfo = (shopId, uid) => {
let finalParams = {
method: 'app.shops.getIntro',
shop_id: shopId || 0,
uid: uid || 0
};
return api.get('', finalParams, config.apiCache);
};
... ...
... ... @@ -355,21 +355,26 @@ const _handleSaleCategory = (shopId, baseUrl, resourceObj) => {
*/
exports.getShopDecorator = (data, params, shopId, base) => {
let dest = {};
let sourceFn;
if (base) {
sourceFn = {
signboard(info) {
dest.signboard = signboard(info);
},
shopTopBanner_base(info) {
Object.assign(dest, shopTopBannerBase(info));
}
};
_.forEach(data.list, (value) => {
if (!sourceFn[value.resource_name]) {
return;
}
let info = Fn.pipe(JSON.parse, _.partial(_handleSaleCategory, shopId, ''))(value.resource_data || '[]');
switch (value.resource_name) {
case 'signboard':
dest.signboard = signboard(info);
break;
case 'shopTopBanner_base':
Object.assign(dest, shopTopBannerBase(info));
break;
default:
break;
}
sourceFn[value.resource_name](info);
});
} else {
Object.assign(dest, {
... ... @@ -377,46 +382,50 @@ exports.getShopDecorator = (data, params, shopId, base) => {
hotSingle: {}
});
sourceFn = {
newProducts(info) {
Object.assign(dest.newArrivel, newProducts(info));
},
hotProducts(info) {
Object.assign(dest.hotSingle, hotProducts(info));
},
goodsTabBar(info) {
let tabBar = goodsTabBar(info, shopId);
Object.assign(dest.newArrivel, {navs: tabBar.new});
Object.assign(dest.hotSingle, {navs: tabBar.hot});
},
shopTopBanner(info) {
Object.assign(dest, shopTopBanner(info));
},
navigationBar(info) {
Object.assign(dest, navigationBar(info, shopId, params));
},
largeSlideImg(info) {
Object.assign(dest, largeSlideImg(info, shopId));
},
oneRowTwoColImages(info) {
Object.assign(dest, oneRowTwoColImages(info, shopId));
},
recommend(info) {
Object.assign(dest, recommend(info, shopId));
},
brandBrowse(info) {
Object.assign(dest, brandBrowse(info, params));
},
hotRecommend(info) {
Object.assign(dest, hotRecommend(info));
}
};
_.forEach(data.list, (value) => {
let info = Fn.pipe(JSON.parse, _.partial(_handleSaleCategory, shopId, shopListUrl))(value.resource_data || '[]'); // eslint-disable-line
let tabBar;
switch (value.resource_name) {
case 'newProducts':
Object.assign(dest.newArrivel, newProducts(info));
break;
case 'hotProducts':
Object.assign(dest.hotSingle, hotProducts(info));
break;
case 'goodsTabBar':
tabBar = goodsTabBar(info, shopId);
Object.assign(dest.newArrivel, {navs: tabBar.new});
Object.assign(dest.hotSingle, {navs: tabBar.hot});
break;
case 'shopTopBanner':
Object.assign(dest, shopTopBanner(info));
break;
case 'navigationBar':
Object.assign(dest, navigationBar(info, shopId, params));
break;
case 'largeSlideImg':
Object.assign(dest, largeSlideImg(info, shopId));
break;
case 'oneRowTwoColImages':
Object.assign(dest, oneRowTwoColImages(info, shopId));
break;
case 'recommend':
Object.assign(dest, recommend(info, shopId));
break;
case 'brandBrowse':
Object.assign(dest, brandBrowse(info, params));
break;
case 'hotRecommend':
Object.assign(dest, hotRecommend(info));
break;
default:
break;
if (!sourceFn[value.resource_name]) {
return;
}
let info = Fn.pipe(JSON.parse, _.partial(_handleSaleCategory, shopId, shopListUrl))(value.resource_data || '[]'); // eslint-disable-line
sourceFn[value.resource_name](info);
});
}
... ...
... ... @@ -6,10 +6,43 @@
const Promise = require('bluebird');
const co = Promise.coroutine;
const _ = require('lodash');
const helpers = global.yoho.helpers;
const api = require('./shop-api');
const searchApi = require('./search-api');
const shopHandler = require('./shop-handler');
const searchHandler = require('./search-handler');
const headerModel = require('../../../doraemon/models/header');
const productProcess = require('../../../utils/product-process');
const DEFAULT_IMG = '01091c21f2317a64f123f1649fbbccf7ba';
// 经典店铺list url
const shopListUrl = '/product/shoplist';
const needParams = ['query', 'msort', 'misort', 'category_id', 'gender', 'shelveTime'];
/**
* channel=>gender
*/
const _getGender = (channel) => {
let gender;
switch (channel) {
case 'boys':
gender = '1,3';
break;
case 'girls':
gender = '2,3';
break;
default:
gender = '1,2,3';
break;
}
return gender;
};
/**
* 生成缩略图
*/
... ... @@ -54,6 +87,477 @@ const _shopTopBanner = data => {
const _shopTopBannerBase = _shopTopBanner;
const _getShopData = (channel, params, shopInfo) => {
params = params || {};
let gender = _getGender(channel),
shopId = params.shopId;
let resData = {shopId: shopId};
return co(function * () {
let result = yield Promise.props({
header: headerModel.requestHeaderData(channel), // 头部数据
sort: searchApi.getSortList({shop_id: shopId}),
decorator: searchApi.getShopDecorator(shopId), // 店铺装修数据
product: searchApi.getProductList(Object.assign({shop_id: shopId,
need_filter: 'no'}, params), 'shop'), // 搜索店铺商品
brands: searchApi.getShopBrands(shopId), // 店铺品牌数据
coupons: api.shopCouponListAsync(shopId), // 店铺优惠券数据
shopInfo: shopInfo ? Promise.resolve(shopInfo) : api.getShopInfo(shopId)
});
if (!shopInfo) {
shopInfo = _.get(result, 'shopInfo.data', {});
}
Object.assign(resData,
result.header, // 头部数据
searchHandler.handlePathNavData({brandName: shopInfo.shop_name}, params, 'shop', channel), // 面包屑导航
searchHandler.getBrandShopSeo(channel, {shopName: shopInfo.shop_name}, params) // 店铺SEO
);
_.set(resData, 'headerData.header', true);
// 店铺装修
if (result.decorator.code === 200) {
Object.assign(resData, shopHandler.getShopDecorator(result.decorator.data, params, shopId));
_.set(resData, 'shopTopBanner.brandIntro', {
shopId: shopId,
brandName: shopInfo.shop_name || '',
brandCont: shopInfo.shop_intro || ''
});
} else {
return Promise.reject('No ShopDecorator data');
}
// 获取商品数据和顶部筛选条件
if (result.product.code === 200) {
let data = result.product.data;
let allGoods = {
name: '全部商品 ALL',
sort: searchHandler.handleOptsData(params, _.get(data, 'total', 0)),
list: productProcess.processProductList(_.get(data, 'product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
}),
href: `/product/shoplist?navBar=1&shopId=${shopId}`
};
_.set(allGoods, 'sort.newPage', true); // 启用新的分页导航
resData.allGoods = allGoods;
}
// 店铺类目
if (result.sort.code === 200) {
let groupSort = _.get(result.sort, 'data', []);
resData.leftContent = searchHandler.handleSortData(groupSort, params, params, shopListUrl);
_.set(resData, 'brandShopAd', {baseUrl: shopListUrl});
if (resData.allGoods) {
Object.assign(resData.allGoods, searchHandler.setShopSort(groupSort, Object.assign({},
params, {page: 1})), searchHandler.setGenderFilter(params));
}
}
// 店铺优惠券
if (result.coupons.data && !_.isEmpty(result.coupons.data)) {
resData.coupon = searchHandler.handleBrandShopCoupons(result.coupons.data, {shopId: shopId});
}
let sknList = []; // 资源位配置商品skn
let prodList = _.concat(_.get(resData, 'newArrivel.list', []),
_.get(resData, 'hotSingle.list', []));
_.forEach(prodList, value => {
sknList.push(value.productSkn);
});
let apiMethod = [
searchApi.getProductList({
viewNum: sknList.length,
query: _.join(_.uniq(sknList), ',')
}, 'shop')
];
// 店铺品牌
if (result.brands.code === 200 && result.brands.data) {
let brands = [];
_.forEach(result.brands.data, value => {
brands.push(value.brand_id);
});
resData.shopBrands = brands.join(',');
}
let subRes = yield Promise.all(apiMethod);
// 设置资源位商品封面图
if (subRes[0].code === 200) {
let list = {};
prodList = productProcess.processProductList(_.get(subRes[0], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
});
_.forEach(prodList, value => {
list[value.product_skn] = {
img: value.default_images,
title: value.product_name,
price: ${value.sales_price}`
};
});
if (_.has(resData, 'newArrivel.list')) {
_.forEach(resData.newArrivel.list, value => {
if (list[value.productSkn]) {
Object.assign(value, list[value.productSkn]);
}
});
}
if (_.has(resData, 'hotSingle.list')) {
_.forEach(resData.hotSingle.list, value => {
if (list[value.productSkn]) {
Object.assign(value, list[value.productSkn]);
}
});
}
}
resData.trendInfo = true; // 展示店铺推荐文章
return resData;
})();
};
/**
* 获取基础模板店铺数据
*/
const _getBaseShopData = (channel, params, shopInfo) => {
params = params || {};
let searchParams = searchHandler.getSearchParams(params);
let shopId = params.shopId;
return co(function * () {
let result = yield Promise.props({
header: headerModel.requestHeaderData(channel), // 头部数据
sort: searchApi.getSortList({shop_id: shopId}),
decorator: searchApi.getShopDecorator(shopId), // 店铺装修数据
product: searchApi.getProductList(Object.assign(searchParams,
{shop_id: shopId}), 'shop'), // 搜索店铺商品
coupons: api.shopCouponListAsync(shopId), // 店铺优惠券数据
shopInfo: shopInfo ? Promise.resolve(shopInfo) : api.getShopInfo(shopId)
});
if (!shopInfo) {
shopInfo = _.get(result, 'shopInfo.data', {});
}
const shopName = shopInfo.shop_name;
let resData = {
shopId: shopId,
brand: Object.assign({brandShopAd: true},
searchHandler.handlePathNavData({brandName: shopName}, params, 'shop', channel))
};
Object.assign(resData,
result.header, // 头部数据
searchHandler.getBrandShopSeo(channel, {shopName: shopName}, params));
_.set(resData, 'headerData.header', true);
_.set(resData, 'brand.shopBanner', {
shopId: shopId,
shopName: shopName,
shopHome: `/?shopId=${shopId}`,
shopIntro: `/shop${shopId}-about`
});
// 店铺装修
if (result.decorator.code === 200) {
let data = result.decorator.data || {},
decorator = shopHandler.getShopDecorator(data, {}, shopId, true);
Object.assign(resData.brand.shopBanner, decorator.shopTopBannerBase || {});
// 设置店招高度
_.set(resData, 'brand.shopBanner.bannerHeight', 150);
if (decorator.signboard) {
_.set(resData, 'brand.signboard', decorator.signboard);
}
}
// 获取左侧类目数据
if (result.sort.code === 200) {
let dps = {shopId: shopId};
_.forEach(needParams, value => {
if (params[value]) {
dps[value] = params[value];
}
});
Object.assign(resData.brand, {
leftContent: searchHandler.handleSortData(result.sort.data, dps, params)
});
}
// 获取商品数据和顶部筛选条件
if (result.product.code === 200) {
let data = result.product.data;
let filters = Object.assign(searchHandler.handleFilterDataAll(data, params),
resData.brand.leftContent.sort);
filters.checkedConditions.conditions = _.concat(filters.checkedConditions.conditions,
resData.brand.leftContent.checked);
Object.assign(resData.brand, {
filters: filters,
opts: searchHandler.handleOptsData(params, data.total, data.filter),
totalCount: data.total,
footPager: searchHandler.handlePagerData(data.total, params),
goods: productProcess.processProductList(data.product_list,
Object.assign({showDiscount: false, from: {type: 'shop', params: params}}, params)),
hasNextPage: searchHandler.handleNextPage(params, data.total),
// 最近浏览记录
latestWalk: 7
});
// 店铺页不显示品牌筛选项
_.unset(resData, 'brand.filters.brand');
}
// 店铺优惠券
if (result.coupons && !_.isEmpty(result.coupons.data)) {
_.set(resData, 'brand.coupon',
searchHandler.handleBrandShopCoupons(result.coupons.data, {shopId: shopId}));
}
return resData;
})();
};
exports.getShopInfoAsync = (domain, channel, params) => {
let resData;
let shopId = _.get(params, 'shopId');
return co(function * () {
let data, shopInfo;
_.unset(params, 'domain');
domain = _.toLower(domain);
if (shopId) { // 带id访问
let result = yield api.getShopInfo(shopId);
data = result.data;
// 根据店铺ID,未取到店铺信息,跳转至首页
if (result.code !== 200 || _.isEmpty(data)) {
return {redirect: helpers.urlFormat('')};
}
let lowResDomain = _.toLower(data.shop_domain);
// 根据店铺ID取到的店铺domain与链接中domain不一致,跳转至店铺域名下(解决店铺域名与品牌域名混用的问题)
if (lowResDomain !== domain) {
return {redirect: helpers.urlFormat('', params, lowResDomain)};
}
shopInfo = data;
} else { // 以店铺域名方式直接访问
let result = yield searchApi.getBrandData({domain: domain});
data = result.data;
// 未取到domain信息,跳转至首页
if (result.code !== 200) {
return {redirect: helpers.urlFormat('')};
}
// domain类型不为店铺,跳转至搜索
if (data.type * 1 !== 2) {
let d = {query: domain};
if (data.id) {
d.brand = data.id;
}
return {redirect: helpers.urlFormat('', d, 'search')};
}
params.shopId = data.shop_id;
}
if (+data.shop_template_type === 2) { // 经典店铺
resData = yield _getShopData(channel, params, shopInfo);
} else {
resData = yield _getBaseShopData(channel, params, shopInfo);
}
return Object.assign(resData, {templateType: +data.shop_template_type});
})();
};
exports.getShopListInfoAsync = (channel, params) => {
let gender = _getGender(channel),
shopId = params.shopId,
navBar = params.navBar || 1;
let searchParams = searchHandler.getSearchParams(params);
return co(function * () {
let result = yield Promise.props({
header: headerModel.requestHeaderData(channel), // 头部数据
shopInfo: api.getShopInfo(shopId), // 店铺介绍
decorator: searchApi.getShopDecorator(shopId), // 店铺装修数据
sort: searchApi.getSortList({shop_id: shopId}),
product: searchApi.getProductList(Object.assign(searchParams,
{shop_id: shopId}), 'shop'), // 搜索店铺商品
// 如果有店内搜索,则并行查询店铺所有商品,搜索不到商品则显示所有商品
allProduct: params.query ? searchApi.getProductList(Object.assign(searchParams,
{shop_id: shopId, query: ''}), 'shop') : Promise.resolve({})
});
let resData = {headerData: Object.assign(result.header.headerData, {header: true})};
Object.assign(resData, searchHandler.handlePathNavData({}, params, 'shop', channel));
// 店铺装修
if (result.decorator.code === 200) {
Object.assign(resData, shopHandler.getShopDecorator(result.decorator.data, params, shopId));
// 设置shop nav选中状态
_.set(resData, `navigationBar[${navBar}].current`, true);
if (result.shopInfo.code === 200) {
let data = _.get(result, 'shopInfo.data', {});
_.set(resData, 'shopTopBanner.brandIntro', {
shopId: shopId,
brandName: data.shop_name || '',
brandCont: data.shop_intro || ''
});
// 店铺SEO
Object.assign(resData, searchHandler.getBrandShopSeo(channel, {
shopName: data.shop_name
}, params));
}
} else {
return Promise.reject('No ShopDecorator data');
}
// 获取商品数据和顶部筛选条件
if (result.product.code === 200) {
let info = result.product;
let goodsList = _.get(info, 'data.product_list', []);
if (goodsList.length) {
let totalPage = _.get(info, 'data.total', 1);
Object.assign(resData, {
filters: searchHandler.handleFilterDataAll(info.data, params),
opts: searchHandler.handleOptsData(params, totalPage),
goods: productProcess.processProductList(goodsList, {
newCoverSort: true,
showDiscount: false,
gender: _getGender(channel),
query: params.query
}),
hasNextPage: searchHandler.handleNextPage(params, totalPage),
footPager: searchHandler.handlePagerData(totalPage, params)
});
_.set(resData, 'filters.checkedConditions.clearUrl',
`?navBar=${params.navBar}&shopId=${params.shopId}`);
} else {
resData.searchEmpty = true;
let data = _.get(result, 'allProduct.data.total', 0);
let plist = _.get(data, 'product_list', []);
if (params.query && plist.length) {
resData.allGoods = {
name: '全部商品 ALL',
sort: searchHandler.handleOptsData(params, data.total || 0),
list: productProcess.processProductList(plist, {
newCoverSort: true,
showDiscount: false,
gender: gender
})
};
_.set(resData.allGoods, 'sort.newPage', true); // 启用新的分页导航
}
}
}
if (result.sort.code === 200) {
let groupSort = _.get(result.sort, 'data', []),
noPageQs = Object.assign({}, params, {page: 1});
resData.leftContent = searchHandler.handleSortData(groupSort, noPageQs, params);
_.set(resData, 'brandShopAd', {baseUrl: shopListUrl});
if (resData.allGoods) {
Object.assign(resData.allGoods, searchHandler.setShopSort(groupSort, noPageQs));
}
}
resData.criteo = {skn: searchHandler.getCriteo(_.get(resData, 'goods'))};
return resData;
})();
};
exports.getShopGoodsData = (shopId, channel, params) => {
let gender = _getGender(channel);
let resData = {};
_.unset(params, '_pjax');
return Promise.all([
searchApi.getProductList(Object.assign({shop_id: shopId}, params), 'shop'), // 搜索店铺商品
searchApi.getSortList({shop_id: shopId}) // 根据店铺id获取分类
]).then(result => {
// 获取商品数据和顶部筛选条件
if (result[0].code === 200) {
Object.assign(resData, {
sort: searchHandler.handleOptsData(params, _.get(result[0], 'data.total', 0)),
list: productProcess.processProductList(_.get(result[0], 'data.product_list', []), {
newCoverSort: true,
showDiscount: false,
gender: gender
})
});
_.set(resData, 'sort.newPage', true); // 启用新的分页导航
}
if (result[1].code === 200) {
let groupSort = _.get(result[1], 'data', []);
Object.assign(resData, searchHandler.setShopSort(groupSort, Object.assign({}, params,
{page: 1})), searchHandler.setGenderFilter(params));
}
return resData;
});
};
/**
* 基础模板
*/
... ... @@ -115,3 +619,40 @@ exports.queryShopByBrandIdAsync = (sid, bid) => {
return _.get(result, 'data[0]', {});
})();
};
exports.getShopArticleByBrandsAsync = (brands) => {
let resData = {};
brands = _.split(brands, ',');
if (!brands.length) {
return Promise.resolve(resData);
}
return Promise.all(brands.map(value => searchApi.getArticleByBrand(value))).then(result => {
let articleList = [];
for (let i = 0; i < result.length; i++) {
articleList = _.concat(articleList, _.get(result[i], 'data', []));
}
if (articleList.length >= 3) {
articleList.length = 3;
resData.trendInfo = {
name: '潮流资讯 HOT ITEMS',
trendList: articleList.map(value => {
return {
href: helpers.urlFormat(`/guang/${value.id}.html`, null),
src: helpers.getForceSourceUrl(value.src) +
'?imageView2/1/w/{width}/h/{height}',
mainTitle: value.title,
Subtitle: value.intro
};
})
};
}
return resData;
});
};
... ...
... ... @@ -48,6 +48,9 @@ const newArrive = require(`${cRoot}/newArrive`);
// 全球购controller
const globalCtrl = require(`${cRoot}/global`);
// 店铺controller
const shop = require(`${cRoot}/shop`);
// 商品促销routers
router.get('/sale', sale.index); // sale 首页
router.get(/\/(.*)-sale/, sale.index); // sale 首页(SEO改造)
... ... @@ -113,12 +116,13 @@ router.get('/list/new', list.new);
router.get(/\/list\/(.*)-new/, list.newWithChannel);
// 品牌店铺
router.get('/index/brand', list.brand); // 品牌店铺页
router.get('/index/about', list.brandAbout); // 品牌店铺介绍页
router.post('/index/isFavoriteBrand', list.isFavoriteBrand); // 判断用户是否收藏品牌
router.post('/index/getNodeContent', list.getNodeContent); // 品牌页水牌
router.post('/index/getAdnav', list.getAdnav); // 品牌页系列
router.get('/shoplist', list.shopList); // 店铺列表页
router.get('/shop', shop.index); // 店铺首页
router.get('/shoplist', shop.list); // 店铺列表页
router.get('/shop/article', shop.article); // 店铺推荐文章
router.post('/shop/togglecollect', favorite.collectShop); // 店铺收藏
router.post('/index/isFavoriteShop', favorite.isFavShop); // 判断用户是否收藏品牌
router.get('/brand/couponsync', list.brandCouponSync);
... ...
... ... @@ -14,6 +14,7 @@
data-limitcode="{{goodsInfo.limitProductCode}}"
data-deposit ="{{goodsInfo.deposit}}"
data-secKill ="{{goodsInfo.secKill}}"
data-limittime ="{{goodsInfo.limitTime}}"
data-count="{{goodsInfo.bundle.count}}"
data-type="{{goodsInfo.bundle.type}}"
data-shop="{{goodsInfo.shopId}}">
... ...
{{# trendInfo}}
<div class="trend-info clearfix">
{{> common/floor-header}}
<ul class="trend-list">
{{#each trendList}}
<li>
<a href="{{href}}">
<img src="{{image2 src w=264 h=173}}" />
<div class="main-title">{{mainTitle}}</div>
<div class="sub-title">{{Subtitle}}</div>
</a>
</li>
{{/each}}
</ul>
</div>
{{/ trendInfo}}
... ...
... ... @@ -6,7 +6,7 @@
<div class="list-left pull-left">
{{> list/shop-search}}
{{> product/left-content}}
{{> list/shop-sidebar}}
... ... @@ -54,23 +54,9 @@
{{> list/shop-all-goods}}
{{#trendInfo}}
<div class="trend-info clearfix">
{{> common/floor-header}}
<ul class="trend-list">
{{#each trendList}}
<li>
<a href="{{href}}">
<img src="{{image2 src w=264 h=173}}" />
<div class="main-title">{{mainTitle}}</div>
<div class="sub-title">{{Subtitle}}</div>
</a>
</li>
{{/each}}
</ul>
</div>
{{/trendInfo}}
{{# trendInfo}}
<div class="trend-info" data-brands="{{shopBrands}}"></div>
{{/ trendInfo}}
</div>
</div>
</div>
... ...
... ... @@ -4,8 +4,6 @@
* @date: 2016/6/16
*/
'use strict';
const _ = require('lodash');
const qs = require('querystring');
module.exports = () => {
return (req, res, next) => {
... ... @@ -67,21 +65,12 @@ module.exports = () => {
}
break;
}
default: // 其它(识别为品牌)
default: // 其它(识别为店铺)
{ // eslint-disable-line
let queryString = (function() {
if (!_.isEmpty(req.query)) {
return '&' + qs.stringify(req.query);
} else {
return '';
}
}());
req.query.domain = req.subdomains[0];
if (!req.path || req.path === '/') {
req.url = `/product/index/brand?domain=${req.subdomains[0]}${queryString}`;
} else if (req.path === '/about') {
req.url = `/product/index/brand?domain=${req.subdomains[0]}${queryString}`;
req.url = '/product/shop';
}
break;
}
... ...
{
"name": "yohobuy-node",
"version": "5.9.12",
"version": "6.0.2",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
... ...
... ... @@ -370,7 +370,7 @@ deliveryWay = {
dt = this.deliveryType[id];
if (support) {
if (support && !dt.unsupport) {
dt.dom.parent().removeClass('unsp-way');
dt.unsupport = false;
} else {
... ...
... ... @@ -23,4 +23,9 @@ if ($('.success-box').length > 0) {
$(function() {
yas.givePoint('YB_REGISTER_SUCCESS_L');
// 品众统计
if (window._fxcmd) {
window._fxcmd.push(['trackEvent', 'event', 'reg', '注册', '1']);
}
});
... ...
... ... @@ -34,6 +34,7 @@ var $main = $('.main'),
skn = $main.data('skn'),
deposit = $main.data('deposit') === 'Y',
secKill = $main.data('seckill') === 'Y',
limitTime = $main.data('limittime') === 'Y',
limitCode = $main.data('limitcode'),
isBundleProduct = $main.data('type') === 2, // 量贩商品,
isPackageProduct = $main.data('type') === 1, // 套餐商品
... ... @@ -158,14 +159,16 @@ function addCart() {
}
} else if (code === 500) {
if (deposit) {
if (deposit || limitTime) {
alert = new Alert('定金预售商品只能在APP端购买');
alert.show();
return;
}
if (secKill) {
alert = new Alert('秒杀商品只能在APP端购买');
alert.show();
return;
}
}
... ...
... ... @@ -193,13 +193,27 @@ $(window).on('scroll', function() {
if (scrollTop > fixedAreaTop) {
$fixedArea.css({
position: 'fixed',
top: 0
position: 'fixed'
});
} else {
$fixedArea.css({
position: 'static',
top: 0
position: 'absolute'
});
}
});
// 获取店铺推荐文章
(function() {
var $trendInfo = $('.trend-info');
var brands = $trendInfo.data('brands');
if (brands) {
$.ajax({
type: 'GET',
url: '/product/shop/article',
data: {brands: brands}
}).then(function(data) {
$trendInfo.replaceWith(data);
});
}
}());
... ...
... ... @@ -406,6 +406,8 @@
background: #fff;
z-index: 1;
width: 970px;
position: absolute;
top: 0;
}
.gender-filter {
... ... @@ -540,6 +542,9 @@
}
.goods-wrap {
padding-top: 156px;
position: relative;
.goods-container {
.good-info {
width: 235px;
... ...