Authored by yyq

限购商品

... ... @@ -241,7 +241,7 @@ const index = (req, res, next) => {
// }
// };
Item.getProductItemData(req.params).then(result => {
Item.getProductItemData(req.params, req.user.uid).then(result => {
if (_.isEmpty(result)) {
return next();
}
... ...
... ... @@ -7,10 +7,10 @@
const api = global.yoho.API;
const getProductBaseAsync = (pid, uid, skn) => {
const getProductBaseAsync = (productId, uid, skn) => {
let params = {
method: 'h5.product.data',
productId: pid
productId: productId
};
if (uid) {
... ... @@ -24,6 +24,15 @@ const getProductBaseAsync = (pid, uid, skn) => {
return api.get('', params, { cache: true });
};
const getUserIsFav = (uid, productId) => {
return api.get('', {
method: 'app.favorite.isFavorite',
id: productId,
uid: uid,
type: 'product'
}, { cache: true });
};
const getsizeInfoAsync = (skn) => {
return api.get('', {
method: 'h5.product.intro',
... ... @@ -39,7 +48,6 @@ const getComfortAsync = productId => {
cache: true,
code: 200
});
};
const getModelTryAsync = skn => {
... ... @@ -54,6 +62,7 @@ const getModelTryAsync = skn => {
module.exports = {
getProductBaseAsync,
getUserIsFav,
getsizeInfoAsync,
getComfortAsync,
getModelTryAsync
... ...
... ... @@ -44,6 +44,98 @@ const _sizeInfoBoSort = sizeInfoBo => {
return sizeInfoBo;
};
/**
* 处理限购商品的有关按钮状态(或取现购买以及底部商品购买按钮)
* @param int uid
* @param int showStatus 限购商品的关联状态
* @param boolean isBeginSale 限购商品是否已开售
*/
const _FashionTopGoodsStatus = (uid, showStatus, isBeginSale) => {
// 潮流尖货状态
let resData = {
getLimitedCode: true // 限购码状态
// hasLimitedCode: false, //是否已经获取限购码
// limitedCodeSoldOut: false, //限购码是否已经抢光
// openSoon: false,//即将开售
// dis: false, //失效
// buyNow: false, //是否立即购买
// soldOut: false, //是否已经售罄
// getLimitedCodeDis: false // 限购码是否失效
};
switch (showStatus) {
case 1: // 开售前/后,立即分享获得限购码(用户未领取限购码)
if (isBeginSale) { // 开售后
Object.assign(resData, {
buyNow: true,
dis: true
});
} else {
Object.assign(resData, {
openSoon: true,
hasLimitedCode: false
});
}
break;
case 2: // 开售后,限购码已抢光(用户未领取限购码)
Object.assign(resData, {
buyNow: true,
dis: true,
limitedCodeSoldOut: true,
getLimitedCode: false,
hasLimitedCode: false
});
break;
case 3: // 开售后,商品已经售罄
Object.assign(resData, {
soldOut: true,
getLimitedCode: false
});
break;
case 4: // 开售后,立即购买(用户已领取限购码)
Object.assign(resData, {
buyNow: true,
dis: false,
hasLimitedCode: true
});
if (!uid) { // 限购码失效
resData.getLimitedCodeDis = true;
}
break;
case 5: // 开售前,限购码已被抢光(用户未领取限购码)
Object.assign(resData, {
openSoon: true,
hasLimitedCode: true,
limitedCodeSoldOut: true,
getLimitedCode: false
});
break;
case 6: // 开售前,即将开售(用户已领取限购码)
Object.assign(resData, {
openSoon: true,
hasLimitedCode: true
});
if (!uid) { // 限购码失效
resData.getLimitedCodeDis = true;
}
break;
case 7: // 开售后,用户已经用获得的限购码购买过商品
Object.assign(resData, {
buyNow: true,
dis: true,
hasLimitedCode: true
});
if (!uid) { // 限购码失效
resData.getLimitedCodeDis = true;
}
break;
default:
break;
}
return resData;
};
const setPathNav = (data, name) => {
let resData = {};
... ... @@ -114,7 +206,7 @@ const setBrandBanner = brand => {
* @return Object
*/
const setProductData = base => {
let data = {
let resData = {
name: base.productName,
brandName: _.has(base, 'brand.brandName') ? base.brand.brandName : '',
intro: base.salesPhrase,
... ... @@ -125,9 +217,9 @@ const setProductData = base => {
let chooseSkuFlag;
if (_.toNumber(data.sellPrice) >= _.toNumber(data.marketPrice)) {
if (_.toNumber(resData.sellPrice) >= _.toNumber(resData.marketPrice)) {
// 售价与吊牌价相同,只显示售价
_.unset(data, 'marketPrice');
_.unset(resData, 'marketPrice');
}
// 遍历颜色尺寸
... ... @@ -148,7 +240,7 @@ const setProductData = base => {
if (value.goodsImagesList) {
group = {
name: value.colorName,
title: `${data.name} ${value.colorName}`,
title: `${resData.name} ${value.colorName}`,
color: value.colorName,
total: 0
};
... ... @@ -168,8 +260,8 @@ const setProductData = base => {
}
// 默认第一张图片
if (!_.has(data, 'img')) {
data.img = value.colorImage;
if (!_.has(resData, 'img')) {
resData.img = value.colorImage;
}
// 商品尺码列表
... ... @@ -197,13 +289,13 @@ const setProductData = base => {
// 默认选中该sku商品
if (group.total > 0 && !chooseSkuFlag) {
data.colorName = group.name;
resData.colorName = group.name;
group.cur = true; // 选中sku商品
chooseSkuFlag = true;
}
// 商品的总数累加
data.total += size.num;
resData.total += size.num;
sizes.push(size);
});
... ... @@ -213,14 +305,61 @@ const setProductData = base => {
goods.push(group);
});
// 默认设置第一个选中
if (goods.length && !chooseSkuFlag) {
goods[0].focus = true;
goods[0].cur = true;
}
resData.colors = goods;
}
// 限购商品
if (base.isLimitBuy === 'Y') {
let isBeginSale = (base.saleStatus && +base.saleStatus) === 1; // 是否开售
let showStatus = 1; // 限购商品有关的展示状态
if (base.showStatus) {
showStatus = _.toInteger(base.showStatus);
}
let fashTopGoods = _FashionTopGoodsStatus(base.uid, showStatus, isBeginSale);
// 潮流尖货状态
resData.fashionTopGoods = {
getLimitedCode: fashTopGoods.getLimitedCode, // 限购码状态
hasLimitedCode: fashTopGoods.hasLimitedCode, // 是否已经获取限购码
limitedCodeSoldOut: fashTopGoods.limitedCodeSoldOut, // 限购码是否已经抢光
getLimitedCodeDis: fashTopGoods.getLimitedCodeDis // 限购码是否失效
};
if (fashTopGoods.soldOut) {
resData.soldOut = fashTopGoods.soldOut;
// totalStorageNum = 0;//改总数为已售磬
} else {
resData.openSoon = fashTopGoods.openSoon;// 即将开售
resData.dis = fashTopGoods.dis;// 是否失效
resData.buyNow = fashTopGoods.buyNow;// 是否立即购买
}
}
data.colors = goods;
let soldOut = +base.status === 0 || resData.total === 0;
if (+base.attribute === 2) { // 非卖品
resData.notForSale = true;
} else if (soldOut) { // 已售磬
resData.soldOut = true;
_.unset(resData, 'fashionTopGoods');
} else if (+base.attribute === 3) { // 虚拟商品
// 虚拟商品老代码功能有问题,暂不处理
} else {
// 立即购买及即将开售不存在显示加入购物袋
if (!resData.buyNow && !resData.openSoon) {
resData.addToBag = true;
}
}
return data;
return resData;
};
/**
... ...
... ... @@ -5,12 +5,13 @@
*/
'use strict';
const _ = require('lodash');
const itemAPI = require('./item-api');
const itemFUN = require('./item-handler');
const search = require('./search-api');
const _getMultiResourceByBaseInfo = (base, uid) => {
const _getMultiResourceByBaseInfo = (base) => {
let productId = base.id;
let skn = base.erpProductId;
... ... @@ -24,10 +25,8 @@ const _getMultiResourceByBaseInfo = (base, uid) => {
search.getSortAsync({sort: base.smallSortId})
];
if (uid) {
console.log(uid);
// promiseData.push(favoriteBrandService.isFavoriteAsync(uid, productId));
if (base.uid) {
promiseData.push(itemAPI.getUserIsFav(base.uid, productId));
}
return Promise.all(promiseData).then(result => {
... ... @@ -35,12 +34,13 @@ const _getMultiResourceByBaseInfo = (base, uid) => {
sizeInfo: result[0],
comfort: result[1].data,
modelTry: result[2].data,
sort: result[3].data
sort: result[3].data,
productFav: (result[4] && result[4].data) ? true : false
};
});
};
let getProductItemData = (params) => {
let getProductItemData = (params, uid) => {
let pid = params[0];
// let gid = params[1];
... ... @@ -54,6 +54,8 @@ let getProductItemData = (params) => {
return data;
}
result.uid = uid;
// 商品基本信息
data.goodInfo = itemFUN.setProductData(result);
... ... @@ -68,6 +70,9 @@ let getProductItemData = (params) => {
// 面包屑导航
Object.assign(data, itemFUN.setPathNav(mulRes.sort, result.productName));
// 收藏状态
_.set(data, 'goodInfo.productFav', mulRes.productFav);
// DESCRIPTION商品描述
Object.assign(data, itemFUN.setDescriptionData(mulRes.sizeInfo, mulRes.comfort));
... ...
... ... @@ -18,6 +18,7 @@ router.get('/list', list.index); // 列表页面
router.get('/list/new', list.newPage); // 新品列表页
router.get(/\/item\/([\d]+)_([\d]+).html/, item.index); // 商品详情页
router.get('/item/togglecollect', item.collect); // 商品详情页
router.get('/shop/:domain/list', shop.list);
router.get('/shop/:domain', shop.index);
... ...
... ... @@ -67,23 +67,56 @@
{{/ colors}}
</div>
</div>
<p class="btns">
<div class="tip-content">
{{# fashionTopGoods}}
{{#if buyNow}}
<span id="buy-now" class="btn">立即购买</span>
{{#if getLimitedCode}}
<span>
点击
<i class="get-lc{{#unless getLimitedCodeDis}} blue{{/unless}}">获取限购码</i>
,凭借限购码购买商品
</span>
<div class="lc-container hide">
<span class="lc-arrow"></span>
<div class="lc-content">
<div class="qr-code"></div>
<p class="title">打开APP扫描二维码获取限购码</p>
<p class="sub-title">商品开售后即可购买</p>
</div>
</div>
{{/if}}
{{#if openSoon}}
<span class="btn">即将开售</span>
{{#if hadLimitedCode}}
<span>您已获取限购码</span>
{{/if}}
{{#if limitedCodeSoldOut}}
<span>限购码已抢光</span>
{{/if}}
{{^}}
<span id="add-to-bag" class="btn">
<i class="iconfont">&#xe632;</i>
加入购物袋
</span>
{{/ fashionTopGoods}}
</div>
<p class="btns">
{{#unless soldOut}}
{{# buyNow}}
<span id="buy-now" class="btn{{#if dis}} disable{{/if}}" data-base="{{buyNowBase}}">立即购买</span>
{{/ buyNow}}
{{# openSoon}}
<span id="open-soon" class="btn disable">即将开售</span>
{{/ openSoon}}
{{#if notForSale}}
<span class="btn disable">
<i class="iconfont">&#xe62d;</i>
非卖品
</span>
{{/if}}
{{#if addToBag}}
<span id="add-to-bag" class="btn">
<i class="iconfont">&#xe632;</i>
加入购物袋
</span>
{{/if}}
{{/unless}}
<span id="sold-out" class="btn disable hide">已售罄</span>
<span id="collect-product" class="btn white">
<span id="collect-product" class="btn white{{#if productFav}} coll{{/if}}">
<span class="collecting">
<i class="iconfont">&#xe644;</i>
收藏商品
... ...
... ... @@ -66,3 +66,11 @@ $clearInput.click(function() {
$searchKey.val('');
$(this).hide();
});
$(document).click(function(e) {
var $tar = $(e.target);
if (!$tar.closest('.search-entry').length) {
$searchWrap.hide();
}
});
... ...
... ... @@ -86,8 +86,9 @@ function chooseColor(index) {
}
// 控制才显示对应颜色尺码
$sizeList.not('.hide').addClass('hide');
$sizeList.not('.hide').addClass('hide').children('.cur').removeClass('cur');
$sizeList.eq(index).removeClass('hide');
$sizeText.text('');
}
// 缩略图垂直居中
... ... @@ -129,7 +130,7 @@ $('.color-list').on('click', '.color-item', function() {
index = $this.index(),
data = $this.data();
if (!$this.hasClass('cur')) {
if (!$this.children().hasClass('cur')) {
$colorItem.removeClass('cur');
$colorText.text(data.color ? data.color : '');
$this.children().addClass('cur');
... ...
... ... @@ -84,7 +84,7 @@
.option-content {
width: 226px;
margin: 0 auto;
padding: 40px 0 30px;
padding: 40px 0 20px;
> p {
line-height: 50px;
... ... @@ -133,6 +133,58 @@
}
}
.tip-content {
text-align: center;
font-size: 14px;
line-height: 1.5;
padding-bottom: 10px;
font-size: 14px;
position: relative;
.blue {
margin: 0 6px;
cursor: pointer;
}
}
.lc-container {
width: 300px;
height: 120px;
margin-top: 4px;
margin-left: -150px;
padding: 20px 20px 20px 120px;
position: absolute;
left: 50%;
background: #fff;
border: 2px solid #bcbcbc;
font-size: 12px;
text-align: left;
color: #888;
.lc-arrow {
width: 12px;
height: 7px;
background: url('/product/code-horn.png') no-repeat;
position: absolute;
top: -7px;
left: 85px;
}
.qr-code {
width: 90px;
height: 90px;
position: absolute;
top: 12px;
left: 14px;
}
.title {
font-size: 16px;
color: #1d1d1d;
margin-bottom: 14px;
}
}
.btn {
width: 300px;
height: 46px;
... ...