Authored by 郭成尧

合并代码解决冲突

Showing 100 changed files with 1727 additions and 310 deletions

Too many changes to show.

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

bundle/**/*.js
dist/**/*.js
\ No newline at end of file
**/bundle/**/*.js
**/dist/**/*.js
... ...
{
"extends": "yoho"
"extends": "yoho",
"parserOptions": {
"sourceType": "module"
}
}
... ...
... ... @@ -2,11 +2,12 @@
# Created by https://www.gitignore.io/api/node,webstorm,netbeans,sublimetext,vim
### Node ###
# Logs
# Logs
!logs/README.md
logs
*.log
npm-debug.log*
npm-debug.log*
# Runtime data
pids
*.pid
... ... @@ -95,7 +96,7 @@ fabric.properties
### NetBeans ###
nbproject/private/
nbproject/
build/
nbbuild/
dist/
... ...
css/**/*.css
dist/**/*.css
\ No newline at end of file
**/css/**/*.css
**/dist/**/*.css
... ...
... ... @@ -17,8 +17,10 @@ const path = require('path');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const favicon = require('serve-favicon');
const session = require('express-session');
const memcached = require('connect-memcached');
const session = require('yoho-express-session');
const memcached = require('yoho-connect-memcached');
const uuid = require('uuid');
const _ = require('lodash');
const pkg = require('./package.json');
const app = express();
... ... @@ -40,17 +42,35 @@ app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(session({
secret: '3e5fec7deca0b8305cefe2ad9d90ff5e',
name: 'PHPSESSID',
prefix: 'yohobuy',
proxy: true,
resave: true,
resave: false,
saveUninitialized: true,
unset: 'destroy',
secret: 'nothing', // 兼容 PHP SESSION,sessionID 不加密
name: 'PHPSESSID', // 兼容 PHP SESSION
genid: () => {
return uuid.v4(); // 兼容 PHP SESSION
},
cookie: {
domain: 'yohobuy.com'
},
store: new MemcachedStore({
hosts: config.memcache.session
hosts: config.memcache.session,
prefix: 'qinsessionsession:', // 兼容 PHP SESSION
key: 'yohobuy_session' // 兼容 PHP SESSION
})
}));
app.use((req, res, next) => {
req.user = {};
// 从 PHP 写的 SESSION 中获取到当前登录用户的 UID
if (req.session && _.isNumber(req.session._LOGIN_UID)) {
req.user.uid = req.session._LOGIN_UID;
}
next();
});
// dispatcher
require('./dispatch')(app);
... ...
/**
* index controller
* 专题活动 controller
* @author: bikai<kai.bi@yoho.cn>
* @date: 2016/05/16
*/
'use strict';
const headerModel = require('../../../doraemon/models/header');
const specialModel = require('../models/special');
const _ = require('lodash');
exports.special = (req, res) => {
let id = req.params[0] || 0;
let channel = req.query.channel ? req.query.channel : 'boys';
specialModel.getSpecialData(id).then((result) => {
let headerData = headerModel.setHeaderData(result[0].data, channel);
res.send(id);
res.render('special', _.merge({
module: 'index',
page: 'index'
}, headerData, result[1]));
}).catch((err) => {
res.send(err);
});
};
... ...
... ... @@ -13,13 +13,17 @@ var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
Object.assign(app.locals, parent.locals);
});
app.set('views', path.join(__dirname, 'views/action'));
app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: [path.join(__dirname, 'views/partial'), `${doraemon}/partial`],
helpers: 'helpers'
helpers: require('../../library/helpers')
}));
// router
... ...
/**
* activity model
* @author: wsl<shuiling.wang@yoho.cn>
* @date: 2016/05/18
*/
'use strict';
const ServiceAPI = require(`${global.library}/api`).ServiceAPI;
const sign = require(`${global.library}/sign`);
const logger = require(`${global.library}/logger`);
const headerModel = require('../../../doraemon/models/header');
var api = new ServiceAPI();
const getstaticFile = (id) => {
return api.get('staticFileManage/queryById', sign.apiSign({
id: id
}), true).then(result => {
if (result && result.code === 200) {
result.data.title = result.data.pageTitle;
result.data.keywords = result.data.keyWord;
result.data.description = result.data.pageDesc;
return result.data;
} else {
logger.error(`专题活动ID: ${id} 接口返回数据错误`);
return {};
}
});
};
exports.getSpecialData = (id) => {
return Promise.all([headerModel.requestHeaderData(), getstaticFile(id)]);
};
... ...
<div class="yoho-page center-content">
<p>body</p>
</div>
{{{content}}}
<!-- updateAt {{updateTime}} -->
... ...
... ... @@ -6,39 +6,17 @@
'use strict';
const headerModel = require('../../../doraemon/models/header');
// const channelModel = require('../models/index');
const channelModel = require('../models/index');
exports.boysIndex = (req, res) => {
headerModel.requestHeaderData()
.then(response => {
let data = headerModel.setHeaderData(response.data, 'boys');
data.module = 'index';
data.page = 'index';
data.footerTop = true;
res.render('boys', data);
})
.catch(() => {
res.render('error', {devEnv: true, pageErr: true});
});
channelModel.getContent('boys').then(data => {
res.render('boys', data);
});
};
exports.girlsIndex = (req, res) => {
headerModel.requestHeaderData()
.then(response => {
let data = headerModel.setHeaderData(response.data, 'girls');
data.module = 'index';
data.page = 'index';
data.footerTop = true;
res.render('girls', data);
})
.catch(() => {
res.render('error', {devEnv: true, pageErr: true});
});
exports.getbrandFloorDataAjax = (req, res) => {
channelModel.getbrandFloorDataAjax('boys').then(data => {
res.json(data);
});
};
... ...
... ... @@ -12,6 +12,7 @@ var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
var partials = path.join(__dirname, './views'); // parent view root
app.on('mount', function(parent) {
delete parent.locals.settings; // 不继承父 App 的设置
... ... @@ -23,11 +24,12 @@ app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: ['./views/partial', `${doraemon}/partial`],
helpers: 'helpers'
partialsDir: [`${partials}/partials`, `${doraemon}/partial`],
helpers: require('../../library/helpers')
}));
// router
app.use(require('./router'));
module.exports = app;
... ...
... ... @@ -5,31 +5,388 @@
*/
'use strict';
// const _ = require('lodash');
const _ = require('lodash');
const ServiceAPI = require(`${global.library}/api`).ServiceAPI;
const sign = require(`${global.library}/sign`);
const helpers = require(`${global.library}/helpers`);
const serviceApi = new ServiceAPI();
const headerModel = require('../../../doraemon/models/header');
// 创意生活
// const CODE_LIFESTYLE_CHANNEL_1 = '380c38155fd8beee10913a3f5b462da6';
// const CODE_LIFESTYLE_CHANNEL_2 = '665f7c2fb9d037ee820766953ee34bf7';
const channelMap = {
boys: {
code: '79372627eee75d73afe7f9bac91e5ce6',
gender: '1,3'
},
girls: {
code: '75215008957605c05e8cd375eac4f817',
gender: '2,3'
},
kids: {
code: 'd71f4b27f2a7229fbb31a4bc490a6f36',
gender: 'kids'
},
lifestyle: {
code: '8a341ca7eacc069ba80f02dec80eaf34',
gender: 'lifestyle'
}
};
const getBannerList = data => {
let list = [];
_.forEach(data, (bannerData) => {
let obj = {};
obj.href = bannerData.url;
obj.img = bannerData.src;
obj.name = bannerData.title;
list.push(obj);
});
return list;
};
const getadbannerData = data => {
const obj = {
adbanner: {
href: '',
img: '',
name: ''
}
};
obj.adbanner.href = data.url;
obj.adbanner.img = data.src;
obj.adbanner.name = data.title;
return obj;
};
const getSlideData = srcData => {
const slideData = {
slide: {
list: [],
pagination: []
}
};
slideData.slide.list = getBannerList(srcData.big_image);
slideData.slide.pagination = getBannerList(srcData.list);
return slideData;
};
const getNewReportFloorData = args => {
let item = args[0].data;
let secondItem = args[1].data;
let thirdItem = args[2].data;
let forthItem = args[3];
let list = [];
let obj = {};
const data = {
newReport: {
name: '最新速报',
list: []
}
};
let adData;
let floorDatas = [];
obj.href = item[0].url;
obj.img = item[0].src;
list.push(obj);
_.forEach(secondItem, (floorData) => {
let o = {};
o.href = floorData.url;
o.img = floorData.src;
list.push(o);
});
obj.href = thirdItem[0].url;
obj.img = thirdItem[0].src;
list.push(obj);
data.newReport.list = list;
floorDatas.push(data);
if (forthItem.template_name === 'single_image') {
adData = getadbannerData(forthItem.data[0]);
floorDatas.push(adData);
}
return floorDatas;
};
// 优选品牌
const getPreBrandTopData = args => {
let item = args[0].data;
const data = {
preferenceBrands: {
name: '优选品牌',
imgBrand: [],
brandUrl: helpers.urlFormat('getbrandFloorDataAjax')
}
};
_.forEach(item, (topData) => {
let o = {};
o.href = topData.url;
o.img = topData.src;
data.preferenceBrands.imgBrand.push(o);
});
return data;
};
// 热门品类
const getHotGoodsFloorData = (args) => {
let item = args[0];
let nextItem = args[1];
let list = [];
let object = {},
keyword = [],
category = [],
brands = [],
types = [],
navs = {},
products = [];
const data = {
recommend: {
tplrecommend: []
}
};
_.forEach(item.data.menuNav.list, (it) => {
let obj = {};
obj.name = it.name;
obj.href = it.url;
category.push(obj);
});
_.forEach(item.data.menuNav.blocks, (it) => {
let obj = {};
obj.name = it.title;
obj.href = it.url;
obj.img = it.img;
keyword.push(obj);
});
_.forEach(item.data.imgs, (it, idx) => {
let obj = {};
obj.name = it.title;
obj.href = it.url;
obj.img = it.img;
if (idx === 0 || idx === 4) {
brands.push(obj);
} else {
types.push(obj);
}
});
_.forEach(nextItem.data, (it) => {
let obj = {};
obj.name = it.title;
obj.href = it.url;
obj.img = it.src;
products.push(obj);
});
navs.name = item.data.navs.list[0].name;
navs.href = item.data.navs.list[0].url;
object.name = item.data.name;
object.keyword = keyword;
object.category = category;
object.brands = brands;
object.types = types;
object.navs = navs;
object.products = products;
list.push(object);
data.recommend.tplrecommend = list;
return data;
};
// 人气单品
const getSingleHotFloorData = args => {
const len = 10;
const data = {
singlehot: {
name: '人气单品',
imgHot: []
}
};
let list = [];
let adData;
let floorDatas = [];
for (let i = 0; i < len; i++) {
let pos = i;
let val = {};
let obj = {};
if (i === 1) {
val = args[0].data[0]; // 第二个是大图
} else if (i === len - 1) {
val = args[0].data[1]; // 最后一个是大图
} else {
if (pos > 1) { // 小图
pos = pos - 1;
}
val = args[1].data[pos];
}
obj.href = val.url;
obj.img = val.src;
list.push(obj);
}
data.singlehot.imgHot = list;
floorDatas.push(data);
if (args[2].template_name === 'single_image') {
adData = getadbannerData(args[2].data[0]);
floorDatas.push(adData);
}
return floorDatas;
};
const requestContent = type => {
let data = sign.apiSign({
/* eslint-disable */
client_type: 'web',
/* eslint-enable */
content_code: channelMap[type || 'boys'].code,
gender: channelMap[type || 'boys'].gender,
page: 1,
limit: 1000
});
return serviceApi.get('/operations/api/v5/resource/home', data);
};
const floorMap = {
slide: getSlideData,
hot: getHotGoodsFloorData,
最新速报: getNewReportFloorData,
人气单品: getSingleHotFloorData,
优选品牌: getPreBrandTopData,
ad: getadbannerData
};
const processFloorData = rawData => {
let floorList = [];
_.forEach(rawData, (data, index) => {
let floorData = null;
if (data.template_name === 'recommend_content_three') {
floorData = floorMap.slide.call(null, data.data);
} else if (data.template_intro === '热门品类') {
floorData = floorMap.hot.call(null, rawData.slice(index, index + 2));
} else if (data.data.text) {
floorData = floorMap[data.data.text] &&
floorMap[data.data.text].call(null, rawData.slice(index + 1, index + 5));
}
if (!_.isNil(floorData)) {
_.isArray(floorData) ?
floorList = floorList.concat(floorData) :
floorList.push(floorData);
}
});
return floorList;
};
/**
* 获取公共配置
* @param undefined
* @return {Object} 配置对象
* 获取频道页数据
* @param {string} type 传入频道页类型,值可以是: boys, girls, kids, lifestyle
* @return {object}
*/
// const commonConfig = () => ({
// title: 'girls'
// });
exports.getContent = type => {
return Promise.all([headerModel.requestHeaderData(), requestContent(type)]).then(res => {
exports.getContent = () => {
let data = sign.apiSign({
if (res[0].code === 200 && res[1].code === 200) {
let headerData = res[0].data,
contentData = res[1].data.list;
/* eslint-disable */
client_type: 'web'
/* eslint-enable */
let data = {};
data = headerModel.setHeaderData(headerData, type);
data.module = 'channel';
data.page = type;
data.footerTop = true;
data.channel = processFloorData(contentData);
return data;
}
});
};
// 优选品牌楼层floorData-ajax
exports.getbrandFloorDataAjax = type => {
return requestContent(type).then(res => {
if (res.code === 200) {
let contentData = res.data.list;
let data = {
logoBrand: [],
moreBrand: ''
};
_.forEach(contentData[6].data, (floorData) => {
let o = {};
o.href = floorData.url;
o.img = helpers.image(floorData.src, 185, 86, 2);
data.logoBrand.push(o);
});
data.moreBrand = contentData[7].data[0].url;
serviceApi.get('/operations/api/v5/resource/home', data).then(response => {
console.log(response);
return data;
}
});
};
... ...
... ... @@ -6,7 +6,7 @@
'use strict';
const router = require('express').Router(); // eslint-disable-line
const router = require('express').Router(); // eslint-disable-line
const cRoot = './controllers';
// Your controller here
... ... @@ -14,4 +14,6 @@ const channelController = require(`${cRoot}/index`);
router.get('/boys', channelController.boysIndex);
router.get('/getbrandFloorDataAjax', channelController.getbrandFloorDataAjax);
module.exports = router;
... ...
this is boys
<div class="home-page yoho-page boys" data-page="boys">
{{# channel}}
{{! 头部banner}}
{{# slide}}
{{> banner}}
{{/ slide}}
{{! 新品速报}}
{{# newReport}}
<div class="new-report imgopacity clearfix">
{{> floor-header}}
<ul class="report-list clearfix">
{{# list}}
{{#unless @last}}
<li>
<a href="{{href}}" target= "_blank">
{{#if @first}}
<img class="lazy" data-original="{{image img 377 504}}" alt="" >
{{^}}
<img class="lazy" data-original="{{image img 185 248}}" alt="" >
{{/if}}
</a>
</li>
{{/unless}}
{{/ list}}
</ul>
{{# list}}
{{#if @last}}
<div class="last-item">
<a href="{{href}}" target= "_blank">
<img class="lazy" data-original="{{image img 377 504}}" alt="">
</a>
</div>
{{/if}}
{{/ list}}
</div>
{{/ newReport}}
{{! 优选品牌}}
{{# preferenceBrands}}
<div class="preference-brand">
{{> floor-header}}
<div class="img-brand">
<ul class="img-list imgopacity clearfix">
{{# imgBrand}}
<li class="img-item">
<a href="{{href}}" target= "_blank">
<img src="{{img}}" alt="">
</a>
</li>
{{/ imgBrand}}
</ul>
<div class="img-brand-switch">
<a class="prev" href="javascript:;">
<span class="iconfont">&#xe60c;</span>
</a>
<a class="next" href="javascript:;">
<span class="iconfont">&#xe60b;</span>
</a>
</div>
</div>
<div class="logo-brand imgopacity" data-url="{{brandUrl}}"></div>
</div>
{{/ preferenceBrands}}
{{! 单品/广告}}
{{# singlehot}}
{{> boy-singlehot}}
{{/ singlehot}}
{{! 广告}}
{{# adbanner}}
<div class="floor-ad">
<a href="{{href}}" target= "_blank"><img class="lazy" data-original="{{image img 1150 129}}"/></a>
</div>
{{/ adbanner}}
{{! 品类推荐}}
{{# recommend}}
{{> boy-recommend}}
{{/ recommend}}
{{! 新品上架}}
{{# newArrivls}}
{{> commodity}}
{{/ newArrivls}}
{{/ channel}}
</div>
... ...
{{# tplrecommend}}
<div class="tpl-recommend clearfix">
{{> floor-header}}
<div class="tpl-body clearfix">
<div class="tpl-nav">
<div class="tpl-keywords">
{{#each keyword}}
<a class="keywords{{@index}}" title="{{name}}" href="{{href}}" target= "_blank"><img class="lazy" src="{{image img 185 152}}"/></a>
{{/each}}
</div>
<div class="tpl-category clearfix">
{{#each category}}
<a href="{{href}}" target= "_blank">{{name}}</a>
{{/each}}
</div>
</div>
<div class="tpl-brands imgopacity clearfix">
<ul>
{{#each brands}}
<li><a title="{{name}}" href="{{href}}" target= "_blank"><img class="lazy" src="{{image img 378 248}}"/></a></li>
{{/each}}
</ul>
</div>
<div class="tpl-types imgopacity clearfix">
<ul>
{{#each types}}
<li><a title="{{name}}" href="{{href}}" target= "_blank"><img class="lazy" src="{{image img 185 248}}"/></a></li>
{{/each}}
</ul>
</div>
</div>
<div class="tpl-products imgopacity clearfix">
<ul>
{{#each products}}
<li><a href="{{href}}" title="{{name}}" target= "_blank"><img class="lazy" src="{{image img 222 298}}"/></a></li>
{{/each}}
</ul>
</div>
</div>
{{/ tplrecommend}}
... ...
<div class="singlehot clearfix">
{{> floor-header}}
<ul class="g-list imgopacity">
{{#each imgHot}}
{{#if @last}}
<li><a class="impo{{@index}}" href="{{href}}" target= "_blank"><img class="lazy" src="{{image img 378 248}}"/></a></li>
{{^}}
<li><a class="impo{{@index}}" href="{{href}}" target= "_blank"><img class="lazy" src="{{image img 185 248}}"/></a></li>
{{/if}}
{{/each}}
</ul>
</div>
... ...
<div class="commodity clearfix" id="newarrivals">
{{> floor-header}}
<div class="goods-container clearfix">
</div>
<div class="loading">
<a href="{{href}}" target= "_blank">Loading...</a>
</div>
</div>
... ...
/**
* index controller
* @author: 赵彪<bill.zhao@yoho.cn>
* @date: 2016/05/03
*/
'use strict';
const headerModel = require('../../../doraemon/models/header');
exports.index = (req, res) => {
headerModel.requestHeaderData()
.then(response => {
let data = headerModel.setHeaderData(response.data, 'boys');
data.module = 'index';
data.page = 'index';
data.footerTop = true;
res.render('index', data);
})
.catch(() => {
res.render('index', {devEnv: true, pageErr: true});
});
};
/**
* sub app index
* @author: yyqing<yanqing.yang@yoho.cn>
* @date: 2016/05/03
*/
var express = require('express'),
path = require('path'),
hbs = require('express-handlebars');
var app = express();
// set view engin
var doraemon = path.join(__dirname, '../../doraemon/views'); // parent view root
app.set('views', path.join(__dirname, 'views/action'));
app.engine('.hbs', hbs({
extname: '.hbs',
defaultLayout: 'layout',
layoutsDir: doraemon,
partialsDir: ['./views/partial', `${doraemon}/partial`],
helpers: 'helpers'
}));
// router
app.use(require('./router'));
module.exports = app;
/**
* router of sub app index
* @author: yyqing<yanqing.yang@yoho.cn>
* @date: 2016/05/03
*/
'use strict';
const express = require('express');
const router = express.Router(); // eslint-disable-line
const cRoot = './controllers';
const homeController = require(`${cRoot}/index`);
// Your controller here
router.get('/', homeController.index);
module.exports = router;
<div class="yoho-page center-content">
<p>body</p>
</div>
... ... @@ -18,32 +18,225 @@ const outletsSimulation = require('../models/simulation');
* @return {[type]} [description]
*/
exports.index = (req, res) => {
res.render('outlets/index', {});
let data = {};
// headerModel.requestHeaderData()
// .then(response => {
// response = headerModel.setHeaderData(response.data, 'outlets');
//
// response.module = 'product';
// response.page = 'outlets';
// response.footerTop = true;
// response.devEnv = true;
//
// // 假数据输出
// res.render('outlets/index', Object.assign(response, simulation.saleIndex()));
//
// // 真实数据输出
// /* return sale.getSaleDate().then(result => {
//
// response.result = result;
// response.resultShow = JSON.stringify(result, null, 4);
//
// res.render('sale/index', response);
// });*/
// })
// .catch(() => {
// res.render('error', { devEnv: true, pageErr: true });
// });
data.module = 'product';
data.page = 'outlets';
data.footerTop = true;
data.devEnv = true;
data.banner = [
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
},
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
},
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
}
];
data.column = [
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
},
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
},
{
href: '#',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/25/09/01ee927cf2bec307e50dbc437141665090.jpg?imageView2/1/w/{width}/h/{height}'
}
];
data.limitedBuy = {
name: '限时嗨购',
topic: [
{
href: '#',
img: 'http://img11.static.yhbimg.com/yhb-img01/2016/05/25/11/01d71a4867ac110b1894504da65b5cf596.jpg?imageView2/1/w/{width}/h/{height}',
logo: '',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
},
{
href: '#',
img: 'http://img11.static.yhbimg.com/yhb-img01/2016/05/25/11/01d71a4867ac110b1894504da65b5cf596.jpg?imageView2/1/w/{width}/h/{height}',
logo: '',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
},
{
href: '#',
img: 'http://img11.static.yhbimg.com/yhb-img01/2016/05/25/11/01d71a4867ac110b1894504da65b5cf596.jpg?imageView2/1/w/{width}/h/{height}',
logo: '',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
}
],
extra: {
sourceImg: {
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/04/13/01/023d062b8384103df7a8dfada98afaf204.jpg?imageView2/1/w/{width}/h/{height}'
},
hotType: {
title: '热销推荐',
classify: [
{
href: '#',
name: '上衣'
},
{
href: '#',
name: 'T恤'
},
{
href: '#',
name: '裤子'
}
]
},
trendGood: {
title: '潮品推荐',
goods: [
{
href: '#',
img: 'http://img13.static.yhbimg.com/goodsimg/2015/08/04/10/02129fcc058455de1615ce770d3a4555a6.jpg?imageView/1/w/{width}/h/{height}',
name: 'Life·After Life 像素风sneaker印花长袖衬衫',
market: '¥260',
sale: '¥203',
discount: '2'
},
{
href: '#',
img: 'http://img13.static.yhbimg.com/goodsimg/2015/08/04/10/02129fcc058455de1615ce770d3a4555a6.jpg?imageView/1/w/{width}/h/{height}',
name: 'Life·After Life 像素风sneaker印花长袖衬衫',
market: '¥260',
sale: '¥203',
discount: '2'
},
{
href: '#',
img: 'http://img13.static.yhbimg.com/goodsimg/2015/08/04/10/02129fcc058455de1615ce770d3a4555a6.jpg?imageView/1/w/{width}/h/{height}',
name: 'Life·After Life 像素风sneaker印花长袖衬衫',
market: '¥260',
sale: '¥203',
discount: '2'
},
{
href: '#',
img: 'http://img13.static.yhbimg.com/goodsimg/2015/08/04/10/02129fcc058455de1615ce770d3a4555a6.jpg?imageView/1/w/{width}/h/{height}',
name: 'Life·After Life 像素风sneaker印花长袖衬衫',
market: '¥260',
sale: '¥203',
discount: '2'
}
]
}
}
};
data.nearOver = {
name: '即将结束',
topic: [
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
},
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
},
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
},
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
discount: '7.5',
title: '多元化潮流风格',
limit: '1500'
}
]
};
data.goodsBoard = {
goodsMenu: {
title: '最新折扣',
menuList: [
{
name: 'T恤',
href: '#',
cur: true
},
{
name: '衬衫',
href: '#'
},
{
name: '休闲裤',
href: '#'
},
{
name: '连衣裙',
href: '#'
}
],
more: '#'
},
sort: {
sortType: [
{
name: '最新',
active: true,
href: '',
hasSortOrient: true
}
]
},
list: [
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
price: '¥340',
discount: '7.5',
title: '多元化潮流风格'
},
{
href: '#',
img: 'http://img12.static.yhbimg.com/yhb-img01/2016/02/05/08/02bb2c8efb12319cf50f247bae13d60dde.jpg?imageView/1/w/{width}/h/{height}',
logo: 'http://img10.static.yhbimg.com/brandLogo/2012/08/02/15/0119ad6a2407f5505268688a470d6f6c13.jpg',
price: '¥340',
discount: '7.5',
title: '多元化潮流风格'
}
]
};
res.render('outlets/index', data);
};
/**
... ...
... ... @@ -501,10 +501,20 @@ exports.other = () => {
}
],
pageCounts: {
href: 'wdad',
count: 1
},
pageCounts: [
{
href: 'wdad',
count: 100
},
{
href: 'wdad',
count: 80
},
{
href: 'wdad',
count: 60
}
],
// curpage 前面的点击的href
preHref: '213132',
... ... @@ -739,6 +749,126 @@ exports.outletBanner = () => {
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250'
}]
}
},
flashSale: {
name: '限时嗨购',
imgHot: [{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
},
{
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
img: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/560/h/260',
logo: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/100/h/60',
name: '上衣',
price: '12',
count: '7'
}]
},
goodsMenu: {
title: '最新折扣',
menuList: [
{
cur: true,
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}, {
cur: false,
href: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250',
name: '棉衣'
}
],
more: 'http://img10.static.yhbimg.com/yhb-img01/2016/05/13/19/0144078a008a5dc2be52a6ec65c74c1f2c.jpg?imageView2/1/w/180/h/250'
}
};
};
... ...
... ... @@ -44,4 +44,14 @@
{{> index/outlets-recommend}}
{{/ recommend}}
{{! 限时嗨购}}
{{# flashSale}}
{{> index/flash-sale}}
{{/ flashSale}}
{{! 最新折扣}}
{{> outlets/main-product}}
<!-- {{# newDiscount}} -->
<!-- {{/ newDiscount}} -->
</div>
\ No newline at end of file
... ...
<p>outlets index page</p>
<div class="outlets-page yoho-page">
<div class="center-content">
<ul class="column-img-tab">
{{# column}}
<li>
<a href="{{href}}"><img class="lazy" data-original="{{image img 378 175}}"></a>
</li>
{{/ column}}
</ul>
{{> outlets/limited-buy}}
{{> outlets/near-over}}
{{> outlets/main-product}}
</div>
</div>
... ...
{{# goodsMenu}}
<div class="all-goods-menu">
<span class="menu-tag">{{title}}</span>
<ul class="menu-list">
{{#each menuList}}
<li class="{{#if cur}}on{{/if}}"><a class="pjax" href="{{href}}">{{name}}</a></li>
{{/each}}
</ul>
{{#if more}}
<a href="{{more}}" class="more">MORE</a>
{{/if}}
</div>
{{/ goodsMenu}}
\ No newline at end of file
... ...
{{# sort}}
<div class="sort-pager">
{{# sortType}}
<a class="sort-type{{#if active}} active{{/if}} pjax" href="{{href}}">
{{name}}
{{#if hasSortOrient}}
{{#if active}}
{{#if desc}}
<span class="active-icon iconfont">&#xe603;</span>
{{^}}
<span class="active-icon iconfont">&#xe604;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe614;</span>
{{/if}}
{{^}}
<span class="iconfont">&#xe604;</span>
{{/if}}
</a>
{{/ sortType}}
{{#if list}}
{{#if oldPage}}
<div class="pager-wrap">
<p class="page-orient">
{{#if preHref}}
<a class="pjax" href="{{preHref}}">
<span class="iconfont">&#xe615;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe615;</span>
{{/if}}
<span>
<i>{{curPage}}</i>/{{pageCount}}
</span>
{{#if nextHref}}
<a class="pjax" href="{{nextHref}}">
<span class="iconfont">&#xe601;</span>
</a>
{{^}}
<span class="dis-icon iconfont">&#xe601;</span>
{{/if}}
</p>
</div>
{{^}}
<div class="page-nav">
{{#if preHref}}
<a class="pjax" href="{{preHref}}">
<span class="page-prev"><i class="arrow-left"></i></span>
</a>
{{^}}
<span class="page-prev"><i class="arrow-left"></i></span>
{{/if}}
{{#if nextHref}}
<a class="pjax" href="{{nextHref}}">
<span class="page-next">
下一页
<i class="arrow-right"></i>
<i class="pages">{{curPage}}</i>/{{pageCount}}
</span>
</a>
{{^}}
<span class="page-next">
下一页
<i class="arrow-right"></i>
<i class="pages">{{curPage}}</i>/{{pageCount}}
</span>
{{/if}}
</div>
{{/if}}
{{/if}}
</div>
{{/ sort}}
\ No newline at end of file
... ...
<div class="flash-sale clearfix">
{{> index/floor-header}}
<div class="flash-sale-list">
<ul class="g-list imgopacity clearfix">
{{#each imgHot}}
<li>
<a href="{{href}}" target= "_blank"><div class="flash-sale-banner">
<img src="{{img}}"/></div>
<div class="flash-sale-bottom">
<p class="flash-sale-count">{{count}}折起</p>
<p class="flash-sale-name">{{name}}</p>
<p class="flash-sale-timer">timer</p>
<div class="flash-sale-logo">
<img src="{{logo}}"/>
</div>
</div>
</a>
</li>
{{/each}}
</ul>
</div>
</div>
\ No newline at end of file
... ...
<div class="new-discount">
<p class="new-discount-label">最新折扣</p>
<ul class="discount-nav" urlLocation="{{urlLocation}}">
{{#discountNavItem}}
<li class="discount-nav-list" urlLocation='{{urlLocation}}'>{{title}}</li>
{{/discountNavItem}}
</ul>
<a url="{{discountMore}}">MORE</a>
</div>
\ No newline at end of file
... ...
{{# trendGood}}
<div class="extra-pack">
<div class="extra-title">{{title}}</div>
<div class="good-list">
<div class="list-page">
{{# goods}}
<div class="good-item">
<a href="{{href}}" target="_blank">
<img class="lazy" data-original="{{image img 90 120}}">
</a>
<div class="item-text">
<a href="{{href}}">
{{name}}
<p class="price">
<span class="sale-price">{{sale}}</span>
<span class="market-price">{{market}}</span>
<label class="discount">{{discount}}</label>
</p>
</a>
</div>
</div>
{{/ goods}}
</div>
</div>
<div class="good-page-btns">
<label class="iconfont pre-page-btn">&#xe609;</label>
<label class="iconfont next-page-btn">&#xe608;</label>
</div>
</div>
{{/ trendGood}}
\ No newline at end of file
... ...
{{# hotType}}
<div class="extra-pack">
<div class="extra-title">{{title}}</div>
<ul class="type-list">
{{# classify}}
<li><a href="{{href}}" target="_blank">{{name}}</a></li>
{{/ classify}}
</ul>
</div>
{{/ hotType}}
... ...
{{# limitedBuy}}
<div class="limited-buy clearfix">
{{> common/floor-header}}
<div class="limit-main">
<div class="limit-extra right">
{{# extra}}
{{# sourceImg}}
<a href="{{href}}" target="_blank">
<img class="lazy" data-original="{{image img 380 506}}" width=100%>
</a>
{{/ sourceImg}}
{{> outlets/extra-recommend}}
{{> outlets/extra-product}}
{{/ extra}}
</div>
<div class="limit-list">
{{# topic}}
<div class="limit-item">
<a href="{{href}}" target="_blank">
<img class="lazy" data-original="{{image img 378 284}}">
</a>
<div class="item-info">
<a href="{{href}}" target="_blank">
222
</a>
</div>
</div>
{{/ topic}}
</div>
</div>
</div>
{{/ limitedBuy}}
\ No newline at end of file
... ...
{{# goodsBoard}}
<div class="main-product">
{{> common/goods-menu}}
<div class="sort-layer">
<div class="full-line">
{{> common/sort-pager}}
</div>
</div>
<div class="product-list clearfix">
{{# list}}
<div class="list-item">
<a class="thumb" href="{{href}}" target="_blank">
<img class="lazy" data-original="{{image img 235 314}}">
</a>
<div class="detail-text">
<a class="name" href="{{href}}" target="_blank">{{title}}</a>
<p>
<span class="price">{{price}}</span>
<label class="discount">{{discount}}</label>
</p>
</div>
</div>
{{/ list}}
</div>
</div>
{{/ goodsBoard}}
\ No newline at end of file
... ...
{{# nearOver}}
<div class="near-over">
{{> common/floor-header}}
<div class="activity-list clearfix">
<ul>
{{# topic}}
<li>
<a href="{{href}}" target="_blank">
<img class="lazy" data-original="{{image img 565 263}}">
</a>
<div class="item-info">
<a href="{{href}}" target="_blank">
<img src="{{logo}}" class="brand-logo">
</a>
<div class="activity-info">
<p>
<i>{{discount}}</i>折起
<a class="title" href="{{href}}">{{title}}</a>
</p>
<p>
<span class="iconfont">&#xe60a;</span>
<label class="time">仅剩22小时30分10秒</label>
</p>
</div>
</div>
</li>
{{/ topic}}
</ul>
</div>
</div>
{{/ nearOver}}
\ No newline at end of file
... ...
... ... @@ -11,29 +11,31 @@ const isTest = process.env.NODE_ENV === 'test';
module.exports = {
port: 6002,
siteUrl: 'http://localhost:6002/',
domains: {
api: 'http://api.yoho.cn/', // 192.168.102.205:8080 testapi.yoho.cn:28078
service: 'http://testservice.yoho.cn:28077',
api: 'http://testapi.yoho.cn:28078/',
service: 'http://testservice.yoho.cn:28077/',
search: 'http://192.168.10.64:8080/yohosearch/'
},
useOneapm: false,
useCache: true,
useCache: false,
memcache: {
master: ['192.168.102.168:12580'],
slave: ['192.168.102.168:12580'],
session: ['192.168.102.168:12580'],
timeout: 5000
master: ['192.168.102.163:11213'],
slave: ['192.168.102.163:11213'],
session: ['192.168.102.161:11213'],
timeout: 1000,
retries: 0
},
loggers: {
infoFile: {
name: 'info',
level: 'info',
filename: 'info.log'
filename: 'logs/info.log'
},
errorFile: {
name: 'error',
level: 'error',
filename: 'error.log',
filename: 'logs/error.log',
handleExceptions: true
},
udp: { // send by udp
... ... @@ -52,11 +54,23 @@ module.exports = {
if (isProduction) {
Object.assign(module.exports, {
appName: 'www.yohobuy.com',
useOneapm: true
domains: {
api: 'http://api.yoho.yohoops.org/',
service: 'http://service.yoho.yohoops.org/'
},
memcache: {
master: ['172.31.22.1:12111', '172.31.20.56:12111', '172.31.31.146:12111'],
slave: ['172.31.22.1:12112', '172.31.20.56:12112', '172.31.31.146:12112'],
session: ['172.31.22.1:12111', '172.31.20.56:12111', '172.31.31.146:12111'],
timeout: 3000
},
useOneapm: true,
useCache: true
});
} else if (isTest) {
Object.assign(module.exports, {
appName: 'www.yohobuy.com for test',
useOneapm: true
useOneapm: true,
useCache: true
});
}
... ...
... ... @@ -183,12 +183,14 @@ exports.setHeaderData = (resData, type) => {
header: true,
headType: type,
yohoGroup: getMenuData(),
navbars: getNavBar(resData),
subNav: getSubNav(resData, type)
navbars: resData ? getNavBar(resData) : [],
subNav: resData ? getSubNav(resData, type) : []
}
};
data.headerData.navbars[getChannelIndex(type)].active = true;
if (data.headerData.navbars.length) {
data.headerData.navbars[getChannelIndex(type)].active = true;
}
return _.merge(config, data);
};
... ... @@ -206,5 +208,5 @@ exports.requestHeaderData = () => {
/* eslint-enable */
});
return serviceApi.get('/operations/api/v6/category/getCategory', data, true);
return serviceApi.get('operations/api/v6/category/getCategory', data, true);
};
... ...
... ... @@ -15,9 +15,9 @@
<link rel="dns-prefetch" href="//img12.static.yhbimg.com">
<link rel="dns-prefetch" href="//img13.static.yhbimg.com">
{{#if devEnv}}
<link rel="stylesheet" href="//localhost:5002/css/index.css">
<link rel="stylesheet" href="//localhost:5002/css/index.css">
{{^}}
<link rel="stylesheet" href="//cdn.yoho.cn/m-yohobuy-node/{{version}}/index.css">
<link rel="stylesheet" href="//cdn.yoho.cn/yohobuy-node/{{version}}/index.css">
{{/if}}
</head>
<body>
... ... @@ -29,9 +29,9 @@
{{/if}}
{{> footer}}
{{#if devEnv}}
<script src="//localhost:5002/{{module}}.{{page}}.js"></script>
<script src="//localhost:5002/{{module}}.{{page}}.js"></script>
{{^}}
<script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>
<script src="//cdn.yoho.cn/yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>
{{/if}}
</body>
</html>
... ...
<div class="slide-container {{#if pagination}}slide-thumb-container{{/if}}">
<div class="slide-wrapper">
<ul>
{{# list}}
<li style="{{#if bgColor}}background:{{bgColor}}{{/if}}">
<a href="{{href}}" target= "_blank">
{{#if @first}}
<img src="{{image img 1150 450}}">
{{^}}
<img class="lazy" data-original="{{image img 1150 450}}" alt="">
{{/if}}
</a>
{{# tips}}
<div class="slide-tips">
<div class="g-mark"></div>
<p>{{.}}</p>
</div>
{{/ tips}}
</li>
{{/ list}}
</ul>
</div>
{{#if pagination}}
<div class="thumb-pagination">
<ul class="clearfix">
{{# pagination}}
<li>
<a href="{{href}}" target="_blank"></a>
<img src="{{image img 138 54}}" alt="">
</li>
{{/ pagination}}
</ul>
</div>
{{/if}}
</div>
<div class="slide-container-placeholder {{#if pagination}}slide-thumb-container-placeholder{{/if}}"></div>
... ...
<div class="floor-header clearfix">
<h2 class="floor-title">{{name}}</h2>
{{#if navs}}
<ul class="header-navs">
{{# navs}}
<li data-classify="{{id}}">
<a target="_blank" href="{{href}}">{{name}}</a>
</li>
{{/ navs}}
</ul>
{{/if}}
</div>
... ...
... ... @@ -15,25 +15,25 @@
<ul class="two-dim clearfix">
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:3000/img/layout/qr-app.png">
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-app.png">
{{^}}
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/qr-app.png">
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-app.png">
{{/if}}
<p>YOHO!有货</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:3000/img/layout/qr-weixin.png">
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weixin.png">
{{^}}
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/qr-app.png">
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weibo.png">
{{/if}}
<p>微信</p>
</li>
<li class="left">
{{#if devEnv}}
<img class="dim-img lazy" data-original="http://localhost:3000/img/layout/qr-weibo.png">
<img class="dim-img lazy" data-original="http://localhost:5002/img/layout/qr-weibo.png">
{{^}}
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/qr-app.png">
<img class="dim-img lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/qr-weixin.png">
{{/if}}
<p>微博</p>
</li>
... ... @@ -139,27 +139,27 @@
<li>
<a href="http://www.yohomars.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:3000/img/layout/mars.png">
<img class="lazy" data-original="http://localhost:5002/img/layout/mars.png">
{{^}}
<img class="lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/mars.png">
<img class="lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/mars.png">
{{/if}}
</a>
</li>
<li>
<a href="http://app.yohoshow.com/" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:3000/img/layout/show.png">
<img class="lazy" data-original="http://localhost:5002/img/layout/show.png">
{{^}}
<img class="lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/show.png">
<img class="lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/show.png">
{{/if}}
</a>
</li>
<li>
<a href="http://www.yoho.cn/product#yoho" target="_blank">
{{#if devEnv}}
<img class="lazy" data-original="http://localhost:3000/img/layout/yoho.png">
<img class="lazy" data-original="http://localhost:5002/img/layout/yoho.png">
{{^}}
<img class="lazy" data-original="http://cdn.yoho.cn/m-yohobuy-node/img/layout/yoho.png">
<img class="lazy" data-original="http://cdn.yoho.cn/yohobuy-node/assets/img/layout/yoho.png">
{{/if}}
</a>
</li>
... ... @@ -362,6 +362,6 @@
</div>
</div>
<div class="return-top hide">
<span class="iconfont">&#xe610;</span>
<span class="iconfont">&#xe607;</span>
</div>
</div>
... ...
... ... @@ -5,7 +5,6 @@
*/
'use strict';
const rp = require('request-promise');
const qs = require('querystring');
const md5 = require('md5');
... ... @@ -16,15 +15,11 @@ const Timer = require('./timer');
const config = require('../config/common');
const api = config.domains.api;
const serviceApi = config.domains.service;
const searchApi = config.domains.search;
let ApiUrl;
class API {
class Http {
constructor() {
ApiUrl = api;
constructor(baseUrl) {
this.ApiUrl = baseUrl;
}
/**
... ... @@ -38,40 +33,50 @@ class API {
* 调用接口
*/
_requestFromAPI(options, cacheOption, reqId) {
let timer = new Timer();
const timer = new Timer();
const method = options.method || 'get';
log.info(`${method} api: ${options.url}?${qs.stringify(options.qs)}`);
timer.put('getApi');// 统计时间开始
log.info(`get api: ${options.url}?${qs.stringify(options.qs)}`);
return rp(options).then((result) => {
let duration = timer.put('getApi');// 统计时间结束
const duration = timer.put('getApi');// 统计时间结束
// 数据校验
if (!result || !result.code) {
log.error('error: 接口返回的数据结构错误,非 JSON');
return Promise.reject({
statusCode: 500,
message: '接口返回内容格式错误'
});
}
log.info(`get api success: use: ${duration}ms`);
// 写缓存, 否则返回 Slave 缓存服务器的数据
if (config.useCache && cacheOption) {
reqId = reqId || this._getReqId(options);
// 数据校验无误,写缓存, 否则返回 Slave 缓存服务器的数据
if (result && result.code) {
let cacheTime = _.isNumber(cacheOption) ? cacheOption : 60;
const cacheTime = _.isNumber(cacheOption) ? cacheOption : 60;
const catchErr = (err) => {
log.error(`cache: ${err.toString()}`);
};
cache.set(`apiCache:${reqId}`, result, cacheTime);
cache.setSlave(`apiCache:${reqId}`, result, cacheTime);
} else {
return this._requestFromCache(options, true);
}
reqId = reqId || this._getReqId(options);
cache.set(`apiCache:${reqId}`, result, cacheTime).catch(catchErr);
cache.setSlave(`apiCache:${reqId}`, result, 86400).catch(catchErr); // 二级缓存存储一天
}
log.info(`get api success: use: ${duration}ms`);
return result;
}).catch((error)=>{
let duration = timer.put('getApi');// 统计时间结束
}).catch((err)=> {
const duration = timer.put('getApi');// 统计时间结束
log.error(`get api fail: use: ${duration}ms, statusCode: ${error.statusCode}, error: ${error.message}`);
log.error(`${method} api fail: use: ${duration}ms, code:${err.statusCode}, error: ${err.message}`);
log.error(`API: ${options.url}?${qs.stringify(options.qs)}`);
// 使用缓存的时候,读取二级缓存
if (config.useCache) {
if (config.useCache && cacheOption) {
return this._requestFromCache(options, true);
}
return Promise.reject({
error: '接口调用失败'
return Promise.resolve({
code: 500,
message: '接口调用失败'
});
});
}
... ... @@ -83,10 +88,10 @@ class API {
* @return {[type]}
*/
_requestFromCache(options, slave) {
let reqId = this._getReqId(options);
let getCache = slave ? cache.getFromSlave : cache.get;
const reqId = this._getReqId(options);
const getCache = slave ? cache.getFromSlave : cache.get;
log.info(`get cache: ${reqId}, url: ${options.url}?${qs.stringify(options.qs)}`);
log.info(`get ${slave ? 'slave' : 'master'} cache: ${reqId}, url: ${options.url}?${qs.stringify(options.qs)}`);
return getCache(`apiCache:${reqId}`).then((result) => {
if (!_.isNil(result)) {
try {
... ... @@ -97,14 +102,22 @@ class API {
}
}
// 读取缓存失败,并且不是二级缓存的时候,调用 API
if (!slave) {
return this._requestFromAPI(options, true, reqId);
}
}).catch(() => {
log.error(slave ? 'get slave cache fail' : 'get master cache fail');
// 读取缓存失败,并且不是二级缓存的时候,调用 API
if (!slave) {
return this._requestFromAPI(options, true, reqId);
}
return Promise.resolve({
code: 500,
message: '接口调用失败'
});
});
}
... ... @@ -116,8 +129,8 @@ class API {
* @return {[type]}
*/
get(url, data, cacheOption) {
let options = {
url: `${ApiUrl}${url}`,
const options = {
url: `${this.ApiUrl}${url}`,
qs: data,
json: true,
timeout: 3000
... ... @@ -137,8 +150,8 @@ class API {
* @param data Obejct
*/
post(url, data) {
let options = {
url: `${ApiUrl}${url}`,
const options = {
url: `${this.ApiUrl}${url}`,
form: data,
method: 'post',
json: true,
... ... @@ -151,25 +164,23 @@ class API {
all(list) {
if (_.isArray(list)) {
return Promise.all(list);
} else {
return Promise.reject(Error('the parameters of api all method should be Array!'));
}
throw Error('the parameters of api all method should be Array!');
}
}
class ServiceAPI extends API {
class API extends Http {
constructor() {
super();
ApiUrl = serviceApi;
super(api);
}
}
class SearchAPI extends API {
class ServiceAPI extends Http {
constructor() {
super();
ApiUrl = searchApi;
super(serviceApi);
}
}
exports.API = API;
exports.ServiceAPI = ServiceAPI;
exports.SearchAPI = SearchAPI;
... ...
... ... @@ -4,12 +4,10 @@
* @author bikai kai.bi@yoho.cn
* @date 2016/05/16
*/
'use strict';
const Promise = require('bluebird');
const Memcached = require('memcached');
const _ = require('lodash');
const log = require('./logger');
const config = require('../config/common');
let master = new Memcached(config.memcache.master, config.memcache);
... ... @@ -77,7 +75,6 @@ exports.getMultiFromSlave = (list) => {
exports.set = (key, value, lifetime) => {
lifetime = lifetime || 86400;
log.info(`write cache: ${key}`);
if (_.isObject(value)) {
value = JSON.stringify(value);
}
... ...
... ... @@ -26,12 +26,10 @@ camelCaseArray = (list) => {
};
camelCase = (data) => {
if (_.isObject(data)) {
data = camelCaseObject(data);
}
if (_.isArray(data)) {
data = camelCaseArray(data);
} else if (_.isObject(data)) {
data = camelCaseObject(data);
}
return data;
... ...
/**
* 获取 UID
* @param {[object]} req
* @return {[string]}
*/
exports.getUid = (req) => {
const cookie = req.cookies._UID;
let _uid = 0;
let cookieList;
if (req.isApp) {
return req.query.uid || 0;
}
if (cookie) {
cookieList = cookie.split('::');
if (cookieList[1] && !isNaN(cookieList[1])) {
_uid = cookieList[1];
}
}
return _uid;
};
... ...
... ... @@ -6,16 +6,16 @@
'use strict';
const querystring = require('querystring');
const _ = require('lodash');
const config = require('../config/common');
const moment = require('moment');
const config = require('../config/common');
/**
* 七牛图片路径处理
* @param {[tring]} url
* @param {[tring]} width
* @param {[tring]} height
* @param {[tring]} mode
* @return {[tring]}
* @param {[string]} url
* @param {[string]} width
* @param {[string]} height
* @param {[string]} mode
* @return {[string]}
*/
exports.image = (url, width, height, mode) => {
mode = _.isNumber(mode) ? mode : 2;
... ... @@ -24,6 +24,21 @@ exports.image = (url, width, height, mode) => {
};
/**
* 条件判断
* @param {[string]} v1
* @param {[string]} v2
* @param {[object]} options 上下文环境,一般不手动传
* @return {[boolen]}
*/
exports.ifEqualTo = (v1, v2, _options) => {
if (v1 === v2) {
return _options.fn(this); // eslint-disable-line
}
return _options.inverse(this); // eslint-disable-line
};
/**
* 站内地址格式化
* @param {[string]} uri 路径
* @param {[object]} qs 查询字符串
... ... @@ -31,7 +46,7 @@ exports.image = (url, width, height, mode) => {
* @return {[string]}
*/
exports.urlFormat = (uri, qs, module) => {
const subDomain = '.m.yohobuy.com';
const subDomain = '.yohobuy.com';
const subName = {
default: config.siteUrl,
guang: `//guang${subDomain}`,
... ... @@ -78,6 +93,27 @@ exports.upperCase = (str) => {
};
/**
* 时间格式化
* @param format 格式化token @see{http://momentjs.cn/docs/#/displaying/format/}
* @param date 日期或者数字
* @return string
*
*/
exports.dateFormat = (format, date) => {
if (typeof format !== 'string' || typeof date === 'undefined') {
return '';
} else {
if (date instanceof Date) {
return moment(date).format(format);
} else {
const d = moment.unix(date);
return moment(d).utc().format(format);
}
}
};
/**
* 时间差格式化
* @param {[string]} format 格式化字符串
* @param {[number]} diff 相差值
... ...
/**
* 日志工具类
* @author: hbomb<qiqi.zhou@yoho.cn>
* @date: 2016/05/06
*/
'use strict';
'use strict';
let winston = require('winston'),
config = require('../config/common'),
FileTransport = require('winston-daily-rotate-file');
const winston = require('winston');
const config = require('../config/common');
const FileTransport = require('winston-daily-rotate-file');
require('influxdb-winston');
require('influxdb-winston');
let logger = new (winston.Logger)({
transports: [
new (FileTransport)(config.loggers.infoFile),
new (FileTransport)(config.loggers.errorFile),
new (winston.transports.UdpTransport)(config.loggers.udp),
new (winston.transports.Console)(config.loggers.console)
]
});
const logger = new (winston.Logger)({
transports: [
new (FileTransport)(config.loggers.infoFile),
new (FileTransport)(config.loggers.errorFile),
new (winston.transports.UdpTransport)(config.loggers.udp),
new (winston.transports.Console)(config.loggers.console)
],
exitOnError: false
});
module.exports = logger;
module.exports = logger;
... ...
... ... @@ -23,9 +23,9 @@ const privateKey = {
* @return {Object} 排序之后的参数对象
*/
const packageSort = argument => {
let newObj = {};
const newObj = {};
for (let k of Object.keys(argument).sort()) {
for (const k of Object.keys(argument).sort()) {
newObj[k] = argument[k];
}
... ... @@ -38,10 +38,10 @@ const packageSort = argument => {
* @return {string} 生成的签名字符串
*/
const makeSign = argument => {
let qs = [];
const qs = [];
_.forEach(argument, function(value, key) {
qs.push(key + '=' + _.trim(value));
_.forEach(argument, (value, key) => {
qs.push(`${key}=${_.trim(value)}`);
});
return md5(qs.join('&')).toLowerCase();
... ... @@ -71,8 +71,10 @@ exports.apiSign = (params) => {
// 检查签名,APP 访问 H5 页面的时候需要检查
exports.checkSign = (params) => {
let clientSecret = params.client_secret, // eslint-disable-line camelcase
sortedParams;
const // eslint-disable-line camelcase
clientSecret = params.client_secret;
let sortedParams;
// 忽略部分参数
delete params.client_secret;
... ...
'use strict';
/**
* 计时类
* @example
... ... @@ -10,7 +8,7 @@
* @author: hbomb<qiqi.zhou@yoho.cn>
* @date: 2016/05/07
*/
'use strict';
class Timer {
constructor() {
this.timers = {};
... ... @@ -20,12 +18,12 @@ class Timer {
* 打点计时
*/
put(label) {
let labelTime = this.timers[label];
const labelTime = this.timers[label];
if (labelTime) {
let duration = process.hrtime(labelTime);
const duration = process.hrtime(labelTime);
return this._round(duration[1]);
return this._round(duration[0], duration[1]);
} else {
this.timers[label] = process.hrtime();
}
... ... @@ -35,8 +33,8 @@ class Timer {
* 格式化成毫秒
* @param {Number} value 纳秒
*/
_round(value) {
return Math.round(value / 10000) / 100;
_round(seconds, nanoseconds) {
return Math.round((seconds * 1e9 + nanoseconds) / 10000) / 100;
}
}
... ...
# 日志目录
... ...
{
"name": "m-yohobuy-node",
"name": "yohobuy-node",
"version": "0.0.1",
"private": true,
"description": "A New Yohobuy Project With Express",
... ... @@ -11,33 +11,51 @@
"start": "node app.js",
"dev": "node_modules/.bin/nodemon -e js,hbs -i public/ app.js",
"online": "NODE_ENV=\"production\" node app.js",
"debug": "DEBUG=\"express:*\" node app.js",
"debug": "DEBUG=\"express:*\" node_modules/.bin/nodemon -e js,hbs -i public/ app.js",
"lint-js": "./node_modules/.bin/eslint -c .eslintrc --cache --fix .",
"lint-css": "./node_modules/.bin/stylelint --config .stylelintrc public/**/*.css",
"precommit": "node lint.js"
"lint-css": "./node_modules/.bin/stylelint --config .stylelintrc public/scss/**/*.css",
"precommit": "node lint.js",
"test": "NODE_ENV=test ./node_modules/.bin/nyc ./node_modules/.bin/ava",
"posttest": "./node_modules/.bin/nyc report --reporter=html"
},
"ava": {
"tap": true,
"require": [
"babel-register"
],
"babel": {
"presets": [
"es2015"
]
}
},
"license": "MIT",
"dependencies": {
"bluebird": "^3.3.5",
"bluebird": "^3.4.0",
"body-parser": "^1.15.0",
"connect-memcached": "^0.2.0",
"cookie-parser": "^1.4.1",
"express": "^4.13.1",
"express-handlebars": "^3.0.0",
"express-session": "^1.13.0",
"influxdb-winston": "^1.0.1",
"lodash": "^4.12.0",
"md5": "^2.1.0",
"memcached": "^2.2.1",
"memcached": "^2.2.2",
"moment": "^2.13.0",
"morgan": "^1.7.0",
"oneapm": "^1.2.20",
"request-promise": "^3.0.0",
"serve-favicon": "^2.3.0",
"uuid": "^2.0.2",
"winston": "^2.2.0",
"winston-daily-rotate-file": "^1.0.1"
"winston-daily-rotate-file": "^1.0.1",
"yoho-connect-memcached": "^1.0.3",
"yoho-express-session": "^1.0.2"
},
"devDependencies": {
"autoprefixer": "^6.3.6",
"ava": "^0.14.0",
"babel-preset-es2015": "^6.9.0",
"babel-register": "^6.9.0",
"eslint": "^2.10.2",
"eslint-config-yoho": "^1.0.1",
"gulp": "^3.9.1",
... ... @@ -48,8 +66,8 @@
"gulp-util": "^3.0.7",
"husky": "^0.11.4",
"mocha": "^2.4.5",
"moment": "^2.13.0",
"nodemon": "1.9.2",
"nyc": "^6.4.3",
"postcss-assets": "^4.0.1",
"postcss-cachebuster": "^0.1.2",
"postcss-calc": "^5.2.1",
... ... @@ -58,19 +76,23 @@
"postcss-crip": "^2.0.0",
"postcss-opacity": "^3.0.0",
"postcss-position": "^0.4.0",
"postcss-pxtorem": "^3.3.1",
"postcss-short": "^1.4.0",
"postcss-sprites": "^3.1.2",
"postcss-use": "^2.1.0",
"postcss-use": "^2.0.2",
"precss": "^1.4.0",
"rewire": "^2.5.1",
"shelljs": "^0.7.0",
"stylelint": "^6.3.3",
"stylelint": "^6.4.1",
"stylelint-config-yoho": "^1.2.3",
"webpack": "^1.13.0",
"webpack-dev-server": "^1.14.1",
"webpack-stream": "^3.1.0",
"yoho-fastclick": "^1.0.6",
"yoho-hammer": "^2.0.7",
"yoho-handlebars": "^4.0.5",
"yoho-jquery": "^1.9.1",
"yoho-jquery-lazyload": "^1.9.7"
"yoho-jquery-lazyload": "^1.9.7",
"yoho-swiper": "^3.3.1"
}
}
... ...
/** ****/ (function(modules) { // webpackBootstrap
/** ****/ // The module cache
/** ****/ var installedModules = {};
/** ****/ // The require function
/** ****/ function __webpack_require__(moduleId) {
/** ****/ // Check if module is in cache
/** ****/ if (installedModules[moduleId])
/** ****/ return installedModules[moduleId].exports;
/** ****/ // Create a new module (and put it into the cache)
/** ****/ var module = installedModules[moduleId] = {
/** ****/ exports: {},
/** ****/ id: moduleId,
/** ****/ loaded: false
/** ****/ };
/** ****/ // Execute the module function
/** ****/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/** ****/ // Flag the module as loaded
/** ****/ module.loaded = true;
/** ****/ // Return the exports of the module
/** ****/ return module.exports;
/** ****/ }
/** ****/ // expose the modules object (__webpack_modules__)
/** ****/ __webpack_require__.m = modules;
/** ****/ // expose the module cache
/** ****/ __webpack_require__.c = installedModules;
/** ****/ // __webpack_public_path__
/** ****/ __webpack_require__.p = '';
/** ****/ // Load entry module and return exports
/** ****/ return __webpack_require__(0);
/** ****/ })([
/* 0 */
/** */ function(module, exports) {
console.log(1);
/** */ }
/** ****/ ]);
... ...
This diff could not be displayed because it is too large.
a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,td,th{text-align:left;font-weight:400;vertical-align:middle}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}.clearfix:after{content:'';display:block;clear:both}body{font-family:arial,Microsoft YaHei}@font-face{font-family:iconfont;src:url(../assets/font/iconfont.eot?v154e7f742b0);src:url(../assets/font/iconfont.eot?v154e7f742b0#iefix) format('embedded-opentype'),url(../assets/font/iconfont.woff?v154e7f74698) format('woff'),url(../assets/font/iconfont.ttf?v154e7f74698) format('truetype'),url(../assets/font/iconfont.svg?v154e7f742b0#iconfont) format('svg')}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;text-decoration:none;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:.2px;-moz-osx-font-smoothing:grayscale}.center-content{width:1150px;margin-left:auto;margin-right:auto}.min-screen .center-content{width:990px}.left,.pull-left{float:left}.pull-right,.right{float:right}.center{text-align:center}.hide{display:none!important}a:focus,input,textarea{outline:none}a{text-decoration:none;color:#000}.body-mask{position:absolute;z-index:7;background:#000;opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";top:0;left:0}.yoho-header .tool-wrapper{width:100%;height:32px;line-height:32px;font-size:12px;background-color:#f4f4f4}.yoho-header .tool-wrapper .yoho-group-map{padding:0 5px}.yoho-header .tool-wrapper .yoho-group-map .yoho-group-list{position:absolute;display:none;width:170px;top:32px;margin-left:-5px;background-color:#f4f4f4;padding:20px 0 20px 20px;z-index:9}.yoho-header .tool-wrapper .yoho-group-map li a{color:#9196a0;font-size:14px}.yoho-header .tool-wrapper .yoho-group-map li:hover a{color:#000}.yoho-header .tool-wrapper .yoho-group-map:hover{background-color:#dcdcdc}.yoho-header .tool-wrapper .yoho-group-map:hover .yoho-group-list{display:block}.yoho-header .tool-wrapper .yoho-buy-tools li{float:left;padding-right:10px}.yoho-header .tool-wrapper .yoho-buy-tools li span{display:inline-block;vertical-align:middle;line-height:30px}.yoho-header .tool-wrapper .yoho-buy-tools li .hi{vertical-align:top}.yoho-header .tool-wrapper .yoho-buy-tools li a{color:#8e8e8e}.yoho-header .tool-wrapper .yoho-buy-tools .nick-name{color:#000}.yoho-header .tool-wrapper .yoho-buy-tools .tag-seprate{width:0;margin-top:11px;margin-right:12px;height:14px;float:left;border-left:1px solid #dcdcdc}.yoho-header .tool-wrapper .simple-user-center{top:32px;margin-left:-110px;width:300px;position:absolute;background-color:#f8f8f8;z-index:7;display:none}.yoho-header .tool-wrapper .simple-user-center .account-info-header{margin:17px auto 0;width:257px;border-bottom:1px solid #dcdcdc;text-align:center;padding-bottom:15px}.yoho-header .tool-wrapper .simple-user-center .user-img{width:63px;height:63px;margin:0 auto;border-radius:50%;overflow:hidden;background:url(../assets/img/layout/default-thumb.png?v154e7f74698) 50%;filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale')";background-size:100% 100%;-moz-background-size:100% 100%}.yoho-header .tool-wrapper .simple-user-center .user-name{margin-top:14px;line-height:25px}.yoho-header .tool-wrapper .simple-user-center .user-level{color:#000;height:20px;line-height:20px;font-size:18px}.yoho-header .tool-wrapper .simple-user-center .user-level span{color:#8cc4f9}.yoho-header .tool-wrapper .simple-user-center .level-detail{font-size:14px;line-height:14px;padding-top:10px;padding-left:20px}.yoho-header .tool-wrapper .simple-user-center .level-view-bar{width:150px;height:14px;margin-right:5px;text-align:left;background-color:#e2e2e2;display:inline-block;vertical-align:middle;overflow:hidden}.yoho-header .tool-wrapper .simple-user-center .level-view-bar .text-span{font-size:16px;line-height:16px;padding-left:3px;position:absolute}.yoho-header .tool-wrapper .simple-user-center .level-view-bar .integrate{height:14px;background-color:#ceae64;padding-left:5px}.yoho-header .tool-wrapper .simple-user-center .account-info-content{padding:20px 30px 0;border-bottom:1px solid #dcdcdc}.yoho-header .tool-wrapper .simple-user-center .account-info-content li{float:none;font-size:16px}.yoho-header .tool-wrapper .simple-user-center .account-info-content a{font-size:14px;color:#000}.yoho-header .tool-wrapper .simple-user-center .account-info-footer{height:51px;line-height:51px;text-align:center}.yoho-header .tool-wrapper .simple-user-center .account-info-footer a{font-size:14px;color:#000}.yoho-header .tool-wrapper .myyoho:hover{background-color:#dcdcdc}.yoho-header .tool-wrapper .myyoho:hover .simple-user-center{display:block}.yoho-header .tool-wrapper .download-app-box{position:absolute;top:32px;margin-left:-100px;width:231px;height:290px;background-color:#f8f8f8;z-index:9;display:none}.yoho-header .tool-wrapper .download-app-box .qr-img{position:relative;background-image:url(../assets/img/layout/qr.png?v154e7f74698);background-repeat:no-repeat;background-size:100% 100%;margin:32px auto 15px;width:143px;height:147px}.yoho-header .tool-wrapper .download-app-box .qr-words{height:25px;line-height:25px;font-size:16px;text-align:center}.yoho-header .tool-wrapper .download-app-box .qr-more{margin-top:6px;line-height:25px;font-size:14px;text-align:center}.yoho-header .tool-wrapper .phoneapp:hover{background-color:#dcdcdc}.yoho-header .tool-wrapper .phoneapp:hover .download-app-box{display:block}.yoho-header .tool-wrapper .icon-hamburger{background:url(../assets/img/layout/hamburger.png?v154e7f74698) no-repeat;width:16px;height:12px;display:inline-block;vertical-align:middle}.yoho-header .tool-wrapper .icon-bottomarrow{background:url(../assets/img/layout/bottom-arrow.png?v154e7f74698) no-repeat;width:10px;height:5px;margin-top:-2px}.yoho-header .tool-wrapper .icon-papers{background:url(../assets/img/layout/paper.png?v154e7f74698) no-repeat;width:10px;height:14px;margin-top:-2px}.yoho-header .tool-wrapper .icon-heart{background:url(../assets/img/layout/heart.png?v154e7f74698) no-repeat;width:12px;height:11px;margin-top:-2px}.yoho-header .tool-wrapper .icon-mail{background:url(../assets/img/layout/mail.png?v154e7f74698) no-repeat;width:16px;height:10px;margin-top:-2px}.yoho-header .tool-wrapper .icon-phone{background:url(../assets/img/layout/iphone.png?v154e7f74698) no-repeat;width:8px;height:14px;margin-top:-2px}.yoho-header .head-wrapper{width:100%}.yoho-header .head-wrapper .main-nav-list{display:inline-block;vertical-align:top;padding-top:45px}.yoho-header .head-wrapper .main-nav-list li{float:left;padding:8px 23px 5px}.yoho-header .head-wrapper .main-nav-list li a{font-size:12px;line-height:14px}.yoho-header .head-wrapper .main-nav-list li .name-cn a{font-size:16px}.yoho-header .head-wrapper .main-nav-list .cure{color:#fff;background-color:#3a3a3a}.yoho-header .head-wrapper .main-nav-list .cure a{color:#fff}.yoho-header .head-wrapper .main-logo{background:url(../assets/img/layout/logo-en.png?v154e7f74698) no-repeat 50%;width:182px;height:53px;left:42%;margin-top:22px;position:absolute;animation:logoflip 20s infinite;-moz-animation:logoflip 20s infinite;-webkit-animation:logoflip 20s infinite;-o-animation:logoflip 20s infinite}.yoho-header .head-wrapper .main-logo .main-link{display:block;width:100%;height:100%}.yoho-header .head-wrapper .main-logo.logo-cn{background:url(../assets/img/layout/logo-cn.png?v154e7f74698) no-repeat 50%}.yoho-header .head-wrapper .func-area{float:right;width:378px;padding-right:18px;margin-top:45px}.yoho-header .head-wrapper .search-2016{width:320px;height:28px;background-color:#3a3a3a;border:1px solid #3a3a3a;display:inline-block;overflow:hidden}.yoho-header .head-wrapper .search-2016 input{width:240px;height:100%;border:none;background:#fff;box-sizing:border-box;padding:7px 0 9px 10px}.yoho-header .head-wrapper .search-2016 .search-btn{background:url(../assets/img/layout/search.png?v154e7f74698) no-repeat 50%;width:80px;height:28px;float:right;border:none;cursor:pointer}.yoho-header .head-wrapper .search-suggest{position:absolute;width:320px;border:1px solid #000;margin-top:29px;padding-top:20px;background-color:#fff;display:none;z-index:9}.yoho-header .head-wrapper .search-suggest .action,.yoho-header .head-wrapper .search-suggest li:hover{background-color:#eee}.yoho-header .head-wrapper .search-suggest a{display:block;padding:5px;height:25px;line-height:25px;font-size:12px}.yoho-header .head-wrapper .search-suggest .valuenum{float:right}.yoho-header .head-wrapper .go-cart{width:30px;height:30px;float:right;cursor:pointer;position:relative}.yoho-header .head-wrapper .go-cart .iconfont{font-size:26px;color:#3a3a3a}.yoho-header .head-wrapper .go-cart .goods-num-tip{position:absolute;background:url(../assets/img/layout/ic-information.png?v154e7f74698) no-repeat;width:27px;height:20px;top:-10px;right:-15px;color:#fff;text-align:center;line-height:20px;font-size:12px}.yoho-header .head-wrapper .mini-cart-wrapper{position:absolute;top:30px;right:-14px;width:378px;background:#f8f8f8 url(../assets/img/layout/empty_car.png?v154e7f74698) no-repeat 106px 132px;z-index:9;display:none}.yoho-header .head-wrapper .mini-cart-wrapper .empty-cart{padding:280px 0 200px;text-align:center}.yoho-header .head-wrapper .mini-cart-wrapper .loading-cart{padding:200px 0;text-align:center;background:#f8f8f8 reslove('layout/loading.gif') no-repeat center 170px}.yoho-header .head-wrapper .mini-cart-wrapper .rich-cart{background:#f8f8f8}.yoho-header .head-wrapper .mini-cart-wrapper .goods-list{padding-top:20px;margin-bottom:15px;max-height:444px;overflow-x:hidden}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item{padding:0 0 18px 18px}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item>div{font-size:14px;display:inline-block;vertical-align:top}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item p{margin-bottom:12px}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item .goods-img{width:60px}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item .goods-info{width:170px;color:#b0b0b0}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item .goods-price{min-width:90px;text-align:right}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item .title{width:170px;height:14px;font-size:14px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.yoho-header .head-wrapper .mini-cart-wrapper .goods-item .title>a{color:#666}.yoho-header .head-wrapper .mini-cart-wrapper .activity-item{font-size:14px;margin-bottom:8px;padding-left:18px;line-height:18px}.yoho-header .head-wrapper .mini-cart-wrapper .activity-item label{width:60px;height:18px;background-color:#3a3a3a;color:#fff;text-align:center;margin-right:13px;vertical-align:top;display:inline-block}.yoho-header .head-wrapper .mini-cart-wrapper .activity-item h3{width:250px;color:#3a3a3a;font-size:12px;word-break:break-all;display:inline-block}.yoho-header .head-wrapper .mini-cart-wrapper .go-full-cart{padding:0 18px}.yoho-header .head-wrapper .mini-cart-wrapper .go-full-cart>div{height:61px;line-height:61px;border-top:1px solid #dcdcdc;text-align:center}.yoho-header .head-wrapper .on-hover .mini-cart-wrapper{display:block}.yoho-header .nav-wrapper{height:40px;width:100%;background-color:#3a3a3a;position:relative}.yoho-header .nav-wrapper .sub-nav-list{float:left}.yoho-header .nav-wrapper .sub-nav-list li{float:left;line-height:40px;padding-right:46px;box-sizing:border-box;margin-right:38px}.yoho-header .nav-wrapper .sub-nav-list .newlogo{display:block;width:26px;height:12px;background-image:url(../assets/img/layout/new.png?v154e7f74698);background-repeat:no-repeat;position:absolute;margin-top:-20px;margin-left:16px}.yoho-header .nav-wrapper .sub-nav-list a{color:#fff;font-size:14px;line-height:14px;display:inline-block}.yoho-header .nav-wrapper .sub-nav-list li:hover a{padding-bottom:3px;border-bottom:2px solid #fff}.yoho-header .nav-wrapper .third-nav-wrapper{width:100%;height:410px;box-sizing:border-box;position:absolute;left:0;top:38px;display:none;padding:30px 0;background-color:#f8f8f8;z-index:8}.yoho-header .nav-wrapper .third-nav-wrapper a{font-size:14px;border-bottom:none!important}.yoho-header .nav-wrapper .third-nav-wrapper dl{float:left;width:278px;height:352px;box-sizing:border-box;border-left:1px solid #ccc;padding:0 50px}.yoho-header .nav-wrapper .third-nav-wrapper dl:first-child{width:228px;border-left:0;padding-left:0}.yoho-header .nav-wrapper .third-nav-wrapper dt{width:180px;padding-bottom:10px;border-bottom:1px solid #000;line-height:18px;margin-bottom:20px}.yoho-header .nav-wrapper .third-nav-wrapper dt a{color:#000}.yoho-header .nav-wrapper .third-nav-wrapper dd{line-height:14px;height:14px;margin-bottom:24px}.yoho-header .nav-wrapper .third-nav-wrapper dd a{color:#a1a1a1}.yoho-header .nav-wrapper .third-nav-wrapper dd a:hover{text-decoration:underline}.yoho-header .nav-wrapper .third-nav-wrapper .hot{color:#e01}.yoho-header .nav-wrapper .show-detail{box-sizing:border-box;padding-left:19px;padding-right:19px;width:337px;height:250px;float:right}.yoho-header .nav-wrapper .show-detail .title{width:100%;margin-top:40px;text-align:center;font-size:14px;color:#000;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yoho-header.girls .search-2016{background-color:#ff88ae;border-color:#ff88ae}.yoho-header.girls .cure,.yoho-header.girls .nav-wrapper{background-color:#ff88ae!important}.yoho-header.girls .go-cart .iconfont{color:#ff88ae}.yoho-header.kids .search-2016{background-color:#7bd3f9;border-color:#7bd3f9}.yoho-header.kids .cure,.yoho-header.kids .nav-wrapper{background-color:#7bd3f9!important}.yoho-header.kids .go-cart .iconfont{color:#7bd3f9}.yoho-header.lifestyle .search-2016{background-color:#5e4b3c;border-color:#5e4b3c}.yoho-header.lifestyle .cure,.yoho-header.lifestyle .nav-wrapper{background-color:#5e4b3c!important}.yoho-header.lifestyle .go-cart .iconfont{color:#5e4b3c}.min-screen .head-wrapper .main-nav-list>li{padding:8px 14px 5px}.min-screen .nav-wrapper .sub-nav-list>li{margin-right:15px}.min-screen .nav-wrapper .show-detail{width:190px;padding-right:0}.min-screen .head-wrapper .main-logo{left:39%}.yoho-footer{font-size:12px}.yoho-footer *{box-sizing:border-box}.yoho-footer .red{color:#e01}.yoho-footer .rgb6{color:#666}.yoho-footer .rgb9{color:#999}.yoho-footer .rgbf{color:#fff}.yoho-footer .index-foot{background:#eee;padding:20px 0}.yoho-footer .index-foot dd{float:left;width:370px;margin-right:20px;overflow:hidden}.yoho-footer .index-foot dd ul{margin-top:18px;padding-top:18px}.yoho-footer .index-foot dd.last{margin-right:0}.yoho-footer .foot-panel{background:#fff;padding:20px}.yoho-footer .title{position:relative;text-align:center}.yoho-footer .title-line{border-bottom:1px solid #ddd;position:absolute;top:9px;width:100%;left:0}.yoho-footer .text{position:absolute;width:100%;text-align:center;left:0;top:0}.yoho-footer .text span{background:#fff;font-size:18px;line-height:18px;padding:0 10px}.yoho-footer .item-nav{padding-top:20px}.yoho-footer .item-nav span{color:#fff;padding:0 3px;cursor:pointer;font-size:20px}.yoho-footer .item-nav .cur{color:#999}.yoho-footer .vote{line-height:24px}.yoho-footer .vote input{margin:0 5px 0 1px}.yoho-footer .vote .button{height:24px;line-height:24px;width:55px;font-size:12px;margin-top:11px;margin-right:10px;background:#222;color:#fff;display:inline-block;text-align:center;cursor:pointer}.yoho-footer .vote p{height:24px;overflow:hidden}.yoho-footer .vote textarea{width:98%;height:68px;vertical-align:middle;margin:5px 0 0;resize:none}.yoho-footer .vote-item p{float:left;width:50%}.yoho-footer .mobile{margin-right:-10px}.yoho-footer .mobile li{margin-right:10px;float:left}.yoho-footer .mobile img{display:block;width:103px;height:131px}.yoho-footer .index-banner{width:100%;margin-top:20px}.yoho-footer .two-dim{margin-right:-10px;overflow:hidden}.yoho-footer .two-dim li{border:1px solid #ddd;padding:7px;margin-right:10px}.yoho-footer .two-dim li a{display:block}.yoho-footer .two-dim li p{text-align:center;margin-top:13px;margin-bottom:3px;line-height:12px}.yoho-footer .dim-img{display:block;width:87px;height:87px}.yoho-footer .dim-hover{position:absolute}.yoho-footer .dim-hover img{width:38px;height:38px}.yoho-footer .dim-active .dim-img{opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}.yoho-footer .dim-active .dim-hover{display:none}.yoho-footer .footerbottom{width:100%}.yoho-footer .promise{padding:20px 0 10px;background:#000}.yoho-footer .promise .left{margin-right:60px;line-height:30px;font-size:12px;font-weight:700}.yoho-footer .promise .left .iconfont{display:inline-block;font-weight:400;font-size:22px;vertical-align:middle;margin-right:5px}.yoho-footer .promise .left:first-child .iconfont{font-size:27px}.yoho-footer .subscribe{border:1px solid #262626;width:240px}.yoho-footer .subscribe input{width:180px;height:32px;padding:0 10px;line-height:32px;border:none;margin:0;background:#000}.yoho-footer .subscribe a{display:block;float:right;margin-right:20px;font-size:20px;line-height:28px;opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"}.yoho-footer .footer-help{background:#000;font-size:12px;overflow:hidden}.yoho-footer .footer-help>div{padding:15px 0;border-top:1px solid #262626}.yoho-footer .footer-help ul{width:110%}.yoho-footer .footer-help p{line-height:24px}.yoho-footer .footer-help p span{color:#fff}.yoho-footer .footer-help p a{color:#666}.yoho-footer .footer-help p a:hover{text-decoration:underline}.yoho-footer .footer-help li{width:180px}.yoho-footer .footer-help .screen{border-top:1px solid #262626;padding:15px 0}.yoho-footer .footer-link{background:#000;padding:10px 0 30px;font-size:12px}.yoho-footer .footer-link .right-flag{margin-top:3px}.yoho-footer .footer-link .right-flag a{margin-right:5px}.yoho-footer .footer-link .about-us{line-height:20px;color:#666;margin-left:10px}.yoho-footer .footer-link .about-us a{color:#666}.yoho-footer .footer-link .about-us span{padding:0 10px}.yoho-footer .return-top{position:fixed;width:60px;height:60px;left:50%;margin-left:595px;text-align:center;line-height:50px;color:#fff;background:#000;opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";bottom:20px;cursor:pointer;z-index:4}.yoho-footer .return-top .iconfont{font-size:34px}.yoho-footer .return-top:hover{opacity:.9;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"}.yoho-footer .return-top.min{left:100%;right:20px;margin-left:auto}.min-screen .yoho-footer .index-foot dd{width:316px}.min-screen .yoho-footer .two-dim{margin-top:26px;margin-bottom:10px;overflow:hidden}.min-screen .yoho-footer .dim-img{width:69px;height:69px}.min-screen .yoho-footer .mobile{margin-top:26px;padding-bottom:15px}.min-screen .yoho-footer .mobile img{width:85px;height:108px}.min-screen .yoho-footer .promise .left{margin-right:45px}.min-screen .yoho-footer .subscribe{width:200px}.min-screen .yoho-footer .subscribe input{width:140px}.min-screen .yoho-footer .footer-help li{width:150px}.wrapper-404{padding:80px 0}.wrapper-404 .main-error{width:560px;height:240px;margin:0 auto}.wrapper-404 .main-error .text1{font-size:24px;margin-top:60px;line-height:24px}.wrapper-404 .main-error .text2{margin:18px 0 10px;line-height:12px}.wrapper-404 .main-error .text3 a{text-decoration:none;color:#666;font-size:12px;outline:none}.home-page{width:1150px;margin:10px auto 0}.home-page .slide-container{position:absolute;left:0;right:0;height:450px}.home-page .slide-thumb-container{height:510px}.home-page .slide-wrapper{position:relative;height:450px;overflow:hidden}.home-page .slide-wrapper ul{position:relative;height:100%}.home-page .slide-wrapper li{display:none;position:absolute;top:0;right:0;width:100%;height:100%}.home-page .slide-wrapper li a{display:block;height:100%;width:1150px;margin:0 auto}.home-page .slide-wrapper li img{width:100%;height:100%}.home-page .slide-wrapper:hover .slide-switch.show,.home-page .slide-wrapper li:first-child{display:block}.home-page .slide-container-placeholder{height:450px;width:100%}.home-page .slide-thumb-container-placeholder{height:510px}.home-page .slide-switch{display:block}.home-page .slide-switch a{position:absolute;top:50%;margin:-30px 0 0;width:60px;height:60px;line-height:56px;text-align:center;z-index:2;background:#fff;opacity:.55;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=55)"}.home-page .slide-switch a .iconfont{font-size:32px;color:#59585a}.home-page .slide-switch a.prev{left:50%;margin-left:-575px}.home-page .slide-switch a.next{right:50%;margin-right:-575px}.home-page .slide-switch a:hover{opacity:.9;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"}.home-page .thumb-pagination{width:1148px;margin:6px auto 0;padding-left:2px}.home-page .thumb-pagination li{position:relative;float:left;margin-left:6px;width:138px;height:54px}.home-page .thumb-pagination li a{position:absolute;left:0;right:0;bottom:0;top:0;background:#000;opacity:.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.home-page .thumb-pagination li img{width:100%;height:100%}.home-page .thumb-pagination li:first-child{margin:0}.home-page .thumb-pagination li.focus a{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.home-page .slide-pagination{font-size:0}.home-page .slide-pagination .slide-shade{position:absolute;left:0;right:0;top:0;bottom:0;background:#000;opacity:.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";border-radius:13px}.home-page .slide-pagination span{position:relative;display:inline-block;margin:0 7px;width:12px;height:12px;background:#fff;cursor:pointer;opacity:.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";border-radius:6px;z-index:2}.home-page .slide-pagination span.focus{opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}.home-page .debris-slider{height:510px;width:100%}.home-page .debris-slider .col{float:left}.home-page .debris-slider .col a{display:block}.home-page .debris-slider .left-col a,.home-page .debris-slider .right-col a{margin-bottom:10px}.home-page .debris-slider .left-col a:last-child,.home-page .debris-slider .right-col a:last-child{margin-bottom:0}.home-page .debris-slider .left-col img,.home-page .debris-slider .right-col img{height:100%;width:100%}.home-page .debris-slider .left-col{margin-right:10px}.home-page .debris-slider .left-col a{width:280px;height:120px}.home-page .debris-slider .left-col a:first-child{height:250px}.home-page .debris-slider .center-col{position:relative;width:570px;height:100%;margin-right:10px;font-size:0}.home-page .debris-slider .center-col .slide-wrapper{height:100%}.home-page .debris-slider .center-col .slide-wrapper a{width:100%}.home-page .debris-slider .center-col .slide-switch a.prev{left:0;margin-left:0}.home-page .debris-slider .center-col .slide-switch a.next{right:0;margin-right:0}.home-page .debris-slider .center-col img{max-width:100%;max-height:100%}.home-page .debris-slider .center-col:hover .slide-switch.show{display:block}.home-page .debris-slider .right-col a{width:280px;height:120px}.home-page .debris-slider .right-col a:first-child{height:380px;margin-bottom:11px}.home-page .new-report img{display:block;width:100%;height:100%}.home-page .new-report .report-list{float:left;width:868px}.home-page .new-report .report-list li{float:left;margin:0 8px 8px 0;width:185px;height:248px;overflow:hidden}.home-page .new-report .report-list li:first-child{margin-right:7px;width:282px;height:504px}.home-page .new-report .last-item{float:left;width:282px;height:504px;overflow:hidden}.home-page .preference-brand{overflow:hidden}.home-page .preference-brand-list{margin-top:8px;width:1158px}.home-page .preference-brand-item{float:left;margin-right:8px;margin-bottom:8px}.home-page .preference-brand-item a{display:table-cell;width:185px;height:86px;text-align:center;vertical-align:middle}.home-page .preference-brand-item img{display:block;max-width:100%;max-height:100%;margin:0 auto}.home-page .preference-more{float:left;width:185px;height:86px;line-height:100px;text-align:center;color:#000;font-size:16px}.home-page .img-slider-wrapper{position:relative;width:100%;height:558px;background:#8ae6e0;overflow:hidden}.home-page .img-slider-wrapper .img-brand-switch{display:block}.home-page .img-slider-wrapper .img-brand-switch a{position:absolute;top:50%;font-size:36px;color:#fff}.home-page .img-slider-wrapper .img-brand-switch a.next{right:30px}.home-page .img-slider-wrapper .img-brand-switch a.prev{left:30px}.home-page .img-container-landscape{box-sizing:border-box;margin:86px auto 0;width:982px;height:433px;overflow:hidden}.home-page .img-container-landscape .img-list{width:1000px;height:100%}.home-page .img-container-landscape .img-item{float:left;box-sizing:border-box;width:320px;height:100%;margin-right:10px}.home-page .img-container-landscape .img-item img{width:100%;height:100%}.home-page .img-brand{position:relative;width:100%;height:175px;overflow:hidden}.home-page .img-brand ul{width:1158px}.home-page .img-brand li{float:left;margin:0 8px 0 0;width:378px;height:175px;line-height:175px;overflow:hidden;font-size:0;text-align:center}.home-page .img-brand li img{max-width:100%;max-height:100%;vertical-align:middle}.home-page .img-brand .img-brand-switch{display:none}.home-page .img-brand .img-brand-switch a{position:absolute;top:50%;margin:-20px 0 0;width:40px;height:40px;line-height:40px;text-align:center;z-index:2;background:#fff;opacity:.55;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=55)"}.home-page .img-brand .img-brand-switch a.prev{left:0}.home-page .img-brand .img-brand-switch a.next{right:0}.home-page .img-brand .img-brand-switch a:hover{opacity:.9;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"}.home-page .img-brand:hover .img-brand-switch{display:block}.home-page .logo-brand{width:100%;height:282px;overflow:hidden}.home-page .logo-brand ul{width:1158px}.home-page .logo-brand li{float:left;margin:8px 8px 0 0;width:185px;height:86px;line-height:86px;font-size:0;text-align:center}.home-page .logo-brand li img{max-width:100%;max-height:100%;vertical-align:middle}.home-page .logo-brand .logo-brand-switch{position:relative;background:url(../../../img/index/logo-brand-line.png?v154e22b4840) no-repeat 50%;line-height:normal}.home-page .logo-brand .logo-brand-switch .iconfont{position:absolute;left:50%;font-size:32px}.home-page .logo-brand .logo-brand-switch .iconfont.prev{top:10px;margin-left:-48px}.home-page .logo-brand .logo-brand-switch .iconfont.next{bottom:12px;margin-left:20px}.home-page .logo-brand .brand-more{font-size:16px}.home-page .logo-brand .brand-more:hover{text-decoration:underline}.home-page .logo-brand.logos-10{height:188px}.home-page .categorys-list ul{width:1158px}.home-page .categorys-list li{float:left;margin:0 8px 8px 0;width:185px;height:248px}.home-page .categorys-list li img{display:block;width:100%;height:100%}.home-page .categorys-list li.cate-item0{width:185px;height:504px}.home-page .categorys-list li.cate-item1{width:377px;height:504px}.home-page .floor-header{position:relative;margin:80px 0 40px}.home-page .floor-header .floor-title{margin:0 auto;width:298px;height:31px;line-height:31px;border:1px solid #000;font-size:16px;text-align:center}.home-page .floor-header .header-navs{position:absolute;padding:10px 0;top:0;right:0;font-size:14px}.home-page .floor-header .header-navs li{float:left;padding:1px 15px;border-left:1px solid #ccc}.home-page .floor-header .header-navs li a{color:#333}.home-page .floor-header .header-navs li:first-child{border-left:none}.home-page .floor-header .header-navs li:hover{text-decoration:underline}.g-list li{float:left}.g-list li a{position:relative;display:block;overflow:hidden}.g-list li a img,.g-mask{width:100%;height:100%}.g-mask{display:block;position:absolute;z-index:1;background:#000;opacity:.5;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";overflow:hidden;transition:opacity .6s}.g-title{display:block;text-align:center;font-weight:700;line-height:1.5;width:100%;margin-top:14px}.home-page .tpl-recommend{width:100%;position:relative}.home-page .tpl-recommend a{display:block}.home-page .tpl-recommend a img{display:block;width:100%;height:100%}.home-page .tpl-recommend .tpl-body{margin-bottom:8px}.home-page .tpl-recommend .tpl-nav{float:left;overflow:hidden}.home-page .tpl-recommend .tpl-nav .tpl-keywords{margin-bottom:8px}.home-page .tpl-recommend .tpl-nav .tpl-category{padding:10px 0;background-color:#f8f8f8;overflow:hidden}.home-page .tpl-recommend .tpl-nav .tpl-category a{float:left;width:50%;text-align:center;color:#000;overflow:hidden}.home-page .tpl-recommend .tpl-brands{float:left;overflow:hidden;margin-left:8px}.home-page .tpl-recommend .tpl-brands li{margin-top:8px}.home-page .tpl-recommend .tpl-types{float:left;overflow:hidden;margin-top:-8px;width:579px}.home-page .tpl-recommend .tpl-types li{float:left;margin-left:8px;margin-top:8px}.home-page .tpl-recommend .tpl-types li a{width:185px;height:248px}.home-page .tpl-recommend .tpl-products{overflow:hidden;margin-left:-10px}.home-page .tpl-recommend .tpl-products li{float:left;margin-left:10px}.home-page .tpl-recommend .tpl-products li a{width:222px;height:298px}.home-page .tpl-recommend .tpl-nav{width:185px}.home-page .tpl-recommend .tpl-nav .keywords0,.home-page .tpl-recommend .tpl-nav .keywords1,.home-page .tpl-recommend .tpl-nav .keywords2{margin-bottom:10px;height:76px}.home-page .tpl-recommend .tpl-nav .keywords2{margin-bottom:0}.home-page .tpl-recommend .tpl-nav .tpl-category{height:228px}.home-page .tpl-recommend .tpl-nav .tpl-category a{height:38px;line-height:38px;font-size:14px}.home-page .tpl-recommend .tpl-brands{width:378px;height:512px}.home-page .tpl-recommend .tpl-brands li a{height:248px}.min-screen .home-page .tpl-recommend .tpl-nav{width:158px}.min-screen .home-page .tpl-recommend .tpl-nav .keywords0,.min-screen .home-page .tpl-recommend .tpl-nav .keywords1,.min-screen .home-page .tpl-recommend .tpl-nav .keywords2{margin-bottom:8px;height:65px}.min-screen .home-page .tpl-recommend .tpl-nav .keywords2{margin-bottom:0}.min-screen .home-page .tpl-recommend .tpl-nav .tpl-category{height:192px}.min-screen .home-page .tpl-recommend .tpl-nav .tpl-category a{height:32px;line-height:32px;font-size:12px}.min-screen .home-page .tpl-recommend .tpl-nav .tpl-category a:hover{text-decoration:underline}.min-screen .home-page .tpl-recommend .tpl-brands{width:324px;height:432px}.min-screen .home-page .tpl-recommend .tpl-brands li a{height:212px}.min-screen .home-page .tpl-recommend .tpl-types{width:498px}.min-screen .home-page .tpl-recommend .tpl-types li a{width:158px;height:212px}.min-screen .home-page .tpl-recommend .tpl-products li a{width:190px;height:254px}.home-page .singlehot{overflow:hidden;margin-left:-8px}.home-page .singlehot li{margin-left:8px;margin-bottom:8px}.home-page .singlehot li a{width:185px;height:248px}.home-page .singlehot .impo1,.home-page .singlehot .impo9{width:378px}.home-page .floor-ad a{display:block;height:129px}.home-page .floor-ad a img{display:block;width:100%;height:100%}.home-page .goods-container{margin-right:-10px;width:inherit;padding-top:0}.home-page .goods-container .good-info{margin-bottom:0;width:280px;height:485px}.home-page .goods-container .good-detail-img{height:374px}.home-page .goods-container .good-detail-text{text-align:center}.home-page .adbanner{margin-top:12px}.home-page .adbanner a{height:150px}.min-screen .home-page .singlehot li a{width:158px;height:212px}.min-screen .home-page .singlehot .impo1,.min-screen .home-page .singlehot .impo9{width:323px}.min-screen .home-page .goods-container .good-info{width:240px;height:412px}.min-screen .home-page .goods-container .good-info .good-detail-img{height:320px}.home-page .commodity .commodity-list{margin-left:-10px}.home-page .commodity .commodity-list a{height:465px;width:280px}.home-page .commodity .commodity-list li{margin-left:10px}.home-page .commodity .commodity-list i{position:absolute;bottom:0;width:100%;height:20px;background:#ffac5b;color:#fff;line-height:20px;text-align:center;font-size:12px}.home-page .commodity .commodity-list i.top{position:absolute;top:10px;right:10px;background-color:#ff575c;color:#fff;border-radius:30px;z-index:2;height:60px;width:60px;line-height:60px;font-size:20px}.home-page .commodity .commodity-list .commodity-img{position:relative;height:374px}.home-page .commodity .commodity-list p.commodity-name{font-size:12px;color:#000;text-align:center;margin-top:14px;line-height:18px}.home-page .commodity .commodity-list p.commodity-price{position:relative;margin:3px 0 0;text-align:center;line-height:20px;color:#000}.home-page .commodity .commodity-list p.commodity-price span{display:inline-block;font-size:12px}.home-page .commodity .commodity-brands{margin-left:-8px}.home-page .commodity .commodity-brands a{float:left;margin-left:8px;display:block;width:185px;height:86px}.home-page .commodity .commodity-brands a img{width:100%;height:100%}.home-page .commodity .loading{position:relative;width:100%;text-align:center;padding-top:40px}.home-page .commodity .loading a{display:block;height:35px;width:120px;margin:0 auto 40px;background-color:#000;color:#fff;font-size:14px;line-height:35px;text-align:center}.min-screen .home-page .commodity .commodity-list a{height:400px;width:240px}.min-screen .home-page .commodity .commodity-list .commodity-img{height:320px}.min-screen .home-page .commodity .commodity-list i.top{height:52px;width:52px;line-height:52px;font-size:14px}.min-screen .home-page .commodity .commodity-brands a{width:158px;height:74px}.home-page .slide-accordion{overflow:hidden;position:relative;height:400px}.home-page .slide-accordion a{position:relative;display:block}.home-page .slide-accordion a img{display:block;width:100%;height:100%}.home-page .slide-accordion ul{position:absolute;left:-5px}.home-page .slide-accordion li{position:absolute;border-left:5px solid #fff}.home-page .slide-accordion li a{width:650px;height:400px}.home-page .slide-accordion .g-mask{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"}.home-page .slide-accordion .g-mask:hover{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.min-screen .home-page .slide-accordion{height:342px}.min-screen .home-page .slide-accordion li a{width:558px;height:342px}.boys .tpl-nav .keywords0{margin-bottom:10px!important;height:152px!important}.boys .tpl-nav .keywords1{height:86px!important}.boys .tpl-nav .tpl-category a{height:38px!important;line-height:38px!important;font-size:14px!important}.boys .tpl-brands{margin-top:-8px!important}.boys .goods-container .good-info,.lifestyle .goods-container .good-info{width:222px!important;height:408px!important}.boys .goods-container .good-info .good-detail-img,.lifestyle .goods-container .good-info .good-detail-img{height:298px!important}.min-screen .boys .tpl-nav .keywords0{margin-bottom:8px!important;height:130px!important}.min-screen .boys .tpl-nav .keywords1{margin-bottom:0!important;height:74px!important}.min-screen .boys .tpl-brands{margin-top:-8px!important}.min-screen .boys .goods-container .good-info,.min-screen .lifestyle .goods-container .good-info{width:188px;height:360px}.min-screen .boys .goods-container .good-info .good-detail-img,.min-screen .lifestyle .goods-container .good-info .good-detail-img{height:255px}.min-screen .home-page{width:990px}.min-screen .home-page .slide-container{height:387px}.min-screen .home-page .slide-container img{display:block}.min-screen .home-page .slide-thumb-container{height:440px}.min-screen .home-page .slide-container-placeholder{height:387px}.min-screen .home-page .slide-thumb-container-placeholder{height:440px}.min-screen .home-page .slide-wrapper{height:387px}.min-screen .home-page .slide-wrapper li a{width:990px}.min-screen .home-page .slide-switch{display:block}.min-screen .home-page .slide-switch a.prev{margin-left:-495px}.min-screen .home-page .slide-switch a.next{margin-right:-495px}.min-screen .home-page .slide-switch a:hover{opacity:.9;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"}.min-screen .home-page .thumb-pagination{width:990px;margin:7px auto 0;padding:0}.min-screen .home-page .thumb-pagination li{width:118px;height:46px}.min-screen .home-page .debris-slider{height:440px}.min-screen .home-page .debris-slider .left-col{margin-right:9px}.min-screen .home-page .debris-slider .left-col a{width:240px;height:103px}.min-screen .home-page .debris-slider .left-col a:first-child{height:214px}.min-screen .home-page .debris-slider .center-col{width:492px;margin-right:9px}.min-screen .home-page .debris-slider .right-col a{width:240px;height:103px}.min-screen .home-page .debris-slider .right-col a:first-child{height:326px;margin-bottom:10px}.min-screen .home-page .new-report .report-list{width:748px}.min-screen .home-page .new-report .report-list li{width:158px;height:212px}.min-screen .home-page .new-report .last-item,.min-screen .home-page .new-report .report-list li:first-child{width:242px;height:432px}.min-screen .home-page .preference-brand-list{width:998px}.min-screen .home-page .preference-brand-item{margin-right:7px}.min-screen .home-page .preference-brand-item a{width:159px;height:74px}.min-screen .home-page .preference-more{width:159px;height:74px;line-height:90px}.min-screen .home-page .img-slider-wrapper{height:480px}.min-screen .home-page .img-container-landscape{margin:73px auto 0;width:844px;height:370px}.min-screen .home-page .img-container-landscape .img-item{width:275px;height:100%;margin-right:9px}.min-screen .home-page .img-brand{height:150px}.min-screen .home-page .img-brand ul{width:998px}.min-screen .home-page .img-brand li{width:325px;height:150px;line-height:150px}.min-screen .home-page .logo-brand{height:246px}.min-screen .home-page .logo-brand ul{width:998px}.min-screen .home-page .logo-brand li{margin:8px 8px 0 0;width:158px;height:74px;line-height:74px}.min-screen .home-page .logo-brand .logo-brand-switch .iconfont{font-size:24px}.min-screen .home-page .logo-brand .logo-brand-switch .iconfont.prev{top:-12px}.min-screen .home-page .logo-brand .logo-brand-switch .iconfont.next{bottom:-12px}.min-screen .home-page .logo-brand.logos-10{height:164px}.min-screen .home-page .categorys-list ul{width:1004px}.min-screen .home-page .categorys-list li{margin:0 7px 7px 0;width:161px;height:214px}.min-screen .home-page .categorys-list li.cate-item0{width:160px;height:435px}.min-screen .home-page .categorys-list li.cate-item1{width:326px;height:435px}.min-screen .home-page .floor-header{margin:50px 0 30px}.min-screen .home-page .floor-header .header-navs li{padding:1px 10px}.brands .path-nav{border-bottom:none;margin-bottom:0;padding-top:10px;padding-bottom:20px}.brands .brands-tabs{position:relative}.brands .brands-tabs a{display:block}.brands .brands-tabs a img{width:100%;height:100%;display:block}.brands .brands-tabs li{float:left}.brands .brands-tabs li p{display:block;font-size:30px;text-align:center;color:#dedede;position:absolute;top:50%;width:100%;margin-top:-15px;z-index:3}.brands .brands-tabs li .g-mask{opacity:.4;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"}.brands .brands-tabs li .g-mask-on,.brands .brands-tabs li:hover .g-mask{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.brands .brands-tabs .hover-contain{position:relative;border-bottom:1px solid #dfdfdf}.brands .brands-tabs .hover-contain .hoverarr{background-color:#3d3d3d;position:absolute;bottom:0;z-index:5}.brands .brands-tabs .hover-contain .hoverarr i{width:0;height:0;position:absolute;left:50%;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #3d3d3d;top:-6px;margin-left:-3px}.brands .header-navs{margin-right:-15px}.brands .category-nav{border:2px solid #222;padding-left:16px;height:44px;line-height:44px;font-size:12px;font-weight:700;position:relative;z-index:7;background-color:#fff}.brands .category-nav span{display:inline-block;margin-right:15px}.brands .category-nav a{display:inline-block;padding:0 7px;text-align:center;color:#222;cursor:pointer}.brands .category-fix{position:fixed;top:0;z-index:7;margin-top:0!important}.brands .brands-list dl{position:relative;border-top:1px dotted #999;padding:20px 0}.brands .brands-list dt{position:absolute;width:130px;font-weight:700;font-size:16px;text-align:center;top:50%;margin-top:-9px}.brands .brands-list dd{margin-left:130px}.brands .brands-list dd li{float:left;display:block;width:170px;height:18px}.brands .brands-list dd a{color:#666;line-height:18px;font-size:12px;position:relative}.brands .brands-list dd span{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.brands .brands-list dd span:hover{text-decoration:underline}.brands .brands-list dd .brands-dialog{display:inline;position:relative}.brands .brands-list dd .hot{font-weight:700;color:#222}.brands .brands-list dd i{position:relative;top:-4px;color:#e01;font-size:14px}.brands .brands-category{width:1150px}.brands .brands-tabs{width:100%}.brands .brands-tabs li{margin-left:10px}.brands .brands-tabs li a{position:relative;width:222px;height:180px}.brands .brands-tabs li:first-child{margin-left:0}.brands .brands-tabs .hover-contain{height:30px}.brands .brands-tabs .hover-contain .hoverarr{height:5px;width:222px}.brands .brands-ad,.brands .brands-logo{margin:20px 0}.brands .brands-ad li{float:left;margin-left:10px}.brands .brands-ad li img{display:block;width:280px;height:280px}.brands .brands-ad li:first-child{margin-left:0}.brands .brands-ad li:first-child img{width:570px}.brands .brands-logo a{float:left;margin-left:26px}.brands .brands-logo a img{display:block;width:91px;height:38px}.brands .brands-logo a:first-child{margin-left:0}.brands .list-floor{width:1160px}.brands .brandfloor .g-list{margin-top:-32px}.brands .brandfloor li{margin-right:8px;margin-top:32px}.brands .brandfloor li a{width:378px;height:250px}.brands .singlegoods .g-list{margin-top:-10px}.brands .singlegoods li{margin-right:10px;margin-top:10px}.brands .singlegoods li a{width:280px;height:374px}.brands .singlegoods .singlegoods-title{position:absolute;left:0;bottom:0;height:50px;width:100%}.brands .singlegoods .singlegoods-title p{position:absolute;z-index:2;top:0;left:0;display:block;width:100%;height:100%;line-height:50px;font-size:18px;text-align:center;color:#fff}.brands .video .g-list{margin-top:-10px}.brands .video li{margin-right:8px;margin-top:10px}.brands .video li a{width:378px;height:242px}.brands .video .video-play{display:block;position:absolute;left:50%;top:50%;margin-left:-30px;margin-top:-28px;width:60px;height:56px;background-image:url(../../../img/index/play.png?v154e22b4840)}.brands .video .video-title{position:absolute;left:0;bottom:0;height:32px;width:100%}.brands .video .video-title p{position:absolute;z-index:2;top:0;left:0;display:block;width:100%;height:100%;font-size:14px;line-height:32px;text-align:center;color:#fff}.brands .news{margin-bottom:40px}.brands .news .news-pic{position:relative;float:left;width:764px;height:436px}.brands .news .news-pic .slide-container{height:100%}.brands .news .news-pic .slide-container li a{height:100%;width:764px}.brands .news .news-pic .slide-container .slide-wrapper{height:100%}.brands .news .news-pic .slide-container .slide-switch{display:none}.brands .news .news-pic .slide-container .prev{left:0;margin-left:0}.brands .news .news-pic .slide-container .next{right:0;margin-right:0}.brands .news .news-pic .slide-container .slide-switch.show{display:block}.brands .news .news-pic .slide-tips{position:absolute;left:0;bottom:0;height:30px;width:100%;background:#000;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"}.brands .news .news-pic .slide-tips p{position:absolute;left:18px;z-index:2;height:30px;font-size:14px;line-height:30px;color:#fff}.brands .news .news-pic .slide-pagination{right:0;left:auto;bottom:0}.brands .news .news-pic .slide-pagination .slide-shade{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";background:none}.brands .news .news-pic .slide-pagination span{margin-top:3px}.brands .news .news-txt{padding:20px 16px;float:right;border:1px solid #000;overflow:hidden}.brands .news .news-txt ul{height:100%}.brands .news .news-txt li{position:relative;display:block;margin-bottom:10px;margin-left:20px}.brands .news .news-txt a{font-size:14px;line-height:27px;cursor:pointer;color:#010101;display:block}.brands .news .news-txt a:hover{color:#fff;background:#000;padding-left:12px;transition:padding .4s}.brands .news .news-txt i{position:absolute;top:0;left:-26px;font-size:22px}.brands .news .news-txt{width:342px;height:394px}.brands .ads{margin:40px 0}.brands .ads li{margin-right:10px;margin-bottom:10px}.brands .ads li a{width:280px}.brands .ads li a img{height:160px}.brands .ads li .name{font-size:14px}.brands .ads li .des{font-size:12px}.brands .brands-items{margin:25px auto}.brands .brands-items .brands-item{float:left;padding:15px 0;width:50%}.brands .brands-items a.brands-pic{float:left;width:280px;height:136px;display:block}.brands .brands-items a.brands-pic img{width:100%;height:100%}.brands .brands-items .brand-info{float:right;padding:0 20px;width:255px;color:#000}.brands .brands-items .brand-info h3{width:100%;font-size:20px;line-height:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.brands .brands-items .brand-info .brand-desc{padding:12px 0;height:92px;font-size:14px;line-height:22px;overflow:hidden}.brands .pagination{margin:40px 0 80px;text-align:center}.brands .pagination a{height:24px;padding:0 9px;line-height:24px;display:inline-block;text-align:center;margin-right:8px;color:#222;font-size:12px}.brands .pagination a i{position:relative;top:-1px;font-size:10px;transform:scale(.8)}.brands .pagination a.cur{background:#222;color:#fff}.min-screen .brands .header-navs{margin-right:-10px}.min-screen .brands .sit-nav{padding-top:10px;font-size:12px}.min-screen .brands .sit-nav .sep{margin:0 6px}.min-screen .brands .brands-category{width:990px}.min-screen .brands .brands-tabs li a{width:190px;height:154px}.min-screen .brands .brands-tabs .hover-contain{height:25px}.min-screen .brands .brands-tabs .hover-contain .hoverarr{height:4px;width:190px}.min-screen .brands .brands-ad li img{width:240px;height:240px}.min-screen .brands .brands-ad li:first-child img{width:490px}.min-screen .brands .brands-logo a{margin-left:10px}.min-screen .brands .brands-logo a img{width:90px;height:37px}.min-screen .brands .brands-logo a:first-child{margin-left:0}.min-screen .brands .list-floor{width:1000px}.min-screen .brands .brandfloor .g-list{margin-top:-26px}.min-screen .brands .brandfloor li{margin-right:9px;margin-top:26px}.min-screen .brands .brandfloor li a{width:324px;height:214px}.min-screen .brands .singlegoods .g-list{margin-top:-10px}.min-screen .brands .singlegoods li{margin-right:10px;margin-top:10px}.min-screen .brands .singlegoods li a{width:240px;height:324px}.min-screen .brands .singlegoods .singlegoods-title{position:absolute;left:0;bottom:0;height:50px;width:100%}.min-screen .brands .singlegoods .singlegoods-title p{position:absolute;z-index:2;top:0;left:0;display:block;width:100%;height:100%;line-height:50px;font-size:18px;text-align:center;color:#fff}.min-screen .brands .video .g-list{margin-top:-10px}.min-screen .brands .video li{margin-right:9px;margin-top:10px}.min-screen .brands .video li a{width:324px;height:206px}.min-screen .brands .video .video-play{display:block;position:absolute;left:50%;top:50%;margin-left:-30px;margin-top:-28px;width:60px;height:56px;background-image:url(../../../img/index/play.png?v154e22b4840)}.min-screen .brands .video .video-title{position:absolute;left:0;bottom:0;height:30px;width:100%}.min-screen .brands .video .video-title p{position:absolute;z-index:2;top:0;left:0;display:block;width:100%;height:100%;font-size:14px;line-height:30px;text-align:center;color:#fff}.min-screen .brands .news .news-pic{width:660px;height:376px}.min-screen .brands .news .news-pic .slide-container,.min-screen .brands .news .news-pic .slide-container img{height:376px}.min-screen .brands .news .news-txt{width:284px;height:334px}.min-screen .brands .news .news-txt li{margin-bottom:13px}.min-screen .brands .ads{margin-bottom:30px}.min-screen .brands .ads li{margin-right:10px;margin-bottom:10px}.min-screen .brands .ads li a{width:240px}.min-screen .brands .ads li a img{height:138px}.min-screen .brands .ads li .name{font-size:14px}.min-screen .brands .ads li .des{font-size:12px}.min-screen .brands .brands-items a.brands-pic{width:240px;height:116px}.min-screen .brands .brands-items .brand-info{width:212px}.min-screen .brands .brands-items .brand-info .brand-desc{height:72px}.brands-layer{position:absolute;z-index:7;top:-83px;left:15px;width:325px;height:287px;background:url(../../../img/index/brands-layer.png?v154e22b4840) no-repeat;font-weight:400}.brands-layer .layer-content{padding:20px 20px 20px 35px}.brands-layer .layer-content .title{font-size:24px;line-height:24px;border-bottom:1px solid #ccc;padding-bottom:5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.brands-layer .layer-content .desc{margin:5px 0;height:72px;overflow:hidden}.brands-layer .layer-content .desc img{width:80px;height:50px;margin:3px 5px 0 0;float:left}.brands-layer .layer-content .desc .right{width:180px;float:right;font-size:12px;line-height:150%;max-height:80px}.brands-layer .layer-content .featured{font-size:16px;margin-right:-15px}.brands-layer .layer-content .featured img{height:100px;width:80px;float:left;margin:15px 15px 0 0}.brands-layer-right{background:url(../../../img/index/brands-layer.png?v154e22b4840) no-repeat 0 -287px;left:-325px;top:-83px}.brands-layer-right .layer-content{padding:20px 35px 20px 20px}.coupon-page{width:1150px;margin:10px auto 0}.coupon-page .slide-container{position:relative}.coupon-page .slide-wrapper{position:relative;height:450px;overflow:hidden}.coupon-page .slide-wrapper ul{position:relative;height:100%}.coupon-page .slide-wrapper li{display:none;position:absolute;top:0;right:0;width:100%;height:100%}.coupon-page .slide-wrapper li a{display:block;height:100%;width:1150px;margin:0 auto}.coupon-page .slide-wrapper li img{width:100%;height:100%}.coupon-page .slide-switch,.coupon-page .slide-wrapper:hover .slide-switch.show,.coupon-page .slide-wrapper li:first-child{display:block}.coupon-page .slide-switch a{position:absolute;top:50%;margin:-30px 0 0;width:60px;height:60px;line-height:56px;text-align:center;z-index:2;background:#fff;opacity:.55;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=55)"}.coupon-page .slide-switch a .iconfont{font-size:32px;color:#59585a}.coupon-page .slide-switch a.prev{left:50%;margin-left:-575px}.coupon-page .slide-switch a.next{right:50%;margin-right:-575px}.coupon-page .slide-switch a:hover{opacity:.9;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=90)"}.coupon-page .title{width:300px;margin:80px auto 40px;text-align:center;border:1px solid #000;height:31px;line-height:31px;position:relative}.coupon-page .title span{margin:5px}.coupon-page .coupon{display:inline-block;position:relative;width:282px;height:258px;margin-right:2px}.coupon-page .coupon img{width:100%;height:100%}.coupon-page .coupon .coupon-mask{width:100%;height:259px;background-color:rgba(0,0,0,.6);position:absolute;top:0;left:0;right:0;z-index:6}.coupon-page .coupon .info{width:78px;height:78px;position:absolute;right:2px;bottom:-1px}.coupon-page .coupon .info>div{width:100%;height:38px;font-size:16px;color:#fff;text-align:center;position:absolute;top:50%;margin-top:-19px}.coupon-page .coupon .info p{margin-bottom:5px}.coupon-page .coupon .info .guang{width:50px;height:18px;line-height:18px;font-size:12px;background-color:#fff;color:#d0021b;margin:0 auto}
\ No newline at end of file
... ...
This diff could not be displayed because it is too large.
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports) {
/***/ }
/******/ ]);
\ No newline at end of file
... ...
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Mon May 23 22:22:36 2016
By admin
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
panose-1="2 0 6 3 0 0 0 0 0 0"
ascent="896"
descent="-128"
x-height="792"
bbox="0 -212 1158 896"
underline-thickness="50"
underline-position="-100"
unicode-range="U+0078-E607"
/>
<missing-glyph horiz-adv-x="374"
d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
<glyph glyph-name=".notdef" horiz-adv-x="374"
d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
<glyph glyph-name=".null" horiz-adv-x="0"
/>
<glyph glyph-name="nonmarkingreturn" horiz-adv-x="341"
/>
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
<glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1048"
d="M832 -126.5q0 -35.5 -25 -60.5t-60.5 -25t-60.5 25t-25 60.5t25 60.5t60.5 25t60.5 -25t25 -60.5zM533 -126.5q0 -35.5 -25 -60.5t-60 -25t-60 25t-25 60.5t25 60.5t60 25t60 -25t25 -60.5zM277 620l-35 159q-3 14 -15 23.5t-27 9.5h-147q-22 0 -37.5 -15.5t-15.5 -37.5
t15.5 -38t37.5 -16h54l157 -627q6 -25 25.5 -40t44.5 -15h527q25 0 44.5 15t25.5 40l113 452q9 34 -13 62t-57 28h-697z" />
<glyph glyph-name="uniE601" unicode="&#xe601;"
d="M505 337l2 -2q2 -1 3.5 -1t3.5 1l430 364q2 2 1 5.5t-5 3.5h-435h-424q-4 0 -5 -3.5t1 -5.5zM72 669q-3 2 -6 0.5t-3 -4.5v-584q0 -4 3.5 -5t5.5 1l288 346zM953 669.5q-3 1.5 -5 -0.5l-288 -246l287 -346q3 -2 6 -1t3 5v584q0 3 -3 4.5zM641 406l-131 -111l-5 5
l-125 103l-275 -328q-2 -3 -1 -6t5 -3h396h407q4 0 5 3t-1 6z" />
<glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1048"
d="M297.5 528q-20.5 0 -35 -14.5t-14.5 -35t14.5 -35.5t35 -15t35.5 15t15 35.5t-15 35t-35.5 14.5zM381 251q0 96 84 164t202 68t202 -68t84 -163.5t-84 -163.5t-202 -68t-202 68t-84 163zM286 251q0 -17 2 -35v1q-88 42 -140.5 114t-52.5 157t51.5 157t139.5 114t192 42
q142 0 249.5 -76.5t128.5 -189.5q-88 43 -189 43q-104 0 -191.5 -43.5t-138.5 -119t-51 -164.5zM953 36q95 93 95 215t-94 214q2 20 2 23q0 111 -64 205t-174.5 148.5t-240 54.5t-239.5 -54.5t-174 -148.5t-64 -205q0 -78 33 -148.5t93 -125.5l-77 -123q-8 -12 -6.5 -26
t10.5 -25q13 -15 32 -15q9 0 18 4l180 80q4 2 7 4q20 -7 39 -12q48 -80 138.5 -128t199.5 -48q75 0 145 25q1 -1 2 -1l140 -62q8 -4 17 -4q20 0 32 15q10 10 11 24t-7 26zM527 282q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11z
M667 282q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM806 282q-16 0 -27 -11t-11 -27t11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11z" />
<glyph glyph-name="uniE603" unicode="&#xe603;" horiz-adv-x="1158"
d="M1069 181h-245v378h132l113 -169v-209zM1158 417l-155 231h-268v-467h-45v508q0 20 -14 34t-34 14h-63l-67 -89h89v-467h-512v467h45l22 89h-108q-20 0 -34 -14t-14 -34v-549q0 -20 14 -34t34 -14h139q-33 -37 -33 -87q0 -53 37.5 -91t91 -38t91.5 38t38 91q0 50 -34 87
h264h191q-34 -37 -34 -87q0 -53 38 -91t91.5 -38t91 38t37.5 91q0 50 -33 87h134v325zM326 668q-89 -153 -94 -296v-12h129v12q0 43 17 112q17 68 39 116q27 61 67.5 118t62.5 79l4 3v96h-390l-2 -114h245q-33 -40 -78 -114z" />
<glyph glyph-name="uniE604" unicode="&#xe604;"
d="M875 126l-363 -164l-363 164v610q247 75 363 75t363 -75v-610zM930 808q-34 11 -84.5 26t-159.5 38.5t-174 23.5t-174 -23.5t-159.5 -38.5t-84.5 -26q-14 -4 -22 -15.5t-8 -25.5v-669q0 -27 25 -39l405 -183q9 -3 18 -3t18 3l405 183q25 12 25 39v669q0 14 -8 25.5
t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />
<glyph glyph-name="uniE605" unicode="&#xe605;"
d="M903 577l-68 69l-388 -388l-231 230l-68 -68l299 -298l65 65z" />
<glyph glyph-name="uniE606" unicode="&#xe606;"
d="M512 599q47 0 88 -18t72 -49t49 -72t18 -89q0 -46 -18 -87t-49 -72t-72 -49t-88 -18t-88 18t-72 49t-49 72t-18 87q0 48 18 89t49 72t72 49t88 18v0zM512 599z" />
<glyph glyph-name="uniE607" unicode="&#xe607;"
d="M797 219.5q0 -7.5 -5 -13.5l-29 -28q-6 -6 -13.5 -6t-12.5 6l-225 224l-224 -224q-6 -6 -13.5 -6t-13.5 6l-28 28q-6 6 -6 13.5t6 13.5l266 266q6 6 13.5 6t12.5 -6l267 -266q5 -6 5 -13.5z" />
</font>
</defs></svg>
... ...
No preview for this file type
... ... @@ -2,7 +2,7 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Wed May 11 14:40:20 2016
Created by FontForge 20120731 at Fri May 27 16:46:53 2016
By admin
</metadata>
<defs>
... ... @@ -19,7 +19,7 @@ Created by FontForge 20120731 at Wed May 11 14:40:20 2016
bbox="0 -212 1158 896"
underline-thickness="50"
underline-position="-100"
unicode-range="U+0078-E606"
unicode-range="U+0078-E60A"
/>
<missing-glyph horiz-adv-x="374"
d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
... ... @@ -54,5 +54,14 @@ t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119
d="M903 577l-68 69l-388 -388l-231 230l-68 -68l299 -298l65 65z" />
<glyph glyph-name="uniE606" unicode="&#xe606;"
d="M512 599q47 0 88 -18t72 -49t49 -72t18 -89q0 -46 -18 -87t-49 -72t-72 -49t-88 -18t-88 18t-72 49t-49 72t-18 87q0 48 18 89t49 72t72 49t88 18v0zM512 599z" />
<glyph glyph-name="uniE607" unicode="&#xe607;"
d="M797 219.5q0 -7.5 -5 -13.5l-29 -28q-6 -6 -13.5 -6t-12.5 6l-225 224l-224 -224q-6 -6 -13.5 -6t-13.5 6l-28 28q-6 6 -6 13.5t6 13.5l266 266q6 6 13.5 6t12.5 -6l267 -266q5 -6 5 -13.5z" />
<glyph glyph-name="uniE608" unicode="&#xe608;"
d="M284 15q-14 -14 -14 -33t13.5 -32.5t32.5 -13.5t32 14l397 401q13 14 13 33t-13 33l-397 401q-13 14 -32 14t-32.5 -13.5t-13.5 -32.5t13 -33l351 -369l-350 -369v0zM284 15z" />
<glyph glyph-name="uniE609" unicode="&#xe609;"
d="M745 753q13 14 13 33t-13.5 32.5t-32.5 13.5t-32 -14l-396 -401q-14 -14 -14 -33t14 -33l396 -401q14 -14 32.5 -14t32 13.5t13.5 32.5t-13 33l-351 369l351 369v0zM745 753z" />
<glyph glyph-name="uniE60A" unicode="&#xe60a;"
d="M512.5 750q-12.5 0 -21.5 -9t-9 -22v-311h-249q-12 0 -21.5 -9t-9.5 -22t9.5 -22t21.5 -9h280q12 0 21.5 9t9.5 22v342q0 13 -9.5 22t-22 9zM513 874q-101 0 -193 -39.5t-158.5 -105.5t-106 -158t-39.5 -193t39.5 -193t106 -158.5t158.5 -105.5t193 -39t192.5 39
t158 105.5t106 158.5t39.5 193t-39.5 193t-106 158t-158 105.5t-192.5 39.5zM513 -56q-118 0 -218 58t-158.5 158t-58.5 218t58.5 218t158.5 158t218 58t218 -58t158 -158t58 -218t-58 -218t-158 -158t-218 -58z" />
</font>
</defs></svg>
... ...
No preview for this file type
No preview for this file type
... ... @@ -61,7 +61,8 @@ const postcssPlugin = (et) => {
// assets & sprites config in both dev and pro
if (et === env.pro) {
assets = {
loadPaths: [dist.img, dist.font]
loadPaths: [dist.img, dist.font],
relativeTo: dist.css
};
Object.assign(sprites, {
... ...