Authored by 陈轩

Merge branch 'master' into translate/cart

@@ -5,6 +5,10 @@ @@ -5,6 +5,10 @@
5 */ 5 */
6 'use strict'; 6 'use strict';
7 7
  8 +if (process.env.USE_APM === '1' && process.env.NODE_ENV === 'production') {
  9 + require('oneapm');
  10 +}
  11 +
8 const config = require('./config/common'); 12 const config = require('./config/common');
9 13
10 global.Promise = require('bluebird'); 14 global.Promise = require('bluebird');
  1 +/**
  2 + * Created by yoho on 2016/11/8.
  3 + */
  4 +'use strict';
  5 +const helpers = global.yoho.helpers;
  6 +const crypto = global.yoho.crypto;
  7 +
  8 +exports.index = (req, res) => {
  9 + let quhUnion = crypto.encryption('', decodeURI(req.query._QYH_UNION));
  10 +
  11 + res.cookie('_QYH_UNION', quhUnion, {
  12 + domain: 'yohobuy.com',
  13 + expires: new Date(Date.now() + 24 * 60 * 60 * 1000)
  14 + });
  15 +
  16 + return res.redirect(req.query.target || helpers.urlFormat('/'));
  17 +};
  1 +/**
  2 + * sub app coupon
  3 + * @author: lixia.zhang<lixia.zhang@yoho.cn>
  4 + * @date: 2016/05/31
  5 + */
  6 +
  7 +var express = require('express'),
  8 + path = require('path'),
  9 + helpers = require(path.join(global.utils, 'helpers'));
  10 +
  11 +var app = express();
  12 +
  13 +// set view engin
  14 +var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
  15 +
  16 +app.on('mount', function(parent) {
  17 + delete parent.locals.settings; // 不继承父 App 的设置
  18 + Object.assign(app.locals, parent.locals);
  19 +});
  20 +app.use(global.yoho.hbs({
  21 + extname: '.hbs',
  22 + defaultLayout: 'layout',
  23 + layoutsDir: doraemon,
  24 + partialsDir: path.join(__dirname, 'views/partial'),
  25 + views: path.join(__dirname, 'views/action'),
  26 + helpers: Object.assign({}, global.yoho.helpers, helpers)
  27 +}));
  28 +
  29 +// router
  30 +app.use(require('./router'));
  31 +
  32 +module.exports = app;
  1 +/**
  2 + * router of sub app coupon
  3 + * @author: lixia.zhang<lixia.zhang@yoho.cn>
  4 + * @date: 2016/05/31
  5 + */
  6 +
  7 +'use strict';
  8 +
  9 +const router = require('express').Router(); // eslint-disable-line
  10 +const cRoot = './controllers';
  11 +const ads = require(`${cRoot}/ads`);
  12 +
  13 +// routers
  14 +
  15 +router.get('/ads', ads.index);
  16 +
  17 +module.exports = router;
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 'use strict'; 7 'use strict';
8 8
9 const indexModel = require('../models/market'); 9 const indexModel = require('../models/market');
  10 +const _ = require('lodash');
10 11
11 exports.index = (req, res, next) => { 12 exports.index = (req, res, next) => {
12 13
@@ -21,3 +22,26 @@ exports.index = (req, res, next) => { @@ -21,3 +22,26 @@ exports.index = (req, res, next) => {
21 }).catch(next); 22 }).catch(next);
22 23
23 }; 24 };
  25 +
  26 +/**
  27 + * 市场推广活动升级版,自定义下载渠道
  28 + * @param req
  29 + * @param res
  30 + * @param next
  31 + */
  32 +exports.v2 = (req, res, next) => {
  33 +
  34 + indexModel.index({
  35 +
  36 + }).then((result) => {
  37 + if (_.has(result, 'download[0].url') && req.query.union_type) {
  38 + result.download[0].url = result.download[0].url.split('?')[0] +
  39 + '?union_type=' + req.query.union_type;
  40 + }
  41 + res.render('market/market', Object.assign(result, {
  42 + title: 'Yoho!Buy 有货'
  43 + }));
  44 +
  45 + }).catch(next);
  46 +
  47 +};
@@ -71,6 +71,7 @@ router.get('/invite', invite.checkType, invite.index); @@ -71,6 +71,7 @@ router.get('/invite', invite.checkType, invite.index);
71 router.get('/invite/index', invite.checkType, invite.index); 71 router.get('/invite/index', invite.checkType, invite.index);
72 72
73 router.get('/market', market.index); // 市场推广活动 73 router.get('/market', market.index); // 市场推广活动
  74 +router.get('/market/v2', market.v2); // 市场推广活动升级版,自定义下载渠道
74 75
75 router.get(/\/invite\/share_([\d]+)_([\d]+)_([\d]+).html/, invite.checkType, invite.share); 76 router.get(/\/invite\/share_([\d]+)_([\d]+)_([\d]+).html/, invite.checkType, invite.share);
76 77
@@ -60,13 +60,14 @@ exports.ensure = (req, res, next) => { @@ -60,13 +60,14 @@ exports.ensure = (req, res, next) => {
60 let view; 60 let view;
61 61
62 if (paymentInfo.code !== 200) { 62 if (paymentInfo.code !== 200) {
63 - if (paymentInfo.message) {  
64 - view = {  
65 - orderEnsure: false,  
66 - message: paymentInfo.message  
67 - };  
68 - } else {  
69 - return Promise.reject(paymentInfo); 63 + view = {
  64 + orderEnsure: false,
  65 + message: paymentInfo.message
  66 + };
  67 +
  68 + // hotfix: nginx 接口限流, code:9999991时没message 信息
  69 + if (!view.message) {
  70 + view.message = '挤爆啦,系统繁忙';
70 } 71 }
71 } else { 72 } else {
72 // 渲染 73 // 渲染
@@ -7,7 +7,7 @@ const paymentProcess = require(global.utils + '/payment-process'); @@ -7,7 +7,7 @@ const paymentProcess = require(global.utils + '/payment-process');
7 7
8 /** 8 /**
9 * 购物车结算 9 * 购物车结算
10 - * 10 + * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
11 * @param int $uid 用户ID 11 * @param int $uid 用户ID
12 * @param string $cartType 购物车类型,ordinary表示普通购物车 12 * @param string $cartType 购物车类型,ordinary表示普通购物车
13 * @param int $isUseYohoCoin 是否使用有货币,0不使用, 1使用 13 * @param int $isUseYohoCoin 是否使用有货币,0不使用, 1使用
@@ -33,8 +33,46 @@ function cartPayAPI(uid, cartType, isUseYohoCoin, skuList) { @@ -33,8 +33,46 @@ function cartPayAPI(uid, cartType, isUseYohoCoin, skuList) {
33 33
34 34
35 /** 35 /**
  36 + * 购物车结算--支付方式和配送方式选择以及是否使用有货币接口返回的数据处理
  37 + * doc: http://git.yoho.cn/yoho-documents/api-interfaces/blob/master/订单/shopping.md
  38 + * @param int $uid 用户ID
  39 + * @param string $cartType 购物车类型,ordinary表示普通购物车
  40 + * @param int $deliveryWay 配送方式,1表示普通快递,2表示顺丰速运
  41 + * @param int $paymentType 支付方式,1表示在线支付,2表示货到付款
  42 + * @param string $couponCode 优惠券码
  43 + * @param mixed $yohoCoin 使用的有货币数量
  44 + * @param string $skuList 购买限购商品时需要传递的参数
  45 + * @return array 接口返回的数据
  46 + */
  47 +function orderComputeAPI(uid, cartType, deliveWay, paymentType, couponCode, yohoCoin, skuList) {
  48 + let param = {
  49 + method: 'app.Shopping.compute',
  50 + cart_type: cartType,
  51 + delive_way: deliveWay,
  52 + payment_type: paymentType
  53 + };
  54 +
  55 + if (couponCode) {
  56 + param.coupon_code = couponCode;
  57 + }
  58 +
  59 + if (yohoCoin) {
  60 + param.use_yoho_coin = yohoCoin;
  61 + }
  62 +
  63 + if (!_.isEmpty(skuList)) {
  64 + param.product_sku_list = skuList;
  65 + }
  66 +
  67 + return api.get('', param);
  68 +}
  69 +
  70 +
  71 +/**
36 * 调用购物车结算接口返回的数据处理 72 * 调用购物车结算接口返回的数据处理
37 * 73 *
  74 + *
  75 + *
38 * @param int $uid 用户ID 76 * @param int $uid 用户ID
39 * @param string $cartType 购物车类型,ordinary表示普通购物车 77 * @param string $cartType 购物车类型,ordinary表示普通购物车
40 * @param array $orderInfo cookie中记录的一些订单有关数据 78 * @param array $orderInfo cookie中记录的一些订单有关数据
@@ -49,21 +87,35 @@ exports.cartPay = (uid, cartType, orderInfo, limitProductCode, sku, skn, buyNumb @@ -49,21 +87,35 @@ exports.cartPay = (uid, cartType, orderInfo, limitProductCode, sku, skn, buyNumb
49 isAjax = isAjax || false; 87 isAjax = isAjax || false;
50 88
51 let result = {}; 89 let result = {};
52 - let skuList = null; 90 + let skuList = [];
53 let isLimitGoods = skn && sku && buyNumber; // 存在sku, skn 和buyNumber时为限购商品 91 let isLimitGoods = skn && sku && buyNumber; // 存在sku, skn 和buyNumber时为限购商品
  92 + let orderCompute;
54 93
55 if (isLimitGoods) { 94 if (isLimitGoods) {
56 - skuList = { 95 + skuList.push({
57 type: 'limitcode', 96 type: 'limitcode',
58 limitproductcode: limitProductCode, 97 limitproductcode: limitProductCode,
59 buy_number: buyNumber, 98 buy_number: buyNumber,
60 skn, 99 skn,
61 sku 100 sku
62 - }; 101 + });
63 102
64 result.isLimit = true; 103 result.isLimit = true;
65 } 104 }
66 105
  106 + // cookie保存的数据
  107 + if (!_.isEmpty(orderInfo)) {
  108 + orderInfo.paymentType = orderInfo.paymentType ? orderInfo.paymentType : '';
  109 + orderCompute = orderComputeAPI(
  110 + uid,
  111 + cartType,
  112 + orderInfo.deliveryId,
  113 + orderInfo.paymentType,
  114 + orderInfo.couponCode,
  115 + orderInfo.yohoCoin, skuList
  116 + );
  117 + }
  118 +
67 return cartPayAPI(uid, cartType, 0, skuList) 119 return cartPayAPI(uid, cartType, 0, skuList)
68 .then(pay => { 120 .then(pay => {
69 let goodsList = _.get(pay, 'data.goods_list', []); 121 let goodsList = _.get(pay, 'data.goods_list', []);
@@ -12,10 +12,6 @@ @@ -12,10 +12,6 @@
12 {{/if}} 12 {{/if}}
13 <!--/tab-nav--> 13 <!--/tab-nav-->
14 14
15 - {{#if isApp}}  
16 - <div class='empty-height'></div>  
17 - {{/if}}  
18 -  
19 <div class="plusstar-resources"> 15 <div class="plusstar-resources">
20 <!--资源位数据模板--> 16 <!--资源位数据模板-->
21 </div><!--/plusstar-resources--> 17 </div><!--/plusstar-resources-->
@@ -290,7 +290,7 @@ const orderDetailData = (uid, orderCode) => { @@ -290,7 +290,7 @@ const orderDetailData = (uid, orderCode) => {
290 } 290 }
291 291
292 if (orderDetail.invoice) { 292 if (orderDetail.invoice) {
293 - orderDetail.invoice.type = orderDetail.invoice.type === '2'; 293 + orderDetail.invoice.type = (orderDetail.invoice.type + '' === '2');
294 } 294 }
295 295
296 // 取消订单原因列表 296 // 取消订单原因列表
@@ -25,106 +25,107 @@ const list = (req, res, next) => { @@ -25,106 +25,107 @@ const list = (req, res, next) => {
25 let isQuerySecondClass = false; // 标识用户搜的是不是二级品类 25 let isQuerySecondClass = false; // 标识用户搜的是不是二级品类
26 let domain = null; 26 let domain = null;
27 27
28 - if (params.query) {  
29 - let activity = _.get(searchModel.searchKeyActivity(params.query), 'data.urlobj.appUrl', '');  
30 -  
31 - if (activity) {  
32 - res.redirect(activity);  
33 - }  
34 - }  
35 -  
36 if (params.shop_id) { 28 if (params.shop_id) {
37 params.shopId = params.shop_id; 29 params.shopId = params.shop_id;
38 } 30 }
39 31
40 - /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */  
41 - Promise.all([  
42 - searchModel.getAllBrandNames(),  
43 - searchModel.getClassNames()  
44 - ]).then(result => {  
45 - if (query) {  
46 - query = query.toLowerCase();  
47 - _.forEach(result[0], obj => {  
48 -  
49 - if (query === obj.brandDomain) { // 精确查品牌域名  
50 - domain = query;  
51 - return false;  
52 - }  
53 -  
54 - if (query === obj.brandName || query === obj.brandName || query === obj.brandName) { // 精确查品牌名称  
55 - domain = obj.brandDomain;  
56 - return false;  
57 - }  
58 -  
59 - // if (obj.brandDomain.indexOf(query) > 0) { // 模糊查品牌域名  
60 - // domain = obj.brandDomain;  
61 - // return false;  
62 - // }  
63 - });  
64 -  
65 - // 跳转到品牌商品列表页  
66 - if (domain !== null && !params.shop_id) {  
67 - let url = helpers.urlFormat('', {  
68 - from: 'search',  
69 - query: query  
70 -  
71 - }, domain);  
72 -  
73 - return res.redirect(url);  
74 - } 32 + return searchModel.searchKeyActivity(params.query || '').then(activityResult => {
  33 + let activity = _.get(activityResult, 'urlobj.appUrl', '');
75 34
76 - // 品类名称为空时跳出  
77 - if (!result[1]) {  
78 - return;  
79 - } 35 + if (activity) {
  36 + return res.redirect(activity);
  37 + } else {
80 38
81 - _.forEach(result[1].first, (obj) => {  
82 - // 精确查一级品类  
83 - if (obj === query) {  
84 - isQueryFirstClass = true;  
85 - return false; 39 + /* 判断是不是品牌, 是品牌跳到品牌列表页(显示搜索框),判断是不是品类, 是品类加导航标题(不显示搜索框) */
  40 + return Promise.all([
  41 + searchModel.getAllBrandNames(),
  42 + searchModel.getClassNames()
  43 + ]).then(result => {
  44 + if (query) {
  45 + query = query.toLowerCase();
  46 + _.forEach(result[0], obj => {
  47 +
  48 + if (query === obj.brandDomain) { // 精确查品牌域名
  49 + domain = query;
  50 + return false;
  51 + }
  52 +
  53 + if (query === obj.brandName || query === obj.brandName || query === obj.brandName) { // 精确查品牌名称
  54 + domain = obj.brandDomain;
  55 + return false;
  56 + }
  57 +
  58 + // if (obj.brandDomain.indexOf(query) > 0) { // 模糊查品牌域名
  59 + // domain = obj.brandDomain;
  60 + // return false;
  61 + // }
  62 + });
  63 +
  64 + // 跳转到品牌商品列表页
  65 + if (domain !== null && !params.shop_id) {
  66 + let url = helpers.urlFormat('', {
  67 + from: 'search',
  68 + query: query
  69 +
  70 + }, domain);
  71 +
  72 + return res.redirect(url);
  73 + }
  74 +
  75 + // 品类名称为空时跳出
  76 + if (!result[1]) {
  77 + return;
  78 + }
  79 +
  80 + _.forEach(result[1].first, (obj) => {
  81 + // 精确查一级品类
  82 + if (obj === query) {
  83 + isQueryFirstClass = true;
  84 + return false;
  85 + }
  86 + });
  87 +
  88 + _.forEach(result[1].second, (obj) => {
  89 + // 精确查二级品类
  90 + if (obj === query) {
  91 + isQuerySecondClass = true;
  92 + return false;
  93 + }
  94 + });
  95 + } else {
  96 + params.query = '';
86 } 97 }
87 - });  
88 98
89 - _.forEach(result[1].second, (obj) => {  
90 - // 精确查二级品类  
91 - if (obj === query) {  
92 - isQuerySecondClass = true;  
93 - return false; 99 + // 搜索是一级品类
  100 + if (isQueryFirstClass) {
  101 + title = '全部' + query;
  102 + } else if (isQuerySecondClass) { // 搜索是二级品类
  103 + title = query;
  104 + } else { // 搜索其它内容
  105 + if (query || params.form) {
  106 + params.search = {
  107 + default: query === '' ? false : query,
  108 + url: helpers.urlFormat('', null, 'search')
  109 + };
  110 + }
  111 + title = '搜索';
94 } 112 }
95 - });  
96 - } else {  
97 - params.query = '';  
98 - }  
99 113
100 - // 搜索是一级品类  
101 - if (isQueryFirstClass) {  
102 - title = '全部' + query;  
103 - } else if (isQuerySecondClass) { // 搜索是二级品类  
104 - title = query;  
105 - } else { // 搜索其它内容  
106 - if (query || params.form) {  
107 - params.search = {  
108 - default: query === '' ? false : query,  
109 - url: helpers.urlFormat('', null, 'search')  
110 - };  
111 - }  
112 - title = '搜索'; 114 + title = params.title ? params.title : title;
  115 +
  116 + res.render('search/list', {
  117 + module: 'product',
  118 + page: 'search-list',
  119 + pageHeader: headerModel.setNav({
  120 + navTitle: title
  121 + }),
  122 + title: title,
  123 + goodList: params,
  124 + pageFooter: true
  125 + });
  126 + }).catch(next);
113 } 127 }
114 -  
115 - title = params.title ? params.title : title;  
116 -  
117 - res.render('search/list', {  
118 - module: 'product',  
119 - page: 'search-list',  
120 - pageHeader: headerModel.setNav({  
121 - navTitle: title  
122 - }),  
123 - title: title,  
124 - goodList: params,  
125 - pageFooter: true  
126 - });  
127 - }).catch(next); 128 + });
128 }; 129 };
129 130
130 /** 131 /**
@@ -132,6 +133,7 @@ const list = (req, res, next) => { @@ -132,6 +133,7 @@ const list = (req, res, next) => {
132 */ 133 */
133 const index = (req, res, next) => { 134 const index = (req, res, next) => {
134 let title = '搜索'; 135 let title = '搜索';
  136 +
135 ((render) => { 137 ((render) => {
136 if (_.get(req, 'app.locals.wap.search.removeHotSearch', false)) { 138 if (_.get(req, 'app.locals.wap.search.removeHotSearch', false)) {
137 render([]); 139 render([]);
@@ -140,7 +142,7 @@ const index = (req, res, next) => { @@ -140,7 +142,7 @@ const index = (req, res, next) => {
140 render(result); 142 render(result);
141 }).catch(next); 143 }).catch(next);
142 } 144 }
143 - 145 +
144 })((result) => { 146 })((result) => {
145 res.render('search/index', { 147 res.render('search/index', {
146 module: 'product', 148 module: 'product',
@@ -156,8 +158,8 @@ const index = (req, res, next) => { @@ -156,8 +158,8 @@ const index = (req, res, next) => {
156 } 158 }
157 159
158 }); 160 });
159 - })  
160 - 161 + });
  162 +
161 }; 163 };
162 164
163 /** 165 /**
@@ -21,4 +21,7 @@ module.exports = app => { @@ -21,4 +21,7 @@ module.exports = app => {
21 21
22 // 分期付款 22 // 分期付款
23 app.use('/home', require('./apps/home')); 23 app.use('/home', require('./apps/home'));
  24 +
  25 + // 第三方服务处理
  26 + app.use('/3party', require('./apps/3party'));
24 }; 27 };
@@ -14,6 +14,10 @@ @@ -14,6 +14,10 @@
14 <link rel="dns-prefetch" href="//static.yohobuy.com"> 14 <link rel="dns-prefetch" href="//static.yohobuy.com">
15 <link rel="dns-prefetch" href="//img12.static.yhbimg.com"> 15 <link rel="dns-prefetch" href="//img12.static.yhbimg.com">
16 <link rel="dns-prefetch" href="//img13.static.yhbimg.com"> 16 <link rel="dns-prefetch" href="//img13.static.yhbimg.com">
  17 +
  18 + <!-- oneapm agent -->
  19 + <script type='text/javascript'>window.BWEUM||(BWEUM={});BWEUM.info = {"stand":true,"agentType":"browser","agent":"bi-collector.oneapm.com/static/js/bw-send-411.4.9.js","beaconUrl":"bi-collector.oneapm.com/beacon","licenseKey":"NQVuf~6yrQbvJnqr","applicationID":2283639};</script><script type="text/javascript">/*!OneAPM-v411.4.9 */!function(){window.NREUM||(window.NREUM={}),window.BWEUM||(window.BWEUM=window.NREUM);var a;window.BWEUM.require=a,window.apmFirstbyte=window.apmUserFirstbyte||(new Date).getTime(),a=function b(c,d,e){function f(h,i){if(!d[h]){if(!c[h]){var j="function"==typeof a&&a;if(!i&&j)return j(h,!0);if(g)return g(h,!0);var k=new Error("Cannot find module '"+h+"'");throw k.code="MODULE_NOT_FOUND",k}var l=d[h]={exports:{}};c[h][0].call(l.exports,function(a){var b=c[h][1][a];return f(b?b:a)},l,l.exports,b,c,d,e)}return d[h].exports}for(var g="function"==typeof a&&a,h=0;h<e.length;h++)f(e[h]);return f}({38:[function(a,b){b.exports=function(a){var b=document.createElement("a"),c=window.location,d={};b.href=a,d.port=b.port;var e=b.href.split("://");return!d.port&&e[1]&&(d.port=e[1].split("/")[0].split(":")[1]),d.port&&"0"!==d.port||(d.port="https"===e[0]?"443":"80"),d.hostname=b.hostname||c.hostname,d.pathname=b.pathname,"/"!==d.pathname.charAt(0)&&(d.pathname="/"+d.pathname),d.sameOrigin=!b.hostname||b.hostname===document.domain&&b.port===c.port&&b.protocol===c.protocol,d}},{}],34:[function(a,b){function c(){var a=m.info=window.BWEUM.info;if(a&&a.agent&&a.licenseKey&&a.applicationID&&i&&i.body){m.proto="https"===l.split(":")[0]||a.sslForHttp?"https://":"http://",g("mark",["onload",f()]);var b=i.createElement("script");b.src=0==a.agent.indexOf("//")?a.agent:m.proto+a.agent,b.src+="?v=411.4.9 ",i.body.appendChild(b)}}function d(){o||"complete"===i.readyState&&e()}function e(){g("mark",["domContent",f()])}function f(){return(new Date).getTime()}var g=a("handle"),h=window,i=h.document,j="addEventListener",k="attachEvent",l=(""+location).split("?")[0],m=b.exports={offset:window.apmFirstbyte||f(),origin:l,features:{}};g("mark",["firstbyte",window.apmFirstbyte||f()]),"complete"===document.readyState?(e(),c()):i[j]?(i[j]("DOMContentLoaded",e,!1),h[j]("load",c,!1)):(i[k]("onreadystatechange",d),h[k]("onload",c));var n=!1,o=!1;try{n=null==window.frameElement&&document.documentElement}catch(m){}n&&n.doScroll&&!function p(){if(!o){try{n.doScroll("left")}catch(a){return setTimeout(p,50)}o=!0,e()}}()},{handle:33}],33:[function(a,b){function c(a,b,c){return d.listeners(a).length?d.emit(a,b,c):(e[a]||(e[a]=[]),void e[a].push(b))}var d=a("ee").create(),e={};b.exports=c,c.ee=d,d.q=e},{ee:31}],36:[function(a,b){function c(a,b,c){b||(b=0),"undefined"==typeof c&&(c=a?a.length:0);for(var d=-1,e=c-b||0,f=new Array(0>e?0:e);++d<e;)f[d]=a[b+d];return f}b.exports=c},{}],31:[function(a,b){function c(a){function b(b,c,g){a&&a(b,c,g),g||(g={});var i=h(b),j=i.length,k={};try{k=f(g,e,d)}catch(l){}for(var m=0;j>m;m++)i[m].apply(k,c);return k}function g(a,b){j[a]=h(a).concat(b)}function h(a){return j[a]||[]}function i(){return c(b)}var j={};return{on:g,emit:b,create:i,listeners:h,_events:j}}function d(){return{}}var e="bw@context",f=a("gos");b.exports=c()},{gos:32}],32:[function(a,b){function c(a,b,c){if(d.call(a,b))return a[b];var e=c();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(a,b,{value:e,writable:!0,enumerable:!1}),e}catch(f){}try{a[b]=e}catch(f){}return e}var d=Object.prototype.hasOwnProperty;b.exports=c},{}]},{},[]),a=function c(b,d,e){function f(h,i){if(!d[h]){if(!b[h]){var j="function"==typeof a&&a;if(!i&&j)return j(h,!0);if(g)return g(h,!0);var k=new Error("Cannot find module '"+h+"'");throw k.code="MODULE_NOT_FOUND",k}var l=d[h]={exports:{}};b[h][0].call(l.exports,function(a){var c=b[h][1][a];return f(c?c:a)},l,l.exports,c,b,d,e)}return d[h].exports}for(var g="function"==typeof a&&a,h=0;h<e.length;h++)f(e[h]);return f}({1:[function(a){a("loader"),a("errorload"),a("xhrload"),a("perfload")},{errorload:5,loader:34,perfload:6,xhrload:7}],7:[function(a){function b(a){if("string"==typeof a&&a.length)return a.length;if("object"!=typeof a)return void 0;if("undefined"!=typeof ArrayBuffer&&a instanceof ArrayBuffer&&a.byteLength)return a.byteLength;if("undefined"!=typeof Blob&&a instanceof Blob&&a.size)return a.size;if("undefined"!=typeof FormData&&a instanceof FormData)return void 0;try{return JSON.stringify(a).length}catch(b){return void 0}}function c(a,b){return b}function d(a){a.send=o.wrapOld(a.send,"send-xhr-",c),a.onreadystatechange=o.wrapOld(a.onreadystatechange,"iexhr-onreadystatechange-",c),a.onerror=o.wrapOld(a.onerror,"iexhr-onerror-",c)}function e(a){var c=this.params,d=this.metrics;if(!this.ended){if(this.ended=!0,a.removeEventListener)for(var e=0;m>e;e++)a.removeEventListener(l[e],this.listener,!1);if(!c.aborted){if(d.duration=(new Date).getTime()-this.startTime,4===a.readyState){c.status=a.status;var f=a.responseType,g="arraybuffer"===f||"blob"===f||"json"===f?a.response:a.responseText,h=b(g);h&&(d.rxSize=h)}else c.status=0;d.cbTime=this.cbTime,c&&c.pathname&&c.pathname.indexOf("beacon/resources")<0&&i("xhr",[c,d,this.startTime,this.creatType])}}}function f(a,b){var c=j(b),d=a.params;d.host=c.hostname+":"+c.port,d.pathname=c.pathname,a.sameOrigin=c.sameOrigin}var g=window,h=(g.performance,window.XMLHttpRequest);if(h&&h.prototype&&!/CriOS/.test(navigator.userAgent)){a("loader").features.xhr=!0;var i=a("handle"),j=a("parse-url"),k=a("ee"),l=["load","error","abort","timeout"],m=l.length,n=a("loader_id"),o=a("wrap-function")(k);a("wrap-events"),a("wrap-xhr"),k.on("new-xhr",function(){this.totalCbs=0,this.called=0,this.cbTime=0,this.end=e,this.ended=!1,this.xhrGuids={}}),k.on("open-xhr-start",function(a){this.params={method:a[0]},f(this,a[1]),this.metrics={}}),k.on("open-xhr-end",function(a,b){b.__oldie&&d(b)}),k.on("send-xhr-start",function(a,c){var d=this.metrics,e=a[0],f=this;if(d&&e){var g=b(e);g&&(d.txSize=g)}if(this.startTime=(new Date).getTime(),this.listener=function(a){try{"abort"===a.type&&(f.params.aborted=!0),("load"!==a.type||f.called===f.totalCbs&&(f.onloadCalled||"function"!=typeof c.onload))&&f.end&&f.end(c)}catch(b){try{k.emit("internal-error",[b])}catch(d){}}},c.addEventListener)for(var h=0;m>h;h++)c.addEventListener(l[h],this.listener,!1)}),k.on("iexhr-onreadystatechange-start",function(a,b){if(1==b.readyState){var d=b.onreadystatechange;setTimeout(function(){b.onreadystatechange!==d&&(b.onreadystatechange=o.wrapOld(b.onreadystatechange,"iexhr-onreadystatechange-",c))},0)}4==b.readyState&&(this.xhrCbStart=(new Date).getTime())}),k.on("iexhr-onreadystatechange-end",function(a,b){var c=this;this.xhrCbStart&&k.emit("xhr-cb-time",[(new Date).getTime()-this.xhrCbStart,this.onload,b],b),4==b.readyState&&c.end(b)}),k.on("xhr-cb-time",function(a,b,c){this.cbTime+=a,b?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&"function"==typeof c.onload||this.end(c)}),k.on("xhr-load-added",function(a,b){var c=""+n(a)+!!b;this.xhrGuids&&!this.xhrGuids[c]&&(this.xhrGuids[c]=!0,this.totalCbs+=1)}),k.on("xhr-load-removed",function(a,b){var c=""+n(a)+!!b;this.xhrGuids&&this.xhrGuids[c]&&(delete this.xhrGuids[c],this.totalCbs-=1)}),k.on("addEventListener-end",function(a,b){b instanceof XMLHttpRequest&&"load"===a[0]&&k.emit("xhr-load-added",[a[1],a[2]],b)}),k.on("removeEventListener-end",function(a,b){b instanceof XMLHttpRequest&&"load"===a[0]&&k.emit("xhr-load-removed",[a[1],a[2]],b)}),k.on("fn-start",function(a,b,c){b instanceof XMLHttpRequest&&("onload"===c&&(this.onload=!0),("load"===(a[0]&&a[0].type)||this.onload)&&(this.xhrCbStart=(new Date).getTime()))}),k.on("fn-end",function(a,b){this.xhrCbStart&&k.emit("xhr-cb-time",[(new Date).getTime()-this.xhrCbStart,this.onload,b],b)})}},{ee:31,handle:33,loader:34,loader_id:35,"parse-url":38,"wrap-events":28,"wrap-function":39,"wrap-xhr":30}],35:[function(a,b){function c(a){var b=typeof a;return!a||"object"!==b&&"function"!==b?-1:a===window?0:f(a,e,function(){return d++})}var d=1,e="bw@id",f=a("gos");b.exports=c},{gos:32}],6:[function(a){var b=window.performance;if(b&&b.timing&&b.getEntriesByType){var c=a("ee"),d=a("handle"),e=(a("wrap-timer"),a("loader"));e.features.stn=!0,c.on("fn-start",function(a){var b=a[0];b instanceof Event&&(this.bstStart=Date.now())}),c.on("fn-end",function(a,b){var c=a[0];c instanceof Event&&d("bst",[c,b,this.bstStart,Date.now()])})}},{ee:31,handle:33,loader:34,"wrap-timer":29}],5:[function(a){function b(a,b,d,g,i){try{j?j-=1:e("err",[i||new c(a,b,d)])}catch(k){try{e("ierr",[k,(new Date).getTime(),!0])}catch(l){}}return"function"==typeof h?h.apply(this,f(arguments)):!1}function c(a,b,c){this.message=a||"Uncaught error with no additional information",this.sourceURL=b,this.line=c}function d(a){e("err",[a,(new Date).getTime()])}var e=a("handle"),f=a("lodash._slice"),g=a("ee"),h=window.onerror,i=!1,j=0;a("loader").features.err=!0,window.onerror=b,window.BWEUM.noticeError=d;var k=window.XMLHttpRequest;try{throw new Error}catch(l){"stack"in l&&(a("wrap-timer"),"addEventListener"in window&&a("wrap-events"),k&&k.prototype&&k.prototype.addEventListener&&a("wrap-xhr"),i=!0)}g.on("fn-start",function(){i&&(j+=1)}),g.on("fn-err",function(a,b,c){i&&(this.thrown=!0,d(c))}),g.on("fn-end",function(){i&&!this.thrown&&j>0&&(j-=1)}),g.on("internal-error",function(a){e("ierr",[a,(new Date).getTime(),!0])})},{ee:31,handle:33,loader:34,"lodash._slice":36,"wrap-events":28,"wrap-timer":29,"wrap-xhr":30}],30:[function(a,b){function c(){j.inPlace(this,m,"fn-")}function d(a,b){j.inPlace(b,["onreadystatechange"],"fn-")}function e(a){a.open=j.wrapOld(a.open,"open-xhr-",f)}function f(a,b){return b}var g=a("ee").create(),h=a("wrap-events"),i=a("wrap-function"),j=i(g),k=i(h),l=window.XMLHttpRequest,m=["onload","onerror","onabort","onloadstart","onloadend","onprogress","ontimeout"];b.exports=g,window._ApmXMLHttpRequest=window.XMLHttpRequest,window.XMLHttpRequest=function(a){var b=new l(a);try{g.emit("new-xhr",[],b),l.prototype.addEventListener?(k.inPlace(b,["addEventListener","removeEventListener"],"-",function(a,b){return b}),b.addEventListener("readystatechange",c,!1)):(b.__oldie=!0,e(b))}catch(d){try{g.emit("internal-error",[d])}catch(f){}}return b},window.XMLHttpRequest.prototype=l.prototype,j.inPlace(XMLHttpRequest.prototype,["open","send"],"-xhr-",f),g.on("send-xhr-start",d),g.on("open-xhr-start",d)},{ee:31,"wrap-events":28,"wrap-function":39}],29:[function(a,b){function c(a,b,c){var d=a[0];"string"==typeof d&&(d=new Function(d)),a[0]=e(d,"fn-",null,c)}var d=(a("lodash._slice"),a("ee").create()),e=a("wrap-function")(d);b.exports=d,e.inPlace(window,["setTimeout","setInterval","setImmediate"],"setTimer-"),d.on("setTimer-start",c)},{ee:31,"lodash._slice":36,"wrap-function":39}],28:[function(a,b){function c(a){f.inPlace(a,["addEventListener","removeEventListener"],"-",d)}function d(a){return a[1]}var e=(a("lodash._slice"),a("ee").create()),f=a("wrap-function")(e),g=a("gos");if(b.exports=e,c(window),"getPrototypeOf"in Object){for(var h=document;h&&!h.hasOwnProperty("addEventListener");)h=Object.getPrototypeOf(h);h&&c(h);for(var i=XMLHttpRequest.prototype;i&&!i.hasOwnProperty("addEventListener");)i=Object.getPrototypeOf(i);i&&c(i)}else Object.prototype.hasOwnProperty.call(XMLHttpRequest,"addEventListener")&&c(XMLHttpRequest.prototype);e.on("addEventListener-start",function(a){if(a[1]){var b=a[1];"function"==typeof b?this.wrapped=a[1]=g(b,"bw@wrapped",function(){return f(b,"fn-",null,b.name||"anonymous")}):"function"==typeof b.handleEvent&&f.inPlace(b,["handleEvent"],"fn-")}}),e.on("removeEventListener-start",function(a){var b=this.wrapped;b&&(a[1]=b)})},{ee:31,gos:32,"lodash._slice":36,"wrap-function":39}],39:[function(a,b){function c(a){return!(a&&"function"==typeof a&&a.apply&&!a[f])}var d=a("ee"),e=a("lodash._slice"),f="bw@wrapper",g=Object.prototype.hasOwnProperty;b.exports=function(a){function b(a,b,d,g,i){function j(){var c=this;return h(a,b,c,e(arguments),d,g,i)}if(c(a))return a;b||(b="");try{j[f]=!0}catch(k){}return l(a,j),j}function h(a,b,c,d,e,f){var d,c,g,h;try{g=e&&e(d,c)||{}}catch(i){m([i,"",[d,c,f],g])}_apmfnName=a.name||"",k(b+"start",[d,c,f,_apmfnName],g);try{return h=a.apply(c,d)}catch(j){var l=window.console;throw void 0!=l&&l.error&&l.log&&void 0!=j.stack&&(l.log("OneAPM catch error"),l.error(j.stack)),k(b+"err",[d,c,j],g),j}finally{k(b+"end",[d,c,h,_apmfnName],g)}}function i(a,b,c){var a=a||function(){},b=b||"-";return function(){var d=this;return h(a,b,d,e(arguments),c)}}function j(a,d,e,f){e||(e="");var g,h,i,j="-"===e.charAt(0);for(i=0;i<d.length;i++)h=d[i],g=a[h],c(g)||(a[h]=b(g,j?h+e:e,f,h,a))}function k(b,c,d){try{a.emit(b,c,d)}catch(e){m([e,b,c,d])}}function l(a,b){if(Object.defineProperty&&Object.keys)try{var c=Object.keys(a);return c.forEach(function(c){Object.defineProperty(b,c,{get:function(){return a[c]},set:function(b){return a[c]=b,b}})}),b}catch(d){m([d])}for(var e in a)g.call(a,e)&&(b[e]=a[e]);return b}function m(b){try{a.emit("internal-error",b)}catch(c){}}return a||(a=d),b.inPlace=j,b.flag=f,b.wrapOld=i,b}},{ee:31,"lodash._slice":36}]},{},[1]),window.BWEUM.require=a}();</script>
  20 +
17 {{#if width750}} 21 {{#if width750}}
18 <script type="text/javascript"> 22 <script type="text/javascript">
19 (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=750){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/750)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window); 23 (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=750){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/750)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window);
  1 +/**
  2 + * OneAPM agent configuration
  3 + */
  4 +
  5 +const commonConfig = require('./config/common');
  6 +
  7 +exports.config = {
  8 + app_name: [commonConfig.appName],
  9 + license_key: 'BwEGA1dRDlQ6357HHQ1AD1xJVkbc9fNfWRtQUwhQG41c5QFWGFIDSQoHc0e8AgMaUlcUVw0=',
  10 + logging: {
  11 + level: 'info'
  12 + },
  13 + transaction_events: {
  14 + enabled: true
  15 + }
  16 +};
1 { 1 {
2 "name": "m-yohobuy-node", 2 "name": "m-yohobuy-node",
3 - "version": "5.1.9", 3 + "version": "5.1.10",
4 "private": true, 4 "private": true,
5 "description": "A New Yohobuy Project With Express", 5 "description": "A New Yohobuy Project With Express",
6 "repository": { 6 "repository": {
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 "dev": "nodemon -e js,hbs -i public/ app.js", 12 "dev": "nodemon -e js,hbs -i public/ app.js",
13 "online": "NODE_ENV=\"production\" node app.js", 13 "online": "NODE_ENV=\"production\" node app.js",
14 "debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js", 14 "debug": "DEBUG=\"express:*\" nodemon -e js,hbs -i public/ app.js",
15 - "lint-js": "eslint -c .eslintrc --cache --fix .", 15 + "lint-js": "eslint -c .eslintrc --cache .",
16 "lint-css": "stylelint --config .stylelintrc public/scss/**/*.css", 16 "lint-css": "stylelint --config .stylelintrc public/scss/**/*.css",
17 "precommit": "node lint.js" 17 "precommit": "node lint.js"
18 }, 18 },
@@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
30 "md5": "^2.1.0", 30 "md5": "^2.1.0",
31 "moment": "^2.15.1", 31 "moment": "^2.15.1",
32 "morgan": "^1.7.0", 32 "morgan": "^1.7.0",
  33 + "oneapm": "^1.2.20",
33 "passport": "^0.3.2", 34 "passport": "^0.3.2",
34 "passport-local": "^1.0.0", 35 "passport-local": "^1.0.0",
35 "passport-qq": "0.0.3", 36 "passport-qq": "0.0.3",
@@ -4,8 +4,7 @@ var $ = require('yoho-jquery'), @@ -4,8 +4,7 @@ var $ = require('yoho-jquery'),
4 loading = require('../plugin/loading'), 4 loading = require('../plugin/loading'),
5 debounce = require('lodash/debounce'); 5 debounce = require('lodash/debounce');
6 6
7 -var plusstar = {},  
8 - $footer = $('#yoho-footer'); 7 +var plusstar = {};
9 8
10 var windowHeight = $(window).height(); 9 var windowHeight = $(window).height();
11 var scrollFn, 10 var scrollFn,
@@ -186,6 +185,9 @@ plusstar = { @@ -186,6 +185,9 @@ plusstar = {
186 return true; 185 return true;
187 } 186 }
188 187
  188 + // 固定底部去除
  189 + window.rePosFooter();
  190 +
189 // 记录切换tab位置 191 // 记录切换tab位置
190 $(document).scrollTop(window.cookie(code) || 0); 192 $(document).scrollTop(window.cookie(code) || 0);
191 193
@@ -303,23 +305,17 @@ $(function() { @@ -303,23 +305,17 @@ $(function() {
303 apt: window.queryString.client_type || '', 305 apt: window.queryString.client_type || '',
304 sid: window.queryString.session_id || '', 306 sid: window.queryString.session_id || '',
305 }; 307 };
306 - }  
307 -  
308 - // 男:1,女:2,潮童:3,创意生活:4  
309 - speckParamApp.CID = window.queryString.yh_channel || window._ChannelVary[window.cookie('_Channel')] || 1;  
310 308
311 - if (!isApp) { 309 + $('.plusstar-resources').css({'margin-top': $('.tab-nav').height()});
  310 + } else {
312 $('.tab-nav').css({ 311 $('.tab-nav').css({
313 position: 'relative' 312 position: 'relative'
314 }); 313 });
315 -  
316 - $footer.css({  
317 - 'max-width': '650px'  
318 - }).before(  
319 - '<div style="height: ' + parseInt($footer.css('height'), 0) + 'px"></div>'  
320 - );  
321 } 314 }
322 315
  316 + // 男:1,女:2,潮童:3,创意生活:4
  317 + speckParamApp.CID = window.queryString.yh_channel || window._ChannelVary[window.cookie('_Channel')] || 1;
  318 +
323 plusstar.init(); 319 plusstar.init();
324 320
325 // 滚动翻页 321 // 滚动翻页
@@ -18,12 +18,13 @@ @@ -18,12 +18,13 @@
18 position: fixed; 18 position: fixed;
19 z-index: 10; 19 z-index: 10;
20 background-color: #fff; 20 background-color: #fff;
  21 + top: 0;
21 22
22 li { 23 li {
23 display: block; 24 display: block;
24 float: left; 25 float: left;
25 height: 100%; 26 height: 100%;
26 - width: 33.33%; 27 + width: 50%;
27 line-height: 60px; 28 line-height: 60px;
28 color: #999; 29 color: #999;
29 white-space: nowrap; 30 white-space: nowrap;