Authored by htoooth

Merge remote-tracking branch 'origin/release/5.4.1' into release/5.4.1

... ... @@ -54,6 +54,8 @@ if (config.zookeeperServer) {
require('yoho-zookeeper')(config.zookeeperServer, 'pc', app.locals.pc = {}, global.yoho.cache);
}
app.enable('trust proxy');
// 请求限制中间件
app.use(require('./doraemon/middleware/limiter'));
... ...
... ... @@ -7,6 +7,7 @@
const _ = require('lodash');
const co = require('bluebird').coroutine;
const logger = global.yoho.logger;
const yohoHelpers = global.yoho.helpers;
const service = require('../models/cart-service');
const helper = require('../models/cart-helper');
const ghelper = require('../../guang/models/guang-helper');
... ... @@ -97,6 +98,35 @@ const miniCart = (req, res, next) => {
};
/**
* 首页迷你购物车删除数据信息
* @param req
* @param res
* @param next
*/
const delCartGoods = (req, res, next) => {
let uid = req.user.uid;
let shoppingKey = helper.getShoppingKeyByCookie(req);
let productSku = req.query.product_sku;
let buyNumber = req.query.product_num || 1;
let callback = req.query.callback;
let skuList = {};
skuList[productSku] = parseInt(buyNumber); //eslint-disable-line
service.removeFromCart(uid, shoppingKey, JSON.stringify(skuList))
.then(ret => {
if (ret && ret.code === 200 && _.has(ret, 'data.goods_count')) {
ret.data.total_goods_num = ret.data.goods_count;
return res.send(callback + '(' + JSON.stringify(ret) + ')');
} else {
return res.send(callback + '(' + JSON.stringify(ret) + ')');
}
})
.catch(next);
};
/**
* 我的购物车
*/
const cart = (req, res, next) => {
... ... @@ -105,6 +135,11 @@ const cart = (req, res, next) => {
let shoppingKey = helper.getShoppingKeyByCookie(req);
let cartDelList = req.cookies['cart-del-list'];
let isNewCart = _.get(req.app.locals.pc, 'pay.oldCart', false);
if (isNewCart) {
return res.redirect(yohoHelpers.urlFormat('/shopping/cart'));
}
if (cartDelList) {
res.cookie('cart-del-list', '', {
domain: '.yohobuy.com',
... ... @@ -435,5 +470,6 @@ module.exports = {
swapGift,
queryUserPromotionGift,
getCoupons,
miniCart
miniCart,
delCartGoods
};
... ...
... ... @@ -44,6 +44,7 @@ const compute = (req, res, next) => {
};
const submit = (req, res, next) => {
let remoteIp = req.ip;
let uid = req.user.uid;
let params = req.body;
... ... @@ -51,7 +52,7 @@ const submit = (req, res, next) => {
return next();
}
easypay.easypayOrderSubmit(uid, 'ordinary', params).then(result => {
easypay.easypayOrderSubmit(uid, 'ordinary', params, remoteIp).then(result => {
res.json(result);
}).catch(next);
};
... ...
... ... @@ -27,6 +27,11 @@ const index = (req, res, next) => {
stepper: stepper
});
// 预售购物车不支持使用优惠券
if (req.query.type === '2') {
result.notUseCoupon = true;
}
res.render('order-ensure2016', {
title: '填写订单 | ' + (res.locals.title || ''),
page: 'ensure',
... ... @@ -57,6 +62,7 @@ const compute = (req, res, next) => {
const submit = (req, res, next) => {
let cartType = req.body.cartType === '2' ? 'advance' : 'ordinary';
let uid = req.user.uid;
let remoteIp = req.ip;
if (!req.body.addressId) {
res.send({
... ... @@ -109,7 +115,7 @@ const submit = (req, res, next) => {
userAgent: userAgent
});
oeModel.submit(uid, cartType, req.body).then(data => {
oeModel.submit(uid, cartType, req.body, remoteIp).then(data => {
if (data && data.code === 200 && unionKey) {
data.data.unionKey = {
client_id: unionInfo.client_id
... ...
... ... @@ -105,11 +105,10 @@ const selectGoods = (uid, sku, shoppingKey /* , hasPromotion*/) => {
* @param bool $hasPromotion 是否有促销ID
* @return array 接口返回的数据
*/
const removeFromCart = (uid, shoppingKey, skuList /* , hasPromotion*/) =>{
const removeFromCart = (uid, shoppingKey, skuList, hasPromotion) =>{
let param = {
// method: hasPromotion ? 'app.Shopping.removeAndCart' : 'app.Shopping.remove',
method: 'app.Shopping.removeAndQryCart',
method: hasPromotion ? 'app.Shopping.removeAndQryCart' : 'app.Shopping.remove',
product_sku_list: skuList
};
... ... @@ -346,13 +345,13 @@ const swapGift = (uid, shoppingKey, promotionId, newSkn, newSku) => {
/**
* 查询所有可选的赠品或者加价购活动下的商品
* @param promotionId
* @param promotionId array
* @returns {*}
*/
const queryPromotionGift = (promotionId) => {
const queryPromotionGift = (promotionIds) => {
let param = {
method: 'app.Shopping.queryPromotionGift',
promotion_id: promotionId
method: 'app.Shopping.queryPromotionGifts',
promotion_ids: promotionIds
};
return api.get('', param);
... ...
... ... @@ -139,6 +139,10 @@ const formatCartGoods = (cartGoods, isAdvanceCart, inValid, isOffShelves, analys
if (it.min_buy_number) {
goods.minBuyNumber = Number(it.min_buy_number);
if(goods.minBuyNumber > 1) {
goods.tipMessage = goods.minBuyNumber + '件起购';
}
}
// 已下架
... ... @@ -422,7 +426,7 @@ const formatPromotion = (it, selectedGiftsList) => {
tipTxt = '<span style=\'color:#ff575c\'>' + tipTxt + '</span>';
info.promotionTitle = '还差' + tipTxt + '满足&nbsp;&nbsp;&nbsp;' + info.promotionTitle;
} else if (info.isReach && !info.isSelected) {
} else if (info.isReach) {
info.promotionTitle = '已满足&nbsp;&nbsp;&nbsp;' + info.promotionTitle;
}
... ... @@ -521,7 +525,7 @@ const formatCart = (cartDataRet, uid, shoppingKey, cartDelList) => {
// 未登录
if (!uid) {
result.loginUrl = helpers.urlFormat('/signin.html', {
refer: helpers.urlFormat('/shopping/cart')
refer: helpers.urlFormat('/cart/cart')
});
}
... ...
... ... @@ -430,144 +430,8 @@ const getCoupons = (uid) => api.get('', {
* @returns {*}
*/
const getCartData = (uid, shoppingKey, cartDelList) => {
let analysisData = {
ids: [],
criteo: []
}; // 存放分析用的数据
return co(function * () {
let result = {
isEmpty: false,
isLogin: !!uid,
searchUrl: helpers.urlFormat('', null, 'search'), // 搜索链接(再逛逛)
listUrl: helpers.urlFormat('', null, 'list'),
viewOrderUrl: helpers.urlFormat('/home/orders', {
t: new Date().getTime()
})
};
// 未登录
if (!uid) {
result.loginUrl = helpers.urlFormat('/signin.html', {
refer: helpers.urlFormat('/shopping/cart')
});
}
// 调用接口,获取购物车数据
let cartDataRet = yield cartApi.cartData(uid, shoppingKey);
let cartData = cartDataRet && cartDataRet.data;
let advCartData = _.get(cartData, 'advance_cart_data');
let ordCartData = _.get(cartData, 'ordinary_cart_data');
// 接口异常时,购物车置为空
if (!cartData) {
result.isEmpty = true;
// UdpLog::info('【购物车】校验参数传递auth', 'uid:' . $uid . 'shoppingKey:' . $shoppingKey);
return result;
}
result.advanceCart = {
// 未参加活动的商品
// goodsList: chelper.formatCartGoods(_.get(advCartData, 'goods_list'), true, false, false, analysisData),
pools: chelper.formatPromotionPools(_.get(advCartData, 'goods_pool_list'), null, true),
offShelves: chelper.formatOffShelves(_.get(advCartData, 'off_shelves_goods_list'), true, analysisData),
soldOuts: chelper.formatSoldOuts(_.get(advCartData, 'sold_out_goods_list'), true, analysisData),
promotionInfos: chelper.formatPromotionInfos(_.get(advCartData, 'promotion_info')),
stat: chelper.formatShoppingCartData(_.get(advCartData, 'shopping_cart_data')),
ensureUrl: helpers.urlFormat('/cart/ensure', {
type: 2
})
};
let giftsList = chelper.formatPriceGifts(_.get(ordCartData, 'gift_list'));
let priceGifts = chelper.formatPriceGifts(_.get(ordCartData, 'price_gift'));
let goodsList = chelper.formatCartGoods(_.get(ordCartData, 'goods_list'), false, false, false, analysisData);
result.ordinaryCart = {
// 全场可选的赠品
gifts: giftsList, // chelper.formatGifts(_.get(ordCartData, 'gift_list')),
// 全场可选的加价购商品列表
priceGifts: priceGifts, // chelper.formatPriceGifts(_.get(ordCartData, 'price_gift')),
// 已选择的全场加价购和赠品
goodsList: goodsList,
pools: chelper.formatPromotionPools(_.get(ordCartData, 'goods_pool_list'), goodsList),
offShelves: chelper.formatOffShelves(_.get(ordCartData, 'off_shelves_goods_list'), false, analysisData),
soldOuts: chelper.formatSoldOuts(_.get(ordCartData, 'sold_out_goods_list'), false, analysisData),
promotionInfos: chelper.formatPromotionInfos(_.get(ordCartData, 'promotion_info'), goodsList),
stat: chelper.formatShoppingCartData(_.get(ordCartData, 'shopping_cart_data')),
ensureUrl: helpers.urlFormat('/cart/ensure')
};
let advStat = result.advanceCart.stat;
let ordStat = result.ordinaryCart.stat;
// 为空
if (!_.get(advStat, 'goodsCount', 0)) {
result.advanceCart = false;
}
if (!_.get(ordStat, 'goodsCount', 0)) {
result.ordinaryCart = false;
}
// promotionInfos, gifts, priceGifts 放一起展示
let hasGifts = result.ordinaryCart.gifts && result.ordinaryCart.gifts.length;
let hasPrices = result.ordinaryCart.priceGifts && result.ordinaryCart.priceGifts.length;
let hasPromo = result.ordinaryCart.promotionInfos && result.ordinaryCart.promotionInfos.length;
if (result.ordinaryCart) {
result.ordinaryCart.hasGlobalBlock = hasGifts || hasPrices || hasPromo;
}
result.stat = {
orderAmount: (parseFloat(_.get(advStat, 'orderAmount', 0)) + parseFloat(_.get(ordStat, 'orderAmount', 0))).toFixed(2),
discountAmount: (parseFloat(_.get(advStat, 'discountAmount', 0)) + parseFloat(_.get(ordStat, 'discountAmount', 0))).toFixed(2),
lastOrderAmount: (parseFloat(_.get(advStat, 'lastOrderAmount', 0)) + parseFloat(_.get(ordStat, 'lastOrderAmount', 0))).toFixed(2),
gainYohoCoin: parseFloat(_.get(advStat, 'gainYohoCoin', 0)) + parseFloat(_.get(ordStat, 'gainYohoCoin', 0)),
goodsCount: _.get(advStat, 'goodsCount', 0) + _.get(ordStat, 'goodsCount', 0),
selectedGoodsCount: _.get(advStat, 'selectedGoodsCount', 0) + _.get(ordStat, 'selectedGoodsCount', 0)
};
/* 移除的商品列表 */
if (cartDelList) {
try {
result.deleteShop = JSON.parse(cartDelList);
} catch (err) {
logger.error(err);
}
}
// 普通购物车和预售购物车都为空
/* if (ordinaryCount === 0 && advanceCount === 0 && ordinarySoldOut && advanceSoldOut) {
result.isEmpty = true;
return result;
}*/
// 预售和普通都有商品
if (result.advanceCart && _.get(result, 'advanceCart.stat.selectedGoodsCount') > 0 &&
result.ordinaryCart && _.get(result, 'ordinaryCart.stat.selectedGoodsCount') > 0) {
result.stat.mix = true;
} else if (result.advanceCart && _.get(result, 'advanceCart.stat.selectedGoodsCount') > 0) {
result.stat.ensureUrl = result.advanceCart.ensureUrl;
} else if (result.ordinaryCart && _.get(result, 'ordinaryCart.stat.selectedGoodsCount') > 0) {
result.stat.ensureUrl = result.ordinaryCart.ensureUrl;
}
return result;
})().then(ret => {
// 增加第三方分析用的数据
// ret['ids'] = empty($analysisData['ids']) ? '' : implode(',', $analysisData['ids']);
// $result['criteo'] = empty($analysisData['criteo']) ? "''" : json_encode($analysisData['criteo']);
return Object.assign(ret, {
ids: _.isArray(analysisData.ids) ? analysisData.ids.join(',') : '',
criteo: analysisData.criteo || ''
// empty($analysisData['criteo']) ? "''" : json_encode($analysisData['criteo']);
});
return cartApi.cartData(uid, shoppingKey).then(cartDataRet => {
return chelper.formatCart(cartDataRet, uid, shoppingKey, cartDelList);
});
};
... ... @@ -730,6 +594,10 @@ const removeFromCart = (uid, shoppingKey, skuList, hasPromotion, cartDelList) =>
let ret = yield cartApi.removeFromCart(uid, shoppingKey, skuList, hasPromotion);
if (!hasPromotion) {
return ret;
}
if (ret && ret.code) {
result = {
code: ret.code,
... ... @@ -766,7 +634,7 @@ const addToFav = (uid, skuList, hasPromotion, cartDelList) => {
message: '请先登录!',
data: {
url: helpers.urlFormat('/signin.html', {
refer: helpers.urlFormat('/shopping/cart')
refer: helpers.urlFormat('/cart/cart')
})
}
};
... ... @@ -1056,7 +924,14 @@ const queryUserPromotionGift = (promotionId, uid, shoppingKey) => {
let currentProduct = null; // 默认展示第一个商品
if (promotionGifts && promotionGifts.code === 200) {
promotionGifts.data = chelper.formatPriceGiftOne(promotionGifts.data);
// chelper.formatPriceGiftOne(promotionGifts.data);
let promotionList = chelper.formatPriceGifts(_.get(promotionGifts, 'data.arrays'));
if (promotionList && promotionList.length >= 0) {
promotionGifts.data = promotionList[0];
} else {
promotionGifts.data = {};
}
if (promotionGifts.data.goodsList && promotionGifts.data.goodsList.length) {
currentProduct = promotionGifts.data.goodsList[0];
... ...
... ... @@ -109,7 +109,7 @@ const getEasypayComputeAsync = (uid, cartType, paymentType, deliveryWay, other)
* @param couponCode [string] 优惠券码
* @param printPrice [string] 是否打印价格
*/
const easypayOrderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, paymentType, paymentId, printPrice, other) => { // eslint-disable-line
const easypayOrderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, paymentType, paymentId, printPrice, other, remoteIp) => { // eslint-disable-line
let param = {
method: 'app.Shopping.easySubmit',
uid: uid,
... ... @@ -172,7 +172,9 @@ const easypayOrderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliver
}
}
return api.get('', param);
return api.get('', param, {
headers: {'X-Forwarded-For': remoteIp || ''}
});
};
module.exports = {
... ...
... ... @@ -190,12 +190,12 @@ const getOrderComputeData = (uid, cartType, params) => {
};
// 订单提交
const easypayOrderSubmit = (uid, cartType, params) => {
const easypayOrderSubmit = (uid, cartType, params, remoteIp) => {
params.addressId = crypto.decrypt('', params.addressId);
params.productSkuList = _getLimitProductData(params);
return easypayApi.easypayOrderSubmitAsync(uid, cartType, params.addressId, params.deliveryTime,
params.deliveryWay, params.paymentType, params.paymentId, params.printPrice, params).then(result => {
params.deliveryWay, params.paymentType, params.paymentId, params.printPrice, params, remoteIp).then(result => {
if (result.code === 200) {
let d = result.data;
... ...
... ... @@ -76,9 +76,7 @@ const getOrderComputeAsync = (uid, cartType, paymentType, deliveryWay, other) =>
Object.assign(param, {
coupon_code: other.couponCode
});
}
if (other.promotionCode) {
} else if (other.promotionCode) {
Object.assign(param, {
promotion_code: other.promotionCode
});
... ... @@ -107,7 +105,7 @@ const getOrderComputeAsync = (uid, cartType, paymentType, deliveryWay, other) =>
* @param couponCode [string] 优惠券码
* @param printPrice [string] 是否打印价格
*/
const orderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, paymentType, paymentId, printPrice, other) => { // eslint-disable-line
const orderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, paymentType, paymentId, printPrice, other, remoteIp) => { // eslint-disable-line
let param = {
method: 'app.Shopping.submit',
uid: uid,
... ... @@ -157,6 +155,10 @@ const orderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, p
Object.assign(param, {
coupon_code: other.couponCode
});
} else if (other.promotionCode) {
Object.assign(param, {
promotion_code: other.promotionCode
});
}
if (other.continueBuy) {
... ... @@ -172,7 +174,12 @@ const orderSubmitAsync = (uid, cartType, addressId, deliveryTime, deliveryWay, p
});
}
return api.get('', param);
return api.get('', param, {
headers: {
'X-Forwarded-For': remoteIp || '',
'User-Agent': other.userAgent || ''
}
});
};
module.exports = {
... ...
... ... @@ -56,17 +56,28 @@ const handleUseYohoCoin = (info) => {
const handlePaymentInfo = (d, address) => {
let resData = {};
let defAddrId = _.get(d, 'delivery_address.address_id', 0);
_.forEach(address, dd => {
if (dd.is_default === 'Y') {
dd.default = true;
}
// 三级地址默认4级显示全部
if (dd.area_code && dd.area_code.length === 6) {
dd.area += ' 全部';
}
// 地址加密
let id = dd.address_id;
dd.id = crypto.encryption('', `${id}`);
// 设置默认选中地址
if (id === defAddrId) {
dd.selected = true;
}
// 删除uid,用户数据保密
_.unset(dd, 'address_id');
_.unset(dd, 'uid');
... ...
... ... @@ -65,13 +65,13 @@ const compute = (uid, cartType, pa) => {
};
// 订单提交
const submit = (uid, cartType, p) => {
const submit = (uid, cartType, p, remoteIp) => {
if (p.addressId) {
p.addressId = crypto.decrypt('', `${p.addressId}`);
}
return ensureApi.orderSubmitAsync(uid, cartType, p.addressId, p.deliveryTime,
p.deliveryWay, p.paymentType, p.paymentId, p.printPrice, p).then(result => {
p.deliveryWay, p.paymentType, p.paymentId, p.printPrice, p, remoteIp).then(result => {
if (result.code === 200) {
let d = result.data;
... ...
... ... @@ -47,5 +47,6 @@ router.get('/cart/queryPromotionGift', cart.queryUserPromotionGift);
router.get('/cart/togetherProduct', cart.getTogetherProduct);
router.get('/cart/recommendProduct', cart.getRecommendProductAction);
router.get('/cart/minicart', cart.miniCart);
router.get('/cart/del', cart.delCartGoods);
module.exports = router;
... ...
... ... @@ -8,7 +8,7 @@
<div class="block-title">收货信息<span id="new-address-btn" class="right">新增收货地址 <i>+</i></span></div>
<div id="addr-list" class="addr-list clearfix">
{{# deliveryAddress}}
<div class="addr-item{{#isY is_default}} addr-default addr-select{{/isY}}" data-id="{{id}}" data-consignee="{{consignee}}" data-mobile="{{mobile}}" data-phone="{{phone}}" data-area="{{area}}" data-code="{{area_code}}" data-address="{{address}}"{{#isY is_default}} data-default="1"{{/isY}}{{#isY is_delivery}} data-delivery="1"{{/isY}}{{#isY is_cash_delivery}} data-cashdelivery="1"{{/isY}}>
<div class="addr-item{{#isY is_default}} addr-default{{/isY}}{{#if selected}} addr-select{{/if}}" data-id="{{id}}" data-consignee="{{consignee}}" data-mobile="{{mobile}}" data-phone="{{phone}}" data-area="{{area}}" data-code="{{area_code}}" data-address="{{address}}"{{#isY is_default}} data-default="1"{{/isY}}{{#isY is_delivery}} data-delivery="1"{{/isY}}{{#isY is_cash_delivery}} data-cashdelivery="1"{{/isY}}>
<p class="name">
{{consignee}}
<span class="right">{{mobile}}</span>
... ... @@ -166,52 +166,58 @@
{{# shoppingCartData}}
<div class="extra-wrap">
<dl>
<dt id="use-coupons" class="use-coupons">
<span class="locker-switch"></span>使用优惠券/优惠码
<div class="tip-box right">
<p>优惠码不可与优惠券同时使用</p>
<p class="coupon-err-tip"></p>
</div>
</dt>
<dd>
<div class="coupon-opt-title">
<label class="radio-btn on">使用优惠券</label>
<label class="radio-btn code">使用优惠码</label>
<span class="ticket-use-tip hide">
已成功使用<em class="red num">1</em>张优惠券,<em class="red price"></em>
<b class="cancel-use-ticket">取消使用</b>
</span>
<div class="opt-area right">
<input type="text" class="coupon-code">
<label class="sure-use-code fw300">直接使用</label>
<label class="sure-use-ticket fw300">确定</label>
{{#unless ../notUseCoupon}}
<dt id="use-coupons" class="use-coupons">
<span class="locker-switch"></span>使用优惠券/优惠码
<div class="tip-box right">
<p>优惠码不可与优惠券同时使用</p>
<p class="coupon-err-tip"></p>
</div>
</div>
<div class="coupon-list-wrap"></div>
</dd>
<dt><span class="locker-switch"></span>使用YOHO币</dt>
<dd id="yoho-coin-box" class="yoho-coin-box" data-coin="{{usedCoinNum}}" data-max={{canUseCoinNum}}>
<div class="outer-view">
<p class="coin-err-tip">{{coinErrorTip}}</p>
<p>有货币满<span class="red">{{yoho_coin_pay_rule.num_limit}}</span>个即可使用,每次使用有货币为<span class="red">{{yoho_coin_pay_rule.num_limit}}</span>的整数倍</p>
<i class="help-icon"></i>
<div class="coin-tip-help">
<p>有货币使用提示:</p>
<p>
1.订单金额大于20元(含20元)<br>
2.有货币数量大于{{yoho_coin_pay_rule.num_limit}}个(含{{yoho_coin_pay_rule.num_limit}}个) <br>
3.有货币支付上限为每笔订单应付金额的{{yoho_coin_pay_rule.max_pay_rate_desc}}
</p>
<p class="rs-text">备注:使用有货币数量为{{yoho_coin_pay_rule.num_limit}}的整数倍,100有货币抵1元</p>
</dt>
<dd>
<div class="coupon-opt-title">
<label class="radio-btn on">使用优惠券</label>
<label class="radio-btn code">使用优惠码</label>
<span class="ticket-use-tip hide">
已成功使用<em class="red num">1</em>张优惠券,<em class="red price"></em>
<b class="cancel-use-ticket">取消使用</b>
</span>
<div class="opt-area right">
<input type="text" class="coupon-code">
<label class="sure-use-code fw300">直接使用</label>
<label class="sure-use-ticket fw300">确定</label>
</div>
</div>
</div>
<div class="coin-main-view">
<p>本次使用有货币<span class="red">{{canUseCoinNum}}</span>个,抵扣 <span class="red">¥{{yoho_coin}}</span></p>
<p class="grey fw300">您当前共有有货币 <span class="red">{{total_yoho_coin_num}}</span> 个,可用 <span class="red">{{canUseCoinNum}}</span></p>
<label class="coin-cancel-btn fw300">取消使用</label>
<label class="coin-use-btn">确定</label>
</div>
</dd>
<div class="coupon-list-wrap"></div>
</dd>
{{/unless}}
{{#unless ../notUseYohoCoin}}
<dt><span class="locker-switch"></span>使用YOHO币</dt>
<dd id="yoho-coin-box" class="yoho-coin-box" data-coin="{{usedCoinNum}}" data-max={{canUseCoinNum}} data-total="{{total_yoho_coin_num}}">
<div class="outer-view">
<p class="coin-err-tip">{{coinErrorTip}}</p>
<p>有货币满<span class="red">{{yoho_coin_pay_rule.num_limit}}</span>个即可使用,每次使用有货币为<span class="red">{{yoho_coin_pay_rule.num_limit}}</span>的整数倍</p>
<i class="help-icon"></i>
<div class="coin-tip-help">
<p>有货币使用提示:</p>
<p>
1.订单金额大于20元(含20元)<br>
2.有货币数量大于{{yoho_coin_pay_rule.num_limit}}个(含{{yoho_coin_pay_rule.num_limit}}个) <br>
3.有货币支付上限为每笔订单应付金额的{{yoho_coin_pay_rule.max_pay_rate_desc}}
</p>
<p class="rs-text">备注:使用有货币数量为{{yoho_coin_pay_rule.num_limit}}的整数倍,100有货币抵1元</p>
</div>
</div>
<div class="coin-main-view">
<p>本次使用有货币<span class="red">{{canUseCoinNum}}</span>个,抵扣 <span class="red">¥{{yoho_coin}}</span></p>
<p class="grey fw300">您当前共有有货币 <span class="red">{{total_yoho_coin_num}}</span> 个,可用 <span class="red">{{canUseCoinNum}}</span></p>
<label class="coin-cancel-btn fw300">取消使用</label>
<label class="coin-use-btn">确定</label>
</div>
</dd>
{{/unless}}
{{#if redEnvelopes}}
<dt><span class="locker-switch"></span>使用红包</dt>
<dd id="red-packet-box" class="red-packet-box">
... ... @@ -242,7 +248,7 @@
{{#each promotion_formula_list}}
<li class="promotion-item">
{{#if @first}}
<a class="gain-coin-tip" href="/help/?category_id=87" target="_blank"></a>
<a class="gain-coin-tip" href="/help/detail?id=105&contId=233" target="_blank"></a>
<span class="back-coin">共返YOHO币:{{../gain_yoho_coin}}</span>
<span class="total-num"><i>{{../selected_goods_count}}</i>件商品</span>
{{/if}}
... ...
... ... @@ -75,6 +75,7 @@
</script>
<script id="invoice-chose-tpl" type="text/html">
<div class="invoice-close"><i class="iconfont">&#xe60d;</i></div>
<p class="invoice-header">发票信息</p>
<ul class="invoice-type">
<li class="el-invoice focus">电子发票</li>
... ... @@ -83,7 +84,7 @@
<div class="invoice-content el-content">
<p class="el-tip">
※ 电子发票是税务局认可的有效凭证,其法律效力、基本用途及使用规定同纸质发票,如需纸质发票可自行下载打印。<br>
<a href="//www.yohobuy.com/help?category_id=99">什么是电子发票?</a>
<a href="/help/detail?id=33&contId=139" target="_blank">什么是电子发票?</a>
</p>
<ul>
... ... @@ -196,7 +197,7 @@
\{{#each promotion_formula_list}}
<li class="promotion-item">
\{{#if @first}}
<a class="gain-coin-tip" href="/help/?category_id=87" target="_blank"></a>
<a class="gain-coin-tip" href="/help/detail?id=105&contId=233" target="_blank"></a>
<span class="back-coin">共返YOHO币:\{{../gain_yoho_coin}}个</span>
<span class="total-num"><i>\{{../selected_goods_count}}</i>件商品</span>
\{{/if}}
... ...
... ... @@ -25,11 +25,14 @@
let addressList = addressData.data;
for (let i = 0; i < addressList.length; i++) {
let phone = _.get(addressList[i], 'phone') === 'null' ? '' : addressList[i].phone;
let zipCode = _.get(addressList[i], 'zip_code') === 'null' ? '' : addressList[i].zip_code;
result.push({
id: addressList[i].address_id || '',
addressee: addressList[i].consignee || '',
address: addressList[i].area + addressList[i].address + (addressList[i].zip_code || ''),
phone: (addressList[i].mobile || '') + (addressList[i].phone || ''),
address: addressList[i].area + addressList[i].address + ' ' + zipCode,
phone: (addressList[i].mobile || '') + ' ' + phone,
isPreferred: addressList[i].is_default === 'Y' ? 'true' : ''// 默认地址
});
}
... ... @@ -57,7 +60,6 @@
}, {
isSelect: true,
labelText: '省份:',
tips: '注:标"*"的为支持货到付款的地区',
tipsUrl: '/help/?category_id=48',
selects: [{
key: 'province'
... ... @@ -92,11 +94,6 @@
labelText: '手机号码:',
value: '',
tips: '填写手机号便于接收发货和收货通知'
}, {
key: 'email',
labelText: '电子邮件:',
value: '',
tips: '用来接收订单提醒邮件,便于您及时了解订单状态'
}]
};
... ... @@ -122,6 +119,10 @@
for (let i = 0; i < addressList.length; i++) {
if (addressList[i].address_id === id) {
addressList[i].phone = _.get(addressList[i], 'phone') === 'null' ?
'' : addressList[i].phone;
addressList[i].zip_code = _.get(addressList[i], 'zip_code') === 'null' ?
'' : addressList[i].zip_code;
respData.data = addressList[i];
break;
}
... ... @@ -145,7 +146,6 @@
address: _.trim(params.address || ''),
area_code: _.trim(params.streets || ''),
consignee: _.trim(params.addressName || ''),
email: _.trim(params.email || ''),
id: params.addrId === '0' ? null : params.addrId,
mobile: _.trim(params.mobile || ''),
phone: _.trim(params.phone || ''),
... ... @@ -154,11 +154,11 @@
if (query.uid === '' || query.address === '' ||
query.area_code.length < 6 || query.consignee === '' ||
query.email === '' || query.zip_code === '') {
query.zip_code === '') {
return {
code: 400,
message: '缺失必填项'
message: '请填写完整的省市区信息'
};
}
let respData = yield addressApi.saveAddressData(query);
... ...
... ... @@ -63,6 +63,7 @@
<label for="{{key}}">{{labelText}}</label>
<input type="text" name='{{key}}' id="{{key}}" class="input-1 width-150" value="{{value}}">
{{/if}}
{{#if tips}}
<span class="form-prompt form-info" id="{{key}}-tip">
{{tips}}
{{#isSelect}}
... ... @@ -71,6 +72,7 @@
<!--</a>-->
{{/isSelect}}
</span>
{{/if}}
</div>
{{/each}}
</div>
... ...
... ... @@ -1107,7 +1107,7 @@ const _detailDataPkg = (origin, uid, vipLevel, cookies) => {
result.maxSortId = propOrigin('maxSortId', '');
result.smallSortId = propOrigin('smallSortId', '');
result.goCartUrl = helpers.urlFormat('/shopping/cart');
result.goCartUrl = helpers.urlFormat('/cart/cart');
// 定金预售
result.deposit = propOrigin('is_deposit_advance', 'N');
... ...
... ... @@ -13,7 +13,7 @@ var _gaq = _gaq || [];
(function() {
_gaq.push(['_setAccount', 'UA-48997038-32']);
_gaq.push(['_trackPageview']);
var ga = document.createElement('script');
var ga = document.createElement('script');
ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
... ... @@ -60,3 +60,19 @@ var _gaq = _gaq || [];
s.parentNode.insertBefore(bp, s);
})();
</script>
<!-- 品众统计 -->
<script type='text/javascript'>
var _fxcmd=_fxcmd||[];
_fxcmd.sid='bb3b16fa1106a6ab8619da0095755f32';
_fxcmd.trackAll=false;
// 参数配置(可选)...
// 追踪配置(可选)...
(function () {
var _pzfx=document['createElement']('script');
_pzfx.type='text/javascript';
_pzfx.async=true;
_pzfx.src='//static.w3t.cn/fx/1/1/fx.js';
var sc=document.getElementsByTagName('script')[0];
sc.parentNode.insertBefore(_pzfx,sc);
})();
</script>
... ...
... ... @@ -101,7 +101,7 @@
</form>
</div>
<div class="go-cart">
<a href="//www.yohobuy.com/shopping/cart">
<a href="//www.yohobuy.com/cart/cart">
<span class="iconfont ">&#xe600;</span>
{{#unless @root.pc.common.removeCartCount}}
<span class="goods-num-tip hide">0</span>
... ...
... ... @@ -64,7 +64,8 @@
<span class="sale-info-title">促销信息<i></i></span>
<ul class="none">
{{#promotionInfos}}
<li>{{{promotionTitle}}}
<li data-role="promotion-wrap"
data-promotionid="{{promotionId}}">{{{promotionTitle}}}
{{>mix/cart/cart-promotion-btn}}
{{#if isNotReach}}
<a class="btn-clear blue order-pay-link" target="_blank" href="{{promotionPageUrl}}">&nbsp;&nbsp;去凑单&nbsp;</a>
... ...
... ... @@ -6,23 +6,6 @@
<a href="{{listUrl}}">去购物</a>
</div>
</div>
<div class="dev-revocation {{#unless deleteShop}}none{{/unless}}">
<table>
{{# deleteShop}}
<tr data-productnum="{{productNum}}" data-productsku="{{productSku}}">
<td style="width:35%; text-align: left;">成功删除<a class="title" href="{{link}}"
target="_blank">{{productTitle}}</a>
</td>
<td style="width:14%;"><span class="productPrice">{{productPrice}}</span></td>
<td style="width:15%;">{{productNum}}</td>
<td style="width:16%;"></td>
<td style="width:11.8%; border-right: none; text-align: right;">
<a href="javascript:void(0);"><span class="goBack">撤销本次删除</span></a>
</td>
</tr>
{{/ deleteShop}}
</table>
</div>
{{^}}
<!-- 购物车商品列表 -->
<div class="pay-wapper">
... ... @@ -134,31 +117,6 @@
</div>
{{/if}}
{{#if offShelves}}
<div class="mt20">
<div class="cart-table">
<ul class="table">
{{#offShelves}}
{{> mix/cart/cart-item}}
{{/offShelves}}
</ul>
</div>
</div>
{{/if}}
<!-- -->
{{#if soldOuts}}
<div class="mt20">
<div class="cart-table">
<ul class="table">
{{#soldOuts}}
{{> mix/cart/cart-item}}
{{/soldOuts}}
</ul>
</div>
</div>
{{/if}}
<!--可选的加价购商品 -->
<!--priceGifts-->
<!--可选择的赠品-->
... ... @@ -183,6 +141,31 @@
{{/promotionInfos}}
</div>
{{/if}}
{{#if offShelves}}
<div class="mt20">
<div class="cart-table">
<ul class="table">
{{#offShelves}}
{{> mix/cart/cart-item}}
{{/offShelves}}
</ul>
</div>
</div>
{{/if}}
<!-- -->
{{#if soldOuts}}
<div class="mt20">
<div class="cart-table">
<ul class="table">
{{#soldOuts}}
{{> mix/cart/cart-item}}
{{/soldOuts}}
</ul>
</div>
</div>
{{/if}}
</div>
{{/ordinaryCart}}
... ...
... ... @@ -63,7 +63,7 @@
"urlencode": "^1.1.0",
"uuid": "^2.0.2",
"yoho-express-session": "^2.0.0",
"yoho-node-lib": "0.2.5",
"yoho-node-lib": "0.2.8",
"yoho-zookeeper": "^1.0.6"
},
"devDependencies": {
... ...
... ... @@ -58,7 +58,7 @@
<div>
<p data-role="totalinfo"
data-total="{{total}}">购物车里还有<span data-role="last-num">{{total}}</span>件商品</p>
<a href="//www.yohobuy.com/shopping/cart">查看我的购物车</a>
<a href="//www.yohobuy.com/cart/cart">查看我的购物车</a>
</div>
</div>
</div>
... ...
... ... @@ -287,6 +287,7 @@ Cart = {
modNum: function() {
var $this = $(this);
var $item = $this.closest('li[data-role=pitem]');
var $btn = $item.find('.cart-item-check');
// var storagenum = $item.data('storagenum') ? $item.data('storagenum') * 1 : 0;
var countJSON = {};
... ... @@ -305,6 +306,10 @@ Cart = {
capi.cartItemNumChg($.extend(countJSON, {
sku: $item.data('id')
}));
if (!$btn.hasClass('cart-item-checked')) {
$btn.click();
}
},
reAdd2Cart: function() {
... ...
... ... @@ -194,7 +194,7 @@ cartItemNumChg = (function() {
}
countBusy = true;
$.ajax({
return $.ajax({
type: 'POST',
dataType: 'json',
url: '/cart/cart/modifyNum',
... ...
... ... @@ -5,6 +5,8 @@
var $ = require('yoho-jquery'),
Alert = require('../common/dialog').Alert,
capi = require('./cart-api'),
rDialog = require('./rdialog'),
RAlert = rDialog.RAlert,
giftsWinTpl = require('hbs/cart/cart-gifts-win-tpl.hbs'),
productInfoTpl = require('hbs/cart/cart-product-info-tpl.hbs');
... ... @@ -20,6 +22,11 @@ var $cartListWrap = $('#Y_CartListWrap'),
'[data-role=pg-resel-btn]'];
function renderAndShowGiftWin(plist) {
if(!plist.goodsList || !plist.goodsList.length) {
new RAlert('<div class="alert-main">已抢光</div>');
return;
}
$goodsSelWin.find('.detail-body').empty().html(giftsWinTpl(plist));
capi.showMDialog('#Y_goodsSelectWinDialog');
... ...
... ... @@ -60,14 +60,12 @@ Hbs.registerHelper('round', function(num, precision) {
// 订单计算
// 传有货币数量则使用有货币,否者不使用,更改订单总价有货币使用数量重置为0
function compute(coin) {
function compute(coin, cb) {
var reqData = {
cartType: order.cartType,
coin: coin ? coin : 0
};
order.coin = reqData.coin;
// 支付方式
if (order.paymentType) {
reqData.paymentType = order.paymentType;
... ... @@ -81,6 +79,13 @@ function compute(coin) {
// 优惠券
if (order.couponCode) {
reqData.couponCode = order.couponCode;
} else if (order.promotionCode) {
reqData.promotionCode = order.promotionCode;
}
// 有货币(保证更改其他价格yoho币不清零,调接口传最大数量,接口限制可使用数量)
if (!coin && order.coin) {
reqData.coin = yohoCoin.totalCoin;
}
// 红包
... ... @@ -98,28 +103,26 @@ function compute(coin) {
if (data.code === 200) {
res = data.data;
// update order used yoho coin
order.coin = res.usedCoinNum;
// update yoho coin max use num
yohoCoin.maxCoin = res.canUseCoinNum;
// update yoho coin using
yohoCoin.$el.html(coinTpl(res));
if (!reqData.coin) {
yohoCoin.$el.removeClass('used');
}
// update last order amount
$orderPrice.html('¥ ' + res.last_order_amount);
// update promotion formula list
$balanceDetail.html(promotionTpl(res));
} else if (data.code === 317) {
if (coupon.$errorTip) {
coupon.$errorTip.text(data.message);
if (order.couponCode) {
delete order.couponCode;
}
}
}
// callback
if (cb && typeof cb === 'function') {
return cb(data);
}
});
}
... ... @@ -479,30 +482,33 @@ coupon = {
that.cancelTicketUse();
}).on('change', '.coupon-code', function() {
that.$errorTip.empty();
}).on('click', '.opt-area > label', function() {
}).on('click', '.sure-use-ticket', function() {
that.close();
}).on('click', '.sure-use-code', function() {
var $this = $(this);
var couponId, data;
if ($this.hasClass('sure-use-ticket')) {
data = that.$radios.filter('.on').data();
var couponId;
if (data) {
that.$ticketUseTip.find('.price').text('- ¥' + data.price);
that.$ticketUseTip.removeClass('hide');
couponId = data.id;
}
} else {
couponId = $this.siblings('.coupon-code').val();
}
couponId = $this.siblings('.coupon-code').val();
if (couponId) {
order.couponCode = couponId;
// 重新计算订单价格
compute();
compute(0, function(resData) {
if (resData.code === 200) {
that.close();
} else {
that.$errorTip.text(resData.message);
if (order.couponCode) {
delete order.couponCode;
}
}
});
}
}).on('click', '.coupon-radio', function() {
var $this = $(this);
var $this = $(this),
data, couponId;
if ($this.hasClass('on')) {
return;
... ... @@ -512,6 +518,20 @@ coupon = {
that.$radios.filter('.on').removeClass('on');
}
$this.addClass('on');
data = $this.data();
if (data) {
that.$ticketUseTip.find('.price').text('- ¥' + data.price);
that.$ticketUseTip.removeClass('hide');
couponId = data.id;
}
if (couponId) {
order.couponCode = couponId;
// 重新计算订单价格
compute();
}
});
},
cancelTicketUse: function() {
... ... @@ -531,6 +551,9 @@ coupon = {
delete order.couponCode;
compute(); // 重新计算订单价格
}
},
close: function() {
this.$el.children('.locker-switch').trigger('click');
}
};
... ... @@ -549,6 +572,7 @@ yohoCoin = {
if (data) {
order.coin = data.coin || 0;
this.maxCoin = data.max;
this.totalCoin = data.total;
}
this.eventBind();
... ... @@ -564,6 +588,7 @@ yohoCoin = {
that.close();
}).on('click', '.coin-cancel-btn', function() {
if (order.coin * 1 !== 0) {
order.coin = 0;
compute();
}
... ... @@ -584,6 +609,7 @@ $('.locker-switch').click(function() {
(function() {
var $redSureBtn = $('#red-packet-sure');
var $redPacketBox = $('#red-packet-box');
var used;
if (!$redSureBtn.length) {
... ... @@ -598,12 +624,15 @@ $('.locker-switch').click(function() {
$redSureBtn.siblings('.radio-btn').addClass('on');
}
$('#red-packet-box').on('click', '.radio-btn', function() {
$redPacketBox.on('click', '.radio-btn', function() {
$(this).toggleClass('on');
}).on('click', '.sure-btn', function() {
var $this = $(this),
num = $this.data('num');
// 触发关闭事件
$redPacketBox.prev().children('.locker-switch').trigger('click');
if (!num) {
return;
}
... ... @@ -665,7 +694,7 @@ $('#order-submit').click(function() {
url: '/cart/ensure/submit',
data: order
}).then(function(data) {
var rdata, subTip,
var rdata, subTip, newUser,
tongJi = {
num: 0,
skn: [],
... ... @@ -722,8 +751,7 @@ $('#order-submit').click(function() {
// yas统计
yas.givePoint('YB_SC_TOPAY_CLICK', {ORDER_CODE: rdata.order_code, PRD_NUM: tongJi.num,
ORDER_AMOUNT: rdata.order_amount, PRO_SKN: tongJi.skn.join(','), PRO_SKU: tongJi.sku.join(','),
UNIONCOOKIE: rdata.unionKey || ''});
ORDER_AMOUNT: rdata.order_amount, PRO_SKN: tongJi.skn.join(','), PRO_SKU: tongJi.sku.join(',')});
// 品友统计
if (window.py) {
... ... @@ -734,6 +762,19 @@ $('#order-submit').click(function() {
}).track('MC.ROh.yqkx8jgGASmo3McexF7XE0');
}
// 品众统计
if (window._fxcmd) {
newUser = window.cookie('__NEW_USER') || 0;
window._fxcmd.push(['trackOrder', {
oid: rdata.order_code,
otp: rdata.order_amount,
u_info: window.getUser(),
u_type: newUser
}, []]);
window.setCookie('__NEW_USER', 0);
}
location.href = rdata.url;
}
} else if (data.message) {
... ... @@ -748,5 +789,8 @@ multiPackage.init();
coupon.init();
yohoCoin.init();
// 获取用户是否新客(品众统计)写cookie
$.ajax({type: 'GET', url: '/home/newuser'});
// 订单确认页默认埋点
yas.givePoint('YB_SC_ORDER_ENSURE');
... ...
... ... @@ -268,6 +268,10 @@ var areaSelect = {
if (data && data.length) {
if (select && !selInfo.id) {
select = this.area.id || 0;
this.town = {
id: select,
text: '全部'
};
_h = '<span class="ai' + select + ' all-town on" data-id="' + select +
'" data-text="全部">全部</span>' + _h;
} else {
... ...
... ... @@ -100,6 +100,10 @@ function bindInvoiceEvent($el) {
$goodsTypeWrap.find('.on').removeClass('on');
$this.addClass('on');
});
$el.on('click', '.invoice-close', function() {
$('.btn-close', $el).trigger('click');
});
}
function bindInvoiceInfo($el, info) {
... ...
... ... @@ -359,7 +359,7 @@ function refreshCartNum() {
var $totalInfo = $miniCart.find('[data-role=totalinfo]');
var total = 0;
$miniCart.find('.goods-item.hide)').each(function() {
$miniCart.find('.goods-item.hide').each(function() {
var $t = $(this);
var val = $t.data('num') || 0;
... ... @@ -418,7 +418,7 @@ function delCartGoods(data, callback) {
product_num: data.num
};
$.getJSON('//www.yohobuy.com/common/delCartGoods/?callback=?', param, function(jsonData) {
$.getJSON('//www.yohobuy.com/cart/cart/del?callback=?', param, function(jsonData) {
var strG = '';
if (jsonData.code === 200) {
... ...
... ... @@ -43,8 +43,7 @@ var address = {
loadAreaData: function(pCode, toDomId, defaultValue, allCode) {
var the = this,
$toDom = $('#' + toDomId),
i = 0,
point = '';
i = 0;
var active,
val,
... ... @@ -76,12 +75,11 @@ var address = {
$toDom.append('<option value="0">' + defaultValue + '</option>');
if (toDomId === the.streetsDomId) {
allCode === pCode ? selectAll = 'selected' : selectAll = '';
$toDom.append('<option value="' + pCode + '" ' + selectAll + '>*全部</option>');
$toDom.append('<option value="' + pCode + '" ' + selectAll + '>全部</option>');
}
for (i in jsonData.options) {
if (jsonData.options[i]) {
val = jsonData.options[i];
point = (toDomId === the.streetsDomId && val.is_support === 'Y') ? '*' : '';
nId = val.value;
selecter = '';
... ... @@ -89,7 +87,7 @@ var address = {
nId === allCode.substr(0, nId.length)) {
selecter = 'selected';
}
$toDom.append('<option value="' + nId + '" ' + selecter + '>' + point + val.text + '</option>');
$toDom.append('<option value="' + nId + '" ' + selecter + '>' + val.text + '</option>');
}
}
}
... ...
... ... @@ -145,7 +145,7 @@
.oldprice {
display: block;
color: #b0b0b0;
font-size: 12px;
font-size: 13px;
font-weight: normal;
height: 25px;
line-height: 25px;
... ... @@ -192,7 +192,7 @@
}
}
dd {
width: 55px;
min-width: 55px;
float: left;
letter-spacing: 0;
word-spacing: 0;
... ... @@ -200,12 +200,13 @@
text-align: left;
}
dt {
width: 300px;
width: 275px;
float: left;
text-align: left;
}
dd.colorBox {
line-height: 40px;
padding-bottom: 10px;
}
dd.showSizeBox {
line-height: 23px;
... ... @@ -241,6 +242,7 @@
height: 40px;
text-align: center;
margin-right: 5px;
margin-bottom: 5px;
display: inline;
float: left;
cursor: pointer;
... ...
... ... @@ -713,7 +713,7 @@
b {
display: inline-block;
vertical-align: bottom;
max-width: 120px;
max-width: 110px;
margin-right: 10px;
overflow: hidden;
text-overflow: ellipsis;
... ... @@ -760,28 +760,28 @@
display:none;
&:after{
position: absolute;
top: 100px;
left: -16px;
top: 96px;
left: -10px;
content: '';
display: inline-block;
width: 0;
height: 0;
border-right: 16px solid #000;
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
border-right: 10px solid #000;
border-top: 10px solid transparent;
border-bottom: 10px solid transparent;
}
&:before{
position: absolute;
top: 101px;
left: -14px;
top: 97px;
left: -9px;
z-index: 20;
content: '';
display: inline-block;
width: 0;
height: 0;
border-right: 14px solid #fff;
border-top: 7px solid transparent;
border-bottom: 7px solid transparent;
border-right: 9px solid #fff;
border-top: 9px solid transparent;
border-bottom: 9px solid transparent;
}
.goods-info {
float: left;
... ... @@ -898,18 +898,19 @@
font-size: 12px;
font-weight: 300;
padding: 0;
border: none;
border: 1px solid #000;
box-sizing: border-box;
line-height: 22px;
cursor: pointer;
outline: none;
}
.button-sure {
background-color: #d0021b;
background-color: #000;
color: #fff;
margin-right: 18px;
}
.button-cancel {
background-color: #e0e0e0;
background-color: #fff;
color: #000;
}
}
... ... @@ -1028,6 +1029,7 @@
color:#ff575c;
&.tip-message-coin {
color: #000;
margin-top: 2px;
}
}
.product-price{
... ... @@ -1688,10 +1690,11 @@
&:nth-child(2) {
margin-left: 20px;
}
}
.alert-sure {
width: 150px;
&:last-child{
&.alert-sure {
width: 150px;
}
}
}
.alert-main {
... ...
... ... @@ -1331,10 +1331,11 @@
position: absolute;
right: 10px;
top: 12px;
z-index: -1;
}
> span {
width: 92%;
width: 98%;
font-size: 14px;
max-height: 28px;
line-height: 28px;
... ... @@ -1521,6 +1522,21 @@
color: #444;
background-color: #fff;
> .close {
display: none;
}
.invoice-close {
position: absolute;
top: 10px;
right: 12px;
cursor: pointer;
.iconfont {
font-size: 32px;
}
}
.radio-btn {
&:before {
content: '';
... ... @@ -1540,15 +1556,6 @@
}
}
> .close {
top: 10px;
right: 12px;
.iconfont {
font-size: 32px;
}
}
> .content {
text-align: left;
}
... ...
... ... @@ -637,15 +637,16 @@
padding: 0 25px;
> div {
height: 88px;
border-top: 1px solid #dcdcdc;
text-align: right;
padding-top: 14px;
padding-bottom: 16px;
}
p {
font-size: 13px;
color: #444;
text-align: right;
padding-top: 14px;
padding-top: 0;
padding-bottom: 8px;
}
a {
... ...