Toggle navigation
Toggle navigation
This project
Loading...
Sign in
fe
/
yohobuy-node
·
Commits
Go to a project
GitLab
Go to group
Project
Activity
Files
Commits
Pipelines
0
Builds
0
Graphs
Milestones
Issues
1
Merge Requests
0
Members
Labels
Wiki
Forks
Network
Create a new issue
Download as
Plain Diff
Browse Files
Authored by
yyq
8 years ago
Commit
78a07d3e85b7d5bf9b14965e69404116fc84621d
2 parents
90f24d22
f8f00ceb
Merge branch 'feature/shopTune' into release/5.3
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
286 additions
and
167 deletions
apps/product/controllers/list.js
apps/product/models/list.js
apps/product/models/search-api.js
apps/product/models/search-handler.js
apps/product/models/shop-handler.js
apps/product/router.js
apps/product/views/partial/list/shop-list.hbs
apps/product/views/partial/list/shop-single-list.hbs
doraemon/views/partial/product/left-content.hbs
public/js/product/index/product.js
public/js/product/shop.page.js
public/scss/common/_foot-pager.css
public/scss/product/_left-content.css
public/scss/product/_shop-index.css
apps/product/controllers/list.js
View file @
78a07d3
...
...
@@ -14,21 +14,36 @@ const searchApi = require(`${mRoot}/search-api`);
// 店铺页
const
shop
=
(
shopId
,
req
,
res
,
next
,
brandInfo
)
=>
{
let
domain
=
req
.
query
.
domain
,
params
=
req
.
query
;
_
.
unset
(
params
,
'domain'
);
shopId
=
parseInt
(
shopId
,
10
);
Object
.
assign
(
params
,
{
shopId
:
shopId
});
list
.
getShopInfo
(
shopId
,
req
.
user
.
uid
).
then
(
shopInfo
=>
{
let
pjax
=
params
.
_pjax
;
// 比较品牌域名与店铺域名是否一致,不一致跳转至店铺域名
if
(
!
pjax
&&
shopInfo
.
domain
&&
domain
&&
domain
!==
_
.
toLower
(
shopInfo
.
domain
))
{
res
.
redirect
(
helpers
.
urlFormat
(
''
,
params
,
shopInfo
.
domain
));
return
;
}
if
(
+
shopInfo
.
shopTemplateType
===
2
)
{
// 经典模板
let
pjax
=
req
.
query
.
_pjax
;
if
(
pjax
)
{
list
.
getShopGoodsData
(
shopId
,
req
.
yoho
.
channel
,
req
.
query
,
shopInfo
).
then
(
result
=>
{
Object
.
assign
(
result
,
{
layout
:
false
});
list
.
getShopGoodsData
(
shopId
,
req
.
yoho
.
channel
,
params
,
shopInfo
).
then
(
result
=>
{
Object
.
assign
(
result
,
{
shopId
:
shopId
,
layout
:
false
});
res
.
render
(
'list/goods-list'
,
result
);
}).
catch
(
next
);
return
;
}
list
.
getShopData
(
shopId
,
req
.
yoho
.
channel
,
req
.
query
,
shopInfo
).
then
(
result
=>
{
list
.
getShopData
(
shopId
,
req
.
yoho
.
channel
,
params
,
shopInfo
).
then
(
result
=>
{
Object
.
assign
(
result
,
{
page
:
'shop'
,
shopId
:
shopId
...
...
@@ -41,7 +56,7 @@ const shop = (shopId, req, res, next, brandInfo) => {
res
.
render
(
'list/shop-index'
,
result
);
}).
catch
(
next
);
}
else
{
// 基础模板
list
.
getBaseShopData
(
req
.
query
,
Object
.
assign
({
uid
:
req
.
user
.
uid
},
brandInfo
),
list
.
getBaseShopData
(
params
,
Object
.
assign
({
uid
:
req
.
user
.
uid
},
brandInfo
),
req
.
yoho
.
channel
,
shopId
).
then
(
result
=>
{
Object
.
assign
(
result
,
{
page
:
'list'
});
...
...
@@ -111,15 +126,15 @@ exports.brand = (req, res, next) => {
let
shopId
=
req
.
query
.
shopId
;
let
resData
=
{};
if
(
!
brandDomain
)
{
return
next
();
}
// shopId存在,直接走店铺
if
(
shopId
)
{
return
shop
(
shopId
,
req
,
res
,
next
);
}
if
(
!
brandDomain
)
{
return
next
();
}
// 获取品牌信息
list
.
getBrandInfo
({
domain
:
brandDomain
}).
then
(
brandInfo
=>
{
if
(
!
brandInfo
.
hasOwnProperty
(
'type'
))
{
...
...
@@ -224,7 +239,7 @@ exports.getNodeContent = (req, res, next) => {
*/
exports
.
getAdnav
=
(
req
,
res
,
next
)
=>
{
if
(
!
req
.
xhr
||
!
req
.
body
.
brandId
)
{
if
(
!
req
.
xhr
)
{
return
next
();
}
...
...
apps/product/models/list.js
View file @
78a07d3
...
...
@@ -15,12 +15,15 @@ const helpers = global.yoho.helpers;
const
crypto
=
global
.
yoho
.
crypto
;
const
_
=
require
(
'lodash'
);
const
limitNum
=
60
;
// 商品每页显示数目
//
const limitNum = 60; // 商品每页显示数目
const
needParams
=
[
'query'
,
'msort'
,
'misort'
,
'gender'
,
'shelveTime'
];
// 品牌页folder名称
const
brandFolderSeries
=
'经典系列'
;
// 经典店铺list url
const
shopListUrl
=
'/product/shoplist'
;
// 搜索分类信息需要的参数
const
positionId
=
10
;
...
...
@@ -276,16 +279,16 @@ const getBrandData = (params, extra, channel) => {
}
else
{
// 品牌以品牌ID查询商品
queryBase
.
brand
=
extra
.
brandId
;
}
// 设置品牌默认排序方式
let
order
=
params
.
order
||
'b_w_desc'
;
// 设置品牌默认排序方式
searchParams
.
order
=
searchParams
.
order
||
'b_w_desc'
;
}
// 调用接口
let
apiMethod
=
[
headerModel
.
requestHeaderData
(
channel
),
searchApi
.
getSortList
(
queryBase
),
searchApi
.
getProductList
(
Object
.
assign
(
searchParams
,
{
order
:
order
},
queryBase
))
searchApi
.
getProductList
(
Object
.
assign
(
searchParams
,
queryBase
))
];
if
(
queryBase
.
brand
)
{
...
...
@@ -301,6 +304,7 @@ const getBrandData = (params, extra, channel) => {
brandBanner
:
searchHandler
.
handleBrandBanner
(
extra
),
leftContent
:
{},
node
:
extra
.
node
||
''
,
brandShopAd
:
true
,
brandId
:
extra
.
brandId
}
};
...
...
@@ -496,7 +500,7 @@ const getNodeContentData = (params) => {
*/
const
getAdnav
=
(
params
)
=>
{
return
Promise
.
all
([
searchApi
.
getBrand
Folder
(
params
),
searchApi
.
getBrand
Series
(
params
)]).
then
(
result
=>
{
return
Promise
.
all
([
searchApi
.
getBrand
ShopFolder
(
params
),
searchApi
.
getBrandShop
Series
(
params
)]).
then
(
result
=>
{
let
dest
=
{
picTitle
:
''
,
...
...
@@ -615,8 +619,7 @@ const getShopData = (shopId, channel, params, shopInfo) => {
sknList
.
push
(
value
.
productSkn
);
});
let
shopBrandIds
=
[],
// 店铺的所有品牌id
articleApiMethod
=
[],
// 通过品牌获取相关文章接口
let
articleApiMethod
=
[],
// 通过品牌获取相关文章接口
apiMethod
=
[
searchApi
.
getProductList
({
viewNum
:
sknList
.
length
,
...
...
@@ -626,7 +629,6 @@ const getShopData = (shopId, channel, params, shopInfo) => {
if
(
result
[
3
].
code
===
200
&&
result
[
3
].
data
)
{
_
.
forEach
(
result
[
3
].
data
,
value
=>
{
shopBrandIds
.
push
(
value
.
brand_id
);
articleApiMethod
.
push
(
searchApi
.
getArticleByBrand
(
value
.
brand_id
,
'udid'
)
// 品牌推荐文章
);
...
...
@@ -637,8 +639,8 @@ const getShopData = (shopId, channel, params, shopInfo) => {
finalResult
.
coupon
=
searchHandler
.
handleBrandShopCoupons
(
result
[
4
].
data
,
{
shopId
:
shopId
});
}
// 根据品牌获取分类 (腾讯云测试没有该接口,暂时不调用分类)
apiMethod
.
push
(
searchApi
.
getSortList
({
brand
:
shopBrandIds
}));
// 根据店铺id获取分类
apiMethod
.
push
(
searchApi
.
getSortList
({
shop_id
:
shopId
}));
apiMethod
=
_
.
concat
(
apiMethod
,
articleApiMethod
);
return
Promise
.
all
(
apiMethod
).
then
(
subRes
=>
{
...
...
@@ -654,8 +656,7 @@ const getShopData = (shopId, channel, params, shopInfo) => {
_
.
forEach
(
prodList
,
value
=>
{
list
[
value
.
product_skn
]
=
{
img
:
helpers
.
getForceSourceUrl
(
value
.
default_images
)
+
'?imageView2/1/w/{width}/h/{height}'
,
img
:
value
.
default_images
,
title
:
value
.
product_name
,
price
:
`¥
$
{
value
.
sales_price
}
`
};
...
...
@@ -681,11 +682,13 @@ const getShopData = (shopId, channel, params, shopInfo) => {
if
(
subRes
[
1
].
code
===
200
)
{
let
groupSort
=
_
.
get
(
subRes
[
1
],
'data.sort'
,
[]);
finalResult
.
leftContent
=
searchHandler
.
handleSortData
(
groupSort
,
params
);
finalResult
.
leftContent
=
searchHandler
.
handleSortData
(
groupSort
,
params
,
params
,
'/product/shoplist'
);
_
.
set
(
finalResult
,
'brandShopAd'
,
{
baseUrl
:
shopListUrl
});
if
(
finalResult
.
allGoods
)
{
Object
.
assign
(
finalResult
.
allGoods
,
searchHandler
.
setShopSort
(
groupSort
,
Object
.
assign
({},
params
,
{
page
:
1
})));
params
,
{
page
:
1
}))
,
searchHandler
.
setGenderFilter
(
params
)
);
}
}
...
...
@@ -732,7 +735,7 @@ const getShopGoodsData = (shopId, channel, params) => {
searchApi
.
getProductList
(
Object
.
assign
({
shop_id
:
shopId
},
params
)),
// 搜索店铺商品
searchApi
.
getS
hopBrands
(
shopId
)
// 店铺品牌数据
searchApi
.
getS
ortList
({
shop_id
:
shopId
})
// 根据店铺id获取分类
]).
then
(
result
=>
{
// 获取商品数据和顶部筛选条件
if
(
result
[
0
].
code
===
200
)
{
...
...
@@ -747,25 +750,14 @@ const getShopGoodsData = (shopId, channel, params) => {
_
.
set
(
resData
,
'sort.newPage'
,
true
);
// 启用新的分页导航
}
let
shopBrandIds
=
[];
// 店铺的所有品牌id
if
(
result
[
1
].
code
===
200
)
{
let
groupSort
=
_
.
get
(
result
[
1
],
'data.sort'
,
[]);
if
(
result
[
1
].
code
===
200
&&
result
[
1
].
data
)
{
_
.
forEach
(
result
[
1
].
data
,
value
=>
{
shopBrandIds
.
push
(
value
.
brand_id
);
});
Object
.
assign
(
resData
,
searchHandler
.
setShopSort
(
groupSort
,
Object
.
assign
({},
params
,
{
page
:
1
})),
searchHandler
.
setGenderFilter
(
params
));
}
// 根据品牌获取分类 (腾讯云测试没有该接口,暂时不调用分类)
return
searchApi
.
getSortList
({
brand
:
shopBrandIds
}).
then
(
subRes
=>
{
if
(
subRes
.
code
===
200
)
{
let
groupSort
=
_
.
get
(
subRes
,
'data.sort'
,
[]);
Object
.
assign
(
resData
,
searchHandler
.
setShopSort
(
groupSort
,
Object
.
assign
(
params
,
{
page
:
1
})));
}
return
resData
;
});
return
resData
;
});
};
...
...
@@ -778,10 +770,11 @@ const getShopListData = (channel, params, uid) => {
searchApi
.
getShopDecorator
(
shopId
),
// 店铺装修数据
searchApi
.
getShopInfo
(
shopId
,
uid
),
// 店铺介绍
searchApi
.
getProductList
(
Object
.
assign
({
shop_id
:
shopId
},
params
)),
// 搜索店铺商品
searchApi
.
getS
hopBrands
(
shopId
)
// 店铺品牌数据
searchApi
.
getS
ortList
({
shop_id
:
shopId
})
// 店铺分类
];
if
(
_
.
has
(
params
,
'query'
))
{
// 如果有店内搜索,则并行查询店铺所有商品,搜索不到商品则显示所有商品
apiArr
.
push
(
searchApi
.
getProductList
(
Object
.
assign
({
shop_id
:
shopId
},
params
,
{
query
:
''
})));
// 搜索店铺所有商品
}
...
...
@@ -827,26 +820,18 @@ const getShopListData = (channel, params, uid) => {
let
goodsList
=
_
.
get
(
info
,
'data.product_list'
,
[]);
if
(
goodsList
.
length
)
{
let
tip
=
{
start
:
(
_
.
get
(
info
,
'data.page'
,
1
)
-
1
)
*
limitNum
+
1
,
total
:
_
.
get
(
info
,
'data.total'
,
0
)
};
tip
.
end
=
tip
.
start
+
limitNum
-
1
;
if
(
tip
.
end
>
tip
.
total
)
{
tip
.
end
=
tip
.
total
;
}
let
totalPage
=
_
.
get
(
info
,
'data.total'
,
1
);
Object
.
assign
(
finalResult
,
{
filters
:
searchHandler
.
handleFilterDataAll
(
info
.
data
,
params
),
opts
:
searchHandler
.
handleOptsData
(
params
,
t
ip
.
total
),
opts
:
searchHandler
.
handleOptsData
(
params
,
t
otalPage
),
goods
:
productProcess
.
processProductList
(
goodsList
,
{
newCoverSort
:
true
,
showDiscount
:
false
,
gender
:
_getGender
(
channel
),
query
:
params
.
query
}),
footPager
:
{
tip
:
tip
}
footPager
:
searchHandler
.
handlePagerData
(
totalPage
,
params
)
});
_
.
set
(
finalResult
,
'filters.checkedConditions.clearUrl'
,
...
...
@@ -873,27 +858,15 @@ const getShopListData = (channel, params, uid) => {
}
if
(
result
[
4
].
code
===
200
)
{
let
shopBrandIds
=
[];
// 店铺下的所有品牌id数组
_
.
forEach
(
_
.
get
(
result
[
4
],
'data'
,
[]),
value
=>
{
shopBrandIds
.
push
(
value
.
brand_id
);
});
return
searchApi
.
getSortList
({
brand
:
shopBrandIds
}).
then
(
subRes
=>
{
if
(
subRes
.
code
===
200
)
{
let
groupSort
=
_
.
get
(
subRes
,
'data.sort'
,
[]),
noPageQs
=
Object
.
assign
({},
params
,
{
page
:
1
});
finalResult
.
leftContent
=
searchHandler
.
handleSortData
(
groupSort
,
noPageQs
);
let
groupSort
=
_
.
get
(
result
[
4
],
'data.sort'
,
[]),
noPageQs
=
Object
.
assign
({},
params
,
{
page
:
1
});
if
(
finalResult
.
allGoods
)
{
Object
.
assign
(
finalResult
.
allGoods
,
searchHandler
.
setShopSort
(
groupSort
,
noPageQs
));
}
}
return
finalResult
;
});
finalResult
.
leftContent
=
searchHandler
.
handleSortData
(
groupSort
,
noPageQs
);
if
(
finalResult
.
allGoods
)
{
Object
.
assign
(
finalResult
.
allGoods
,
searchHandler
.
setShopSort
(
groupSort
,
noPageQs
));
}
}
finalResult
.
criteo
=
{
skn
:
searchHandler
.
getCriteo
(
_
.
get
(
finalResult
,
'goods'
))};
...
...
@@ -908,6 +881,7 @@ const getShopListData = (channel, params, uid) => {
const
getBaseShopData
=
(
params
,
extra
,
channel
,
shopId
)
=>
{
let
resData
=
{};
params
.
shopId
=
shopId
;
return
Promise
.
all
([
getBrandData
(
params
,
extra
,
channel
),
searchApi
.
getShopDecorator
(
shopId
),
// 店铺装修数据
...
...
apps/product/models/search-api.js
View file @
78a07d3
...
...
@@ -196,14 +196,21 @@ const getSortAds = (params) => {
* 获取品牌系列
* @return
*/
const
getBrandSeries
=
(
params
)
=>
{
const
getBrandShopSeries
=
(
params
)
=>
{
let
finalParams
=
{
method
:
'web.brand.series'
,
brand_id
:
params
.
brandId
,
status
:
params
.
status
||
1
};
if
(
params
.
brandId
)
{
finalParams
.
brand_id
=
params
.
brandId
;
}
else
if
(
params
.
shopId
)
{
Object
.
assign
(
finalParams
,
{
method
:
'web.shop.series'
,
shop_id
:
params
.
shopId
});
}
return
api
.
get
(
''
,
finalParams
,
config
.
apiCache
);
};
...
...
@@ -211,14 +218,21 @@ const getBrandSeries = (params) => {
* 获取品牌folder
* @return
*/
const
getBrandFolder
=
(
params
)
=>
{
const
getBrandShopFolder
=
(
params
)
=>
{
let
finalParams
=
{
method
:
'web.brand.folder'
,
brand_id
:
params
.
brandId
,
status
:
params
.
status
||
1
};
if
(
params
.
brandId
)
{
finalParams
.
brand_id
=
params
.
brandId
;
}
else
if
(
params
.
shopId
)
{
Object
.
assign
(
finalParams
,
{
method
:
'web.shop.folder'
,
shop_id
:
params
.
shopId
});
}
return
api
.
get
(
''
,
finalParams
,
config
.
apiCache
);
};
...
...
@@ -554,8 +568,8 @@ module.exports = {
getSortList
,
getSortIntro
,
getSortAds
,
getBrandFolder
,
getBrandSeries
,
getBrandShopFolder
,
getBrandShopSeries
,
getWeekNew
,
getBrandCouponAsync
,
getBrandShop
,
...
...
apps/product/models/search-handler.js
View file @
78a07d3
...
...
@@ -468,9 +468,10 @@ exports.handleOptsData = (params, total, extra) => {
* @param origin 分类原始数据,一般是接口返回数据中的 group_sort 字段
* @param params 当前 URL 中已有的参数
* @param extra 可以任意传值用来处理特殊情况
* @param {string} [baseUrl] 需要跳转非当前页面传的相对路径(可不传,默认为空字符串)
* @returns {{}}
*/
exports
.
handleSortData
=
(
origin
,
params
,
originParams
)
=>
{
exports
.
handleSortData
=
(
origin
,
params
,
originParams
,
baseUrl
)
=>
{
let
leftContent
=
{
sort
:
{
misort
:
[]},
checked
:
[]
...
...
@@ -479,11 +480,13 @@ exports.handleSortData = (origin, params, originParams) => {
let
list
=
[],
allCount
=
0
;
baseUrl
=
baseUrl
||
''
;
leftContent
.
allSort
=
{};
leftContent
.
allSort
.
all
=
[{
name
:
'全部品类'
,
num
:
allCount
,
href
:
handleFilterUrl
(
params
,
{},
{
msort
:
true
,
misort
:
true
})
href
:
`
$
{
baseUrl
}
$
{
handleFilterUrl
(
params
,
{},
{
msort
:
true
,
misort
:
true
})}
`
}];
_
.
forEach
(
origin
,
value
=>
{
...
...
@@ -494,12 +497,12 @@ exports.handleSortData = (origin, params, originParams) => {
{
name
:
`全部
$
{
value
.
sort_name
}
`
,
num
:
value
.
count
,
href
:
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
},
{
misort
:
true
})
,
href
:
`
$
{
baseUrl
}
$
{
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
},
{
misort
:
true
})}
`
,
childActive
:
(
params
.
msort
===
value
.
sort_id
)
&&
!
params
.
misort
,
sortId
:
value
.
sort_id
}
],
href
:
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
},
{
misort
:
true
})
,
href
:
`
$
{
baseUrl
}
$
{
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
},
{
misort
:
true
})}
`
,
active
:
params
.
msort
===
value
.
sort_id
,
sortId
:
value
.
sort_id
};
...
...
@@ -510,7 +513,7 @@ exports.handleSortData = (origin, params, originParams) => {
category
.
childList
.
push
({
name
:
subValue
.
sort_name
,
num
:
subValue
.
count
,
href
:
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
,
misort
:
subValue
.
sort_id
})
,
href
:
`
$
{
baseUrl
}
$
{
handleFilterUrl
(
params
,
{
msort
:
value
.
sort_id
,
misort
:
subValue
.
sort_id
})}
`
,
childActive
:
params
.
misort
===
subValue
.
sort_id
,
sortId
:
subValue
.
sort_id
});
...
...
@@ -580,6 +583,30 @@ exports.setShopSort = (data, params) => {
};
/**
* 店铺性别筛选
* @param params qs
* @returns {{}}
*/
exports
.
setGenderFilter
=
(
params
)
=>
{
return
{
genderFilter
:
[
{
name
:
'全部'
,
href
:
handleFilterUrl
(
params
,
{},
{
gender
:
true
}),
checked
:
!
params
.
gender
||
params
.
gender
===
'1,2,3'
},
{
name
:
'BOYS'
,
href
:
handleFilterUrl
(
params
,
{
gender
:
'1,3'
}),
checked
:
params
.
gender
===
'1,3'
},
{
name
:
'GIRLS'
,
href
:
handleFilterUrl
(
params
,
{
gender
:
'2,3'
}),
checked
:
params
.
gender
===
'2,3'
}
]};
};
/**
* 处理一般筛选数据
* @param origin 要处理的筛选数据 filter
* @param params 当前 URL 中已有的参数,处理选中状态使用
...
...
apps/product/models/shop-handler.js
View file @
78a07d3
...
...
@@ -136,23 +136,26 @@ const shopTopBannerBase = (data) => {
* @param data 装修数据
* @returns {{}}
*/
const
navigationBar
=
(
data
,
shopId
)
=>
{
const
navigationBar
=
(
data
,
shopId
,
params
)
=>
{
params
=
params
||
{};
const
gender
=
params
.
gender
?
`
&
gender
=
$
{
params
.
gender
}
`
:
''
;
let
shopNav
=
[
{
name
:
'店铺首页'
,
url
:
`
/
?
navBar
=
0
&
shopId
=
$
{
shopId
}
`
url
:
`
/
?
navBar
=
0
&
shopId
=
$
{
shopId
}
$
{
gender
}
`
},
{
name
:
'全部商品'
,
url
:
`
$
{
shopListUrl
}
/
?
navBar=1&shopId=${shopId}
`
url
:
`
$
{
shopListUrl
}
/
?
navBar=1&shopId=${shopId}
${gender}
`
},
{
name
:
'人气单品'
,
url
:
`
$
{
shopListUrl
}
/
?
navBar=2&order=s_n_desc&shopId=${shopId}
`
url
:
`
$
{
shopListUrl
}
/
?
navBar=2&order=s_n_desc&shopId=${shopId}
${gender}
`
},
{
name
:
'新品上架'
,
url
:
`
$
{
shopListUrl
}
/
?
navBar=3&order=s_t_desc&shopId=${shopId}
`
url
:
`
$
{
shopListUrl
}
/
?
navBar=3&order=s_t_desc&shopId=${shopId}
${gender}
`
}
];
...
...
@@ -313,8 +316,10 @@ const signboard = (data) => {
// 销售类目
const
_handleSaleCategory
=
(
shopId
,
resourceObj
)
=>
{
const
thisShop
=
(
categoryId
)
=>
shopListUrl
+
'?'
+
qs
.
stringify
({
const
_handleSaleCategory
=
(
shopId
,
baseUrl
,
resourceObj
)
=>
{
baseUrl
=
baseUrl
||
''
;
const
thisShop
=
(
categoryId
)
=>
baseUrl
+
'?'
+
qs
.
stringify
({
productPool
:
categoryId
,
shopId
:
shopId
,
navBar
:
-
1
...
...
@@ -353,7 +358,7 @@ exports.getShopDecorator = (data, params, shopId, base) => {
if
(
base
)
{
_
.
forEach
(
data
.
list
,
(
value
)
=>
{
let
info
=
Fn
.
pipe
(
JSON
.
parse
,
_
.
partial
(
_handleSaleCategory
,
shopId
))(
value
.
resource_data
||
'[]'
);
let
info
=
Fn
.
pipe
(
JSON
.
parse
,
_
.
partial
(
_handleSaleCategory
,
shopId
,
''
))(
value
.
resource_data
||
'[]'
);
switch
(
value
.
resource_name
)
{
case
'signboard'
:
...
...
@@ -373,7 +378,7 @@ exports.getShopDecorator = (data, params, shopId, base) => {
});
_
.
forEach
(
data
.
list
,
(
value
)
=>
{
let
info
=
Fn
.
pipe
(
JSON
.
parse
,
_
.
partial
(
_handleSaleCategory
,
shopId
))(
value
.
resource_data
||
'[]'
);
let
info
=
Fn
.
pipe
(
JSON
.
parse
,
_
.
partial
(
_handleSaleCategory
,
shopId
,
shopListUrl
))(
value
.
resource_data
||
'[]'
);
// eslint-disable-line
let
tabBar
;
switch
(
value
.
resource_name
)
{
...
...
@@ -392,7 +397,7 @@ exports.getShopDecorator = (data, params, shopId, base) => {
Object
.
assign
(
dest
,
shopTopBanner
(
info
));
break
;
case
'navigationBar'
:
Object
.
assign
(
dest
,
navigationBar
(
info
,
shopId
));
Object
.
assign
(
dest
,
navigationBar
(
info
,
shopId
,
params
));
break
;
case
'largeSlideImg'
:
Object
.
assign
(
dest
,
largeSlideImg
(
info
,
shopId
));
...
...
apps/product/router.js
View file @
78a07d3
...
...
@@ -71,38 +71,27 @@ router.get('/detail/coupon', auth, coupon.acquire); // 获得优惠券
// 搜索
router
.
get
(
'/search/index'
,
search
.
index
);
router
.
get
(
'/search/filter/brands'
,
search
.
serachFilterBrands
);
// 搜索提示
router
.
get
(
'/search/suggest'
,
search
.
suggest
);
router
.
get
(
'/search/suggest'
,
search
.
suggest
);
// 搜索提示
router
.
get
(
'/api/suggest'
,
search
.
suggest4Old
);
// 商品分类列表页
router
.
get
(
'/list/index'
,
list
.
index
);
// 新品到着
router
.
get
(
'/list/new'
,
list
.
new
);
// 品牌页
router
.
get
(
'/index/brand'
,
list
.
brand
);
router
.
get
(
'/index/about'
,
list
.
brandAbout
);
router
.
get
(
'/shop/couponsync'
,
list
.
shopCouponSync
);
router
.
get
(
'/brand/couponsync'
,
list
.
brandCouponSync
);
// 品牌店铺
router
.
get
(
'/index/brand'
,
list
.
brand
);
// 品牌店铺页
router
.
get
(
'/index/about'
,
list
.
brandAbout
);
// 品牌店铺介绍页
router
.
post
(
'/index/isFavoriteBrand'
,
list
.
isFavoriteBrand
);
// 判断用户是否收藏品牌
router
.
post
(
'/index/getNodeContent'
,
list
.
getNodeContent
);
// 品牌页水牌
router
.
post
(
'/index/getAdnav'
,
list
.
getAdnav
);
// 品牌页系列
router
.
get
(
'/shoplist'
,
list
.
shopList
);
// 店铺列表页
router
.
post
(
'/shop/togglecollect'
,
favorite
.
collectShop
);
// 店铺收藏
router
.
post
(
'/index/isFavoriteShop'
,
favorite
.
isFavShop
);
// 判断用户是否收藏品牌
router
.
get
(
'/brand/couponsync'
,
list
.
brandCouponSync
);
router
.
get
(
'/shop/couponsync'
,
list
.
shopCouponSync
);
// 品牌页水牌
router
.
post
(
'/index/getNodeContent'
,
list
.
getNodeContent
);
// 品牌页系列
router
.
post
(
'/index/getAdnav'
,
list
.
getAdnav
);
// 判断用户是否收藏品牌
router
.
post
(
'/index/isFavoriteBrand'
,
list
.
isFavoriteBrand
);
// 学生优惠routers
router
.
get
(
'/students'
,
students
.
index
);
// students 首页
...
...
apps/product/views/partial/list/shop-list.hbs
View file @
78a07d3
...
...
@@ -4,22 +4,49 @@
<span
class=
"menu-tag"
>
所有商品
</span>
<ul
class=
"menu-list"
>
{{#
each
menuList
}}
<li
class=
"
{{#if
curMenu
}}
on
{{/if}}
"
><a
class=
"pjax"
href=
"
{{
href
}}
"
>
{{
name
}}
</a></li>
<li
class=
"
{{#if
curMenu
}}
on
{{/if}}
"
><a
class=
"pjax"
href=
"
{{
href
}}
"
>
{{
name
}}
</a></li>
{{/
each
}}
</ul>
<a
href=
"
{{
url
}}
"
class=
"more"
>
MORE
</a>
</div>
{{/
goodsMenu
}}
{{#if
genderFilter
}}
<div
class=
"gender-filter"
>
<span>
性别:
</span>
{{#
genderFilter
}}
<a
class=
"pjax
{{#if
checked
}}
checked
{{/if}}
"
href=
"
{{
href
}}
"
>
{{
name
}}
</a>
{{/
genderFilter
}}
</div>
{{/if}}
{{>
common
/
sort-pager
}}
</div>
<div
class=
"goods-container clearfix"
>
{{#
list
}}
{{>
product
/
good
}}
{{/
list
}}
<div
class=
"good-item-wrapper"
>
<div
class=
"good-info-main"
></div>
<div
class=
"good-select-color"
></div>
{{#if
list
}}
<div
class=
"goods-container clearfix"
>
{{#
list
}}
{{>
product
/
good
}}
{{/
list
}}
<div
class=
"good-item-wrapper"
>
<div
class=
"good-info-main"
></div>
<div
class=
"good-select-color"
></div>
</div>
</div>
</div>
{{^}}
<div
class=
"no-result"
>
<p
class=
"no-title"
>
抱歉!没有找到相关的商品
</p>
<div
class=
"search-again clearfix"
>
<form
method=
"GET"
action=
"/product/shoplist"
>
<input
id=
"no-result-input"
name=
"query"
type=
"text"
placeholder=
"换个关键词试试"
>
<input
type=
"hidden"
name=
"shopId"
value=
"
{{
@root
.
shopId
}}
"
>
<button
class=
"search-again-btn"
type=
"submit"
>
<i
class=
"iconfont"
>

</i>
</button>
</form>
</div>
<p
class=
"no-tip"
>
建议您:看看输入的文字是否有误 / 减少分类条件限制 / 重新搜索
</p>
</div>
{{/if}}
...
...
apps/product/views/partial/list/shop-single-list.hbs
View file @
78a07d3
<ul>
{{#
each
list
}}
<li>
<a
class=
"item item-
{{
@index
}}
"
href=
"
{{
url
}}
"
target=
"_blank"
>
<img
class=
"lazy"
data-original=
"
{{
image
img
235
250
}}
"
/>
<p
class=
"title"
>
{{
title
}}
</p>
<p
class=
"price"
>
{{
price
}}
</p>
{{#if
index
}}
<span
class=
"hat"
>
{{
index
}}
</span>
{{/if}}
</a>
<li>
<a
class=
"item item-
{{
@index
}}
"
href=
"
{{
url
}}
"
target=
"_blank"
>
<img
class=
"lazy"
data-original=
"
{{
image
img
235
315
}}
"
/>
<div
class=
"info"
>
<p
class=
"title"
>
{{
title
}}
</p>
<p
class=
"price"
>
{{
price
}}
</p>
</div>
{{#if
index
}}
<span
class=
"hat"
>
{{
index
}}
</span>
{{/if}}
</a>
</li>
{{/
each
}}
</ul>
...
...
doraemon/views/partial/product/left-content.hbs
View file @
78a07d3
...
...
@@ -87,25 +87,25 @@
{{/
picLink
}}
{{/
leftContent
}}
{{#
if
brandBanner
.
dataI
d
}}
{{#
brandShopA
d
}}
<script
id=
"pic-link-tpl"
type=
"text/html"
>
\{{# picLink}}
\{{# picLink}}
\{{#if picTitle}}
<h2 class="nav-pic-title">\{{picTitle}}</h2>
<h2 class="nav-pic-title">\{{picTitle}}</h2>
\{{/if}}
<ul class="pic-nav">
\{{#each list}}
<li>
<a href="\{{href}}">
<img src="\{{src}}">
</a>
</li>
\{{/each}}
</ul>
\{{
/
picLink
}}
<ul class="pic-nav">
\{{#each list}}
<li>
<a href="\{{href}}">
<img src="
{{
baseUrl
}}
\{{src}}">
</a>
</li>
\{{/each}}
</ul>
\{{
/
picLink
}}
</script>
<div
id=
"brand-ad"
class=
"brand-ad"
></div>
{{/if}}
<div
id=
"brand-shop-ad"
class=
"brand-shop-ad"
></div>
{{/
brandShopAd
}}
{{!-- 水牌广告 --}}
{{#if
node
}}
...
...
public/js/product/index/product.js
View file @
78a07d3
...
...
@@ -188,9 +188,10 @@ $productListNav.find('h3').click(function() {
// 左侧需要ajax内容
(
function
()
{
var
$brandCard
=
$
(
'#brand-card'
);
var
$brandFavor
=
$
(
'#brand-favor'
);
var
html
;
var
$brandCard
=
$
(
'#brand-card'
),
$brandFavor
=
$
(
'#brand-favor'
),
$shopFavor
=
$
(
'#shop-favor'
);
var
html
,
adData
;
if
(
$brandCard
.
length
)
{
$
.
ajax
({
...
...
@@ -204,19 +205,26 @@ $productListNav.find('h3').click(function() {
});
}
// 品牌页请求
if
(
$brandFavor
.
length
)
{
adData
=
{
brandId
:
$brandFavor
.
data
(
'id'
)};
}
if
(
$shopFavor
.
length
)
{
adData
=
{
shopId
:
$shopFavor
.
data
(
'id'
)};
}
// 款型系列异步请求
if
(
adData
)
{
html
=
$
(
'#pic-link-tpl'
).
html
()
||
''
;
$
.
ajax
({
type
:
'POST'
,
url
:
'/product/index/getAdnav'
,
data
:
{
brandId
:
$brandFavor
.
data
(
'id'
)
}
data
:
adData
}).
then
(
function
(
data
)
{
if
(
data
)
{
$
(
'#brand-ad'
).
html
(
Handlebars
.
compile
(
html
)({
$
(
'#brand-
shop-
ad'
).
html
(
Handlebars
.
compile
(
html
)({
picLink
:
data
}));
}
...
...
public/js/product/shop.page.js
View file @
78a07d3
...
...
@@ -5,7 +5,8 @@
*/
var
$
=
require
(
'yoho-jquery'
),
lazyLoad
=
require
(
'yoho-jquery-lazyload'
);
lazyLoad
=
require
(
'yoho-jquery-lazyload'
),
Handlebars
=
require
(
'yoho-handlebars'
);
var
product
=
require
(
'./index/product'
);
...
...
@@ -75,6 +76,23 @@ $('.shop-query-submit').on('click', function() {
$searchForm
.
submit
();
});
(
function
()
{
var
$adBox
=
$
(
'#brand-shop-ad'
);
var
html
=
$
(
'#pic-link-tpl'
).
html
()
||
''
;
$
.
ajax
({
type
:
'POST'
,
url
:
'/product/index/getAdnav'
,
data
:
{
shopId
:
shopId
}
}).
then
(
function
(
data
)
{
if
(
data
)
{
$adBox
.
parent
().
append
(
$adBox
);
$adBox
.
html
(
Handlebars
.
compile
(
html
)({
picLink
:
data
}));
}
});
}());
// 收藏店铺
function
colloectAction
()
{
...
...
@@ -147,6 +165,8 @@ $allGoods.pjax('a.pjax', '.goods-wrap', {
$this
.
siblings
().
removeClass
(
'on'
);
$this
.
addClass
(
'on'
);
}).
on
(
'click'
,
'a.checked'
,
function
(
e
)
{
e
.
preventDefault
();
});
$
(
window
).
on
(
'scroll'
,
function
()
{
...
...
public/scss/common/_foot-pager.css
View file @
78a07d3
...
...
@@ -18,7 +18,6 @@
>
.iconfont
{
position
:
relative
;
top
:
2px
;
}
}
...
...
public/scss/product/_left-content.css
View file @
78a07d3
...
...
@@ -118,7 +118,7 @@
}
.brand-card
img
,
.brand-ad
img
{
.brand-
shop-
ad
img
{
max-width
:
100%
;
}
...
...
public/scss/product/_shop-index.css
View file @
78a07d3
...
...
@@ -247,15 +247,37 @@
margin-bottom
:
20px
;
width
:
235px
;
height
:
315px
;
font-size
:
14px
;
font-size
:
0
;
text-align
:
center
;
line-height
:
1.5
;
background
:
#f5f5f5
;
font-weight
:
bold
;
overflow
:
hidden
;
img
{
width
:
235px
;
height
:
250px
;
width
:
100%
;
height
:
100%
;
}
.info
{
width
:
100%
;
height
:
64px
;
font-size
:
14px
;
margin-top
:
-64px
;
overflow
:
hidden
;
}
.info
:before
{
content
:
''
;
width
:
100%
;
height
:
100%
;
background-color
:
#f5f5f5
;
opacity
:
0.5
;
display
:
block
;
}
.info
>
p
{
position
:
relative
;
top
:
-52px
;
}
.title
{
...
...
@@ -385,6 +407,27 @@
width
:
970px
;
}
.gender-filter
{
height
:
48px
;
background
:
#f5f7f6
;
line-height
:
48px
;
margin
:
10px
0
;
font-size
:
12px
;
padding-left
:
10px
;
>
span
{
font-weight
:
700
;
}
>
a
{
margin
:
0
10px
;
}
.checked
{
color
:
#e01
;
}
}
.all-goods-menu
{
width
:
100%
;
height
:
40px
;
...
...
Please
register
or
login
to post a comment