Authored by ccbikai

Merge branch 'develop'

@@ -31,6 +31,6 @@ app.use(cookieParser()); @@ -31,6 +31,6 @@ app.use(cookieParser());
31 require('./dispatch')(app); 31 require('./dispatch')(app);
32 32
33 // listener 33 // listener
34 -app.listen(3000, function() { 34 +app.listen(3001, function() {
35 console.log('yohobuy start'); 35 console.log('yohobuy start');
36 }); 36 });
@@ -7,18 +7,58 @@ @@ -7,18 +7,58 @@
7 const _ = require('lodash'); 7 const _ = require('lodash');
8 const channelModel = require('../models/channel'); 8 const channelModel = require('../models/channel');
9 const helpers = require('../../../library/helpers'); 9 const helpers = require('../../../library/helpers');
  10 +const log = require('../../../library/logger');
  11 +const cookie = require('../../../library/cookie');
10 12
11 -const mod = 'channel';  
12 -let footerTab = {  
13 - indexUrl: helpers.url('/?go=1'), // 首页  
14 - categoryUrl: helpers.url('/cate'), // 分类  
15 - guangUrl: helpers.url('', null, 'guang'), // 逛首页  
16 - shoppingCartUrl: helpers.url('/cart/index/index'), // 购物车  
17 - mineUrl: helpers.url('/home') // 个人中心 13 +const renderData = {
  14 + module: 'channel',
  15 + page: 'home',
  16 + homeHeader: {
  17 + searchUrl: helpers.url('/search', null, 'search')
  18 + },
  19 + maybeLike: true,
  20 + showFooterTab: {
  21 + indexUrl: helpers.url('/?go=1'), // 首页
  22 + categoryUrl: helpers.url('/cate'), // 分类
  23 + guangUrl: helpers.url('', null, 'guang'), // 逛首页
  24 + shoppingCartUrl: helpers.url('/cart/index/index'), // 购物车
  25 + mineUrl: helpers.url('/home') // 个人中心
  26 + },
  27 + pageFooter: true
18 }; 28 };
19 29
  30 +const channelLogger = (err, res) => {
  31 + log.error('频道页面渲染错误:' + JSON.stringify(err));
  32 + res.send('error');
  33 +};
  34 +
  35 +/**
  36 + * 频道页生成函数
  37 + * @param {[object]} req
  38 + * @param {[object]} res
  39 + * @param {[object]} data 自定义数据
  40 + * @return {[type]}
  41 + */
  42 +const channelPage = (req, res, data) => {
  43 + channelModel.getChannelDate({
  44 + gender: data.gender,
  45 + uid: cookie.getUid(req)
  46 + }).then(result => {
  47 + res.render('channel', Object.assign(renderData, data, result));
  48 + }).catch((err) => {
  49 + channelLogger(err, res);
  50 + });
  51 +};
  52 +
  53 +/**
  54 + * 频道选择页
  55 + */
  56 +// exports.index = (req, res) => {
  57 +//
  58 +// };
  59 +
20 /** 60 /**
21 - * 频道选择 61 + * 频道页,根据查询字符串跳转频道中间件
22 * @param {object} req 62 * @param {object} req
23 * @param {object} res 63 * @param {object} res
24 * @param {Function} next 64 * @param {Function} next
@@ -41,29 +81,59 @@ exports.switchChannel = (req, res, next) => { @@ -41,29 +81,59 @@ exports.switchChannel = (req, res, next) => {
41 * 男生首页 81 * 男生首页
42 */ 82 */
43 exports.boys = (req, res) => { 83 exports.boys = (req, res) => {
44 - channelModel.getChannelDate({ 84 + channelPage(req, res, {
45 gender: 'boys', 85 gender: 'boys',
46 - uid: 123  
47 - }).then(result => {  
48 - res.render('channel', Object.assign({  
49 - module: mod,  
50 - page: 'home',  
51 - title: '男生首页',  
52 - boysHomePage: true,  
53 - homeHeader: {  
54 - searchUrl: helpers.url('/search', null, 'search')  
55 - },  
56 - maybeLike: true,  
57 - showFooterTab: footerTab,  
58 - pageFooter: true  
59 - }, result));  
60 - }).catch(console.trace); 86 + title: '男生首页',
  87 + boysHomePage: true
  88 + });
  89 +};
  90 +
  91 +/**
  92 + * 女生首页
  93 + */
  94 +exports.girls = (req, res) => {
  95 + channelPage(req, res, {
  96 + gender: 'girls',
  97 + title: '女生首页',
  98 + girlsHomePage: true
  99 + });
  100 +};
  101 +
  102 +/**
  103 + * 潮童首页
  104 + */
  105 +
  106 +exports.kids = (req, res) => {
  107 + channelPage(req, res, {
  108 + gender: 'kids',
  109 + title: '潮童首页',
  110 + boysHomePage: true
  111 + });
61 }; 112 };
62 113
  114 +/**
  115 + * 创意生活首页
  116 + */
  117 +exports.lifestyle = (req, res) => {
  118 + channelPage(req, res, {
  119 + gender: 'lifestyle',
  120 + title: '创意生活首页',
  121 + lifestyleHomePage: true
  122 + });
  123 +};
  124 +
  125 +/**
  126 + * 频道页底部 bannel
  127 + * @param {[object]} req
  128 + * @param {[object]} res
  129 + * @return {[type]}
  130 + */
63 exports.bottomBanner = (req, res) => { 131 exports.bottomBanner = (req, res) => {
64 let gender = req.query.gender || 'boys'; 132 let gender = req.query.gender || 'boys';
65 133
66 channelModel.getBottomBannerDate(gender).then(result => { 134 channelModel.getBottomBannerDate(gender).then(result => {
67 res.send(result); 135 res.send(result);
68 - }).catch(console.trace); 136 + }).catch((err) => {
  137 + channelLogger(err, res);
  138 + });
69 }; 139 };
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 */ 5 */
6 'use strict'; 6 'use strict';
7 const _ = require('lodash'); 7 const _ = require('lodash');
8 -const API = require('../../../library/api').API; 8 +const API = require('../../../library/api').ServiceAPI;
9 const sign = require('../../../library/sign'); 9 const sign = require('../../../library/sign');
10 const camelCase = require('../../../library/camel-case'); 10 const camelCase = require('../../../library/camel-case');
11 11
@@ -103,6 +103,24 @@ const processFloor = (list) => { @@ -103,6 +103,24 @@ const processFloor = (list) => {
103 103
104 _.forEach(list, (floor) => { 104 _.forEach(list, (floor) => {
105 floor[_.camelCase(floor.templateName)] = true; 105 floor[_.camelCase(floor.templateName)] = true;
  106 +
  107 + // 特殊资源位处理
  108 + // PLUS
  109 + if (floor.singleNameImage && floor.data) {
  110 + floor.data.title = {
  111 + title: floor.data.title
  112 + };
  113 + }
  114 +
  115 + // 潮流时装/经典裤裙/时尚靴履/潮人配饰/潮流上装
  116 + if (floor.recommendContentOne && floor.data) {
  117 + if (floor.data.bigImage && floor.data.bigImage.length > 1) {
  118 + floor.data.bigImage = {
  119 + bigList: floor.data.bigImage
  120 + };
  121 + }
  122 + }
  123 +
106 formatData.push(floor); 124 formatData.push(floor);
107 }); 125 });
108 126
@@ -128,7 +146,7 @@ const getChannelResource = (params) => { @@ -128,7 +146,7 @@ const getChannelResource = (params) => {
128 } 146 }
129 147
130 return api.get('operations/api/v5/resource/home', sign.apiSign(params)).then(result => { 148 return api.get('operations/api/v5/resource/home', sign.apiSign(params)).then(result => {
131 - if (result.code === 200) { 149 + if (result && result.code === 200) {
132 return processFloor(result.data.list); 150 return processFloor(result.data.list);
133 } else { 151 } else {
134 return result; 152 return result;
@@ -145,7 +163,7 @@ const getLeftNav = (choosed) => { @@ -145,7 +163,7 @@ const getLeftNav = (choosed) => {
145 choosed = choosed || 'all'; 163 choosed = choosed || 'all';
146 164
147 return api.get('operations/api/v6/category/getCategory', sign.apiSign({})).then(result => { 165 return api.get('operations/api/v6/category/getCategory', sign.apiSign({})).then(result => {
148 - if (result.code === 200) { 166 + if (result && result.code === 200) {
149 return processSideBar(result.data, choosed); 167 return processSideBar(result.data, choosed);
150 } else { 168 } else {
151 return result; 169 return result;
@@ -13,10 +13,10 @@ const channel = require(cRoot); @@ -13,10 +13,10 @@ const channel = require(cRoot);
13 const router = express.Router(); // eslint-disable-line 13 const router = express.Router(); // eslint-disable-line
14 14
15 router.get('/boys', channel.switchChannel, channel.boys); 15 router.get('/boys', channel.switchChannel, channel.boys);
  16 +router.get('/girls', channel.switchChannel, channel.girls);
  17 +router.get('/kids', channel.switchChannel, channel.kids);
  18 +router.get('/lifestyle', channel.switchChannel, channel.lifestyle);
16 19
17 -// router.get('/girls', channel.switchChannel, channel.girls);  
18 -// router.get('/kids', channel.switchChannel, channel.kids);  
19 -// router.get('/lifestyle', channel.switchChannel, channel.lifestyle);  
20 router.get('/channel/bottomBanner', channel.bottomBanner); 20 router.get('/channel/bottomBanner', channel.bottomBanner);
21 21
22 module.exports = router; 22 module.exports = router;
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 */ 6 */
7 7
8 module.exports = { 8 module.exports = {
9 - siteUrl: 'http://www.yohobuy.com', 9 + siteUrl: 'http://m.yohobuy.com',
10 domains: { 10 domains: {
11 api: 'http://testapi.yoho.cn:28078/', 11 api: 'http://testapi.yoho.cn:28078/',
12 service: 'http://testservice.yoho.cn:28077/' 12 service: 'http://testservice.yoho.cn:28077/'
1 -<!DOCTYPE html>  
2 -<html>  
3 - <head>  
4 - <meta charset="utf-8">  
5 - <title>{{title}}</title>  
6 - <meta name="keywords" content="{{keywords}}">  
7 - <meta name="description" content="{{description}}">  
8 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">  
9 - <meta http-equiv="cleartype" content="on">  
10 - <meta name="apple-mobile-web-app-status-bar-style" content="black" />  
11 - <meta content="telephone=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">  
17 - <script type="text/javascript">  
18 - (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=640){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/640)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window);  
19 - </script>  
20 - {{#if devEnv}}  
21 - <link rel="stylesheet" href="//localhost:5000/css/m-index.css">  
22 - {{^}}  
23 - <link rel="stylesheet" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/m-index.css">  
24 - {{/if}}  
25 - <link rel="apple-touch-icon-precomposed" href="http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png">  
26 - <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)">  
27 - <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)">  
28 - </head>  
29 - <body {{#if isPassportPage}}class=passport-body{{/if}}>  
30 - {{#if systemUpdate}}  
31 - {{> updata}}  
32 - {{/if}}  
33 -  
34 - {{> header}}  
35 - {{{body}}}  
36 - {{> footer}}  
37 -  
38 - {{#if devEnv}}  
39 - <script src="//localhost:8000/{{module}}.{{page}}.js"></script>  
40 - {{^}}  
41 - <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>  
42 - {{/if}}  
43 - </body>  
44 -</html>  
1 -{{#pageFooter}}  
2 -<footer id="yoho-footer" class="yoho-footer">  
3 - <p class="op-row">  
4 - <span class="back-to-top">  
5 - Back to top  
6 - <i class="iconfont">&#xe608;</i>  
7 - </span>  
8 - </p>  
9 - <address class="copyright">  
10 - CopyRight©2007-2016 南京新与力文化传播有限公司  
11 - </address>  
12 -</footer>  
13 -{{/pageFooter}}  
1 -{{#pageHeader}}  
2 -<header id="yoho-header" class="yoho-header{{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}">  
3 - {{#navBack}}  
4 - <a href="{{#if backUrl}}{{backUrl}}{{^}}javascript:history.go(-1);{{/if}}" class="iconfont nav-back">&#xe610;</a>  
5 - {{/navBack}}  
6 - {{#navBtn}}  
7 - <span class="iconfont nav-home">&#xe638;</span>  
8 - {{/navBtn}}  
9 - {{#currencyPage}}  
10 - <a href="/home/helpDetail?code=20151230-102233&caption=YOHO币介绍" class="iconfont nav-home">&#xe639;</a>  
11 - {{/currencyPage}}  
12 - {{#currencyDetailPage}}  
13 - <a href="/home/helpDetail?code=20111130-152530&caption=如何使用YOHO币支付" class="iconfont nav-home">&#xe639;</a>  
14 - {{/currencyDetailPage}}  
15 - {{#navPhone}}  
16 - <a href="{{.}}" class="iconfont nav-home">&#xe641;</a>  
17 - {{/navPhone}}  
18 - {{#navTitle}}  
19 - <p class="nav-title">{{.}}</p>  
20 - {{/navTitle}}  
21 -</header>  
22 -{{#navBtn}}  
23 -<div class="homebuttom hide {{#if ../boys}} boys{{/if}}{{#if ../girls}} girls{{/if}}{{#if ../kids}} kids{{/if}}{{#if ../lifeStyle}} life-style{{/if}}">  
24 - <ul>  
25 - <li>  
26 - <a href="{{ indexUrl }}">  
27 - <i class="iconfont">&#xe62a;</i>  
28 - <span>首页</span>  
29 - </a>  
30 - </li>  
31 - <li>  
32 - <a href="{{ categoryUrl }}">  
33 - <i class="iconfont">&#xe62d;</i>  
34 - <span>分类</span>  
35 - </a>  
36 - </li>  
37 - <li>  
38 - <a href="{{ shoppingCartUrl }}">  
39 - <i class="iconfont">&#xe62c;</i>  
40 - <span>购物车</span>  
41 - </a>  
42 - </li>  
43 - <li>  
44 - <a href="{{ mineUrl }}">  
45 - <i class="iconfont">&#xe62b;</i>  
46 - <span>我的</span>  
47 - </a>  
48 - </li>  
49 - </ul>  
50 -</div>  
51 -{{/navBtn}}  
52 -  
53 -{{/pageHeader}}  
1 -<!DOCTYPE html>  
2 -<html>  
3 - <head>  
4 - <meta charset="utf-8">  
5 - <title>{{title}}</title>  
6 - <meta name="keywords" content="{{keywords}}">  
7 - <meta name="description" content="{{description}}">  
8 - <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">  
9 - <meta http-equiv="cleartype" content="on">  
10 - <meta name="apple-mobile-web-app-status-bar-style" content="black" />  
11 - <meta content="telephone=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"> 1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <meta charset="utf-8">
  5 + <title>{{title}}</title>
  6 + <meta name="keywords" content="{{keywords}}">
  7 + <meta name="description" content="{{description}}">
  8 + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
  9 + <meta http-equiv="cleartype" content="on">
  10 + <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  11 + <meta content="telephone=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"> 16 <link rel="dns-prefetch" href="//img13.static.yhbimg.com">
17 - {{!-- H5 layout 加了以后移走 --}}  
18 <script type="text/javascript"> 17 <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>=640){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/640)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window); 18 + (function(d,c){var e=d.documentElement,a="orientationchange" in window?"orientationchange":"resize",b=function(){var f=e.clientWidth;if(!f){return}if(f>=640){e.style.fontSize="40px"}else{e.style.fontSize=40*(f/640)+"px"}};if(!d.addEventListener){return}b();c.addEventListener(a,b,false);d.addEventListener("DOMContentLoaded",b,false)})(document,window);
20 </script> 19 </script>
21 - {{#if devEnv}} 20 + {{#if devEnv}}
22 <link rel="stylesheet" href="//localhost:5001/css/index.css"> 21 <link rel="stylesheet" href="//localhost:5001/css/index.css">
23 - {{^}}  
24 - <link rel="stylesheet" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/index.css">  
25 - {{/if}}  
26 - </head>  
27 - <body> 22 + {{^}}
  23 + <link rel="stylesheet" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/m-index.css">
  24 + {{/if}}
  25 + <link rel="apple-touch-icon-precomposed" href="http://static.yohobuy.com/m/v1/img/touch/apple-touch-icon-144x144-precomposed-new.png">
  26 + <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)">
  27 + <link rel="apple-touch-startup-image" sizes="320x460" href="http://static.yohobuy.com/m/v1/img/startup/startup.png" media="screen and (max-device-width: 320)">
  28 + </head>
  29 + <body {{#if isPassportPage}}class=passport-body{{/if}}>
  30 + {{#if systemUpdate}}
  31 + {{> updata}}
  32 + {{/if}}
  33 +
  34 + {{> header}}
28 {{{body}}} 35 {{{body}}}
29 - {{#if devEnv}} 36 + {{> footer}}
  37 +
  38 + {{#if devEnv}}
30 <script src="//localhost:5001/{{module}}.{{page}}.js"></script> 39 <script src="//localhost:5001/{{module}}.{{page}}.js"></script>
31 - {{^}}  
32 - <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>  
33 - {{/if}}  
34 - </body> 40 + {{^}}
  41 + <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>
  42 + {{/if}}
  43 + </body>
35 </html> 44 </html>
1 -<p>I am footer</p>  
  1 +{{#pageFooter}}
  2 +<footer id="yoho-footer" class="yoho-footer">
  3 + <p class="op-row">
  4 + <span class="back-to-top">
  5 + Back to top
  6 + <i class="iconfont">&#xe608;</i>
  7 + </span>
  8 + </p>
  9 + <address class="copyright">
  10 + CopyRight©2007-2016 南京新与力文化传播有限公司
  11 + </address>
  12 +</footer>
  13 +{{/pageFooter}}
1 -<p>I am header</p>  
  1 +{{#pageHeader}}
  2 +<header id="yoho-header" class="yoho-header{{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}">
  3 + {{#navBack}}
  4 + <a href="{{#if backUrl}}{{backUrl}}{{^}}javascript:history.go(-1);{{/if}}" class="iconfont nav-back">&#xe610;</a>
  5 + {{/navBack}}
  6 + {{#navBtn}}
  7 + <span class="iconfont nav-home">&#xe638;</span>
  8 + {{/navBtn}}
  9 + {{#currencyPage}}
  10 + <a href="/home/helpDetail?code=20151230-102233&caption=YOHO币介绍" class="iconfont nav-home">&#xe639;</a>
  11 + {{/currencyPage}}
  12 + {{#currencyDetailPage}}
  13 + <a href="/home/helpDetail?code=20111130-152530&caption=如何使用YOHO币支付" class="iconfont nav-home">&#xe639;</a>
  14 + {{/currencyDetailPage}}
  15 + {{#navPhone}}
  16 + <a href="{{.}}" class="iconfont nav-home">&#xe641;</a>
  17 + {{/navPhone}}
  18 + {{#navTitle}}
  19 + <p class="nav-title">{{.}}</p>
  20 + {{/navTitle}}
  21 +</header>
  22 +{{#navBtn}}
  23 +<div class="homebuttom hide {{#if ../boys}} boys{{/if}}{{#if ../girls}} girls{{/if}}{{#if ../kids}} kids{{/if}}{{#if ../lifeStyle}} life-style{{/if}}">
  24 + <ul>
  25 + <li>
  26 + <a href="{{ indexUrl }}">
  27 + <i class="iconfont">&#xe62a;</i>
  28 + <span>首页</span>
  29 + </a>
  30 + </li>
  31 + <li>
  32 + <a href="{{ categoryUrl }}">
  33 + <i class="iconfont">&#xe62d;</i>
  34 + <span>分类</span>
  35 + </a>
  36 + </li>
  37 + <li>
  38 + <a href="{{ shoppingCartUrl }}">
  39 + <i class="iconfont">&#xe62c;</i>
  40 + <span>购物车</span>
  41 + </a>
  42 + </li>
  43 + <li>
  44 + <a href="{{ mineUrl }}">
  45 + <i class="iconfont">&#xe62b;</i>
  46 + <span>我的</span>
  47 + </a>
  48 + </li>
  49 + </ul>
  50 +</div>
  51 +{{/navBtn}}
  52 +
  53 +{{/pageHeader}}
@@ -60,7 +60,8 @@ class API { @@ -60,7 +60,8 @@ class API {
60 _.forEach(urls, function(el) { 60 _.forEach(urls, function(el) {
61 rps.push(rp({ 61 rps.push(rp({
62 url: `${ApiUrl}${el.url}`, 62 url: `${ApiUrl}${el.url}`,
63 - qs: el.data 63 + qs: el.data,
  64 + json: true
64 })); 65 }));
65 }); 66 });
66 67
@@ -78,7 +79,8 @@ class API { @@ -78,7 +79,8 @@ class API {
78 return rp({ 79 return rp({
79 url: `${ApiUrl}${url}`, 80 url: `${ApiUrl}${url}`,
80 method: 'post', 81 method: 'post',
81 - form: data 82 + form: data,
  83 + json: true
82 }); 84 });
83 } 85 }
84 } 86 }
  1 +/**
  2 + * 获取 UID
  3 + * @param {[object]} req
  4 + * @return {[string]}
  5 + */
  6 +exports.getUid = (req) => {
  7 + var _uid = 0,
  8 + cookie = req.cookies._UID,
  9 + cookieList;
  10 +
  11 + if (req.isApp) {
  12 + return req.query.uid || 0;
  13 + }
  14 +
  15 + if (cookie) {
  16 + cookieList = cookie.split('::');
  17 + if (cookieList[1] && !isNaN(cookieList[1])) {
  18 + _uid = cookieList[1];
  19 + }
  20 + }
  21 +
  22 + return _uid;
  23 +};
@@ -193,7 +193,7 @@ gulp.task('webpack-dev-server', () => { @@ -193,7 +193,7 @@ gulp.task('webpack-dev-server', () => {
193 193
194 new WebpackDevServer(webpack(devConfig), { 194 new WebpackDevServer(webpack(devConfig), {
195 contentBase: '.', 195 contentBase: '.',
196 - publicPath: '//localhost:8000/', 196 + publicPath: '//localhost:5001/',
197 hot: true, 197 hot: true,
198 stats: { 198 stats: {
199 colors: true 199 colors: true
@@ -214,7 +214,7 @@ gulp.task('webpack', () => { @@ -214,7 +214,7 @@ gulp.task('webpack', () => {
214 var proConfig = Object.assign({}, webpackConfig); 214 var proConfig = Object.assign({}, webpackConfig);
215 215
216 proConfig.output.path = dist.js; 216 proConfig.output.path = dist.js;
217 - webpack(proConfig, (err) => { 217 + webpack(proConfig, (err, stats) => {
218 if (err) { 218 if (err) {
219 throw new gutil.PluginError('webpack', err); 219 throw new gutil.PluginError('webpack', err);
220 } 220 }
1 -.order-failure {  
2 - background-image: resolve('common/order-good.jpg');  
3 - background-size: 100%;  
4 -}  
5 -  
6 -.good-failure {  
7 - background-image: resolve('common/order-good.jpg');  
8 - background-size: 132px !important;  
9 - background-position-x: 40%;  
10 -}  
1 -.order-failure {  
2 - background-image: resolve('common/order-good.jpg');  
3 - background-size: 100%;  
4 -}  
5 -  
6 -.good-failure {  
7 - background-image: resolve('common/order-good.jpg');  
8 - background-size: 132px !important;  
9 - background-position-x: 40%;  
10 -}  
1 -.loading-mask {  
2 - position: fixed;  
3 - background: rgba(0, 0, 0, 0.1);  
4 - top: 0;  
5 - bottom: 0;  
6 - right: 0;  
7 - left: 0;  
8 -  
9 - @keyframes scale {  
10 - 0% {  
11 - transform: scale(1);  
12 - opacity: 1;  
13 - }  
14 -  
15 - 45% {  
16 - transform: scale(0.1);  
17 - opacity: 0.7;  
18 - }  
19 -  
20 - 80% {  
21 - transform: scale(1);  
22 - opacity: 1;  
23 - }  
24 - }  
25 -  
26 - .loading {  
27 - position: absolute;  
28 - width: 120px;  
29 - height: 40px;  
30 - top: 50%;  
31 - left: 50%;  
32 - margin-top: -20px;  
33 - margin-left: -60px;  
34 -  
35 - > div {  
36 - display: inline-block;  
37 - background: #fff;  
38 - width: 30px;  
39 - height: 30px;  
40 - border-radius: 100%;  
41 - margin: 4px;  
42 - $init: 0.12;  
43 -  
44 - @for $i from 1 to 3 {  
45 - &:nth-child($i) {  
46 - animation: scale 0.75s $(init)s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);  
47 - }  
48 - $init: ($i + 1) * 0.12;  
49 - }  
50 - }  
51 - }  
52 -}  
1 -html,  
2 -body,  
3 -div,  
4 -span,  
5 -applet,  
6 -object,  
7 -iframe,  
8 -h1,  
9 -h2,  
10 -h3,  
11 -h4,  
12 -h5,  
13 -h6,  
14 -p,  
15 -blockquote,  
16 -pre,  
17 -a,  
18 -abbr,  
19 -acronym,  
20 -address,  
21 -big,  
22 -cite,  
23 -code,  
24 -del,  
25 -dfn,  
26 -em,  
27 -img,  
28 -ins,  
29 -kbd,  
30 -q,  
31 -s,  
32 -samp,  
33 -small,  
34 -strike,  
35 -strong,  
36 -sub,  
37 -sup,  
38 -tt,  
39 -var,  
40 -b,  
41 -u,  
42 -i,  
43 -center,  
44 -dl,  
45 -dt,  
46 -dd,  
47 -ol,  
48 -ul,  
49 -li,  
50 -fieldset,  
51 -form,  
52 -label,  
53 -legend,  
54 -table,  
55 -caption,  
56 -tbody,  
57 -tfoot,  
58 -thead,  
59 -tr,  
60 -th,  
61 -td,  
62 -article,  
63 -aside,  
64 -canvas,  
65 -details,  
66 -embed,  
67 -figure,  
68 -figcaption,  
69 -footer,  
70 -header,  
71 -hgroup,  
72 -menu,  
73 -nav,  
74 -output,  
75 -ruby,  
76 -section,  
77 -summary,  
78 -time,  
79 -mark,  
80 -audio,  
81 -video {  
82 - margin: 0;  
83 - padding: 0;  
84 - border: 0;  
85 - font: inherit;  
86 - font-size: 100%;  
87 - vertical-align: baseline;  
88 -}  
89 -  
90 -html {  
91 - line-height: 1;  
92 -}  
93 -  
94 -ol,  
95 -ul {  
96 - list-style: none;  
97 -}  
98 -  
99 -table {  
100 - border-collapse: collapse;  
101 - border-spacing: 0;  
102 -}  
103 -  
104 -caption,  
105 -th,  
106 -td {  
107 - text-align: left;  
108 - font-weight: normal;  
109 - vertical-align: middle;  
110 -}  
111 -  
112 -q,  
113 -blockquote {  
114 - quotes: none;  
115 -}  
116 -  
117 -q:before,  
118 -q:after,  
119 -blockquote:before,  
120 -blockquote:after {  
121 - content: "";  
122 - content: none;  
123 -}  
124 -  
125 -a img {  
126 - border: none;  
127 -}  
128 -  
129 -article,  
130 -aside,  
131 -details,  
132 -figcaption,  
133 -figure,  
134 -footer,  
135 -header,  
136 -hgroup,  
137 -main,  
138 -menu,  
139 -nav,  
140 -section,  
141 -summary {  
142 - display: block;  
143 -}  
1 -/* stylelint-disable */  
2 -/**  
3 - * Swiper 3.0.8  
4 - * Most modern mobile touch slider and framework with hardware accelerated transitions  
5 - *  
6 - * http://www.idangero.us/swiper/  
7 - *  
8 - * Copyright 2015, Vladimir Kharlampidi  
9 - * The iDangero.us  
10 - * http://www.idangero.us/  
11 - *  
12 - * Licensed under MIT  
13 - *  
14 - * Released on: June 14, 2015  
15 - */  
16 -.swiper-container {  
17 - margin: 0 auto;  
18 - position: relative;  
19 - overflow: hidden;  
20 -  
21 - /* Fix of Webkit flickering */  
22 - z-index: 1;  
23 -}  
24 -  
25 -.swiper-container-no-flexbox .swiper-slide {  
26 - float: left;  
27 -}  
28 -  
29 -.swiper-container-vertical > .swiper-wrapper {  
30 - -webkit-box-orient: vertical;  
31 - -moz-box-orient: vertical;  
32 - -ms-flex-direction: column;  
33 - -webkit-flex-direction: column;  
34 - flex-direction: column;  
35 -}  
36 -  
37 -.swiper-wrapper {  
38 - position: relative;  
39 - width: 100%;  
40 - height: 100%;  
41 - z-index: 1;  
42 - display: -webkit-box;  
43 - display: -moz-box;  
44 - display: -ms-flexbox;  
45 - display: -webkit-flex;  
46 - display: flex;  
47 - -webkit-transform-style: preserve-3d;  
48 - -moz-transform-style: preserve-3d;  
49 - -ms-transform-style: preserve-3d;  
50 - transform-style: preserve-3d;  
51 - -webkit-transition-property: -webkit-transform;  
52 - -moz-transition-property: -moz-transform;  
53 - -o-transition-property: -o-transform;  
54 - -ms-transition-property: -ms-transform;  
55 - transition-property: transform;  
56 - -webkit-box-sizing: content-box;  
57 - -moz-box-sizing: content-box;  
58 - box-sizing: content-box;  
59 -}  
60 -  
61 -.swiper-container-android .swiper-slide,  
62 -.swiper-wrapper {  
63 - -webkit-transform: translate3d(0px, 0, 0);  
64 - -moz-transform: translate3d(0px, 0, 0);  
65 - -o-transform: translate(0px, 0px);  
66 - -ms-transform: translate3d(0px, 0, 0);  
67 - transform: translate3d(0px, 0, 0);  
68 -}  
69 -  
70 -.swiper-container-multirow > .swiper-wrapper {  
71 - -webkit-box-lines: multiple;  
72 - -moz-box-lines: multiple;  
73 - -ms-flex-wrap: wrap;  
74 - -webkit-flex-wrap: wrap;  
75 - flex-wrap: wrap;  
76 -}  
77 -  
78 -.swiper-container-free-mode > .swiper-wrapper {  
79 - -webkit-transition-timing-function: ease-out;  
80 - -moz-transition-timing-function: ease-out;  
81 - -ms-transition-timing-function: ease-out;  
82 - -o-transition-timing-function: ease-out;  
83 - transition-timing-function: ease-out;  
84 - margin: 0 auto;  
85 -}  
86 -  
87 -.swiper-slide {  
88 - -webkit-transform-style: preserve-3d;  
89 - -moz-transform-style: preserve-3d;  
90 - -ms-transform-style: preserve-3d;  
91 - transform-style: preserve-3d;  
92 - -webkit-flex-shrink: 0;  
93 - -ms-flex: 0 0 auto;  
94 - flex-shrink: 0;  
95 - width: 100%;  
96 - height: 100%;  
97 - position: relative;  
98 -}  
99 -  
100 -/* a11y */  
101 -.swiper-container .swiper-notification {  
102 - position: absolute;  
103 - left: 0;  
104 - top: 0;  
105 - pointer-events: none;  
106 - opacity: 0;  
107 - z-index: -1000;  
108 -}  
109 -  
110 -/* IE10 Windows Phone 8 Fixes */  
111 -.swiper-wp8-horizontal {  
112 - -ms-touch-action: pan-y;  
113 - touch-action: pan-y;  
114 -}  
115 -  
116 -.swiper-wp8-vertical {  
117 - -ms-touch-action: pan-x;  
118 - touch-action: pan-x;  
119 -}  
120 -  
121 -/* Arrows */  
122 -.swiper-button-prev,  
123 -.swiper-button-next {  
124 - position: absolute;  
125 - top: 50%;  
126 - width: 27px;  
127 - height: 44px;  
128 - margin-top: -22px;  
129 - z-index: 10;  
130 - cursor: pointer;  
131 - -moz-background-size: 27px 44px;  
132 - -webkit-background-size: 27px 44px;  
133 - background-size: 27px 44px;  
134 - background-position: center;  
135 - background-repeat: no-repeat;  
136 -}  
137 -  
138 -.swiper-button-prev.swiper-button-disabled,  
139 -.swiper-button-next.swiper-button-disabled {  
140 - opacity: 0.35;  
141 - cursor: auto;  
142 - pointer-events: none;  
143 -}  
144 -  
145 -.swiper-button-prev,  
146 -.swiper-container-rtl .swiper-button-next {  
147 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");  
148 - left: 10px;  
149 - right: auto;  
150 -}  
151 -  
152 -.swiper-button-prev.swiper-button-black,  
153 -.swiper-container-rtl .swiper-button-next.swiper-button-black {  
154 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");  
155 -}  
156 -  
157 -.swiper-button-prev.swiper-button-white,  
158 -.swiper-container-rtl .swiper-button-next.swiper-button-white {  
159 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");  
160 -}  
161 -  
162 -.swiper-button-next,  
163 -.swiper-container-rtl .swiper-button-prev {  
164 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");  
165 - right: 10px;  
166 - left: auto;  
167 -}  
168 -  
169 -.swiper-button-next.swiper-button-black,  
170 -.swiper-container-rtl .swiper-button-prev.swiper-button-black {  
171 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E");  
172 -}  
173 -  
174 -.swiper-button-next.swiper-button-white,  
175 -.swiper-container-rtl .swiper-button-prev.swiper-button-white {  
176 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E");  
177 -}  
178 -  
179 -/* Pagination Styles */  
180 -.swiper-pagination {  
181 - position: absolute;  
182 - text-align: center;  
183 - -webkit-transition: 300ms;  
184 - -moz-transition: 300ms;  
185 - -o-transition: 300ms;  
186 - transition: 300ms;  
187 - -webkit-transform: translate3d(0, 0, 0);  
188 - -ms-transform: translate3d(0, 0, 0);  
189 - -o-transform: translate3d(0, 0, 0);  
190 - transform: translate3d(0, 0, 0);  
191 - z-index: 10;  
192 -}  
193 -  
194 -.swiper-pagination.swiper-pagination-hidden {  
195 - opacity: 0;  
196 -}  
197 -  
198 -.swiper-pagination-bullet {  
199 - width: 8px;  
200 - height: 8px;  
201 - display: inline-block;  
202 - border-radius: 100%;  
203 - background: #000;  
204 - opacity: 0.2;  
205 -}  
206 -  
207 -.swiper-pagination-clickable .swiper-pagination-bullet {  
208 - cursor: pointer;  
209 -}  
210 -  
211 -.swiper-pagination-white .swiper-pagination-bullet {  
212 - background: #fff;  
213 -}  
214 -  
215 -.swiper-pagination-bullet-active {  
216 - opacity: 1;  
217 - background: #007aff;  
218 -}  
219 -  
220 -.swiper-pagination-white .swiper-pagination-bullet-active {  
221 - background: #fff;  
222 -}  
223 -  
224 -.swiper-pagination-black .swiper-pagination-bullet-active {  
225 - background: #000;  
226 -}  
227 -  
228 -.swiper-container-vertical > .swiper-pagination {  
229 - right: 10px;  
230 - top: 50%;  
231 - -webkit-transform: translate3d(0px, -50%, 0);  
232 - -moz-transform: translate3d(0px, -50%, 0);  
233 - -o-transform: translate(0px, -50%);  
234 - -ms-transform: translate3d(0px, -50%, 0);  
235 - transform: translate3d(0px, -50%, 0);  
236 -}  
237 -  
238 -.swiper-container-vertical > .swiper-pagination .swiper-pagination-bullet {  
239 - margin: 5px 0;  
240 - display: block;  
241 -}  
242 -  
243 -.swiper-container-horizontal > .swiper-pagination {  
244 - bottom: 10px;  
245 - left: 0;  
246 - width: 100%;  
247 -}  
248 -  
249 -.swiper-container-horizontal > .swiper-pagination .swiper-pagination-bullet {  
250 - margin: 0 5px;  
251 -}  
252 -  
253 -/* 3D Container */  
254 -.swiper-container-3d {  
255 - -webkit-perspective: 1200px;  
256 - -moz-perspective: 1200px;  
257 - -o-perspective: 1200px;  
258 - perspective: 1200px;  
259 -}  
260 -  
261 -.swiper-container-3d .swiper-wrapper,  
262 -.swiper-container-3d .swiper-slide,  
263 -.swiper-container-3d .swiper-slide-shadow-left,  
264 -.swiper-container-3d .swiper-slide-shadow-right,  
265 -.swiper-container-3d .swiper-slide-shadow-top,  
266 -.swiper-container-3d .swiper-slide-shadow-bottom,  
267 -.swiper-container-3d .swiper-cube-shadow {  
268 - -webkit-transform-style: preserve-3d;  
269 - -moz-transform-style: preserve-3d;  
270 - -ms-transform-style: preserve-3d;  
271 - transform-style: preserve-3d;  
272 -}  
273 -  
274 -.swiper-container-3d .swiper-slide-shadow-left,  
275 -.swiper-container-3d .swiper-slide-shadow-right,  
276 -.swiper-container-3d .swiper-slide-shadow-top,  
277 -.swiper-container-3d .swiper-slide-shadow-bottom {  
278 - position: absolute;  
279 - left: 0;  
280 - top: 0;  
281 - width: 100%;  
282 - height: 100%;  
283 - pointer-events: none;  
284 - z-index: 10;  
285 -}  
286 -  
287 -.swiper-container-3d .swiper-slide-shadow-left {  
288 - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));  
289 -  
290 - /* Safari 4+, Chrome */  
291 - background-image: -webkit-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
292 -  
293 - /* Chrome 10+, Safari 5.1+, iOS 5+ */  
294 - background-image: -moz-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
295 -  
296 - /* Firefox 3.6-15 */  
297 - background-image: -o-linear-gradient(right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
298 -  
299 - /* Opera 11.10-12.00 */  
300 - background-image: linear-gradient(to left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
301 -  
302 - /* Firefox 16+, IE10, Opera 12.50+ */  
303 -}  
304 -  
305 -.swiper-container-3d .swiper-slide-shadow-right {  
306 - background-image: -webkit-gradient(linear, right top, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));  
307 -  
308 - /* Safari 4+, Chrome */  
309 - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
310 -  
311 - /* Chrome 10+, Safari 5.1+, iOS 5+ */  
312 - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
313 -  
314 - /* Firefox 3.6-15 */  
315 - background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
316 -  
317 - /* Opera 11.10-12.00 */  
318 - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
319 -  
320 - /* Firefox 16+, IE10, Opera 12.50+ */  
321 -}  
322 -  
323 -.swiper-container-3d .swiper-slide-shadow-top {  
324 - background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));  
325 -  
326 - /* Safari 4+, Chrome */  
327 - background-image: -webkit-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
328 -  
329 - /* Chrome 10+, Safari 5.1+, iOS 5+ */  
330 - background-image: -moz-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
331 -  
332 - /* Firefox 3.6-15 */  
333 - background-image: -o-linear-gradient(bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
334 -  
335 - /* Opera 11.10-12.00 */  
336 - background-image: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
337 -  
338 - /* Firefox 16+, IE10, Opera 12.50+ */  
339 -}  
340 -  
341 -.swiper-container-3d .swiper-slide-shadow-bottom {  
342 - background-image: -webkit-gradient(linear, left bottom, left top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0)));  
343 -  
344 - /* Safari 4+, Chrome */  
345 - background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
346 -  
347 - /* Chrome 10+, Safari 5.1+, iOS 5+ */  
348 - background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
349 -  
350 - /* Firefox 3.6-15 */  
351 - background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
352 -  
353 - /* Opera 11.10-12.00 */  
354 - background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0));  
355 -  
356 - /* Firefox 16+, IE10, Opera 12.50+ */  
357 -}  
358 -  
359 -/* Coverflow */  
360 -.swiper-container-coverflow .swiper-wrapper {  
361 -  
362 - /* Windows 8 IE 10 fix */  
363 - -ms-perspective: 1200px;  
364 -}  
365 -  
366 -/* Fade */  
367 -.swiper-container-fade.swiper-container-free-mode .swiper-slide {  
368 - -webkit-transition-timing-function: ease-out;  
369 - -moz-transition-timing-function: ease-out;  
370 - -ms-transition-timing-function: ease-out;  
371 - -o-transition-timing-function: ease-out;  
372 - transition-timing-function: ease-out;  
373 -}  
374 -  
375 -.swiper-container-fade .swiper-slide {  
376 - pointer-events: none;  
377 -}  
378 -  
379 -.swiper-container-fade .swiper-slide .swiper-slide {  
380 - pointer-events: none;  
381 -}  
382 -  
383 -.swiper-container-fade .swiper-slide-active,  
384 -.swiper-container-fade .swiper-slide-active .swiper-slide-active {  
385 - pointer-events: auto;  
386 -}  
387 -  
388 -/* Cube */  
389 -.swiper-container-cube {  
390 - overflow: visible;  
391 -}  
392 -  
393 -.swiper-container-cube .swiper-slide {  
394 - pointer-events: none;  
395 - visibility: hidden;  
396 - -webkit-transform-origin: 0 0;  
397 - -moz-transform-origin: 0 0;  
398 - -ms-transform-origin: 0 0;  
399 - transform-origin: 0 0;  
400 - -webkit-backface-visibility: hidden;  
401 - -moz-backface-visibility: hidden;  
402 - -ms-backface-visibility: hidden;  
403 - backface-visibility: hidden;  
404 - width: 100%;  
405 - height: 100%;  
406 -}  
407 -  
408 -.swiper-container-cube.swiper-container-rtl .swiper-slide {  
409 - -webkit-transform-origin: 100% 0;  
410 - -moz-transform-origin: 100% 0;  
411 - -ms-transform-origin: 100% 0;  
412 - transform-origin: 100% 0;  
413 -}  
414 -  
415 -.swiper-container-cube .swiper-slide-active,  
416 -.swiper-container-cube .swiper-slide-next,  
417 -.swiper-container-cube .swiper-slide-prev,  
418 -.swiper-container-cube .swiper-slide-next + .swiper-slide {  
419 - pointer-events: auto;  
420 - visibility: visible;  
421 -}  
422 -  
423 -.swiper-container-cube .swiper-cube-shadow {  
424 - position: absolute;  
425 - left: 0;  
426 - bottom: 0px;  
427 - width: 100%;  
428 - height: 100%;  
429 - background: #000;  
430 - opacity: 0.6;  
431 - -webkit-filter: blur(50px);  
432 - filter: blur(50px);  
433 -}  
434 -  
435 -.swiper-container-cube.swiper-container-vertical .swiper-cube-shadow {  
436 - z-index: 0;  
437 -}  
438 -  
439 -/* Scrollbar */  
440 -.swiper-scrollbar {  
441 - border-radius: 10px;  
442 - position: relative;  
443 - -ms-touch-action: none;  
444 - background: rgba(0, 0, 0, 0.1);  
445 -}  
446 -  
447 -.swiper-container-horizontal > .swiper-scrollbar {  
448 - position: absolute;  
449 - left: 1%;  
450 - bottom: 3px;  
451 - z-index: 50;  
452 - height: 5px;  
453 - width: 98%;  
454 -}  
455 -  
456 -.swiper-container-vertical > .swiper-scrollbar {  
457 - position: absolute;  
458 - right: 3px;  
459 - top: 1%;  
460 - z-index: 50;  
461 - width: 5px;  
462 - height: 98%;  
463 -}  
464 -  
465 -.swiper-scrollbar-drag {  
466 - height: 100%;  
467 - width: 100%;  
468 - position: relative;  
469 - background: rgba(0, 0, 0, 0.5);  
470 - border-radius: 10px;  
471 - left: 0;  
472 - top: 0;  
473 -}  
474 -  
475 -.swiper-scrollbar-cursor-drag {  
476 - cursor: move;  
477 -}  
478 -  
479 -/* Preloader */  
480 -.swiper-lazy-preloader {  
481 - width: 42px;  
482 - height: 42px;  
483 - position: absolute;  
484 - left: 50%;  
485 - top: 50%;  
486 - margin-left: -21px;  
487 - margin-top: -21px;  
488 - z-index: 10;  
489 - -webkit-transform-origin: 50%;  
490 - -moz-transform-origin: 50%;  
491 - transform-origin: 50%;  
492 - -webkit-animation: swiper-preloader-spin 1s steps(12, end) infinite;  
493 - -moz-animation: swiper-preloader-spin 1s steps(12, end) infinite;  
494 - animation: swiper-preloader-spin 1s steps(12, end) infinite;  
495 -}  
496 -  
497 -.swiper-lazy-preloader:after {  
498 - display: block;  
499 - content: "";  
500 - width: 100%;  
501 - height: 100%;  
502 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");  
503 - background-position: 50%;  
504 - -webkit-background-size: 100%;  
505 - background-size: 100%;  
506 - background-repeat: no-repeat;  
507 -}  
508 -  
509 -.swiper-lazy-preloader-white:after {  
510 - background-image: url("data:image/svg+xml;charset=utf-8, %3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");  
511 -}  
512 -  
513 -@-webkit-keyframes swiper-preloader-spin {  
514 - 100% {  
515 - -webkit-transform: rotate(360deg);  
516 - }  
517 -}  
518 -  
519 -@keyframes swiper-preloader-spin {  
520 - 100% {  
521 - transform: rotate(360deg);  
522 - }  
523 -}  
524 -/* stylelint-enable */  
1 @charset "utf-8"; 1 @charset "utf-8";
2 -@use postcss-clearfix ;  
3 -@import "common/reset";  
4 -  
5 -.clearfix {  
6 - clear: fix;  
7 -}  
8 -  
9 -*,  
10 -*:before,  
11 -*:after {  
12 - -webkit-tap-highlight-color: rgba(0, 0, 0, 0);  
13 - box-sizing: border-box;  
14 -}  
15 -  
16 -html,  
17 -body {  
18 - font-family: helvetica, Arial, "黑体";  
19 - width: 100%;  
20 - font-size: 24px;  
21 - line-height: 1.4;  
22 -}  
23 -  
24 -button,  
25 -input,  
26 -select,  
27 -textarea {  
28 - font-size: 100%;  
29 - margin: 0;  
30 -}  
31 -  
32 -img {  
33 - max-width: 100%;  
34 - display: block;  
35 - border: 0;  
36 - margin: 0 auto;  
37 -}  
38 -  
39 -a {  
40 - text-decoration: none;  
41 - outline: none;  
42 - color: #000;  
43 -}  
44 -  
45 -*:focus {  
46 - outline: none;  
47 -}  
48 -  
49 -.hide {  
50 - display: none;  
51 -}  
52 -  
53 -.overflow-hidden {  
54 - overflow: hidden;  
55 -}  
56 -  
57 -@font-face {  
58 - font-family: "iconfont";  
59 - src: resolve('h5/iconfont.eot'); /* IE9 */  
60 - src: resolve('h5/iconfont.eot?#iefix') format('embedded-opentype'), resolve('h5/iconfont.woff') format('woff'), resolve('h5/iconfont.ttf') format('truetype'), resolve('h5/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */  
61 -}  
62 -  
63 -.iconfont {  
64 - font-family: "iconfont" !important;  
65 - font-size: 32px;  
66 - font-style: normal;  
67 - text-decoration: none;  
68 - -webkit-font-smoothing: antialiased;  
69 - -webkit-text-stroke-width: 0.4px;  
70 - -moz-osx-font-smoothing: grayscale;  
71 -}  
72 -  
73 -.yoho-tip {  
74 - position: fixed;  
75 - display: none;  
76 - text-align: center;  
77 - width: 70%;  
78 - max-width: 600px;  
79 - padding: 68px 0;  
80 - top: 50%;  
81 - left: 50%;  
82 - transform: translate(-50%, -50%);  
83 - background-color: rgba(0, 0, 0, 0.7);  
84 - color: #fff;  
85 - font-size: 36px;  
86 - border: none;  
87 - z-index: 4;  
88 - border-radius: 20px;  
89 -}  
90 -  
91 -@import "common/lazy-failure";  
92 -@import "common/loading";  
93 -@import "common/swiper"; 2 +@import "layout/reset";
  3 +@import "layout/common";
  4 +@import "layout/loading";
  5 +@import "layout/swiper";
  6 +@import "layout/header";
  7 +@import "layout/footer";
94 @import "channel/index"; 8 @import "channel/index";
95 @import "product/detail"; 9 @import "product/detail";
96 @import "product/comments-consults"; 10 @import "product/comments-consults";
1 -@charset "utf-8"; 1 +
2 @use postcss-clearfix ; 2 @use postcss-clearfix ;
3 -@import "layout/reset";  
4 3
5 .clearfix { 4 .clearfix {
6 clear: fix; 5 clear: fix;
@@ -75,11 +74,11 @@ a { @@ -75,11 +74,11 @@ a {
75 display: none; 74 display: none;
76 text-align: center; 75 text-align: center;
77 width: 70%; 76 width: 70%;
  77 + max-width: 600px;
78 padding: 68px 0; 78 padding: 68px 0;
79 top: 50%; 79 top: 50%;
80 left: 50%; 80 left: 50%;
81 - margin-left: -35%;  
82 - margin-top: -90px; 81 + transform: translate(-50%, -50%);
83 background-color: rgba(0, 0, 0, 0.7); 82 background-color: rgba(0, 0, 0, 0.7);
84 color: #fff; 83 color: #fff;
85 font-size: 36px; 84 font-size: 36px;
@@ -88,8 +87,14 @@ a { @@ -88,8 +87,14 @@ a {
88 border-radius: 20px; 87 border-radius: 20px;
89 } 88 }
90 89
91 -@import "layout/lazy-failure";  
92 -@import "layout/loading";  
93 -@import "layout/swiper";  
94 -@import "layout/header";  
95 -@import "layout/footer"; 90 +.order-failure {
  91 + background-image: resolve('common/order-good.jpg');
  92 + background-size: 100%;
  93 +}
  94 +
  95 +.good-failure {
  96 + background-image: resolve('common/order-good.jpg');
  97 + background-size: 132px !important;
  98 + background-position-x: 40%;
  99 +}
  100 +