Authored by zhangxiaoru

fav

Showing 100 changed files with 877 additions and 26 deletions

Too many changes to show.

To preserve performance only 100 of 100+ files are displayed.

... ... @@ -9,7 +9,7 @@
const mRoot = '../models';
const headerModel = require('../../../doraemon/models/header'); // 头部model
const addressModel = require(`${mRoot}/address`); // 地址管理 MODEL
// const helpers = global.yoho.helpers;
const helpers = global.yoho.helpers;
/**
* 地址管理页面
... ... @@ -28,7 +28,7 @@ exports.address = (req, res, next) => {
};
addressModel.address({
uid: req.user.uid || 8039759 // TODO 待删除
uid: req.user.uid
}).then(result => {
res.render('address/index', Object.assign(responseData, result));
}).catch(next);
... ... @@ -44,7 +44,7 @@ exports.address = (req, res, next) => {
exports.addressAct = (req, res, next) => {
addressModel.address({
id: req.params.id,
uid: req.user.uid || 8039759 // TODO 待删除
uid: req.user.uid
}).then(result => {
let responseData = {
module: 'home',
... ... @@ -67,14 +67,15 @@ exports.addressAct = (req, res, next) => {
*/
exports.saveAddress = (req, res, next) => {
// TODO 开发完成后放开
// if (!req.body.uid) {
// res.json({
// code: 400,
// message: '用户不可用'
// });
// }
/* 没有用户,返回 */
if (!req.body.uid) {
res.json({
code: 400,
message: '用户不可用'
});
}
/* 没有地址信息,返回 */
if (!req.body.address) {
res.json({
code: 401,
... ... @@ -82,6 +83,7 @@ exports.saveAddress = (req, res, next) => {
});
}
/* 没有地区码,返回 */
if (!req.body.area_code) {
res.json({
code: 402,
... ... @@ -89,6 +91,7 @@ exports.saveAddress = (req, res, next) => {
});
}
/* 没有收件人姓名,返回 */
if (!req.body.consignee) {
res.json({
code: 403,
... ... @@ -96,16 +99,16 @@ exports.saveAddress = (req, res, next) => {
});
}
// TODO 开发完成后放开
// if (!req.body.email || !helpers.verifyEmail(req.body.email)) {
// res.json({
// code: 404,
// message: '输入的邮箱地址格式不正确'
// });
// }
/* 邮箱地址校验不通过,返回 */
if (!req.body.email || !helpers.verifyEmail(req.body.email)) {
res.json({
code: 404,
message: '输入的邮箱地址格式不正确'
});
}
addressModel.saveAddress({
uid: req.user.uid || 8039759, // TODO 待删除
uid: req.user.uid,
address: req.body.address,
area_code: req.body.area_code,
consignee: req.body.consignee,
... ... @@ -127,7 +130,7 @@ exports.saveAddress = (req, res, next) => {
exports.delAddress = (req, res, next) => {
addressModel.delAddress({
id: req.body.id,
uid: req.user.uid || 8039759 // TODO 待删除
uid: req.user.uid
}).then(result => {
res.json(result);
}).catch(next);
... ... @@ -141,7 +144,7 @@ exports.delAddress = (req, res, next) => {
*/
exports.defaultAddress = (req, res, next) => {
addressModel.setDefaultAddress({
uid: req.user.uid || 8039759, // TODO 待删除
uid: req.user.uid,
id: req.body.id
}).then(result => {
res.json(result);
... ... @@ -165,7 +168,7 @@ exports.addressModify = (req, res, next) => {
};
addressModel.address({
uid: req.user.uid || 8039759 // TODO 待删除
uid: req.user.uid
}).then(result => {
res.render('address/address-modify', Object.assign(responseData, result, {
showAddBtn: (result.address.length <= 5),
... ... @@ -183,7 +186,7 @@ exports.addressModify = (req, res, next) => {
*/
exports.locationList = (req, res, next) => {
addressModel.locationList({
uid: req.user.uid || 8039759 // TODO 待删除
uid: req.user.uid
}).then(result => {
res.render('address/location-list', result);
}).catch(next);
... ...
/**
* 个人中心-订单列表 controller
* @author: jing.li<jing.li@yoho.cn>
* @date: 2016/08/15
*/
'use strict';
const headerModel = require('../../../doraemon/models/header'); // 头部model
const orderModel = require('../models/order');
/**
* 订单页面
* @param req
* @param res
* @param next
*/
exports.order = (req, res, next) => {
let params = {
type: req.query.type || 1,
page: req.query.page || 1,
gender: req.query.gender || '1,3',
yh_channel: req.query.channel || 1,
uid: req.user.uid
};
orderModel.order(params).then(result => {
res.render('order', {
module: 'home',
page: 'order',
pageHeader: headerModel.setNav({
navTitle: '我的订单'
}),
title: 'Yoho!Buy 有货',
order: result
});
}).catch(next);
};
/**
* 获取订单
* @param req
* @param res
* @param next
*/
exports.getOrders = (req, res, next) => {
orderModel.getOrders({
type: req.query.type || 1,
page: req.query.page || 1,
gender: req.query.gender || '1,3',
yh_channel: req.query.channel || 1,
uid: req.user.uid
}).then(result => {
res.render('order-content', {
layout: false,
orders: result
});
}).catch(next);
};
... ...
/**
* 个人中心 controller
* @author: chengyao.guo<chengyao.guo@yoho.cn>
* @date: 2016/08/10
*/
'use strict';
const headerModel = require('../../../doraemon/models/header'); // 头部model
const orderDetailModel = require('../models/orderDetail');
let orderDetail = (req, res, next) => {
let headerData = headerModel.setNav({
navTitle: '订单详情'
});
let responseData = {
module: 'home',
page: 'order-detail',
title: 'Yoho!Buy 有货',
pageHeader: headerData,
pageFooter: true
};
orderDetailModel.orderDetail({
uid: req.user.uid || 8039759, // TODO 待删除
order_code: req.query.order_code
}).then(result => {
if (result) {
res.render('orderDetail', Object.assign(responseData,
{
orderDetail: result
}));
}
}).catch(next);
};
module.exports = {
orderDetail
};
... ...
'use strict';
const api = global.yoho.API;
const helpers = global.yoho.helpers;
const camelCase = global.yoho.camelCase;
const _ = require('lodash');
/**
* 门票
* @type {{SINGLE_TICKETS_SKN: number}}
*/
const TICKETS = {
SINGLE_TICKETS_SKN: 51335912, // 展览票(单日票)skn
PACKAGE_TICKETS_SKN: 51335908 // 套票skn
};
/**
* 格式化订单商品
* @private
*/
const _formatOrderGoods = (orderGoods, count, haveLink, tickets) => {
let result = [];
_.forEach(orderGoods, value => {
let goods = {
thumb: value.goods_image,
name: value.product_name,
color: value.color_name,
size: value.size_name,
price: value.goods_price,
count: value.buy_number
};
/* gift=>是否赠品,advanceBuy=>是否加价购 */
if (value.goods_type === 'gift') {
Object.assign(goods, {
gift: true
});
} else if (value.goods_type === 'price_gift') {
Object.assign(goods, {
advanceBuy: true
});
}
/* 上市期 */
if (value.expect_arrival_time) {
Object.assign(goods, {
appearDate: value.expect_arrival_time
});
}
/* 商品链接 */
if (haveLink && value.product_skn) {
Object.assign(goods, {
link: helpers.urlFormat('/product/show_' + value.product_skn + '.html')
});
}
/* 累计购买数 */
count += parseInt(value.buy_number, 10);
/* 门票 */
if (tickets) {
/* 展览票不显示区域 */
if (value.product_skn === TICKETS.SINGLE_TICKETS_SKN) {
delete goods.size;
}
Object.assign(goods, {
tickets: true
});
}
result.push(goods);
});
return result;
};
/**
* 获取快递有关信息
* @private
*/
const _assignExpressInfo = (showLogistics, order, result) => {
if (showLogistics && order.express_company.caption && order.express_number) {
Object.assign(result, {
logisticsUrl: helpers.urlFormat('/home/logistic', {order_code: order.order_code}),
logisticsCompany: order.express_company.caption,
logisticsNum: order.express_number
});
}
};
/**
* 调用接口获取订单数据
* @returns {*}
* @private
* @param params
*/
const _getOrderData = (params) => {
return api.get('', {
method: 'app.SpaceOrders.get',
type: params.type,
page: params.page,
limit: params.limit,
gender: params.gender,
yh_channel: params.yh_channel,
uid: params.uid
}, {code: 200});
};
/**
* 获取订单状态
* @private
*/
const _getOrderStatus = (order, showLogistics) => {
let result = {};
if (order.is_cancel === 'Y') {
return {
canceled: true
};
}
// 先判断订单付款方式,根据不同的付款方式计算订单状态。(注:货到付款没有待付款状态)
// 支付方式为非货到付款时,计算订单状态。
if (parseInt(order.payment_type, 10) !== 2) {
switch (order.status) {
case 0:
/* 待付款 */
Object.assign(result, {
unpaid: true,
payUrl: helpers.urlFormat('/home/orders/pay', {order_code: order.order_code})
});
break;
case 1:
case 2:
case 3:
/* 已付款状态不给查看物流 URL */
Object.assign(result, {
unreceived: true
});
break;
case 4:
case 5:
/* 已发货状态,给查看物流或二维码URL */
Object.assign(result, {
unreceived: true
});
/* 是否门票 */
if (order.virtual_type && parseInt(order.virtual_type, 10) === 3) {
Object.assign(result, {
qrcode: helpers.urlFormat(`/home/QRcode/${order.order_code}`)
});
} else {
_assignExpressInfo(showLogistics, order, result);
}
break;
case 6:
/* 已成功订单,给查看物流或二维码URL */
Object.assign(result, {
completed: true
});
/* 是否门票 */
if (order.virtual_type && parseInt(order.virtual_type, 10) === 3) {
Object.assign(result, {
qrcode: helpers.urlFormat(`/home/QRcode/${order.order_code}`)
});
} else {
_assignExpressInfo(showLogistics, order, result);
}
break;
default:
break;
}
} else {
/* 订单为货到付款订单时,计算订单状态。(货到付款没有待付款状态) */
switch (order.status) {
case 0:
/* 备货中 */
Object.assign(result, {
unpaid: true
});
break;
case 1:
case 2:
case 3:
/* 已付款状态不给查看物流URL */
Object.assign(result, {
unreceived: true
});
break;
case 4:
case 5:
/* 待收货状态,给查看物流 url */
Object.assign(result, {
unreceived: true
});
_assignExpressInfo(showLogistics, order, result);
break;
case 6:
/* 待收货状态,给查看物流 url */
Object.assign(result, {
completed: true
});
_assignExpressInfo(showLogistics, order, result);
break;
default:
break;
}
}
return result;
};
/**
* 获取页面顶部 tab 数据
* @param type
* @returns {Array}
* @private
*/
const _getNavs = (type) => {
let navType = {
1: '全部',
2: '待付款',
3: '待发货',
4: '待收货'
};
let nav = [];
_.forEach(navType, (obj, key) => {
nav.push({
name: obj,
typeId: key,
active: parseInt(key, 10) === parseInt(type, 10),
url: helpers.urlFormat('/home/orders', {type: key})
});
});
return nav;
};
/**
* 订单页面数据
* @param params
* @returns {*|Promise.<TResult>}
*/
const order = (params) => {
let finalResult = {};
Object.assign(finalResult, {navs: _getNavs(params.type)});
return api.get('', _.assign({
method: 'app.SpaceOrders.closeReasons'
}, params), {code: 200}).then((result) => {
if (result.data) {
Object.assign(finalResult, {cancelReason: result.data});
}
return finalResult;
});
};
/**
* 获取订单列表
* @param params
*/
const getOrders = (params) => {
let finalResult = [];
return _getOrderData(params).then(result => {
if (result.data && result.data.page_total && params.page <= result.data.page_total && result.data.order_list) {
let count = 0;
_.forEach(result.data.order_list, value => {
/* 订单件数清零 */
count = 0;
let perOrder = _getOrderStatus(value);
/* 是否是虚拟商品 */
let isTickets = order.virtual_type && parseInt(order.virtual_type, 10) === 3;
Object.assign(perOrder, {
orderNum: value.order_code,
orderStatus: value.status_str,
sumCost: value.amount,
goods: _formatOrderGoods(value.order_goods, count, false, isTickets),
detailUrl: helpers.urlFormat('/home/orderdetail', {order_code: value.order_code}),
count: count,
isVirtual: isTickets
});
/* 如果运费大于0,会显示运费 */
if (parseFloat(value.shipping_cost) > 0) {
Object.assign(perOrder, {
shippingCost: value.shipping_cost
});
}
/* 倒计时时间 */
if (value.counter_flag && value.counter_flag === 'Y') {
Object.assign(perOrder, {
leftTime: parseInt(value.pay_lefttime, 10) * 1000
});
}
finalResult.push(perOrder);
});
}
return camelCase(finalResult);
});
};
module.exports = {
order,
getOrders
};
... ...
'use strict';
const api = global.yoho.API;
const _ = require('lodash');
const orderDetail = (params) => {
let finalResult = {};
return api.get('', _.assign({
method: 'app.SpaceOrders.detail'
}, params), {code: 200}).then((result) => {
if (result.data) {
Object.assign(finalResult, {
virtual_type: result.data.virtual_type,
phoneNum: result.data.mobile,
orderStatus: result.data.status_str,
orderNum: result.data.order_code,
orderTime: result.data.create_time,
isPay: result.data.payment_status === 'Y',
relation: result.data.relate_order_code === 'Y' ? 'true' : 'false',
name: result.data.user_name,
isVirtual: false,
mobile: '15999999999',
address: result.data.address,
logisticsUrl: '#',
logisticsCompany: '顺丰',
logisticsNum: '111111',
yohoCoin: result.data.yoho_give_coin,
invoice: [{
title: '有货',
contentValue: '有货',
pdfUrl: '#'
}, {
title: '有货',
contentValue: '有货',
pdfUrl: '#'
}],
orderBalance: [{
promotion: '商品总金额',
account: '100.00'
}, {
promotion: '运费',
account: '10.00'
}],
price: result.data.amount
});
}
return finalResult;
});
};
module.exports = {
orderDetail
};
... ...
... ... @@ -7,24 +7,30 @@
const express = require('express');
const router = express.Router(); // eslint-disable-line
const auth = require('../../doraemon/middleware/auth');
const cRoot = './controllers';
const personalController = require(`${cRoot}/qrcode`);
const homeController = require(`${cRoot}/index`);
const addressController = require(`${cRoot}/address`);
const favorite = require(`${cRoot}/favorite`);
const orderController = require(`${cRoot}/order`);
const orderDetailController = require(`${cRoot}/orderDetail`);
// const myDetail = require(`${cRoot}/myDetail);
// 查看二维码
router.get('/QRcode/:id', personalController.QRcode);
router.get('/address', addressController.address); // 地址管理页面
router.get('/addressAct', addressController.addressAct); // 地址添加页面
router.get('/address', auth, addressController.address); // 地址管理页面
router.get('/addressAct', auth, addressController.addressAct); // 地址添加页面
router.get('/addressAct/:id', addressController.addressAct); // 地址添加修改页面
router.post('/saveAddress', addressController.saveAddress); // 新增或者保存地址
router.post('/defaultAddress', addressController.defaultAddress); // 设置默认地址
router.post('/delAddress', addressController.delAddress); // 删除地址
router.get('/locationList', addressController.locationList); // 异步获取三级地址数据
router.get('/orders', orderController.order);
router.get('/getOrders', orderController.getOrders);
router.get('/orderDetail', orderDetailController.orderDetail);
// 个人中心
router.get('/', homeController.index);
... ...
<div class="order-page yoho-page">
{{# order}}
<ul id="order-nav" class="order-nav clearfix">
{{#each navs}}
<li class="tap-hightlight {{#if active}}active{{/if}}" data-type="{{typeId}}">
<a href="{{url}}">{{name}}</a>
</li>
{{/each}}
</ul>
<div id="order-container" class="order-container">
{{#each navs}}
<div class="orders{{#unless active}} hide{{/unless}}"></div>
{{/each}}
</div>
<div class="reason-mask">
<div class="reason-box" >
<div class="box-head"><span class="box-cmp">完成111</span></div>
<div class="swiper-container box-main">
<ul class="swiper-wrapper">
{{#cancelReason}}
<li class="swiper-slide" data-reason-id="{{id}}"><span >{{reason}}</span></li>
{{/cancelReason}}
</ul>
<div class="active-mask"></div>
</div>
</div>
</div>
{{/ order}}
</div>
... ...
<div class="order-detail-page yoho-page">
{{# orderDetail}}
<div id="order-detail" data-id="{{orderNum}}">
{{#if isVirtual}}
<section class="block">
<div class="tickets-mobile">
<span class="pull-left">手机号码:</span>
<span class="pull-right">{{mobile}}</span>
</div>
</section>
{{else}}
<section class="owner-info block" data-changeable="{{changeable}}" data-url="{{url}}">
<span class="iconfont">&#xe637;</span>
<div class="beside-icon">
<p class="name-phone">
{{name}}
<span>{{phoneNum}}</span>
</p>
<p class="address">
{{address}}
</p>
<div class="rest">其他地址<span class="iconfont iconAddress">&#xe614;</span></div>
</div>
</section>
<div class="range"></div>
{{/if}}
<section class="order-status block">
<div class="status sub">
<span class="iconfont">&#xe632;</span>
<p class="beside-icon sub-content">
<span class="sub-title">订单编号:{{orderNum}}</span>
<span >订单状态:{{orderStatus}}</span>
<span>下单时间:{{orderTime}}</span>
</p>
</div>
{{#if logisticsUrl}}
<a class="logistics sub" href="{{logisticsUrl}}">
<span class="iconfont">&#xe630;</span>
<p class="beside-icon sub-content">
<span class="sub-title">物流信息</span>
<span>物流公司:{{logisticsCompany}}</span>
{{#if logisticsNum}}
<span>快递单号:{{logisticsNum}}</span>
{{/if}}
</p>
<span class="iconfont icon-right">&#xe614;</span>
</a>
{{/if}}
</section>
<section class="goods block">
{{#if isJit}}
{{> me/order/jit-more}}
{{/if}}
{{# goods}}
{{> me/order/good}}
{{/ goods}}
</section>
<ul class="cost block">
{{#each orderBalance}}
<li> {{promotion}}:
<span>{{account}}</span>
</li>
{{/each}}
<li>
实付金额
<span>{{price}}</span>
</li>
</ul>
{{#if yohoCoin}}
<p class="dollar">
<span class="bg-dollar"></span>
共返YOHO币:
<span>{{yohoCoin}}</span>
</p>
{{/if}}
{{#invoice}}
<ul class="invoice-info">
<li>
<span>发票信息</span>
<span class="invoice-fr">{{#if type}}电子发票{{else}}纸质发票{{/if}}</span>
</li>
<li>
<span>发票抬头</span>
<span class="invoice-fr invoice-title">{{title}}</span>
</li>
<li>
<span>发票内容</span>
<span class="invoice-fr">{{contentValue}}</span>
</li>
{{#if pdfUrl}}
<li>
<a href="{{pdfUrl}}"><span class="invoice-fr invoice-see">点击下载PDF发票</span></a>
</li>
{{/if}}
</ul>
{{/invoice}}
<div class="opt block">
{{#unless unreceived}}
{{#unless unpaid}}
<span class="btn btn-del">删除订单</span>
{{#if isVirtual}}
<!--虚拟商品-->
{{else}}
<span class="btn btn-rebuy">再次购买</span>
{{/if}}
{{/unless}}
{{/unless}}
{{#if unpaid}}
<ul class="count-down hide">
<li>
<span class="iconfont count-down-icon">&#xe64a;</span>
</li>
<li>
<span class="hours">{{leftTime}}</span>
</li>
</ul>
<span class="btn btn-cancel">取消订单</span>
{{#if payUrl}}
<a href="{{payUrl}}">
<span class="btn btn-pay">立即付款</span>
</a>
{{/if}}
{{/if}}
{{#if logisticsUrl}}
<a href="{{logisticsUrl}}">
<span class="btn btn-check-logistics">查看物流</span>
</a>
{{/if}}
{{#if qrcode}}
<a href="{{qrcode}}">
<span class="btn btn-check-logistics">查看二维码</span>
</a>
{{/if}}
</div>
</div>
<div class="reason-mask">
<div class="reason-box" >
<div class="box-head"><span class="box-cmp">完成</span></div>
<div class="swiper-container box-main">
<ul class="swiper-wrapper">
{{#cancelReason}}
<li class="swiper-slide" data-reason-id="{{id}}"><span >{{reason}}</span></li>
{{/cancelReason}}
</ul>
<div class="active-mask"></div>
</div>
</div>
</div>
{{/ orderDetail}}
</div>
<script>_ozprm = "orderid={{orderCode}}&ordertotal={{orderTotal}}";</script>
<script type="text/javascript" src="//static.yohobuy.com/m/v1/js/AG_Tracking.js"></script>
<script type="text/javascript">
var _agq = _agq || [];
_agq.push(['_cid', '415']); //生成value
_agq.push(['_eid', '102']); //生成value
_agq.push(['_orderSum', "{{orderTotal}}"]);//订单金额,客户在页面填写
_agq.push(['_orderNo', "{{orderCode}}"]);//订单号,客户在页面填写
_agq.push(['_orderNew', "{{isOldUser}}"]);//是否新客单,客户标记是为true否为false
_agq.push(['_orderCount', "{{orderCount}}"]);//订单货品数目,客户填写
ag_send(_agq);
var __order_code = "{{orderCode}}";
var __order_amount = "{{orderTotal}}";
var __order_user = "{{isOldUser}}";
var __order_goods_num = "{{orderCount}}";
var __order_uid = '{{uid}}';
var _fxcmd = _fxcmd || [];
_fxcmd.push(['trackOrder', {
oid: "{{orderCode}}",
otp: "{{orderTotalFormat}}",
unid: "{{uid}}"
}]);
</script>
<script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
{event: "setAccount", account: [21397]},
{event: "setHashedEmail", email: ""},
{event: "setSiteType", type: "m"},
{event: "trackTransaction", id: "{{orderCode}}", currency: "CNY", item: ""}
);
</script>
... ...
... ... @@ -18,8 +18,12 @@ module.exports = {
// api: 'http://devapi.yoho.cn:58078/',
// service: 'http://devservice.yoho.cn:58077/',
api: 'http://api.yoho.cn/',
service: 'http://service.yoho.cn/',
// api: 'http://api.yoho.cn/',
// service: 'http://service.yoho.cn/',
api: 'http://testapi.yoho.cn:28078/',
service: 'http://testservice.yoho.cn:28077/',
singleApi: 'http://192.168.102.31:8092/'
},
subDomains: {
... ...
<div class="order-good" data-id="{{id}}">
<div class="thumb-wrap">
{{#if link}}
<a href="{{link}}"><img class="thumb lazy" data-original="{{image thumb 90 120}}"></a>
{{else}}
<img class="thumb lazy" data-original="{{image thumb 90 120}}">
{{/if}}
<p class="tag{{#if gift}} gift-tag{{/if}}{{#if advanceBuy}} advance-buy-tag{{/if}}"></p>
</div>
<div class="deps">
<p class="name row">{{name}}</p>
<p class="row">
{{#if color}}
<span class="color">
{{#if tickets}}日期{{else}}颜色{{/if}}:{{color}}
</span>
{{/if}}
{{#if size}}
<span class="size">
{{#if tickets}}区域{{else}}尺码{{/if}}:{{size}}
</span>
{{/if}}
</p>
<p class="row price-wrap">
<span class="price">
¥{{price}}
</span>
<span class="count">
×{{count}}
</span>
{{#if appearDate}}
<span class="appear-date">上市期:{{appearDate}}</span>
{{/if}}
</p>
</div>
</div>
... ...
<div class="order" data-id="{{orderNum}}" data-href="{{detailUrl}}">
<header class="header">
订单编号:{{orderNum}}
<span class="order-status">{{orderStatus}}</span>
</header>
<section class="order-goods">
{{# goods}}
{{> order/good}}
{{/ goods}}
</section>
<footer class="footer">
{{count}}件商品 实付<span class="sum-cost">¥{{sumCost}}</span>
{{#shippingCost}}(含运费¥{{.}}){{/shippingCost}}
</footer>
{{!-- 对应订单状态的操作逻辑 --}}
{{!-- 完成和取消订单显示删除按钮 --}}
{{#unless unpaid}}
<div class="order-opt">
{{#unless unreceived}}
<span class="btn del">删除订单</span>
{{#if isVirtual}}
<!--虚拟商品-->
{{else}}
<span class="btn rebuy">再次购买</span>
{{/if}}
{{/unless}}
{{#if qrcode}}
<a class="locHref" href="{{qrcode}}">
<span class="btn check-logistics">查看二维码</span>
</a>
{{/if}}
</div>
{{/unless}}
{{#if unpaid}}
<div class="order-opt">
<ul class="count-down hide">
<li>
<span class="iconfont count-down-icon">&#xe64a;</span>
</li>
<li>
<span class="hours">{{leftTime}}</span>
</li>
</ul>
<span class="btn cancel">取消订单</span>
{{#if payUrl}}
<a class="locHref" href="{{payUrl}}">
<span class="btn pay">立即付款</span>
</a>
{{/if}}
</div>
{{/if}}
{{!-- 包含未发货和已发货状态,未发货不传logisticsUrl --}}
{{#if unreceived}}
{{#if logisticsUrl}}
<div class="order-opt">
<a class="locHref" href="{{logisticsUrl}}">
<span class="btn check-logistics">查看物流</span>
</a>
</div>
{{/if}}
{{/if}}
</div>
... ...
{{#if walkwayUrl}}
<div class="no-order">
<div class="icon"></div>
<span>你还没有订单!</span>
<a class="walk-way" href="{{walkwayUrl}}">随便逛逛</a>
</div>
{{^}}
{{#each orders}}
{{> order/order}}
{{/each}}
{{/if}}
... ...