Authored by xuqi

Merge branch 'release/1.0' of http://git.yoho.cn/fe/yoho-blk into release/1.0

... ... @@ -48,5 +48,5 @@ const index = (req, res, next) => {
};
module.exports = {
index // 组件demo页
index // 品牌一览
};
... ...
... ... @@ -11,6 +11,7 @@ const camelCase = global.yoho.camelCase;
const _ = require('lodash');
const Promise = require('bluebird');
const co = Promise.coroutine;
const config = global.yoho.config;
// const moment = require('moment');
const logger = global.yoho.logger;
... ... @@ -34,7 +35,6 @@ const _processNavData = (list, type) => {
formatData.push(data);
});
console.log(formatData);
return formatData;
};
... ... @@ -383,6 +383,14 @@ const _getRelateBrand = (id) => {
article_id: id
}).then((result) => {
if (result && result.code === 200) {
_.forEach(result.data, function(data) {
let domain = data.url;
domain = domain.substring(domain.indexOf('/') + 2, domain.indexOf('.'));
console.log(domain);
data.url = `${config.siteUrl}/product/shop/${domain}`;
});
return camelCase(result.data);
} else {
logger.error('Related brand return code is not 200');
... ...
... ... @@ -11,44 +11,47 @@ const accountModel = require('../models/account');
* 修改密码
* @param req
* @param res
* @param next
*/
const changePwd = (req, res) => {
const changePwd = (req, res, next) => {
let uid = req.user.uid;
let pwd = req.body.password;
accountModel.changePwd(uid, pwd).then(result=> {
res.send(result);
});
}).catch(next);
};
/**
* 验证手机号码
* @param req
* @param res
* @param next
*/
const checkVerifyMobile = (req, res)=> {
const checkVerifyMobile = (req, res, next)=> {
let uid = req.user.uid;
let mobile = req.body.mobile;
let area = req.body.area;
accountModel.checkVerifyMobile(uid, mobile, area).then(result=> {
res.send(result);
});
}).catch(next);
};
/**
* 发送短信
* @param req
* @param res
* @param next
*/
const sendMobileMsg = (req, res)=> {
const sendMobileMsg = (req, res, next)=> {
let uid = req.user.uid;
let mobile = req.body.mobile;
let area = req.body.area || '+86';
accountModel.sendMobileMsg(uid, mobile, area).then(result=> {
res.send(result);
});
}).catch(next);
};
... ... @@ -56,36 +59,38 @@ const sendMobileMsg = (req, res)=> {
* 验证短信
* @param req
* @param res
* @param next
*/
const checkVerifyMsg = (req, res)=> {
const checkVerifyMsg = (req, res, next)=> {
let code = req.body.code;
let mobile = req.body.mobile;
let area = req.body.area || '+86';
accountModel.checkVerifyMsg(code, mobile, area).then(result=> {
res.send(result);
});
}).catch(next);
};
/**
* 发送验证邮件
* @param req
* @param res
* @param next
*/
const sendVerifyEmail = (req, res)=> {
const sendVerifyEmail = (req, res, next)=> {
let uid = req.user.uid;
let email = req.body.email;
accountModel.sendVerifyEmail(uid, email).then(result=> {
res.send(result);
});
}).catch(next);
};
module.exports = {
changePwd: changePwd,
sendMobileMsg: sendMobileMsg,
checkVerifyMsg: checkVerifyMsg,
sendVerifyEmail: sendVerifyEmail,
checkVerifyMobile: checkVerifyMobile
changePwd,
sendMobileMsg,
checkVerifyMsg,
sendVerifyEmail,
checkVerifyMobile
};
... ...
... ... @@ -26,10 +26,10 @@ const index = (req, res, next) => {
addressModel.getAddressDataAsync(uid, 20).then(result => {
let resultData = result.data ? result.data : result;
let length = resultData.length ? resultData.length : 0;
let reg = /(\d{3})\d{4}(\d{4})/;
for (let i = 0; i < length; i++) {
resultData[i].mobile = resultData[i].mobile.substring(0, 3) + '****' +
resultData[i].mobile.substring(7, 11);
resultData[i].mobile = resultData[i].mobile.replace(reg, "$1****$2");
}
resultData.leftLength = 7 - length;
resultData.length = length;
... ... @@ -64,7 +64,7 @@ const getAddressList = (req, res, next) => {
/**
* 添加地址
*/
const addAddressData = (req, res) => {
const addAddressData = (req, res, next) => {
let uid = req.user.uid;
let address = req.body.address;
let areaCode = req.body.area_code;
... ... @@ -76,13 +76,13 @@ const addAddressData = (req, res) => {
addressModel.addAddressData(uid, address, areaCode, consignee, mobile, phone, isInit).then(result => {
res.send(result);
});
}).catch(next);
};
/**
* 修改地址
*/
const updateAddressData = (req, res) => {
const updateAddressData = (req, res, next) => {
let id = req.body.id;
let uid = req.user.uid;
let address = req.body.address;
... ... @@ -93,19 +93,19 @@ const updateAddressData = (req, res) => {
addressModel.updateAddressData(id, uid, address, areaCode, consignee, mobile, phone).then(result => {
res.send(result);
});
}).catch(next);
};
/**
* 删除地址
*/
const delAddressData = (req, res) => {
const delAddressData = (req, res, next) => {
let id = req.body.id;
let uid = req.user.uid;
addressModel.delAddressData(id, uid).then(result => {
res.send(result);
});
}).catch(next);
};
/**
... ...
... ... @@ -17,18 +17,18 @@ const convertUnitTime = (src) => {
/**
* yoho币页面加载
*/
const index = (req, res) => {
var uid = req.user.uid;
var page = parseInt(req.query.page, 10) || 1;
var queryType = parseInt(req.query.queryType, 10) || 0;
var beginTime = req.query.beginTime || convertUnitTime(new Date() / 1000 - 3600 * 24 * 90);
var date1 = new Date().getTime() / 1000;
var date2 = new Date(beginTime).getTime() / 1000;
var selectIndex = parseInt((date1 - date2) / (3600 * 24 * 30 * 6), 10);
const index = (req, res, next) => {
let uid = req.user.uid;
let page = parseInt(req.query.page, 10) || 1;
let queryType = parseInt(req.query.queryType, 10) || 0;
let beginTime = req.query.beginTime || convertUnitTime(new Date() / 1000 - 3600 * 24 * 90);
let date1 = new Date().getTime() / 1000;
let date2 = new Date(beginTime).getTime() / 1000;
let selectIndex = parseInt((date1 - date2) / (3600 * 24 * 30 * 6), 10);
currencyModel.getIndexData(uid, page, queryType, beginTime).then(result=> {
result.list.tabs[queryType].isActive = true;
result.list.coinList.forEach(function(x) {
result.list.coinList.forEach(function (x) {
x.date = x.date.replace(/\-/g, '.');
});
result.list.selects[selectIndex].isSelected = 'selected';
... ... @@ -58,7 +58,7 @@ const index = (req, res) => {
total: result.list.total ? result.list.total : 0
}
});
});
}).catch(next);
};
... ...
... ... @@ -12,6 +12,7 @@ const accountModel = require('../models/account');
const passportHelper = require('../../passport/models/passport-helper');
const Promise = require('bluebird');
const co = Promise.coroutine;
const regMobile = /(\d{3})\d{4}(\d{4})/;//正则匹配替换手机号码中间4位
const captchaUrl = helpers.urlFormat('/passport/images', {t: Date.now()});
... ... @@ -79,8 +80,7 @@ const index = (req, res, next) => {
result.info.gender ? result.genders[result.info.gender - 1].checked = true :
result.genders[2].checked = true;
result.info.head_ico = result.info.head_ico ? helpers.image(result.info.head_ico, 400, 300, 2) : '';
result.info.mobile = result.info.mobile ?
result.info.mobile.substring(0, 3) + '****' + result.info.mobile.substring(7, 11) : '';
result.info.mobile = result.info.mobile ? result.info.mobile.replace(regMobile, "$1****$2") : '';
result.stepUrl = '/me/setting/step1';
res.display('index', {
module: 'me',
... ... @@ -102,19 +102,20 @@ const index = (req, res, next) => {
* 编辑信息
* @param req
* @param res
* @param next
*/
const editUserInfo = (req, res)=> {
const editUserInfo = (req, res, next)=> {
let uid = req.user.uid;
let query = req.body;
settingModel.editUserInfo(uid, query).then(result=> {
res.send(result);
});
}).catch(next);
};
/*
* step1
* step1 绑定的手机号码身份验证
* */
const bindMobile = (req, res, next) => {
let uid = req.user.uid;
... ... @@ -124,7 +125,7 @@ const bindMobile = (req, res, next) => {
if (result.info.verify_mobile !== '') {
let info = result.info;
info.ellipsisMobile = info.verify_mobile.substring(0, 3) + '****' + info.verify_mobile.substring(7, 11);
info.ellipsisMobile = info.verify_mobile.replace(regMobile, "$1****$2");
info.checkCode = settingModel.cipheriv(info.uid + '.completeverify');
res.display('index', {
... ... @@ -150,6 +151,9 @@ const bindMobile = (req, res, next) => {
});
};
/**
* step1 绑定的邮箱进行身份验证
*/
const bindEmail = (req, res, next) => {
let uid = req.user.uid;
let type = req.params.type;
... ... @@ -181,6 +185,9 @@ const bindEmail = (req, res, next) => {
});
};
/**
*step1 登录密码进行身份验证
*/
const modifyPassword = (req, res) => {
let type = req.params.type;
let checkCode = settingModel.cipheriv(req.user.uid + '.completeverify');
... ... @@ -204,7 +211,7 @@ const modifyPassword = (req, res) => {
};
/*
* step2 渲染页面
* step2 操作界面-渲染页面
* */
const edit = (req, res)=> {
let type = req.params.type;
... ... @@ -243,7 +250,7 @@ const edit = (req, res)=> {
};
/*
* step3
* step3 操作成功-渲染界面
* */
const success = (req, res)=> {
let type = req.params.type;
... ... @@ -280,7 +287,7 @@ const success = (req, res)=> {
};
/*
* post1
* post1 第一步的post请求
* */
const validate1 = (req, res)=> {
co(function *() {
... ... @@ -305,7 +312,7 @@ const validate1 = (req, res)=> {
};
/*
* post2
* post2 第二步的post请求
* */
const validate2 = (req, res)=> {
co(function *() {
... ...
... ... @@ -108,11 +108,11 @@ const modifyVerifyMobile = (uid, area, newMobile)=> {
};
module.exports = {
verifyPwd: verifyPwd,
changePwd: changePwd,
sendMobileMsg: sendMobileMsg,
checkVerifyMsg: checkVerifyMsg,
sendVerifyEmail: sendVerifyEmail,
checkVerifyMobile: checkVerifyMobile,
modifyVerifyMobile: modifyVerifyMobile
verifyPwd,
changePwd,
sendMobileMsg,
checkVerifyMsg,
sendVerifyEmail,
checkVerifyMobile,
modifyVerifyMobile
};
... ...
... ... @@ -120,5 +120,5 @@ const getIndexData = (uid, page, queryType, beginTime) => {
};
module.exports = {
getIndexData: getIndexData
getIndexData
};
... ...
... ... @@ -76,11 +76,11 @@ const getUserInfo = (uid) => {
};
/* const getVerifyInfo = (uid)=> {
return api.get('', {
method: 'web.passport.getUserVerifyInfo',
uid: uid
}).then(result => result);
};*/
return api.get('', {
method: 'web.passport.getUserVerifyInfo',
uid: uid
}).then(result => result);
};*/
/**
* 编辑个人详细信息
... ... @@ -180,8 +180,8 @@ const decipheriv = (data) => {
};
module.exports = {
getUserInfo: getUserInfo,
editUserInfo: editUserInfo,
cipheriv: cipheriv,
decipheriv: decipheriv
getUserInfo,
editUserInfo,
cipheriv,
decipheriv
};
... ...
... ... @@ -5,6 +5,7 @@
</div>
<div class="left right-content">
<textarea class="mark-text"></textarea>
<span class="word-limit">限制100字</span>
</div>
</div>
<div class="clearfix">
... ...
... ... @@ -40,18 +40,16 @@
<a class="blue operation" href="{{stepUrl}}/bindMobile">绑定</a>
{{/if}}
</div>
<!-- <div class="form-group">
<div class="form-group">
<label class="label-name">邮箱:</label>
{{#if info.verify_email}}
<input class="input no-edit" value="{{info.mobile}}">
&lt;!&ndash;<a class="blue operation" href="{{stepUrl}}/modifyEmail">修改</a>&ndash;&gt;
<a class="blue operation">修改</a>
<!--<a class="blue operation" href="{{stepUrl}}/modifyEmail">修改</a>-->
{{else}}
<input class="input" type="text" placeholder="请绑定邮箱" disabled>
&lt;!&ndash;<a class="blue operation" href="{{stepUrl}}/bindEmail">绑定</a>&ndash;&gt;
<a class="blue operation">绑定</a>
<!--<a class="blue operation" href="{{stepUrl}}/bindEmail">绑定</a>-->
{{/if}}
</div>-->
</div>
<div class="form-group">
<label class="label-name">出生日期:</label>
<input id="birthday" class="input" type="text" value="{{info.birthday}}">
... ... @@ -63,7 +61,7 @@
<span class="blue error-tips">{{> icon/error-round}}请选择</span>
</div>
<div class="form-group">
<label class="label-name">详细地址:</label>
<label class="label-name" style="visibility: hidden">详细地址:</label>
<input id="full_address" class="input big-input" type="text" placeholder="请填写详细地址"
maxlength="20" value="{{concat.full_address}}">
</div>
... ...
... ... @@ -27,13 +27,16 @@ const list = {
title: '列表'
};
Search.queryProduct(q).then(result => {
Promise.all([Search.queryAllSort(), Search.queryProduct(q)]).then(allResult => {
let allSort = camelCase(allResult[0]);
let result = allResult[1];
if (result && result.code === 200 && result.data) {
let data = camelCase(result.data);
let nav = [DataHelper.getChannelNav()];
if (data.filter) {
data.filter.groupSort = DataHelper.sortConvert(allSort.data.sort);
retData.filter = DataHelper.filterHandle(data.filter, q);
retData.filter.showPrice = data.total > 10;
nav = _.concat(nav, retData.filter.nav);
... ... @@ -74,9 +77,10 @@ const list = {
title: '列表'
};
Promise.all([Resouces.newProductBanner(), Search.queryNewProduct(q)]).then(result => {
Promise.all([Resouces.newProductBanner(), Search.queryAllSort(), Search.queryNewProduct(q)]).then(result => {
let banner = result[0];
let listData = result[1];
let sortData = camelCase(result[1]);
let listData = result[2];
let nav = [DataHelper.getChannelNav(), {
name: '新品'
}];
... ... @@ -87,6 +91,7 @@ const list = {
let data = camelCase(listData.data);
if (data.filter) {
data.filter.groupSort = DataHelper.sortConvert(sortData.data.sort);
retData.filter = DataHelper.filterHandle(data.filter, q);
retData.filter.showPrice = data.total > 10;
}
... ...
... ... @@ -28,7 +28,9 @@ const Query = {
query: query
};
Search.queryProduct(q).then(result => {
Promise.all([Search.queryAllSort(), Search.queryProduct(q)]).then(allResult => {
let allSort = camelCase(allResult[0]);
let result = allResult[1];
if (result && result.code === 200 && result.data) {
let data = camelCase(result.data);
... ... @@ -39,6 +41,7 @@ const Query = {
});
if (data.filter) {
data.filter.groupSort = DataHelper.sortConvert(allSort.data.sort);
retData.filter = DataHelper.filterHandle(data.filter, q);
retData.filter.showPrice = data.total > 10;
}
... ...
... ... @@ -111,15 +111,23 @@ const shop = {
});
} else {
res.status(404);
return Promise.reject('brand not found');
return Promise.reject('brand-not-found');
}
}).then(() => {
return Search.queryProductOfBrand(q).then(result => {
return Promise.all([Search.queryAllSort({
brand: q.brand,
shop: q.shop_id,
small_sort: 1
}), Search.queryProductOfBrand(q)]).then(allResult => {
let allSort = camelCase(allResult[0]);
let result = allResult[1];
if (result && result.code === 200 && result.data) {
let ret = camelCase(result.data);
if (ret.filter) {
delete q.brand;
ret.filter.groupSort = DataHelper.sortConvert(allSort.data.sort);
data.filter = DataHelper.filterHandle(ret.filter, req.query);
data.filter.showPrice = ret.total > 10;
}
... ...
... ... @@ -96,27 +96,28 @@ const helpers = {
* @param sorts
* @returns {Array}
*/
getSortNav(sort, sorts) {
getSortNav(msort, misort, sorts) {
let nav = [];
let sortQuery = '?';
if (sort && sorts) {
if (msort && sorts) {
sorts.forEach(s => {
if (s.relationParameter.sort === sort) {
if (s.categoryId === msort) {
sortQuery += 'msort=' + msort;
s.checked = true;
nav.push({
link: '#',
link: sortQuery,
pathTitle: '',
name: s.categoryName
});
} else if (s.sub) {
}
if (s.sub && misort) {
s.sub.forEach(m => {
if (m.relationParameter.sort === sort) {
nav.push({
link: '#',
pathTitle: '',
name: s.categoryName
});
if (m.categoryId === misort) {
sortQuery += '&misort=' + misort;
m.checked = true;
nav.push({
link: '#',
link: sortQuery,
pathTitle: '',
name: m.categoryName
});
... ... @@ -143,6 +144,16 @@ const helpers = {
};
},
sortConvert(sorts) {
return _.map(sorts, s => {
return {
categoryId: s.sortId,
categoryName: s.sortName,
sub: helpers.sortConvert(s.sub)
};
});
},
/**
* 筛选器数据处理
* @param filter
... ... @@ -160,6 +171,7 @@ const helpers = {
let filters = [];
let customPriceLow = '';
let customPriceHigh = '';
let showSize = (!!q.sort || !!q.misort);
genders.forEach(g => {
if (g.value === q.gender) {
... ... @@ -222,6 +234,7 @@ const helpers = {
}
if (q.size) {
showSize = false;
sizeInfo.forEach(s => {
if (s.sizeId === parseInt(q.size, 10)) {
s.checked = true;
... ... @@ -270,9 +283,9 @@ const helpers = {
letters: this.brandLetters(),
customPriceLow: customPriceLow,
customPriceHigh: customPriceHigh,
showSize: !!q.sort,
showSize: showSize,
showPrice: true,
nav: this.getSortNav(q.sort, sorts)
nav: this.getSortNav(q.msort, q.misort, sorts)
};
},
... ...
... ... @@ -97,12 +97,13 @@ const getProductItemData = (params, url, uid) => {
itemFun.setDescriptionData(mulRes.sizeInfo, mulRes.comfort), // DESCRIPTION商品描述
itemFun.setMaterialData(mulRes.sizeInfo), // MATERIALS材料洗涤
itemFun.setSizeData(mulRes.sizeInfo, mulRes.modelTry), // SIZEINFO尺码信息
itemFun.setDetailData(mulRes.sizeInfo), // DETAILS商品详情
itemFun.setSeoInfo(data.goodInfo, data.nav) // 商品详情SEO
itemFun.setDetailData(mulRes.sizeInfo) // DETAILS商品详情
);
resData.content = data;
// 商品详情SEO
Object.assign(resData, itemFun.setSeoInfo(data.goodInfo, data.nav));
return resData;
});
... ...
... ... @@ -47,7 +47,7 @@ const Search = {
},
queryProductOfBrand(params) {
let finalParams = {
method: 'app.search.brand',
method: 'app.search.li',
limit: 45,
app_type: 1
};
... ... @@ -67,11 +67,11 @@ const Search = {
return api.get('', finalParams);
},
queryAllSort() {
return api.get('', {
method: 'app.sort.get',
queryAllSort(params) {
return api.get('', _.assign({
method: 'web.regular.groupsort',
app_type: 1
});
}, params), {code: 200});
}
};
... ...
... ... @@ -10,7 +10,7 @@
{{> list/banner-info }}
</div>
<div class="center-content clearfix">
<div class="yoho-product-list-content center-content clearfix">
<div class="left">
{{!-- 筛选区域 --}}
{{#filter}}
... ...
... ... @@ -34,7 +34,7 @@
<div class="title">全部品类</div>
<div class="yoho-ui-accordion no-active">
{{#each sortData}}
<h3>{{categoryName}}</h3>
<h3 {{#if checked}}class="active"{{/if}}>{{categoryName}}</h3>
<div class="body" data-value="{{categoryId}}">
<div class="list-body nano">
<div class="nano-content">
... ...
... ... @@ -19,8 +19,10 @@ module.exports = {
},
cookieDomain: 'yohobuy.com',
domains: {
api: 'http://testapi.yoho.cn:28078/', // devapi.yoho.cn:58078 testapi.yoho.cn:28078 devapi.yoho.cn:58078
service: 'http://testservice.yoho.cn:28077/', // testservice.yoho.cn:28077 devservice.yoho.cn:58077
api: 'http://devapi.yoho.cn:58078/', // devapi.yoho.cn:58078 testapi.yoho.cn:28078 devapi.yoho.cn:58078
service: 'http://devservice.yoho.cn:58077/', // testservice.yoho.cn:28077 devservice.yoho.cn:58077
// api: 'http://api.yoho.cn/',
// service: 'http://service.yoho.cn/',
search: 'http://192.168.102.216:8080/yohosearch/'
},
useOneapm: false,
... ...
... ... @@ -32,13 +32,14 @@ $('#prise-btn').click(function() {
}
if ($this.hasClass('liked')) {
url = '/editorial/info/cancelPraise';
// 点赞
url = '/editorial/info/praise';
} else {
// 取消点赞
url = '/editorial/info/cancelPraise';
url = '/editorial/info/praise';
}
prising = true;
$.ajax({
... ... @@ -92,34 +93,6 @@ $('#collect-btn').click(function() {
} else {
new _alert(data.message).show();
}
// switch (data.code) {
// // case 401:
// // // 防止从已有col的页面再次进行跳转后出错的情况
// // if (/\?col=(1|0)/.test(location.href)) {
// // hrefUrl = location.href.replace(/\?col=(1|0)/, '?col=' + col);
// // } else {
// // hrefUrl = location.href + '?col=' + col;
// // }
// // location.href = '//www.yohobuy.com/signin.html?refer=' + encodeURI(hrefUrl);
// // break;
// case 400:
// new _alert(data.message).show();
// break;
// case 200:
// if (/\?col=(1|0)/.test(location.href)) {
// // 如果页面url中含有col,为了防止页面刷新时收藏或者取消收藏会根据col来的问题,进行页面跳转拿掉参数
// location.href = location.href.replace(/\?col=(1|0)/, '');
// } else {
// $this.toggleClass('collected');
// }
// break;
// default:
// break;
// }
collecting = false;
});
}).bind('mouseenter mouseleave', function() {
... ...
... ... @@ -73,7 +73,11 @@ function changePayMode(id) {
payInfo.dom = $refundType.children('.mode' + payInfo.type);
$typeInfo.addClass('hide');
payInfo.dom.removeClass('hide');
getUnionList();
// 银行卡退款,获取银行列表
if (+id === 3) {
getUnionList();
}
}
changePayMode(payInfo.type);
... ...
... ... @@ -23,12 +23,18 @@ var YohoListPage = {
$('.yoho-ui-accordion', this.rootDoc).each(function() {
var opts = {
collapsible: true,
heightStyle: 'content'
heightStyle: 'content',
active: 0
};
if ($(this).hasClass('no-active')) {
opts.active = false;
}
$(this).find('h3').each(function(index) {
if ($(this).hasClass('active')) {
opts.active = index;
}
});
$(this).accordion(opts);
});
... ... @@ -45,14 +51,13 @@ var YohoListPage = {
$('.list-body .input-radio', this.rootDoc).check({
type: 'radio',
group: 'sort',
onChange: function(ele, checked, value) {
onChange: function(ele) {
var subCategoryId = $(ele).data('category');
var categoryId = $(ele).parents('.body').data('value');
YohoListPage.go({
categoryId: categoryId,
subCategoryId: subCategoryId,
sort: checked ? value : ''
msort: categoryId,
misort: subCategoryId
});
}
});
... ...
... ... @@ -81,6 +81,16 @@
height: 120px;
resize: none;
border-color: #eee;
float: left;
margin-bottom: 10px;
}
.word-limit {
color: #999;
font-size: 12px;
float: right;
margin-top: -34px;
margin-right: 20px;
}
.img-wrap,
... ...
... ... @@ -340,6 +340,11 @@
text-align: center;
margin: 20px 0 40px;
li {
width: auto;
margin: 0 4px;
}
li:first-child,
li:last-child {
border-width: 2px;
... ...
.yoho-product-list,
.yoho-shop-index {
.yoho-product-list-content {
margin-top: 30px;
}
.brand-banner {
width: 100%;
height: 150px;
... ... @@ -37,7 +41,6 @@
.shop-menu {
border-bottom: 1px solid #eee;
margin-bottom: 30px;
li {
display: inline-block;
... ...