Authored by yyq

Merge branch 'feature/guang-addCtx' into release/5.7

... ... @@ -62,6 +62,10 @@ if (!app.locals.devEnv) {
}
app.set('subdomain offset', 2);
// 添加请求上下文
app.use(global.yoho.httpCtx());
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'layout',
... ...
... ... @@ -8,7 +8,7 @@
const _ = require('lodash');
const guangModel = require('../models/index');
const guangModel = require('../models/guang-service');
const headerModel = require('../../../doraemon/models/header');
const ghelper = require('../models/guang-helper');
const urlHelper = require('../models/url-helper');
... ... @@ -23,20 +23,22 @@ exports.index = (req, res, next) => {
let pageSize = req.query.pageSize || 20;
let type = req.query.type || 0;
let pathNav = guangModel.getPathNav(channel);
let pathNav = req.ctx(guangModel).getPathNav(channel);
let uid = req.user.uid;
let udid = ghelper.getUdid(req, res);
let gender = ghelper.getGenderByCookie(req);
let isHotDegrade = _.get(req.app.locals.pc, 'guang.removeHotTag', false);
let isAdDegrade = _.get(req.app.locals.pc, 'guang.removeAd', false);
const reqCtx = req.ctx(guangModel);
Promise.all([
guangModel.getBanner(channel),
guangModel.getCategory(type, channel),
guangModel.getArticleList(gender, type, uid, udid, page, '', '', pageSize, channel, true),
guangModel.getHotTags(page, pageSize, channel, isHotDegrade),
guangModel.getAds(channel, isAdDegrade),
guangModel.getRecoArticles(gender, 1, 10, channel),
reqCtx.getBanner(channel),
reqCtx.getCategory(type, channel),
reqCtx.getArticleList(gender, type, uid, udid, page, '', '', pageSize, channel, true),
reqCtx.getHotTags(page, pageSize, channel, isHotDegrade),
reqCtx.getAds(channel, isAdDegrade),
reqCtx.getRecoArticles(gender, 1, 10, channel),
headerModel.requestHeaderData(channel)
]).then(ret => {
... ... @@ -85,17 +87,19 @@ exports.tags = (req, res, next) => {
let udid = ghelper.getUdid(req, res);
let gender = ghelper.getGenderByCookie(req);
let channel = req.yoho.channel;
let pathNav = guangModel.getPathNav(channel, query);
let pathNav = req.ctx(guangModel).getPathNav(channel, query);
let isHotDegrade = _.get(req.app.locals.pc, 'guang.removeHotTag', false);
let isAdDegrade = _.get(req.app.locals.pc, 'guang.removeAd', false);
const reqCtx = req.ctx(guangModel);
Promise.all([
guangModel.getBanner(channel),
reqCtx.getBanner(channel),
guangModel.getArticleList(gender, 0, uid, udid, page, query, '', pageSize, channel, true),
guangModel.getHotTags(1, 20, channel, isHotDegrade),
guangModel.getAds(channel, isAdDegrade),
guangModel.getRecoArticles(gender, 1, 10, channel),
reqCtx.getArticleList(gender, 0, uid, udid, page, query, '', pageSize, channel, true),
reqCtx.getHotTags(1, 20, channel, isHotDegrade),
reqCtx.getAds(channel, isAdDegrade),
reqCtx.getRecoArticles(gender, 1, 10, channel),
headerModel.requestHeaderData(channel)
]).then(ret => {
... ... @@ -143,17 +147,19 @@ exports.editor = (req, res, next) => {
let uid = req.user.uid;
let udid = ghelper.getUdid(req, res);
let pathNav = guangModel.getPathNav(channel);
let pathNav = req.ctx(guangModel).getPathNav(channel);
let page = req.query.page || 1;
let pageSize = req.query.pageSize || 20;
const reqCtx = req.ctx(guangModel);
Promise.all([
guangModel.getAuthor(channel, authorId),
guangModel.getArticleList(gender, null, uid, udid, page, '', authorId, pageSize, channel, true),
guangModel.getHotTags(1, 20, channel, isHotDegrade),
guangModel.getAds(channel, isAdDegrade),
guangModel.getRecoArticles(gender, 1, 10, channel),
reqCtx.getAuthor(channel, authorId),
reqCtx.getArticleList(gender, null, uid, udid, page, '', authorId, pageSize, channel, true),
reqCtx.getHotTags(1, 20, channel, isHotDegrade),
reqCtx.getAds(channel, isAdDegrade),
reqCtx.getRecoArticles(gender, 1, 10, channel),
headerModel.requestHeaderData(channel)
]).then(ret => {
... ... @@ -202,12 +208,14 @@ exports.detail = (req, res, next) => {
let isHotDegrade = _.get(req.app.locals.pc, 'guang.removeHotTag', false);
let isAdDegrade = _.get(req.app.locals.pc, 'guang.removeAd', false);
const reqCtx = req.ctx(guangModel);
if (!_.isNumber(id)) {
id = _.parseInt(id);
}
if (pjax) {
guangModel.getArticleComments(id, page, pageSize).then(ret => {
req.ctx(guangModel).getArticleComments(id, page, pageSize).then(ret => {
res.set('Cache-Control', 'no-cache');
res.render('guang/detail-comment', {
... ... @@ -226,10 +234,10 @@ exports.detail = (req, res, next) => {
// 登陆后自动收藏
if (col === 1 && uid > 0) {
guangModel.collectArticle(id, uid);
reqCtx.collectArticle(id, uid);
}
guangModel.getArticleInfo(id, channel).then(info => {
reqCtx.getArticleInfo(id, channel).then(info => {
// 判断参数是否有效, 无效会跳转到错误页面
if (!info || !info.title) {
... ... @@ -238,28 +246,28 @@ exports.detail = (req, res, next) => {
let promises = [
headerModel.requestHeaderData(channel),
guangModel.getArticleContent(id),
guangModel.getHotTags(1, 20, channel, isHotDegrade),
guangModel.getArticleComments(id, page, pageSize),
guangModel.getArticleBaseInfo(id, uid, udid),
guangModel.getArticleRelateBrand(id),
guangModel.getRecoArticles(gender, 1, 10, channel),
guangModel.getAds(channel, isAdDegrade)
reqCtx.getArticleContent(id),
reqCtx.getHotTags(1, 20, channel, isHotDegrade),
reqCtx.getArticleComments(id, page, pageSize),
reqCtx.getArticleBaseInfo(id, uid, udid),
reqCtx.getArticleRelateBrand(id),
reqCtx.getRecoArticles(gender, 1, 10, channel),
reqCtx.getAds(channel, isAdDegrade)
];
if (info.authorId) {
promises.push(guangModel.getAuthor(channel, info.authorId));
promises.push(req.ctx(guangModel).getAuthor(channel, info.authorId));
} else {
promises.push({});
}
if (info.tag) {
promises.push(guangModel.getRelateArticleList(id, info.tag, 2, channel));
promises.push(req.ctx(guangModel).getRelateArticleList(id, info.tag, 2, channel));
} else {
promises.push({});
}
let pathNav = guangModel.getPathNav(channel, info.title);
let pathNav = req.ctx(guangModel).getPathNav(channel, info.title);
Promise.all(promises).then(ret => {
... ... @@ -334,7 +342,7 @@ exports.listDynamicData = (req, res) => {
other.type = type;
}
guangModel.getDynamicDataByIds(ids, udid, other).then(ret => {
req.ctx(guangModel).getDynamicDataByIds(ids, udid, other).then(ret => {
res.send(ret);
});
};
... ... @@ -349,7 +357,7 @@ exports.detailDynamicData = (req, res) => {
uid = req.user.uid,
udid = ghelper.getUdid(req, res);
guangModel.getDynamicDataById(id, uid, udid).then((ret) => {
req.ctx(guangModel).getDynamicDataById(id, uid, udid).then((ret) => {
res.status(200).send(ret);
}).catch(() => {
res.status(400);
... ... @@ -375,12 +383,12 @@ exports.comment = (req, res) => {
});
}
guangModel.addComment(id, uid, comment).then(() => {
req.ctx(guangModel).addComment(id, uid, comment).then(() => {
if (req.session['comment_' + udid]) {
req.session['comment_' + udid] = null;
}
return guangModel.getArticleComments(id, 1, 20);
return req.ctx(guangModel).getArticleComments(id, 1, 20);
}).then(commentInfo => {
res.render('guang/detail-comment', {
... ... @@ -420,7 +428,7 @@ exports.praise = (req, res) => {
// let uid = req.user.uid;
let udid = ghelper.getUdid(req, res);
guangModel.praise(id, udid).then(ret => {
req.ctx(guangModel).praise(id, udid).then(ret => {
res.send(ret);
}).catch(() => {
res.send({
... ... @@ -436,7 +444,7 @@ exports.cancelPraise = (req, res) =>{
let id = req.body.id || req.query.id;
let udid = ghelper.getUdid(req, res);
guangModel.cancelPraise(id, udid).then(ret => {
req.ctx(guangModel).cancelPraise(id, udid).then(ret => {
res.send(ret);
}).catch(() => {
res.send({
... ... @@ -458,7 +466,7 @@ exports.collect = (req, res) =>{
});
}
guangModel.collect(id, uid).then(ret => {
req.ctx(guangModel).collect(id, uid).then(ret => {
res.send(ret);
}).catch(() => {
res.send({
... ... @@ -481,7 +489,7 @@ exports.cancelCollect = (req, res) =>{
});
}
guangModel.cancelCollect(id, uid).then(ret => {
req.ctx(guangModel).cancelCollect(id, uid).then(ret => {
res.send(ret);
}).catch(() => {
res.send({
... ...
... ... @@ -11,11 +11,7 @@ const ghelper = require('./guang-helper');
const urlHelper = require('./url-helper');
const helpers = global.yoho.helpers;
const serviceApi = global.yoho.ServiceAPI;
const yohoApi = global.yoho.API;
// const KEY_WEB_GUANG_BANNER_DATA = 'key_web_guang_banner_data';// 逛的首页banner
// const KEY_WEB_GUANG_ADS_DATA = 'key_web_guang_ads_data';// 逛的首页ads
const URL_OPERATIONS_RESOURCE_GET = 'operations/api/v5/resource/get';
// guang banner code
... ... @@ -34,943 +30,1111 @@ const ADS_CODE = {
kids: '1ffdd6ea22c58af52ee6408cd353c2d5'
};
/**
* 获取首页频道nav
*/
const getHomeChannelNav = (channel) => {
let home;
switch (channel) {
case 'girls':
home = helpers.urlFormat('/woman', '', 'new');
break;
case 'lifestyle':
home = helpers.urlFormat('/lifestyle', '', 'new');
break;
case 'kids':
home = helpers.urlFormat('/kids', '', 'new');
break;
default:
home = helpers.urlFormat('', '', 'default');
module.exports = class extends global.yoho.BaseModel {
constructor(ctx) {
super(ctx);
}
return {
href: home,
name: `${channel.toUpperCase()}首页`,
pathTitle: 'YOHO!有货'
};
};
const getPathNav = (channelType, query) => {
/**
* 获取首页频道nav
*/
getHomeChannelNav(channel) {
let home;
let path = _.concat(
getHomeChannelNav(channelType),
[{
name: '逛',
pathTitle: '逛',
href: helpers.urlFormat('', '', 'guang')
}]
);
switch (channel) {
case 'girls':
home = helpers.urlFormat('/woman', '', 'new');
break;
case 'lifestyle':
home = helpers.urlFormat('/lifestyle', '', 'new');
break;
case 'kids':
home = helpers.urlFormat('/kids', '', 'new');
break;
default:
home = helpers.urlFormat('', '', 'default');
return query ? _.concat(path, [{ name: query, pathTitle: query}]) : path;
};
}
const _formatTag = (tagData, channel) => {
let name = tagData.name,
param = {
query: name
return {
href: home,
name: `${channel.toUpperCase()}首页`,
pathTitle: 'YOHO!有货'
};
if (channel) {
param.channel = channel;
}
return {
tag: name,
name: name,
url: helpers.urlFormat('/tags/index', param, 'guang')
};
};
getPathNav(channelType, query) {
/**
* 格式化资讯文章
*
* @param array $articleData 需要格式化的资讯数据
* @param bool $showTag 是否显示左上角标签
* @param bool $showAuthor 控制是否显示作者信息
* @return array | false
*/
const _formatArticle = (articleData, showTag, showAuthor, channel) => {
let path = _.concat(
this.getHomeChannelNav(channelType),
[{
name: '逛',
pathTitle: '逛',
href: helpers.urlFormat('', '', 'guang')
}]
);
// 资讯ID不存在,则不显示
if (!articleData || !articleData.id) {
return false;
return query ? _.concat(path, [{ name: query, pathTitle: query}]) : path;
}
let width = 360,
height = 360,
isSquareImage = true;
if (Number(articleData.conver_image_type) === 2) {
width = 360;
height = 240;
isSquareImage = false;
}
_formatTag(tagData, channel) {
let name = tagData.name,
param = {
query: name
};
let result = {
id: articleData.id,
classification: articleData.category_name,
// isReco: articleData.is_recommended && Number(articleData.is_recommended) === 1 ? true : false,
url: ghelper.getArticleUrl(articleData.url, articleData.id, channel),
img: helpers.image(articleData.src, width, height, 1),
isSquareImg: isSquareImage,
title: articleData.title,
pTime: articleData.publish_time,
pView: articleData.views_num,
content: articleData.intro,
showTags: showTag,
comment: articleData.comment_num
};
if (showTag && articleData.category_id) {
switch (String(articleData.category_id)) {
case '1': // 话题
result.isTopic = true;
break;
case '2': // 搭配
result.isCollocation = true;
break;
case '3': // 潮人
result.isFashionMan = true;
break;
case '4': // 潮品
result.isFashionGood = true;
break;
case '19': // 专题
result.isSpecialTopic = true;
break;
default:
break;
if (channel) {
param.channel = channel;
}
}
if (!articleData.author) {
articleData.author = {
name: '',
avatar: ''
return {
tag: name,
name: name,
url: helpers.urlFormat('/tags/index', param, 'guang')
};
}
result.author = articleData.author.name;
/**
* 格式化资讯文章
*
* @param array $articleData 需要格式化的资讯数据
* @param bool $showTag 是否显示左上角标签
* @param bool $showAuthor 控制是否显示作者信息
* @return array | false
*/
_formatArticle(articleData, showTag, showAuthor, channel) {
// 资讯ID不存在,则不显示
if (!articleData || !articleData.id) {
return false;
}
let authorId = articleData.author.author_id;
let width = 360,
height = 360,
isSquareImage = true;
if (authorId) {
result.editorUrl = urlHelper.editorUrl(channel, authorId);
}
let tags = [];
if (Number(articleData.conver_image_type) === 2) {
width = 360;
height = 240;
isSquareImage = false;
}
if (articleData.tags) {
let aTags = articleData.tags;
let result = {
id: articleData.id,
classification: articleData.category_name,
// isReco: articleData.is_recommended && Number(articleData.is_recommended) === 1 ? true : false,
url: ghelper.getArticleUrl(articleData.url, articleData.id, channel),
img: helpers.image(articleData.src, width, height, 1),
isSquareImg: isSquareImage,
title: articleData.title,
pTime: articleData.publish_time,
pView: articleData.views_num,
content: articleData.intro,
showTags: showTag,
comment: articleData.comment_num
};
for (let i = 0; i < aTags.length; i++) {
tags.push(_formatTag(aTags[i], channel));
if (showTag && articleData.category_id) {
switch (String(articleData.category_id)) {
case '1': // 话题
result.isTopic = true;
break;
case '2': // 搭配
result.isCollocation = true;
break;
case '3': // 潮人
result.isFashionMan = true;
break;
case '4': // 潮品
result.isFashionGood = true;
break;
case '19': // 专题
result.isSpecialTopic = true;
break;
default:
break;
}
}
}
result.tags = tags;
_.assign(result, {
tags: tags,
like: articleData.praise_num,
liked: articleData.isPraise === 'Y'
});
if (!articleData.author) {
articleData.author = {
name: '',
avatar: ''
};
}
// 判断是否显示作者信息
if (showAuthor && articleData.author) {
result.author = _.cloneDeep(articleData.author);
}
result.author = articleData.author.name;
// 模板中需要的标签标识
if (showTag && articleData.category_id) {
let categoryId = '' + articleData.category_id;
let authorId = articleData.author.author_id;
switch (categoryId) {
case '1': // 话题
result.isTopic = true;
break;
case '2': // 搭配
result.isCollocation = true;
break;
case '3': // 潮人
result.isFashionMan = true;
break;
case '4': // 潮品
result.isFashionGood = true;
break;
case '5': // 小贴士
result.isTip = true;
break;
default:
result.isTopic = true;
if (authorId) {
result.editorUrl = urlHelper.editorUrl(channel, authorId);
}
}
return result;
};
const _formatAd = (adData, channel) => {
let tags = [];
if (!adData) {
return null;
}
if (articleData.tags) {
let aTags = articleData.tags;
let param = {
id: adData.id
};
for (let i = 0; i < aTags.length; i++) {
tags.push(this._formatTag(aTags[i], channel));
}
}
if (channel) {
param.channel = channel;
}
result.tags = tags;
return {
img: helpers.image(adData.src, 640, 640),
url: helpers.urlFormat('/info/index', param, 'guang'),
title: adData.title,
bgColor: adData.bgColor
};
};
_.assign(result, {
tags: tags,
like: articleData.praise_num,
liked: articleData.isPraise === 'Y'
});
/**
* 获取页文章数据
* @param {String} channelType 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
const getArticleList = (gender, sortId, uid, udid, page, tag, authorId, limit, channel, useCache) => {
uid = uid || 0;
udid = udid || '';
page = page || 1;
useCache = useCache || false;
let param = {
gender: gender,
page: page,
uid: uid,
udid: udid,
client_type: 'web'
};
if (sortId) {
param.sort_id = sortId;
}
// 判断是否显示作者信息
if (showAuthor && articleData.author) {
result.author = _.cloneDeep(articleData.author);
}
if (tag) {
param.tag = tag;
// 模板中需要的标签标识
if (showTag && articleData.category_id) {
let categoryId = '' + articleData.category_id;
switch (categoryId) {
case '1': // 话题
result.isTopic = true;
break;
case '2': // 搭配
result.isCollocation = true;
break;
case '3': // 潮人
result.isFashionMan = true;
break;
case '4': // 潮品
result.isFashionGood = true;
break;
case '5': // 小贴士
result.isTip = true;
break;
default:
result.isTopic = true;
}
}
return result;
}
if (authorId && Number(authorId)) {
param.author_id = authorId;
}
_formatAd(adData, channel) {
if (limit) {
param.limit = limit;
}
if (!adData) {
return null;
}
return serviceApi.get('guang/api/v2/article/getList', param, {
cache: useCache ? 300 : false
}).then(res => {
let param = {
id: adData.id
};
if (res && res.data) {
if (channel) {
param.channel = channel;
}
let artList,
adsList,
total = 0;
return {
img: helpers.image(adData.src, 640, 640),
url: helpers.urlFormat('/info/index', param, 'guang'),
title: adData.title,
bgColor: adData.bgColor
};
}
if (res.data.total) {
total = _.parseInt(res.data.total);
}
/**
* 获取页文章数据
* @param {String} channelType 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
getArticleList(gender, sortId, uid, udid, page, tag, authorId, limit, channel, useCache) {
if (res.data.list) {
let list = res.data.list;
uid = uid || 0;
udid = udid || '';
page = page || 1;
useCache = useCache || false;
if (list.artList) {
artList = _.map(list.artList, it => _formatArticle(it, true, false, channel));
}
let param = {
gender: gender,
page: page,
uid: uid,
udid: udid,
client_type: 'web'
};
if (list.adlist) {
adsList = _.map(list.artList, it => _formatAd(it, channel));
}
}
if (sortId) {
param.sort_id = sortId;
}
return {
msgs: artList,
ads: adsList,
total: total
};
if (tag) {
param.tag = tag;
}
return null;
});
};
/**
* 获取热门标签数据
* @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
const getHotTags = (page, limit, channel, isDegrade) => {
if (authorId && Number(authorId)) {
param.author_id = authorId;
}
let data = {
client_type: 'web',
page: page || 1,
limit: limit || 10
};
if (limit) {
param.limit = limit;
}
if (isDegrade) {
return null;
}
return this.get({
url: 'guang/api/v2/article/getList',
data: param,
param: {
cache: useCache ? 300 : false
},
api: global.yoho.ServiceAPI
return serviceApi.get('guang/api/v2/article/getTagTop', data, {
cache: true
}).then(res => {
return _.map((res && res.data) || [], it => {
let param = {
query: it.tag_name
};
}).then(res => {
if (channel) {
param.channel = channel;
}
if (res && res.data) {
return {
tagName: it.tag_name,
url: helpers.urlFormat('/tags/index', param, 'guang')
};
});
});
};
let artList,
adsList,
total = 0;
/**
* 获取广告数据
* @param {String} channelType 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
const getAds = (channelType, isDegrade) => {
if (res.data.total) {
total = _.parseInt(res.data.total);
}
let contentCode = ADS_CODE[channelType] || ADS_CODE.boys;
if (res.data.list) {
let list = res.data.list;
if (isDegrade) {
return null;
}
if (list.artList) {
artList = _.map(list.artList, it => this._formatArticle(it, true, false, channel));
}
return serviceApi.get(URL_OPERATIONS_RESOURCE_GET, {
content_code: contentCode
}, {cache: true}).then(res => {
let list = [];
if (list.adlist) {
adsList = _.map(list.artList, it => this._formatAd(it, channel));
}
}
if (res && res.code === 200 && res.data && res.data[0] && res.data[0].data) {
list = _.map(res.data[0].data, (it) => {
return {
img: helpers.image(it.src, 640, 640, 1),
url: it.url
msgs: artList,
ads: adsList,
total: total
};
});
}
return list.length > 5 ? list.slice(0, 4) : list;
});
};
}
return null;
});
}
/**
* 获取热门标签数据
* @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
const getBanner = channelType => {
/**
* 获取热门标签数据
* @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
getHotTags(page, limit, channel, isDegrade) {
let data = {
client_type: 'web',
page: page || 1,
limit: limit || 10
};
let contentCode = BANNER_CODE[channelType] || BANNER_CODE.boys;
if (isDegrade) {
return null;
}
return serviceApi.get(URL_OPERATIONS_RESOURCE_GET, {
content_code: contentCode
}, {cache: true}).then(res => {
return this.get({
url: 'guang/api/v2/article/getTagTop',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
let list = [];
}).then(res => {
return _.map((res && res.data) || [], it => {
let param = {
query: it.tag_name
};
if (res && res.code === 200 && res.data && res.data[0] && res.data[0].data) {
if (channel) {
param.channel = channel;
}
list = _.map(res.data[0].data, it => {
return {
img: helpers.image(it.src, 830, 327, 1),
url: it.url
tagName: it.tag_name,
url: helpers.urlFormat('/tags/index', param, 'guang')
};
});
}
return list;
});
};
});
}
const getCategory = (currentSortId, channel) => {
/**
* 获取广告数据
* @param {String} channelType 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
getAds(channelType, isDegrade) {
currentSortId = currentSortId || 0;
return serviceApi.get('guang/api/v1/category/get', {}, {
cache: true
}).then(res => {
let list = [];
let contentCode = ADS_CODE[channelType] || ADS_CODE.boys;
if (res && res.code === 200 && res.data) {
for (let cat of res.data) {
let param = {
type: cat.id
};
if (isDegrade) {
return null;
}
if (channel) {
param.channel = channel;
}
let data = {
content_code: contentCode
};
list.push({
typeId: cat.id,
type: cat.name,
isActive: String(cat.id) === String(currentSortId),
navUrl: urlHelper.listUrl(channel, cat.id)
return this.get({
url: URL_OPERATIONS_RESOURCE_GET,
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
}).then(res => {
let list = [];
if (res && res.code === 200 && res.data && res.data[0] && res.data[0].data) {
list = _.map(res.data[0].data, (it) => {
return {
img: helpers.image(it.src, 640, 640, 1),
url: it.url
};
});
}
}
return list;
});
};
return list.length > 5 ? list.slice(0, 4) : list;
});
}
/**
* 推荐文章
*/
const getRecoArticles = (gender, page, limit, channel) => {
/**
* 获取热门标签数据
* @param {String} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {Object}
*/
getBanner(channelType) {
return serviceApi.get('guang/api/v2/article/getArticleByViewsNum', {
gender: gender,
page: page,
limit: limit
}, {cache: true}).then(res => {
let contentCode = BANNER_CODE[channelType] || BANNER_CODE.boys;
let list = [];
let data = {
content_code: contentCode
};
if (res && res.data) {
for (let i = 0; i < res.data.length; i++) {
let it = res.data[i];
return this.get({
url: URL_OPERATIONS_RESOURCE_GET,
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
let reco = {
url: ghelper.getArticleUrl(it.url, it.id, channel),
title: it.title
};
}).then(res => {
if (it.src) {
reco.img = helpers.image(it.src, 90, 60, 1);
}
let list = [];
list.push(reco);
if (res && res.code === 200 && res.data && res.data[0] && res.data[0].data) {
list = _.map(res.data[0].data, it => {
return {
img: helpers.image(it.src, 830, 327, 1),
url: it.url
};
});
}
}
return list;
});
}
return list;
});
};
getCategory(currentSortId, channel) {
/**
* 获取作者信息
*/
const getAuthor = (channel, authorId) => {
currentSortId = currentSortId || 0;
return serviceApi.get('guang/service/v1/author/getAuthor', {
author_id: authorId
}, {
cache: 3600
}).then(res => {
if (res && res.data) {
let d = res.data;
return this.get({
url: 'guang/api/v1/category/get',
param: {
cache: true
},
api: global.yoho.ServiceAPI
return {
authorId: authorId,
avatar: d.avatar,
name: d.name,
intro: d.author_desc,
authorUrl: d.name ? urlHelper.editorUrl(channel, authorId) : ''
};
}
});
};
}).then(res => {
let list = [];
/**
* 获取文章基本信息,文章标题(不含内容)
*/
const getArticleInfo = (aid, channel) => {
return serviceApi.get('guang/service/v2/article/getArticle', {
article_id: aid
}, {cache: true}).then(res => {
if (res && res.code === 200 && res.data) {
let d = res.data;
let tags = [];
if (d.tags) {
for (let i = 0; i < d.tags.length; i++) {
tags.push(_formatTag(d.tags[i], channel));
if (res && res.code === 200 && res.data) {
for (let cat of res.data) {
let param = {
type: cat.id
};
if (channel) {
param.channel = channel;
}
list.push({
typeId: cat.id,
type: cat.name,
isActive: String(cat.id) === String(currentSortId),
navUrl: urlHelper.listUrl(channel, cat.id)
});
}
}
return {
title: d.article_title,
time: moment(d.publish_time * 1000).format('YYYY年MM月DD HH:mm'),
click: d.pageViews,
shareImg: helpers.image(d.cover_image, 600, 600),
desc: d.article_summary,
authorId: d.author_id,
weixinUrl: d.url,
tag: d.tag, // tags 的字符串
tags: tags
};
}
});
};
const _formatProduct = (products, arr) => {
let result = [];
return list;
});
}
_.forEach(products, val => {
/**
* 推荐文章
*/
getRecoArticles(gender, page, limit, channel) {
let goods = {
thumb: helpers.image(val.default_images, 235, 314),
product_name: val.product_name,
sales_price: val.sales_price,
url: helpers.getUrlBySkc(val.product_id, val.goods_list[0].goods_id, val.cn_alphabet)
let data = {
gender: gender,
page: page,
limit: limit
};
if (val.market_price !== val.sales_price) {
goods.marketPrice = val.market_price;
}
return this.get({
url: 'guang/api/v2/article/getArticleByViewsNum',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
_.forEach(arr, (v, k) => {
if (Number(k) === Number(val.product_skn)) {
goods.thumb = helpers.image(v, 235, 314);
}
});
}).then(res => {
result.push(goods);
});
let list = [];
return result;
};
if (res && res.data) {
for (let i = 0; i < res.data.length; i++) {
let it = res.data[i];
/**
* 按照skn string 来查询 query=skn1,skn2,skn3
*/
const getProductList = (params, arr) => {
return yohoApi.get('', _.assign({
method: 'web.search.search',
order: 's_n_desc',
limit: 60
}, params), { cache: true }).then(ret => {
if (ret && ret.code === 200 && ret.data && ret.data.product_list) {
return _formatProduct(ret.data.product_list, arr);
}
});
};
let reco = {
url: ghelper.getArticleUrl(it.url, it.id, channel),
title: it.title
};
const _articleContentFormat = {
goods: goods => {
if (it.src) {
reco.img = helpers.image(it.src, 90, 60, 1);
}
let productSkn = [],
arr = {};
list.push(reco);
}
}
_.forEach(goods, val => {
productSkn.push(val.id);
arr[val.id] = val.src;
return list;
});
}
if (productSkn.length > 0) {
/**
* 获取作者信息
*/
getAuthor(channel, authorId) {
return getProductList({
query: productSkn.join(',')
}, arr);
let data = {
author_id: authorId
};
}
return this.get({
url: 'guang/service/v1/author/getAuthor',
data: data,
param: {
cache: 3600
},
api: global.yoho.ServiceAPI
return null;
},
goodsGroup: goodsGroup => {
}).then(res => {
if (res && res.data) {
let d = res.data;
let result = [];
return {
authorId: authorId,
avatar: d.avatar,
name: d.name,
intro: d.author_desc,
authorUrl: d.name ? urlHelper.editorUrl(channel, authorId) : ''
};
}
});
}
_.forEach(goodsGroup, val => {
if (val && val.list) {
/**
* 获取文章基本信息,文章标题(不含内容)
*/
getArticleInfo(aid, channel) {
let productSkn = [];
let arr = {};
let data = {
article_id: aid
};
for (let it of val.list) {
productSkn.push(it.id);
arr[it.id] = it.src;
return this.get({
url: 'guang/service/v2/article/getArticle',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
}).then(res => {
if (res && res.code === 200 && res.data) {
let d = res.data;
let tags = [];
if (d.tags) {
for (let i = 0; i < d.tags.length; i++) {
tags.push(this._formatTag(d.tags[i], channel));
}
}
if (productSkn.length) {
// 包含多个对象,每对象里list都取数据,最终每个list只取前4个
result.push(getProductList({
query: productSkn.join(',')
}, arr).then(products => {
return {
title: d.article_title,
time: moment(d.publish_time * 1000).format('YYYY年MM月DD HH:mm'),
click: d.pageViews,
shareImg: helpers.image(d.cover_image, 600, 600),
desc: d.article_summary,
authorId: d.author_id,
weixinUrl: d.url,
tag: d.tag, // tags 的字符串
tags: tags
};
}
});
}
let pl = [];
_formatProduct(products, arr) {
let result = [];
if (products && _.isArray(products)) {
pl = products.slice(0, 4);
}
_.forEach(products, val => {
return pl;
}));
}
let goods = {
thumb: helpers.image(val.default_images, 235, 314),
product_name: val.product_name,
sales_price: val.sales_price,
url: helpers.getUrlBySkc(val.product_id, val.goods_list[0].goods_id, val.cn_alphabet)
};
if (val.market_price !== val.sales_price) {
goods.marketPrice = val.market_price;
}
_.forEach(arr, (v, k) => {
if (Number(k) === Number(val.product_skn)) {
goods.thumb = helpers.image(v, 235, 314);
}
});
result.push(goods);
});
return result;
},
text: data => {
return data;
},
singleImage: data => {
if (data && data[0] && data[0].src) {
return {
pic: helpers.image(data[0].src, 640, 640)
};
}
return null;
},
smallPic: data => {
let result = {
smallPic: []
}
/**
* 按照skn string 来查询 query=skn1,skn2,skn3
*/
getProductList(params, arr) {
let data = {
method: 'web.search.search',
order: 's_n_desc',
limit: 60
};
_.forEach(data, (it, key) => {
if (key < 2) {
result.smallPic.push(helpers.image(it.src, 600, 600));
Object.assign(data, params);
return this.get({
data: data,
param: {
cache: true
}
}).then(ret => {
if (ret && ret.code === 200 && ret.data && ret.data.product_list) {
return this._formatProduct(ret.data.product_list, arr);
}
});
return result;
},
link: () => ({})
};
}
/**
* 获取文章内容详情
*/
const getArticleContent = aid => {
let content = [],
index = 0;
_articleContentFormat() {
return {
goods: goods=> {
let productSkn = [],
arr = {};
_.forEach(goods, val => {
productSkn.push(val.id);
arr[val.id] = val.src;
});
if (productSkn.length > 0) {
return serviceApi.get('guang/service/v2/article/getArticleContent', {
article_id: aid
}, {cache: true}).then(res => { // 内容内推荐的商品
return this.getProductList({
query: productSkn.join(',')
}, arr);
}
let gpromises = [], ggpromises = [];
return null;
},
goodsGroup: goodsGroup=>{
let result = [];
_.forEach(goodsGroup, val => {
if (val && val.list) {
let productSkn = [];
let arr = {};
for (let it of val.list) {
productSkn.push(it.id);
arr[it.id] = it.src;
}
if (res && res.code === 200 && res.data) {
_.forEach(res.data, (it) => {
if (productSkn.length) {
// 包含多个对象,每对象里list都取数据,最终每个list只取前4个
result.push(this.getProductList({
query: productSkn.join(',')
}, arr).then(products => {
_.forEach(it, (val, key) => {
if (key === 'goods') {
gpromises.push(_articleContentFormat.goods(val.data));
} else if (key === 'goodsGroup') {
// 可能包含多个list,则有多个promise
ggpromises = ggpromises.concat(_articleContentFormat.goodsGroup(val.data));
} else {
let other = _.isFunction(_articleContentFormat[key]) ?
_articleContentFormat[key](val.data) : '';
let pl = [];
content.push(other);
if (products && _.isArray(products)) {
pl = products.slice(0, 4);
}
return pl;
}));
}
}
});
});
}
index = gpromises.length;
return Promise.all(gpromises.concat(ggpromises));
return result;
},
text: data => {
return data;
},
singleImage: data => {
if (data && data[0] && data[0].src) {
return {
pic: helpers.image(data[0].src, 640, 640)
};
}
return null;
},
smallPic: data => {
let result = {
smallPic: []
};
}).then(res => {
_.forEach(data, (it, key) => {
if (key < 2) {
result.smallPic.push(helpers.image(it.src, 600, 600));
}
});
return result;
},
link: () => ({})
};
}
let goods = _.filter(_.flatten(res.slice(0, index)), function(it) {
return it;
});
let goodsGroup = _.filter(_.flatten(res.slice(index)), function(it) {
return it;
});
/**
* 获取文章内容详情
*/
getArticleContent(aid) {
let that = this;
if (goods.length > 0) {
content.push({
relatedReco: {
recos: goods
}
});
}
let content = [],
index = 0;
if (goodsGroup.length > 0) {
content.push({
relatedReco: {
recos: goodsGroup
}
});
}
let data = {
article_id: aid
};
return content;
});
};
return this.get({
url: 'guang/service/v2/article/getArticleContent',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
}).then(res => { // 内容内推荐的商品
let gpromises = [], ggpromises = [];
if (res && res.code === 200 && res.data) {
_.forEach(res.data, (it) => {
_.forEach(it, (val, key) => {
if (key === 'goods') {
gpromises.push(that._articleContentFormat().goods(val.data));
return;
} else if (key === 'goodsGroup') {
// 可能包含多个list,则有多个promise
ggpromises = ggpromises.concat(that._articleContentFormat().goodsGroup(val.data));
} else {
let other = _.isFunction(that._articleContentFormat()[key]) ?
that._articleContentFormat()[key](val.data) : '';
content.push(other);
}
});
});
}
/**
* 判断用户是否收藏文章地址,应该是文章与用户关联的信息
* @param $articleId
* @param $uid
* @param $udid
* @param bool $onlyUrl
* @return mixed
*/
const getArticleBaseInfo = (aid, uid, udid) => {
return serviceApi.get('guang/api/v1/article/getArticleBaseInfo', {
id: aid,
uid: uid,
udid: udid
}).then(res => ({
isLike: res && res.isPraise === 'Y',
likeNum: res.praise_num || 0,
isCollected: res && res.isFavor === 'Y'
}));
};
index = gpromises.length;
return Promise.all(gpromises.concat(ggpromises));
/**
* 文章相关品牌
* @param $articleId
* @param bool $onlyUrl
* @return mixed
*/
const getArticleRelateBrand = aid => {
return serviceApi.get('guang/service/v2/article/getBrand', {
article_id: aid
}, {cache: true}).then(res => {
if (res && res.code === 200 && res.data) {
return _.map(res.data, it => {
it.thumb = it.thumb;
it.url = it.url;
}).then(res => {
let goods = _.filter(_.flatten(res.slice(0, index)), function(it) {
return it;
});
}
});
};
/**
* 相关文章列表
* @param $articleId
* @param $tag
* @param int $limit
* @param bool $onlyUrl
* @return mixed
*/
const getRelateArticleList = (aid, tag, size, channel) => {
size = size || 3;
return serviceApi.get('guang/service/v2/article/getOtherArticle', {
article_id: aid,
tags: tag,
limit: size
}, {cache: true}).then(res => {
if (res && res.code === 200 && res.data) {
return _.map(res.data, it => {
it.thumb = helpers.image(it.thumb, 264, 173, 1);
it.url = ghelper.getArticleUrl(it.url, it.id, channel);
let goodsGroup = _.filter(_.flatten(res.slice(index)), function(it) {
return it;
});
}
});
};
/**
* 获取文章评论数据
*/
const getArticleComments = (aid, page, pageSize) => {
page = page || 1;
pageSize = pageSize || 20;
return serviceApi.get('guang/api/v1/comments/getList', {
article_id: aid,
page: page,
limit: pageSize
}).then(res => {
let num = (res.data && res.data.total) || 0;
let list = [];
if (num > 0 && res.data.list) {
let iList = res.data.list;
for (let i = 0; i < iList.length; i++) {
let it = iList[i];
list.push({
avatar: helpers.image(it.avator, 100, 100),
name: it.username,
content: it.content,
time: it.create_time
if (goods.length > 0) {
content.push({
relatedReco: {
recos: goods
}
});
}
}
return {
commentNum: num,
pageSize: pageSize,
if (goodsGroup.length > 0) {
content.push({
relatedReco: {
recos: goodsGroup
}
});
}
return content;
});
}
/**
* 判断用户是否收藏文章地址,应该是文章与用户关联的信息
* @param $articleId
* @param $uid
* @param $udid
* @param bool $onlyUrl
* @return mixed
*/
getArticleBaseInfo(aid, uid, udid) {
let data = {
id: aid,
uid: uid,
udid: udid
};
return this.get({
url: 'guang/api/v1/article/getArticleBaseInfo',
data: data,
api: global.yoho.ServiceAPI
}).then(res => ({
isLike: res && res.isPraise === 'Y',
likeNum: res.praise_num || 0,
isCollected: res && res.isFavor === 'Y'
}));
}
/**
* 文章相关品牌
* @param $articleId
* @param bool $onlyUrl
* @return mixed
*/
getArticleRelateBrand(aid) {
let data = {
article_id: aid
};
return this.get({
url: 'guang/service/v2/article/getBrand',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
}).then(res => {
if (res && res.code === 200 && res.data) {
return _.map(res.data, it => {
it.thumb = it.thumb;
it.url = it.url;
return it;
});
}
});
}
/**
* 相关文章列表
* @param $articleId
* @param $tag
* @param int $limit
* @param bool $onlyUrl
* @return mixed
*/
getRelateArticleList(aid, tag, size, channel) {
size = size || 3;
let data = {
article_id: aid,
tags: tag,
limit: size
};
return this.get({
url: 'guang/service/v2/article/getOtherArticle',
data: data,
param: {
cache: true
},
api: global.yoho.ServiceAPI
}).then(res => {
if (res && res.code === 200 && res.data) {
return _.map(res.data, it => {
it.thumb = helpers.image(it.thumb, 264, 173, 1);
it.url = ghelper.getArticleUrl(it.url, it.id, channel);
return it;
});
}
});
}
/**
* 获取文章评论数据
*/
getArticleComments(aid, page, pageSize) {
page = page || 1;
pageSize = pageSize || 20;
let data = {
article_id: aid,
page: page,
list: list,
baseUrl: helpers.urlFormat('/info/index', {
id: aid,
pageSize: pageSize
}, 'guang')
limit: pageSize
};
});
};
/**
* 文章评论提交
* @param $id
* @param $uid
* @return mixed
*/
const addComment = (aid, uid, content) => serviceApi.get('guang/api/v1/comments/add', {
article_id: aid,
uid: uid,
content: content
}).then(res => {
if (res && res.code === 200) {
return res.data;
} else {
return Promise.reject('评论失败');
return this.get({
url: 'guang/api/v1/comments/getList',
data: data,
api: global.yoho.ServiceAPI
}).then(res => {
let num = (res.data && res.data.total) || 0;
let list = [];
if (num > 0 && res.data.list) {
let iList = res.data.list;
for (let i = 0; i < iList.length; i++) {
let it = iList[i];
list.push({
avatar: helpers.image(it.avator, 100, 100),
name: it.username,
content: it.content,
time: it.create_time
});
}
}
return {
commentNum: num,
pageSize: pageSize,
page: page,
list: list,
baseUrl: helpers.urlFormat('/info/index', {
id: aid,
pageSize: pageSize
}, 'guang')
};
});
}
});
/**
* 文章点赞
* @param $id
* @param $uid
* @return mixed
*/
const praise = (aid, udid) => serviceApi.get('guang/api/v2/praise/setPraise', {
article_id: aid,
udid: udid
});
/**
* 文章评论提交
* @param $id
* @param $uid
* @return mixed
*/
addComment(aid, uid, content) {
let data = {
article_id: aid,
uid: uid,
content: content
};
/**
* 文章点赞
* @param $id
* @param $uid
* @return mixed
*/
const cancelPraise = (aid, udid) => serviceApi.get('guang/api/v2/praise/cancel', {
article_id: aid,
udid: udid
});
this.get({
url: 'guang/api/v1/comments/add',
data: data,
api: global.yoho.ServiceAPI
/**
* 收藏文章
* @param $id
* @param $uid
* @return mixed
*/
const collect = (aid, uid) => serviceApi.get('guang/api/v1/favorite/setFavorite', {
article_id: aid,
uid: uid
});
}).then(res => {
if (res && res.code === 200) {
return res.data;
} else {
return Promise.reject('评论失败');
}
});
}
/**
* 取消收藏文章
* @param $id
* @param $uid
* @return mixed
*/
const cancelCollect = (aid, uid) => serviceApi.get('guang/api/v1/favorite/cancelFavorite', {
article_id: aid,
uid: uid
});
/**
* 文章点赞
* @param $id
* @param $uid
* @return mixed
*/
praise(aid, udid) {
let data = {
article_id: aid,
udid: udid
};
/**
* 获取制指定文章的动态信息
* @param ids
* @returns {Promise.<T>|*}
*/
const getDynamicDataById = (id, uid, udid) => {
return serviceApi.get('guang/api/*/article/getArticlePraiseAndFavor', {
id: id,
uid: uid,
udid: udid
});
};
return this.get({
url: 'guang/api/v2/praise/setPraise',
data: data,
api: global.yoho.ServiceAPI
});
}
/**
* 获取制指定文章的动态信息
* @param ids
* @param udid
* @param other [Obejct] 包含uid,query,type等非必传参数
* @returns {Promise.<T>|*}
*/
const getDynamicDataByIds = (ids, udid, other) => {
let params = {
articleIds: ids,
udid: udid
};
if (other.uid) {
_.assign(params, {
uid: other.uid
/**
* 文章点赞
* @param $id
* @param $uid
* @return mixed
*/
cancelPraise(aid, udid) {
let data = {
article_id: aid,
udid: udid
};
return this.get({
url: 'guang/api/v2/praise/cancel',
data: data,
api: global.yoho.ServiceAPI
});
}
/**
* 收藏文章
* @param $id
* @param $uid
* @return mixed
*/
collect(aid, uid) {
let data = {
article_id: aid,
uid: uid
};
return this.get({
url: 'guang/api/v1/favorite/setFavorite',
data: data,
api: global.yoho.ServiceAPI
});
}
if (other.query) {
_.assign(params, {
query: other.query
/**
* 取消收藏文章
* @param $id
* @param $uid
* @return mixed
*/
cancelCollect(aid, uid) {
let data = {
article_id: aid,
uid: uid
};
return this.get({
url: 'guang/api/v1/favorite/cancelFavorite',
data: data,
api: global.yoho.ServiceAPI
});
}
if (other.type) {
_.assign(params, {
type: other.type
/**
* 获取制指定文章的动态信息
* @param ids
* @returns {Promise.<T>|*}
*/
getDynamicDataById(id, uid, udid) {
let data = {
id: id,
uid: uid,
udid: udid
};
return this.get({
url: 'guang/api/*/article/getArticlePraiseAndFavor',
data: data,
api: global.yoho.ServiceAPI
});
}
return serviceApi.get('guang/api/*/article/getSimpleArticleList', params);
};
/**
* 获取制指定文章的动态信息
* @param ids
* @param udid
* @param other [Obejct] 包含uid,query,type等非必传参数
* @returns {Promise.<T>|*}
*/
getDynamicDataByIds(ids, udid, other) {
let params = {
articleIds: ids,
udid: udid
};
if (other.uid) {
_.assign(params, {
uid: other.uid
});
}
if (other.query) {
_.assign(params, {
query: other.query
});
}
if (other.type) {
_.assign(params, {
type: other.type
});
}
return this.get({
url: 'guang/api/*/article/getSimpleArticleList',
data: params,
api: global.yoho.ServiceAPI
});
}
module.exports = {
getArticleList,
getHotTags,
getAds,
getBanner,
getCategory,
getRecoArticles,
getPathNav,
getAuthor,
getArticleInfo,
getArticleContent,
getArticleBaseInfo,
getArticleRelateBrand,
getRelateArticleList,
getArticleComments,
addComment,
praise,
cancelPraise,
collect,
cancelCollect,
getDynamicDataById,
getDynamicDataByIds
};
... ...
... ... @@ -5,13 +5,13 @@
*/
'use strict';
const helpModel = require('../models/help');
const helpModel = require('../models/help-service');
const index = (req, res, next) => {
exports.index = (req, res, next) => {
let siteUrl = global.yoho.config.siteUrl;
let channel = req.query.channel ? req.query.channel : 'boys';
helpModel.helpData(channel).then(result => {
req.ctx(helpModel).helpData(channel).then(result => {
if (result.content.menuData.length === 0) {
return next();
}
... ... @@ -39,7 +39,7 @@ const index = (req, res, next) => {
/**
* 详情
*/
const detail = (req, res, next) => {
exports.detail = (req, res, next) => {
let q = req.query;
let params = {
id: parseInt(q.id || 1, 10),
... ... @@ -61,7 +61,7 @@ const detail = (req, res, next) => {
}
];
helpModel.detailData(params).then(result => {
req.ctx(helpModel).detailData(params).then(result => {
let newData = result.newData;
let headerData = result.headerData;
... ... @@ -87,22 +87,15 @@ const detail = (req, res, next) => {
};
// 帮助搜索功能
const search = (req, res, next) => {
helpModel.searchData(req.query).then(result => {
exports.search = (req, res, next) => {
req.ctx(helpModel).searchData(req.query).then(result => {
res.json(result);
}).catch(next);
};
// 获取在线客服的链接
const onlineService = (req, res, next) => {
helpModel.onlineService().then(url => {
exports.onlineService = (req, res, next) => {
req.ctx(helpModel).onlineService().then(url => {
res.json(url);
}).catch(next);
};
module.exports = {
index,
detail,
search,
onlineService
};
... ...
... ... @@ -6,75 +6,104 @@
'use strict';
const api = global.yoho.API;
// 获取热词搜索
const getHotSearch = () => {
return api.get('', {
method: 'app.helper.hotSearch',
showPlatform: 'yohobuy_pc'
}, {
code: 200,
cache: true
});
};
module.exports = class extends global.yoho.BaseModel {
constructor(ctx) {
super(ctx);
}
// 获取首页帮助分类以及常见问题
const gethomeCategoryFaq = () => {
return api.get('', {
method: 'app.helper.homeCategoryFaq',
showPlatform: 'yohobuy_pc'
}, {
code: 200,
cache: true
});
};
// 获取热词搜索
getHotSearch() {
// 获取自助服务
const getSelfService = () => {
return api.get('', {
method: 'app.helper.selfService',
showPlatform: 'yohobuy_pc'
}, {
code: 200
});
};
let data = {
method: 'app.helper.hotSearch',
showPlatform: 'yohobuy_pc'
};
const helpSearch = (params) => {
return api.get('', {
method: 'app.helper.search',
showPlatform: 'yohobuy_pc',
keyword: params.keywords,
page: params.page,
viewNum: '15',
debug: 'XYZ'
}, {
code: 200
});
};
return this.get({
data: data,
param: {
code: 200,
cache: true
}
});
}
const allQA = (page) => {
return api.get('', {
method: 'app.helper.allQA',
showPlatform: 'yohobuy_pc',
viewNum: 15,
page: page
}, {
code: 200
});
};
// 获取首页帮助分类以及常见问题
gethomeCategoryFaq() {
const onlineService = () => {
return api.get('', {
method: 'app.helper.getServiceOnline'
});
};
let data = {
method: 'app.helper.homeCategoryFaq',
showPlatform: 'yohobuy_pc'
};
return this.get({
data: data,
param: {
code: 200,
cache: true
}
});
}
// 获取自助服务
getSelfService() {
let data = {
method: 'app.helper.selfService',
showPlatform: 'yohobuy_pc'
};
module.exports = {
getHotSearch,
gethomeCategoryFaq,
getSelfService,
helpSearch,
allQA,
onlineService
return this.get({
data: data,
param: {
code: 200
}
});
}
helpSearch(params) {
let data = {
method: 'app.helper.search',
showPlatform: 'yohobuy_pc',
keyword: params.keywords,
page: params.page,
viewNum: '15',
debug: 'XYZ'
};
return this.get({
data: data,
param: {
code: 200
}
});
}
allQA(page) {
let data = {
method: 'app.helper.allQA',
showPlatform: 'yohobuy_pc',
viewNum: 15,
page: page
};
return this.get({
data: data,
param: {
code: 200
}
});
}
onlineService() {
return this.get({
data: {
method: 'app.helper.getServiceOnline'
}
});
}
};
... ...
... ... @@ -6,366 +6,380 @@
'use strict';
const _ = require('lodash');
const helpApi = require('./help-api');
const HelpApi = require('./help-api');
const headerModel = require('../../../doraemon/models/header');
const pager = require(`${global.utils}/pager`).setPager;
/**
* 根据id获取当前所在位置,拼接面包屑
* @param id
* @param menuData
* @returns {*[]}
* @private
*/
const _getNav = (id, menuData, url)=> {
for (let i = 0; i < menuData.length; i++) {
if (menuData[i].subsets) {
for (let j = 0; j < menuData[i].subsets.length; j++) {
if (menuData[i].subsets[j].id === id) {
module.exports = class extends global.yoho.BaseModel {
constructor(ctx) {
super(ctx);
}
/**
* 根据id获取当前所在位置,拼接面包屑
* @param id
* @param menuData
* @returns {*[]}
* @private
*/
_getNav(id, menuData, url) {
for (let i = 0; i < menuData.length; i++) {
if (menuData[i].subsets) {
for (let j = 0; j < menuData[i].subsets.length; j++) {
if (menuData[i].subsets[j].id === id) {
return [
{
href: url,
name: menuData[i].categoryName
}, {
name: menuData[i].subsets[j].categoryName
}
];
}
}
} else {
if (menuData[i].id === id) {
return [
{
href: url,
name: menuData[i].categoryName
}, {
name: menuData[i].subsets[j].categoryName
}
];
}
}
} else {
if (menuData[i].id === id) {
return [
{
name: menuData[i].categoryName
}
];
}
}
}
};
// 首页链接组装
const _processLink = (list, id) => {
let params = '';
list = list || [];
_.forEach(list, d => {
if (id) {
params = 'id=' + id + '&contId=' + d.id;
} else {
params = 'id=' + d.id;
}
// 首页链接组装
_processLink(list, id) {
let params = '';
d.jumpLink = global.yoho.config.siteUrl + '/help/detail?' + params;
});
list = list || [];
return list;
};
_.forEach(list, d => {
if (id) {
params = 'id=' + id + '&contId=' + d.id;
} else {
params = 'id=' + d.id;
}
// 处理分类
const _processMenuType = (item) => {
let curMenu = {
id: item.id,
categoryName: item.categoryName
};
let subsets = [];
if (item.categoryItems) {
_.forEach(item.categoryItems, c => {
subsets.push({
id: c.id,
parendId: item.id,
categoryName: c.categoryName
});
d.jumpLink = global.yoho.config.siteUrl + '/help/detail?' + params;
});
curMenu.subsets = subsets;
return list;
}
return curMenu;
};
// 处理分类
_processMenuType(item) {
let curMenu = {
id: item.id,
categoryName: item.categoryName
};
// 统计当前分类下的内容是否大于1
const _processCountLength = (c) => {
if (!c.contentItems) {
return false;
} else {
return c.contentItems.length > 1;
}
};
let subsets = [];
// 首页模块内容处理
const _processHomeCategoryFaq = (list) => {
let result = {
menuData: []
};
if (item.categoryItems) {
_.forEach(item.categoryItems, c => {
subsets.push({
id: c.id,
parendId: item.id,
categoryName: c.categoryName
});
});
curMenu.subsets = subsets;
}
list = list || {};
return curMenu;
}
// 常见问题
if (list.faqs) {
result.menuData.push({
id: 1,
categoryName: '常见问题'
});
// 统计当前分类下的内容是否大于1
_processCountLength(c) {
if (!c.contentItems) {
return false;
} else {
return c.contentItems.length > 1;
}
}
_.forEach(list.categorys, (item) => {
let newCont = [];
// 首页模块内容处理
_processHomeCategoryFaq(list) {
let result = {
menuData: []
};
result.menuData.push(_processMenuType(item));
list = list || {};
if (item.categoryItems) {
item.categoryItems = _processLink(item.categoryItems);
} else {
item.contentItems = _processLink(item.contentItems, item.id);
// 常见问题
if (list.faqs) {
result.menuData.push({
id: 1,
categoryName: '常见问题'
});
}
switch (item.categoryName) {
case '新手指南':
_.forEach(list.categorys, (item) => {
let newCont = [];
_.forEach(item.categoryItems, (ng, k) => {
ng.index = k + 1;
});
result.menuData.push(this._processMenuType(item));
item.categoryItems = _.chunk(item.categoryItems, 6);
item.num = _.flattenDeep(item.categoryItems).length;
result.newGuide = item;
if (item.categoryItems) {
item.categoryItems = this._processLink(item.categoryItems);
} else {
item.contentItems = this._processLink(item.contentItems, item.id);
}
break;
case '公告':
_.forEach(item.contentItems, (c, k) => {
c.caption = c.caption.substring(0, 10);
c.index = k;
});
switch (item.categoryName) {
case '新手指南':
_.chunk(item.contentItems, 2).forEach(data => {
newCont.push({
row: data
_.forEach(item.categoryItems, (ng, k) => {
ng.index = k + 1;
});
});
result.notice = newCont;
break;
default:
break;
}
});
item.categoryItems = _.chunk(item.categoryItems, 6);
item.num = _.flattenDeep(item.categoryItems).length;
result.newGuide = item;
result.problem = {
categoryName: '常见问题',
list: list.faqs
};
break;
case '公告':
_.forEach(item.contentItems, (c, k) => {
c.caption = c.caption.substring(0, 10);
c.index = k;
});
return result;
};
_.chunk(item.contentItems, 2).forEach(data => {
newCont.push({
row: data
});
});
result.notice = newCont;
break;
default:
break;
}
});
const returnCont = (data, contId) => {
let curCont = {};
result.problem = {
categoryName: '常见问题',
list: list.faqs
};
if (!data.contentItems) {
return;
return result;
}
_.forEach(data.contentItems, c => {
if (c.id === contId) {
curCont = c;
}
});
return {
isShowMenu: _processCountLength(data),
id: data.id,
title: data.categoryName,
list: data.contentItems,
contId: contId ? contId : data.contentItems[0].id,
cont: contId ? curCont : data.contentItems[0]
};
};
// 处理详情内容
const _processDetailCont = (item, params) => {
let cont = false;
returnCont(data, contId) {
let curCont = {};
let _this = this;
if (item.contentItems && item.id === params.id) {
return returnCont(item, params.contId);
}
if (!data.contentItems) {
return;
}
if (item.categoryItems) {
_.forEach(item.categoryItems, c => {
if (c.id === params.id) {
cont = returnCont(c, params.contId);
_.forEach(data.contentItems, c => {
if (c.id === contId) {
curCont = c;
}
});
return cont;
}
return false;
};
// 处理搜索结果内容
const _processSearch = (list, params) => {
list = list || [];
if (list.total === 0) {
return {
error: true
isShowMenu: _this._processCountLength(data),
id: data.id,
title: data.categoryName,
list: data.contentItems,
contId: contId ? contId : data.contentItems[0].id,
cont: contId ? curCont : data.contentItems[0]
};
} else {
let page = pager(_.get(list, 'page_total', 0), {
page: params.page,
helpQuery: params.keywords
});
list = _.assign({
footPager: page
}, list);
}
return list;
};
// 处理详情内容
_processDetailCont(item, params) {
let cont = false;
let _this = this;
// 详情内容及分类数据
const _processDetailData = (result, params) => {
let menuData = [];
let contData = false;
let data = _.get(result, '[2].data', {});
let nav = [];
// 常见问题
if (data.faqs) {
menuData.push({
id: 1,
categoryName: '常见问题'
});
if (item.contentItems && item.id === params.id) {
return _this.returnCont(item, params.contId);
}
if (params.id === 1 && !params.keywords) {
let page = pager(_.get(result, '[3].data.page_total', 0), {
id: params.id,
page: params.page
if (item.categoryItems) {
_.forEach(item.categoryItems, c => {
if (c.id === params.id) {
cont = _this.returnCont(c, params.contId);
}
});
return cont;
}
return false;
}
contData = {
isShowMenu: _processCountLength(data.faqs),
id: 1,
commonProblem: true,
faqs: data.faqs,
allQa: _.get(result, '[3].data.list', []),
footPager: page
// 处理搜索结果内容
_processSearch(list, params) {
list = list || [];
if (list.total === 0) {
return {
error: true
};
} else {
let page = pager(_.get(list, 'page_total', 0), {
page: params.page,
helpQuery: params.keywords
});
list = _.assign({
footPager: page
}, list);
}
return list;
}
// 其它分类数据处理
_.forEach(data.categorys, item => {
let resCont;
// 详情内容及分类数据
_processDetailData(result, params) {
let menuData = [];
let contData = false;
let data = _.get(result, '[2].data', {});
let nav = [];
let _this = this;
// 常见问题
if (data.faqs) {
menuData.push({
id: 1,
categoryName: '常见问题'
});
menuData.push(_processMenuType(item));
if (params.id === 1 && !params.keywords) {
let page = pager(_.get(result, '[3].data.page_total', 0), {
id: params.id,
page: params.page
});
if (contData || params.keywords) {
return;
contData = {
isShowMenu: _this._processCountLength(data.faqs),
id: 1,
commonProblem: true,
faqs: data.faqs,
allQa: _.get(result, '[3].data.list', []),
footPager: page
};
}
}
resCont = _processDetailCont(item, params);
// 其它分类数据处理
_.forEach(data.categorys, item => {
let resCont;
if (resCont) {
contData = _.assign({
helpDetail: true
}, resCont);
}
});
menuData.push(_this._processMenuType(item));
if (params.keywords) {
nav = [
{
name: '搜索结果'
if (contData || params.keywords) {
return;
}
];
} else {
nav = _getNav(params.id, menuData, params.url);
}
return {
nav: nav,
data: {
menuData: menuData,
contData: contData
}
};
};
resCont = _this._processDetailCont(item, params);
// 自助服务数据处理
const _processServiceData = (data) => {
_.forEach(data, (item, k) => {
item.index = k + 1;
});
if (resCont) {
contData = _.assign({
helpDetail: true
}, resCont);
}
});
return _.chunk(data, 4);
};
if (params.keywords) {
nav = [
{
name: '搜索结果'
}
];
} else {
nav = _this._getNav(params.id, menuData, params.url);
}
// 首页
const helpData = (channel) => {
return Promise.all([
headerModel.requestHeaderData(channel),
helpApi.getHotSearch(),
helpApi.gethomeCategoryFaq(),
helpApi.getSelfService()
]).then(result => {
return {
headerData: _.get(result, '[0]', {}),
content: _.assign({
hotSearch: _.slice(_.get(result, '[1].data', []), 0, 4),
selfService: {
categoryName: '自助服务',
list: _processServiceData(_.get(result, '[3].data', []))
}
}, _processHomeCategoryFaq(_.get(result, '[2].data', {})))
nav: nav,
data: {
menuData: menuData,
contData: contData
}
};
});
};
}
// 详情
const detailData = (params) => {
let promiseData = [
headerModel.requestHeaderData(params.channel),
helpApi.getHotSearch(),
helpApi.gethomeCategoryFaq()
];
// 自助服务数据处理
_processServiceData(data) {
_.forEach(data, (item, k) => {
item.index = k + 1;
});
if (params.id === 1 && !params.keywords) {
promiseData.push(helpApi.allQA(params.page));
return _.chunk(data, 4);
}
return Promise.all(promiseData).then(result => {
let newData = _processDetailData(result, params);
// 首页
helpData(channel) {
let helpDataModel = new HelpApi(this.ctx);
let _this = this;
return Promise.all([
headerModel.requestHeaderData(channel),
helpDataModel.getHotSearch(),
helpDataModel.gethomeCategoryFaq(),
helpDataModel.getSelfService()
]).then(result => {
return {
headerData: _.get(result, '[0]', {}),
content: _.assign({
hotSearch: _.slice(_.get(result, '[1].data', []), 0, 4),
selfService: {
categoryName: '自助服务',
list: _this._processServiceData(_.get(result, '[3].data', []))
}
}, _this._processHomeCategoryFaq(_.get(result, '[2].data', {})))
};
});
}
_.set(newData, 'data.hotSearch', _.slice(_.get(result, '[1].data', []), 0, 4));
return {
headerData: _.get(result, '[0]', {}),
newData: newData
};
});
};
// 详情
detailData(params) {
// 搜索
const searchData = (params) => {
return helpApi.helpSearch(params).then(result => {
return _.assign({
keywords: params.keywords
}, _processSearch(_.get(result, 'data', []), params));
});
};
let helpDataModel = new HelpApi(this.ctx);
let promiseData = [
headerModel.requestHeaderData(params.channel),
helpDataModel.getHotSearch(),
helpDataModel.gethomeCategoryFaq()
];
let _this = this;
// 在线客服
const onlineService = () => {
return helpApi.onlineService().then(result => {
return _.get(result, 'data.url', '');
});
};
if (params.id === 1 && !params.keywords) {
promiseData.push(helpDataModel.allQA(params.page));
}
return Promise.all(promiseData).then(result => {
let newData = _this._processDetailData(result, params);
_.set(newData, 'data.hotSearch', _.slice(_.get(result, '[1].data', []), 0, 4));
return {
headerData: _.get(result, '[0]', {}),
newData: newData
};
});
}
// 搜索
searchData(params) {
let helpDataModel = new HelpApi(this.ctx);
let _this = this;
module.exports = {
helpData,
detailData,
searchData,
onlineService
return helpDataModel.helpSearch(params).then(result => {
return _.assign({
keywords: params.keywords
}, _this._processSearch(_.get(result, 'data', []), params));
});
}
// 在线客服
onlineService() {
let helpDataModel = new HelpApi(this.ctx);
return helpDataModel.onlineService().then(result => {
return _.get(result, 'data.url', '');
});
}
};
... ...
... ... @@ -51,7 +51,7 @@
"urlencode": "^1.1.0",
"uuid": "^2.0.2",
"yoho-express-session": "^2.0.0",
"yoho-node-lib": "0.2.14",
"yoho-node-lib": "^0.2.19",
"yoho-zookeeper": "^1.0.8"
},
"devDependencies": {
... ...