Authored by 沈志敏

merge master to bigdata_burying

Showing 70 changed files with 400 additions and 399 deletions
@@ -24,7 +24,8 @@ const favicon = require('serve-favicon'); @@ -24,7 +24,8 @@ const favicon = require('serve-favicon');
24 const uuid = require('uuid'); 24 const uuid = require('uuid');
25 25
26 const pkg = require('./package.json'); 26 const pkg = require('./package.json');
27 -const session = require('cookie-session'); 27 +const session = require('client-sessions');
  28 +const _ = require('lodash');
28 29
29 const app = express(); 30 const app = express();
30 31
@@ -58,7 +59,7 @@ app.use(global.yoho.hbs({ @@ -58,7 +59,7 @@ app.use(global.yoho.hbs({
58 layoutsDir: path.join(__dirname, 'doraemon/views'), 59 layoutsDir: path.join(__dirname, 'doraemon/views'),
59 partialsDir: path.join(__dirname, 'doraemon/views/partial'), 60 partialsDir: path.join(__dirname, 'doraemon/views/partial'),
60 views: path.join(__dirname, 'doraemon/views'), 61 views: path.join(__dirname, 'doraemon/views'),
61 - helpers: global.yoho.helpers 62 + helpers: _.assign(global.yoho.helpers, require('./utils/helpers'))
62 })); 63 }));
63 64
64 app.use(global.yoho.middleware()); 65 app.use(global.yoho.middleware());
@@ -73,14 +74,19 @@ app.use(cookieParser()); @@ -73,14 +74,19 @@ app.use(cookieParser());
73 app.use(compression()); 74 app.use(compression());
74 75
75 app.use(session({ 76 app.use(session({
76 - name: 'yohobuy_session_cookie',  
77 - secret: '82dd7e724f2c6870472c89dfa43cf48d' 77 + requestKey: 'session',
  78 + cookieName: 'yohoblk-session',
  79 + secret: '82dd7e724f2c6870472c89dfa43cf48d',
  80 + domain: config.cookieDomain
78 })); 81 }));
79 82
80 app.use((req, res, next) => { 83 app.use((req, res, next) => {
81 req.user = {}; // 全局的用户数据 84 req.user = {}; // 全局的用户数据
82 req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等 85 req.yoho = {}; // req和res绑定yoho对象,用于传递全局数据, 如req.yoho.channel等
83 req.app.locals.wap = app.locals.wap; // zookeper对象赋值 86 req.app.locals.wap = app.locals.wap; // zookeper对象赋值
  87 + if (!req.session) {
  88 + req.session = {};
  89 + }
84 if (!req.session.id) { 90 if (!req.session.id) {
85 req.session.id = uuid.v4(); 91 req.session.id = uuid.v4();
86 } 92 }
@@ -99,6 +105,7 @@ try { @@ -99,6 +105,7 @@ try {
99 const errorHanlder = require('./doraemon/middleware/error-handler'); 105 const errorHanlder = require('./doraemon/middleware/error-handler');
100 const setPageInfo = require('./doraemon/middleware/set-pageinfo'); 106 const setPageInfo = require('./doraemon/middleware/set-pageinfo');
101 const devtools = require('./doraemon/middleware/devtools'); 107 const devtools = require('./doraemon/middleware/devtools');
  108 + const layoutTools = require('./doraemon/middleware/layout-tools');
102 const seo = require('./doraemon/middleware/seo'); 109 const seo = require('./doraemon/middleware/seo');
103 const pageCache = require('./doraemon/middleware/page-cache'); 110 const pageCache = require('./doraemon/middleware/page-cache');
104 111
@@ -114,6 +121,8 @@ try { @@ -114,6 +121,8 @@ try {
114 app.use(devtools()); 121 app.use(devtools());
115 } 122 }
116 123
  124 + app.use(layoutTools());
  125 +
117 app.use(pageCache()); 126 app.use(pageCache());
118 require('./dispatch')(app); 127 require('./dispatch')(app);
119 app.all('*', errorHanlder.notFound()); // 404 128 app.all('*', errorHanlder.notFound()); // 404
@@ -52,7 +52,9 @@ let _channelPage = (req, res, data) => { @@ -52,7 +52,9 @@ let _channelPage = (req, res, data) => {
52 // } 52 // }
53 // }].concat(result.content); 53 // }].concat(result.content);
54 // console.log(result.content[9]); 54 // console.log(result.content[9]);
55 - res.render('channel', Object.assign({}, _renderData, data, result)); 55 + res.render('channel', Object.assign({}, _renderData, data, result, {
  56 + localCss: true
  57 + }));
56 }); 58 });
57 }; 59 };
58 60
@@ -194,7 +194,7 @@ const getBrandByChannel = (channel) => { @@ -194,7 +194,7 @@ const getBrandByChannel = (channel) => {
194 name: row.brand_name, 194 name: row.brand_name,
195 isHot: row.is_hot === 'Y' ? true : false, 195 isHot: row.is_hot === 'Y' ? true : false,
196 isNew: row.is_show_new === 'Y' ? true : false, 196 isNew: row.is_show_new === 'Y' ? true : false,
197 - url: helpers.urlFormat('', null, row.brand_domain) 197 + url: helpers.urlFormat('/product/index/brand?domain=' + row.brand_domain)
198 }); 198 });
199 199
200 }); 200 });
@@ -222,7 +222,7 @@ const getBrandByChannel = (channel) => { @@ -222,7 +222,7 @@ const getBrandByChannel = (channel) => {
222 222
223 list.push({ 223 list.push({
224 brandName: newList[key].brand_name, 224 brandName: newList[key].brand_name,
225 - url: helpers.urlFormat('', null, newList[key].brand_domain), 225 + url: helpers.urlFormat('/product/index/brand?domain=' + newList[key].brand_domain),
226 img: helpers.image(newList[key].brand_ico, 186, 115), 226 img: helpers.image(newList[key].brand_ico, 186, 115),
227 }); 227 });
228 228
@@ -249,7 +249,7 @@ const getBrandByChannel = (channel) => { @@ -249,7 +249,7 @@ const getBrandByChannel = (channel) => {
249 249
250 list.push({ 250 list.push({
251 brandName: hotList[key].brand_name, 251 brandName: hotList[key].brand_name,
252 - url: helpers.urlFormat('', null, hotList[key].brand_domain), 252 + url: helpers.urlFormat('/product/index/brand?domain=' + hotList[key].brand_domain),
253 img: helpers.image(hotList[key].brand_ico, 186, 115), 253 img: helpers.image(hotList[key].brand_ico, 186, 115),
254 }); 254 });
255 255
@@ -487,7 +487,7 @@ const branchSearch = (params) => { @@ -487,7 +487,7 @@ const branchSearch = (params) => {
487 name: row.brand_name, 487 name: row.brand_name,
488 isHot: row.is_hot === 'Y' ? true : false, 488 isHot: row.is_hot === 'Y' ? true : false,
489 isNew: row.is_show_new === 'Y' ? true : false, 489 isNew: row.is_show_new === 'Y' ? true : false,
490 - url: helpers.urlFormat('', null, row.brand_domain), 490 + url: helpers.urlFormat('/product/index/brand?domain=' + row.brand_domain),
491 brandId: row.id, 491 brandId: row.id,
492 brandDomain: row.brand_domain, 492 brandDomain: row.brand_domain,
493 searchName: row.brand_name_en + row.brand_name_cn 493 searchName: row.brand_name_en + row.brand_name_cn
@@ -5,13 +5,13 @@ @@ -5,13 +5,13 @@
5 {{#if @first}} 5 {{#if @first}}
6 <li class="swiper-slide buriedpoint" data-bp-id="shop_bannerarea_{{url}}_0"> 6 <li class="swiper-slide buriedpoint" data-bp-id="shop_bannerarea_{{url}}_0">
7 <a href="{{url}}"> 7 <a href="{{url}}">
8 - <img src="{{img}}"> 8 + <img src="{{image2 img q=60}}">
9 </a> 9 </a>
10 </li> 10 </li>
11 {{^}} 11 {{^}}
12 <li class="swiper-slide buriedpoint" data-bp-id="shop_bannerarea_two_0"> 12 <li class="swiper-slide buriedpoint" data-bp-id="shop_bannerarea_two_0">
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 - <img class="swiper-lazy" data-src="{{img}}"> 14 + <img class="swiper-lazy" data-src="{{image2 img q=60}}">
15 </a> 15 </a>
16 <div class="swiper-lazy-preloader"></div> 16 <div class="swiper-lazy-preloader"></div>
17 </li> 17 </li>
@@ -23,4 +23,4 @@ @@ -23,4 +23,4 @@
23 <div class="pagination-inner"> 23 <div class="pagination-inner">
24 </div> 24 </div>
25 </div> 25 </div>
26 -</div>  
  26 +</div>
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 {{# list}} 5 {{# list}}
6 <li class="swiper-slide"> 6 <li class="swiper-slide">
7 <a href="{{url}}"> 7 <a href="{{url}}">
8 - <img src="{{img}}" alt=""> 8 + <img src="{{image2 img q=60}}" alt="">
9 <span class="brands-title">{{textCn}}</span> 9 <span class="brands-title">{{textCn}}</span>
10 </a> 10 </a>
11 </li> 11 </li>
@@ -69,7 +69,8 @@ const editor = (req, res, next) => { @@ -69,7 +69,8 @@ const editor = (req, res, next) => {
69 infos: build, 69 infos: build,
70 isApp: isApp, 70 isApp: isApp,
71 authorInfo: authorData.data 71 authorInfo: authorData.data
72 - } 72 + },
  73 + localCss: true
73 }, parameter)); 74 }, parameter));
74 } else { 75 } else {
75 return next(); 76 return next();
@@ -172,7 +173,9 @@ const index = (req, res, next) => { @@ -172,7 +173,9 @@ const index = (req, res, next) => {
172 res.set('Cache-Control', 'no-cache'); 173 res.set('Cache-Control', 'no-cache');
173 } 174 }
174 } 175 }
175 - res.render('guang', Object.assign(responseData, result)); 176 + res.render('guang', Object.assign(responseData, result, {
  177 + localCss: true
  178 + }));
176 }).catch(next); 179 }).catch(next);
177 }; 180 };
178 181
@@ -357,7 +357,8 @@ const index = (req, res, next) => { @@ -357,7 +357,8 @@ const index = (req, res, next) => {
357 page: 'info-index', 357 page: 'info-index',
358 title: '逛', 358 title: '逛',
359 gender: gender, 359 gender: gender,
360 - wechatShare: true 360 + wechatShare: true,
  361 + localCss: true
361 }, data, parameter)); 362 }, data, parameter));
362 }); 363 });
363 } else { 364 } else {
@@ -19,11 +19,7 @@ @@ -19,11 +19,7 @@
19 {{# ../swiper}} 19 {{# ../swiper}}
20 <div class="swiper-slide"> 20 <div class="swiper-slide">
21 <a href="{{url}}"> 21 <a href="{{url}}">
22 - {{#if @first}}  
23 - <img src="{{img}}">  
24 - {{^}}  
25 - <img class="swiper-lazy" data-src="{{img}}">  
26 - {{/if}} 22 + <img class="swiper-lazy" data-src="{{image2 img width=200 height=100 q=60}}">
27 </a> 23 </a>
28 <div class="swiper-lazy-preloader"></div> 24 <div class="swiper-lazy-preloader"></div>
29 </div> 25 </div>
@@ -36,11 +36,7 @@ @@ -36,11 +36,7 @@
36 </a> 36 </a>
37 {{/if}} 37 {{/if}}
38 <a href="{{url}}"> 38 <a href="{{url}}">
39 - {{#if ../@first}}  
40 - <img src="{{img}}" alt="{{alt}}">  
41 - {{^}}  
42 - <img class="lazy" data-original="{{img}}" alt="{{alt}}">  
43 - {{/if}} 39 + <img class="lazy" data-original="{{img}}" alt="{{alt}}">
44 </a> 40 </a>
45 </div> 41 </div>
46 42
@@ -182,7 +182,7 @@ const local = { @@ -182,7 +182,7 @@ const local = {
182 })(req, res, next); 182 })(req, res, next);
183 }, 183 },
184 logout: (req, res) => { 184 logout: (req, res) => {
185 - req.session = null; 185 + req.session.reset();
186 186
187 res.clearCookie('_UID', { 187 res.clearCookie('_UID', {
188 domain: 'yohobuy.com' 188 domain: 'yohobuy.com'
@@ -215,14 +215,21 @@ const category = (req, res, next) => { @@ -215,14 +215,21 @@ const category = (req, res, next) => {
215 // 获取第一页数据做服务端渲染 215 // 获取第一页数据做服务端渲染
216 let initialData = _.assign({ 216 let initialData = _.assign({
217 gender: params.gender, 217 gender: params.gender,
218 - sort: parseInt(params.sort), 218 + sort: parseInt(params.sort) || '',
219 type: 'default', 219 type: 'default',
220 order: '0', 220 order: '0',
221 page: 1, 221 page: 1,
222 - limit: 6, 222 + limit: 12,
223 }, params); 223 }, params);
224 224
225 searchModel.getSearchData(initialData).then((firstScreenGoodsList) => { 225 searchModel.getSearchData(initialData).then((firstScreenGoodsList) => {
  226 + if (firstScreenGoodsList && firstScreenGoodsList.list) {
  227 + _.forEach(firstScreenGoodsList.list, function(item) {
  228 + if (item && item.default_images) {
  229 + item.default_images = item.default_images.replace(/quality\/80/g, 'quality/70');
  230 + }
  231 + });
  232 + }
226 res.render('search/goods-list', { 233 res.render('search/goods-list', {
227 _noLazy: true, // 首屏不使用lazyload 234 _noLazy: true, // 首屏不使用lazyload
228 module: 'product', 235 module: 'product',
@@ -39,7 +39,7 @@ const list = (req, res, next) => { @@ -39,7 +39,7 @@ const list = (req, res, next) => {
39 type: 'default', 39 type: 'default',
40 order: '0', 40 order: '0',
41 page: 1, 41 page: 1,
42 - limit: 6 42 + limit: 12
43 }, params); 43 }, params);
44 44
45 if (query) { 45 if (query) {
@@ -179,6 +179,7 @@ const search = (req, res, next) => { @@ -179,6 +179,7 @@ const search = (req, res, next) => {
179 let params = Object.assign({}, req.query); 179 let params = Object.assign({}, req.query);
180 180
181 params.isApp = req.yoho.isApp; 181 params.isApp = req.yoho.isApp;
  182 + params.limit = 24;
182 searchModel.getSearchData(params).then((result) => { 183 searchModel.getSearchData(params).then((result) => {
183 184
184 if (result && result.list && parseInt(params.page) === 1 && parseInt(params.start) > 0) { 185 if (result && result.list && parseInt(params.page) === 1 && parseInt(params.start) > 0) {
@@ -190,7 +191,8 @@ const search = (req, res, next) => { @@ -190,7 +191,8 @@ const search = (req, res, next) => {
190 res.render('search/page', { 191 res.render('search/page', {
191 layout: false, 192 layout: false,
192 new: result.list, 193 new: result.list,
193 - total: result.total 194 + total: result.total,
  195 + _noLazy: params.noLazy || false
194 }); 196 });
195 } else { 197 } else {
196 res.json(result); 198 res.json(result);
@@ -120,7 +120,7 @@ @@ -120,7 +120,7 @@
120 {{# enterStore}} 120 {{# enterStore}}
121 <div id="enter-store" class="enter-store page-block tap-hightlight"> 121 <div id="enter-store" class="enter-store page-block tap-hightlight">
122 <a class="store-logo" href="{{url}}" style=""> 122 <a class="store-logo" href="{{url}}" style="">
123 - <img class="lazy" data-original="{{image img 47 47}}" alt="{{storeName}}"> 123 + <img class="lazy" data-original="{{image2 img w=47 h=47 q=60}}" alt="{{storeName}}">
124 </a> 124 </a>
125 <a class="store-name" href="{{url}}">{{storeName}}</a> 125 <a class="store-name" href="{{url}}">{{storeName}}</a>
126 <a class="store-link" href="{{url}}">进入店铺<span class="iconfont">&#xe604;</span></a> 126 <a class="store-link" href="{{url}}">进入店铺<span class="iconfont">&#xe604;</span></a>
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 <span class="en-title">{{enTitle}}</span> 53 <span class="en-title">{{enTitle}}</span>
54 </h1> 54 </h1>
55 <div class="detail" style="width:100%"> 55 <div class="detail" style="width:100%">
56 - <img class="lazy" data-original="{{img}}" alt=""> 56 + <img class="lazy" data-original="{{image2 img q=60}}" alt="">
57 </div> 57 </div>
58 </div> 58 </div>
59 {{/measurementMethod}} 59 {{/measurementMethod}}
@@ -110,7 +110,7 @@ @@ -110,7 +110,7 @@
110 {{desc}} 110 {{desc}}
111 </p>--> 111 </p>-->
112 <div class="material-image"> 112 <div class="material-image">
113 - <img src="{{img}}" alt="材质图"> 113 + <img src="{{image2 img q=60}}" alt="材质图">
114 </div> 114 </div>
115 <div class="material-desc"> 115 <div class="material-desc">
116 {{desc}} 116 {{desc}}
@@ -126,7 +126,7 @@ @@ -126,7 +126,7 @@
126 <div class="detail table clearfix"> 126 <div class="detail table clearfix">
127 {{#list}} 127 {{#list}}
128 <div class="tip"> 128 <div class="tip">
129 - <img src="{{img}}" alt=""> 129 + <img src="{{image2 img q=60}}" alt="">
130 <span class="caption">{{caption}}</span> 130 <span class="caption">{{caption}}</span>
131 </div> 131 </div>
132 {{/list}} 132 {{/list}}
@@ -143,7 +143,7 @@ @@ -143,7 +143,7 @@
143 <div class="pro-detail"> 143 <div class="pro-detail">
144 <p>{{{desc}}}</p> 144 <p>{{{desc}}}</p>
145 {{#list}} 145 {{#list}}
146 - <img class="lazy" data-original="{{img}}" alt=""> 146 + <img class="lazy" data-original="{{image2 img q=60}}" alt="">
147 {{/list}} 147 {{/list}}
148 </div> 148 </div>
149 </div> 149 </div>
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 {{# brandWay}} 15 {{# brandWay}}
16 <div class="brand-way"> 16 <div class="brand-way">
17 <a href={{url}}> 17 <a href={{url}}>
18 - <img class="brand-thumb" src={{thumb}}> 18 + <img class="brand-thumb" src={{image2 thumb q=60}}>
19 <span class="brand-name">{{name}}</span> 19 <span class="brand-name">{{name}}</span>
20 <span class="entry"> 20 <span class="entry">
21 进入店铺 21 进入店铺
@@ -27,7 +27,7 @@ @@ -27,7 +27,7 @@
27 <!-- 品牌页面 --> 27 <!-- 品牌页面 -->
28 {{# brandHome}} 28 {{# brandHome}}
29 <div id="brand-header" class="brand-header" data-id={{id}}> 29 <div id="brand-header" class="brand-header" data-id={{id}}>
30 - <img src={{banner}}> 30 + <img src={{image2 banner q=60}}>
31 <a class="btn-intro" href="javascript:void(0);"> 31 <a class="btn-intro" href="javascript:void(0);">
32 品牌介绍 32 品牌介绍
33 </a> 33 </a>
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <!-- 基础店铺页面 --> 3 <!-- 基础店铺页面 -->
4 {{# baseShopHome}} 4 {{# baseShopHome}}
5 <div id="brand-header" class="brand-header" data-id={{id}} data-isbaseshop="{{isBaseShop}}"> 5 <div id="brand-header" class="brand-header" data-id={{id}} data-isbaseshop="{{isBaseShop}}">
6 - <img src={{banner}}> 6 + <img src={{image2 banner q=60}}>
7 <a class="btn-intro" href="javascript:void(0);"> 7 <a class="btn-intro" href="javascript:void(0);">
8 店铺介绍 8 店铺介绍
9 </a> 9 </a>
@@ -31,9 +31,9 @@ @@ -31,9 +31,9 @@
31 31
32 <!-- /tar modifield 160826 --> 32 <!-- /tar modifield 160826 -->
33 <div class="branner-top"> 33 <div class="branner-top">
34 - <img class="shop-back-img" src="{{image branerImg 640 200 1}}"> 34 + <img class="shop-back-img" src="{{image2 branerImg w=640 h=200 mode=1 q=60}}">
35 {{#if logoImg}} 35 {{#if logoImg}}
36 - <img class="logo" src="{{image logoImg 500 500}}"> 36 + <img class="logo" src="{{image2 logoImg w=500 h=500 q=60}}">
37 {{/if}} 37 {{/if}}
38 <p class="store-name">{{storeName}}</p> 38 <p class="store-name">{{storeName}}</p>
39 <div class="collect"> 39 <div class="collect">
@@ -66,7 +66,7 @@ @@ -66,7 +66,7 @@
66 <li class="swiper-slide brand-img buriedpoint" 66 <li class="swiper-slide brand-img buriedpoint"
67 data-bp-id="shop_brand_{{img}}_0"> 67 data-bp-id="shop_brand_{{img}}_0">
68 <a href="{{url}}"> 68 <a href="{{url}}">
69 - <img src="{{img}}"> 69 + <img src="{{image2 img q=60}}">
70 </a> 70 </a>
71 <p>{{brandName}}</p> 71 <p>{{brandName}}</p>
72 </li> 72 </li>
@@ -87,11 +87,11 @@ @@ -87,11 +87,11 @@
87 <li class="buriedpoint" data-bp-id="shop_spring_{{url}}_0"> 87 <li class="buriedpoint" data-bp-id="shop_spring_{{url}}_0">
88 {{#if url}} 88 {{#if url}}
89 <a href="{{url}}"> 89 <a href="{{url}}">
90 - <img src="{{springType}}"> 90 + <img src="{{image2 springType q=60}}">
91 </a> 91 </a>
92 {{^}} 92 {{^}}
93 <a href="javascript:;"> 93 <a href="javascript:;">
94 - <img src="{{springType}}"> 94 + <img src="{{image2 springType q=60}}">
95 </a> 95 </a>
96 {{/if}} 96 {{/if}}
97 </li> 97 </li>
@@ -112,7 +112,7 @@ @@ -112,7 +112,7 @@
112 </div> 112 </div>
113 <div class="product-warp"> 113 <div class="product-warp">
114 <div class="goods-container clearfix"> 114 <div class="goods-container clearfix">
115 - 115 +
116 </div> 116 </div>
117 </div> 117 </div>
118 </div> 118 </div>
1 -{{# shopIndex}}  
2 - <div class="shop-index yoho-page scroll-wrapper" id="wrapper">  
3 -  
4 - <div id="scroller">  
5 - <div id="nav-top">  
6 - {{> header}}  
7 - <!-- tar modifield 160826 -->  
8 - <input type="hidden" name="app_version" value="{{appVersion}}">  
9 - <input type="hidden" name="shop_id" value="{{shopId}}">  
10 - <input type="hidden" name="brand" value="{{brand}}">  
11 - <input type="hidden" name="favId" value="{{favId}}">  
12 - <input type="hidden" name="coverChannel" value="{{coverChannel}}">  
13 - <input type="hidden" name="uid" value="{{uid}}">  
14 -  
15 - {{#unless appVersion}}  
16 - <div class="search-area">  
17 - <div id="search-input" class="search-input">  
18 - <form id="search-form" action={{url}} method="get">  
19 - <i class="search-icon iconfont">&#xe60f;</i>  
20 - <input type="text" placeholder="搜索店铺内潮品" name="query" class="buriedpoint">  
21 - <input type="hidden" name="shop_id" value="{{shopId}}">  
22 - <input type="hidden" name="coverChannel" value="{{coverChannel}}">  
23 - <i class="clear-input iconfont hide">&#xe626;</i>  
24 - <button id="search" class="search buriedpoint" type="submit"  
25 - data-bp-id="shop_search_btn_0">搜索  
26 - </button>  
27 - </form>  
28 - </div>  
29 - </div>  
30 - {{/unless}}  
31 -  
32 - <!-- /tar modifield 160826 -->  
33 - <div class="branner-top">  
34 - <img class="shop-back-img" src="{{image branerImg 640 200 1}}">  
35 - {{#if logoImg}}  
36 - <img class="logo" src="{{image logoImg 500 500}}">  
37 - {{/if}}  
38 - <p class="store-name">{{storeName}}</p>  
39 - <div class="collect">  
40 - <div class="not-collect buriedpoint" id="collect" data-bp-id="shop_branner_collect_1"></div>  
41 - </div>  
42 - </div>  
43 - </div>  
44 -  
45 - <ul id="nav" class="nav">  
46 - <li class="active color buriedpoint" tab="home-page" data-bp-id="shop_nav_index_1">首页</li>  
47 - <li tab="new-arrival" data-bp-id="shop_nav_new_1" class="buriedpoint">上新</li>  
48 - <li tab="popularity" data-bp-id="shop_nav_populary_1" class="buriedpoint">人气</li>  
49 - <li data-bp-id="shop_nav_all_1" class="all-goods buriedpoint">  
50 - <a href="{{allGoods}}" target="_blank">全部商品</a>  
51 - </li>  
52 - </ul>  
53 -  
54 - <div id="home-page" class="main">  
55 - <div id="nav-main" class="nav-main">  
56 - <!-- 优惠卷 -->  
57 - {{#if shopCoupons}}  
58 - {{> shop/shop-coupon}}  
59 - {{/if}}  
60 -  
61 - <!-- 大导航 -->  
62 - {{#if brandList}}  
63 - <div class="multi-brands first">  
64 - <p>品牌一览</p>  
65 - <div class="multi-browse">  
66 - <ul class="swiper-wrapper">  
67 - {{#each brandList.list}}  
68 - <li class="swiper-slide brand-img buriedpoint"  
69 - data-bp-id="shop_brand_{{img}}_0">  
70 - <a href="{{url}}">  
71 - <img src="{{img}}">  
72 - </a>  
73 - <p>{{brandName}}</p>  
74 - </li>  
75 - {{/each}}  
76 - </ul>  
77 - </div>  
78 - </div>  
79 - {{/if}}  
80 -  
81 - <div class="banner-area first">  
82 - {{# bannerTop}}  
83 - {{> resources/banner-top}}  
84 - {{/ bannerTop}}  
85 - </div>  
86 -  
87 - <ul class="spring">  
88 - {{#each spring}}  
89 - <li class="buriedpoint" data-bp-id="shop_spring_{{url}}_0">  
90 - {{#if url}}  
91 - <a href="{{url}}">  
92 - <img src="{{springType}}">  
93 - </a>  
94 - {{^}}  
95 - <a href="javascript:;">  
96 - <img src="{{springType}}">  
97 - </a>  
98 - {{/if}}  
99 - </li>  
100 - {{/each}}  
101 - </ul>  
102 -  
103 - {{! 热门品类}}  
104 - <div class="first">  
105 - {{# hotCategory}}  
106 - {{> shop/hot-category}}  
107 - {{/ hotCategory}}  
108 - </div>  
109 -  
110 - <div class="popularity-title">  
111 - 人气单品  
112 - <a class="more buriedpoint" href="{{more_url}}" data-bp-id="shop_popularity_{{more_url}}">  
113 - &#xe618;</a>  
114 - </div>  
115 - <div class="product-warp">  
116 - <div class="goods-container clearfix">  
117 - {{# hotList}}  
118 - {{> common/goods}}  
119 - {{/ hotList}}  
120 - </div>  
121 - </div>  
122 - </div>  
123 -  
124 - <div class="discount-area first" id="navlist2">  
125 - <ul id="list-nav" class="home-sub-nav list-nav pos-list clearfix">  
126 - <li data-bp-id="shop_listnav_new_1" class="new active buriedpoint">  
127 - <a href="javascript:void(0);">  
128 - <span class="spanTest">最新</span>  
129 - <span class="iconfont cur">&#xe616;</span>  
130 - </a>  
131 - </li>  
132 - <li class="price buriedpoint" data-bp-id="shop_listnav_price_1">  
133 - <a href="javascript:void(0);">  
134 - <span class="spanTest">价格</span>  
135 - <span class="icon">  
136 - <i class="iconfont up cur">&#xe615;</i>  
137 - <i class="iconfont down">&#xe616;</i>  
138 - </span>  
139 - </a>  
140 - </li>  
141 - <li class="discount buriedpoint" data-bp-id="shop_listnav_discount_1">  
142 - <a href="javascript:void(0);">  
143 - <span class="spanTest">折扣</span>  
144 - <span class="icon">  
145 - <i class="iconfont up cur">&#xe615;</i>  
146 - <i class="iconfont down">&#xe616;</i>  
147 - </span>  
148 - </a>  
149 - </li>  
150 - <li class="filter buriedpoint" data-bp-id="shop_listnav_filter_1">  
151 - <a href="javascript:void(0);">  
152 - <span class="spanTest">筛选</span>  
153 - <span class="iconfont cur">&#xe613;</span>  
154 - </a>  
155 - </li>  
156 - </ul>  
157 - </div>  
158 -  
159 - <div class="discount-area first">  
160 - <div id="goods-container" class="goods-container">  
161 - <div class="new-goods container clearfix">  
162 - {{# goods}}  
163 - {{> common/goods}}  
164 - {{/ goods}}  
165 - </div>  
166 - <div class="price-goods container hide clearfix"></div>  
167 - <div class="discount-goods container hide clearfix"></div>  
168 -  
169 -  
170 - </div>  
171 - </div>  
172 - </div>  
173 - <div id="new-arrival" class="new-arrival main hide"></div>  
174 - <div id="popularity" class="popularity main hide"></div>  
175 - </div>  
176 - {{#unless appVersion}}  
177 - {{> shop/shop-footer}}  
178 - {{/unless}}  
179 - <ul id="pos-nav" class="nav hide">  
180 - <li class="active color buriedpoint" tab="home-page" data-bp-id="shop_posnav_index_1">首页</li>  
181 - <li tab="new-arrival" class="buriedpoint" data-bp-id="shop_posnav_new_1">上新</li>  
182 - <li tab="popularity" class="buriedpoint" data-bp-id="shop_posnav_populary_1">人气</li>  
183 - <li class="all-goods buriedpoint" data-bp-id="shop_posnav_all_1">  
184 - <a href="{{allGoods}}" target="_blank">全部商品</a>  
185 - </li>  
186 - </ul>  
187 -  
188 - <ul id="pos-list" class="home-sub-nav pos-list hide">  
189 - <li class="new active buriedpoint" data-bp-id="shop_poslist_new_1">  
190 - <a href="javascript:void(0);">  
191 - <span class="spanTest">最新</span>  
192 - <span class="iconfont cur">&#xe616;</span>  
193 - <b></b>  
194 - </a>  
195 - </li>  
196 - <li class="price buriedpoint" data-bp-id="shop_poslist_price_1">  
197 - <a href="javascript:void(0);">  
198 - <span class="spanTest">价格</span>  
199 - <span class="icon">  
200 - <i class="iconfont up cur">&#xe615;</i>  
201 - <i class="iconfont down">&#xe616;</i>  
202 - </span>  
203 - <b></b>  
204 - </a>  
205 - </li>  
206 - <li class="discount buriedpoint" data-bp-id="shop_poslist_discount_1">  
207 - <a href="javascript:void(0);">  
208 - <span class="spanTest">折扣</span>  
209 - <span class="icon">  
210 - <i class="iconfont up cur">&#xe615;</i>  
211 - <i class="iconfont down">&#xe616;</i>  
212 - </span>  
213 - <b></b>  
214 - </a>  
215 - </li>  
216 - <li class="filter buriedpoint" data-bp-id="shop_poslist_filter_1">  
217 - <a href="javascript:void(0);">  
218 - <span class="spanTest">筛选</span>  
219 - <span class="iconfont cur">&#xe613;</span>  
220 - </a>  
221 - </li>  
222 - </ul>  
223 - </div>  
224 - {{> common/filter}}  
225 -{{/ shopIndex}}  
226 -{{> common/query-param}}  
227 -  
228 -<input type="text" class="shopid" style="display:none" value={{shopId}}>  
@@ -6,9 +6,9 @@ @@ -6,9 +6,9 @@
6 <li class="swiper-slide"> 6 <li class="swiper-slide">
7 <a href="javascript:;"> 7 <a href="javascript:;">
8 {{#if @first}} 8 {{#if @first}}
9 - <img src="{{image img 450 600}}" alt=""> 9 + <img src="{{image2 img w=450 h=600 q=60}}" alt="">
10 {{else}} 10 {{else}}
11 - <img class="swiper-lazy" data-src="{{image img 450 600}}" alt=""> 11 + <img class="swiper-lazy" data-src="{{image2 img w=450 h=600 q=60}}" alt="">
12 {{/if}} 12 {{/if}}
13 </a> 13 </a>
14 </li> 14 </li>
@@ -26,7 +26,7 @@ @@ -26,7 +26,7 @@
26 {{^}} 26 {{^}}
27 <div class="banner-top-single"> 27 <div class="banner-top-single">
28 <a href={{url}}> 28 <a href={{url}}>
29 - <img class="img" src="{{image img 450 600}}"> 29 + <img class="img" src="{{image2 img w=450 h=600 q=60}}">
30 </a> 30 </a>
31 </div> 31 </div>
32 {{/if}} 32 {{/if}}
1 {{#data}} 1 {{#data}}
2 <div class="hot-category"> 2 <div class="hot-category">
3 {{> common/floor-header}} 3 {{> common/floor-header}}
4 - 4 +
5 {{# banner}} 5 {{# banner}}
6 <a class="category-banner" href="{{url}}"> 6 <a class="category-banner" href="{{url}}">
7 - <img class="lazy" data-original="{{src}}"> 7 + <img class="lazy" data-original="{{image2 src q=60}}">
8 </a> 8 </a>
9 {{/ banner}} 9 {{/ banner}}
10 <ul class="category-list clearfix"> 10 <ul class="category-list clearfix">
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 <li> 12 <li>
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 <div class="img-box"> 14 <div class="img-box">
15 - <img class="lazy" data-original="{{image src 140 140}}" alt=""> 15 + <img class="lazy" data-original="{{image2 src w=140 h=140 q=60}}" alt="">
16 </div> 16 </div>
17 </a> 17 </a>
18 <div class="img-cover">{{name}}</div> 18 <div class="img-cover">{{name}}</div>
@@ -20,4 +20,4 @@ @@ -20,4 +20,4 @@
20 {{/ list}} 20 {{/ list}}
21 </ul> 21 </ul>
22 </div> 22 </div>
23 -{{/data}}  
  23 +{{/data}}
  1 +// 在这个文件中配置 DNS 预读域名
  2 +
  3 +module.exports = {
  4 + hosts: [
  5 + '//cdn.yoho.cn',
  6 + '//static.yohobuy.com',
  7 + '//img10.static.yhbimg.com',
  8 + '//img11.static.yhbimg.com',
  9 + '//img12.static.yhbimg.com',
  10 + '//img13.static.yhbimg.com',
  11 + '//analytics.m.yohobuy.com',
  12 + '//search.m.yohobuy.com',
  13 + '//list.m.yohobuy.com',
  14 + '//guang.m.yohobuy.com'
  15 + ]
  16 +};
  17 +
@@ -5,8 +5,21 @@ @@ -5,8 +5,21 @@
5 const headerModel = require('../models/header'); 5 const headerModel = require('../models/header');
6 const logger = global.yoho.logger; 6 const logger = global.yoho.logger;
7 7
  8 +const forceNoCache = (res) => {
  9 + if (res) {
  10 + res.set({
  11 + 'Cache-Control': 'no-cache',
  12 + Pragma: 'no-cache',
  13 + Expires: (new Date(1900, 0, 1, 0, 0, 0, 0)).toUTCString()
  14 + });
  15 + }
  16 +};
  17 +
  18 +
8 exports.notFound = () => { 19 exports.notFound = () => {
9 return (req, res) => { 20 return (req, res) => {
  21 + forceNoCache(res);
  22 +
10 res.status(404); 23 res.status(404);
11 24
12 if (req.xhr) { 25 if (req.xhr) {
@@ -34,6 +47,8 @@ exports.notFound = () => { @@ -34,6 +47,8 @@ exports.notFound = () => {
34 */ 47 */
35 exports.serverError = () => { 48 exports.serverError = () => {
36 return (err, req, res, next) => { 49 return (err, req, res, next) => {
  50 + forceNoCache(res);
  51 +
37 logger.error(`error at path: ${req.url}`); 52 logger.error(`error at path: ${req.url}`);
38 logger.error(err); 53 logger.error(err);
39 54
  1 +'use strict';
  2 +
  3 +const dnsPrefetch = require('../../config/dns-prefetch');
  4 +
  5 +module.exports = () => {
  6 + return (req, res, next) => {
  7 + Object.assign(res.locals, {
  8 + dnsPrefetch: dnsPrefetch
  9 + });
  10 +
  11 + next();
  12 + };
  13 +};
@@ -10,10 +10,9 @@ @@ -10,10 +10,9 @@
10 <meta name="apple-mobile-web-app-status-bar-style" content="black" /> 10 <meta name="apple-mobile-web-app-status-bar-style" content="black" />
11 <meta content="telephone=no" name="format-detection" /> 11 <meta content="telephone=no" name="format-detection" />
12 <meta content="email=no" name="format-detection" /> 12 <meta content="email=no" name="format-detection" />
13 - <link rel="dns-prefetch" href="//cdn.yoho.cn">  
14 - <link rel="dns-prefetch" href="//static.yohobuy.com">  
15 - <link rel="dns-prefetch" href="//img12.static.yhbimg.com">  
16 - <link rel="dns-prefetch" href="//img13.static.yhbimg.com"> 13 + {{#dnsPrefetch.hosts}}
  14 + <link rel="dns-prefetch" href="{{this}}">
  15 + {{/dnsPrefetch.hosts}}
17 16
18 <script type="text/javascript"> 17 <script type="text/javascript">
19 var isWechat = /micromessenger/i.test(navigator.userAgent || ''); 18 var isWechat = /micromessenger/i.test(navigator.userAgent || '');
@@ -30,37 +29,24 @@ @@ -30,37 +29,24 @@
30 </script> 29 </script>
31 {{/if}} 30 {{/if}}
32 {{#if devEnv}} 31 {{#if devEnv}}
33 -  
34 -  
35 {{#if localCss}} 32 {{#if localCss}}
36 <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/common.css"> 33 <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/common.css">
37 - <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/{{module}}.{{page}}.css">  
38 - {{^}}  
39 - {{#if shopPage}}  
40 - <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/shop.css">  
41 - {{^}}  
42 - <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/index.css">  
43 {{/if}} 34 {{/if}}
44 - {{/if}}  
45 -  
46 - {{#if vue}} 35 + {{#ifor localCss vue}}
47 <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/{{module}}.{{page}}.css"> 36 <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/{{module}}.{{page}}.css">
48 - {{/if}}  
49 - {{^}}  
50 - {{#if shopPage}}  
51 - <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/shop.css">  
52 {{^}} 37 {{^}}
53 - <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/index.css">  
54 - {{/if}} 38 + <link rel="stylesheet" media="all" href="//{{devHost}}:5001/bundle/index.css">
  39 + {{/ifor}}
  40 + {{^}}
55 41
56 - {{#if localCss}} 42 + {{#if localCss }}
57 <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/common.css"> 43 <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/common.css">
58 - <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.css">  
59 {{/if}} 44 {{/if}}
60 -  
61 - {{#if vue}} 45 + {{#ifor localCss vue}}
62 <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.css"> 46 <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.css">
63 - {{/if}} 47 + {{^}}
  48 + <link rel="stylesheet" media="all" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/index.css">
  49 + {{/ifor}}
64 {{/if}} 50 {{/if}}
65 <link rel="apple-touch-icon-precomposed" href="http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png"> 51 <link rel="apple-touch-icon-precomposed" href="http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png">
66 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)"> 52 <link rel="apple-touch-startup-image" sizes="640x920" href="http://static.yohobuy.com/m/v1/img/startup/startup-retina.png" media="screen and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2)">
@@ -29,9 +29,9 @@ @@ -29,9 +29,9 @@
29 <div class="good-detail-img"> 29 <div class="good-detail-img">
30 <a class="good-thumb" href="{{url}}"> 30 <a class="good-thumb" href="{{url}}">
31 {{#if @root._noLazy}} 31 {{#if @root._noLazy}}
32 - <img src="{{image default_images 235 314}}"/> 32 + <img src="{{image2 default_images w=235 h=314 q=60}}"/>
33 {{else}} 33 {{else}}
34 - <img class="lazy" data-original="{{image default_images 235 314}}"/> 34 + <img class="lazy" data-original="{{image2 default_images w=235 h=314 q=60}}"/>
35 {{/if}} 35 {{/if}}
36 </a> 36 </a>
37 {{# is_soon_sold_out}} 37 {{# is_soon_sold_out}}
1 <div class="banner-bottom"> 1 <div class="banner-bottom">
2 <a href="{{url}}"> 2 <a href="{{url}}">
3 - <img class="lazy" data-original="{{img}}" alt=""> 3 + <img class="lazy" data-original="{{image2 img q=60}}" alt="">
4 </a> 4 </a>
5 -</div>  
  5 +</div>
@@ -5,13 +5,13 @@ @@ -5,13 +5,13 @@
5 {{#if @first}} 5 {{#if @first}}
6 <li class="swiper-slide"> 6 <li class="swiper-slide">
7 <a href="{{url}}"> 7 <a href="{{url}}">
8 - <img src="{{image src 640 240}}"> 8 + <img src="{{image2 src w=640 h=240 q=60}}">
9 </a> 9 </a>
10 </li> 10 </li>
11 {{^}} 11 {{^}}
12 <li class="swiper-slide"> 12 <li class="swiper-slide">
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 - <img class="swiper-lazy" data-src="{{image src 640 240}}"> 14 + <img class="swiper-lazy" data-src="{{image2 src w=640 h=240 q=60}}">
15 </a> 15 </a>
16 <div class="swiper-lazy-preloader"></div> 16 <div class="swiper-lazy-preloader"></div>
17 </li> 17 </li>
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 {{#data}} 2 {{#data}}
3 <div class="banner-list"> 3 <div class="banner-list">
4 <a href="{{url}}"> 4 <a href="{{url}}">
5 - <img src="{{image src 640 200}}" alt=""> 5 + <img src="{{image2 src w=640 h=200 q=60}}" alt="">
6 </a> 6 </a>
7 </div> 7 </div>
8 {{/data}} 8 {{/data}}
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 {{#data}} 12 {{#data}}
13 <li class="swiper-slide"> 13 <li class="swiper-slide">
14 <a href="{{url}}"> 14 <a href="{{url}}">
15 - <img src="{{image src 640 200}}" alt=""> 15 + <img src="{{image2 src w=640 h=200 q=60}}" alt="">
16 </a> 16 </a>
17 </li> 17 </li>
18 {{/data}} 18 {{/data}}
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <div class="creative-life"> 3 <div class="creative-life">
4 {{# big_image}} 4 {{# big_image}}
5 <a class="banner" href="{{url}}"> 5 <a class="banner" href="{{url}}">
6 - <img class="lazy" data-original="{{image src 640 403}}"> 6 + <img class="lazy" data-original="{{image2 src w=640 h=403 q=60}}">
7 </a> 7 </a>
8 {{/ big_image}} 8 {{/ big_image}}
9 <ul class="classify-list clearfix"> 9 <ul class="classify-list clearfix">
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 <li class="classify"> 11 <li class="classify">
12 <a href="{{url}}"> 12 <a href="{{url}}">
13 <div class="classify-logo"> 13 <div class="classify-logo">
14 - <img class="lazy" data-original="{{image src 191 191}}"> 14 + <img class="lazy" data-original="{{image2 src w=191 h=191 q=60}}">
15 </div> 15 </div>
16 <p class="classify-name">{{title}}</p> 16 <p class="classify-name">{{title}}</p>
17 </a> 17 </a>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 {{#list}} 6 {{#list}}
7 <li> 7 <li>
8 <a href="/product/sale/discount/detail?id={{id}}&channel={{@root.channel}}"> 8 <a href="/product/sale/discount/detail?id={{id}}&channel={{@root.channel}}">
9 - <img class="lazy" data-original="{{image cover_url 640 250}}" /> 9 + <img class="lazy" data-original="{{image2 cover_url w=640 h=250 q=60}}" />
10 <p class="discount-cont"> 10 <p class="discount-cont">
11 <span class="discount-title">{{title}}</span> 11 <span class="discount-title">{{title}}</span>
12 <span class="discount-time {{#if warn_color}}red-color{{/if}}">{{time}}</span> 12 <span class="discount-time {{#if warn_color}}red-color{{/if}}">{{time}}</span>
1 {{#data}} 1 {{#data}}
2 - <div style="background-image:url({{image src 640 26}})" class="divide-image"></div>  
3 -{{/data}}  
  2 + <div style="background-image:url({{image2 src w=640 h=26 q=60}})" class="divide-image"></div>
  3 +{{/data}}
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <div class="fav-brand-swiper"> 2 <div class="fav-brand-swiper">
3 <a class="swiper-header" href="{{link}}"> 3 <a class="swiper-header" href="{{link}}">
4 <div class="swiper-logo"> 4 <div class="swiper-logo">
5 - <img src="{{brandImg}}" alt=""/> 5 + <img src="{{image2 brandImg q=60}}" alt=""/>
6 </div> 6 </div>
7 <div class="brand-info"> 7 <div class="brand-info">
8 <span class="brand-name">{{brandName}}</span> 8 <span class="brand-name">{{brandName}}</span>
@@ -23,7 +23,7 @@ @@ -23,7 +23,7 @@
23 {{# productList}} 23 {{# productList}}
24 <li class="swiper-slide"> 24 <li class="swiper-slide">
25 <a href="{{link}}"> 25 <a href="{{link}}">
26 - <img class="swiper-lazy" data-src="{{imgUrl}}" alt=""/> 26 + <img class="swiper-lazy" data-src="{{image2 imgUrl q=60}}" alt=""/>
27 </a> 27 </a>
28 <div class="brand-product"> 28 <div class="brand-product">
29 <div class="{{# discount}}price-discount{{/ discount}}"> 29 <div class="{{# discount}}price-discount{{/ discount}}">
@@ -38,4 +38,4 @@ @@ -38,4 +38,4 @@
38 </div> 38 </div>
39 {{/if}} 39 {{/if}}
40 </div> 40 </div>
41 -{{/ hasFavBrand}}  
  41 +{{/ hasFavBrand}}
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <li data-id="{{fav_id}}" class="{{#if invalidGoods}}invalidGoods{{/if}}"> 2 <li data-id="{{fav_id}}" class="{{#if invalidGoods}}invalidGoods{{/if}}">
3 <a href="{{link}}"> 3 <a href="{{link}}">
4 <div class="fav-img-box"> 4 <div class="fav-img-box">
5 - <img src="{{imgUrl}}" alt=""/> 5 + <img src="{{iamge2 imgUrl q=60}}" alt=""/>
6 </div> 6 </div>
7 <div class="fav-info-list"> 7 <div class="fav-info-list">
8 <h2>{{title}}</h2> 8 <h2>{{title}}</h2>
@@ -30,4 +30,4 @@ @@ -30,4 +30,4 @@
30 </div> 30 </div>
31 </a> 31 </a>
32 </li> 32 </li>
33 -{{/ hasFavProduct}}  
  33 +{{/ hasFavProduct}}
1 {{> common/floor-header}} 1 {{> common/floor-header}}
2 <ul class="fine-brands clearfix"> 2 <ul class="fine-brands clearfix">
3 - {{# brands}} 3 + {{# brands}}
4 <li class="brand"> 4 <li class="brand">
5 <a href="{{url}}"> 5 <a href="{{url}}">
6 <div class="brand-logo"> 6 <div class="brand-logo">
7 - <img class="lazy" data-original="{{img}}"> 7 + <img class="lazy" data-original="{{images img q=60}}">
8 </div> 8 </div>
9 <p class="brand-name">{{name}}</p> 9 <p class="brand-name">{{name}}</p>
10 </a> 10 </a>
11 </li> 11 </li>
12 {{/ brands}} 12 {{/ brands}}
13 -</ul>  
  13 +</ul>
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 {{# banner_image}} 4 {{# banner_image}}
5 <div class="fresh-swiper"> 5 <div class="fresh-swiper">
6 <a href="{{url}}"> 6 <a href="{{url}}">
7 - <img class="lazy" data-original="{{image src 640 200}}"> 7 + <img class="lazy" data-original="{{image2 src w=640 h=200 q=60}}">
8 </a> 8 </a>
9 </div> 9 </div>
10 {{/ banner_image}} 10 {{/ banner_image}}
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 <li class="swiper-slide"> 14 <li class="swiper-slide">
15 <div class="img-box"> 15 <div class="img-box">
16 <a href="{{url}}"> 16 <a href="{{url}}">
17 - <img class="swiper-lazy" data-src="{{image default_images 235 314}}" alt=""> 17 + <img class="swiper-lazy" data-src="{{image2 default_images w=235 h=314 q=60}}" alt="">
18 </a> 18 </a>
19 <div class="swiper-lazy-preloader"></div> 19 <div class="swiper-lazy-preloader"></div>
20 </div> 20 </div>
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 {{# bigList}} 8 {{# bigList}}
9 <li class="swiper-slide"> 9 <li class="swiper-slide">
10 <a href="{{url}}"> 10 <a href="{{url}}">
11 - <img class="lazy" data-original="{{image src 640 403}}" alt="{{title}}"> 11 + <img class="lazy" data-original="{{image2 src w=640 h=403 q=60}}" alt="{{title}}">
12 </a> 12 </a>
13 </li> 13 </li>
14 {{/ bigList}} 14 {{/ bigList}}
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 {{^}} 21 {{^}}
22 <div class="category-swiper"> 22 <div class="category-swiper">
23 <a href="{{url}}"> 23 <a href="{{url}}">
24 - <img class="lazy" data-original="{{image src 640 403}}" alt="{{title}}"> 24 + <img class="lazy" data-original="{{image2 src w=640 h=403 q=60}}" alt="{{title}}">
25 </a> 25 </a>
26 </div> 26 </div>
27 {{/if}} 27 {{/if}}
@@ -33,9 +33,9 @@ @@ -33,9 +33,9 @@
33 <a href="{{url}}"> 33 <a href="{{url}}">
34 <div class="img-box"> 34 <div class="img-box">
35 {{#if @first}} 35 {{#if @first}}
36 - <img class="lazy" data-original="{{image src 258 383}}" alt=""> 36 + <img class="lazy" data-original="{{image2 src w=258 h=383 q=60}}" alt="">
37 {{^}} 37 {{^}}
38 - <img class="lazy" data-original="{{image src 191 191}}" alt=""> 38 + <img class="lazy" data-original="{{image2 src w=191 h=191 q=60}}" alt="">
39 {{/if}} 39 {{/if}}
40 </div> 40 </div>
41 <p class="category-name">{{title}}</p> 41 <p class="category-name">{{title}}</p>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <a href="{{url}}"> 6 <a href="{{url}}">
7 <div class="brand-logo"> 7 <div class="brand-logo">
8 {{!--此处不使用 Lazyload 是由于安卓 UC 10 版本加载不出来--}} 8 {{!--此处不使用 Lazyload 是由于安卓 UC 10 版本加载不出来--}}
9 - <img src="{{image src 158 174}}"> 9 + <img src="{{image2 src w=158 h=174 q=60}}">
10 </div> 10 </div>
11 <p class="brand-name">{{name}}</p> 11 <p class="brand-name">{{name}}</p>
12 </a> 12 </a>
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 15
16 <li class="more"> 16 <li class="more">
17 <a class="{{#unless image.src}}default{{/unless}}" href="{{image.url}}"> 17 <a class="{{#unless image.src}}default{{/unless}}" href="{{image.url}}">
18 - <img class="lazy" data-original="{{image image.src 320 172}}"> 18 + <img class="lazy" data-original="{{image2 image.src w=320 h=172 q=60}}">
19 </a> 19 </a>
20 </li> 20 </li>
21 </ul> 21 </ul>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 {{# list}} 6 {{# list}}
7 <li class="swiper-slide"> 7 <li class="swiper-slide">
8 <a href="{{url}}"> 8 <a href="{{url}}">
9 - <img src="{{image src 140 140}}" alt=""> 9 + <img src="{{image2 src w=140 h=140 q=60}}" alt="">
10 <span class="brands-title">{{name}}</span> 10 <span class="brands-title">{{name}}</span>
11 </a> 11 </a>
12 </li> 12 </li>
@@ -14,4 +14,4 @@ @@ -14,4 +14,4 @@
14 </ul> 14 </ul>
15 </div> 15 </div>
16 </div> 16 </div>
17 -{{/data}}  
  17 +{{/data}}
1 {{#data}} 1 {{#data}}
2 <div class="hot-category"> 2 <div class="hot-category">
3 {{> common/floor-header-more}} 3 {{> common/floor-header-more}}
4 - 4 +
5 {{# banner}} 5 {{# banner}}
6 <a class="category-banner" href="{{url}}"> 6 <a class="category-banner" href="{{url}}">
7 - <img class="lazy" data-original="{{src}}"> 7 + <img class="lazy" data-original="{{image2 src q=60}}">
8 </a> 8 </a>
9 {{/ banner}} 9 {{/ banner}}
10 <ul class="category-list clearfix"> 10 <ul class="category-list clearfix">
@@ -12,11 +12,11 @@ @@ -12,11 +12,11 @@
12 <li> 12 <li>
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 <div class="img-box"> 14 <div class="img-box">
15 - <img class="lazy" data-original="{{image src 140 140}}" alt=""> 15 + <img class="lazy" data-original="{{image2 src w=140 h=140 q=60}}" alt="">
16 </div> 16 </div>
17 </a> 17 </a>
18 </li> 18 </li>
19 {{/ list}} 19 {{/ list}}
20 </ul> 20 </ul>
21 </div> 21 </div>
22 -{{/data}}  
  22 +{{/data}}
@@ -2,12 +2,12 @@ @@ -2,12 +2,12 @@
2 <div class="hot-single"> 2 <div class="hot-single">
3 {{> common/floor-header-more}} 3 {{> common/floor-header-more}}
4 {{> resources/new-floor-banner}} 4 {{> resources/new-floor-banner}}
5 - <div class="hot-single-goods-list" {{#background}}style="background-image: url({{image src 640 330}})"{{/background}}> 5 + <div class="hot-single-goods-list" {{#background}}style="background-image: url({{image2 src w=640 h=330 q=60}})"{{/background}}>
6 <ul> 6 <ul>
7 {{#list}} 7 {{#list}}
8 <li class="hot-single-goods"> 8 <li class="hot-single-goods">
9 <a href="//m.yohobuy.com/product/show_{{product_skn}}"> 9 <a href="//m.yohobuy.com/product/show_{{product_skn}}">
10 - <img src="{{image default_images 153 206}}" alt="goods" class="goods-pic"> 10 + <img src="{{image2 default_images w=153 h=206 q=60}}" alt="goods" class="goods-pic">
11 <div class="goods-info"> 11 <div class="goods-info">
12 <h3 class="price">&yen; {{sales_price}}</h3> 12 <h3 class="price">&yen; {{sales_price}}</h3>
13 <p class="view-num">{{view_num}}</p> 13 <p class="view-num">{{view_num}}</p>
@@ -19,4 +19,4 @@ @@ -19,4 +19,4 @@
19 </ul> 19 </ul>
20 </div> 20 </div>
21 </div> 21 </div>
22 -{{/data}}  
  22 +{{/data}}
1 {{#appIconList}} 1 {{#appIconList}}
2 -<div class="icons-wrapper" {{#if back_image}} style="background-image:url({{image back_image 640 360}})" {{/if}}> 2 +<div class="icons-wrapper" {{#if back_image}} style="background-image:url({{image2 back_image w=640 h=360 q=60}})" {{/if}}>
3 <ul class="icons-list clearfix"> 3 <ul class="icons-list clearfix">
4 {{#data}} 4 {{#data}}
5 - <li class="icons-item item-{{../number}}"><a href="{{url}}" class="imagebar"><img src="{{image src 98 98}}" alt=""></a><a href="{{url}}" class="linkbar">{{title}}</a></li> 5 + <li class="icons-item item-{{../number}}"><a href="{{url}}" class="imagebar"><img src="{{image2 src w=98 h=98 q=60}}" alt=""></a><a href="{{url}}" class="linkbar">{{title}}</a></li>
6 {{/data}} 6 {{/data}}
7 </ul> 7 </ul>
8 </div> 8 </div>
1 { 1 {
2 "name": "m-yohobuy-node", 2 "name": "m-yohobuy-node",
3 - "version": "5.2.11", 3 + "version": "5.2.12",
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": {
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 "body-parser": "^1.15.2", 22 "body-parser": "^1.15.2",
23 "captchapng": "0.0.1", 23 "captchapng": "0.0.1",
24 "cheerio": "^0.22.0", 24 "cheerio": "^0.22.0",
  25 + "client-sessions": "^0.7.0",
25 "compression": "^1.6.2", 26 "compression": "^1.6.2",
26 "connect-multiparty": "^2.0.0", 27 "connect-multiparty": "^2.0.0",
27 "cookie-parser": "^1.4.3", 28 "cookie-parser": "^1.4.3",
@@ -93,7 +94,7 @@ @@ -93,7 +94,7 @@
93 "yoho-handlebars": "^4.0.5", 94 "yoho-handlebars": "^4.0.5",
94 "yoho-iscroll": "^5.2.0", 95 "yoho-iscroll": "^5.2.0",
95 "yoho-jquery": "^2.2.4", 96 "yoho-jquery": "^2.2.4",
96 - "yoho-jquery-lazyload": "^1.9.8", 97 + "yoho-jquery-lazyload": "^1.9.9",
97 "yoho-jquery-qrcode": "^0.14.0", 98 "yoho-jquery-qrcode": "^0.14.0",
98 "yoho-mlellipsis": "0.0.3", 99 "yoho-mlellipsis": "0.0.3",
99 "yoho-qs": "^1.0.1", 100 "yoho-qs": "^1.0.1",
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 <div class="infos {{#if @root.tickets}} tickets-info {{/if}}"> 4 <div class="infos {{#if @root.tickets}} tickets-info {{/if}}">
5 <div class="basic-info" > 5 <div class="basic-info" >
6 {{#each thumbs}} 6 {{#each thumbs}}
7 - <img class="thumb {{#unless @first}}hide{{/unless}}" src="{{img}}"> 7 + <img class="thumb {{#unless @first}}hide{{/unless}}" src="{{image2 img q=60}}">
8 {{/each}} 8 {{/each}}
9 <div class="text-info"> 9 <div class="text-info">
10 <p class="name">{{name}}</p> 10 <p class="name">{{name}}</p>
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 <ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}"> 30 <ul id="{{id}}" data-index="{{@index}}" class="size-row clearfix {{#unless @first}}hide{{/unless}}">
31 {{#each color}} 31 {{#each color}}
32 <li class="block {{#if chosed}} chosed{{/if}} {{#unless colorNum}} zero-stock{{/unless}}" data-num="{{colorNum}}">{{name}}</li> 32 <li class="block {{#if chosed}} chosed{{/if}} {{#unless colorNum}} zero-stock{{/unless}}" data-num="{{colorNum}}">{{name}}</li>
33 - {{/each}} 33 + {{/each}}
34 </ul> 34 </ul>
35 {{/each}} 35 {{/each}}
36 </div> 36 </div>
@@ -116,4 +116,4 @@ @@ -116,4 +116,4 @@
116 <input type="hidden" name="productSku" id="productSku"> 116 <input type="hidden" name="productSku" id="productSku">
117 <input type="hidden" name="buyNumber" id="buyNumber"> 117 <input type="hidden" name="buyNumber" id="buyNumber">
118 </form> 118 </form>
119 -{{/ tickets}}  
  119 +{{/ tickets}}
@@ -5,13 +5,13 @@ @@ -5,13 +5,13 @@
5 {{#if @first}} 5 {{#if @first}}
6 <li class="swiper-slide"> 6 <li class="swiper-slide">
7 <a href="{{url}}"> 7 <a href="{{url}}">
8 - <img src="{{image src 640 240}}"> 8 + <img src="{{image2 src w=640 h=240 q=60}}">
9 </a> 9 </a>
10 </li> 10 </li>
11 {{^}} 11 {{^}}
12 <li class="swiper-slide"> 12 <li class="swiper-slide">
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 - <img class="swiper-lazy" data-src="{{image src 640 240}}"> 14 + <img class="swiper-lazy" data-src="{{image2 src w=640 h=240 q=60}}">
15 </a> 15 </a>
16 <div class="swiper-lazy-preloader"></div> 16 <div class="swiper-lazy-preloader"></div>
17 </li> 17 </li>
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 {{#data}} 3 {{#data}}
4 <div class="banner-list"> 4 <div class="banner-list">
5 <a href="{{url}}"> 5 <a href="{{url}}">
6 - <img src="{{image src 640 200}}" alt=""> 6 + <img src="{{image2 src w=640 h=200 q=60}}" alt="">
7 </a> 7 </a>
8 </div> 8 </div>
9 {{/data}} 9 {{/data}}
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 {{#data}} 12 {{#data}}
13 <li class="swiper-slide"> 13 <li class="swiper-slide">
14 <a href="{{url}}"> 14 <a href="{{url}}">
15 - <img src="{{image src 640 200}}" alt=""> 15 + <img src="{{image2 src w=640 h=200 q=60}}" alt="">
16 </a> 16 </a>
17 </li> 17 </li>
18 {{/data}} 18 {{/data}}
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <div class="creative-life"> 3 <div class="creative-life">
4 {{# big_image}} 4 {{# big_image}}
5 <a class="banner" href="{{url}}"> 5 <a class="banner" href="{{url}}">
6 - <img class="lazy" data-original="{{image src 640 403}}"> 6 + <img class="lazy" data-original="{{image2 src w=640 h=403 q=60}}">
7 </a> 7 </a>
8 {{/ big_image}} 8 {{/ big_image}}
9 <ul class="classify-list clearfix"> 9 <ul class="classify-list clearfix">
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 <li class="classify"> 11 <li class="classify">
12 <a href="{{url}}"> 12 <a href="{{url}}">
13 <div class="classify-logo"> 13 <div class="classify-logo">
14 - <img class="lazy" data-original="{{image src 191 191}}"> 14 + <img class="lazy" data-original="{{image2 src w=191 h=191 q=60}}">
15 </div> 15 </div>
16 <p class="classify-name">{{title}}</p> 16 <p class="classify-name">{{title}}</p>
17 </a> 17 </a>
1 {{#data}} 1 {{#data}}
2 - <div style="background-image:url({{image src 640 30}})" class="divide-image"></div>  
3 -{{/data}}  
  2 + <div style="background-image:url({{image2 src w=640 h=30 q=60}})" class="divide-image"></div>
  3 +{{/data}}
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 {{# banner_image}} 4 {{# banner_image}}
5 <div class="fresh-swiper"> 5 <div class="fresh-swiper">
6 <a href="{{url}}"> 6 <a href="{{url}}">
7 - <img class="lazy" data-original="{{image src 640 200}}"> 7 + <img class="lazy" data-original="{{image2 src w=640 h=200 q=60}}">
8 </a> 8 </a>
9 </div> 9 </div>
10 {{/ banner_image}} 10 {{/ banner_image}}
@@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
14 <li class="swiper-slide"> 14 <li class="swiper-slide">
15 <div class="img-box"> 15 <div class="img-box">
16 <a href="{{url}}"> 16 <a href="{{url}}">
17 - <img src="{{image default_images 235 314}}" alt=""> 17 + <img src="{{image2 default_images w=235 h=314 q=60}}" alt="">
18 </a> 18 </a>
19 <div class="swiper-lazy-preloader"></div> 19 <div class="swiper-lazy-preloader"></div>
20 </div> 20 </div>
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 {{# bigList}} 8 {{# bigList}}
9 <li class="swiper-slide"> 9 <li class="swiper-slide">
10 <a href="{{url}}"> 10 <a href="{{url}}">
11 - <img class="swiper-lazy" data-src="{{image src 640 403}}" alt="{{title}}"> 11 + <img class="swiper-lazy" data-src="{{image2 src w=640 h=403 q=60}}" alt="{{title}}">
12 </a> 12 </a>
13 </li> 13 </li>
14 {{/ bigList}} 14 {{/ bigList}}
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 {{^}} 21 {{^}}
22 <div class="category-swiper"> 22 <div class="category-swiper">
23 <a href="{{url}}"> 23 <a href="{{url}}">
24 - <img src="{{image src 640 403}}" alt="{{title}}"> 24 + <img src="{{image2 src w=640 h=403 q=60}}" alt="{{title}}">
25 </a> 25 </a>
26 </div> 26 </div>
27 {{/if}} 27 {{/if}}
@@ -33,9 +33,9 @@ @@ -33,9 +33,9 @@
33 <a href="{{url}}"> 33 <a href="{{url}}">
34 <div class="img-box"> 34 <div class="img-box">
35 {{#if @first}} 35 {{#if @first}}
36 - <img class="lazy" data-original="{{image src 258 383}}" alt=""> 36 + <img class="lazy" data-original="{{image2 src w=258 h=383 q=60}}" alt="">
37 {{^}} 37 {{^}}
38 - <img class="lazy" data-original="{{image src 191 191}}" alt=""> 38 + <img class="lazy" data-original="{{image2 src w=191 h=191 q=60}}" alt="">
39 {{/if}} 39 {{/if}}
40 </div> 40 </div>
41 <p class="category-name">{{title}}</p> 41 <p class="category-name">{{title}}</p>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <a href="{{url}}"> 6 <a href="{{url}}">
7 <div class="brand-logo"> 7 <div class="brand-logo">
8 {{!--此处不使用 Lazyload 是由于安卓 UC 10 版本加载不出来--}} 8 {{!--此处不使用 Lazyload 是由于安卓 UC 10 版本加载不出来--}}
9 - <img src="{{image src 158 174}}"> 9 + <img src="{{image2 src w=158 h=174 q=60}}">
10 </div> 10 </div>
11 <p class="brand-name">{{name}}</p> 11 <p class="brand-name">{{name}}</p>
12 </a> 12 </a>
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 15
16 <li class="more"> 16 <li class="more">
17 <a class="{{#unless image.src}}default{{/unless}}" href="{{image.url}}"> 17 <a class="{{#unless image.src}}default{{/unless}}" href="{{image.url}}">
18 - <img src="{{image image.src 320 172}}"> 18 + <img src="{{image2 image.src w=320 h=172 q=60}}">
19 </a> 19 </a>
20 </li> 20 </li>
21 </ul> 21 </ul>
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 {{# list}} 6 {{# list}}
7 <li class="swiper-slide"> 7 <li class="swiper-slide">
8 <a href="{{url}}"> 8 <a href="{{url}}">
9 - <img src="{{image src 140 140}}" alt=""> 9 + <img src="{{image2 src w=140 h=140 q=60}}" alt="">
10 <span class="brands-title">{{name}}</span> 10 <span class="brands-title">{{name}}</span>
11 </a> 11 </a>
12 </li> 12 </li>
@@ -14,4 +14,4 @@ @@ -14,4 +14,4 @@
14 </ul> 14 </ul>
15 </div> 15 </div>
16 </div> 16 </div>
17 -{{/data}}  
  17 +{{/data}}
1 {{#data}} 1 {{#data}}
2 <div class="hot-category"> 2 <div class="hot-category">
3 {{> ../common/floor-header-more}} 3 {{> ../common/floor-header-more}}
4 - 4 +
5 {{# banner}} 5 {{# banner}}
6 <a class="category-banner" href="{{url}}"> 6 <a class="category-banner" href="{{url}}">
7 - <img class="lazy" data-original="{{src}}"> 7 + <img class="lazy" data-original="{{image2 src q=60}}">
8 </a> 8 </a>
9 {{/ banner}} 9 {{/ banner}}
10 <ul class="category-list clearfix"> 10 <ul class="category-list clearfix">
@@ -12,11 +12,11 @@ @@ -12,11 +12,11 @@
12 <li> 12 <li>
13 <a href="{{url}}"> 13 <a href="{{url}}">
14 <div class="img-box"> 14 <div class="img-box">
15 - <img class="lazy" data-original="{{image src 140 140}}" alt=""> 15 + <img class="lazy" data-original="{{image2 src w=140 h=140 q=60}}" alt="">
16 </div> 16 </div>
17 </a> 17 </a>
18 </li> 18 </li>
19 {{/ list}} 19 {{/ list}}
20 </ul> 20 </ul>
21 </div> 21 </div>
22 -{{/data}}  
  22 +{{/data}}
@@ -2,12 +2,12 @@ @@ -2,12 +2,12 @@
2 <div class="hot-single"> 2 <div class="hot-single">
3 {{> ../common/floor-header-more}} 3 {{> ../common/floor-header-more}}
4 {{> ./new-floor-banner}} 4 {{> ./new-floor-banner}}
5 - <div class="hot-single-goods-list" {{#background}}style="background-image: url({{image src 640 200}})"{{/background}}> 5 + <div class="hot-single-goods-list" {{#background}}style="background-image: url({{image2 src w=640 h=200 q=60}})"{{/background}}>
6 <ul> 6 <ul>
7 {{#list}} 7 {{#list}}
8 <li class="hot-single-goods"> 8 <li class="hot-single-goods">
9 <a href="//m.yohobuy.com/product/show_{{product_skn}}"> 9 <a href="//m.yohobuy.com/product/show_{{product_skn}}">
10 - <img src="{{image default_images 153 206}}" alt="goods" class="goods-pic"> 10 + <img src="{{image2 default_images w=153 h=206 q=60}}" alt="goods" class="goods-pic">
11 <div class="goods-info"> 11 <div class="goods-info">
12 <h3 class="price">&yen; {{sales_price}}</h3> 12 <h3 class="price">&yen; {{sales_price}}</h3>
13 <p class="view-num">{{view_num}}</p> 13 <p class="view-num">{{view_num}}</p>
@@ -19,4 +19,4 @@ @@ -19,4 +19,4 @@
19 </ul> 19 </ul>
20 </div> 20 </div>
21 </div> 21 </div>
22 -{{/data}}  
  22 +{{/data}}
1 {{#appIconList}} 1 {{#appIconList}}
2 -<div class="icons-wrapper" {{#if back_image}} style="background-image:url({{back_image}})" {{/if}}> 2 +<div class="icons-wrapper" {{#if back_image}} style="background-image:url({{image2 back_image q=60}})" {{/if}}>
3 <ul class="icons-list clearfix"> 3 <ul class="icons-list clearfix">
4 {{#data}} 4 {{#data}}
5 - <li class="icons-item item-{{../number}}"><a href="{{url}}" class="imagebar"><img src="{{image src 98 98}}" alt=""></a><a href="{{url}}" class="linkbar">{{title}}</a></li> 5 + <li class="icons-item item-{{../number}}"><a href="{{url}}" class="imagebar"><img src="{{image2 src w=98 h=98 q=60}}" alt=""></a><a href="{{url}}" class="linkbar">{{title}}</a></li>
6 {{/data}} 6 {{/data}}
7 </ul> 7 </ul>
8 </div> 8 </div>
@@ -3,28 +3,28 @@ @@ -3,28 +3,28 @@
3 {{> ../common/floor-header-more}} 3 {{> ../common/floor-header-more}}
4 {{#list.[0]}} 4 {{#list.[0]}}
5 <a href="{{url}}" class="float-container"> 5 <a href="{{url}}" class="float-container">
6 - <img class="lazy left" data-original="{{image src 268 360}}" alt="left"> 6 + <img class="lazy left" data-original="{{image2 src w=268 h=360 q=60}}" alt="left">
7 </a> 7 </a>
8 {{/list.[0]}} 8 {{/list.[0]}}
9 {{#list.[1]}} 9 {{#list.[1]}}
10 <a href="{{url}}" class="float-container"> 10 <a href="{{url}}" class="float-container">
11 - <img class="lazy right" data-original="{{image src 186 180}}" alt="right1"> 11 + <img class="lazy right" data-original="{{image2 src w=186 h=180 q=60}}" alt="right1">
12 </a> 12 </a>
13 {{/list.[1]}} 13 {{/list.[1]}}
14 {{#list.[2]}} 14 {{#list.[2]}}
15 <a href="{{url}}" class="float-container"> 15 <a href="{{url}}" class="float-container">
16 - <img class="lazy right" data-original="{{image src 186 180}}" alt="right2"> 16 + <img class="lazy right" data-original="{{image2 src w=186 h=180 q=60}}" alt="right2">
17 </a> 17 </a>
18 {{/list.[2]}} 18 {{/list.[2]}}
19 {{#list.[3]}} 19 {{#list.[3]}}
20 <a href="{{url}}" class="float-container"> 20 <a href="{{url}}" class="float-container">
21 - <img class="lazy right" data-original="{{image src 186 180}}" alt="right3"> 21 + <img class="lazy right" data-original="{{image2 src w=186 h=180 q=60}}" alt="right3">
22 </a> 22 </a>
23 {{/list.[3]}} 23 {{/list.[3]}}
24 {{#list.[4]}} 24 {{#list.[4]}}
25 <a href="{{url}}" class="float-container"> 25 <a href="{{url}}" class="float-container">
26 - <img class="lazy right" data-original="{{image src 186 180}}" alt="right4"> 26 + <img class="lazy right" data-original="{{image2 src w=186 h=180 q=60}}" alt="right4">
27 </a> 27 </a>
28 {{/list.[4]}} 28 {{/list.[4]}}
29 </div> 29 </div>
30 -{{/data}}  
  30 +{{/data}}
1 {{#data}} 1 {{#data}}
2 <div class="best-week"> 2 <div class="best-week">
3 {{> ../common/floor-header-more}} 3 {{> ../common/floor-header-more}}
4 - 4 +
5 <ul class="six-lines-floor clearfix"> 5 <ul class="six-lines-floor clearfix">
6 {{# list}} 6 {{# list}}
7 <li> 7 <li>
8 <a href="{{url}}"> 8 <a href="{{url}}">
9 <div class="img-box"> 9 <div class="img-box">
10 - <img class="lazy" data-original="{{image src 320 154}}" alt=""> 10 + <img class="lazy" data-original="{{image2 src w=320 h=154 q=60}}" alt="">
11 </div> 11 </div>
12 </a> 12 </a>
13 </li> 13 </li>
14 {{/ list}} 14 {{/ list}}
15 </ul> 15 </ul>
16 </div> 16 </div>
17 -{{/data}}  
  17 +{{/data}}
@@ -3,6 +3,10 @@ @@ -3,6 +3,10 @@
3 * @author: liangzhifeng<zhifeng.liang@yoho.cn> 3 * @author: liangzhifeng<zhifeng.liang@yoho.cn>
4 * @date: 2015/10/12 4 * @date: 2015/10/12
5 */ 5 */
  6 +// 加载css
  7 +require('channel/home.page.css');
  8 +
  9 +
6 var $ = require('yoho-jquery'), 10 var $ = require('yoho-jquery'),
7 Swiper = require('yoho-swiper'), 11 Swiper = require('yoho-swiper'),
8 lazyLoad = require('yoho-jquery-lazyload'), 12 lazyLoad = require('yoho-jquery-lazyload'),
  1 +module.exports = function(url, opts) {
  2 + if (url) {
  3 + let params = opts.hash;
  4 + let urls = url.split('?');
  5 + let query = urls[1] || '';
  6 + let uri = urls[0];
  7 +
  8 + if (uri.indexOf('http:') === 0) {
  9 + uri = uri.replace('http:', '');
  10 + }
  11 +
  12 + if (query) {
  13 + query = query.replace(/{width}/g, params.w).replace(/{height}/g, params.h).replace(/{mode}/g, (params.mode || 2));
  14 +
  15 + if (query.indexOf('imageView2') === 0) {
  16 + if (params.q && query.indexOf('/q/') > 0) {
  17 + query = query.replace(/\/q\/\d+/g, '/q/' + params.q);
  18 + } else {
  19 + query += '/q/' + params.q;
  20 + }
  21 + } else if (query.indexOf('imageMogr2') === 0) {
  22 + if (params.q && query.indexOf('/quality/') > 0) {
  23 + query = query.replace(/\/quality\/\d+/g, '/quality/' + params.q);
  24 + } else {
  25 + query += '/quality/' + params.q;
  26 + }
  27 + }
  28 + } else {
  29 + query = 'imageView2/2/interlace/1/q/' + (params.q || 75);
  30 + }
  31 + return uri + '?' + query;
  32 + } else {
  33 + return url;
  34 + }
  35 +};
@@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@
3 * @author: xuqi<qi.xu@yoho.cn> 3 * @author: xuqi<qi.xu@yoho.cn>
4 * @date: 2015/10/10 4 * @date: 2015/10/10
5 */ 5 */
  6 +require('guang/index-editor.page.css');
  7 +
6 8
7 var $ = require('yoho-jquery'); 9 var $ = require('yoho-jquery');
8 10
@@ -3,6 +3,9 @@ @@ -3,6 +3,9 @@
3 * @author: xuqi<qi.xu@yoho.cn> 3 * @author: xuqi<qi.xu@yoho.cn>
4 * @date: 2015/10/10 4 * @date: 2015/10/10
5 */ 5 */
  6 +require('guang/index.page.css');
  7 +
  8 +
6 9
7 var $ = require('yoho-jquery'); 10 var $ = require('yoho-jquery');
8 11
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 * @author: xuqi<qi.xu@yoho.cn> 3 * @author: xuqi<qi.xu@yoho.cn>
4 * @date: 2015/10/13 4 * @date: 2015/10/13
5 */ 5 */
  6 +require('guang/info-index.page.css');
6 7
7 var $ = require('yoho-jquery'), 8 var $ = require('yoho-jquery'),
8 ellipsis = require('yoho-mlellipsis'), 9 ellipsis = require('yoho-mlellipsis'),
@@ -362,7 +362,8 @@ function search(opt) { @@ -362,7 +362,8 @@ function search(opt) {
362 params = { 362 params = {
363 type: navType, 363 type: navType,
364 order: nav.order, 364 order: nav.order,
365 - page: page 365 + page: page,
  366 + noLazy: true
366 }; 367 };
367 368
368 if (shopId) { 369 if (shopId) {
@@ -454,8 +455,8 @@ function search(opt) { @@ -454,8 +455,8 @@ function search(opt) {
454 } 455 }
455 456
456 if (firstScreen) { 457 if (firstScreen) {
457 - // 如果首屏加载了,则去掉6条记录  
458 - params.start = 6; 458 + // 如果首屏加载了,则去掉12条记录
  459 + params.start = 12;
459 } 460 }
460 461
461 $.extend(setting, defaultOpt, params); 462 $.extend(setting, defaultOpt, params);
@@ -988,9 +989,9 @@ $listNav.on('touchend touchcancel', function(e) { @@ -988,9 +989,9 @@ $listNav.on('touchend touchcancel', function(e) {
988 989
989 function scrollHandler() { 990 function scrollHandler() {
990 991
991 - // 当scroll到1/4$goodsContainer高度后继续请求下一页数据 992 + // 当scroll到1/2$goodsContainer高度后继续请求下一页数据
992 if ($(window).scrollTop() + winH > 993 if ($(window).scrollTop() + winH >
993 - $(document).height() - 0.25 * $goodsContainer.height()) { 994 + $(document).height() - 0.5 * $goodsContainer.height()) {
994 search(); 995 search();
995 } 996 }
996 } 997 }
@@ -1073,10 +1074,15 @@ if ($brandHeader.length > 0) { @@ -1073,10 +1074,15 @@ if ($brandHeader.length > 0) {
1073 }); 1074 });
1074 } 1075 }
1075 1076
1076 -// 初始请求最新第一页数据  
1077 -setTimeout(function() {  
1078 - search();  
1079 -}, 500); 1077 +var initialData = false;
  1078 +
  1079 +$(window).one('scroll', function() {
  1080 + // 初始请求最新第一页数据
  1081 + if (!initialData) {
  1082 + search();
  1083 + initialData = true;
  1084 + }
  1085 +});
1080 1086
1081 $listNav.on('touchstart', 'li', function() { 1087 $listNav.on('touchstart', 'li', function() {
1082 $listNav.find('li').removeClass('bytouch'); 1088 $listNav.find('li').removeClass('bytouch');
@@ -40,7 +40,6 @@ shopCoupon = { @@ -40,7 +40,6 @@ shopCoupon = {
40 $.ajax({ 40 $.ajax({
41 method: 'GET', 41 method: 'GET',
42 url: _url, 42 url: _url,
43 - async: false,  
44 data: { 43 data: {
45 shopId: that.common.shopId, 44 shopId: that.common.shopId,
46 brandId: that.common.brandId, 45 brandId: that.common.brandId,
@@ -126,7 +125,6 @@ shopCoupon = { @@ -126,7 +125,6 @@ shopCoupon = {
126 $.ajax({ 125 $.ajax({
127 method: 'POST', 126 method: 'POST',
128 url: '/product/index/userCoupon', 127 url: '/product/index/userCoupon',
129 - async: false,  
130 data: { 128 data: {
131 couponID: code, 129 couponID: code,
132 uid: $self.common.uid 130 uid: $self.common.uid
  1 + @import "../layout/_loading.css";
  2 + @import "../layout/_swiper.css";
  3 +
  4 + @import "../common/_filter.css";
  5 + @import "../common/_good.css";
  6 + @import "../common/_loading.css";
  7 + @import "../common/_suspend-home.css";
  8 +
  9 + @import "_banner-bottom.css";
  10 + @import "_banner-center.css";
  11 + @import "_banner-top.css";
  12 + @import "_brand.css";
  13 + @import "_cate.css";
  14 + @import "_creative-life.css";
  15 + @import "_divide-image.css";
  16 + @import "_fine-brands.css";
  17 + @import "_floor-header.css";
  18 + @import "_footer-tab.css";
  19 + @import "_fresh-only.css";
  20 + @import "_goods-category.css";
  21 + @import "_home-header.css";
  22 + @import "_home.css";
  23 + @import "_hot-brands.css";
  24 + @import "_hot-category.css";
  25 + @import "_hot-single.css";
  26 + @import "_icons-enter.css";
  27 + @import "_index.css";
  28 + @import "_left-right.css";
  29 + @import "_maybe-like.css";
  30 + @import "_new-first.css";
  31 + @import "_new-user-floor.css";
  32 + @import "_notice.css";
  33 + @import "_plus-star.css";
  34 + @import "_sale-floor.css";
  35 + @import "_search-input.css";
  36 + @import "_search.css";
  37 + @import "_seckill.css";
  38 + @import "_shop-recommand.css";
  39 + @import "_side-nav.css";
  40 + @import "_six-lines-floor.css";
  41 + @import "_three-picture.css";
  42 + @import "_thumb-row.css";
  43 + @import "_trend-topics.css";
  44 + @import "_trend-tops.css";
  45 + @import "_trendsetter-collocation.css";
  46 + @import "_two-column-goods.css";
  47 + @import "_vip-only.css";
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 @import "layout/common"; 6 @import "layout/common";
7 @import "layout/header"; 7 @import "layout/header";
8 @import "layout/footer"; 8 @import "layout/footer";
  9 +@import "layout/utils";
9 10
10 @import "common/data-bind"; 11 @import "common/data-bind";
11 @import "common/suspend-cart"; 12 @import "common/suspend-cart";
@@ -38,6 +38,7 @@ @@ -38,6 +38,7 @@
38 img { 38 img {
39 display: block; 39 display: block;
40 width: 100%; 40 width: 100%;
  41 + min-height: 400px;
41 } 42 }
42 } 43 }
43 44
@@ -78,7 +79,7 @@ @@ -78,7 +79,7 @@
78 &.tip, &.special-topic { 79 &.tip, &.special-topic {
79 background-image: url('/guang/info/tip.png'); 80 background-image: url('/guang/info/tip.png');
80 } 81 }
81 - 82 +
82 &.topic { 83 &.topic {
83 background-image: url('/guang/info/topic.png'); 84 background-image: url('/guang/info/topic.png');
84 } 85 }
  1 + @import "../layout/_loading.css";
  2 + @import "../layout/_swiper.css";
  3 +
  4 + @import "../common/_loading.css";
  5 + @import "../common/_suspend-home.css";
  6 +
  7 + @import "_info-list.css";
  8 + @import "_info.css";
  9 + @import "_tvls.css";
  1 +@import "../layout/_loading.css";
  2 +@import "../layout/_swiper.css";
  3 +
  4 +@import "../common/_good.css";
  5 +@import "../common/_loading.css";
  6 +@import "../common/_suspend-home.css";
  7 +
  8 +@import "../channel/_footer-tab.css";
  9 +
  10 +@import "_info-list.css";
  11 +@import "_info.css";
  12 +@import "_tvls.css";
  1 +@import "../common/_filter.css";
  2 +@import "../common/_good.css";
  3 +@import "../common/_loading.css";
  4 +@import "../common/_suspend-home.css";
  5 +
  6 +@import "_detail.css";
  7 +@import "_tvls.css";
  1 +'use strict';
  2 +
1 const url = require('url'); 3 const url = require('url');
2 const config = require('../config/common'); 4 const config = require('../config/common');
3 const assetUrl = config.assetUrl; 5 const assetUrl = config.assetUrl;
@@ -5,5 +7,58 @@ const assetUrl = config.assetUrl; @@ -5,5 +7,58 @@ const assetUrl = config.assetUrl;
5 module.exports = { 7 module.exports = {
6 imgSrc: function(imgSrc) { 8 imgSrc: function(imgSrc) {
7 return url.resolve(assetUrl, imgSrc); 9 return url.resolve(assetUrl, imgSrc);
  10 + },
  11 + image2: function(url, opts) {
  12 + if (url) {
  13 + let params = opts.hash;
  14 + let urls = url.split('?');
  15 + let query = urls[1] || '';
  16 + let uri = urls[0];
  17 +
  18 + if (uri.indexOf('http:') === 0) {
  19 + uri = uri.replace('http:', '');
  20 + }
  21 +
  22 + if (query) {
  23 + query = query.replace(/{width}/g, params.w).replace(/{height}/g, params.h).replace(/{mode}/g, (params.mode || 2));
  24 +
  25 + if (query.indexOf('imageView2') === 0) {
  26 + if (params.q && query.indexOf('/q/') > 0) {
  27 + query = query.replace(/\/q\/\d+/g, '/q/' + params.q);
  28 + } else {
  29 + query += '/q/' + params.q;
  30 + }
  31 + } else if (query.indexOf('imageMogr2') === 0) {
  32 + if (params.q && query.indexOf('/quality/') > 0) {
  33 + query = query.replace(/\/quality\/\d+/g, '/quality/' + params.q);
  34 + } else {
  35 + query += '/quality/' + params.q;
  36 + }
  37 + }
  38 + } else {
  39 + query = 'imageView2/2/interlace/1/q/' + (params.q || 75);
  40 + }
  41 + return uri + '?' + query;
  42 + } else {
  43 + return url;
  44 + }
  45 + },
  46 + ifor: function() {
  47 + var args = Array.prototype.slice.call(arguments);
  48 + var opt = args[args.length - 1];
  49 + var isTrue = false;
  50 +
  51 + for (var i = 0; i < args.length - 1; i++) {
  52 + if (args[i]) {
  53 + isTrue = true;
  54 + break;
  55 + }
  56 + }
  57 +
  58 + if (isTrue) {
  59 + return opt.fn(this);
  60 + } else {
  61 + return opt.inverse(this);
  62 + }
8 } 63 }
9 }; 64 };