Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
严立
/
mini-shimao
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
538f3685
authored
Sep 17, 2020
by
严立
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
LL - 用户信息缓存逻辑
parent
ab53f413
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
116 additions
and
128 deletions
app.js
environmental.js
pages/commodity/shopping-cart/shopping-cart.js
pages/login/login.js
pages/mine/home/home.js
pages/mine/home/home.wxml
app.js
View file @
538f3685
...
@@ -128,8 +128,6 @@ App({
...
@@ -128,8 +128,6 @@ App({
url
:
'/api/v1/login/getSmallSession?code='
+
res
.
code
,
url
:
'/api/v1/login/getSmallSession?code='
+
res
.
code
,
method
:
'GET'
,
method
:
'GET'
,
success
:
(
response
)
=>
{
success
:
(
response
)
=>
{
console
.
log
(
response
)
let
funcResponse
=
response
.
data
let
funcResponse
=
response
.
data
this
.
globalData
.
token
=
funcResponse
.
token
this
.
globalData
.
token
=
funcResponse
.
token
this
.
globalData
.
refreshToken
=
funcResponse
.
refreshToken
this
.
globalData
.
refreshToken
=
funcResponse
.
refreshToken
...
@@ -145,11 +143,16 @@ App({
...
@@ -145,11 +143,16 @@ App({
'birthday'
:
funcResponse
.
birthday
,
'birthday'
:
funcResponse
.
birthday
,
'sex'
:
funcResponse
.
sex
,
'sex'
:
funcResponse
.
sex
,
'userType'
:
Number
(
funcResponse
.
userType
),
'userType'
:
Number
(
funcResponse
.
userType
),
'status'
:
''
,
// 只有游客身份该值为 ''
'isSignIn'
:
false
,
'isSignIn'
:
false
,
}
}
// 以返回信息中是否包含手机号码判断用户是否注册过
// 以返回信息中是否包含手机号码判断用户是否注册过
if
(
funcUserInfo
.
phone
)
funcUserInfo
.
isSignIn
=
true
console
.
log
(
funcUserInfo
.
phone
)
if
(
funcUserInfo
.
phone
)
{
funcUserInfo
.
isSignIn
=
true
this
.
queryUserStatus
()
}
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
...
@@ -187,9 +190,55 @@ App({
...
@@ -187,9 +190,55 @@ App({
},
},
/**
/**
* 查询用户认证状态
* 尽在用户已经注册的前提下会查询此函数
* @function
* @param
* @returns
*/
queryUserStatus
:
function
()
{
this
.
wxRequest
({
url
:
'/api/v1/userAuth/getAuth'
,
method
:
'GET'
,
success
:
(
response
)
=>
{
let
funcResponse
=
response
.
data
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
let
funcStatus
=
Number
(
funcResponse
.
state
)
let
funcStatusText
=
'去认证'
switch
(
funcStatus
)
{
// 正在审核
case
0
:
funcStatusText
=
'审核中'
funcUserInfo
.
status
=
funcStatus
funcUserInfo
.
userType
=
0
break
// 通过
case
1
:
funcStatusText
=
'审核通过 '
funcUserInfo
.
status
=
funcStatus
funcUserInfo
.
userType
=
1
break
// 拒绝
case
2
:
funcStatusText
=
'审核失败'
funcUserInfo
.
status
=
funcStatus
funcUserInfo
.
userType
=
0
break
}
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
}
})
},
/**
* 刷新令牌
* 刷新令牌
* @function
* @function
* @param
{number} - funcAmountValue 金额,单位分
* @param
* @returns
* @returns
*/
*/
refreshToken
:
function
(
obj
)
{
refreshToken
:
function
(
obj
)
{
...
@@ -211,5 +260,5 @@ App({
...
@@ -211,5 +260,5 @@ App({
}
}
}
}
})
})
}
}
,
})
})
\ No newline at end of file
environmental.js
View file @
538f3685
...
@@ -14,14 +14,16 @@ let Development = {
...
@@ -14,14 +14,16 @@ let Development = {
],
],
// 门店信息
// 门店信息
// appId 程序内部交互确定门店
// id 数据库门店 id
shopId
:
[
shopId
:
[
{
appId
:
1
,
id
:
'581be62a80bb4f0485abd87abcf64dc0'
,
logo
:
'shop/logo-1.png'
,
cover
:
'shop/cover-1.png'
,
name
:
'海错图'
,
title
:
[
'海错图'
,
'海错图购票'
,
'海错图'
,
'海错图文创店'
,
'海错图'
,
'海错图'
,
'海错图'
]
},
{
appId
:
1
,
id
:
'581be62a80bb4f0485abd87abcf64dc0'
,
logo
:
'shop/logo-1.png'
,
co
mmodityLogo
:
'shop/commodity-logo-1.png'
,
co
ver
:
'shop/cover-1.png'
,
name
:
'海错图'
,
title
:
[
'海错图'
,
'海错图购票'
,
'海错图'
,
'海错图文创店'
,
'海错图'
,
'海错图'
,
'海错图'
]
},
{
appId
:
2
,
id
:
'3cfe2e3b8b4342e8b62f8b45daf60d91'
,
logo
:
'shop/logo-2.png'
,
cover
:
'shop/cover-2.png'
,
name
:
'星空影院'
,
title
:
[
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
]
},
{
appId
:
2
,
id
:
'3cfe2e3b8b4342e8b62f8b45daf60d91'
,
logo
:
'shop/logo-2.png'
,
co
mmodityLogo
:
'shop/commodity-logo-2.png'
,
co
ver
:
'shop/cover-2.png'
,
name
:
'星空影院'
,
title
:
[
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
,
'星空影院'
]
},
{
appId
:
3
,
id
:
'8a3e59c57f564c569b3d7bb278ea50b3'
,
logo
:
'shop/logo-3.png'
,
cover
:
'shop/cover-3.png'
,
name
:
'儿童营地'
,
title
:
[
'儿童营地'
,
'儿童营地入园购票'
,
'儿童营地'
,
'儿童营地'
,
'儿童营地'
,
'儿童营地接待区'
,
'儿童营地'
]
},
{
appId
:
3
,
id
:
'8a3e59c57f564c569b3d7bb278ea50b3'
,
logo
:
'shop/logo-3.png'
,
co
mmodityLogo
:
'shop/commodity-logo-3.png'
,
co
ver
:
'shop/cover-3.png'
,
name
:
'儿童营地'
,
title
:
[
'儿童营地'
,
'儿童营地入园购票'
,
'儿童营地'
,
'儿童营地'
,
'儿童营地'
,
'儿童营地接待区'
,
'儿童营地'
]
},
{
appId
:
4
,
id
:
'c63893bb472f43bca4ec72f890bcb4fd'
,
logo
:
'shop/logo-4.png'
,
cover
:
'shop/cover-4.png'
,
name
:
'原野MOJITO'
,
title
:
[
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
]
},
{
appId
:
4
,
id
:
'c63893bb472f43bca4ec72f890bcb4fd'
,
logo
:
'shop/logo-4.png'
,
co
mmodityLogo
:
'shop/commodity-logo-4.png'
,
co
ver
:
'shop/cover-4.png'
,
name
:
'原野MOJITO'
,
title
:
[
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
,
'原野MOJITO'
]
},
{
appId
:
5
,
id
:
'26c40446fc454a02abe61758176597f6'
,
logo
:
'shop/logo-5.png'
,
cover
:
'shop/cover-5.png'
,
name
:
'拾光花坊'
,
title
:
[
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
]
},
{
appId
:
5
,
id
:
'26c40446fc454a02abe61758176597f6'
,
logo
:
'shop/logo-5.png'
,
co
mmodityLogo
:
'shop/commodity-logo-5.png'
,
co
ver
:
'shop/cover-5.png'
,
name
:
'拾光花坊'
,
title
:
[
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
,
'拾光花坊'
]
},
{
appId
:
6
,
id
:
'd9436d7018de43809824b6ec221ea01f'
,
logo
:
'shop/logo-6.png'
,
cover
:
'shop/cover-6.png'
,
name
:
'原味舒食'
,
title
:
[
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
]
},
{
appId
:
6
,
id
:
'd9436d7018de43809824b6ec221ea01f'
,
logo
:
'shop/logo-6.png'
,
co
mmodityLogo
:
'shop/commodity-logo-6.png'
,
co
ver
:
'shop/cover-6.png'
,
name
:
'原味舒食'
,
title
:
[
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
,
'原味舒食'
]
},
{
appId
:
7
,
id
:
'2614f117406548718bc091f24368c16e'
,
logo
:
'shop/logo-7.png'
,
cover
:
'shop/cover-7.png'
,
name
:
'元养水韵SPA'
,
title
:
[
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
]
},
{
appId
:
7
,
id
:
'2614f117406548718bc091f24368c16e'
,
logo
:
'shop/logo-7.png'
,
co
mmodityLogo
:
'shop/commodity-logo-7.png'
,
co
ver
:
'shop/cover-7.png'
,
name
:
'元养水韵SPA'
,
title
:
[
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
,
'元养水韵SPA'
]
},
]
]
}
}
...
...
pages/commodity/shopping-cart/shopping-cart.js
View file @
538f3685
...
@@ -288,6 +288,15 @@ Page({
...
@@ -288,6 +288,15 @@ Page({
},
},
onPaySubmit
:
function
()
{
onPaySubmit
:
function
()
{
// 优先检查用户是否已经注册,如果没有则跳转登录
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
if
(
!
funcUserInfo
.
isSignIn
)
{
wx
.
navigateTo
({
url
:
'/pages/login/login'
})
return
}
// 检查购物车是否拥有商品
// 检查购物车是否拥有商品
let
funcShoppingCart
=
this
.
data
.
shoppingCart
let
funcShoppingCart
=
this
.
data
.
shoppingCart
if
(
funcShoppingCart
.
length
===
0
)
{
if
(
funcShoppingCart
.
length
===
0
)
{
...
...
pages/login/login.js
View file @
538f3685
...
@@ -2,6 +2,8 @@ const App = getApp()
...
@@ -2,6 +2,8 @@ const App = getApp()
Page
({
Page
({
data
:
{
data
:
{
option
:
{},
height
:
''
,
height
:
''
,
islogin
:
false
,
islogin
:
false
,
isphone
:
false
,
isphone
:
false
,
...
@@ -10,6 +12,8 @@ Page({
...
@@ -10,6 +12,8 @@ Page({
},
},
onLoad
:
function
(
options
)
{
onLoad
:
function
(
options
)
{
this
.
setData
({
option
:
options
})
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
this
.
setData
({
this
.
setData
({
...
@@ -38,7 +42,6 @@ Page({
...
@@ -38,7 +42,6 @@ Page({
*/
*/
userInfoHandler
:
function
(
res
)
{
userInfoHandler
:
function
(
res
)
{
let
funcGetUserInfo
=
res
.
detail
.
userInfo
let
funcGetUserInfo
=
res
.
detail
.
userInfo
console
.
log
(
'userInfo'
,
res
)
if
(
!
res
.
detail
.
userInfo
)
{
if
(
!
res
.
detail
.
userInfo
)
{
return
return
}
}
...
@@ -57,8 +60,6 @@ Page({
...
@@ -57,8 +60,6 @@ Page({
iv
:
''
,
iv
:
''
,
},
},
success
:
(
res
)
=>
{
success
:
(
res
)
=>
{
console
.
log
(
res
)
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
this
.
setData
({
this
.
setData
({
islogin
:
true
islogin
:
true
})
})
...
@@ -88,14 +89,12 @@ Page({
...
@@ -88,14 +89,12 @@ Page({
},
},
success
:
(
res
)
=>
{
success
:
(
res
)
=>
{
funcUserInfo
.
phone
=
res
.
data
.
phoneNumber
funcUserInfo
.
phone
=
res
.
data
.
phoneNumber
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
this
.
setData
({
this
.
setData
({
isphone
:
true
isphone
:
true
})
})
setTimeout
(()
=>
{
setTimeout
(()
=>
{
this
.
checkFinish
()
this
.
checkFinish
()
},
1000
)
},
1000
)
}
}
})
})
},
},
...
@@ -113,7 +112,14 @@ Page({
...
@@ -113,7 +112,14 @@ Page({
checkFinish
:
function
()
{
checkFinish
:
function
()
{
if
(
this
.
data
.
islogin
&&
this
.
data
.
isphone
)
{
if
(
this
.
data
.
islogin
&&
this
.
data
.
isphone
)
{
wx
.
navigateBack
({})
// 在注册完成之后 login 一次,重新设置用户信息以及相关状态参数
console
.
log
(
'注册成功'
)
App
.
globalData
.
token
=
''
App
.
login
({
success
:
()
=>
{
wx
.
navigateBack
({})
}
})
}
}
}
}
})
})
\ No newline at end of file
pages/mine/home/home.js
View file @
538f3685
...
@@ -24,7 +24,7 @@ Page({
...
@@ -24,7 +24,7 @@ Page({
mobile
:
''
,
mobile
:
''
,
nickName
:
''
,
nickName
:
''
,
avatarUrl
:
'/pages/mine/home/image/avatar.png'
,
avatarUrl
:
'/pages/mine/home/image/avatar.png'
,
stat
eTes
t
:
'去认证'
,
stat
usTex
t
:
'去认证'
,
mask
:
false
,
mask
:
false
,
type
:
0
,
//判断是否是认证的了
type
:
0
,
//判断是否是认证的了
approveList
:
[
'园区门票优惠'
,
'餐厅价格优惠'
,
'SPA服务优惠'
,
'免费观看电影'
,
'无须预约入园'
,
'尽享多重特权'
],
approveList
:
[
'园区门票优惠'
,
'餐厅价格优惠'
,
'SPA服务优惠'
,
'免费观看电影'
,
'无须预约入园'
,
'尽享多重特权'
],
...
@@ -112,28 +112,39 @@ Page({
...
@@ -112,28 +112,39 @@ Page({
url
:
'/pages/pay/coupon-input/coupon-input'
,
url
:
'/pages/pay/coupon-input/coupon-input'
,
})
})
},
},
setUserInfo
:
function
()
{
setUserInfo
:
function
()
{
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
if
(
funcUserInfo
.
phone
&&
funcUserInfo
.
name
&&
funcUserInfo
.
avatar
)
{
// 已为登录状态
if
(
funcUserInfo
.
isSignIn
)
{
funcUserInfo
.
phone
=
this
.
toHide
(
funcUserInfo
.
phone
)
funcUserInfo
.
phone
=
this
.
toHide
(
funcUserInfo
.
phone
)
let
funcStatusText
=
''
switch
(
funcUserInfo
.
status
)
{
case
''
:
funcStatusText
=
'去认证'
break
case
0
:
funcStatusText
=
'审核中'
break
case
1
:
funcStatusText
=
'审核通过 '
break
case
2
:
funcStatusText
=
'审核失败'
break
}
this
.
setData
({
this
.
setData
({
type
:
funcUserInfo
.
userType
,
statusText
:
funcStatusText
,
isRegister
:
true
,
isRegister
:
true
,
userInfo
:
funcUserInfo
userInfo
:
funcUserInfo
})
})
this
.
getMyActivityList
()
App
.
login
({
success
:
(
token
)
=>
{
this
.
getMyActivityList
()
// this.getList()
this
.
getAuth
()
}
})
let
funcUserType
=
funcUserInfo
.
userType
this
.
setData
({
type
:
funcUserType
===
1
?
1
:
0
,
})
}
else
{
}
else
{
this
.
setData
({
this
.
setData
({
isRegister
:
false
,
isRegister
:
false
,
...
@@ -141,7 +152,6 @@ Page({
...
@@ -141,7 +152,6 @@ Page({
}
}
},
},
// 登录注册页
// 登录注册页
checkRegister
()
{
checkRegister
()
{
if
(
this
.
data
.
isRegister
)
{
if
(
this
.
data
.
isRegister
)
{
...
@@ -297,50 +307,11 @@ Page({
...
@@ -297,50 +307,11 @@ Page({
})
})
},
},
// 获取业主认证信息
getAuth
()
{
App
.
wxRequest
({
url
:
'/api/v1/userAuth/getAuth'
,
method
:
'GET'
,
success
:
(
res
)
=>
{
let
state
=
res
.
data
.
state
*
1
// 0 待审核 1 审核通过 2 不通过
let
stateTest
=
'去认证'
switch
(
state
)
{
case
0
:
stateTest
=
'审核中'
break
case
1
:
stateTest
=
'审核通过 '
break
case
2
:
stateTest
=
'审核失败'
break
}
this
.
setData
({
type
:
state
==
1
?
1
:
0
,
stateTest
:
stateTest
,
})
let
funcUserInfo
=
wx
.
getStorageSync
(
'userInfo'
)
funcUserInfo
.
userType
=
state
wx
.
setStorageSync
(
'userInfo'
,
funcUserInfo
)
}
})
},
toHide
:
function
(
array
)
{
toHide
:
function
(
array
)
{
var
mphone
=
array
.
substring
(
0
,
3
)
+
'****'
+
array
.
substring
(
7
);
var
mphone
=
array
.
substring
(
0
,
3
)
+
'****'
+
array
.
substring
(
7
);
return
mphone
;
return
mphone
;
},
},
// 二期代码
// 二期代码
onOrder
:
function
()
{
onOrder
:
function
()
{
console
.
log
(
'onOrder'
)
console
.
log
(
'onOrder'
)
...
...
pages/mine/home/home.wxml
View file @
538f3685
<navigation class="navigation" titleText="我的" color="{{type == 1? '#FFFFFF' :''}}"></navigation>
<navigation class="navigation" titleText="我的" color="{{type == 1? '#FFFFFF' :''}}"></navigation>
<view class="container">
<view class="container">
<view class="mine" wx:if="{{type
== 0
}}">
<view class="mine" wx:if="{{type
!== 1
}}">
<image class="background-image" src="./image/mine.png"></image>
<image class="background-image" src="./image/mine.png"></image>
<view class="row align-c">
<view class="row align-c">
<view class="mine-avatar" bindtap="checkRegister">
<view class="mine-avatar" bindtap="checkRegister">
...
@@ -58,15 +58,15 @@
...
@@ -58,15 +58,15 @@
</view>
</view>
<view class="status row con-b align-c" wx:if="{{type
== 0
}}">
<view class="status row con-b align-c" wx:if="{{type
!== 1
}}">
<view class="status-symbol col">
<view class="status-symbol col">
<text>业主认证</text>
<text>业主认证</text>
<text>享受业主尊贵特权,预定消费专属优惠</text>
<text>享受业主尊贵特权,预定消费专属优惠</text>
</view>
</view>
<view class="status-operation row con-c align-c" bindtap="goApprove">
<view class="status-operation row con-c align-c" bindtap="goApprove">
<image wx:if="{{stat
eTes
t == '审核失败'}}" src="/image/fail-icon.png"></image>
<image wx:if="{{stat
usTex
t == '审核失败'}}" src="/image/fail-icon.png"></image>
<image wx:if="{{stat
eTes
t == '审核中'}}" src="/image/sh-icon.png"></image>
<image wx:if="{{stat
usTex
t == '审核中'}}" src="/image/sh-icon.png"></image>
<text>{{stat
eTes
t}}</text>
<text>{{stat
usTex
t}}</text>
</view>
</view>
</view>
</view>
...
@@ -292,57 +292,6 @@
...
@@ -292,57 +292,6 @@
<text>客服中心</text>
<text>客服中心</text>
<image src="{{imageBase + 'icon/arrow-r-2.png'}}"></image>
<image src="{{imageBase + 'icon/arrow-r-2.png'}}"></image>
</view>
</view>
<!-- <l-list l-content-class="menu-title" l-class="listClass" bind:lintap="myActivity">
<view slot="left-section">
<image class="fontImg" src="./image/myactive.png"></image>
</view>
</l-list> -->
<!-- 我的活动 -->
<!-- <view class="my-activities" wx:if="{{activityList.length > 0}}">
<view class="my-activities-item" data-enrollid="{{item.enrollId}}" wx:for="{{activityList}}" wx:for-index="index" wx:for-item="item" wx:key="index" bindtap="activityDetail">
<view class="my-activities-top">
<text decode="{{true}}"> {{item.time}} </text>
</view>
<view class="my-activities-bottom">
<view class="my-activities-title" style="padding-top:70rpx;">{{item.title}}</view>
<view class="my-activities-content">{{item.content}}</view>
</view>
</view>
<view class="my-activities-item"></view>
</view> -->
<!-- <l-list l-content-class="menu-title" l-class="listClass" bind:lintap="myAppointment">
<view slot="left-section">
<image class="fontImg" src="./image/myappion.png"></image>
</view>
</l-list> -->
<!-- 我的预约 -->
<!-- <view class="my-activities" wx:if="{{appointmentList.length > 0}}">
<view class="my-activities-item" wx:for="{{appointmentList}}" wx:for-index="index" wx:for-item="item" wx:key="index">
<view class="my-activities-top">
<view class="my-activities-top">
<text decode="{{true}}"> {{item.time}} </text>
</view>
</view>
<view class="my-activities-bottom">
<view class="my-activities-bottom-view">
<view class="my-activities-title">{{item.title}}</view>
<view class="my-activities-content" wx:if="{{item.type == 0}}">预约人数 {{item.num}}人</view>
</view>
<view class="subscribe" data-item="{{item}}" bindtap="gohotelAccommodation">预约凭证</view>
</view>
</view>
<view class="my-activities-item"></view>
</view> -->
<!-- <l-list l-content-class="menu-title" l-class="listClass" bind:lintap="customerService">
<view slot="left-section">
<image class="fontImg" src="./image/mycustom@2x.png"></image>
</view>
</l-list> -->
</view>
</view>
</view>
</view>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment