Authored by OF1706

Merge branch 'master' of http://git.yoho.cn/fe/yohobuy-node into feature/getbannerAction

Showing 100 changed files with 1084 additions and 417 deletions

Too many changes to show.

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

... ... @@ -27,7 +27,7 @@ const favicon = require('serve-favicon');
const _ = require('lodash');
const fp = require('lodash/fp');
const session = require('cookie-session');
const session = require('client-sessions');
const pkg = require('./package.json');
const app = express();
const helpers = global.yoho.helpers;
... ... @@ -68,7 +68,8 @@ app.use(cookieParser());
app.use(compression());
app.use(session({
name: 'yohobuy_session_cookie',
requestKey: 'session',
cookieName: 'yohobuy_session_cookie',
secret: '82dd7e724f2c6870472c89dfa43cf48d',
domain: config.cookieDomain
}));
... ... @@ -77,6 +78,10 @@ app.use((req, res, next) => {
req.user = {}; // 全局的用户数据
req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等
if (!req.session) {
req.session = {};
}
next();
});
... ...
... ... @@ -172,7 +172,7 @@ exports.sendcoupon = (couponId, uid) => {
default:
returnData = {
code: 500,
message: '领券失败!'
message: result.message
};
break;
}
... ...
... ... @@ -45,9 +45,10 @@ const homeNav = [
{name: '我的退/换货', href: '/home/returns'},
{name: '我的咨询', href: '/home/consult'},
{name: '我的评论', href: '/home/comment'},
{name: '我的投诉', href: '/home/complaints'},
/* {name: '我的投诉', href: '/home/complaints'}, */
{name: '我的信息', href: '/home/message', count: 0},
{name: '在线客服', href: 'http://chat8.live800.com/live800/chatClient/chatbox.jsp?companyID=620092&configID=149091&jid=8732423409&info=', isBlank: true}
{name: '在线客服', href: 'http://chat8.live800.com/live800/chatClient/chatbox.jsp?companyID=620092&configID=149091&jid=8732423409', isBlank: true}
]
},
{
... ...
... ... @@ -25,7 +25,7 @@ const index = (req, res, next) => {
});
// 清除 session
req.session = null;
req.session.reset();
service.indexPageDataAsync()
.then(result => {
... ...
... ... @@ -117,7 +117,7 @@ const local = {
domain: config.cookieDomain
});
req.session = null;
req.session.reset();
let bindMobile = _.trim(req.query.bindMobile || '');
let bindArea = '+' + _.trim(req.query.bindArea || '86');
... ... @@ -206,7 +206,7 @@ const local = {
})(req, res, next);
},
logout: (req, res) => {
req.session = null;
req.session.reset();
res.clearCookie('_UID', {
domain: config.cookieDomain
... ...
... ... @@ -35,13 +35,18 @@ const syncUserSession = (uid, req, res, sessionKey) => {
}
return Promise.all([userService.profile(uid), cartService.goodsCount(uid)]).spread((userInfo, count) => {
let token = sign.makeToken(uid);
let salt = uuid.v4().substr(0, 8);
let saltedUid = uid + salt;
let saltedToken = sign.makeToken(saltedUid);
let publicToken = saltedToken + salt;
let data = userInfo.data;
let encryptionUid = aes.encryptionUid(data.uid);
if (data) {
let uidCookie =
`${encodeURIComponent(data.profile_name)}::${encryptionUid}::${data.vip_info.title}::${token}`;
`${encodeURIComponent(data.profile_name)}::${encryptionUid}::${data.vip_info.title}::${saltedToken}`;
let isStudent = data.vip_info.is_student || 0;
res.cookie('_UID', uidCookie, {
... ... @@ -62,11 +67,12 @@ const syncUserSession = (uid, req, res, sessionKey) => {
});
}
req.session.TOKEN_ = token;
req.session.TOKEN_ = publicToken;
req.session.LOGIN_UID_ = uid;
res.cookie('_TOKEN', token, {
domain: config.cookieDomain
res.cookie('_TOKEN', publicToken, {
domain: config.cookieDomain,
httpOnly: true
});
}).catch(console.log);
... ...
... ... @@ -24,7 +24,7 @@ exports.index = (req, res, next) => {
studentsModel.getStudentsData(channel, req).then(result => {
if ('isStudent' in req.user && parseInt(req.user.isStudent, 10) === 1) {
result.realData.verifyRusult = {isStudent: true};
result.realData.identityObj.verifyRusult = {isStudent: true};
}
res.render('students/index', result);
... ...
... ... @@ -276,16 +276,16 @@ const getBrandData = (params, extra, channel) => {
} else {
// 品牌以品牌ID查询商品
queryBase.brand = extra.brandId;
}
// 设置品牌默认排序方式
let order = params.order || 'b_w_desc';
// 设置品牌默认排序方式
searchParams.order = searchParams.order || 'b_w_desc';
}
// 调用接口
let apiMethod = [
headerModel.requestHeaderData(channel),
searchApi.getSortList(queryBase),
searchApi.getProductList(Object.assign(searchParams, {order: order}, queryBase))
searchApi.getProductList(Object.assign(searchParams, queryBase))
];
if (queryBase.brand) {
... ... @@ -908,6 +908,8 @@ const getShopListData = (channel, params, uid) => {
const getBaseShopData = (params, extra, channel, shopId) => {
let resData = {};
params.shopId = shopId;
return Promise.all([
getBrandData(params, extra, channel),
searchApi.getShopDecorator(shopId), // 店铺装修数据
... ... @@ -960,11 +962,6 @@ const getBaseShopData = (params, extra, channel, shopId) => {
searchHandler.handleBrandShopCoupons(result[3].data, {shopId: shopId}));
}
// 临时删除seo信息
_.unset(resData, 'title');
_.unset(resData, 'keywords');
_.unset(resData, 'description');
return resData;
});
};
... ...
... ... @@ -507,7 +507,7 @@ const getShopInfo = (shopId, uid) => {
uid: uid || 0
};
return api.get('', finalParams);
return api.get('', finalParams, config.apiCache);
};
... ... @@ -515,14 +515,14 @@ const getShopInfo = (shopId, uid) => {
* 查询店铺下面的所有品牌
*/
const getShopBrands = (shopId) => {
return api.get('', {method: 'app.shops.getShopsBrands', shop_id: shopId || 0});
return api.get('', {method: 'app.shops.getShopsBrands', shop_id: shopId || 0}, config.apiCache);
};
/**
* 查询店铺装修
*/
const getShopDecorator = (shopId) => {
return api.get('', {method: 'app.shopsdecorator.getList', shop_id: shopId || 0});
return api.get('', {method: 'app.shopsdecorator.getList', shop_id: shopId || 0}, config.apiCache);
};
/**
... ...
... ... @@ -127,6 +127,7 @@ exports.stuVerify = (result, params) => {
if (result.code === 200) {
data.isError = false;
data.isStudent = result.data.isStudent === 1 ? true : false;
data.prompt = result.data.prompt;
} else {
data.isError = true;
data.errorMsg = result.message;
... ...
... ... @@ -74,8 +74,10 @@ exports.getStudentsData = (channel, req) => {
{title: '学生热门单品', href: 'stu-good'},
{title: '更多活动推荐', href: 'stu-activity'}
],
identityItem: {
stuNum: []
identityObj: {
identityItem: {
stuNum: []
}
}
},
... ... @@ -91,7 +93,7 @@ exports.getStudentsData = (channel, req) => {
}
if (result[2].code === 200) {
responseData.realData.identityItem.stuNum = stuHandler.studentsNum(result[2].data);
responseData.realData.identityObj.identityItem.stuNum = stuHandler.studentsNum(result[2].data);
}
if (result[3].code === 200) {
... ...
... ... @@ -69,7 +69,7 @@
<h2 class="floor-title">热门单品</h2>
</a>
<span class="floor-more">
<a target="_blank" href="{{moreProducts}}" id="stu-good-more">MORE ></a>
<a target="_blank" href="{{../moreProducts}}" id="stu-good-more">MORE ></a>
</span>
</div>
<div class="commodity-list clearfix">
... ...
/**
* 登录注册密码加密,uid加密
* @author: wsl<shuiling.wang@yoho.cn>
* @date: 2016/07/07
*/
'use strict';
const crypto = global.yoho.crypto;
/**
* 密码加密
**/
const aesPwd = (pwd) => {
return crypto.encryption('yoho9646yoho9646', pwd);
};
/**
* uid加密
**/
const encryptionUid = (uid) => {
return crypto.encryption('yoho9646abcdefgh', uid + '');
};
module.exports = {
aesPwd,
encryptionUid
};
... ...
/**
* 客服用户端 controller
*
* @author: liqi <qi.li@yoho.cn>
* @date: 2016/11/4
*/
'use strict';
const aes = require('./aes-pwd');
const common = require('../../../config/common');
const clientService = require('../models/client-service');
/**
* 在线客服客户端
*/
const index = (req, res) => {
let type = 2;
let imgSize = '86x120';
let encryptedUid = aes.encryptionUid(req.user.uid);
let data = {
encryptedUid,
layout: false
};
clientService.getClientData(type, encryptedUid, imgSize)
.then(result => {
res.render('client', Object.assign(data, result));
});
};
/**
* 在线客服客户端
*/
const domains = (req, res) => {
// 返回当前环境的配置信息
res.json(common.domains);
};
module.exports = {
index,
domains
};
... ...
/**
* sub app service
* @author: liqi <qi.li@yoho.cn>
* @date: 2016/11/04
*/
var express = require('express'),
path = require('path');
var app = express();
// set view engine
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.use(global.yoho.hbs({
extname: '.hbs',
defaultLayout: 'service',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial')],
views: path.join(__dirname, 'views/action'),
helpers: global.yoho.helpers
}));
// router
app.use(require('./router'));
module.exports = app;
... ...
/**
* 客服用户端 api
*
* @author: liqi <qi.li@yoho.cn>
* @date: 2016/11/4
*/
'use strict';
let config = require('../../../config/common');
let api = new global.yoho.ApiBase(config.domains.imCs, {
name: 'imCs',
cache: global.yoho.cache,
useCache: false
});
// api urls
let urls = {
lastTen: '/api/cs/queryUserLastTenOrdersNgoodsInfo',
msgHistory: '/api/conversationMessage/pageList',
csSetting: '/api/cs/queryByType',
qas: '' // TODO 没有接口功能暂缓
};
/**
* 用户最近10笔订单
* @function getLastTenOrders
* @param { string } encryptedUid 用户ID
* @return { Object } 最近10条订单
*/
const getLastTenOrders = (encryptedUid, imgSize) => {
return api.get(urls.lastTen, {
method: '',
encryptedUid,
imgSize
});
};
/**
* 常见问题
* @function getQas
* @return { Object } 问答列表
*/
const getQas = () => {
return api.get(urls.qas, {
method: ''
});
};
/**
* 客服设置
* @param { number } type
* @return { Object } 客服设置
*/
const getCsSetting = (type) => {
return api.get(urls.csSetting, {
method: '',
type
});
};
/**
* 最近聊天记录
* @function getMsgHistory
* @param { string } encryptedUid 用户id
* @return { Array } 历史聊天记录
*/
const getMsgHistory = (encryptedUid) => {
return api.get(urls.msgHistory, {
encryptedUid,
method: ''
});
};
module.exports = {
getQas,
getCsSetting,
getMsgHistory,
getLastTenOrders
};
... ...
/**
* 客服用户端 service
*
* @author: liqi <qi.li@yoho.cn>
* @date: 2016/11/4
*/
'use strict';
const Promise = require('bluebird');
const clientAPI = require('./client-api');
/**
* 在线客服客服端页面
*/
const getClientData = (type, encryptedUid, imgSize) => {
const logoSize = '136x40';
const qcSize = '135x135';
const advSize = '160x335';
const regExp = /\{width\}x\{height\}/g;
let apiMethod = [
clientAPI.getCsSetting(type),
clientAPI.getMsgHistory(encryptedUid),
clientAPI.getLastTenOrders(encryptedUid, imgSize)
];
return Promise.all(apiMethod)
.then(res => {
let history = res[1].data;
let hasHistory = history.length > 0;
let csSetting = res[0].data.config;
csSetting.windowLogo = csSetting.windowLogo.replace(regExp, logoSize);
csSetting.qrCode = csSetting.qrCode.replace(regExp, qcSize);
csSetting.pcAdImg = csSetting.pcAdImg.replace(regExp, advSize);
return {
csSetting: csSetting,
hasHistory: hasHistory,
orders: res[2].data,
qas: []
};
});
};
module.exports = {
getClientData
};
... ...
/**
* router of sub app service
* @author: liqi <qi.li@yoho.cn>
* @date: 2016/11/04
*/
'use strict';
const router = require('express').Router(); // eslint-disable-line
const auth = require(`${global.middleware}/auth`);
const cRoot = './controllers';
// 在线客服controller
const client = require(`${cRoot}/client`);
// 在线客服
router.get('/client', auth, client.index); // 在线客服
router.get('/domains', auth, client.domains); // 域名配置
module.exports = router;
... ...
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<meta name="keywords" content="{{keywords}}">
<meta name="description" content="{{description}}">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
<meta http-equiv="cleartype" content="on">
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta content="telephone=no" name="format-detection" />
<meta content="email=no" name="format-detection" />
{{#if devEnv}}
<link rel="stylesheet" href="//localhost:5002/css/index.css">
{{^}}
<link rel="stylesheet" href="//cdn.yoho.cn/yohobuy-node/{{version}}/index.css">
{{/if}}
</head>
<body class="client">
<div class="online-user">
<div class="header">
<div class="chat"></div>
<img class="logo" src="{{csSetting.windowLogo}}" alt="客服logo">
<div class="page-desc">{{csSetting.windowTitle}}</div>
<div class="close"></div>
</div>
<div class="main">
<div class="chat-panel">
{{> panel-left}}
{{> panel-main}}
{{> panel-right}}
</div>
</div>
</div>
<!-- 表情弹出层 -->
{{> leave-msg}}
<!--服务评价Modal-->
{{> service-eval}}
<!-- 表情弹出层 -->
{{> emoji}}
<!-- 消息图片放大显示 -->
{{> img-zoom-in}}
<!-- 不支持websocket -->
{{> un-support}}
<!-- websocket连接失败 -->
{{> connect-fail}}
<input name="encryptedUid" type="text" type="hidden" value={{encryptedUid}}>
{{#if devEnv}}
<input name="assetsPrefix" type="text" type="hidden" value="">
<script src="//localhost:5002/libs.js"></script>
<script src="//localhost:5002/{{module}}.{{page}}.js"></script>
{{^}}
<input name="assetsPrefix" type="text" type="hidden" value="//cdn.yoho.cn/yohobuy-node/assets">
<script src="//cdn.yoho.cn/yohobuy-node/{{version}}/libs.js"></script>
<script src="//cdn.yoho.cn/yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>
{{> analysis}}
{{/if}}
</body>
</html>
... ...
<div class="connect-fail">
<div class="back"></div>
<div class="desc">连接失败,请<a class="reconnect">重新连接</a></div>
</div>
... ...
<div class="emoji-component">
<div class="emoji-row">
<span class="emoji emoji-100" data-id="100"></span>
<span class="emoji emoji-101" data-id="101"></span>
<span class="emoji emoji-102" data-id="102"></span>
<span class="emoji emoji-103" data-id="103"></span>
<span class="emoji emoji-104" data-id="104"></span>
<span class="emoji emoji-105" data-id="105"></span>
<span class="emoji emoji-106" data-id="106"></span>
<span class="emoji emoji-107" data-id="107"></span>
<span class="emoji emoji-108" data-id="108"></span>
<span class="emoji emoji-109" data-id="109"></span>
<span class="emoji emoji-110" data-id="110"></span>
<span class="emoji emoji-111" data-id="111"></span>
<span class="emoji emoji-112" data-id="112"></span>
<span class="emoji emoji-113" data-id="113"></span>
<span class="emoji emoji-114" data-id="114"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-115" data-id="115"></span>
<span class="emoji emoji-116" data-id="116"></span>
<span class="emoji emoji-117" data-id="117"></span>
<span class="emoji emoji-118" data-id="118"></span>
<span class="emoji emoji-119" data-id="119"></span>
<span class="emoji emoji-120" data-id="120"></span>
<span class="emoji emoji-121" data-id="121"></span>
<span class="emoji emoji-122" data-id="122"></span>
<span class="emoji emoji-123" data-id="123"></span>
<span class="emoji emoji-124" data-id="124"></span>
<span class="emoji emoji-125" data-id="125"></span>
<span class="emoji emoji-126" data-id="126"></span>
<span class="emoji emoji-127" data-id="127"></span>
<span class="emoji emoji-128" data-id="128"></span>
<span class="emoji emoji-129" data-id="129"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-130" data-id="130"></span>
<span class="emoji emoji-131" data-id="131"></span>
<span class="emoji emoji-132" data-id="132"></span>
<span class="emoji emoji-133" data-id="133"></span>
<span class="emoji emoji-134" data-id="134"></span>
<span class="emoji emoji-135" data-id="135"></span>
<span class="emoji emoji-136" data-id="136"></span>
<span class="emoji emoji-137" data-id="137"></span>
<span class="emoji emoji-138" data-id="138"></span>
<span class="emoji emoji-139" data-id="139"></span>
<span class="emoji emoji-140" data-id="140"></span>
<span class="emoji emoji-141" data-id="141"></span>
<span class="emoji emoji-142" data-id="142"></span>
<span class="emoji emoji-143" data-id="143"></span>
<span class="emoji emoji-144" data-id="144"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-145" data-id="145"></span>
<span class="emoji emoji-146" data-id="146"></span>
<span class="emoji emoji-147" data-id="147"></span>
<span class="emoji emoji-148" data-id="148"></span>
<span class="emoji emoji-149" data-id="149"></span>
<span class="emoji emoji-150" data-id="150"></span>
<span class="emoji emoji-151" data-id="151"></span>
<span class="emoji emoji-152" data-id="152"></span>
<span class="emoji emoji-153" data-id="153"></span>
<span class="emoji emoji-154" data-id="154"></span>
<span class="emoji emoji-155" data-id="155"></span>
<span class="emoji emoji-156" data-id="156"></span>
<span class="emoji emoji-157" data-id="157"></span>
<span class="emoji emoji-158" data-id="158"></span>
<span class="emoji emoji-159" data-id="159"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-160" data-id="160"></span>
<span class="emoji emoji-161" data-id="161"></span>
<span class="emoji emoji-162" data-id="162"></span>
<span class="emoji emoji-163" data-id="163"></span>
<span class="emoji emoji-164" data-id="164"></span>
<span class="emoji emoji-165" data-id="165"></span>
<span class="emoji emoji-166" data-id="166"></span>
<span class="emoji emoji-167" data-id="167"></span>
<span class="emoji emoji-168" data-id="168"></span>
<span class="emoji emoji-169" data-id="169"></span>
<span class="emoji emoji-170" data-id="170"></span>
<span class="emoji emoji-171" data-id="171"></span>
<span class="emoji emoji-172" data-id="172"></span>
<span class="emoji emoji-173" data-id="173"></span>
<span class="emoji emoji-174" data-id="174"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-175" data-id="175"></span>
<span class="emoji emoji-176" data-id="176"></span>
<span class="emoji emoji-177" data-id="177"></span>
<span class="emoji emoji-178" data-id="178"></span>
<span class="emoji emoji-179" data-id="179"></span>
<span class="emoji emoji-180" data-id="180"></span>
<span class="emoji emoji-181" data-id="181"></span>
<span class="emoji emoji-182" data-id="182"></span>
<span class="emoji emoji-183" data-id="183"></span>
<span class="emoji emoji-184" data-id="184"></span>
<span class="emoji emoji-185" data-id="185"></span>
<span class="emoji emoji-186" data-id="186"></span>
<span class="emoji emoji-187" data-id="187"></span>
<span class="emoji emoji-188" data-id="188"></span>
<span class="emoji emoji-189" data-id="189"></span>
</div>
<div class="emoji-row">
<span class="emoji emoji-190" data-id="190"></span>
<span class="emoji emoji-191" data-id="191"></span>
<span class="emoji emoji-192" data-id="192"></span>
<span class="emoji emoji-193" data-id="193"></span>
<span class="emoji emoji-194" data-id="194"></span>
<span class="emoji emoji-195" data-id="195"></span>
<span class="emoji emoji-196" data-id="196"></span>
<span class="emoji emoji-197" data-id="197"></span>
<span class="emoji emoji-198" data-id="198"></span>
<span class="emoji emoji-199" data-id="199"></span>
<span class="emoji emoji-200" data-id="200"></span>
<span class="emoji emoji-201" data-id="201"></span>
<span class="emoji emoji-202" data-id="202"></span>
<span class="emoji emoji-203" data-id="203"></span>
<span class="emoji emoji-204" data-id="204"></span>
</div>
</div>
... ...
<div class="img-zoom-in">
<div class="back"></div>
<img src="" alt="">
</div>
... ...
<div class="modal fade leave-msg" id="leaveMsg" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="cus-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<span class="title">留言</span>
</div>
<div class="cus-body">
<textarea maxlength="120" placeholder="请输入留言信息" spellcheck="false"></textarea>
</div>
<div class="cus-footer">
<button class="btn dark submit">提交</button>
<button class="btn light" data-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
... ...
<div class="order-list">
{{#if orders}}
{{#each orders}}
<div class="item">
<div class="item-head">
<span class="time">{{time}}</span>
<span class="order-no">订单号:<span class="red">{{orderCode}}</span></span>
</div>
{{#each ordersGoodsBoList}}
<div class="item-body">
<a href="/erp2goods?sku={{productSku}}"><img src="{{imgUrl}}" class="prd-img"></a>
<div class="prd-desc">
<a href="/erp2goods?sku={{productSku}}"><p class="prd-nm">{{productName}}</p></a>
<p class="prd-other">
<span class="price">{{lastPrice}}</span>
<span class="quantity">数量:{{buyNumber}}</span>
</p>
</div>
</div>
{{/each}}
<div class="item-footer">
<p class="order-amount">订单金额:¥{{lastOrderAmount}}</p>
<div class="order-other">
<span class="state">订单状态:{{orderStatusDesc}}</span>
<span class="btn send-order" data-no="{{orderCode}}"
data-nm="{{lastOrderAmount}}" data-time="{{time}}"
data-status="{{orderStatusDesc}}">发送订单</span>
</div>
</div>
</div>
{{/each}}
<div class="list-tip">
<span class="tip">已经到底了</span>
</div>
{{else}}
<div class="list-tip">
<span class="tip">暂无订单</span>
</div>
{{/if}}
</div>
... ...
<div class="panel-left">
<div class="qr-code">
<img class="code" src="{{csSetting.qrCode}}">
<div class="scan">
<span class="icon"></span>
<span class="tip">扫描二维码<br>现在手机客户端</span>
</div>
</div>
<a href="{{csSetting.pcAdLink}}" target="_blank">
<img src="{{csSetting.pcAdImg}}" class="adv">
</a>
</div>
... ...
<div class="panel-main">
<div class="main-body">
<div class="msg-list">
{{#if hasHistory}}
<div class="list-item">
<span class="about-his has-his">最近聊天记录</span>
</div>
{{else}}
<div class="list-item">
<span class="about-his no-his">近一周没有历史消息</span>
</div>
{{/if}}
</div>
</div>
<div class="main-footer">
<div class="progress-bar"></div>
<div class="upload-tip"></div>
<div class="msg-edit">
<div class="edit-left">
<div class="util">
<span class="icon emoji">表情</span>
<span class="icon">图片<label for="sendImg"></label></span>
<span class="icon evaluate">评价</span>
<span class="icon manual-service">人工客服</span>
</div>
<textarea class="text msg-area" placeholder="请描述您遇到的问题" spellcheck="false" maxlength="500"></textarea>
</div>
<span class="send">发送</span>
<input id="sendImg" type="file" name="files[]" accept="image/bmp,image/jpg,image/png">
</div>
</div>
</div>
... ...
<div class="panel-right">
<div class="right-head">
{{#if csSetting.showQA}}
<span class="tab order active">订单信息</span>
<span class="tab qa">常见问题</span>
{{else}}
<span class="tab order only-one active">订单信息</span>
{{/if}}
</div>
<div class="right-body order order-use">
<div class="tab-content">
<div class="recent">
<span class="max">最近10笔订单</span>
<a class="more" href="/home/orders" target="_blank">MORE</a>
</div>
{{> order-list}}
</div>
</div>
<div class="right-body qa qa-use">
<div class="tab-content">
{{> qa-list}}
</div>
</div>
<div class="right-footer qa qa-use">
<p class="more-q">没找到想问的问题?点此查看<a class="red" href="/help" target="_blank">更多问题~</a></p>
<div class="chat-icon"></div>
</div>
</div>
... ...
<div class="qa-list">
{{#if qas}}
{{#each qas}}
<div class="item">
<div class="q">{{question}}</div>
<div class="a">{{answer}}</div>
</div>
{{/each}}
{{else}}
<div class="list-tip">
<span class="tip">暂无问题</span>
</div>
{{/if}}
</div>
... ...
<div class="modal fade make-eval" id="makeEvaluation" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="cus-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<span class="title">请对此次服务进行评价</span>
</div>
<div class="cus-body">
<div class="stars">
<span class="star positive"></span>
<span class="star positive"></span>
<span class="star positive"></span>
<span class="star positive"></span>
<span class="star positive"></span>
<p class="star-text">非常满意</p>
</div>
<div class="detail-reason">
<div class="discontent"></div>
<textarea class="other-reason" maxlength="50" placeholder="请您输入不满意的其他原因" spellcheck="false"></textarea>
</div>
</div>
<div class="cus-footer">
<button class="btn dark submit">提交</button>
<input type="hidden" name="promoter" value="1">
</div>
</div>
</div>
</div>
... ...
<div class="un-support">
<div class="back"></div>
<div class="tip">为了保证您使用客服系统的体验,建议您使用其他浏览器(谷歌chrome、IE10以上、火狐等)访问本客服页面。</div>
</div>
... ...
... ... @@ -17,16 +17,20 @@ module.exports = {
cookieDomain: '.yohobuy.com',
domains: {
favApi: 'http://192.168.102.31:8092/brower',
//api: 'http://api-test3.yohops.com:9999/',
//service: 'http://service-test3.yohops.com:9999/',
// api: 'http://api-test3.yohops.com:9999/',
// service: 'http://service-test3.yohops.com:9999/',
//
api: 'http://api.yoho.cn/',
service: 'http://service.yoho.cn/',
api: 'http://api.yoho.cn/',
service: 'http://service.yoho.cn/',
//api: 'http://dev-api.yohops.com:9999/',
// api: 'http://dev-api.yohops.com:9999/',
// service: 'http://dev-service.yohops.com:9999/',
search: 'http://192.168.102.216:8080/yohosearch/'
search: 'http://192.168.102.216:8080/yohosearch/',
imSocket: 'ws://socket.yohobuy.com:10240',
imCs: 'http://im.yohobuy.com/api',
imServer: 'http://im.yohobuy.com/server'
},
subDomains: {
host: '.yohobuy.com',
... ... @@ -115,7 +119,10 @@ if (isProduction) {
domains: {
api: 'http://api.yoho.yohoops.org/',
service: 'http://service.yoho.yohoops.org/',
search: 'http://search.yohoops.org/yohosearch/'
search: 'http://search.yohoops.org/yohosearch/',
imSocket: 'ws://imsocket.yohobuy.com:10000',
imCs: 'https://imhttp.yohobuy.com/api',
imServer: 'https://imhttp.yohobuy.com/server'
},
memcache: {
master: ['memcache1.yohoops.org:12111', 'memcache2.yohoops.org:12111', 'memcache3.yohoops.org:12111'],
... ... @@ -133,7 +140,7 @@ if (isProduction) {
open: false,
url: 'http://123.206.2.55/strategy'
},
zookeeperServer: 'zookeeper.web.yohoops.org:2181'
zookeeperServer: 'web.zookeeper.yohoops.org:2181'
});
} else if (isTest) {
Object.assign(module.exports, {
... ... @@ -142,7 +149,10 @@ if (isProduction) {
favApi: 'http://192.168.102.31:8092/brower',
api: process.env.TEST_API || 'http://testapi.yoho.cn:28078/',
service: process.env.TEST_SERVICE || 'http://testservice.yoho.cn:28077/',
search: process.env.TEST_SEARCH || 'http://192.168.102.216:8080/yohosearch/'
search: process.env.TEST_SEARCH || 'http://192.168.102.216:8080/yohosearch/',
imSocket: 'ws://socket.yohobuy.com:10240',
imCs: 'http://im.yohobuy.com/api',
imServer: 'http://im.yohobuy.com/server'
},
useOneapm: true,
useCache: true,
... ...
... ... @@ -21,4 +21,5 @@ module.exports = app => {
// 第三方,如广告联盟
app.use('/3party', require('./apps/3party'));
app.use('/service', require('./apps/service'));// 客服
};
... ...
... ... @@ -5,8 +5,20 @@
const headerModel = require('../models/header');
const logger = global.yoho.logger;
const forceNoCache = (res) => {
if (res) {
res.set({
'Cache-Control': 'no-cache',
Pragma: 'no-cache',
Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
});
}
};
exports.notFound = () => {
return (req, res, next) => {
forceNoCache(res);
if (req.xhr) {
return res.status(404).json({
code: 404,
... ... @@ -32,6 +44,8 @@ exports.notFound = () => {
*/
exports.serverError = () => {
return (err, req, res, next) => {
forceNoCache(res);
logger.error(`error at path: ${req.url}`);
logger.error(err);
if (!res.headersSent) {
... ...
... ... @@ -26,9 +26,7 @@
{{/if}}
</head>
<body>
{{#if mobileRefer}}
<input type="hidden" id="m-refer" value="{{mobileRefer}}">
{{/if}}
{{> mobile-refer}}
{{> header}}
{{> common/simple-header}}
... ...
<div class="yoho-footer">
{{#if footerTop}}
<div class="footertop">
<div class="index-foot">
<dl class="center-content clearfix">
<dd>
<div class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>有货SERVICES</span>
</div>
</div>
<div id="foot-services">
<ul class="two-dim clearfix">
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-app.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-app.png">
{{/if}}
<p>YOHO!BUY有货</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weixin.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weixin.png">
{{/if}}
<p>微信</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weibo.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weibo.png">
{{/if}}
<p>微博</p>
</li>
</ul>
</div>
</div>
<p class="item-nav center">
<span class="iconfont cur" key="0">&#xe606;</span>
</p>
</dd>
<dd>
<div id="feed-back-box-list" class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>意见反馈</span>
</div>
</div>
<ul class="vote clearfix">
<li key="0">
<form class="feed-back-form" action="#">
<div>您喜欢有货的新版吗?</div>
<div class="vote-item clearfix">
<p>
<input type="radio" name="solution" value="33">非常喜欢
</p>
<p>
<input type="radio" name="solution" value="34">喜欢
</p>
<p>
<input type="radio" name="solution" value="35">一般般
</p>
<p>
<input type="radio" name="solution" value="36">不喜欢
</p>
<p>
<input type="radio" name="solution" value="37">非常不喜欢
</p>
</div>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" name="question_id" value="38">
<input class="feedback-id" type="hidden" name="feedback_id" value="5">
</form>
</li>
<li class="hide" key="1">
<form class="feed-back-form" action="#">
<div>您可以方便的找到想查看的内容吗?</div>
<div class="vote-item clearfix">
<p>
<input type="radio" name="solution" value="38">非常方便
</p>
<p>
<input type="radio" name="solution" value="39">方便
</p>
<p>
<input type="radio" name="solution" value="40">一般般
</p>
<p>
<input type="radio" name="solution" value="41">不方便
</p>
<p>
<input type="radio" name="solution" value="42">非常不方便
</p>
</div>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" value="39">
<input class="feedback-id" type="hidden" value="5">
</form>
</li>
<li class="hide" key="2">
<form class="feed-back-form" action="#">
<div>您对新版还有哪些意见或建议?</div>
<textarea name="answer" id="feedback-answer" class="feedback-answer"></textarea>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" value="37">
<input class="feedback-id" type="hidden" value="5">
</form>
</li>
</ul>
</div>
<p id="feed-back-page" class="item-nav center">
<span class="iconfont cur">&#xe606;</span>
<span class="iconfont ">&#xe606;</span>
<span class="iconfont ">&#xe606;</span>
</p>
</dd>
<dd class="last">
<div class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>更多 YOHO!产品</span>
</div>
</div>
<div id="foot-mobile">
<ul class="mobile clearfix">
<li>
<a href="http://www.yoho.cn/product#yoho" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/yoho.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/yoho.png">
{{/if}}
</a>
</li>
<li>
<a href="http://www.yohomars.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/mars.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/mars.png">
{{/if}}
</a>
</li>
<li>
<a href="http://app.yohoshow.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/show.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/show.png">
{{/if}}
</a>
</li>
</ul>
</div>
</div>
<p class="item-nav center">
<span class="iconfont cur">&#xe606;</span>
</p>
</dd>
</dl>
</div>
</div>
{{/if}}
<div class="footerbottom">
<div class="promise">
<div class="center-content clearfix">
<div class="left">
<span class="iconfont rgbf">&#xe604;</span>
<span class="red">100%</span>
<span class="rgbf">品牌正品</span>
</div>
<div class="left">
<span class="iconfont rgbf">&#xe603;</span>
<span class="red">7天</span>
<span class="rgbf">无理由退换货</span>
</div>
<div class="left">
<span class="iconfont rgbf">&#xe602;</span>
<a href="http://chat8.live800.com/live800/chatClient/chatbox.jsp?companyID=620092&amp;configID=149091&amp;jid=8732423409" target="_blank">
<span class="red">便捷</span>
<span class="rgbf">在线客服</span>
</a>
</div>
<div class="right subscribe footer-right">
<input id="subscriber-box" class="rgb6 top" name="subscriberBox"value="订阅我们的邮件">
<a id="subscriber-btn" href="javascript:void(0);" class="iconfont rgbf">&#xe601;</a>
</div>
</div>
</div>
<div class="footer-help">
<div class="center-content clearfix">
<div class="left">
<ul class="clearfix">
<li class="left">
<p>
<span>新手指南</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=81#help_b00reg" target="_blank">注册登录</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=83" target="_blank">选购商品</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=103" target="_blank">订单支付</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=85" target="_blank">收货退款</a>
</p>
</li>
<li class="left">
<p>
<span>会员中心</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=87" target="_blank">有货币</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=91" target="_blank">会员制度</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=89" target="_blank">账户管理</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=93" target="_blank">密码管理</a>
</p>
</li>
<li class="left">
<p>
<span>购物指南</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=95" target="_blank">全球购专区</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=97" target="_blank">尺码选择</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=99" target="_blank">发票</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=101" target="_blank">商品咨询</a>
</p>
</li>
<li class="left">
<p>
<span>支付方式</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=105" target="_blank">在线支付</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=107" target="_blank">货到付款</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=109" target="_blank">优惠券</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=111" target="_blank">有货币支付</a>
</p>
</li>
<li class="left">
<p>
<span>配送方式</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=113" target="_blank">配送时间</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=115" target="_blank">配送范围</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=119" target="_blank">顺丰速运</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=117" target="_blank">商品验收与签收</a>
</p>
</li>
<li class="left">
<p>
<span>售后服务</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=121" target="_blank">退换货政策</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=123" target="_blank">退换货流程</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=125" target="_blank">退款方式与时效</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=127" target="_blank">投诉与建议</a>
</p>
</li>
<li class="left">
<p>
<span>APP常见问题</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=133" target="_blank">IPhone版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=135" target="_blank">Android版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=137" target="_blank">wap版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=139" target="_blank">IPAD版</a>
</p>
</li>
</ul>
</div>
</div>
</div>
<div class="footer-link">
<div class="center-content clearfix">
<div class="left right-flag">
<a class='govicon' href="http://odr.jsdsgsxt.gov.cn:8081/mbm/entweb/elec/certView?siteId=f2b6e3b8d18241afb8dd6cadf7f15406" target="_blank" rel="nofollow">
<div class="govimg"></div>
</a>
<a href="https://ss.knet.cn/verifyseal.dll?sn=e14021832010046477dka7000000&amp;ct=df&amp;a=1&amp;pa=0.5902942178957805" target="_blank" rel="nofollow">
<img src="//static.yohobuy.com/images/v3/icon/credit-flag3.png">
</a>
<a href="http://www.isc.org.cn/" target="_blank" rel="nofollow">
<img src="//static.yohobuy.com/images/v3/icon/isc2.png">
</a>
</div>
<div class="left about-us">
<p>
<a href="//www.yohobuy.com">返回首页</a>
<span>|</span>
<a href="//www.yohobuy.com">YOHO!BUY 有货</a>
<span>|</span>
<a href="//www.yohobuy.com/newpower.html">新力传媒</a>
<span>|</span>
<a href="//www.yohobuy.com/contact.html">联系我们</a>
<span>|</span>
<a href="//shop.yohobuy.com/settled">商家入驻</a>
<span>|</span>
<a href="//www.yohobuy.com/privacy.html">隐私条款</a>
<span>|</span>
<a href="//www.yohobuy.com/link.html">友情链接</a>
</p>
<p>
CopyRight © 2007-2016 南京新与力文化传播有限公司
<a class="rbg6" href="http://www.miibeian.gov.cn/" target="_blank">苏ICP备09011225号</a>
NewPower Co. 版权所有 经营许可证编号:苏B2-20120395
</p>
</div>
</div>
</div>
</div>
<div class="return-top hide">
<span class="iconfont">&#xe607;</span>
</div>
</div>
<div class="yoho-footer">
{{#if footerTop}}
<div class="footertop">
<div class="index-foot">
<dl class="center-content clearfix">
<dd>
<div class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>有货SERVICES</span>
</div>
</div>
<div id="foot-services">
<ul class="two-dim clearfix">
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-app.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-app.png">
{{/if}}
<p>YOHO!BUY有货</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weixin.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weixin.png">
{{/if}}
<p>微信</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weibo.png">
{{^}}
<img class="dim-img lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weibo.png">
{{/if}}
<p>微博</p>
</li>
</ul>
</div>
</div>
<p class="item-nav center">
<span class="iconfont cur" key="0">&#xe606;</span>
</p>
</dd>
<dd>
<div id="feed-back-box-list" class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>意见反馈</span>
</div>
</div>
<ul class="vote clearfix">
<li key="0">
<form class="feed-back-form" action="#">
<div>您喜欢有货的新版吗?</div>
<div class="vote-item clearfix">
<p>
<input type="radio" name="solution" value="33">非常喜欢
</p>
<p>
<input type="radio" name="solution" value="34">喜欢
</p>
<p>
<input type="radio" name="solution" value="35">一般般
</p>
<p>
<input type="radio" name="solution" value="36">不喜欢
</p>
<p>
<input type="radio" name="solution" value="37">非常不喜欢
</p>
</div>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" name="question_id" value="38">
<input class="feedback-id" type="hidden" name="feedback_id" value="5">
</form>
</li>
<li class="hide" key="1">
<form class="feed-back-form" action="#">
<div>您可以方便的找到想查看的内容吗?</div>
<div class="vote-item clearfix">
<p>
<input type="radio" name="solution" value="38">非常方便
</p>
<p>
<input type="radio" name="solution" value="39">方便
</p>
<p>
<input type="radio" name="solution" value="40">一般般
</p>
<p>
<input type="radio" name="solution" value="41">不方便
</p>
<p>
<input type="radio" name="solution" value="42">非常不方便
</p>
</div>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" value="39">
<input class="feedback-id" type="hidden" value="5">
</form>
</li>
<li class="hide" key="2">
<form class="feed-back-form" action="#">
<div>您对新版还有哪些意见或建议?</div>
<textarea name="answer" id="feedback-answer" class="feedback-answer"></textarea>
<div>
<span class="feed-back-btn button">提交</span>
</div>
<input class="question-id" type="hidden" value="37">
<input class="feedback-id" type="hidden" value="5">
</form>
</li>
</ul>
</div>
<p id="feed-back-page" class="item-nav center">
<span class="iconfont cur">&#xe606;</span>
<span class="iconfont ">&#xe606;</span>
<span class="iconfont ">&#xe606;</span>
</p>
</dd>
<dd class="last">
<div class="foot-panel">
<div class="title">
<div class="title-line"></div>
<div class="text">
<span>更多 YOHO!产品</span>
</div>
</div>
<div id="foot-mobile">
<ul class="mobile clearfix">
<li>
<a href="http://www.yoho.cn/product#yoho" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/yoho.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/yoho.png">
{{/if}}
</a>
</li>
<li>
<a href="http://www.yohomars.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/mars.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/mars.png">
{{/if}}
</a>
</li>
<li>
<a href="http://app.yohoshow.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:5002/img/layout/show.png">
{{^}}
<img class="lazy" data-original="//cdn.yoho.cn/yohobuy-node/assets/img/layout/show.png">
{{/if}}
</a>
</li>
</ul>
</div>
</div>
<p class="item-nav center">
<span class="iconfont cur">&#xe606;</span>
</p>
</dd>
</dl>
</div>
</div>
{{/if}}
<div class="footerbottom">
<div class="promise">
<div class="center-content clearfix">
<div class="left">
<span class="iconfont rgbf">&#xe604;</span>
<span class="red">100%</span>
<span class="rgbf">品牌正品</span>
</div>
<div class="left">
<span class="iconfont rgbf">&#xe603;</span>
<span class="red">7天</span>
<span class="rgbf">无理由退换货</span>
</div>
<div class="left">
<span class="iconfont rgbf">&#xe602;</span>
<a href="http://chat8.live800.com/live800/chatClient/chatbox.jsp?companyID=620092&amp;configID=149091&amp;jid=8732423409" target="_blank">
<span class="red">便捷</span>
<span class="rgbf">在线客服</span>
</a>
</div>
<div class="right subscribe footer-right">
<input id="subscriber-box" class="rgb6 top" name="subscriberBox"value="订阅我们的邮件">
<a id="subscriber-btn" href="javascript:void(0);" class="iconfont rgbf">&#xe601;</a>
</div>
</div>
</div>
<div class="footer-help">
<div class="center-content clearfix">
<div class="left">
<ul class="clearfix">
<li class="left">
<p>
<span>新手指南</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=81#help_b00reg" target="_blank">注册登录</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=83" target="_blank">选购商品</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=103" target="_blank">订单支付</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=85" target="_blank">收货退款</a>
</p>
</li>
<li class="left">
<p>
<span>会员中心</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=87" target="_blank">有货币</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=91" target="_blank">会员制度</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=89" target="_blank">账户管理</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=93" target="_blank">密码管理</a>
</p>
</li>
<li class="left">
<p>
<span>购物指南</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=95" target="_blank">全球购专区</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=97" target="_blank">尺码选择</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=99" target="_blank">发票</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=101" target="_blank">商品咨询</a>
</p>
</li>
<li class="left">
<p>
<span>支付方式</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=105" target="_blank">在线支付</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=107" target="_blank">货到付款</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=109" target="_blank">优惠券</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=111" target="_blank">有货币支付</a>
</p>
</li>
<li class="left">
<p>
<span>配送方式</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=113" target="_blank">配送时间</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=115" target="_blank">配送范围</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=119" target="_blank">顺丰速运</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=117" target="_blank">商品验收与签收</a>
</p>
</li>
<li class="left">
<p>
<span>售后服务</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=121" target="_blank">退换货政策</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=123" target="_blank">退换货流程</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=125" target="_blank">退款方式与时效</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=127" target="_blank">投诉与建议</a>
</p>
</li>
<li class="left">
<p>
<span>APP常见问题</span>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=133" target="_blank">IPhone版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=135" target="_blank">Android版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=137" target="_blank">wap版</a>
</p>
<p>
<a href="//www.yohobuy.com/help/?category_id=139" target="_blank">IPAD版</a>
</p>
</li>
</ul>
</div>
</div>
</div>
<div class="footer-link">
<div class="center-content clearfix">
<div class="left right-flag">
<a class='govicon' href="http://odr.jsdsgsxt.gov.cn:8081/mbm/entweb/elec/certView?siteId=f2b6e3b8d18241afb8dd6cadf7f15406" target="_blank" rel="nofollow">
<div class="govimg"></div>
</a>
<a href="https://ss.knet.cn/verifyseal.dll?sn=e14021832010046477dka7000000&amp;ct=df&amp;a=1&amp;pa=0.5902942178957805" target="_blank" rel="nofollow">
<img src="//static.yohobuy.com/images/v3/icon/credit-flag3.png">
</a>
<a href="http://www.isc.org.cn/" target="_blank" rel="nofollow">
<img src="//static.yohobuy.com/images/v3/icon/isc2.png">
</a>
</div>
<div class="left about-us">
<p>
<a href="//www.yohobuy.com">返回首页</a>
<span>|</span>
<a href="//www.yohobuy.com">YOHO!BUY 有货</a>
<span>|</span>
<a href="//www.yohobuy.com/newpower.html">新力传媒</a>
<span>|</span>
<a href="//www.yohobuy.com/contact.html">联系我们</a>
<span>|</span>
<a href="//shop.yohobuy.com/settled">商家入驻</a>
<span>|</span>
<a href="//www.yohobuy.com/privacy.html">隐私条款</a>
<span>|</span>
<a href="//www.yohobuy.com/link.html">友情链接</a>
</p>
<p>
CopyRight © 2007-2016 南京新与力文化传播有限公司
<a class="rbg6" href="http://www.miibeian.gov.cn/" target="_blank">苏ICP备09011225号</a>
NewPower Co. 版权所有 经营许可证编号:苏B2-20120395
</p>
</div>
</div>
</div>
</div>
<div class="return-top hide">
<span class="iconfont">&#xe607;</span>
</div>
</div>
... ...
{{#if mobileRefer}}
<input type="hidden" id="m-refer" value="{{mobileRefer}}">
<script type="text/javascript">var u=document.getElementById("m-refer").value;if(u&&window.navigator.userAgent.match(/(nokia|iphone|android|ipad|motorola|^mot\-|softbank|foma|docomo|kddi|up\.browser|up\.link|htc|dopod|blazer|netfront|helio|hosin|huawei|novarra|CoolPad|webos|techfaith|palmsource|blackberry|alcatel|amoi|ktouch|nexian|samsung|^sam\-|s[cg]h|^lge|ericsson|philips|sagem|wellcom|bunjalloo|maui|symbian|smartphone|midp|wap|phone|windows ce|iemobile|^spice|^bird|^zte\-|longcos|pantech|gionee|^sie\-|portalmmm|jig\s browser|hiptop|^ucweb|^benq|haier|^lct|opera\s*mobi|opera\*mini|320x320|240x320|176x220)/i)){window.location=u};</script>
{{/if}}
\ No newline at end of file
... ...
{
"name": "yohobuy-node",
"version": "5.2.4",
"version": "5.2.13",
"private": true,
"description": "A New Yohobuy Project With Express",
"repository": {
... ... @@ -32,9 +32,11 @@
"license": "MIT",
"dependencies": {
"bluebird": "^3.4.0",
"blueimp-file-upload": "^9.14.0",
"body-parser": "^1.15.0",
"captchapng": "0.0.1",
"cheerio": "^0.22.0",
"client-sessions": "^0.7.0",
"compression": "^1.6.2",
"connect-multiparty": "^2.0.0",
"cookie-parser": "^1.4.3",
... ... @@ -54,9 +56,10 @@
"passport-strategy": "1.x.x",
"passport-weixin": "^0.1.0",
"request-ip": "^1.2.2",
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.0",
"uuid": "^2.0.2",
"yoho-node-lib": "0.1.30",
"yoho-node-lib": "0.2.2",
"yoho-zookeeper": "^1.0.4"
},
"devDependencies": {
... ... @@ -64,6 +67,7 @@
"ava": "^0.15.2",
"babel-preset-es2015": "^6.9.0",
"babel-register": "^6.9.0",
"bootstrap": "^3.3.7",
"cross-env": "^1.0.8",
"eslint": "^2.12.0",
"eslint-config-yoho": "^1.0.1",
... ... @@ -75,6 +79,7 @@
"gulp-util": "^3.0.7",
"handlebars-loader": "^1.4.0",
"husky": "^0.11.4",
"jquery-ui": "^1.12.1",
"nodemon": "1.9.2",
"nyc": "^6.6.1",
"postcss-assets": "^4.0.1",
... ...