Authored by 刘传洋

Merge branch 'release/hbs' of http://git.yoho.cn/fe/yohobuy-node into release/hbs

Showing 63 changed files with 4748 additions and 4 deletions

Too many changes to show.

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

... ... @@ -33,6 +33,7 @@ helpers.image = _.flow(helpers.image, fp.replace(/\/quality\/\d*$/, '/quality/90
global.middleware = path.resolve('./doraemon/middleware');
global.utils = path.resolve('./utils');
global.appRoot = path.resolve(__dirname);
// 向模板注入变量
app.locals.devEnv = app.get('env') === 'development';
... ... @@ -80,6 +81,7 @@ const logger = global.yoho.logger;
// dispatcher
try {
const subDomain = require('./doraemon/middleware/sub-domain');
const mobileRefer = require('./doraemon/middleware/mobile-refer');
const itemNameHandler = require('./doraemon/middleware/item-name-handler');
const mobileCheck = require('./doraemon/middleware/mobile-check');
const user = require('./doraemon/middleware/user');
... ... @@ -91,6 +93,7 @@ try {
// YOHO 前置中间件
app.use(subDomain());
app.use(mobileRefer());
app.use(itemNameHandler);
app.use(mobileCheck());
app.use(setYohoData());
... ...
... ... @@ -19,7 +19,7 @@ router.get(/^\/special\/(\d+)_(.*)\.html$/, specialController.special);
// 领券中心
router.get('/coupon/index', coupon.index);
router.get('/coupon/couponstatus', coupon.getCouponStatus);
router.get('/coupon/couponstatus', auth, coupon.getCouponStatus);
router.get('/coupon/sendcoupon', auth, coupon.sendcoupon);
module.exports = router;
\ No newline at end of file
... ...
... ... @@ -42,7 +42,7 @@ const index = (skn, limit) => {
price: ${helper.round(sp, 2)}`,
product_name: hp.product_name,
url: helper.urlFormat(
`/product/pro_${hp.product_id}_${defaultGoods.goods_id}/${hp.cn_alphabet}.html`, '', 'item'),
`/product/pro_${hp.product_id}_${defaultGoods.goods_id}/${hp.cn_alphabet}.html`, null, 'item'),
pic_url: helper.image(defaultGoods.images_url, 150, 200, 2, 70)
});
});
... ... @@ -66,4 +66,4 @@ const index = (skn, limit) => {
module.exports = {
index
};
\ No newline at end of file
};
... ...
... ... @@ -96,7 +96,7 @@
<div class="article-bottom-info clearfix">
{{#if tag}}
<div class="article-tag clearfix">
<i class="tag-icon iconfont">&#xe624;</i>
<i class="tag-icon iconfont">&#xe630;</i>
<ul class="clearfix">
{{# tag}}
<li>
... ...
/**
* 个人中心二维码 controller
* @author: weiqingting<qingting.wei@yoho.cn>
* @date: 2016/05/16
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const CurrencyModel = require('../models/CurrencyModel');
const moment = require('moment');
const convertUnitTime = (src) => {
return moment.unix(src).format('YYYY-MM-DD');
};
const index = (req, res, next)=>{
let $uid = '8041246';
let $condition = {
page: req.query.page || 1,
queryType: req.query.type || 0,
beginTime: req.query.beginTime || convertUnitTime(new Date() / 1000 - 3600 * 24 * 90)
};
co(function*() {
let data = yield CurrencyModel.currencyData($uid, $condition);
res.render('currency', {
content: data
});
})().catch(next);
};
module.exports = {
index
};
... ...
/**
* 我的优惠券 controller
* @author: weiqingting<qingting.wei@yoho.cn>
* @date: 2016/05/16
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const helpers = global.yoho.helpers;
const favoriteService = require('../models/favorite-service');
const index = (req, res, next)=> {
let uid = '8041246';
let udid = '8041246';
co(function*() {
let page = req.query.page || 1;
let type = req.query.type || 'article';
let sort = req.query.sort_id || 0;
let reduction = req.query.is_reduction || 'N';
let promotion = req.query.is_promotion || 'N';
let limit = 10;
let data = {};
data.tabs = favoriteService.getFavoriteTabs('product');
switch (type) {
case 'brand':
data.favBrands = yield favoriteService.favoriteBrandList(uid, page, limit, type);
break;
case 'article':
data.favArticles = yield favoriteService.favoriteArticleListAsync(uid, udid, page, limit);
break;
default:
data.favProducts = yield favoriteService.favoriteProductList(uid, page, limit, type, sort, 'N', reduction, promotion);
break;
}
console.log(data);
res.render('favorite', {
meFavoritePage: true,
meFavorite: data
});
})().then(next);
};
const reductionAction = ()=> {
};
module.exports = {
index
};
... ...
/**
* 个人中心二维码 controller
* @author: weiqingting<qingting.wei@yoho.cn>
* @date: 2016/05/16
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const OrderData = require('../models/OrderData');
const IndexModel = require('../models/IndexModel');
const index = (req, res, next)=>{
let $uid = '8041246';// req.user.uid;
let $udid = 'abcdrf';// req.sessionID;
co(function*() {
let items = yield Promise.all([OrderData.closeReasons(),
IndexModel.getInfoNumData($uid, $udid),
IndexModel.getFooterBanner(),
IndexModel.latestOrders($uid),
IndexModel.homeData()]);
let cancelReason = items[0].data ? items[0].data : '';
res.render('index', {
cancelReason: cancelReason,
content: [
{messages: items[1]},
{
latestOrders: items[3],
favBrand: {
more: '/brands',
brands: items[4].brand
},
newArrival: items[4].new,
banner: items[2]
}
],
helpUsUrl: ''
});
})().catch(next);
};
module.exports = {
index
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const RedenvelopesModel = require('../models/RedenvelopesModel');
const index = (req, res, next)=>{
let $uid = '8041246';// req.user.uid;
let $udid = 'abcdrf';// req.sessionID;
co(function*() {
let result = yield RedenvelopesModel.redenvelopesList($uid);
res.render('Redenvelopes', {
meRedEnvelopes: result
});
})().catch(next);
};
module.exports = {
index
};
... ...
/**
* 个人中心-地址管理
*/
... ...
/**
* comment controller
* @author 陈轩 <xuan.chen@yoho.cn>
*/
'use strict';
const logger = global.yoho.logger;
const commentModel = require('../models/comment');
const _ = require('lodash');
// comment page
exports.index = (req, res, next) => {
let uid = req.user.uid;
let isComment = req.query.isComment;
let page = req.query.page || 1;
// 转string值为bool值
isComment = isComment === 'Y';
commentModel.getCommentList(uid, isComment, page /* , limit=10*/)
.then(data => {
let localData = _.merge(data, {
module: 'home',
page: 'comment'
});
res.render('comment', localData);
})
.catch(next);
};
exports.saveComment = (req, res, next) => {
// only ajax
if (!req.xhr) {
return;
}
// get post args
let data = {
uid: req.user.uid,
productSkn: req.body.productSkn,
productId: req.body.productId,
content: req.body.content,
goodsId: req.body.goodsId,
orderId: req.body.orderId,
erpSkuId: req.body.erpSkuId
};
commentModel.saveShareOrder(data)
.then(result => {
res.json(result);
})
.catch(error => {
logger.error(`home--comment: ${error}`);
next();
});
};
... ...
/**
* 我的投诉controller
* @author: yyq<yanqing.yang@yoho.cn>
* @date: 2016/8/18
*/
'use strict';
const complaints = require('../models/complaints');
/**
* 我的投诉页
* @function index
* @param { String } page 页码
* @return { Object } 投诉列表数据
*/
const index = (req, res, next) => {
let uid = req.user.uid;
let page = req.query.page || 1;
complaints.getComplaintsList(uid, page).then(result => {
res.render('complaints', result);
}).catch(next);
};
/**
* 添加投诉接口
* @function submit
* @param { String } url 图片路径
* @return { Object } 原图片路径
*/
const submit = (req, res, next) => {
let uid = req.user.uid;
let params = req.body;
if (!req.xhr || !uid) {
return next();
}
complaints.addComplaints(uid, params).then(result => {
res.json(result);
}).catch(next);
};
/**
* 取消投诉接口
* @function submit
* @param { String } url 图片路径
* @return { Object } 原图片路径
*/
const cancel = (req, res, next) => {
let uid = req.user.uid;
let id = req.body.id;
if (!req.xhr || !uid) {
return next();
}
complaints.cancelComplaints(uid, id).then(result => {
res.json(result);
}).catch(next);
};
module.exports = {
index,
submit,
cancel
};
... ...
/**
* 个人中心---我的咨询
* @author chenxuan <xuan.chen@yoho.cn>
*/
'use strict';
const logger = global.yoho.logger;
const consultModel = require('../models/consult');
exports.index = (req, res, next) => {
const uid = req.user.uid;
const page = req.query.page || 1;
consultModel.consultList(uid, page /* ,limit=10*/)
.then(result => {
let renderData = Object.assign({
module: 'home',
page: 'consult'
}, result);
res.render('consult', renderData);
})
.catch(err => {
logger.error(`${module} ${page} error: ${err}`);
next(err);
});
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
let CouponsModel = require('../models/CouponsModel');
const helpers = global.yoho.helpers;
const index = (req, res, next)=>{
let uid = '8041246';
let type = req.query.type || CouponsModel.UNUSED;
let page = '';
let limit = '';
co(function*() {
let coupons = yield CouponsModel.getCouponsList(uid, type, page, limit);
let data = {};
data.pager = {
hasCheckAll: false,
count: coupons.pager.total || 0,
curPage: coupons.pager.page || 0,
totalPages: coupons.pager.pageTotal || 0
};
if (type === CouponsModel.UNUSED) {
if (!coupons.list.length) {
data.unUseCoupons = {empty: '您没有优惠券'};
} else {
data.unUseCoupons = coupons.list;
}
data.unUse = true;
} else if (type === CouponsModel.USED) {
if (!coupons.list.length) {
data.usedCoupons = {empty: '您没有优惠券'};
} else {
data.usedCoupons = coupons.list;
}
data.used = true;
}
else if (type === CouponsModel.INVALID) {
if (!coupons.list.length) {
data.noValidCoupons = {empty: '您没有优惠券'};
} else {
data.noValidCoupons = coupons.list;
}
data.noValid = true;
}
data.tabs = [
{
active: type === CouponsModel.UNUSED ? true : false,
url: helpers.urlFormat('/home/coupons', {type: CouponsModel.UNUSED}),
name: '未使用优惠券'
},
{
ctive: type === CouponsModel.USED ? true : false,
url: helpers.urlFormat('/home/coupons', {type: CouponsModel.USED}),
name: '已使用优惠券'
},
{
ctive: type === CouponsModel.INVALID ? true : false,
url: helpers.urlFormat('/home/coupons', {type: CouponsModel.INVALID}),
name: '已失效优惠券'
}
];
res.render('coupons', data);
})();
};
module.exports = {
index
};
... ...
/**
* 我的消息controller
* @author: yyq<yanqing.yang@yoho.cn>
* @date: 2016/8/29
*/
'use strict';
const message = require('../models/message');
const index = (req, res, next) => {
let uid = req.user.uid;
let page = req.query.page || 1;
if (!uid) {
return next();
}
message.getMessageList(uid, page).then(result => {
res.render('message', result);
}).catch(next);
};
const detail = (req, res, next) => {
let uid = req.user.uid;
let id = parseInt(req.query.id, 10);
let page = req.query.page;
if (!uid || !id || !page) {
return next();
}
message.getMessageDetail(uid, id, page).then(result => {
res.render('message-detail', result);
}).catch(next);
};
const delMsg = (req, res, next) => {
let uid = req.user.uid;
let id = req.query.id;
if (!req.xhr || !uid) {
return next();
}
message.delMessage(uid, id).then(result => {
res.json(result);
}).catch(next);
};
const readMsg = (req, res, next) => {
let uid = req.user.uid;
let id = req.query.id;
if (!req.xhr || !uid) {
return next();
}
message.delMessage(uid, id).then(result => {
res.json(result);
}).catch(next);
};
const pickCoupon = (req, res, next) => {
let uid = req.user.uid;
let id = req.query.id;
if (!req.xhr || !uid) {
return next();
}
message.pickBirthCoupon(uid, id).then(result => {
res.json(result);
}).catch(next);
};
module.exports = {
index,
detail,
delMsg,
readMsg,
pickCoupon
};
... ...
/**
* 个人中心 退换货
* @author 陈轩 <xuan.chen@yoho.cn>
*/
'use strict';
const cookie = global.yoho.cookie;
const returnsModel = require('../models/returns');
/*
我的退换货-列表页
*/
const index = (req, res, next) => {
const uid = cookie.getUid(req);
const page = req.query.page;
returnsModel.getReturnsList(uid, page /* ,limit=10*/)
.then(data => {
const viewData = Object.assign({
module: 'home',
page: 'returns',
meReturnsPage: true
}, data);
res.render('returns/returns', viewData);
})
.catch(next);
};
/*
我的订单-退货申请页
*/
const refundApply = (req, res, next) => {
const orderCode = req.query.orderCode;
const uid = req.user.uid;
returnsModel.getOrderRefund(orderCode, uid).then(result => {
res.render('returns/returns-apply', result);
}).catch(next);
};
/*
我的订单-退货申请页
*/
const refundDetail = (req, res, next) => {
const code = req.query.id;
const uid = req.user.uid;
returnsModel.getRefundDetail(code, uid).then(result => {
res.render('returns/returns-detail', result);
}).catch(next);
};
module.exports = {
index,
refundApply,
refundDetail
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const UserData = require('../models/UserData');
const moment = require('moment');
const helpers = global.yoho.helpers;
const index = (req, res, next)=>{
let uid = '8041246';// req.user.uid;
co(function*() {
let vipInfo = yield UserData.getVIPInfoByUid(uid);
let data = vipInfo.data, proportion = '0%';
if (+data.next_need_cost != 0) {
proportion = data.current_year_cost * 100 / data.next_need_cost;
proportion = proportion > 100 ? 100 : proportion;
proportion = proportion + '%';
}
let remainDays = Math.floor((Date.now() - (+data.vip_end_time) * 1000) / 86400);
// let preferences={};
// enjoyPreferences=data.enjoy_preferential;
if (data.enjoy_preferential) {
data.enjoy_preferential = data.enjoy_preferential.map(function(item, inex) {
return {
id: item.id,
favTxt: item.title,
imgType: helpers.https(item.pic),
description: item.description
};
});
}
let vip = {
title: data.current_vip_title,
level: data.current_vip_level,
totalCost: (+data.current_total_cost).toFixed(2),
nextTitle: data.next_vip_title,
nextLevel: data.next_vip_level,
nextCost: data.next_need_cost,
enjoyPreferences: data.enjoy_preferential,
yearCost: data.current_year_cost,
upgradeCost: data.upgrade_need_cost,
proportion: proportion,
reach: moment(data.vip_reach_time * 1000).format('YYYY-MM-DD'),
start: moment(data.vip_start_time * 1000).format('YYYY-MM-DD'),
end: moment(data.vip_end_time * 1000).format('YYYY-MM-DD'),
remainDays: remainDays,
platinum: data.upgrade_need_cost > 0 ? false : true,
isVip: data.current_vip_level > 0 ? true : false
};
res.render('vip', vip);
})().catch(next);
};
module.exports = {
index
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const api = global.yoho.API;
const getByNodeContent = (node, mode)=>{
mode = mode || 'release';
let options = {
method: 'web.html.content',
mode: mode,
node: node
};
return api.get('', options);
};
module.exports = {
getByNodeContent
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
const exchangeDay = 15;
const refundDay = 7;
module.exports = {
exchangeDay,
refundDay
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const UserData = require('./UserData');
const helpers = global.yoho.helpers;
const UNUSED = 'notuse';
const USED = 'use';
const INVALID = 'overtime';
const getCouponsList = (uid, type, page, limit)=>{
return co(function*() {
let couponsInfo = yield UserData.getCouponsList(uid, type, page, limit);
let result = [];
if (!couponsInfo.data.couponList) {
return result;
}
let coupons = couponsInfo.data.couponList;
if (coupons) {
coupons.forEach(function(item, i) {
result[i] = {};
result[i].id = item.couponId;
result[i].code = item.couponCode;
// 格式化有效日期 "couponValidity": "2016.03.15-2016.03.31"
let dates = item.couponValidity.split('-');
result[i].beginTime = dates[0].replace('.', '-');
result[i].endTime = dates[1].replace('.', '-');
if (!item.couponImageUrl) {
result[i].img = '//static.yohobuy.com/images/v2/activity/default_coupon.jpg';
} else {
result[i].img = item.couponImageUrl;
}
if ((item.overTime - Date.now()) < 259200) {
result[i].endSoon = true;
} else {
result[i].endSoon = false;
}
result[i].value = item.couponValue.toFixed(2);
result[i].validity = item.couponValidity;
result[i].useRemark = item.couponDetailInfomation;
if (type === USED) {
result[i].orderNum = item.orderCode ? item.orderCode : '';
result[i].orderDetailUrl = helpers.urlFormat('/home/orders/detail', {orderCode: item.orderCode || ''});
result[i].orderSum = item.orderPrice.toFixed(2) ? item.orderPrice : 0;
result[i].payment = item.actuallyPaid.toFixed(2) ? item.actuallyPaid : 0;
let data = result[i].usedTime ? moment(result[i].usedTime).format('YYYY-MM-DD') : 0;
if (data) {
result[i].useTime = new Date(date).getTime();
} else {
result[i].useTime = '';
}
} else {
result[i].status = item.isValidity ? '可使用' : '已过期';
}
if (item.couponType) {
result[i].type = item.couponType;
if (item.couponType == 5) {
result[i].value = '免邮';
}
}
});
}
return {list: result, pager: {
total: couponsInfo.data.total,
pageTotal: couponsInfo.data.totalPageNum,
page: page
}};
})();
};
module.exports = {
getCouponsList,
UNUSED,
USED,
INVALID
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const helpers = global.yoho.helpers;
const api = global.yoho.API;
const yohoCoinList = (uid, condition)=>{
condition = condition || {};
let options = {
method: 'app.yohocoin.lists',
uid: uid,
page: 1,
limit: 15
};
Object.assign(options, condition);
return api.get('', options);
};
const yohoCoinTotal = uid=>{
let options = {
method: 'app.yoho.yohocoin',
uid: uid
};
return api.get('', options);
};
module.exports = {
yohoCoinList,
yohoCoinTotal
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const path = require('path');
const helpers = global.yoho.helpers;
const api = global.yoho.API;
const _ = require('lodash');
const Image = require('../../../utils/images');
const CurrencyData = require('./CurrencyData');
const SearchData = require('./SearchData');
// 使用 product中的分页逻辑
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;
const moment = require('moment');
const convertUnitTime = (src) => {
return moment.unix(src).format('YYYY-MM-DD');
};
const currencyData = (uid, condition)=>{
return co(function*() {
let result = {};
let yohoCoinInfo = yield CurrencyData.yohoCoinTotal(uid);
console.log(yohoCoinInfo);
if (yohoCoinInfo.code && yohoCoinInfo.code == 200) {
let yohoCoinInfoData = yohoCoinInfo.data;
result.myCurrency = yohoCoinInfoData.yohocoin_num ? yohoCoinInfoData.yohocoin_num : 0;
if (yohoCoinInfoData.nearExpCoinNum && yohoCoinInfoData.nearExpCoinNum > 0) {
result.tip.count = yohoCoinInfoData.nearExpCoinNum;
result.tip.date = 'Y年12月31日';
}
}
let currency = yield currencyList(uid, condition);
result.currency = currency.list;
result.pager = currency.pager;
result.coinHelperUrl = '//www.yohobuy.com/help/?category_id=87';// yoho币帮助
result.tabs = currencyTabs(condition.queryType);
result.options = currencyOptions(condition);
return result;
})();
};
const currencyList = (uid, condition)=>{
return co(function*() {
let result = {'list': [], 'pager': []};
condition.limit = condition.limit || 15;
let data = yield CurrencyData.yohoCoinList(uid, condition);
if (data.code && data.code == 200 && data.data.coinlist && !_.isEmpty(data.data.coinlist)) {
// data.data.coinlist.forEach(function(val,key){
for (let key = 0; key < data.data.coinlist.length; key++) {
let val = data.data.coinlist[key];
result.list[key] = {
date: val['date'],
desc: val['message'],
isIncome: true
};
// 2:订单取消退还,9:下单使用,10:退货退还
if ([2, 9, 10].indexOf(val.type) > -1 && val.key) {
result.list[key].detailUrl = helpers.urlFormat('/home/orders/detail', {orderCode: val['key']});
}
// 晒单奖励
else if (val.type == 14 && val.key) {
let product = yield SearchData.searchAll({query: Number(val.key), viewNum: 1});
if (product.code && product.code == 200 && !_.isEmpty(product.data.product_list) && !_.isEmpty(product.data.product_list[0].goods_list)) {
productId = product.data.product_list[0].product_id;
goodsId = product.data.product_list[0].goods_list[0].goods_id;
result.list[key].detailUrl = helpers.getUrlBySkc(productId, goodsId, product.data.product_list[0].cn_alphabet);
}
}
if (Number(val['num']) < 0) {
result.list[key].isIncome = false;
}
result.list[key].value = val['num'] > 0 ? '+' + val['num'] : val['num'];
}
// 分页
let total = data.data.total;
let pagerObj = pager(total, {
page: data['data']['page'],
limit: condition['limit']
});
// result['pager']={};
// result['pager']['hasCheckAll'] = false;
// result['pager']['count'] = data['data']['total'];
// result['pager']['curPage'] = data['data']['page'];
// result['pager']['totalPages'] = Math.ceil(data['data']['total'] / condition['limit']);
// result['pager']['pagerHtml'] = HelperSearch::pager(data['data']['total'], condition['limit']);
}
return result;
})();
};
const currencyTabs = (type)=>{
let result = ['全部明细', '全部收入', '全部支出'];
result = result.forEach(function(val, key) {
return {
active: key == type ? true : false,
url: helpers.urlFormat('/home/currency', {type: key})
};
});
return result;
};
const currencyOptions = (condition)=>{
let result = [], paramUrl = {};
let tabs = {'90': '最近3个月明细', '180': '最近半年明细', '360': '最近一年明细'};
for (let name in tabs) {
if (condition.queryType) {
paramUrl.type = condition.queryType;
}
paramUrl.beginTime = convertUnitTime(new Date() / 1000 - 3600 * 24);
result.push({
url: helpers.urlFormat('/home/currency', paramUrl),
name: tabs[name],
selected: condition.beginTime && paramUrl.beginTime == condition.beginTime ? true : false
});
}
return result;
};
module.exports = {
currencyData
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const helpers = global.yoho.helpers;
const Images = require('../../../utils/Images');
const formatFavBrand = (brandInfo, i)=>{
i = i || 10;
let hotBrands = [];
if (brandInfo.length > 0) {
for (let i = 0; i < brandInfo.length; i++) {
let value = brandInfo[i];
if (value.is_hot && value.is_hot == 'Y') {
hotBrands.push({
'href': helpers.urlFormat('', '', value['brand_domain']),
'logo': Images.getSourceUrl(value['brand_ico'], 'brandLogo'),
'name': value.brand_name
});
i--;
}
if (i <= 0) {
break;
}
}
}
return hotBrands;
};
const formatNew = (product)=>{
let result = [];
product.forEach(function(val, key) {
result[key] = {
href: helpers.getUrlBySkc(val['product_id'], val['goods_list'][0]['product_skc'], val['cn_alphabet']),
thumb: val['default_images'] ? Images.getImageUrl(val['default_images'], 400, 500) : '',
name: val['product_name'],
price: val['sales_price']
};
});
return result;
};
module.exports = {
formatFavBrand,
formatNew
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const api = global.yoho.API;
const getPendingOrderCount = uid=>{
let options = {
method: 'web.SpaceOrders.getPendingOrderCount',
uid: uid
};
return api.get('', options);
};
const infoNum = (uid, udid)=>{
let options = {
method: 'app.home.getInfoNum',
uid: uid,
udid: udid
};
return api.get('', options);
};
const notCommentRecordCount = uid=>{
let options = {
method: 'show.notCommentRecordCount',
uid: uid
};
return api.get('', options);
};
module.exports = {
getPendingOrderCount,
infoNum,
notCommentRecordCount
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const OrderData = require('./OrderData');
const OrderModel = require('./OrderModel');
const helpers = global.yoho.helpers;
const api = global.yoho.API;
const searchApi = global.yoho.SearchAPI;
const BrandData = require('./BrandData');
const IndexData = require('./IndexData');
const SearchData = require('./SearchData');
const HelperHome = require('./HelperHome');
const _ = require('lodash');
/**
* 个人中心——消息提示
* @param type uid
* @param type udid
* @return array
*/
const getInfoNumData = (uid, udid)=>{
let result = [
{href: helpers.urlFormat('/home/orders'), name: '待处理订单', 'count': 0},
{href: helpers.urlFormat('/home/message'), name: '未读消息', 'count': 0},
{href: helpers.urlFormat('/home/comment'), name: '待评论商品', 'count': 0}
];
return co(function * () {
let getPendingOrderCount = yield IndexData.getPendingOrderCount(uid);// 待处理订单
let infoNumData = yield IndexData.infoNum(uid, udid); // 未读消息
let notCommentRecordCount = yield IndexData.notCommentRecordCount(uid);// 待评论商品
result[0]['count'] = getPendingOrderCount.data.count ? getPendingOrderCount.data.count : 0;
result[1]['count'] = infoNumData.data.inbox_total ? infoNumData.data.inbox_total : 0;
result[2]['count'] = notCommentRecordCount.data ? notCommentRecordCount.data : 0;
return result;
})();
};
/**
* 个人中心——最新订单
* @param type uid
* @return array
*/
const latestOrders = (uid)=>{
return co(function *() {
let orders = yield OrderModel.getOrders(uid, 1, 2, 1);
return {
more: helpers.urlFormat('/home/orders'),
orders: orders
};
})();
};
const homeData = ()=>{
return co(function * () {
let result = {};
let url = {};
url.fav_brand = SearchData.getBrandListUrl();
url.new = SearchData.getProductUrl({new: 'Y', viewNum: 10});
let data = yield Promise.all([searchApi.get(url.fav_brand, {}, {cache: true}), searchApi.get(url.new, {}, {cache: true})]);
// 格式化数据
result['brand'] = data[0].data && data[0].data.length > 0 ? HelperHome.formatFavBrand(data[0].data, 6) : [];
result['new'] = data[1].data['product_list'] && data[1].data['product_list'].length > 0 ? HelperHome.formatNew(data[1].data['product_list']) : {};
return result;
})();
};
/**
* 底部banner
* @param string code
* @return mixed
*/
const getFooterBanner = (code)=>{
code = code || '20110609-152143';
return co(function *() {
let result = '';
let banner = yield BrandData.getByNodeContent(code);
if (banner.code && banner.data) {
result = banner.data.replace('http://', '//');
}
return result;
})();
};
module.exports = {
getInfoNumData,
getFooterBanner,
latestOrders,
homeData
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const api = global.yoho.API;
/**
* 我的订单-分页
* @param type uid
* @param type page
* @param type limit
* @param type type 获取订单类型 type=1全部,type=2待付款,type=3待发货,type=4待收货,type=5待评论(已成功) 7取消
* @return type
*/
exports.getUserOrders = (uid, page, limit, type)=>{
page = page || 1;
limit = limit || 1;
type = type || 1;
let options = {
method: 'app.SpaceOrders.get',
uid: uid,
type: type,
page: page,
limit: limit
};
return api.get('', options);
};
/**
* 订单详情
* @param type uid
* @param type orderCode
* @return type
*/
exports.getOrderDetail = (uid, orderCode)=>{
let options = {
method: 'app.SpaceOrders.detail',
uid: uid,
order_code: orderCode
};
return api.get('', options);
};
/**
* 取消订单
* @param type uid
* @param type orderCode
* @return type
*/
exports.cancelUserOrder = (uid, orderCode, reason, reasonId)=>{
reason = reason || false;
reasonId = reasonId || false;
let options = {
method: 'app.SpaceOrders.close',
uid: uid,
order_code: orderCode
};
if (reasonId) {
Object.assign(options, {
reasonId: reasonId,
reasons: reason
});
}
return api.get('', options);
};
/**
* 确认订单
* @param type uid
* @param type orderCode
* @return type
*/
exports.confirmUserOrder = (uid, orderCode)=>{
let options = {
method: 'app.SpaceOrders.confirm',
uid: uid,
order_code: orderCode
};
return api.get('', options);
};
/**
* 获取虚拟订单ticketCode
* @param type orderCode
* @return type
*/
exports.getTicketCode = (orderCode)=>{
let options = {
method: 'app.SpaceOrders.getQrByOrderCode',
order_code: orderCode
};
return api.get('', options);
};
/**
* 我的订单-查看物流
*
* @param int orderCode 订单号
* @param int uid 用户ID
* @return array
*/
exports.getLogisticsData = (orderCode, uid)=>{
let options = {
method: 'app.express.li',
order_code: orderCode,
uid: uid
};
return api.get('', options);
};
/**
* 获取历史订单
* @param type uid
* @param type page
* @param type limit
*/
exports.getHistoryOrders = (uid, page, limit)=>{
page = page || 1;
limit = limit || 10;
let options = {
method: 'app.SpaceOrders.history',
uid: uid,
page: page,
limit: limit
};
return api.get('', options);
};
/**
* 更新订单的支付方式
*
* @param int orderCode 订单号
* @param int payment 支付方式
* @param int uid 用户ID
* @return array
*/
exports.updateOrderPayment = (orderCode, payment, uid)=>{
let options = {
method: 'app.SpaceOrders.updateOrdersPaymentByCode',
order_code: Number(orderCode),
payment: payment,
uid: uid
};
return api.get('', options);
};
/**
* 取消订单原因列表
* @return type
*/
exports.closeReasons = ()=>{
let options = {
method: 'app.SpaceOrders.closeReasons'
};
return api.get('', options);
};
/**
* 订单详情页——地址修改
* @param type order_code
* @param type address_id
* @return type
*/
exports.updateDeliveryAddress = (order_code, user_name, area_code, address, mobile, phone)=>{
let options = {
method: 'app.SpaceOrders.updateDeliveryAddress',
order_code: order_code,
user_name: user_name,
area_code: area_code,
address: address,
mobile: mobile
};
if (phone) {
Object.assign(options, {phone: phone});
}
return api.get('', options);
};
/**
* 查看订单详情
*
* @param string orderCode 订单号
* @param int uid 用户ID
* @param string sessionKey 用户会话
* @return array
*/
exports.viewOrderData = (orderCode, uid, sessionKey)=>{
let options = {
method: 'app.SpaceOrders.info',
order_code: order_code,
uid: uid,
session_key: sessionKey
};
return api.get('', options);
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const OrderData = require('./OrderData');
const ChannelConfig = require('./ChannelConfig');
const helpers = global.yoho.helpers;
const api = global.yoho.API;
const _ = require('lodash');
const Image = require('../../../utils/images');
/**
* 获取我的订单列表数据-分页
* @param type uid
* @param type page
* @param type limit
* @param type type 获取订单类型 type=1全部,type=2待付款,type=3待发货,type=4待收货,type=5待评论(已成功) 7取消
*/
const getOrders = (uid, page, limit, type, isPage)=>{
return co(function *() {
isPage = isPage || false;
let getOrderDescStr = {
1: '您还没有任何订单',
5: '您目前还没有成功的订单',
7: '您还没有任何取消的订单'
};
let descStr = getOrderDescStr[type] || '';
let orders = {empty: descStr};
let orderInfo = yield OrderData.getUserOrders(uid, page, limit, type);
if (orderInfo.data && orderInfo.data.order_list) {
orders = {};
orderInfo.data.order_list.forEach(function(orderV, orderK) {
orders[orderK] = {};
orders[orderK]['orderNum'] = orderV['order_code']; // 订单标识
orders[orderK]['orderTime'] = new Date(orderV['create_time']);
let statusInfo = getOrderStatus(orderV['is_cancel'], orderV['status'], orderV['payment_type'], orderV['payment_status']);
// 订单状态
if (statusInfo['cancel']) {
orders[orderK]['cancel'] = statusInfo['cancel'];
}
else {
if (statusInfo['keyName']) {
orders[orderK][statusInfo['keyName']] = true;
// 已发货,物流信息
if (statusInfo['keyName'] == 'shipped') {
let expressInfo = getExpressInfo(orderV['order_code'], uid, orderV['payment_type'], orderV['create_time']);
orders[orderK]['logistics'] = expressInfo['logistics'];
}
}
}
// 订单商品相关信息
let opRefundStatus = true; // 订单不可操作退换货
if (orderV['order_goods'] && orderV['order_goods']) {
let goods = {}, refundFlag = {};
orderV['order_goods'].forEach(function(goval, gokey) {
goods[gokey] = {};
goods[gokey]['href'] = helpers.getUrlBySkc(goval['product_id'], goval['goods_id'], goval['cn_alphabet']);
goods[gokey]['thumb'] = goval['goods_image'] && goval['goods_image'] ? Image.getImageUrl(goval['goods_image'], 100, 100) : '';
goods[gokey]['name'] = goval['product_name'];
goods[gokey]['color'] = goval['color_name'];
goods[gokey]['size'] = goval['size_name'];
goods[gokey]['price'] = goval['goods_price'];
let buyNum = Number(goval['buy_number']);
let refundNum = Number(goval['refund_num']);
goods[gokey]['count'] = buyNum;
let refundStatus = (refundNum > 0) ? true : false; // 只要发生一件退换,退换过的标记
goods[gokey]['refundStatus'] = refundStatus;
refundFlag = ((buyNum == refundNum) && refundNum > 0) ? 'finished' : 'unfinished'; // 某一件商品全部退换结束
goods[gokey]['arrivalDate'] = goval['expect_arrival_time'];
let goodsTagName = getGoodsTag(orderV['attribute'], goval['goods_type']);
if (goodsTagName) {
goods[gokey][goodsTagName] = true;
}
orders[orderK]['goods'] = goods;
});
if (refundFlag.indexOf('unfinished')) {
opRefundStatus = false;
}
orders[orderK]['pay'] = orderV['amount']; // 付款数
orders[orderK]['fregit'] = orderV['shipping_cost']; // 邮费
}
// 操作
orders[orderK]['operation'] = getOperateInfo(orderV['attribute'], orderV['is_cancel'], orderV['status'], orderV['payment_status'], orderV['update_time'], orderV['order_type'], orderV['refund_status'], orderV['payment_type'], orderV['order_code'], opRefundStatus);
});
if (isPage) {
orders['pager']['total'] = orderInfo['data']['total'];
orders['pager']['pageTotal'] = orderInfo['data']['page_total'];
orders['pager']['page'] = orderInfo['data']['page'];
}
return orders;
}
})();
};
const getOrderStatus = (isCancel, status, payType, payStatus)=>{
// 初始化:未取消,待付款
let ret = {cancel: false, keyName: 'noPay', statusStr: '待付款'};
if (isCancel == 'Y') {
ret = {cancel: true, statusStr: '已取消'};
} else {
switch (status) {
case 0:
// '订单已成功,等待付款'
if (payType != 2 && payStatus == 'N') {
ret['keyName'] = 'noPay';
ret['statusStr'] = '待付款';
}
// '订单已付款,等待备货中'
else if (payType != 2 && payStatus == 'Y') {
ret['keyName'] = 'paid';
ret['statusStr'] = '备货中';
}
// '订单已成功,等待备货中'-货到付款
else if (payType == 2 && payStatus == 'N') {
ret['keyName'] = 'complete';
ret['statusStr'] = '备货中';
}
break;
case 1:
case 2:
case 3:
// '订单已付款,等待备货中'
ret['keyName'] = 'paid';
ret['statusStr'] = '备货中';
break;
case 4:
case 5:
// '订单已发货'
ret['keyName'] = 'shipped';
ret['statusStr'] = '待收货';
break;
case 6:
// '交易完成';
ret['keyName'] = 'reback';
ret['statusStr'] = '交易完成';
break;
}
}
return ret;
};
const getExpressInfo = (orderCode, uid, paymetType, createTime, isDetail)=>{
return co(function * () {
isDetail = isDetail || false;
let result = {};
result['logisticsUrl'] = '';
result['logisticsImg'] = '';
result['logisticsCompany'] = '';
result['courierNumbe'] = '';
if (paymetType == 1) {
if (isDetail) {
result['logistics'] = [new Date(createTime), ' ', '您的订单已提交,等待付款'];
}
else {
result['logistics'] = new Date(createTime) + ' ' + '您的订单已提交,等待付款';
}
}
if (paymetType == 2) {
if (isDetail) {
result['logistics'] = [new Date(createTime), ' ', '您的订单已提交,等待审核'];
}
else {
result['logistics'] = new Date(createTime) + ' ' + '您的订单已提交,等待审核';
}
}
// 有物流
if (orderCode && _.isNumber(uid)) {
let logistics = yield OrderData.getLogisticsData(orderCode, uid);
if (logistics['data']) {
result['logisticsUrl'] = logistics['data']['url'] ? helper.getUrlSafe(logistics['data']['url']) : '';
result['logisticsImg'] = logistics['data']['logo'] ? logistics['data']['logo'] : '';
result['logisticsCompany'] = logistics['data']['caption'] ? logistics['data']['caption'] : '';
result['courierNumbe'] = logistics['data']['express_number'] ? logistics['data']['express_number'] : '';
let expressDetail = logistics['data']['express_detail'] ? logistics['data']['express_detail'] : {};
if (expressDetail) {
let logisticsTmp = result['logistics'][0]; // 暂存
result['logistics'] = {};
expressDetail.forEach(function(value) {
let pos = value['accept_address'].indexOf(' ') / 3;
let city = value['accept_address'].substr(0, pos);
let exInfo = value['accept_address'].substr(pos);
if (isDetail) {
result['logistics'] = [value['acceptTime'], city, exInfo];
}
else {
result['logistics'] = value['acceptTime'] + city + exInfo;
}
});
// 把最初的处理放最后
result['logistics'] = logisticsTmp;
}
}
}
return result;
})();
};
const getGoodsTag = (attribute, goodsType)=>{
let goodsTagName = '';
switch (goodsType) {
// 赠品
case 'gift':
goodsTagName = 'freebie';
break;
// 加价购
case 'price_gift':
goodsTagName = 'advanceBuy';
break;
// 预售
case 'advance':
goodsTagName = 'preSaleGood';
break;
// outlet
case 'outlet':
goodsTagName = '';
break;
// 免单
case 'free':
goodsTagName = '';
break;
// 电子
case 'ticket':
goodsTagName = '';
break;
default:
break;
}
// 虚拟
if (attribute == 3) {
goodsTagName = 'virtualGood';
}
return goodsTagName;
};
const getOperateInfo = (attribute, isCancel, status, payStatus, updateTime, orderType, refundStatus, paymentType, orderCode, opRefundStatus)=>{
// 查看订单
let orderDetailUrl = helpers.urlFormat('/home/orders/detail', {orderCode: orderCode});
// 查看二维码
let ticketUrl = helpers.urlFormat('/home/orders/tickets', {orderCode: orderCode});
// 立即付款
let payUrl = helpers.urlFormat('/shopping/pay', {orderCode: orderCode});
// 取消订单
let cancelOrderUrl = 'javascript:void(0)';
// 确认订单
let confirmOrderUrl = 'javascript:void(0)';
// 申请换货
let exchangeUrl = helpers.urlFormat('/home/returns/exchangeRequest', {orderCode: orderCode});
// 申请退货
let refundUrl = helpers.urlFormat('/home/returns/refundrequest', {orderCode: orderCode});
let operation = {};
// 立即付款
if (payStatus == 'N' && paymentType != 2 && isCancel == 'N') {
operation = {payNow: true, href: payUrl};
}
operation = {href: orderDetailUrl, name: '查看订单'};
// 查看订单,虚拟订单查看二维码
if (attribute == 3) {
if (payStatus == 'Y') {
operation = {href: ticketUrl, name: '查看二维码'};
}
}
// 取消订单
if (status < 3 && isCancel == 'N' && orderType != 5 && payStatus == 'N') {
operation = {href: cancelOrderUrl, name: '取消订单', cancelOrder: true};
}
// 确认收货
if (status >= 4 && status < 6 && refundStatus == 0 && attribute != 3 && isCancel == 'N') {
operation = {href: confirmOrderUrl, name: '确认收货', confirmReceived: true};
}
// 换货
let time = (Date.now() - updateTime);
let orderExchangeLimitTime = ChannelConfig.exchangeDay;
if (status >= 6 && time < 86400 * orderExchangeLimitTime && attribute != 3 && isCancel == 'N') {
operation = {href: exchangeUrl, name: '申请换货', optDis: opRefundStatus};
}
// 退货
let orderRefundLimitTime = ChannelConfig.refundDay;
if (status >= 6 && time < 86400 * orderRefundLimitTime && attribute != 3 && isCancel == 'N') {
operation = {href: refundUrl, name: '申请退货', optDis: opRefundStatus};
}
return operation;
};
module.exports = {
getOrders
};
... ...
'use strict';
const helpers = global.yoho.helpers;
const api = global.yoho.API;
/**
* 获取红包列表
* $uid 用户ID
*/
const getRedenvelopes = uid=>{
let options = {
method: 'app.yoho.redpacketList',
uid: uid
};
return api.get('', options);
};
/**
* 获取红包列表
* uid 用户ID
*/
const getRedenvelopesTotal = uid=>{
let options = {
method: 'app.yoho.redpacketInfo',
uid: uid
};
return api.get('', options);
};
module.exports = {
getRedenvelopes,
getRedenvelopesTotal
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const RedenvelopesData = require('./RedenvelopesData.js');
const redenvelopesList = uid=>{
return co(function*() {
let result = {};
let data = yield RedenvelopesData.getRedenvelopesTotal(uid);
if (data.code && data.code == 200 && data.data.redpacket_num) {
result.money = data.data.redpacket_num;
result.termOfValidity = data.data.useable_time;
}
result.useRemark = '1.红包活动,全场通用(预售商品除外);<br>2.结算时折抵现金使用,可以和优惠券叠加使用;<br>3.限有效期内使用,过期清零';
return [result];
})();
};
module.exports = {
redenvelopesList
};
... ...
/**
* @author: weiqingting<qingting.wei@yoho.cn>
*/
'use strict';
const querystring = require('querystring');
const searchApi = global.yoho.SearchAPI;
const getUrl = (type)=>{
var map = {
sort: '/sortgroup.json',
discount: '/discount.json',
recent: '/recent.json',
suggest: '/suggest.json',
'new-shelve': '/new-shelve.json',
shop: '/shops.json',
brand: '/brand/list.json'
};
return map[type] || '/search.json';
};
const getBrandListUrl = ()=>{
return getUrl('brand');
};
const getProductUrl = (condition, type)=>{
let orderMaps = {
s_t_desc: 'shelve_time:desc',
s_t_asc: 'shelve_time:asc',
s_p_asc: 'sales_price:asc',
s_p_desc: 'sales_price:desc',
p_d_desc: 'discount:desc',
p_d_asc: 'discount:asc',
skn_desc: 'product_skn:desc',
skn_asc: 'product_skn:asc',
activities_desc: 'activities.order_by:desc',
activities_asc: 'activities.order_by:asc',
s_n_asc: 'sales_num:asc',
s_n_desc: 'sales_num:desc',
activities_id_desc: 'activities.activity_id:desc',
activities_id_asc: 'activities.activity_id:asc',
brand_desc: 'brand_weight:desc'
};
let param = {
status: 1,
sales: 'Y',
outlets: 2,
stocknumber: 1,
attribute_not: 2
};
if (!condition.order) {
param.order = orderMaps.s_t_desc;
} else {
param.order = orderMaps[condition.order] ? orderMaps[condition.order] : '';
}
if (!condition.page) {
param.page = 1;
}
if (condition.viewNum) {
param.viewNum = condition.viewNum;
} else if (!condition.limit) {
param.viewNum = 60;
} else {
param.viewNum = condition.limit;
delete condition.limit;
}
if (!condition) {
param += condition;
}
return getUrl(type) + '?' + querystring.stringify(param);// searchApi.get(getUrl(type), param,{cache:true});
};
const searchAll = (param)=>{
param = param || {};
return searchApi.get(getUrl(type), param, {cache: true});
};
module.exports = {
getProductUrl,
getBrandListUrl,
searchAll
};
... ...
'use strict';
const api = global.yoho.API;
const privateKeyList = {
'android': 'fd4ad5fcfa0de589ef238c0e7331b585',
'iphone': 'a85bb0674e08986c6b115d5e3a4884fa',
'ipad': 'ad9fcda2e679cf9229e37feae2cdcf80',
'web': '0ed29744ed318fd28d2c07985d3ba633',
'h5': 'fd4ad5fcfa0de589ef238c0e7331b585'
};
const getVIPInfoByUid = (uid)=>{
let options = {
method: 'app.passport.vip',
uid: uid,
private_key: '0ed29744ed318fd28d2c07985d3ba633'
};
return api.get('', options);
};
const getCouponsList = (uid, type, page, limit)=>{
page = page || 1;
type = type || 'notuse';
limit = limit || 10;
let options = {
method: 'app.coupons.lists',
uid: uid,
type: type,
page: page,
limit: limit
};
return api.get('', options);
};
module.exports = {
getVIPInfoByUid,
getCouponsList
};
... ...
/**
* comment model
* @author 陈轩 <xuan.chen@yoho.cn>
*/
'use strict';
const path = require('path');
const imgUtils = require(path.join(global.utils, 'images'));
const Promise = require('bluebird');
const _ = require('lodash');
// 使用 product中的分页逻辑
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;
const co = Promise.coroutine;
const api = global.yoho.API;
const helpers = global.yoho.helpers;
const NO_COMMENTED_GOODS = '您还没有已评论的商品';
const NO_UNCOMMENT_GOODS = '您还没有未评论的商品';
exports.getCommentList = (uid, isComment, page, limit) => {
limit = limit || 10;
const process = function*() {
let result = yield api.post('', {
method: 'web.show.queryOrderProductCommentList',
uid: uid
});
let commentList = {
isComment: isComment,
goodsNum: 0,
orders: []
};
let pagerObj = {};
// 接口返回成功, 处理数据
if (result.code === 200 && !_.isEmpty(result.data)) {
_.forEach(result.data, (value) => {
let order = {
orderNum: value.orderCode,
orderTime: value.createTime,
orderId: value.orderId,
goods: []
};
_.forEach(value.orderGoods, (v) => {
let cnAlphabet = v.cnAlphabet || '';
let good = {
href: helpers.getUrlBySkc(v.productId, v.goodsId, cnAlphabet),
thumb: imgUtils.getImageUrl(v.imageUrl, 100, 100),
name: v.productName || '',
productSkn: v.productSkn,
productId: v.productId,
goodsId: v.goodsId,
erpSkuId: v.erpSkuId
};
if (isComment === v.hasOwnProperty('comment')) {
if (isComment) {
good.remark = v.comment;
}
order.goods.push(good);
commentList.goodsNum++;
}
});
order.goods.length && commentList.orders.push(order);
});
let total = commentList.orders.length;
// let totalPage = Math.ceil(total / limit);
let begin = (page - 1) * limit;
commentList.orders = commentList.orders.slice(begin, begin + limit); // [begin, begin+limit)
pagerObj = pager(total, {
isComment: isComment ? 'Y' : 'N',
page: page
});
} else {
commentList.empty = isComment ? NO_COMMENTED_GOODS : NO_UNCOMMENT_GOODS; // 空数据 提示文字
}
return {
comment: commentList,
pager: pagerObj
};
};
return co(process)();
};
exports.saveShareOrder = data => {
let process = function*() {
let res = api.post('', {
method: 'show.saveShareOrder',
parameters: JSON.stringify(data)
});
return res;
};
return co(process)();
};
... ...
/**
* 我的投诉 model
* @author: yyq<yanqing.yang@yoho.cn>
* @date: 2016/8/18
*/
'use strict';
const api = global.yoho.API;
const _ = require('lodash');
const Promise = require('bluebird');
const setPager = require(`${global.utils}/pager`).setPager;
const co = Promise.coroutine;
const complaintType = {
0: '全部',
1: '产品相关',
2: '物流相关'
};
/**
* 获取投诉列表
* @function getComplaintsList
* @param { Number } uid 用户uid
* @param { Number } page 页码
* @param { Number } limit 每页数目
* @return { Object } 投诉列表数据
*/
const getComplaintsList = (uid, page, limit) => {
page = page || 1;
limit = limit || 10;
const process = function*() {
let resData = {};
let result = yield api.get('', {
method: 'web.complaints.getList',
uid: uid,
page: page,
limit: limit
}, {code: 200});
if (!_.isEmpty(result.data)) {
let list = [];
_.forEach(_.get(result, 'data.complaintList', []), value => {
list.push({
id: value.id,
title: value.title,
target: value.customer,
type: complaintType[value.complaintsType],
order: value.orderCode,
time: value.createTime,
question: value.content,
reply: value.reply,
replyTime: value.replyTime,
revoke: value.status === -1
});
});
if (_.isEmpty(list)) {
resData.complaints = {empty: '您尚未投诉任何内容'};
} else {
resData.complaints = list;
}
resData.pager = Object.assign({
count: _.get(result, 'data.total', 0),
curPage: page,
totalPages: _.get(result, 'data.page_total', 0)
}, setPager(_.get(result, 'data.page_total', 0), {
page: page
}));
if (!_.get(resData, 'pager.pages[1]')) {
_.unset(resData, 'pager.pages');
}
}
return resData;
};
return co(process)();
};
/**
* 添加投诉
* @function addComplaints
* @param { Number } uid 用户uid
* @param { Object } params 投诉内容信息
* @return { Object } 添加投诉结果
*/
const addComplaints = (uid, params) => {
let process = function*() {
let res = api.post('', {
method: 'web.complaints.add',
uid: uid,
title: _.trim(params.title),
customer: _.trim(params.customer),
complaintsType: _.trim(params.complaintsType),
orderCode: _.trim(params.orderCode),
content: _.trim(params.content)
});
return res;
};
return co(process)();
};
/**
* 撤销投诉
* @function addComplaints
* @param { Number } uid 用户uid
* @param { Number } id 投诉id
* @return { Object } 撤销投诉结果
*/
const cancelComplaints = (uid, id) => {
let process = function*() {
let res = api.post('', {
method: 'web.complaints.cancel',
uid: uid,
id: id
});
return res;
};
return co(process)();
};
module.exports = {
getComplaintsList,
addComplaints,
cancelComplaints
};
... ...
/**
* home-我的咨询 业务逻辑
* @author 陈轩 <xuan.chen@yoho.cn>
*/
'use strict';
const path = require('path');
const Promise = require('bluebird');
const moment = require('moment');
const _ = require('lodash');
const imgUtils = require(path.join(global.utils, 'images'));
const api = global.yoho.API;
const searchApi = global.yoho.SearchAPI;
const helpers = global.yoho.helpers;
const co = Promise.coroutine;
// 分页 函数
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;
const NO_CONSULT = '您尚未咨询任何内容';
/**
* 查询多个skn的默认商品
* @param skns array
* @return array
*/
function getProductGoodsInfo(skns) {
const query = skns.join(',');
return searchApi.get('/search.json', {
data: {
query: query
}
}).then(result => {
let resData = {};
_.forEach(_.get(result, 'data.product_list', []), good => {
resData[good.product_skn] = good;
});
return resData;
});
}
/**
* 获取咨询列表
*/
exports.consultList = (uid, page, limit) => {
page = Number.parseInt(page, 10) || 1;
limit = Number.parseInt(limit, 10) || 10;
const data = {
uid: uid,
page: page,
limit: limit
};
const fetchConsults = co(function*(params) {
let res = yield api.get('', Object.assign({
method: 'web.personCen.buyConsult'
}, params));
return res;
});
// 处理fetchConsults的数据
const processData = co(function*(res) {
// 处理结果
const result = {
consults: [],
pager: {}
};
let origin = res.data; // 原始数据
const skns = [];
if (res.code === 200 && origin && origin.consult_list && origin.consult_list.length) {
origin.consult_list.forEach(consult => {
skns.push(consult.skn);
});
let goodInfos = yield getProductGoodsInfo(skns);
origin.consult_list.forEach(consult => {
let goodInfo = goodInfos[consult.skn];
if (!goodInfo) {
return;
}
let info = {
href: helpers.getUrlBySkc(goodInfo.productId, goodInfo.goodsId, goodInfo.cn_alphabet),
thumb: imgUtils.getImageUrl(goodInfo.images_url, 60, 60, 1),
name: consult.productName,
question: consult.ask || '',
consultTime: moment(consult.askTime).format('YYYY-MM-DD H:m:s')
};
if (consult.answer) {
info.reply = consult.answer;
}
result.consults.push(info);
});
result.pager = pager(origin.total, {
page: origin.page,
limit: limit
});
}
if (!result.consults.length) {
result.empty = NO_CONSULT;
}
return result;
});
return fetchConsults(data).then(processData);
};
... ...
'use strict';
const api = global.yoho.API;
const service = global.yoho.ServiceAPI;
const URL_PRODUCT_FAVORITE = 'shops/service/v1/favorite/';
const URL_ARTICLE_FAVORITE = '/guang/api/v1/favorite/';
const URL_ARTICLE_FAVORITE_BRAND = '/guang/service/v2/favorite/toggleBrand';
// apiS.get(self::URL_ARTICLE_FAVORITE. 'getUserFavArticleList',{})
/**
* 根据uid和商品的id查询是否被用户收藏
* @param int $uid
* @param int $productId
* @param boolean $isOnlyUrl 是否指返回链接
* @return boolean 收藏 true 未收藏 false
*/
const getUidProductFav = (uid, productId, isOnlyUrl)=> {
isOnlyUrl = (isOnlyUrl === undefined) ? false : isOnlyUrl;
let options = {
method: 'web.favorite.isFavorite',
id: productId,
uid: uid,
type: 'product'
};
return api.get('', options);
};
const favoriteArticleData = (uid, udid, page, limit)=> {
let options = {
uid: uid,
udid: udid,
page: page,
limit: limit
};
return service.get(URL_ARTICLE_FAVORITE + 'getUserFavArticleList', options);
};
const getFavoriteProductList = (uid, limit)=> {
limit = limit || 500;
let options = {
method: 'web.favorite.product',
uid: uid,
limit: limit
};
return api.get('', options);
};
const redutionCount = (uid)=> {
let options = {
method: 'web.redution.count',
uid: uid
};
return api.get('', options);
};
module.exports = {
getUidProductFav,
getFavoriteProductList,
favoriteArticleData,
redutionCount
};
... ...
'use strict';
const Promise = require('bluebird');
const co = Promise.coroutine;
const helpers = global.yoho.helpers;
const path = require('path');
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;
const favoriteApi = require('./favorite-api');
const TABS = [
{type: 'product', name: '商品收藏'},
{type: 'brand', name: '品牌收藏'},
{type: 'article', name: '文章收藏'}
];
const getFavoriteTabs = (type) => {
type = type || 'product';
return TABS.map((item) => {
item.active = item.type === type;
item.url = helpers.urlFormat('/home/favorite', {type: item.type});
return item;
});
};
const favoriteProductList = (uid, page, limit, type, sort, subscribe, reduction, promotion) => {
return co(function*() {
let data = {};
let product = {};
let result = {
sort: {},
reduction: {},
filter: {},
goods: {},
pager: {}
};
product = yield favoriteApi.getFavoriteProductList(uid);
if (product.data.category_list) {
result.sort = getSortInfo(product.data.category_list, sort);
}
result.reduction = yield redutionCount(uid);
let productList = [];
if (product.data.product_list) {
product.data.product_list.forEach(function(product) {
if (
(reduction === 'Y' && promotion === 'Y' && product.is_price_down === 'Y' && promotion === 'Y') ||
(sort && product.category_id === sort) ||
(subscribe && product.is_subscribe_reduction === 'Y') ||
(reduction === 'Y' && product.is_price_down === 'Y') ||
(promotion === 'Y' && product.is_join_promotion === 'Y')
) {
productList.push(product);
}
});
productList = product.data.product_list;
}
if (reduction === 'N' && promotion === 'N') {
result.filter = {
reductionUrl: helpers.urlFormat('/home/favorite', {is_reduction: 'Y'}),
reductionChecked: '',
activityUrl: helpers.urlFormat('/home/favorite', {is_promotion: 'Y'}),
activityChecked: ''
};
} else if (reduction === 'N' && promotion === 'Y') {
result.filter = {
reductionUrl: helpers.urlFormat('/home/favorite', {is_reduction: 'Y', is_promotion: 'Y'}),
reductionChecked: '',
activityUrl: helpers.urlFormat('/home/favorite', {is_promotion: 'Y'}),
activityChecked: ''
};
} else if (reduction === 'Y' && promotion === 'N') {
result.filter = {
reductionUrl: helpers.urlFormat('/home/favorite', {is_reduction: 'Y', is_promotion: 'Y'}),
reductionChecked: '',
activityUrl: helpers.urlFormat('/home/favorite', {is_promotion: 'Y', is_promotion: 'Y'}),
activityChecked: ''
};
} else {
result.filter = {
reductionUrl: helpers.urlFormat('/home/favorite', {is_reduction: 'Y', is_promotion: 'Y'}),
reductionChecked: '',
activityUrl: helpers.urlFormat('/home/favorite', {is_promotion: 'Y', is_promotion: 'Y'}),
activityChecked: ''
};
}
let total = productList;
let pageTotal = Math.ceil(total / limit);
result.pager = getPager(page, total, pageTotal);
result.goods = getGoodsInfo(productList, page, limit);
return result;
})();
};
const favoriteBrandList = (uid, page, limit, type)=> {
return co(function*() {
let result = {
brands: {
empty: '您没有收藏品牌',
pager: {}
}
};
let brand = yield favoriteApi.favoriteBrandData(uid, page, limit);
if (!brand.data || !brand.data.page_total) {
return result;
}
if (brand.data.page_total < page) {
page = brand.data.page_total;
brand = yield favoriteApi.favoriteBrandData(uid, page, limit);
}
if (!brand.data.brand_list) {
return result;
}
let brands = [];
brand.data.brand_list.forEach((item, i)=> {
brands.push({
id: item.brand_id,
brandOrShopType: item.brandOrShopType || '',
shop_id: item.shop_id || '',
img: helpers.image(item.brand_ico, 100, 100),
url: helpers.urlFormat('', {shopId: item.shop_id || ''}, item.brand_domain),
name: item.brand_name,
naCount: item.new_product_num,
colCount: item.brand_favorite_num
});
});
result.brands = brands;
let total = brand.data.total || 0;
let pageTotal = brand.data.page_total || 0;
page = brand.data.page || 0;
result.pager = getPager(page, total, pageTotal);
return result;
})();
};
const favoriteArticleListAsync = (uid, udid, page, limit)=> {
return co(function*() {
let result = {articles: [], pager: {}};
let articles = yield favoriteApi.favoriteArticleData(uid, udid, page, limit);
if (!articles.data && !articles.data.data) {
articles.data.data.forEach((item)=> {
result.articles.push({
id: item.id,
name: item.title,
img: helpers.image(item.src, 146, 96),
desc: item.intro,
url: helpers.urlFormat('/' + item.id + '.html', '', 'guang')
});
});
let total = articles.data.total || 0;
let pageTotal = articles.data.totalPage || 0;
let pageNum = articles.data.page || 0;
result.pager = getPager(pageNum, total, pageTotal);
} else {
result.articles = {empty: '你尚未收藏任何文章!'};
}
return result;
})();
};
const getPager = (page, total, totalPage, size, type)=> {
let result = {};
if (page && total && totalPage) {
result = {
count: total,
curPage: page,
totalPages: totalPage,
hasCheckAll: true
};
}
return result;
};
const getGoodsInfo = (data, page, limit)=> {
let result = [];
let begin = (page - 1) * limit;
if (!data) {
data = data.slice(begin, limit);
data.forEach((item, i)=> {
let obj = {
skn: item.product_id,
img: helpers.img(item.image, 100, 100),
name: item.product_name,
url: helpers.getUrlBySkc(item.product_id, item.goodsId, item.cnAlphabet),
price: item.sales_price,
priceDown: item.price_down,
buyNow: helpers.getUrlBySkc(item.product_id, item.goodsId, item.cnAlphabet),
soldOut: item.storage === 0 ? true : '',
hadNoticed: item.is_subscribe_reduction === 'Y' ? true : '',
count: item.promotion_list ? item.promotion_list.length : 0
};
if (item.promotion_list) {
item.promotion_list.forEach(function(item1) {
obj.activites.list.push({
type: item1.promotion_type,
name: item1.promotion_title
});
});
}
result.push(obj);
});
} else {
result = {empty: '您没有收藏商品'};
}
return result;
};
const redutionCount = (uid)=> {
return co(function*() {
let result = {count: 0, url: '/home/favorite/reduction', phone: ''};
let data = yield favoriteApi.redutionCount(uid);
if (data.data.num) {
result.count = +data.data.num;
result.phone = data.data.mobile;
}
return result;
})();
};
const getSortInfo = (categoryList, sort)=> {
let result = {default: {}, all: []};
let defaultCategory = {name: '全部', url: helpers.urlFormat('/home/favorite'), count: 0, focus: ''};
categoryList.forEach(function(category) {
result.all.push({
name: category.category_name,
url: helpers.urlFormat('/home/favorite', {sort_id: category.category_id}),
count: category.num,
focus: category.category_id === sort ? true : ''
});
defaultCategory.count += category.num;
defaultCategory.focus = sort === 0 ? true : '';
});
result.all.unshift(defaultCategory);
result.default = result.all.slice(result.all, 0, 7);
return result;
};
module.exports = {
getFavoriteTabs,
favoriteProductList,
favoriteArticleListAsync
};
... ...
/**
* 我的消息model
* @author: yyq<yanqing.yang@yoho.cn>
* @date: 2016/8/29
*/
'use strict';
const api = global.yoho.API;
const _ = require('lodash');
const Promise = require('bluebird');
const setPager = require(`${global.utils}/pager`).setPager;
const co = Promise.coroutine;
const getMessageAsync = (uid, page, size) => {
return api.get('', {
method: 'app.inbox.getlist',
uid: uid,
page: page || 1,
size: size || 10
}, {code: 200});
};
const delMessageAsync = (uid, id) => {
return api.get('', {
method: 'app.inbox.delmessage',
uid: uid,
id: id
});
};
const readMessageAsync = (uid, id) => {
return api.get('', {
method: 'web.inbox.setread',
uid: uid,
ids: id
});
};
const getBirthCouponAsync = (uid, couponId) => {
return api.get('', {
method: 'app.promotion.getCoupon',
uid: uid,
couponId: couponId
});
};
/**
* 根据用户uid获取生日券id
* @function getCouponAsync
* @param { Number } uid 用户uid
* @return { Object } 生日券数据
*/
const getCouponAsync = (uid) => {
return api.get('', {
method: 'app.promotion.queryBirthCoupon',
uid: uid,
couponType: 4
}, {code: 200});
};
/**
* 获取消息列表
* @function getMessageList
* @param { Number } uid 用户uid
* @param { Number } page 页码
* @param { Number } limit 每页数目
* @return { Object } 消息列表数据
*/
const getMessageList = (uid, page, limit) => {
let process = function*() {
let resData = {};
let result = yield getMessageAsync(uid, page, limit);
if (result.data) {
let msg = [];
_.forEach(_.get(result, 'data.list', []), value => {
// 信息过滤
if (value.type === '$inboxval' || value.type === 'notice') {
return;
}
msg.push({
id: value.id || 0,
href: `/home/message/detail?id=${value.id}&page=${page}`,
title: value.title || '',
sender: value.from || '',
time: value.create_date,
isNew: value.is_read === 'Y' ? false : true
});
});
resData.messages = msg;
resData.pager = Object.assign({
count: _.get(result, 'data.total', 0),
curPage: page,
totalPages: _.get(result, 'data.page_total', 0)
}, setPager(_.get(result, 'data.page_total', 0), {
page: page
}));
}
if (_.isEmpty(resData.messages)) {
resData.messages = {empty: '您尚未收到任何短消息'};
}
return resData;
};
return co(process)();
};
/**
* 获取消息内容
* @function getMessageDetail
* @param { Number } uid 用户uid
* @param { Number } page 页码
* @param { Number } limit 每页数目
* @return { Object } 消息列表数据
*/
const getMessageDetail = (uid, mid, page, limit) => {
let process = function*() {
let resData = {
backUrl: `/home/message?page=${page}`
};
let result = yield getMessageAsync(uid, page, limit);
let msg = _.find(_.get(result, 'data.list', []), {id: mid});
if (!_.isEmpty(msg)) {
resData.message = {
sender: msg.from, // 消息发言人
title: msg.title, // 消息标题
time: msg.create_date // 消息创建时间
};
switch (msg.type) {
case 'pullCoupon': // eslint-disable-line
let couponInfo = yield getCouponAsync(uid);
let coupons = [];
if (!_.isEmpty(couponInfo.data)) {
_.forEach(couponInfo.data, value => {
coupons.push({
id: value.id,
remark: value.couponName || '',
useTime: _.get(value, 'body.use_time', ''),
pickTime: _.get(value, 'body.collar_time', ''),
canPick: true
});
});
} else {
// 已过期生日券信息
coupons.push({
remark: _.get(msg, 'body.name', ''),
useTime: _.get(msg, 'body.use_time', ''),
pickTime: _.get(msg, 'body.collar_time', '')
});
}
resData.message.coupons = coupons;
break;
case 'button':
// 促销活动
resData.message.sale = {
image: _.get(msg, 'body.image', ''),
content: _.get(msg, 'body.text', ''),
btnLink: _.get(msg, 'body.pc_link', ''),
btnName: _.get(msg, 'body.button_text', '')
};
break;
case 'pushCoupon':
// 查看优惠券
resData.message.coupons = [{
remark: _.get(msg, 'body.coupon_name', ''),
useTime: _.get(msg, 'body.time', ''),
id: _.get(msg, 'body.inboxId', ''),
price: _.get(msg, 'body.price', ''),
url: '/home/coupons'
}];
break;
default:
// 普通文本
resData.message.text = {
content: _.get(msg, 'body.content', '')
};
break;
}
}
return resData;
};
return co(process)();
};
/**
* 删除用户消息
* @function getMessageDetail
* @param { Number } uid 用户uid
* @param { Number } mid 消息id
* @return { Object } 消息列表数据
*/
const delMessage = (uid, mid) => {
let process = function*() {
let resData = {code: 400, message: '删除失败'};
let result = yield delMessageAsync(uid, mid);
if (result.code === 200) {
Object.assign(resData, {
code: 200,
message: '删除成功'
});
}
return resData;
};
return co(process)();
};
/**
* 删除用户消息
* @function getMessageDetail
* @param { Number } uid 用户uid
* @param { Number } mid 消息id
* @return { Object } 消息列表数据
*/
const readMessage = (uid, mid) => {
let process = function*() {
let resData = {code: 400, message: '标记失败'};
let result = yield readMessageAsync(uid, mid);
if (result.code === 200) {
resData = result;
}
return resData;
};
return co(process)();
};
const pickBirthCoupon = (uid, id) => {
return getBirthCouponAsync(uid, id);
};
module.exports = {
getMessageList,
getMessageDetail,
delMessage,
readMessage,
pickBirthCoupon
};
... ...
/**
* 退换货API
* @author: yyq<yanqing.yang@yoho.cn>
* @date: 2016/9/05
*/
'use strict';
const api = global.yoho.API;
/**
* 获取订单退货信息
*/
const getRefundGoodsAsync = (orderCode, uid) => {
return api.get('', {
method: 'app.refund.goodsList',
order_code: orderCode,
uid: uid
}, {code: 200});
};
/**
* 获取退货订单信息
*/
const getRefundDetailAsync = (id, uid) => {
return api.get('', {
method: 'app.refund.detail',
id: id,
uid: uid
}, {code: 200});
};
/**
* 快递公司列表
*/
const getExpressCompanyAsync = () => {
return api.get('', {
method: 'app.express.getExpressCompany'
}, {code: 200});
};
module.exports = {
getRefundGoodsAsync,
getRefundDetailAsync,
getExpressCompanyAsync
};
... ...
/**
* 个人中心 退换货
* @author chenxuan <xuan.chen@yoho.cn>
*/
'use strict';
const _ = require('lodash');
const path = require('path');
const Promise = require('bluebird');
const returnAPI = require('./returns-api');
// 使用 product中的分页逻辑
const pagerPath = path.join(global.appRoot, '/apps/product/models/public-handler.js');
const pager = require(pagerPath).handlePagerData;
const co = Promise.coroutine;
const api = global.yoho.API;
const helpers = global.yoho.helpers;
// 常量
const REFUND = 1; // 退货
const EXCHANGE = 2; // 换货
const TRUE = 'Y';
const RETURNS_EMPTY = '您没有退/换货订单';
const REFUND_URI = '/home/returns/refundDetail';
const EXCHANGE_URI = '/home/returns/exchangeDetail';
// 处理退换货商品链接
const getProductUrlBySkc = (pid, gid, cnAlphabet) => {
cnAlphabet = cnAlphabet || 'cnalphabet';
return helpers.urlFormat(`/product/pro_${pid}_${gid}/${cnAlphabet}.html`,
{}, 'item');
};
const setDetailGoods = (list) => {
let resData = [];
_.forEach(list, value => {
resData.push({
name: value.product_name || '',
reason: value.reason_name
});
});
return resData;
};
// 处理订单商品的数据
function getGoodsData(goods) {
const arr = [];
goods.forEach(good => {
const obj = {};
const cnAlphabet = good.cn_alphabet || '';
obj.href = getProductUrlBySkc(good.product_id, good.goods_id, cnAlphabet);
obj.thumb = helpers.image(good.goods_image, 60, 60);
obj.name = good.product_name;
obj.color = good.color_name;
obj.size = good.size_name;
arr.push(obj);
});
return arr;
}
/**
* 退换货列表页数据
* @param {string} uid 用户 uid
* @param {Number} page 当前页数
* @param {Number} limit 每页最大条数
* @return {Object} Promise
*/
const getReturnsList = co(function*(uid, page, limit) {
page = Number.parseInt(page, 10) || 1;
limit = Number.parseInt(limit, 10) || 10;
const obj = {
orders: [],
pager: {}
};
let response = yield api.post('', {
method: 'app.refund.getList',
data: { uid: uid, page: page, limit: limit }
});
let repData = response.data;
// 处理数据
if (response.code === 200 && repData && repData.list.length) {
obj.pager = pager(repData.total, {
page: page,
limit: limit
});
repData.list.forEach(item => {
const t = {};
t.returnId = item.id;
t.orderNum = item.order_code;
t.orderTime = item.oreder_create_time.replace('-', '/');
t.returnTime = item.create_time;
t.returnStatus = item.status_name;
const canCancel = item.canCancel === TRUE;
let isChange, uri;
switch (item.refund_type) {
case REFUND:
isChange = false;
if (canCancel) {
uri = REFUND_URI;
}
break;
case EXCHANGE:
isChange = true;
if (canCancel) {
uri = EXCHANGE_URI;
}
break;
default:
}
t.isChange = isChange;
t.canCancelUrl = helpers.urlFormat(uri);
t.moreHref = helpers.urlFormat(uri, { id: item.id });
t.goods = getGoodsData(item.goods);
obj.orders.push(t);
});
} else {
obj.empty = RETURNS_EMPTY;
}
return obj;
});
const getOrderRefund = (orderCode, uid) => {
let process = function*() {
let resData = {};
let result = yield returnAPI.getRefundGoodsAsync(orderCode, uid);
if (result.data) {
let goods = [];
let returnReason = result.data.return_reason,
remarks = _.split(_.get(result, 'data.special_notice.remark', ''), ' ', 2), // 使用3个空格拆分
amount = 0;
_.forEach(_.get(result, 'data.goods_list', []), value => {
let cnAlphabet = value.cn_alphabet || '';
let item = {
href: getProductUrlBySkc(value.product_id, value.goods_id, cnAlphabet),
name: value.product_name,
color: value.color_name,
size: value.size_name,
price: value.last_price,
skn: value.product_skn,
skc: value.product_skc,
sku: value.product_sku,
goods_type_id: value.goods_type_id,
goods_type: value.goods_type,
reason: returnReason
};
amount += parseInt(value.last_price, 10);
// tar note 为每个特殊商品都添加标识
if (value.is_limit_skn === 'Y') {
item.specialNoticeBo = {
title: _.get(result, 'data.special_notice.title', ''),
remark1: remarks[0] || '',
remark2: remarks[1] || ''
};
// tar note 对数组做处理,为不显示的添加 inactive
if (result.data.special_return_reason) {
let spReason = result.data.special_return_reason;
_.forEach(item.reason, (subVal, subKey) => { // eslint-disable-line
if (_.indexOf(spReason, subKey)) {
_.set(item, `reason[${subKey}].inactive`, true);
}
});
}
}
goods.push(item);
// 商品中有鞋类,传给前端标识
if (value.hasShoes) {
_.set(resData, 'tips.footwear', true);
}
});
Object.assign(resData, {
orderCode: orderCode,
// 计算相关支付细节
amount: amount - _.get(result, 'data.yoho_coin_num', 0) -
_.get(result, 'data.coupon_amount', 0),
yohoCoin: result.data.yoho_coin_num,
coupon: result.data.coupon_amount,
cash: amount
});
_.forEach(result.data.return_amount_mode, (val, key) => {
if (val.is_default === 'Y') {
_.set(result, `data.return_amount_mode[${key}].default`, true);
}
});
resData.returnAmountMode = result.data.return_amount_mode;
}
return resData;
};
return co(process)();
};
const getRefundDetail = (applyId, uid) => {
let process = function*() {
let resData = {};
let result = yield Promise.all([
returnAPI.getRefundDetailAsync(applyId, uid),
returnAPI.getExpressCompanyAsync()
]);
if (result[0].data) {
let data = result[0].data;
let detail = {
isChange: false,
returnId: applyId,
orderNum: data.source_order_code,
nowStatus: data.status_name,
applyTime: data.create_time,
payMode: data.source_payment_type_desc || '',
backMode: data.return_amount_mode_name || '',
goods: setDetailGoods(data.goods_list)
};
if (+data.status !== 0) {
detail.express = {
id: _.get(data, 'notice.express_id', ''),
company: _.get(data, 'notice.express_company', ''),
number: _.get(data, 'notice.express_number', '')
};
}
detail.statusList = [];
_.forEach(data.statusList, value => {
detail.statusList.push({
name: value.name,
act: value.act === 'Y'
});
});
if (data.canCancel === 'Y') {
detail.canCancelUrl = '/home/refund/cancel';
}
resData.detail = detail;
}
if (result[1].data && resData.detail) {
_.set(resData, 'detail.expressList', _.toArray(result[1].data));
}
return resData;
};
return co(process)();
};
module.exports = {
getReturnsList,
getOrderRefund,
getRefundDetail
};
... ...
<div class="comment-me-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="comment block">
<h2 class="title"></h2>
{{#with comment}}
<div class="me-comment">
<div class="main-tip">
{{#if isComment}}
您己对<span id="goodsNum">{{goodsNum}}</span>件商品发表评论,感谢您优质的评论和分享!
<select class="right" onchange="javascript:location.href='/home/comment?isComment='+this.value;">
<option value="N">未发表评论的商品</option>
<option value="Y" selected="">己发表评论的商品</option>
</select>
{{else}}
您还有<span id="goodsNum">{{goodsNum}}</span>件商品未发表评论,欢迎您发表原创、与商品质量相关、对其他用户有参考价值的商品评论。
<select class="right" onchange="javascript:location.href='/home/comment?isComment='+this.value;">
<option value="N" selected="">未发表评论的商品</option>
<option value="Y">己发表评论的商品</option>
</select>
{{/if}}
</div>
<p class="comment-table-header table-header clearfix">
<span class="info">商品信息</span>
<span class="time">评论</span>
<span class="type">状态/操作</span>
</p>
{{#if orders.length }}
<table class="comment-table">
{{#each orders}}
<tr>
<th colspan="4">
订单编号:{{orderNum}}
<span class="right">下单时间:{{orderTime}}</span>
</th>
</tr>
{{#each goods}}
<tr>
<td width="115">
<a href="{{href}}"><img src="{{thumb}}"></a>
</td>
<td>
<a href="{{href}}">{{name}}</a>
</td>
{{#if remark}}
<td class="remark-content">{{remark}}</td>
<td width="90"><span class="remarked">已评论!</span></td>
{{else}}
<td class="remark-content">您还没对这个商品进行评论!</td>
<td width="90">
<button class="remark-btn">我要评论</button>
<div data-orderid="{{../orderId}}" data-productskn="{{productSkn}}" data-productid="{{productId}}" data-goodsid="{{goodsId}}" data-erpskuid="{{erpSkuId}}"></div>
</td>
{{/if}}
</tr>
{{/each}}
{{/each}}
</table>
{{#with ../pager}}
{{> common/foot-pager footPager=this}}
{{/with}}
{{else}}
{{> empty this}}
{{/if}}
</div>
{{/with}}
</div>
{{> help-us}}
</div>
<div id="comment-dialog-widget" class="comment-dialog-widget hide">
<div class="dialog-titlebar">
<span class="dialog-close-btn"></span>
</div>
<div class="dialog-content">
<dl>
<dd>商品评论:</dd>
<dd>
<textarea id="comment-content"></textarea>
</dd>
</dl>
</div>
<div class="dialog-buttons">
<button class="dialog-close-btn">取消</button>
<button class="dialog-save-btn">提交评论</button>
</div>
</div>
</div>
... ...
<div class="complaint-me-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="complaint block">
<h2 class="title"></h2>
<div class="me-complaints">
{{#if complaints.empty}}
{{#with complaints}}
{{> empty}}
{{/with}}
{{^}}
<p class="complaints-table-header table-header clearfix">
<span class="info">基本信息</span>
<span class="content">投诉内容</span>
</p>
{{# complaints}}
<div class="complaint-item">
<div class="info">
<p>投诉主题:{{title}}</p>
<p>投诉对象:{{target}}</p>
<p>投诉类型:{{type}}</p>
<p>涉及订单:{{order}}</p>
</div>
<div class="content">
<p class="question">{{question}}</p>
{{#if revoke}}
<p>问题已撤销</p>
{{^}}
{{#if reply}}
<p class="reply">{{reply}}</p>
{{^}}
<p>问题尚未回答。</p>
<p>
<span class="cancel-btn" data-id="{{id}}">撤销投诉</span>
</p>
{{/if}}
{{/if}}
</div>
<div>
{{time}}<br>
{{replyTime}}
</div>
</div>
{{/ complaints}}
{{/if}}
</div>
<div class="complaint-form">
<form action="complaints/addcomplaints" method="post" id="add-complaints">
<h2>我要投诉</h2>
<div class="form-content">
<dl>
<dt>投诉主题:</dt>
<dd>
<input name="title" id="title" type="text">
<span class="option-tip">请输入您的投诉主题</span>
</dd>
</dl>
<dl>
<dt>投诉对象:</dt>
<dd>
<input name="customer" id="customer" type="text">
<span class="option-tip">请填写您要投诉的对象,比如:客服00*号、发货员...</span>
</dd>
</dl>
<dl>
<dt>投诉类型:</dt>
<dd>
<select name="complaintsType" id="complaintsType" size="1">
<option value="0">所有</option>
<option value="1">产品相关</option>
<option value="2">物流相关</option>
</select>
</dd>
</dl>
<dl>
<dt>涉及订单:</dt>
<dd>
<input name="orderCode" id="orderCode" type="text">
<span class="option-tip">如果多个是多个订单号,请用英文逗号隔开,没有则不填</span> </dd>
</dd>
</dl>
<dl>
<dt>投诉内容:</dt>
<dd>
<textarea name="content" id="content"></textarea>
<span class="option-tip">输入您投诉的内容</span>
</dd>
</dl>
</div>
<div class="form-submit">
<input type="button" value="提交投诉内容" id="complaint-submit">
</div>
</form>
</div>
{{#unless complaints.empty}}
{{> pager}}
{{/unless}}
</div>
{{> help-us}}
</div>
</div>
... ...
<div class="consult-me-page me-page yoho-page clearfix">
{{> path}} {{> navigation}}
<div class="me-main">
<div class="consult block">
<h2 class="title"></h2>
<div class="me-consult">
{{#if consults.length}}
<div class="consults">
<table class="consults-table">
<tr>
<th colspan="2" align="left">产品信息</th>
<th colspan="2" align="left">咨询内容</th>
</tr>
{{#each consults}}
<tr>
<td style="width:60px;">
<img class="thumb" src="{{thumb}}">
</td>
<td>
<a class="name" href="{{href}}" title="{{name}}">{{name}}</a>
</td>
<td style="width:340px;">
<p class="question">{{question}}</p>
{{#if reply}}
<p class="reply">{{reply}}</p>
{{else}}
<p>问题尚未回答。</p>
{{/if}}
</td>
<td style="width:130px;">{{consultTime}}</td>
</tr>
{{/each}}
</table>
{{> common/foot-pager footPager=pager}}
</div>
{{else}}
{{> empty }}
{{/if}}
</div>
</div>
{{> help-us}}
</div>
</div>
... ...
<div class="me-coupons-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="coupons{{#if unUse}} un-use-coupons{{/if}}{{#if used}} used-coupons{{/if}}{{#if noValid}} no-valid-coupons{{/if}} block">
<h2 class="title">优惠券</h2>
{{> tabs}}
<p class="coupons-header clearfix">
{{#if unUse}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="term-of-validity">有效期</span>
<span class="use-remark">适用说明</span>
<span class="status">状态</span>
{{/if}}
{{#if used}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="order-num">订单编号</span>
<span class="order-sum">订单金额</span>
<span class="payment">实付金额</span>
<span class="use-time">使用时间</span>
{{/if}}
{{#if noValid}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="term-of-validity">有效期</span>
<span class="use-remark">适用说明</span>
{{/if}}
</p>
{{# unUseCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<div class="term-of-validity{{#if endSoon}} end-soon{{/if}}">
{{beginTime}}
-
<br>
{{endTime}}&nbsp;&nbsp;
<br>
<span>即将过期</span>
</div>
<span class="use-remark">{{useRemark}}</span>
<span class="status">{{status}}</span>
</div>
{{/unless}}
{{/ unUseCoupons}}
{{# usedCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<span class="order-num"><a href="{{orderDetailUrl}}">{{orderNum}}</a></span>
<span class="order-sum">{{orderSum}}</span>
<span class="payment">{{payment}}</span>
<span class="use-time">{{useTime}}</span>
</div>
{{/unless}}
{{/ usedCoupons}}
{{# noValidCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<div class="term-of-validity{{#if endSoon}} end-soon{{/if}}">
{{beginTime}}
-
<br>
{{endTime}}&nbsp;&nbsp;&nbsp;
</div>
<span class="use-remark">{{useRemark}}</span>
</div>
{{/unless}}
{{/ noValidCoupons}}
{{#if unUseCoupons}}
{{#unless unUseCoupons.empty}}
{{> pager}}
{{^}}
{{#with unUseCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
{{#if usedCoupons}}
{{#unless usedCoupons.empty}}
{{> pager}}
{{^}}
{{#with usedCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
{{#if noValidCoupons}}
{{#unless noValidCoupons.empty}}
{{> pager}}
{{^}}
{{#with noValidCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
</div>
{{> help-us}}
</div>
</div>
... ...
<div class="me-currency-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
{{# content}}
<div class="currencies block">
<h2 class="title"></h2>
<h1 class="my-currency{{#if tip}} has-tip{{/if}}">目前可用YOHO币:<em>{{myCurrency}}</em></h1>
{{# tip}}
<h1 class="currency-tip">{{date}}即将过期:<em>{{count}}</em></h1>
{{/ tip}}
<div class="tab-wrap">
{{> tabs}}
<div class="options-helper">
<select class="filter-select">
{{# options}}
<option{{#if selected}} selected{{/if}} value="{{url}}">{{name}}</option>
{{/ options}}
</select>
<a class="coin-helper" href="{{coinHelperUrl}}">[ 什么是YOHO币?]</a>
</div>
</div>
<p class="currency-header clearfix">
<span class="date">日期</span>
<span class="income-expenditure">收入/支出</span>
<span class="remark">详细说明</span>
</p>
<ul class="currency">
{{# currency}}
<li>
<span class="date">{{date}}</span>
<span class="income-expenditure{{#if isIncome}} income{{/if}}">
{{value}}
</span>
<p class="remark">
{{desc}}
{{#if detailUrl}}
<a href="{{detailUrl}}">查看详情</a>
{{/if}}
</p>
</li>
{{/ currency}}
</ul>
{{#with ../pager}}
{{> common/foot-pager footPager=this}}
{{/with}}
</div>
{{/ content}}
{{> help-us}}
</div>
</div>
... ...
<div class="me-favorite-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
{{# meFavorite}}
<div class="favorite block{{#if favProducts}} fav-products{{/if}}{{#if favBrands}} fav-brands{{/if}}{{#if favArticles}} fav-articles{{/if}}">
<h2 class="title"></h2>
{{> tabs}}
{{> favorite/product}}
{{> favorite/brand}}
{{> favorite/article}}
</div>
{{/meFavorite}}
{{> help-us}}
</div>
{{#if favProducts}}
{{> favorite/price-notice}}
{{/if}}
</div>
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# account}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="account block">
<div class="title">
<h2>
账号安全
<span>SECURITY</span>
</h2>
</div>
<div class="edit-box">
{{#each allAccounts}}
<div class="account-row">
<div class="content">
<div class="left-content">
<span class="icon-{{icon}}"></span>
<span class="account-type">{{type}}</span>
</div>
<div class="middle-content">
<span class="tip {{#red}}red{{/red}}">{{tip}}</span>
</div>
<div class="right-content">
{{#if isValid}}
<span class="center"><a href="{{url}}">修改</a></span>
{{else}}
<span class="center">
<a href="{{url}}" class="button-icon20 button-sliver20 openboxa">
<span>
<i>立即验证</i>
</span>
</a>
</span>
{{/if}}
</div>
</div>
</div>
{{/each}}
<div class="main-info">
<p class="p1">
安全提示服务
</p>
<p>
1. 确认您登录的是YOHO!BUY 有货网址
<span class="blue2">http://www.yohobuy.com</span>
,注意防范进入钓鱼网站,别轻信各种即时通讯发的商品或链接,谨防诈骗。
</p>
<p>2. 建议您安装杀毒软件,并定期更新操作系统等软件补丁,确保帐户及交易安全。</p>
</div>
</div>
</div>
</div>
{{/ account}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# email}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="email block">
{{> validate}}
</div>
</div>
{{/ email}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# mobile}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="mobile block">
{{> validate}}
</div>
</div>
{{/ mobile}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# userpwd}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="userpwd block">
{{> validate}}
</div>
</div>
{{/ userpwd}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# address}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="address block">
<div class="title">
<h2 ></h2>
</div>
<div class="main">
<ul class="address-list">
{{#each addressList}}
<li class="address-content {{#if isPreferred}}preferred{{/if}}" addressId={{id}}>
<div class="address-detail">
<strong>收货人:{{addressee}}</strong>
<br>
收货地址:{{address}}
<br>
联系电话:{{phone}}
<br>
</div>
<div class="address-edit">
<a href="javascript:void(0);" class="address-modify">修改</a>
<a href="javascript:void(0);" class="address-del">删除</a>
<br>
{{#if isPreferred}}
<a href="javascript:void(0);" class="btn-c2 default-btn">
<span>
已设为常用地址
</span>
</a>
{{else}}
<a href="javascript:void(0);" class="btn-c3 set-default-btn">
<span>
设为常用地址
</span>
</a>
{{/if}}
</div>
</li>
{{#if @last}}
<li class="clear"></li>
{{/if}}
{{/each}}
</ul>
<form id="address-form" name="address-form">
<div class="add-address">
<h2>
<span id="form-status">添加新地址</span>
</h2>
<div class="add-address-detail">
{{#each data}}
<div class="form-group">
{{#if isSelect}}
<label>{{labelText}}</label>
{{#each selects}}
<select id="{{key}}" name="{{key}}">
</select>
{{/each}}
{{else}}
<label for="{{key}}">{{labelText}}</label>
<input type="text" name='{{key}}' id="{{key}}" class="input-1 width-150" value="{{value}}">
{{/if}}
<span class="form-prompt form-info" id="{{key}}-tip">
{{tips}}
{{#isSelect}}
<a href="{{tipsUrl}}" class="a-underline" target="_blank">
查看货到付款地区
</a>
{{/isSelect}}
</span>
</div>
{{/each}}
</div>
<div class="dzgl-form-submit">
<input type="hidden" name="addrId" id="addrId" value="">
<input type="button" value="提交信息" class="btn-b1" id="{{submitId}}">
<input type="button" value="重置" class="btn-b1" id="btn-reset" style="display:none">
</div>
</div>
</form>
</div>
</div>
</div>
{{/ address}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="complaint-me-page me-page yoho-page clearfix">
{{# complaints}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="complaint block">
<h2 class="title"></h2>
<div class="me-complaints">
{{#if complaints.empty}}
{{#with complaints}}
{{> empty}}
{{/with}}
{{^}}
<p class="complaints-table-header table-header clearfix">
<span class="info">基本信息</span>
<span class="content">投诉内容</span>
</p>
{{# complaints}}
<div class="complaint-item">
<div class="info">
<p>投诉主题:{{title}}</p>
<p>投诉对象:{{target}}</p>
<p>投诉类型:{{type}}</p>
<p>涉及订单:{{order}}</p>
</div>
<div class="content">
<p class="question">{{question}}</p>
{{#if revoke}}
<p>问题已撤销</p>
{{^}}
{{#if reply}}
<p class="reply">{{reply}}</p>
{{^}}
<p>问题尚未回答。</p>
<p>
<span class="cancel-btn" data-id="{{id}}">撤销投诉</span>
</p>
{{/if}}
{{/if}}
</div>
<div>
{{time}}<br>
{{replyTime}}
</div>
</div>
{{/ complaints}}
{{/if}}
</div>
<div class="complaint-form">
<form action="complaints/addcomplaints" method="post" id="add-complaints">
<h2>我要投诉</h2>
<div class="form-content">
<dl>
<dt>投诉主题:</dt>
<dd>
<input name="title" id="title" type="text">
<span class="option-tip">请输入您的投诉主题</span>
</dd>
</dl>
<dl>
<dt>投诉对象:</dt>
<dd>
<input name="customer" id="customer" type="text">
<span class="option-tip">请填写您要投诉的对象,比如:客服00*号、发货员...</span>
</dd>
</dl>
<dl>
<dt>投诉类型:</dt>
<dd>
<select name="complaintsType" id="complaintsType" size="1">
<option value="0">所有</option>
<option value="1">产品相关</option>
<option value="2">物流相关</option>
</select>
</dd>
</dl>
<dl>
<dt>涉及订单:</dt>
<dd>
<input name="orderCode" id="orderCode" type="text">
<span class="option-tip">如果多个是多个订单号,请用英文逗号隔开,没有则不填</span> </dd>
</dd>
</dl>
<dl>
<dt>投诉内容:</dt>
<dd>
<textarea name="content" id="content"></textarea>
<span class="option-tip">输入您投诉的内容</span>
</dd>
</dl>
</div>
<div class="form-submit">
<input type="button" value="提交投诉内容" id="complaint-submit">
</div>
</form>
</div>
{{#unless complaints.empty}}
{{> pager}}
{{/unless}}
</div>
{{> help-us}}
</div>
{{/ complaints}}
</div>
{{> layout/footer}}
... ...
<div class="me-coupons-page me-page yoho-page clearfix">
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="coupons{{#if unUse}} un-use-coupons{{/if}}{{#if used}} used-coupons{{/if}}{{#if noValid}} no-valid-coupons{{/if}} block">
<h2 class="title">优惠券</h2>
{{> tabs}}
<p class="coupons-header clearfix">
{{#if unUse}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="term-of-validity">有效期</span>
<span class="use-remark">适用说明</span>
<span class="status">状态</span>
{{/if}}
{{#if used}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="order-num">订单编号</span>
<span class="order-sum">订单金额</span>
<span class="payment">实付金额</span>
<span class="use-time">使用时间</span>
{{/if}}
{{#if noValid}}
<span class="coupons-img">优惠券图片</span>
<span class="value">面值</span>
<span class="term-of-validity">有效期</span>
<span class="use-remark">适用说明</span>
{{/if}}
</p>
{{# unUseCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<div class="term-of-validity{{#if endSoon}} end-soon{{/if}}">
{{beginTime}}
-
<br>
{{endTime}}&nbsp;&nbsp;
<br>
<span>即将过期</span>
</div>
<span class="use-remark">{{useRemark}}</span>
<span class="status">{{status}}</span>
</div>
{{/unless}}
{{/ unUseCoupons}}
{{# usedCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<span class="order-num"><a href="{{orderDetailUrl}}">{{orderNum}}</a></span>
<span class="order-sum">{{orderSum}}</span>
<span class="payment">{{payment}}</span>
<span class="use-time">{{useTime}}</span>
</div>
{{/unless}}
{{/ usedCoupons}}
{{# noValidCoupons}}
{{#unless empty}}
<div class="coupon">
<div class="coupons-img">
<img src="{{img}}">
</div>
<span class="value">{{value}}</span>
<div class="term-of-validity{{#if endSoon}} end-soon{{/if}}">
{{beginTime}}
-
<br>
{{endTime}}&nbsp;&nbsp;&nbsp;
</div>
<span class="use-remark">{{useRemark}}</span>
</div>
{{/unless}}
{{/ noValidCoupons}}
{{#if unUseCoupons}}
{{#unless unUseCoupons.empty}}
{{> pager}}
{{^}}
{{#with unUseCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
{{#if usedCoupons}}
{{#unless usedCoupons.empty}}
{{> pager}}
{{^}}
{{#with usedCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
{{#if noValidCoupons}}
{{#unless noValidCoupons.empty}}
{{> pager}}
{{^}}
{{#with noValidCoupons}}
{{> empty}}
{{/with}}
{{/unless}}
{{/if}}
</div>
{{> help-us}}
</div>
</div>
... ...
{{# naGoods}}
<span class="na-pre{{#unless pre}} hidden{{/unless}}" data-url="{{pre}}">
<i class="iconfont">&#xe622;</i>
</span>
<ul class="na-goods clearfix">
{{# goods}}
<li class="na-good">
<a href="{{url}}">
<img class="na-good-thumb" src="{{img}}">
<p class="na-good-name">{{name}}</p>
</a>
<span class="na-price{{#if salePrice}} has-sale{{/if}}">¥{{marketPrice}}</span>
{{#if salePrice}}
<span class="na-price">{{salePrice}}</span>
{{/if}}
</li>
{{/ goods}}
</ul>
<span class="na-next{{#unless next}} hidden{{/unless}}" data-url="{{next}}">
<i class="iconfont">&#xe621;</i>
</span>
{{^}}
<p class="has-no-na">暂无新产品</p>
{{/ naGoods}}
\ No newline at end of file
... ...
{{> layout/header}}
<div class="me-favorite-page me-page yoho-page clearfix">
{{# meFavorite}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="favorite fav-products block">
<h2 class="title"></h2>
{{> tabs}}
<div class="reduction-notice-tip clearfix">
<div class="notice-text">
<h2>什么是降价通知?</h2>
<p>想知道第一时间知道我收藏的商品降价了?那就订阅降价通知吧!</p>
<h2>如何订阅</h2>
<p>收藏商品以后,点击【降价通知】,输入您的手机号码,当这件商品有降价时,我们将第一时间给您发送免费短信通知,最多可订阅5件!</p>
</div>
<div class="notice-img"></div>
</div>
{{#if goods.empty}}
<div class="empty-reduction">
您还没有订阅降价通知,您可以
<a href="{{../reductionUrl}}">返回订阅</a>
</div>
{{^}}
<div class="favorite-products reduction-products">
<p class="favorite-table-header table-header clearfix">
<span class="info">商品信息</span>
<span class="price">单价(元)</span>
<span class="options">操作</span>
</p>
{{> favorite/product-table}}
</div>
{{/if}}
<div class="me-pager">
<input id="me-checkall" class="check-all" type="checkbox">
全选
<span id="cancel-reduction" class="del-checked">取消通知</span>
</div>
</div>
{{> help-us}}
</div>
{{> favorite/price-notice}}
{{/ meFavorite}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# gift}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="gift block">
<div class="title">
<h2>兑换礼品卡</h2>
</div>
{{# resultInfo}}
{{#if success}}
<div class="gift-ok">
<h3 class="success">兑换成功!</h3>
<div class="currency-info">当前您的YOHO币数量:<em class="yoho-currency">{{yohoCoin}}</em><span class="gift-red">个</span></div>
</div>
{{^}}
<div class="gift-fail">
<h3 class="fail">兑换失败!未找到有效的礼品卡信息. 请<a href="/home/gift" class="input-again">重新输入</a></h3>
</div>
{{/if}}
{{^}}
<form id="giftCardForm" name="giftCardForm" method="post">
<ul class="gift-box">
<li>请输入您获得的礼品卡上的12位兑换码获取YOHO币:</li>
<li class="giftCardCode">
<input type="text" value="" name="giftCardCode1" class="gift-input" id="giftCardCode1" maxlength="4"/>
-
<input type="text" value="" name="giftCardCode2" class="gift-input" id="giftCardCode2" maxlength="4"/>
-
<input type="text" value="" name="giftCardCode3" class="gift-input" id="giftCardCode3" maxlength="4"/>
<span class="gift-error"></span>
</li>
<li class="captchaCode">
请输入验证码:
<input type="text" value="" name="verifyCode" id="captchaCode" class="gift-input" />
<img src="" id="imgcode"/>
看不清楚?
<a href="#" class="check-img">换一张</a>
<span class="gift-error"></span>
</li>
<li>
<input type="button" class="btn-b1" id="sub-gift" value="确认兑换"/>
</li>
</ul>
</form>
{{/ resultInfo}}
</div>
</div>
{{/ gift}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="content-message-page me-page yoho-page clearfix">
{{# message}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="message-content block">
<h2 class="title">
<a href="/home/message" class="back-list">返回列表</a>
</h2>
<div class="text-container">
{{# message}}
<div class="text-title">
<h1>{{title}}</h1>
<span>{{sender}} 发送于{{time}}</span>
</div>
<div class="text-content">
{{# text}}
<!-- 文本消息 -->
<p>{{{content}}}</p>
{{/ text}}
{{# coupons}}
<!-- 优惠券消息 -->
<div class="coupon-item">
<div class="coupon-img">
<img src="//static.yohobuy.com/images/v2/activity/default_coupon.jpg">
</div>
<div class="coupon-info">
<p>{{remark}}</p>
{{#if url}}
<p>面值:{{price}}</p>
<p>有效期:{{useTime}}</p>
{{^}}
<p>使用时间:{{useTime}}</p>
<p>领取时间:{{pickTime}}</p>
{{/if}}
</div>
<div class="coupon-action">
{{#if url}}
<a href="{{url}}" class="view-coupon-btn">立即查看</a>
{{^}}
<a{{#if canPick}} class="pick-coupon-btn" data-id="{{id}}"{{/if}}>立即领取</a>
{{/if}}
</div>
</div>
{{/ coupons}}
{{# sale}}
<!-- 促销消息 -->
<div class="sale-img">
<img src="{{image}}">
</div>
<p>{{{content}}}</p>
<a href="{{btnLink}}" class="sale-btn">{{btnName}}</a>
{{/ sale}}
</div>
{{/ message}}
</div>
</div>
{{> help-us}}
</div>
{{/ message}}
</div>
{{> layout/footer}}
... ...
{{# messages}}
{{> message-list}}
{{> pager}}
{{/ messages}}
... ...
{{> layout/header}}
<div class="message-me-page me-page yoho-page clearfix">
{{# message}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="message block">
<h2 class="title"></h2>
<p class="message-table-header table-header clearfix">
<span class="sender">发件人</span>
<span class="heading">标题</span>
<span class="time">发件时间</span>
<span class="action">操作</span>
</p>
<div id="message-main-container">
{{> message-list}}
{{> pager}}
</div>
</div>
{{> help-us}}
</div>
{{/ message}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="order-detail-page me-page yoho-page clearfix">
{{# meOrderDetail}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="order-detail block" data-id="{{orderNum}}">
<h2 class="title"></h2>
<div class="detail-info{{#if virtualGoods}} virtual-detail{{/unless}}">
<div class="status">
<p>
订单编号:
<em>{{orderNum}}</em>
</p>
<p class="cur-status clearfix">
当前状态:{{curStatus}}
{{#if operation.goPay}}
<a class="go-pay oo-btn" href="{{operation.goPay}}">立即付款</a>
{{/if}}
{{#if changeable}}
<span class="edit-order oo-btn">修改订单</span>
{{/if}}
{{#if operation.cancelOrder}}
<span class="cancel-order oo-btn">取消订单</span>
{{/if}}
</p>
{{#if complete}}
<p class="complete-tip">订单已经完成,感谢你在YOHO商城购物,欢迎您对本次交易及所购商品进行评价。</p>
{{/if}}
</div>
{{# progress}}
<div class="order-progress">
<div class="progress-box">
<div class="outter-progress">
<div class="inner-progress" style="width: {{percent}};"></div>
</div>
<ul class="clearfix">
{{#each middleStatus}}
<li class="pg-{{@index}}{{#if cur}} cur{{/if}}">
{{name}}
{{#if date}}
<span class="date">{{date}}</span>
{{/if}}
</li>
{{/each}}
</ul>
</div>
</div>
{{/ progress}}
{{# traceOrder}}
<div class="trace-order">
<p class="sub-title">
<span class="icon"></span>
订单追踪
</p>
<div class="content">
<p>下单时间:{{orderDate}}</p>
{{#if logisticsCompany}}
<p>物流公司:{{logisticsCompany}}</p>
{{/if}}
{{#if courierNumbe}}
<p>快递单号:{{courierNumbe}}</p>
{{/if}}
<table>
<thead>
<th class="handle-time">处理时间</th>
<th class="recive-place">接收地点</th>
<th class="logistics-info">物流信息</th>
</thead>
<tbody>
{{# logistics}}
<tr>
{{#each .}}
<td>
{{.}}
</td>
{{/each}}
</tr>
{{/ logistics}}
</tbody>
</table>
</div>
</div>
{{/ traceOrder}}
{{# orderInfo}}
<div class="order-info">
<p class="sub-title">
<span class="icon"></span>
订单信息
</p>
<div class="content">
<p>收货人:{{receiver}}</p>
<p>收货地址:{{address}}</p>
<p>联系电话:{{phone}}</p>
</div>
</div>
{{/ orderInfo}}
<div class="order-remark">
<p class="sub-title">
<span class="icon"></span>
备注
</p>
<p class="content">
{{remark}}
</p>
</div>
{{# noramlPayMode}}
<div class="pay-mode">
<p class="sub-title">
<span class="icon"></span>
支付及配送方式
</p>
<div class="content">
<p>支付类型:{{payMode}}</p>
{{#if payWay}}
<p>支付方式:{{payWay}}</p>
{{/if}}
<p>送货上门时间:{{deliverTime}}</p>
</div>
</div>
{{/ noramlPayMode}}
{{# virtualPayMode}}
<div class="pay-mode virtual-pay-mode">
<p class="sub-title">
<span class="icon"></span>
付款方式
</p>
<div class="content">
<span>付款方式:{{payMode}}</span>
<span>电话号码:{{phone}}</span>
</div>
</div>
{{/ virtualPayMode}}
<div class="good-list">
<p class="sub-title">
<span class="icon"></span>
商品清单
</p>
<!--订单不同包裹提示-->
{{#if packages}}
<div id="differentOrder" class="differentOrder">
<p class="warn">
温馨提示:您购买的商品<span class="red">分属不同的仓库</span>,需要调拨,将被拆分为多个包裹送达
<span class="why">
</span>
</p>
<div id="differentBag" class="differentBag">
{{#each packages}}
<div class="bag">
<h3>
{{title}}
</h3>
<p class="pre">
</p>
<div class="bagDetil">
<ul>
{{#each goodlist}}
<li>
<a href={{link}}>
<img src={{src}}/>
</a>
{{#if goodsType}}
<p class="{{classname}}" >{{goodsType}}</p>
{{/if}}
</li>
{{/each}}
</ul>
</div>
<p class="next">
</p>
{{#if fee}}
<p>运费:¥{{fee}}元(原价{{orign}}元,优惠{{count}}元)</p>
{{else}}
<p>运费:¥0.00元</p>
{{/if}}
</div>
{{/each}}
</div>
</div>
{{/if}}
<div class="content">
<table>
<thead>
<th class="product-info">商品信息</th>
<th class="good-price">单价(元)</th>
<th class="yoho-coin">
返YOHO币
<a target="_blank" href="{{yohoCoinUrl}}"></a>
</th>
<th class="num">数量</th>
<th class="sum">小计(元)</th>
</thead>
<tbody>
{{# goods}}
<tr>
<td>
<a class="thumb-link" href="{{url}}" target="_blank">
<img class="thumb" src="{{img}}">
{{> order-goods-tags}}
</a>
<p class="name-color-size">
<a class="name" href="{{url}}" target="_blank">{{name}}</a>
{{#if color}}
颜色:{{color}}
{{/if}}
{{#if size}}
尺码:{{size}}
{{/if}}
{{#if date}}
日期:{{date}}
{{/if}}
</p>
</td>
<td>{{price}}</td>
<td>{{coin}}个</td>
<td>{{num}}</td>
<td>{{sum}}</td>
</tr>
{{/ goods}}
</tbody>
</table>
<div class="order-balance">
<p class="back-coin">
<a href="/help/?category_id=87" class="yoho-coin" target="_blank"></a>共返YOHO币:{{totalYoho}}个
</p>
{{#each orderBalance}}
<p>
{{promotion}}:
{{#if @first}}
<em>{{account}}</em>
{{^}}
{{#if @last}}
<em class="payment">{{account}}</em>
{{^}}
{{account}}
{{/if}}
{{/if}}
</p>
{{/each}}
</div>
</div>
</div>
{{# operation}}
<div class="order-operation clearfix">
{{#if paid}}
<p>
<span class="success-icon oo-icon"></span>
订单已支付
</p>
{{/if}}
{{#if goPay}}
<a class="go-pay oo-btn" href="{{goPay}}" target="_blank" >立即付款</a>
{{/if}}
{{#if cancelOrder}}
<span class="cancel-order oo-btn">取消订单</span>
{{/if}}
{{#if shipped}}
<span id="receive-confirm" class="confirm-received oo-btn">确认收货</span>
{{/if}}
{{#if cancel}}
<p>
<span class="cancel-icon oo-icon"></span>
已取消
</p>
{{/if}}
{{#if checkQrCode}}
<a class="check-qrcode oo-btn" href="{{checkQrCode}}" target="_blank">查看二维码</a>
{{/if}}
</div>
{{/ operation}}
</div>
</div>
</div>
{{> order-cancel-tpl}}
{{> order-edit-tpl}}
{{/ meOrderDetail}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="orders-me-page me-page yoho-page clearfix">
{{# meOrders}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="orders block">
<h2 class="title">
VIP金额累计需要订单成功且无退换货
</h2>
{{> tabs}}
{{#if orders}}
{{> order-block}}
{{/if}}
{{!-- 历史订单 --}}
{{#if historyOrders}}
<div class="me-history-orders me-orders">
<p class="order-table-header table-header clearfix">
<span class="info">商品信息</span>
<span class="order-sum">订单金额</span>
<span class="pay-mode">支付方式</span>
</p>
{{#if historyOrders.empty}}
{{#with historyOrders}}
{{> empty}}
{{/with}}
{{^}}
{{# historyOrders}}
<div class="order">
<p class="order-title">
订单编号:{{orderNum}}
<span class="right">下单时间:{{orderTime}}</span>
</p>
<div class="order-wrap">
<ul>
{{# goods}}
<li>
<div class="info clearfix">{{.}}</div>
</li>
{{/ goods}}
</ul>
<div class="order-sum">{{orderSum}}</div>
<div class="pay-mode">{{payMode}}</div>
</div>
</div>
{{/ historyOrders}}
{{/if}}
</div>
{{/if}}
{{> pager}}
</div>
{{> help-us}}
</div>
{{/ meOrders}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="order-ticket-page me-page yoho-page clearfix">
{{# meOrderTicket}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="order-ticket block">
<h2 class="title"></h2>
<div class="ticket-info">
<span class="ticket-tag">虚拟商品</span>
{{name}{{num}}
<span class="order-num">{{orderNum}}</span>
<a class="return-to-orders" href="{{myOrdersUrl}}">返回我的订单</a>
</div>
<ul class="qr-codes clearfix">
{{# tickets}}
<li>
<img class="qr" src="{{img}}">
{{desc}}
</li>
{{/ tickets}}
</ul>
<div class="tickets-tip">
<p>
如何使用二维码?
<br>
1、点击【打印二维码】按钮打印,入场时出示二维码电子票检验入场。
<br>
2、每个二维码只能使用一次,请保管好您的序列号,不要随意泄露给其他人。
</p>
<p>
如何获取二维码?
<br>
1、您可以点击【打印二维码】将票面打印,请在打印时将版面设置成横向打印。
<br>
2、如果您的电脑未连接打印机,请点击【打印二维码】后,将弹出的票面图片截图并保存,然后另行打印。
</p>
<p class="warn">
1、请保持票面干净完整,入场时只需要出示打印票面进行检验即可入场,每个二维码只可使用一次,请您妥善保管
</p>
</div>
</div>
{{> help-us}}
</div>
{{/ meOrderTicket}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="red-envelopes-page me-page yoho-page clearfix">
{{# meRedEnvelopes}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="red-envelopes block">
<h2 class="title">我的红包</h2>
<p class="re-header">
<span>红包金额</span>
<span>有效期</span>
<span>使用说明</span>
</p>
<ul class="red-envelopes-list">
{{#each redEnvelopes}}
<li>
<div class="money">
<span class="re-icon"></span>
¥{{money}}
</div>
<span class="term-of-validity">
{{termOfValidity}}
</span>
<span class="use-remark">
{{{useRemark}}}
</span>
</li>
{{/each}}
</ul>
</div>
{{> help-us}}
</div>
{{/ meRedEnvelopes}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="user-me-page me-page yoho-page clearfix">
{{# user}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="userinfo-edit block">
<h2 class="title"></h2>
<div class="edit-box">
{{> edit/basicinfo}}
{{> edit/contactinfo}}
{{> edit/habbit}}
{{> edit/favorite}}
</div>
</div>
</div>
{{/ user}}
{{> help-us}}
</div>
{{> layout/footer}}
... ...
{{> layout/header}}
<div class="vip-me-page me-page yoho-page clearfix">
{{# myVip}}
{{> path}}
{{> navigation}}
<div class="me-main">
<div class="my-vip block">
<h2 class="title"></h2>
{{#unless commonVip}}
<div class="vip-level">
<span class="level">您的会员级别:</span>
<div class="vipimg{{level}}"></div>
</div>
<div class="vip-level">
<span class="level">当前可享优惠:</span>
<div class="favimg">
{{#each list}}
<div class="list">
<img src="{{imgType}}" class="imgsrc"/>
<div class="fav-font">{{favTxt}}</div>
</div>
{{/each}}
</div>
</div>
{{/unless}}
<div class="vip-level">
<span class="level">年度累计金额:</span>
<div class="year-amount">
<div class="amount">¥{{yearCost}}</div>
<span class="ps">VIP金额累计需要订单成功签收且无退换货</span>
{{#if platinum}}
<div class="plalevel"></div>
{{else}}
<div class="amount-length">
<div class="img-length">
<div class="amount-left">
<div class="img-left" style="width:{{proportion}}"></div>
<div class="img-right"></div>
</div>
<div class="letter">
{{yearCost}}/<span class="sum">{{nextCost}}</span>
</div>
</div>
</div>
<div class="change-img{{level}}"></div>
<div class="balance">
<p>还差¥<span class="balan">{{balan}}</span>元就可以升级为{{vipLevel}}!</p>
<a href="{{morePreferences}}">更多优惠</a>
</div>
{{/if}}
</div>
</div>
<div class="history">
<div class="level">历史消费总额:
<span class="hisamout">¥{{totalCost}}</span>
</div>
</div>
<div class="line"></div>
{{#unless commonVip}}
<div class="valid">
<div class="level">当前有效期:</div>
<div class="valid-time">
<div class="time-line"></div>
<div class="time1">
<div class="time1-img"></div>
</div>
<div class="time2">
<div class="time-top">
<span>{{reach}}</span><br>条件达成日期
</div>
<div class="time2-img"></div>
</div>
<div class="time3">
<div class="time-left">
<span>{{valid}}</span><br>生效日期
</div>
<div class="time-right">
<span>{{end}}</span><br>优惠截止日期
</div>
<div class="time3-img">VIP有效期{{remainDays}}天(数字年)</div>
</div>
<div class="time4">
<div class="time-top">
<a href="{{morePreferences}}">延长有效期></a>
</div>
<div class="time4-img"></div>
</div>
</div>
</div>
<div class="line"></div>
{{/unless}}
<div class="doubt">
</div>
</div>
{{> help-us}}
</div>
{{/ myVip}}
</div>
{{> layout/footer}}
... ...