Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
basic-api-boot
概览
概览
详情
活动
周期分析
版本库
存储库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
Basic
basic-api-boot
Commits
753800a0
提交
753800a0
authored
3月 17, 2023
作者:
方治民
浏览文件
操作
浏览文件
下载
差异文件
合并分支 '3.0' 到 'beta'
feat: 大量基础代码更新 查看合并请求
!19
上级
e3493614
00c11956
流水线
#2028
已通过 于阶段
in 3 分 30 秒
变更
30
流水线
1
隐藏空白字符变更
内嵌
并排
正在显示
30 个修改的文件
包含
273 行增加
和
128 行删除
+273
-128
UserExtension.java
...c/main/java/com/yiring/app/domain/user/UserExtension.java
+2
-1
ExampleController.java
...in/java/com/yiring/app/web/example/ExampleController.java
+1
-1
Permission.java
...in/java/com/yiring/auth/domain/permission/Permission.java
+5
-2
Role.java
...-auth/src/main/java/com/yiring/auth/domain/role/Role.java
+3
-2
RoleRepository.java
...main/java/com/yiring/auth/domain/role/RoleRepository.java
+2
-1
User.java
...-auth/src/main/java/com/yiring/auth/domain/user/User.java
+3
-3
UserRepository.java
...main/java/com/yiring/auth/domain/user/UserRepository.java
+2
-25
RegisterParam.java
...c/main/java/com/yiring/auth/param/auth/RegisterParam.java
+2
-2
PermissionParam.java
...ava/com/yiring/auth/param/permission/PermissionParam.java
+2
-2
Auths.java
basic-auth/src/main/java/com/yiring/auth/util/Auths.java
+17
-5
Permissions.java
...-auth/src/main/java/com/yiring/auth/util/Permissions.java
+1
-0
PermissionVo.java
...main/java/com/yiring/auth/vo/permission/PermissionVo.java
+2
-2
UserVo.java
basic-auth/src/main/java/com/yiring/auth/vo/user/UserVo.java
+2
-2
AuthController.java
...rc/main/java/com/yiring/auth/web/auth/AuthController.java
+8
-8
PermissionController.java
.../yiring/auth/web/sys/permission/PermissionController.java
+1
-2
RoleController.java
...ain/java/com/yiring/auth/web/sys/role/RoleController.java
+1
-2
UserController.java
...ain/java/com/yiring/auth/web/sys/user/UserController.java
+3
-2
UserViewController.java
...ain/java/com/yiring/auth/web/user/UserViewController.java
+12
-2
BasicEntity.java
...e/src/main/java/com/yiring/common/domain/BasicEntity.java
+4
-6
Specifications.java
...src/main/java/com/yiring/common/utils/Specifications.java
+122
-0
OptionVo.java
...mon/core/src/main/java/com/yiring/common/vo/OptionVo.java
+13
-15
PageVo.java
...ommon/core/src/main/java/com/yiring/common/vo/PageVo.java
+10
-6
Category.java
...c-dict/src/main/java/com/yiring/dict/domain/Category.java
+3
-3
Dict.java
basic-dict/src/main/java/com/yiring/dict/domain/Dict.java
+7
-2
DictItem.java
...c-dict/src/main/java/com/yiring/dict/domain/DictItem.java
+4
-4
DictItemParam.java
...ct/src/main/java/com/yiring/dict/param/DictItemParam.java
+2
-2
SelectorDictItemParam.java
...ain/java/com/yiring/dict/param/SelectorDictItemParam.java
+2
-2
DictItemVo.java
basic-dict/src/main/java/com/yiring/dict/vo/DictItemVo.java
+2
-2
DictController.java
...ict/src/main/java/com/yiring/dict/web/DictController.java
+16
-7
DictItemController.java
...src/main/java/com/yiring/dict/web/DictItemController.java
+19
-15
没有找到文件。
app/src/main/java/com/yiring/app/domain/user/UserExtension.java
浏览文件 @
753800a0
...
...
@@ -9,6 +9,7 @@ import java.io.Serializable;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
import
lombok.experimental.FieldNameConstants
;
import
lombok.experimental.SuperBuilder
;
import
org.hibernate.annotations.Comment
;
/**
...
...
@@ -22,7 +23,7 @@ import org.hibernate.annotations.Comment;
@Getter
@Setter
@ToString
@
Builder
@
SuperBuilder
(
toBuilder
=
true
)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
...
...
app/src/main/java/com/yiring/app/web/example/ExampleController.java
浏览文件 @
753800a0
...
...
@@ -84,7 +84,7 @@ public class ExampleController {
String
text
=
i18n
.
get
(
"example.hello"
);
List
<
String
>
data
=
Arrays
.
asList
(
text
.
split
(
" "
));
PageVo
<
String
>
vo
=
PageVo
.
build
(
data
,
data
.
size
()
);
PageVo
<
String
>
vo
=
PageVo
.
build
(
data
);
return
Result
.
ok
(
vo
);
}
...
...
basic-auth/src/main/java/com/yiring/auth/domain/permission/Permission.java
浏览文件 @
753800a0
...
...
@@ -17,6 +17,7 @@ import lombok.experimental.SuperBuilder;
import
org.hibernate.annotations.Comment
;
import
org.hibernate.annotations.SQLDelete
;
import
org.hibernate.annotations.SQLDeleteAll
;
import
org.hibernate.annotations.Where
;
/**
* 权限
...
...
@@ -34,6 +35,7 @@ import org.hibernate.annotations.SQLDeleteAll;
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
@SQLDelete
(
sql
=
DELETE_SQL
+
BasicEntity
.
Where
.
WHERE_ID
)
@SQLDeleteAll
(
sql
=
DELETE_SQL
)
@Where
(
clause
=
BasicEntity
.
Where
.
EXIST
)
@Entity
@Table
(
name
=
TABLE_NAME
,
...
...
@@ -84,8 +86,9 @@ public class Permission extends BasicEntity implements Serializable {
@Comment
(
"是否隐藏"
)
Boolean
hidden
;
@Comment
(
"是否启用"
)
Boolean
enable
;
@Comment
(
"是否禁用"
)
@Column
(
columnDefinition
=
"bool default false"
)
Boolean
disabled
;
@Comment
(
"权限父级ID"
)
String
pid
;
...
...
basic-auth/src/main/java/com/yiring/auth/domain/role/Role.java
浏览文件 @
753800a0
...
...
@@ -61,8 +61,9 @@ public class Role extends BasicEntity implements Serializable {
@Column
(
nullable
=
false
)
String
name
;
@Comment
(
"是否启用"
)
Boolean
enable
;
@Comment
(
"是否禁用"
)
@Column
(
columnDefinition
=
"bool default false"
)
Boolean
disabled
;
@JsonIgnore
@Builder
.
Default
...
...
basic-auth/src/main/java/com/yiring/auth/domain/role/RoleRepository.java
浏览文件 @
753800a0
...
...
@@ -3,6 +3,7 @@ package com.yiring.auth.domain.role;
import
java.io.Serializable
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.stereotype.Repository
;
/**
...
...
@@ -13,4 +14,4 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public
interface
RoleRepository
extends
JpaRepository
<
Role
,
Serializable
>
{}
public
interface
RoleRepository
extends
JpaRepository
<
Role
,
Serializable
>
,
JpaSpecificationExecutor
<
Role
>
{}
basic-auth/src/main/java/com/yiring/auth/domain/user/User.java
浏览文件 @
753800a0
...
...
@@ -38,7 +38,7 @@ import org.hibernate.annotations.SQLDeleteAll;
@Entity
@Table
(
name
=
User
.
TABLE_NAME
,
indexes
=
{
@Index
(
columnList
=
User
.
Fields
.
en
abled
),
@Index
(
columnList
=
BasicEntity
.
Fields
.
deleted
)
},
indexes
=
{
@Index
(
columnList
=
User
.
Fields
.
dis
abled
),
@Index
(
columnList
=
BasicEntity
.
Fields
.
deleted
)
},
uniqueConstraints
=
{
@UniqueConstraint
(
columnNames
=
{
User
.
Fields
.
username
,
BasicEntity
.
Fields
.
deleted
}),
@UniqueConstraint
(
columnNames
=
{
User
.
Fields
.
mobile
,
BasicEntity
.
Fields
.
deleted
}),
...
...
@@ -72,8 +72,8 @@ public class User extends BasicEntity implements Serializable {
@Comment
(
"密码"
)
String
password
;
@Comment
(
"是否
启
用"
)
Boolean
en
abled
;
@Comment
(
"是否
禁
用"
)
Boolean
dis
abled
;
@JsonIgnore
@Builder
.
Default
...
...
basic-auth/src/main/java/com/yiring/auth/domain/user/UserRepository.java
浏览文件 @
753800a0
...
...
@@ -3,6 +3,7 @@ package com.yiring.auth.domain.user;
import
java.io.Serializable
;
import
org.springframework.data.jpa.repository.JpaRepository
;
import
org.springframework.data.jpa.repository.JpaSpecificationExecutor
;
import
org.springframework.data.jpa.repository.Query
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -14,31 +15,7 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public
interface
UserRepository
extends
JpaRepository
<
User
,
Serializable
>
{
/**
* 根据用户名称查询用户信息
*
* @param username 用户名
* @return 用户信息
*/
User
findByUsername
(
String
username
);
/**
* 根据手机号查询用户信息
*
* @param mobile 手机号
* @return 用户信息
*/
User
findByMobile
(
String
mobile
);
/**
* 根据邮箱查询用户信息
*
* @param email 邮箱
* @return 用户信息
*/
User
findByEmail
(
String
email
);
public
interface
UserRepository
extends
JpaRepository
<
User
,
Serializable
>,
JpaSpecificationExecutor
<
User
>
{
/**
* 根据用户名/手机号/邮箱查询用户信息
*
...
...
basic-auth/src/main/java/com/yiring/auth/param/auth/RegisterParam.java
浏览文件 @
753800a0
...
...
@@ -51,6 +51,6 @@ public class RegisterParam implements Serializable {
@Parameter
(
description
=
"邮箱"
,
example
=
"developer@yiring.com"
)
String
email
;
@Parameter
(
description
=
"是否
启用"
,
example
=
"tru
e"
)
Boolean
enable
;
@Parameter
(
description
=
"是否
禁用"
,
example
=
"fals
e"
)
Boolean
disabled
;
}
basic-auth/src/main/java/com/yiring/auth/param/permission/PermissionParam.java
浏览文件 @
753800a0
...
...
@@ -68,8 +68,8 @@ public class PermissionParam implements Serializable {
@Schema
(
description
=
"是否隐藏"
,
example
=
"false"
)
Boolean
hidden
;
@Schema
(
description
=
"是否
启用"
,
example
=
"tru
e"
)
Boolean
enable
;
@Schema
(
description
=
"是否
禁用"
,
example
=
"fals
e"
)
Boolean
disabled
;
@Schema
(
description
=
"父级ID"
,
example
=
"0"
)
@Builder
.
Default
...
...
basic-auth/src/main/java/com/yiring/auth/util/Auths.java
浏览文件 @
753800a0
...
...
@@ -29,6 +29,11 @@ public class Auths {
final
UserRepository
userRepository
;
/**
* 管理员用户
*/
public
static
final
String
ADMIN_USER
=
"admin"
;
/**
* 管理员角色标识
*/
public
static
final
List
<
String
>
ADMIN_ROLES
=
List
.
of
(
"admin"
,
"super-admin"
,
"platform-admin"
,
"data-admin"
);
...
...
@@ -48,7 +53,11 @@ public class Auths {
}
Optional
<
User
>
optional
=
userRepository
.
findById
(
Objects
.
toString
(
id
));
if
(
optional
.
isEmpty
())
{
if
(
optional
.
isEmpty
()
||
Boolean
.
TRUE
.
equals
(
optional
.
get
().
getDeleted
())
||
Boolean
.
TRUE
.
equals
(
optional
.
get
().
getDisabled
())
)
{
StpUtil
.
logout
(
id
);
throw
NotLoginException
.
newInstance
(
StpUtil
.
TYPE
,
NotLoginException
.
INVALID_TOKEN
);
}
...
...
@@ -99,10 +108,13 @@ public class Auths {
* @return 是否为管理员
*/
public
boolean
isAdmin
(
User
user
)
{
return
user
.
getRoles
()
.
stream
()
.
anyMatch
(
role
->
Boolean
.
TRUE
.
equals
(
role
.
getEnable
())
&&
ADMIN_ROLES
.
contains
(
role
.
getUid
()));
return
(
ADMIN_USER
.
equals
(
user
.
getUsername
())
||
user
.
getRoles
()
.
stream
()
.
anyMatch
(
role
->
Boolean
.
FALSE
.
equals
(
role
.
getDisabled
())
&&
ADMIN_ROLES
.
contains
(
role
.
getUid
()))
);
}
/**
...
...
basic-auth/src/main/java/com/yiring/auth/util/Permissions.java
浏览文件 @
753800a0
...
...
@@ -128,6 +128,7 @@ public class Permissions {
.
stream
()
.
map
(
Role:
:
getPermissions
)
.
flatMap
(
Set:
:
stream
)
.
filter
(
permission
->
Boolean
.
FALSE
.
equals
(
permission
.
getDeleted
()))
.
distinct
()
.
sorted
(
Comparator
.
comparing
(
Permission:
:
getTree
,
Comparator
.
comparingInt
(
String:
:
length
)))
.
collect
(
Collectors
.
toList
());
...
...
basic-auth/src/main/java/com/yiring/auth/vo/permission/PermissionVo.java
浏览文件 @
753800a0
...
...
@@ -59,8 +59,8 @@ public class PermissionVo implements Serializable {
@Parameter
(
description
=
"是否隐藏"
,
example
=
"false"
)
Boolean
hidden
;
@Parameter
(
description
=
"是否
启用"
,
example
=
"tru
e"
)
Boolean
enable
;
@Parameter
(
description
=
"是否
禁用"
,
example
=
"fals
e"
)
Boolean
disabled
;
@Parameter
(
description
=
"父级ID"
,
example
=
"0"
)
String
pid
;
...
...
basic-auth/src/main/java/com/yiring/auth/vo/user/UserVo.java
浏览文件 @
753800a0
...
...
@@ -47,8 +47,8 @@ public class UserVo implements Serializable {
@Schema
(
description
=
"头像"
,
example
=
"https://s1.ax1x.com/2022/03/30/qggJH0.jpg"
)
String
avatar
;
@Schema
(
description
=
"是否
启用"
,
example
=
"tru
e"
)
Boolean
en
abled
;
@Schema
(
description
=
"是否
禁用"
,
example
=
"fals
e"
)
Boolean
dis
abled
;
@Schema
(
description
=
"是否删除"
,
example
=
"false"
)
Boolean
deleted
;
...
...
basic-auth/src/main/java/com/yiring/auth/web/auth/AuthController.java
浏览文件 @
753800a0
...
...
@@ -85,7 +85,7 @@ public class AuthController {
.
realName
(
param
.
getRealName
())
.
username
(
param
.
getUsername
())
.
password
(
SaSecureUtil
.
sha256
(
param
.
getPassword
()))
.
enabled
(
param
.
getEnable
())
.
disabled
(
param
.
getDisabled
())
.
build
();
userRepository
.
saveAndFlush
(
user
);
return
Result
.
ok
();
...
...
@@ -100,22 +100,22 @@ public class AuthController {
throw
BusinessException
.
i18n
(
"Code.100003"
);
}
// 检查密码
String
cps
=
SaSecureUtil
.
sha256
(
param
.
getPassword
());
if
(!
cps
.
equals
(
user
.
getPassword
()))
{
throw
BusinessException
.
i18n
(
"Code.100003"
);
}
// 检查用户是否已被删除
if
(
Boolean
.
TRUE
.
equals
(
user
.
getDeleted
()))
{
throw
BusinessException
.
i18n
(
"Code.100004"
);
}
// 检查用户是否被允许登录
if
(
!
Boolean
.
TRUE
.
equals
(
user
.
getEn
abled
()))
{
if
(
Boolean
.
TRUE
.
equals
(
user
.
getDis
abled
()))
{
throw
BusinessException
.
i18n
(
"Code.100005"
);
}
// 检查密码
String
cps
=
SaSecureUtil
.
sha256
(
param
.
getPassword
());
if
(!
cps
.
equals
(
user
.
getPassword
()))
{
throw
BusinessException
.
i18n
(
"Code.100003"
);
}
// 更新用户信息
user
.
setLastLoginIp
(
Commons
.
getClientIpAddress
(
request
));
user
.
setLastLoginTime
(
LocalDateTime
.
now
());
...
...
basic-auth/src/main/java/com/yiring/auth/web/sys/permission/PermissionController.java
浏览文件 @
753800a0
...
...
@@ -118,7 +118,7 @@ public class PermissionController {
public
Result
<
PageVo
<
PermissionVo
>>
page
(
@ParameterObject
@Validated
PageParam
param
)
{
Page
<
Permission
>
page
=
permissionRepository
.
findAll
(
PageParam
.
toPageable
(
param
));
List
<
PermissionVo
>
data
=
Permissions
.
toPermissionVos
(
page
.
toList
());
PageVo
<
PermissionVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
());
PageVo
<
PermissionVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
()
,
page
.
getTotalPages
()
);
return
Result
.
ok
(
vo
);
}
...
...
@@ -168,7 +168,6 @@ public class PermissionController {
private
void
save
(
Permission
entity
,
PermissionParam
param
)
{
BeanUtils
.
copyProperties
(
param
,
entity
,
Permission
.
Fields
.
meta
);
entity
.
setTree
(
getTreeNode
(
param
.
getPid
()));
entity
.
setEnable
(
true
);
permissionRepository
.
saveAndFlush
(
entity
);
}
}
basic-auth/src/main/java/com/yiring/auth/web/sys/role/RoleController.java
浏览文件 @
753800a0
...
...
@@ -65,7 +65,6 @@ public class RoleController {
}
Role
entity
=
new
Role
();
entity
.
setEnable
(
true
);
BeanUtils
.
copyProperties
(
param
,
entity
);
roleRepository
.
saveAndFlush
(
entity
);
return
Result
.
ok
();
...
...
@@ -141,7 +140,7 @@ public class RoleController {
public
Result
<
PageVo
<
RoleVo
>>
page
(
@ParameterObject
@Validated
PageParam
param
)
{
Page
<
Role
>
page
=
roleRepository
.
findAll
(
PageParam
.
toPageable
(
param
));
List
<
RoleVo
>
data
=
new
ArrayList
<>(
Permissions
.
toRoleVos
(
page
.
toSet
()));
PageVo
<
RoleVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
());
PageVo
<
RoleVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
()
,
page
.
getTotalPages
()
);
return
Result
.
ok
(
vo
);
}
...
...
basic-auth/src/main/java/com/yiring/auth/web/sys/user/UserController.java
浏览文件 @
753800a0
...
...
@@ -12,6 +12,7 @@ import com.yiring.common.param.IdParam;
import
com.yiring.common.param.IdsParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.util.Commons
;
import
com.yiring.common.utils.Specifications
;
import
com.yiring.common.vo.PageVo
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.extensions.Extension
;
...
...
@@ -77,10 +78,10 @@ public class UserController {
@Operation
(
summary
=
"分页查询"
)
@GetMapping
(
"page"
)
public
Result
<
PageVo
<
UserVo
>>
page
(
@ParameterObject
@Validated
PageParam
param
)
{
Page
<
User
>
page
=
userRepository
.
findAll
(
PageParam
.
toPageable
(
param
));
Page
<
User
>
page
=
userRepository
.
findAll
(
Specifications
.
exist
(),
PageParam
.
toPageable
(
param
));
List
<
UserVo
>
data
=
page
.
get
().
map
(
user
->
Commons
.
transform
(
user
,
UserVo
.
class
)).
collect
(
Collectors
.
toList
());
PageVo
<
UserVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
());
PageVo
<
UserVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
()
,
page
.
getTotalPages
()
);
return
Result
.
ok
(
vo
);
}
}
basic-auth/src/main/java/com/yiring/auth/web/user/UserViewController.java
浏览文件 @
753800a0
...
...
@@ -2,6 +2,7 @@
package
com
.
yiring
.
auth
.
web
.
user
;
import
com.yiring.auth.domain.permission.Permission
;
import
com.yiring.auth.domain.permission.PermissionRepository
;
import
com.yiring.auth.domain.user.User
;
import
com.yiring.auth.util.Auths
;
import
com.yiring.auth.util.Permissions
;
...
...
@@ -43,6 +44,7 @@ import org.springframework.web.bind.annotation.RestController;
public
class
UserViewController
{
final
Auths
auths
;
final
PermissionRepository
permissionRepository
;
@Operation
(
summary
=
"获取登录用户信息"
)
@GetMapping
(
"getUserInfo"
)
...
...
@@ -64,8 +66,16 @@ public class UserViewController {
@GetMapping
(
"getMenuList"
)
public
Result
<
ArrayList
<
MenuVo
>>
getMenuList
()
{
User
user
=
auths
.
getLoginUser
();
List
<
Permission
>
permissions
=
Permissions
.
toPermissions
(
user
.
getRoles
())
// FIXED: admin 用户默认可以查询到所有菜单
List
<
Permission
>
list
;
if
(
Auths
.
ADMIN_USER
.
equalsIgnoreCase
(
user
.
getUsername
()))
{
list
=
permissionRepository
.
findAll
();
}
else
{
list
=
Permissions
.
toPermissions
(
user
.
getRoles
());
}
List
<
Permission
>
permissions
=
list
.
stream
()
.
filter
(
permission
->
!
Permission
.
Type
.
BUTTON
.
equals
(
permission
.
getType
()))
.
collect
(
Collectors
.
toList
());
...
...
basic-common/core/src/main/java/com/yiring/common/domain/BasicEntity.java
浏览文件 @
753800a0
...
...
@@ -2,10 +2,7 @@
package
com
.
yiring
.
common
.
domain
;
import
com.yiring.common.snowflake.SnowflakeId
;
import
jakarta.persistence.EntityListeners
;
import
jakarta.persistence.GeneratedValue
;
import
jakarta.persistence.Id
;
import
jakarta.persistence.MappedSuperclass
;
import
jakarta.persistence.*
;
import
java.time.LocalDateTime
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
...
...
@@ -38,7 +35,7 @@ import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Filter
(
name
=
"deletedFilter"
,
condition
=
"deleted = :isDeleted"
)
@EntityListeners
(
AuditingEntityListener
.
class
)
@MappedSuperclass
public
abstract
class
BasicEntity
{
public
class
BasicEntity
{
@Comment
(
"主键"
)
@Id
...
...
@@ -62,8 +59,9 @@ public abstract class BasicEntity {
@LastModifiedDate
LocalDateTime
updateTime
;
@Comment
(
"删除时间"
)
@Builder
.
Default
@Comment
(
"删除时间"
)
@Column
(
columnDefinition
=
"bool default false"
)
Boolean
deleted
=
Boolean
.
FALSE
;
public
interface
Where
{
...
...
basic-common/core/src/main/java/com/yiring/common/utils/Specifications.java
0 → 100644
浏览文件 @
753800a0
/* (C) 2023 YiRing, Inc. */
package
com
.
yiring
.
common
.
utils
;
import
com.yiring.common.domain.BasicEntity
;
import
jakarta.persistence.criteria.CriteriaBuilder
;
import
jakarta.persistence.criteria.CriteriaQuery
;
import
jakarta.persistence.criteria.Predicate
;
import
jakarta.persistence.criteria.Root
;
import
java.lang.reflect.Constructor
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
import
lombok.SneakyThrows
;
import
lombok.experimental.UtilityClass
;
import
org.springframework.data.domain.Example
;
import
org.springframework.data.jpa.domain.Specification
;
/**
* @author Jim
* @version 0.1
* 2023/3/17 16:36
*/
@SuppressWarnings
(
"unused"
)
@UtilityClass
public
class
Specifications
{
/**
* 构建谓词条件,支持扩展条件
*
* @param fn 回调函数
* @param <T> Entity 类型
* @return Specification
*/
public
static
<
T
>
Specification
<
T
>
of
(
CallbackFunction
<
Root
<
T
>,
CriteriaQuery
<?>,
CriteriaBuilder
,
List
<
Predicate
>>
fn
)
{
return
build
(
fn
,
null
);
}
/**
* 构建存在的谓词条件,支持扩展条件
*
* @param fn 回调函数
* @param <T> Entity 类型
* @return Specification
*/
public
static
<
T
>
Specification
<
T
>
exist
(
CallbackFunction
<
Root
<
T
>,
CriteriaQuery
<?>,
CriteriaBuilder
,
List
<
Predicate
>>
fn
)
{
return
build
(
fn
,
false
);
}
/**
* 构建存在的谓词条件
*
* @param <T> Entity 类型
* @return Specification
*/
public
static
<
T
>
Specification
<
T
>
exist
()
{
return
build
(
null
,
false
);
}
/**
* 构建存在的 Example
*
* @param type Entity 类型
* @return Example
*/
@SneakyThrows
public
static
<
T
extends
BasicEntity
>
Example
<
T
>
exist
(
Class
<
T
>
type
)
{
Constructor
<
T
>
declaredConstructor
=
type
.
getDeclaredConstructor
();
T
probe
=
declaredConstructor
.
newInstance
();
probe
.
setDeleted
(
false
);
return
Example
.
of
(
probe
);
}
/**
* 构建存在的谓词条件
*
* @param fn 回调函数
* @param deleted 是否删除
* @param <T> Entity 类型
* @return Specification
*/
private
static
<
T
>
Specification
<
T
>
build
(
CallbackFunction
<
Root
<
T
>,
CriteriaQuery
<?>,
CriteriaBuilder
,
List
<
Predicate
>>
fn
,
Boolean
deleted
)
{
return
(
root
,
query
,
cb
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
if
(
Objects
.
nonNull
(
deleted
))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
BasicEntity
.
Fields
.
deleted
),
deleted
));
}
if
(
Objects
.
nonNull
(
fn
))
{
fn
.
apply
(
root
,
query
,
cb
,
predicates
);
}
return
query
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
])).
getRestriction
();
};
}
/**
* 构建存在的谓词条件
*
* @param root 根
* @param cb 构建器
* @return 谓词
*/
public
static
List
<
Predicate
>
buildExistPredicates
(
Root
<?>
root
,
CriteriaBuilder
cb
)
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
predicates
.
add
(
cb
.
equal
(
root
.
get
(
BasicEntity
.
Fields
.
deleted
),
false
));
return
predicates
;
}
@FunctionalInterface
public
interface
CallbackFunction
<
R
,
Q
,
C
,
P
>
{
void
apply
(
R
root
,
Q
query
,
C
cb
,
P
predicates
);
}
}
basic-common/core/src/main/java/com/yiring/common/vo/
KeyValue
Vo.java
→
basic-common/core/src/main/java/com/yiring/common/vo/
Option
Vo.java
浏览文件 @
753800a0
...
...
@@ -4,43 +4,41 @@ package com.yiring.common.vo;
import
io.swagger.v3.oas.annotations.media.Schema
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.List
;
import
lombok.*
;
import
lombok.experimental.FieldDefaults
;
/**
*
键值对输出
*
选项 VO
*
* @author ifzm
* @version 0.1
* 2022/3/24 17:29
*/
@Schema
(
name
=
"
KeyValueVo"
,
description
=
"键值对响应输出
"
)
@Schema
(
name
=
"
OptionVo"
,
description
=
"选项 VO
"
)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults
(
level
=
AccessLevel
.
PRIVATE
)
public
class
KeyValue
Vo
implements
Serializable
{
public
class
Option
Vo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
-
5238793972067296346L
;
@Schema
(
description
=
"key"
,
example
=
"key"
)
String
key
;
private
static
final
long
serialVersionUID
=
7178232019485233157L
;
@Schema
(
description
=
"value"
,
example
=
"value"
)
String
value
;
/**
* 扩展字段,可用于文本输出
*/
@Schema
(
description
=
"label"
,
example
=
"label"
)
String
label
;
/**
* 扩展字段,可用于显示禁用状态
*/
@Schema
(
description
=
"是否启用"
,
example
=
"true"
)
String
enable
;
@Schema
(
description
=
"disabled"
,
example
=
"false"
)
Boolean
disabled
;
@Schema
(
description
=
"extra"
)
Object
extra
;
@Schema
(
description
=
"children"
,
example
=
"[]"
)
List
<
OptionVo
>
children
;
}
basic-common/core/src/main/java/com/yiring/common/vo/PageVo.java
浏览文件 @
753800a0
...
...
@@ -37,6 +37,9 @@ public class PageVo<T extends Serializable> implements Serializable {
@Schema
(
description
=
"数据总数"
,
example
=
"100"
)
Long
total
;
@Schema
(
description
=
"分页页数"
,
example
=
"10"
)
Integer
pages
;
/**
* 通常在带有时效性的数据查询时有用途(可选参数)
*/
...
...
@@ -51,7 +54,7 @@ public class PageVo<T extends Serializable> implements Serializable {
*/
@SuppressWarnings
({
"unused"
})
public
static
<
R
extends
Serializable
>
PageVo
<
R
>
build
(
List
<
R
>
data
)
{
return
build
(
data
,
data
.
size
());
return
build
(
data
,
data
.
size
()
,
1
);
}
/**
...
...
@@ -62,8 +65,8 @@ public class PageVo<T extends Serializable> implements Serializable {
* @return PageVo
*/
@SuppressWarnings
({
"unused"
})
public
static
<
R
extends
Serializable
>
PageVo
<
R
>
build
(
List
<
R
>
data
,
long
total
)
{
return
build
(
data
,
total
,
null
);
public
static
<
R
extends
Serializable
>
PageVo
<
R
>
build
(
List
<
R
>
data
,
long
total
,
int
pages
)
{
return
build
(
data
,
total
,
pages
,
null
);
}
/**
...
...
@@ -75,10 +78,11 @@ public class PageVo<T extends Serializable> implements Serializable {
* @return PageVo
*/
@SuppressWarnings
({
"unused"
})
public
static
<
R
extends
Serializable
>
PageVo
<
R
>
build
(
List
<
R
>
data
,
long
total
,
LocalDateTime
latest
)
{
public
static
<
R
extends
Serializable
>
PageVo
<
R
>
build
(
List
<
R
>
data
,
long
total
,
int
pages
,
LocalDateTime
latest
)
{
PageVo
<
R
>
vo
=
new
PageVo
<>();
vo
.
setData
(
data
);
vo
.
setTotal
(
total
);
vo
.
setPages
(
pages
);
vo
.
setLatest
(
latest
);
return
vo
;
}
...
...
@@ -95,7 +99,7 @@ public class PageVo<T extends Serializable> implements Serializable {
@SuppressWarnings
({
"unused"
})
public
static
<
S
,
T
extends
Serializable
>
PageVo
<
T
>
toPageVo
(
Page
<
S
>
page
,
Class
<
T
>
type
)
{
List
<
T
>
data
=
Commons
.
transform
(
page
.
toList
(),
type
);
return
build
(
data
,
page
.
getTotalElements
());
return
build
(
data
,
page
.
getTotalElements
()
,
1
);
}
/**
...
...
@@ -103,6 +107,6 @@ public class PageVo<T extends Serializable> implements Serializable {
*/
@SuppressWarnings
(
"unused"
)
public
static
<
T
extends
Serializable
>
PageVo
<
T
>
empty
()
{
return
PageVo
.
build
(
Collections
.
emptyList
(),
0
);
return
build
(
Collections
.
emptyList
(),
0
,
1
);
}
}
basic-dict/src/main/java/com/yiring/dict/domain/Category.java
浏览文件 @
753800a0
...
...
@@ -69,7 +69,7 @@ public class Category extends BasicEntity implements Serializable {
@Comment
(
"分类父级 ID"
)
String
pid
;
@Comment
(
"
分类是否启
用"
)
@Column
(
nullable
=
false
)
Boolean
enable
;
@Comment
(
"
是否禁
用"
)
@Column
(
nullable
=
false
,
columnDefinition
=
"bool default false"
)
Boolean
disabled
;
}
basic-dict/src/main/java/com/yiring/dict/domain/Dict.java
浏览文件 @
753800a0
...
...
@@ -42,7 +42,8 @@ import org.hibernate.annotations.SQLDeleteAll;
@Index
(
columnList
=
BasicEntity
.
Fields
.
deleted
),
@Index
(
columnList
=
Dict
.
Fields
.
name
),
@Index
(
columnList
=
Dict
.
Fields
.
code
),
}
},
uniqueConstraints
=
{
@UniqueConstraint
(
columnNames
=
{
Dict
.
Fields
.
code
,
BasicEntity
.
Fields
.
deleted
})
}
)
@Comment
(
"数据字典"
)
public
class
Dict
extends
BasicEntity
implements
Serializable
{
...
...
@@ -58,12 +59,16 @@ public class Dict extends BasicEntity implements Serializable {
String
name
;
@Comment
(
"字典编号"
)
@Column
(
nullable
=
false
,
unique
=
true
)
@Column
(
nullable
=
false
)
String
code
;
@Comment
(
"字典描述"
)
String
description
;
@Comment
(
"是否禁用"
)
@Column
(
columnDefinition
=
"bool default false"
)
Boolean
disabled
;
@JsonIgnore
@Builder
.
Default
@Comment
(
"字典选项集合"
)
...
...
basic-dict/src/main/java/com/yiring/dict/domain/DictItem.java
浏览文件 @
753800a0
...
...
@@ -39,7 +39,7 @@ import org.hibernate.annotations.SQLDeleteAll;
indexes
=
{
@Index
(
columnList
=
BasicEntity
.
Fields
.
deleted
),
@Index
(
columnList
=
DictItem
.
Fields
.
name
),
@Index
(
columnList
=
DictItem
.
Fields
.
enable
),
@Index
(
columnList
=
DictItem
.
Fields
.
disabled
),
}
)
@Comment
(
"数据字典选项"
)
...
...
@@ -70,7 +70,7 @@ public class DictItem extends BasicEntity implements Serializable {
@Comment
(
"字典选项排序序号"
)
Integer
serial
;
@Comment
(
"
字典选项是否启
用"
)
@Column
(
nullable
=
false
)
Boolean
enable
;
@Comment
(
"
是否禁
用"
)
@Column
(
columnDefinition
=
"bool default false"
)
Boolean
disabled
;
}
basic-dict/src/main/java/com/yiring/dict/param/DictItemParam.java
浏览文件 @
753800a0
...
...
@@ -52,7 +52,7 @@ public class DictItemParam implements Serializable {
@Parameter
(
description
=
"字典选项排序序号"
)
Integer
serial
;
@Parameter
(
description
=
"
字典选项是否启用"
,
example
=
"tru
e"
)
@Parameter
(
description
=
"
是否禁用"
,
example
=
"fals
e"
)
@NotNull
Boolean
enable
;
Boolean
disabled
;
}
basic-dict/src/main/java/com/yiring/dict/param/SelectorDictItemParam.java
浏览文件 @
753800a0
...
...
@@ -33,6 +33,6 @@ public class SelectorDictItemParam implements Serializable {
@Parameter
(
description
=
"字典 ID"
,
example
=
"1"
)
String
dictCode
;
@Parameter
(
description
=
"
字典选项是否启用"
,
example
=
"tru
e"
)
Boolean
enable
;
@Parameter
(
description
=
"
是否禁用"
,
example
=
"fals
e"
)
Boolean
disabled
;
}
basic-dict/src/main/java/com/yiring/dict/vo/DictItemVo.java
浏览文件 @
753800a0
...
...
@@ -41,6 +41,6 @@ public class DictItemVo implements Serializable {
@Schema
(
description
=
"字典选项排序序号"
,
example
=
"1"
)
Integer
serial
;
@Schema
(
description
=
"
字典选项是否启用"
,
example
=
"tru
e"
)
Boolean
enable
;
@Schema
(
description
=
"
是否禁用"
,
example
=
"fals
e"
)
Boolean
disabled
;
}
basic-dict/src/main/java/com/yiring/dict/web/DictController.java
浏览文件 @
753800a0
...
...
@@ -8,8 +8,9 @@ import com.yiring.common.param.IdParam;
import
com.yiring.common.param.IdsParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.util.Commons
;
import
com.yiring.common.utils.Specifications
;
import
com.yiring.common.validation.group.Group
;
import
com.yiring.common.vo.
KeyValue
Vo
;
import
com.yiring.common.vo.
Option
Vo
;
import
com.yiring.common.vo.PageVo
;
import
com.yiring.dict.domain.Dict
;
import
com.yiring.dict.domain.DictRepository
;
...
...
@@ -112,19 +113,27 @@ public class DictController {
@Operation
(
summary
=
"分页查询"
)
@GetMapping
(
"page"
)
public
Result
<
PageVo
<
DictVo
>>
page
(
@ParameterObject
@Validated
PageParam
param
)
{
Page
<
Dict
>
page
=
dictRepository
.
findAll
(
PageParam
.
toPageable
(
param
));
Page
<
Dict
>
page
=
dictRepository
.
findAll
(
Specifications
.
exist
(),
PageParam
.
toPageable
(
param
));
List
<
DictVo
>
data
=
Commons
.
transform
(
page
.
getContent
(),
DictVo
.
class
);
PageVo
<
DictVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
());
PageVo
<
DictVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
()
,
page
.
getTotalPages
()
);
return
Result
.
ok
(
vo
);
}
@Operation
(
summary
=
"选项查询"
)
@GetMapping
(
"selector"
)
public
Result
<
ArrayList
<
KeyValue
Vo
>>
selector
()
{
List
<
Dict
>
dictList
=
dictRepository
.
findAll
();
ArrayList
<
KeyValue
Vo
>
vos
=
dictList
public
Result
<
ArrayList
<
Option
Vo
>>
selector
()
{
List
<
Dict
>
dictList
=
dictRepository
.
findAll
(
Specifications
.
exist
()
);
ArrayList
<
Option
Vo
>
vos
=
dictList
.
stream
()
.
map
(
dict
->
KeyValueVo
.
builder
().
key
(
dict
.
getId
()).
value
(
dict
.
getCode
()).
label
(
dict
.
getName
()).
build
())
.
map
(
dict
->
OptionVo
.
builder
()
.
value
(
dict
.
getId
())
.
label
(
dict
.
getName
())
.
extra
(
dict
.
getCode
())
.
disabled
(
dict
.
getDisabled
())
.
build
()
)
.
collect
(
Collectors
.
toCollection
(
ArrayList:
:
new
));
return
Result
.
ok
(
vos
);
}
...
...
basic-dict/src/main/java/com/yiring/dict/web/DictItemController.java
浏览文件 @
753800a0
...
...
@@ -10,8 +10,9 @@ import com.yiring.common.param.IdParam;
import
com.yiring.common.param.IdsParam
;
import
com.yiring.common.param.PageParam
;
import
com.yiring.common.util.Commons
;
import
com.yiring.common.utils.Specifications
;
import
com.yiring.common.validation.group.Group
;
import
com.yiring.common.vo.
KeyValue
Vo
;
import
com.yiring.common.vo.
Option
Vo
;
import
com.yiring.common.vo.PageVo
;
import
com.yiring.dict.domain.Dict
;
import
com.yiring.dict.domain.DictItem
;
...
...
@@ -23,7 +24,6 @@ import io.swagger.v3.oas.annotations.Operation;
import
io.swagger.v3.oas.annotations.extensions.Extension
;
import
io.swagger.v3.oas.annotations.extensions.ExtensionProperty
;
import
io.swagger.v3.oas.annotations.tags.Tag
;
import
jakarta.persistence.criteria.Predicate
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Objects
;
...
...
@@ -111,24 +111,22 @@ public class DictItemController {
@Operation
(
summary
=
"分页查询"
)
@GetMapping
(
"page"
)
public
Result
<
PageVo
<
DictItemVo
>>
page
(
@ParameterObject
@Validated
PageParam
param
)
{
Page
<
DictItem
>
page
=
dictItemRepository
.
findAll
(
PageParam
.
toPageable
(
param
));
Page
<
DictItem
>
page
=
dictItemRepository
.
findAll
(
Specifications
.
exist
(),
PageParam
.
toPageable
(
param
));
List
<
DictItemVo
>
data
=
Commons
.
transform
(
page
.
toList
(),
DictItemVo
.
class
);
PageVo
<
DictItemVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
());
PageVo
<
DictItemVo
>
vo
=
PageVo
.
build
(
data
,
page
.
getTotalElements
()
,
page
.
getTotalPages
()
);
return
Result
.
ok
(
vo
);
}
@Operation
(
summary
=
"选项查询"
)
@GetMapping
(
"selector"
)
public
Result
<
ArrayList
<
KeyValue
Vo
>>
selector
(
@ParameterObject
@Validated
SelectorDictItemParam
param
)
{
public
Result
<
ArrayList
<
Option
Vo
>>
selector
(
@ParameterObject
@Validated
SelectorDictItemParam
param
)
{
if
(
StrUtil
.
isBlank
(
param
.
getDictId
())
&&
StrUtil
.
isBlank
(
param
.
getDictCode
()))
{
throw
BusinessException
.
i18n
(
"Code.101001"
);
}
Specification
<
DictItem
>
specification
=
(
root
,
query
,
cb
)
->
{
List
<
Predicate
>
predicates
=
new
ArrayList
<>();
if
(
Objects
.
nonNull
(
param
.
getEnable
()))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
DictItem
.
Fields
.
enable
),
param
.
getEnable
()));
Specification
<
DictItem
>
specification
=
Specifications
.
exist
((
root
,
query
,
cb
,
predicates
)
->
{
if
(
Objects
.
nonNull
(
param
.
getDisabled
()))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
DictItem
.
Fields
.
disabled
),
param
.
getDisabled
()));
}
if
(
Objects
.
nonNull
(
param
.
getDictId
()))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
DictItem
.
Fields
.
dict
).
get
(
BasicEntity
.
Fields
.
id
),
param
.
getDictId
()));
...
...
@@ -136,14 +134,20 @@ public class DictItemController {
if
(
Objects
.
nonNull
(
param
.
getDictCode
()))
{
predicates
.
add
(
cb
.
equal
(
root
.
get
(
DictItem
.
Fields
.
dict
).
get
(
Dict
.
Fields
.
code
),
param
.
getDictCode
()));
}
return
query
.
where
(
predicates
.
toArray
(
new
Predicate
[
0
])).
getRestriction
();
};
});
List
<
DictItem
>
items
=
dictItemRepository
.
findAll
(
specification
);
ArrayList
<
KeyValue
Vo
>
vos
=
items
ArrayList
<
Option
Vo
>
vos
=
items
.
stream
()
.
map
(
item
->
KeyValueVo
.
builder
().
key
(
item
.
getId
()).
value
(
item
.
getValue
()).
label
(
item
.
getName
()).
build
())
.
map
(
item
->
OptionVo
.
builder
()
.
value
(
item
.
getId
())
.
label
(
item
.
getName
())
.
extra
(
item
.
getValue
())
.
disabled
(
item
.
getDisabled
())
.
build
()
)
.
collect
(
Collectors
.
toCollection
(
ArrayList:
:
new
));
return
Result
.
ok
(
vos
);
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论