Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
lwby_copyright_book_data
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
maliang
lwby_copyright_book_data
Commits
fdede6c5
Commit
fdede6c5
authored
Apr 22, 2020
by
maliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
权限控制
parent
f2431209
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
348 additions
and
130 deletions
+348
-130
WebMvcConfig.java
...in/java/com/boot/security/server/config/WebMvcConfig.java
+1
-0
AdvertiserManagerController.java
...curity/server/controller/AdvertiserManagerController.java
+34
-3
AdvertDao.java
src/main/java/com/boot/security/server/dao/AdvertDao.java
+18
-0
AdvertiserData.java
...n/java/com/boot/security/server/model/AdvertiserData.java
+85
-0
PageTableHandler.java
...com/boot/security/server/page/table/PageTableHandler.java
+18
-0
PageTableRequest.java
...com/boot/security/server/page/table/PageTableRequest.java
+18
-0
PageTableResponse.java
...om/boot/security/server/page/table/PageTableResponse.java
+1
-0
jq.js
src/main/resources/static/js/jq.js
+16
-0
advertiserData.html
...ources/static/pages/advertiserManager/advertiserData.html
+78
-0
advertiserDataCount.html
...s/static/pages/advertiserManager/advertiserDataCount.html
+79
-0
advertiserManager.html
...ces/static/pages/advertiserManager/advertiserManager.html
+0
-1
AdvertiserUserList2.html
...main/resources/static/pages/user/AdvertiserUserList2.html
+0
-126
No files found.
src/main/java/com/boot/security/server/config/WebMvcConfig.java
View file @
fdede6c5
...
...
@@ -62,4 +62,5 @@ public class WebMvcConfig implements WebMvcConfigurer {
.
addResourceLocations
(
ResourceUtils
.
FILE_URL_PREFIX
+
filesPath
+
File
.
separator
);
}
}
src/main/java/com/boot/security/server/controller/AdvertiserManagerController.java
View file @
fdede6c5
...
...
@@ -3,13 +3,27 @@ package com.boot.security.server.controller;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.boot.security.server.dao.AdvertDao
;
import
com.boot.security.server.model.AdvertiserData
;
import
com.boot.security.server.page.table.PageTableHandler
;
import
com.boot.security.server.page.table.PageTableRequest
;
import
com.boot.security.server.page.table.PageTableResponse
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
@RestController
@RequestMapping
(
"/advertiserManagerController"
)
public
class
AdvertiserManagerController
{
@Autowired
private
AdvertDao
advertDao
;
@GetMapping
(
"/table"
)
@ApiOperation
(
value
=
"获取广告商数据"
)
@ResponseBody
...
...
@@ -31,8 +45,25 @@ public class AdvertiserManagerController {
jsonObject
.
put
(
"data"
,
array
);
return
jsonObject
.
toJSONString
();
}
//返回所有用户和其对应的广告商列表
public
String
getUserAdvertiserMap
()
{
return
null
;
//返回根据日期返回所有广告商数据
@PreAuthorize
(
"hasAuthority('advert:data:count')"
)
@PostMapping
(
"/advertCount"
)
@ApiOperation
(
value
=
"获取广告商汇总数据"
)
@ResponseBody
public
String
getAdvertiserDataCount
(
@RequestBody
PageTableRequest
request
)
{
List
<
AdvertiserData
>
advertDataList
=
advertDao
.
getAdvertData
(
request
.
getStartTime
(),
request
.
getEndTime
());
Integer
count
=
advertDao
.
getAdvertDataCount
(
request
.
getStartTime
(),
request
.
getEndTime
());
return
PageTableHandler
.
getJSONObject
(
advertDataList
,
count
);
}
//返回根据日期返回所有广告商数据
@PreAuthorize
(
"hasAuthority('advertiser:data')"
)
@PostMapping
(
"/advertiserData"
)
@ApiOperation
(
value
=
"获取广告商汇总数据"
)
@ResponseBody
public
String
getAdvertiserData
(
@RequestBody
PageTableRequest
request
)
{
List
<
AdvertiserData
>
advertDataList
=
advertDao
.
getAdvertData
(
request
.
getStartTime
(),
request
.
getEndTime
());
Integer
count
=
advertDao
.
getAdvertDataCount
(
request
.
getStartTime
(),
request
.
getEndTime
());
return
PageTableHandler
.
getJSONObject
(
advertDataList
,
count
);
}
}
src/main/java/com/boot/security/server/dao/AdvertDao.java
0 → 100644
View file @
fdede6c5
package
com
.
boot
.
security
.
server
.
dao
;
import
com.boot.security.server.model.AdvertiserData
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Select
;
import
java.util.List
;
import
java.util.Map
;
@Mapper
public
interface
AdvertDao
{
@Select
(
"select report_date reportDate,advertiser_id advertiserId,advertiser_name advertiserName,code_id codeId,ecpm,cpc,exposure,click,income from advert_data_count t where report_date>= #{startTime} and report_date<=#{endTime}"
)
List
<
AdvertiserData
>
getAdvertData
(
@Param
(
"startTime"
)
String
startTime
,
@Param
(
"endTime"
)
String
endTime
);
@Select
(
"select count(*) from advert_data_count t where report_date>= #{startTime} and report_date<=#{endTime}"
)
Integer
getAdvertDataCount
(
@Param
(
"startTime"
)
String
startTime
,
@Param
(
"endTime"
)
String
endTime
);
}
src/main/java/com/boot/security/server/model/AdvertiserData.java
0 → 100644
View file @
fdede6c5
package
com
.
boot
.
security
.
server
.
model
;
public
class
AdvertiserData
{
public
String
reportDate
;
public
Integer
advertiserId
;
public
String
advertiserName
;
public
String
codeId
;
public
Double
ecpm
;
public
Double
cpc
;
public
Long
exposure
;
public
Long
click
;
public
Double
income
;
public
String
getReportDate
()
{
return
reportDate
;
}
public
void
setReportDate
(
String
reportDate
)
{
this
.
reportDate
=
reportDate
;
}
public
Integer
getAdvertiserId
()
{
return
advertiserId
;
}
public
void
setAdvertiserId
(
Integer
advertiserId
)
{
this
.
advertiserId
=
advertiserId
;
}
public
String
getAdvertiserName
()
{
return
advertiserName
;
}
public
void
setAdvertiserName
(
String
advertiserName
)
{
this
.
advertiserName
=
advertiserName
;
}
public
String
getCodeId
()
{
return
codeId
;
}
public
void
setCodeId
(
String
codeId
)
{
this
.
codeId
=
codeId
;
}
public
Double
getEcpm
()
{
return
ecpm
;
}
public
void
setEcpm
(
Double
ecpm
)
{
this
.
ecpm
=
ecpm
;
}
public
Double
getCpc
()
{
return
cpc
;
}
public
void
setCpc
(
Double
cpc
)
{
this
.
cpc
=
cpc
;
}
public
Long
getExposure
()
{
return
exposure
;
}
public
void
setExposure
(
Long
exposure
)
{
this
.
exposure
=
exposure
;
}
public
Long
getClick
()
{
return
click
;
}
public
void
setClick
(
Long
click
)
{
this
.
click
=
click
;
}
public
Double
getIncome
()
{
return
income
;
}
public
void
setIncome
(
Double
income
)
{
this
.
income
=
income
;
}
}
src/main/java/com/boot/security/server/page/table/PageTableHandler.java
View file @
fdede6c5
package
com
.
boot
.
security
.
server
.
page
.
table
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
import
com.boot.security.server.model.AdvertiserData
;
import
java.util.ArrayList
;
import
java.util.Iterator
;
import
java.util.List
;
/**
...
...
@@ -27,6 +32,19 @@ public class PageTableHandler {
this
.
orderHandler
=
orderHandler
;
}
public
static
<
E
>
String
getJSONObject
(
List
<
E
>
list
,
Integer
count
){
JSONObject
jsonObject
=
new
JSONObject
();
JSONArray
array
=
new
JSONArray
();
Iterator
<
E
>
iterator
=
list
.
iterator
();
while
(
iterator
.
hasNext
()){
array
.
add
(
JSONObject
.
toJSON
(
iterator
.
next
()));
}
jsonObject
.
put
(
"data"
,
array
);
jsonObject
.
put
(
"count"
,
count
);
jsonObject
.
put
(
"code"
,
0
);
return
jsonObject
.
toJSONString
();
}
public
PageTableResponse
handle
(
PageTableRequest
dtRequest
)
{
int
count
=
0
;
List
<?>
list
=
null
;
...
...
src/main/java/com/boot/security/server/page/table/PageTableRequest.java
View file @
fdede6c5
...
...
@@ -16,6 +16,24 @@ public class PageTableRequest implements Serializable {
private
Integer
offset
;
private
Integer
limit
;
private
Map
<
String
,
Object
>
params
;
private
String
startTime
;
private
String
endTime
;
public
String
getStartTime
()
{
return
startTime
;
}
public
void
setStartTime
(
String
startTime
)
{
this
.
startTime
=
startTime
;
}
public
String
getEndTime
()
{
return
endTime
;
}
public
void
setEndTime
(
String
endTime
)
{
this
.
endTime
=
endTime
;
}
public
Integer
getOffset
()
{
return
offset
;
...
...
src/main/java/com/boot/security/server/page/table/PageTableResponse.java
View file @
fdede6c5
...
...
@@ -17,6 +17,7 @@ public class PageTableResponse implements Serializable {
private
Integer
recordsFiltered
;
private
List
<?>
data
;
public
PageTableResponse
(
Integer
recordsTotal
,
Integer
recordsFiltered
,
List
<?>
data
)
{
super
();
this
.
recordsTotal
=
recordsTotal
;
...
...
src/main/resources/static/js/jq.js
View file @
fdede6c5
...
...
@@ -22,6 +22,22 @@ $.ajaxSetup({
}
});
Date
.
prototype
.
format
=
function
(
fmt
)
{
var
o
=
{
"M+"
:
this
.
getMonth
()
+
1
,
//月份
"d+"
:
this
.
getDate
(),
//日
"h+"
:
this
.
getHours
(),
//小时
"m+"
:
this
.
getMinutes
(),
//分
"s+"
:
this
.
getSeconds
(),
//秒
"q+"
:
Math
.
floor
((
this
.
getMonth
()
+
3
)
/
3
),
//季度
"S"
:
this
.
getMilliseconds
()
//毫秒
};
if
(
/
(
y+
)
/
.
test
(
fmt
))
fmt
=
fmt
.
replace
(
RegExp
.
$1
,
(
this
.
getFullYear
()
+
""
).
substr
(
4
-
RegExp
.
$1
.
length
));
for
(
var
k
in
o
)
if
(
new
RegExp
(
"("
+
k
+
")"
).
test
(
fmt
))
fmt
=
fmt
.
replace
(
RegExp
.
$1
,
(
RegExp
.
$1
.
length
==
1
)
?
(
o
[
k
])
:
((
"00"
+
o
[
k
]).
substr
((
""
+
o
[
k
]).
length
)));
return
fmt
;
}
function
buttonDel
(
data
,
permission
,
pers
){
if
(
permission
!=
""
){
if
(
$
.
inArray
(
permission
,
pers
)
<
0
)
{
...
...
src/main/resources/static/pages/advertiserManager/advertiserData.html
0 → 100644
View file @
fdede6c5
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
广告主数据汇总
</title>
</head>
<link
rel=
"stylesheet"
href=
"../../css/treetable/jquery.treetable.css"
/>
<link
rel=
"stylesheet"
href=
"../../css/treetable/jquery.treetable.theme.default.css"
/>
<link
rel=
"stylesheet"
type=
"text/css"
media=
"screen"
href=
"../../layui/css/layui.css"
>
<body>
<div
class=
"layui-inline"
>
<input
type=
"text"
class=
"layui-input"
id=
"date1"
>
</div>
<table
class=
"layui-table"
><tr><td>
投放概要
</td></tr><tr><td><table
id=
"demo"
lay-filter=
"adveriserManagerTable"
></table></td></tr></table>
</body>
</html>
<script
type=
"text/javascript"
src=
"../../js/libs/jquery-2.1.1.min.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/jq.js"
></script>
<script
type=
"text/javascript"
src=
"../../layui/layui.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/my/permission.js"
></script>
<script
src=
"../../js/libs/jquery.treetable.js"
></script>
<script>
var
tableIns
;
var
startTime
;
var
endTime
;
var
day
=
new
Date
();
startTime
=
day
.
format
(
"yyyy-MM-dd"
);
endTime
=
day
.
format
(
"yyyy-MM-dd"
);
layui
.
use
(
'laydate'
,
function
(){
var
laydate
=
layui
.
laydate
;
laydate
.
render
({
elem
:
'#date1'
,
range
:
true
,
value
:
startTime
+
' - '
+
endTime
,
done
:
function
(
value
,
date
,
endDate
)
{
startTime
=
date
.
year
+
'-'
+
date
.
month
+
'-'
+
date
.
date
endTime
=
endDate
.
year
+
'-'
+
endDate
.
month
+
'-'
+
endDate
.
date
tableIns
.
reload
({
where
:{
startTime
:
startTime
,
endTime
:
endTime
}})
}
});
});
layui
.
use
(
'table'
,
function
(){
var
table
=
layui
.
table
;
//第一个实例
tableIns
=
table
.
render
({
elem
:
'#demo'
,
url
:
'/advertiserManagerController/advertiserData'
//数据接口
,
contentType
:
'application/json'
,
method
:
'post'
//,toolbar:'true'
,
where
:{
startTime
:
startTime
,
endTime
:
endTime
}
,
page
:
false
//开启分页
,
cols
:
[[
//表头
{
field
:
'reportDate'
,
title
:
'日期'
}
,{
field
:
'advertiserId'
,
title
:
'广告主id'
,
hide
:
"true"
}
,{
field
:
'codeId'
,
title
:
'广告id'
}
,{
field
:
'ecpm'
,
title
:
'ecpm'
}
,{
field
:
'cpc'
,
title
:
'cpc'
}
,{
field
:
'exposure'
,
title
:
'曝光'
}
,{
field
:
'click'
,
title
:
'点击'
}
,{
field
:
'income'
,
title
:
'收入'
}
,{
field
:
'advertiserName'
,
title
:
'广告主名称'
}
]]
});
});
</script>
src/main/resources/static/pages/advertiserManager/advertiserDataCount.html
0 → 100644
View file @
fdede6c5
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<meta
charset=
"UTF-8"
>
<title>
广告主数据汇总
</title>
</head>
<link
rel=
"stylesheet"
href=
"../../css/treetable/jquery.treetable.css"
/>
<link
rel=
"stylesheet"
href=
"../../css/treetable/jquery.treetable.theme.default.css"
/>
<link
rel=
"stylesheet"
type=
"text/css"
media=
"screen"
href=
"../../layui/css/layui.css"
>
<body>
<div
class=
"layui-inline"
>
<input
type=
"text"
class=
"layui-input"
id=
"date1"
>
</div>
<table
id=
"demo"
lay-filter=
"adveriserManagerTable"
></table>
</body>
</html>
<script
type=
"text/javascript"
src=
"../../js/libs/jquery-2.1.1.min.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/jq.js"
></script>
<script
type=
"text/javascript"
src=
"../../layui/layui.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/my/permission.js"
></script>
<script
src=
"../../js/libs/jquery.treetable.js"
></script>
<script>
var
tableIns
;
var
startTime
;
var
endTime
;
var
day
=
new
Date
();
startTime
=
day
.
format
(
"yyyy-MM-dd"
);
endTime
=
day
.
format
(
"yyyy-MM-dd"
);
layui
.
use
(
'laydate'
,
function
(){
var
laydate
=
layui
.
laydate
;
laydate
.
render
({
elem
:
'#date1'
,
range
:
true
,
value
:
startTime
+
' - '
+
endTime
,
done
:
function
(
value
,
date
,
endDate
)
{
startTime
=
date
.
year
+
'-'
+
date
.
month
+
'-'
+
date
.
date
endTime
=
endDate
.
year
+
'-'
+
endDate
.
month
+
'-'
+
endDate
.
date
tableIns
.
reload
({
where
:{
startTime
:
startTime
,
endTime
:
endTime
}})
}
});
});
layui
.
use
(
'table'
,
function
(){
var
table
=
layui
.
table
;
//第一个实例
tableIns
=
table
.
render
({
elem
:
'#demo'
,
url
:
'/advertiserManagerController/advertCount'
//数据接口
,
contentType
:
'application/json'
,
method
:
'post'
,
toolbar
:
'true'
,
where
:{
startTime
:
startTime
,
endTime
:
endTime
}
,
page
:
true
//开启分页
,
cols
:
[[
//表头
{
field
:
'reportDate'
,
title
:
'日期'
,
sort
:
true
}
,{
field
:
'advertiserId'
,
title
:
'广告主id'
,
hide
:
"true"
}
,{
field
:
'codeId'
,
title
:
'广告id'
}
,{
field
:
'ecpm'
,
title
:
'ecpm'
}
,{
field
:
'cpc'
,
title
:
'cpc'
}
,{
field
:
'exposure'
,
title
:
'曝光'
}
,{
field
:
'click'
,
title
:
'点击'
}
,{
field
:
'income'
,
title
:
'收入'
}
,{
field
:
'advertiserName'
,
title
:
'广告主名称'
}
]]
,
defaultToolbar
:
[
'filter'
,
'exports'
]
});
});
</script>
src/main/resources/static/pages/advertiserManager/advertiserManager.html
View file @
fdede6c5
...
...
@@ -11,7 +11,6 @@
<table
id=
"demo"
lay-filter=
"adveriserManagerTable"
></table>
</body>
</html>
...
...
src/main/resources/static/pages/user/AdvertiserUserList2.html
deleted
100644 → 0
View file @
f2431209
<!DOCTYPE html>
<html>
<head>
<meta
charset=
"UTF-8"
>
<title>
广告商负责人设置
</title>
<link
rel=
"stylesheet"
type=
"text/css"
media=
"screen"
href=
"../../css/bootstrap.min.css"
>
<link
rel=
"stylesheet"
type=
"text/css"
media=
"screen"
href=
"../../css/dataTables.bootstrap.min.css"
>
<link
rel=
"stylesheet"
type=
"text/css"
media=
"screen"
href=
"../../layui/css/layui.css"
>
</head>
<body>
<div>
<div
class=
"col-xs-12 col-sm-12 col-md-12 col-lg-12"
>
<header
style=
"height: 100%"
>
</header>
<div
class=
"layui-form"
>
<div
class=
"widget-body no-padding"
>
<table
id=
"dt-table"
class=
"table table-striped table-bordered table-hover"
style=
"width:100%"
>
<thead>
<tr>
</tr>
<tr>
<th>
id
</th>
<th>
nickname
</th>
<th>
广告商
</th>
<!--<th>操作</th>-->
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>
<script
type=
"text/javascript"
src=
"../../js/libs/jquery-2.1.1.min.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/jq.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/plugin/datatables/jquery.dataTables.min.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/plugin/datatables/dataTables.bootstrap.min.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/my/permission.js"
></script>
<script
type=
"text/javascript"
src=
"../../layui/layui.js"
></script>
<script
type=
"text/javascript"
src=
"../../js/dict.js"
></script>
<script
type=
"text/javascript"
>
// layui.use([ 'layer' ], function() {
// var layer = layui.layer;
// });
var
pers
=
checkPermission
();
var
example
;
function
init
(){
example
=
$
(
'#dt-table'
).
DataTable
({
"searching"
:
false
,
"processing"
:
false
,
"serverSide"
:
true
,
"language"
:
{
"url"
:
"/js/plugin/datatables/Chinese.lang"
},
"ajax"
:
{
"url"
:
"/users/advertiserUserList"
,
"type"
:
"get"
,
"error"
:
function
(
xhr
,
textStatus
,
errorThrown
){
var
msg
=
xhr
.
responseText
;
console
.
log
(
msg
);
var
response
=
JSON
.
parse
(
msg
);
var
code
=
response
.
code
;
var
message
=
response
.
message
;
if
(
code
==
400
)
{
layer
.
msg
(
message
);
}
else
if
(
code
==
401
)
{
localStorage
.
removeItem
(
"token"
);
layer
.
msg
(
"token过期,请先登录"
,
{
shift
:
-
1
,
time
:
1000
},
function
(){
location
.
href
=
'/login.html'
;
});
}
else
if
(
code
==
403
)
{
console
.
log
(
"未授权:"
+
message
);
layer
.
msg
(
'未授权'
);
}
else
if
(
code
==
500
)
{
layer
.
msg
(
'系统错误:'
+
message
);
}
}
},
"dom"
:
"<'dt-toolbar'r>t<'dt-toolbar-footer'<'col-sm-10 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-10' p v>>"
,
"columns"
:
[
{
"data"
:
"userId"
,
"defaultContent"
:
""
,
"visible"
:
false
},
{
"data"
:
"nickname"
,
"defaultContent"
:
""
},
{
"data"
:
"status"
,
"defaultContent"
:
""
,
"orderable"
:
false
,
"render"
:
function
(
data
,
type
,
row
)
{
var
advertiserName
=
row
[
'advertiserName'
];
//console.log(advertiserName)
var
advertiserId
=
row
[
'advertiserId'
];
var
userId
=
row
[
'userId'
];
var
adCb
=
checkboxEdit
(
data
,
advertiserName
,
advertiserId
,
userId
,
"sys:user:add"
,
pers
);
return
"<input lay-filter='formCheckbox' type=
\"
checkbox
\"
advertiserId=
\"
"
+
advertiserId
+
"
\"
title=
\"
"
+
advertiserName
+
"
\"
userId=
\"
"
+
userId
+
"
\"
checked>"
;
}
}
],
"order"
:
[[
0
,
"desc"
],[
1
,
"asc"
]]
}
);
}
init
();
var
form
;
layui
.
use
(
'form'
,
function
()
{
form
=
layui
.
form
;
form
.
render
();
form
.
on
(
'checkbox(formCheckbox)'
,
function
(
data
){
var
elem
=
data
.
elem
;
console
.
log
(
data
.
elem
.
checked
);
//是否被选中,true或者false
console
.
log
(
elem
.
getAttribute
(
"advertiserId"
));
console
.
log
(
elem
.
getAttribute
(
"userId"
));
//复选框value值,也可以通过data.elem.value得到
});
});
</script>
\ 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