Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsk-operate-sys-cscec
Project
Project
Details
Activity
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
fulixin
dsk-operate-sys-cscec
Commits
f178e9f9
Commit
f178e9f9
authored
Oct 23, 2023
by
yht15023815643
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'V20230915' of
http://192.168.60.201/root/dsk-operate-sys
into V20230915
parents
1766b46d
ea37a238
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
343 additions
and
198 deletions
+343
-198
application.yml
dsk-admin/src/main/resources/application.yml
+1
-0
PasswordUtils.java
...mon/src/main/java/com/dsk/common/utils/PasswordUtils.java
+11
-6
BusinessOpenTenderController.java
.../com/dsk/biz/controller/BusinessOpenTenderController.java
+65
-0
BusinessOpenTender.java
.../src/main/java/com/dsk/biz/domain/BusinessOpenTender.java
+53
-0
BusinessOpenTenderDto.java
...ain/java/com/dsk/biz/domain/bo/BusinessOpenTenderDto.java
+21
-0
BusinessOpenTenderMapper.java
...ain/java/com/dsk/biz/mapper/BusinessOpenTenderMapper.java
+10
-0
IBusinessOpenTenderService.java
.../java/com/dsk/biz/service/IBusinessOpenTenderService.java
+19
-0
BusinessOpenTenderServiceImpl.java
...m/dsk/biz/service/impl/BusinessOpenTenderServiceImpl.java
+64
-0
xgqy.vue
...erate-ui/src/views/project/projectList/component/xgqy.vue
+45
-94
zlwd.vue
...erate-ui/src/views/project/projectList/component/zlwd.vue
+54
-98
No files found.
dsk-admin/src/main/resources/application.yml
View file @
f178e9f9
...
...
@@ -168,6 +168,7 @@ tenant:
-
business_follow_record
-
business_label
-
business_relate_company
-
business_open_tender
# MyBatisPlus配置
...
...
dsk-common/src/main/java/com/dsk/common/utils/PasswordUtils.java
View file @
f178e9f9
...
...
@@ -32,17 +32,22 @@ public class PasswordUtils {
// 至少包含一个大写字母
password
.
append
(
UPPER_CASE
.
charAt
(
random
.
nextInt
(
UPPER_CASE
.
length
())));
// 至少包含一个数字
password
.
append
(
NUMBERS
.
charAt
(
random
.
nextInt
(
NUMBERS
.
length
())));
// 生成剩余部分的密码
for
(
int
i
=
0
;
i
<
length
-
3
;
i
++)
{
String
characters
=
LOWER_CASE
+
UPPER_CASE
+
NUMBERS
;
password
.
append
(
characters
.
charAt
(
random
.
nextInt
(
characters
.
length
())));
for
(
int
i
=
0
;
i
<
length
-
2
;
i
++)
{
// 至少包含一个数字
password
.
append
(
NUMBERS
.
charAt
(
random
.
nextInt
(
NUMBERS
.
length
())));
// String characters = LOWER_CASE + UPPER_CASE + NUMBERS;
// password.append(characters.charAt(random.nextInt(characters.length())));
}
// 打乱密码中字符的顺序
return
shufflePassword
(
password
.
toString
());
// return shufflePassword(password.toString());
return
password
.
toString
();
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
PasswordUtils
.
generatePwd
(
8
));
}
public
static
String
shufflePassword
(
String
password
)
{
...
...
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/controller/BusinessOpenTenderController.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
controller
;
import
com.dsk.biz.domain.BusinessOpenTender
;
import
com.dsk.biz.domain.bo.BusinessOpenTenderDto
;
import
com.dsk.biz.domain.bo.BusinessSearchDto
;
import
com.dsk.biz.service.IBusinessOpenTenderService
;
import
com.dsk.common.annotation.RepeatSubmit
;
import
com.dsk.common.core.controller.BaseController
;
import
com.dsk.common.core.domain.PageQuery
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.page.TableDataInfo
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.List
;
/**
* 项目开标记录
*
* @author lcl
* @date 2023-10-23
*/
@RestController
@RequestMapping
(
"/business/open/tender"
)
public
class
BusinessOpenTenderController
extends
BaseController
{
@Autowired
private
IBusinessOpenTenderService
baseService
;
/**
* 开标记录列表
*/
@GetMapping
(
"/list"
)
public
TableDataInfo
<
BusinessOpenTender
>
list
(
BusinessOpenTenderDto
dto
,
PageQuery
pageQuery
){
return
baseService
.
selectList
(
dto
,
pageQuery
);
}
/**
* 添加开标记录
*/
@PostMapping
@RepeatSubmit
()
public
R
<
Void
>
add
(
@RequestBody
BusinessOpenTender
bo
){
return
toAjax
(
baseService
.
add
(
bo
));
}
/**
* 修改开标记录
*/
@PutMapping
@RepeatSubmit
()
public
R
<
Void
>
edit
(
@RequestBody
BusinessOpenTender
bo
){
return
toAjax
(
baseService
.
edit
(
bo
));
}
/**
* 删除开标记录
*/
@DeleteMapping
(
"/{ids}"
)
@RepeatSubmit
()
public
R
<
Void
>
remove
(
@PathVariable
Long
[]
ids
){
return
toAjax
(
baseService
.
remove
(
ids
));
}
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/domain/BusinessOpenTender.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
domain
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* @Author lcl
* @Data 2023/10/23 16:26
*/
@Data
public
class
BusinessOpenTender
implements
Serializable
{
@TableId
(
value
=
"id"
,
type
=
IdType
.
AUTO
)
private
Long
id
;
/**
* 项目id
*/
private
Integer
businessId
;
/**
* 投标人id
*/
private
Integer
tendererId
;
/**
* 投标人
*/
private
String
tenderer
;
/**
* 企业性质
*/
private
String
tendererNature
;
/**
* 项目经理
*/
private
String
businessManager
;
/**
* 联系方式
*/
private
String
contact
;
/**
* 投标金额
*/
private
Double
tenderAmount
;
private
Date
createTime
;
private
Date
updateTime
;
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/domain/bo/BusinessOpenTenderDto.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
domain
.
bo
;
import
com.dsk.common.core.domain.BaseEntity
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serializable
;
/**
* @author lcl
* @create 2023/8/14
*/
@Data
@NoArgsConstructor
public
class
BusinessOpenTenderDto
implements
Serializable
{
/**
* 项目id
*/
private
Integer
businessId
;
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/mapper/BusinessOpenTenderMapper.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.dsk.biz.domain.BusinessOpenTender
;
import
org.apache.ibatis.annotations.Mapper
;
@Mapper
public
interface
BusinessOpenTenderMapper
extends
BaseMapper
<
BusinessOpenTender
>
{
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/service/IBusinessOpenTenderService.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
service
;
import
com.dsk.biz.domain.BusinessOpenTender
;
import
com.dsk.biz.domain.bo.BusinessOpenTenderDto
;
import
com.dsk.common.core.domain.PageQuery
;
import
com.dsk.common.core.page.TableDataInfo
;
public
interface
IBusinessOpenTenderService
{
TableDataInfo
<
BusinessOpenTender
>
selectList
(
BusinessOpenTenderDto
dto
,
PageQuery
pageQuery
);
int
add
(
BusinessOpenTender
bo
);
int
edit
(
BusinessOpenTender
bo
);
int
remove
(
Long
[]
ids
);
}
dsk-module/dsk-biz-api/src/main/java/com/dsk/biz/service/impl/BusinessOpenTenderServiceImpl.java
0 → 100644
View file @
f178e9f9
package
com
.
dsk
.
biz
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.dsk.biz.domain.BusinessOpenTender
;
import
com.dsk.biz.domain.bo.BusinessOpenTenderDto
;
import
com.dsk.biz.domain.bo.BusinessSearchDto
;
import
com.dsk.biz.mapper.BusinessOpenTenderMapper
;
import
com.dsk.biz.service.IBusinessOpenTenderService
;
import
com.dsk.common.core.domain.PageQuery
;
import
com.dsk.common.core.page.TableDataInfo
;
import
jodd.bean.BeanException
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.sql.Wrapper
;
import
java.util.Arrays
;
import
java.util.List
;
/**
* @Author lcl
* @Data 2023/10/23 16:29
*/
@Slf4j
@Service
public
class
BusinessOpenTenderServiceImpl
implements
IBusinessOpenTenderService
{
@Resource
private
BusinessOpenTenderMapper
baseMapper
;
@Override
public
TableDataInfo
<
BusinessOpenTender
>
selectList
(
BusinessOpenTenderDto
dto
,
PageQuery
pageQuery
)
{
return
TableDataInfo
.
build
(
baseMapper
.
selectPage
(
pageQuery
.
build
(),
Wrappers
.<
BusinessOpenTender
>
lambdaQuery
().
eq
(
BusinessOpenTender:
:
getBusinessId
,
dto
.
getBusinessId
())));
}
@Override
public
int
add
(
BusinessOpenTender
bo
)
{
verifyBean
(
bo
);
return
baseMapper
.
insert
(
bo
);
}
@Override
public
int
edit
(
BusinessOpenTender
bo
)
{
if
(
ObjectUtils
.
isArray
(
bo
.
getId
()))
throw
new
BeanException
(
"id不能为空!"
);
verifyBean
(
bo
);
return
baseMapper
.
updateById
(
bo
);
}
@Override
public
int
remove
(
Long
[]
ids
)
{
return
baseMapper
.
deleteBatchIds
(
Arrays
.
asList
(
ids
));
}
private
void
verifyBean
(
BusinessOpenTender
bo
){
if
(
ObjectUtils
.
isArray
(
bo
.
getBusinessId
()))
throw
new
BeanException
(
"项目id不能为空!"
);
if
(
ObjectUtils
.
isArray
(
bo
.
getTenderer
()))
throw
new
BeanException
(
"开标人不能为空!"
);
if
(
ObjectUtils
.
isArray
(
bo
.
getTendererNature
()))
throw
new
BeanException
(
"企业性质不能为空!"
);
if
(
ObjectUtils
.
isArray
(
bo
.
getTenderAmount
()))
throw
new
BeanException
(
"投标金额不能为空!"
);
}
}
dsk-operate-ui/src/views/project/projectList/component/xgqy.vue
View file @
f178e9f9
...
...
@@ -8,18 +8,12 @@
<el-option
v-for=
"(item,index) in companytype"
:label=
"item.dictLabel"
:value=
"item.dictValue"
></el-option>
</el-select>
<div
class=
"searchInput small"
>
<div
class=
"normal-search-container"
@
click=
"showSearchBox = true"
v-if=
"!showSearchBox"
>
<img
src=
"@/assets/images/enterprise/enterprise-search-icon.svg"
alt=
""
>
<span>
输入关键词查询
</span>
<div
@
mouseover=
"showSearchBox = true"
@
mouseleave=
"leaves"
>
<img
class=
"ss"
src=
"@/assets/images/enterprise/enterprise-search-icon.svg"
alt=
""
>
<span
class=
"cx"
v-if=
"!showSearchBox"
>
搜索
</span>
<el-input
v-if=
"showSearchBox"
@
keyup
.
enter
.
native=
"handleCurrentChange(1)"
clearable
@
clear=
"handleCurrentChange(1)"
v-model=
"searchParam.companyName"
placeholder=
"输入关键词查询"
></el-input>
</div>
<!--<!– 输入框展开后样式 –>-->
<transition
@
enter=
"onEnter"
appear
mode=
"out-in"
>
<div
class=
"cooperate-name enterprise-search-container"
id=
"focus1"
v-if=
"showSearchBox"
>
<el-input
clearable
@
clear=
"handleCurrentChange(1)"
@
focus=
"clickFocus('focus1')"
@
blur=
"clickFocus('focus1')"
v-model=
"searchParam.companyName"
placeholder=
"输入关键词查询"
></el-input>
<span
@
click=
"handleCurrentChange(1)"
>
搜索
</span>
</div>
</transition>
</div>
<div
class=
"btn btn_primary h32 b3"
@
click=
"opennew"
v-if=
"isDisableds == false"
><div
class=
"img img1"
></div>
添加相关企业
</div>
</div>
...
...
@@ -196,7 +190,6 @@
import
{
addXGQY
,
delXGQY
,
getXGQY
,
saveXGQY
}
from
'@/api/project/project'
import
{
getDictType
,
getEnterprise
}
from
'@/api/main'
import
skeleton
from
'./skeleton'
import
gsap
from
"gsap"
;
export
default
{
components
:{
skeleton
},
...
...
@@ -264,9 +257,10 @@
mounted
(){
},
methods
:{
clickFocus
(
e
)
{
document
.
getElementById
(
e
).
classList
.
toggle
(
'span-ba'
);
leaves
(){
if
(
this
.
searchParam
.
companyName
==
""
){
this
.
showSearchBox
=
false
}
},
getDetail
(
row
){
this
.
isedit
=
true
...
...
@@ -373,21 +367,6 @@
remark
:
''
,
}
},
onEnter
(
el
,
done
)
{
gsap
.
from
(
el
,
{
opacity
:
0
,
width
:
0
,
});
gsap
.
to
(
el
,
{
opacity
:
1
,
width
:
242
,
onComplete
()
{
// 完成动画聚焦输入框
el
.
querySelector
(
"input"
).
focus
();
done
();
}
});
},
}
}
</
script
>
...
...
@@ -406,81 +385,53 @@
}
}
.searchInput
.el-input
{
width
:
68%
;
width
:
100%
;
position
:
absolute
;
left
:
0
;
top
:
0
;
margin-top
:
0
;
z-index
:
0
;
::v-deep
.el-input__inner
{
background
:
#F4F6F9
!
important
;
padding-left
:
36px
!
important
;
padding-right
:
35px
!
important
;
}
}
.searchInput.small
{
width
:
257px
;
}
.searchInput
{
.normal-search-container
{
display
:
flex
;
align-items
:
center
;
cursor
:
pointer
;
height
:
34px
;
&
:hover
{
&
>
span
{
color
:
#0081ff
;
}
}
&
>
img
{
width
:
16px
;
height
:
16px
;
margin-left
:
12px
;
/*width: 257px;*/
border
:
0
;
border-radius
:
4px
!
important
;
.ss
{
position
:
absolute
;
z-index
:
1
;
left
:
13px
;
top
:
9px
;
width
:
13px
;
}
&
>
span
{
.cx
{
color
:
#232323
;
color
:
rgba
(
35
,
35
,
35
,
0
.4
);
font-weight
:
400
;
margin-left
:
8px
;
line-height
:
22px
;
opacity
:
0
.8
;
font-size
:
14px
;
margin-left
:
36px
;
line-height
:
32px
;
}
}
.cooperate-name
{
display
:
flex
;
border-radius
:
2px
;
border
:
1px
solid
#d9d9d9
;
line-height
:
30px
;
height
:
30px
;
float
:
left
;
width
:
100%
;
span
{
width
:
60px
;
height
:
28px
;
line-height
:
28px
;
font-size
:
14px
;
background
:
#f5f5f5
;
text-align
:
center
;
color
:
#0081ff
;
border
:
1px
solid
#efefef
;
border-left
:
0
;
cursor
:
pointer
;
input
:
:-
webkit-input-placeholder
{
/* Chrome/Opera/Safari */
color
:
#232323
;
opacity
:
0
.4
;
}
&
.span-ba
{
border
:
1px
solid
#0081ff
;
span
{
color
:
#ffffff
;
background
:
#0081ff
;
border
:
1px
solid
#0081ff
;
}
input
:
:-
moz-placeholder
{
/* Firefox 19+ */
color
:
#232323
;
opacity
:
0
.4
;
}
::v-deep
.el-input
{
flex
:
1
;
input
:
-
ms-input-placeholder
{
/* IE 10+ */
color
:
#232323
;
opacity
:
0
.4
;
}
::v-deep
.el-input__inner
{
border
:
0
;
line-height
:
28px
;
height
:
28px
;
position
:
absolute
;
top
:
1px
;
padding-right
:
28px
;
font-size
:
12px
;
padding-left
:
8px
;
input
:
-
moz-placeholder
{
/* Firefox 18- */
color
:
#232323
;
opacity
:
0
.4
;
}
}
}
.w102
{
width
:
102px
;
}
...
...
dsk-operate-ui/src/views/project/projectList/component/zlwd.vue
View file @
f178e9f9
...
...
@@ -5,18 +5,12 @@
<div
class=
"cardtitles"
>
资料文档
</div>
<div
class=
"searchbtns"
>
<div
class=
"searchInput small"
>
<div
class=
"normal-search-container"
@
click=
"showSearchBox = true"
v-if=
"!showSearchBox"
>
<img
src=
"@/assets/images/enterprise/enterprise-search-icon.svg"
alt=
""
>
<span>
输入关键词查询
</span>
<div
@
mouseover=
"showSearchBox = true"
@
mouseleave=
"leaves"
>
<img
class=
"ss"
src=
"@/assets/images/enterprise/enterprise-search-icon.svg"
alt=
""
>
<span
class=
"cx"
v-if=
"!showSearchBox"
>
搜索
</span>
<el-input
v-if=
"showSearchBox"
@
keyup
.
enter
.
native=
"handleCurrentChange(1)"
clearable
@
clear=
"handleCurrentChange(1)"
v-model=
"param.keyword"
placeholder=
"输入关键词查询"
></el-input>
</div>
<!--<!– 输入框展开后样式 –>-->
<transition
@
enter=
"onEnter"
appear
mode=
"out-in"
>
<div
class=
"cooperate-name enterprise-search-container"
id=
"focus1"
v-if=
"showSearchBox"
>
<el-input
clearable
@
clear=
"handleCurrentChange(1)"
@
focus=
"clickFocus('focus1')"
@
blur=
"clickFocus('focus1')"
v-model=
"param.keyword"
placeholder=
"输入关键词查询"
></el-input>
<span
@
click=
"handleCurrentChange(1)"
>
搜索
</span>
</div>
</transition>
</div>
<!--
<div
class=
"btn btn_primary h32 b2"
@
click=
"getUP"
v-if=
"fileDatas.total>0"
><div
class=
"img img2"
></div>
上传
</div>
-->
...
...
@@ -161,7 +155,6 @@
import
{
getToken
}
from
'@/utils/auth'
import
{
delZLWD
,
getZLWD
}
from
'@/api/project/project'
import
skeleton
from
'./skeleton'
import
gsap
from
"gsap"
;
export
default
{
components
:{
skeleton
},
...
...
@@ -204,23 +197,10 @@
// console.log(this.$ref)
},
methods
:{
clickFocus
(
e
)
{
document
.
getElementById
(
e
).
classList
.
toggle
(
'span-ba'
);
},
onEnter
(
el
,
done
)
{
gsap
.
from
(
el
,
{
opacity
:
0
,
width
:
0
,
});
gsap
.
to
(
el
,
{
opacity
:
1
,
width
:
242
,
onComplete
()
{
// 完成动画聚焦输入框
el
.
querySelector
(
"input"
).
focus
();
done
();
}
});
leaves
(){
if
(
this
.
searchParam
.
companyName
==
""
){
this
.
showSearchBox
=
false
}
},
getall
(){
this
.
param
.
filePath
=
this
.
detailId
?
this
.
detailId
:
this
.
$route
.
query
.
id
...
...
@@ -343,77 +323,53 @@
<
style
lang=
"scss"
scoped
>
.searchInput.small
{
width
:
257px
;
}
.searchInput
{
.normal-search-container
{
display
:
flex
;
align-items
:
center
;
cursor
:
pointer
;
height
:
34px
;
&
:hover
{
&
>
span
{
color
:
#0081ff
;
}
}
&
>
img
{
width
:
16px
;
height
:
16px
;
margin-left
:
12px
;
}
&
>
span
{
color
:
#232323
;
color
:
rgba
(
35
,
35
,
35
,
0
.4
);
font-weight
:
400
;
margin-left
:
8px
;
line-height
:
22px
;
font-size
:
14px
;
}
.searchInput
.el-input
{
width
:
100%
;
position
:
absolute
;
left
:
0
;
top
:
0
;
margin-top
:
0
;
z-index
:
0
;
::v-deep
.el-input__inner
{
background
:
#F4F6F9
!
important
;
padding-left
:
36px
!
important
;
padding-right
:
35px
!
important
;
}
.cooperate-name
{
display
:
flex
;
border-radius
:
2px
;
border
:
1px
solid
#d9d9d9
;
line-height
:
30px
;
height
:
30px
;
float
:
left
;
width
:
100%
;
span
{
width
:
60px
;
height
:
28px
;
line-height
:
28px
;
font-size
:
14px
;
background
:
#f5f5f5
;
text-align
:
center
;
color
:
#0081ff
;
border
:
1px
solid
#efefef
;
border-left
:
0
;
cursor
:
pointer
;
}
&
.span-ba
{
border
:
1px
solid
#0081ff
;
span
{
color
:
#ffffff
;
background
:
#0081ff
;
border
:
1px
solid
#0081ff
;
}
}
::v-deep
.el-input
{
flex
:
1
;
}
::v-deep
.el-input__inner
{
border
:
0
;
line-height
:
28px
;
height
:
28px
;
position
:
absolute
;
top
:
1px
;
padding-right
:
28px
;
font-size
:
12px
;
padding-left
:
8px
;
}
}
.searchInput.small
{
/*width: 257px;*/
border
:
0
;
border-radius
:
4px
!
important
;
.ss
{
position
:
absolute
;
z-index
:
1
;
left
:
13px
;
top
:
9px
;
width
:
13px
;
}
.cx
{
color
:
#232323
;
opacity
:
0
.8
;
font-size
:
14px
;
margin-left
:
36px
;
line-height
:
32px
;
}
input
:
:-
webkit-input-placeholder
{
/* Chrome/Opera/Safari */
color
:
#232323
;
opacity
:
0
.4
;
}
input
:
:-
moz-placeholder
{
/* Firefox 19+ */
color
:
#232323
;
opacity
:
0
.4
;
}
input
:
-
ms-input-placeholder
{
/* IE 10+ */
color
:
#232323
;
opacity
:
0
.4
;
}
input
:
-
moz-placeholder
{
/* Firefox 18- */
color
:
#232323
;
opacity
:
0
.4
;
}
}
v-deep
.el-upload
:focus
{
...
...
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