...
|
...
|
@@ -8,7 +8,6 @@ const utils = '../../../utils'; |
|
|
const crypto = global.yoho.crypto;
|
|
|
const _ = require('lodash');
|
|
|
const helpers = global.yoho.helpers;
|
|
|
const api = global.yoho.API;
|
|
|
const searchModel = require('./search');
|
|
|
const productProcess = require(`${utils}/product-process`);
|
|
|
const stringProcess = require(`${global.utils}/string-process`);
|
...
|
...
|
@@ -24,8 +23,14 @@ const yhChannel = { |
|
|
lifestyle: 4
|
|
|
};
|
|
|
|
|
|
/* 多品牌店铺列表数据信息处理*/
|
|
|
const _processBrandShops = (list) => {
|
|
|
module.exports = class extends global.yoho.BaseModel {
|
|
|
constructor(ctx) {
|
|
|
super(ctx);
|
|
|
this.ctx = _.get(ctx, 'req.ctx');
|
|
|
}
|
|
|
|
|
|
/* 多品牌店铺列表数据信息处理*/
|
|
|
_processBrandShops(list) {
|
|
|
let formatDat = [];
|
|
|
|
|
|
_.forEach(list, item => {
|
...
|
...
|
@@ -55,15 +60,15 @@ const _processBrandShops = (list) => { |
|
|
}
|
|
|
|
|
|
return formatDat;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 销售类目链接拼接 APP
|
|
|
* @param origin
|
|
|
* @param shopId
|
|
|
* @private
|
|
|
*/
|
|
|
const _modifyWapUrl = (origin, shopId) => {
|
|
|
_modifyWapUrl(origin, shopId) {
|
|
|
if (parseInt(_.get(origin, 'linkType', 0), 10) === 1) {
|
|
|
return helpers.urlFormat('', {
|
|
|
filter_poolId: origin.categoryId,
|
...
|
...
|
@@ -77,15 +82,15 @@ const _modifyWapUrl = (origin, shopId) => { |
|
|
return '';
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 销售类目链接拼接 APP
|
|
|
* @param origin
|
|
|
* @param shopId
|
|
|
* @private
|
|
|
*/
|
|
|
const _modifyAppUrl = (origin, shopId) => {
|
|
|
_modifyAppUrl(origin, shopId) {
|
|
|
if (parseInt(_.get(origin, 'linkType', 0), 10) === 1) {
|
|
|
return helpers.urlFormat('/search/list', {filter_poolId: origin.categoryId}) +
|
|
|
`?openby:yohobuy={"action":"go.poollist","params":{"shop_id":"${shopId}","title":"${origin.categoryName}","productPool":"${origin.categoryId}"}}`; //eslint-disable-line
|
...
|
...
|
@@ -96,33 +101,35 @@ const _modifyAppUrl = (origin, shopId) => { |
|
|
return '';
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 获取店铺装修的所有资源接口
|
|
|
* @param {int} shopId 店铺id
|
|
|
* @return array
|
|
|
*/
|
|
|
const _getShopDecorator = (shopId) => {
|
|
|
return api.get('', {
|
|
|
_getShopDecorator(shopId) {
|
|
|
return this.get({
|
|
|
data: {
|
|
|
method: 'app.shopsdecorator.getList',
|
|
|
shop_id: shopId
|
|
|
}, {
|
|
|
},
|
|
|
param: {
|
|
|
cache: true,
|
|
|
code: 200
|
|
|
}
|
|
|
}).then((result) => {
|
|
|
return (result && result.data) || {};
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 获取店铺信息
|
|
|
* @param {int} shopId 店铺id
|
|
|
* @param {int} uid 用户id 判断用户是否收藏店铺
|
|
|
* @return array
|
|
|
*/
|
|
|
const _getShopInfo = (shopId, uid) => {
|
|
|
_getShopInfo(shopId, uid) {
|
|
|
let finalParams = {
|
|
|
method: 'app.shops.getIntro',
|
|
|
shop_id: shopId,
|
...
|
...
|
@@ -138,16 +145,19 @@ const _getShopInfo = (shopId, uid) => { |
|
|
});
|
|
|
}
|
|
|
|
|
|
return api.get('', finalParams, {code: 200}).then((result) => {
|
|
|
return this.get({
|
|
|
data: finalParams,
|
|
|
param: {code: 200}
|
|
|
}).then((result) => {
|
|
|
return result && result.data;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 调取店铺简介数据
|
|
|
* @param {int} shopId
|
|
|
*/
|
|
|
const getShopIntro = (shopId, uid) => {
|
|
|
getShopIntro(shopId, uid) {
|
|
|
let params = {
|
|
|
method: 'app.shops.getIntro',
|
|
|
shop_id: shopId
|
...
|
...
|
@@ -161,7 +171,10 @@ const getShopIntro = (shopId, uid) => { |
|
|
params.uid = uid;
|
|
|
}
|
|
|
|
|
|
return api.get('', params, {code: 200}).then(result => {
|
|
|
return this.get({
|
|
|
data: params,
|
|
|
param: {code: 200}
|
|
|
}).then(result => {
|
|
|
if (result && result.data) {
|
|
|
const imgReg = /<img [^>]*src=['"]([^'"]+)[^>]*>/gi;
|
|
|
|
...
|
...
|
@@ -171,25 +184,28 @@ const getShopIntro = (shopId, uid) => { |
|
|
}
|
|
|
return result && result.data;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 获取店铺下面的所有分类
|
|
|
* @param {int} shopId 店铺id
|
|
|
* @param {string} channel 频道
|
|
|
* @return array
|
|
|
*/
|
|
|
const _getShopCategory = (shopId, channel) => {
|
|
|
return api.get('', {
|
|
|
_getShopCategory(shopId, channel) {
|
|
|
return this.get({
|
|
|
data: {
|
|
|
method: 'app.shop.getSortInfo',
|
|
|
yh_channel: yhChannel[channel],
|
|
|
shop_id: shopId
|
|
|
}, {code: 200, cache: true}).then(result => {
|
|
|
},
|
|
|
param: {code: 200, cache: true}
|
|
|
}).then(result => {
|
|
|
return result && result.data;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 处理店铺或者品牌 seo 数据
|
|
|
* @param channel
|
|
|
* @param info
|
...
|
...
|
@@ -197,7 +213,7 @@ const _getShopCategory = (shopId, channel) => { |
|
|
* @returns {{}}
|
|
|
* @private
|
|
|
*/
|
|
|
const _getBrandShopSeo = (channel, info, qs) => {
|
|
|
_getBrandShopSeo(channel, info, qs) {
|
|
|
|
|
|
let resData = {},
|
|
|
ctype = {
|
...
|
...
|
@@ -211,7 +227,6 @@ const _getBrandShopSeo = (channel, info, qs) => { |
|
|
name: ''
|
|
|
};
|
|
|
|
|
|
|
|
|
if (info) {
|
|
|
Object.assign(params, {
|
|
|
nameEn: _.get(info, 'brand_name_en', ''),
|
...
|
...
|
@@ -251,51 +266,55 @@ const _getBrandShopSeo = (channel, info, qs) => { |
|
|
resData.title += resData.title ? ' | YOHO!有货 100%正品保证' : '';
|
|
|
resData.description += resData.description ? ' YOHO! 有货中国最大的潮流商品购物网站。100%品牌正品保证,支持货到付款。' : ''; // eslint-disable-line
|
|
|
return resData;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
*
|
|
|
* 调用接口获取品牌或者店铺的收藏状态
|
|
|
* @private
|
|
|
*/
|
|
|
const getBrandFavStatus = (params) => {
|
|
|
getBrandFavStatus(params) {
|
|
|
if (params.uid === 'undefined') {
|
|
|
params.uid = 0;
|
|
|
}
|
|
|
return api.get('', {
|
|
|
return this.get({
|
|
|
data: {
|
|
|
method: 'app.favorite.isFavorite',
|
|
|
uid: params.uid || 0,
|
|
|
id: params.id,
|
|
|
type: params.type
|
|
|
}
|
|
|
}).then(result => {
|
|
|
return result;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 获取店铺下面的所有品牌
|
|
|
* @param {int} shopId 店铺id
|
|
|
*/
|
|
|
const getShopBrands = (shopId) => {
|
|
|
return api.get('', {
|
|
|
getShopBrands(shopId) {
|
|
|
return this.get({
|
|
|
data: {
|
|
|
method: 'app.shops.getShopsBrands',
|
|
|
shop_id: shopId
|
|
|
}, {code: 200, cache: true}).then((result) => {
|
|
|
},
|
|
|
param: {code: 200, cache: true}
|
|
|
}).then((result) => {
|
|
|
if (result[0]) {
|
|
|
return result[0].brand_id;
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 组织店铺页面数据
|
|
|
* @param {array} data 接口返回的店铺页所需数据
|
|
|
* @param {int} shopId 店铺id
|
|
|
* @param {int} isApp app版本
|
|
|
* @return {shopId: int, appVersion: int}
|
|
|
*/
|
|
|
const _formShopData = (data, shopId, isApp) => {
|
|
|
_formShopData(data, shopId, isApp) {
|
|
|
let formatData = {
|
|
|
shopId: shopId,
|
|
|
appVersion: isApp
|
...
|
...
|
@@ -326,8 +345,8 @@ const _formShopData = (data, shopId, isApp) => { |
|
|
_.forEach(resData, (item) => {
|
|
|
if (item.data) {
|
|
|
spring.push({
|
|
|
url: isApp ? _modifyAppUrl(item.data[0], shopId) :
|
|
|
_modifyWapUrl(item.data[0], shopId),
|
|
|
url: isApp ? this._modifyAppUrl(item.data[0], shopId) :
|
|
|
this._modifyWapUrl(item.data[0], shopId),
|
|
|
springType: helpers.image(item.data[0].src)
|
|
|
});
|
|
|
}
|
...
|
...
|
@@ -381,8 +400,8 @@ const _formShopData = (data, shopId, isApp) => { |
|
|
_.forEach(resData, (item) => {
|
|
|
if (item.data[0]) {
|
|
|
bannerTop.data.push({
|
|
|
url: isApp ? _modifyAppUrl(item.data[0], shopId) :
|
|
|
_modifyWapUrl(item.data[0], shopId),
|
|
|
url: isApp ? this._modifyAppUrl(item.data[0], shopId) :
|
|
|
this._modifyWapUrl(item.data[0], shopId),
|
|
|
src: item.data[0].src
|
|
|
});
|
|
|
}
|
...
|
...
|
@@ -404,8 +423,8 @@ const _formShopData = (data, shopId, isApp) => { |
|
|
|
|
|
_.forEach(resData, cate => {
|
|
|
hotCategory.data.list.push({
|
|
|
url: isApp ? _modifyAppUrl(cate, shopId) :
|
|
|
_modifyWapUrl(cate, shopId),
|
|
|
url: isApp ? this._modifyAppUrl(cate, shopId) :
|
|
|
this._modifyWapUrl(cate, shopId),
|
|
|
src: helpers.image(cate.src),
|
|
|
name: cate.name
|
|
|
});
|
...
|
...
|
@@ -514,15 +533,15 @@ const _formShopData = (data, shopId, isApp) => { |
|
|
formatData.shopId = '';
|
|
|
}
|
|
|
return formatData;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 使用基础模板的店铺首页
|
|
|
* @param params
|
|
|
* @param shopInfo
|
|
|
* @returns {*|Promise.<TResult>}
|
|
|
*/
|
|
|
const getBaseShopData = (params, shopInfo) => {
|
|
|
getBaseShopData(params, shopInfo) {
|
|
|
|
|
|
/* tar add 161109 seo-info */
|
|
|
let seoResult = _getBrandShopSeo(params.channel, shopInfo, params);
|
...
|
...
|
@@ -533,9 +552,9 @@ const getBaseShopData = (params, shopInfo) => { |
|
|
|
|
|
let shopId = params.shop_id || shopInfo.shops_id;
|
|
|
|
|
|
return api.all([
|
|
|
_getShopDecorator(shopId),
|
|
|
getShopBrands(shopId)
|
|
|
return this.all([
|
|
|
this._getShopDecorator(shopId),
|
|
|
this.getShopBrands(shopId)
|
|
|
]).then(result => {
|
|
|
if (result[0] && _.has(result[0], 'list')) {
|
|
|
_.forEach(result[0].list, item => {
|
...
|
...
|
@@ -564,23 +583,23 @@ const getBaseShopData = (params, shopInfo) => { |
|
|
}
|
|
|
return finalResult;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 使用经典模板的店铺首页
|
|
|
* @param {object} req
|
|
|
* @param {int} shopId 店铺id
|
|
|
* @param {int} uid 用户id
|
|
|
* @param {string} isApp app版本
|
|
|
*/
|
|
|
const getShopData = (req, shopId, uid, isApp) => {
|
|
|
getShopData(req, shopId, uid, isApp) {
|
|
|
let shopData = {};
|
|
|
let channel = req.yoho.channel;
|
|
|
let brandData = [];
|
|
|
|
|
|
return _getShopInfo(shopId, uid).then(shopInfoResult => {
|
|
|
return this._getShopInfo(shopId, uid).then(shopInfoResult => {
|
|
|
|
|
|
let seoResult = _getBrandShopSeo(channel, shopInfoResult, req.query);
|
|
|
let seoResult = this._getBrandShopSeo(channel, shopInfoResult, req.query);
|
|
|
|
|
|
/* 基础店铺返回程序内的跳转信号,跳转到基础店铺 */
|
|
|
if (shopInfoResult && shopInfoResult.shop_template_type &&
|
...
|
...
|
@@ -590,7 +609,7 @@ const getShopData = (req, shopId, uid, isApp) => { |
|
|
};
|
|
|
}
|
|
|
|
|
|
return _getShopDecorator(shopId).then(shopDeco => {
|
|
|
return this._getShopDecorator(shopId).then(shopDeco => {
|
|
|
return shopDeco;
|
|
|
}).then(shopDeco => {
|
|
|
let brandBrowseData;
|
...
|
...
|
@@ -606,7 +625,7 @@ const getShopData = (req, shopId, uid, isApp) => { |
|
|
});
|
|
|
|
|
|
return Promise.all([
|
|
|
searchModel.getFilterSearchData({
|
|
|
this.ctx(searchModel).getFilterSearchData({
|
|
|
shop_id: shopId,
|
|
|
type: 'default', // 默认
|
|
|
brand: brandData.join(','),
|
...
|
...
|
@@ -632,7 +651,7 @@ const getShopData = (req, shopId, uid, isApp) => { |
|
|
}
|
|
|
|
|
|
// 店铺分类
|
|
|
return _getShopCategory(shopId, channel).then(shopCategory => {
|
|
|
return this._getShopCategory(shopId, channel).then(shopCategory => {
|
|
|
|
|
|
shopData = _.assign({
|
|
|
shopCategory: shopCategory
|
...
|
...
|
@@ -640,7 +659,7 @@ const getShopData = (req, shopId, uid, isApp) => { |
|
|
|
|
|
// noinspection JSCheckFunctionSignatures
|
|
|
return Object.assign(
|
|
|
_formShopData(shopData, shopId, isApp),
|
|
|
this._formShopData(shopData, shopId, isApp),
|
|
|
shopFilterSearchData,
|
|
|
{
|
|
|
shopId: shopId,
|
...
|
...
|
@@ -653,64 +672,68 @@ const getShopData = (req, shopId, uid, isApp) => { |
|
|
});
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 异步判断店铺是否收藏
|
|
|
* @param req
|
|
|
* @param shopId
|
|
|
* @param uid
|
|
|
* @returns {Promise.<TResult>|*}
|
|
|
*/
|
|
|
const getShopFav = (req, shopId, uid) => {
|
|
|
return _getShopInfo(shopId, uid).then(shopInfoResult => {
|
|
|
getShopFav(req, shopId, uid) {
|
|
|
return this._getShopInfo(shopId, uid).then(shopInfoResult => {
|
|
|
return shopInfoResult;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 根据brandId 获取相关店铺列表
|
|
|
* @param brandId
|
|
|
* @param req
|
|
|
* @return array
|
|
|
*/
|
|
|
const getBrandShops = (domain, req) => {
|
|
|
return api.get('', {
|
|
|
getBrandShops(domain, req) {
|
|
|
return this.get({
|
|
|
data: {
|
|
|
method: 'app.search.li',
|
|
|
query: domain
|
|
|
}, {
|
|
|
},
|
|
|
param: {
|
|
|
code: 200,
|
|
|
cache: true
|
|
|
}
|
|
|
}).then(result => {
|
|
|
if (result.data.shopList && _.isArray(result.data.shopList)) {
|
|
|
let seoResult = _getBrandShopSeo(req.channel, result.data[0], req.query);
|
|
|
let seoResult = this._getBrandShopSeo(req.channel, result.data[0], req.query);
|
|
|
|
|
|
return Object.assign(_processBrandShops(result.data.shopList), {seoResult: seoResult});
|
|
|
return Object.assign(this._processBrandShops(result.data.shopList), {seoResult: seoResult});
|
|
|
} else {
|
|
|
return [];
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 收藏
|
|
|
* @param {int} id ID
|
|
|
* @param {int} uid 用户ID
|
|
|
* @param type
|
|
|
* @return array
|
|
|
*/
|
|
|
const setFavorite = (id, uid, type) => {
|
|
|
return api.post('', {
|
|
|
setFavorite(id, uid, type) {
|
|
|
return this.post({
|
|
|
data: {
|
|
|
method: 'app.favorite.add',
|
|
|
fav_id: id,
|
|
|
id: id,
|
|
|
uid: uid,
|
|
|
type: type
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 取消收藏
|
|
|
*
|
|
|
* @param {int} id 品牌ID
|
...
|
...
|
@@ -718,27 +741,29 @@ const setFavorite = (id, uid, type) => { |
|
|
* @param type
|
|
|
* @return array
|
|
|
*/
|
|
|
const setFavoriteCancel = (id, uid, type) => {
|
|
|
return api.post('', {
|
|
|
setFavoriteCancel(id, uid, type) {
|
|
|
return this.post({
|
|
|
data: {
|
|
|
method: 'app.favorite.cancel',
|
|
|
fav_id: id,
|
|
|
id: id,
|
|
|
uid: uid,
|
|
|
type: type
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 处理店铺品类
|
|
|
* @param params
|
|
|
*/
|
|
|
const getShopCategory = (params) => {
|
|
|
getShopCategory(params) {
|
|
|
let finalResult = {
|
|
|
class: [],
|
|
|
category: []
|
|
|
};
|
|
|
|
|
|
return _getShopCategory(params.shopId, params.channel).then(result => {
|
|
|
return this._getShopCategory(params.shopId, params.channel).then(result => {
|
|
|
let resultCopy = _.cloneDeep(result);
|
|
|
|
|
|
_.forEach(resultCopy, value => {
|
...
|
...
|
@@ -780,22 +805,24 @@ const getShopCategory = (params) => { |
|
|
|
|
|
return finalResult;
|
|
|
});
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* 获取品牌优惠券列表
|
|
|
* @param {[int]} brand_id 品牌id
|
|
|
* @param {[int]} uid 当前用户id,空则不传
|
|
|
* @return {[array]}
|
|
|
*/
|
|
|
const brandCouponsList = (params) => {
|
|
|
brandCouponsList(params) {
|
|
|
if (!params.brand_id || params.brand_id === '' || params.brand_id === 'undefined') {
|
|
|
return Promise.resolve([]);
|
|
|
}
|
|
|
|
|
|
return api.get('', Object.assign({
|
|
|
return this.get({
|
|
|
data: Object.assign({
|
|
|
method: 'app.brand.getBrandIntro'
|
|
|
}, params)).then(result => {
|
|
|
}, params)
|
|
|
}).then(result => {
|
|
|
let shopCoupons = [];
|
|
|
let couPonstatus;
|
|
|
|
...
|
...
|
@@ -821,22 +848,5 @@ const brandCouponsList = (params) => { |
|
|
coupons: shopCoupons
|
|
|
};
|
|
|
});
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
getBaseShopData,
|
|
|
getShopData,
|
|
|
getBrandShops,
|
|
|
setFavorite,
|
|
|
setFavoriteCancel,
|
|
|
getShopIntro,
|
|
|
getShopBrands,
|
|
|
getShopCategory,
|
|
|
brandCouponsList,
|
|
|
getShopFav,
|
|
|
getBrandFavStatus,
|
|
|
getShopDecorator: _getShopDecorator,
|
|
|
getShopCategoryApi: _getShopCategory,
|
|
|
formShopData: _formShopData,
|
|
|
getBrandShopSeo: _getBrandShopSeo
|
|
|
}
|
|
|
}; |
...
|
...
|
|