Authored by 郭成尧

模板详情页数据封装

/**
* 商品详情controller
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/5/6
*/
'use strict';
const mRoot = '../models';
// 商品详情model
const detail = require(`${mRoot}/detail`);
exports.index = (req, res) => {
var id = req.params.id;
detail({
id: id
}, (data) => {
res.render('detail');
});
};
\ No newline at end of file
/**
* 商品详情controller
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/5/6
*/
'use strict';
const mRoot = '../models';
// 商品详情model
const detail = require(`${mRoot}/detail`);
exports.index = (req, res) => {
var id = req.params.id;
detail({
id: id
}, (data) => {
res.render('detail', {
result: JSON.stringify(data, null, 4)
});
});
};
... ...
/**
* 商品详情models
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/5/6
*/
'use strict';
const library = '../../../library';
const API = require(`${library}/api`);
const sign = require(`${library}/sign`);
var api = new API;
/**
* 详情页数据格式化
* @param origin Object 原始数据
* @return dest Object 格式化数据
*/
const introDataPkg = (origin) => {
var dest = {};
var descBo = origin.productDescBo;
var sizeBo = origin.sizeInfoBo;
// 商品信息
if (descBo) {
// 编号、颜色、性别
let sex;
switch (descBo.gender) {
case 1:
sex = '男款';
break;
case 2:
sex = '女款';
break;
default:
sex = '通用';
}
dest.description.table = [
`编号:${descBo.erpProductId}`,
`颜色:${descBo.colorName}`,
`性别:${sex}`
];
// 其余参数
for (let standard of descBo.standardBos) {
dest.description.table.push(`${standard.standardName}${standard.standardVal}`);
}
// 商品详情描述
dest.description.desc = descBo.phrase;
}
// 尺码信息
if (sizeBo) {
let gender = descBo.gender;
let boyReference = origin.productExtra.boyReference;
let girlReference = origin.productExtra.girlReference;
let reference = '参考尺码';
let showReference = false;
if (gender === 3) {
if (boyReference) {
reference = '参考尺码(男)';
} else if (girlReference) {
reference = '参考尺码(女)';
}
}
// 是否显示参考尺码
showReference = (boyReference && sizeBo.sizeBoList[0].boyReferSize) ||
(girlReference && sizeBo.sizeBoList[0].girlReferSize);
}
}
module.exports = (data, cb) => {
api.get('', sign.apiSign({
productskn: data.id,
udid: 'f528764d624db129b32c21fbca0cb8d6',
uid: '11993475',
method: 'h5.product.intro'
})).then(data => {
var dJson = JSON.parse(data);
cb(data);
});
};
\ No newline at end of file
/**
* 商品详情models
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/5/6
*/
'use strict';
const library = '../../../library';
const API = require(`${library}/api`);
const sign = require(`${library}/sign`);
const _ = require('lodash');
const HELPERS = require(`${library}/helpers`);
var api = new API();
var helpers = new HELPERS();
/**
* 处理限购商品的有关按钮状态(或取现购买以及底部商品购买按钮)
* @param {[array]} 需要处理的数据
* @param {[int]} 限购商品的关联状态
* @param {Boolean} 限购商品是否已开售
* @return {[array]}
*/
const procShowStatus = (data, showStatus, isBeginSale) => {
switch (showStatus) {
case 1:// 开售前/后,立即分享获得限购码(用户未领取限购码)
// 显示获取限购码按钮
data.canGetLimitCode = true;
if (isBeginSale) { // 开售后
data.cartInfo.noLimitCode = true;
} else {
data.cartInfo.limitNotForSale = true;
}
break;
case 2: // 开售后,限购码已抢光(用户未领取限购码)
data.codeEmpty = true;
data.cartInfo.noLimitCode = true;
break;
case 3: // 开售后,商品已经售罄
data.noLimitGoodsBtn = true;
data.cartInfo.soldOut = true;
break;
case 4: // 开售后,立即购买(用户已领取限购码)
data.gotCode = true;
data.cartInfo.canBuyLimit = true;
break;
case 5: // 开售前,限购码已被抢光(用户未领取限购码)
data.codeEmpty = true;
data.cartInfo.limitNotForSale = true;
break;
case 6: // 开售前,即将开售(用户已领取限购码)
data.gotCode = true;
data.cartInfo.limitNotForSale = true;
break;
case 7: // 开售后,用户已经用获得的限购码购买过商品
data.gotCode = true;
data.cartInfo.noLimitCode = true;
break;
default:
break;
}
return data;
};
/**
* 根据设备类型获得限购商品跳转app的url
* @param {[string]} productCode 限购商品码
* @param {[string]} skn 限购商品skn
* @return {[string]} 限购商品跳转url
*/
const getLimitCodeUrl = (productCode, skn) => {
var url = 'yohoapp://yoho.app/openwith?limit_product_code=' + productCode + '&product_skn=' + skn;
console.log(navigator.userAgent);
return url;
};
/**
* 详情页数据格式化
* @param origin Object 原始数据
* @return dest Object 格式化数据
*/
const detailDataPkg = (origin, vipLevel) => {
var dest = {}, // 结果输出
colorGroup = {},
thumbImageList = {},
sizeGroup = {},
totalStorageNum = 0;
// 商品名称
if (origin.productName === null || origin.productName === 'undefined') {
return dest;
}
dest.goodsName = origin.productName;
// 用户未登录时
// 商品促销短语
if (origin.salesPhrase !== null && origin.salesPhrase !== 'undefined') {
dest.goodsSubtitle = origin.salesPhrase;
}
// 商品标签
if (origin.productTagBoList !== null && origin.productTagBoList !== 'undefined') {
_.forEach(origin.productTagBoList, function(value) {
switch (value.tagLabel) {
case 'is_soon_sold_out':
dest.tags.is_soon_sold_out = true;
break;
case 'is_new':
dest.tags.is_new = true;
break;
case 'is_discount':
dest.tags.is_discount = true;
break;
case 'is_limited':
dest.tags.is_limited = true;
break;
case 'is_yohood':
dest.tags.is_yohood = true;
break;
case 'is_advance':
dest.tags.is_advance = true;
break;
default:
break;
}
});
}
// 商品价格
dest.goodsPrice = {};
if (origin.productPriceBo !== null && origin.productPriceBo !== 'undefined') {
dest.goodsPrice.currentPrice = origin.productPriceBo.formatSalesPrice;
if (origin.productPriceBo.formatMarketPrice !== origin.productPriceBo.formatSalesPrice) {
dest.goodsPrice.previousPrice = origin.productPriceBo.formatMarketPrice;
}
// 商品返回 YOHO 币
if (origin.productPriceBo.yohoCoinNum !== null && origin.productPriceBo.yohoCoinNum !== 0) {
dest.commodityReturn = dest.productPriceBo.yohoCoinNum;
}
}
// VIP 商品价格
dest.vipLevel = {};
dest.vipLevel.list = {};
if (origin.productPriceBo.vipPrices !== null && origin.productPriceBo.vipPrices !== 'undefined') {
_.forEach(origin.productPriceBo.vipPrices, function(value, key) {
dest.vipLevel.list[key] = {};
dest.vipLevel.list[key].level = value.vipLevel;
dest.vipLevel.list[key].text = value.vipPrice;
dest.vipLevel.list[key].currentLevel = (value.vipLevel === vipLevel) ? true : false;
});
}
// 上市期
if (origin.expectArrivalTime !== null && origin.expectArrivalTime !== 'undefined') {
dest.periodOfMarket = origin.expectArrivalTime + '月';
}
// 促销信息
dest.goodsDiscount = {};
dest.goodsDiscount.list = {};
if (origin.promotionBoList !== null && origin.promotionBoList !== 'undefined') {
_.forEach(origin.promotionBoList, function(value, key) {
dest.goodsDiscount.list[key] = {};
dest.goodsDiscount.list[key].text = '【' + value.promotionType + '】';
});
}
// 商品咨询
dest.feedbacks = {};
dest.feedbacks.consults = {};
dest.feedbacks.consultsNum = 0;
if (origin.consultBoWrapper !== null && origin.consultBoWrapper !== 'undefined') {
dest.feedbacks.consultsNum = origin.consultBoWrapper.consultTotal;
_.forEach(origin.consultBoWrapper.consultBoList, function(value, key) {
dest.feedbacks.consults[key] = {};
dest.feedbacks.consults[key].question = value.ask;
dest.feedbacks.consults[key].time = value.askTime;
dest.feedbacks.consults[key].answer = value.answer;
});
let params = {};
params.product_id = origin.id;
params.total = dest.feedbacks.consultsNum;
dest.feedbacks.consultsUrl = helpers.url('/product/detail/consults', params);
} else { // 暂无咨询
let params = {};
params.product_id = origin.id;
dest.feedbacks.consultsUrl = helpers.url('/product/detail/consultform', params);
}
// 商品评价
dest.feedbacks.commentsNum = 0;
if (origin.commentBoWrapper !== null && origin.commentBoWrapper !== 'undefined') {
dest.feedbacks.commentsNum = origin.commentBoWrapper.commentTotal;
dest.feedbacks.comments = {};
_.forEach(origin.commentBoWrapper.commentBoList, function(value, key) {
dest.feedbacks.comments[key] = {};
dest.feedbacks.comments[key].userName = value.nickName;
dest.feedbacks.comments[key].desc = value.colorName +
'/' + value.sizeName;
dest.feedbacks.comments[key].content = (value.content !== null &&
value.content !== 'undefined') ? value.content : '';
dest.feedbacks.comments[key].time = value.createTime;
});
let params = {};
params.product_id = origin.id;
params.total = dest.feedbacks.commentsNum;
dest.feedbacks.commentsUrl = helpers.url('/product/detail/comments', params);
}
// 品牌信息 待开发
if (origin.brand !== null && origin.brand !== 'undefined') {
// 为你优选的链接
let params = {};
params.productSkn = origin.erpProductId;
params.brandId = origin.brand.id;
dest.preferenceUrl = helpers.url('/product/detail/preference', params, '');
}
dest.productSkn = origin.erpProductId;
// 商品信息
if (origin.goodsList !== null && origin.goodsList !== 'undefined') {
let goodsGroup = {},
sizeName = '',
colorList = {},
sizeList = {},
allSizeList = {},
colorStorageGroup = {},
colorStorageNum = 0;
_.forEach(origin.goodsList, function(value, key) {
if (value.status === 0) {
return true;
}
colorStorageNum = 0;
// 商品分组
if (value.goodsImagesList !== null && value.goodsImagesList !== 'undefined') {
_.forEach(value.goodsImagesList, function(good, keyForGood) {
goodsGroup[keyForGood] = {};
goodsGroup[keyForGood].goodsId = good.goodsId;
goodsGroup[keyForGood].img = good.imageUrl;
});
}
// 商品的尺码列表
colorStorageGroup[value.productSkc] = {};
if (value.goodsSizeBoList !== null && value.goodsSizeBoList !== 'undefined') {
_.forEach(value.goodsSizeBoList, function(size, keyForSize) {
sizeList[value.productSkc] = {};
sizeList[value.productSkc][keyForSize] = {};
sizeList[value.productSkc][keyForSize].id = size.id;
sizeList[value.productSkc][keyForSize].skuId = size.goodsSizeSkuId;
sizeList[value.productSkc][keyForSize].goodsId = size.goodsId;
sizeList[value.productSkc][keyForSize].colorId = size.colorId;
sizeList[value.productSkc][keyForSize].name = size.sizeName;
sizeList[value.productSkc][keyForSize].sizeNum = size.goodsSizeStorageNum;
sizeName = size.sizeName;
// 所有尺码列表,赋值用于前端展示默认尺码的时候
// 判断出没有库存则显示灰色
let build = {};
build.storage = size.goodsSizeStorageNum;
build.id = size.id;
allSizeList[sizeName] = (allSizeList[sizeName] === null ||
allSizeList[sizeName] === 'undefined') ? build :
allSizeList[sizeName];
colorStorageNum += parseInt(size.goodsSizeStorageNum);
colorStorageGroup[value.productSkc][sizeName] = parseInt(size.goodsSizeStorageNum);
});
// 颜色分组
colorList[key] = {};
colorList[key].id = value.colorId;
colorList[key].skcId = value.productSkc;
colorList[key].name = value.colorName;
colorList[key].goodsName = value.goodsName;
colorList[key].colorNum = colorStorageNum;
}
// 缩略图
let params = {};
params.img = helpers.getImageUrl(value.colorImage, 60, 60);
thumbImageList[key] = params;
// 商品库存总数
totalStorageNum += colorStorageNum;
});
// 遍历所有尺码,构建颜色显示数据
let i = 1;
_.forEach(allSizeList, function(value, key) {
// 默认尺码
sizeGroup[0] = {};
sizeGroup[0].size = {};
sizeGroup[0].size[key] = {};
sizeGroup[0].size[key].name = sizeName;
sizeGroup[0].size[key].sizeNum = (value.storage === null || value.storage === 'undefined') ? false : true;
sizeGroup[0].size[key].id = value.id;
// 各个颜色的尺码, 每行显示一个尺码对应的颜色
_.forEach(colorList, function(colorArr, keyForColorArr) {
colorGroup[i] = {};
colorGroup[i].color = {};
colorGroup[i].color[keyForColorArr] = {};
colorGroup[i].color[keyForColorArr].colorNum =
(colorStorageGroup[colorArr.skcId][sizeName] !== null &&
colorStorageGroup[colorArr.skcId][sizeName] !== 'undefined') ?
colorStorageGroup[colorArr.skcId][sizeName] : 0;
});
colorGroup[i].id = value.id;
++i;
});
// 遍历所有颜色, 构建尺码显示数据
i = 1;
_.forEach(colorList, function(value, key) {
// 各个尺码的颜色, 每行显示一个颜色的对应尺码
sizeGroup[i] = {};
sizeGroup[i].size = sizeList[value.skcId];
sizeGroup[i].colorId = value.skcId;
// 默认颜色
colorGroup[0] = {};
colorGroup[0].color = {};
colorGroup[0].color[key] = value;
++i;
});
// 商品图:多个
if (goodsGroup[1] !== null && goodsGroup[1] !== 'undefined') {
_.forEach(goodsGroup, function(value, key) {
dest.bannerTop = {};
dest.bannerTop.list = {};
let params = {};
params.img = helpers.getImageUrl(value.img, 450, 600);
dest.bannerTop.list[key] = params;
});
} else if (goodsGroup[0] !== null && goodsGroup[0] !== 'undefined') {
dest.bannerTop = {};
dest.bannerTop.img = helpers.getImageUrl(goodsGroup[0].img, 450, 600);
}
}
// 悬浮的购物车信息
dest.cartInfo = {};
dest.cartInfo.cartUrl = helpers.url('/cart/index/index', null);
dest.cartInfo.numInCart = 0;
dest.cartInfo.goodsInstore = origin.storage;
let soldOut = (origin.storage === 0) || (origin.status === 0 || totalStorageNum === 0);
let notForSale = origin.attribute === 2;
// 显示加入购物车链接
if (!soldOut && !notForSale) {
_.orderBy(colorGroup);
dest.cartInfo = {};
dest.cartInfo.productId = origin.id;
dest.cartInfo.thumbs = thumbImageList;
dest.cartInfo.name = (dest.goodsName !== null && dest.goodsName !== 'undefined') ? dest.goodsName : '';
dest.cartInfo.price = (dest.goodsPrice.previousPrice !== null &&
dest.goodsPrice.previousPrice !== 'undefined') ? dest.goodsPrice.previousPrice : '';
dest.cartInfo.salePrice = (dest.goodsPrice.currentPrice !== null &&
dest.goodsPrice.currentPrice !== 'undefined') ? dest.goodsPrice.currentPrice : '';
dest.cartInfo.totalNum = totalStorageNum;
dest.cartInfo.colors = colorGroup;
dest.cartInfo.sizes = sizeGroup;
// 限购商品
if (origin.isLimitBuy === 'Y') {
// 是否开售
let isBeginSale = (origin.saleStatus !== null && origin.saleStatus !== 'undefined' &&
origin.saleStatus === 1);
// 限购商品有关的展示状态
let showStatus = 1;
if (origin.showStatus !== null && origin.showStatus !== 'undefined') {
showStatus = parseInt(origin.showStatus);
}
// 处理限购商品有关的按钮状态
dest = procShowStatus(dest, showStatus, isBeginSale);
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = getLimitCodeUrl(origin.limitProductCode, origin.erpProductId);
dest.cartInfo.limitProductPay = helpers.url('/cart/index/orderEnsure');
} else {
dest.cartInfo.addToCartUrl = helpers.url('/product/buy_' + origin.id + '_' +
origin.goodsList.id + '.html'); // 待处理 确认 goodsId 的含义
}
} else if (notForSale) {
dest.cartInfo.notForSale = true;
} else if (soldOut) {
dest.cartInfo.soldOut = true;
}
// 是否收藏
dest.isCollect = false;
if (origin.isCollect !== null && origin.isCollect !== 'undefined' && origin.isCollect === 'Y') {
dest.isCollect = true;
}
// 底部简介的URL链接
dest.introUrl = helpers.url('/product/intro_' + origin.erpProductId + '/' + origin.cnAlphabet + '.html', null, '');
dest.id = origin.id;
return dest;
};
module.exports = (data, cb) => {
console.log('data:' + JSON.stringify(data));
api.get('', sign.apiSign({
productId: data.id,
method: 'h5.product.data'
})).then({
var dJson = JSON.parse(data);
cb(detailDataPkg(dJson, 0)); // 待处理 缺少 VIP 等级参数,暂时补充为 0
});
};
... ...
/*
* @Author: Targaryen
* @Date: 2016-05-10 10:11:34
* @Last Modified by: Targaryen
* @Last Modified time: 2016-05-12 10:46:55
*/
/* -----------------------------------------
* 实现 PHP 的 Helpers 函数
* -----------------------------------------
*/
'use strict';
const SUB_DOMAIN = '.yohobuy.com';
const SITE_MAIN = 'http://www.yohobuy.com';
const _ = require('lodash');
class HELPERS {
/**
* 构建网站的URL
* @param uri String
* @param param Array
* @param module String
*/
url(uri, param, module) {
let url = '';
if (module === null) {
module = 'index';
}
switch (module) {
case 'default':
url = 'http://m.yohobuy.com';
break;
case 'guang':
url = 'http://guang' + SUB_DOMAIN;
break;
case 'list':
url = 'http://list' + SUB_DOMAIN;
break;
case 'search':
url = 'http://search' + SUB_DOMAIN;
break;
case 'index':
url = SITE_MAIN;
break;
case '':
break;
default:
url = 'http://' + module + SUB_DOMAIN;
break;
}
url += uri;
if (param !== null && param !== 'undefined') {
url += '?';
_.forEach(param, function(value, key) {
url += (key + '=' + value + '&');
});
}
if (url.substr(-1, 1) === '&') {
return url.substr(0, url.length - 1);
} else {
return url;
}
}
/**
* 根据尺寸获得图片url
* @param uri String
* @param param Array
* @param module String
*/
getImageUrl(url, width, height, mode) {
if (mode === null) {
mode = 2;
}
return url.replace(/{width}/g, width)
.replace(/{height}/g, height)
.replace(/{mode}/g, mode);
}
}
module.exports = HELPERS;
... ...