Authored by 姜枫

handle merge

... ... @@ -8,10 +8,18 @@
const mcHandler = require('../models/menu-crumb-handler');
const currencyModel = require('../models/currency');
const moment = require('moment');
const convertUnitTime = (src) => {
return moment.unix(src).format('YYYY-MM-DD');
/**
* 时间格式化
* @param time
* @param a
* @returns {string}
*/
const getTime = (time, a)=> {
let newDate = new Date(time.getFullYear(), time.getMonth() + 1, time.getDate() - 30 * a);
return newDate.getFullYear() + '-' + newDate.getMonth() + '-' + newDate.getDate();
};
/**
... ... @@ -21,17 +29,17 @@ const index = (req, res, next) => {
let uid = req.user.uid;
let page = parseInt(req.query.page, 10) || 1;
let queryType = parseInt(req.query.queryType, 10) || 0;
let beginTime = req.query.beginTime || convertUnitTime(new Date() / 1000 - 3600 * 24 * 90);
let date1 = new Date().getTime() / 1000;
let date2 = new Date(beginTime).getTime() / 1000;
let selectIndex = parseInt((date1 - date2) / (3600 * 24 * 30 * 6), 10);
let beginTime = req.query.beginTime || getTime(new Date(), 3);
let date1 = new Date().getTime();
let date2 = new Date(beginTime).getTime();
let selectIndex = parseInt((date1 - date2) / (1000 * 3600 * 24 * 90), 10);
currencyModel.getIndexData(uid, page, queryType, beginTime).then(result=> {
result.list.tabs[queryType].isActive = true;
result.list.coinList.forEach(function(x) {
x.date = x.date.replace(/\-/g, '.');
});
result.list.selects[selectIndex].isSelected = 'selected';
result.list.selects[selectIndex > 2 ? 2 : selectIndex].isSelected = 'selected';
if (result.list.paginationOpts) {
result.list.paginationOpts.queryParams = {
queryType: queryType,
... ...
... ... @@ -378,7 +378,7 @@ function getfilePath(req, res, next) {
* @param res
*/
const modifyHead = (req, res)=> {
let uid = req.user.uid || '8041246';
let uid = req.user.uid;
let bucket = 'yhb-head';
let filePath = req.filePath;
... ...
... ... @@ -557,6 +557,11 @@ const getChangeGoodsList = (orderCode, uid) => {
data.hidePrice = true;
data.orderCode = orderCode;
// 设置特殊原因
_.forEach(data.specialExchangeReason, r => {
_.find(data.exchangeReason, {id: r.id}).isSpecial = true;
});
if (data.goodsList) {
data.goodsList.forEach(good => {
good.showCheckbox = true;
... ...
... ... @@ -3,11 +3,11 @@
<span class="blue table-title">已保存了{{data.length}}条地址,还能保存{{data.leftLength}}条地址</span>
<table class="a-table">
<tr class="table-head">
<th class="width-70">收货人</th>
<th class="width-195">所在区域</th>
<th class="width-255">详细地址</th>
<th class="width-120">手机/电话</th>
<th class="width-260">操作</th>
<th class="width-name">收货人</th>
<th class="width-address">所在区域</th>
<th class="width-fulladdress">详细地址</th>
<th class="width-mobile">手机/电话</th>
<th class="width-opearte">操作</th>
</tr>
{{#each data}}
<tr class="table-body">
... ...
... ... @@ -4,7 +4,7 @@
</a>
<div class="detail">
<a href="{{goodUrl}}" target="_blank">
<p class="with-bottom-space">{{productName}}</p>
<p class="with-bottom-space good-name-text">{{productName}}</p>
</a>
<span class="with-space">颜色:{{colorName}}</span>
<span>尺码:
... ...
<select class="exchange-reasons" name="exchange-reasons">
<option value="0">请选择换货原因</option>
{{# exchangeReason}}
<option value="{{id}}">{{name}}</option>
<option value="{{id}}" {{#if isSpecial}}class="is-special"{{/if}}>{{name}}</option>
{{/ exchangeReason}}
{{# specialExchangeReason}}
<option value="{{id}}" class="is-special">{{name}}</option>
{{/ specialExchangeReason}}
</select>
... ...
... ... @@ -12,339 +12,3 @@
<div id="removed_products"></div>
</div>
<script id="edit-color-size-tpl" type="text/html">
<div class="edit-color-size">
<div class="indicator"><i></i></div>
<div class="content">
<div class="left">
<div class="default-color mb20">
<span class="color-label mr10">Color: </span><span class="selected-color">\{{defaultColor}}</span>
</div>
<div class="colors-list mb20">
\{{#each colors}}
\{{#if active}}
<span class="color-item current-color \{{#unless selectable}}disabled\{{/unless}}"
style="background: \{{rgb}}"
data-imageurl="\{{image pic 100 134}}"
data-target="\{{proId}}-color-\{{@index}}"
data-title="\{{color}}">
<span class="inner"></span>
</span>
\{{^}}
<span class="color-item \{{#unless selectable}}disabled\{{/unless}}"
style="background: \{{rgb}}"
data-imageurl="\{{image pic 100 134}}"
data-target="\{{proId}}-color-\{{@index}}"
data-title="\{{color}}">
<span class="inner"></span>
</span>
\{{/if}}
\{{/each}}
</div>
\{{#each colors}}
<div class="sizes-list \{{#if active}}current-sizes\{{/if}}" id="\{{proId}}-color-\{{@index}}" style="display: \{{#if active}}block\{{^}}none\{{/if}};">
<div class="default-size mb20">
<span class="size-label mr10">Size: </span><span>\{{../defaultSize}}</span>
</div>
<div class="sizes-list mb10">
\{{#each sizes}}
\{{#isEqual ../../defaultSize name}}
<span class="size-item mr10 mb10 current \{{#isEqual num 0}}disabled\{{/isEqual}}"
data-sku="\{{sku}}">\{{name}}</span>
\{{^}}
<span class="size-item mr10 mb10 \{{#isEqual num 0}}disabled\{{/isEqual}}"
data-sku="\{{sku}}">\{{name}}</span>
\{{/isEqual}}
\{{/each}}
</div>
</div>
\{{/each}}
<div class="actions">
<span class="btn mr20" id="confirm">确定</span>
<span class="btn disable" id="cancel">取消</span>
</div>
</div>
<div class="right">
<img src="\{{image defaultImg 100 134}}" class="img-preview" title="\{{defaultColor}}"/>
</div>
</div>
</div>
</script>
<script id="cart-content-tpl" type="text/html">
<div class="cart-header">
<div class="titles">
<div class="item">
<label id="toggle_check" class="toggle-chk chk-all \{{#if checkAll}}chk-group\{{/if}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
全选
</label>
</div>
<div class="item product">货品</div>
<div class="item price">价格</div>
<div class="item num">数量</div>
<div class="item pro-total-price">总价</div>
<div class="item actions">操作</div>
</div>
</div>
\{{# if preSalePros}}
<div class="cart-pro-list pre-pros">
<div class="title">
<span class="main">预售商品</span>
<span class="note">不同上市期的商品我们将为您先到先发</span>
</div>
<div class="pro-list">
\{{#each preSalePros}}
<div class="pros-group">
\{{# each this}}
<ul>
<li class="chk" data-product_info='{"goods_type": "advance", "buy_number": \{{buy_number}}, "selected": "\{{selected}}", "product_sku": "\{{product_sku}}", "promotion_id": 0}'>
<label class="toggle-chk-item \{{#isEqual selected 'Y'}}chk-group\{{/isEqual}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
</label>
<input type="hidden" name="product_ids[]"/>
</li>
<li>
<a href="/product/pro_\{{product_id}}_\{{goods_id}}/\{{cn_alphabet}}.html" target="_blank">
<img src="\{{image goods_images 100 134}}" alt="\{{product_name}}">
</a>
</li>
<li class="pro-info">
\{{!-- <div class="brand-name">\{{brand_name}}</div> --}}
<div class="pro-name"><a href="/product/pro_\{{product_id}}_\{{goods_id}}/\{{cn_alphabet}}.html" target="_blank">\{{product_name}}</a></div>
<div class="color-size editable" data-product_id=\{{product_id}} id="edit_\{{product_id}}">
\{{#if color_name}}
<span class="mr20">颜色: \{{color_name}}</span>
\{{/if}}
\{{#if size_name}}
<span>尺寸: \{{size_name}}</span>
\{{/if}}
<span class="iconfont">&#xe63c;</span>
</div>
\{{#expect_arrival_time}}
<div class="published-at">上市期: \{{expect_arrival_time}}</div>
\{{/expect_arrival_time}}
</li>
<li class="price-num">
<span class="price sale-price">¥ \{{round sales_price 2}}</span>
<div class="stepper" data-productType=\{{goods_type}}>
<div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value=\{{buy_number}} />
</div>
<div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
\{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ \{{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_extra_info='{"goodsId": "\{{goods_id}}", "cnAlphabet": "\{{cn_alphabet}}", "productId": "\{{product_id}}", "salesPrice": "\{{round sales_price 2}}", "productName": "\{{product_name}}", "goodType":"ordinary", "selected": "\{{selected}}"}'><span class="iconfont">&#xe614;</span> &nbsp;删&nbsp;&nbsp;&nbsp;&nbsp;除</div>
<div class="send-to-favorite action" data-product_id=\{{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
\{{/each}}
</div>
\{{/each}}
</div>
</div>
\{{/ if}}
\{{# if commonPros }}
<div class="cart-pro-list cart-pros">
<div class="title">
<span class="main">普通商品</span>
</div>
<div class="pro-list">
\{{#each commonPros}}
<div class="pros-group">
\{{# each this}}
<ul>
<li class="chk" data-product_info='{"goods_type": "ordinary", "buy_number": \{{buy_number}}, "selected": "\{{selected}}", "product_sku": "\{{product_sku}}", "promotion_id": 0}'>
<label class="toggle-chk-item \{{#isEqual selected 'Y'}}chk-group\{{/isEqual}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
</label>
<input type="hidden" name="product_ids[]"/>
</li>
<li>
<a href="/product/pro_\{{product_id}}_\{{goods_id}}/\{{cn_alphabet}}.html" target="_blank">
<img src="\{{image goods_images 100 134}}" alt="\{{product_name}}">
</a>
</li>
<li class="pro-info">
\{{!-- <div class="brand-name">\{{brandName}}</div> --}}
<div class="pro-name"><a href="/product/pro_\{{product_id}}_\{{goods_id}}/\{{cn_alphabet}}.html" target="_blank">\{{product_name}}</a></div>
<div class="color-size editable" data-product_id=\{{product_id}} id="edit_\{{product_id}}">
\{{#if color_name}}
<span class="mr20">颜色: \{{color_name}}</span>
\{{/if}}
\{{#if size_name}}
<span>尺寸: \{{size_name}}</span>
\{{/if}}
<span class="iconfont">&#xe63c;</span>
</div>
</li>
<li class="price-num">
<span class="price sale-price">¥ \{{round sales_price 2}}</span>
<div class="stepper" data-productType=\{{goods_type}}>
<div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value=\{{buy_number}} />
</div>
<div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
\{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ \{{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_extra_info='{"goodsId": "\{{goods_id}}", "cnAlphabet": "\{{cn_alphabet}}", "productId": "\{{product_id}}", "salesPrice": "\{{round sales_price 2}}", "productName": "\{{product_name}}", "goodType":"ordinary", "selected": "\{{selected}}"}'><span class="iconfont">&#xe614;</span> &nbsp;删&nbsp;&nbsp;&nbsp;&nbsp;除</div>
<div class="send-to-favorite action" data-product_id=\{{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
\{{/each}}
</div>
\{{/each}}
</div>
</div>
\{{/ if}}
\{{# if invalidPros}}
<div class="cart-pro-list invalid-pros">
<div class="pro-list">
\{{#each invalidPros}}
<ul>
<li class="chk" data-product_info='{"goods_type": "invalid", "buy_number": \{{buy_number}}, "selected": "\{{selected}}", "product_sku": "\{{product_sku}}", "promotion_id": 0}'>
<span class="iconfont warning">&#xe625;</span>
</li>
<li>
<a href="javascript:void(0)">
<img src="\{{image goods_images 100 134}}" alt="\{{product_name}}">
</a>
</li>
<li class="pro-info">
<div class="pro-name"><a href="javascript:void(0)">\{{product_name}}</a></div>
<div>
\{{#if color_name}}
<span class="mr20">颜色: \{{color_name}}</span>
\{{/if}}
\{{#if size_name}}
<span>尺寸: \{{size_name}}</span>
\{{/if}}
</div>
</li>
<li class="price-num">
<span class="price sale-price">¥ \{{round sales_price 2}}</span>
<div class="stepper" data-productType=\{{goods_type}}>
<div class="minus action \{{#isEqual buy_number 1}}disable\{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value=\{{buy_number}} />
</div>
<div class="plus action \{{#isEqual left_number 0}}disable\{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
\{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ \{{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_id=\{{product_id}}><span class="iconfont">&#xe614;</span> &nbsp;删&nbsp;&nbsp;&nbsp;&nbsp;除</div>
<div class="send-to-favorite action" data-product_id=\{{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
\{{/each}}
</div>
</div>
\{{/ if}}
<div class="cart-statement">
<div class="actions">
<div class="action">
<label id="toggle_check" class="toggle-chk chk-all \{{#if checkAll}}chk-group\{{/if}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
<span>全选</span>
</label>
</div>
<div id="remove_selected" class="action hoverable">删除选中的商品</div>
<div id="send_favorite" class="action hoverable">移入收藏夹</div>
<div class="selected-num">已选<span>\{{selectedNum}}</span>件</div>
<div class="checkout-total">
<div class="total-title">商品金额:</div>
<div class="total-money">¥ <span>\{{round totalMoney 2}}</span></div>
</div>
</div>
<div class="calculate">
<div class="checkout-total pay-total">
<div class="pay-title">应付金额(不含运费):</div>
<div class="total-money">¥ <span>\{{round totalMoney 2}}</span></div>
</div>
</div>
<div class="checkout">
<span class="btn \{{#unless selectedNum}}disable\{{/unless}}" id="checkout_btn">去结算</span>
</div>
</div>
</script>
<script id="empty-cart-tpl" type="text/html">
<div class="empty-cart">
<div class="empty-cart-bg">
</div>
<p class="empty-cart-info">购物袋空空的哦,去看看心仪的商品吧~</p>
<a href="/" class="go-to-shop">
<span class="btn white">去购物</span>
</a>
</div>
</script>
<script id="removed-products" type="text/html">
<div class="cart-removed-list">
<div class="info-bar">
<p class="info-text">已删除商品,您可以重新购买或移入收藏:</p>
</div>
<div class="removed-products">
<ul>
\{{#each removedProducts}}
<li class="removed-product">
<div class="product-name">
<a href="/product/pro_\{{productId}}_\{{goodsId}}/\{{cnAlphabet}}.html" target="_blank">\{{productName}}</a>
</div>
<div class="product-price">¥ \{{salesPrice}}</div>
<div class="bought-num">\{{buyNumber}}</div>
<div class="actions">
<span class="buy-again" data-rebuy_info='{"buyNumber": \{{buyNumber}}, "productSku": "\{{productSku}}"}'>重新购买</span>
<span class="send-to-favorite" data-product_info='{"goods_type": "\{{goodType}}", "buy_number": \{{buyNumber}}, "selected": "\{{selected}}", "product_sku": "\{{productSku}}", "promotion_id": 0}'>移入收藏夹</span>
</div>
</li>
\{{/each}}
</ul>
</div>
</div>
</script>
... ...
/**
* 图片格式化
* @param {[String]} url
* @param {[Number]} width
* @param {[Number]} height
* @param {[String]} mode
* @return {[boolen]}
*/
module.exports = function(url, width, height, mode) {
mode = parseInt(mode, 10) ? mode : 2;
url = url || '';
return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
};
... ...
/**
* 判断两个数字是否相等
* @param {[Number]} v1
* @param {[Number]} v2
* @return {[boolen]}
*/
module.exports = function(v1, v2, options) {
if (v1 === v2) {
return options.fn(this);
}
return options.inverse(this);
};
... ...
/**
* 小于等于
* @param {[Number]} num1
* @param {[Number]} num2
* @param {[object]} options 上下文环境,一般不手动传
* @return {[boolen]}
*/
module.exports = function(num1, num2, options) {
num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
if (num1 <= num2) {
return options.fn(this);
}
return options.inverse(this);
};
... ...
/**
* 乘法
* @param {[Number]} num1
* @param {[Number]} num2
* @return {[boolen]}
*/
module.exports = function(num1, num2) {
num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
if (num1 && num2) {
return num1 * num2;
}
};
... ...
/**
* 显示剩余库存
* @param {[Number]} leftNumber
* @return {[boolen]}
*/
module.exports = function(leftNumber) {
leftNumber = typeof num1 === 'number' ? leftNumber : parseFloat(leftNumber, 10);
if (leftNumber <= 3 && leftNumber >= 0) {
return `仅剩${leftNumber}件`;
} else if (leftNumber < 0) {
return '库存不足';
}
};
... ...
... ... @@ -44,7 +44,7 @@ $('.search-entry').click(function() {
$searchWrap.show();
});
$searchForm.on('keyup', '#search-key', function(e) {
$searchKey.keyup(function(e) {
var key = $searchKey.val();
if (e.which === 13) {
... ... @@ -60,6 +60,23 @@ $searchForm.on('keyup', '#search-key', function(e) {
}
});
// ie8输入框提示特殊处理
if ($.browser && $.browser.msie && parseInt($.browser.version, 10) === 8) {
$searchKey.focus(function() {
var key = $searchKey.val();
if (key === 'search') {
$searchKey.val('').css('color', '#fff');
}
}).blur(function() {
var key = $searchKey.val();
if ($.trim(key) === '') {
$searchKey.val('search').css('color', '#aaa');
}
});
}
$clearInput.click(function() {
$searchKey.val('');
$(this).hide();
... ...
... ... @@ -25,7 +25,7 @@ require('yoho-jquery-placeholder');
$('[placeholder]').placeholder();
$(function() {
$(function () {
var address = cascadingAddress({el: '#address'});
/**
... ... @@ -33,7 +33,7 @@ $(function() {
*/
var Bll = {
// 获取输入框输入的值
getInfo: function() {
getInfo: function () {
return {
id: $addressId.val(),
... ... @@ -45,7 +45,7 @@ $(function() {
},
// 清空输入框
clearInput: function() {
clearInput: function () {
$consignee.val('');
$address.val('');
$mobile.val('');
... ... @@ -54,7 +54,7 @@ $(function() {
},
// 校验
check: function(info) {
check: function (info) {
var flag = true;
info.consignee === '' ? $consignee.next().show() : $consignee.next().hide();
... ... @@ -72,16 +72,16 @@ $(function() {
},
// 拼接一条数据的html
getHtml: function(info) {
getHtml: function (info) {
var html = '<tr class="table-body">';
html += '<input type="hidden" id="tr_' + info.address_id + '" value="' + info.address_id + '">' +
'<input type="hidden" id="tr_' + info.area_code + '" value="' + info.area_code + '">' +
'<td class=\'width-80\'>' + info.consignee + '</td>' +
'<td class=\'width-195\'>' + info.area + '</td>' +
'<td class=\'width-280\'>' + info.address + '</td>' +
'<td class=\'width-120\'><p>' + info.mobile + '</p><p>' + info.phone + '</p></td>' +
'<td class=\'width-260\'><div><span class=\'blue opreation update-address\' data-id=\'' +
'<td class=\'width-name\'>' + info.consignee + '</td>' +
'<td class=\'width-address\'>' + info.area + '</td>' +
'<td class=\'width-fulladdress\'>' + info.address + '</td>' +
'<td class=\'width-mobile\'><p>' + info.mobile + '</p><p>' + info.phone + '</p></td>' +
'<td class=\'width-opearte\'><div><span class=\'blue opreation update-address\' data-id=\'' +
info.address_id + '\'>修改</span>\n<em class="op-sep">|</em>\n' +
'<span class=\'blue opreation del-address\' data-id=\'' + info.address_id + '\'>删除</span>\n' +
'<span class=\'btn set-default opreation \' data-id=\'' + info.address_id + '\'>设为默认</span></div></td>';
... ... @@ -90,7 +90,7 @@ $(function() {
},
// 获取一条数据
setInfo: function(id, td) {
setInfo: function (id, td) {
$addressId.val(id);
$consignee.val(td.eq(0).text());
$address.val(td.eq(2).text());
... ... @@ -99,7 +99,7 @@ $(function() {
},
// 设置表格头部
setTableTile: function() {
setTableTile: function () {
$('.table-title').text('已保存了' + currentLength +
'条地址,还能保存' + leftLength + '条地址');
}
... ... @@ -107,7 +107,7 @@ $(function() {
// 保存收货地址
$(document).on('click', '#save-address', function() {
$(document).on('click', '#save-address', function () {
var info,
area,
areaInfo;
... ... @@ -122,7 +122,7 @@ $(function() {
// 新增
if (info.id === '') {
if (currentLength === 7) {
if (currentLength >= 7) {
new _alert('您最多添加7个收货地址,可删除不需要的地址后再添加新地址!').show();
Bll.clearInput();
}
... ... @@ -132,7 +132,7 @@ $(function() {
url: '/me/address/add',
dataType: 'json',
data: info,
success: function(data) {
success: function (data) {
var html;
if (data.code === 200) {
... ... @@ -154,7 +154,7 @@ $(function() {
url: '/me/address/update',
dataType: 'json',
data: info,
success: function(data) {
success: function (data) {
if (data.code === 200) {
info.mobile = info.mobile.substring(0, 3) + '****' + info.mobile.substring(7, 11);
info.address_id = info.id;
... ... @@ -171,7 +171,7 @@ $(function() {
});
// 修改收货地址
$(document).on('click', '.update-address', function() {
$(document).on('click', '.update-address', function () {
var id = $(this).data('id');
var tr = $(this).parents('.table-body');
var td = tr.find('td');
... ... @@ -185,13 +185,13 @@ $(function() {
});
// 删除收货地址
$(document).on('click', '.del-address', function() {
$(document).on('click', '.del-address', function () {
var id = $(this).data('id');
var tr = $(this).parents('.table-body');
var a = new _confirm({
content: '您确定要删除收货地址吗?',
cb: function() {
cb: function () {
$.ajax({
type: 'POST',
url: '/me/address/del',
... ... @@ -199,7 +199,7 @@ $(function() {
data: {
id: id
},
success: function() {
success: function () {
currentLength--;
leftLength++;
tr.remove();
... ... @@ -214,7 +214,7 @@ $(function() {
});
// 设置默认收货地址
$(document).on('click', '.set-default', function() {
$(document).on('click', '.set-default', function () {
var tr = $(this).parents('.table-body');
var tbody = tr.parent();
var id = $(this).data('id');
... ... @@ -227,7 +227,7 @@ $(function() {
data: {
id: id
},
success: function() {
success: function () {
$('.current-default').removeClass('current-default').text('设为默认');
$(self).addClass('current-default').text('默认地址');
tbody.find('.table-body').eq(0).before('<tr class=\'table-body\'>' + tr.html() + '</tr>');
... ...
... ... @@ -3,15 +3,7 @@
* @author: jiangmin
* @date: 2016/07/11
*/
const moment = require('moment');
// 时间格式化
const convertUnitTime = (src) => {
return moment.unix(src).format('YYYY-MM-DD');
};
var beginTime = convertUnitTime(new Date() / 1000 - 3600 * 24 * 90);
var type = 0;
var page = 1;
var Bll = {
... ... @@ -19,12 +11,14 @@ var Bll = {
getQueryString: function() {
var queryArr = location.search.substr(1).split('&');
var query = {};
var i;
var arr = [];
queryArr.forEach(function(pair) {
var arr = pair.split('=');
for (i = 0; i < queryArr.length; i++) {
arr = queryArr[i].split('=');
query[arr[0]] = arr[1];
});
}
return query;
},
typeMap: {
... ... @@ -36,12 +30,17 @@ var Bll = {
var query = ['page=' + page1, 'queryType=' + type1, 'beginTime=' + beginTime1];
location.search = query.join('&');
},
getTime: function(time, a) {
var newDate = new Date(time.getFullYear(), time.getMonth() + 1, time.getDate() - 30 * a);
return newDate.getFullYear() + '-' + newDate.getMonth() + '-' + newDate.getDate();
}
};
var beginTime = Bll.getTime(new Date(), 3);
require('./me');
// tab切换
$('.tabs li').on('click', function() {
var $this = $(this);
... ... @@ -64,7 +63,7 @@ $('#begin-time').on('change', function() {
type = Bll.getQueryString().queryType || 1;
page = 1;
beginTime = convertUnitTime(new Date() / 1000 - 3600 * 24 * 30 * months);
beginTime = Bll.getTime(new Date(), months);
Bll.getDataList(type, page, beginTime);
});
... ...
... ... @@ -407,9 +407,10 @@ function bindImgDeleteEvent() {
$('.operation-box .delete').off('click').on('click', function() {
var $thumb = $(this).closest('.thumb-box');
var $t = $thumb.siblings('.img-up-tip');
var number = $('.thumb-box').length - 1;
var number = $(this).closest('.left.right-content').find('.thumb-box').length - 1;
$t.text(number + '/4');
$thumb.siblings('.warn').addClass('hide');
$thumb.remove();
});
}
... ... @@ -422,24 +423,26 @@ function bindUploadEvent() {
$('.img-upload').on('click', function() {
var upload = require('../plugins/upload');
var that = this;
var n = parseInt($(that).siblings('.thumb-box').length, 10);
// var number = parseInt($t.text().split('/')[0]);
var number = $(that).siblings('img').length;
if (number < 4) {
if (n < 4) {
upload.up({
callback: function(result) {
var img;
var $t;
if (result.code === 200) {
n = parseInt($(that).siblings('.thumb-box').length, 10);
img = imgBoxTpl({src: result.data});
$t = $(that).next('.img-up-tip');
$(that).before(img);
number += 1;
$t.text(number + '/4');
n += 1;
$t.text(n + '/4');
bindImgDeleteEvent();
} else {
new _alert(result.message).show();
}
... ...
... ... @@ -151,7 +151,7 @@ function bindPaginationClick() {
$('.blk-pagination li').off('click').on('click', function(e) {
var $this = $(this);
var page = $this.find('a').attr('href').split('=')[1];
var type = getQueryString().type;
var type = getCurrentTabType();
e.preventDefault();
... ... @@ -160,7 +160,7 @@ function bindPaginationClick() {
$this.addClass('active');
$(window).scrollTop(0);
getOrderList(type, page);
getOrderList(typeMap[type], page);
}
});
... ...
... ... @@ -89,6 +89,9 @@ $(function() {
}).delegate('#checkout_btn', 'click', function(e) {
e.preventDefault();
if ($('.chk-group').length) {
// 防止回退history.go(-1)时页面状态不改变
// 这里可以添加loading效果
window.location.reload();
Cart.checkStorage(function() {
if (!$(this).hasClass('disable')) {
window.location.href = '/shopping/order';
... ... @@ -98,6 +101,7 @@ $(function() {
return false;
});
// 商品删除模块
$('#removed_products').delegate('.send-to-favorite', 'click', function() {
var $removedProduct = $(this).parents('.removed-product');
... ...
... ... @@ -10,13 +10,18 @@ var JSON = require('yoho-json2');
var _confirm = Dialog.Confirm;
var _alert = Dialog.Alert;
var Util = require('./util');
var hbs = require('yoho-handlebars');
// var hbs = require('yoho-handlebars');
var Stepper = require('./stepper');
// 删除商品信息
var removedProSkus = [];
var removedProsInfo = [];
// 模版
var removedGoodsTpl = require('../../../tpl/shopping/removed-goods.hbs');
var editTpl = require('../../../tpl/shopping/edit-color-size.hbs');
var Cart = {
/*
* 添加到购物车
... ... @@ -229,7 +234,7 @@ var Cart = {
var currentRemovedLen = removedProsInfo.length;
var currentItemBuyNumber;
var template;
// var template;
if (extraInfos.length) {
for (index; index < productsLen; index++) {
... ... @@ -264,8 +269,11 @@ var Cart = {
}
// 刷新
template = hbs.compile($('#removed-products').html());
$('#removed_products').html(template({
// template = hbs.compile($('#removed-products').html());
// $('#removed_products').html(template({
// removedProducts: removedProsInfo
// }));
$('#removed_products').html(removedGoodsTpl({
removedProducts: removedProsInfo
}));
},
... ... @@ -333,7 +341,7 @@ var Cart = {
* @params { Function } setEditable 编辑商品回调
*/
editColorOrSize: function(productId, skn, defaultColor, defaultSize, setEditable) {
var template;
// var template;
var index = 0;
var colors;
var colorsLen;
... ... @@ -384,29 +392,36 @@ var Cart = {
}
// helpers start
hbs.registerHelper('isEqual', function(v1, v2, options) {
if (v1 === v2) {
return options.fn(this);
}
return options.inverse(this);
});
hbs.registerHelper('image', function(url, width, height, mode) {
mode = parseInt(mode, 10) ? mode : 2;
url = url || '';
return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
});
// hbs.registerHelper('isEqual', function(v1, v2, options) {
// if (v1 === v2) {
// return options.fn(this);
// }
// return options.inverse(this);
// });
// hbs.registerHelper('image', function(url, width, height, mode) {
// mode = parseInt(mode, 10) ? mode : 2;
// url = url || '';
// return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
// });
// helpers end
template = hbs.compile($('#edit-color-size-tpl').html());
editTarget.append(
template({
colors: filterSet,
defaultColor: defaultColor,
defaultSize: defaultSize,
defaultImg: defaultImg
})
// template = hbs.compile($('#edit-color-size-tpl').html());
// editTarget.append(
// template({
// colors: filterSet,
// defaultColor: defaultColor,
// defaultSize: defaultSize,
// defaultImg: defaultImg
// })
// );
editTarget.append(editTpl({
colors: filterSet,
defaultColor: defaultColor,
defaultSize: defaultSize,
defaultImg: defaultImg
})
);
oldProductSku = editTarget.find('.current-sizes .current').attr('data-sku');
... ...
... ... @@ -6,7 +6,12 @@
*/
var dialog = require('../../plugins/dialog');
var _alert = dialog.Alert;
var hbs = require('yoho-handlebars');
// var hbs = require('yoho-handlebars');
// 模版
var emptyCartTpl = require('../../../tpl/shopping/empty-cart.hbs');
var cartTpl = require('../../../tpl/shopping/cart-content.hbs');
var Util = {
... ... @@ -43,58 +48,54 @@ var Util = {
* @params { Function } callback 购物车刷新后回调
*/
refreshCart: function(data, callback) {
var template;
// var template;
if (!data.hasGoods) {
$('#cart_content').html($('#empty-cart-tpl').html());
$('#cart_content').html(emptyCartTpl);
return;
}
// helpers start
hbs.registerHelper('multiple', function(num1, num2) {
num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
if (num1 && num2) {
return num1 * num2;
}
});
hbs.registerHelper('isEqual', function(v1, v2, options) {
if (v1 === v2) {
return options.fn(this);
}
return options.inverse(this);
});
hbs.registerHelper('round', function(num, fixedNum) {
num = typeof num === 'number' ? num : parseFloat(num, 10);
return num.toFixed(fixedNum);
});
hbs.registerHelper('showStorage', function(leftNumber) {
leftNumber = typeof num1 === 'number' ? leftNumber : parseFloat(leftNumber, 10);
if (leftNumber <= 3 && leftNumber >= 0) {
return '仅剩' + leftNumber + '件';
} else if (leftNumber < 0) {
return '库存不足';
}
});
hbs.registerHelper('image', function(url, width, height, mode) {
mode = parseInt(mode, 10) ? mode : 2;
url = url || '';
return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
});
// // helpers start
// hbs.registerHelper('multiple', function(num1, num2) {
// num1 = typeof num1 === 'number' ? num1 : parseFloat(num1, 10);
// num2 = typeof num2 === 'number' ? num2 : parseFloat(num2, 10);
// if (num1 && num2) {
// return num1 * num2;
// }
// });
// hbs.registerHelper('isEqual', function(v1, v2, options) {
// if (v1 === v2) {
// return options.fn(this);
// }
// return options.inverse(this);
// });
// hbs.registerHelper('round', function(num, fixedNum) {
// num = typeof num === 'number' ? num : parseFloat(num, 10);
// return num.toFixed(fixedNum);
// });
// hbs.registerHelper('showStorage', function(leftNumber) {
// leftNumber = typeof num1 === 'number' ? leftNumber : parseFloat(leftNumber, 10);
// if (leftNumber <= 3 && leftNumber >= 0) {
// return '仅剩' + leftNumber + '件';
// } else if (leftNumber < 0) {
// return '库存不足';
// }
// });
// hbs.registerHelper('image', function(url, width, height, mode) {
// mode = parseInt(mode, 10) ? mode : 2;
// url = url || '';
// return url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);
// });
// helpers end
template = hbs.compile($('#cart-content-tpl').html());
$('#cart_content').html(template(data));
// 防止回退history.go(-1)时页面状态不改变
window.location.reload();
// template = hbs.compile($('#cart-content-tpl').html());
$('#cart_content').html(cartTpl(data));
if (callback) {
return callback();
... ...
... ... @@ -23,6 +23,10 @@
color: #fff;
}
.good-name-text:hover {
text-decoration: underline;
}
.change-tag {
margin: 10px auto 0;
color: #1b1b1b;
... ...
... ... @@ -21,6 +21,10 @@
}
}
.goods-container {
width: 990px;
}
.thumb-box {
position: relative;
float: left;
... ...
... ... @@ -28,8 +28,6 @@
}
.goods-container {
width: 990px;
.for-return {
display: block;
}
... ...
<div class="cart-header">
<div class="titles">
<div class="item">
<label id="toggle_check" class="toggle-chk chk-all {{#if checkAll}}chk-group{{/if}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
全选
</label>
</div>
<div class="item product">货品</div>
<div class="item price">价格</div>
<div class="item num">数量</div>
<div class="item pro-total-price">总价</div>
<div class="item actions">操作</div>
</div>
</div>
{{# if preSalePros}}
<div class="cart-pro-list pre-pros">
<div class="title">
<span class="main">预售商品</span>
<span class="note">不同上市期的商品我们将为您先到先发</span>
</div>
<div class="pro-list">
{{#each preSalePros}}
<div class="pros-group">
{{# each this}}
<ul>
<li class="chk" data-product_info='{"goods_type": "advance", "buy_number": {{buy_number}}, "selected": "{{selected}}", "product_sku": "{{product_sku}}", "promotion_id": 0}'>
<label class="toggle-chk-item {{#isEqual selected 'Y'}}chk-group{{/isEqual}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
</label>
<input type="hidden" name="product_ids[]"/>
</li>
<li>
<a href="/product/pro_{{product_id}}_{{goods_id}}/{{cn_alphabet}}.html" target="_blank">
<img src="{{image goods_images 100 134}}" alt="{{product_name}}">
</a>
</li>
<li class="pro-info">
{{!-- <div class="brand-name">{{brand_name}}</div> --}}
<div class="pro-name"><a href="/product/pro_{{product_id}}_{{goods_id}}/{{cn_alphabet}}.html" target="_blank">{{product_name}}</a></div>
<div class="color-size editable" data-product_id={{product_id}} id="edit_{{product_id}}">
{{#if color_name}}
<span class="mr20">颜色: {{color_name}}</span>
{{/if}}
{{#if size_name}}
<span>尺寸: {{size_name}}</span>
{{/if}}
<span class="iconfont">&#xe63c;</span>
</div>
{{#expect_arrival_time}}
<div class="published-at">上市期: {{expect_arrival_time}}</div>
{{/expect_arrival_time}}
</li>
<li class="price-num">
<span class="price sale-price">¥ {{round sales_price 2}}</span>
<div class="stepper" data-productType={{goods_type}}>
<div class="minus action {{#isEqual buy_number 1}}disable{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value={{buy_number}} />
</div>
<div class="plus action {{#isEqual left_number 0}}disable{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ {{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_extra_info='{"goodsId": "{{goods_id}}", "cnAlphabet": "{{cn_alphabet}}", "productId": "{{product_id}}", "salesPrice": "{{round sales_price 2}}", "productName": "{{product_name}}", "goodType":"ordinary", "selected": "{{selected}}"}'><span class="iconfont">&#xe614;</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div class="send-to-favorite action" data-product_id={{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
{{/each}}
</div>
{{/each}}
</div>
</div>
{{/ if}}
{{# if commonPros }}
<div class="cart-pro-list cart-pros">
<div class="title">
<span class="main">普通商品</span>
</div>
<div class="pro-list">
{{#each commonPros}}
<div class="pros-group">
{{# each this}}
<ul>
<li class="chk" data-product_info='{"goods_type": "ordinary", "buy_number": {{buy_number}}, "selected": "{{selected}}", "product_sku": "{{product_sku}}", "promotion_id": 0}'>
<label class="toggle-chk-item {{#isEqual selected 'Y'}}chk-group{{/isEqual}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
</label>
<input type="hidden" name="product_ids[]"/>
</li>
<li>
<a href="/product/pro_{{product_id}}_{{goods_id}}/{{cn_alphabet}}.html" target="_blank">
<img src="{{image goods_images 100 134}}" alt="{{product_name}}">
</a>
</li>
<li class="pro-info">
{{!-- <div class="brand-name">{{brandName}}</div> --}}
<div class="pro-name"><a href="/product/pro_{{product_id}}_{{goods_id}}/{{cn_alphabet}}.html" target="_blank">{{product_name}}</a></div>
<div class="color-size editable" data-product_id={{product_id}} id="edit_{{product_id}}">
{{#if color_name}}
<span class="mr20">颜色: {{color_name}}</span>
{{/if}}
{{#if size_name}}
<span>尺寸: {{size_name}}</span>
{{/if}}
<span class="iconfont">&#xe63c;</span>
</div>
</li>
<li class="price-num">
<span class="price sale-price">¥ {{round sales_price 2}}</span>
<div class="stepper" data-productType={{goods_type}}>
<div class="minus action {{#isEqual buy_number 1}}disable{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value={{buy_number}} />
</div>
<div class="plus action {{#isEqual left_number 0}}disable{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ {{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_extra_info='{"goodsId": "{{goods_id}}", "cnAlphabet": "{{cn_alphabet}}", "productId": "{{product_id}}", "salesPrice": "{{round sales_price 2}}", "productName": "{{product_name}}", "goodType":"ordinary", "selected": "{{selected}}"}'><span class="iconfont">&#xe614;</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div class="send-to-favorite action" data-product_id={{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
{{/each}}
</div>
{{/each}}
</div>
</div>
{{/ if}}
{{# if invalidPros}}
<div class="cart-pro-list invalid-pros">
<div class="pro-list">
{{#each invalidPros}}
<ul>
<li class="chk" data-product_info='{"goods_type": "invalid", "buy_number": {{buy_number}}, "selected": "{{selected}}", "product_sku": "{{product_sku}}", "promotion_id": 0}'>
<span class="iconfont warning">&#xe625;</span>
</li>
<li>
<a href="javascript:void(0)">
<img src="{{image goods_images 100 134}}" alt="{{product_name}}">
</a>
</li>
<li class="pro-info">
<div class="pro-name"><a href="javascript:void(0)">{{product_name}}</a></div>
<div>
{{#if color_name}}
<span class="mr20">颜色: {{color_name}}</span>
{{/if}}
{{#if size_name}}
<span>尺寸: {{size_name}}</span>
{{/if}}
</div>
</li>
<li class="price-num">
<span class="price sale-price">¥ {{round sales_price 2}}</span>
<div class="stepper" data-productType={{goods_type}}>
<div class="minus action {{#isEqual buy_number 1}}disable{{/isEqual}}">
<span class="iconfont">&#xe621;</span>
</div>
<div class="num">
<input type="text" class="input" value={{buy_number}} />
</div>
<div class="plus action {{#isEqual left_number 0}}disable{{/isEqual}}">
<span class="iconfont">&#xe61f;</span>
</div>
<div class="warning">
{{showStorage left_number}}
</div>
</div>
</li>
<li class="total-price-action">
<span class="price item-total-price">¥ {{round (multiple sales_price buy_number) 2}}</span>
<div class="actions">
<div class="remove-item action" data-product_id={{product_id}}><span class="iconfont">&#xe614;</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div class="send-to-favorite action" data-product_id={{product_id}}>移入收藏夹</div>
</div>
</li>
</ul>
{{/each}}
</div>
</div>
{{/if}}
<div class="cart-statement">
<div class="actions">
<div class="action">
<label id="toggle_check" class="toggle-chk chk-all {{#if checkAll}}chk-group{{/if}}">
<span class="iconfont checkbox not-checked">&#xe601;</span>
<span class="iconfont checkbox checked">&#xe602;</span>
<span>全选</span>
</label>
</div>
<div id="remove_selected" class="action hoverable">删除选中的商品</div>
<div id="send_favorite" class="action hoverable">移入收藏夹</div>
<div class="selected-num">已选<span>{{selectedNum}}</span></div>
<div class="checkout-total">
<div class="total-title">商品金额:</div>
<div class="total-money">¥ <span>{{round totalMoney 2}}</span></div>
</div>
</div>
<div class="calculate">
<div class="checkout-total pay-total">
<div class="pay-title">应付金额(不含运费):</div>
<div class="total-money">¥ <span>{{round totalMoney 2}}</span></div>
</div>
</div>
<div class="checkout">
<span class="btn {{#unless selectedNum}}disable{{/unless}}" id="checkout_btn">去结算</span>
</div>
</div>
\ No newline at end of file
... ...
<div class="edit-color-size">
<div class="indicator"><i></i></div>
<div class="content">
<div class="left">
<div class="default-color mb20">
<span class="color-label mr10">Color: </span><span class="selected-color">{{defaultColor}}</span>
</div>
<div class="colors-list mb20">
{{#each colors}}
{{#if active}}
<span class="color-item current-color {{#unless selectable}}disabled{{/unless}}"
style="background: {{rgb}}"
data-imageurl="{{image pic 100 134}}"
data-target="{{proId}}-color-{{@index}}"
data-title="{{color}}">
<span class="inner"></span>
</span>
{{^}}
<span class="color-item {{#unless selectable}}disabled{{/unless}}"
style="background: {{rgb}}"
data-imageurl="{{image pic 100 134}}"
data-target="{{proId}}-color-{{@index}}"
data-title="{{color}}">
<span class="inner"></span>
</span>
{{/if}}
{{/each}}
</div>
{{#each colors}}
<div class="sizes-list {{#if active}}current-sizes{{/if}}" id="{{proId}}-color-{{@index}}" style="display: {{#if active}}block{{^}}none{{/if}};">
<div class="default-size mb20">
<span class="size-label mr10">Size: </span><span>{{../defaultSize}}</span>
</div>
<div class="sizes-list mb10">
{{#each sizes}}
{{#isEqual ../../defaultSize name}}
<span class="size-item mr10 mb10 current {{#isEqual num 0}}disabled{{/isEqual}}"
data-sku="{{sku}}">{{name}}</span>
{{^}}
<span class="size-item mr10 mb10 {{#isEqual num 0}}disabled{{/isEqual}}"
data-sku="{{sku}}">{{name}}</span>
{{/isEqual}}
{{/each}}
</div>
</div>
{{/each}}
<div class="actions">
<span class="btn mr20" id="confirm">确定</span>
<span class="btn disable" id="cancel">取消</span>
</div>
</div>
<div class="right">
<img src="{{image defaultImg 100 134}}" class="img-preview" title="{{defaultColor}}"/>
</div>
</div>
</div>
\ No newline at end of file
... ...
<div class="empty-cart">
<div class="empty-cart-bg"></div>
<p class="empty-cart-info">购物袋空空的哦,去看看心仪的商品吧~</p>
<a href="/" class="go-to-shop">
<span class="btn white">去购物</span>
</a>
</div>
\ No newline at end of file
... ...
<div class="cart-removed-list">
<div class="info-bar">
<p class="info-text">已删除商品,您可以重新购买或移入收藏:</p>
</div>
<div class="removed-products">
<ul>
{{#each removedProducts}}
<li class="removed-product">
<div class="product-name">
<a href="/product/pro_{{productId}}_{{goodsId}}/{{cnAlphabet}}.html" target="_blank">{{productName}}</a>
</div>
<div class="product-price">¥ {{salesPrice}}</div>
<div class="bought-num">{{buyNumber}}</div>
<div class="actions">
<span class="buy-again" data-rebuy_info='{"buyNumber": {{buyNumber}}, "productSku": "{{productSku}}"}'>重新购买</span>
<span class="send-to-favorite" data-product_info='{"goods_type": "{{goodType}}", "buy_number": {{buyNumber}}, "selected": "{{selected}}", "product_sku": "{{productSku}}", "promotion_id": 0}'>移入收藏夹</span>
</div>
</li>
{{/each}}
</ul>
</div>
</div>
\ No newline at end of file
... ...