Authored by 姜枫

handle merge

... ... @@ -12,13 +12,13 @@ const orderModel = require('../models/order');
/**
* 我的订单
*/
const index = (req, res) => {
const index = (req, res, next) => {
const type = req.query.type;
const page = req.query.page;
const uid = global.yoho.uid || '7394907';
orderModel.getOrderData(uid, type, page).then(result => {
res.render('index', {
res.display('index', {
page: 'order',
isMe: true,
content: Object.assign({
... ... @@ -27,15 +27,15 @@ const index = (req, res) => {
banner: 'http://placehold.it/{width}x{height}'
}, result)
});
});
}).catch(next);
};
const detail = (req, res) => {
const detail = (req, res, next) => {
const code = req.query.code;
const uid = global.yoho.uid || '7394907';
orderModel.getOrderDetail(uid, code).then(result => {
res.render('index', {
res.display('index', {
isMe: true,
page: 'order-detail',
content: Object.assign({
... ... @@ -44,26 +44,28 @@ const detail = (req, res) => {
banner: 'http://placehold.it/{width}x{height}'
}, result)
});
});
}).catch(next);
};
const getOrderList = (req, res) => {
const getOrderList = (req, res, next) => {
const type = req.query.type;
const page = req.query.page;
const uid = global.yoho.uid || '7394907';
orderModel.getOrderData(uid, type, page).then(result => {
res.render('order-table', {
res.display('order-table', {
layout: false,
page: 'order',
isMe: true,
orderList: result.order.orderList,
paginationOpts: result.order.paginationOpts
paginationOpts: result.order.paginationOpts,
emptyMsg: result.order.emptyMsg,
showEmptyEn: result.order.showEmptyEn
});
});
}).catch(next);
};
const getOrderTotal = (req, res) => {
const getOrderTotal = (req, res, next) => {
const type = req.query.type;
const uid = global.yoho.uid || '7394907';
... ... @@ -74,40 +76,40 @@ const getOrderTotal = (req, res) => {
total: result.order.total,
type: result.order.type
});
});
}).catch(next);
};
const cancelOrder = (req, res) => {
const cancelOrder = (req, res, next) => {
const uid = global.yoho.uid || '7394907';
const code = req.query.orderCode;
const data = req.query;
orderModel.cancelOrder(uid, code).then(result => {
orderModel.cancelOrder(uid, data).then(result => {
res.json(result);
});
}).catch(next);
};
const deleteOrder = (req, res) => {
const deleteOrder = (req, res, next) => {
const uid = global.yoho.uid || '7394907';
const code = req.query.orderCode;
orderModel.deleteOrder(uid, code).then(result => {
res.json(result);
});
}).catch(next);
};
const getExpressInfo = (req, res) => {
const getExpressInfo = (req, res, next) => {
const uid = global.yoho.uid || '7394907';
const code = req.query.orderCode;
orderModel.getExpressInfo(uid, code).then(result => {
res.json(result);
});
}).catch(next);
};
const getCancelOrderReason = (req, res) => {
const getCancelOrderReason = (req, res, next) => {
orderModel.getCancelOrderReason().then(result => {
res.json(result);
});
}).catch(next);
};
const editOrder = (req, res) => {
... ... @@ -121,6 +123,16 @@ const editOrder = (req, res) => {
});
};
const reAddCart = (req, res) => {
const uid = global.yoho.uid || '7394907';
const code = req.query.orderCode;
orderModel.reAddCart(uid, code).then(result => {
res.json(result);
});
};
module.exports = {
index: index,
detail: detail,
... ... @@ -130,5 +142,6 @@ module.exports = {
deleteOrder: deleteOrder,
editOrder: editOrder,
getExpressInfo: getExpressInfo,
getCancelOrderReason: getCancelOrderReason
getCancelOrderReason: getCancelOrderReason,
reAddCart: reAddCart
};
... ...
... ... @@ -72,6 +72,7 @@ const invoiceText = {
2: '电子'
};
// 订单状态
const statusMap = {
0: {
... ... @@ -100,8 +101,8 @@ const statusMap = {
},
4: {
value: 2,
valueStr: '已发货',
step: 2,
valueStr: '待收货',
step: 3,
showGetBtn: true,
btns: btnMap.complete
},
... ... @@ -282,11 +283,13 @@ const deleteOrder = (uid, code) => {
});
};
const cancelOrder = (uid, code) => {
const cancelOrder = (uid, data) => {
return api.get('', {
method: 'app.SpaceOrders.close',
uid: uid,
order_code: code
order_code: data.orderCode,
reason_id: data.reasonId,
reason: data.reason
}, {
cache: true
});
... ... @@ -328,6 +331,19 @@ const getOrderData = (uid, type, page) => {
]
};
const emptyMsg = {
1: {
text: '您暂时还没有订单',
showEmptyEn: true
},
2: {
text: '您暂时还没有待付款的订单'
},
3: {
text: '您暂时还没有待收货的订单'
}
};
type = parseInt(type, 10);
type = type < 4 ? type : 1;
... ... @@ -342,6 +358,11 @@ const getOrderData = (uid, type, page) => {
type: type
};
const empty = {
showEmptyEn: emptyMsg[type].showEmptyEn,
emptyMsg: emptyMsg[type].text
};
navBar.tabs[typeActiveIndexMap[type]].isActive = true;
const order = Object.assign(basicData, {
... ... @@ -357,7 +378,7 @@ const getOrderData = (uid, type, page) => {
} : false;
return {
order: Object.assign(order, paginationOpts)
order: Object.assign(order, paginationOpts, empty)
};
});
};
... ... @@ -375,6 +396,11 @@ const getOrderDetail = (uid, code) => {
detail.createTime = _convertUnixTime(detail.createTime);
if (detail.isCancel === 'N' &&
st === 0) {
detail.showLeftTime = true;
}
// 需要和接口确认如何获取运费,接口文档和线上数据不一致
// if (detail.shippingCost) {
// detail.shippingCost = _removeRmbIcon(detail.shippingCost);
... ... @@ -433,6 +459,16 @@ const editOrder = data => {
});
};
const reAddCart = (uid, code) => {
return api.get('', {
method: 'app.Shopping.readd',
uid: uid,
order_code: code
}, {
cache: true
});
};
module.exports = {
getOrderData: getOrderData,
getOrderDetail: getOrderDetail,
... ... @@ -440,5 +476,6 @@ module.exports = {
getCancelOrderReason: getCancelOrderReason,
deleteOrder: deleteOrder,
editOrder: editOrder,
getExpressInfo: getExpressInfo
getExpressInfo: getExpressInfo,
reAddCart: reAddCart
};
... ...
... ... @@ -9,6 +9,8 @@
const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
// const auth = require(`${global.middleware}/auth`);
// 订单
const order = require(`${cRoot}/order`);
const address = require(`${cRoot}/address`);
... ... @@ -24,6 +26,7 @@ router.get('/cancelOrder', order.cancelOrder);
router.get('/getCancelOrderReason', order.getCancelOrderReason);
router.get('/getExpressInfo', order.getExpressInfo);
router.get('/editOrder', order.editOrder);
router.get('/reAdd', order.reAddCart);
// 个人中心首页/收货地址
router.get('/address', address.index);
... ...
<div class="goods-list info-box">
<h4 class="status-title">商品清单</h4>
{{#isY isMultiPackage}}
<div class="multi-package-row">
温馨提示:您购买的商品<em class="blue">分属不同仓库</em>,需要调拨,将被拆分成多个包裹送达
<span class="iconfont show-package">&#xe643;</span>
<div class="package-list hide">
<div class="package-up-icon"></div>
{{#each packageList}}
<div class="package-item">
<p class="package-title bold">包裹{{math @index '+' 1}}:{{#if @first}}总仓发货{{^}}异地调拨{{/if}}</p>
<ul class="package-goods clearfix">
{{#each goodsList}}
<li class="left">
<img class="lazy package-goods-img" data-original="{{image goodsImages 100 134}}">
</li>
{{/each}}
</ul>
<p class="package-shipping">运费:¥{{shoppingCost}}元(原价{{shoppingOrigCost}}元,优惠{{shoppingCutCost}}元)</p>
</div>
{{/each}}
</div>
</div>
{{/isY}}
<div class="table">
<ul class="header">
<li class="first">商品信息</li>
... ...
... ... @@ -13,6 +13,15 @@
</div>
</div>
{{#if showLeftTime}}
<div class="time">
<span>剩余支付时间:</span>
<span class="iconfont">&#xe606;</span>
<p class="left-time" data-left={{payLefttime}}></p>
<span class="tip">(逾期订单将自动取消)</span>
</div>
{{/if}}
{{#if steps}}
<div class="time-line">
<ul>
... ...
... ... @@ -6,7 +6,7 @@
<li class="content">下单时间:{{createTime}}</li>
<li class="content">订单编号:{{orderCode}}</li>
{{#if showMobile}}
<li class="content">手机订单</li>
<li class="content"><span class="iconfont">&#xe62f;</span>手机订单</li>
{{/if}}
</ul>
<div class="table-body">
... ... @@ -25,7 +25,7 @@
{{#if showPayButton}}
<div class="pay-operation">
{{#if isOnlinePaid}}
<p class="left-time" data-left="{{payLefttime}}"></p>
<span class="iconfont">&#xe606;</span><p class="left-time" data-left="{{payLefttime}}"></p>
<span class="btn red">立即付款</span>
{{/if}}
<p class="subtext cancel">取消订单</p>
... ... @@ -43,7 +43,7 @@
{{/if}}
<div class="buy-operation{{#unless showBuyBtn}} hide{{/unless}}">
<span class="btn black">再次购买</span>
<span class="btn black buy">再次购买</span>
<p class="subtext delete">删除订单</p>
</div>
... ... @@ -57,8 +57,10 @@
{{^}}
<div class="bg"></div>
<div class="msg">
<p class="msg-zh bold">您暂时还没有订单</p>
<p class="msg-zh bold">{{emptyMsg}}</p>
{{#if showEmptyEn}}
<p class="msg-en">You do not have an order for the time being</p>
{{/if}}
<span class="btn">去购物</span>
</div>
{{/if}}
... ...
... ... @@ -37,6 +37,66 @@ const product = (req, res, next) => {
res.json(resData);
};
const brand = (req, res, next) => {
let uid = req.user.uid;
let pid = req.body.brandId;
let type = (req.body.type === 'add');
let resData = {
code: 400,
message: '操作失败'
};
if (uid) {
if (pid) {
fav.toggleFavBrand(pid, uid, type).then(result => {
res.json(result);
}).catch(next);
return;
}
} else {
Object.assign(resData, {
code: 403,
message: '请登录后执行该操作',
data: {
refer: helpers.urlFormat('/signin')
}
});
}
res.json(resData);
};
const shop = (req, res, next) => {
let uid = req.user.uid;
let pid = req.body.shopId;
let type = (req.body.type === 'add');
let resData = {
code: 400,
message: '操作失败'
};
if (uid) {
if (pid) {
fav.toggleFavShop(pid, uid, type).then(result => {
res.json(result);
}).catch(next);
return;
}
} else {
Object.assign(resData, {
code: 403,
message: '请登录后执行该操作',
data: {
refer: helpers.urlFormat('/signin')
}
});
}
res.json(resData);
};
module.exports = {
product // 组件demo页
product,
brand,
shop
};
... ...
... ... @@ -95,7 +95,6 @@ const shop = {
q.page = parseInt(q.page || 1, 10);
ShopData.getShopHeadData(domain, uid).then(result => {
data.banner = result;
if (data.banner.banner) {
... ...
... ... @@ -19,9 +19,9 @@ const getDomainInfo = domain => {
})();
};
const getBrandInfo = bid => {
const getBrandInfo = (bid, uid) => {
return co(function*() {
let brandInfo = yield api.getBrandInfo(bid);
let brandInfo = yield api.getBrandInfo(bid, uid);
if (!brandInfo.data || brandInfo.code !== 200) {
return {};
... ...
... ... @@ -8,21 +8,21 @@
const api = global.yoho.API;
const addFavAsync = (uid, pid) => {
const addFavAsync = (uid, id, type) => {
return api.get('', {
method: 'app.favorite.add',
id: pid,
id: id,
uid: uid,
type: 'product'
type: type
});
};
const cancelFavAsync = (uid, pid) => {
const cancelFavAsync = (uid, id, type) => {
return api.get('', {
method: 'app.favorite.cancel',
fav_id: pid,
fav_id: id,
uid: uid,
type: 'product'
type: type
});
};
... ...
... ... @@ -10,13 +10,31 @@ const FavAPI = require('./favorite-api');
const toggleFavProduct = (productId, uid, isadd) => {
if (isadd) {
return FavAPI.addFavAsync(uid, productId);
return FavAPI.addFavAsync(uid, productId, 'product');
} else {
return FavAPI.cancelFavAsync(uid, productId);
return FavAPI.cancelFavAsync(uid, productId, 'product');
}
};
const toggleFavBrand = (brandId, uid, isadd) => {
if (isadd) {
return FavAPI.addFavAsync(uid, brandId, 'brand');
} else {
return FavAPI.cancelFavAsync(uid, brandId, 'brand');
}
};
const toggleFavShop = (shopId, uid, isadd) => {
if (isadd) {
return FavAPI.addFavAsync(uid, shopId, 'shop');
} else {
return FavAPI.cancelFavAsync(uid, shopId, 'shop');
}
};
module.exports = {
toggleFavProduct
toggleFavProduct,
toggleFavBrand,
toggleFavShop
};
... ...
... ... @@ -122,6 +122,8 @@ const ShopService = {
let brandId = domainInfo.id;
let brandInfo = yield BrandService.getBrandInfo(brandId, uid);
console.log(brandInfo);
info.name = brandInfo.brandName;
info.info = brandInfo.brandIntro;
info.btnName = '品牌介绍';
... ...
... ... @@ -24,6 +24,8 @@ router.post('/item/togglecollect', fav.product); // 商品详情页
router.get('/shop/query/all', shop.indexQuery);
router.get('/shop/:domain/list', shop.list);
router.get('/shop/:domain', shop.index);
router.post('/shop/togglecollect', fav.shop);
router.post('/brand/togglecollect', fav.brand);
router.get('/query', query.index);
... ...
{{# banner}}
<div class="brand-banner">
<div class="brand-banner" data-brand="{{brandId}}" data-shop="{{shopId}}">
<div class="brand-img" style="height:150px; background: url('{{image banner 1150 150}}')"></div>
<p class="opts">
<a id="brand-info">
... ...
module.exports = {
success: 200,
notModified: 304,
notFound: 404,
badRequest: 400,
internalError: 500
};
... ...
var cancelOrder = require('./order/cancel-order');
var editOrder = require('./order/edit-order');
var countDown = require('./order/countdown');
function reload() {
... ... @@ -35,3 +36,14 @@ $('.order .edit-btn').on('click', function() {
}
}, reload);
});
if ($('.left-time').length) {
countDown.intervalValue = 1000;
countDown.showSec = true;
countDown.start();
}
$('.show-package').on('click', function() {
$(this).next('.package-list').toggleClass('hide');
});
... ...
... ... @@ -11,6 +11,11 @@ var expressTpl = require('../../tpl/me/express.hbs');
var cancelOrder = require('./order/cancel-order');
var reOrder = require('./order/readd-order');
// 订单剩余时间显示及倒计时
var countDown = require('./order/countdown');
// 更新表格
var tableOperation = {
$header: $('.table.column-category'),
... ... @@ -24,60 +29,6 @@ var tableOperation = {
}
};
// 订单剩余时间显示及倒计时
var countDown = {
count: null,
intervalTimer: null,
intervalValue: 60000,
$element: null,
selector: '.left-time',
setTime: function() {
var that = this;
this.$element.each(function(index, item) {
var $item = $(item);
var leftTime = $item.data('left');
$item.text(that.convertLeftTime(leftTime - that.count * 60));
});
this.count += 1;
},
convertLeftTime: function(src) {
var min = parseInt(src / 60, 10) % 60;
var hour = parseInt(src / 3600, 10);
var timeStr = min + '分';
if (src <= 0) {
timeStr = '已失效';
return timeStr;
}
if (hour > 0) {
timeStr = hour + '时' + timeStr;
}
timeStr = '剩余' + timeStr;
return timeStr;
},
getLeftTime: function() {
var that = this;
if (this.$element.length) {
this.setTime();
this.intervalTimer = setInterval(this.setTime.bind(that), that.intervalValue);
}
},
start: function() {
this.count = 0;
this.$element = $(this.selector);
if (this.intervalTimer) {
clearInterval(this.intervalTimer);
}
this.getLeftTime();
}
};
// 订单类型
var typeMap = {
all: 1,
... ... @@ -168,6 +119,14 @@ function getCurrentPage() {
return page;
}
function bindBuyEvent() {
$('.buy-operation .buy').off('click').on('click', function() {
var code = $(this).closest('.order').data('code');
reOrder(code);
});
}
function updateTableContent($el) {
var type = getCurrentTabType();
var page = getCurrentPage();
... ... @@ -177,6 +136,7 @@ function updateTableContent($el) {
$el.find('.pay-operation').remove();
$el.find('.buy-operation').removeClass('hide');
setOrderTotal();
bindBuyEvent();
} else {
type = typeMap[type];
getOrderList(type, page);
... ... @@ -334,11 +294,13 @@ function bindExpressEvent() {
});
}
function bindEvent() {
bindPaginationClick();
bindDeleteEvent();
bindCancelEvent();
bindExpressEvent();
bindBuyEvent();
}
bindEvent();
... ...
... ... @@ -26,10 +26,16 @@ function getTpl(data) {
// 取消订单
function cancelOrder(code, onCancel) {
var $checked = $('.reason .row .checked');
var reason = $checked.next('.reason-text').text();
var reasonId = $checked.parent().data('value');
$.ajax({
url: '/me/cancelOrder',
data: {
orderCode: code
orderCode: code,
reasonId: reasonId,
reason: reason
}
}).done(function() {
var tip = new _dialog({
... ...
// 订单剩余时间显示及倒计时
module.exports = {
count: null,
intervalTimer: null,
intervalValue: 60000,
$element: null,
selector: '.left-time',
addtionalMsg: '',
showSec: false,
setTime: function() {
var that = this;
this.$element.each(function(index, item) {
var $item = $(item);
var leftTime = $item.data('left');
var i = that.intervalValue / 1000;
$item.text(that.convertLeftTime(leftTime - that.count * i));
});
this.count += 1;
},
convertLeftTime: function(src) {
var sec = parseInt(src, 10) % 60;
var min = parseInt(src / 60, 10) % 60;
var hour = parseInt(src / 3600, 10);
var timeStr = min + '分';
if (src <= 0) {
timeStr = '已失效';
return timeStr;
}
if (this.showSec) {
timeStr += sec + '秒';
}
if (hour > 0) {
timeStr = hour + '时' + timeStr;
}
timeStr = '剩余' + timeStr;
if (this.addtionalMsg.length > 0) {
timeStr += this.addtionalMsg;
}
return timeStr;
},
getLeftTime: function() {
var that = this;
if (this.$element.length) {
this.setTime();
this.intervalTimer = setInterval(this.setTime.bind(that), that.intervalValue);
}
},
start: function() {
this.count = 0;
this.$element = $(this.selector);
if (this.intervalTimer) {
clearInterval(this.intervalTimer);
}
this.getLeftTime();
}
};
... ...
var dialog = require('../../plugins/dialog');
var _alert = dialog.Alert;
module.exports = function(code) {
$.ajax({
url: '/me/reAdd',
data: {
orderCode: code
}
}).done(function(result) {
if (result.code === 200) {
location.href = '/shopping/cart';
} else {
new _alert('出错了,请重试!').show();
}
});
};
... ...
require('./list/list-search');
require('./list/favorite');
... ...
/**
* 品牌或店铺收藏
* @author: jiangfeng<jeff.jiang@yoho.cn>
* @date: 16/7/19
*/
function _favBack(data) {
if (data && data.code === 200) {
$('#brand-fav').toggleClass('coled');
}
}
function _favShop(shopId, isAdd) {
$.post('/product/shop/togglecollect', {shopId: shopId, type: isAdd ? '' : 'add'}, function(data) {
_favBack(data);
});
}
function _favBrand(brandId, isAdd) {
$.post('/product/brand/togglecollect', {brandId: brandId, type: isAdd ? '' : 'add'}, function(data) {
_favBack(data);
});
}
$('#brand-fav').click(function() {
var shopId = $(this).parents('.brand-banner').data('shop');
var brandId = $(this).parents('.brand-banner').data('brand');
var isAdd = $(this).hasClass('coled');
if (shopId) {
_favShop(shopId, isAdd);
} else if (brandId) {
_favBrand(brandId, isAdd);
}
});
... ...
... ... @@ -8,7 +8,7 @@ var Dialog = require('../plugins/dialog').Dialog;
var Shop = {
init: function() {
require('./list/list-search');
require('./list/favorite');
$('#brand-info').click(function() {
Shop.brandInfoDialog().show();
... ...
... ... @@ -16,7 +16,7 @@ var tpl = '{{#each products}}' +
var tplFn = Handlebars.compile(tpl);
require('../common/header');
require('./list/favorite');
lazyload();
$(function() {
... ... @@ -100,3 +100,4 @@ $(function() {
});
});
});
... ...
.multi-package-row {
position: relative;
height: 40px;
font-size: 14px;
line-height: 40px;
text-align: center;
background: #f4fbff;
margin-bottom: $space;
border: 1px solid $borderColor;
.show-package {
font-size: 16px;
cursor: pointer;
}
.package-up-icon {
position: absolute;
width: 10px;
height: 7px;
background: url(/shopping/package-up.png);
top: -7px;
left: 282px;
+ .package-item .package-title {
border-top: none;
}
}
.package-list {
position: absolute;
background: #fff;
border: 2px solid #bbb;
width: 586px;
right: 36px;
padding: 0 50px;
}
.package-title,
.package-shipping {
text-align: left;
margin-left: 10px;
}
.package-title {
border-top: 1px solid #eee;
line-height: 55px;
}
.package-shipping {
color: #595959;
margin-top: 20px;
margin-bottom: 30px;
}
.package-goods li {
width: 120px;
}
.package-goods-img {
display: block;
width: 100px;
height: 134px;
margin: 0 auto;
}
}
.order-status {
$basicHeight: 90px;
border-top: 1px solid $borderColor;
border-bottom: 1px solid $borderColor;
position: relative;
.time {
width: 330px;
height: 42px;
margin-top: -$space;
font-size: $smallSize;
font-weight: normal;
.iconfont {
font-size: $smallSize;
margin-right: 5px;
}
.left-time {
display: inline-block;
}
.tip {
float: right;
}
}
.basic {
height: $basicHeight;
... ...
... ... @@ -38,6 +38,10 @@
&.content {
margin-right: 25px;
.iconfont {
font-size: 16px;
}
}
}
}
... ... @@ -161,6 +165,18 @@
margin-bottom: $space;
}
.pay-operation {
.iconfont {
font-size: $normalSize;
}
.left-time {
display: inline-block;
height: $normalSize;
margin-left: 5px;
}
}
.subtext {
font-size: 12px;
cursor: pointer;
... ...
... ... @@ -28,6 +28,14 @@
display: inline-block;
}
.brand-info {
cursor: pointer;
}
.brand-fav {
cursor: pointer;
}
.iconfont {
font-size: 12px;
}
... ...
... ... @@ -20,11 +20,17 @@
border: 1px solid #fff;
padding: 10px;
margin-left: 10px;
cursor: pointer;
.iconfont {
font-size: 14px;
}
}
.brand-fav.coled .iconfont {
color: #000;
}
}
}
... ...
... ... @@ -6,7 +6,7 @@
{{# subReasons}}
<p data-value="{{id}}">
<span class="iconfont raido {{#if checked}}checked{{/if}}">{{#if checked}}&#xe603;{{^}}&#xe604;{{/if}}</span>
{{reason}}
<span class="reason-text">{{reason}}</span>
</p>
{{/ subReasons}}
</div>
... ...