Authored by ccbikai

Merge branch 'feature/product-detail' into feature/sale

Showing 41 changed files with 444 additions and 343 deletions
... ... @@ -104,5 +104,8 @@ passport.use('qq', new QQStrategy({
passport.use('alipay', new AlipayStrategy({
partner: '2088701661478015',
key: 'kcxawi9bb07mzh0aq2wcirsf9znusobw',
callbackURL: `${siteUrl}/passport/login/alipay/callback`
}));
return_url: `${siteUrl}/passport/login/alipay/callback`
}), (profile, done) => {
done(null, profile);
});
... ...
... ... @@ -45,6 +45,8 @@ function doPassportCallback(openId, nickname, sourceType, req, res) {
}).then((redirectTo) => {
return res.redirect(redirectTo);
});
} else {
return Promise.reject('openId is null');
}
}
... ...
... ... @@ -9,7 +9,7 @@
const api = global.yoho.API;
const RegService = {
const BindService = {
bindCheck(mobile, openId, sourceType, area) {
let params = {
method: 'app.passport.signCheck',
... ... @@ -84,4 +84,4 @@ const RegService = {
}
};
module.exports = RegService;
module.exports = BindService;
... ...
... ... @@ -9,7 +9,7 @@
const util = require('util');
const _ = require('lodash');
const md5 = require('md5');
const Strategy = require('passport-strategy');
const passport = require('passport-strategy');
// 支付宝网关地址
const ALIPAY_URL = 'https://mapi.alipay.com/gateway.do';
... ... @@ -30,34 +30,30 @@ function paramsToRaw(params) {
let keys = Object.keys(params);
keys = keys.sort();
let newArgs = {};
let string = '';
keys.forEach((key) => {
newArgs[key] = params[key];
string += '&' + key + '=' + params[key];
});
let string = '';
for (let k of newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
}
function AlipayStrategy(options) {
Strategy.call(this);
function AlipayStrategy(options, verify) {
if (typeof options === 'function') {
verify = options;
}
passport.Strategy.call(this);
this.name = 'alipay';
this._passReqToCallback = options.passReqToCallback;
this._verify = verify;
}
util.inherits(AlipayStrategy, Strategy);
util.inherits(AlipayStrategy, passport.Strategy);
AlipayStrategy.prototype.authenticate = (req, options) => {
if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
// sign check
AlipayStrategy.prototype.authenticate = function(req, options) {
if (req.query && req.query.is_success && req.query.sign && req.query.sign_type) {
let query = req.query;
let sign = query.sign;
let signType = query.sign_type;
... ... @@ -85,7 +81,7 @@ AlipayStrategy.prototype.authenticate = (req, options) => {
this.fail(req.error_code);
}
} else {
let params = _.extends(defaultOptions, options);
let params = _.assign(defaultOptions, options);
let signType = params.sign_type;
delete params.sign_type;
... ... @@ -96,9 +92,10 @@ AlipayStrategy.prototype.authenticate = (req, options) => {
params.sign = md5(signString);
params.sign_type = 'MD5';
}
this.redirect(ALIPAY_URL + '?' + paramsToRaw(params));
}
};
module.exports.Strategy = AlipayStrategy;
exports = module.exports = AlipayStrategy;
exports.Strategy = AlipayStrategy;
... ...
... ... @@ -37,6 +37,10 @@ router.get('/login/sina/callback', login.sina.callback);
router.get('/login/qq', login.common.beforeLogin, login.qq.login);
router.get('/login/qq/callback', login.qq.callback);
// alipay登录
router.get('/login/alipay', login.common.beforeLogin, login.alipay.login);
router.get('/login/alipay/callback', login.alipay.callback);
// 登录绑定
router.get('/bind/index', bind.indexPage);
router.post('/bind/bindCheck', bind.bindCheck);
... ...
... ... @@ -8,11 +8,10 @@
const mRoot = '../models';
const headerModel = require('../../../doraemon/models/header'); // 头部model
const detail = require(`${mRoot}/detail`); // 商品详情 model
const intro = require(`${mRoot}/intro`); // 商品尺码信息 model
const detailModel = require(`${mRoot}/detail`); // 商品详情 model
const introModel = require(`${mRoot}/intro`); // 商品尺码信息 model
const preference = require(`${mRoot}/preference`); // 商品偏好 model
const detailRelated = require(`${mRoot}/consult-comment`); // 商品评论咨询 model
const _ = require('lodash');
/**
* 商品基本信息
... ... @@ -21,18 +20,18 @@ const _ = require('lodash');
* @return {[type]} [description]
*/
exports.index = (req, res, next) => {
let vipLevel = 0; // 用户等级 待处理
let uid = _.isEmpty(req.user.uid) ? null : req.user.uid;
if (!req.params[0] || !req.params[1]) {
return next();
}
let uid = req.user.uid || 0;
let headerData = headerModel.setNav({
navTitle: '商品详情'
});
detail({
detailModel.getProductData({
id: req.params[0],
goodsId: req.params[1],
uid: uid,
vipLevel: vipLevel,
ua: req.get('user-agent') || ''
}).then((result) => {
res.render('detail/detail', {
... ... @@ -51,15 +50,19 @@ exports.index = (req, res, next) => {
* @param {[type]} res [description]
* @return {[type]} [description]
*/
exports.intro = (req, res) => {
intro({
exports.intro = (req, res, next) => {
if (!req.params.productskn) {
return next();
}
introModel.getintroData({
productskn: req.params.productskn
}).then((result) => {
}, req).then((result) => {
res.render('detail/intro', {
result: result,
layout: false
});
});
}).catch(next);
};
/**
... ... @@ -71,7 +74,7 @@ exports.intro = (req, res) => {
exports.preference = (req, res) => {
preference({
productskn: req.query.productSkn,
yhchannel: 1,
yhchannel: req.yoho.channel,
brandId: req.query.brandId
}).then((result) => {
res.render('detail/preference', Object.assign({
... ... @@ -115,11 +118,14 @@ exports.consults = (req, res, next) => {
/**
* 咨询表单页
*/
exports.consultform = (req, res) => {
exports.consultform = (req, res, next) => {
let headerData = headerModel.setNav({
navTitle: '我要咨询'
});
if (!req.query.product_id) {
return next();
}
res.render('detail/consult-form', {
pageHeader: headerData,
productId: req.query.product_id,
... ...
... ... @@ -11,11 +11,31 @@ const _ = require('lodash');
const helpers = global.yoho.helpers;
/**
* 获取用户数据信息
* @param {[string]} uid
* @return {[array]}
*/
const _getUserProfile = (uid) => {
if (!uid) {
return Promise.resolve({
code: 200,
data: {}
});
}
return api.get('', {
method: 'app.passport.profile',
uid: uid
}, {
cache: true
});
};
/**
* 处理品牌关联店铺信息
* @param {array}
* @return {array}
*/
const getShopsInfo = (data) => {
const _processShopsInfo = (data) => {
let enterStore = [];
_.forEach(data, function(value) {
... ... @@ -44,7 +64,7 @@ const getShopsInfo = (data) => {
* @param {Boolean} 限购商品是否已开售
* @return {array}
*/
const procShowStatus = (data, showStatus, isBeginSale) => {
const _procShowStatus = (data, showStatus, isBeginSale) => {
switch (showStatus) {
case 1: // 开售前/后,立即分享获得限购码(用户未领取限购码)
// 显示获取限购码按钮
... ... @@ -93,7 +113,7 @@ const procShowStatus = (data, showStatus, isBeginSale) => {
* @param {string} skn 限购商品skn
* @return {string} 限购商品跳转url
*/
const getLimitCodeUrl = (productCode, skn, ua) => {
const _getLimitCodeUrl = (productCode, skn, ua) => {
let url = 'yohoapp://yoho.app/openwith?limit_product_code=' + productCode +
'&product_skn=' + skn;
... ... @@ -114,7 +134,7 @@ const getLimitCodeUrl = (productCode, skn, ua) => {
* @param origin Object 原始数据
* @return dest Object 格式化数据
*/
const detailDataPkg = (origin, uid, vipLevel, ua) => {
const _detailDataPkg = (origin, uid, vipLevel, ua) => {
let dest = {}, // 结果输出
thumbImageList = [],
colorGroup = {},
... ... @@ -128,8 +148,8 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
dest.goodsName = origin.productName;
// 用户未登录时 待处理
if (uid === null || typeof uid === 'undefined') {
// 用户未登录时
if (!uid) {
let params = {};
params.refer = helpers.urlFormat('/product/show_' + origin.erpProductId + '.html');
... ... @@ -217,7 +237,7 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
dest.periodOfMarket = `${origin.expectArrivalTime}月`;
}
// 促销信息
// 促销信息 TODO: 换新接口
if (origin.promotionBoList) {
let discountList = [];
... ... @@ -257,10 +277,11 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
if (_.has(dest, 'feedbacks.consultsNum')) {
consultParams.total = dest.feedbacks.consultsNum;
dest.feedbacks.consultsUrl = helpers.urlFormat('/product/detail/consult', consultParams);
} else {
dest.feedbacks.consultsUrl = helpers.urlFormat('/product/detail/consultform', consultParams);
}
dest.feedbacks.consultsUrl = helpers.urlFormat('/product/detail/consultform', consultParams);
// 商品评价
dest.feedbacks.commentsNum = 0;
... ... @@ -481,14 +502,14 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
}
// 处理限购商品有关的按钮状态
dest = procShowStatus(dest, showStatus, isBeginSale);
Object.assign;
dest = _procShowStatus(dest, showStatus, isBeginSale);
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = getLimitCodeUrl(origin.limitProductCode, origin.erpProductId, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure'); // 待处理 相关处理逻辑还不存在
dest.cartInfo.limitCodeUrl = _getLimitCodeUrl(origin.limitProductCode, origin.erpProductId, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure');
} else {
dest.cartInfo.addToCartUrl = helpers.urlFormat('/product/buy_' + origin.id + '_' +
origin.goodsList.id + '.html'); // 待处理 相关处理逻辑还不存在
origin.goodsList.id + '.html');
}
} else if (notForSale) {
dest.cartInfo.notForSale = true;
... ... @@ -497,7 +518,6 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
}
// 是否收藏
dest.isCollect = false;
if (origin.isCollect !== null && typeof origin.isCollect !== 'undefined' && origin.isCollect === 'Y') {
dest.isCollect = true;
... ... @@ -510,7 +530,37 @@ const detailDataPkg = (origin, uid, vipLevel, ua) => {
return dest;
};
module.exports = (data) => {
let _getShopsInfo = (brandId) => {
return api.get('', {
method: 'app.shop.queryShopsByBrandId',
brand_id: _.toString(brandId)
}, {
cache: true
}).then(shops => {
if (shops.code === 200) {
return _processShopsInfo(shops.data);
}
return [];
});
};
let _getPromotionInfo = (skn) => {
return api.get('', {
method: 'app.product.promotion',
product_skn: _.toString(skn)
}, {
cache: true
}).then((result) => {
if (result.code === 200) {
return result.data;
}
return {};
});
};
let getProductData = (data) => {
let finalResult;
let params = {
productId: _.toString(data.id),
... ... @@ -521,18 +571,25 @@ module.exports = (data) => {
params.uid = data.uid;
}
return api.get('', params).then(result => {
finalResult = detailDataPkg(result, data.uid, data.vipLevel, data.ua);
return _getUserProfile(params.uid).then((user) => {
data.vipLevel = (user.data && user.data.vip_info && user.data.vip_info.cur_level) || '0';
return api.get('', {
method: 'app.shop.queryShopsByBrandId',
brand_id: _.toString(result.brandId)
}).then(shops => {
if (shops.code === 200) {
finalResult.enterStore = getShopsInfo(shops.data);
}
return api.get('', params, {
cache: true
}).then(result => {
return Promise.all([_getShopsInfo(result.brandId), _getPromotionInfo(result.erpProductId)]).then((info) => {
result.promotionBoList = info[1];
finalResult = _detailDataPkg(result, data.uid, data.vipLevel, data.ua);
finalResult.enterStore = info[0];
return finalResult;
});
return finalResult;
});
});
};
module.exports = {
getProductData
};
... ...
... ... @@ -157,7 +157,7 @@ const getSizeInfo = (sizeInfo) => {
dest.sizeInfo.detail.list.push(temp);
});
} else {
dest.sizeInfo.detail.list[0].params[0] = '';
dest.sizeInfo.detail.list[0] && (dest.sizeInfo.detail.list[0].params[0] = '');
}
}
... ... @@ -172,40 +172,92 @@ const getSizeInfo = (sizeInfo) => {
// 模特试穿, 竖着输出排列显示
if (!_.isEmpty(sizeInfo.modelBos)) {
dest.reference = {};
dest.reference.title = '模特试穿';
dest.reference.enTitle = 'REFERENCE';
dest.reference.detail = {};
dest.reference.detail.list = {};
let reference = {
title: '模特试穿',
enTitle: 'REFERENCE'
};
// 控制是否显示备注
// let showRemark = false;
let remarkList = {};
dest.reference = reference;
remarkList[0] = {};
remarkList[0].param = '备注';
// 控制是否显示备注
let showRemark = false;
let remarkList = [{
param: '备注'
}];
let detail = {
list: [{
params: [{
param: ''
}]
}, {
params: [{
param: '模特'
}]
}, {
params: [{
param: '身高'
}]
}, {
params: [{
param: '体重'
}]
}, {
params: [{
param: '三围'
}]
}, {
params: [{
param: '吊牌尺码'
}]
}, {
params: [{
param: '试穿描述'
}]
}]
};
reference.detail = detail;
_.forEach(sizeInfo.modelBos, function(value) {
detail.list[0].params.push({
param: value.avatar.replace('http://', '//')
});
detail.list[1].params.push({
param: value.modelName
});
detail.list[2].params.push({
param: value.height
});
detail.list[3].params.push({
param: value.weight
});
detail.list[4].params.push({
param: value.vitalStatistics
});
detail.list[5].params.push({
param: value.fitModelBo && value.fitModelBo.fit_size
});
detail.list[6].params.push({
param: value.fitModelBo && value.fitModelBo.feel
});
for (let i = 0; i < 7; i++) {
dest.reference.detail.list[i] = {};
dest.reference.detail.list[i].params = {};
dest.reference.detail.list[0].params[0] = {};
}
dest.reference.detail.list[0].params[0].param = '';
dest.reference.detail.list[1].params[0].param = '模特';
dest.reference.detail.list[2].params[0].param = '身高';
dest.reference.detail.list[3].params[0].param = '体重';
dest.reference.detail.list[4].params[0].param = '三围';
dest.reference.detail.list[5].params[0].param = '吊牌尺码';
dest.reference.detail.list[6].params[0].param = '试穿描述';
// _.forEach(sizeInfo.modelBos, function(value) {
// // 待处理
// });
if (value.fitModelBo && value.fitModelBo.fit_remark) {
showRemark = true;
remarkList.push({
param: value.fitModelBo && value.fitModelBo.fit_remark
});
} else {
remarkList.push({
param: ''
});
}
});
// 显示模特备注
// if (showRemark) {
// }
if (showRemark) {
detail.list[7] = {};
detail.list[7].params = remarkList;
}
}
... ... @@ -250,15 +302,15 @@ const getSizeInfo = (sizeInfo) => {
dest.productDetail.enTitle = 'DETAILS';
dest.productDetail.desc = productIntro.replace(/\r\n\t/g, '').
replace(/<\/p>/g, '').
replace(/<img src=/g, '<img class="lazy" src="data:image/gif;' +
'base64,R0lGODlhAQABAJEAAAAAAP///93d3f///yH5BAEAAAMALAAAAAABAAEAAAICVAEAOw=="' +
' data-original=').
replace(/<img border="0" src=/g, '<img border="0" class="lazy" ' +
'src="data:image/gif;base64,' +
'R0lGODlhAQABAJEAAAAAAP///93d3f///yH5BAEAAAMALAAAAAABAAEAAAICVAEAOw=="' +
' data-original=').
replace(/.jpg/g, '.jpg?imageMogr2/thumbnail/750x/quality/90');
replace(/<\/p>/g, '').
replace(/<img src=/g, '<img class="lazy" src="data:image/gif;' +
'base64,R0lGODlhAQABAJEAAAAAAP///93d3f///yH5BAEAAAMALAAAAAABAAEAAAICVAEAOw=="' +
' data-original=').
replace(/<img border="0" src=/g, '<img border="0" class="lazy" ' +
'src="data:image/gif;base64,' +
'R0lGODlhAQABAJEAAAAAAP///93d3f///yH5BAEAAAMALAAAAAABAAEAAAICVAEAOw=="' +
' data-original=').
replace(/.jpg/g, '.jpg?imageMogr2/thumbnail/750x/quality/90');
}
// 清空变量,释放内存
... ... @@ -267,16 +319,20 @@ const getSizeInfo = (sizeInfo) => {
return dest;
};
module.exports = (data) => {
let getintroData = (data, req) => {
var finalResult;
return api.get('', {
method: 'h5.product.intro',
productskn: data.productskn,
udid: 'f528764d624db129b32c21fbca0cb8d6'
udid: req.sessionID || 'yoho'
}).then(result => {
finalResult = getSizeInfo(result);
return finalResult;
});
};
module.exports = {
getintroData
};
... ...
... ... @@ -11,6 +11,13 @@ const _ = require('lodash');
const api = global.yoho.API;
const helpers = global.yoho.helpers;
const yhchannelMap = {
boys: '1',
girls: '2',
kids: '3',
lifestyle: '4'
};
const _formatProduct = (data) => {
let list = [];
... ... @@ -46,7 +53,7 @@ module.exports = (data) => {
return api.get('', {
method: 'h5.preference.Search',
productskn: data.productskn,
yhchannel: data.yhchannel,
yhchannel: yhchannelMap[data.yhchannel],
brandId: data.brandId
}).then(result => {
if (result) {
... ...
... ... @@ -24,7 +24,7 @@
{{/ tags}}
</div>
{{# bannerTop}}
{{> product/banner-swiper-arrow}}
{{> detail/banner-swiper-arrow}}
{{/ bannerTop}}
</div>
{{# goodsName}}
... ... @@ -102,10 +102,10 @@
{{# feedbacks}}
<div class="feedback-list ">
{{#if commentsNum}}
{{> product/detail/feedback-tab}}
{{> detail/feedback-tab}}
{{else}}
{{#if consultsNum}}
{{> product/detail/feedback-tab}}
{{> detail/feedback-tab}}
{{else}}
<div class="nodata tap-hightlight" id="goto-consult">
<span>暂无商品评价和咨询</span>
... ... @@ -127,7 +127,7 @@
{{/ enterStore}}
<div id="productDesc"> </div>
{{> product/detail/recommend-for-you}}
{{> detail/recommend-for-you}}
{{> cart/chose-panel}}
{{#cartInfo}}
... ... @@ -184,4 +184,4 @@
{{/loginUrl}}
</div>
{{/ result}}
\ No newline at end of file
{{/ result}}
... ...
{{# result}}
{{> product/detail/product-description}}
{{/ result}}
\ No newline at end of file
{{#goodsDescription}}
<div class="goods-desc page-block">
<div class="service"></div>
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail table">
{{#list}}
<div class="column">{{param}}</div>
{{/list}}
</div>
{{/detail}}
{{#if desc}}
<div class="desc-text">{{desc}}</div>
{{/if}}
</div>
{{/goodsDescription}}
{{#sizeInfo}}
<div class="size-info page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail">
<div class="swiper-container detail-swiper" id="size-swiper-container">
<div class="swiper-wrapper">
{{#list}}
<div class="swiper-slide " >
{{#params}}
<div class="cell">{{param}}</div>
{{/params}}
</div>
{{/list}}
</div>
</div>
<p class="tips">提示:左滑查看完整表格信息</p>
</div>
{{/detail}}
</div>
{{/sizeInfo}}
{{#measurementMethod}}
<div class="measurement-method page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
<div class="detail" style="width:100%">
<img class="lazy" data-original="{{img}}" alt="">
</div>
</div>
{{/measurementMethod}}
{{#reference}}
<div class="size-info page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail">
<div class="swiper-container detail-swiper" id="reference-swiper-container">
<div class="swiper-wrapper">
{{#list}}
{{#if @first}}
<div class="swiper-slide first-group" >
{{#params}}
{{#if @first}}
{{else}}
<div>
<img class="avatar lazy" data-original="{{param}}" alt="">
</div>
{{/if}}
{{/params}}
</div>
{{else}}
<div class="swiper-slide" >
{{#params}}
<div class=" cell">{{param}}</div>
{{/params}}
</div>
{{/if}}
{{/list}}
</div>
</div>
<p class="tips">提示:左滑查看完整表格信息</p>
</div>
{{/detail}}
</div>
{{/reference}}
{{#materials}}
<div class="materials page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
<div class="detail">
{{#list}}
<div class="material-item">
<!-- <img class="lazy" data-original="{{img}}" alt="">
<p class="material-desc">
{{desc}}
</p>-->
<div class="material-image">
<img src="{{img}}" alt="材质图">
</div>
<div class="material-desc">
{{desc}}
</div>
</div>
{{/list}}
</div>
</div>
{{/materials}}
{{#washTips}}
<div class="wash-tips page-block">
<div class="detail table clearfix">
{{#list}}
<div class="tip">
<img src="{{img}}" alt="">
<span class="caption">{{caption}}</span>
</div>
{{/list}}
</div>
</div>
{{/washTips}}
{{#productDetail}}
<div class="product-detail page-block">
<h1 class="title">
{{{title}}}
<span class="en-title">{{{enTitle}}}</span>
</h1>
<div class="pro-detail">
<p>{{{desc}}}</p>
{{#list}}
<img class="lazy" data-original="{{img}}" alt="">
{{/list}}
</div>
</div>
{{/productDetail}}
{{/ result}}
... ...
{{> product/detail/recommend-content}}
\ No newline at end of file
<div class="title">为您优选新品</div>
<div id="swiper-recommend" class="swiper-container">
<div class="swiper-wrapper swiper-wrapper-recommend">
{{# recommendList}}
<a class="swiper-slide" href="{{url}}">
<img class="swiper-lazy img-box" data-src="{{image thumb 299 388}}">
<div class="sale-name">
{{name}}
</div>
<div class="price">
<span class="sale-price {{^price}}no-price{{/price}}">¥{{salePrice}}</span>
{{#price}}<span class="old-price">{{.}}</span>{{/price}}
</div>
<div class="swiper-lazy-preloader"></div>
</a>
{{/ recommendList}}
</div>
</div>
... ...
... ... @@ -3,5 +3,5 @@
{{> resources/acivity-outlets}}
{{/activity}}
{{> common/filter-nav}}
{{> product/sale/common}}
{{> sale/common}}
</div>
... ...
<div class="outlet-page goods-page yoho-page">
{{> product/outlet/nav}}
{{> product/outlet/resource }}
{{> outlet/nav}}
{{> outlet/resource }}
</div>
... ...
<div class="outlet-page yoho-page">
{{> product/outlet/nav}}
{{> outlet/nav}}
{{# activity}}
{{> resources/acivity-outlets}}
{{/ activity}}
... ...
<div class="outlet-page yoho-page">
{{> product/outlet/nav}}
{{> outlet/nav}}
<p class="more-fashion">更多潮品,敬请期待</p>
{{# activity}}
{{> resources/acivity-outlets}}
... ...
<div class="discount-detail-page goods-page yoho-page" data-product-pool="{{productPool}}">
{{> product/sale/banner}}
{{> sale/banner}}
<ul id="list-nav" class="list-nav clearfix">
<li class="all active">
... ... @@ -33,6 +33,6 @@
</li>
</ul>
{{> product/sale/common}}
{{> sale/common}}
</div>
\ No newline at end of file
... ...
... ... @@ -50,6 +50,6 @@
<div class="sale-nav-wrap">
{{> common/filter-nav}}
</div>
{{> product/sale/common}}
{{> sale/common}}
</div>
... ...
<div class="sale-vip-page goods-page yoho-page">
{{> product/sale/banner}}
{{> sale/banner}}
<ul id="list-nav" class="list-nav clearfix">
<li class="new active">
... ... @@ -30,6 +30,6 @@
</li>
</ul>
{{> product/sale/common}}
{{> sale/common}}
</div>
\ No newline at end of file
... ...
... ... @@ -19,10 +19,10 @@
<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="{{image img 450 600}}">
</a>
</div>
{{/if}}
\ No newline at end of file
{{^}}
<div class="banner-top-single">
<a href={{url}}>
<img class="img" src="{{image img 450 600}}">
</a>
</div>
{{/if}}
... ...
... ... @@ -13,4 +13,4 @@
{{/data}}
</ul>
</nav>
{{> product/sale/common}}
{{> sale/common}}
... ...
... ... @@ -53,6 +53,6 @@
{{#content}}
{{! 品类导航}}
{{#if categoryNavigation}}
{{> product/outlet/category-nav}}
{{> outlet/category-nav}}
{{/if}}
{{/content}}
... ...
{{#if list}}
<div class="banner-top">
<div class="banner-swiper swiper-container">
<ul class="swiper-wrapper">
{{# list}}
<li class="swiper-slide">
<a href="{{url}}">
<img class="swiper-lazy" data-src="{{src}}">
</a>
<div class="swiper-lazy-preloader"></div>
</li>
{{/ list}}
</ul>
</div>
<div class="swiper-pagination">
<div class="pagination-inner">
</div>
</div>
</div>
{{else}}
<div class="banner-top-single">
<a href={{url}}>
<img class="img" src="{{img}}">
</a>
</div>
{{/if}}
{{#goodsDescription}}
<div class="goods-desc page-block">
<div class="service"></div>
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail table">
{{#list}}
<div class="column">{{param}}</div>
{{/list}}
</div>
{{/detail}}
{{#if desc}}
<div class="desc-text">{{desc}}</div>
{{/if}}
</div>
{{/goodsDescription}}
{{#sizeInfo}}
<div class="size-info page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail">
<div class="swiper-container detail-swiper" id="size-swiper-container">
<div class="swiper-wrapper">
{{#list}}
<div class="swiper-slide " >
{{#params}}
<div class="cell">{{param}}</div>
{{/params}}
</div>
{{/list}}
</div>
</div>
<p class="tips">提示:左滑查看完整表格信息</p>
</div>
{{/detail}}
</div>
{{/sizeInfo}}
{{#measurementMethod}}
<div class="measurement-method page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
<div class="detail" style="width:100%">
<img class="lazy" data-original="{{img}}" alt="">
</div>
</div>
{{/measurementMethod}}
{{#reference}}
<div class="size-info page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
{{#detail}}
<div class="detail">
<div class="swiper-container detail-swiper" id="reference-swiper-container">
<div class="swiper-wrapper">
{{#list}}
{{#if @first}}
<div class="swiper-slide first-group" >
{{#params}}
{{#if @first}}
{{else}}
<div>
<img class="avatar lazy" data-original="{{param}}" alt="">
</div>
{{/if}}
{{/params}}
</div>
{{else}}
<div class="swiper-slide" >
{{#params}}
<div class=" cell">{{param}}</div>
{{/params}}
</div>
{{/if}}
{{/list}}
</div>
</div>
<p class="tips">提示:左滑查看完整表格信息</p>
</div>
{{/detail}}
</div>
{{/reference}}
{{#materials}}
<div class="materials page-block">
<h1 class="title">
{{title}}
<span class="en-title">{{enTitle}}</span>
</h1>
<div class="detail">
{{#list}}
<div class="material-item">
<!-- <img class="lazy" data-original="{{img}}" alt="">
<p class="material-desc">
{{desc}}
</p>-->
<div class="material-image">
<img src="{{img}}" alt="材质图">
</div>
<div class="material-desc">
{{desc}}
</div>
</div>
{{/list}}
</div>
</div>
{{/materials}}
{{#washTips}}
<div class="wash-tips page-block">
<div class="detail table clearfix">
{{#list}}
<div class="tip">
<img src="{{img}}" alt="">
<span class="caption">{{caption}}</span>
</div>
{{/list}}
</div>
</div>
{{/washTips}}
{{#productDetail}}
<div class="product-detail page-block">
<h1 class="title">
{{{title}}}
<span class="en-title">{{{enTitle}}}</span>
</h1>
<div class="pro-detail">
<p>{{{desc}}}</p>
{{#list}}
<img class="lazy" data-original="{{img}}" alt="">
{{/list}}
</div>
</div>
{{/productDetail}}
<div class="title">为您优选新品</div>
<div id="swiper-recommend" class="swiper-container">
<div class="swiper-wrapper swiper-wrapper-recommend">
{{# recommendList}}
<a class="swiper-slide" href="{{url}}">
<img class="swiper-lazy img-box" data-src="{{image thumb 299 388}}">
<div class="sale-name">
{{name}}
</div>
<div class="price">
<span class="sale-price {{^price}}no-price{{/price}}">¥{{salePrice}}</span>
{{#price}}<span class="old-price">{{.}}</span>{{/price}}
</div>
<div class="swiper-lazy-preloader"></div>
</a>
{{/ recommendList}}
</div>
</div>
\ No newline at end of file
... ... @@ -15,8 +15,8 @@ module.exports = {
port: 6001,
siteUrl: '//m.yohobuy.com',
domains: {
api: 'http://testapi.yoho.cn:28078/',
service: 'http://testservice.yoho.cn:28077/'
api: 'http://api.yoho.yohoops.org/',
service: 'http://service.yoho.yohoops.org/'
// api: 'http://devapi.yoho.cn:58078/',
// service: 'http://devservice.yoho.cn:58077/'
... ...
... ... @@ -100,6 +100,7 @@
"yoho-jquery": "^2.2.4",
"yoho-jquery-lazyload": "^1.9.7",
"yoho-mlellipsis": "0.0.3",
"yoho-node-lib": "0.0.17",
"yoho-swiper": "^3.3.1"
}
}
... ...
... ... @@ -8,8 +8,8 @@ var $ = require('yoho-jquery'),
Hammer = require('yoho-hammer'),
lazyLoad = require('yoho-jquery-lazyload');
var $discountFolder = $('.goodsDiscount .discount-folder'),
$discountArrow = $('.goodsDiscount .first-item span');
var $discountFolder = $('.goods-discount .discount-folder'),
$discountArrow = $('.goods-discount .first-item span');
var goodsDiscountEl = document.getElementById('goodsDiscount'),
goodsDiscountHammer = goodsDiscountEl && new Hammer(goodsDiscountEl),
... ... @@ -39,8 +39,6 @@ function showFooter() {
showFooter();
require('./detail/like');
lazyLoad($('img.lazy'));
if ($('#goodsDiscount h1').length < 1) {
... ... @@ -120,6 +118,7 @@ $('#limit-sale').on('touchend', function(e) {
}
});
require('./detail/like');
require('./detail/desc');
require('./detail/comments-consults');
require('./detail/consultform');
... ... @@ -148,5 +147,3 @@ $.ajax({
if ($('.good-detail-page').length > 0) {
$('#yoho-footer').css('border-top', '1px solid #e0e0e0');
}
... ...
... ... @@ -22,8 +22,10 @@ function hiddenTips($ele) {
if ($ele.length > 0) {
offsetContainer = $ele[0].getBoundingClientRect().right;
offsetLastColumn = $ele.find('.swiper-slide:last-child')[0].getBoundingClientRect().right;
if ($ele.find('.swiper-slide:last-child')[0]) {
offsetLastColumn = $ele.find('.swiper-slide:last-child')[0].getBoundingClientRect().right;
}
if (offsetLastColumn - offsetContainer < 0) {
$ele.next('.tips').css('display', 'none');
... ... @@ -119,4 +121,3 @@ function scrollHandler() {
$(window).scroll(function() {
window.requestAnimationFrame(scrollHandler);
});
... ...
... ... @@ -24,8 +24,8 @@ function request() {
if (preferenceUrl) {
$.get(preferenceUrl).then(function(html) {
if (html.length < 5) {
$recommendForYou.css('display', 'none');
if ($(html).find('.swiper-slide').length < 5) {
$recommendForYou.hide();
} else {
$recommendForYou.html(html).show();
if ($('#swiper-recommend').length) {
... ...
... ... @@ -694,10 +694,12 @@ $basicBtnC: #eb0313;
position: relative;
position: fixed;
bottom: 0;
left: 50%;
margin-left: -320px;
z-index: 2;
box-sizing: border-box;
padding: 20px 28px;
width: 100%;
width: 640px;
height: 120px;
border-top: 1px solid $borderC;
background-color: #fff;
... ...
... ... @@ -92,6 +92,7 @@
.tip {
display: inline-block;
vertical-align: top;
width: 16.6%;
img {
... ...
... ... @@ -13,13 +13,9 @@
}
.swiper-container {
padding: 30px 0 20px;
padding: 30px 30px 20px;
width: 100%;
.swiper-wrapper {
padding: 0 30px;
}
.swiper-slide {
float: left;
margin: 0 10px;
... ...