From 99e002f05416d56a0f3d58258de0b111a213f22a Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Wed, 30 Apr 2025 10:18:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../promotion/annotation/EnumValidator.java | 20 +++---- .../promotion/annotation/EnumValue.java | 5 +- .../controller/user/UserInfoController.java | 19 +++++- .../exception/GlobalExceptionHandler.java | 9 +++ .../model/dto/user/UserInfoAddRequest.java | 6 +- .../model/dto/user/UserInfoLoginRequest.java | 2 +- .../model/dto/user/UserInfoUpdateRequest.java | 8 ++- .../promotion/model/entity/UserInfo.java | 2 +- .../promotion/model/enums/UserRoleEnum.java | 5 +- .../promotion/model/vo/user/UserInfoVO.java | 28 ++++++--- .../com/greenorange/promotion/EnumTest.java | 15 +++++ .../greenorange/promotion/FactoryDemo.java | 59 +++++++++++++++++++ 12 files changed, 144 insertions(+), 34 deletions(-) create mode 100644 src/test/java/com/greenorange/promotion/EnumTest.java create mode 100644 src/test/java/com/greenorange/promotion/FactoryDemo.java diff --git a/src/main/java/com/greenorange/promotion/annotation/EnumValidator.java b/src/main/java/com/greenorange/promotion/annotation/EnumValidator.java index ad63d1d..dc81144 100644 --- a/src/main/java/com/greenorange/promotion/annotation/EnumValidator.java +++ b/src/main/java/com/greenorange/promotion/annotation/EnumValidator.java @@ -1,28 +1,22 @@ package com.greenorange.promotion.annotation; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import java.util.Arrays; + +import com.greenorange.promotion.model.enums.UserRoleEnum; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; + // 枚举校验器 public class EnumValidator implements ConstraintValidator { - private EnumValue enumValue; @Override public void initialize(EnumValue constraintAnnotation) { - this.enumValue = constraintAnnotation; + } @Override public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null) { - return true; // 如果值为 null,跳过校验,可以用 @NotNull 另行校验 - } - - // 获取枚举类 - Class> enumClass = enumValue.enumClass(); - return Arrays.stream(enumClass.getEnumConstants()) - .anyMatch(enumConstant -> enumConstant.name().equals(value)); + return UserRoleEnum.getEnumByValues(value) != null; } } diff --git a/src/main/java/com/greenorange/promotion/annotation/EnumValue.java b/src/main/java/com/greenorange/promotion/annotation/EnumValue.java index 6cc55c3..e6c2c79 100644 --- a/src/main/java/com/greenorange/promotion/annotation/EnumValue.java +++ b/src/main/java/com/greenorange/promotion/annotation/EnumValue.java @@ -1,7 +1,8 @@ package com.greenorange.promotion.annotation; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/com/greenorange/promotion/controller/user/UserInfoController.java b/src/main/java/com/greenorange/promotion/controller/user/UserInfoController.java index 00eb746..630af35 100644 --- a/src/main/java/com/greenorange/promotion/controller/user/UserInfoController.java +++ b/src/main/java/com/greenorange/promotion/controller/user/UserInfoController.java @@ -166,7 +166,7 @@ public class UserInfoController { */ @PostMapping("queryById") @Operation(summary = "web端管理员根据id查询用户", description = "参数:用户表查询请求体,权限:管理员(boss, admin),方法名:queryUserInfoById") - @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) +// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) public BaseResponse queryUserInfoById(@Valid @RequestBody CommonRequest commonRequest) { Long id = commonRequest.getId(); UserInfo userInfo = userInfoService.getById(id); @@ -176,6 +176,23 @@ public class UserInfoController { } + /** + * web端管理员根据id查询用户表 + * @param id 用户表查询请求体 + * @return 用户表信息 + */ + @GetMapping("queryById") + @Operation(summary = "web端管理员根据id查询用户", description = "参数:用户表查询请求体,权限:管理员(boss, admin),方法名:queryUserInfoById") +// @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) + public BaseResponse queryUserInfoByGetId(@RequestParam Long id) { + UserInfo userInfo = userInfoService.getById(id); + ThrowUtils.throwIf(userInfo == null, ErrorCode.OPERATION_ERROR, "当前用户不存在"); + UserInfoVO userInfoVO = commonService.copyProperties(userInfo, UserInfoVO.class); + return ResultUtils.success(userInfoVO); + } + + + /** * web端管理员批量删除用户表 * @param commonBatchRequest 用户表批量删除请求体 diff --git a/src/main/java/com/greenorange/promotion/exception/GlobalExceptionHandler.java b/src/main/java/com/greenorange/promotion/exception/GlobalExceptionHandler.java index 200657b..60cc4c3 100644 --- a/src/main/java/com/greenorange/promotion/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/greenorange/promotion/exception/GlobalExceptionHandler.java @@ -6,6 +6,7 @@ import com.greenorange.promotion.common.ResultUtils; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; import net.sf.jsqlparser.util.validation.ValidationError; +import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; @@ -13,6 +14,7 @@ import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import java.util.ArrayList; import java.util.Comparator; @@ -43,6 +45,13 @@ public class GlobalExceptionHandler { } +// // 处理参数类型不匹配的异常 +// @ExceptionHandler(MethodArgumentTypeMismatchException.class) +// public ResponseEntity handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException ex) { +// return ResponseEntity.badRequest().body("Invalid value for parameter: " + ex.getName()); +// } + + // 处理消息体解析失败的异常 @ExceptionHandler(HttpMessageNotReadableException.class) public BaseResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { diff --git a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoAddRequest.java b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoAddRequest.java index 4bd2da2..f951a38 100644 --- a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoAddRequest.java +++ b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoAddRequest.java @@ -53,7 +53,7 @@ public class UserInfoAddRequest implements Serializable { */ @NotBlank(message = "密码不能为空") @Size(min = 6, max = 10, message = "密码长度在 6 到 10 个字符") - @Schema(description = "密码", example = "qingcheng") + @Schema(description = "密码(建议加密存储)", example = "qingcheng") private String userPassword; /** @@ -67,7 +67,7 @@ public class UserInfoAddRequest implements Serializable { */ @EnumValue(enumClass = UserRoleEnum.class) @Schema(description = "用户角色", example = "USER") - private UserRoleEnum userRole; + private String userRole; /** * 上级用户id @@ -78,7 +78,7 @@ public class UserInfoAddRequest implements Serializable { /** * 上级用户列表(1,2,3) */ - @Schema(description = "上级用户列表(1,2,3)", example = "1, 2, 3") + @Schema(description = "上级用户列表(1,2,3)", example = "1,2,3") private String superUserList; diff --git a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoLoginRequest.java b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoLoginRequest.java index 0205a43..8d717d5 100644 --- a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoLoginRequest.java +++ b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoLoginRequest.java @@ -27,7 +27,7 @@ public class UserInfoLoginRequest implements Serializable { */ @NotBlank(message = "密码不能为空") @Size(min = 6, max = 10, message = "密码长度在 6 到 10 个字符") - @Schema(description = "密码", example = "qingcheng") + @Schema(description = "密码(建议加密存储)", example = "qingcheng") private String userPassword; } diff --git a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoUpdateRequest.java b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoUpdateRequest.java index 24a7daa..8e5e49b 100644 --- a/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoUpdateRequest.java +++ b/src/main/java/com/greenorange/promotion/model/dto/user/UserInfoUpdateRequest.java @@ -1,5 +1,7 @@ package com.greenorange.promotion.model.dto.user; +import com.greenorange.promotion.annotation.EnumValue; +import com.greenorange.promotion.model.enums.UserRoleEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; @@ -60,7 +62,7 @@ public class UserInfoUpdateRequest implements Serializable { */ @NotBlank(message = "密码不能为空") @Size(min = 6, max = 10, message = "密码长度在 6 到 10 个字符") - @Schema(description = "密码", example = "qingcheng") + @Schema(description = "密码(建议加密存储)", example = "qingcheng") private String userPassword; /** @@ -72,7 +74,7 @@ public class UserInfoUpdateRequest implements Serializable { /** * 用户角色 */ - @NotBlank(message = "用户角色不能为空") + @EnumValue(enumClass = UserRoleEnum.class) @Schema(description = "用户角色", example = "user") private String userRole; @@ -85,7 +87,7 @@ public class UserInfoUpdateRequest implements Serializable { /** * 上级用户列表(1,2,3) */ - @Schema(description = "上级用户列表(1,2,3)", example = "1, 2, 3") + @Schema(description = "上级用户列表(1,2,3)", example = "1,2,3") private String superUserList; diff --git a/src/main/java/com/greenorange/promotion/model/entity/UserInfo.java b/src/main/java/com/greenorange/promotion/model/entity/UserInfo.java index e27b17f..681deda 100644 --- a/src/main/java/com/greenorange/promotion/model/entity/UserInfo.java +++ b/src/main/java/com/greenorange/promotion/model/entity/UserInfo.java @@ -42,7 +42,7 @@ public class UserInfo implements Serializable { private String userAccount; /** - * 密码 + * 密码(建议加密存储) */ private String userPassword; diff --git a/src/main/java/com/greenorange/promotion/model/enums/UserRoleEnum.java b/src/main/java/com/greenorange/promotion/model/enums/UserRoleEnum.java index 68cc42e..e5e01ee 100644 --- a/src/main/java/com/greenorange/promotion/model/enums/UserRoleEnum.java +++ b/src/main/java/com/greenorange/promotion/model/enums/UserRoleEnum.java @@ -1,6 +1,7 @@ package com.greenorange.promotion.model.enums; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; import java.util.Arrays; @@ -39,7 +40,7 @@ public enum UserRoleEnum { * 获取值列表 */ public static UserRoleEnum getEnumByValues(String value) { - if (ObjectUtils.isEmpty(value)) { + if (StringUtils.isBlank(value)) { return null; } for (UserRoleEnum anEnum : UserRoleEnum.values()) { @@ -49,4 +50,6 @@ public enum UserRoleEnum { } return null; } + + } diff --git a/src/main/java/com/greenorange/promotion/model/vo/user/UserInfoVO.java b/src/main/java/com/greenorange/promotion/model/vo/user/UserInfoVO.java index 69e444a..ce67099 100644 --- a/src/main/java/com/greenorange/promotion/model/vo/user/UserInfoVO.java +++ b/src/main/java/com/greenorange/promotion/model/vo/user/UserInfoVO.java @@ -1,6 +1,8 @@ package com.greenorange.promotion.model.vo.user; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import lombok.Data; import java.io.Serial; @@ -16,55 +18,63 @@ public class UserInfoVO implements Serializable { /** * 用户表 ID */ - @Schema(description = "用户表 ID", example = "1") + @Schema(description = "用户ID", example = "1") private Long id; /** * 用户昵称 */ - @Schema(description = "用户昵称", example = "${field.example}") + @Schema(description = "用户昵称", example = "chenxinzhi") private String nickName; /** * 用户头像URL */ - @Schema(description = "用户头像URL", example = "${field.example}") + @Schema(description = "用户头像URL", example = "http://xxx.png") private String userAvatar; /** * 手机号 */ - @Schema(description = "手机号", example = "${field.example}") + @Schema(description = "手机号", example = "15888610253") private String phoneNumber; + + /** + * 账号 + */ + @Schema(description = "账号", example = "qingcheng") + private String userAccount; + + /** * 密码(建议加密存储) */ - @Schema(description = "密码(建议加密存储)", example = "${field.example}") + @Schema(description = "密码(建议加密存储)", example = "qingcheng") private String userPassword; /** * 邀请码 */ - @Schema(description = "邀请码", example = "${field.example}") + @Schema(description = "邀请码", example = "666999") private String invitationCode; /** * 用户角色 */ - @Schema(description = "用户角色", example = "${field.example}") + @Schema(description = "用户角色", example = "user") private String userRole; /** * 上级用户id */ - @Schema(description = "上级用户id", example = "${field.example}") + @Schema(description = "上级用户id", example = "1") private Long parentUserId; /** * 上级用户列表(1,2,3) */ - @Schema(description = "上级用户列表(1,2,3)", example = "${field.example}") + @Schema(description = "上级用户列表(1,2,3)", example = "1,2,3") private String superUserList; diff --git a/src/test/java/com/greenorange/promotion/EnumTest.java b/src/test/java/com/greenorange/promotion/EnumTest.java new file mode 100644 index 0000000..ddeb199 --- /dev/null +++ b/src/test/java/com/greenorange/promotion/EnumTest.java @@ -0,0 +1,15 @@ +package com.greenorange.promotion; + +import com.greenorange.promotion.model.enums.UserRoleEnum; +import org.junit.jupiter.api.Test; + +public class EnumTest { + + @Test + public void testEnum() { + UserRoleEnum admin = UserRoleEnum.ADMIN; + String name = admin.name(); + System.out.println(name); + } + +} diff --git a/src/test/java/com/greenorange/promotion/FactoryDemo.java b/src/test/java/com/greenorange/promotion/FactoryDemo.java new file mode 100644 index 0000000..7819167 --- /dev/null +++ b/src/test/java/com/greenorange/promotion/FactoryDemo.java @@ -0,0 +1,59 @@ +package com.greenorange.promotion; + +import org.junit.jupiter.api.Test; + +public class FactoryDemo { + + @Test + public void ClientTest() { + CarFactory bmwFactory = new BMWFactory(); + Car bmw = bmwFactory.createCar(); + bmw.drive(); // 输出: Driving a BMW car + + CarFactory benzFactory = new BenzFactory(); + Car benz = benzFactory.createCar(); + benz.drive(); // 输出: Driving a Benz car + } + + +} + + + + +interface Car { + void drive(); +} + +class BMWCar implements Car { + @Override + public void drive() { + System.out.println("Driving a BMW car"); + } +} + +class BenzCar implements Car { + @Override + public void drive() { + System.out.println("Driving a Benz car"); + } +} + +interface CarFactory { + Car createCar(); +} + + +class BMWFactory implements CarFactory { + @Override + public Car createCar() { + return new BMWCar(); + } +} + +class BenzFactory implements CarFactory { + @Override + public Car createCar() { + return new BenzCar(); + } +}