Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gk
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
micro_app
gk
Commits
df407de8
Commit
df407de8
authored
Jul 05, 2020
by
yangshuxing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
调整成绩规则,默认排序
parent
2d59ca38
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
156 additions
and
19 deletions
+156
-19
SecurityInterceptor.java
...dlbridge/jadp/common/interceptor/SecurityInterceptor.java
+4
-3
application-beta.properties
src/main/resources/application-beta.properties
+110
-0
application-dev.properties
src/main/resources/application-dev.properties
+5
-2
application-production.properties
src/main/resources/application-production.properties
+3
-1
application-test.properties
src/main/resources/application-test.properties
+3
-1
bootstrap.yml
src/main/resources/bootstrap.yml
+16
-2
menu.jsp
src/main/webapp/WEB-INF/views/common/menu.jsp
+4
-1
score_review.js
src/main/webapp/static/js/score_review.js
+11
-9
No files found.
src/main/java/com/dlbridge/jadp/common/interceptor/SecurityInterceptor.java
View file @
df407de8
...
@@ -6,10 +6,9 @@ package com.dlbridge.jadp.common.interceptor;
...
@@ -6,10 +6,9 @@ package com.dlbridge.jadp.common.interceptor;
import
com.dlbridge.jadp.common.service.JService
;
import
com.dlbridge.jadp.common.service.JService
;
import
com.dlbridge.jadp.plugins.cmpt.bean.exception.NoAuthException
;
import
com.dlbridge.jadp.plugins.cmpt.bean.exception.NoAuthException
;
import
com.neusoft.www.utils.web.RequestParamHelper
;
import
com.neusoft.www.utils.web.RequestParamHelper
;
import
lombok.extern.log4j.Log4j
;
import
lombok.extern.log4j.Log4j2
;
import
lombok.extern.log4j.Log4j2
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.math.NumberUtils
;
import
org.apache.commons.lang3.math.NumberUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.util.DigestUtils
;
import
org.springframework.web.method.HandlerMethod
;
import
org.springframework.web.method.HandlerMethod
;
...
@@ -19,7 +18,6 @@ import org.springframework.web.servlet.ModelAndView;
...
@@ -19,7 +18,6 @@ import org.springframework.web.servlet.ModelAndView;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
import
java.lang.reflect.Method
;
import
java.lang.reflect.Method
;
import
java.util.Random
;
//import com.dlbridge.jadp.common.utils.LogUtils;
//import com.dlbridge.jadp.common.utils.LogUtils;
...
@@ -33,6 +31,8 @@ import java.util.Random;
...
@@ -33,6 +31,8 @@ import java.util.Random;
@Log4j2
@Log4j2
public
class
SecurityInterceptor
extends
JService
implements
HandlerInterceptor
{
public
class
SecurityInterceptor
extends
JService
implements
HandlerInterceptor
{
@Value
(
"${base.url}"
)
private
String
domain
;
@Override
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
...
@@ -96,6 +96,7 @@ public class SecurityInterceptor extends JService implements HandlerInterceptor
...
@@ -96,6 +96,7 @@ public class SecurityInterceptor extends JService implements HandlerInterceptor
modelAndView
.
addObject
(
"cId"
,
cmptId
);
modelAndView
.
addObject
(
"cId"
,
cmptId
);
modelAndView
.
addObject
(
"uId"
,
uId
);
modelAndView
.
addObject
(
"uId"
,
uId
);
modelAndView
.
addObject
(
"sign"
,
new
String
(
DigestUtils
.
md5DigestAsHex
((
"cId="
+
cmptId
+
"×tamp="
+
timestamp
+
"&uId="
+
uId
).
getBytes
())));
modelAndView
.
addObject
(
"sign"
,
new
String
(
DigestUtils
.
md5DigestAsHex
((
"cId="
+
cmptId
+
"×tamp="
+
timestamp
+
"&uId="
+
uId
).
getBytes
())));
modelAndView
.
addObject
(
"baseURL"
,
domain
);
}
}
}
}
...
...
src/main/resources/application-beta.properties
0 → 100644
View file @
df407de8
spring.datasource.type
=
com.alibaba.druid.pool.DruidDataSource
spring.datasource.password
=
mysql_master_geexek_408
spring.datasource.username
=
mysql_master
spring.datasource.driver-class-name
=
com.mysql.jdbc.Driver
spring.datasource.url
=
jdbc:mysql://rm-bp15ojs1ys1eur32zwo.mysql.rds.aliyuncs.com:3306/gksite?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
mybatis.typeAliasesPackage
=
com.dlbridge.jadp.plugins
mybatis.mapperLocations
=
classpath:com/dlbridge/jadp/**/**.xml
mybatis.configuration.map-underscore-to-camel-case
=
true
mybatis.configuration.jdbc-type-for-null
=
null
server.port
=
9801
charset_name
=
UTF-8
#\u8BBE\u7F6E\u73AF\u5883\u914D\u7F6E
#spring.profiles.active=dev
#http encoding
spring.http.encoding.charset
=
UTF-8
spring.http.encoding.enabled
=
true
spring.http.encoding.force
=
true
logging.file
=
./logs/gksite.log
#\u5173\u95ED\u542F\u52A8Logo
spring.main.banner-mode
=
off
#\u4ea7\u54c1\u4fe1\u606f\u8bbe\u7f6e
productName
=
jBridge
\u
5feb
\u
901f
\u
5f00
\u
53d1
\u
5e73
\u
53f0
#\u8BBE\u7F6Emvc\u9875\u9762\u8DF3\u8F6C
spring.mvc.view.prefix
=
/WEB-INF/views/
spring.mvc.view.suffix
=
.jsp
spring.freemarker.template-loader-path
=
classpath:/templates
spring.resources.static-locations
=
/static/
spring.mvc.static-path-pattern
=
/**
security.basic.enabled
=
false
management.security.enabled
=
false
##scheduler
spring.task.scheduler.pool
=
10
spring.task.thread
=
spring-task-thread
#\u542F\u52A8\u62A5\u9519class path resource [processes/] cannot be resolved to URL because it does not exist
spring.activiti.check-process-definitions
=
false
#\u5206\u9875\u914d\u7f6e
page.pageSize
=
30
#pagehelper\u5206\u9875\u63D2\u4EF6\u914D\u7F6E
pagehelper.helperDialect
=
mysql
pagehelper.reasonable
=
true
pagehelper.supportMethodsArguments
=
true
pagehelper.params
=
count=countSql
weixin.micro.appid
=
wxf599f7763ad997c5
weixin.micro.secret
=
adc1789fddbaef7cf5b38f60b956529b
geexek.user.url
=
https://www.geexek.com/
geexek.cmpt.url
=
http://timerbackend.geexek.com/
geexek.shamus.url
=
http://shamus.geexek.com/
server.url
=
http://zs.geexek.com/
timer.url
=
http://timer.geexek.com/
server.url.https
=
https://zs.geexek.com/
spring.redis.cluster.max-redirects
=
3
spring.redis.cluster.nodes
=
10.29.114.167:7001,10.29.114.167:7002,10.29.114.167:7003
spring.servlet.multipart.max-file-size
=
10Mb
spring.servlet.multipart.enabled
=
true
spring.servlet.multipart.max-request-size
=
50Mb
eureka.client.register-with-eureka
=
true
eureka.client.fetch-registry
=
true
spring.application.name
=
micro-gksite
eureka.client.service-url.defaultZone
=
http://10.29.116.151:8020/eureka/
eureka.client.instance.instance-id
=
micro-gksite
eureka.instance.hostname
=
micro-gksite
ribbon.eureka.enable
=
true
eureka.instance.lease-renewal-interval-in-seconds
=
2
eureka.instance.lease-expiration-duration-in-seconds
=
5
#feign调用连接超时时间
feign.client.config.default.connect-timeout
=
2000
#feign调用读取超时时间
feign.client.config.default.readTimeout
=
2000
#feign调用的log 等级
feign.client.config.default.loggerLevel
=
basic
feign.okhttp.enabled
=
true
feign.hystrix.enabled
=
true
#feign.compression.request.enabled=true
#feign.compression.request.mime-types=text/xml,application/xml,application/json
#feign.compression.request.min-request-size=2048
hystrix.metrics.enabled
=
true
hystrix.command.default.execution.timeout.enabled
=
true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
=
2000
hystrix.threadpool.default.coreSize
=
200
hystrix.threadpool.default.maxQueueSize
=
1000
hystrix.threadpool.default.queueSizeRejectionThreshold
=
800
logging.level.com.dlbridge.feign.NewsService
=
info
logging.level.org.springframework.cloud.openfeign
=
info
spring.zipkin.base-url
=
http://10.29.116.151:9001
spring.sleuth.sampler.probability
=
0.1
spring.zipkin.sender.type
=
web
swagger.enable
=
false
spring.cloud.nacos.server-addr
=
http://nacos.geexek.com.cn
spring.cloud.nacos.discovery.group
=
test
#spring.cloud.sentinel.servlet.blockPage=test
spring.cloud.sentinel.transport.dashboard
=
https://sentinel.geexek.com
spring.cloud.sentinel.transport.port
=
8719
spring.cloud.sentinel.eager
=
true
spring.cloud.sentinel.filter.enabled
=
false
spring.cloud.sentinel.skip-keys
=
cmptId
spring.cloud.sentinel.exclude-urls
=
/static/**,**.css,**.js
## nacos 地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr
=
http://nacos.geexek.com.cn
spring.cloud.sentinel.datasource.ds.nacos.dataId
=
micro-gksite-sentinel
spring.cloud.sentinel.datasource.ds.nacos.data-type
=
json
spring.cloud.sentinel.datasource.ds.nacos.groupId
=
test
#spring.cloud.sentinel.datasource.ds1.nacos.namespace=fad8a39-a3e7-49a1-ae96-0f7aaf39136b
#
## 规则类型
spring.cloud.sentinel.datasource.ds.nacos.rule-type
=
flow
\ No newline at end of file
src/main/resources/application-dev.properties
View file @
df407de8
...
@@ -53,7 +53,7 @@ geexek.cmpt.url=https://testtimerbackend.geexek.cn/
...
@@ -53,7 +53,7 @@ geexek.cmpt.url=https://testtimerbackend.geexek.cn/
geexek.shamus.url
=
http://shamus.geexek.com.cn/
geexek.shamus.url
=
http://shamus.geexek.com.cn/
timer.url
=
http://testtimer.geexek.cn/
timer.url
=
http://testtimer.geexek.cn/
server.url
=
http://testzs.geexek.com.cn/
server.url
=
http://testzs.geexek.com.cn/
server.url.https
=
http
s://testzs.geexek.com.cn
/
server.url.https
=
http
://localhost:9090
/
###redis
###redis
spring.redis.port
=
6379
spring.redis.port
=
6379
spring.redis.host
=
localhost
spring.redis.host
=
localhost
...
@@ -98,7 +98,7 @@ spring.cloud.sentinel.skip-keys=cmptId
...
@@ -98,7 +98,7 @@ spring.cloud.sentinel.skip-keys=cmptId
spring.cloud.sentinel.exclude-urls
=
/static/**,**.css,**.js
spring.cloud.sentinel.exclude-urls
=
/static/**,**.css,**.js
## nacos 地址
## nacos 地址
spring.cloud.sentinel.datasource.ds.nacos.server-addr
=
192.168.
0.119
:8848
spring.cloud.sentinel.datasource.ds.nacos.server-addr
=
192.168.
1.105
:8848
spring.cloud.sentinel.datasource.ds.nacos.dataId
=
micro-gksite-sentinel
spring.cloud.sentinel.datasource.ds.nacos.dataId
=
micro-gksite-sentinel
spring.cloud.sentinel.datasource.ds.nacos.data-type
=
json
spring.cloud.sentinel.datasource.ds.nacos.data-type
=
json
spring.cloud.sentinel.datasource.ds.nacos.groupId
=
dev
spring.cloud.sentinel.datasource.ds.nacos.groupId
=
dev
...
@@ -106,3 +106,6 @@ spring.cloud.sentinel.datasource.ds.nacos.groupId=dev
...
@@ -106,3 +106,6 @@ spring.cloud.sentinel.datasource.ds.nacos.groupId=dev
#
#
## 规则类型
## 规则类型
spring.cloud.sentinel.datasource.ds.nacos.rule-type
=
flow
spring.cloud.sentinel.datasource.ds.nacos.rule-type
=
flow
base.url
=
http://localhost:8080
\ No newline at end of file
src/main/resources/application-production.properties
View file @
df407de8
...
@@ -86,3 +86,5 @@ spring.zipkin.base-url=http://10.29.116.151:9001
...
@@ -86,3 +86,5 @@ spring.zipkin.base-url=http://10.29.116.151:9001
spring.sleuth.sampler.probability
=
0.1
spring.sleuth.sampler.probability
=
0.1
spring.zipkin.sender.type
=
web
spring.zipkin.sender.type
=
web
swagger.enable
=
false
swagger.enable
=
false
base.url
=
https://zs.geexek.com/
\ No newline at end of file
src/main/resources/application-test.properties
View file @
df407de8
...
@@ -101,3 +101,5 @@ spring.cloud.sentinel.datasource.ds.nacos.groupId=test
...
@@ -101,3 +101,5 @@ spring.cloud.sentinel.datasource.ds.nacos.groupId=test
#
#
## 规则类型
## 规则类型
spring.cloud.sentinel.datasource.ds.nacos.rule-type
=
flow
spring.cloud.sentinel.datasource.ds.nacos.rule-type
=
flow
base.url
=
http://testzs.geexek.com.cn/
\ No newline at end of file
src/main/resources/bootstrap.yml
View file @
df407de8
...
@@ -4,11 +4,11 @@ spring:
...
@@ -4,11 +4,11 @@ spring:
cloud
:
cloud
:
nacos
:
nacos
:
config
:
config
:
server-addr
:
http://192.168.
0.119
:8848
server-addr
:
http://192.168.
1.105
:8848
file-extension
:
properties
file-extension
:
properties
group
:
dev
group
:
dev
namespace
:
187c2f4d-80c2-4a67-b4e5-319d5c9151d1
namespace
:
187c2f4d-80c2-4a67-b4e5-319d5c9151d1
server-addr
:
http://192.168.
0.119
:8848
server-addr
:
http://192.168.
1.105
:8848
discovery
:
discovery
:
group
:
dev
group
:
dev
namespace
:
187c2f4d-80c2-4a67-b4e5-319d5c9151d1
namespace
:
187c2f4d-80c2-4a67-b4e5-319d5c9151d1
...
@@ -27,6 +27,20 @@ spring:
...
@@ -27,6 +27,20 @@ spring:
group
:
test
group
:
test
namespace
:
adbadd76-45e9-4214-9ffc-1aadfb1c5039
namespace
:
adbadd76-45e9-4214-9ffc-1aadfb1c5039
---
---
spring
:
profiles
:
bata
cloud
:
nacos
:
config
:
server-addr
:
http://nacos.geexek.com.cn
file-extension
:
properties
group
:
test
namespace
:
adbadd76-45e9-4214-9ffc-1aadfb1c5039
server-addr
:
http://nacos.geexek.com.cn
discovery
:
group
:
test
namespace
:
adbadd76-45e9-4214-9ffc-1aadfb1c5039
---
spring
:
spring
:
profiles
:
production
profiles
:
production
cloud
:
cloud
:
...
...
src/main/webapp/WEB-INF/views/common/menu.jsp
View file @
df407de8
...
@@ -189,7 +189,7 @@
...
@@ -189,7 +189,7 @@
</li>
</li>
</ul>
</ul>
</li>
</li>
</ul>
<ul>
<ul>
<li
class=
"base menu-item"
>
<li
class=
"base menu-item"
>
<a
href=
"#"
>
<a
href=
"#"
>
...
@@ -241,6 +241,7 @@
...
@@ -241,6 +241,7 @@
</ul>
</ul>
</li>
</li>
</ul>
</ul>
</ul>
</nav>
</nav>
<script>
<script>
var
classes
=
[
'cmptSetting'
,
'nameList'
,
'manual'
,
'contact'
,
'manage'
,
var
classes
=
[
'cmptSetting'
,
'nameList'
,
'manual'
,
'contact'
,
'manage'
,
...
@@ -282,4 +283,6 @@
...
@@ -282,4 +283,6 @@
function
getSign
()
{
function
getSign
()
{
return
document
.
getElementById
(
"sign"
).
value
;
return
document
.
getElementById
(
"sign"
).
value
;
}
}
window
.
baseURL
=
'${baseURL}'
;
</script>
</script>
\ No newline at end of file
src/main/webapp/static/js/score_review.js
View file @
df407de8
...
@@ -123,7 +123,7 @@ var score = new Vue({
...
@@ -123,7 +123,7 @@ var score = new Vue({
return
;
return
;
}
}
$
.
ajax
({
$
.
ajax
({
url
:
"http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreDetails?scoreId="
+
id
,
url
:
baseURL
+
"
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreDetails?scoreId="
+
id
,
success
:
function
(
data
)
{
success
:
function
(
data
)
{
if
(
data
.
code
==
200
){
if
(
data
.
code
==
200
){
if
(
data
.
data
.
length
==
0
){
if
(
data
.
data
.
length
==
0
){
...
@@ -159,7 +159,7 @@ var score = new Vue({
...
@@ -159,7 +159,7 @@ var score = new Vue({
return
;
return
;
}
}
$
.
ajax
({
$
.
ajax
({
url
:
'http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rule-scoreinfo/deleteScoreInfos'
,
url
:
baseURL
+
'
geexekscore/api/v1/cmpt-score-rule-scoreinfo/deleteScoreInfos'
,
data
:{
ids
:
delIds
.
join
(
","
)},
data
:{
ids
:
delIds
.
join
(
","
)},
type
:
'post'
,
type
:
'post'
,
success
:
function
(
data
)
{
success
:
function
(
data
)
{
...
@@ -203,7 +203,7 @@ var reviewPage = {
...
@@ -203,7 +203,7 @@ var reviewPage = {
score
.
$data
.
param
.
origin
=
score
.
$data
.
selectedOrigin
;
score
.
$data
.
param
.
origin
=
score
.
$data
.
selectedOrigin
;
score
.
$data
.
param
.
keyword
=
score
.
$data
.
searchWord
;
score
.
$data
.
param
.
keyword
=
score
.
$data
.
searchWord
;
$
.
ajax
({
$
.
ajax
({
url
:
'http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreInfo'
,
url
:
baseURL
+
'
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreInfo'
,
data
:
score
.
$data
.
param
,
data
:
score
.
$data
.
param
,
type
:
'post'
,
type
:
'post'
,
beforeSend
:
function
(){
beforeSend
:
function
(){
...
@@ -224,9 +224,11 @@ var reviewPage = {
...
@@ -224,9 +224,11 @@ var reviewPage = {
score
.
$data
.
reviewCount
.
nopass
=
data
.
data
.
total
;
score
.
$data
.
reviewCount
.
nopass
=
data
.
data
.
total
;
}
}
reviewPage
.
getStatistic
();
reviewPage
.
getStatistic
();
setTimeout
(
function
()
{
$
.
each
(
$
(
'input:checked'
),
function
(
i
,
e
)
{
$
.
each
(
$
(
'input:checked'
),
function
(
i
,
e
)
{
e
.
checked
=
false
e
.
checked
=
false
})
})
},
800
)
}
}
},
},
complete
:
function
()
{
complete
:
function
()
{
...
@@ -236,7 +238,7 @@ var reviewPage = {
...
@@ -236,7 +238,7 @@ var reviewPage = {
},
},
getStatistic
:
function
(){
getStatistic
:
function
(){
$
.
ajax
({
$
.
ajax
({
url
:
'http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreInfoStatistics?cmptId='
+
getCId
()
+
'&roadId='
+
url
:
baseURL
+
'
geexekscore/api/v1/cmpt-score-rule-scoreinfo/getCmptScoreRuleScoreInfoStatistics?cmptId='
+
getCId
()
+
'&roadId='
+
score
.
$data
.
selectedRoadId
score
.
$data
.
selectedRoadId
+
'&origin='
+
score
.
$data
.
selectedOrigin
+
"&keyword="
+
score
.
$data
.
searchWord
,
+
'&origin='
+
score
.
$data
.
selectedOrigin
+
"&keyword="
+
score
.
$data
.
searchWord
,
type
:
'post'
,
type
:
'post'
,
...
@@ -272,7 +274,7 @@ var reviewPage = {
...
@@ -272,7 +274,7 @@ var reviewPage = {
var
param
=
{
cmptId
:
getCId
(),
'checkstatus'
:
score
.
$data
.
param
.
checkstatus
,
var
param
=
{
cmptId
:
getCId
(),
'checkstatus'
:
score
.
$data
.
param
.
checkstatus
,
roadId
:
score
.
$data
.
selectedRoadId
,
passedIds
:
passedIds
.
join
(
','
),
noPassedIds
:
noPassedIds
.
join
(
','
)};
roadId
:
score
.
$data
.
selectedRoadId
,
passedIds
:
passedIds
.
join
(
','
),
noPassedIds
:
noPassedIds
.
join
(
','
)};
$
.
ajax
({
$
.
ajax
({
url
:
'http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rule-scoreinfo/uploadCmptScoreRuleScoreInfo'
,
url
:
baseURL
+
'
geexekscore/api/v1/cmpt-score-rule-scoreinfo/uploadCmptScoreRuleScoreInfo'
,
data
:
param
,
data
:
param
,
beforeSend
:
function
(){
beforeSend
:
function
(){
layer
.
load
();
layer
.
load
();
...
@@ -310,7 +312,7 @@ $(document).ready(function () {
...
@@ -310,7 +312,7 @@ $(document).ready(function () {
});
});
})
})
$
(
'.export-btn'
).
click
(
function
()
{
$
(
'.export-btn'
).
click
(
function
()
{
window
.
open
(
"http://testzs.geexek.com.cn/
geexekscore/api/v1/cmpt-score-rank/export/"
+
getCId
())
window
.
open
(
baseURL
+
"
geexekscore/api/v1/cmpt-score-rank/export/"
+
getCId
())
})
})
reviewPage
.
getRoads
();
reviewPage
.
getRoads
();
});
});
\ No newline at end of file
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