Authored by 黄涛

ok

... ... @@ -15,42 +15,42 @@ const moment = require('moment');
/* COOKIE标识访问的是男生频道 */
const COOKIE_NAME_BOYS = 'boys';
//TODO
const COOKIE_DOMAIN = "";
// TODO
const COOKIE_DOMAIN = '';
function setSwitchToCookie(req) {
req.cookie('_Channel', COOKIE_NAME_BOYS, {
function setSwitchToCookie(res) {
res.cookie('_Channel', COOKIE_NAME_BOYS, {
domain: COOKIE_DOMAIN,
expires: moment().add("days", 300).valueOf()
maxAge: moment.duration(300, 'days').seconds()
});
}
function getGenderByCookie(req) {
let gender = null;
let channel = req.cookies._Channel || "boys";
let channel = req.cookies._Channel || 'boys';
switch (channel) {
case 'boys':
{
gender = '1,3';
break;
}
{
gender = '1,3';
break;
}
case 'girls':
{
gender = '2,3';
break;
}
{
gender = '2,3';
break;
}
default:
{
gender = "1,2,3";
}
{
gender = '1,2,3';
}
}
return channel;
return gender;
}
exports.index = (req, res, next) => {
exports.index = (req,res, next) => {
// var uid = null, // 需要修改为正式取 UID 的方式
// vipLevel = 0; // 用户等级
... ... @@ -61,7 +61,7 @@ exports.index = (req, res, next) => {
if (req.cookies._Channel) {
channel = req.cookies._Channel;
} else {
setSwitchToCookie(req);
setSwitchToCookie(res);
}
let gender = getGenderByCookie(req);
... ...
... ... @@ -10,22 +10,22 @@ var express = require('express'),
var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
var partials = path.join(__dirname, './views');
app.set('views', path.join(__dirname, 'views/action'));
app.on('mount', function(parent) {
app.on('mount', function (parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
// set view engin
app.set('views', path.join(__dirname, 'views/action'));
app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: ['./views/partial', `${doraemon}/partial`],
helpers: 'helpers'
partialsDir: [`${partials}/partials`, `${doraemon}/partial`],
helpers: require('../../library/helpers')
}));
// router
... ...
... ... @@ -12,40 +12,40 @@ const co = Promise.coroutine;
*/
// TODO
// index home
module.exports.getHomeChannelNav = function (channel) {
module.exports.getHomeChannelNav = function(channel) {
let home = null;
switch (channel) {
case 'boys':
{
home = helpers.urlFormat('', '', "default");
break;
}
{
home = helpers.urlFormat('', '', 'default');
break;
}
case 'girls':
{
home = helpers.urlFormat('/woman', '', "new");
break;
}
{
home = helpers.urlFormat('/woman', '', 'new');
break;
}
case 'lifestyle':
{
home = helpers.urlFormat('/lifestyle', '', "new");
break;
}
{
home = helpers.urlFormat('/lifestyle', '', 'new');
break;
}
case 'kids':
{
home = helpers.urlFormat('/kids', '', "new");
break;
}
{
home = helpers.urlFormat('/kids', '', 'new');
break;
}
default:
{
home = helpers.urlFormat('', '', "default");
}
{
home = helpers.urlFormat('', '', 'default');
}
}
return {
href : home,
name : `${channel.toUpperCase()}首页`,
pathTitle:'YOHO!有货'
}
}
href: home,
name: `${channel.toUpperCase()}首页`,
pathTitle: 'YOHO!有货'
};
};
... ...
... ... @@ -22,6 +22,7 @@ const FavoriteData = require('./FavoriteData');
const ShopModel = require('./Shop');
const SearchData = require('./SearchData');
const HomeModel = require('./HomeModel');
const HeaderModel = require('../../../doraemon/models/header');
const BLANK_STR = ' ';
... ... @@ -1000,7 +1001,7 @@ function getSizeDataBySizeInfo(sizeInfo) {
// 参考尺码为空
if (_.isEmpty(size.thead[1]) && showReference) {
// 移除这个值
size.thead.slice(1, 1);
size.thead.splice(1, 1);
}
}
}
... ... @@ -1327,6 +1328,7 @@ const getSizeInfoAsync = (productSkn, maxSortId)=> {
};
module.exports = (data) => {
return co(function * () {
// 获取商品信息
... ... @@ -1337,21 +1339,24 @@ module.exports = (data) => {
productInfo = yield detailDataPkg(productInfo, data.uid, data.vipLevel, data.ua);
//获取商品尺寸相关
// 获取商品尺寸相关
let sizeInfo = yield getSizeInfoAsync(productInfo.goodsInfo, productInfo.goodsInfo.maxSortId);
let navs = yield getSortNavAsync(productInfo.goodsInfo.smallSortId, data.gender);
let data = {
let result = {
productDetailPage: true,
detail: Object.assign(productInfo, sizeInfo),
statGoodsInfo: Object.assign({fullSortName: navs.map(x => x.name).join('-')}, productInfo.statGoodsInfo)
};
//导航
data.detail.pathNav = _.concat(HomeModel.getHomeChannelNav(data.channel), navs, [{name: productInfo.goodsInfo.name}]);
data.detail.lastWalk = 5;
// 导航
result.detail.pathNav = _.concat(HomeModel.getHomeChannelNav(data.channel), navs, [{name: productInfo.goodsInfo.name}]);
result.detail.lastWalk = 5;
return data;
result.headerData = yield HeaderModel.requestHeaderData();
console.log(result.headerData);
return result;
})();
};
... ...
... ... @@ -13,6 +13,6 @@ const helpers = require(`${library}/helpers`);
const api = new API();
module.exports.getSortByConditionAsync = function(conddition) {
return api.get('/sortgroup.json', conddition);
return api.get('sortgroup.json', conddition);
};
... ...
/**
* 商品详情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}
* @return {array}
*/
const getShopsInfo = (data) => {
var enterStore = {};
_.forEach(data, function(value, key) {
enterStore[key] = {};
enterStore[key].img = helpers.getImageUrl(value.brand_ico, 47, 47);
enterStore[key].storeName = value.brand_name;
if (value.shop_id !== null && value.shop_id !== undefined) {
let params = {};
params.shop_id = value.shop_id;
enterStore[key].url =
helpers.url('/product/index/brand', params);
} else {
enterStore[key].url =
helpers.url('', null, value.brand_domain);
}
});
return enterStore;
};
/**
* 处理限购商品的有关按钮状态(或取现购买以及底部商品购买按钮)
* @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, ua) => {
var url = 'yohoapp://yoho.app/openwith?limit_product_code=' + productCode +
'&product_skn=' + skn;
let isIphone = String(ua).indexOf('iPhone') >= 0;
let isIpad = ua.indexOf('iPad') >= 0;
if (isIphone || isIpad) {
let params = {};
params.lp = productCode;
url = 'yohobuy://' + helpers.url('/limitpurchase', params);
}
return url;
};
/**
* 详情页数据格式化
* @param origin Object 原始数据
* @return dest Object 格式化数据
*/
const detailDataPkg = (origin, uid, vipLevel, ua) => {
var dest = {}, // 结果输出
colorGroup = {},
thumbImageList = {},
sizeGroup = {},
totalStorageNum = 0;
// 商品名称
if (origin.productName === null || origin.productName === undefined) {
return dest;
}
dest.goodsName = origin.productName;
// 用户未登录时 待处理
if (uid === null || uid === undefined) {
let params = {};
params.refer = helpers.url('/product/show_' + origin.erpProductId + '.html');
dest.loginUrl = helpers.url('/signin.html', params);
}
// 商品促销短语
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 + '】' +
value.promotionTitle;
});
}
// 商品咨询
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) {
// dest.enterStore[0] = {};
// dest.enterStore[0].img =
// helpers.getImageUrl(origin.brand.brandIco, 47, 47);
// dest.enterStore[0].storeName = origin.brand.brandName;
// dest.enterStore[0].url = helpers.url('', null, origin.brand.brandDomain);
// 为你优选的链接
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 === undefined || value.storage === null) ? 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, ua);
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) => {
var finalResult;
return api.get('', sign.apiSign({
productId: data.id,
uid: data.uid,
vipLevel: data.vipLevel,
method: 'h5.product.data'
})).then(result => {
finalResult = detailDataPkg(result, data.uid, data.vipLevel, data.ua);
return api.get('', sign.apiSign({
method: 'app.shop.queryShopsByBrandId',
brand_id: result.brand.id
})).then(shops => {
if (shops.code === 200) {
finalResult.enterStore = getShopsInfo(shops.data);
}
return finalResult;
});
});
};
... ... @@ -20,6 +20,7 @@
{{/ banner}}
<div class="center-content">
{{> product/path-nav}}
{{# goodsInfo}}
<div class="main clearfix" data-skn="{{skn}}" data-id="{{productId}}">
... ... @@ -153,7 +154,8 @@
<span class="title pull-left">选颜色:</span>
<ul class="colors pull-left clearfix">
{{#each colors}}
<li class="{{#if focus}}focus{{/if}} {{#if disable}}disable{{/if}} pull-left" title="{{title}}" data-color="{{name}}" data-total="{{total}}">
<li class="{{#if focus}}focus{{/if}} {{#if disable}}disable{{/if}} pull-left"
title="{{title}}" data-color="{{name}}" data-total="{{total}}">
<img src="{{src}}">
</li>
{{/each}}
... ... @@ -173,7 +175,8 @@
{{#each colors}}
<ul class="size{{#unless focus}} hide{{/unless}}">
{{#each size}}
<li {{#unless num}}class="disable"{{/unless}} data-sku="{{sku}}" data-num="{{num}}" data-name="{{name}}">{{name}}</li>
<li {{#unless num}}class="disable"{{/unless}} data-sku="{{sku}}"
data-num="{{num}}" data-name="{{name}}">{{name}}</li>
{{/each}}
{{#unless virtualGoods}}
... ... @@ -239,7 +242,8 @@
{{!-- 各颜色下所有尺码均售罄则只显示售罄按钮 --}}
{{#unless soldOut}}
{{# buyNow}}
<span id="buy-now" class="buy-btn buy-now item-buy{{#if dis}} dis{{/if}}" data-base="{{buyNowBase}}">立即购买</span>
<span id="buy-now" class="buy-btn buy-now item-buy{{#if dis}} dis{{/if}}"
data-base="{{buyNowBase}}">立即购买</span>
{{/ buyNow}}
{{# openSoon}}
<span id="open-soon" class="buy-btn item-buy dis">即将开售</span>
... ... @@ -275,6 +279,7 @@
<div class="share-row">
<span class="title pull-left">分享商品:</span>
{{> product/share }}
</div>
</div>
... ... @@ -370,24 +375,24 @@
{{# size}}
<table class="size-table">
<thead>
<tr>
{{# thead}}
<th>{{name}}</th>
{{/ thead}}
</tr>
<tr>
{{# thead}}
<th>{{name}}</th>
{{/ thead}}
</tr>
</thead>
<tbody>
{{# tbody}}
<tr>
{{#each .}}
<td>{{.}}</td>
{{/each}}
</tr>
{{/ tbody}}
{{# tbody}}
<tr>
{{#each .}}
<td>{{.}}</td>
{{/each}}
</tr>
{{/ tbody}}
</tbody>
</table>
<p class="size-tip">
※ 以上尺寸为实物人工测量,因测量方式不同会有1-2CM误差,相关数据仅作参考,以收到实物为准。 单位:CM
※ 以上尺寸为实物人工测量,因测量方式不同会有1-2CM误差,相关数据仅作参考,以收到实物为准。 单位:CM
</p>
<p class="size-tip">
※ 参考尺码因衣服版型、剪裁不同会有误差,仅供参考
... ... @@ -406,26 +411,26 @@
{{# reference}}
<table class="reference-table">
<thead>
<tr>
{{# thead}}
<th class="{{#if @first}}avatar-col{{/if}}{{#if modelCol}}model-col{{/if}}{{#if remarkCol}}remark-col{{/if}}">{{name}}</th>
{{/ thead}}
</tr>
<tr>
{{# thead}}
<th class="{{#if @first}}avatar-col{{/if}}{{#if modelCol}}model-col{{/if}}{{#if remarkCol}}remark-col{{/if}}">{{name}}</th>
{{/ thead}}
</tr>
</thead>
<tbody>
{{# tbody}}
<tr>
{{#each .}}
<td>
{{# tbody}}
<tr>
{{#each .}}
<td>
{{#if @first}}
<img class="avatar" src="{{.}}">
{{^}}
{{.}}
{{/if}}
</td>
{{/each}}
</tr>
{{/ tbody}}
</td>
{{/each}}
</tr>
{{/ tbody}}
</tbody>
</table>
{{/ reference}}
... ... @@ -460,20 +465,20 @@
{{^}}
<table class="fitting-report-table">
<thead>
<tr>
{{# thead}}
<th>{{.}}</th>
{{/ thead}}
</tr>
<tr>
{{# thead}}
<th>{{.}}</th>
{{/ thead}}
</tr>
</thead>
<tbody>
{{# tbody}}
<tr>
{{#each .}}
<td>{{.}}</td>
{{/each}}
</tr>
{{/ tbody}}
{{# tbody}}
<tr>
{{#each .}}
<td>{{.}}</td>
{{/each}}
</tr>
{{/ tbody}}
</tbody>
</table>
{{/if}}
... ... @@ -562,7 +567,8 @@
<div class="img-2"></div>
<div class="text">
<h4>退换货承诺</h4>
<p>自您签收商品7日内可以退货,15日内可以换货,在商品不影响二次销售的情况下,YOHO!有货将为您办理退换货服务,请在网站提交"退换货"申请。需要说明的是:非质量问题的退换货,来回运费由您承担。</p>
<p>
自您签收商品7日内可以退货,15日内可以换货,在商品不影响二次销售的情况下,YOHO!有货将为您办理退换货服务,请在网站提交"退换货"申请。需要说明的是:非质量问题的退换货,来回运费由您承担。</p>
<h4>退换货方式</h4>
<p>
针对国内大中型城市,YOHO!有货开通了<span class="orange">"上门换货"</span>服务,上门服务区域及费用请联系客服中心;若您所在的区域不在上门换货范围内,请您选择普通快递将商品、内包装、赠品及发货单等一并寄回。质量问题的退换货,目前不支持运费到付款业务,请您先垫付运费寄回。如需退换货,请致电客服电话:400-889-9646。
... ... @@ -593,77 +599,78 @@
</div>
{{/ detail}}
<script id="comments-tpl" type="text/html">
\{{# comments}}
<li>
<div class="user-info clearfix">
<img class="user-avatar pull-left" src="\{{avatar}}">
<p>
<span class="name">\{{userName}} </span>
购买了\{{color}}/\{{size}}
<br>
<span class="date">\{{date}}</span>
</p>
</div>
<p class="comment">\{{comment}}</p>
</li>
\{{/ comments}}
\{{# comments}}
<li>
<div class="user-info clearfix">
<img class="user-avatar pull-left" src="\{{avatar}}">
<p>
<span class="name">\{{userName}} </span>
购买了\{{color}}/\{{size}}
<br>
<span class="date">\{{date}}</span>
</p>
</div>
<p class="comment">\{{comment}}</p>
</li>
\{{/ comments}}
</script>
<script id="consults-tpl" type="text/html">
\{{# consults}}
<li>
<div class="user-info clearfix">
<img class="user-avatar" src="\{{avatar}}">
<p>
<span class="question">\{{question}}</span>
<br>
<span class="date">\{{date}}</span>
</p>
</div>
<p class="consult">\{{answer}}</p>
</li>
\{{/ consults}}
\{{# consults}}
<li>
<div class="user-info clearfix">
<img class="user-avatar" src="\{{avatar}}">
<p>
<span class="question">\{{question}}</span>
<br>
<span class="date">\{{date}}</span>
</p>
</div>
<p class="consult">\{{answer}}</p>
</li>
\{{/ consults}}
</script>
</div>
{{# statGoodsInfo}}
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
{ event: "setAccount", account: 16184 },
{ event: "setCustomerId", id: "{{uid}}" },
{ event: "setSiteType", type: "d" },
{ event: "viewItem", item: "{{skn}}" }
);
</script>
<script type="text/javascript">
var _mvq = _mvq || [];
_mvq.push(['$setAccount', 'm-23428-1']);
_mvq.push(['$setGeneral', 'goodsdetail', '', /*用户名*/ '', /*用户id*/ '']);
_mvq.push(['$logConversion']);
_mvq.push(['$addGoods', /*分类id*/ '', /*品牌id*/ '', /*商品名称*/ '',/*商品ID*/ '{{skn}}',/*商品售价*/ '',/*商品图片url*/ '', /*分类名*/ '',/*品牌名*/ '', /*商品库存状态1或是0*/ '', /*网络价*/ '',/*收藏人数*/ '']);
_mvq.push(['$logData']);
var _goodsData = {
id:'{{skn}}',// 商品ID
name:'{{productName}}', // 商品名称
brand:'{{brandName}}', // 商品品牌(非必填)
origPrice:'{{marketPrice}}', // 商品原价(非必填)
price:'{{salePrice}}', // 商品售价
imgUrl:'{{imageUrl}}', // 商品预览图
productUrl:'{{productUrl}}', // 商品URL地址
categoryId:'{{smallSortId}}', // 所属分类ID
category:'{{fullSortName}}', // 所属分类完整路径, // 所属分类完整路径
soldOut:'{{soldOut}}' // 状态 1下架,0在售(必填)
};
</script>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
{event: "setAccount", account: 16184},
{event: "setCustomerId", id: "{{uid}}"},
{event: "setSiteType", type: "d"},
{event: "viewItem", item: "{{skn}}"}
);
</script>
<script type="text/javascript">
var _mvq = _mvq || [];
_mvq.push(['$setAccount', 'm-23428-1']);
_mvq.push(['$setGeneral', 'goodsdetail', '', /*用户名*/ '', /*用户id*/ '']);
_mvq.push(['$logConversion']);
_mvq.push(['$addGoods', /*分类id*/ '', /*品牌id*/ '', /*商品名称*/ '', /*商品ID*/ '{{skn}}', /*商品售价*/ '', /*商品图片url*/ '', /*分类名*/ '', /*品牌名*/ '', /*商品库存状态1或是0*/ '', /*网络价*/ '', /*收藏人数*/ '']);
_mvq.push(['$logData']);
var _goodsData = {
id: '{{skn}}',// 商品ID
name: '{{productName}}', // 商品名称
brand: '{{brandName}}', // 商品品牌(非必填)
origPrice: '{{marketPrice}}', // 商品原价(非必填)
price: '{{salePrice}}', // 商品售价
imgUrl: '{{imageUrl}}', // 商品预览图
productUrl: '{{productUrl}}', // 商品URL地址
categoryId: '{{smallSortId}}', // 所属分类ID
category: '{{fullSortName}}', // 所属分类完整路径, // 所属分类完整路径
soldOut: '{{soldOut}}' // 状态 1下架,0在售(必填)
};
</script>
{{/statGoodsInfo}}
<script type="text/javascript">
(function () {
try {
var timestamp = (new Date()).valueOf();
var view = document.createElement('img');
view.src = 'http://shopping.yohobuy.com/1.jpg?t='+timestamp;
} catch (e) {}
} )();
(function () {
try {
var timestamp = (new Date()).valueOf();
var view = document.createElement('img');
view.src = 'http://shopping.yohobuy.com/1.jpg?t=' + timestamp;
} catch (e) {
}
})();
</script>
... ...
{{#if list}}
<div class="banner-top">
<div class="banner-swiper swiper-container">
<ul class="swiper-wrapper">
{{# list}}
<li class="swiper-slide">
<a href="javascript:;">
<img src="{{img}}" alt="">
</a>
</li>
{{/ list}}
</ul>
</div>
<div class="swiper-pagination">
<div class="pagination-inner">
</div>
</div>
<div class="my-swiper-button-prev prev-grey"></div>
<div class="my-swiper-button-next next-grey"></div>
</div>
{{^}}
<div class="banner-top-single">
<a href={{url}}>
<img class="img" src="{{img}}">
</a>
</div>
{{/if}}
\ No newline at end of file
<ul id="nav-tab" class="nav-tab clearfix">
<li class="comment-nav tap-hightlight">商品评价(<span class="comments-num">{{commentsNum}}</span>)</li>
<li class="consult-nav tap-hightlight">购买咨询(<span class="consults-num">{{consultsNum}}</span>)</li>
</ul>
<div id="feedback-content" >
<div class="comment-content content ">
{{#if commentsNum}}
<div class="comment-content-main content-main">
{{# comments}}
<span class="user-name">
{{userName}}
</span>
<span class="goods-spec">
购买了{{desc}}
</span>
<p class="detail-content">
{{content}}
</p>
<span class="comment-time">
{{time}}
</span>
{{/ comments}}
</div>
<a class="comment-content-footer tap-hightlight" href="{{commentsUrl}}">
查看更多
<span class="iconfont">&#xe604;</span>
</a>
{{^}}
<div class="comment-content-main content-main no-item">
<span class="iconfont">&#xe63d;</span>暂无评论
</div>
{{/if}}
</div>
<div class="consult-content content hide ">
{{#if consultsNum}}
<div class="consult-content-main content-main">
{{# consults}}
<div class="question">
<span class="iconfont">&#xe644;</span>
<p>
{{question}}<br>
<span class="time">{{time}}</span>
</p>
</div>
<div class="answer">
<span class="iconfont">&#xe642;</span>
<p>{{answer}}</p>
</div>
{{/ consults}}
</div>
<a class="consult-content-footer tap-hightlight" href="{{consultsUrl}}">
查看更多
<span class="iconfont">&#xe604;</span>
</a>
{{else}}
<div class="consult-content-main content-main no-item">
<span class="iconfont">&#xe63f;</span>暂无咨询
</div>
<div class="consult-content-footer tap-hightlight">
<a href="{{consultsUrl}}">
我要咨询
<span class="iconfont">&#xe604;</span></a>
</div>
{{/if}}
</div>
</div>
{{#if pathNav}}
<p class="path-nav">
{{#each pathNav}}
{{#if name}}
{{#if href}}
<a {{#if @last}}class="last"{{/if}} href="{{href}}" title="{{pathTitle}}">{{{name}}}</a>
{{^}}
<span {{#if @last}}class="last"{{/if}} title="{{pathTitle}}">{{{name}}}</span>
{{/if}}
{{#unless @last}}
<span class="iconfont">&#xe601;</span>
{{/unless}}
{{/if}}
{{/each}}
</p>
{{/if}}
... ...
<div class="recommend-for-you hide">
</div>
\ No newline at end of file
<span class="share-wrapper share-to pull-left clearfix">
<i class="weibo" data-type="weibo" title="分享到新浪微博"></i>
<i class="weixin" data-type="weixin" title="分享到微信朋友圈"></i>
<i class="tweibo" data-type="tweibo" title="分享到腾讯微博"></i>
<i class="qzone" data-type="qzone" title="分享到QQ空间"></i>
<i class="qq" data-type="qq" title="分享到QQ好友"></i>
<i class="renren" data-type="renren" title="分享到人人"></i>
<i class="douban" data-type="douban" title="分享到豆瓣"></i>
<div class="weixin-share-box"></div>
</span>
<input id="share-img" type="hidden" value="{{shareImg}}">
<input id="share-desc" type="hidden" value="{{shareDesc}}">
<input id="weixin-url" type="hidden" value="{{weixinUrl}}">
... ...
const seoMap = {
/* eslint-disable */
'/': {
title: 'YOHO!有货 | 年轻人潮流购物中心,中国潮流购物风向标,官方授权正品保证',
keywords: 'Yoho! 有货官网,潮流志,潮流男装,潮牌,美国潮牌,日本潮牌,香港潮牌,潮牌店,新品首发,欧美潮流,全球购,代购,时尚,流行,特卖,B2C,正品,购物网站,网上购物,货到付款',
description: 'YOHO! 有货,年轻人潮流购物中心,中国最大的潮流商品购物网站。100%品牌正品保证,支持货到付款。作为YOHO!旗下的购物平台,汇集了全球潮流时尚商品和中国最流行的商品,也是国内最大的原创文化商品平台,也是香港,台湾地区流行商品的集中地。同时包含日本、韩国等众多国外潮流品牌,带给您全新潮流购物体验。'
},
'/woman': {
title: '女生|时尚潮流女装,日韩女装,潮牌女装全球购|YOHO!BUY有货 100%正品保证',
keywords: '女生服饰,时尚潮流女装,日韩女装,女装正品购物网站,女装全球购',
description: 'YOHO!BUY有货官网女生频道汇集了全球女装潮流时尚,提供时尚潮流女装,日版女装,韩版女装,潮牌女装正品全球购。YOHO!BUY有货购物100%正品保证,支持货到付款。'
},
'/kids': {
title: '潮童|男童装,女童装,韩版童装,儿童服装服饰|YOHO!BUY有货 100%正品保证',
keywords: '潮童,男童装,女童装,韩版童装,儿童服装服饰',
description: 'YOHO!BUY有货官网潮童频道汇集了全球潮童潮流时尚,提供新款男童装,女童装,韩版童装,儿童服装服饰正品全球购。YOHO!BUY有货购物100%正品保证,支持货到付款。'
},
'/lifestyle': {
title: '创意生活|创意生活馆,潮流创意家居,家居生活用品|YOHO!BUY有货 100%正品保证',
keywords: '创意生活,创意生活馆,潮流家居,潮流创意家居,家居生活用品,YOHO!有货',
description: 'YOHO!BUY有货官网创意生活频道汇集了创意生活馆,潮流创意家居,家居生活用品等正品网购,给您的生活带来更多创意。YOHO!BUY有货购物100%正品保证,支持货到付款。'
}
/* eslint-disable */
'/': {
title: 'YOHO!有货 | 年轻人潮流购物中心,中国潮流购物风向标,官方授权正品保证',
keywords: 'Yoho! 有货官网,潮流志,潮流男装,潮牌,美国潮牌,日本潮牌,香港潮牌,潮牌店,新品首发,欧美潮流,全球购,代购,时尚,流行,特卖,B2C,正品,购物网站,网上购物,货到付款',
description: 'YOHO! 有货,年轻人潮流购物中心,中国最大的潮流商品购物网站。100%品牌正品保证,支持货到付款。作为YOHO!旗下的购物平台,汇集了全球潮流时尚商品和中国最流行的商品,也是国内最大的原创文化商品平台,也是香港,台湾地区流行商品的集中地。同时包含日本、韩国等众多国外潮流品牌,带给您全新潮流购物体验。'
},
'/woman': {
title: '女生|时尚潮流女装,日韩女装,潮牌女装全球购|YOHO!BUY有货 100%正品保证',
keywords: '女生服饰,时尚潮流女装,日韩女装,女装正品购物网站,女装全球购',
description: 'YOHO!BUY有货官网女生频道汇集了全球女装潮流时尚,提供时尚潮流女装,日版女装,韩版女装,潮牌女装正品全球购。YOHO!BUY有货购物100%正品保证,支持货到付款。'
},
'/kids': {
title: '潮童|男童装,女童装,韩版童装,儿童服装服饰|YOHO!BUY有货 100%正品保证',
keywords: '潮童,男童装,女童装,韩版童装,儿童服装服饰',
description: 'YOHO!BUY有货官网潮童频道汇集了全球潮童潮流时尚,提供新款男童装,女童装,韩版童装,儿童服装服饰正品全球购。YOHO!BUY有货购物100%正品保证,支持货到付款。'
},
'/lifestyle': {
title: '创意生活|创意生活馆,潮流创意家居,家居生活用品|YOHO!BUY有货 100%正品保证',
keywords: '创意生活,创意生活馆,潮流家居,潮流创意家居,家居生活用品,YOHO!有货',
description: 'YOHO!BUY有货官网创意生活频道汇集了创意生活馆,潮流创意家居,家居生活用品等正品网购,给您的生活带来更多创意。YOHO!BUY有货购物100%正品保证,支持货到付款。'
}
/* eslint-enable */
};
... ...
.share-wrapper {
position: relative;
i {
display: block;
float: left;
width: 16px;
height: 16px;
margin-left: 5px;
cursor: pointer;
}
@each $icon in weibo,tweibo,renren,qzone,qq,douban,weixin {
.$(icon) {
background: url(/share/$(icon).png) no-repeat;
}
}
.weixin-share-box {
display:none;
position: absolute;
width: 282px;
height: 302px;
padding-top: 9px;
text-align: center;
font-family: Microsoft Yahei, Arial, Verdana;
top: 22px;
right: -26px;
z-index:2;
em,
em i {
position: absolute;
width: 0;
height: 0;
font-size: 0;
border-width: 0 10px 9px;
border-style: dashed dashed solid;
}
em {
border-color: transparent transparent #d6d6d6;
top: 0px;
left: 50%;
margin-left: -10px;
}
em i {
border-color: transparent transparent #e8e8e8;
overflow: hidden;
top: 1px;
left: -15px;
}
.con {
position: relative;
width: 280px;
height: 300px;
overflow: hidden;
background-color: #fff;
border: 1px solid #d6d6d6;
box-shadow: 0px 2px 4px #d1d1d1;
}
h2 {
display: block;
height: 46px;
line-height: 46px;
background-color: #e8e8e8;
color: #000;
font-size: 18px;
}
.pic,
.pic img {
width: 168px;
height: 168px;
}
.pic {
overflow: hidden;
margin: 16px auto;
}
.w {
font-size: 13px;
color: #9f9f9f;
line-height: 20px;
}
.close {
position: absolute;
width: 45px;
height: 45px;
line-height: 45px;
overflow: hidden;
top: 0;
right: 0;
font-size: 16px;
color: #999999;
}
}
}
... ...
... ... @@ -231,6 +231,7 @@ a {
@import "index/index";
@import "product/index";
@import "plugins/slider";
@import "share"
/* 模块 */
@import "index/index";
... ...