From 379493f522eac39656ea43097826a1ad6cca720b Mon Sep 17 00:00:00 2001 From: xgblack Date: Tue, 6 Feb 2024 16:25:32 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9C=A8feat(security):=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20security=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=94=BE?= =?UTF-8?q?=E5=88=B0api=E7=BB=84=E4=BB=B6=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 10 +++ .../framework/security/dto}/LoginUser.java | 2 +- .../security}/utils/SecurityUtils.java | 63 +-------------- .../core/CoolOAuth2TokenCustomizer.java | 2 +- .../CoolOpaqueTokenIntrospector.java | 2 +- .../core/constant/OAuth2Constant.java | 42 ---------- .../CoolAppUserDetailsServiceImpl.java | 1 + .../core/service/CoolUserDetailsService.java | 1 + .../service/CoolUserDetailsServiceImpl.java | 1 + .../web/core/utils/WebFrameworkUtils.java | 78 +------------------ 10 files changed, 19 insertions(+), 183 deletions(-) rename cool-framework/{cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service => cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/dto}/LoginUser.java (97%) rename cool-framework/{cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core => cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security}/utils/SecurityUtils.java (48%) delete mode 100644 cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/constant/OAuth2Constant.java diff --git a/cool-framework/cool-spring-boot-starter-security-api/pom.xml b/cool-framework/cool-spring-boot-starter-security-api/pom.xml index daab362..bf87ede 100644 --- a/cool-framework/cool-spring-boot-starter-security-api/pom.xml +++ b/cool-framework/cool-spring-boot-starter-security-api/pom.xml @@ -28,6 +28,16 @@ org.springframework.security spring-security-crypto + + org.springframework.security + spring-security-core + provided + + + org.springframework.security + spring-security-oauth2-core + provided + org.slf4j diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/LoginUser.java b/cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/dto/LoginUser.java similarity index 97% rename from cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/LoginUser.java rename to cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/dto/LoginUser.java index 3caf94c..f764943 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/LoginUser.java +++ b/cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/dto/LoginUser.java @@ -1,4 +1,4 @@ -package com.xgblack.cool.framework.security.core.service; +package com.xgblack.cool.framework.security.dto; import lombok.Getter; import lombok.ToString; diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/utils/SecurityUtils.java b/cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/utils/SecurityUtils.java similarity index 48% rename from cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/utils/SecurityUtils.java rename to cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/utils/SecurityUtils.java index ffdc0ea..1115a97 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/utils/SecurityUtils.java +++ b/cool-framework/cool-spring-boot-starter-security-api/src/main/java/com/xgblack/cool/framework/security/utils/SecurityUtils.java @@ -1,23 +1,17 @@ -package com.xgblack.cool.framework.security.core.utils; +package com.xgblack.cool.framework.security.utils; import com.xgblack.cool.framework.common.constants.SecurityConstants; -import com.xgblack.cool.framework.security.core.service.LoginUser; -import com.xgblack.cool.framework.web.core.utils.WebFrameworkUtils; -import jakarta.servlet.http.HttpServletRequest; +import com.xgblack.cool.framework.security.dto.LoginUser; import lombok.experimental.UtilityClass; import org.dromara.hutool.core.text.StrUtil; import org.springframework.lang.Nullable; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; /** @@ -26,34 +20,6 @@ import java.util.List; */ @UtilityClass public class SecurityUtils { - /** - * HEADER 认证头 value 的前缀 - */ - public static final String AUTHORIZATION_BEARER = "Bearer"; - - - /** - * 从请求中,获得认证 Token - * - * @param request 请求 - * @param headerName 认证 Token 对应的 Header 名字 - * @param parameterName 认证 Token 对应的 Parameter 名字 - * @return 认证 Token - */ - public static String obtainAuthorization(HttpServletRequest request, - String headerName, String parameterName) { - // 1. 获得 Token。优先级:Header > Parameter - String token = request.getHeader(headerName); - if (StrUtil.isEmpty(token)) { - token = request.getParameter(parameterName); - } - if (!StringUtils.hasText(token)) { - return null; - } - // 2. 去除 Token 中带的 Bearer - int index = token.indexOf(AUTHORIZATION_BEARER + " "); - return index >= 0 ? token.substring(index + 7).trim() : token; - } /** * 获得当前认证信息,Authentication @@ -120,29 +86,4 @@ public class SecurityUtils { return roleIds; } - - - - /** - * 设置当前用户 - * - * @param loginUser 登录用户 - * @param request 请求 - */ - public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { - // 创建 Authentication,并设置到上下文 - Authentication authentication = buildAuthentication(loginUser, request); - SecurityContextHolder.getContext().setAuthentication(authentication); - - // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; - // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 - WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); - } - - private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { - // 创建 UsernamePasswordAuthenticationToken 对象 - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, Collections.emptyList()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - return authenticationToken; - } } diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/authentication/support/core/CoolOAuth2TokenCustomizer.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/authentication/support/core/CoolOAuth2TokenCustomizer.java index 992bbdc..5827324 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/authentication/support/core/CoolOAuth2TokenCustomizer.java +++ b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/authentication/support/core/CoolOAuth2TokenCustomizer.java @@ -1,7 +1,7 @@ package com.xgblack.cool.framework.security.core.authentication.support.core; import com.xgblack.cool.framework.common.constants.SecurityConstants; -import com.xgblack.cool.framework.security.core.service.LoginUser; +import com.xgblack.cool.framework.security.dto.LoginUser; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsContext; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsSet; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer; diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/component/CoolOpaqueTokenIntrospector.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/component/CoolOpaqueTokenIntrospector.java index 866c2f0..59e4aca 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/component/CoolOpaqueTokenIntrospector.java +++ b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/component/CoolOpaqueTokenIntrospector.java @@ -3,7 +3,7 @@ package com.xgblack.cool.framework.security.core.component; import org.dromara.hutool.extra.spring.SpringUtil; import com.xgblack.cool.framework.common.constants.SecurityConstants; import com.xgblack.cool.framework.security.core.service.CoolUserDetailsService; -import com.xgblack.cool.framework.security.core.service.LoginUser; +import com.xgblack.cool.framework.security.dto.LoginUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.Ordered; diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/constant/OAuth2Constant.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/constant/OAuth2Constant.java deleted file mode 100644 index e54fd25..0000000 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/constant/OAuth2Constant.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.xgblack.cool.framework.security.core.constant; - -/** - * @author xg black - */ -@Deprecated -public class OAuth2Constant { - - /** - * 密码模式(自定义) - */ - public static final String GRANT_TYPE_PASSWORD = "authorization_password"; - - /** - * 短信验证码模式(自定义) - */ - public static final String GRANT_TYPE_MOBILE = "authorization_mobile"; - - /** - * 短信验证码 - */ - public static final String SMS_CODE = "sms_code"; - - /** - * 短信验证码默认值 - */ - public static final String SMS_CODE_VALUE = "8888"; - - /** - * 登录地址 - */ - public static final String LOGIN_URL = "/login"; - - - /** - * 构造方法私有化 - */ - private OAuth2Constant(){ - - } - -} diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolAppUserDetailsServiceImpl.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolAppUserDetailsServiceImpl.java index 20b7b8d..b449e5b 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolAppUserDetailsServiceImpl.java +++ b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolAppUserDetailsServiceImpl.java @@ -2,6 +2,7 @@ package com.xgblack.cool.framework.security.core.service; import com.xgblack.cool.framework.common.constants.CacheConstants; import com.xgblack.cool.framework.common.constants.SecurityConstants; +import com.xgblack.cool.framework.security.dto.LoginUser; import com.xgblack.cool.framework.security.dto.UserInfo; import com.xgblack.cool.framework.security.service.RemoteUserService; import lombok.RequiredArgsConstructor; diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsService.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsService.java index d60ab13..1b3125a 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsService.java +++ b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsService.java @@ -1,6 +1,7 @@ package com.xgblack.cool.framework.security.core.service; import com.xgblack.cool.framework.common.constants.SecurityConstants; +import com.xgblack.cool.framework.security.dto.LoginUser; import com.xgblack.cool.framework.security.dto.SysUser; import com.xgblack.cool.framework.security.dto.UserInfo; import org.dromara.hutool.core.array.ArrayUtil; diff --git a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsServiceImpl.java b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsServiceImpl.java index b1a0165..921f99c 100644 --- a/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsServiceImpl.java +++ b/cool-framework/cool-spring-boot-starter-security/src/main/java/com/xgblack/cool/framework/security/core/service/CoolUserDetailsServiceImpl.java @@ -1,6 +1,7 @@ package com.xgblack.cool.framework.security.core.service; import com.xgblack.cool.framework.common.constants.CacheConstants; +import com.xgblack.cool.framework.security.dto.LoginUser; import com.xgblack.cool.framework.security.dto.UserInfo; import com.xgblack.cool.framework.security.service.RemoteUserService; import jakarta.annotation.Resource; diff --git a/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/web/core/utils/WebFrameworkUtils.java b/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/web/core/utils/WebFrameworkUtils.java index bb44763..0db9443 100644 --- a/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/web/core/utils/WebFrameworkUtils.java +++ b/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/web/core/utils/WebFrameworkUtils.java @@ -1,6 +1,5 @@ package com.xgblack.cool.framework.web.core.utils; -import jakarta.servlet.ServletRequest; import jakarta.servlet.http.HttpServletRequest; import org.dromara.hutool.core.math.NumberUtil; import org.springframework.boot.autoconfigure.web.WebProperties; @@ -10,14 +9,11 @@ import org.springframework.web.context.request.ServletRequestAttributes; /** * 专属于 web 包的工具类 + * FIXME: 考虑是否删除 * @author xg black */ public class WebFrameworkUtils { - private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id"; - private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type"; - - private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result"; public static final String HEADER_TENANT_ID = "tenant-id"; @@ -39,78 +35,6 @@ public class WebFrameworkUtils { return NumberUtil.isNumber(tenantId) ? Long.valueOf(tenantId) : null; } - public static void setLoginUserId(ServletRequest request, Long userId) { - request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); - } - - /** - * 设置用户类型 - * - * @param request 请求 - * @param userType 用户类型 - */ - /*public static void setLoginUserType(ServletRequest request, Integer userType) { - request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType); - }*/ - - /** - * 获得当前用户的编号,从请求中 - * 注意:该方法仅限于 framework 框架使用!!! - * - * @param request 请求 - * @return 用户编号 - */ - public static Long getLoginUserId(HttpServletRequest request) { - if (request == null) { - return null; - } - return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); - } - - /** - * 获得当前用户的类型 - * 注意:该方法仅限于 web 相关的 framework 组件使用!!! - * - * @param request 请求 - * @return 用户编号 - */ - public static Integer getLoginUserType(HttpServletRequest request) { - if (request == null) { - return null; - } - // 1. 优先,从 Attribute 中获取 - Integer userType = (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE); - if (userType != null) { - return userType; - } - // 2. 其次,基于 URL 前缀的约定 - //TODO: xgblack - /*if (request.getServletPath().startsWith(properties.getAdminApi().getPrefix())) { - return UserTypeEnum.ADMIN.getValue(); - } - if (request.getServletPath().startsWith(properties.getAppApi().getPrefix())) { - return UserTypeEnum.MEMBER.getValue(); - }*/ - return null; - } - - public static Integer getLoginUserType() { - HttpServletRequest request = getRequest(); - return getLoginUserType(request); - } - - public static Long getLoginUserId() { - HttpServletRequest request = getRequest(); - return getLoginUserId(request); - } - - /*public static void setCommonResult(ServletRequest request, CommonResult result) { - request.setAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT, result); - }*/ - - /*public static CommonResult getCommonResult(ServletRequest request) { - return (CommonResult) request.getAttribute(REQUEST_ATTRIBUTE_COMMON_RESULT); - }*/ public static HttpServletRequest getRequest() { RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); -- Gitee From aca330e5f4903461a9282db40261e1e6ab8a968a Mon Sep 17 00:00:00 2001 From: xgblack Date: Tue, 6 Feb 2024 16:25:55 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E2=9C=A8feat(user):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=20=E7=94=A8=E6=88=B7=E4=B8=AD=E5=BF=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/web/UserProfileController.java | 15 ++++++-- .../executor/user/UserProfileEditCmdExe.java | 6 ++-- .../user/UserProfileEditPasswordCmdExe.java | 36 +++++++++++++++++++ .../system/service/UserServiceImpl.java | 9 ++++- .../cool/module/system/api/UserServiceI.java | 4 ++- .../system/dto/user/UserProfileEditCmd.java | 2 +- .../system/domain/gateway/UserGateway.java | 2 ++ .../cool/module/system/domain/user/User.java | 2 +- .../system/gateway/UserGatewayImpl.java | 12 +++++++ 9 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditPasswordCmdExe.java diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserProfileController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserProfileController.java index 3547fa3..16bf089 100644 --- a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserProfileController.java +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserProfileController.java @@ -1,11 +1,15 @@ package com.xgblack.cool.module.system.web; +import com.xgblack.cool.framework.common.utils.response.CoolThrowable; +import com.xgblack.cool.framework.security.utils.SecurityUtils; import com.xgblack.cool.module.system.api.UserServiceI; import com.xgblack.cool.module.system.dto.user.UserProfileEditCmd; import com.xgblack.cool.module.system.dto.user.UserProfileEditPasswordCmd; +import com.xgblack.cool.module.system.dto.user.clientobject.UserCO; import com.xgblack.cool.module.system.dto.user.clientobject.UserProfileDTO; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.dromara.hutool.core.lang.Assert; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -30,6 +34,7 @@ public class UserProfileController { */ @GetMapping public UserProfileDTO info() { + UserCO userCO = userService.getDetail(getLoginUserId()); /*AdminUserDO user = userService.getUser(id); // 拼接数据 DeptDO dept = deptService.getDept(user.getDeptId()); @@ -46,7 +51,7 @@ public class UserProfileController { @PutMapping //@Operation(summary = "修改用户个人信息") public void updateUserProfile(@Valid @RequestBody UserProfileEditCmd cmd) { - userService.editUserProfile(cmd); + userService.editUserProfile(getLoginUserId(), cmd); } /** @@ -56,7 +61,7 @@ public class UserProfileController { @PutMapping("/update-password") //@Operation(summary = "修改用户个人密码") public void updateUserProfilePassword(@Valid @RequestBody UserProfileEditPasswordCmd cmd) { - //userService.updateUserPassword(getLoginUserId(), reqVO); + userService.editUserPassword(getLoginUserId(), cmd.getOldPassword(), cmd.getNewPassword()); } /** @@ -75,4 +80,10 @@ public class UserProfileController { return null; } + private Long getLoginUserId() { + Long loginUserId = SecurityUtils.getLoginUserId(); + CoolThrowable.wrapAssert(() -> Assert.notNull(loginUserId, "未登录用户不能修改个人信息")); + return loginUserId; + } + } diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditCmdExe.java index 09a97b9..55e58a9 100644 --- a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditCmdExe.java +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditCmdExe.java @@ -1,7 +1,7 @@ package com.xgblack.cool.module.system.executor.user; import com.xgblack.cool.module.system.domain.gateway.UserGateway; -import com.xgblack.cool.module.system.dto.user.UserEditPasswordCmd; +import com.xgblack.cool.module.system.dto.user.UserProfileEditCmd; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -18,8 +18,8 @@ public class UserProfileEditCmdExe { private final UserGateway gateway; - public void execute(UserEditPasswordCmd cmd) { - gateway.editUserProfile(cmd.getId(), cmd); + public void execute(Long id, UserProfileEditCmd cmd) { + gateway.updateUserProfile(id, cmd); } } diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditPasswordCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditPasswordCmdExe.java new file mode 100644 index 0000000..c126520 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserProfileEditPasswordCmdExe.java @@ -0,0 +1,36 @@ +package com.xgblack.cool.module.system.executor.user; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import com.xgblack.cool.framework.common.utils.response.CoolThrowable; +import com.xgblack.cool.framework.security.utils.PasswdUtils; +import com.xgblack.cool.module.system.domain.gateway.UserGateway; +import com.xgblack.cool.module.system.domain.user.User; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.lang.Assert; +import org.springframework.stereotype.Component; + +/** + * @author xg black + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserProfileEditPasswordCmdExe extends Command { + + private final UserGateway gateway; + + + public void execute(Long id, String oldPassword, String newPassword) { + User user = gateway.getById(id); + CoolThrowable.wrapAssert(() -> Assert.notNull(user, "用户不存在")); + + String password = PasswdUtils.decode(oldPassword); + CoolThrowable.wrapAssert(() -> Assert.isTrue(PasswdUtils.matches(password, user.getPassword()), "密码错误")); + //FIXME: 是否增加密码错误次数校验 + + gateway.updatePassword(id, PasswdUtils.decodeAndEncryptPassword(newPassword)); + + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java index 592db49..e4d3594 100644 --- a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java @@ -27,6 +27,8 @@ public class UserServiceImpl implements UserServiceI { private final UserPageQryExe userPageQryExe; private final UserEditLockedCmdExe userEditLockedCmdExe; private final UserEditPasswordCmdExe userEditPasswordCmdExe; + private final UserProfileEditCmdExe userProfileEditCmdExe; + private final UserProfileEditPasswordCmdExe userProfileEditPasswordCmdExe; @Override public void save(UserAddCmd cmd) { @@ -64,8 +66,13 @@ public class UserServiceImpl implements UserServiceI { } @Override - public void editUserProfile(UserProfileEditCmd cmd) { + public void editUserProfile(Long id, UserProfileEditCmd cmd) { + userProfileEditCmdExe.execute(id, cmd); + } + @Override + public void editUserPassword(Long loginUserId, String oldPassword, String newPassword) { + userProfileEditPasswordCmdExe.execute(loginUserId, oldPassword, newPassword); } } diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java index 7e8a1c1..690c99f 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java @@ -24,5 +24,7 @@ public interface UserServiceI { void editPassword(UserEditPasswordCmd cmd); - void editUserProfile(UserProfileEditCmd cmd); + void editUserProfile(Long id, UserProfileEditCmd cmd); + + void editUserPassword(Long loginUserId, String oldPassword, String newPassword); } diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/user/UserProfileEditCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/user/UserProfileEditCmd.java index eb83541..332ba7c 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/user/UserProfileEditCmd.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/user/UserProfileEditCmd.java @@ -37,7 +37,7 @@ public class UserProfileEditCmd extends Command { * 手机号码 */ @Length(min = 11, max = 11, message = "手机号长度必须 11 位") - private String mobile; + private String phone; /** * 用户性别 diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/UserGateway.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/UserGateway.java index e92f17c..f23d405 100644 --- a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/UserGateway.java +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/UserGateway.java @@ -4,6 +4,7 @@ import com.xgblack.cool.framework.common.pojo.dto.PageResult; import com.xgblack.cool.module.system.domain.user.User; import com.xgblack.cool.module.system.dto.user.UserEditLockedCmd; import com.xgblack.cool.module.system.dto.user.UserPageQry; +import com.xgblack.cool.module.system.dto.user.UserProfileEditCmd; /** * @author xg black @@ -25,4 +26,5 @@ public interface UserGateway { void updatePassword(Long id, String password); + void updateUserProfile(Long id, UserProfileEditCmd cmd); } diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/user/User.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/user/User.java index 54c85aa..bb5e472 100644 --- a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/user/User.java +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/user/User.java @@ -29,7 +29,7 @@ public class User { /** * 加密后的密码 */ - //private String password; + private String password; /** * 用户昵称 diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java index e307e09..83d33ac 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java @@ -11,6 +11,7 @@ import com.xgblack.cool.module.system.domain.gateway.UserGateway; import com.xgblack.cool.module.system.domain.user.User; import com.xgblack.cool.module.system.dto.user.UserEditLockedCmd; import com.xgblack.cool.module.system.dto.user.UserPageQry; +import com.xgblack.cool.module.system.dto.user.UserProfileEditCmd; import com.xgblack.cool.module.system.gateway.database.mapper.UserMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -103,4 +104,15 @@ public class UserGatewayImpl implements UserGateway, RemoteUserService { .where(USER.ID.eq(id)) .update(); } + + @Override + public void updateUserProfile(Long id, UserProfileEditCmd cmd) { + UpdateChain.of(userMapper) + .set(USER.NICKNAME, cmd.getNickname(), StrUtil.isNotBlank(cmd.getNickname())) + .set(USER.EMAIL, cmd.getEmail(), StrUtil.isNotBlank(cmd.getEmail())) + .set(USER.PHONE, cmd.getPhone(), StrUtil.isNotBlank(cmd.getPhone())) + .set(USER.SEX, cmd.getSex(), cmd.getSex() != null) + .where(USER.ID.eq(id)) + .update(); + } } -- Gitee From d8e708bb15a6b0f86b1dcbf2ce51dd0c71eb3d90 Mon Sep 17 00:00:00 2001 From: xgblack Date: Tue, 6 Feb 2024 18:01:50 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=F0=9F=9A=A7(role):=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/system/web/RoleController.java | 111 ++++++++++++++++++ .../system/service/RoleServiceImpl.java | 19 +++ .../cool/module/system/api/RoleServiceI.java | 11 ++ .../system/common/enums/base/SexEnum.java | 27 +++++ .../enums/permission/DataScopeEnum.java | 46 ++++++++ .../common/enums/permission/MenuTypeEnum.java | 25 ++++ .../common/enums/permission/RoleCodeEnum.java | 33 ++++++ .../common/enums/permission/RoleTypeEnum.java | 26 ++++ .../system/dto/permission/RoleAddCmd.java | 47 ++++++++ .../system/dto/permission/RoleEditCmd.java | 52 ++++++++ .../dto/permission/RoleEditStatusCmd.java | 29 +++++ .../system/dto/permission/RolePageQry.java | 33 ++++++ .../dto/permission/clientobject/RoleCO.java | 72 ++++++++++++ .../module/system/domain/permission/Role.java | 71 +++++++++++ .../system/convertor/RoleConvertor.java | 18 +++ .../gateway/database/dataobject/RoleDO.java | 2 + 16 files changed, 622 insertions(+) create mode 100644 cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java create mode 100644 cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/base/SexEnum.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/DataScopeEnum.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/MenuTypeEnum.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleCodeEnum.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleTypeEnum.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleAddCmd.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditCmd.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditStatusCmd.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java create mode 100644 cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/RoleCO.java create mode 100644 cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Role.java create mode 100644 cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java new file mode 100644 index 0000000..715fcb4 --- /dev/null +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java @@ -0,0 +1,111 @@ +package com.xgblack.cool.module.system.web; + +import com.xgblack.cool.framework.common.pojo.dto.PageResult; +import com.xgblack.cool.module.system.api.RoleServiceI; +import com.xgblack.cool.module.system.dto.permission.RoleAddCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditStatusCmd; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 管理后台 - 角色 + * @author xg black + */ + +@Validated +@RestController +@RequestMapping("/system/role") +@RequiredArgsConstructor +public class RoleController { + + private final RoleServiceI roleService; + + /** + * 创建角色 + * @param cmd + * @return + */ + @PostMapping + //@PreAuthorize("@ss.hasPermission('system:role:create')") + public void add(@Valid @RequestBody RoleAddCmd cmd) { + + } + + /** + * 修改角色 + * @param cmd + */ + @PutMapping("/update") + //@PreAuthorize("@ss.hasPermission('system:role:update')") + public void edit(@Valid @RequestBody RoleEditCmd cmd) { + + } + + /** + * 修改角色状态 + * @param cmd + */ + @PutMapping("/update-status") + //@PreAuthorize("@ss.hasPermission('system:role:update')") + public void editStatus(@Valid @RequestBody RoleEditStatusCmd cmd) { + + } + + /** + * 删除角色 + * @param id + */ + @DeleteMapping("/delete") + //@PreAuthorize("@ss.hasPermission('system:role:delete')") + public void remove(@RequestParam("id") Long id) { + + } + + /** + * 获得角色信息 + * @param id + * @return + */ + @GetMapping("/get") + //@PreAuthorize("@ss.hasPermission('system:role:query')") + public RoleCO detail(@RequestParam("id") Long id) { + return null; + } + + /** + * 获得角色分页 + * @param qry + * @return + */ + @GetMapping("/page") + //@PreAuthorize("@ss.hasPermission('system:role:query')") + public PageResult getRolePage(RolePageQry qry) { + return null; + } + + /*@GetMapping({"/list-all-simple", "/simple-list"}) + @Operation(summary = "获取角色精简信息列表", description = "只包含被开启的角色,主要用于前端的下拉选项") + public CommonResult> getSimpleRoleList() { + List list = roleService.getRoleListByStatus(singleton(CommonStatusEnum.ENABLE.getStatus())); + list.sort(Comparator.comparing(RoleDO::getSort)); + return success(BeanUtils.toBean(list, RoleSimpleRespVO.class)); + }*/ + + /*@GetMapping("/export-excel") + @Operation(summary = "导出角色 Excel") + @OperateLog(type = EXPORT) + @PreAuthorize("@ss.hasPermission('system:role:export')") + public void export(HttpServletResponse response, @Validated RolePageReqVO exportReqVO) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = roleService.getRolePage(exportReqVO).getList(); + // 输出 + ExcelUtils.write(response, "角色数据.xls", "数据", RoleRespVO.class, + BeanUtils.toBean(list, RoleRespVO.class)); + }*/ + +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java new file mode 100644 index 0000000..46e51d4 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java @@ -0,0 +1,19 @@ +package com.xgblack.cool.module.system.service; + +import com.xgblack.cool.module.system.api.RoleServiceI; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author xg black + */ + +@Slf4j +@Service +@RequiredArgsConstructor +public class RoleServiceImpl implements RoleServiceI { + + + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java new file mode 100644 index 0000000..5d3e5f8 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java @@ -0,0 +1,11 @@ +package com.xgblack.cool.module.system.api; + +/** + * @author xg black + */ + +public interface RoleServiceI { + + + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/base/SexEnum.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/base/SexEnum.java new file mode 100644 index 0000000..aec5131 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/base/SexEnum.java @@ -0,0 +1,27 @@ +package com.xgblack.cool.module.system.common.enums.base; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 性别的枚举值 + * @author xg black + */ + +@Getter +@AllArgsConstructor +public enum SexEnum { + + /** 男 */ + MALE(1), + /** 女 */ + FEMALE(2), + /* 未知 */ + UNKNOWN(3); + + /** + * 性别 + */ + private final Integer sex; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/DataScopeEnum.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/DataScopeEnum.java new file mode 100644 index 0000000..15a845c --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/DataScopeEnum.java @@ -0,0 +1,46 @@ +package com.xgblack.cool.module.system.common.enums.permission; + +import com.xgblack.cool.framework.common.core.IntArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 数据范围枚举类 + *

用于实现数据级别的权限 + * + * @author xg black + */ +@Getter +@AllArgsConstructor +public enum DataScopeEnum implements IntArrayValuable { + + /** 全部数据权限 */ + ALL(1), // + + /** 指定部门数据权限 */ + DEPT_CUSTOM(2), + /** 部门数据权限 */ + DEPT_ONLY(3), + /** 部门及以下数据权限 */ + DEPT_AND_CHILD(4), + + /** 仅本人数据权限 */ + SELF(5), + + ; + + /** + * 范围 + */ + private final Integer scope; + + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DataScopeEnum::getScope).toArray(); + + @Override + public int[] array() { + return ARRAYS; + } + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/MenuTypeEnum.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/MenuTypeEnum.java new file mode 100644 index 0000000..26520b3 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/MenuTypeEnum.java @@ -0,0 +1,25 @@ +package com.xgblack.cool.module.system.common.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 菜单类型枚举类 + * @author xg black + */ + +@Getter +@AllArgsConstructor +public enum MenuTypeEnum { + + DIR(1), // 目录 + MENU(2), // 菜单 + BUTTON(3) // 按钮 + ; + + /** + * 类型 + */ + private final Integer type; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleCodeEnum.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleCodeEnum.java new file mode 100644 index 0000000..53a0a53 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleCodeEnum.java @@ -0,0 +1,33 @@ +package com.xgblack.cool.module.system.common.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.dromara.hutool.core.text.StrUtil; + +/** + * 角色标识枚举 + * @author xg black + */ + +@Getter +@AllArgsConstructor +public enum RoleCodeEnum { + + SUPER_ADMIN("super_admin", "超级管理员"), + TENANT_ADMIN("tenant_admin", "租户管理员"), + ; + + /** + * 角色编码 + */ + private final String code; + /** + * 名字 + */ + private final String name; + + public static boolean isSuperAdmin(String code) { + return StrUtil.equals(code, SUPER_ADMIN.getCode()); + } + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleTypeEnum.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleTypeEnum.java new file mode 100644 index 0000000..08890fb --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/common/enums/permission/RoleTypeEnum.java @@ -0,0 +1,26 @@ +package com.xgblack.cool.module.system.common.enums.permission; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 角色类型 + * @author xg black + */ + +@Getter +@AllArgsConstructor +public enum RoleTypeEnum { + + /** + * 内置角色 + */ + SYSTEM(1), + /** + * 自定义角色 + */ + CUSTOM(2); + + private final Integer type; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleAddCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleAddCmd.java new file mode 100644 index 0000000..5079c62 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleAddCmd.java @@ -0,0 +1,47 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class RoleAddCmd extends Command { + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + /** + * 角色编码 + */ + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + private String code; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** + * 备注 + */ + private String remark; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditCmd.java new file mode 100644 index 0000000..51bba82 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditCmd.java @@ -0,0 +1,52 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class RoleEditCmd extends Command { + + /** + * 角色编号 + */ + @NotNull(message = "角色编号不能为空") + private Long id; + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(max = 30, message = "角色名称长度不能超过30个字符") + private String name; + + /** + * 角色编码 + */ + @NotBlank(message = "角色标志不能为空") + @Size(max = 100, message = "角色标志长度不能超过100个字符") + private String code; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** + * 备注 + */ + private String remark; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditStatusCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditStatusCmd.java new file mode 100644 index 0000000..48f3c5d --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RoleEditStatusCmd.java @@ -0,0 +1,29 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class RoleEditStatusCmd extends Command { + + /** + * 角色编号 + */ + @NotNull(message = "角色编号不能为空") + private Long id; + + @NotNull(message = "状态不能为空") + private Boolean status; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java new file mode 100644 index 0000000..999e0eb --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java @@ -0,0 +1,33 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Query; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static com.xgblack.cool.framework.common.utils.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class RolePageQry extends Query { + + private String name; + + private String code; + + private Boolean status; + + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/RoleCO.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/RoleCO.java new file mode 100644 index 0000000..d321139 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/RoleCO.java @@ -0,0 +1,72 @@ +package com.xgblack.cool.module.system.dto.permission.clientobject; + +import com.xgblack.cool.framework.common.pojo.ClientObject; +import com.xgblack.cool.module.system.common.enums.permission.DataScopeEnum; +import com.xgblack.cool.module.system.common.enums.permission.RoleTypeEnum; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.Set; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class RoleCO extends ClientObject { + + /** + * 角色ID + */ + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + */ + private Boolean status; + /** + * 角色类型 + * + * 枚举 {@link RoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + private Set dataScopeDeptIds; + + private LocalDateTime createTime; + +} diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Role.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Role.java new file mode 100644 index 0000000..107d916 --- /dev/null +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Role.java @@ -0,0 +1,71 @@ +package com.xgblack.cool.module.system.domain.permission; + +import com.xgblack.cool.module.system.common.enums.permission.DataScopeEnum; +import com.xgblack.cool.module.system.common.enums.permission.RoleTypeEnum; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.Set; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class Role { + + /** + * 角色ID + */ + private Long id; + /** + * 角色名称 + */ + private String name; + /** + * 角色标识 + * + * 枚举 + */ + private String code; + /** + * 角色排序 + */ + private Integer sort; + /** + * 角色状态 + */ + private Boolean status; + /** + * 角色类型 + * + * 枚举 {@link RoleTypeEnum} + */ + private Integer type; + /** + * 备注 + */ + private String remark; + + /** + * 数据范围 + * + * 枚举 {@link DataScopeEnum} + */ + private Integer dataScope; + /** + * 数据范围(指定部门数组) + * + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 + */ + private Set dataScopeDeptIds; + + private LocalDateTime createTime; + +} diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java new file mode 100644 index 0000000..3d23005 --- /dev/null +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java @@ -0,0 +1,18 @@ +package com.xgblack.cool.module.system.convertor; + +import com.xgblack.cool.framework.common.convertor.Convertor; +import com.xgblack.cool.module.system.domain.permission.Role; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; +import com.xgblack.cool.module.system.gateway.database.dataobject.RoleDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author xg black + */ +@Mapper +public interface RoleConvertor extends Convertor { + RoleConvertor INSTANCE = Mappers.getMapper(RoleConvertor.class); + + +} diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java index 6f2d0de..cec07e6 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java @@ -8,6 +8,8 @@ import com.xgblack.cool.framework.core.db.TenantBaseDO; import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; import com.xgblack.cool.framework.mybatis.type.LongSetJsonTypeHandler; +import com.xgblack.cool.module.system.common.enums.permission.DataScopeEnum; +import com.xgblack.cool.module.system.common.enums.permission.RoleTypeEnum; import lombok.*; import lombok.experimental.Accessors; -- Gitee From ba3dbeb11f487d8c61d53fb986a14057360fe415 Mon Sep 17 00:00:00 2001 From: xgblack Date: Sat, 10 Feb 2024 22:20:34 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E2=AC=86=EF=B8=8F(pom):=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=20hutool=206.0.0-M10->6.0.0-M11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cool-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cool-dependencies/pom.xml b/cool-dependencies/pom.xml index 50465ec..13adae1 100644 --- a/cool-dependencies/pom.xml +++ b/cool-dependencies/pom.xml @@ -30,7 +30,7 @@ 1.6.0.Beta1 5.8.25 - 6.0.0-M10 + 6.0.0-M11 8.5.7 1.27.2 3.1.8 -- Gitee From 5fa5d5513953204f6d7f202771fae46cd577a3ec Mon Sep 17 00:00:00 2001 From: xgblack Date: Wed, 21 Feb 2024 10:24:24 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E2=9C=A8feat(web):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=90=AF=E5=8A=A8=E6=8F=90=E7=A4=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../banner/core/BannerApplicationRunner.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/banner/core/BannerApplicationRunner.java b/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/banner/core/BannerApplicationRunner.java index 387089d..8bd7587 100644 --- a/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/banner/core/BannerApplicationRunner.java +++ b/cool-framework/cool-spring-boot-starter-web/src/main/java/com/xgblack/cool/framework/banner/core/BannerApplicationRunner.java @@ -1,11 +1,14 @@ package com.xgblack.cool.framework.banner.core; +import org.dromara.hutool.core.net.NetUtil; +import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.thread.ThreadUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import java.util.LinkedHashSet; import java.util.concurrent.TimeUnit; /** @@ -26,19 +29,22 @@ public class BannerApplicationRunner implements ApplicationRunner { .start(() -> { // 延迟 1 秒,可以保证输出到结尾 ThreadUtil.sleep(1, TimeUnit.SECONDS); + + LinkedHashSet ipv4s = NetUtil.localIpv4s(); + StringBuilder sb = new StringBuilder(); + for (String ipv4 : ipv4s) { + sb.append(StrUtil.format("\t项目地址: \thttp://{}:{}\n", ipv4, port)); + } + log.info(""" \t---------------------------------------------------------- + {} \t项目启动成功! - \t项目地址: \t{}\s - \t----------------------------------------------------------""", - "http://localhost:" + port - ); + \t----------------------------------------------------------""", sb.toString()); }); + } - /*private static boolean isNotPresent(String className) { - return !ClassUtils.isPresent(className, ClassUtils.getDefaultClassLoader()); - }*/ } -- Gitee From e116fd1a0a60a79a097067955ca9922283b9c4ed Mon Sep 17 00:00:00 2001 From: xgblack Date: Thu, 22 Feb 2024 15:13:45 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=93=9Adocs(README):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index ba52cf7..85dd7b1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # CoolCodeBoot + +

+ + +

+ #### planning https://flowus.cn/xgblack/share/043ae88d-9444-4aa0-bf90-dcf0806e82f7 -- Gitee From bca6ed48602d0443f4144495b2df22c58a3952ea Mon Sep 17 00:00:00 2001 From: xgblack Date: Thu, 22 Feb 2024 15:25:38 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E2=9C=A8feat(mybatis):=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20=E5=85=A8=E5=B1=80=E7=BB=9F=E4=B8=80=E7=9A=84?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E5=AD=97=E6=AE=B5=E8=87=AA=E5=8A=A8=E6=B3=A8?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 5 ++ .../config/CoolMybatisAutoConfiguration.java | 14 +++- .../mybatis/config/MybatisFlexProperties.java | 3 +- .../framework/mybatis/dataobject/BaseDO.java | 22 +++--- .../mybatis/dataobject}/TenantBaseDO.java | 12 +-- .../mybatis/listener/DataInsertListener.java | 73 ++++++++++++++----- .../mybatis/listener/DataUpdateListener.java | 54 +++++++++----- .../mybatis/type/IntegerListTypeHandler.java | 4 +- .../mybatis/type/LongListTypeHandler.java | 3 +- .../mybatis/type/LongSetJsonTypeHandler.java | 1 + .../type/StringListJsonTypeHandler.java | 3 +- .../mybatis/type/StringListTypeHandler.java | 4 +- .../module/system/web/StudentController.java | 3 +- .../system/dto/student/StudentEditCmd.java | 3 + .../gateway/database/dataobject/MenuDO.java | 14 +++- .../database/dataobject/OauthClientDO.java | 10 ++- .../gateway/database/dataobject/RoleDO.java | 12 ++- .../database/dataobject/RoleMenuDO.java | 13 +++- .../database/dataobject/StudentDO.java | 18 +++-- .../gateway/database/dataobject/UserDO.java | 13 +++- .../database/dataobject/UserRoleDO.java | 9 ++- .../com/xgblack/cool/other/HutoolTest.java | 40 ++++++++++ 22 files changed, 239 insertions(+), 94 deletions(-) rename cool-framework/{cool-spring-boot-starter-biz-tenant/src/main/java/com/xgblack/cool/framework/core/db => cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject}/TenantBaseDO.java (58%) create mode 100644 cool-server/src/test/java/com/xgblack/cool/other/HutoolTest.java diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/pom.xml b/cool-framework/cool-spring-boot-starter-mybatis-flex/pom.xml index ec9baa6..957efa4 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/pom.xml +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/pom.xml @@ -53,6 +53,11 @@ runtime
--> + + com.xgblack + cool-spring-boot-starter-security-api + + diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/CoolMybatisAutoConfiguration.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/CoolMybatisAutoConfiguration.java index fe328ee..604379a 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/CoolMybatisAutoConfiguration.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/CoolMybatisAutoConfiguration.java @@ -3,15 +3,20 @@ package com.xgblack.cool.framework.mybatis.config; import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.audit.AuditManager; import com.mybatisflex.spring.boot.MyBatisFlexCustomizer; +import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; +import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; +import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; /** - * @author xg BLACK - * @date 2023/12/24 15:41 + * MybatisFlex自动配置类 + * + * @author xg black */ + @Slf4j @AutoConfiguration @EnableConfigurationProperties(MybatisFlexProperties.class) @@ -36,5 +41,10 @@ public class CoolMybatisAutoConfiguration implements MyBatisFlexCustomizer { AuditManager.setMessageCollector(auditMessage -> log.debug("SQL audit [{}ms] : ==> {} ", auditMessage.getElapsedTime(), auditMessage.getFullSql()) ); + + //注册数据全局注入 + globalConfig.registerInsertListener(new DataInsertListener(), BaseDO.class);//TODO: 考虑是否增加租户自动注入 + globalConfig.registerUpdateListener(new DataUpdateListener(), BaseDO.class); + } } diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/MybatisFlexProperties.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/MybatisFlexProperties.java index 6cc550a..bf35664 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/MybatisFlexProperties.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/config/MybatisFlexProperties.java @@ -2,13 +2,12 @@ package com.xgblack.cool.framework.mybatis.config; import lombok.Getter; import lombok.Setter; -import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; /** + * MybatisFlex配置 * @author xg black */ -@Slf4j @Setter @Getter @ConfigurationProperties(prefix = "cc.sql") diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/BaseDO.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/BaseDO.java index 4ef6035..b3c2c1d 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/BaseDO.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/BaseDO.java @@ -1,7 +1,9 @@ package com.xgblack.cool.framework.mybatis.dataobject; -import com.mybatisflex.annotation.Column; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.FieldNameConstants; import java.io.Serializable; import java.time.LocalDateTime; @@ -10,15 +12,19 @@ import java.time.LocalDateTime; * 基础实体对象 * @author xg black */ -@Data + +@Getter +@Setter +@ToString +@FieldNameConstants public abstract class BaseDO implements Serializable { /** - * 创建者id TODO:优化自动填充 + * 创建者id */ private Long creator; /** - * 更新者id TODO:优化自动填充 + * 更新者id */ private Long updater; /** @@ -30,10 +36,4 @@ public abstract class BaseDO implements Serializable { */ private LocalDateTime updateTime; - /** - * 是否删除 - */ - @Column(isLogicDelete = true) - private Boolean deleted; - } diff --git a/cool-framework/cool-spring-boot-starter-biz-tenant/src/main/java/com/xgblack/cool/framework/core/db/TenantBaseDO.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/TenantBaseDO.java similarity index 58% rename from cool-framework/cool-spring-boot-starter-biz-tenant/src/main/java/com/xgblack/cool/framework/core/db/TenantBaseDO.java rename to cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/TenantBaseDO.java index 906c67d..6f60742 100644 --- a/cool-framework/cool-spring-boot-starter-biz-tenant/src/main/java/com/xgblack/cool/framework/core/db/TenantBaseDO.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/dataobject/TenantBaseDO.java @@ -1,15 +1,17 @@ -package com.xgblack.cool.framework.core.db; +package com.xgblack.cool.framework.mybatis.dataobject; -import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.*; +import lombok.experimental.FieldNameConstants; /** * 拓展多租户的 BaseDO 基类 * @author xg black */ -@Data +@Getter +@Setter +@ToString(callSuper = true) +@FieldNameConstants @EqualsAndHashCode(callSuper = true) public abstract class TenantBaseDO extends BaseDO { diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataInsertListener.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataInsertListener.java index 5728af7..e8d1237 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataInsertListener.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataInsertListener.java @@ -1,41 +1,76 @@ package com.xgblack.cool.framework.mybatis.listener; import com.mybatisflex.annotation.InsertListener; +import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; +import com.xgblack.cool.framework.security.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.dromara.hutool.core.exception.ExceptionUtil; +import org.dromara.hutool.core.reflect.FieldUtil; +import org.dromara.hutool.core.reflect.TypeUtil; import java.lang.reflect.Field; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; /** - * @author xg BLACK - * @date 2023/11/12 17:36 + * 新增数据自动注入 监听 + * @author xg black */ + @Slf4j public class DataInsertListener implements InsertListener { @Override public void onInsert(Object entity) { - Class clazz = entity.getClass(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if (field.getName().equals("createTime") || field.getName().equals("updateTime")) { - if (field.getType() == LocalDateTime.class) { - field.setAccessible(true); - try { - field.set(entity, LocalDateTime.now()); - } catch (IllegalAccessException e) { - log.error("onInsert error. exception cause by : {}", ExceptionUtil.stacktraceToOneLineString(e)); - } - } else if (field.getType() == Date.class) { - try { - field.set(entity, new Date()); - } catch (IllegalAccessException e) { - log.error("onInsert error. exception cause by : {}", ExceptionUtil.stacktraceToOneLineString(e)); - } + + LocalDateTime nowDateTime = LocalDateTime.now(); + LocalDate nowDate = nowDateTime.toLocalDate(); + Date nowJdkTime = new Date(); + + try { + // 创建时间 + Field createTime = FieldUtil.getField(entity.getClass(), BaseDO.Fields.createTime); + if (createTime != null) { + if (TypeUtil.getType(createTime) == LocalDateTime.class) { + FieldUtil.setFieldValue(entity, createTime, nowDateTime); + } else if (TypeUtil.getType(createTime) == Date.class) { + FieldUtil.setFieldValue(entity, createTime, nowJdkTime); + } else if (TypeUtil.getType(createTime) == LocalDate.class) { + FieldUtil.setFieldValue(entity, createTime, nowDate); } + } + } catch (Exception e) { + log.error("onInsert field[{}] error. exception cause by : {}", BaseDO.Fields.createTime, ExceptionUtil.stacktraceToOneLineString(e)); + } + try { + // 更新时间 + Field updateTime = FieldUtil.getField(entity.getClass(), BaseDO.Fields.updateTime); + if (updateTime != null) { + if (TypeUtil.getType(updateTime) == LocalDateTime.class) { + FieldUtil.setFieldValue(entity, updateTime, nowDateTime); + } else if (TypeUtil.getType(updateTime) == Date.class) { + FieldUtil.setFieldValue(entity, updateTime, nowJdkTime); + } else if (TypeUtil.getType(updateTime) == LocalDate.class) { + FieldUtil.setFieldValue(entity, updateTime, nowDate); + } } + } catch (Exception e) { + log.error("onInsert field[{}] error. exception cause by : {}", BaseDO.Fields.updateTime, ExceptionUtil.stacktraceToOneLineString(e)); } + + try { + // 创建者 + Field creator = FieldUtil.getField(entity.getClass(), BaseDO.Fields.creator); + Long loginUserId = SecurityUtils.getLoginUserId(); + if (creator != null && loginUserId != null) { + FieldUtil.setFieldValue(entity, creator, loginUserId); + } + } catch (Exception e) { + log.error("onInsert field[{}] error. exception cause by : {}", BaseDO.Fields.creator, ExceptionUtil.stacktraceToOneLineString(e)); + } + + //TODO: 考虑是否增加租户自动注入 + } } diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataUpdateListener.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataUpdateListener.java index 9ee12b1..ec38c8f 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataUpdateListener.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/listener/DataUpdateListener.java @@ -1,42 +1,58 @@ package com.xgblack.cool.framework.mybatis.listener; import com.mybatisflex.annotation.UpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; +import com.xgblack.cool.framework.security.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.dromara.hutool.core.exception.ExceptionUtil; +import org.dromara.hutool.core.reflect.FieldUtil; +import org.dromara.hutool.core.reflect.TypeUtil; import java.lang.reflect.Field; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; /** - * @author xg BLACK - * @date 2023/11/12 18:05 + * 更新数据自动注入 监听 + * @author xg black */ @Slf4j public class DataUpdateListener implements UpdateListener { @Override public void onUpdate(Object entity) { - Class clazz = entity.getClass(); - Field[] fields = clazz.getDeclaredFields(); - for (Field field : fields) { - if (field.getName().equals("updateTime")) { - if (field.getType() == LocalDateTime.class) { - field.setAccessible(true); - try { - field.set(entity, LocalDateTime.now()); - } catch (IllegalAccessException e) { - log.error("onInsert error. exception cause by : {}", ExceptionUtil.stacktraceToOneLineString(e)); - } - } else if (field.getType() == Date.class) { - try { - field.set(entity, new Date()); - } catch (IllegalAccessException e) { - log.error("onInsert error. exception cause by : {}", ExceptionUtil.stacktraceToOneLineString(e)); - } + + LocalDateTime nowDateTime = LocalDateTime.now(); + LocalDate nowDate = nowDateTime.toLocalDate(); + Date nowJdkTime = new Date(); + + try { + // 更新时间 + Field updateTime = FieldUtil.getField(entity.getClass(), BaseDO.Fields.updateTime); + if (updateTime != null) { + if (TypeUtil.getType(updateTime) == LocalDateTime.class) { + FieldUtil.setFieldValue(entity, updateTime, nowDateTime); + } else if (TypeUtil.getType(updateTime) == Date.class) { + FieldUtil.setFieldValue(entity, updateTime, nowJdkTime); + } else if (TypeUtil.getType(updateTime) == LocalDate.class) { + FieldUtil.setFieldValue(entity, updateTime, nowDate); } + } + } catch (Exception e) { + log.error("onUpdate field[{}] error. exception cause by : {}", BaseDO.Fields.updateTime, ExceptionUtil.stacktraceToOneLineString(e)); + } + try { + // 更新者 + Field updater = FieldUtil.getField(entity.getClass(), BaseDO.Fields.updater); + Long loginUserId = SecurityUtils.getLoginUserId(); + if (updater != null && loginUserId != null) { + FieldUtil.setFieldValue(entity, updater, loginUserId); } + } catch (Exception e) { + log.error("onUpdate field[{}] error. exception cause by : {}", BaseDO.Fields.updater, ExceptionUtil.stacktraceToOneLineString(e)); } + } } diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/IntegerListTypeHandler.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/IntegerListTypeHandler.java index 9d32cc9..74ff073 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/IntegerListTypeHandler.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/IntegerListTypeHandler.java @@ -16,9 +16,9 @@ import java.util.List; /** * List 与 逗号分隔 Integer 转换 - * @author xg black - * @date 2023/11/23 16:09 + * @author xg black */ + @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class IntegerListTypeHandler implements TypeHandler> { diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongListTypeHandler.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongListTypeHandler.java index 1ce8dcf..ba19547 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongListTypeHandler.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongListTypeHandler.java @@ -16,8 +16,7 @@ import java.util.List; /** * List 与 逗号分隔 Long 转换 - * @author xg black - * @date 2023/11/23 16:09 + * @author xg black */ @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongSetJsonTypeHandler.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongSetJsonTypeHandler.java index a2728b0..f31b6d8 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongSetJsonTypeHandler.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/LongSetJsonTypeHandler.java @@ -14,6 +14,7 @@ import java.util.Set; * Set与json字符串转换 * @author xg black */ + @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(Set.class) public class LongSetJsonTypeHandler extends BaseJsonTypeHandler> { diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListJsonTypeHandler.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListJsonTypeHandler.java index e6fa9c2..a7333a5 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListJsonTypeHandler.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListJsonTypeHandler.java @@ -10,8 +10,7 @@ import java.util.List; /** * List 与 json字符串 互转 - * @author xg black - * @date 2023/11/22 17:38 + * @author xg black */ @MappedJdbcTypes(JdbcType.VARCHAR) diff --git a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListTypeHandler.java b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListTypeHandler.java index 1c5a56f..12c1673 100644 --- a/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListTypeHandler.java +++ b/cool-framework/cool-spring-boot-starter-mybatis-flex/src/main/java/com/xgblack/cool/framework/mybatis/type/StringListTypeHandler.java @@ -15,9 +15,9 @@ import java.util.List; /** * List 与 逗号分隔字符串 转换 - * @author xg black - * @date 2023/11/23 16:09 + * @author xg black */ + @MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) public class StringListTypeHandler implements TypeHandler> { diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/StudentController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/StudentController.java index fc53316..14e4ec6 100644 --- a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/StudentController.java +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/StudentController.java @@ -90,8 +90,9 @@ public class StudentController { * @param cmd */ @PutMapping - public void edit(@RequestBody @Validated StudentEditCmd cmd) { + public boolean edit(@RequestBody @Validated StudentEditCmd cmd) { studentService.update(cmd); + return true; } } diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/student/StudentEditCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/student/StudentEditCmd.java index 6cc9cb7..db936c0 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/student/StudentEditCmd.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/student/StudentEditCmd.java @@ -1,6 +1,7 @@ package com.xgblack.cool.module.system.dto.student; import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; @@ -17,7 +18,9 @@ import java.util.List; @Accessors(chain = true) public class StudentEditCmd extends Command { + @NotNull private Long id; + private String name; private Integer age; private LocalDateTime birthday; diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java index 9a4e7d5..9a4200b 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java @@ -1,11 +1,11 @@ package com.xgblack.cool.module.system.gateway.database.dataobject; +import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.core.db.TenantBaseDO; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; +import com.xgblack.cool.module.system.common.enums.permission.MenuTypeEnum; import lombok.*; import lombok.experimental.Accessors; @@ -20,7 +20,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -@Table(value = "sys_menu", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) +@Table(value = "sys_menu") public class MenuDO extends TenantBaseDO { /** * 菜单编号 - 根节点 @@ -106,4 +106,10 @@ public class MenuDO extends TenantBaseDO { */ private Boolean alwaysShow; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/OauthClientDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/OauthClientDO.java index fd7c07c..c7a85ba 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/OauthClientDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/OauthClientDO.java @@ -5,8 +5,6 @@ import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; import com.xgblack.cool.framework.mybatis.type.StringListTypeHandler; import lombok.*; import lombok.experimental.Accessors; @@ -23,7 +21,7 @@ import java.util.List; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -@Table(value = "sys_oauth_client_detail", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) +@Table(value = "sys_oauth_client_detail") public class OauthClientDO extends BaseDO {//TODO:看是否适配多租户 @Serial @@ -88,5 +86,11 @@ public class OauthClientDO extends BaseDO {//TODO:看是否适配多租户 */ private String autoapprove; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java index cec07e6..0e8b1db 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleDO.java @@ -4,9 +4,7 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.core.db.TenantBaseDO; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; import com.xgblack.cool.framework.mybatis.type.LongSetJsonTypeHandler; import com.xgblack.cool.module.system.common.enums.permission.DataScopeEnum; import com.xgblack.cool.module.system.common.enums.permission.RoleTypeEnum; @@ -26,7 +24,7 @@ import java.util.Set; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -@Table(value = "sys_role", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) +@Table(value = "sys_role") public class RoleDO extends TenantBaseDO { /** * 角色ID @@ -76,4 +74,10 @@ public class RoleDO extends TenantBaseDO { @Column(typeHandler = LongSetJsonTypeHandler.class) private Set dataScopeDeptIds; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleMenuDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleMenuDO.java index 714db78..416623c 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleMenuDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/RoleMenuDO.java @@ -1,11 +1,10 @@ package com.xgblack.cool.module.system.gateway.database.dataobject; +import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.core.db.TenantBaseDO; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; import lombok.*; import lombok.experimental.Accessors; @@ -20,7 +19,7 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -@Table(value = "sys_role_menu", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) +@Table(value = "sys_role_menu") public class RoleMenuDO extends TenantBaseDO { /** @@ -37,4 +36,10 @@ public class RoleMenuDO extends TenantBaseDO { */ private Long menuId; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/StudentDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/StudentDO.java index e124788..7483f3e 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/StudentDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/StudentDO.java @@ -4,8 +4,7 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; import com.xgblack.cool.framework.mybatis.type.StringListJsonTypeHandler; import lombok.Getter; import lombok.Setter; @@ -23,10 +22,11 @@ import java.util.List; */ @Getter @Setter -@ToString +@ToString(callSuper = true) @Accessors(chain = true) -@Table(value = "test_student", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) -public class StudentDO { +@Table(value = "test_student") +public class StudentDO extends TenantBaseDO { + @Id(keyType = KeyType.Auto) private Long id; @@ -44,6 +44,10 @@ public class StudentDO { @Column(typeHandler = StringListJsonTypeHandler.class) private List hobby; - private LocalDateTime createTime; - private LocalDateTime updateTime; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserDO.java index 625fb64..9fc3128 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserDO.java @@ -4,10 +4,9 @@ import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.core.db.TenantBaseDO; -import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; -import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; import com.xgblack.cool.framework.mybatis.type.LongSetJsonTypeHandler; +import com.xgblack.cool.module.system.common.enums.base.SexEnum; import lombok.*; import lombok.experimental.Accessors; @@ -24,7 +23,7 @@ import java.util.Set; @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor -@Table(value = "sys_user", onInsert = DataInsertListener.class, onUpdate = DataUpdateListener.class) +@Table(value = "sys_user") public class UserDO extends TenantBaseDO { /** * 用户ID @@ -116,4 +115,10 @@ public class UserDO extends TenantBaseDO { * 开源中国唯一标识 */ private String oscId; + + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java index 8268416..4201837 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java @@ -1,9 +1,10 @@ package com.xgblack.cool.module.system.gateway.database.dataobject; +import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; -import com.xgblack.cool.framework.core.db.TenantBaseDO; +import com.xgblack.cool.framework.mybatis.dataobject.TenantBaseDO; import com.xgblack.cool.framework.mybatis.listener.DataInsertListener; import com.xgblack.cool.framework.mybatis.listener.DataUpdateListener; import lombok.*; @@ -36,4 +37,10 @@ public class UserRoleDO extends TenantBaseDO { */ private Long roleId; + /** + * 是否删除 + */ + @Column(isLogicDelete = true) + private Boolean deleted; + } diff --git a/cool-server/src/test/java/com/xgblack/cool/other/HutoolTest.java b/cool-server/src/test/java/com/xgblack/cool/other/HutoolTest.java new file mode 100644 index 0000000..ff031e5 --- /dev/null +++ b/cool-server/src/test/java/com/xgblack/cool/other/HutoolTest.java @@ -0,0 +1,40 @@ +package com.xgblack.cool.other; + +import com.xgblack.cool.framework.mybatis.dataobject.BaseDO; +import com.xgblack.cool.module.system.gateway.database.dataobject.StudentDO; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.reflect.FieldUtil; +import org.dromara.hutool.core.reflect.TypeUtil; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @author xg black + */ +@Slf4j +public class HutoolTest { + + @Test + public void testField(){ + StudentDO entity = new StudentDO().setId(100L).setAge(20).setBirthday(LocalDateTime.now()).setDate(new Date()).setName("张三"); + + Field createTime = FieldUtil.getField(entity.getClass(), BaseDO.Fields.createTime); + Field creator = FieldUtil.getField(entity.getClass(), BaseDO.Fields.creator); + + if (createTime != null) { + if (TypeUtil.getType(createTime) == LocalDateTime.class) { + FieldUtil.setFieldValue(entity, createTime, LocalDateTime.now()); + }else if (TypeUtil.getType(createTime) == Date.class) { + FieldUtil.setFieldValue(entity, createTime, new Date()); + } + } + if (creator != null) { + FieldUtil.setFieldValue(entity, creator, 110L); + } + + log.info("entity = {}", entity); + } +} -- Gitee From de51f2f78fb448d0660a9e770012171cbcd90ccf Mon Sep 17 00:00:00 2001 From: xgblack Date: Thu, 22 Feb 2024 15:45:23 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=F0=9F=90=9Bfix(response):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Dvoid=E8=BF=94=E5=9B=9E=E5=80=BC=E4=B8=8D=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E5=8C=85=E8=A3=85=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advice/VoidResponseBodyAdvice.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/VoidResponseBodyAdvice.java b/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/VoidResponseBodyAdvice.java index 6078ab5..7d607c2 100644 --- a/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/VoidResponseBodyAdvice.java +++ b/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/VoidResponseBodyAdvice.java @@ -3,11 +3,13 @@ package com.xgblack.cool.framework.response.advice; import com.xgblack.cool.framework.common.response.api.ResponseFactory; import jakarta.annotation.Resource; import org.springframework.core.MethodParameter; +import org.springframework.core.annotation.Order; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.Objects; @@ -17,8 +19,9 @@ import java.util.Objects; * * @author xg black */ -//@ControllerAdvice -//@Order(value = 1000) + +@ControllerAdvice +@Order(value = 1000) public class VoidResponseBodyAdvice implements ResponseBodyAdvice { @Resource @@ -32,20 +35,12 @@ public class VoidResponseBodyAdvice implements ResponseBodyAdvice { * @return 是否对这种返回值进行处理 */ @Override - public boolean supports(MethodParameter methodParameter, - Class> clazz) { - - return Objects.requireNonNull(methodParameter.getMethod()).getReturnType().equals(Void.TYPE) - && MappingJackson2HttpMessageConverter.class.isAssignableFrom(clazz); + public boolean supports(MethodParameter methodParameter, Class> clazz) { + return Objects.requireNonNull(methodParameter.getMethod()).getReturnType().equals(Void.TYPE) && MappingJackson2HttpMessageConverter.class.isAssignableFrom(clazz); } @Override - public Object beforeBodyWrite(Object body, - MethodParameter returnType, - MediaType selectedContentType, - Class> selectedConverterType, - ServerHttpRequest request, - ServerHttpResponse response) { + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { return responseFactory.newSuccessInstance(); } } \ No newline at end of file -- Gitee From e9e231d5cb2b9101ffc55cf5a8ba638bef1180e3 Mon Sep 17 00:00:00 2001 From: xgblack Date: Thu, 22 Feb 2024 15:57:38 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8Fperf(response):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E5=BD=93=E8=BF=94=E5=9B=9E=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E4=B8=BAResponse=E6=97=B6=E6=97=A0=E9=9C=80=E5=86=8D?= =?UTF-8?q?=E6=AC=A1=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advice/NotVoidResponseBodyAdvice.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/NotVoidResponseBodyAdvice.java b/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/NotVoidResponseBodyAdvice.java index 4cfd869..756a491 100644 --- a/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/NotVoidResponseBodyAdvice.java +++ b/cool-framework/cool-spring-boot-starter-response/src/main/java/com/xgblack/cool/framework/response/advice/NotVoidResponseBodyAdvice.java @@ -52,18 +52,21 @@ public class NotVoidResponseBodyAdvice implements ResponseBodyAdvice { * @return 是否支持 */ @Override - public boolean supports(MethodParameter methodParameter, - Class> clazz) { + public boolean supports(MethodParameter methodParameter, Class> clazz) { Method method = methodParameter.getMethod(); //method为空、返回值为void、非JSON,直接跳过 - if (Objects.isNull(method) || method.getReturnType().equals(Void.TYPE) ) { - //log.trace("Cool Response:method为空、返回值为void,跳过"); + if (Objects.isNull(method) || method.getReturnType().equals(Void.TYPE) || method.getReturnType().equals(Response.class) ) { + if (log.isTraceEnabled()) { + log.trace("Cool Response:method为空、返回值为void和Response类型,跳过"); + } return false; } if (!MappingJackson2HttpMessageConverter.class.isAssignableFrom(clazz)) { - log.trace("Cool Response:非JSON、非字符类型,跳过"); + if (log.isTraceEnabled()) { + log.trace("Cool Response:非JSON、非字符类型,跳过"); + } return false; } @@ -81,7 +84,9 @@ public class NotVoidResponseBodyAdvice implements ResponseBodyAdvice { // 获取请求所在类的的包名 String packageName = method.getDeclaringClass().getPackage().getName(); if (excludePackages.stream().anyMatch(item -> ANT_PATH_MATCHER.match(item, packageName))) { - log.trace("Cool Response:匹配到excludePackages例外配置,跳过:packageName={},", packageName); + if (log.isTraceEnabled()) { + log.trace("Cool Response:匹配到excludePackages例外配置,跳过:packageName={},", packageName); + } return false; } } -- Gitee