Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Eladmin
Commits
3d74dac9
"vscode:/vscode.git/clone" did not exist on "77f63cee5e389ff09c359f7c7365701b59349c6c"
Commit
3d74dac9
authored
Dec 22, 2018
by
郑杰
Browse files
eladmin 1.0 版本发布
parents
Changes
88
Show whitespace changes
Inline
Side-by-side
src/main/java/me/zhengjie/system/rest/MenuController.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.rest
;
import
me.zhengjie.common.aop.log.Log
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.core.utils.JwtTokenUtil
;
import
me.zhengjie.system.domain.Menu
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.service.MenuService
;
import
me.zhengjie.system.service.UserService
;
import
me.zhengjie.system.service.dto.MenuDTO
;
import
me.zhengjie.system.service.query.MenuQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
/**
* @author jie
* @date 2018-12-03
*/
@RestController
@RequestMapping
(
"api"
)
public
class
MenuController
{
@Autowired
private
JwtTokenUtil
jwtTokenUtil
;
@Autowired
private
MenuService
menuService
;
@Autowired
private
MenuQueryService
menuQueryService
;
@Autowired
private
UserService
userService
;
private
static
final
String
ENTITY_NAME
=
"menu"
;
@GetMapping
(
value
=
"/menus/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','MENU_ALL','MENU_SELECT')"
)
public
ResponseEntity
getMenus
(
@PathVariable
Long
id
){
return
new
ResponseEntity
(
menuService
.
findById
(
id
),
HttpStatus
.
OK
);
}
/**
* 构建前端路由所需要的菜单
* @return
*/
@GetMapping
(
value
=
"/menus/build"
)
public
ResponseEntity
buildMenus
(
HttpServletRequest
request
){
User
user
=
userService
.
findByName
(
jwtTokenUtil
.
getUserName
(
request
));
List
<
MenuDTO
>
menuDTOList
=
menuService
.
findByRoles
(
user
.
getRoles
());
return
new
ResponseEntity
(
menuService
.
buildMenus
((
List
<
MenuDTO
>)
menuService
.
buildTree
(
menuDTOList
).
get
(
"content"
)),
HttpStatus
.
OK
);
}
/**
* 返回全部的菜单
* @return
*/
@GetMapping
(
value
=
"/menus/tree"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','MENU_ALL','MENU_SELECT')"
)
public
ResponseEntity
getMenuTree
(){
return
new
ResponseEntity
(
menuService
.
getMenuTree
(
menuService
.
findByPid
(
0L
)),
HttpStatus
.
OK
);
}
@Log
(
description
=
"查询菜单"
)
@GetMapping
(
value
=
"/menus"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','MENU_ALL','MENU_SELECT')"
)
public
ResponseEntity
getMenus
(
@RequestParam
(
required
=
false
)
String
name
){
List
<
MenuDTO
>
menuDTOList
=
menuQueryService
.
queryAll
(
name
);
return
new
ResponseEntity
(
menuService
.
buildTree
(
menuDTOList
),
HttpStatus
.
OK
);
}
@Log
(
description
=
"新增菜单"
)
@PostMapping
(
value
=
"/menus"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_CREATE')"
)
public
ResponseEntity
create
(
@Validated
@RequestBody
Menu
resources
){
if
(
resources
.
getId
()
!=
null
)
{
throw
new
BadRequestException
(
"A new "
+
ENTITY_NAME
+
" cannot already have an ID"
);
}
return
new
ResponseEntity
(
menuService
.
create
(
resources
),
HttpStatus
.
CREATED
);
}
@Log
(
description
=
"修改菜单"
)
@PutMapping
(
value
=
"/menus"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_EDIT')"
)
public
ResponseEntity
update
(
@Validated
@RequestBody
Menu
resources
){
if
(
resources
.
getId
()
==
null
)
{
throw
new
BadRequestException
(
ENTITY_NAME
+
" ID Can not be empty"
);
}
menuService
.
update
(
resources
);
return
new
ResponseEntity
(
HttpStatus
.
NO_CONTENT
);
}
@Log
(
description
=
"删除菜单"
)
@DeleteMapping
(
value
=
"/menus/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_DELETE')"
)
public
ResponseEntity
delete
(
@PathVariable
Long
id
){
menuService
.
delete
(
id
);
return
new
ResponseEntity
(
HttpStatus
.
OK
);
}
}
src/main/java/me/zhengjie/system/rest/PermissionController.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.rest
;
import
me.zhengjie.common.aop.log.Log
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.system.domain.Permission
;
import
me.zhengjie.system.service.PermissionService
;
import
me.zhengjie.system.service.dto.PermissionDTO
;
import
me.zhengjie.system.service.query.PermissionQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.List
;
/**
* @author jie
* @date 2018-12-03
*/
@RestController
@RequestMapping
(
"api"
)
public
class
PermissionController
{
@Autowired
private
PermissionService
permissionService
;
@Autowired
private
PermissionQueryService
permissionQueryService
;
private
static
final
String
ENTITY_NAME
=
"permission"
;
@GetMapping
(
value
=
"/permissions/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_SELECT')"
)
public
ResponseEntity
getPermissions
(
@PathVariable
Long
id
){
return
new
ResponseEntity
(
permissionService
.
findById
(
id
),
HttpStatus
.
OK
);
}
/**
* 返回全部的权限,新增角色时下拉选择
* @return
*/
@GetMapping
(
value
=
"/permissions/tree"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','ROLE_ALL','ROLE_ADD','ROLE_EDIT')"
)
public
ResponseEntity
getRoleTree
(){
return
new
ResponseEntity
(
permissionService
.
getPermissionTree
(
permissionService
.
findByPid
(
0L
)),
HttpStatus
.
OK
);
}
@Log
(
description
=
"查询权限"
)
@GetMapping
(
value
=
"/permissions"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_SELECT')"
)
public
ResponseEntity
getPermissions
(
@RequestParam
(
required
=
false
)
String
name
){
List
<
PermissionDTO
>
permissionDTOS
=
permissionQueryService
.
queryAll
(
name
);
return
new
ResponseEntity
(
permissionService
.
buildTree
(
permissionDTOS
),
HttpStatus
.
OK
);
}
@Log
(
description
=
"新增权限"
)
@PostMapping
(
value
=
"/permissions"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_CREATE')"
)
public
ResponseEntity
create
(
@Validated
@RequestBody
Permission
resources
){
if
(
resources
.
getId
()
!=
null
)
{
throw
new
BadRequestException
(
"A new "
+
ENTITY_NAME
+
" cannot already have an ID"
);
}
return
new
ResponseEntity
(
permissionService
.
create
(
resources
),
HttpStatus
.
CREATED
);
}
@Log
(
description
=
"修改权限"
)
@PutMapping
(
value
=
"/permissions"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_EDIT')"
)
public
ResponseEntity
update
(
@Validated
@RequestBody
Permission
resources
){
if
(
resources
.
getId
()
==
null
)
{
throw
new
BadRequestException
(
ENTITY_NAME
+
" ID Can not be empty"
);
}
permissionService
.
update
(
resources
);
return
new
ResponseEntity
(
HttpStatus
.
NO_CONTENT
);
}
@Log
(
description
=
"删除权限"
)
@DeleteMapping
(
value
=
"/permissions/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','PERMISSION_ALL','PERMISSION_DELETE')"
)
public
ResponseEntity
delete
(
@PathVariable
Long
id
){
permissionService
.
delete
(
id
);
return
new
ResponseEntity
(
HttpStatus
.
OK
);
}
}
src/main/java/me/zhengjie/system/rest/RoleController.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.rest
;
import
me.zhengjie.common.aop.log.Log
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.service.RoleService
;
import
me.zhengjie.system.service.dto.RoleDTO
;
import
me.zhengjie.system.service.query.RoleQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
/**
* @author jie
* @date 2018-12-03
*/
@RestController
@RequestMapping
(
"api"
)
public
class
RoleController
{
@Autowired
private
RoleService
roleService
;
@Autowired
private
RoleQueryService
roleQueryService
;
private
static
final
String
ENTITY_NAME
=
"role"
;
@GetMapping
(
value
=
"/roles/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','ROLE_SELECT')"
)
public
ResponseEntity
getRoles
(
@PathVariable
Long
id
){
return
new
ResponseEntity
(
roleService
.
findById
(
id
),
HttpStatus
.
OK
);
}
/**
* 返回全部的角色,新增用户时下拉选择
* @return
*/
@GetMapping
(
value
=
"/roles/tree"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','USER_ALL','USER_ADD','USER_EDIT')"
)
public
ResponseEntity
getRoleTree
(){
return
new
ResponseEntity
(
roleService
.
getRoleTree
(),
HttpStatus
.
OK
);
}
@Log
(
description
=
"查询角色"
)
@GetMapping
(
value
=
"/roles"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','ROLE_SELECT')"
)
public
ResponseEntity
getRoles
(
RoleDTO
resources
,
Pageable
pageable
){
return
new
ResponseEntity
(
roleQueryService
.
queryAll
(
resources
,
pageable
),
HttpStatus
.
OK
);
}
@Log
(
description
=
"新增角色"
)
@PostMapping
(
value
=
"/roles"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','ROLE_CREATE')"
)
public
ResponseEntity
create
(
@Validated
@RequestBody
Role
resources
){
if
(
resources
.
getId
()
!=
null
)
{
throw
new
BadRequestException
(
"A new "
+
ENTITY_NAME
+
" cannot already have an ID"
);
}
return
new
ResponseEntity
(
roleService
.
create
(
resources
),
HttpStatus
.
CREATED
);
}
@Log
(
description
=
"修改角色"
)
@PutMapping
(
value
=
"/roles"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','ROLE_EDIT')"
)
public
ResponseEntity
update
(
@Validated
@RequestBody
Role
resources
){
if
(
resources
.
getId
()
==
null
)
{
throw
new
BadRequestException
(
ENTITY_NAME
+
" ID Can not be empty"
);
}
roleService
.
update
(
resources
);
return
new
ResponseEntity
(
HttpStatus
.
NO_CONTENT
);
}
@Log
(
description
=
"删除角色"
)
@DeleteMapping
(
value
=
"/roles/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','ROLE_ALL','ROLE_DELETE')"
)
public
ResponseEntity
delete
(
@PathVariable
Long
id
){
roleService
.
delete
(
id
);
return
new
ResponseEntity
(
HttpStatus
.
OK
);
}
}
src/main/java/me/zhengjie/system/rest/UserController.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.rest
;
import
me.zhengjie.common.aop.log.Log
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.service.UserService
;
import
me.zhengjie.system.service.dto.UserDTO
;
import
me.zhengjie.system.service.query.UserQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.domain.Pageable
;
import
org.springframework.http.HttpStatus
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
/**
* @author jie
* @date 2018-11-23
*/
@RestController
@RequestMapping
(
"api"
)
public
class
UserController
{
@Autowired
private
UserService
userService
;
@Autowired
private
UserQueryService
userQueryService
;
private
static
final
String
ENTITY_NAME
=
"user"
;
@GetMapping
(
value
=
"/users/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','USER_ALL','USER_SELECT')"
)
public
ResponseEntity
getUser
(
@PathVariable
Long
id
){
return
new
ResponseEntity
(
userService
.
findById
(
id
),
HttpStatus
.
OK
);
}
@Log
(
description
=
"查询用户"
)
@GetMapping
(
value
=
"/users"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','USER_ALL','USER_SELECT')"
)
public
ResponseEntity
getUsers
(
UserDTO
userDTO
,
Pageable
pageable
){
return
new
ResponseEntity
(
userQueryService
.
queryAll
(
userDTO
,
pageable
),
HttpStatus
.
OK
);
}
@Log
(
description
=
"新增用户"
)
@PostMapping
(
value
=
"/users"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','USER_ALL','USER_CREATE')"
)
public
ResponseEntity
create
(
@Validated
@RequestBody
User
resources
){
if
(
resources
.
getId
()
!=
null
)
{
throw
new
BadRequestException
(
"A new "
+
ENTITY_NAME
+
" cannot already have an ID"
);
}
return
new
ResponseEntity
(
userService
.
create
(
resources
),
HttpStatus
.
CREATED
);
}
@Log
(
description
=
"修改用户"
)
@PutMapping
(
value
=
"/users"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','USER_ALL','USER_EDIT')"
)
public
ResponseEntity
update
(
@Validated
@RequestBody
User
resources
){
if
(
resources
.
getId
()
==
null
)
{
throw
new
BadRequestException
(
ENTITY_NAME
+
" ID Can not be empty"
);
}
userService
.
update
(
resources
);
return
new
ResponseEntity
(
HttpStatus
.
NO_CONTENT
);
}
@Log
(
description
=
"删除用户"
)
@DeleteMapping
(
value
=
"/users/{id}"
)
@PreAuthorize
(
"hasAnyRole('ADMIN','USER_ALL','USER_DELETE')"
)
public
ResponseEntity
delete
(
@PathVariable
Long
id
){
userService
.
delete
(
id
);
return
new
ResponseEntity
(
HttpStatus
.
OK
);
}
}
src/main/java/me/zhengjie/system/service/MenuService.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service
;
import
me.zhengjie.system.domain.Menu
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.service.dto.MenuDTO
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
/**
* @author jie
* @date 2018-12-17
*/
@CacheConfig
(
cacheNames
=
"menu"
)
public
interface
MenuService
{
/**
* get
* @param id
* @return
*/
@Cacheable
(
key
=
"#p0"
)
MenuDTO
findById
(
long
id
);
/**
* create
* @param resources
* @return
*/
@CacheEvict
(
allEntries
=
true
)
MenuDTO
create
(
Menu
resources
);
/**
* update
* @param resources
*/
@CacheEvict
(
allEntries
=
true
)
void
update
(
Menu
resources
);
/**
* delete
* @param id
*/
@CacheEvict
(
allEntries
=
true
)
void
delete
(
Long
id
);
/**
* permission tree
* @return
*/
@Cacheable
(
key
=
"'tree'"
)
Object
getMenuTree
(
List
<
Menu
>
menus
);
/**
* findByPid
* @param pid
* @return
*/
@Cacheable
(
key
=
"'pid:'+#p0"
)
List
<
Menu
>
findByPid
(
long
pid
);
/**
* build Tree
* @param menuDTOS
* @return
*/
Map
buildTree
(
List
<
MenuDTO
>
menuDTOS
);
/**
* findByRoles
* @param roles
* @return
*/
List
<
MenuDTO
>
findByRoles
(
Set
<
Role
>
roles
);
/**
* buildMenus
* @param byRoles
* @return
*/
Object
buildMenus
(
List
<
MenuDTO
>
byRoles
);
}
src/main/java/me/zhengjie/system/service/PermissionService.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service
;
import
me.zhengjie.system.domain.Permission
;
import
me.zhengjie.system.service.dto.PermissionDTO
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
import
java.util.List
;
/**
* @author jie
* @date 2018-12-08
*/
@CacheConfig
(
cacheNames
=
"permission"
)
public
interface
PermissionService
{
/**
* get
* @param id
* @return
*/
@Cacheable
(
key
=
"#p0"
)
PermissionDTO
findById
(
long
id
);
/**
* create
* @param resources
* @return
*/
@CacheEvict
(
allEntries
=
true
)
PermissionDTO
create
(
Permission
resources
);
/**
* update
* @param resources
*/
@CacheEvict
(
allEntries
=
true
)
void
update
(
Permission
resources
);
/**
* delete
* @param id
*/
@CacheEvict
(
allEntries
=
true
)
void
delete
(
Long
id
);
/**
* permission tree
* @return
*/
@Cacheable
(
key
=
"'tree'"
)
Object
getPermissionTree
(
List
<
Permission
>
permissions
);
/**
* findByPid
* @param pid
* @return
*/
@Cacheable
(
key
=
"'pid:'+#p0"
)
List
<
Permission
>
findByPid
(
long
pid
);
/**
* build Tree
* @param permissionDTOS
* @return
*/
Object
buildTree
(
List
<
PermissionDTO
>
permissionDTOS
);
}
src/main/java/me/zhengjie/system/service/RoleService.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.service.dto.RoleDTO
;
import
me.zhengjie.system.service.dto.UserDTO
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
/**
* @author jie
* @date 2018-12-03
*/
@CacheConfig
(
cacheNames
=
"role"
)
public
interface
RoleService
{
/**
* get
* @param id
* @return
*/
@Cacheable
(
key
=
"#p0"
)
RoleDTO
findById
(
long
id
);
/**
* create
* @param resources
* @return
*/
@CacheEvict
(
allEntries
=
true
)
RoleDTO
create
(
Role
resources
);
/**
* update
* @param resources
*/
@CacheEvict
(
allEntries
=
true
)
void
update
(
Role
resources
);
/**
* delete
* @param id
*/
@CacheEvict
(
allEntries
=
true
)
void
delete
(
Long
id
);
/**
* role tree
* @return
*/
@Cacheable
(
key
=
"'tree'"
)
Object
getRoleTree
();
}
src/main/java/me/zhengjie/system/service/UserService.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.service.dto.UserDTO
;
import
org.springframework.cache.annotation.CacheConfig
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
/**
* @author jie
* @date 2018-11-23
*/
@CacheConfig
(
cacheNames
=
"user"
)
public
interface
UserService
{
/**
* get
* @param id
* @return
*/
@Cacheable
(
key
=
"#p0"
)
UserDTO
findById
(
long
id
);
/**
* create
* @param resources
* @return
*/
@CacheEvict
(
allEntries
=
true
)
UserDTO
create
(
User
resources
);
/**
* update
* @param resources
*/
@CacheEvict
(
allEntries
=
true
)
void
update
(
User
resources
);
/**
* delete
* @param id
*/
@CacheEvict
(
allEntries
=
true
)
void
delete
(
Long
id
);
/**
* findByName
* @param userName
* @return
*/
@Cacheable
(
key
=
"'findByName'+#p0"
)
User
findByName
(
String
userName
);
}
src/main/java/me/zhengjie/system/service/dto/MenuDTO.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.dto
;
import
lombok.Data
;
import
java.sql.Timestamp
;
import
java.util.List
;
import
java.util.Set
;
/**
* @author jie
* @date 2018-12-17
*/
@Data
public
class
MenuDTO
{
private
Long
id
;
private
String
name
;
private
Long
soft
;
private
String
path
;
private
String
component
;
private
Long
pid
;
private
Boolean
iFrame
;
private
String
icon
;
private
Set
<
RoleDTO
>
roles
;
private
List
<
MenuDTO
>
children
;
private
Timestamp
createTime
;
}
src/main/java/me/zhengjie/system/service/dto/PermissionDTO.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.dto
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
import
java.util.List
;
/**
* @author jie
* @date 2018-12-03
*/
@Data
public
class
PermissionDTO
implements
Serializable
{
private
Long
id
;
private
String
name
;
private
Long
pid
;
private
String
alias
;
private
Timestamp
createTime
;
private
List
<
PermissionDTO
>
children
;
@Override
public
String
toString
()
{
return
"Permission{"
+
"id="
+
id
+
", name='"
+
name
+
'\''
+
", pid="
+
pid
+
", alias='"
+
alias
+
'\''
+
", createTime="
+
createTime
+
'}'
;
}
}
src/main/java/me/zhengjie/system/service/dto/RoleDTO.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.dto
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
import
java.util.Set
;
/**
* @author jie
* @date 2018-11-23
*/
@Data
public
class
RoleDTO
implements
Serializable
{
private
Long
id
;
private
String
name
;
private
String
remark
;
private
Set
<
PermissionDTO
>
permissions
;
private
Timestamp
createTime
;
}
src/main/java/me/zhengjie/system/service/dto/UserDTO.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.dto
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.sql.Timestamp
;
import
java.util.Date
;
import
java.util.Set
;
/**
* @author jie
* @date 2018-11-23
*/
@Data
public
class
UserDTO
implements
Serializable
{
private
Long
id
;
private
String
username
;
private
String
avatar
;
private
String
email
;
private
Boolean
enabled
;
@JsonIgnore
private
String
password
;
private
Timestamp
createTime
;
private
Date
lastPasswordResetTime
;
private
Set
<
RoleDTO
>
roles
;
}
src/main/java/me/zhengjie/system/service/impl/MenuServiceImpl.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.impl
;
import
cn.hutool.core.util.StrUtil
;
import
me.zhengjie.common.exception.EntityExistException
;
import
me.zhengjie.common.utils.ValidationUtil
;
import
me.zhengjie.system.domain.Menu
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.domain.vo.MenuMetaVo
;
import
me.zhengjie.system.domain.vo.MenuVo
;
import
me.zhengjie.system.repository.MenuRepository
;
import
me.zhengjie.system.service.MenuService
;
import
me.zhengjie.system.service.dto.MenuDTO
;
import
me.zhengjie.system.service.mapper.MenuMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
MenuServiceImpl
implements
MenuService
{
@Autowired
private
MenuRepository
menuRepository
;
@Autowired
private
MenuMapper
menuMapper
;
@Override
public
MenuDTO
findById
(
long
id
)
{
Optional
<
Menu
>
menu
=
menuRepository
.
findById
(
id
);
ValidationUtil
.
isNull
(
menu
,
"Menu"
,
"id"
,
id
);
return
menuMapper
.
toDto
(
menu
.
get
());
}
@Override
public
List
<
MenuDTO
>
findByRoles
(
Set
<
Role
>
roles
)
{
Set
<
Menu
>
menus
=
menuRepository
.
findByRoles
(
roles
);
return
menus
.
stream
().
map
(
menuMapper:
:
toDto
).
collect
(
Collectors
.
toList
());
}
@Override
public
MenuDTO
create
(
Menu
resources
)
{
if
(
menuRepository
.
findByName
(
resources
.
getName
())
!=
null
){
throw
new
EntityExistException
(
Menu
.
class
,
"name"
,
resources
.
getName
());
}
return
menuMapper
.
toDto
(
menuRepository
.
save
(
resources
));
}
@Override
public
void
update
(
Menu
resources
)
{
Optional
<
Menu
>
optionalPermission
=
menuRepository
.
findById
(
resources
.
getId
());
ValidationUtil
.
isNull
(
optionalPermission
,
"Permission"
,
"id"
,
resources
.
getId
());
Menu
menu
=
optionalPermission
.
get
();
Menu
menu1
=
menuRepository
.
findByName
(
resources
.
getName
());
if
(
menu1
!=
null
&&
!
menu1
.
getId
().
equals
(
menu
.
getId
())){
throw
new
EntityExistException
(
Menu
.
class
,
"name"
,
resources
.
getName
());
}
menu
.
setName
(
resources
.
getName
());
menu
.
setIcon
(
resources
.
getIcon
());
menu
.
setIFrame
(
resources
.
getIFrame
());
menu
.
setPid
(
resources
.
getPid
());
menu
.
setSoft
(
resources
.
getSoft
());
menuRepository
.
save
(
menu
);
}
@Override
public
void
delete
(
Long
id
)
{
List
<
Menu
>
menuList
=
menuRepository
.
findByPid
(
id
);
for
(
Menu
menu
:
menuList
)
{
menuRepository
.
delete
(
menu
);
}
menuRepository
.
deleteById
(
id
);
}
@Override
public
Object
getMenuTree
(
List
<
Menu
>
menus
)
{
List
<
Map
<
String
,
Object
>>
list
=
new
LinkedList
<>();
menus
.
forEach
(
menu
->
{
if
(
menu
!=
null
){
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"id"
,
menu
.
getId
());
map
.
put
(
"label"
,
menu
.
getName
());
list
.
add
(
map
);
}
}
);
return
list
;
}
@Override
public
List
<
Menu
>
findByPid
(
long
pid
)
{
return
menuRepository
.
findByPid
(
pid
);
}
@Override
public
Map
buildTree
(
List
<
MenuDTO
>
menuDTOS
)
{
List
<
MenuDTO
>
trees
=
new
ArrayList
<
MenuDTO
>();
for
(
MenuDTO
menuDTO
:
menuDTOS
)
{
if
(
"0"
.
equals
(
menuDTO
.
getPid
().
toString
()))
{
trees
.
add
(
menuDTO
);
}
for
(
MenuDTO
it
:
menuDTOS
)
{
if
(
it
.
getPid
().
equals
(
menuDTO
.
getId
()))
{
if
(
menuDTO
.
getChildren
()
==
null
)
{
menuDTO
.
setChildren
(
new
ArrayList
<
MenuDTO
>());
}
menuDTO
.
getChildren
().
add
(
it
);
}
}
}
Integer
totalElements
=
menuDTOS
!=
null
?
menuDTOS
.
size
():
0
;
Map
map
=
new
HashMap
();
map
.
put
(
"content"
,
trees
.
size
()
==
0
?
menuDTOS:
trees
);
map
.
put
(
"totalElements"
,
totalElements
);
return
map
;
}
@Override
public
List
<
MenuVo
>
buildMenus
(
List
<
MenuDTO
>
menuDTOS
)
{
List
<
MenuVo
>
list
=
new
LinkedList
<>();
menuDTOS
.
forEach
(
menuDTO
->
{
if
(
menuDTO
!=
null
){
List
<
MenuDTO
>
menuDTOList
=
menuDTO
.
getChildren
();
MenuVo
menuVo
=
new
MenuVo
();
menuVo
.
setName
(
menuDTO
.
getName
());
menuVo
.
setPath
(
menuDTO
.
getPath
());
if
(!
menuDTO
.
getIFrame
()){
if
(
menuDTO
.
getPid
().
equals
(
0L
)){
//一级目录需要加斜杠,不然访问不了
menuVo
.
setPath
(
"/"
+
menuDTO
.
getPath
());
}
menuVo
.
setComponent
(
StrUtil
.
isEmpty
(
menuDTO
.
getComponent
())?
"Layout"
:
menuDTO
.
getComponent
());
}
menuVo
.
setMeta
(
new
MenuMetaVo
(
menuDTO
.
getName
(),
menuDTO
.
getIcon
()));
if
(
menuDTOList
!=
null
&&
menuDTOList
.
size
()!=
0
){
menuVo
.
setAlwaysShow
(
true
);
menuVo
.
setChildren
(
buildMenus
(
menuDTOList
));
}
list
.
add
(
menuVo
);
}
}
);
return
list
;
}
}
src/main/java/me/zhengjie/system/service/impl/PermissionServiceImpl.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.impl
;
import
me.zhengjie.common.exception.EntityExistException
;
import
me.zhengjie.common.utils.ValidationUtil
;
import
me.zhengjie.system.domain.Permission
;
import
me.zhengjie.system.repository.PermissionRepository
;
import
me.zhengjie.system.service.PermissionService
;
import
me.zhengjie.system.service.dto.PermissionDTO
;
import
me.zhengjie.system.service.mapper.PermissionMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
/**
* @author jie
* @date 2018-12-03
*/
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
PermissionServiceImpl
implements
PermissionService
{
@Autowired
private
PermissionRepository
permissionRepository
;
@Autowired
private
PermissionMapper
permissionMapper
;
@Override
public
PermissionDTO
findById
(
long
id
)
{
Optional
<
Permission
>
permission
=
permissionRepository
.
findById
(
id
);
ValidationUtil
.
isNull
(
permission
,
"Permission"
,
"id"
,
id
);
return
permissionMapper
.
toDto
(
permission
.
get
());
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
PermissionDTO
create
(
Permission
resources
)
{
if
(
permissionRepository
.
findByName
(
resources
.
getName
())
!=
null
){
throw
new
EntityExistException
(
Permission
.
class
,
"name"
,
resources
.
getName
());
}
return
permissionMapper
.
toDto
(
permissionRepository
.
save
(
resources
));
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
update
(
Permission
resources
)
{
Optional
<
Permission
>
optionalPermission
=
permissionRepository
.
findById
(
resources
.
getId
());
ValidationUtil
.
isNull
(
optionalPermission
,
"Permission"
,
"id"
,
resources
.
getId
());
Permission
permission
=
optionalPermission
.
get
();
Permission
permission1
=
permissionRepository
.
findByName
(
resources
.
getName
());
if
(
permission1
!=
null
&&
!
permission1
.
getId
().
equals
(
permission
.
getId
())){
throw
new
EntityExistException
(
Permission
.
class
,
"name"
,
resources
.
getName
());
}
permission
.
setName
(
resources
.
getName
());
permission
.
setAlias
(
resources
.
getAlias
());
permission
.
setPid
(
resources
.
getPid
());
permissionRepository
.
save
(
permission
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
delete
(
Long
id
)
{
List
<
Permission
>
permissionList
=
permissionRepository
.
findByPid
(
id
);
for
(
Permission
permission
:
permissionList
)
{
permissionRepository
.
delete
(
permission
);
}
permissionRepository
.
deleteById
(
id
);
}
@Override
public
Object
getPermissionTree
(
List
<
Permission
>
permissions
)
{
List
<
Map
<
String
,
Object
>>
list
=
new
LinkedList
<>();
permissions
.
forEach
(
permission
->
{
if
(
permission
!=
null
){
List
<
Permission
>
permissionList
=
permissionRepository
.
findByPid
(
permission
.
getId
());
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"id"
,
permission
.
getId
());
map
.
put
(
"label"
,
permission
.
getAlias
());
if
(
permissionList
!=
null
&&
permissionList
.
size
()!=
0
){
map
.
put
(
"children"
,
getPermissionTree
(
permissionList
));
}
list
.
add
(
map
);
}
}
);
return
list
;
}
@Override
public
List
<
Permission
>
findByPid
(
long
pid
)
{
return
permissionRepository
.
findByPid
(
pid
);
}
@Override
public
Object
buildTree
(
List
<
PermissionDTO
>
permissionDTOS
)
{
List
<
PermissionDTO
>
trees
=
new
ArrayList
<
PermissionDTO
>();
for
(
PermissionDTO
permissionDTO
:
permissionDTOS
)
{
if
(
"0"
.
equals
(
permissionDTO
.
getPid
().
toString
()))
{
trees
.
add
(
permissionDTO
);
}
for
(
PermissionDTO
it
:
permissionDTOS
)
{
if
(
it
.
getPid
().
equals
(
permissionDTO
.
getId
()))
{
if
(
permissionDTO
.
getChildren
()
==
null
)
{
permissionDTO
.
setChildren
(
new
ArrayList
<
PermissionDTO
>());
}
permissionDTO
.
getChildren
().
add
(
it
);
}
}
}
Integer
totalElements
=
permissionDTOS
!=
null
?
permissionDTOS
.
size
():
0
;
Map
map
=
new
HashMap
();
map
.
put
(
"content"
,
trees
.
size
()
==
0
?
permissionDTOS:
trees
);
map
.
put
(
"totalElements"
,
totalElements
);
return
map
;
}
}
src/main/java/me/zhengjie/system/service/impl/RoleServiceImpl.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.impl
;
import
me.zhengjie.common.exception.EntityExistException
;
import
me.zhengjie.common.utils.ValidationUtil
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.repository.RoleRepository
;
import
me.zhengjie.system.service.RoleService
;
import
me.zhengjie.system.service.dto.RoleDTO
;
import
me.zhengjie.system.service.mapper.RoleMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
/**
* @author jie
* @date 2018-12-03
*/
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
RoleServiceImpl
implements
RoleService
{
@Autowired
private
RoleRepository
roleRepository
;
@Autowired
private
RoleMapper
roleMapper
;
@Override
public
RoleDTO
findById
(
long
id
)
{
Optional
<
Role
>
role
=
roleRepository
.
findById
(
id
);
ValidationUtil
.
isNull
(
role
,
"Role"
,
"id"
,
id
);
return
roleMapper
.
toDto
(
role
.
get
());
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
RoleDTO
create
(
Role
resources
)
{
if
(
roleRepository
.
findByName
(
resources
.
getName
())
!=
null
){
throw
new
EntityExistException
(
Role
.
class
,
"username"
,
resources
.
getName
());
}
return
roleMapper
.
toDto
(
roleRepository
.
save
(
resources
));
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
update
(
Role
resources
)
{
Optional
<
Role
>
optionalRole
=
roleRepository
.
findById
(
resources
.
getId
());
ValidationUtil
.
isNull
(
optionalRole
,
"Role"
,
"id"
,
resources
.
getId
());
Role
role
=
optionalRole
.
get
();
Role
role1
=
roleRepository
.
findByName
(
resources
.
getName
());
if
(
role1
!=
null
&&
!
role1
.
getId
().
equals
(
role
.
getId
())){
throw
new
EntityExistException
(
Role
.
class
,
"username"
,
resources
.
getName
());
}
role
.
setName
(
resources
.
getName
());
role
.
setRemark
(
resources
.
getRemark
());
role
.
setPermissions
(
resources
.
getPermissions
());
roleRepository
.
save
(
role
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
delete
(
Long
id
)
{
roleRepository
.
deleteById
(
id
);
}
@Override
public
Object
getRoleTree
()
{
List
<
Role
>
roleList
=
roleRepository
.
findAll
();
List
<
Map
<
String
,
Object
>>
list
=
new
ArrayList
<>();
for
(
Role
role
:
roleList
)
{
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"id"
,
role
.
getId
());
map
.
put
(
"label"
,
role
.
getName
());
list
.
add
(
map
);
}
return
list
;
}
}
src/main/java/me/zhengjie/system/service/impl/UserServiceImpl.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.impl
;
import
me.zhengjie.common.exception.BadRequestException
;
import
me.zhengjie.common.exception.EntityExistException
;
import
me.zhengjie.common.exception.EntityNotFoundException
;
import
me.zhengjie.common.utils.ValidationUtil
;
import
me.zhengjie.core.utils.EncryptUtils
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.repository.UserRepository
;
import
me.zhengjie.system.service.UserService
;
import
me.zhengjie.system.service.dto.UserDTO
;
import
me.zhengjie.system.service.mapper.UserMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.Optional
;
/**
* @author jie
* @date 2018-11-23
*/
@Service
@Transactional
(
propagation
=
Propagation
.
SUPPORTS
,
readOnly
=
true
,
rollbackFor
=
Exception
.
class
)
public
class
UserServiceImpl
implements
UserService
{
@Autowired
private
UserRepository
userRepository
;
@Autowired
private
UserMapper
userMapper
;
@Override
public
UserDTO
findById
(
long
id
)
{
Optional
<
User
>
user
=
userRepository
.
findById
(
id
);
ValidationUtil
.
isNull
(
user
,
"User"
,
"id"
,
id
);
return
userMapper
.
toDto
(
user
.
get
());
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
UserDTO
create
(
User
resources
)
{
if
(
userRepository
.
findByUsername
(
resources
.
getUsername
())!=
null
){
throw
new
EntityExistException
(
User
.
class
,
"username"
,
resources
.
getUsername
());
}
if
(
userRepository
.
findByEmail
(
resources
.
getEmail
())!=
null
){
throw
new
EntityExistException
(
User
.
class
,
"email"
,
resources
.
getEmail
());
}
if
(
resources
.
getRoles
()
==
null
||
resources
.
getRoles
().
size
()
==
0
){
throw
new
BadRequestException
(
"角色不能为空"
);
}
// 默认密码 123456
resources
.
setPassword
(
"14e1b600b1fd579f47433b88e8d85291"
);
resources
.
setAvatar
(
"https://i.loli.net/2018/12/06/5c08894d8de21.jpg"
);
return
userMapper
.
toDto
(
userRepository
.
save
(
resources
));
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
update
(
User
resources
)
{
Optional
<
User
>
userOptional
=
userRepository
.
findById
(
resources
.
getId
());
ValidationUtil
.
isNull
(
userOptional
,
"User"
,
"id"
,
resources
.
getId
());
User
user
=
userOptional
.
get
();
User
user1
=
userRepository
.
findByUsername
(
user
.
getUsername
());
User
user2
=
userRepository
.
findByEmail
(
user
.
getEmail
());
if
(
resources
.
getRoles
()
==
null
||
resources
.
getRoles
().
size
()
==
0
){
throw
new
BadRequestException
(
"角色不能为空"
);
}
if
(
user1
!=
null
&&!
user
.
getId
().
equals
(
user1
.
getId
())){
throw
new
EntityExistException
(
User
.
class
,
"username"
,
resources
.
getUsername
());
}
if
(
user2
!=
null
&&!
user
.
getId
().
equals
(
user2
.
getId
())){
throw
new
EntityExistException
(
User
.
class
,
"email"
,
resources
.
getEmail
());
}
user
.
setUsername
(
resources
.
getUsername
());
user
.
setEmail
(
resources
.
getEmail
());
user
.
setEnabled
(
resources
.
getEnabled
());
user
.
setRoles
(
resources
.
getRoles
());
userRepository
.
save
(
user
);
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
delete
(
Long
id
)
{
userRepository
.
deleteById
(
id
);
}
@Override
public
User
findByName
(
String
userName
)
{
User
user
=
null
;
if
(
ValidationUtil
.
isEmail
(
userName
)){
user
=
userRepository
.
findByEmail
(
userName
);
}
else
{
user
=
userRepository
.
findByUsername
(
userName
);
}
if
(
user
==
null
)
{
throw
new
EntityNotFoundException
(
User
.
class
,
"name"
,
userName
);
}
else
{
return
user
;
}
}
}
src/main/java/me/zhengjie/system/service/mapper/MenuMapper.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.mapper
;
import
me.zhengjie.common.mapper.EntityMapper
;
import
me.zhengjie.system.domain.Menu
;
import
me.zhengjie.system.service.dto.MenuDTO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
/**
* @author jie
* @date 2018-12-17
*/
@Mapper
(
componentModel
=
"spring"
,
uses
=
{
RoleMapper
.
class
},
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
MenuMapper
extends
EntityMapper
<
MenuDTO
,
Menu
>
{
}
src/main/java/me/zhengjie/system/service/mapper/PermissionMapper.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.mapper
;
import
me.zhengjie.common.mapper.EntityMapper
;
import
me.zhengjie.system.domain.Permission
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.service.dto.PermissionDTO
;
import
me.zhengjie.system.service.dto.RoleDTO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
/**
* @author jie
* @date 2018-11-23
*/
@Mapper
(
componentModel
=
"spring"
,
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
PermissionMapper
extends
EntityMapper
<
PermissionDTO
,
Permission
>
{
}
src/main/java/me/zhengjie/system/service/mapper/RoleMapper.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.mapper
;
import
me.zhengjie.common.mapper.EntityMapper
;
import
me.zhengjie.system.domain.Role
;
import
me.zhengjie.system.service.dto.RoleDTO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
/**
* @author jie
* @date 2018-11-23
*/
@Mapper
(
componentModel
=
"spring"
,
uses
=
{
PermissionMapper
.
class
},
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
RoleMapper
extends
EntityMapper
<
RoleDTO
,
Role
>
{
}
src/main/java/me/zhengjie/system/service/mapper/UserMapper.java
0 → 100644
View file @
3d74dac9
package
me.zhengjie.system.service.mapper
;
import
me.zhengjie.common.mapper.EntityMapper
;
import
me.zhengjie.system.domain.User
;
import
me.zhengjie.system.service.dto.UserDTO
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.ReportingPolicy
;
/**
* @author jie
* @date 2018-11-23
*/
@Mapper
(
componentModel
=
"spring"
,
uses
=
{
RoleMapper
.
class
},
unmappedTargetPolicy
=
ReportingPolicy
.
IGNORE
)
public
interface
UserMapper
extends
EntityMapper
<
UserDTO
,
User
>
{
}
Prev
1
2
3
4
5
Next
Write
Preview
Supports
Markdown
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