From 063d6464ff582def3cac16dddd355c696f0aa3a7 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 29 Aug 2024 17:39:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1=E3=80=81=E5=88=86=E6=9E=90=E9=A1=B5?= =?UTF-8?q?=E6=9D=BF=E6=9D=90=E4=BF=A1=E6=81=AF=E5=90=8D=E7=A7=B0=E8=A7=84?= =?UTF-8?q?=E8=8C=83=EF=BC=9B2=E3=80=81=E6=96=B0=E5=A2=9E=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=9F=AD=E4=BF=A1=E9=AA=8C=E8=AF=81=E7=A0=81=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=8E=A5=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/vo/order/OrderGoodsPlateRespVO.java | 2 +- .../order/OrderStatisticsServiceImpl.java | 64 ++++++++++++------ .../lib/ureport-core-2.3.0-SNAPSHOT.jar | Bin 904164 -> 904164 bytes .../system/enums/DictTypeConstants.java | 1 + .../controller/admin/auth/AuthController.java | 13 +++- .../admin/auth/vo/AuthLoginSmsCheckReqVO.java | 30 ++++++++ .../system/service/auth/AdminAuthService.java | 8 +++ .../service/auth/AdminAuthServiceImpl.java | 16 +++++ .../system/service/sms/SmsCodeService.java | 7 ++ .../service/sms/SmsCodeServiceImpl.java | 25 ++++++- .../src/main/resources/application.yaml | 3 +- 11 files changed, 144 insertions(+), 25 deletions(-) create mode 100644 cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsPlateRespVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsPlateRespVO.java index 5396f1470..e3cc50467 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsPlateRespVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/vo/order/OrderGoodsPlateRespVO.java @@ -27,7 +27,7 @@ public class OrderGoodsPlateRespVO implements Comparable private String color; @Schema(description = "纹路") - private Integer texture; + private Boolean texture; @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) private BigDecimal width; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java index c5d0ae2cf..7af9befd8 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/order/OrderStatisticsServiceImpl.java @@ -33,6 +33,7 @@ import com.cf.imes.module.system.api.dict.DictDataApi; import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO; import com.cf.imes.module.system.enums.DictTypeConstants; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -290,12 +291,10 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { seriesItem.put("id", entry.getKey()); // 材质-商品名称-颜色-纹理-宽-高-厚-品牌 OrderGoodsPlateRespVO orderGoodsPlateRespVO = entry.getValue(); - // 获取纹路描述 - DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(orderGoodsPlateRespVO.getTexture())).getData(); - String texture = ObjectUtil.isNotNull(grainDTO) ? grainDTO.getLabel() : ""; - seriesItem.put("name", orderGoodsPlateRespVO.getMaterial() + "-" + orderGoodsPlateRespVO.getGoodsName() + - "-" + orderGoodsPlateRespVO.getColor() + "-" + texture + "-" + stripTrailingZeros(orderGoodsPlateRespVO.getWidth()) + - "×" + stripTrailingZeros(orderGoodsPlateRespVO.getHeight()) + "×" + stripTrailingZeros(orderGoodsPlateRespVO.getThickness()) + "-" + orderGoodsPlateRespVO.getBrand()); + String specification = formatGoodsName('x', stripTrailingZeros(orderGoodsPlateRespVO.getWidth()), + stripTrailingZeros(orderGoodsPlateRespVO.getHeight()), stripTrailingZeros(orderGoodsPlateRespVO.getThickness())); + String goodsName = formatGoodsName('-', orderGoodsPlateRespVO.getMaterial(), orderGoodsPlateRespVO.getGoodsName(), orderGoodsPlateRespVO.getColor(), getTextureFromDict(orderGoodsPlateRespVO.getTexture()), specification, orderGoodsPlateRespVO.getBrand()); + seriesItem.put("name", goodsName); series.add(seriesItem); } resultMap.put(DATELIST_FIELD_NAME, dateList.stream().map(date -> generateDateRangeAxis(date, reqVO.getUnit())).toList()); @@ -362,12 +361,10 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { seriesItem.put("id", entry.getKey()); // 材质-商品名称-颜色-纹理-宽-高-厚-品牌 OrderGoodsPlateRespVO orderGoodsPlateRespVO = entry.getValue(); - // 获取纹路描述 - DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(orderGoodsPlateRespVO.getTexture())).getData(); - String texture = ObjectUtil.isNotNull(grainDTO) ? grainDTO.getLabel() : ""; - seriesItem.put("name", orderGoodsPlateRespVO.getMaterial() + "-" + orderGoodsPlateRespVO.getGoodsName() + - "-" + orderGoodsPlateRespVO.getColor() + "-" + texture + "-" + stripTrailingZeros(orderGoodsPlateRespVO.getWidth()) + - "×" + stripTrailingZeros(orderGoodsPlateRespVO.getHeight()) + "×" + stripTrailingZeros(orderGoodsPlateRespVO.getThickness()) + "-" + orderGoodsPlateRespVO.getBrand()); + String specification = formatGoodsName('x', stripTrailingZeros(orderGoodsPlateRespVO.getWidth()), + stripTrailingZeros(orderGoodsPlateRespVO.getHeight()), stripTrailingZeros(orderGoodsPlateRespVO.getThickness())); + String goodsName = formatGoodsName('-', orderGoodsPlateRespVO.getMaterial(), orderGoodsPlateRespVO.getGoodsName(), orderGoodsPlateRespVO.getColor(), getTextureFromDict(orderGoodsPlateRespVO.getTexture()), specification, orderGoodsPlateRespVO.getBrand()); + seriesItem.put("name", goodsName); series.add(seriesItem); } resultMap.put(DATELIST_FIELD_NAME, dateList.stream().map(date -> generateDateRangeAxis(date, reqVO.getUnit())).toList()); @@ -485,9 +482,10 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { } // 任意取一个类型 PlateGoodDO plateGoodDO = plateGoodDOList.get(0); - seriesItem.put("name", plateGoodDO.getMaterial() + "-" + plateGoodDO.getGoodsName() + - "-" + plateGoodDO.getColor() + "-" + getTextureFromDict(plateGoodDO) + "-" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getWidth())) + - "×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getHeight())) + "×" + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getThickness())) + "-" + plateGoodDO.getBrand()); + String specification = formatGoodsName('x', stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getWidth())), + stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getHeight())), stripTrailingZeros(BigDecimal.valueOf(plateGoodDO.getThickness()))); + String goodsName = formatGoodsName('-', plateGoodDO.getMaterial(), plateGoodDO.getGoodsName(), plateGoodDO.getColor(), getTextureFromDict(plateGoodDO.getTexture()), specification, plateGoodDO.getBrand()); + seriesItem.put("name", goodsName); series.add(seriesItem); } resultMap.put(DATELIST_FIELD_NAME, dateList.stream().map(date -> generateDateRangeAxis(date, unit)).toList()); @@ -498,18 +496,44 @@ public class OrderStatisticsServiceImpl implements OrderStatisticsService { return resultMap; } + /** + * 板材信息用-连接 + * + * @param connChar 连接符 + * @param texts 信息内容 + * @return 为空时不带connChar + */ + private String formatGoodsName(char connChar, String... texts) { + StringBuilder sb = new StringBuilder(); + for (String text : texts) { + if (StringUtils.isNotEmpty(text)) { + sb.append(text).append(connChar); + } + } + // 移除最后一个 - + if (sb.length() > 0 && sb.charAt(sb.length() - 1) == connChar) { + sb.deleteCharAt(sb.length() - 1); + } + return sb.toString(); + } + + /** * 根据纹路枚举获取字典中纹路描述 - * @param plateGoodDO + * + * @param texture * @return */ - private String getTextureFromDict(PlateGoodDO plateGoodDO) { + private String getTextureFromDict(Boolean texture) { + if (ObjectUtil.isNull(texture)) { + return "无"; + } // 获取纹路描述 - DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.GRAIN_TYPE, String.valueOf(plateGoodDO.getTexture())).getData(); + DictDataRespDTO grainDTO = dictDataApi.getDictData(DictTypeConstants.PLATE_TEXTURE_TYPE, String.valueOf(texture)).getData(); if (ObjectUtil.isNotNull(grainDTO)) { - return grainDTO.getLabel(); + return Objects.equals("是", grainDTO.getLabel()) ? "有" : "无"; } else { - return ""; + return "无"; } } diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index ed9ae8b6d3535ebdde2f2e9e8b98ec52ecdc2c07..ce94db844d365974151b1272f76f8aa338465bcf 100644 GIT binary patch delta 14252 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 delta 14252 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 z loginCheck( @Param("mobile") @NotEmpty(message = "手机号不能为空") @Mobile String mobile) { return success(authService.loginCheck(mobile)); } + @PostMapping("/login/sms/check") + @PermitAll + @Operation(summary = "校验登录验证码") + @OperateLog(enable = false) + public CommonResult loginSmsCheck(@Valid @RequestBody AuthLoginSmsCheckReqVO reqVO) { + return success(authService.loginSmsCheck(reqVO)); + } + @PostMapping("/logout") @PermitAll @Operation(summary = "登出系统") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java new file mode 100644 index 000000000..79f8853a1 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/auth/vo/AuthLoginSmsCheckReqVO.java @@ -0,0 +1,30 @@ +package com.cf.imes.module.system.controller.admin.auth.vo; + +import com.cf.imes.framework.common.validation.Mobile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +@Schema(description = "管理后台 - 短信验证码校验 ReqVo") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class AuthLoginSmsCheckReqVO { + + @Schema(description = "手机号码", example = "15601691300") + @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + @Mobile + @NotEmpty(message = "手机号不能为空") + private String mobile; + + @Schema(description = "验证码", example = "123456") + @Length(min = 6, max = 6, message = "验证码长度必须 6 位") + @NotEmpty(message = "短信验证码不能为空") + private String smsCaptchaVerification; +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthService.java index d6d9acf26..7b9c3f191 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthService.java @@ -2,6 +2,7 @@ package com.cf.imes.module.system.service.auth; import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginSmsCheckReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; @@ -41,6 +42,13 @@ public interface AdminAuthService { */ boolean loginCheck(String mobile); + /** + * 登录短信验证码校验 + * + * @return true正确,false错误 + */ + boolean loginSmsCheck(AuthLoginSmsCheckReqVO reqVO); + /** * 基于 token 退出登录 * diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java index 469ea9859..218a60a1a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/auth/AdminAuthServiceImpl.java @@ -14,6 +14,7 @@ import com.cf.imes.module.system.api.social.dto.SocialUserBindReqDTO; import com.cf.imes.module.system.api.social.dto.SocialUserRespDTO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginSmsCheckReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSmsLoginReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSmsSendReqVO; import com.cf.imes.module.system.controller.admin.auth.vo.AuthSocialLoginReqVO; @@ -165,6 +166,21 @@ public class AdminAuthServiceImpl implements AdminAuthService { return false; } + @Override + public boolean loginSmsCheck(AuthLoginSmsCheckReqVO reqVO) { + String mobile = reqVO.getMobile(); + // 查询账号 + AdminUserDO user = userService.getUserUniqueByUserName(mobile); + // 校验用户是否存在 + if (user == null) { + createLoginLog(null, mobile, LoginLogTypeEnum.LOGIN_USERNAME, LoginResultEnum.BAD_CREDENTIALS); + return false; + } + // 校验验证码正确性 + smsCodeService.validateSmsCode(reqVO); + return true; + } + @Override public void sendSmsCode(AuthSmsSendReqVO reqVO) { // 登录场景,验证是否存在 diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeService.java index 6e3bd3734..2a90d2591 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeService.java @@ -4,6 +4,7 @@ import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeSendReqDTO; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginSmsCheckReqVO; import javax.validation.Valid; @@ -37,4 +38,10 @@ public interface SmsCodeService { */ void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO); + /** + * 检查验证码是否有效 + * + * @param reqVO + */ + void validateSmsCode(@Valid AuthLoginSmsCheckReqVO reqVO); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeServiceImpl.java index 7c93141e2..d02a7e364 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/sms/SmsCodeServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeSendReqDTO; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import com.cf.imes.module.system.api.sms.dto.code.SmsCodeValidateReqDTO; +import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginSmsCheckReqVO; import com.cf.imes.module.system.dal.dataobject.sms.SmsCodeDO; import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; import com.cf.imes.module.system.dal.mysql.sms.SmsCodeMapper; @@ -138,7 +139,7 @@ public class SmsCodeServiceImpl implements SmsCodeService { @Override public void useSmsCode(SmsCodeUseReqDTO reqDTO) { // 非修改手机号的场景时校验手机号是否存在 - AdminUserDO user = userService.getUserByUsernameAndOrganId(reqDTO.getMobile(), null); + AdminUserDO user = userService.getUserUniqueByUserName(reqDTO.getMobile()); if (ObjectUtil.isNull(user) && ObjectUtil.notEqual(SmsSceneEnum.USER_UPDATE_MOBILE.getScene(), reqDTO.getScene())) { throw ServiceExceptionUtil.exception(ErrorCodeConstants.AUTH_MOBILE_NOT_EXISTS); } @@ -159,6 +160,28 @@ public class SmsCodeServiceImpl implements SmsCodeService { } } + @Override + public void validateSmsCode(AuthLoginSmsCheckReqVO reqVO) { + String mobile = reqVO.getMobile(); + // 非修改手机号的场景时校验手机号是否存在 + AdminUserDO user = userService.getUserUniqueByUserName(mobile); + if (ObjectUtil.isNull(user)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AUTH_MOBILE_NOT_EXISTS); + } + String smsCodeKey = String.format(RedisKeyConstants.SMS_CAPTCHA_VERIFICATION, mobile); + Object keyObj = redisTemplate.opsForValue().get(smsCodeKey); + if (ObjectUtil.isNotNull(keyObj)) { + // 校验码存在 + if (ObjectUtil.notEqual(String.valueOf(keyObj), reqVO.getSmsCaptchaVerification())) { + // 验证码不正确 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.SMS_CODE_NOT_CORRECT); + } + } else { + // 提示验证码不存在 + throw ServiceExceptionUtil.exception(ErrorCodeConstants.SMS_CODE_NOT_FOUND); + } + } + @Override public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) { validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene()); diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml index 13d7cee08..ff3b4969c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/application.yaml @@ -161,7 +161,8 @@ chenfeng: - /admin-api/system/auth/logout - /admin-api/system/auth/sms-code - /admin-api/system/user/reset-password - - /admin-api/system/auth/check + - /admin-api/system/auth/login/check + - /admin-api/system/auth/login/sms/check - /rpc-api/** #- /admin-api/system/** #- /rpc-api/system/organ/valid # 防止递归。避免调用 /rpc-api/system/organ/valid 接口时,又去触发 /rpc-api/system/organ/valid 去校验 From 511d6f417be29fc81d2ae2779781e6cd780faf4f Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 29 Aug 2024 17:48:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=AD=97=E5=85=B8=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cf/imes/module/system/enums/DictTypeConstants.java | 1 - 1 file changed, 1 deletion(-) diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java index 891d0a789..b79a1396f 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java @@ -37,7 +37,6 @@ public interface DictTypeConstants { String HOLE_FACE = "hole_face";//孔加工面 String HOLE_DIR = "hole_direction";// 孔方向 String HOLE_TYPE = "hole_type";//孔类型 - String PLATE_TEXTURE_TYPE = "plateTextureType";//板件纹路类型 String PLATE_TEXTURE_TYPE_STATUS = "plateTextureTypeStatus";//板件纹路状态 String PLATE_TEXTURE_TYPE_STATUS_TYPE = "plateTextureTypeStatusType";//板件纹路状态类型 } From aaab6d588cd9159334ac1beab00b51b30f9f8884 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 30 Aug 2024 12:10:18 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=8A=A5=E8=A1=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81ureport=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E6=96=B0=E5=A2=9Eid=E5=B1=9E=E6=80=A7=E6=98=A0=E5=B0=84?= =?UTF-8?q?=EF=BC=9B2=E3=80=81=E6=96=B0=E5=A2=9Espringbean=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=AF=B9=E8=B1=A1=E6=8E=A5=E5=8F=A3=EF=BC=9B3?= =?UTF-8?q?=E3=80=81=E6=8E=A5=E5=8F=A3=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E3=80=81=E5=85=A5=E5=8F=82=E8=A7=84=E8=8C=83=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../report/enums/ErrorCodeConstants.java | 2 + .../dataset/ReportDatasetController.java | 4 +- .../ReportDatasourceController.java | 16 +++- .../template/ReportTemplateController.java | 9 +- .../bean/MockSpringBeanDatasourceResult.java | 16 ++++ .../datasource/ReportDatasourceService.java | 8 +- .../ReportDatasourceServiceImpl.java | 79 +++++++++++++----- .../lib/ureport-core-2.3.0-SNAPSHOT.jar | Bin 904164 -> 904700 bytes 8 files changed, 103 insertions(+), 31 deletions(-) create mode 100644 cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/framework/ureport/bean/MockSpringBeanDatasourceResult.java diff --git a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java index deef36ac7..8e9d6de5f 100644 --- a/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java +++ b/cf-module-report/cf-module-report-api/src/main/java/com/cf/imes/module/report/enums/ErrorCodeConstants.java @@ -17,6 +17,8 @@ public final class ErrorCodeConstants { // ========== UREPORT datasource模块 1-003-002-000 ========== public static final ErrorCode DATASOURCE_NOT_EXISTS = new ErrorCode(1_003_002_001, "报表数据源不存在"); public static final ErrorCode DATASOURCE_CONNECT_FAIL = new ErrorCode(1_003_002_002, "报表数据源连接失败"); + public static final ErrorCode DATASOURCE_SPRINGBEAN_GET_FAIL = new ErrorCode(1_003_002_003, "无法获取springbean【{}】"); + public static final ErrorCode DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL = new ErrorCode(1_003_002_004, "获取springbean方法列表失败,请检查】"); // ========== UREPORT dataset模块 1-003-003-000 ========== diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java index d0e31458e..6b882d43a 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/dataset/ReportDatasetController.java @@ -52,7 +52,7 @@ public class ReportDatasetController { @DeleteMapping("/dataset/{id}") @Operation(summary = "删除报表数据集") - @Parameter(name = "id", description = "编号", required = true) + @Parameter(name = "id", description = "数据集id", required = true) // @PreAuthorize("@ss.hasPermission('report:dataset:delete')") public CommonResult deleteDataset(@PathVariable("id") Long id) { datasetService.deleteDataset(id); @@ -61,7 +61,7 @@ public class ReportDatasetController { @GetMapping("/dataset/{id}") @Operation(summary = "获得报表数据集") - @Parameter(name = "id", description = "编号", required = true, example = "1") + @Parameter(name = "id", description = "数据集id", required = true, example = "1") // @PreAuthorize("@ss.hasPermission('report:dataset:query')") public CommonResult getDataset(@PathVariable("id") Long id) { ReportDatasetDO dataset = datasetService.getDataset(id); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java index c9f73d2da..a2124531d 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/datasource/ReportDatasourceController.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import java.util.List; import java.util.Map; @@ -69,7 +70,7 @@ public class ReportDatasourceController { @DeleteMapping("/datasource/{id}") @Operation(summary = "删除报表数据源") - @Parameter(name = "id", description = "编号", required = true, example = "1") + @Parameter(name = "id", description = "数据源id", required = true, example = "1") // @PreAuthorize("@ss.hasPermission('report:datasource:delete')") public CommonResult deleteDatasource(@PathVariable("id") Long id) { datasourceService.deleteDatasource(id); @@ -78,7 +79,7 @@ public class ReportDatasourceController { @GetMapping("/datasource/{id}") @Operation(summary = "获取报表数据源") - @Parameter(name = "id", description = "编号", required = true, example = "1") + @Parameter(name = "id", description = "数据源id", required = true, example = "1") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") public CommonResult getDatasource(@PathVariable("id") Long id) { ReportDatasourceDO datasource = datasourceService.getDatasource(id); @@ -88,6 +89,7 @@ public class ReportDatasourceController { @GetMapping("/{templateId}/datasources") @Operation(summary = "获取报表模板下的报表数据源") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") + @Parameter(name = "templateId", description = "模版id", required = true) public CommonResult> getDatasourcePage(@PathVariable(value = "templateId") Long templateId) { return success(BeanUtils.toBean(datasourceService.getTemplateDatasourceList(ReportDatasourceReqVO.builder().templateId(templateId).build()), ReportDatasourceRespVO.class)); } @@ -99,10 +101,18 @@ public class ReportDatasourceController { return success(datasourceService.getBeanDatasourceList()); } + @GetMapping("/springbean/result/clazz") + @Operation(summary = "获取springbean数据源返回对象") + @Parameter(name = "clazz", description = "返回对象类路径全名不能为空", required = true) + public List springbeanFieldList(@RequestParam(value = "clazz") @NotEmpty(message = "类路径全名不能为空") String clazz) { + return datasourceService.getSpringBeanResultFieldList(clazz); + } + @GetMapping("/datasource/bean/methods") @Operation(summary = "获取springbean数据源方法类表") // @PreAuthorize("@ss.hasPermission('report:datasource:query')") - public CommonResult> getBeanDatasourceList(@RequestParam(value = "beanId") String beanId) { + @Parameter(name = "beanId", description = "springbeanId", required = true) + public CommonResult> getBeanDatasourceList(@RequestParam(value = "beanId") @NotEmpty(message = "beanId不能为空") String beanId) { return success(datasourceService.loadBeanMethods(beanId)); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java index 0d9bee876..2311a4ef7 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/controller/admin/template/ReportTemplateController.java @@ -39,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import java.io.OutputStream; import java.util.HashMap; @@ -79,7 +80,7 @@ public class ReportTemplateController { @DeleteMapping("/template/{id}") @Operation(summary = "删除报表模板信息") - @Parameter(name = "id", description = "编号", required = true) + @Parameter(name = "id", description = "模板id", required = true) // @PreAuthorize("@ss.hasPermission('report:template:delete')") public CommonResult deleteReportTemplate(@PathVariable("id") Long id) { templateService.deleteReportTemplate(id); @@ -88,7 +89,7 @@ public class ReportTemplateController { @GetMapping("/template/{id}") @Operation(summary = "获取报表模板信息") - @Parameter(name = "id", description = "编号", required = true, example = "1") + @Parameter(name = "id", description = "模板id", required = true, example = "1") // @PreAuthorize("@ss.hasPermission('report:template:query')") public CommonResult getReportTemplate(@PathVariable("id") Long id) { return success(templateService.getReportTemplateDefinition(id)); @@ -141,7 +142,7 @@ public class ReportTemplateController { @GetMapping("/scriptValidation") @Operation(summary = "校验表达式") @Parameter(name = "content", description = "表达式", required = true) - public List scriptValidation(@Param("content") String content) { + public List scriptValidation(@Param("content") @NotEmpty(message = "表达式不能为空") String content) { content = StringUtils.decode(content); ANTLRInputStream antlrInputStream = new ANTLRInputStream(content); ReportParserLexer lexer = new ReportParserLexer(antlrInputStream); @@ -163,7 +164,7 @@ public class ReportTemplateController { @GetMapping("/parseDataSet") @Operation(summary = "解析表达式中的数据集") @Parameter(name = "expr", description = "表达式", required = true) - public Map parseDatasetName(@Param("expr") String expr) { + public Map parseDatasetName(@Param("expr") @NotEmpty(message = "表达式不能为空") String expr) { ANTLRInputStream antlrInputStream = new ANTLRInputStream(expr); ReportParserLexer lexer = new ReportParserLexer(antlrInputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/framework/ureport/bean/MockSpringBeanDatasourceResult.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/framework/ureport/bean/MockSpringBeanDatasourceResult.java new file mode 100644 index 000000000..ab7334c59 --- /dev/null +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/framework/ureport/bean/MockSpringBeanDatasourceResult.java @@ -0,0 +1,16 @@ +package com.cf.imes.module.report.framework.ureport.bean; + +import lombok.Data; +import org.springframework.stereotype.Component; + +/** + * @author Gqr + * @since 2024/8/30 11:21 + */ +@Component +@Data +public class MockSpringBeanDatasourceResult { + private String key; + + private String value; +} diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java index a87036e9b..e459a74a3 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceService.java @@ -78,5 +78,11 @@ public interface ReportDatasourceService { */ List getTableFields(PreviewParams previewParams); - + /** + * 获取数据源 + * + * @param clazz + * @return + */ + List getSpringBeanResultFieldList(String clazz); } diff --git a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java index 41c87841c..4f3dbeb49 100644 --- a/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java +++ b/cf-module-report/cf-module-report-biz/src/main/java/com/cf/imes/module/report/service/datasource/ReportDatasourceServiceImpl.java @@ -1,9 +1,11 @@ package com.cf.imes.module.report.service.datasource; import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils; +import com.bstek.common.exception.ReportDesignException; import com.bstek.common.utils.MultipleJdbcTemplate; import com.bstek.datasource.bean.DataSourceInfo; import com.bstek.datasource.bean.PreviewParams; @@ -12,6 +14,7 @@ import com.bstek.ureport.definition.dataset.Parameter; import com.bstek.ureport.definition.dataset.SqlDatasetDefinition; import com.bstek.ureport.utils.ProcedureUtils; import com.cf.imes.framework.common.exception.ServiceException; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.module.report.controller.admin.dataset.vo.ReportDatasetReqVO; @@ -27,6 +30,7 @@ import com.cf.imes.module.report.service.dataset.ReportDatasetService; import com.cf.imes.module.report.util.SqlInjectionUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.jdbc.core.ResultSetExtractor; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -37,6 +41,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import javax.sql.DataSource; +import java.beans.PropertyDescriptor; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.ResultSetMetaData; @@ -51,6 +56,8 @@ import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_ILL import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_INJECTION_RISK; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASET_SQL_REQUIRED; import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_NOT_EXISTS; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_GET_FAIL; +import static com.cf.imes.module.report.enums.ErrorCodeConstants.DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL; /** * 报表数据源 Service 实现类 @@ -156,29 +163,39 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { @Override public List loadBeanMethods(String beanId) { - Object obj = applicationContext.getBean(beanId); - Class clazz = obj.getClass(); - Method[] methods = clazz.getMethods(); + Object obj; List result = new ArrayList(); - // ureport的springbean方法必须满足(String dsName, String datasetName, Map parameters) - for (Method method : methods) { - Class[] types = method.getParameterTypes(); - if (types.length != 3) { - continue; + try { + obj = applicationContext.getBean(beanId); + Class clazz = obj.getClass(); + Method[] methods = clazz.getMethods(); + + // ureport的springbean方法必须满足(String dsName, String datasetName, Map parameters) + for (Method method : methods) { + Class[] types = method.getParameterTypes(); + if (types.length != 3) { + continue; + } + Class typeClass1 = types[0]; + Class typeClass2 = types[1]; + Class typeClass3 = types[2]; + if (!String.class.isAssignableFrom(typeClass1)) { + continue; + } + if (!String.class.isAssignableFrom(typeClass2)) { + continue; + } + if (!Map.class.isAssignableFrom(typeClass3)) { + continue; + } + result.add(method.getName()); } - Class typeClass1 = types[0]; - Class typeClass2 = types[1]; - Class typeClass3 = types[2]; - if (!String.class.isAssignableFrom(typeClass1)) { - continue; - } - if (!String.class.isAssignableFrom(typeClass2)) { - continue; - } - if (!Map.class.isAssignableFrom(typeClass3)) { - continue; - } - result.add(method.getName()); + } catch (BeansException e) { + log.error("[ReportDatasourceService][loadBeanMethods]获取bean失败", e); + throw ServiceExceptionUtil.exception(DATASOURCE_SPRINGBEAN_GET_FAIL, beanId); + } catch (Exception e) { + log.error("[ReportDatasourceService][loadBeanMethods]方法列表获取异常", e); + throw ServiceExceptionUtil.exception(DATASOURCE_SPRINGBEAN_METHODS_GET_FAIL); } return result; } @@ -241,6 +258,26 @@ public class ReportDatasourceServiceImpl implements ReportDatasourceService { } } + @Override + public List getSpringBeanResultFieldList(String clazz) { + List result = new ArrayList(); + try { + Class targetClass = Class.forName(clazz); + PropertyDescriptor[] propertyDescriptors = BeanUtil.getPropertyDescriptors(targetClass); + for (PropertyDescriptor pd : propertyDescriptors) { + String name = pd.getName(); + if ("class".equals(name)) { + continue; + } + result.add(new Field(name)); + } + return result; + + } catch (Exception ex) { + throw new ReportDesignException(ex); + } + } + /** * 查询数据源下的数据集 * diff --git a/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar b/cf-module-report/cf-module-report-biz/src/main/resources/lib/ureport-core-2.3.0-SNAPSHOT.jar index ce94db844d365974151b1272f76f8aa338465bcf..dd9c515b3cced1090b0ebb4d65f60de11b855b19 100644 GIT binary patch delta 40022 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 R2Rd_Eu#~#pfYDv&{{V9+S!MtL delta 39256 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 From 4a7532a3621a22d95cf7b6c5ebe99b31baf0b500 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 30 Aug 2024 15:13:17 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=9A1=E3=80=81=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E5=A4=8D=E6=9D=82=E5=BA=A6=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E3=80=81=E9=95=BF=E5=BA=A6(6->8)=EF=BC=8C=E5=8F=AA=E6=9C=89?= =?UTF-8?q?=E5=B0=8F=E5=86=99->=E5=BF=85=E9=A1=BB=E6=9C=89=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E5=86=99=EF=BC=9B2=E3=80=81=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=87=87=E7=94=A8=E7=89=A9=E7=90=86=E5=88=A0?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E9=80=82=E9=85=8D=E7=94=A8=E6=88=B7=E8=A1=A8?= =?UTF-8?q?=E7=9A=84username=E5=94=AF=E4=B8=80=E7=B4=A2=E5=BC=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 9 ++---- .../dal/mysql/user/AdminUserMapper.java | 10 ++++++ .../service/user/AdminUserServiceImpl.java | 31 ++++++++++++------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index 910f015b4..1d174cbc3 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -46,18 +46,15 @@ public interface ErrorCodeConstants { ErrorCode USER_IS_DISABLE = new ErrorCode(1_002_003_006, "名字为【{}】的用户已被禁用"); ErrorCode USER_COUNT_MAX = new ErrorCode(1_002_003_008, "创建用户失败,原因:超过组织最大组织配额({})!"); ErrorCode USER_ME_ERROR = new ErrorCode(1_002_003_009, "不允许操作用户自身"); - - ErrorCode THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_6_CHARACTERS = new ErrorCode(1_002_003_010, "密码长度必须至少为6个字符"); - - ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LETTER = new ErrorCode(1_002_003_011, "密码必须包含至少一个字母"); - + ErrorCode THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS = new ErrorCode(1_002_003_010, "密码长度必须至少为8个字符"); + ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LOWER_LETTER = new ErrorCode(1_002_003_011, "密码必须包含至少一个小写字母"); ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_NUMBER = new ErrorCode(1_002_003_012, "密码必须包含至少一个数字"); ErrorCode PASSWORDS_CAN_ONLY_CONTAIN_LETTERS_AND_NUMBERS = new ErrorCode(1_002_003_013, "密码只能包含字母和数字"); ErrorCode INSUFFICIENT_PERMISSIONS = new ErrorCode(1_002_003_014, "当前用户权限不足,无法修改开料状态"); ErrorCode USERNAME_MULTIPLE_ERROR = new ErrorCode(1_002_003_015,"存在【{}】重复用户,请联系系统管理员"); ErrorCode USER_OPERATE_SELF_STATUS_ERROR = new ErrorCode(1_002_003_016, "不允许操作用户自身状态"); - + ErrorCode THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_UPPER_LETTER = new ErrorCode(1_002_003_017, "密码必须包含至少一个大写字母"); // ========== 部门模块 1-002-004-000 ========== ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1_002_004_000, "已经存在该名字的部门"); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java index cc79ad4c7..754c573d7 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java @@ -13,6 +13,7 @@ import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.system.controller.admin.user.vo.user.UserPageReqVO; import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; @@ -172,4 +173,13 @@ public interface AdminUserMapper extends BaseMapperX { */ @Select("SELECT username FROM system_users WHERE id = #{id} FOR UPDATE") AdminUserDO selectByIdForUpdate(@Param("id") Long id); + + /** + * 根据id物理删除user + * + * @param id + * @return 改动数量 + */ + @Delete("DELETE FROM system_users WHERE id = #{id}") + int physicalDeleteById(@Param("id") Long id); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java index 4c218da84..b9114ab9c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java @@ -114,8 +114,9 @@ public class AdminUserServiceImpl implements AdminUserService { // 定义密码校验的正则表达式 - private static final String LENGTH_PATTERN = ".{6,}"; - private static final String LETTER_PATTERN = ".*[A-Za-z].*"; + private static final String LENGTH_PATTERN = ".{8,}"; + private static final String UPPER_LETTER_PATTERN = ".*[A-Z].*"; + private static final String LOWER_LETTER_PATTERN = ".*[a-z].*"; private static final String DIGIT_PATTERN = ".*\\d.*"; private static final String VALID_CHAR_PATTERN = "^[A-Za-z\\d]+$"; @@ -320,12 +321,14 @@ public class AdminUserServiceImpl implements AdminUserService { checkCurrentWhenOperate(id); // 校验用户存在 validateUserExists(id); - // 删除用户 - userMapper.deleteById(id); - // 删除用户关联数据 - permissionService.processUserDeleted(id); - // 删除用户岗位 - userPostMapper.deleteByUserId(id); + // 物理删除用户 + int deleteNum = userMapper.physicalDeleteById(id); + if (deleteNum > 0) { + // 删除用户关联数据 + permissionService.processUserDeleted(id); + // 删除用户岗位 + userPostMapper.deleteByUserId(id); + } } @Override @@ -463,11 +466,15 @@ public class AdminUserServiceImpl implements AdminUserService { // 检查密码长度 if (!Pattern.matches(LENGTH_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_6_CHARACTERS); + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_LENGTH_MUST_BE_AT_LEAST_8_CHARACTERS); } - // 检查是否包含字母 - if (!Pattern.matches(LETTER_PATTERN, password)) { - throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LETTER); + // 检查是否包含大写字母 + if (!Pattern.matches(UPPER_LETTER_PATTERN, password)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_UPPER_LETTER); + } + // 检查是否包含小写字母 + if (!Pattern.matches(LOWER_LETTER_PATTERN, password)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.THE_PASSWORD_MUST_CONTAIN_AT_LEAST_ONE_LOWER_LETTER); } // 检查是否包含数字 if (!Pattern.matches(DIGIT_PATTERN, password)) {