Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
张文彪
/
employmentBusinessPc
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e4dbdb03
authored
Nov 26, 2025
by
zwb
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
招聘会演示平台搭建与简历导入
parent
e68b3ab2
Hide whitespace changes
Inline
Side-by-side
Showing
56 changed files
with
4982 additions
and
0 deletions
employmentBusiness-pc-api/src/main/java/com/bkty/system/api/domain/SysUserOnline.java
employmentBusiness-pc-auth/src/main/java/com/bkty/captcha/UnsignedMathGenerator.java
employmentBusiness-pc-auth/src/main/java/com/bkty/controller/TokenController.java
employmentBusiness-pc-auth/src/main/java/com/bkty/domain/convert/TenantVoConvert.java
employmentBusiness-pc-auth/src/main/java/com/bkty/domain/vo/TenantListVo.java
employmentBusiness-pc-auth/src/main/java/com/bkty/listener/UserActionListener.java
employmentBusiness-pc-auth/src/main/java/com/bkty/service/SysLoginService.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/TimeConstants.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/domain/UserLoginInfo.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/TimeTool.java
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java
employmentBusiness-pc-common/employmentBusiness-pc-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/config/ThreadPoolConfig.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysMenuDto.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysRoleDto.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysUserDto.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysMenu.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRole.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRoleDept.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRoleMenu.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysUser.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysUserRole.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysMenuVo.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysRoleVo.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysUserExportVo.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysUserVo.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysMenuMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleDeptMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleMenuMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysUserMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysUserRoleMapper.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysMenuServiceImpl.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysPermissionServiceImpl.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysRoleServiceImpl.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysUserServiceImpl.java
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysDeptMapper.xml
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysMenuMapper.xml
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysRoleMapper.xml
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysUserMapper.xml
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/lib/typescriptServices.js
employmentBusiness-pc-api/src/main/java/com/bkty/system/api/domain/SysUserOnline.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
api
.
domain
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serial
;
import
java.io.Serializable
;
/**
* 当前在线会话
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public
class
SysUserOnline
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 会话编号
*/
private
String
tokenId
;
/**
* 部门名称
*/
private
String
deptName
;
/**
* 用户名称
*/
private
String
userName
;
/**
* 客户端
*/
private
String
clientKey
;
/**
* 设备类型
*/
private
String
deviceType
;
/**
* 登录IP地址
*/
private
String
ipaddr
;
/**
* 登录地址
*/
private
String
loginLocation
;
/**
* 浏览器类型
*/
private
String
browser
;
/**
* 操作系统
*/
private
String
os
;
/**
* 登录时间
*/
private
Long
loginTime
;
}
employmentBusiness-pc-auth/src/main/java/com/bkty/captcha/UnsignedMathGenerator.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
captcha
;
import
cn.hutool.captcha.generator.CodeGenerator
;
import
cn.hutool.core.math.Calculator
;
import
cn.hutool.core.util.CharUtil
;
import
cn.hutool.core.util.RandomUtil
;
import
org.dromara.common.core.utils.StringUtils
;
import
java.io.Serial
;
/**
* 无符号计算生成器
*
* @author Lion Li
*/
public
class
UnsignedMathGenerator
implements
CodeGenerator
{
@Serial
private
static
final
long
serialVersionUID
=
-
5514819971774091076L
;
private
static
final
String
OPERATORS
=
"+-*"
;
/**
* 参与计算数字最大长度
*/
private
final
int
numberLength
;
/**
* 构造
*/
public
UnsignedMathGenerator
()
{
this
(
2
);
}
/**
* 构造
*
* @param numberLength 参与计算最大数字位数
*/
public
UnsignedMathGenerator
(
int
numberLength
)
{
this
.
numberLength
=
numberLength
;
}
@Override
public
String
generate
()
{
final
int
limit
=
getLimit
();
int
a
=
RandomUtil
.
randomInt
(
limit
);
int
b
=
RandomUtil
.
randomInt
(
limit
);
String
max
=
Integer
.
toString
(
Math
.
max
(
a
,
b
));
String
min
=
Integer
.
toString
(
Math
.
min
(
a
,
b
));
max
=
StringUtils
.
rightPad
(
max
,
this
.
numberLength
,
CharUtil
.
SPACE
);
min
=
StringUtils
.
rightPad
(
min
,
this
.
numberLength
,
CharUtil
.
SPACE
);
return
max
+
RandomUtil
.
randomChar
(
OPERATORS
)
+
min
+
'='
;
}
@Override
public
boolean
verify
(
String
code
,
String
userInputCode
)
{
int
result
;
try
{
result
=
Integer
.
parseInt
(
userInputCode
);
}
catch
(
NumberFormatException
e
)
{
// 用户输入非数字
return
false
;
}
final
int
calculateResult
=
(
int
)
Calculator
.
conversion
(
code
);
return
result
==
calculateResult
;
}
/**
* 获取验证码长度
*
* @return 验证码长度
*/
public
int
getLength
()
{
return
this
.
numberLength
*
2
+
2
;
}
/**
* 根据长度获取参与计算数字最大值
*
* @return 最大值
*/
private
int
getLimit
()
{
return
Integer
.
parseInt
(
"1"
+
StringUtils
.
repeat
(
'0'
,
this
.
numberLength
));
}
}
employmentBusiness-pc-auth/src/main/java/com/bkty/controller/TokenController.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
controller
;
import
cn.hutool.core.codec.Base64
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.bkty.domain.vo.LoginVo
;
import
com.bkty.form.RegisterBody
;
import
com.bkty.service.IAuthStrategy
;
import
com.bkty.service.SysLoginService
;
import
jakarta.servlet.http.HttpServletRequest
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.domain.R
;
import
org.dromara.common.core.domain.model.LoginBody
;
import
org.dromara.common.core.utils.*
;
import
org.dromara.common.encrypt.annotation.ApiEncrypt
;
import
org.dromara.common.json.utils.JsonUtils
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.web.bind.annotation.*
;
import
java.net.URL
;
import
java.nio.charset.StandardCharsets
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.TimeUnit
;
/**
* token 控制
*
* @author Lion Li
*/
@Slf4j
@RequiredArgsConstructor
@RestController
public
class
TokenController
{
private
final
SysLoginService
sysLoginService
;
/**
* 登录方法
*
* @param body 登录信息
* @return 结果
*/
//@ApiEncrypt
@PostMapping
(
"/login"
)
public
R
<
LoginVo
>
login
(
@RequestBody
String
body
)
{
LoginBody
loginBody
=
JsonUtils
.
parseObject
(
body
,
LoginBody
.
class
);
ValidatorUtils
.
validate
(
loginBody
);
// 授权类型和客户端id
String
clientId
=
loginBody
.
getClientId
();
String
grantType
=
loginBody
.
getGrantType
();
// 登录
LoginVo
loginVo
=
IAuthStrategy
.
login
(
body
,
grantType
);
Long
userId
=
LoginHelper
.
getUserId
();
return
R
.
ok
(
loginVo
);
}
/**
* 登出方法
*/
@PostMapping
(
"logout"
)
public
R
<
Void
>
logout
()
{
sysLoginService
.
logout
();
return
R
.
ok
();
}
/**
* 用户注册
*/
@ApiEncrypt
@PostMapping
(
"register"
)
public
R
<
Void
>
register
(
@RequestBody
RegisterBody
registerBody
)
{
// 用户注册
sysLoginService
.
register
(
registerBody
);
return
R
.
ok
();
}
}
employmentBusiness-pc-auth/src/main/java/com/bkty/domain/convert/TenantVoConvert.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
domain
.
convert
;
import
com.bkty.domain.vo.TenantListVo
;
import
com.bkty.system.api.domain.vo.RemoteTenantVo
;
import
io.github.linpeilie.BaseMapper
;
import
org.mapstruct.Mapper
;
import
org.mapstruct.MappingConstants
;
/**
* 租户vo转换器
* @author zhujie
*/
@Mapper
(
componentModel
=
MappingConstants
.
ComponentModel
.
SPRING
)
public
interface
TenantVoConvert
extends
BaseMapper
<
RemoteTenantVo
,
TenantListVo
>
{
}
employmentBusiness-pc-auth/src/main/java/com/bkty/domain/vo/TenantListVo.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
domain
.
vo
;
import
lombok.Data
;
/**
* 租户列表
*
* @author zhujie
*/
@Data
public
class
TenantListVo
{
/**
* 租户编号
*/
private
String
tenantId
;
/**
* 企业名称
*/
private
String
companyName
;
/**
* 域名
*/
private
String
domain
;
}
employmentBusiness-pc-auth/src/main/java/com/bkty/listener/UserActionListener.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
listener
;
import
cn.dev33.satoken.config.SaTokenConfig
;
import
cn.dev33.satoken.listener.SaTokenListener
;
import
cn.dev33.satoken.stp.SaLoginModel
;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.http.useragent.UserAgent
;
import
cn.hutool.http.useragent.UserAgentUtil
;
import
com.bkty.system.api.RemoteUserService
;
import
com.bkty.system.api.domain.SysUserOnline
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.dubbo.config.annotation.DubboReference
;
import
org.dromara.common.core.constant.CacheConstants
;
import
org.dromara.common.core.constant.Constants
;
import
org.dromara.common.core.utils.MessageUtils
;
import
org.dromara.common.core.utils.ServletUtils
;
import
org.dromara.common.core.utils.SpringUtils
;
import
org.dromara.common.core.utils.ip.AddressUtils
;
import
org.dromara.common.log.event.LogininforEvent
;
import
org.dromara.common.redis.utils.RedisUtils
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.stereotype.Component
;
import
java.time.Duration
;
/**
* 用户行为 侦听器的实现
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Component
@Slf4j
public
class
UserActionListener
implements
SaTokenListener
{
private
final
SaTokenConfig
tokenConfig
;
@DubboReference
private
RemoteUserService
remoteUserService
;
/**
* 每次登录时触发
*/
@Override
public
void
doLogin
(
String
loginType
,
Object
loginId
,
String
tokenValue
,
SaLoginModel
loginModel
)
{
UserAgent
userAgent
=
UserAgentUtil
.
parse
(
ServletUtils
.
getRequest
().
getHeader
(
"User-Agent"
));
String
ip
=
ServletUtils
.
getClientIP
();
SysUserOnline
userOnline
=
new
SysUserOnline
();
userOnline
.
setIpaddr
(
ip
);
userOnline
.
setLoginLocation
(
AddressUtils
.
getRealAddressByIP
(
ip
));
userOnline
.
setBrowser
(
userAgent
.
getBrowser
().
getName
());
userOnline
.
setOs
(
userAgent
.
getOs
().
getName
());
userOnline
.
setLoginTime
(
System
.
currentTimeMillis
());
userOnline
.
setTokenId
(
tokenValue
);
String
username
=
(
String
)
loginModel
.
getExtra
(
LoginHelper
.
USER_NAME_KEY
);
userOnline
.
setUserName
(
username
);
userOnline
.
setDeviceType
(
loginModel
.
getDevice
());
if
(
tokenConfig
.
getTimeout
()
==
-
1
)
{
RedisUtils
.
setCacheObject
(
CacheConstants
.
ONLINE_TOKEN_KEY
+
tokenValue
,
userOnline
);
}
else
{
RedisUtils
.
setCacheObject
(
CacheConstants
.
ONLINE_TOKEN_KEY
+
tokenValue
,
userOnline
,
Duration
.
ofSeconds
(
tokenConfig
.
getTimeout
()));
}
// 记录登录日志
LogininforEvent
logininforEvent
=
new
LogininforEvent
();
logininforEvent
.
setUsername
(
username
);
logininforEvent
.
setStatus
(
Constants
.
LOGIN_SUCCESS
);
logininforEvent
.
setMessage
(
MessageUtils
.
message
(
"user.login.success"
));
SpringUtils
.
context
().
publishEvent
(
logininforEvent
);
// 更新登录信息
remoteUserService
.
recordLoginInfo
((
Long
)
loginModel
.
getExtra
(
LoginHelper
.
USER_KEY
),
ip
);
log
.
info
(
"user doLogin, useId:{}, token:{}"
,
loginId
,
tokenValue
);
}
/**
* 每次注销时触发
*/
@Override
public
void
doLogout
(
String
loginType
,
Object
loginId
,
String
tokenValue
)
{
RedisUtils
.
deleteObject
(
CacheConstants
.
ONLINE_TOKEN_KEY
+
tokenValue
);
log
.
info
(
"user doLogout, useId:{}, token:{}"
,
loginId
,
tokenValue
);
}
/**
* 每次被踢下线时触发
*/
@Override
public
void
doKickout
(
String
loginType
,
Object
loginId
,
String
tokenValue
)
{
RedisUtils
.
deleteObject
(
CacheConstants
.
ONLINE_TOKEN_KEY
+
tokenValue
);
log
.
info
(
"user doLogoutByLoginId, useId:{}, token:{}"
,
loginId
,
tokenValue
);
}
/**
* 每次被顶下线时触发
*/
@Override
public
void
doReplaced
(
String
loginType
,
Object
loginId
,
String
tokenValue
)
{
RedisUtils
.
deleteObject
(
CacheConstants
.
ONLINE_TOKEN_KEY
+
tokenValue
);
log
.
info
(
"user doReplaced, useId:{}, token:{}"
,
loginId
,
tokenValue
);
}
/**
* 每次被封禁时触发
*/
@Override
public
void
doDisable
(
String
loginType
,
Object
loginId
,
String
service
,
int
level
,
long
disableTime
)
{
}
/**
* 每次被解封时触发
*/
@Override
public
void
doUntieDisable
(
String
loginType
,
Object
loginId
,
String
service
)
{
}
/**
* 每次打开二级认证时触发
*/
@Override
public
void
doOpenSafe
(
String
loginType
,
String
tokenValue
,
String
service
,
long
safeTime
)
{
}
/**
* 每次创建Session时触发
*/
@Override
public
void
doCloseSafe
(
String
loginType
,
String
tokenValue
,
String
service
)
{
}
/**
* 每次创建Session时触发
*/
@Override
public
void
doCreateSession
(
String
id
)
{
}
/**
* 每次注销Session时触发
*/
@Override
public
void
doLogoutSession
(
String
id
)
{
}
/**
* 每次Token续期时触发
*/
@Override
public
void
doRenewTimeout
(
String
tokenValue
,
Object
loginId
,
long
timeout
)
{
}
}
employmentBusiness-pc-auth/src/main/java/com/bkty/service/SysLoginService.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
service
;
import
cn.dev33.satoken.exception.NotLoginException
;
import
cn.dev33.satoken.secure.BCrypt
;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.baomidou.lock.annotation.Lock4j
;
import
com.bkty.form.RegisterBody
;
import
com.bkty.properties.CaptchaProperties
;
import
com.bkty.properties.UserPasswordProperties
;
import
com.bkty.system.api.RemoteUserService
;
import
com.bkty.system.api.domain.bo.RemoteUserBo
;
import
com.bkty.system.api.model.LoginUser
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.dubbo.config.annotation.DubboReference
;
import
org.dromara.common.core.constant.CacheConstants
;
import
org.dromara.common.core.constant.Constants
;
import
org.dromara.common.core.constant.GlobalConstants
;
import
org.dromara.common.core.constant.TenantConstants
;
import
org.dromara.common.core.enums.LoginType
;
import
org.dromara.common.core.enums.TenantStatus
;
import
org.dromara.common.core.enums.UserType
;
import
org.dromara.common.core.exception.ServiceException
;
import
org.dromara.common.core.exception.user.CaptchaException
;
import
org.dromara.common.core.exception.user.CaptchaExpireException
;
import
org.dromara.common.core.exception.user.UserException
;
import
org.dromara.common.core.utils.MessageUtils
;
import
org.dromara.common.core.utils.SpringUtils
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.log.event.LogininforEvent
;
import
org.dromara.common.redis.utils.RedisUtils
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.time.Duration
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.function.Supplier
;
/**
* 登录校验方法
*
* @author ruoyi
*/
@RequiredArgsConstructor
@Service
@Slf4j
public
class
SysLoginService
{
@DubboReference
private
RemoteUserService
remoteUserService
;
@Autowired
private
UserPasswordProperties
userPasswordProperties
;
@Autowired
private
final
CaptchaProperties
captchaProperties
;
/**
* 退出登录
*/
public
void
logout
()
{
try
{
LoginUser
loginUser
=
LoginHelper
.
getLoginUser
();
if
(
ObjectUtil
.
isNull
(
loginUser
))
{
return
;
}
recordLogininfor
(
loginUser
.
getUsername
(),
Constants
.
LOGOUT
,
MessageUtils
.
message
(
"user.logout.success"
));
}
catch
(
NotLoginException
ignored
)
{
}
finally
{
try
{
StpUtil
.
logout
();
}
catch
(
NotLoginException
ignored
)
{
}
}
}
/**
* 注册
*/
public
void
register
(
RegisterBody
registerBody
)
{
String
tenantId
=
registerBody
.
getTenantId
();
String
username
=
registerBody
.
getUsername
();
String
password
=
registerBody
.
getPassword
();
// 校验用户类型是否存在
String
userType
=
UserType
.
getUserType
(
registerBody
.
getUserType
()).
getUserType
();
boolean
captchaEnabled
=
captchaProperties
.
getEnabled
();
// 验证码开关
if
(
captchaEnabled
)
{
validateCaptcha
(
tenantId
,
username
,
registerBody
.
getCode
(),
registerBody
.
getUuid
());
}
// 注册用户信息
RemoteUserBo
remoteUserBo
=
new
RemoteUserBo
();
remoteUserBo
.
setTenantId
(
tenantId
);
remoteUserBo
.
setUserName
(
username
);
remoteUserBo
.
setNickName
(
username
);
remoteUserBo
.
setPassword
(
BCrypt
.
hashpw
(
password
));
remoteUserBo
.
setUserType
(
userType
);
boolean
regFlag
=
remoteUserService
.
registerUserInfo
(
remoteUserBo
);
if
(!
regFlag
)
{
throw
new
UserException
(
"user.register.error"
);
}
recordLogininfor
(
username
,
Constants
.
REGISTER
,
MessageUtils
.
message
(
"user.register.success"
));
}
/**
* 校验验证码
*
* @param username 用户名
* @param code 验证码
* @param uuid 唯一标识
*/
public
void
validateCaptcha
(
String
tenantId
,
String
username
,
String
code
,
String
uuid
)
{
String
verifyKey
=
GlobalConstants
.
CAPTCHA_CODE_KEY
+
StringUtils
.
blankToDefault
(
uuid
,
""
);
String
captcha
=
RedisUtils
.
getCacheObject
(
verifyKey
);
RedisUtils
.
deleteObject
(
verifyKey
);
if
(
captcha
==
null
)
{
recordLogininfor
(
username
,
Constants
.
REGISTER
,
MessageUtils
.
message
(
"user.jcaptcha.expire"
));
throw
new
CaptchaExpireException
();
}
if
(!
code
.
equalsIgnoreCase
(
captcha
))
{
recordLogininfor
(
username
,
Constants
.
REGISTER
,
MessageUtils
.
message
(
"user.jcaptcha.error"
));
throw
new
CaptchaException
();
}
}
/**
* 记录登录信息
*
* @param username 用户名
* @param status 状态
* @param message 消息内容
* @return
*/
public
void
recordLogininfor
(
String
username
,
String
status
,
String
message
)
{
// 封装对象
LogininforEvent
logininforEvent
=
new
LogininforEvent
();
logininforEvent
.
setUsername
(
username
);
logininforEvent
.
setStatus
(
status
);
logininforEvent
.
setMessage
(
message
);
SpringUtils
.
context
().
publishEvent
(
logininforEvent
);
}
/**
* 登录校验
*/
public
void
checkLogin
(
LoginType
loginType
,
String
username
,
Supplier
<
Boolean
>
supplier
)
{
String
errorKey
=
CacheConstants
.
PWD_ERR_CNT_KEY
+
username
;
String
loginFail
=
Constants
.
LOGIN_FAIL
;
Integer
maxRetryCount
=
userPasswordProperties
.
getMaxRetryCount
();
Integer
lockTime
=
userPasswordProperties
.
getLockTime
();
// 获取用户登录错误次数,默认为0 (可自定义限制策略 例如: key + username + ip)
int
errorNumber
=
ObjectUtil
.
defaultIfNull
(
RedisUtils
.
getCacheObject
(
errorKey
),
0
);
// 锁定时间内登录 则踢出
if
(
errorNumber
>=
maxRetryCount
)
{
recordLogininfor
(
username
,
loginFail
,
MessageUtils
.
message
(
loginType
.
getRetryLimitExceed
(),
maxRetryCount
,
lockTime
));
throw
new
UserException
(
loginType
.
getRetryLimitExceed
(),
maxRetryCount
,
lockTime
);
}
if
(
supplier
.
get
())
{
// 错误次数递增
errorNumber
++;
RedisUtils
.
setCacheObject
(
errorKey
,
errorNumber
,
Duration
.
ofMinutes
(
lockTime
));
// 达到规定错误次数 则锁定登录
if
(
errorNumber
>=
maxRetryCount
)
{
recordLogininfor
(
username
,
loginFail
,
MessageUtils
.
message
(
loginType
.
getRetryLimitExceed
(),
maxRetryCount
,
lockTime
));
throw
new
UserException
(
loginType
.
getRetryLimitExceed
(),
maxRetryCount
,
lockTime
);
}
else
{
// 未达到规定错误次数
recordLogininfor
(
username
,
loginFail
,
MessageUtils
.
message
(
loginType
.
getRetryLimitCount
(),
errorNumber
));
throw
new
UserException
(
loginType
.
getRetryLimitCount
(),
errorNumber
);
}
}
// 登录成功 清空错误次数
RedisUtils
.
deleteObject
(
errorKey
);
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/config/ThreadPoolConfig.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
config
;
import
jakarta.annotation.PreDestroy
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.concurrent.BasicThreadFactory
;
import
org.dromara.common.core.utils.Threads
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.context.annotation.Bean
;
import
java.util.concurrent.ScheduledExecutorService
;
import
java.util.concurrent.ScheduledThreadPoolExecutor
;
import
java.util.concurrent.ThreadPoolExecutor
;
/**
* 线程池配置
*
* @author Lion Li
**/
@Slf4j
@AutoConfiguration
public
class
ThreadPoolConfig
{
/**
* 核心线程数 = cpu 核心数 + 1
*/
private
final
int
core
=
Runtime
.
getRuntime
().
availableProcessors
()
+
1
;
private
ScheduledExecutorService
scheduledExecutorService
;
/**
* 执行周期性或定时任务
*/
@Bean
(
name
=
"scheduledExecutorService"
)
protected
ScheduledExecutorService
scheduledExecutorService
()
{
ScheduledThreadPoolExecutor
scheduledThreadPoolExecutor
=
new
ScheduledThreadPoolExecutor
(
core
,
new
BasicThreadFactory
.
Builder
().
namingPattern
(
"schedule-pool-%d"
).
daemon
(
true
).
build
(),
new
ThreadPoolExecutor
.
CallerRunsPolicy
())
{
@Override
protected
void
afterExecute
(
Runnable
r
,
Throwable
t
)
{
super
.
afterExecute
(
r
,
t
);
Threads
.
printException
(
r
,
t
);
}
};
this
.
scheduledExecutorService
=
scheduledThreadPoolExecutor
;
return
scheduledThreadPoolExecutor
;
}
/**
* 销毁事件
*/
@PreDestroy
public
void
destroy
()
{
try
{
log
.
info
(
"====关闭后台任务任务线程池===="
);
Threads
.
shutdownAndAwaitTermination
(
scheduledExecutorService
);
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/TenantConstants.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
constant
;
/**
* 租户常量信息
*
* @author Lion Li
*/
public
interface
TenantConstants
{
/**
* 租户正常状态
*/
String
NORMAL
=
"0"
;
/**
* 租户封禁状态
*/
String
DISABLE
=
"1"
;
/**
* 超级管理员ID
*/
Long
SUPER_ADMIN_ID
=
1L
;
/**
* 超级管理员角色 roleKey
*/
String
SUPER_ADMIN_ROLE_KEY
=
"superadmin"
;
/**
* 租户管理员角色 roleKey
*/
String
TENANT_ADMIN_ROLE_KEY
=
"admin"
;
/**
* 租户管理员角色名称
*/
String
TENANT_ADMIN_ROLE_NAME
=
"管理员"
;
/**
* 默认租户ID
*/
String
DEFAULT_TENANT_ID
=
"000000"
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/TimeConstants.java
0 → 100644
View file @
e4dbdb03
/**
*
*/
package
org
.
dromara
.
common
.
core
.
constant
;
/**
*
* 常量类
*
* @author xiaojiangge
* @since jdk1.8
*/
public
class
TimeConstants
{
/** 常量类禁止实例化 */
private
TimeConstants
()
{
}
/** 树形结构根节点标示 */
public
static
final
String
ROOT_NODE
=
"root_node"
;
/** 当前登录用户session信息 */
public
static
final
String
CURRENT_LOGIN_USER
=
"curLoginUser"
;
/** request中存放token的属性名 */
public
static
final
String
REQUEST_ATTRIBUTE_NAME_TOKEN
=
"request.attribute.token"
;
/** 默认的数据精度 */
public
static
final
int
DEFAULT_SCALE
=
2
;
/** 自定义的数据精度 */
public
static
final
int
CUSTOM_SCALE
=
3
;
/** 百分比的数据精度 */
public
static
final
int
PERCENT_SCALE
=
4
;
/** 百分之一百的数值 */
public
static
final
Double
HUNDREND_PERCENT
=
100.00
D
;
/** 百分之零的数值 */
public
static
final
Double
ZERO_PERCENT
=
0.0
D
;
/** 全字段时间格式化字符串模式:yyyy-MM-dd HH:mm:ss */
public
static
final
String
DATE_FULL_FORMAT
=
"yyyy-MM-dd HH:mm:ss"
;
/**全字段时间格式化字符串模式: yyyyMMddHHmmss*/
public
static
final
String
DATA_FULL_COMPACT_FORMAT
=
"yyyyMMddHHmmss"
;
/**全字段时间格式化字符串模式,带毫秒: yyyyMMddHHmmssSSS*/
public
static
final
String
DATA_FULL_COMPACT_MILLIS_FORMAT
=
"yyyyMMddHHmmssSSS"
;
/** 时间格式化字符串模式:yyyy-MM-dd */
public
static
final
String
DATE_FORMAT
=
"yyyy-MM-dd"
;
/** 时间格式化字符串模式:yyyy-MM */
public
static
final
String
DATE_FORMAT_YEAR_MONTH
=
"yyyy-MM"
;
/** 时间格式化字符串模式:HH:mm:ss*/
public
static
final
String
DATE_FORMAT_TIME
=
"HH:mm:ss"
;
/** 定时任务触发时间 */
public
static
final
String
MONITOR_ALARM_CRON
=
"0 0/1 * * * ?"
;
/** 分页参数默认起始行 */
public
static
final
Integer
PAGE_INDEX
=
0
;
/** 分页参数默认查询行数 */
public
static
final
Integer
PAGE_SIZE
=
10
;
/**手机号码正则匹配*/
public
static
final
String
PHONE_VALID_PATTERN
=
"^1\\d{10}$"
;
/**IPV4 的正则表达式*/
public
static
final
String
REGEX_IPv4
=
"^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$"
;
/**IPV6 的正则表达式*/
public
static
final
String
REGEX_IPv6
=
"^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$"
;
/**超级管理员角色编码*/
public
static
final
String
ROLE_CODE_SUPER_ADMIN
=
"superAdmin"
;
/**数据源路由*/
public
static
final
String
DATA_SOURCE_ROUTING
=
"_ROUTING"
;
/**数据源字典*/
public
static
final
String
DATA_SOURCE_DICTIONARY
=
"_DICTIONARY"
;
/**数据源主表Key*/
public
static
final
String
DATA_SOURCE_KEY
=
"TABLE_KEY"
;
/**模块表名前缀*/
public
static
final
String
MODULE_TABLE_NAME
=
"XJG_"
;
/**未冻结状态*/
public
static
final
int
NOT_FREEZE
=
0
;
/**超级管理员的角色id*/
public
static
final
String
SUPER_ADMIN_ROLE_ID
=
"fb627035708b45b7b29977b6faa06638"
;
/**日期字段,选择至今对应的日期字符串*/
public
static
final
String
TILL_NOW_DATE_STRING
=
"2099-01-01 00:00:00"
;
/** 日期字段,选择至今对应的 文字 字符串 */
public
static
final
String
TILL_NOW_TEXT_STRING
=
"至今"
;
/**级联代码表sheetname*/
public
static
final
String
SHEET_NAME_CASCADE_CODE_TABLE
=
"级联代码表{}"
;
/**excel格式显示最大行数*/
public
static
final
int
MAX_VALIDATE_ROW
=
2000
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/constant/UserConstants.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
constant
;
/**
* 用户常量信息
*
* @author ruoyi
*/
public
interface
UserConstants
{
/**
* 平台内系统用户的唯一标志
*/
String
SYS_USER
=
"SYS_USER"
;
/**
* 正常状态
*/
String
NORMAL
=
"0"
;
/**
* 异常状态
*/
String
EXCEPTION
=
"1"
;
/**
* 用户正常状态
*/
String
USER_NORMAL
=
"0"
;
/**
* 用户封禁状态
*/
String
USER_DISABLE
=
"1"
;
/**
* 角色正常状态
*/
String
ROLE_NORMAL
=
"0"
;
/**
* 角色封禁状态
*/
String
ROLE_DISABLE
=
"1"
;
/**
* 部门正常状态
*/
String
DEPT_NORMAL
=
"0"
;
/**
* 部门停用状态
*/
String
DEPT_DISABLE
=
"1"
;
/**
* 岗位正常状态
*/
String
POST_NORMAL
=
"0"
;
/**
* 岗位停用状态
*/
String
POST_DISABLE
=
"1"
;
/**
* 字典正常状态
*/
String
DICT_NORMAL
=
"0"
;
/**
* 通用存在标志
*/
String
DEL_FLAG_NORMAL
=
"0"
;
/**
* 通用删除标志
*/
String
DEL_FLAG_REMOVED
=
"2"
;
/**
* 是否为系统默认(是)
*/
String
YES
=
"Y"
;
/**
* 是否菜单外链(是)
*/
String
YES_FRAME
=
"0"
;
/**
* 是否菜单外链(否)
*/
String
NO_FRAME
=
"1"
;
/**
* 菜单正常状态
*/
String
MENU_NORMAL
=
"0"
;
/**
* 菜单停用状态
*/
String
MENU_DISABLE
=
"1"
;
/**
* 菜单类型(目录)
*/
String
TYPE_DIR
=
"M"
;
/**
* 菜单类型(菜单)
*/
String
TYPE_MENU
=
"C"
;
/**
* 菜单类型(按钮)
*/
String
TYPE_BUTTON
=
"F"
;
/**
* Layout组件标识
*/
String
LAYOUT
=
"Layout"
;
/**
* ParentView组件标识
*/
String
PARENT_VIEW
=
"ParentView"
;
/**
* InnerLink组件标识
*/
String
INNER_LINK
=
"InnerLink"
;
/**
* 用户名长度限制
*/
int
USERNAME_MIN_LENGTH
=
2
;
int
USERNAME_MAX_LENGTH
=
20
;
/**
* 密码长度限制
*/
int
PASSWORD_MIN_LENGTH
=
5
;
int
PASSWORD_MAX_LENGTH
=
20
;
/**
* 超级管理员ID
*/
Long
SUPER_ADMIN_ID
=
1L
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/domain/UserLoginInfo.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
domain
;
import
lombok.Data
;
/**
* @author jiangxiaoge
* @description 用户登陆返回对象
* @data 2024/12/9
**/
@Data
public
class
UserLoginInfo
{
private
Long
id
;
private
String
sessionId
;
private
Long
expiredTime
;
// 过期时间
/**
* 用户名
*/
private
String
username
;
/**
* 账号
*/
private
String
wno
;
/**
* 手机号
*/
private
String
phone
;
/**
* 学校
*/
private
String
school
;
/**
* 专业
*/
private
String
profession
;
/**
* 学历
*/
private
String
education
;
/**
* 籍贯
*/
private
String
nativePlace
;
private
String
college
;
/**
* 毕业时间
*/
private
String
graduateDate
;
private
boolean
isAdd
;
private
Integer
authHintCount
;
private
Integer
authStatus
;
/**入学时间*/
private
String
enrollmentDate
;
private
String
idNumber
;
private
Integer
realNameStatus
;
/**
* 用户类型 0.c端用户 1.学校学生用户 2.亲亲小宝用户
*/
private
Integer
userType
;
/**
* 用户头像
*/
private
String
iconUrl
;
/**
* 职豆数量
*/
private
int
jobBean
;
/**
* 亲亲小保userId
*/
private
Long
qqxbUserId
;
private
Integer
newUserOpenSeconds
;
private
String
createTime
;
/**
* 学校端用户状态:1-已经确认过开启我的求职之旅;2-未注册过亲亲职助用户;3-已经注册过亲亲职助用户并未购买过权益;4-已经注册过亲亲职助用户并已购买过权益
*/
private
Integer
studentType
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
enums
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
/**
* 用户状态
*
* @author LionLi
*/
@Getter
@AllArgsConstructor
public
enum
TenantStatus
{
/**
* 正常
*/
OK
(
"0"
,
"正常"
),
/**
* 停用
*/
DISABLE
(
"1"
,
"停用"
),
/**
* 删除
*/
DELETED
(
"2"
,
"删除"
);
private
final
String
code
;
private
final
String
info
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/exception/user/UserException.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
exception
.
user
;
import
org.dromara.common.core.exception.base.BaseException
;
import
java.io.Serial
;
/**
* 用户信息异常类
*
* @author ruoyi
*/
public
class
UserException
extends
BaseException
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
public
UserException
(
String
code
,
Object
...
args
)
{
super
(
"user"
,
code
,
args
,
null
);
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/Threads.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
utils
;
import
lombok.AccessLevel
;
import
lombok.NoArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.concurrent.*
;
/**
* 线程相关工具类.
*
* @author ruoyi
*/
@Slf4j
@NoArgsConstructor
(
access
=
AccessLevel
.
PRIVATE
)
public
class
Threads
{
/**
* sleep等待,单位为毫秒
*/
public
static
void
sleep
(
long
milliseconds
)
{
try
{
Thread
.
sleep
(
milliseconds
);
}
catch
(
InterruptedException
e
)
{
return
;
}
}
/**
* 停止线程池
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
* 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
* 如果仍然超時,則強制退出.
* 另对在shutdown时线程本身被调用中断做了处理.
*/
public
static
void
shutdownAndAwaitTermination
(
ExecutorService
pool
)
{
if
(
pool
!=
null
&&
!
pool
.
isShutdown
())
{
pool
.
shutdown
();
try
{
if
(!
pool
.
awaitTermination
(
120
,
TimeUnit
.
SECONDS
))
{
pool
.
shutdownNow
();
if
(!
pool
.
awaitTermination
(
120
,
TimeUnit
.
SECONDS
))
{
log
.
info
(
"Pool did not terminate"
);
}
}
}
catch
(
InterruptedException
ie
)
{
pool
.
shutdownNow
();
Thread
.
currentThread
().
interrupt
();
}
}
}
/**
* 打印线程异常信息
*/
public
static
void
printException
(
Runnable
r
,
Throwable
t
)
{
if
(
t
==
null
&&
r
instanceof
Future
<?>)
{
try
{
Future
<?>
future
=
(
Future
<?>)
r
;
if
(
future
.
isDone
())
{
future
.
get
();
}
}
catch
(
CancellationException
ce
)
{
t
=
ce
;
}
catch
(
ExecutionException
ee
)
{
t
=
ee
.
getCause
();
}
catch
(
InterruptedException
ie
)
{
Thread
.
currentThread
().
interrupt
();
}
}
if
(
t
!=
null
)
{
log
.
error
(
t
.
getMessage
(),
t
);
}
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/TimeTool.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
utils
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.util.Date
;
public
class
TimeTool
{
public
static
Date
nowDate
()
{
return
Date
.
from
(
LocalDateTime
.
now
().
atZone
(
ZoneId
.
systemDefault
()).
toInstant
());
}
public
static
long
nowMilli
()
{
return
System
.
currentTimeMillis
();
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
core
.
utils
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.lang.tree.Tree
;
import
cn.hutool.core.lang.tree.TreeNodeConfig
;
import
cn.hutool.core.lang.tree.TreeUtil
;
import
cn.hutool.core.lang.tree.parser.NodeParser
;
import
lombok.AccessLevel
;
import
lombok.NoArgsConstructor
;
import
org.dromara.common.core.utils.reflect.ReflectUtils
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
java.util.stream.Stream
;
/**
* 扩展 hutool TreeUtil 封装系统树构建
*
* @author Lion Li
*/
@NoArgsConstructor
(
access
=
AccessLevel
.
PRIVATE
)
public
class
TreeBuildUtils
extends
TreeUtil
{
/**
* 根据前端定制差异化字段
*/
public
static
final
TreeNodeConfig
DEFAULT_CONFIG
=
TreeNodeConfig
.
DEFAULT_CONFIG
.
setNameKey
(
"label"
);
/**
* 构建树形结构
*
* @param <T> 输入节点的类型
* @param <K> 节点ID的类型
* @param list 节点列表,其中包含了要构建树形结构的所有节点
* @param nodeParser 解析器,用于将输入节点转换为树节点
* @return 构建好的树形结构列表
*/
public
static
<
T
,
K
>
List
<
Tree
<
K
>>
build
(
List
<
T
>
list
,
NodeParser
<
T
,
K
>
nodeParser
)
{
if
(
CollUtil
.
isEmpty
(
list
))
{
return
CollUtil
.
newArrayList
();
}
K
k
=
ReflectUtils
.
invokeGetter
(
list
.
get
(
0
),
"parentId"
);
return
TreeUtil
.
build
(
list
,
k
,
DEFAULT_CONFIG
,
nodeParser
);
}
/**
* 获取节点列表中所有节点的叶子节点
*
* @param <K> 节点ID的类型
* @param nodes 节点列表
* @return 包含所有叶子节点的列表
*/
public
static
<
K
>
List
<
Tree
<
K
>>
getLeafNodes
(
List
<
Tree
<
K
>>
nodes
)
{
if
(
CollUtil
.
isEmpty
(
nodes
))
{
return
CollUtil
.
newArrayList
();
}
return
nodes
.
stream
()
.
flatMap
(
TreeBuildUtils:
:
extractLeafNodes
)
.
collect
(
Collectors
.
toList
());
}
/**
* 获取指定节点下的所有叶子节点
*
* @param <K> 节点ID的类型
* @param node 要查找叶子节点的根节点
* @return 包含所有叶子节点的列表
*/
private
static
<
K
>
Stream
<
Tree
<
K
>>
extractLeafNodes
(
Tree
<
K
>
node
)
{
if
(!
node
.
hasChild
())
{
return
Stream
.
of
(
node
);
}
else
{
// 递归调用,获取所有子节点的叶子节点
return
node
.
getChildren
().
stream
()
.
flatMap
(
TreeBuildUtils:
:
extractLeafNodes
);
}
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/TableDataInfo.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
mybatis
.
core
.
page
;
import
cn.hutool.http.HttpStatus
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.List
;
/**
* 表格分页数据对象
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public
class
TableDataInfo
<
T
>
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 总记录数
*/
private
long
total
;
/**
* 列表数据
*/
private
List
<
T
>
rows
;
/**
* 消息状态码
*/
private
int
code
;
/**
* 消息内容
*/
private
String
msg
;
/**
* 分页
*
* @param list 列表数据
* @param total 总记录数
*/
public
TableDataInfo
(
List
<
T
>
list
,
long
total
)
{
this
.
rows
=
list
;
this
.
total
=
total
;
}
/**
* 根据分页对象构建表格分页数据对象
*/
public
static
<
T
>
TableDataInfo
<
T
>
build
(
IPage
<
T
>
page
)
{
TableDataInfo
<
T
>
rspData
=
new
TableDataInfo
<>();
rspData
.
setCode
(
HttpStatus
.
HTTP_OK
);
rspData
.
setMsg
(
"查询成功"
);
rspData
.
setRows
(
page
.
getRecords
());
rspData
.
setTotal
(
page
.
getTotal
());
return
rspData
;
}
/**
* 根据数据列表构建表格分页数据对象
*/
public
static
<
T
>
TableDataInfo
<
T
>
build
(
List
<
T
>
list
)
{
TableDataInfo
<
T
>
rspData
=
new
TableDataInfo
<>();
rspData
.
setCode
(
HttpStatus
.
HTTP_OK
);
rspData
.
setMsg
(
"查询成功"
);
rspData
.
setRows
(
list
);
rspData
.
setTotal
(
list
.
size
());
return
rspData
;
}
/**
* 构建表格分页数据对象
*/
public
static
<
T
>
TableDataInfo
<
T
>
build
()
{
TableDataInfo
<
T
>
rspData
=
new
TableDataInfo
<>();
rspData
.
setCode
(
HttpStatus
.
HTTP_OK
);
rspData
.
setMsg
(
"查询成功"
);
return
rspData
;
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/annotation/Translation.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
annotation
;
import
com.fasterxml.jackson.annotation.JacksonAnnotationsInside
;
import
com.fasterxml.jackson.databind.annotation.JsonSerialize
;
import
org.dromara.common.translation.core.handler.TranslationHandler
;
import
java.lang.annotation.*
;
/**
* 通用翻译注解
*
* @author Lion Li
*/
@Inherited
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
FIELD
,
ElementType
.
METHOD
})
@Documented
@JacksonAnnotationsInside
@JsonSerialize
(
using
=
TranslationHandler
.
class
)
public
@interface
Translation
{
/**
* 类型 (需与实现类上的 {@link TranslationType} 注解type对应)
* <p>
* 默认取当前字段的值 如果设置了 @{@link Translation#mapper()} 则取映射字段的值
*/
String
type
();
/**
* 映射字段 (如果不为空则取此字段的值)
*/
String
mapper
()
default
""
;
/**
* 其他条件 例如: 字典type(sys_user_sex)
*/
String
other
()
default
""
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/annotation/TranslationType.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
annotation
;
import
org.dromara.common.translation.core.TranslationInterface
;
import
java.lang.annotation.*
;
/**
* 翻译类型注解 (标注到{@link TranslationInterface} 的实现类)
*
* @author Lion Li
*/
@Inherited
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Target
({
ElementType
.
TYPE
})
@Documented
public
@interface
TranslationType
{
/**
* 类型
*/
String
type
();
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/config/TranslationConfig.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
config
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
org.dromara.common.translation.annotation.TranslationType
;
import
org.dromara.common.translation.core.TranslationInterface
;
import
org.dromara.common.translation.core.handler.TranslationBeanSerializerModifier
;
import
org.dromara.common.translation.core.handler.TranslationHandler
;
import
jakarta.annotation.PostConstruct
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 翻译模块配置类
*
* @author Lion Li
*/
@Slf4j
@AutoConfiguration
public
class
TranslationConfig
{
@Autowired
private
List
<
TranslationInterface
<?>>
list
;
@Autowired
private
ObjectMapper
objectMapper
;
@PostConstruct
public
void
init
()
{
Map
<
String
,
TranslationInterface
<?>>
map
=
new
HashMap
<>(
list
.
size
());
for
(
TranslationInterface
<?>
trans
:
list
)
{
if
(
trans
.
getClass
().
isAnnotationPresent
(
TranslationType
.
class
))
{
TranslationType
annotation
=
trans
.
getClass
().
getAnnotation
(
TranslationType
.
class
);
map
.
put
(
annotation
.
type
(),
trans
);
}
else
{
log
.
warn
(
trans
.
getClass
().
getName
()
+
" 翻译实现类未标注 TranslationType 注解!"
);
}
}
TranslationHandler
.
TRANSLATION_MAPPER
.
putAll
(
map
);
// 设置 Bean 序列化修改器
objectMapper
.
setSerializerFactory
(
objectMapper
.
getSerializerFactory
()
.
withSerializerModifier
(
new
TranslationBeanSerializerModifier
()));
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
constant
;
/**
* 翻译常量
*
* @author Lion Li
*/
public
interface
TransConstant
{
/**
* 用户id转账号
*/
String
USER_ID_TO_NAME
=
"user_id_to_name"
;
/**
* 用户id转用户昵称
*/
String
USER_ID_TO_NICKNAME
=
"user_id_to_nickname"
;
/**
* 部门id转名称
*/
String
DEPT_ID_TO_NAME
=
"dept_id_to_name"
;
/**
* 字典type转label
*/
String
DICT_TYPE_TO_LABEL
=
"dict_type_to_label"
;
/**
* ossId转url
*/
String
OSS_ID_TO_URL
=
"oss_id_to_url"
;
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/TranslationInterface.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
core
;
import
org.dromara.common.translation.annotation.TranslationType
;
/**
* 翻译接口 (实现类需标注 {@link TranslationType} 注解标明翻译类型)
*
* @author Lion Li
*/
public
interface
TranslationInterface
<
T
>
{
/**
* 翻译
*
* @param key 需要被翻译的键(不为空)
* @param other 其他参数
* @return 返回键对应的值
*/
T
translation
(
Object
key
,
String
other
);
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationBeanSerializerModifier.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
core
.
handler
;
import
com.fasterxml.jackson.databind.BeanDescription
;
import
com.fasterxml.jackson.databind.SerializationConfig
;
import
com.fasterxml.jackson.databind.ser.BeanPropertyWriter
;
import
com.fasterxml.jackson.databind.ser.BeanSerializerModifier
;
import
java.util.List
;
/**
* Bean 序列化修改器 解决 Null 被单独处理问题
*
* @author Lion Li
*/
public
class
TranslationBeanSerializerModifier
extends
BeanSerializerModifier
{
@Override
public
List
<
BeanPropertyWriter
>
changeProperties
(
SerializationConfig
config
,
BeanDescription
beanDesc
,
List
<
BeanPropertyWriter
>
beanProperties
)
{
for
(
BeanPropertyWriter
writer
:
beanProperties
)
{
// 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理
if
(
writer
.
getSerializer
()
instanceof
TranslationHandler
serializer
)
{
writer
.
assignNullSerializer
(
serializer
);
}
}
return
beanProperties
;
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
core
.
handler
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.fasterxml.jackson.core.JsonGenerator
;
import
com.fasterxml.jackson.databind.BeanProperty
;
import
com.fasterxml.jackson.databind.JsonMappingException
;
import
com.fasterxml.jackson.databind.JsonSerializer
;
import
com.fasterxml.jackson.databind.SerializerProvider
;
import
com.fasterxml.jackson.databind.ser.ContextualSerializer
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.core.utils.reflect.ReflectUtils
;
import
org.dromara.common.translation.annotation.Translation
;
import
org.dromara.common.translation.core.TranslationInterface
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.IOException
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* 翻译处理器
*
* @author Lion Li
*/
@Slf4j
public
class
TranslationHandler
extends
JsonSerializer
<
Object
>
implements
ContextualSerializer
{
/**
* 全局翻译实现类映射器
*/
public
static
final
Map
<
String
,
TranslationInterface
<?>>
TRANSLATION_MAPPER
=
new
ConcurrentHashMap
<>();
private
Translation
translation
;
@Override
public
void
serialize
(
Object
value
,
JsonGenerator
gen
,
SerializerProvider
serializers
)
throws
IOException
{
TranslationInterface
<?>
trans
=
TRANSLATION_MAPPER
.
get
(
translation
.
type
());
if
(
ObjectUtil
.
isNotNull
(
trans
))
{
// 如果映射字段不为空 则取映射字段的值
if
(
StringUtils
.
isNotBlank
(
translation
.
mapper
()))
{
value
=
ReflectUtils
.
invokeGetter
(
gen
.
getCurrentValue
(),
translation
.
mapper
());
}
// 如果为 null 直接写出
if
(
ObjectUtil
.
isNull
(
value
))
{
gen
.
writeNull
();
return
;
}
Object
result
=
trans
.
translation
(
value
,
translation
.
other
());
gen
.
writeObject
(
result
);
}
else
{
gen
.
writeObject
(
value
);
}
}
@Override
public
JsonSerializer
<?>
createContextual
(
SerializerProvider
prov
,
BeanProperty
property
)
throws
JsonMappingException
{
Translation
translation
=
property
.
getAnnotation
(
Translation
.
class
);
if
(
Objects
.
nonNull
(
translation
))
{
this
.
translation
=
translation
;
return
this
;
}
return
prov
.
findValueSerializer
(
property
.
getType
(),
property
);
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-translation/src/main/java/org/dromara/common/translation/core/impl/UserNameTranslationImpl.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
translation
.
core
.
impl
;
import
org.dromara.common.translation.annotation.TranslationType
;
import
org.dromara.common.translation.constant.TransConstant
;
import
org.dromara.common.translation.core.TranslationInterface
;
import
lombok.AllArgsConstructor
;
import
org.apache.dubbo.config.annotation.DubboReference
;
/**
* 用户名翻译实现
*
* @author Lion Li
*/
@AllArgsConstructor
@TranslationType
(
type
=
TransConstant
.
USER_ID_TO_NAME
)
public
class
UserNameTranslationImpl
implements
TranslationInterface
<
String
>
{
/*@DubboReference
private RemoteUserService remoteUserService;*/
@Override
public
String
translation
(
Object
key
,
String
other
)
{
return
null
;
}
}
employmentBusiness-pc-common/employmentBusiness-pc-common-web/src/main/java/org/dromara/common/web/config/UndertowConfig.java
0 → 100644
View file @
e4dbdb03
package
org
.
dromara
.
common
.
web
.
config
;
import
io.undertow.server.DefaultByteBufferPool
;
import
io.undertow.websockets.jsr.WebSocketDeploymentInfo
;
import
org.dromara.common.core.utils.SpringUtils
;
import
org.springframework.boot.autoconfigure.AutoConfiguration
;
import
org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory
;
import
org.springframework.boot.web.server.WebServerFactoryCustomizer
;
import
org.springframework.core.task.VirtualThreadTaskExecutor
;
/**
* Undertow 自定义配置
*
* @author Lion Li
*/
@AutoConfiguration
public
class
UndertowConfig
implements
WebServerFactoryCustomizer
<
UndertowServletWebServerFactory
>
{
@Override
public
void
customize
(
UndertowServletWebServerFactory
factory
)
{
// 默认不直接分配内存 如果项目中使用了 websocket 建议直接分配
factory
.
addDeploymentInfoCustomizers
(
deploymentInfo
->
{
WebSocketDeploymentInfo
webSocketDeploymentInfo
=
new
WebSocketDeploymentInfo
();
webSocketDeploymentInfo
.
setBuffers
(
new
DefaultByteBufferPool
(
true
,
1024
));
deploymentInfo
.
addServletContextAttribute
(
"io.undertow.websockets.jsr.WebSocketDeploymentInfo"
,
webSocketDeploymentInfo
);
// 使用虚拟线程
if
(
SpringUtils
.
isVirtual
())
{
VirtualThreadTaskExecutor
executor
=
new
VirtualThreadTaskExecutor
(
"undertow-"
);
deploymentInfo
.
setExecutor
(
executor
);
deploymentInfo
.
setAsyncExecutor
(
executor
);
}
});
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/config/ThreadPoolConfig.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
config
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.scheduling.annotation.EnableAsync
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
java.util.concurrent.Executor
;
import
java.util.concurrent.ThreadPoolExecutor
;
@Configuration
@EnableAsync
// 启用异步支持
public
class
ThreadPoolConfig
{
@Bean
(
name
=
"taskServiceExecutor"
)
// 定义Bean名称
public
Executor
taskExecutor
()
{
ThreadPoolTaskExecutor
executor
=
new
ThreadPoolTaskExecutor
();
// 核心线程数:默认保持活跃的线程数
executor
.
setCorePoolSize
(
5
);
// 最大线程数:队列满后能创建的最大线程数
executor
.
setMaxPoolSize
(
10
);
// 队列容量:队列保存的任务数
executor
.
setQueueCapacity
(
20
);
// 线程名前缀:方便日志排查
executor
.
setThreadNamePrefix
(
"Jxg-Async-Thread-"
);
// 拒绝策略:由调用线程处理任务(通常在主线程执行)
executor
.
setRejectedExecutionHandler
(
new
ThreadPoolExecutor
.
CallerRunsPolicy
());
// 初始化线程池
executor
.
initialize
();
return
executor
;
}
}
\ No newline at end of file
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysMenuDto.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
dto
;
import
com.bkty.system.domain.entity.SysMenu
;
import
com.fasterxml.jackson.annotation.JsonInclude
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
jakarta.validation.constraints.NotBlank
;
import
jakarta.validation.constraints.NotNull
;
import
jakarta.validation.constraints.Pattern
;
import
jakarta.validation.constraints.Size
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
org.dromara.common.core.constant.RegexConstants
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
/**
* 菜单权限业务对象 sys_menu
*
* @author Michelle.Chung
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
@AutoMapper
(
target
=
SysMenu
.
class
,
reverseConvertGenerate
=
false
)
public
class
SysMenuDto
extends
BaseEntity
{
/**
* 菜单ID
*/
private
Long
menuId
;
/**
* 父菜单ID
*/
private
Long
parentId
;
/**
* 菜单名称
*/
@NotBlank
(
message
=
"菜单名称不能为空"
)
@Size
(
min
=
0
,
max
=
50
,
message
=
"菜单名称长度不能超过{max}个字符"
)
private
String
menuName
;
/**
* 显示顺序
*/
@NotNull
(
message
=
"显示顺序不能为空"
)
private
Integer
orderNum
;
/**
* 路由地址
*/
@Size
(
min
=
0
,
max
=
200
,
message
=
"路由地址不能超过{max}个字符"
)
private
String
path
;
/**
* 组件路径
*/
@Size
(
min
=
0
,
max
=
200
,
message
=
"组件路径不能超过{max}个字符"
)
private
String
component
;
/**
* 路由参数
*/
private
String
queryParam
;
/**
* 是否为外链(0是 1否)
*/
private
String
isFrame
;
/**
* 是否缓存(0缓存 1不缓存)
*/
private
String
isCache
;
/**
* 菜单类型(M目录 C菜单 F按钮)
*/
@NotBlank
(
message
=
"菜单类型不能为空"
)
private
String
menuType
;
/**
* 显示状态(0显示 1隐藏)
*/
private
String
visible
;
/**
* 菜单状态(0正常 1停用)
*/
private
String
status
;
/**
* 权限标识
*/
@JsonInclude
(
JsonInclude
.
Include
.
NON_NULL
)
@Size
(
min
=
0
,
max
=
100
,
message
=
"权限标识长度不能超过{max}个字符"
)
@Pattern
(
regexp
=
RegexConstants
.
PERMISSION_STRING
,
message
=
"权限标识必须符合 tool:build:list 格式"
)
private
String
perms
;
/**
* 菜单图标
*/
private
String
icon
;
/**
* 备注
*/
private
String
remark
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysRoleDto.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
dto
;
import
com.bkty.system.domain.entity.SysRole
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
jakarta.validation.constraints.NotBlank
;
import
jakarta.validation.constraints.NotNull
;
import
jakarta.validation.constraints.Size
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
/**
* 角色信息业务对象 sys_role
*
* @author Michelle.Chung
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode
(
callSuper
=
true
)
@AutoMapper
(
target
=
SysRole
.
class
,
reverseConvertGenerate
=
false
)
public
class
SysRoleDto
extends
BaseEntity
{
/**
* 角色ID
*/
private
Long
roleId
;
/**
* 角色名称
*/
@NotBlank
(
message
=
"角色名称不能为空"
)
@Size
(
min
=
0
,
max
=
30
,
message
=
"角色名称长度不能超过{max}个字符"
)
private
String
roleName
;
/**
* 角色权限字符串
*/
@NotBlank
(
message
=
"角色权限字符串不能为空"
)
@Size
(
min
=
0
,
max
=
100
,
message
=
"权限字符长度不能超过{max}个字符"
)
private
String
roleKey
;
/**
* 显示顺序
*/
@NotNull
(
message
=
"显示顺序不能为空"
)
private
Integer
roleSort
;
/**
* 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)
*/
private
String
dataScope
;
/**
* 菜单树选择项是否关联显示
*/
private
Boolean
menuCheckStrictly
;
/**
* 部门树选择项是否关联显示
*/
private
Boolean
deptCheckStrictly
;
/**
* 角色状态(0正常 1停用)
*/
private
String
status
;
/**
* 备注
*/
private
String
remark
;
/**
* 菜单组
*/
private
Long
[]
menuIds
;
/**
* 部门组(数据权限)
*/
private
Long
[]
deptIds
;
/**
* 租户ID
*/
private
String
tenantId
;
public
SysRoleDto
(
Long
roleId
)
{
this
.
roleId
=
roleId
;
}
public
boolean
isSuperAdmin
()
{
return
UserConstants
.
SUPER_ADMIN_ID
.
equals
(
this
.
roleId
);
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/dto/SysUserDto.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
dto
;
import
com.bkty.system.domain.entity.SysUser
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
jakarta.validation.constraints.Email
;
import
jakarta.validation.constraints.NotBlank
;
import
jakarta.validation.constraints.Size
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.xss.Xss
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
/**
* 用户信息业务对象 sys_user
*
* @author Michelle.Chung
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode
(
callSuper
=
true
)
@AutoMapper
(
target
=
SysUser
.
class
,
reverseConvertGenerate
=
false
)
public
class
SysUserDto
extends
BaseEntity
{
/**
* 用户ID
*/
private
Long
userId
;
/**
* 部门ID
*/
private
Long
deptId
;
/**
* 用户账号
*/
@Xss
(
message
=
"用户账号不能包含脚本字符"
)
@NotBlank
(
message
=
"用户账号不能为空"
)
@Size
(
min
=
0
,
max
=
30
,
message
=
"用户账号长度不能超过{max}个字符"
)
private
String
userName
;
/**
* 用户昵称
*/
@Xss
(
message
=
"用户昵称不能包含脚本字符"
)
@NotBlank
(
message
=
"用户昵称不能为空"
)
@Size
(
min
=
0
,
max
=
30
,
message
=
"用户昵称长度不能超过{max}个字符"
)
private
String
nickName
;
/**
* 用户类型(sys_user系统用户)
*/
private
String
userType
;
/**
* 用户邮箱
*/
@Email
(
message
=
"邮箱格式不正确"
)
@Size
(
min
=
0
,
max
=
50
,
message
=
"邮箱长度不能超过{max}个字符"
)
private
String
email
;
/**
* 手机号码
*/
private
String
phonenumber
;
/**
* 用户性别(0男 1女 2未知)
*/
private
String
sex
;
/**
* 密码
*/
private
String
password
;
/**
* 帐号状态(0正常 1停用)
*/
private
String
status
;
/**
* 备注
*/
private
String
remark
;
/**
* 角色组
*/
@Size
(
min
=
1
,
message
=
"用户角色不能为空"
)
private
Long
[]
roleIds
;
/**
* 岗位组
*/
private
Long
[]
postIds
;
/**
* 数据权限 当前角色ID
*/
private
Long
roleId
;
/**
* 排除不查询的用户(工作流用)
*/
private
String
excludeUserIds
;
public
SysUserDto
(
Long
userId
)
{
this
.
userId
=
userId
;
}
public
boolean
isSuperAdmin
()
{
return
UserConstants
.
SUPER_ADMIN_ID
.
equals
(
this
.
userId
);
}
/**
* 新密码
*/
private
String
newPassword
;
/**
* 开始时间
*/
private
String
beginTime
;
/**
* 结束时间
*/
private
String
endTime
;
/**
* 租户ID(学校ID)
*/
private
String
tenantId
;
/**
* 租户名称(学校名称)
*/
private
String
tenantName
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysMenu.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
org.dromara.common.core.constant.Constants
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 菜单权限表 sys_menu
*
* @author Lion Li
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
@TableName
(
"sys_menu"
)
public
class
SysMenu
extends
BaseEntity
{
/**
* 菜单ID
*/
@TableId
(
value
=
"menu_id"
)
private
Long
menuId
;
/**
* 父菜单ID
*/
private
Long
parentId
;
/**
* 菜单名称
*/
private
String
menuName
;
/**
* 显示顺序
*/
private
Integer
orderNum
;
/**
* 路由地址
*/
private
String
path
;
/**
* 组件路径
*/
private
String
component
;
/**
* 路由参数
*/
private
String
queryParam
;
/**
* 是否为外链(0是 1否)
*/
private
String
isFrame
;
/**
* 是否缓存(0缓存 1不缓存)
*/
private
String
isCache
;
/**
* 类型(M目录 C菜单 F按钮)
*/
private
String
menuType
;
/**
* 显示状态(0显示 1隐藏)
*/
private
String
visible
;
/**
* 菜单状态(0正常 1停用)
*/
private
String
status
;
/**
* 权限字符串
*/
private
String
perms
;
/**
* 菜单图标
*/
private
String
icon
;
/**
* 备注
*/
private
String
remark
;
/**
* 父菜单名称
*/
@TableField
(
exist
=
false
)
private
String
parentName
;
/**
* 子菜单
*/
@TableField
(
exist
=
false
)
private
List
<
SysMenu
>
children
=
new
ArrayList
<>();
/**
* 获取路由名称
*/
public
String
getRouteName
()
{
String
routerName
=
StringUtils
.
capitalize
(
path
);
// 非外链并且是一级目录(类型为目录)
if
(
isMenuFrame
())
{
routerName
=
StringUtils
.
EMPTY
;
}
return
routerName
;
}
/**
* 获取路由地址
*/
public
String
getRouterPath
()
{
String
routerPath
=
this
.
path
;
// 内链打开外网方式
if
(
getParentId
()
!=
0L
&&
isInnerLink
())
{
routerPath
=
innerLinkReplaceEach
(
routerPath
);
}
// 非外链并且是一级目录(类型为目录)
if
(
0L
==
getParentId
()
&&
UserConstants
.
TYPE_DIR
.
equals
(
getMenuType
())
&&
UserConstants
.
NO_FRAME
.
equals
(
getIsFrame
()))
{
routerPath
=
"/"
+
this
.
path
;
}
// 非外链并且是一级目录(类型为菜单)
else
if
(
isMenuFrame
())
{
routerPath
=
"/"
;
}
return
routerPath
;
}
/**
* 获取组件信息
*/
public
String
getComponentInfo
()
{
String
component
=
UserConstants
.
LAYOUT
;
if
(
StringUtils
.
isNotEmpty
(
this
.
component
)
&&
!
isMenuFrame
())
{
component
=
this
.
component
;
}
else
if
(
StringUtils
.
isEmpty
(
this
.
component
)
&&
getParentId
()
!=
0L
&&
isInnerLink
())
{
component
=
UserConstants
.
INNER_LINK
;
}
else
if
(
StringUtils
.
isEmpty
(
this
.
component
)
&&
isParentView
())
{
component
=
UserConstants
.
PARENT_VIEW
;
}
return
component
;
}
/**
* 是否为菜单内部跳转
*/
public
boolean
isMenuFrame
()
{
return
getParentId
()
==
0L
&&
UserConstants
.
TYPE_MENU
.
equals
(
menuType
)
&&
isFrame
.
equals
(
UserConstants
.
NO_FRAME
);
}
/**
* 是否为内链组件
*/
public
boolean
isInnerLink
()
{
return
isFrame
.
equals
(
UserConstants
.
NO_FRAME
)
&&
StringUtils
.
ishttp
(
path
);
}
/**
* 是否为parent_view组件
*/
public
boolean
isParentView
()
{
return
getParentId
()
!=
0L
&&
UserConstants
.
TYPE_DIR
.
equals
(
menuType
);
}
/**
* 内链域名特殊字符替换
*/
public
static
String
innerLinkReplaceEach
(
String
path
)
{
return
StringUtils
.
replaceEach
(
path
,
new
String
[]{
Constants
.
HTTP
,
Constants
.
HTTPS
,
Constants
.
WWW
,
"."
,
":"
},
new
String
[]{
""
,
""
,
""
,
"/"
,
"/"
});
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRole.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableLogic
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
/**
* 角色表 sys_role
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode
(
callSuper
=
true
)
@TableName
(
"sys_role"
)
public
class
SysRole
extends
BaseEntity
{
/**
* 角色ID
*/
@TableId
(
value
=
"role_id"
)
private
Long
roleId
;
/**
* 角色名称
*/
private
String
roleName
;
/**
* 角色权限
*/
private
String
roleKey
;
/**
* 角色排序
*/
private
Integer
roleSort
;
/**
* 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限)
*/
private
String
dataScope
;
/**
* 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
*/
private
Boolean
menuCheckStrictly
;
/**
* 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
*/
private
Boolean
deptCheckStrictly
;
/**
* 角色状态(0正常 1停用)
*/
private
String
status
;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableLogic
private
String
delFlag
;
/**
* 备注
*/
private
String
remark
;
/**
* 租户ID
*/
private
String
tenantId
;
public
SysRole
(
Long
roleId
)
{
this
.
roleId
=
roleId
;
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRoleDept.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
/**
* 角色和部门关联 sys_role_dept
*
* @author Lion Li
*/
@Data
@TableName
(
"sys_role_dept"
)
public
class
SysRoleDept
{
/**
* 角色ID
*/
@TableId
(
type
=
IdType
.
INPUT
)
private
Long
roleId
;
/**
* 部门ID
*/
private
Long
deptId
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysRoleMenu.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
/**
* 角色和菜单关联 sys_role_menu
*
* @author Lion Li
*/
@Data
@TableName
(
"sys_role_menu"
)
public
class
SysRoleMenu
{
/**
* 角色ID
*/
@TableId
(
type
=
IdType
.
INPUT
)
private
Long
roleId
;
/**
* 菜单ID
*/
private
Long
menuId
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysUser.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.*
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
lombok.NoArgsConstructor
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.mybatis.core.domain.BaseEntity
;
import
java.util.Date
;
/**
* 用户对象 sys_user
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
@EqualsAndHashCode
(
callSuper
=
true
)
@TableName
(
"sys_user"
)
public
class
SysUser
extends
BaseEntity
{
/**
* 用户ID
*/
@TableId
(
value
=
"user_id"
)
private
Long
userId
;
/**
* 部门ID
*/
private
Long
deptId
;
/**
* 用户账号
*/
private
String
userName
;
/**
* 用户昵称
*/
private
String
nickName
;
/**
* 用户类型(sys_user系统用户)
*/
private
String
userType
;
/**
* 用户邮箱
*/
private
String
email
;
/**
* 手机号码
*/
private
String
phonenumber
;
/**
* 用户性别
*/
private
String
sex
;
/**
* 用户头像
*/
private
Long
avatar
;
/**
* 密码
*/
@TableField
(
insertStrategy
=
FieldStrategy
.
NOT_EMPTY
,
updateStrategy
=
FieldStrategy
.
NOT_EMPTY
,
whereStrategy
=
FieldStrategy
.
NOT_EMPTY
)
private
String
password
;
/**
* 帐号状态(0正常 1停用)
*/
private
String
status
;
/**
* 删除标志(0代表存在 2代表删除)
*/
@TableLogic
private
String
delFlag
;
/**
* 最后登录IP
*/
private
String
loginIp
;
/**
* 最后登录时间
*/
private
Date
loginDate
;
/**
* 备注
*/
private
String
remark
;
/**
* 租户ID
*/
private
String
tenantId
;
/**
* 租户名称(学校名称)
*/
private
String
tenantName
;
public
SysUser
(
Long
userId
)
{
this
.
userId
=
userId
;
}
public
boolean
isSuperAdmin
()
{
return
UserConstants
.
SUPER_ADMIN_ID
.
equals
(
this
.
userId
);
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/entity/SysUserRole.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
lombok.Data
;
/**
* 用户和角色关联 sys_user_role
*
* @author Lion Li
*/
@Data
@TableName
(
"sys_user_role"
)
public
class
SysUserRole
{
/**
* 用户ID
*/
@TableId
(
type
=
IdType
.
INPUT
)
private
Long
userId
;
/**
* 角色ID
*/
private
Long
roleId
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysMenuVo.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
vo
;
import
com.bkty.system.domain.entity.SysMenu
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
lombok.Data
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
/**
* 菜单权限视图对象 sys_menu
*
* @author Michelle.Chung
*/
@Data
@AutoMapper
(
target
=
SysMenu
.
class
)
public
class
SysMenuVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 菜单ID
*/
private
String
menuId
;
/**
* 菜单名称
*/
private
String
menuName
;
/**
* 父菜单ID
*/
private
String
parentId
;
/**
* 显示顺序
*/
private
Integer
orderNum
;
/**
* 路由地址
*/
private
String
path
;
/**
* 组件路径
*/
private
String
component
;
/**
* 路由参数
*/
private
String
queryParam
;
/**
* 是否为外链(0是 1否)
*/
private
String
isFrame
;
/**
* 是否缓存(0缓存 1不缓存)
*/
private
String
isCache
;
/**
* 菜单类型(M目录 C菜单 F按钮)
*/
private
String
menuType
;
/**
* 显示状态(0显示 1隐藏)
*/
private
String
visible
;
/**
* 菜单状态(0正常 1停用)
*/
private
String
status
;
/**
* 权限标识
*/
private
String
perms
;
/**
* 菜单图标
*/
private
String
icon
;
/**
* 创建部门
*/
private
Long
createDept
;
/**
* 备注
*/
private
String
remark
;
/**
* 创建时间
*/
private
Date
createTime
;
/**
* 子菜单
*/
private
List
<
SysMenuVo
>
children
=
new
ArrayList
<>();
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysRoleVo.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
vo
;
import
com.bkty.system.domain.entity.SysRole
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
lombok.Data
;
import
org.dromara.common.core.constant.UserConstants
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 角色信息视图对象 sys_role
*
* @author Michelle.Chung
*/
@Data
@AutoMapper
(
target
=
SysRole
.
class
)
public
class
SysRoleVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 角色ID
*/
private
Long
roleId
;
/**
* 角色名称
*/
private
String
roleName
;
/**
* 角色权限字符串
*/
private
String
roleKey
;
/**
* 显示顺序
*/
private
Integer
roleSort
;
/**
* 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)
*/
private
String
dataScope
;
/**
* 菜单树选择项是否关联显示
*/
private
Boolean
menuCheckStrictly
;
/**
* 部门树选择项是否关联显示
*/
private
Boolean
deptCheckStrictly
;
/**
* 角色状态(0正常 1停用)
*/
private
String
status
;
/**
* 备注
*/
private
String
remark
;
/**
* 创建时间
*/
private
Date
createTime
;
/**
* 用户是否存在此角色标识 默认不存在
*/
private
boolean
flag
=
false
;
public
boolean
isSuperAdmin
()
{
return
UserConstants
.
SUPER_ADMIN_ID
.
equals
(
this
.
roleId
);
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysUserExportVo.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
vo
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 用户对象导出VO
*
* @author Lion Li
*/
@Data
@NoArgsConstructor
public
class
SysUserExportVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 用户ID
*/
private
Long
userId
;
/**
* 用户账号
*/
private
String
userName
;
/**
* 用户昵称
*/
private
String
nickName
;
/**
* 用户邮箱
*/
private
String
email
;
/**
* 手机号码
*/
private
String
phonenumber
;
/**
* 用户性别
*/
private
String
sex
;
/**
* 帐号状态(0正常 1停用)
*/
private
String
status
;
/**
* 最后登录IP
*/
private
String
loginIp
;
/**
* 最后登录时间
*/
private
Date
loginDate
;
/**
* 部门名称
*/
private
String
deptName
;
/**
* 负责人
*/
private
String
leaderName
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/domain/vo/SysUserVo.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
domain
.
vo
;
import
com.bkty.system.domain.entity.SysDept
;
import
com.bkty.system.domain.entity.SysUser
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
com.fasterxml.jackson.annotation.JsonProperty
;
import
io.github.linpeilie.annotations.AutoMapper
;
import
lombok.Data
;
import
org.dromara.common.sensitive.annotation.Sensitive
;
import
org.dromara.common.sensitive.core.SensitiveStrategy
;
import
java.io.Serial
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.List
;
/**
* 用户信息视图对象 sys_user
*
* @author Michelle.Chung
*/
@Data
@AutoMapper
(
target
=
SysUser
.
class
)
public
class
SysUserVo
implements
Serializable
{
@Serial
private
static
final
long
serialVersionUID
=
1L
;
/**
* 用户ID
*/
private
Long
userId
;
/**
* 租户ID
*/
private
String
tenantId
;
/**
* 租户名称(学校名称)
*/
private
String
tenantName
;
/**
* 部门ID
*/
private
Long
deptId
;
/**
* 用户账号
*/
private
String
userName
;
/**
* 用户昵称
*/
private
String
nickName
;
/**
* 用户类型(sys_user系统用户)
*/
private
String
userType
;
/**
* 用户邮箱
*/
@Sensitive
(
strategy
=
SensitiveStrategy
.
EMAIL
,
perms
=
"system:user:edit"
)
private
String
email
;
/**
* 手机号码
*/
@Sensitive
(
strategy
=
SensitiveStrategy
.
PHONE
,
perms
=
"system:user:edit"
)
private
String
phonenumber
;
/**
* 用户性别(0男 1女 2未知)
*/
private
String
sex
;
/**
* 头像地址
*/
private
Long
avatar
;
/**
* 密码
*/
@JsonIgnore
@JsonProperty
private
String
password
;
/**
* 帐号状态(0正常 1停用)
*/
private
String
status
;
/**
* 最后登录IP
*/
private
String
loginIp
;
/**
* 最后登录时间
*/
private
Date
loginDate
;
/**
* 备注
*/
private
String
remark
;
/**
* 创建时间
*/
private
Date
createTime
;
/**
* 部门名
*/
private
String
deptName
;
/**
* 角色对象
*/
private
List
<
SysRoleVo
>
roles
;
/**
* 角色组
*/
private
Long
[]
roleIds
;
/**
* 岗位组
*/
private
Long
[]
postIds
;
/**
* 数据权限 当前角色ID
*/
private
Long
roleId
;
/**
* 部门列表
*/
private
List
<
SysDept
>
deptList
;
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysMenuMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.baomidou.mybatisplus.core.conditions.Wrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
com.bkty.system.domain.entity.SysMenu
;
import
com.bkty.system.domain.vo.SysMenuVo
;
import
org.apache.ibatis.annotations.Param
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
import
java.util.List
;
/**
* 菜单表 数据层
*
* @author Lion Li
*/
public
interface
SysMenuMapper
extends
BaseMapperPlus
<
SysMenu
,
SysMenuVo
>
{
/**
* 根据用户查询系统菜单列表
*
* @param queryWrapper 查询条件
* @return 菜单列表
*/
List
<
SysMenu
>
selectMenuListByUserId
(
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysMenu
>
queryWrapper
);
/**
* 根据用户ID查询权限
*
* @param userId 用户ID
* @return 权限列表
*/
List
<
String
>
selectMenuPermsByUserId
(
Long
userId
);
/**
* 根据角色ID查询权限
*
* @param roleId 角色ID
* @return 权限列表
*/
List
<
String
>
selectMenuPermsByRoleId
(
Long
roleId
);
/**
* 根据用户ID查询菜单
*
* @return 菜单列表
*/
default
List
<
SysMenu
>
selectMenuTreeAll
()
{
LambdaQueryWrapper
<
SysMenu
>
lqw
=
new
LambdaQueryWrapper
<
SysMenu
>()
.
in
(
SysMenu:
:
getMenuType
,
UserConstants
.
TYPE_DIR
,
UserConstants
.
TYPE_MENU
)
.
eq
(
SysMenu:
:
getStatus
,
UserConstants
.
MENU_NORMAL
)
.
orderByAsc
(
SysMenu:
:
getParentId
)
.
orderByAsc
(
SysMenu:
:
getOrderNum
);
return
this
.
selectList
(
lqw
);
}
/**
* 根据用户ID查询菜单
*
* @param userId 用户ID
* @return 菜单列表
*/
List
<
SysMenu
>
selectMenuTreeByUserId
(
Long
userId
);
/**
* 根据角色ID查询菜单树信息
*
* @param roleId 角色ID
* @param menuCheckStrictly 菜单树选择项是否关联显示
* @return 选中菜单列表
*/
List
<
Long
>
selectMenuListByRoleId
(
@Param
(
"roleId"
)
Long
roleId
,
@Param
(
"menuCheckStrictly"
)
boolean
menuCheckStrictly
);
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleDeptMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.bkty.system.domain.entity.SysRoleDept
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
/**
* 角色与部门关联表 数据层
*
* @author Lion Li
*/
public
interface
SysRoleDeptMapper
extends
BaseMapperPlus
<
SysRoleDept
,
SysRoleDept
>
{
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.baomidou.mybatisplus.core.conditions.Wrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.bkty.system.domain.entity.SysRole
;
import
com.bkty.system.domain.vo.SysRoleVo
;
import
org.apache.ibatis.annotations.Param
;
import
org.dromara.common.mybatis.annotation.DataColumn
;
import
org.dromara.common.mybatis.annotation.DataPermission
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
import
java.util.List
;
/**
* 角色表 数据层
*
* @author Lion Li
*/
public
interface
SysRoleMapper
extends
BaseMapperPlus
<
SysRole
,
SysRoleVo
>
{
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"r.create_by"
)
})
Page
<
SysRoleVo
>
selectPageRoleList
(
@Param
(
"page"
)
Page
<
SysRole
>
page
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysRole
>
queryWrapper
);
/**
* 根据条件分页查询角色数据
*
* @param queryWrapper 查询条件
* @return 角色数据集合信息
*/
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"r.create_by"
)
})
List
<
SysRoleVo
>
selectRoleList
(
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysRole
>
queryWrapper
);
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"r.create_by"
)
})
SysRoleVo
selectRoleById
(
Long
roleId
);
/**
* 根据用户ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
List
<
SysRoleVo
>
selectRolePermissionByUserId
(
Long
userId
);
/**
* 根据用户ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
List
<
SysRoleVo
>
selectRolesByUserId
(
Long
userId
);
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysRoleMenuMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.bkty.system.domain.entity.SysRoleMenu
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
/**
* 角色与菜单关联表 数据层
*
* @author Lion Li
*/
public
interface
SysRoleMenuMapper
extends
BaseMapperPlus
<
SysRoleMenu
,
SysRoleMenu
>
{
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysUserMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.baomidou.mybatisplus.core.conditions.Wrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Constants
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.bkty.system.domain.entity.SysUser
;
import
com.bkty.system.domain.vo.SysUserExportVo
;
import
com.bkty.system.domain.vo.SysUserVo
;
import
org.apache.ibatis.annotations.Param
;
import
org.dromara.common.mybatis.annotation.DataColumn
;
import
org.dromara.common.mybatis.annotation.DataPermission
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
import
java.util.List
;
/**
* 用户表 数据层
*
* @author Lion Li
*/
public
interface
SysUserMapper
extends
BaseMapperPlus
<
SysUser
,
SysUserVo
>
{
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"u.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"u.user_id"
)
})
Page
<
SysUserVo
>
selectPageUserList
(
@Param
(
"page"
)
Page
<
SysUser
>
page
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
queryWrapper
);
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"user_id"
)
})
List
<
SysUserVo
>
selectUserList
(
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
queryWrapper
);
/**
* 根据条件分页查询用户列表
*
* @param queryWrapper 查询条件
* @return 用户信息集合信息
*/
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"u.user_id"
)
})
List
<
SysUserExportVo
>
selectUserExportList
(
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
queryWrapper
);
/**
* 根据条件分页查询已配用户角色列表
*
* @param queryWrapper 查询条件
* @return 用户信息集合信息
*/
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"u.user_id"
)
})
Page
<
SysUserVo
>
selectAllocatedList
(
@Param
(
"page"
)
Page
<
SysUser
>
page
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
queryWrapper
);
/**
* 根据条件分页查询未分配用户角色列表
*
* @param queryWrapper 查询条件
* @return 用户信息集合信息
*/
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"d.dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"u.user_id"
)
})
Page
<
SysUserVo
>
selectUnallocatedList
(
@Param
(
"page"
)
Page
<
SysUser
>
page
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
queryWrapper
);
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"user_id"
)
})
long
countUserById
(
Long
userId
);
@Override
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"user_id"
)
})
int
update
(
@Param
(
Constants
.
ENTITY
)
SysUser
user
,
@Param
(
Constants
.
WRAPPER
)
Wrapper
<
SysUser
>
updateWrapper
);
@Override
@DataPermission
({
@DataColumn
(
key
=
"deptName"
,
value
=
"dept_id"
),
@DataColumn
(
key
=
"userName"
,
value
=
"user_id"
)
})
int
updateById
(
@Param
(
Constants
.
ENTITY
)
SysUser
user
);
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/mapper/SysUserRoleMapper.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
mapper
;
import
com.bkty.system.domain.entity.SysUserRole
;
import
org.dromara.common.mybatis.core.mapper.BaseMapperPlus
;
/**
* 用户与角色关联表 数据层
*
* @author Lion Li
*/
public
interface
SysUserRoleMapper
extends
BaseMapperPlus
<
SysUserRole
,
SysUserRole
>
{
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysMenuServiceImpl.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
service
.
impl
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.lang.tree.Tree
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.bkty.system.domain.dto.SysMenuDto
;
import
com.bkty.system.domain.entity.SysMenu
;
import
com.bkty.system.domain.entity.SysRole
;
import
com.bkty.system.domain.entity.SysRoleMenu
;
import
com.bkty.system.domain.vo.MetaVo
;
import
com.bkty.system.domain.vo.RouterVo
;
import
com.bkty.system.domain.vo.SysMenuVo
;
import
com.bkty.system.mapper.SysMenuMapper
;
import
com.bkty.system.mapper.SysRoleMapper
;
import
com.bkty.system.mapper.SysRoleMenuMapper
;
import
com.bkty.system.service.ISysMenuService
;
import
lombok.RequiredArgsConstructor
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.utils.MapstructUtils
;
import
org.dromara.common.core.utils.StreamUtils
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.core.utils.TreeBuildUtils
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.stereotype.Service
;
import
java.util.*
;
/**
* 菜单 业务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Service
public
class
SysMenuServiceImpl
implements
ISysMenuService
{
private
final
SysMenuMapper
baseMapper
;
private
final
SysRoleMapper
roleMapper
;
private
final
SysRoleMenuMapper
roleMenuMapper
;
/**
* 根据用户查询系统菜单列表
*
* @param userId 用户ID
* @return 菜单列表
*/
@Override
public
List
<
SysMenuVo
>
selectMenuList
(
Long
userId
)
{
return
selectMenuList
(
new
SysMenuDto
(),
userId
);
}
/**
* 查询系统菜单列表
*
* @param menu 菜单信息
* @return 菜单列表
*/
@Override
public
List
<
SysMenuVo
>
selectMenuList
(
SysMenuDto
menu
,
Long
userId
)
{
List
<
SysMenuVo
>
menuList
;
// 管理员显示所有菜单信息
if
(
LoginHelper
.
isSuperAdmin
(
userId
))
{
menuList
=
baseMapper
.
selectVoList
(
new
LambdaQueryWrapper
<
SysMenu
>()
.
like
(
StringUtils
.
isNotBlank
(
menu
.
getMenuName
()),
SysMenu:
:
getMenuName
,
menu
.
getMenuName
())
.
eq
(
StringUtils
.
isNotBlank
(
menu
.
getVisible
()),
SysMenu:
:
getVisible
,
menu
.
getVisible
())
.
eq
(
StringUtils
.
isNotBlank
(
menu
.
getStatus
()),
SysMenu:
:
getStatus
,
menu
.
getStatus
())
.
orderByAsc
(
SysMenu:
:
getParentId
)
.
orderByAsc
(
SysMenu:
:
getOrderNum
));
}
else
{
QueryWrapper
<
SysMenu
>
wrapper
=
Wrappers
.
query
();
wrapper
.
inSql
(
"r.role_id"
,
"select role_id from sys_user_role where user_id = "
+
userId
)
.
like
(
StringUtils
.
isNotBlank
(
menu
.
getMenuName
()),
"m.menu_name"
,
menu
.
getMenuName
())
.
eq
(
StringUtils
.
isNotBlank
(
menu
.
getVisible
()),
"m.visible"
,
menu
.
getVisible
())
.
eq
(
StringUtils
.
isNotBlank
(
menu
.
getStatus
()),
"m.status"
,
menu
.
getStatus
())
.
orderByAsc
(
"m.parent_id"
)
.
orderByAsc
(
"m.order_num"
);
List
<
SysMenu
>
list
=
baseMapper
.
selectMenuListByUserId
(
wrapper
);
menuList
=
MapstructUtils
.
convert
(
list
,
SysMenuVo
.
class
);
}
return
menuList
;
}
/**
* 根据用户ID查询权限
*
* @param userId 用户ID
* @return 权限列表
*/
@Override
public
Set
<
String
>
selectMenuPermsByUserId
(
Long
userId
)
{
List
<
String
>
perms
=
baseMapper
.
selectMenuPermsByUserId
(
userId
);
Set
<
String
>
permsSet
=
new
HashSet
<>();
for
(
String
perm
:
perms
)
{
if
(
StringUtils
.
isNotEmpty
(
perm
))
{
permsSet
.
addAll
(
StringUtils
.
splitList
(
perm
.
trim
()));
}
}
return
permsSet
;
}
/**
* 根据角色ID查询权限
*
* @param roleId 角色ID
* @return 权限列表
*/
@Override
public
Set
<
String
>
selectMenuPermsByRoleId
(
Long
roleId
)
{
List
<
String
>
perms
=
baseMapper
.
selectMenuPermsByRoleId
(
roleId
);
Set
<
String
>
permsSet
=
new
HashSet
<>();
for
(
String
perm
:
perms
)
{
if
(
StringUtils
.
isNotEmpty
(
perm
))
{
permsSet
.
addAll
(
StringUtils
.
splitList
(
perm
.
trim
()));
}
}
return
permsSet
;
}
/**
* 根据用户ID查询菜单
*
* @param userId 用户名称
* @return 菜单列表
*/
@Override
public
List
<
SysMenu
>
selectMenuTreeByUserId
(
Long
userId
)
{
List
<
SysMenu
>
menus
;
if
(
LoginHelper
.
isSuperAdmin
(
userId
))
{
menus
=
baseMapper
.
selectMenuTreeAll
();
}
else
{
menus
=
baseMapper
.
selectMenuTreeByUserId
(
userId
);
}
return
getChildPerms
(
menus
,
0
);
}
/**
* 根据角色ID查询菜单树信息
*
* @param roleId 角色ID
* @return 选中菜单列表
*/
@Override
public
List
<
Long
>
selectMenuListByRoleId
(
Long
roleId
)
{
SysRole
role
=
roleMapper
.
selectById
(
roleId
);
return
baseMapper
.
selectMenuListByRoleId
(
roleId
,
role
.
getMenuCheckStrictly
());
}
/**
* 构建前端路由所需要的菜单
* 路由name命名规则 path首字母转大写 + id
*
* @param menus 菜单列表
* @return 路由列表
*/
@Override
public
List
<
RouterVo
>
buildMenus
(
List
<
SysMenu
>
menus
)
{
List
<
RouterVo
>
routers
=
new
LinkedList
<>();
for
(
SysMenu
menu
:
menus
)
{
String
name
=
menu
.
getRouteName
()
+
menu
.
getMenuId
();
RouterVo
router
=
new
RouterVo
();
router
.
setHidden
(
"1"
.
equals
(
menu
.
getVisible
()));
router
.
setName
(
name
);
router
.
setPath
(
menu
.
getRouterPath
());
router
.
setComponent
(
menu
.
getComponentInfo
());
router
.
setQuery
(
menu
.
getQueryParam
());
router
.
setMeta
(
new
MetaVo
(
menu
.
getMenuName
(),
menu
.
getIcon
(),
StringUtils
.
equals
(
"1"
,
menu
.
getIsCache
()),
menu
.
getPath
(),
menu
.
getMenuId
()));
List
<
SysMenu
>
cMenus
=
menu
.
getChildren
();
if
(
CollUtil
.
isNotEmpty
(
cMenus
)
&&
UserConstants
.
TYPE_DIR
.
equals
(
menu
.
getMenuType
()))
{
router
.
setAlwaysShow
(
true
);
router
.
setRedirect
(
"noRedirect"
);
router
.
setChildren
(
buildMenus
(
cMenus
));
}
else
if
(
menu
.
isMenuFrame
())
{
String
frameName
=
StringUtils
.
capitalize
(
menu
.
getPath
())
+
menu
.
getMenuId
();
router
.
setMeta
(
null
);
List
<
RouterVo
>
childrenList
=
new
ArrayList
<>();
RouterVo
children
=
new
RouterVo
();
children
.
setPath
(
menu
.
getPath
());
children
.
setComponent
(
menu
.
getComponent
());
children
.
setName
(
frameName
);
children
.
setMeta
(
new
MetaVo
(
menu
.
getMenuName
(),
menu
.
getIcon
(),
StringUtils
.
equals
(
"1"
,
menu
.
getIsCache
()),
menu
.
getPath
(),
menu
.
getMenuId
()));
children
.
setQuery
(
menu
.
getQueryParam
());
childrenList
.
add
(
children
);
router
.
setChildren
(
childrenList
);
}
else
if
(
menu
.
getParentId
().
intValue
()
==
0
&&
menu
.
isInnerLink
())
{
router
.
setMeta
(
new
MetaVo
(
menu
.
getMenuName
(),
menu
.
getIcon
(),
menu
.
getMenuId
()));
router
.
setPath
(
"/"
);
List
<
RouterVo
>
childrenList
=
new
ArrayList
<>();
RouterVo
children
=
new
RouterVo
();
String
routerPath
=
SysMenu
.
innerLinkReplaceEach
(
menu
.
getPath
());
String
innerLinkName
=
StringUtils
.
capitalize
(
routerPath
)
+
menu
.
getMenuId
();
children
.
setPath
(
routerPath
);
children
.
setComponent
(
UserConstants
.
INNER_LINK
);
children
.
setName
(
innerLinkName
);
children
.
setMeta
(
new
MetaVo
(
menu
.
getMenuName
(),
menu
.
getIcon
(),
menu
.
getPath
(),
menu
.
getMenuId
()));
childrenList
.
add
(
children
);
router
.
setChildren
(
childrenList
);
}
routers
.
add
(
router
);
}
return
routers
;
}
/**
* 构建前端所需要下拉树结构
*
* @param menus 菜单列表
* @return 下拉树结构列表
*/
@Override
public
List
<
Tree
<
String
>>
buildMenuTreeSelect
(
List
<
SysMenuVo
>
menus
)
{
if
(
CollUtil
.
isEmpty
(
menus
))
{
return
CollUtil
.
newArrayList
();
}
return
TreeBuildUtils
.
build
(
menus
,
(
menu
,
tree
)
->
tree
.
setId
(
menu
.
getMenuId
())
.
setParentId
(
menu
.
getParentId
())
.
setName
(
menu
.
getMenuName
())
.
setWeight
(
menu
.
getOrderNum
()));
}
/**
* 根据菜单ID查询信息
*
* @param menuId 菜单ID
* @return 菜单信息
*/
@Override
public
SysMenuVo
selectMenuById
(
Long
menuId
)
{
return
baseMapper
.
selectVoById
(
menuId
);
}
/**
* 是否存在菜单子节点
*
* @param menuId 菜单ID
* @return 结果
*/
@Override
public
boolean
hasChildByMenuId
(
Long
menuId
)
{
return
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysMenu
>().
eq
(
SysMenu:
:
getParentId
,
menuId
));
}
/**
* 查询菜单使用数量
*
* @param menuId 菜单ID
* @return 结果
*/
@Override
public
boolean
checkMenuExistRole
(
Long
menuId
)
{
return
roleMenuMapper
.
exists
(
new
LambdaQueryWrapper
<
SysRoleMenu
>().
eq
(
SysRoleMenu:
:
getMenuId
,
menuId
));
}
/**
* 新增保存菜单信息
*
* @param bo 菜单信息
* @return 结果
*/
@Override
public
int
insertMenu
(
SysMenuDto
bo
)
{
SysMenu
menu
=
MapstructUtils
.
convert
(
bo
,
SysMenu
.
class
);
return
baseMapper
.
insert
(
menu
);
}
/**
* 修改保存菜单信息
*
* @param bo 菜单信息
* @return 结果
*/
@Override
public
int
updateMenu
(
SysMenuDto
bo
)
{
SysMenu
menu
=
MapstructUtils
.
convert
(
bo
,
SysMenu
.
class
);
return
baseMapper
.
updateById
(
menu
);
}
/**
* 删除菜单管理信息
*
* @param menuId 菜单ID
* @return 结果
*/
@Override
public
int
deleteMenuById
(
Long
menuId
)
{
return
baseMapper
.
deleteById
(
menuId
);
}
/**
* 校验菜单名称是否唯一
*
* @param menu 菜单信息
* @return 结果
*/
@Override
public
boolean
checkMenuNameUnique
(
SysMenuDto
menu
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysMenu
>()
.
eq
(
SysMenu:
:
getMenuName
,
menu
.
getMenuName
())
.
eq
(
SysMenu:
:
getParentId
,
menu
.
getParentId
())
.
ne
(
ObjectUtil
.
isNotNull
(
menu
.
getMenuId
()),
SysMenu:
:
getMenuId
,
menu
.
getMenuId
()));
return
!
exist
;
}
/**
* 根据父节点的ID获取所有子节点
*
* @param list 分类表
* @param parentId 传入的父节点ID
* @return String
*/
private
List
<
SysMenu
>
getChildPerms
(
List
<
SysMenu
>
list
,
int
parentId
)
{
List
<
SysMenu
>
returnList
=
new
ArrayList
<>();
for
(
SysMenu
t
:
list
)
{
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if
(
t
.
getParentId
()
==
parentId
)
{
recursionFn
(
list
,
t
);
returnList
.
add
(
t
);
}
}
return
returnList
;
}
/**
* 递归列表
*/
private
void
recursionFn
(
List
<
SysMenu
>
list
,
SysMenu
t
)
{
// 得到子节点列表
List
<
SysMenu
>
childList
=
StreamUtils
.
filter
(
list
,
n
->
n
.
getParentId
().
equals
(
t
.
getMenuId
()));
t
.
setChildren
(
childList
);
for
(
SysMenu
tChild
:
childList
)
{
// 判断是否有子节点
if
(
list
.
stream
().
anyMatch
(
n
->
n
.
getParentId
().
equals
(
tChild
.
getMenuId
())))
{
recursionFn
(
list
,
tChild
);
}
}
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysPermissionServiceImpl.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
service
.
impl
;
import
com.bkty.system.service.ISysMenuService
;
import
com.bkty.system.service.ISysPermissionService
;
import
com.bkty.system.service.ISysRoleService
;
import
lombok.RequiredArgsConstructor
;
import
org.dromara.common.core.constant.TenantConstants
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.stereotype.Service
;
import
java.util.HashSet
;
import
java.util.Set
;
/**
* 用户权限处理
*
* @author ruoyi
*/
@RequiredArgsConstructor
@Service
public
class
SysPermissionServiceImpl
implements
ISysPermissionService
{
private
final
ISysRoleService
roleService
;
private
final
ISysMenuService
menuService
;
/**
* 获取角色数据权限
*
* @param userId 用户id
* @return 角色权限信息
*/
@Override
public
Set
<
String
>
getRolePermission
(
Long
userId
)
{
Set
<
String
>
roles
=
new
HashSet
<>();
// 管理员拥有所有权限
if
(
LoginHelper
.
isSuperAdmin
(
userId
))
{
roles
.
add
(
TenantConstants
.
SUPER_ADMIN_ROLE_KEY
);
}
else
{
roles
.
addAll
(
roleService
.
selectRolePermissionByUserId
(
userId
));
}
return
roles
;
}
/**
* 获取菜单数据权限
*
* @param userId 用户id
* @return 菜单权限信息
*/
@Override
public
Set
<
String
>
getMenuPermission
(
Long
userId
)
{
Set
<
String
>
perms
=
new
HashSet
<>();
// 管理员拥有所有权限
if
(
LoginHelper
.
isSuperAdmin
(
userId
))
{
perms
.
add
(
"*:*:*"
);
}
else
{
perms
.
addAll
(
menuService
.
selectMenuPermsByUserId
(
userId
));
}
return
perms
;
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysRoleServiceImpl.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
service
.
impl
;
import
cn.dev33.satoken.exception.NotLoginException
;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.baomidou.mybatisplus.core.conditions.Wrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.bkty.system.api.model.LoginUser
;
import
com.bkty.system.domain.dto.SysRoleDto
;
import
com.bkty.system.domain.entity.SysRole
;
import
com.bkty.system.domain.entity.SysRoleDept
;
import
com.bkty.system.domain.entity.SysRoleMenu
;
import
com.bkty.system.domain.entity.SysUserRole
;
import
com.bkty.system.domain.vo.SysRoleVo
;
import
com.bkty.system.mapper.SysRoleDeptMapper
;
import
com.bkty.system.mapper.SysRoleMapper
;
import
com.bkty.system.mapper.SysRoleMenuMapper
;
import
com.bkty.system.mapper.SysUserRoleMapper
;
import
com.bkty.system.service.ISysRoleService
;
import
lombok.RequiredArgsConstructor
;
import
org.dromara.common.core.constant.TenantConstants
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.exception.ServiceException
;
import
org.dromara.common.core.utils.MapstructUtils
;
import
org.dromara.common.core.utils.StreamUtils
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.mybatis.core.page.PageQuery
;
import
org.dromara.common.mybatis.core.page.TableDataInfo
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
/**
* 角色 业务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Service
public
class
SysRoleServiceImpl
implements
ISysRoleService
{
private
final
SysRoleMapper
baseMapper
;
private
final
SysRoleMenuMapper
roleMenuMapper
;
private
final
SysUserRoleMapper
userRoleMapper
;
private
final
SysRoleDeptMapper
roleDeptMapper
;
@Override
public
TableDataInfo
<
SysRoleVo
>
selectPageRoleList
(
SysRoleDto
role
,
PageQuery
pageQuery
)
{
Page
<
SysRoleVo
>
page
=
baseMapper
.
selectPageRoleList
(
pageQuery
.
build
(),
this
.
buildQueryWrapper
(
role
));
return
TableDataInfo
.
build
(
page
);
}
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
@Override
public
List
<
SysRoleVo
>
selectRoleList
(
SysRoleDto
role
)
{
return
baseMapper
.
selectRoleList
(
this
.
buildQueryWrapper
(
role
));
}
private
Wrapper
<
SysRole
>
buildQueryWrapper
(
SysRoleDto
bo
)
{
Map
<
String
,
Object
>
params
=
bo
.
getParams
();
QueryWrapper
<
SysRole
>
wrapper
=
Wrappers
.
query
();
wrapper
.
eq
(
"r.del_flag"
,
UserConstants
.
ROLE_NORMAL
)
.
eq
(
ObjectUtil
.
isNotNull
(
bo
.
getRoleId
()),
"r.role_id"
,
bo
.
getRoleId
())
.
like
(
StringUtils
.
isNotBlank
(
bo
.
getRoleName
()),
"r.role_name"
,
bo
.
getRoleName
())
.
eq
(
StringUtils
.
isNotBlank
(
bo
.
getStatus
()),
"r.status"
,
bo
.
getStatus
())
.
like
(
StringUtils
.
isNotBlank
(
bo
.
getRoleKey
()),
"r.role_key"
,
bo
.
getRoleKey
())
.
between
(
params
.
get
(
"beginTime"
)
!=
null
&&
params
.
get
(
"endTime"
)
!=
null
,
"r.create_time"
,
params
.
get
(
"beginTime"
),
params
.
get
(
"endTime"
))
.
orderByAsc
(
"r.role_sort"
).
orderByAsc
(
"r.create_time"
);
if
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
()))
{
wrapper
.
eq
(
"r.tenant_id"
,
LoginHelper
.
getTenantId
());
}
return
wrapper
;
}
/**
* 根据用户ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public
List
<
SysRoleVo
>
selectRolesByUserId
(
Long
userId
)
{
return
baseMapper
.
selectRolesByUserId
(
userId
);
}
/**
* 根据用户ID查询角色列表(包含被授权状态)
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public
List
<
SysRoleVo
>
selectRolesAuthByUserId
(
Long
userId
)
{
List
<
SysRoleVo
>
userRoles
=
baseMapper
.
selectRolesByUserId
(
userId
);
List
<
SysRoleVo
>
roles
=
selectRoleAll
();
// 使用HashSet提高查找效率
Set
<
Long
>
userRoleIds
=
StreamUtils
.
toSet
(
userRoles
,
SysRoleVo:
:
getRoleId
);
for
(
SysRoleVo
role
:
roles
)
{
if
(
userRoleIds
.
contains
(
role
.
getRoleId
()))
{
role
.
setFlag
(
true
);
}
}
return
roles
;
}
/**
* 根据用户ID查询权限
*
* @param userId 用户ID
* @return 权限列表
*/
@Override
public
Set
<
String
>
selectRolePermissionByUserId
(
Long
userId
)
{
List
<
SysRoleVo
>
perms
=
baseMapper
.
selectRolesByUserId
(
userId
);
Set
<
String
>
permsSet
=
new
HashSet
<>();
for
(
SysRoleVo
perm
:
perms
)
{
if
(
ObjectUtil
.
isNotNull
(
perm
))
{
permsSet
.
addAll
(
StringUtils
.
splitList
(
perm
.
getRoleKey
().
trim
()));
}
}
return
permsSet
;
}
/**
* 查询所有角色
*
* @return 角色列表
*/
@Override
public
List
<
SysRoleVo
>
selectRoleAll
()
{
return
this
.
selectRoleList
(
new
SysRoleDto
());
}
/**
* 根据用户ID获取角色选择框列表
*
* @param userId 用户ID
* @return 选中角色ID列表
*/
@Override
public
List
<
Long
>
selectRoleListByUserId
(
Long
userId
)
{
List
<
SysRoleVo
>
list
=
baseMapper
.
selectRolesByUserId
(
userId
);
return
StreamUtils
.
toList
(
list
,
SysRoleVo:
:
getRoleId
);
}
/**
* 通过角色ID查询角色
*
* @param roleId 角色ID
* @return 角色对象信息
*/
@Override
public
SysRoleVo
selectRoleById
(
Long
roleId
)
{
return
baseMapper
.
selectRoleById
(
roleId
);
}
/**
* 通过角色ID串查询角色
*
* @param roleIds 角色ID串
* @return 角色列表信息
*/
@Override
public
List
<
SysRoleVo
>
selectRoleByIds
(
List
<
Long
>
roleIds
)
{
return
baseMapper
.
selectRoleList
(
new
QueryWrapper
<
SysRole
>()
.
eq
(
"r.status"
,
UserConstants
.
ROLE_NORMAL
)
.
eq
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
()),
"r.tenant_id"
,
LoginHelper
.
getTenantId
())
.
in
(
CollUtil
.
isNotEmpty
(
roleIds
),
"r.role_id"
,
roleIds
));
}
/**
* 校验角色名称是否唯一
*
* @param role 角色信息
* @return 结果
*/
@Override
public
boolean
checkRoleNameUnique
(
SysRoleDto
role
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysRole
>()
.
eq
(
SysRole:
:
getRoleName
,
role
.
getRoleName
())
.
eq
(
SysRole:
:
getTenantId
,
LoginHelper
.
getTenantId
())
.
ne
(
ObjectUtil
.
isNotNull
(
role
.
getRoleId
()),
SysRole:
:
getRoleId
,
role
.
getRoleId
()));
return
!
exist
;
}
/**
* 校验角色权限是否唯一
*
* @param role 角色信息
* @return 结果
*/
@Override
public
boolean
checkRoleKeyUnique
(
SysRoleDto
role
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysRole
>()
.
eq
(
SysRole:
:
getRoleKey
,
role
.
getRoleKey
())
.
eq
(
SysRole:
:
getTenantId
,
LoginHelper
.
getTenantId
())
.
ne
(
ObjectUtil
.
isNotNull
(
role
.
getRoleId
()),
SysRole:
:
getRoleId
,
role
.
getRoleId
()));
return
!
exist
;
}
/**
* 校验角色是否允许操作
*
* @param role 角色信息
*/
@Override
public
void
checkRoleAllowed
(
SysRoleDto
role
)
{
if
(
ObjectUtil
.
isNotNull
(
role
.
getRoleId
())
&&
LoginHelper
.
isSuperAdmin
(
role
.
getRoleId
()))
{
throw
new
ServiceException
(
"不允许操作超级管理员角色"
);
}
String
[]
keys
=
new
String
[]{
TenantConstants
.
SUPER_ADMIN_ROLE_KEY
,
TenantConstants
.
TENANT_ADMIN_ROLE_KEY
};
// 新增不允许使用 管理员标识符
if
(
ObjectUtil
.
isNull
(
role
.
getRoleId
())
&&
StringUtils
.
equalsAny
(
role
.
getRoleKey
(),
keys
))
{
throw
new
ServiceException
(
"不允许使用系统内置管理员角色标识符!"
);
}
// 修改不允许修改 管理员标识符
if
(
ObjectUtil
.
isNotNull
(
role
.
getRoleId
()))
{
SysRole
sysRole
=
baseMapper
.
selectById
(
role
.
getRoleId
());
// 如果标识符不相等 判断为修改了管理员标识符
if
(!
StringUtils
.
equals
(
sysRole
.
getRoleKey
(),
role
.
getRoleKey
()))
{
if
(
StringUtils
.
equalsAny
(
sysRole
.
getRoleKey
(),
keys
))
{
throw
new
ServiceException
(
"不允许修改系统内置管理员角色标识符!"
);
}
else
if
(
StringUtils
.
equalsAny
(
role
.
getRoleKey
(),
keys
))
{
throw
new
ServiceException
(
"不允许使用系统内置管理员角色标识符!"
);
}
}
}
}
/**
* 校验角色是否有数据权限
*
* @param roleId 角色id
*/
@Override
public
void
checkRoleDataScope
(
Long
roleId
)
{
if
(
ObjectUtil
.
isNull
(
roleId
))
{
return
;
}
if
(
LoginHelper
.
isSuperAdmin
())
{
return
;
}
List
<
SysRoleVo
>
roles
=
this
.
selectRoleList
(
new
SysRoleDto
(
roleId
));
if
(
CollUtil
.
isEmpty
(
roles
))
{
throw
new
ServiceException
(
"没有权限访问角色数据!"
);
}
}
/**
* 通过角色ID查询角色使用数量
*
* @param roleId 角色ID
* @return 结果
*/
@Override
public
long
countUserRoleByRoleId
(
Long
roleId
)
{
return
userRoleMapper
.
selectCount
(
new
LambdaQueryWrapper
<
SysUserRole
>().
eq
(
SysUserRole:
:
getRoleId
,
roleId
));
}
/**
* 新增保存角色信息
*
* @param bo 角色信息
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
insertRole
(
SysRoleDto
bo
)
{
SysRole
role
=
MapstructUtils
.
convert
(
bo
,
SysRole
.
class
);
if
(
StringUtils
.
isBlank
(
bo
.
getTenantId
())){
role
.
setTenantId
(
LoginHelper
.
getTenantId
());
}
// 新增角色信息
baseMapper
.
insert
(
role
);
bo
.
setRoleId
(
role
.
getRoleId
());
// 新增角色和部门信息(数据权限)
if
(
bo
.
getDeptIds
()
!=
null
&&
bo
.
getDeptIds
().
length
>
0
){
insertRoleDept
(
bo
);
}
return
insertRoleMenu
(
bo
);
}
/**
* 修改保存角色信息
*
* @param bo 角色信息
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
updateRole
(
SysRoleDto
bo
)
{
SysRole
role
=
MapstructUtils
.
convert
(
bo
,
SysRole
.
class
);
if
(
UserConstants
.
ROLE_DISABLE
.
equals
(
role
.
getStatus
())
&&
this
.
countUserRoleByRoleId
(
role
.
getRoleId
())
>
0
)
{
throw
new
ServiceException
(
"角色已分配,不能禁用!"
);
}
// 修改角色信息
baseMapper
.
updateById
(
role
);
if
(
bo
.
getDeptIds
()
!=
null
&&
bo
.
getDeptIds
().
length
>
0
){
// 删除角色与部门关联
roleDeptMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleDept
>().
eq
(
SysRoleDept:
:
getRoleId
,
role
.
getRoleId
()));
// 新增角色和部门信息(数据权限)
insertRoleDept
(
bo
);
}
// 删除角色与菜单关联
roleMenuMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleMenu
>().
eq
(
SysRoleMenu:
:
getRoleId
,
role
.
getRoleId
()));
return
insertRoleMenu
(
bo
);
}
/**
* 修改角色状态
*
* @param roleId 角色ID
* @param status 角色状态
* @return 结果
*/
@Override
public
int
updateRoleStatus
(
Long
roleId
,
String
status
)
{
if
(
UserConstants
.
ROLE_DISABLE
.
equals
(
status
)
&&
this
.
countUserRoleByRoleId
(
roleId
)
>
0
)
{
throw
new
ServiceException
(
"角色已分配,不能禁用!"
);
}
return
baseMapper
.
update
(
null
,
new
LambdaUpdateWrapper
<
SysRole
>()
.
set
(
SysRole:
:
getStatus
,
status
)
.
eq
(
SysRole:
:
getRoleId
,
roleId
));
}
/**
* 修改数据权限信息
*
* @param bo 角色信息
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
authDataScope
(
SysRoleDto
bo
)
{
SysRole
role
=
MapstructUtils
.
convert
(
bo
,
SysRole
.
class
);
// 修改角色信息
baseMapper
.
updateById
(
role
);
// 新增角色和部门信息(数据权限)
return
insertRoleDept
(
bo
);
}
/**
* 新增角色菜单信息
*
* @param role 角色对象
*/
private
int
insertRoleMenu
(
SysRoleDto
role
)
{
int
rows
=
1
;
// 新增用户与角色管理
List
<
SysRoleMenu
>
list
=
new
ArrayList
<
SysRoleMenu
>();
for
(
Long
menuId
:
role
.
getMenuIds
())
{
SysRoleMenu
rm
=
new
SysRoleMenu
();
rm
.
setRoleId
(
role
.
getRoleId
());
rm
.
setMenuId
(
menuId
);
list
.
add
(
rm
);
}
if
(
list
.
size
()
>
0
)
{
rows
=
roleMenuMapper
.
insertBatch
(
list
)
?
list
.
size
()
:
0
;
}
return
rows
;
}
/**
* 新增角色部门信息(数据权限)
*
* @param role 角色对象
*/
private
int
insertRoleDept
(
SysRoleDto
role
)
{
int
rows
=
1
;
// 新增角色与部门(数据权限)管理
List
<
SysRoleDept
>
list
=
new
ArrayList
<>();
for
(
Long
deptId
:
role
.
getDeptIds
())
{
SysRoleDept
rd
=
new
SysRoleDept
();
rd
.
setRoleId
(
role
.
getRoleId
());
rd
.
setDeptId
(
deptId
);
list
.
add
(
rd
);
}
if
(
list
.
size
()
>
0
)
{
rows
=
roleDeptMapper
.
insertBatch
(
list
)
?
list
.
size
()
:
0
;
}
return
rows
;
}
/**
* 通过角色ID删除角色
*
* @param roleId 角色ID
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
deleteRoleById
(
Long
roleId
)
{
// 删除角色与菜单关联
roleMenuMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleMenu
>().
eq
(
SysRoleMenu:
:
getRoleId
,
roleId
));
// 删除角色与部门关联
roleDeptMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleDept
>().
eq
(
SysRoleDept:
:
getRoleId
,
roleId
));
return
baseMapper
.
deleteById
(
roleId
);
}
/**
* 批量删除角色信息
*
* @param roleIds 需要删除的角色ID
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
deleteRoleByIds
(
Long
[]
roleIds
)
{
for
(
Long
roleId
:
roleIds
)
{
SysRole
role
=
baseMapper
.
selectById
(
roleId
);
checkRoleAllowed
(
BeanUtil
.
toBean
(
role
,
SysRoleDto
.
class
));
checkRoleDataScope
(
roleId
);
if
(
countUserRoleByRoleId
(
roleId
)
>
0
)
{
throw
new
ServiceException
(
String
.
format
(
"%1$s已分配,不能删除!"
,
role
.
getRoleName
()));
}
}
List
<
Long
>
ids
=
Arrays
.
asList
(
roleIds
);
// 删除角色与菜单关联
roleMenuMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleMenu
>().
in
(
SysRoleMenu:
:
getRoleId
,
ids
));
// 删除角色与部门关联
roleDeptMapper
.
delete
(
new
LambdaQueryWrapper
<
SysRoleDept
>().
in
(
SysRoleDept:
:
getRoleId
,
ids
));
return
baseMapper
.
deleteByIds
(
ids
);
}
/**
* 取消授权用户角色
*
* @param userRole 用户和角色关联信息
* @return 结果
*/
@Override
public
int
deleteAuthUser
(
SysUserRole
userRole
)
{
int
rows
=
userRoleMapper
.
delete
(
new
LambdaQueryWrapper
<
SysUserRole
>()
.
eq
(
SysUserRole:
:
getRoleId
,
userRole
.
getRoleId
())
.
eq
(
SysUserRole:
:
getUserId
,
userRole
.
getUserId
()));
if
(
rows
>
0
)
{
cleanOnlineUserByRole
(
userRole
.
getRoleId
());
}
return
rows
;
}
/**
* 批量取消授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要取消授权的用户数据ID
* @return 结果
*/
@Override
public
int
deleteAuthUsers
(
Long
roleId
,
Long
[]
userIds
)
{
int
rows
=
userRoleMapper
.
delete
(
new
LambdaQueryWrapper
<
SysUserRole
>()
.
eq
(
SysUserRole:
:
getRoleId
,
roleId
)
.
in
(
SysUserRole:
:
getUserId
,
Arrays
.
asList
(
userIds
)));
if
(
rows
>
0
)
{
cleanOnlineUserByRole
(
roleId
);
}
return
rows
;
}
/**
* 批量选择授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要授权的用户数据ID
* @return 结果
*/
@Override
public
int
insertAuthUsers
(
Long
roleId
,
Long
[]
userIds
)
{
// 新增用户与角色管理
int
rows
=
1
;
List
<
SysUserRole
>
list
=
StreamUtils
.
toList
(
List
.
of
(
userIds
),
userId
->
{
SysUserRole
ur
=
new
SysUserRole
();
ur
.
setUserId
(
userId
);
ur
.
setRoleId
(
roleId
);
return
ur
;
});
if
(
CollUtil
.
isNotEmpty
(
list
))
{
rows
=
userRoleMapper
.
insertBatch
(
list
)
?
list
.
size
()
:
0
;
}
if
(
rows
>
0
)
{
cleanOnlineUserByRole
(
roleId
);
}
return
rows
;
}
@Override
public
void
cleanOnlineUserByRole
(
Long
roleId
)
{
// 如果角色未绑定用户 直接返回
Long
num
=
userRoleMapper
.
selectCount
(
new
LambdaQueryWrapper
<
SysUserRole
>().
eq
(
SysUserRole:
:
getRoleId
,
roleId
));
if
(
num
==
0
)
{
return
;
}
List
<
String
>
keys
=
StpUtil
.
searchTokenValue
(
""
,
0
,
-
1
,
false
);
if
(
CollUtil
.
isEmpty
(
keys
))
{
return
;
}
// 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作
keys
.
parallelStream
().
forEach
(
key
->
{
String
token
=
StringUtils
.
substringAfterLast
(
key
,
":"
);
// 如果已经过期则跳过
if
(
StpUtil
.
stpLogic
.
getTokenActiveTimeoutByToken
(
token
)
<
-
1
)
{
return
;
}
LoginUser
loginUser
=
LoginHelper
.
getLoginUser
(
token
);
if
(
loginUser
.
getRoles
()
!=
null
&&
loginUser
.
getRoles
().
stream
().
anyMatch
(
r
->
r
.
getRoleId
().
equals
(
roleId
)))
{
try
{
StpUtil
.
logoutByTokenValue
(
token
);
}
catch
(
NotLoginException
ignored
)
{
}
}
});
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/java/com/bkty/system/service/impl/SysUserServiceImpl.java
0 → 100644
View file @
e4dbdb03
package
com
.
bkty
.
system
.
service
.
impl
;
import
cn.dev33.satoken.secure.BCrypt
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.convert.Convert
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.baomidou.mybatisplus.core.conditions.Wrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.bkty.system.api.model.LoginUser
;
import
com.bkty.system.domain.dto.EditPasswordDto
;
import
com.bkty.system.domain.dto.SysUserDto
;
import
com.bkty.system.domain.entity.SysDept
;
import
com.bkty.system.domain.entity.SysRole
;
import
com.bkty.system.domain.entity.SysUser
;
import
com.bkty.system.domain.entity.SysUserRole
;
import
com.bkty.system.domain.vo.SysRoleVo
;
import
com.bkty.system.domain.vo.SysUserVo
;
import
com.bkty.system.mapper.SysDeptMapper
;
import
com.bkty.system.mapper.SysRoleMapper
;
import
com.bkty.system.mapper.SysUserMapper
;
import
com.bkty.system.mapper.SysUserRoleMapper
;
import
com.bkty.system.service.ISysUserService
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.dromara.common.core.constant.CacheNames
;
import
org.dromara.common.core.constant.UserConstants
;
import
org.dromara.common.core.exception.ServiceException
;
import
org.dromara.common.core.utils.MapstructUtils
;
import
org.dromara.common.core.utils.SpringUtils
;
import
org.dromara.common.core.utils.StreamUtils
;
import
org.dromara.common.core.utils.StringUtils
;
import
org.dromara.common.mybatis.core.page.PageQuery
;
import
org.dromara.common.mybatis.core.page.TableDataInfo
;
import
org.dromara.common.satoken.utils.LoginHelper
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cache.annotation.CacheEvict
;
import
org.springframework.cache.annotation.Cacheable
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
/**
* 用户 业务层处理
*
* @author Lion Li
*/
@Slf4j
@RequiredArgsConstructor
@Service
public
class
SysUserServiceImpl
implements
ISysUserService
{
private
final
SysUserMapper
baseMapper
;
private
final
SysUserRoleMapper
userRoleMapper
;
private
final
SysDeptMapper
sysDeptMapper
;
private
final
SysRoleMapper
roleMapper
;
//运营平台初始密码
@Value
(
"${xxpt.password:yypt@2025}"
)
private
String
password
;
@Override
public
TableDataInfo
<
SysUserVo
>
selectPageUserList
(
SysUserDto
user
,
PageQuery
pageQuery
)
{
Wrapper
<
SysUser
>
wrapper
=
this
.
buildQueryWrapper
(
user
);
if
(
wrapper
==
null
){
return
TableDataInfo
.
build
();
}
Page
<
SysUserVo
>
page
=
baseMapper
.
selectPageUserList
(
pageQuery
.
build
(),
wrapper
);
List
<
SysDept
>
deptList
=
sysDeptMapper
.
selectList
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
())
?
new
LambdaQueryWrapper
<
SysDept
>().
eq
(
SysDept:
:
getTenantId
,
LoginHelper
.
getTenantId
())
:
null
);
Map
<
Long
,
SysDept
>
deptMap
=
deptList
.
stream
().
collect
(
Collectors
.
toMap
(
SysDept:
:
getDeptId
,
p
->
p
));
List
<
SysRole
>
roleList
=
roleMapper
.
selectList
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
())
?
new
LambdaQueryWrapper
<
SysRole
>().
eq
(
SysRole:
:
getTenantId
,
LoginHelper
.
getTenantId
())
:
null
);
Map
<
Long
,
SysRole
>
roleMap
=
roleList
.
stream
().
collect
(
Collectors
.
toMap
(
SysRole:
:
getRoleId
,
p
->
p
));
List
<
Long
>
roleId
=
roleList
.
stream
().
map
(
SysRole:
:
getRoleId
).
distinct
().
toList
();
List
<
SysUserRole
>
userRoleList
=
userRoleMapper
.
selectList
(
new
LambdaQueryWrapper
<
SysUserRole
>().
in
(
SysUserRole:
:
getRoleId
,
roleId
));
Map
<
Long
,
List
<
SysUserRole
>>
userRoleMap
=
userRoleList
.
stream
().
collect
(
Collectors
.
groupingBy
(
SysUserRole:
:
getUserId
));
page
.
getRecords
().
stream
().
map
(
details
->
{
SysDept
dept
=
deptMap
.
get
(
details
.
getDeptId
());
if
(
dept
!=
null
){
String
[]
ancestors
=
dept
.
getAncestors
().
split
(
","
);
List
<
SysDept
>
deptT
=
new
ArrayList
<>();
for
(
String
id
:
ancestors
){
SysDept
depts
=
deptMap
.
get
(
Long
.
parseLong
(
id
));
if
(
depts
!=
null
){
deptT
.
add
(
depts
);
}
}
details
.
setDeptList
(
deptT
);
}
List
<
SysUserRole
>
userRoles
=
userRoleMap
.
get
(
details
.
getUserId
());
if
(
userRoles
!=
null
){
List
<
Long
>
roleIds
=
userRoles
.
stream
().
map
(
SysUserRole:
:
getRoleId
).
distinct
().
toList
();
List
<
SysRoleVo
>
roles
=
new
ArrayList
<>();
for
(
Long
id
:
roleIds
){
SysRole
role
=
roleMap
.
get
(
id
);
if
(
role
!=
null
){
SysRoleVo
roleVo
=
new
SysRoleVo
();
BeanUtils
.
copyProperties
(
role
,
roleVo
);
roles
.
add
(
roleVo
);
}
}
details
.
setRoles
(
roles
);
}
return
details
;
}).
collect
(
Collectors
.
toList
());
return
TableDataInfo
.
build
(
page
);
}
private
Wrapper
<
SysUser
>
buildQueryWrapper
(
SysUserDto
user
)
{
QueryWrapper
<
SysUser
>
wrapper
=
Wrappers
.
query
();
wrapper
.
eq
(
"u.del_flag"
,
UserConstants
.
USER_NORMAL
)
.
eq
(
ObjectUtil
.
isNotNull
(
user
.
getUserId
()),
"u.user_id"
,
user
.
getUserId
())
.
like
(
StringUtils
.
isNotBlank
(
user
.
getUserName
()),
"u.user_name"
,
user
.
getUserName
())
.
like
(
StringUtils
.
isNotBlank
(
user
.
getNickName
()),
"u.nick_name"
,
user
.
getNickName
())
.
eq
(
StringUtils
.
isNotBlank
(
user
.
getStatus
()),
"u.status"
,
user
.
getStatus
())
.
like
(
StringUtils
.
isNotBlank
(
user
.
getPhonenumber
()),
"u.phonenumber"
,
user
.
getPhonenumber
())
.
between
(
StringUtils
.
isNotBlank
(
user
.
getBeginTime
())
&&
StringUtils
.
isNotBlank
(
user
.
getEndTime
()),
"u.create_time"
,
user
.
getBeginTime
(),
user
.
getEndTime
());
if
(
StringUtils
.
isNotBlank
(
user
.
getExcludeUserIds
()))
{
wrapper
.
notIn
(
"u.user_id"
,
StringUtils
.
splitList
(
user
.
getExcludeUserIds
()));
}
if
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
()))
{
// 查询当前用户有权限的部门ID集合
List
<
Long
>
deptIds
=
sysDeptMapper
.
selectDeptIds
(
LoginHelper
.
getUserId
());
if
(
CollUtil
.
isEmpty
(
deptIds
))
{
return
null
;
}
// 接下来查学生
wrapper
.
in
(
"u.dept_id"
,
deptIds
);
// 查询当前用户所属租户ID
wrapper
.
eq
(
"u.tenant_id"
,
LoginHelper
.
getTenantId
());
}
return
wrapper
;
}
/**
* 根据条件分页查询已分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
@Override
public
TableDataInfo
<
SysUserVo
>
selectAllocatedList
(
SysUserDto
user
,
PageQuery
pageQuery
)
{
QueryWrapper
<
SysUser
>
wrapper
=
Wrappers
.
query
();
wrapper
.
eq
(
"u.del_flag"
,
UserConstants
.
USER_NORMAL
)
.
eq
(
ObjectUtil
.
isNotNull
(
user
.
getRoleId
()),
"r.role_id"
,
user
.
getRoleId
())
.
like
(
StringUtils
.
isNotBlank
(
user
.
getUserName
()),
"u.user_name"
,
user
.
getUserName
())
.
eq
(
StringUtils
.
isNotBlank
(
user
.
getStatus
()),
"u.status"
,
user
.
getStatus
())
.
like
(
StringUtils
.
isNotBlank
(
user
.
getPhonenumber
()),
"u.phonenumber"
,
user
.
getPhonenumber
())
.
eq
(!
LoginHelper
.
isSuperAdmin
(
LoginHelper
.
getUserId
()),
"r.tenant_id"
,
LoginHelper
.
getTenantId
())
.
orderByAsc
(
"u.user_id"
);
Page
<
SysUserVo
>
page
=
baseMapper
.
selectAllocatedList
(
pageQuery
.
build
(),
wrapper
);
return
TableDataInfo
.
build
(
page
);
}
/**
* 通过用户ID查询用户
*
* @param userId 用户ID
* @return 用户对象信息
*/
@Override
public
SysUserVo
selectUserById
(
Long
userId
)
{
SysUserVo
user
=
baseMapper
.
selectVoById
(
userId
);
if
(
ObjectUtil
.
isNull
(
user
))
{
return
user
;
}
return
user
;
}
/**
* 通过用户ID串查询用户
*
* @param userIds 用户ID串
* @param deptId 部门id
* @return 用户列表信息
*/
@Override
public
List
<
SysUserVo
>
selectUserByIds
(
List
<
Long
>
userIds
,
Long
deptId
)
{
return
baseMapper
.
selectUserList
(
new
LambdaQueryWrapper
<
SysUser
>()
.
select
(
SysUser:
:
getUserId
,
SysUser:
:
getUserName
,
SysUser:
:
getNickName
,
SysUser:
:
getEmail
,
SysUser:
:
getPhonenumber
)
.
eq
(
SysUser:
:
getStatus
,
UserConstants
.
USER_NORMAL
)
.
eq
(
ObjectUtil
.
isNotNull
(
deptId
),
SysUser:
:
getDeptId
,
deptId
)
.
in
(
CollUtil
.
isNotEmpty
(
userIds
),
SysUser:
:
getUserId
,
userIds
));
}
/**
* 校验用户名称是否唯一
*
* @param user 用户信息
* @return 结果
*/
@Override
public
boolean
checkUserNameUnique
(
SysUserDto
user
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysUser
>()
.
eq
(
SysUser:
:
getUserName
,
user
.
getUserName
())
.
eq
(
SysUser:
:
getTenantId
,
LoginHelper
.
getTenantId
())
.
ne
(
ObjectUtil
.
isNotNull
(
user
.
getUserId
()),
SysUser:
:
getUserId
,
user
.
getUserId
()));
return
!
exist
;
}
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
*/
@Override
public
boolean
checkPhoneUnique
(
SysUserDto
user
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysUser
>()
.
eq
(
SysUser:
:
getPhonenumber
,
user
.
getPhonenumber
())
.
eq
(
SysUser:
:
getTenantId
,
LoginHelper
.
getTenantId
())
.
ne
(
ObjectUtil
.
isNotNull
(
user
.
getUserId
()),
SysUser:
:
getUserId
,
user
.
getUserId
()));
return
!
exist
;
}
/**
* 校验email是否唯一
*
* @param user 用户信息
*/
@Override
public
boolean
checkEmailUnique
(
SysUserDto
user
)
{
boolean
exist
=
baseMapper
.
exists
(
new
LambdaQueryWrapper
<
SysUser
>()
.
eq
(
SysUser:
:
getEmail
,
user
.
getEmail
())
.
eq
(
SysUser:
:
getTenantId
,
LoginHelper
.
getTenantId
())
.
ne
(
ObjectUtil
.
isNotNull
(
user
.
getUserId
()),
SysUser:
:
getUserId
,
user
.
getUserId
()));
return
!
exist
;
}
/**
* 校验用户是否允许操作
*
* @param userId 用户ID
*/
@Override
public
void
checkUserAllowed
(
Long
userId
)
{
if
(
ObjectUtil
.
isNotNull
(
userId
)
&&
LoginHelper
.
isSuperAdmin
(
userId
))
{
throw
new
ServiceException
(
"不允许操作超级管理员用户"
);
}
}
/**
* 校验用户是否有数据权限
*
* @param userId 用户id
*/
@Override
public
void
checkUserDataScope
(
Long
userId
)
{
if
(
ObjectUtil
.
isNull
(
userId
))
{
return
;
}
if
(
LoginHelper
.
isSuperAdmin
())
{
return
;
}
if
(
baseMapper
.
countUserById
(
userId
)
==
0
)
{
throw
new
ServiceException
(
"没有权限访问用户数据!"
);
}
}
/**
* 新增保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
insertUser
(
SysUserDto
user
)
{
SysUser
sysUser
=
MapstructUtils
.
convert
(
user
,
SysUser
.
class
);
sysUser
.
setPassword
(
BCrypt
.
hashpw
(
password
));
if
(
StringUtils
.
isBlank
(
sysUser
.
getTenantId
())){
sysUser
.
setTenantId
(
LoginHelper
.
getTenantId
());
sysUser
.
setTenantName
(
LoginHelper
.
getTenantName
());
}
// 新增用户信息
int
rows
=
baseMapper
.
insert
(
sysUser
);
user
.
setUserId
(
sysUser
.
getUserId
());
// 新增用户与角色管理
insertUserRole
(
user
,
false
);
return
rows
;
}
/**
* 注册用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
public
boolean
registerUser
(
SysUserDto
user
,
String
tenantId
)
{
user
.
setCreateBy
(
"0"
);
user
.
setUpdateBy
(
"0"
);
SysUser
sysUser
=
MapstructUtils
.
convert
(
user
,
SysUser
.
class
);
return
baseMapper
.
insert
(
sysUser
)
>
0
;
}
/**
* 修改保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@CacheEvict
(
cacheNames
=
CacheNames
.
SYS_NICKNAME
,
key
=
"#user.userId"
)
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
updateUser
(
SysUserDto
user
)
{
// 新增用户与角色管理
insertUserRole
(
user
,
true
);
SysUser
sysUser
=
MapstructUtils
.
convert
(
user
,
SysUser
.
class
);
// 防止错误更新后导致的数据误删除
int
flag
=
baseMapper
.
updateById
(
sysUser
);
if
(
flag
<
1
)
{
throw
new
ServiceException
(
"修改用户"
+
user
.
getUserName
()
+
"信息失败"
);
}
return
flag
;
}
/**
* 新增用户角色信息
*
* @param user 用户对象
* @param clear 清除已存在的关联数据
*/
private
void
insertUserRole
(
SysUserDto
user
,
boolean
clear
)
{
this
.
insertUserRole
(
user
.
getUserId
(),
user
.
getRoleIds
(),
clear
);
}
/**
* 新增用户角色信息
*
* @param userId 用户ID
* @param roleIds 角色组
* @param clear 清除已存在的关联数据
*/
private
void
insertUserRole
(
Long
userId
,
Long
[]
roleIds
,
boolean
clear
)
{
if
(
ArrayUtil
.
isNotEmpty
(
roleIds
))
{
List
<
Long
>
roleList
=
new
ArrayList
<>(
List
.
of
(
roleIds
));
if
(!
LoginHelper
.
isSuperAdmin
(
userId
))
{
roleList
.
remove
(
UserConstants
.
SUPER_ADMIN_ID
);
}
if
(
clear
)
{
// 删除用户与角色关联
userRoleMapper
.
delete
(
new
LambdaQueryWrapper
<
SysUserRole
>().
eq
(
SysUserRole:
:
getUserId
,
userId
));
}
// 新增用户与角色管理
List
<
SysUserRole
>
list
=
StreamUtils
.
toList
(
roleList
,
roleId
->
{
SysUserRole
ur
=
new
SysUserRole
();
ur
.
setUserId
(
userId
);
ur
.
setRoleId
(
roleId
);
return
ur
;
});
userRoleMapper
.
insertBatch
(
list
);
}
}
@Override
public
List
<
Long
>
selectUserIdsByRoleIds
(
List
<
Long
>
roleIds
)
{
List
<
SysUserRole
>
userRoles
=
userRoleMapper
.
selectList
(
new
LambdaQueryWrapper
<
SysUserRole
>().
in
(
SysUserRole:
:
getRoleId
,
roleIds
));
return
StreamUtils
.
toList
(
userRoles
,
SysUserRole:
:
getUserId
);
}
/**
* 通过用户ID查询用户账户
*
* @param userId 用户ID
* @return 用户账户
*/
@Cacheable
(
cacheNames
=
CacheNames
.
SYS_USER_NAME
,
key
=
"#userId"
)
@Override
public
String
selectUserNameById
(
Long
userId
)
{
SysUser
sysUser
=
baseMapper
.
selectOne
(
new
LambdaQueryWrapper
<
SysUser
>()
.
select
(
SysUser:
:
getUserName
).
eq
(
SysUser:
:
getUserId
,
userId
));
return
ObjectUtil
.
isNull
(
sysUser
)
?
null
:
sysUser
.
getUserName
();
}
/**
* 通过用户ID查询用户昵称
*
* @param userId 用户ID
* @return 用户昵称
*/
@Override
@Cacheable
(
cacheNames
=
CacheNames
.
SYS_NICKNAME
,
key
=
"#userId"
)
public
String
selectNicknameById
(
Long
userId
)
{
SysUser
sysUser
=
baseMapper
.
selectOne
(
new
LambdaQueryWrapper
<
SysUser
>()
.
select
(
SysUser:
:
getNickName
).
eq
(
SysUser:
:
getUserId
,
userId
));
return
ObjectUtil
.
isNull
(
sysUser
)
?
null
:
sysUser
.
getNickName
();
}
@Override
public
String
selectNicknameByIds
(
String
userIds
)
{
List
<
String
>
list
=
new
ArrayList
<>();
for
(
Long
id
:
StringUtils
.
splitTo
(
userIds
,
Convert:
:
toLong
))
{
String
nickname
=
SpringUtils
.
getAopProxy
(
this
).
selectNicknameById
(
id
);
if
(
StringUtils
.
isNotBlank
(
nickname
))
{
list
.
add
(
nickname
);
}
}
return
String
.
join
(
StringUtils
.
SEPARATOR
,
list
);
}
/**
* 通过用户ID查询用户手机号
*
* @param userId 用户id
* @return 用户手机号
*/
@Override
public
String
selectPhonenumberById
(
Long
userId
)
{
SysUser
sysUser
=
baseMapper
.
selectOne
(
new
LambdaQueryWrapper
<
SysUser
>()
.
select
(
SysUser:
:
getPhonenumber
).
eq
(
SysUser:
:
getUserId
,
userId
));
return
ObjectUtil
.
isNull
(
sysUser
)
?
null
:
sysUser
.
getPhonenumber
();
}
/**
* 通过用户ID查询用户邮箱
*
* @param userId 用户id
* @return 用户邮箱
*/
@Override
public
String
selectEmailById
(
Long
userId
)
{
SysUser
sysUser
=
baseMapper
.
selectOne
(
new
LambdaQueryWrapper
<
SysUser
>()
.
select
(
SysUser:
:
getEmail
).
eq
(
SysUser:
:
getUserId
,
userId
));
return
ObjectUtil
.
isNull
(
sysUser
)
?
null
:
sysUser
.
getEmail
();
}
/**
* 批量删除用户信息
*
* @param userIds 需要删除的用户ID
* @return 结果
*/
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
int
deleteUserByIds
(
Long
[]
userIds
)
{
for
(
Long
userId
:
userIds
)
{
checkUserAllowed
(
userId
);
checkUserDataScope
(
userId
);
}
List
<
Long
>
ids
=
List
.
of
(
userIds
);
// 删除用户与角色关联
userRoleMapper
.
delete
(
new
LambdaQueryWrapper
<
SysUserRole
>().
in
(
SysUserRole:
:
getUserId
,
ids
));
// 删除用户与部门关联
userRoleMapper
.
delete
(
new
LambdaQueryWrapper
<
SysUserRole
>().
in
(
SysUserRole:
:
getUserId
,
ids
));
// 防止更新失败导致的数据删除
int
flag
=
baseMapper
.
deleteByIds
(
ids
);
if
(
flag
<
1
)
{
throw
new
ServiceException
(
"删除用户失败!"
);
}
return
flag
;
}
@Override
public
List
<
SysUser
>
queryUserPullDown
(){
LoginUser
loginUser
=
LoginHelper
.
getLoginUser
();
LambdaQueryWrapper
<
SysUser
>
wrapper
=
Wrappers
.
lambdaQuery
();
if
(!
LoginHelper
.
isSuperAdmin
(
loginUser
.
getUserId
()))
{
// 查询当前用户有权限的部门ID集合
List
<
Long
>
deptIds
=
sysDeptMapper
.
selectDeptIds
(
loginUser
.
getUserId
());
if
(
CollUtil
.
isEmpty
(
deptIds
))
{
return
null
;
}
// 接下来查学生
wrapper
.
in
(
SysUser:
:
getDeptId
,
deptIds
);
wrapper
.
in
(
SysUser:
:
getTenantId
,
loginUser
.
getTenantId
());
}
List
<
SysUser
>
list
=
baseMapper
.
selectList
(
wrapper
);
return
list
;
}
/**
* 重置用户密码
*
* @param userId 用户ID
* @return 结果
*/
@Override
public
int
resetUserPwd
(
Long
userId
)
{
return
baseMapper
.
update
(
null
,
new
LambdaUpdateWrapper
<
SysUser
>()
.
set
(
SysUser:
:
getPassword
,
BCrypt
.
hashpw
(
password
))
.
eq
(
SysUser:
:
getUserId
,
userId
));
}
/**
* 修改用户密码
* @param user 用户信息
* @return 结果
*/
@Override
public
int
editPassword
(
EditPasswordDto
user
)
{
SysUser
sysUser
=
new
SysUser
();
sysUser
.
setUserId
(
user
.
getUserId
());
sysUser
.
setPassword
(
BCrypt
.
hashpw
(
user
.
getNewPassword
()));
return
baseMapper
.
updateById
(
sysUser
);
}
}
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysDeptMapper.xml
0 → 100644
View file @
e4dbdb03
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.bkty.system.mapper.SysDeptMapper"
>
<resultMap
type=
"com.bkty.system.domain.entity.SysDept"
id=
"SysMenuResult"
>
</resultMap>
<select
id=
"selectDeptListByRoleId"
resultType=
"Long"
>
select m.dept_id
from sys_dept m
left join sys_role_dept rm on m.dept_id = rm.dept_id
where rm.role_id = #{roleId} and m.status = #{status}
<if
test=
"menuCheckStrictly"
>
and m.dept_id not in (select m.parent_id from sys_dept m inner join sys_role_dept rm on m.dept_id =
rm.dept_id and rm.role_id = #{roleId} and m.status = #{status})
</if>
order by m.parent_id, m.order_num
</select>
<select
id=
"selectDeptIds"
resultType=
"Long"
>
select
rm.dept_id
from
sys_user_role m
left join sys_role_dept rm on m.role_id = rm.role_id
where rm.dept_id is not null and m.user_id = #{userId}
group by rm.dept_id
</select>
</mapper>
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysMenuMapper.xml
0 → 100644
View file @
e4dbdb03
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.bkty.system.mapper.SysMenuMapper"
>
<resultMap
type=
"com.bkty.system.domain.entity.SysMenu"
id=
"SysMenuResult"
>
</resultMap>
<select
id=
"selectMenuListByUserId"
resultMap=
"SysMenuResult"
>
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query_param, m.visible, m.status,
m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectMenuTreeByUserId"
parameterType=
"Long"
resultMap=
"SysMenuResult"
>
select distinct m.menu_id,
m.parent_id,
m.menu_name,
m.path,
m.component,
m.query_param,
m.visible,
m.status,
m.perms,
m.is_frame,
m.is_cache,
m.menu_type,
m.icon,
m.order_num,
m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
left join sys_role r on rm.role_id = r.role_id and r.status = '0'
where m.menu_type in ('M', 'C')
and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
order by m.parent_id, m.order_num
</select>
<select
id=
"selectMenuListByRoleId"
resultType=
"Long"
>
select m.menu_id
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
where rm.role_id = #{roleId}
<if
test=
"menuCheckStrictly"
>
and m.menu_id not in (select m.parent_id from sys_menu m inner join sys_role_menu rm on m.menu_id =
rm.menu_id and rm.role_id = #{roleId})
</if>
order by m.parent_id, m.order_num
</select>
<select
id=
"selectMenuPermsByUserId"
parameterType=
"Long"
resultType=
"String"
>
select distinct m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
left join sys_role r on r.role_id = rm.role_id and r.status = '0'
where r.role_id in (select role_id from sys_user_role where user_id = #{userId})
</select>
<select
id=
"selectMenuPermsByRoleId"
parameterType=
"Long"
resultType=
"String"
>
select distinct m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
where m.status = '0' and rm.role_id = #{roleId}
</select>
</mapper>
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysRoleMapper.xml
0 → 100644
View file @
e4dbdb03
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.bkty.system.mapper.SysRoleMapper"
>
<resultMap
type=
"com.bkty.system.domain.vo.SysRoleVo"
id=
"SysRoleResult"
>
</resultMap>
<sql
id=
"selectRoleVo"
>
select distinct r.role_id,
r.role_name,
r.role_key,
r.role_sort,
r.data_scope,
r.menu_check_strictly,
r.dept_check_strictly,
r.status,
r.del_flag,
r.create_time,
r.remark
from sys_role r
left join sys_user_role sur on sur.role_id = r.role_id
left join sys_user u on u.user_id = sur.user_id
left join sys_dept d on u.dept_id = d.dept_id
</sql>
<select
id=
"selectPageRoleList"
resultMap=
"SysRoleResult"
>
<include
refid=
"selectRoleVo"
/>
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectRoleList"
resultMap=
"SysRoleResult"
>
<include
refid=
"selectRoleVo"
/>
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectRolePermissionByUserId"
parameterType=
"Long"
resultMap=
"SysRoleResult"
>
<include
refid=
"selectRoleVo"
/>
WHERE r.del_flag = '0' and sur.user_id = #{userId}
</select>
<select
id=
"selectRolesByUserId"
parameterType=
"Long"
resultMap=
"SysRoleResult"
>
select r.role_id,
r.role_name,
r.role_key,
r.role_sort,
r.data_scope,
r.status
from sys_role r
WHERE r.del_flag = '0' and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
</select>
<select
id=
"selectRoleById"
resultMap=
"SysRoleResult"
>
<include
refid=
"selectRoleVo"
/>
WHERE r.del_flag = '0' and r.role_id = #{roleId}
</select>
</mapper>
employmentBusiness-pc-modules/employmentBusiness-pc-system/src/main/resources/mapper/system/SysUserMapper.xml
0 → 100644
View file @
e4dbdb03
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.bkty.system.mapper.SysUserMapper"
>
<resultMap
type=
"com.bkty.system.domain.vo.SysUserVo"
id=
"SysUserResult"
>
<id
property=
"userId"
column=
"user_id"
/>
</resultMap>
<resultMap
type=
"com.bkty.system.domain.vo.SysUserExportVo"
id=
"SysUserExportResult"
>
<id
property=
"userId"
column=
"user_id"
/>
</resultMap>
<select
id=
"selectPageUserList"
resultMap=
"SysUserResult"
>
select
<if
test=
"ew.getSqlSelect != null"
>
${ew.getSqlSelect}
</if>
<if
test=
"ew.getSqlSelect == null"
>
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
</if>
from sys_user u
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectUserList"
resultMap=
"SysUserResult"
>
select
<if
test=
"ew.getSqlSelect != null"
>
${ew.getSqlSelect}
</if>
<if
test=
"ew.getSqlSelect == null"
>
u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
</if>
from sys_user u
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectUserExportList"
resultMap=
"SysUserExportResult"
>
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
d.dept_name, d.leader, u1.user_name as leaderName
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user u1 on u1.user_id = d.leader
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectAllocatedList"
resultMap=
"SysUserResult"
>
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
left join sys_role r on r.role_id = sur.role_id
${ew.getCustomSqlSegment}
</select>
<select
id=
"selectUnallocatedList"
resultMap=
"SysUserResult"
>
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user_role sur on u.user_id = sur.user_id
left join sys_role r on r.role_id = sur.role_id
${ew.getCustomSqlSegment}
</select>
<select
id=
"countUserById"
resultType=
"Long"
>
select count(*) from sys_user where del_flag = '0' and user_id = #{userId}
</select>
</mapper>
employmentBusiness-pc-nacos/src/main/resources/static/console-ui/public/js/vs/language/typescript/lib/typescriptServices.js
0 → 100644
View file @
e4dbdb03
This diff could not be displayed because it is too large.
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