Authored by 陈峰

merge master

... ... @@ -11,7 +11,10 @@ const footerModel = require('../../../doraemon/models/footer_tab'); // 底部tab
const indexModel = require('../models/index');
let index = (req, res, next) => {
/**
* [购物车首页]
*/
const index = (req, res, next) => {
let isLogin = req.user && req.user.uid,
pageData = {
isLogin,
... ... @@ -28,24 +31,193 @@ let index = (req, res, next) => {
width750: true,
pageHeader: headerModel.setNav({
navTitle: '购物车',
backUrl: '/product/show_.html'
}),
pageFooter: true,
navBack: true,
suggestSub: {
text: ' '
},
navBtn: false
})
}));
};
let indexData = (req, res, next) => {
/**
* [购物车数据]
*/
const indexData = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
channel = req.cookies._Channel;
return indexModel.indexData(8040155, 'dc9d09e2ffd8607f2cfd8b9c95962923', channel).then(data => {
res.json(data);
channel = req.cookies._Channel,
uid = req.user && req.user.uid;
uid = 8040155;
shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
return indexModel.indexData(uid, shoppingKey, channel).then(data => {
res.json({
code: 200,
data
});
}).catch(next);
}
/**
* [选择或者取消商品]
*/
const select = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
uid = req.user && req.user.uid;
let skuList = req.body.skuList;
if (!skuList || !skuList.length) {
return res.json({
code: 400,
message: '参数错误'
});
}
uid = 8040155;
shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
return indexModel.selectGood(uid, skuList, shoppingKey).then(data => {
res.json({
code: 200,
data
});
}).catch(next);
}
/**
* [移出购物车]
*/
const del = (req, res, next) => {
if (!req.xhr) {
return next();
}
let shoppingKey = req.cookies._SPK || '',
uid = req.user && req.user.uid;
let skuList = req.body.skuList;
if (!skuList || !skuList.length) {
return res.json({
code: 400,
message: '参数错误'
});
}
uid = 8040155;
shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
return indexModel.removeFromCart(uid, skuList, shoppingKey).then(data => {
res.json({
code: 200,
data
});
}).catch(next);
}
/**
* [获取购物车数据]
*/
const goodinfo = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
buyNum = req.body.buy_num,
skn = req.body.skn;
if (!buyNum || !skn) {
return res.json({
code: 400,
message: '参数错误'
});
}
return indexModel.cartProductData(uid, skn, buyNum).then(data => {
res.render('good-info', {
layout: false,
cartInfo: data
});
}).catch(next);
}
const col = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
productId = req.body.id;
if (!productId) {
return res.json({
code: 400,
message: '参数错误'
});
}
return indexModel.addToFav(uid, productId).then(data => {
res.json({
code: 200,
data
});
}).catch(next);
}
const modifyNum = (req, res, next) => {
if (!req.xhr) {
return next();
}
let uid = req.user && req.user.uid,
shoppingKey = req.cookies._SPK || '',
sku = req.body.sku,
increaseNum = req.body.increaseNum,
decreaseNum = req.body.decreaseNum;
if (!sku || (!increaseNum && !decreaseNum)) {
return res.json({
code: 400,
message: '参数错误'
});
}
uid = 8040155;
shoppingKey = 'dc9d09e2ffd8607f2cfd8b9c95962923';
let promise;
if (increaseNum > 0) {
promise = indexModel.increaseProductNum(uid, sku, increaseNum, shoppingKey);
} else if (decreaseNum > 0) {
promise = indexModel.decreaseProductNum(uid, sku, decreaseNum, shoppingKey);
}
return promise.then(data => {
if (data.code === 200 && data.data) {
res.json({
code: 200,
goodsCount: data.data.goods_count
});
} else {
res.json({
code: 400,
message: data.message
});
}
}).catch(next);
}
module.exports = {
index,
indexData
indexData,
select,
del,
goodinfo,
col,
modifyNum
};
... ...
... ... @@ -5,9 +5,8 @@
*/
'use strict';
const helpers = global.yoho.helpers;
const api = global.yoho.API;
const _ = require('lodash');
const cartProcess = require(global.utils + '/cart-process');
const indexData = (uid, shoppingKey, saleChannel, cartType) => {
return api.get('', {
... ... @@ -16,185 +15,1030 @@ const indexData = (uid, shoppingKey, saleChannel, cartType) => {
shopping_key: shoppingKey,
sale_channel: saleChannel
}).then((data) => {
let cart = data.data;
let result = {};
let ordinaryCount = _.get(cart, 'ordinary_cart_data.shopping_cart_data.goods_count', 0);
let advanceCount = _.get(cart, 'advance_cart_data.shopping_cart_data.goods_count', 0);
let ordinarySoldOut = _.get(cart, 'ordinary_cart_data.sold_out_goods_list', []);
let advanceSoldOut = _.get(cart, 'advance_cart_data.sold_out_goods_list', []);
// 普通购物车和预售购物车都为空
if (ordinaryCount === 0 && advanceCount === 0 && !ordinarySoldOut.length && !advanceSoldOut.length) {
result.isEmptyCart = true;
return result;
}
// 普通购物车空,则显示预售购物车
if (ordinaryCount === 0 && !ordinarySoldOut.length) {
result.cartNav = false;
result.cartType = 'advance';
} // 预售购物车空,则显示普通购物车
else if (advanceCount === 0 && !advanceSoldOut.length) {
result.cartNav = false;
result.cartType = 'ordinary';
} // 以上两个购物车中都有数据, 默认显示普通购物车
else {
result.cartNav = true;
result.cartType = cartType || 'ordinary';
}
/* 普通购物车 */
result.commonGoodsCount = ordinaryCount;
result.commonCart = processData(cart.ordinary_cart_data, false);
/* 预售购物车 */
result.presellGoodsCount = advanceCount;
result.preSellCart = processData(cart.advance_cart_data);
console.log(result)
return result;
// return new Promise((resolve, reject) => {
// resolve(cartProcess.processData({
// "alg": "SALT_MD5",
// "code": 200,
// "data": {
// "advance_cart_data": {
// "gift_list": [],
// "goods_list": [],
// "goods_pool_list": [],
// "off_shelves_goods_list": [],
// "price_gift": [],
// "promotion_info": [],
// "shopping_cart_data": {
// "discount_amount": 0,
// "fast_shopping_cost": 15,
// "gain_yoho_coin": 0,
// "goods_count": 0,
// "has_invalid_goods": 0,
// "is_multi_package": "N",
// "last_order_amount": 0,
// "offline_goods_count": 0,
// "online_goods_count": 0,
// "order_amount": 0,
// "package_list": [],
// "promotion_formula": "总计¥0.00=商品金额¥0.00",
// "promotion_formula_list": [
// {
// "promotion": "商品金额",
// "promotion_amount": "¥0.00"
// }
// ],
// "remain_time": 0,
// "selected_goods_count": 0,
// "shipping_cost": 10,
// "str_discount_amount": "¥0.00",
// "str_order_amount": "¥0.00"
// },
// "sold_out_goods_list": []
// },
// "ordinary_cart_data": {
// "gift_list": [],
// "goods_list": [],
// "goods_pool_list": [
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "I LOVE CHOC",
// "brand_id": "524",
// "brand_name": "ilovechoc",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "ILOVECHOC505432039TongZhuangXingXingPinJieLianMaoBangQiuShan",
// "color_id": "7",
// "color_name": "蓝色",
// "delay_notice": "",
// "discount_tag": "",
// "expect_arrival_time": "",
// "factory_goods_name": "蓝色",
// "fit_promotions": [],
// "get_yoho_coin": "0",
// "goods_id": "367065",
// "goods_images": "http://img10.static.yhbimg.com/goodsimg/2015/11/25/06/01d06aa4c18f6714a04573afeac2ae71d2.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "280.0",
// "last_vip_price": 280,
// "local_buy_number": 0,
// "market_price": 281,
// "max_sort_id": "365",
// "middle_sort_id": "404",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 285265,
// "product_name": "I LOVE CHOC 童装星星拼接连帽棒球衫",
// "product_skc": "288132",
// "product_skn": "51160552",
// "product_sku": "912752",
// "promotion_flag": "101",
// "promotion_id": "0",
// "real_price": 280,
// "real_vip_price": 0,
// "sale_price": 0,
// "sales_price": 280,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60454",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "203",
// "size_name": "M",
// "small_sort_id": "405",
// "storage_number": "1",
// "store_id": 0,
// "str_subtotal": "¥280.00",
// "subtotal": 280,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "0.00",
// "vip2_price": "0.00",
// "vip3_price": "0.00",
// "vip_discount": 1,
// "vip_discount_money": 0,
// "vip_discount_type": "3",
// "vip_price": 0,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_title": "ilovechoc",
// "pool_type": 1
// },
// {
// "pool_type": 0,
// "promotion_list": [
// {
// "alreadyMatch": true,
// "condition_unit": 0,
// "condition_value": 0,
// "gift_goods_List": [],
// "gift_price": 0,
// "promotion_id": 9148,
// "promotion_title": "全场促销",
// "promotion_type": "Discount",
// "status": 10
// }
// ],
// "sub_pool": [
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "oasso",
// "brand_id": "210",
// "brand_name": "oasso",
// "buy_limit": 0,
// "buy_number": "2",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "OASSOShouJiChongDianZuo",
// "color_id": "6",
// "color_name": "绿色",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "绿色",
// "fit_promotions": [
// "9148"
// ],
// "get_yoho_coin": "0",
// "goods_id": "254893",
// "goods_images": "http://img13.static.yhbimg.com/goodsimg/2016/01/12/05/02d78f2aec2e0206f34e6bed05e463c73d.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "Y",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "7.92",
// "last_vip_price": 9.9,
// "local_buy_number": 0,
// "market_price": 12,
// "max_sort_id": "10",
// "middle_sort_id": "103",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 189413,
// "product_name": "oasso 手机充电座",
// "product_skc": "228608",
// "product_skn": "51109379",
// "product_sku": "746705",
// "promotion_flag": "110",
// "promotion_id": "0",
// "real_price": 7.92,
// "real_vip_price": 9.9,
// "sale_price": 0,
// "sales_price": 11,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60434",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "199",
// "size_name": "F",
// "small_sort_id": "212",
// "storage_number": "12331",
// "store_id": 0,
// "str_subtotal": "¥19.80",
// "subtotal": 19.8,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "10.45",
// "vip2_price": "9.90",
// "vip3_price": "9.68",
// "vip_discount": 0.9,
// "vip_discount_money": 1.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_type": 1
// }
// ]
// },
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "EBLIS",
// "brand_id": "37",
// "brand_name": "eblishungi",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "EBLISChenShanS223",
// "color_id": "7",
// "color_name": "蓝色",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "1月",
// "factory_goods_name": "测试数据,测试厂家颜色,蓝色,testtest,测试测试测试测试。。。。测试",
// "fit_promotions": [],
// "get_yoho_coin": "0",
// "goods_id": "443029",
// "goods_images": "http://img11.static.yhbimg.com/goodsimg/2016/01/12/02/01e1c78084e7ed6739b21a8bccbbf32f1b.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "9.9",
// "last_vip_price": 9.9,
// "local_buy_number": 0,
// "market_price": 598,
// "max_sort_id": "1",
// "middle_sort_id": "12",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 345753,
// "product_name": "EBLIS 男款格子衬衫",
// "product_skc": "329633",
// "product_skn": "51192557",
// "product_sku": "1029828",
// "promotion_flag": "0",
// "promotion_id": "0",
// "real_price": 9.9,
// "real_vip_price": 9.9,
// "sale_price": 0,
// "sales_price": 11,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60430",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "207",
// "size_name": "S",
// "small_sort_id": "115",
// "storage_number": "499",
// "store_id": 0,
// "str_subtotal": "¥9.90",
// "subtotal": 9.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "10.45",
// "vip2_price": "9.90",
// "vip3_price": "9.68",
// "vip_discount": 0.9,
// "vip_discount_money": 1.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_title": "eblishungi",
// "pool_type": 1
// },
// {
// "pool_type": 0,
// "promotion_list": [
// {
// "alreadyMatch": true,
// "condition_unit": 0,
// "condition_value": 0,
// "gift_goods_List": [],
// "gift_price": 0,
// "promotion_id": 9088,
// "promotion_title": "线下店满3免一勿动",
// "promotion_type": "Cheapestfree",
// "status": 10
// }
// ],
// "sub_pool": [
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "BLACKJACK",
// "brand_id": "256",
// "brand_name": "blackjack",
// "buy_limit": 0,
// "buy_number": "3",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "PANDAMADEHOTRODP12062",
// "color_id": "1",
// "color_name": "白",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "白",
// "fit_promotions": [
// "9088"
// ],
// "get_yoho_coin": "0",
// "goods_id": "28492",
// "goods_images": "http://img10.static.yhbimg.com/goodsimg/2016/09/26/19/01a0040ac739eda88815760dc95017c406.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "0.6",
// "last_vip_price": 0.9,
// "local_buy_number": 0,
// "market_price": 289,
// "max_sort_id": "1",
// "middle_sort_id": "11",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 19858,
// "product_name": "BLACKJACK民族风骷髅拉花毛衣",
// "product_skc": "28492",
// "product_skn": "50023801",
// "product_sku": "164165",
// "promotion_flag": "108",
// "promotion_id": "0",
// "real_price": 0.6,
// "real_vip_price": 0.9,
// "sale_price": 0,
// "sales_price": 1,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60428",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "201",
// "size_name": "L",
// "small_sort_id": "114",
// "storage_number": "100",
// "store_id": 0,
// "str_subtotal": "¥2.70",
// "subtotal": 2.7,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "0.95",
// "vip2_price": "0.90",
// "vip3_price": "0.88",
// "vip_discount": 0.9,
// "vip_discount_money": 0.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_type": 1
// }
// ]
// },
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "VANS",
// "brand_id": "144",
// "brand_name": "vans",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "VANSGGIRLFRIENDSKIRTVN01Z1BLK",
// "color_id": "2",
// "color_name": "黑色",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "黑色",
// "fit_promotions": [],
// "get_yoho_coin": "0",
// "goods_id": "257295",
// "goods_images": "http://img11.static.yhbimg.com/goodsimg/2015/05/22/08/01bdaaa0753892690e06ff7ef9bfd39b2b.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "9.9",
// "last_vip_price": 9.9,
// "local_buy_number": 0,
// "market_price": 260,
// "max_sort_id": "4",
// "middle_sort_id": "32",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 191193,
// "product_name": "VANS G GIRLFRIEND SKIRT",
// "product_skc": "230040",
// "product_skn": "51110511",
// "product_sku": "751215",
// "promotion_flag": "101",
// "promotion_id": "0",
// "real_price": 9.9,
// "real_vip_price": 9.9,
// "sale_price": 0,
// "sales_price": 11,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60424",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "201",
// "size_name": "L",
// "small_sort_id": "135",
// "storage_number": "11999",
// "store_id": 0,
// "str_subtotal": "¥9.90",
// "subtotal": 9.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "10.45",
// "vip2_price": "9.90",
// "vip3_price": "9.68",
// "vip_discount": 0.9,
// "vip_discount_money": 1.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_title": "vans",
// "pool_type": 1
// },
// {
// "pool_type": 0,
// "promotion_list": [
// {
// "alreadyMatch": true,
// "condition_unit": 0,
// "condition_value": 0,
// "gift_goods_List": [],
// "gift_price": 0,
// "promotion_id": 9086,
// "promotion_title": "线下店分件折扣勿动",
// "promotion_type": "Degressdiscount",
// "status": 10
// }
// ],
// "sub_pool": [
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "ZERONE",
// "brand_id": "199",
// "brand_name": "zerone",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "ZERONEDZ100105DZ100107UPC853A",
// "color_id": "2",
// "color_name": "黑",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "黑",
// "fit_promotions": [
// "9086"
// ],
// "get_yoho_coin": "0",
// "goods_id": "20056",
// "goods_images": "http://img12.static.yhbimg.com/goodsimg/2012/02/29/11/02f5a2573d16e353b3c36a6404a9aabd7c.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "195.93",
// "last_vip_price": 279.9,
// "local_buy_number": 0,
// "market_price": 629,
// "max_sort_id": "8",
// "middle_sort_id": "59",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 14293,
// "product_name": "ZERONE Lolita系列蕾丝手表",
// "product_skc": "20056",
// "product_skn": "50018093",
// "product_sku": "141155",
// "promotion_flag": "108",
// "promotion_id": "0",
// "real_price": 195.93,
// "real_vip_price": 279.9,
// "sale_price": 0,
// "sales_price": 311,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60422",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "199",
// "size_name": "F",
// "small_sort_id": "162",
// "storage_number": "100",
// "store_id": 0,
// "str_subtotal": "¥279.90",
// "subtotal": 279.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "295.45",
// "vip2_price": "279.90",
// "vip3_price": "273.68",
// "vip_discount": 0.9,
// "vip_discount_money": 31.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// },
// {
// "attribute": "1",
// "brand_domain": "ZERONE",
// "brand_id": "199",
// "brand_name": "zerone",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "ZERONEDZ100105DZ100107UPC853A",
// "color_id": "2",
// "color_name": "黑",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "黑",
// "fit_promotions": [
// "9086"
// ],
// "get_yoho_coin": "0",
// "goods_id": "20056",
// "goods_images": "http://img12.static.yhbimg.com/goodsimg/2012/02/29/11/02f5a2573d16e353b3c36a6404a9aabd7c.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "195.93",
// "last_vip_price": 279.9,
// "local_buy_number": 0,
// "market_price": 629,
// "max_sort_id": "8",
// "middle_sort_id": "59",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 14293,
// "product_name": "ZERONE Lolita系列蕾丝手表",
// "product_skc": "20056",
// "product_skn": "50018093",
// "product_sku": "141155",
// "promotion_flag": "108",
// "promotion_id": "0",
// "real_price": 195.93,
// "real_vip_price": 279.9,
// "sale_price": 0,
// "sales_price": 311,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60422",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "199",
// "size_name": "F",
// "small_sort_id": "162",
// "storage_number": "100",
// "store_id": 0,
// "str_subtotal": "¥279.90",
// "subtotal": 279.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "295.45",
// "vip2_price": "279.90",
// "vip3_price": "273.68",
// "vip_discount": 0.9,
// "vip_discount_money": 31.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_type": 1
// }
// ]
// },
// {
// "goods_list": [
// {
// "attribute": "1",
// "brand_domain": "reemoor",
// "brand_id": "949",
// "brand_name": "reemoor",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "REEMOOR251205ShuangXianHangFengYaZhiFengGeShuJuanXie",
// "color_id": "7",
// "color_name": "蓝色",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "蓝色",
// "fit_promotions": [],
// "get_yoho_coin": "0",
// "goods_id": "353397",
// "goods_images": "http://img10.static.yhbimg.com/goodsimg/2015/10/10/08/01218e9a756a74d2f15e8071fe43b601ab.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "9.9",
// "last_vip_price": 9.9,
// "local_buy_number": 0,
// "market_price": 298,
// "max_sort_id": "6",
// "middle_sort_id": "48",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 273535,
// "product_name": "reemoor 双线绗缝雅致风格舒卷鞋",
// "product_skc": "278773",
// "product_skn": "51152203",
// "product_sku": "890538",
// "promotion_flag": "109",
// "promotion_id": "0",
// "real_price": 9.9,
// "real_vip_price": 9.9,
// "sale_price": 0,
// "sales_price": 11,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60416",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "116",
// "size_name": "40码",
// "small_sort_id": "151",
// "storage_number": "7",
// "store_id": 0,
// "str_subtotal": "¥9.90",
// "subtotal": 9.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "10.45",
// "vip2_price": "9.90",
// "vip3_price": "9.68",
// "vip_discount": 0.9,
// "vip_discount_money": 1.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// },
// {
// "attribute": "1",
// "brand_domain": "reemoor",
// "brand_id": "949",
// "brand_name": "reemoor",
// "buy_limit": 0,
// "buy_number": "1",
// "buy_type": 2,
// "can_cod_pay": "Y",
// "cn_alphabet": "REEMOOR251289LiangMianJianTouHuDieJieZhuangShiShuJuanXie",
// "color_id": "1",
// "color_name": "白色",
// "delay_notice": "",
// "discount_tag": "S",
// "expect_arrival_time": "",
// "factory_goods_name": "白色",
// "fit_promotions": [],
// "get_yoho_coin": "0",
// "goods_id": "353425",
// "goods_images": "http://img10.static.yhbimg.com/goodsimg/2015/10/10/08/01a9456ed9db84ea945d2163de7144a85f.jpg?imageMogr2/thumbnail/{width}x{height}/extent/{width}x{height}/background/d2hpdGU=/position/center/quality/80",
// "goods_type": "ordinary",
// "is_advance": "N",
// "is_deposit_advance": "N",
// "is_jit": "N",
// "is_limited": "N",
// "is_outlets": "N",
// "is_special": "N",
// "last_price": "9.9",
// "last_vip_price": 9.9,
// "local_buy_number": 0,
// "market_price": 298,
// "max_sort_id": "6",
// "middle_sort_id": "48",
// "min_buy_number": 1,
// "off_shelves": 0,
// "offline_goods_status": 1,
// "offline_storage_number": 0,
// "offline_storage_status": 1,
// "online_storage_number": 0,
// "product_id": 273543,
// "product_name": "reemoor 亮面尖头蝴蝶结装饰舒卷鞋",
// "product_skc": "278787",
// "product_skn": "51152207",
// "product_sku": "890621",
// "promotion_flag": "109",
// "promotion_id": "0",
// "real_price": 9.9,
// "real_vip_price": 9.9,
// "sale_price": 0,
// "sales_price": 11,
// "selected": "Y",
// "shop_id": 0,
// "shopping_cart_goods_id": "60426",
// "shopping_cart_id": "118792348",
// "shopping_key": "2a7729e3e974cfe476e4472a89c13743",
// "size_id": "116",
// "size_name": "40码",
// "small_sort_id": "151",
// "storage_number": "6",
// "store_id": 0,
// "str_subtotal": "¥9.90",
// "subtotal": 9.9,
// "supplier_id": 0,
// "tags": [],
// "uid": "8040155",
// "vip1_price": "10.45",
// "vip2_price": "9.90",
// "vip3_price": "9.68",
// "vip_discount": 0.9,
// "vip_discount_money": 1.1,
// "vip_discount_type": "1",
// "vip_price": 11,
// "wareHouseId": 0,
// "yoho_coin_num": "0"
// }
// ],
// "pool_title": "reemoor",
// "pool_type": 1
// }
// ],
// "off_shelves_goods_list": [],
// "price_gift": [],
// "promotion_info": [
// {
// "cutdown_amount": 0.9,
// "promotion_id": 9088,
// "promotion_title": "线下店满3免一勿动",
// "promotion_type": "Cheapestfree"
// },
// {
// "cutdown_amount": 3.96,
// "promotion_id": 9148,
// "promotion_title": "全场促销",
// "promotion_type": "Discount"
// },
// {
// "cutdown_amount": 167.94,
// "promotion_id": 9086,
// "promotion_title": "线下店分件折扣勿动",
// "promotion_type": "Degressdiscount"
// },
// {
// "cutdown_amount": 10,
// "promotion_id": 0,
// "promotion_title": "满¥399免运费",
// "promotion_type": "FreeShippingCost"
// }
// ],
// "shopping_cart_data": {
// "discount_amount": 172.8,
// "fast_shopping_cost": 5,
// "gain_yoho_coin": 0,
// "goods_count": 12,
// "has_invalid_goods": 0,
// "is_multi_package": "N",
// "last_order_amount": 729.1,
// "offline_goods_count": 0,
// "online_goods_count": 0,
// "order_amount": 971,
// "package_list": [],
// "promotion_formula": "总计¥729.10=商品金额¥971.00-活动金额¥172.80-学生优惠¥69.10",
// "promotion_formula_list": [
// {
// "promotion": "商品金额",
// "promotion_amount": "¥971.00"
// },
// {
// "promotion": "活动金额",
// "promotion_amount": "-¥172.80"
// },
// {
// "promotion": "学生优惠",
// "promotion_amount": "-¥69.10"
// }
// ],
// "remain_time": 0,
// "selected_goods_count": 12,
// "shipping_cost": 0,
// "str_discount_amount": "¥172.80",
// "str_order_amount": "¥971.00"
// },
// "sold_out_goods_list": []
// }
// },
// "md5": "4fd4cbe259627fea6b1c68a0fb6c217a",
// "message": "cart goods list."
// }))
// })
return cartProcess.processData(data);
});
};
const processData = (data, isAdvanceCart) => {
let result = {};
// 购买的可用商品列表
result.goods = _.get(data, 'goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart); });
result.promotionPoolList = _.get(data, 'promotion_pool_list', []).map(promotion => {
return {
goods: _.get(promotion, 'goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart); }),
promotions: _.get(promotion, 'promotion_list', []).map(promo => {
return {
status: promo.status,
conditionUnit: promo.condition_unit,
conditionValue: promo.condition_value,
giftGoodsList: _.get(promo, 'gift_goods_List', []).map(gift => { return formatAdvanceGoods(gift); }),
giftPrice: promo.gift_price,
promotionId: promo.promotion_id,
promotionTitle: promo.promotion_title,
promotionType: promo.promotion_type,
alreadyMatch: promo.alreadyMatch
};
})
};
/**
* 购物车商品选择与取消接口
*
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 购物车接口返回的数据
*/
const selectGood = (uid, sku, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.selectedAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return cartProcess.processData(data);
});
// 失效商品列表
result.notValidGoods = _.get(data, 'sold_out_goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart, false); });
// 下架的商品列表
result.offShelveGoods = _.get(data, 'off_shelves_goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart, false); });
// 赠品和加价购商品
if (data.gift_list.length || data.price_gift.length) {
result.freebieOrAdvanceBuy = true;
// 赠品
result.freebie = data.gift_list.map(good => { return formatAdvanceGoods(good); });
result.giftCount = result.freebie.length;
// 加价购
result.advanceBuy = data.price_gift.map(good => { return formatAdvanceGoods(good); });
result.advanceBuyCount = result.advanceBuy.length;
}
// 已参加的活动
if (data.promotion_info && data.promotion_info.length > 0) {
result.promotionInfo = data.promotion_info.map(promotion => {
return {id: promotion.promotion_id, name: promotion.promotion_title};
});
}
// 结算数据
result.formulaPrice = data.shopping_cart_data.promotion_formula;
result.count = data.shopping_cart_data.selected_goods_count;
result.isAllSelected = (data.shopping_cart_data.goods_count === data.shopping_cart_data.selected_goods_count) && (data.shopping_cart_data.selected_goods_count > 0);
result.sumPrice = transPrice(data.shopping_cart_data.last_order_amount);
return result;
};
}
/**
* 格式化加价购和赠品商品
* 移出购物车
*
* @param array $advanceGoods 加价购商品列表
* @param int $count 计商品件数
* @return array $arr 处理之后的加价购商品数据
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const formatAdvanceGoods = (advanceGood, isGift) => {
let result = {};
result.id = advanceGood.product_skn;
result.name = advanceGood.product_name;
result.thumb = advanceGood.goods_images ? helpers.image(advanceGood.goods_images, 120, 160) : '';
result.price = transPrice(advanceGood.last_price);
result.marketPrice = isGift ? '0.00' : transPrice(advanceGood.market_price);
result.count = advanceGood.storage_number;
return result;
};
const removeFromCart = (uid, sku, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.removeAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return cartProcess.processData(data);
});
}
/**
* 格式化购物车商品
* 获取购物车商品数据
*
* @param array $cartGoods 购物车商品列表
* @param boolean $isValid 是否是可用商品(非失效商品),默认是
* @param bool $isAdvanceCart 是否是预售购物车(和上市期有关)
* @return array 处理之后的购物车商品数据
* @param int $uid 用户ID
* @param int $skn 商品skn
* @return array 接口返回的数据
*/
const formatCartGoods = (goodData, isAdvanceCart, isValid) => {
let result = {};
result.id = goodData.product_sku;
result.skn = goodData.product_skn;
result.name = goodData.product_name;
result.thumb = goodData.goods_images ? helpers.image(goodData.goods_images, 120, 160) : '';
result.color = goodData.color_name;
result.size = goodData.size_name;
result.checked = goodData.selected === 'Y';
result.price = transPrice(goodData.last_vip_price);
result.isVipPrice = goodData.sales_price !== goodData.last_vip_price && goodData.discount_tag === 'V';
result.isStudents = goodData.sales_price !== goodData.last_vip_price && goodData.discount_tag === 'S';
result.count = goodData.buy_number;
result.promotion_id = goodData.promotion_id;
if (isValid) {
// 库存不足
result.lowStocks = (goodData.buy_number > goodData.storage_number);
} else { // 失效商品
result.inValid = true;
}
// gift=>是否赠品,advanceBuy=>是否加价购,soldOut=>失效商品;
if (!goodData.goods_type) {
result.inValid = true;
}
else if (goodData.goods_type === 'gift' && !goodData.isAdvanceBuy) {
result.isGift = true;
result.salesPrice = transPrice(goodData.sales_price);
result.price = transPrice(goodData.last_price);
}
else if (goodData.goods_type === 'price_gift') {
result.showCheckbox = true;
result.isAdvanceBuy = true;
result.salesPrice = transPrice(goodData.sales_price);
result.price = transPrice(goodData.last_price);
}
else {
result.showCheckbox = true;
}
// 上市期
if (isAdvanceCart && goodData.expect_arrival_time) {
result.appearDate = goodData.expect_arrival_time;
}
const cartProductData = (uid, skn) => {
return api.get('', {
method: 'app.product.data',
product_skn: skn,
uid: uid,
showcomment: 'N'
}).then((data) => {
return cartProcess.procGoodsDetail(data);
});
}
// 商品链接
result.link = helpers.urlFormat(`/product/show_${goodData.product_skn}.html`);
};
/**
* 修改购物车商品数量-增加
*
* @param int $uid 用户ID
* @param string $sku 商品SKU
* @param int $increaseNum 增加的数目
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const increaseProductNum = (uid, sku, increaseNum, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.increase',
product_sku: sku,
increase_number: increaseNum,
uid: uid,
shopping_key: shoppingKey
});
}
/**
* 修改购物车商品数量-减少
*
* @param int $uid 用户ID
* @param string $sku 商品SKU
* @param int $decreaseNum 减少的数目
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const decreaseProductNum = (uid, sku, decreaseNum, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.decrease',
product_sku: sku,
decrease_number: decreaseNum,
uid: uid,
shopping_key: shoppingKey
});
}
const transPrice = (price, isSepcialZero) => {
return (price || isSepcialZero) ? price.toFixed(2) : 0;
};
/**
* 修改购物车商品数据
*
* @param int $uid 用户ID
* @param string $param 要更改的数据
* @param string $shoppingKey 未登录用户唯一识别码
* @return array 接口返回的数据
*/
const modifyCartProduct = (uid, param, shoppingKey) => {
return api.get('', {
method: 'app.Shopping.swap',
swap_data: param,
uid: uid,
shopping_key: shoppingKey
});
}
/**
* 移入收藏夹
*
* @param int $uid 用户ID
* @param string $sku 商品sku列表
* @return array 接口返回的数据
*/
const addToFav = (uid, sku) => {
return api.get('', {
method: 'app.Shopping.addfavoriteAndQryCart',
product_sku_list: sku,
uid: uid,
shopping_key: shoppingKey
}).then((data) => {
return cartProcess.processData(data);
});
}
module.exports = {
indexData
indexData,
selectGood,
removeFromCart,
cartProductData,
addToFav,
increaseProductNum,
decreaseProductNum
}
\ No newline at end of file
... ...
... ... @@ -37,6 +37,10 @@ router.get('/index/new/invoiceInfo', authMW, order.invoiceInfo); // 发票信息
router.get('/index/new', indexController.index); // 购物车
router.post('/index/new/data', indexController.indexData); // 购物车
router.post('/index/new/select', indexController.select); // 选择取消购物车商品
router.post('/index/new/del', indexController.del); // 删除购物车商品
router.post('/index/new/goodinfo', indexController.goodinfo); // 获取购物车商品数据,chosepanel
router.post('/index/new/modifyNum', indexController.modifyNum); // 获取购物车商品数量
module.exports = router;
... ...
{{> cart/chose-panel}}
\ No newline at end of file
... ...
... ... @@ -1843,88 +1843,79 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
let notForSale = origin.attribute === 2;
let preSale = (origin.status === 0 && origin.advance_shelve_time > 0);
// 悬浮的购物车信息
dest.cartInfo = {
cartUrl: helpers.urlFormat('/cart/index/index'),
numInCart: 0,
goodsInstore: origin.storage_sum
};
// 显示加入购物车链接
if (!soldOut && !notForSale && !preSale || origin.isLimitBuy) {
_.orderBy(colorGroup);
Object.assign(dest.cartInfo, {
productId: origin.product_id,
thumbs: thumbImageList,
name: dest.goodsName || '',
price: dest.goodsPrice.previousPrice ? dest.goodsPrice.previousPrice : '',
salePrice: dest.goodsPrice.currentPrice ? dest.goodsPrice.currentPrice : '',
totalNum: totalStorageNum,
colors: _.toArray(colorGroup),
sizes: sizeGroup
});
return new Promise((resolve, reject) => {
// 悬浮的购物车信息
dest.cartInfo = {
cartUrl: helpers.urlFormat('/cart/index/index'),
numInCart: 0,
goodsInstore: origin.storage_sum
};
// 显示加入购物车链接
if (!soldOut && !notForSale && !preSale || origin.isLimitBuy) {
_.orderBy(colorGroup);
Object.assign(dest.cartInfo, {
productId: origin.product_id,
thumbs: thumbImageList,
name: dest.goodsName || '',
price: dest.goodsPrice.previousPrice ? dest.goodsPrice.previousPrice : '',
salePrice: dest.goodsPrice.currentPrice ? dest.goodsPrice.currentPrice : '',
totalNum: totalStorageNum,
colors: _.toArray(colorGroup),
sizes: sizeGroup
});
// 限购商品
if (origin.isLimitBuy) {
return api.get('', {
method: 'app.limitProduct.productStatus',
limitProductCode: origin.limitProductCode,
uid: uid,
product_skn: origin.product_skn
}, {
code: 200,
cache: true
}).then((result) => {
if (result.data) {
if (!result.data.isLimitBuy) {
// 限购商品
if (origin.isLimitBuy) {
return api.get('', {
method: 'app.limitProduct.productStatus',
limitProductCode: origin.limitProductCode,
uid: uid,
product_skn: origin.product_skn
}, {
code: 200,
cache: true
}).then((result) => {
if (result.data) {
if (!result.data.isLimitBuy) {
dest.cartInfo.soldOut = true;
return resolve(dest);
}
// 是否开售
let isBeginSale = (result.data.saleStatus === 1);
// 限购商品有关的展示状态
let showStatus = 1;
origin.showStatus && (showStatus = parseInt(result.data.showStatus, 10));
// 处理限购商品有关的按钮状态
dest = _procShowStatus(dest, showStatus, isBeginSale);
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = _getLimitCodeUrl(origin.limitProductCode, origin.product_skn, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure');
return resolve(dest);
} else {
dest.cartInfo.soldOut = true;
return callback();
return resolve(dest);
}
// 是否开售
let isBeginSale = (result.data.saleStatus === 1);
// 限购商品有关的展示状态
let showStatus = 1;
origin.showStatus && (showStatus = parseInt(result.data.showStatus, 10));
// 处理限购商品有关的按钮状态
dest = _procShowStatus(dest, showStatus, isBeginSale);
dest.cartInfo.limitProductCode = origin.limitProductCode;
dest.cartInfo.limitCodeUrl = _getLimitCodeUrl(origin.limitProductCode, origin.product_skn, ua);
dest.cartInfo.limitProductPay = helpers.urlFormat('/cart/index/orderEnsure');
return callback();
} else {
dest.cartInfo.soldOut = true;
return callback();
}
});
} else {
dest.cartInfo.addToCartUrl = helpers.urlFormat('/product/buy_' + origin.product_id + '_' +
origin.goods_id + '.html');
return callback();
});
} else {
dest.cartInfo.addToCartUrl = helpers.urlFormat('/product/buy_' + origin.product_id + '_' +
origin.goods_id + '.html');
}
} else if (notForSale && !preSale) {
dest.cartInfo.notForSale = true;
} else if (soldOut && !preSale) {
dest.cartInfo.soldOut = true;
} else if (preSale) {
dest.cartInfo.preSale = true;
}
} else if (notForSale && !preSale) {
dest.cartInfo.notForSale = true;
return callback();
} else if (soldOut && !preSale) {
dest.cartInfo.soldOut = true;
return callback();
} else if (preSale) {
dest.cartInfo.preSale = true;
return callback();
}
// 是否收藏 使用单独收藏接口获取
// dest.isCollect = false;
// if (origin.is_collect === 'Y') {
// dest.isCollect = true;
// dest.cartInfo.isCollect = true;
// }
function callback() {
return resolve(dest);
}).then(dest => {
// 虚拟商品(门票)
if (origin.attribute * 1 === 3) {
dest.tickets = true;
... ... @@ -1954,22 +1945,13 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
if (dest.isSecKill === 'Y' && dest.cartInfo.totalNum > 0) {
dest.totalNum = 1;
}
return Promise.resolve(dest);
}
return dest;
})
};
return api.get('', {
method: 'app.shop.queryShopsByBrandId',
brand_id: _.toString(brandId)
}, {
cache: true
}).then(shops => {
if (shops && shops.code === 200) {
return _processShopsInfo(shops.data);
}
const detailCartDataPkgAsync = (origin) => {
return [];
});
};
}
/**
... ...
{{#cartInfo}}
<div class="chose-panel">
<div class="main">
<div class="infos {{#if ../tickets}}tickets-info{{/if}}">
<div class="basic-info" >
{{#thumbs}}
<img class="thumb {{#unless @first}}hide{{/unless}}" src={{img}}>
{{/thumbs}}
<div class="text-info">
<p class="name">{{name}}</p>
<p class="price">
<span class="sale-price{{^price}} no-price{{/price}}">{{salePrice}}</span>
{{#if price}}
<span class="market-price">{{price}}</span>
{{/if}}
</p>
</div>
</div>
<div class="chose-items">
<div class="color-list block-list">
<span>{{colorName}}</span>
{{# colors}}
<ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{# color}}
<li class="block {{#if chosed}}chosed{{/if}} {{#unless colorNum}}zero-stock{{/unless}}" data-num="{{colorNum}}">
{{name}}
</li>
{{/ color}}
</ul>
{{/ colors}}
</div>
<div class="size-list block-list {{#if ../single}}hide{{/if}}">
<span>{{sizeName}}</span>
{{# sizes}}
<ul class="size-row clearfix {{#unless @first}}hide{{/unless}}">
{{# size}}
<li class="block {{#if chosed}}chosed{{/if}} {{#unless sizeNum}}zero-stock{{/unless}}" data-num="{{sizeNum}}" data-id="{{id}}" data-skuid="{{skuId}}">
{{name}}
</li>
{{/ size}}
</ul>
{{/ sizes}}
</div>
<p>
<div class="num">
<span>数量</span>
<div class="clearfix">
<a class="btn btn-minus" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe625;</span>
</a>
<input id="good-num" class="good-num disabled" type="text" value="1" disabled="true">
<a class="btn btn-plus" href="javascript:void(0);">
<span class="iconfont {{#if promotionId}}disabled{{/if}}">&#xe624;</span>
</a>
</div>
<span class="left-num"></span>
<input id="left-num" type="hidden" value="0">
<input id="limitNum" type="hidden" value="{{limit}}">
</div>
</div>
</div>
<div class="btn-wrap">
<button id="chose-btn-sure" class="btn btn-sure">{{#if ../tickets}}立即购买{{else}}加入购物车{{/if}}</button>
</div>
</div>
</div>
{{/cartInfo}}
<input id="promotionId" type="hidden" value="{{promotionId}}">
<input id="single" type="hidden" value="{{single}}">
\ No newline at end of file
... ...
... ... @@ -29,7 +29,13 @@
<p class="nav-title">{{.}}</p>
{{/navTitle}}
{{#suggestSub}}
<span class="nav-btn">提交</span>
<span class="nav-btn">
{{#if text}}
{{text}}
{{^}}
提交
{{/if}}
</span>
{{/suggestSub}}
{{#saleNav}}
<span class="sale-nav nav-home">
... ...
<div class="normal-box">
{{#goodPools}}
<div class="cart-brand box">
{{#if isPromotion}}
<div class="promotion-header {{#if promotionMore}}more-box{{/if}}">
{{#promotions}}
<div class="promo-item">
<div class="info"><i class="iconfont cuxiao"></i>{{promotionTitle}}</div>
<div class="opt to-gift">
<a href="javascript:;" data-status="{{status}}">{{optTitle}}</a><i class="iconfont to-arrow"></i>
</div>
</div>
{{/promotions}}
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
</div>
{{#sub_pool}}
{{#if isPromotion}}
<div class="promos {{#if promotionMore}}more-box{{/if}}">
{{#promotions}}
<div class="promo-item">
<div class="info">
<span class="flag">加价购</span>差1件立享【满¥399减100】
</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
{{/promotions}}
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
</div>
{{/if}}
{{#goods}}
{{> cart-good}}
{{/goods}}
{{/sub_pool}}
{{/if}}
{{#if isBrand}}
<div class="good-list">
{{#goods}}
{{> cart-good}}
{{/goods}}
</div>
{{/if}}
</div>
{{/goodPools}}
{{#goods}}
<div class="cart-brand box">
<div class="good-list">
{{> cart-good}}
</div>
</div>
{{/goods}}
</div>
{{#if freebieOrAdvanceBuy}}
<div class="all-gift-box box">
{{#if freebie}}
<div class="gift-item">
<div class="flag">
<i class="iconfont gift"></i>
</div>
<div class="content">
<div class="info">已满足全场加价购</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
{{/if}}
{{#if advanceBuy}}
<div class="gift-item">
<div class="flag">
<i class="iconfont price-gift"></i>
</div>
<div class="content">
<div class="info">已满足全场加价购</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
{{/if}}
</div>
{{/if}}
{{#if hasNoSaleGoods}}
<div class="disable-box box">
{{#notValidGoods}}
{{> cart-good}}
{{/notValidGoods}}
{{#offShelveGoods}}
{{> cart-good}}
{{/offShelveGoods}}
<div class="remove-all">
<button class="btn btn-remove">清空失效商品</button>
</div>
</div>
{{/if}}
<div class="total box">
{{#if promotionInfo.length}}
<div class="activity-title">
<h1>已参与活动</h1>
</div>
<div class="activity">
<ul>
{{#promotionInfo}}
<li>{{name}}</li>
{{/promotionInfo}}
</ul>
</div>
{{/if}}
<div class="price-compute">
<p>{{formulaPrice}}</p>
</div>
</div>
<div class="cart-footer">
<div class="check-all">
<i class="iconfont chk select {{#if isAllSelected}}checked{{/if}}"></i>
<i class="iconfont chk edit"></i>
<p>全选</p>
</div>
<div class="opts edit">
<button class="btn btn-gray btn-fav">移入<br>收藏夹</button>
<button class="btn btn-red btn-del">删除</button>
</div>
<div class="opts bill ">
<div class="total">
<p class="price">总计:¥{{sumPrice}}&nbsp;&nbsp;({{count}}件)</p>
<p class="intro">不含运费</p>
</div>
<button class="btn btn-red">结算</button>
</div>
</div>
\ No newline at end of file
... ...
<div class="cart-good edit">
<div class="promos more-box ">
<div class="promo-item">
<div class="info">
<span class="flag">加价购</span>差1件立享【满¥399减100】
</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
<div class="promo-item">
<div class="info">
<span class="flag">加价购</span>差1件立享【满¥399减100】
</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
<div class="promo-item">
<div class="info">
<span class="flag">加价购</span>差1件立享【满¥399减100】
</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
<div class="good-item{{#if lowStocks}} low-stocks{{/if}}{{#if isStudents}} is-students{{/if}}{{#if isVipPrice}} is-vip-price{{/if}}" data-promotion="{{promotion_id}}" data-id="{{id}}" data-skn="{{skn}}">
<div class="opt">
{{#if showCheckbox}}
<i class="iconfont chk select {{#if checked}}checked{{/if}}"></i>
<i class="iconfont chk edit"></i>
{{/if}}
{{#inValid}}
<span class="disable fill-text">失效</span>
{{/inValid}}
</div>
<div class="good-item">
<div class="opt">
<i class="iconfont chk "></i>
{{!-- <span class="disable fill-text">失效</span> --}}
</div>
<div class="good-new-info">
<a href="//m.yohobuy.com/product/show_{{product_skn}}.html" class="img-a">
<div class="img">
<img class="thumb lazy" src="//img12.static.yhbimg.com/goodsimg/2016/12/21/17/02a2809c6b69141c032b9978a2f61d9958.jpg?imageMogr2/thumbnail/120x160/extent/120x160/background/d2hpdGU=/position/center/quality/80" alt="">
<div class="good-new-info">
<a href="{{link}}" class="img-a">
<div class="img">
<img class="thumb lazy" data-original="{{thumb}}" alt="">
{{#isGift}}
<div class="flag gift"><div class="text">赠品</div></div>
{{/isGift}}
{{#isAdvanceBuy}}
<div class="flag price-gift"><div class="text">加价购</div></div>
</div>
</a>
<div class="info">
<div class="fixed-height">
<div class="intro intro-name">
<div class="name-row">
<div class="name">
<a href="//m.yohobuy.com/product/show_{{product_skn}}.html">EBLIS时拼色EBLIS时拼色EBLIS时拼色时尚拼色EBLI色EBLIS时拼色EBLIS时拼色时尚拼色EBLI色EBLIS时拼色EBLIS时拼色时尚拼色EBLI色EBLIS时拼色时尚拼色EBLI色</a>
</div>
{{/isAdvanceBuy}}
</div>
</a>
<div class="info">
<div class="fixed-height">
<div class="intro intro-name">
<div class="name-row">
<div class="name">
<a href="{{link}}">{{name}}</a>
</div>
<p class="color-size-row"><span class="color">颜色:黑色</span><span class="size">尺码:S</span></p>
</div>
<div class="intro intro-edit">
<div class="edit-box">
<div class="num-opt">
<a href="javascript:;" class="btn btn-minus "><span class="iconfont"></span></a>
<input type="text" class="good-num" disabled="true" value="1">
<a href="javascript:;" class="btn btn-plus"><span class="iconfont"></span></a>
</div>
<div class="size-info">
<div class="txt">颜色:黑色 尺码:S</div>
<div class="down">
<i class="iconfont"></i>
</div>
<p class="color-size-row"><span class="color">颜色:{{color}}</span><span class="size">尺码:{{size}}</span></p>
</div>
<div class="intro intro-edit">
<div class="edit-box">
<div class="num-opt">
<a href="javascript:;" class="btn btn-opt-minus{{#if minSelectNum}} disabled{{/if}}"><span class="iconfont"></span></a>
<input type="text" class="good-num" disabled="true" value="{{count}}" data-min="{{minNumber}}" data-max="{{maxNumber}}">
<a href="javascript:;" class="btn btn-opt-plus"><span class="iconfont"></span></a>
</div>
<div class="size-info">
<div class="txt">颜色:{{color}} 尺码:{{size}}</div>
<div class="down">
<i class="iconfont"></i>
</div>
</div>
</div>
<div class="count">x1</div>
</div>
<p class="price">
<span class="market-price">¥1119.66</span>
<span class="vip fill-text">VIP</span>
<span class="vip fill-text"></span>
</p>
<div class="tags">
<span class="low-stocks fill-text">库存不足</span>
<span class="appear-date">上市期:2015年13月</span>
</div>
<div class="count">x{{count}}</div>
</div>
<p class="price">
<span class="market-price">{{price}}</span>
{{#if isStudents}}<span class="vip fill-text"></span>{{/if}}
{{#if isVipPrice}}<span class="vip fill-text">VIP</span>{{/if}}
</p>
<div class="tags">
{{#if lowStocks}}<span class="low-stocks fill-text">库存不足</span>{{/if}}
{{#appearDate}}<span class="appear-date">上市期:{{appearDate}}</span>{{/appearDate}}
</div>
</div>
</div>
</div>
\ No newline at end of file
</div>
... ...
{{#if cartNav}}
<ul class="cart-nav clearfix">
<li class="active" id="common-cart-nav">
<li class="active" id="common-cart-nav" data-type="normal-good">
<span>普通商品({{commonGoodsCount}})</span>
</li>
<li id="presell-cart-nav">
<li id="presell-cart-nav" data-type="advance-good">
<span >预售商品({{presellGoodsCount}})</span>
<div id="presell-tip" class="presell-tip hide">
<div class="triangle"></div>
... ... @@ -12,93 +12,17 @@
</li>
</ul>
{{/if}}
<div class="cart-content normal-good">
<div class="normal-box">
<div class="cart-brand box">
<div class="promotion-header more-box ">
<div class="promo-item">
<div class="info"><i class="iconfont cuxiao"></i>差¥200立享【满¥699减100】</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
<div class="promo-item">
<div class="info"><i class="iconfont cuxiao"></i>差¥200立享【满¥699减100】</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
<div class="down-arrow">
<i class="iconfont arrow"></i>
</div>
</div>
<div class="good-list">
{{> cart-good}}
</div>
</div>
</div>
<div class="all-gift-box box">
<div class="gift-item">
<div class="flag">
<i class="iconfont gift"></i>
</div>
<div class="content">
<div class="info">已满足全场加价购</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
<div class="gift-item">
<div class="flag">
<i class="iconfont price-gift"></i>
</div>
<div class="content">
<div class="info">已满足全场加价购</div>
<div class="opt to-gift">
<a href="#">去凑单</a><i class="iconfont to-arrow"></i>
</div>
</div>
</div>
</div>
<div class="disable-box box">
{{> cart-good}}
<div class="remove-all">
<button class="btn btn-remove">清空失效商品</button>
</div>
</div>
<div class="total box">
<div class="activity-title">
<h1>已参与活动</h1>
</div>
<div class="activity">
<ul>
<li>【大牌盛宴】下单7折</li>
<li>满¥399免运费</li>
</ul>
</div>
<div class="price-compute">
<p>总计¥1896.60=商品金额¥1986.00-活动金额¥89.40</p>
</div>
</div>
<div class="cart-content normal-good {{#if ordinaryCart}}active{{/if}}">
{{#commonCart}}
{{> cart-content}}
{{/commonCart}}
</div>
<div class="cart-content advance-good {{#if advanceCart}}active{{/if}}">
{{#preSellCart}}
{{> cart-content}}
{{/preSellCart}}
</div>
<div class="cart-content advance-good hide"></div>
<input id="cartType" type="hidden" value="{{cartType}}">
<div class="recommend-for-you box hide">
</div>
<div class="cart-footer">
<div class="check-all">
<i class="iconfont chk"></i>
<p>全选</p>
</div>
<div class="opts edit hide">
<button class="btn btn-gray">移入<br>收藏夹</button>
<button class="btn btn-red">删除</button>
</div>
<div class="opts bill ">
<div class="total">
<p class="price">总计:¥0.00&nbsp;&nbsp;(0件)</p>
<p class="intro">不含运费</p>
</div>
<button class="btn btn-red">结算</button>
</div>
</div>
... ...
... ... @@ -3,78 +3,38 @@
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/22
*/
'use strict';
require('cart/index.page.css')
let testData = require('./data.json');
let $ = require('yoho-jquery');
let hbsTemplate = require('cart/index/index.hbs');
let testData = require('./data.json'),
$ = require('yoho-jquery'),
hbsTemplate = require('cart/index/index.hbs'),
lazyLoad = require('yoho-jquery-lazyload');
let indexObj = {
minStock: 1,
editMode: false,
init() {
let self = this;
$.ajax({
url: '/cart/index/new/data',
type: 'POST',
success: (data) => {
$('.cart-box').html(hbsTemplate(data));
self.refreshPage(data.data);
}
})
self.registerEvent();
self.loadRecommendForYou();
});
require('./index/recommend-for-you').init(self);
},
registerEvent() {
refreshPage(data) {
let self = this;
$('.cart-nav').on('click', 'li', function() {
$('.cart-content').eq($(this).index()).removeClass('hide').siblings('.cart-content').addClass('hide');
$(this).addClass('active').siblings().removeClass('active')
});
$('.more-box>.down-arrow').on('click', function() {
$(this).parent().toggleClass('down')
});
$('.opt>.chk').on('click', function() {
$(this).toggleClass('checked')
});
$('.check-all').on('click', function() {
$(this).find('.chk').hasClass('checked') ? $('.opt>.chk').removeClass('checked') : $('.opt>.chk').addClass('checked');
$(this).find('.chk').toggleClass('checked');
});
$('.cart-good').on('click', '.num-opt .btn', function(e) {
let maxStock = 5;
let minusEl = $(e.delegateTarget).find('.btn-minus');
let plusEl = $(e.delegateTarget).find('.btn-plus');
let goodNum = $(e.delegateTarget).find('.good-num').val();
$(this).hasClass('btn-plus') ? goodNum++ : goodNum--;
if (goodNum < self.minStock) {
console.log('不能小于0')
return;
}
if (goodNum > maxStock) {
console.log('不能大于5')
return;
}
if (goodNum === self.minStock) {
$(minusEl).addClass('disabled');
} else if($(minusEl).hasClass('disabled')) {
$(minusEl).removeClass('disabled');
}
if (goodNum === maxStock) {
$(plusEl).addClass('disabled');
} else if($(plusEl).hasClass('disabled')) {
$(plusEl).removeClass('disabled');
}
$(e.delegateTarget).find('.good-num').val(goodNum);
})
},
loadRecommendForYou() {
if ($('.recommend-for-you').length) {
require('./recommend-for-you-cart');
}
$('.main-wrap').removeClass('edit');
self.editMode = false;
$('.cart-box').html(hbsTemplate(data));
require('./index/cart').init(self);
require('./index/good').init(self);
lazyLoad($('img.lazy'));
}
}
... ...
/**
* 购物车页面操作
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/29
*/
'use strict';
let $ = require('yoho-jquery');
let cartObj = {
init(handle) {
let self = this;
self.handle = handle;
$('.cart-nav').on('click', 'li', function() {
$(this).addClass('active').siblings().removeClass('active');
$(`.${$(this).attr('data-type')}`).addClass('active').siblings('.cart-content').removeClass('active');
});
$('.more-box>.down-arrow').on('click', function() {
$(this).parent().toggleClass('down')
});
$('.nav-btn').on('click', () => {
$('.main-wrap').toggleClass('edit')
if ($('.main-wrap').hasClass('edit')) {
self.handle.editMode = true;
} else {
self.handle.editMode = false;
}
})
}
}
module.exports = cartObj;
\ No newline at end of file
... ...
/**
* 购物车商品操作
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/29
*/
'use strict';
let $ = require('yoho-jquery'),
dialog = require('../../plugin/dialog'),
tip = require('../../plugin/tip'),
chosePanel = require('../chose-panel'),
loading = require('../../plugin/loading');
let goodObj = {
previousEditSkn: 0,
init(handle) {
let self = this;
self.handle = handle;
$('.good-item').on('click', '.num-opt .btn', function(e) {
let goodNumEle = $(e.delegateTarget).find('.good-num');
let minNumber = goodNumEle.data('min');
let maxNumber = goodNumEle.data('max');
let minusEl = $(e.delegateTarget).find('.btn-opt-minus');
let plusEl = $(e.delegateTarget).find('.btn-opt-plus');
let oldGoodNum = $(e.delegateTarget).find('.good-num').val();
let goodNum = oldGoodNum;
$(this).hasClass('btn-opt-plus') ? goodNum++ : goodNum--;
if (goodNum < minNumber) {
if (minNumber === 1) {
tip.show('您选择的数量不能为零~')
} else if(minNumber > 1) {
tip.show(`量贩商品,${minNumber}件起购`)
}
return;
}
if (goodNum > maxNumber) {
tip.show('您选择的数量超过了最大库存量~')
return;
}
if (goodNum === minNumber) {
$(minusEl).addClass('disabled');
} else if($(minusEl).hasClass('disabled')) {
$(minusEl).removeClass('disabled');
}
if (goodNum === maxNumber) {
$(plusEl).addClass('disabled');
} else if($(plusEl).hasClass('disabled')) {
$(plusEl).removeClass('disabled');
}
self.modifyNum($(e.delegateTarget).data('id'), oldGoodNum, goodNum);
$(e.delegateTarget).find('.good-num').val(goodNum);
});
$('.good-item').on('click', '.chk.select', function() {
self.selectGood($(this));
});
$('.good-item').on('click', '.chk.edit', function() {
$(this).toggleClass('checked');
});
$('.check-all').on('click', function() {
if (self.handle.editMode) {
$(this).find('.chk.edit').toggleClass('checked');
if ($(this).find('.chk.edit').hasClass('checked')) {
$('.good-item .chk.edit').addClass('checked');
} else {
$('.good-item .chk.edit').removeClass('checked');
}
} else {
$(this).find('.chk.select').toggleClass('checked');
self.selectGood($('.good-item:not(.low-stocks) .chk.select'), $(this).find('.chk.select').hasClass('checked'));
}
});
$('.btn-del').on('click', function() {
if (!$('.good-item .chk.edit.checked').length) {
tip.show('请至少选择一件商品');
return;
}
self.delGood($('.good-item .chk.edit.checked'));
});
$('.good-item').on('click', '.size-info', function(e) {
let $this = $(this),
skn = $(e.delegateTarget).data('skn');
let id,
count,
canEditNum;
//如果点击的是上次编辑的商品,直接显示chose-pannel
if (skn === self.previousEditSkn) {
chosePanel.show();
return;
}
let isSelected = $(e.delegateTarget).find('.chk.select').hasClass('checked');
id = $(e.delegateTarget).data('id');
count = $(e.delegateTarget).find('.good-num').val();
//加价购或者赠品不能编辑数量
canEditNum = $(e.delegateTarget).find('.flag.gift').length || $(e.delegateTarget).find('.flag.price-gift').length ? false : true;
e.stopPropagation();
loading.showLoadingMask();
$.ajax({
url: '/cart/index/new/goodinfo',
data: {
skn: skn,
buy_num: count
},
type: "POST",
success: function(res) {
self.showEditPannelWithSku(res, id, isSelected, canEditNum);
self.previousEditSkn = skn;
},
error: function() {
loading.hideLoadingMask();
tip.show('网络异常');
},
complete: function() {
loading.hideLoadingMask();
}
});
})
},
selectGood(eles, selectAll) {
let self = this;
let skuData = self.getSelectGoodData(eles, selectAll);
$.ajax({
type: 'post',
url: '/cart/index/new/select',
data: {
skuList: JSON.stringify(skuData)
}
}).then(function(data) {
if (data.code === 200) {
self.handle.refreshPage(data.data);
} else if (data.code === 400) {
tip.show('网络异常');
}
}, function() {
tip.show('网络异常');
});
},
delGood(eles) {
let self = this;
let skuData = self.getSelectGoodData(eles).map(ele => {
delete ele.goods_type;
delete ele.selected;
return ele;
});
$.ajax({
type: 'post',
url: '/cart/index/new/del',
data: {
skuList: JSON.stringify(skuData)
}
}).then(function(data) {
if (data.code === 200) {
self.handle.refreshPage(data.data);
} else if (data.code === 400) {
tip.show('网络异常');
}
}, function() {
tip.show('网络异常');
});
},
getSelectGoodData(eles, selectAll) {
return Array.from(eles.map((i, ele) => {
let $this = $(ele),
$good = $this.closest('.good-item'),
id = $good.data('id'),
promotion = $good.data('promotion');
console.log
let goodInfo = {};
if (!$this.hasClass('checked') && $good.find('.low-stocks').length > 0) {
tip.show('库存不足,无法购买');
return false;
}
goodInfo.goods_type = $('#cartType').val();
if (selectAll != undefined) {
goodInfo.selected = selectAll ? 'Y' : 'N';
} else {
goodInfo.selected = $this.hasClass('checked') ? 'N' : 'Y';
}
goodInfo.product_sku = id;
goodInfo.promotion_id = promotion;
goodInfo.buy_number = $good.find('.good-num').val();
return goodInfo;
}))
},
showEditPannelWithSku (html, id, isSelected, isEditNum) {
if (html.length < 2) {
tip.show('出错啦!');
return false;
}
//删掉页面上原有的pannel
chosePanel.remove();
$(html).appendTo('#mainCart');
chosePanel.init();
chosePanel.setEditModeWithSknId(id, isSelected);
if (!isEditNum) {
chosePanel.disableNumEdit();
}
chosePanel.show();
},
modifyNum (sku, num, newNum) {
$.ajax({
type: 'post',
url: '/cart/index/new/modifyNum',
data: {
sku,
increaseNum: newNum > num ? newNum - num : 0,
decreaseNum: num > newNum ? num - newNum : 0,
}
}).then(function(data) {
if (data.code === 200) {
$(`.good-item[data-id="${sku}"]`).find('.good-num').val(newNum)
} else if (data.code === 400) {
tip.show('网络异常');
}
}, function() {
tip.show('网络异常');
});
}
}
module.exports = goodObj;
\ No newline at end of file
... ...
/**
* 为你优选操作
* @author: feng.chen<feng.chen@yoho.cn>
* @date: 2016/12/29
*/
'use strict';
let $ = require('yoho-jquery');
let recommendObj = {
init(handle) {
let self = this;
self.handle = handle;
if ($('.recommend-for-you').length) {
setTimeout(() => {
require('../recommend-for-you-cart');
}, 0)
}
}
}
module.exports = recommendObj;
\ No newline at end of file
... ...
... ... @@ -21,7 +21,7 @@ $.get('/product/recommend-for-you/cart').then(function(html) {
PRDID.push($(this).data('id'));
});
window.givePoint({
window.givePoint && window.givePoint({
'REC_POSE': 110003,
'PRD_ID': PRDID.join(','),
'PRD_NUM': $('.recommend-for-you .good-info').length,
... ... @@ -32,7 +32,7 @@ $.get('/product/recommend-for-you/cart').then(function(html) {
$recommendForYou.find('.good-info').on('click', 'a', function() {
var index = $(this).closest('.good-info').index() + 1;
window.givePoint({
window.givePoint && window.givePoint({
'REC_POSE': 110003,
'PRD_ID': $(this).closest('.good-info').data('id'),
'PRD_NUM': index,
... ...
.good-item {
display: flex;
width: 100%;
min-height: 246px;
&:last-child {
.good-new-info {
... ... @@ -18,6 +19,14 @@
align-items: center;
justify-content: center;
.select {
display: block;
}
.edit {
display: none;
}
.disable {
background-color: #7f7f7f;
}
... ... @@ -141,7 +150,8 @@
position: relative;
.thumb {
width: 154px;
width: 152px;
min-height: 204px;
}
.flag {
... ... @@ -226,6 +236,7 @@
}
.appear-date {
display: none;
padding: 4px 0px;
float: left;
font-size: 23px;
... ... @@ -246,21 +257,21 @@
}
.edit-box {
width: 240px;
width: 280px;
margin-bottom: 11px;
.num-opt {
height: 64px;
height: 74px;
border: solid 1PX #dfdfdf;
border-radius: 5px 5px 0px 0px;
display: flex;
.btn {
width: 70px;
width: 80px;
display: block;
height: 100%;
text-align: center;
line-height: 64px;
line-height: 74px;
.iconfont {
color: #444444;
... ... @@ -272,7 +283,7 @@
}
}
&.btn-minus {
&.btn-opt-minus {
border-right: 1PX solid #dfdfdf;
.iconfont:before {
... ... @@ -280,7 +291,7 @@
}
}
&.btn-plus {
&.btn-opt-plus {
border-left: 1px solid #dfdfdf;
.iconfont:before {
... ... @@ -290,7 +301,7 @@
}
.good-num {
width: 100px;
width: 120px;
text-align: center;
color: #444444;
font-size: 32px;
... ... @@ -302,8 +313,8 @@
.size-info {
width: 100%;
height: 64px;
line-height: 64px;
height: 74px;
line-height: 74px;
padding-left: 14px;
border: solid 1PX #dfdfdf;
border-top: none;
... ... @@ -321,7 +332,7 @@
.down {
text-align: center;
width: 45px;
width: 55px;
.iconfont {
font-size: 30px;
... ... @@ -335,18 +346,40 @@
}
}
.cart-good {
&.edit {
.info {
padding-top: 0px;
.cart-content {
&.advance-good {
.appear-date {
display: block;
}
}
}
.intro-name {
display: none;
}
.main-wrap.edit {
.cart-content.active {
.normal-box {
.good-item {
.info {
padding-top: 0px;
}
.intro-edit {
display: block;
.opt {
.select {
display: none;
}
.edit {
display: block;
}
}
.intro-name {
display: none;
}
.intro-edit {
display: block;
}
}
}
}
}
\ No newline at end of file
}
... ...
... ... @@ -6,8 +6,21 @@ body {
margin-bottom: 120px;
overflow-x: hidden;
.cart-content {
display: none;
&.active {
display: block;
}
}
.box {
background-color: #fff;
margin-top: 20px;
&.cart-brand:first-child {
margin-top: 0px;
}
}
.cart-nav {
... ... @@ -244,6 +257,45 @@ body {
}
}
.main-wrap {
.nav-btn {
&:before {
content: "编辑";
}
}
}
.main-wrap.edit {
.nav-btn {
&:before {
content: "完成";
}
}
.cart-content.active {
.cart-footer {
.check-all {
.select {
display: none;
}
.edit {
display: block;
}
}
.opts {
&.edit {
display: flex;
}
&.bill {
display: none;
}
}
}
}
}
.cart-footer {
z-index: 99;
background-color: #fff;
... ... @@ -259,6 +311,14 @@ body {
text-align: center;
padding-top: 20px;
.select {
display: block;
}
.edit {
display: none;
}
p {
font-size: 26px;
color: #666;
... ... @@ -272,10 +332,14 @@ body {
display: flex;
justify-content: flex-end;
&.hide {
&.edit {
display: none;
}
&.bill {
display: flex;
}
.btn {
width: 170px;
height: 88px;
... ...
/**
* 购物车处理类
*/
'use strict';
const helpers = global.yoho.helpers;
const _ = require('lodash');
const processData = (data) => {
let cart = data.data;
let result = {};
let ordinaryCount = _.get(cart, 'ordinary_cart_data.shopping_cart_data.goods_count', 0);
let advanceCount = _.get(cart, 'advance_cart_data.shopping_cart_data.goods_count', 0);
let ordinarySoldOut = _.get(cart, 'ordinary_cart_data.sold_out_goods_list', []);
let advanceSoldOut = _.get(cart, 'advance_cart_data.sold_out_goods_list', []);
// 普通购物车和预售购物车都为空
if (ordinaryCount === 0 && advanceCount === 0 && !ordinarySoldOut.length && !advanceSoldOut.length) {
result.isEmptyCart = true;
return result;
}
// 普通购物车空,则显示预售购物车
if (ordinaryCount === 0 && !ordinarySoldOut.length) {
result.cartNav = false;
result.cartType = 'advance';
} // 预售购物车空,则显示普通购物车
else if (advanceCount === 0 && !advanceSoldOut.length) {
result.cartNav = false;
result.cartType = 'ordinary';
} // 以上两个购物车中都有数据, 默认显示普通购物车
else {
result.cartNav = true;
result.cartType = cartType || 'ordinary';
}
result.ordinaryCart = result.cartType === 'ordinary';
result.advanceCart = !result.ordinaryCart;
/* 普通购物车 */
result.commonGoodsCount = ordinaryCount;
result.commonCart = processCartData(cart.ordinary_cart_data, false);
/* 预售购物车 */
result.presellGoodsCount = advanceCount;
result.preSellCart = processCartData(cart.advance_cart_data);
return result;
}
const processCartData = (data, isAdvanceCart) => {
let result = {};
// 购买的可用商品列表
result.goods = _.get(data, 'goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart); });
result.goodPools = _.get(data, 'goods_pool_list', []).map(pool => {
return {
isBrand: pool.pool_type <= 1,
isPromotion: pool.pool_type === 2,
poolTitle: pool.pool_title,
goods: _.get(pool, 'goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart); }),
promotions: _.get(pool, 'promotion_list', []).map(promo => { return formatPromotion(promo); }),
promotionMore: _.get(pool, 'promotion_list', []).length > 1,
sub_pool: _.get(pool, 'sub_pool', []).map(subPool => {
return {
isBrand: subPool.pool_type <= 1,
isPromotion: subPool.pool_type === 0,
goods: _.get(subPool, 'goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart); }),
promotions: _.get(subPool, 'promotion_list', []).map(promo => { return formatPromotion(promo); }),
promotionMore: _.get(pool, 'promotion_list', []).length > 1
}
})
}
})
// 失效商品列表
result.notValidGoods = _.get(data, 'sold_out_goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart, false); });
// 下架的商品列表
result.offShelveGoods = _.get(data, 'off_shelves_goods_list', []).map(good => { return formatCartGoods(good, isAdvanceCart, false); });
// 赠品和加价购商品
if (data.gift_list.length || data.price_gift.length) {
result.freebieOrAdvanceBuy = true;
// 赠品
result.freebie = data.gift_list.map(good => { return formatAdvanceGoods(good); });
result.giftCount = result.freebie.length;
// 加价购
result.advanceBuy = data.price_gift.map(good => { return formatAdvanceGoods(good); });
result.advanceBuyCount = result.advanceBuy.length;
}
// 已参加的活动
if (data.promotion_info && data.promotion_info.length > 0) {
result.promotionInfo = data.promotion_info.map(promotion => {
return {id: promotion.promotion_id, name: promotion.promotion_title};
});
}
//计算正常商品且有库存的总数
let goodCount = _.get(result.goodPools, 'goods', []).filter(good => good.lowStocks === false).length +
_.sum(result.goodPools.map(pool => _.sum(_.get(pool, 'sub_pool', []).map(sub => _.get(sub, 'goods', []).filter(good => good.lowStocks === false).length))));
// 结算数据
result.formulaPrice = data.shopping_cart_data.promotion_formula;
result.count = data.shopping_cart_data.selected_goods_count;
result.isAllSelected = (goodCount === data.shopping_cart_data.selected_goods_count) && (data.shopping_cart_data.selected_goods_count > 0);
result.sumPrice = transPrice(data.shopping_cart_data.last_order_amount);
result.hasNoSaleGoods = result.notValidGoods.length || result.offShelveGoods.length;
return result;
};
const formatPromotion = (promo) => {
return {
status: promo.status,
conditionUnit: promo.condition_unit,
conditionValue: promo.condition_value,
giftGoodsList: _.get(promo, 'gift_goods_List', []).map(gift => { return formatAdvanceGoods(gift); }),
giftPrice: promo.gift_price,
promotionId: promo.promotion_id,
promotionTitle: promo.promotion_title,
promotionType: promo.promotion_type,
alreadyMatch: promo.alreadyMatch,
optTitle: formatPromotionTitle(promo)
};
}
const formatPromotionTitle = (promo) => {
if (promo.status === 0) {
return '去凑单';
}
if (promo.status === 10) {
if (promo.promotion_type === 'Needpaygift') {
return '去换购';
}
if (promo.promotion_type === 'Gift') {
return '领赠品';
}
return ''
}
if (promo.status === 20) {
return '已抢光';
}
if (promo.status === 30) {
return '更换';
}
}
/**
* 格式化加价购和赠品商品
*
* @param array $advanceGoods 加价购商品列表
* @param int $count 计商品件数
* @return array $arr 处理之后的加价购商品数据
*/
const formatAdvanceGoods = (advanceGood, isGift) => {
let result = {};
result.id = advanceGood.product_skn;
result.name = advanceGood.product_name;
result.thumb = advanceGood.goods_images ? helpers.image(advanceGood.goods_images, 120, 160) : '';
result.price = transPrice(advanceGood.last_price);
result.marketPrice = isGift ? '0.00' : transPrice(advanceGood.market_price);
result.count = advanceGood.storage_number;
return result;
};
/**
* 格式化购物车商品
*
* @param array $cartGoods 购物车商品列表
* @param boolean $isValid 是否是可用商品(非失效商品),默认是
* @param bool $isAdvanceCart 是否是预售购物车(和上市期有关)
* @return array 处理之后的购物车商品数据
*/
const formatCartGoods = (goodData, isAdvanceCart, isValid = true) => {
console.log(goodData)
let result = {};
result.id = goodData.product_sku;
result.skn = goodData.product_skn;
result.name = goodData.product_name;
result.thumb = goodData.goods_images ? helpers.image(goodData.goods_images, 120, 160) : '';
result.color = goodData.color_name;
result.size = goodData.size_name;
result.checked = goodData.selected === 'Y';
result.price = transPrice(goodData.last_vip_price);
result.isVipPrice = goodData.sales_price !== goodData.last_vip_price && goodData.discount_tag === 'V';
result.isStudents = goodData.sales_price !== goodData.last_vip_price && goodData.discount_tag === 'S';
result.count = goodData.buy_number;
result.promotion_id = goodData.promotion_id;
result.minNumber = parseInt(goodData.min_buy_number, 10);
result.maxNumber = parseInt(goodData.storage_number, 10);
result.minSelectNum = parseInt(goodData.buy_number, 10) === parseInt(goodData.min_buy_number, 10) || parseInt(goodData.buy_number, 10) === 1;
if (isValid) {
// 库存不足
result.lowStocks = (goodData.buy_number > goodData.storage_number);
} else { // 失效商品
result.inValid = true;
}
// gift=>是否赠品,advanceBuy=>是否加价购,soldOut=>失效商品;
if (!goodData.goods_type) {
result.inValid = true;
}
else if (goodData.goods_type === 'gift' && !goodData.isAdvanceBuy) {
result.isGift = true;
result.salesPrice = transPrice(goodData.sales_price);
result.price = transPrice(goodData.last_price);
}
else if (goodData.goods_type === 'price_gift') {
result.showCheckbox = true;
result.isAdvanceBuy = true;
result.salesPrice = transPrice(goodData.sales_price);
result.price = transPrice(goodData.last_price);
}
else {
result.showCheckbox = true;
}
// 上市期
if (isAdvanceCart && goodData.expect_arrival_time) {
result.appearDate = goodData.expect_arrival_time;
}
// 商品链接
result.link = helpers.urlFormat(`/product/show_${goodData.product_skn}.html`);
return result;
};
const transPrice = (price, isSepcialZero) => {
return (price >= 0 || isSepcialZero) ? parseFloat(price).toFixed(2) : 0;
};
/**
* 处理购物车商品、加价购商品、赠品详情数据
*
* @param array productData 要处理的商品数据
* @param int num 购买数目
* @return array data 处理之后的数据
*/
const procGoodsDetail = (productData, num = undefined) => {
let data = {};
data.name = productData.product_name;
if (_.has(productData, 'special_price')) { // 加价购或者赠品的销售价字段
data.price = productData.format_market_price;
data.salePrice = productData.format_sales_price;
}
else { // 购物车商品的销售价字段
data.price = productData.market_price > productData.sales_price ? productData.format_market_price : false;
data.salePrice = '¥' + transPrice(productData.sales_price);
}
if (_.has(productData, 'storage_sum')) {
data.storage = productData.storage_sum;
}
data.num = 1;
if (num) {
data.num = num;
}
// 商品选择
if (_.has(productData, 'goods_list')) {
goodsList = productData.goods_list;
let sizeName = '',
colors = [],
colorList = [],
oneColor = [],
sizes = [],
oneSize = [],
sizeList = [],
allSizeList = [], // 所有尺码列表
thumbImageList = [],
colorNum = 0,
totalStorageNum = 0, // 总库存数
colorStorageGroup = []; // 颜色分组的库存总数集合, 多个之间用/分隔
productData.goods_list.forEach(good => {
colorNum = 0;
sizeName = '';
// 商品的尺码列表
colorStorageGroup[good.product_skc] = [];
if (_.has(good, 'size_list')) {
// 尺码
good.size_list.forEach(size => {
sizeName = size.size_name;
oneSize = [];
oneSize.id = size.size_id;
oneSize.skuId = size.product_sku;
oneSize.goodsId = good.goods_id;
oneSize.colorId = good.color_id;
oneSize.name = sizeName;
oneSize.sizeNum = parseInt(size.storage_number, 10);
sizeList[good.product_skc].push(oneSize);
// 所有尺码列表,赋值用于前端展示默认尺码的时候 判断出没有库存则显示灰色
allSizeList[sizeName] = !allSizeList[sizeName].storage ? {storage:size.storage_number, id: size.size_id} : allSizeList[sizeName];
colorNum += parseInt(size.storage_number, 10);
colorStorageGroup[good.product_skc][size.size_name] = parseInt(size.storage_number, 10);
})
// 颜色分组
oneColor = [];
oneColor.id = good.color_id;
oneColor.skcId = good.product_skc;
oneColor.name = good.color_name;
oneColor.goodsName = productData.product_name;
oneColor.colorNum = colorNum;
colorList.push(oneColor);
}
// 缩略图
thumbImageList.push({
img: helpers.image(good.color_image, 60, 60)
});
// 商品库存总数
totalStorageNum += colorNum;
})
// 遍历所有尺码,构建颜色显示数据
i = 1;
_.forEach(allSizeList, (value, sizeName) => {
// 默认尺码
sizes[0].size.push({
name: sizeName, // 尺码名称
sizeNum: value.storage, // 是否有库存 (false:表示没有库存,true:表示有库存)
id: value.id,
})
// 各个颜色的尺码, 每行显示一个尺码对应的颜色
colorList.forEach(colorArr => {
colorArr.colorNum = _.has(colorStorageGroup, `${colorArr.skcId}.${sizeName}`) ? parseInt(colorStorageGroup[colorArr.skcId][sizeName], 10) : 0;
colors[i].color.push(colorArr);
})
colors[i].id = value.id;
++i;
})
// 遍历所有颜色, 构建尺码显示数据
i = 1;
colorList.forEach(value => {
// 各个尺码的颜色,每行显示一个颜色的对应尺码
sizes[i].size = sizeList[value.skcId];
sizes[i].colorId = value.skcId;
// 默认颜色
colors[0].color.push(value);
++i;
})
console.log(colors)//TODO
// ksort(colors, SORT_NUMERIC);
data.thumbs = thumbImageList;
data.colors = colors;
data.sizes = sizes;
data.totalNum = totalStorageNum;
}
return data;
}
module.exports = {
processData,
procGoodsDetail
}
\ No newline at end of file
... ...