Toggle navigation
Toggle navigation
This project
Loading...
Sign in
fe
/
yohobuywap-node
·
Commits
Go to a project
GitLab
Go to group
Project
Activity
Files
Commits
Pipelines
0
Builds
0
Graphs
Milestones
Issues
0
Merge Requests
0
Members
Labels
Wiki
Forks
Network
Create a new issue
Download as
Plain Diff
Browse Files
Authored by
ccbikai(👎🏻🍜)
8 years ago
Commit
5d50bc72f85b68c1165f4cc846a65b8c27a238b6
2 parents
da9819e0
96a1d1a7
Merge branch 'master' into qCloud
Hide whitespace changes
Inline
Side-by-side
Showing
53 changed files
with
297 additions
and
144 deletions
app.js
apps/activity/models/coupon.js
apps/activity/views/action/invite/list.hbs
apps/activity/views/action/invite/mycoupons.hbs
apps/guang/controllers/index.js
apps/guang/controllers/info.js
apps/guang/controllers/plustar.js
apps/guang/models/index.js
apps/guang/models/info.js
apps/guang/models/plustar.js
apps/guang/views/action/index/list.hbs
apps/guang/views/action/index/page.hbs
apps/guang/views/action/info/index.hbs
apps/home/controllers/address.js
apps/home/controllers/help.js
apps/home/controllers/myCurrency.js
apps/home/models/favorite.js
apps/home/models/myCurrency.js
apps/home/models/orderDetail.js
apps/home/models/suggest.js
apps/home/router.js
apps/home/views/action/ajax-currency-detail.hbs
apps/home/views/action/currency-new.hbs
apps/home/views/action/favorite/favorite-brand.hbs
apps/home/views/action/help.hbs
apps/home/views/action/vip-grade/vip-grade.hbs
apps/home/views/partial/vip-grade/basic-info.hbs
apps/passport/models/back-api.js
apps/product/models/consult-comment.js
apps/product/models/detail.js
apps/product/models/list.js
apps/product/models/recom.js
apps/product/router.js
apps/product/views/action/detail/preference.hbs
config/common.js
doraemon/middleware/error-handler.js
doraemon/middleware/item-name-handler.js
doraemon/middleware/set-yoho-data.js
doraemon/views/partial/common/suspend-cart.hbs
doraemon/views/partial/header.hbs
public/js/channel/cate.page.js
public/js/channel/maybe-like.js
public/js/common.js
public/js/guang/info-common.js
public/js/home/address-act.page.js
public/js/home/currency-detail.page.js
public/js/home/currency-new.page.js
public/scss/home/_ihelp.css
public/scss/layout/_header.css
public/scss/me/_browse-record.css
public/scss/me/_fav.css
public/scss/me/_home.css
public/scss/me/_suggest.css
app.js
View file @
5d50bc7
...
...
@@ -73,6 +73,7 @@ app.use((req, res, next) => {
try
{
const
user
=
require
(
'./doraemon/middleware/user'
);
const
subDomain
=
require
(
'./doraemon/middleware/sub-domain'
);
const
itemNameHandler
=
require
(
'./doraemon/middleware/item-name-handler'
);
const
setYohoData
=
require
(
'./doraemon/middleware/set-yoho-data'
);
const
errorHanlder
=
require
(
'./doraemon/middleware/error-handler'
);
const
setPageInfo
=
require
(
'./doraemon/middleware/set-pageinfo'
);
...
...
@@ -81,6 +82,7 @@ try {
// YOHO 前置中间件
app
.
use
(
subDomain
());
app
.
use
(
itemNameHandler
);
app
.
use
(
setYohoData
());
app
.
use
(
user
());
app
.
use
(
seo
());
...
...
apps/activity/models/coupon.js
View file @
5d50bc7
...
...
@@ -40,25 +40,28 @@ const getUserStatus = (param) => {
var
dest
=
{};
dest
.
code
=
param
.
code
;
dest
.
returnCode
=
param
.
data
.
returnCode
;
dest
.
mobile
=
param
.
data
.
mobile
;
if
(
param
.
data
.
returnCode
===
0
)
{
dest
.
geted
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
1
)
{
dest
.
wrongNumb
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
2
)
{
dest
.
newUser
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
8
)
{
dest
.
oldUserAskCouponOnceMore
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
5
)
{
dest
.
vertifyWrong
=
true
;
}
else
{
dest
.
ended
=
true
;
}
if
(
param
.
data
.
newUser
===
1
)
{
dest
.
newUser
=
true
;
dest
.
returnCode
=
param
&&
param
.
data
&&
param
.
data
.
returnCode
;
dest
.
mobile
=
param
&&
param
.
data
&&
param
.
data
.
mobile
;
if
(
param
&&
param
.
data
)
{
if
(
param
.
data
.
returnCode
===
0
)
{
dest
.
geted
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
1
)
{
dest
.
wrongNumb
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
2
)
{
dest
.
newUser
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
8
)
{
dest
.
oldUserAskCouponOnceMore
=
true
;
}
else
if
(
param
.
data
.
returnCode
===
5
)
{
dest
.
vertifyWrong
=
true
;
}
else
{
dest
.
ended
=
true
;
}
if
(
param
.
data
.
newUser
===
1
)
{
dest
.
newUser
=
true
;
}
dest
.
message
=
param
.
data
.
returnMsg
;
}
dest
.
message
=
param
.
data
.
returnMsg
;
// 清空变量,释放内存
param
=
{};
...
...
apps/activity/views/action/invite/list.hbs
View file @
5d50bc7
...
...
@@ -6,7 +6,7 @@
<strong class="fz18">现金券</strong>
<p class="fz9 bold">CPOUPON</p>
<div class="pirbox absolute">
<em class="absolute">
¥
</em>0
<em class="absolute">
¥
</em>0
</div>
</div>-->
<div
class=
"coupon-box chit0"
></div>
...
...
apps/activity/views/action/invite/mycoupons.hbs
View file @
5d50bc7
...
...
@@ -6,7 +6,7 @@
<strong
class=
"fz18"
>
现金券
</strong>
<p
class=
"fz9 bold"
>
CPOUPON
</p>
<div
class=
"pirbox absolute"
>
<em
class=
"absolute"
>
¥
</em>
{{
amount
}}
<em
class=
"absolute"
>
¥
</em>
{{
amount
}}
</div>
<div
class=
"count-not fz11 absolute"
><hr
class=
"fn-left"
><hr
class=
"fn-right"
>
已送达您的账户
</div>
</div>
...
...
apps/guang/controllers/index.js
View file @
5d50bc7
...
...
@@ -165,16 +165,15 @@ const tag = (req, res, next) => {
pageHeader
:
headerData
,
module
:
'guang'
,
page
:
'index-editor'
,
title
:
tagTitle
+
' | Yoho!Buy有货 | 潮流购物逛不停'
,
pageFooter
:
true
title
:
tagTitle
+
' | Yoho!Buy有货 | 潮流购物逛不停'
};
let
param
=
{
tag
:
req
.
query
.
query
,
isApp
:
req
.
query
.
app_version
||
req
.
query
.
appVersion
||
false
,
gender
:
req
.
query
.
gender
||
req
.
cookies
.
_Channel
&&
channels
[
req
.
cookies
.
_Channel
]
||
'1,3'
,
uid
:
req
.
user
.
uid
,
udid
:
req
.
user
.
udid
,
gender
:
req
.
query
.
gender
||
'1,3'
,
uid
:
req
.
user
.
uid
||
0
,
udid
:
req
.
sessionID
,
type
:
req
.
query
.
type
||
0
};
...
...
apps/guang/controllers/info.js
View file @
5d50bc7
...
...
@@ -295,7 +295,11 @@ const index = (req, res, next) => {
};
// guang双头部的问题 20160601
data
.
guang
.
author
.
url
=
helpers
.
https
(
`
$
{
detail
.
getAuthor
.
url
}
&
openby
:
yohobuy
=
{
"action"
:
"go.h5"
,
"params"
:{
"param"
:{
"id"
:
"${detail.getAuthor.author_id}"
},
"share"
:
""
,
"id"
:
$
{
detail
.
getAuthor
.
author_id
},
"type"
:
0
,
"islogin"
:
"N"
,
"url"
:
"${helpers.urlFormat('/author/index', {}, 'guang')}"
}}
`
);
// 正确的URL
data
.
guang
.
author
.
url
=
helpers
.
https
(
`
$
{
detail
.
getAuthor
.
url
}
&
openby
:
yohobuy
=
{
"action"
:
"go.h5"
,
"params"
:{
"param"
:{},
"share"
:
""
,
"id"
:
$
{
detail
.
getAuthor
.
author_id
},
"type"
:
0
,
"islogin"
:
"N"
,
"url"
:
"${detail.getAuthor.url}"
}}
`
);
// 错误的URL
// data.guang.author.url = helpers.https(`${detail.getAuthor.url}&openby:yohobuy={"action":"go.h5","params":{"param":{"id":"${detail.getAuthor.author_id}"},"share":"","id":${detail.getAuthor.author_id},"type":0,"islogin":"N","url":"${helpers.urlFormat('/author/index', {}, 'guang')}"}}`);
}
let
guang
=
data
.
guang
;
...
...
apps/guang/controllers/plustar.js
View file @
5d50bc7
...
...
@@ -18,29 +18,59 @@ let channels = {
lifestyle
:
'4'
};
let
yhChannel
=
{
boys
:
1
,
girl
:
2
};
const
getListData
=
(
req
,
res
,
next
)
=>
{
let
gender
=
req
.
query
.
gender
||
req
.
cookies
.
_Channel
&&
channels
[
req
.
cookies
.
_Channel
]
||
'1,3'
;
let
recom
=
'4'
;
let
all
=
'1'
;
let
type
=
req
.
query
.
type
;
let
channel
=
req
.
cookies
.
_Channel
&&
yhChannel
[
req
.
cookies
.
_Channel
]
||
1
;
let
isRecommend
=
'0'
;
let
starBrand
=
'2'
;
let
originalBrand
=
'3'
;
plustarModel
.
getListData
(
gender
,
recom
,
all
).
then
((
result
)
=>
{
if
(
type
===
'2'
)
{
plustarModel
.
getBrandsData
(
gender
,
starBrand
,
originalBrand
,
channel
,
isRecommend
).
then
((
result
)
=>
{
res
.
render
(
'plustar/list'
,
{
module
:
'guang'
,
page
:
'plustar-list'
,
title
:
'明星原创'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
'明星原创'
}),
pageFooter
:
true
,
ps
:
{
sName
:
'明星潮品'
,
pName
:
'原创潮牌'
,
star
:
result
.
star
,
plus
:
result
.
plus
}
});
}).
catch
(
next
);
}
else
{
plustarModel
.
getListData
(
gender
,
recom
,
all
).
then
((
result
)
=>
{
res
.
render
(
'plustar/list'
,
{
module
:
'guang'
,
page
:
'plustar-list'
,
title
:
'国际优选'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
'国际优选'
}),
pageFooter
:
true
,
ps
:
{
sName
:
'设计师'
,
pName
:
'经典潮牌'
,
star
:
result
.
star
,
plus
:
result
.
plus
}
});
}).
catch
(
next
);
res
.
render
(
'plustar/list'
,
{
module
:
'guang'
,
page
:
'plustar-list'
,
title
:
'国际优选'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
'国际优选'
}),
pageFooter
:
true
,
ps
:
{
sName
:
'设计师'
,
pName
:
'经典潮牌'
,
star
:
result
.
star
,
plus
:
result
.
plus
}
});
}).
catch
(
next
);
}
};
const
getDetailData
=
(
req
,
res
,
next
)
=>
{
...
...
apps/guang/models/index.js
View file @
5d50bc7
...
...
@@ -142,10 +142,10 @@ const _article = (param) => {
page
:
param
.
page
||
1
,
uid
:
param
.
uid
,
udid
:
param
.
udid
,
sort_id
:
param
.
type
===
'0'
?
param
.
type
:
'1'
,
sort_id
:
0
,
tag
:
param
.
tag
?
param
.
tag
:
null
,
author_id
:
param
.
authorId
?
param
.
authorId
:
null
,
limit
:
param
.
limit
?
param
.
limit
:
null
//author_id: param.authorId ? param.authorId : null,
//limit: param.limit ? param.limit : null
},
{
cache
:
true
,
code
:
200
...
...
@@ -279,13 +279,14 @@ const getTagEditor = (param) => {
}
};
if
(
result
&&
result
[
0
]
&&
result
[
0
].
data
&&
result
[
0
].
data
.
list
)
{
if
(
result
&&
result
[
0
]
&&
result
[
0
].
data
&&
result
[
0
].
data
.
list
&&
result
[
0
].
data
.
list
.
artList
)
{
let
inf
=
[];
let
infoList
=
result
[
0
].
data
.
list
.
artList
;
infoList
.
forEach
(
val
=>
{
val
.
url
=
helpers
.
https
(
`
$
{
val
.
url
}
&
openby
:
yohobuy
=
{
"action"
:
"go.h5"
,
"params"
:{
"param"
:{},
"share"
:
""
,
"id"
:
""
,
"type"
:
0
,
"islogin"
:
"N"
,
"url"
:
"${val.url}"
}}
`
);
inf
.
push
(
guangProcess
.
formatArticle
(
val
,
true
,
false
,
true
));
});
...
...
apps/guang/models/info.js
View file @
5d50bc7
...
...
@@ -40,7 +40,7 @@ const packageData = (id, isApp) => {
cache
:
true
}).
then
(
data
=>
{
// 接口要判断一下返回状态是否成功
if
(
data
.
code
!==
200
)
{
if
(
data
===
''
&&
data
.
code
!==
200
)
{
result
.
code
=
400
;
return
result
;
}
...
...
@@ -110,28 +110,43 @@ const packageData = (id, isApp) => {
}
return
Promise
.
all
(
promises
).
then
(
datas
=>
{
let
getArticleContent
=
datas
[
1
].
data
;
if
(
datas
)
{
if
(
datas
[
1
])
{
if
(
isApp
&&
datas
[
4
].
data
)
{
let
getArticleContent
=
datas
[
1
].
data
;
let
preCount
=
0
;
let
i
;
result
.
getArticleContent
=
getArticleContent
;
for
(
i
=
0
;
i
<
getArticleContent
.
length
;
i
++
)
{
if
(
getArticleContent
[
i
].
singleImage
||
getArticleContent
[
i
].
text
||
getArticleContent
[
i
].
smallPic
)
{
preCount
++
;
}
if
(
isApp
&&
datas
[
4
]
&&
datas
[
4
].
data
)
{
let
preCount
=
0
;
let
i
;
for
(
i
=
0
;
i
<
getArticleContent
.
length
;
i
++
)
{
if
(
getArticleContent
[
i
].
singleImage
||
getArticleContent
[
i
].
text
||
getArticleContent
[
i
].
smallPic
)
{
preCount
++
;
}
}
getArticleContent
.
splice
(
preCount
,
0
,
{
weixinPublic
:
datas
[
4
].
data
});
}
if
(
datas
[
0
])
{
result
.
getAuthor
=
datas
[
0
].
data
;
}
getArticleContent
.
splice
(
preCount
,
0
,
{
weixinPublic
:
datas
[
4
].
data
});
}
result
.
getAuthor
=
datas
[
0
].
data
;
result
.
getArticleContent
=
getArticleContent
;
result
.
getBrand
=
datas
[
2
].
data
;
if
(
datas
.
length
===
5
&&
isApp
||
datas
.
length
===
4
&&
!
isApp
)
{
result
.
getOtherArticle
=
datas
[
3
].
data
;
if
(
datas
[
2
])
{
result
.
getBrand
=
datas
[
2
].
data
;
}
if
(
datas
.
length
===
5
&&
isApp
||
datas
.
length
===
4
&&
!
isApp
)
{
if
(
datas
[
3
])
{
result
.
getOtherArticle
=
datas
[
3
].
data
;
}
}
}
return
result
;
});
});
...
...
apps/guang/models/plustar.js
View file @
5d50bc7
...
...
@@ -8,11 +8,9 @@ const helpers = global.yoho.helpers;
const
formaData
=
(
data
,
gender
)
=>
{
let
build
=
[];
// console.log(data)
_
.
forEach
(
data
,
function
(
val
)
{
// 多张图
if
(
val
.
data
[
1
])
{
let
imgs
=
[];
_
.
forEach
(
val
.
data
,
function
(
list
)
{
...
...
@@ -33,7 +31,7 @@ const formaData = (data, gender) => {
}
// 单张图
if
(
val
.
data
[
0
])
{
if
(
val
.
data
[
0
]
&&
!
val
.
data
[
1
]
)
{
_
.
forEach
(
val
.
data
,
function
(
list
)
{
build
.
push
({
url
:
'/guang/plustar/brandinfo?id='
+
val
.
id
+
'&gender='
+
gender
,
...
...
@@ -47,15 +45,19 @@ const formaData = (data, gender) => {
return
build
;
};
const
getContentData
=
(
gender
,
type
,
channel
,
isRecommend
)
=>
{
let
param
=
{
gender
:
gender
,
brand_type
:
type
,
yh_channel
:
channel
};
const
getContentData
=
(
gender
,
type
)
=>
{
if
(
isRecommend
)
{
param
.
is_recommend
=
isRecommend
;
}
return
serviceAPI
.
get
(
'guang/api/v3/plustar/getlist'
,
{
gender
:
gender
,
brand_type
:
type
}).
then
((
result
)
=>
{
return
serviceAPI
.
get
(
'guang/api/v3/plustar/getlist'
,
param
).
then
((
result
)
=>
{
if
(
result
&&
result
.
code
===
200
)
{
// console.log(result)
return
formaData
(
result
.
data
.
data
.
list
[
0
].
data
,
gender
);
}
else
{
logger
.
error
(
'列表 list data return code is not 200'
);
...
...
@@ -73,6 +75,15 @@ const getListData = (gender, recom, all) => {
});
};
const
getBrandsData
=
(
gender
,
starBrand
,
originalBrand
,
channel
,
isRecommend
)
=>
{
return
Promise
.
all
([
getContentData
(
gender
,
starBrand
,
isRecommend
,
channel
),
getContentData
(
gender
,
originalBrand
,
isRecommend
,
channel
)]).
then
((
result
)
=>
{
return
{
star
:
result
[
0
],
plus
:
result
[
1
]
};
});
};
// 新品到着
const
getNewProduct
=
(
brandId
,
gender
,
url
)
=>
{
...
...
@@ -96,7 +107,6 @@ const getNewProduct = (brandId, gender, url) => {
let
obj
=
{};
let
price
;
// console.log(list)
if
(
index
<=
5
)
{
let
tag
=
[];
...
...
@@ -280,5 +290,6 @@ module.exports = {
getListData
,
getContentData
,
getDetailData
,
getDetailDataAsync
getDetailDataAsync
,
getBrandsData
};
...
...
apps/guang/views/action/index/list.hbs
View file @
5d50bc7
...
...
@@ -22,7 +22,7 @@
<div
class=
"loading status hide"
>
正在加载...
</div>
<span
class=
"no-more status"
>
没有更多啦
</span>
<span
class=
"no-more status
hide
"
>
没有更多啦
</span>
</div>
{{#if
tag
}}
...
...
apps/guang/views/action/index/page.hbs
View file @
5d50bc7
...
...
@@ -13,7 +13,6 @@
<div
class=
"swiper-pagination"
></div>
</div>
{{/if}}
{{#
infos
}}
{{>
index
/
info
}}
{{/
infos
}}
\ No newline at end of file
...
...
apps/guang/views/action/info/index.hbs
View file @
5d50bc7
...
...
@@ -90,9 +90,9 @@
<span
class=
"reco-name"
>
{{
name
}}
</span>
</p>
<p
class=
"price"
>
<span
class=
"sale-price
{{^
price
}}
no-price
{{/
price
}}
"
>
¥
{{
salePrice
}}
</span>
<span
class=
"sale-price
{{^
price
}}
no-price
{{/
price
}}
"
>
¥
{{
salePrice
}}
</span>
{{#
price
}}
<span
class=
"market-price"
>
¥
{{
.
}}
</span>
<span
class=
"market-price"
>
¥
{{
.
}}
</span>
{{/
price
}}
<a
class=
"check-detail"
href=
{{
url
}}
>
查看详情
...
...
apps/home/controllers/address.js
View file @
5d50bc7
...
...
@@ -49,7 +49,8 @@ exports.addressAct = (req, res, next) => {
module
:
'home'
,
page
:
'address-act'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
result
.
navTitle
navTitle
:
result
&&
result
.
navTitle
,
navBtn
:
false
}),
title
:
result
.
navTitle
};
...
...
@@ -161,7 +162,8 @@ exports.addressModify = (req, res, next) => {
module
:
'home'
,
page
:
'address-modify'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
'选择地址'
navTitle
:
'选择地址'
,
navBtn
:
false
}),
title
:
'选择地址'
,
};
...
...
@@ -184,6 +186,10 @@ exports.addressModify = (req, res, next) => {
* @param next
*/
exports
.
locationList
=
(
req
,
res
,
next
)
=>
{
res
.
set
({
'Cache-Control'
:
'max-age=600'
});
addressModel
.
locationList
({
uid
:
req
.
user
.
uid
}).
then
(
result
=>
{
...
...
apps/home/controllers/help.js
View file @
5d50bc7
...
...
@@ -9,11 +9,12 @@ exports.index = (req, res, next) => {
module
:
'home'
,
page
:
'help'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
'帮助中心'
navTitle
:
'帮助中心'
,
navBtn
:
false
}),
title
:
'帮助中心'
,
pageFooter
:
true
,
iHelp
:
result
,
iHelp
:
result
});
}).
catch
(
next
);
};
...
...
@@ -24,7 +25,8 @@ exports.helpDetail = (req, res, next) => {
module
:
'home'
,
page
:
'help-detail'
,
pageHeader
:
headerModel
.
setNav
({
navTitle
:
req
.
query
.
name
navTitle
:
req
.
query
.
name
,
navBtn
:
false
}),
title
:
req
.
query
.
name
,
pageFooter
:
true
,
...
...
apps/home/controllers/myCurrency.js
View file @
5d50bc7
...
...
@@ -65,7 +65,7 @@ let ajaxCurrencyDetail = (req, res, next) => {
res
.
render
(
'ajax-currency-detail'
,
{
layout
:
false
,
coinlist
:
result
.
coinlist
coinlist
:
_
.
get
(
result
,
'coinlist'
,
[])
});
}).
catch
(
next
);
};
...
...
apps/home/models/favorite.js
View file @
5d50bc7
...
...
@@ -109,7 +109,7 @@ const favProduct = (uid, page, limit) => {
return
resu
;
}
else
{
logger
.
error
(
'
收藏商品 cood 不是
200'
);
logger
.
error
(
'
fav goods code no
200'
);
return
{
total
:
0
,
};
...
...
@@ -192,7 +192,7 @@ const favfavBrand = (uid, page, limit) => {
return
resu
;
}
else
{
logger
.
error
(
'
收藏品牌 cood 不是
200'
);
logger
.
error
(
'
fav brand code no
200'
);
return
{
total
:
0
,
};
...
...
apps/home/models/myCurrency.js
View file @
5d50bc7
...
...
@@ -15,7 +15,7 @@ const yohoCoin = (uid) => {
if
(
result
&&
result
.
code
===
200
)
{
return
camelCase
(
result
.
data
);
}
else
{
logger
.
error
(
'youhocoin co
od 不是
200'
);
logger
.
error
(
'youhocoin co
de no
200'
);
}
});
};
...
...
@@ -59,6 +59,12 @@ const currencyDetail = (uid, page, limit) => {
if
(
result
&&
result
.
code
===
200
)
{
let
total
=
parseInt
(
result
.
data
.
page_total
,
10
)
+
1
;
_
.
forEach
(
_
.
get
(
result
,
'data.coinlist'
,
[]),
perCoin
=>
{
if
(
perCoin
.
num
>
0
)
{
perCoin
.
num
=
'+'
+
perCoin
.
num
;
}
});
if
(
page
&&
page
<=
total
)
{
return
yohoCoin
(
uid
).
then
(
list
=>
{
...
...
@@ -79,7 +85,7 @@ const currencyDetail = (uid, page, limit) => {
}
}
else
{
logger
.
error
(
'youholist co
od 不是
200'
);
logger
.
error
(
'youholist co
de no
200'
);
}
});
...
...
apps/home/models/orderDetail.js
View file @
5d50bc7
...
...
@@ -289,7 +289,7 @@ const orderDetailData = (uid, orderCode) => {
// return orderDetail;
}
else
{
logger
.
error
(
'
详情信息 返回不是
200'
);
logger
.
error
(
'
detail info return no
200'
);
return
{};
}
...
...
apps/home/models/suggest.js
View file @
5d50bc7
...
...
@@ -7,12 +7,9 @@
'use strict'
;
const
logger
=
global
.
yoho
.
logger
;
const
api
=
global
.
yoho
.
API
;
const
serviceAPI
=
global
.
yoho
.
ServiceAPI
;
const
camelCase
=
global
.
yoho
.
camelCase
;
const
_
=
require
(
'lodash'
);
const
config
=
global
.
yoho
.
config
;
const
helpers
=
global
.
yoho
.
helpers
;
const
suggestData
=
(
udid
,
page
,
limit
)
=>
{
...
...
@@ -22,10 +19,10 @@ const suggestData = (udid, page, limit) => {
limit
:
limit
}).
then
((
result
)
=>
{
if
(
result
&&
result
.
code
===
200
)
{
if
(
result
&&
result
.
code
===
200
&&
result
.
data
)
{
_
.
forEach
(
result
.
data
.
list
,
function
(
data
)
{
data
=
_
.
assign
(
data
,
{
Object
.
assign
(
data
,
{
good
:
data
.
is_reliable
===
1
,
bad
:
data
.
is_reliable
===
2
,
none
:
data
.
is_reliable
===
0
...
...
@@ -33,7 +30,7 @@ const suggestData = (udid, page, limit) => {
});
return
camelCase
(
result
.
data
.
list
);
}
else
{
logger
.
error
(
'
收藏商品 cood 不是
200'
);
logger
.
error
(
'
fav goods code no
200'
);
}
});
};
...
...
apps/home/router.js
View file @
5d50bc7
...
...
@@ -52,6 +52,7 @@ router.get('/locationList', auth, addressController.locationList); // 异æ¥èŽ·å
router
.
get
(
'/orders'
,
auth
,
orderController
.
order
);
// 订单列表
router
.
get
(
'/getOrders'
,
auth
,
orderController
.
getOrders
);
// 获取订单列表数据
router
.
get
(
'/orderDetail'
,
auth
,
orderDetailController
.
orderDetailData
);
// 订单详情页
router
.
get
(
'/orders/detail'
,
auth
,
orderDetailController
.
orderDetailData
);
// 订单详情页兼容老的
router
.
get
(
'/delOrder'
,
auth
,
orderDetailController
.
delOrder
);
// 删除订单
router
.
get
(
'/readd'
,
auth
,
orderDetailController
.
readdData
);
// 再次购买
router
.
get
(
'/cancelOrder'
,
auth
,
orderDetailController
.
cancelOrder
);
// 取消订单
...
...
apps/home/views/action/ajax-currency-detail.hbs
View file @
5d50bc7
...
...
@@ -4,7 +4,7 @@
<p
class=
"title"
>
{{
message
}}
</p>
<p
class=
"time"
>
{{
date
}}
</p>
<div
class=
"count"
>
+
{{
num
}}
{{
num
}}
</div>
</div>
</li>
...
...
apps/home/views/action/currency-new.hbs
View file @
5d50bc7
...
...
@@ -21,7 +21,7 @@
{{#
banner
}}
{{#
data
}}
<a
href=
"
{{
url
}}
"
>
<img
src=
"
{{
image
src
640
200
2
}}
"
alt=
"img"
>
<img
src=
"
{{
image
src
640
200
}}
"
alt=
"img"
>
</a>
{{/
data
}}
{{/
banner
}}
...
...
apps/home/views/action/favorite/favorite-brand.hbs
View file @
5d50bc7
...
...
@@ -23,7 +23,7 @@
{{#
productList
}}
<li
class=
"swiper-slide"
>
<a
href=
"
{{
link
}}
"
>
<img
class=
"swiper-lazy"
data-src=
"
{{
image
imgUrl
97
150
}}
"
alt=
""
/>
<img
class=
"swiper-lazy"
data-src=
"
{{
image
imgUrl
235
314
}}
"
alt=
""
/>
</a>
<div
class=
"brand-product"
>
<div
class=
"
{{#
discount
}}
price-discount
{{/
discount
}}
"
>
...
...
apps/home/views/action/help.hbs
View file @
5d50bc7
<div
class=
"i
H
elp"
>
<div
class=
"i
-h
elp"
>
<ul>
{{#
iHelp
}}
<li><a
href=
"//m.yohobuy.com/home/helpDetail?code=
{{
code
}}
&name=
{{
name
}}
"
><span>
{{
name
}}
</span><i
class=
"iconfont num"
>

</i></a></li>
...
...
apps/home/views/action/vip-grade/vip-grade.hbs
View file @
5d50bc7
...
...
@@ -7,11 +7,11 @@
<ul
class=
"cost block"
>
<li>
年度累计金额:
<span>
¥
{{
costOfThisYear
}}
</span>
<span>
¥
{{
costOfThisYear
}}
</span>
</li>
<li>
历史消费总金额:
<span>
¥
{{
sumCost
}}
</span>
<span>
¥
{{
sumCost
}}
</span>
</li>
</ul>
...
...
apps/home/views/partial/vip-grade/basic-info.hbs
View file @
5d50bc7
...
...
@@ -7,7 +7,7 @@
您已升级至最高的等级啦!
</p>
<p
class=
"sum-cost"
>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
</p>
<div
class=
"progresser"
>
<div
class=
"outer"
></div>
...
...
@@ -24,11 +24,11 @@
<span
class=
"vip-icon vip-2"
></span>
</p>
<p
class=
"grade-desc"
>
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为白金会员!
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为白金会员!
<span
class=
"sub-desc"
>
(VIP金额累计需订单成功签收满15天并无退换货)
</span>
</p>
<p
class=
"sum-cost"
>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
</p>
<div
class=
"progresser"
>
<div
class=
"outer"
></div>
...
...
@@ -37,7 +37,7 @@
金卡会员
</span>
<span
class=
"beacon beacon-max"
>
白金卡会员
</span>
<span
class=
"cost-limit"
>
¥
5000.00
</span>
<span
class=
"cost-limit"
>
¥
5000.00
</span>
</div>
{{/if}}
...
...
@@ -47,11 +47,11 @@
<span
class=
"vip-icon vip-1"
></span>
</p>
<p
class=
"grade-desc"
>
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为金卡会员!
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为金卡会员!
<span
class=
"sub-desc"
>
(VIP金额累计需订单成功签收满15天并无退换货)
</span>
</p>
<p
class=
"sum-cost"
>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
</p>
<div
class=
"progresser"
>
<div
class=
"outer"
></div>
...
...
@@ -60,7 +60,7 @@
银卡会员
</span>
<span
class=
"beacon beacon-max"
>
金卡会员
</span>
<span
class=
"cost-limit"
>
¥
2000.00
</span>
<span
class=
"cost-limit"
>
¥
2000.00
</span>
</div>
{{/if}}
...
...
@@ -70,11 +70,11 @@
<span>
普通会员
</span>
</p>
<p
class=
"grade-desc"
>
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为银卡会员!
还差
<span
class=
"cost-gap"
>
¥
{{
costGap
}}
</span>
就可以升级为银卡会员!
<span
class=
"sub-desc"
>
(VIP金额累计需订单成功签收满15天并无退换货)
</span>
</p>
<p
class=
"sum-cost"
>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
年度累计金额
<span>
¥
{{
costOfThisYear
}}
</span>
</p>
<div
class=
"progresser"
>
<div
class=
"outer"
></div>
...
...
@@ -83,6 +83,6 @@
普通
</span>
<span
class=
"beacon beacon-max"
>
银卡会员
</span>
<span
class=
"cost-limit"
>
¥
600.00
</span>
<span
class=
"cost-limit"
>
¥
600.00
</span>
</div>
{{/if}}
...
...
apps/passport/models/back-api.js
View file @
5d50bc7
...
...
@@ -34,7 +34,7 @@ const getAreaDataAsync = () => {
return
result
;
}
else
{
logger
.
error
(
'获取地区数据返回 code
不是
200'
);
logger
.
error
(
'获取地区数据返回 code
no
200'
);
return
[];
}
});
...
...
apps/product/models/consult-comment.js
View file @
5d50bc7
...
...
@@ -178,7 +178,7 @@ let consults = (params) => {
data
.
consults
=
result
[
1
].
list
;
}
data
.
showReadMore
=
result
[
1
].
list
.
length
>
2
;
data
.
showReadMore
=
_
.
get
(
result
[
1
],
'list.length'
,
0
)
>
2
;
return
data
;
});
...
...
apps/product/models/detail.js
View file @
5d50bc7
...
...
@@ -1772,7 +1772,7 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
colors
:
_
.
toArray
(
colorGroup
),
sizes
:
sizeGroup
});
// 限购商品
if
(
origin
.
isLimitBuy
)
{
return
api
.
get
(
''
,
{
...
...
@@ -1858,6 +1858,52 @@ let _detailDataPkgAsync = (origin, uid, vipLevel, ua) => {
dest
.
goodsId
=
origin
.
goods_id
;
return
Promise
.
resolve
(
dest
);
}
return
api
.
get
(
''
,
{
method
:
'app.shop.queryShopsByBrandId'
,
brand_id
:
_
.
toString
(
brandId
)
},
{
cache
:
true
}).
then
(
shops
=>
{
if
(
shops
&&
shops
.
code
===
200
)
{
return
_processShopsInfo
(
shops
.
data
);
}
return
[];
});
};
let
_getPromotionInfo
=
(
skn
)
=>
{
return
api
.
get
(
''
,
{
method
:
'app.product.promotion'
,
product_skn
:
_
.
toString
(
skn
)
},
{
code
:
200
,
cache
:
true
}).
then
((
result
)
=>
{
return
result
&&
result
.
data
;
});
};
/**
* 获取默认咨询列表
*/
const
_getCommonConsult
=
()
=>
{
let
params
=
{
method
:
'app.consult.common'
};
return
api
.
get
(
''
,
params
,
{
code
:
200
}).
then
(
result
=>
{
let
data
=
{};
if
(
result
.
data
)
{
data
=
result
.
data
;
}
return
data
;
});
};
...
...
apps/product/models/list.js
View file @
5d50bc7
...
...
@@ -596,8 +596,7 @@ const getBrandIntro = (brandId, uid) => {
method
:
'app.brand.getBrandIntro'
,
brand_id
:
brandId
},
param
),
{
code
:
200
,
cache
:
true
code
:
200
}).
then
(
result
=>
{
if
(
result
&&
result
.
data
)
{
let
list
=
result
.
data
;
...
...
apps/product/models/recom.js
View file @
5d50bc7
'use strict'
;
const
api
=
global
.
yoho
.
API
;
const
logger
=
global
.
yoho
.
logger
;
const
utils
=
'../../../utils'
;
const
productProcess
=
require
(
`
$
{
utils
}
/product-process`
)
;
...
...
@@ -27,7 +28,8 @@ const mayLike = (uid, page, limit, gender, udid, recPos, channel) => {
return
false
;
}
}
}
else
{
logger
.
error
(
'mayLike code no 200'
);
}
});
};
...
...
@@ -51,6 +53,8 @@ const mayLikeKids = (page, limit, channel) => {
return
productProcess
.
processProductList
(
result
.
data
.
product_list
);
}
}
else
{
logger
.
error
(
'mayLikeKids code no 200'
);
}
});
};
...
...
apps/product/router.js
View file @
5d50bc7
...
...
@@ -95,6 +95,7 @@ router.get('/search/search', search.search);
// 品类
router
.
get
(
'/index/index'
,
list
.
category
);
router
.
get
(
'/list/index'
,
list
.
category
);
// 兼容 PC 的链接
// 品牌 | 店铺
router
.
get
(
'/index/brand'
,
list
.
brand
);
...
...
@@ -113,6 +114,7 @@ router.get('/opt/favoriteBrand', list.favoriteBrand);
// 新品到着
router
.
get
(
'/new'
,
news
.
newGoods
);
router
.
get
(
'/list/new'
,
news
.
newGoods
);
// 兼容 PC 的链接
router
.
get
(
'/new/selectNewSale'
,
news
.
selectNewSale
);
router
.
get
(
'/new/filter'
,
news
.
filter
);
...
...
apps/product/views/action/detail/preference.hbs
View file @
5d50bc7
...
...
@@ -9,7 +9,7 @@
</div>
<div
class=
"price"
>
<span
class=
"sale-price
{{^
price
}}
no-price
{{/
price
}}
"
>
¥
{{
salePrice
}}
</span>
{{#
price
}}
<span
class=
"old-price"
>
¥
{{
.
}}
</span>
{{/
price
}}
{{#
price
}}
<span
class=
"old-price"
>
¥
{{
.
}}
</span>
{{/
price
}}
</div>
<div
class=
"swiper-lazy-preloader"
></div>
</a>
...
...
config/common.js
View file @
5d50bc7
...
...
@@ -17,10 +17,10 @@ module.exports = {
siteUrl
:
'//m.yohobuy.com'
,
assetUrl
:
'//localhost:5001'
,
domains
:
{
api
:
'http://api.yoho.cn/'
,
service
:
'http://service.yoho.cn/'
,
liveApi
:
'http://api.live.yoho.cn/'
,
singleApi
:
'http://single.yoho.cn/'
,
api
:
'http://api.yoho.yohoops.org/'
,
service
:
'http://service.yoho.yohoops.org/'
,
liveApi
:
'http://api.live.yoho.cn/'
,
singleApi
:
'http://single.yoho.cn/'
// api: 'http://api-test1.yohops.com:9999/',
// service: 'http://service-test1.yohops.com:9999/',
...
...
doraemon/middleware/error-handler.js
View file @
5d50bc7
...
...
@@ -59,6 +59,6 @@ exports.serverError = () => {
isErr
:
true
});
}
next
();
next
(
err
);
};
};
...
...
doraemon/middleware/item-name-handler.js
0 → 100644
View file @
5d50bc7
/**
* 商品详情页部分商品名称重置,防止express内部decodeURIComponent不能解析url出错
* @author: xuqi<qi.xu@yoho.cn>
* @date: 2016/8/23
*/
module
.
exports
=
function
(
req
,
res
,
next
)
{
if
(
/^
\/
product
\/
pro_/
.
test
(
req
.
url
))
{
req
.
url
=
req
.
url
.
replace
(
/
\/
pro_
([\d]
+
)
_
([\d]
+
)\/(
.*
)
/
,
'/pro_$1_$2/yoho-replace.html'
);
}
next
();
};
...
...
doraemon/middleware/set-yoho-data.js
View file @
5d50bc7
...
...
@@ -5,6 +5,7 @@
*/
'use strict'
;
const
helpers
=
global
.
yoho
.
helpers
;
module
.
exports
=
()
=>
{
return
(
req
,
res
,
next
)
=>
{
...
...
@@ -31,6 +32,8 @@ module.exports = () => {
res
.
set
(
'Access-Control-Allow-Origin'
,
'*'
);
}
res
.
locals
.
cartUrl
=
helpers
.
urlFormat
(
'/cart/index/index'
);
next
();
};
};
...
...
doraemon/views/partial/common/suspend-cart.hbs
View file @
5d50bc7
<div
id=
"suspend-cart"
class=
"suspend-cart"
>
<a
href=
{{
cartUrl
}}
>
<a
href=
"
{{
@root
.
cartUrl
}}
"
>
<span
class=
"iconfont"
>

</span>
</a>
<span
class=
"cart-count hide"
>
0
</span>
</div>
\ No newline at end of file
</div>
...
...
doraemon/views/partial/header.hbs
View file @
5d50bc7
...
...
@@ -14,13 +14,13 @@
<a
href=
"
{{
url
}}
"
class=
"nav-sub-right"
>
{{
text
}}
</a>
{{/
shopPage
}}
{{#
currencyPage
}}
<a
href=
"/home/helpDetail?code=20151230-102233&caption=有货币介绍"
class=
"iconfont nav-home"
>

</a>
<a
href=
"/home/helpDetail?code=20151230-102233&caption=有货币介绍
&name=有货币介绍
"
class=
"iconfont nav-home"
>

</a>
{{/
currencyPage
}}
{{#
currencyDetailPage
}}
<a
href=
"/home/helpDetail?code=20111130-152530&caption=如何使用有货币支付"
class=
"iconfont nav-home"
>

</a>
<a
href=
"/home/helpDetail?code=20111130-152530&caption=如何使用有货币支付
&name=如何使用有货币支付
"
class=
"iconfont nav-home"
>

</a>
{{/
currencyDetailPage
}}
{{#
installmentPage
}}
<a
href=
"/home/helpDetail?code=20151230-102233&caption=有货分期"
class=
"iconfont nav-home"
>

</a>
<a
href=
"/home/helpDetail?code=20151230-102233&caption=有货分期
&name=有货分期
"
class=
"iconfont nav-home"
>

</a>
{{/
installmentPage
}}
{{#
navPhone
}}
<a
href=
"
{{
.
}}
"
class=
"iconfont nav-home"
>

</a>
...
...
public/js/channel/cate.page.js
View file @
5d50bc7
...
...
@@ -78,6 +78,10 @@ $categoryContainer.on('touchend', function(e) {
$subLevel
.
not
(
'.hide'
).
addClass
(
'hide'
);
$subLevel
.
eq
(
index
).
removeClass
(
'hide'
);
}
if
(
$this
.
find
(
'a'
).
attr
(
'href'
))
{
location
.
href
=
$this
.
find
(
'a'
).
attr
(
'href'
);
}
});
$categoryContainer
.
find
(
'.primary-level'
).
on
(
'touchstart touchend touchcancel'
,
'li'
,
function
()
{
...
...
public/js/channel/maybe-like.js
View file @
5d50bc7
...
...
@@ -127,12 +127,10 @@ module.exports = function(specificGender) {
success
:
function
(
data
)
{
var
PRDID
=
[];
if
(
data
===
' '
||
data
===
''
)
{
searching
=
true
;
searching
=
false
;
loading
.
hideLoadingMask
();
$
(
'.maybe-like'
).
hide
();
// 有货币页面不加载底部
if
(
gender
&&
!
specificGender
)
{
gender
=
gender
.
substr
(
0
,
3
);
...
...
public/js/common.js
View file @
5d50bc7
...
...
@@ -195,7 +195,7 @@ function reMarginFooter(fixedElement) {
a
.
async
=
1
;
a
.
src
=
j
;
m
.
parentNode
.
insertBefore
(
a
,
m
);
}
)(
window
,
document
,
'script'
,
(
document
.
location
.
protocol
===
'https:'
?
'https'
:
'http'
)
+
'://cdn.yoho.cn/yas-jssdk/1.0.17/yas.js'
,
'_yas'
);
}
(
window
,
document
,
'script'
,
(
document
.
location
.
protocol
===
'https:'
?
'https'
:
'http'
)
+
'://cdn.yoho.cn/yas-jssdk/1.0.17/yas.js'
,
'_yas'
)
);
(
function
()
{
var
uid
=
getUid
();
...
...
public/js/guang/info-common.js
View file @
5d50bc7
...
...
@@ -215,7 +215,7 @@ function loadMore($container, opt, url) {
success
:
function
(
data
)
{
var
$newItems
;
if
(
data
===
'
'
)
{
if
(
data
===
''
)
{
opt
.
end
=
true
;
searching
=
false
;
...
...
public/js/home/address-act.page.js
View file @
5d50bc7
...
...
@@ -193,6 +193,7 @@ function bindAddressListEvent(html) {
if
(
window
.
localStorage
&&
window
.
localStorage
.
getItem
)
{
chinaAddressList
=
window
.
localStorage
.
getItem
(
'chinaAddressList'
);
}
if
(
chinaAddressList
)
{
bindAddressListEvent
(
chinaAddressList
);
}
else
{
...
...
@@ -201,12 +202,14 @@ if (chinaAddressList) {
$
.
ajax
({
method
:
'GET'
,
url
:
'/home/locationList'
,
timeout
:
60000
timeout
:
60000
,
cache
:
true
}).
then
(
function
(
html
)
{
bindAddressListEvent
(
html
);
if
(
window
.
localStorage
&&
window
.
localStorage
.
setItem
)
{
window
.
localStorage
.
setItem
(
'chinaAddressList'
,
html
);
}
// if (window.localStorage && window.localStorage.setItem) {
// window.localStorage.setItem('chinaAddressList', html);
// }
}).
fail
(
function
()
{
tip
.
show
(
'获取省市区列表失败'
);
});
...
...
public/js/home/currency-detail.page.js
View file @
5d50bc7
...
...
@@ -3,6 +3,8 @@ var $ = require('yoho-jquery'),
var
page
=
1
;
var
flag
=
true
;
require
(
'../common'
);
loading
.
showLoadingMask
();
function
ajaxCurrencyDetail
(
curPage
)
{
...
...
public/js/home/currency-new.page.js
View file @
5d50bc7
...
...
@@ -13,3 +13,7 @@ function getGender() {
}
require
(
'../channel/maybe-like'
)(
getGender
());
if
(
$
(
'#goods-list'
).
length
===
0
)
{
$
(
'.maybe-like'
).
hide
();
}
...
...
public/scss/home/_ihelp.css
View file @
5d50bc7
.i
H
elp
{
.i
-h
elp
{
width
:
100%
;
height
:
auto
;
overflow
:
hidden
;
...
...
@@ -29,7 +29,7 @@
}
span
{
width
:
85
%
;
width
:
92
%
;
height
:
100%
;
overflow
:
hidden
;
float
:
left
;
...
...
public/scss/layout/_header.css
View file @
5d50bc7
...
...
@@ -223,7 +223,7 @@
height
:
auto
;
color
:
#fff
;
line-height
:
40px
;
font-size
:
14
px
;
font-size
:
14
PX
;
}
}
}
...
...
public/scss/me/_browse-record.css
View file @
5d50bc7
...
...
@@ -30,7 +30,7 @@
.price
{
margin
:
0.3rem
0
;
font-size
:
16
px
;
font-size
:
16
PX
;
}
.sale-price
{
...
...
public/scss/me/_fav.css
View file @
5d50bc7
...
...
@@ -107,7 +107,7 @@
font-size
:
24px
;
border-bottom
:
1px
solid
#e0e0e0
;
padding-bottom
:
20px
;
height
:
1
2
0px
;
height
:
1
4
0px
;
overflow
:
hidden
;
position
:
relative
;
...
...
@@ -288,7 +288,7 @@
margin
:
0
30px
;
.swiper-slide
{
width
:
2
2
5px
;
width
:
2
5
5px
;
height
:
100%
;
float
:
left
;
padding-right
:
30px
;
...
...
public/scss/me/_home.css
View file @
5d50bc7
...
...
@@ -307,6 +307,7 @@
.num
{
color
:
#e0e0e0
;
float
:
right
;
font-size
:
16
PX
;
}
}
}
...
...
public/scss/me/_suggest.css
View file @
5d50bc7
...
...
@@ -124,14 +124,13 @@
.create-new-suggest
{
display
:
block
;
width
:
100%
;
height
:
88
px
;
height
:
150
px
;
line-height
:
88px
;
text-align
:
center
;
font-size
:
30px
;
border-top
:
30px
solid
#f0f0f0
;
border-bottom
:
30px
solid
#f0f0f0
;
position
:
relative
;
height
:
88px
;
.list-item
{
padding
:
0
35px
;
...
...
Please
register
or
login
to post a comment