From bb21405761fb8563b1856969e45cbc885e5734eb Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 09:02:28 +0800 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E7=94=A8=E6=88=B7=E5=90=8D=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/annotation/UserIdField.java | 14 ++ .../platform/annotation/UserNameField.java | 14 ++ .../common/utils/UserNameFillHelper.java | 190 ++++++++++++++++++ .../ApprovalChangeLogController.java | 7 +- .../data/domain/ApprovalChangeLog.java | 4 + .../service/IApprovalChangeLogService.java | 2 +- .../impl/ApprovalChangeLogServiceImpl.java | 72 +++---- 7 files changed, 265 insertions(+), 38 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/annotation/UserIdField.java create mode 100644 backend/src/main/java/com/yfd/platform/annotation/UserNameField.java create mode 100644 backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java diff --git a/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java b/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java new file mode 100644 index 0000000..43721a2 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/annotation/UserIdField.java @@ -0,0 +1,14 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记字段为用户ID字段,用于用户名称自动填充 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserIdField { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java b/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java new file mode 100644 index 0000000..583d9b8 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/annotation/UserNameField.java @@ -0,0 +1,14 @@ +package com.yfd.platform.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记字段为用户名字段,用于接收自动填充的用户名称 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserNameField { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java b/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java new file mode 100644 index 0000000..86157c4 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/common/utils/UserNameFillHelper.java @@ -0,0 +1,190 @@ +package com.yfd.platform.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.annotation.UserIdField; +import com.yfd.platform.annotation.UserNameField; +import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.mapper.SysUserMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Field; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户名称自动填充工具类 + *

+ * 使用方式: + * 1. 在实体类的用户ID字段上添加 @UserIdField 注解 + * 2. 在对应需要填充用户名的字段上添加 @UserNameField 注解 + * 3. 调用 {@link #fillUserNames(List)} 方法自动填充 + * + *

+ * 示例:
+ * {@code
+ * @Data
+ * public class MyEntity {
+ *     @UserIdField
+ *     private String userId;
+ *
+ *     @UserNameField
+ *     private String userName;
+ * }
+ *
+ * // 使用
+ * List list = ...;
+ * userNameFillHelper.fillUserNames(list);
+ * }
+ * 
+ */ +@Component +public class UserNameFillHelper { + + @Resource + private SysUserMapper sysUserMapper; + + /** + * 批量填充用户名称 + * + * @param list 需要填充的实体列表 + */ + public void fillUserNames(List list) { + if (CollUtil.isEmpty(list)) { + return; + } + + Class clazz = list.get(0).getClass(); + Field[] fields = clazz.getDeclaredFields(); + + Field idField = null; + Field nameField = null; + + for (Field field : fields) { + if (field.isAnnotationPresent(UserIdField.class)) { + idField = field; + idField.setAccessible(true); + } + if (field.isAnnotationPresent(UserNameField.class)) { + nameField = field; + nameField.setAccessible(true); + } + } + + if (idField == null || nameField == null) { + return; + } + + Set userIds = new HashSet<>(); + for (T item : list) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + userIds.add(idValue.toString()); + } + } catch (IllegalAccessException e) { + continue; + } + } + + if (userIds.isEmpty()) { + return; + } + + List users = sysUserMapper.selectBatchIds(userIds); + Map userNameMap = users.stream() + .collect(Collectors.toMap(SysUser::getId, SysUser::getNickname, (a, b) -> a)); + + for (T item : list) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + String userName = userNameMap.get(idValue.toString()); + nameField.set(item, StrUtil.blankToDefault(userName, "未知")); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + + /** + * 批量填充用户名称(支持多个用户ID字段) + *

+ * 使用方式:在实体类中定义多个 @UserIdField 和 @UserNameField 配对字段 + * + * @param list 需要填充的实体列表 + * @param idFields 用户ID字段名数组 + * @param nameFields 用户名字段名数组 + */ + public void fillUserNames(List list, String[] idFields, String[] nameFields) { + if (CollUtil.isEmpty(list) || idFields == null || nameFields == null || idFields.length != nameFields.length) { + return; + } + + Class clazz = list.get(0).getClass(); + Field[] allFields = clazz.getDeclaredFields(); + Map fieldMap = new HashMap<>(); + for (Field field : allFields) { + fieldMap.put(field.getName(), field); + } + + List idFieldList = new ArrayList<>(); + List nameFieldList = new ArrayList<>(); + for (String idFieldName : idFields) { + Field f = fieldMap.get(idFieldName); + if (f != null) { + f.setAccessible(true); + idFieldList.add(f); + } + } + for (String nameFieldName : nameFields) { + Field f = fieldMap.get(nameFieldName); + if (f != null) { + f.setAccessible(true); + nameFieldList.add(f); + } + } + + if (idFieldList.isEmpty() || nameFieldList.isEmpty()) { + return; + } + + Set userIds = new HashSet<>(); + for (T item : list) { + for (Field idField : idFieldList) { + try { + Object idValue = idField.get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + userIds.add(idValue.toString()); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + + if (userIds.isEmpty()) { + return; + } + + List users = sysUserMapper.selectBatchIds(userIds); + Map userNameMap = users.stream() + .collect(Collectors.toMap(SysUser::getId, SysUser::getNickname, (a, b) -> a)); + + for (T item : list) { + for (int i = 0; i < idFieldList.size() && i < nameFieldList.size(); i++) { + try { + Object idValue = idFieldList.get(i).get(item); + if (idValue != null && StrUtil.isNotBlank(idValue.toString())) { + String userName = userNameMap.get(idValue.toString()); + nameFieldList.get(i).set(item, StrUtil.blankToDefault(userName, "未知")); + } + } catch (IllegalAccessException e) { + continue; + } + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java index 26e019f..49a2d2f 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/ApprovalChangeLogController.java @@ -2,6 +2,7 @@ package com.yfd.platform.data.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.utils.UserNameFillHelper; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.data.domain.ApprovalChangeLog; import com.yfd.platform.data.domain.ApprovalLog; @@ -28,6 +29,9 @@ public class ApprovalChangeLogController { @Resource private IApprovalChangeLogService approvalChangeLogService; + @Resource + private UserNameFillHelper userNameFillHelper; + @GetMapping("/list") @Operation(summary = "查询变更记录列表") public ResponseResult list() { @@ -39,7 +43,8 @@ public class ApprovalChangeLogController { @Operation(summary = "分页查询变更记录列表(通用)") public ResponseResult queryPageList(@RequestBody DataSourceRequest request) { Page approvalChangeLogPage = DataSourceRequestUtil.executeQuery(request, ApprovalChangeLog.class, approvalChangeLogService); - approvalChangeLogService.fillUserNames(approvalChangeLogPage.getRecords()); + userNameFillHelper.fillUserNames(approvalChangeLogPage.getRecords()); + // approvalChangeLogService.fillUserNames(approvalChangeLogPage.getRecords()); return ResponseResult.successData(approvalChangeLogPage); } diff --git a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java index 171d46f..24673fd 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/ApprovalChangeLog.java @@ -1,6 +1,8 @@ package com.yfd.platform.data.domain; import com.baomidou.mybatisplus.annotation.*; +import com.yfd.platform.annotation.UserIdField; +import com.yfd.platform.annotation.UserNameField; import lombok.Data; import lombok.EqualsAndHashCode; @@ -59,12 +61,14 @@ public class ApprovalChangeLog implements Serializable { /** * 操作人ID */ + @UserIdField private String operatorId; /** * 操作人名称 */ @TableField(exist = false) + @UserNameField private String operatorName; /** diff --git a/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java index 756e9fb..92d7e2c 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java +++ b/backend/src/main/java/com/yfd/platform/data/service/IApprovalChangeLogService.java @@ -17,7 +17,7 @@ public interface IApprovalChangeLogService extends IService { */ List getByApprovalId(String approvalId); - void fillUserNames(List list); +// void fillUserNames(List list); /** * 根据草稿数据ID查询变更记录 diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java index c6dbc3c..0e4782a 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalChangeLogServiceImpl.java @@ -29,42 +29,42 @@ public class ApprovalChangeLogServiceImpl extends ServiceImpl getByApprovalId(String approvalId) { return approvalChangeLogMapper.selectByApprovalId(approvalId); } - @Override - public void fillUserNames(List list) { - if (list == null || list.isEmpty()) { - return; - } - - Set userIds = new HashSet<>(); - for (ApprovalChangeLog vo : list) { - if (StrUtil.isNotBlank(vo.getApprovalId())) { - userIds.add(vo.getApprovalId()); - } - if (StrUtil.isNotBlank(vo.getOperatorId())) { - userIds.add(vo.getOperatorId()); - } - } - - if (userIds.isEmpty()) { - return; - } - - Map userNameMap = new HashMap<>(); - List users = sysUserMapper.selectBatchIds(userIds); - for (SysUser user : users) { - userNameMap.put(user.getId(), user.getNickname()); - } - - for (ApprovalChangeLog vo : list) { - if (StrUtil.isNotBlank(vo.getApprovalId())) { - vo.setApprovalName(userNameMap.get(vo.getApprovalId())); - } - if (StrUtil.isNotBlank(vo.getOperatorId())) { - vo.setOperatorName(userNameMap.get(vo.getOperatorId())); - } - - } - } +// @Override +// public void fillUserNames(List list) { +// if (list == null || list.isEmpty()) { +// return; +// } +// +// Set userIds = new HashSet<>(); +// for (ApprovalChangeLog vo : list) { +// if (StrUtil.isNotBlank(vo.getApprovalId())) { +// userIds.add(vo.getApprovalId()); +// } +// if (StrUtil.isNotBlank(vo.getOperatorId())) { +// userIds.add(vo.getOperatorId()); +// } +// } +// +// if (userIds.isEmpty()) { +// return; +// } +// +// Map userNameMap = new HashMap<>(); +// List users = sysUserMapper.selectBatchIds(userIds); +// for (SysUser user : users) { +// userNameMap.put(user.getId(), user.getNickname()); +// } +// +// for (ApprovalChangeLog vo : list) { +// if (StrUtil.isNotBlank(vo.getApprovalId())) { +// vo.setApprovalName(userNameMap.get(vo.getApprovalId())); +// } +// if (StrUtil.isNotBlank(vo.getOperatorId())) { +// vo.setOperatorName(userNameMap.get(vo.getOperatorId())); +// } +// +// } +// } @Override public List getByDataId(String dataId) { return approvalChangeLogMapper.selectByDataId(dataId); From 8aaf35314407e4326c8d8c636c541390f999b60a Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 09:18:40 +0800 Subject: [PATCH 02/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/controller/SdHbrvDicController.java | 2 +- .../controller/SmsVerifyCodeController.java | 15 ++++++++------- .../system/domain/SmsVerifyCodeRequest.java | 13 +++++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdHbrvDicController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdHbrvDicController.java index 1b87633..5faa2c0 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdHbrvDicController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdHbrvDicController.java @@ -106,7 +106,7 @@ public class SdHbrvDicController { } @GetMapping("/regDropdown") - @Operation(summary = "下拉框列表查询") + @Operation(summary = "下拉框列表查询(注册)") public ResponseResult regDropdown( @RequestParam(required = false) String hbrvnm, @RequestParam(required = false) String baseid) { diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index 98b329a..5c9801d 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -9,6 +9,7 @@ import com.yfd.platform.system.service.ISmsVerifyCodeService; import com.yfd.platform.system.service.ISysLogService; import com.yfd.platform.system.service.IUserService; import com.yfd.platform.utils.RequestHolder; +import com.yfd.platform.utils.RsaUtils; import com.yfd.platform.utils.StringUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -94,37 +95,37 @@ public class SmsVerifyCodeController { @PostMapping("/register") @Operation(summary = "注册用户") public ResponseResult register(@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { - SysUser user = smsVerifyCodeRequest.getUser(); String code = smsVerifyCodeRequest.getCode(); - if (user.getPhone() == null || user.getPhone().isEmpty()) { + if (smsVerifyCodeRequest.getPhone() == null || smsVerifyCodeRequest.getPhone().isEmpty()) { return ResponseResult.error("手机号不能为空"); } - if (user.getUsername() == null || user.getUsername().isEmpty()) { + if (smsVerifyCodeRequest.getUsername() == null || smsVerifyCodeRequest.getUsername().isEmpty()) { return ResponseResult.error("用户名不能为空"); } - if (user.getPassword() == null || user.getPassword().isEmpty()) { + if (smsVerifyCodeRequest.getPassword() == null || smsVerifyCodeRequest.getPassword().isEmpty()) { return ResponseResult.error("密码不能为空"); } if (code == null || code.isEmpty()) { return ResponseResult.error("验证码不能为空"); } - boolean verified = smsVerifyCodeService.verifyCode(user.getPhone(), code, SmsVerifyCode.TYPE_REGISTER); + boolean verified = smsVerifyCodeService.verifyCode(smsVerifyCodeRequest.getPhone(), code, SmsVerifyCode.TYPE_REGISTER); if (!verified) { return ResponseResult.error("验证码错误或已过期"); } - SysUser existUser = userService.getUserByPhone(user.getPhone()); + SysUser existUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone()); if (existUser != null) { return ResponseResult.error("该手机号已注册"); } try { - com.yfd.platform.utils.RsaUtils.decryptByPrivateKey(privateKey, user.getPassword()); + RsaUtils.decryptByPrivateKey(privateKey, smsVerifyCodeRequest.getPassword()); } catch (Exception e) { return ResponseResult.error("密码解密失败"); } + SysUser user = new SysUser(); BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); user.setPassword(passwordEncoder.encode(user.getPassword())); user.setRegStatus(0); diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java index b7f59eb..b754e5d 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java @@ -19,15 +19,20 @@ public class SmsVerifyCodeRequest { */ private String code; + /** + * 用户名 + */ + private String username; + /** * 密码 */ private String password; - /** - * 用户 - */ - private SysUser user; +// /** +// * 用户 +// */ +// private SysUser user; /** * 流域编号 From 27c658f1499eb8a64857a659993db28f773b4eeb Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 11:16:12 +0800 Subject: [PATCH 03/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/controller/SdEngInfoBHController.java | 15 +++++++-------- .../env/domain/SdEngInfoBHRequest.java | 18 ++++++++++++++++++ .../com/yfd/platform/env/domain/SdFpssBH.java | 6 +++--- .../env/service/ISdEngInfoBHService.java | 5 +++-- .../service/impl/SdEngInfoBHServiceImpl.java | 17 +++++++++++++++-- .../controller/SmsVerifyCodeController.java | 3 ++- .../system/domain/SmsVerifyCodeRequest.java | 4 ++++ .../yfd/platform/system/domain/SysUser.java | 5 +++++ .../service/impl/SmsVerifyCodeServiceImpl.java | 2 +- 9 files changed, 58 insertions(+), 17 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/env/domain/SdEngInfoBHRequest.java diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdEngInfoBHController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdEngInfoBHController.java index e810b84..aa0f625 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdEngInfoBHController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdEngInfoBHController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.env.domain.SdEngInfoBH; +import com.yfd.platform.env.domain.SdEngInfoBHRequest; import com.yfd.platform.env.service.ISdEngInfoBHService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -69,18 +70,16 @@ public class SdEngInfoBHController { return ResponseResult.successData(engInfoBHService.getByRvcd(rvcd)); } - @GetMapping("/dropdown") + @PostMapping("/dropdown") @Operation(summary = "电站下拉列表(根据基地编码筛选 + 支持名称模糊搜索)") - public ResponseResult dropdown(@RequestParam(required = false) String baseId, - @RequestParam(required = false) String ennm) { - return ResponseResult.successData(engInfoBHService.selectForDropdown(baseId, ennm)); + public ResponseResult dropdown(@RequestBody SdEngInfoBHRequest sdEngInfoBHRequest) { + return ResponseResult.successData(engInfoBHService.selectForDropdown(sdEngInfoBHRequest)); } - @GetMapping("/regDropdown") + @PostMapping("/regDropdown") @Operation(summary = "电站下拉列表(根据基地编码筛选 + 支持名称模糊搜索)注册") - public ResponseResult regDropdown(@RequestParam(required = false) String baseId, - @RequestParam(required = false) String ennm) { - return ResponseResult.successData(engInfoBHService.selectRegDropdown(baseId, ennm)); + public ResponseResult regDropdown(@RequestBody SdEngInfoBHRequest sdEngInfoBHRequest) { + return ResponseResult.successData(engInfoBHService.selectRegDropdown(sdEngInfoBHRequest)); } @Log(module = "电站管理", value = "新增电站") diff --git a/backend/src/main/java/com/yfd/platform/env/domain/SdEngInfoBHRequest.java b/backend/src/main/java/com/yfd/platform/env/domain/SdEngInfoBHRequest.java new file mode 100644 index 0000000..58691ab --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/env/domain/SdEngInfoBHRequest.java @@ -0,0 +1,18 @@ +package com.yfd.platform.env.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SdEngInfoBHRequest { + private String baseId; + private List basIds; + private List hbrvcds; + private List rvcds; + private String ennm; +} diff --git a/backend/src/main/java/com/yfd/platform/env/domain/SdFpssBH.java b/backend/src/main/java/com/yfd/platform/env/domain/SdFpssBH.java index 993b6c5..1e0c733 100644 --- a/backend/src/main/java/com/yfd/platform/env/domain/SdFpssBH.java +++ b/backend/src/main/java/com/yfd/platform/env/domain/SdFpssBH.java @@ -228,7 +228,7 @@ public class SdFpssBH implements Serializable { /** * 鱼道或仿自然通道-流速,单位:m/s */ - private BigDecimal v; + private String v; /** * 仿自然通道断面形状 @@ -293,7 +293,7 @@ public class SdFpssBH implements Serializable { /** * 升鱼机集鱼槽流量,单位:m3/s */ - private BigDecimal syjq; + private String syjq; /** * 升鱼机断面尺寸(长*宽*高),单位:m @@ -303,7 +303,7 @@ public class SdFpssBH implements Serializable { /** * 升鱼机集鱼槽水深,单位:m */ - private BigDecimal syjwdp; + private String syjwdp; /** * 设计过鱼规模,单位:尾 diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java index 29de2f2..c99d88a 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdEngInfoBHService.java @@ -3,6 +3,7 @@ package com.yfd.platform.env.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdEngInfoBH; +import com.yfd.platform.env.domain.SdEngInfoBHRequest; import java.util.List; import java.util.Set; @@ -37,7 +38,7 @@ public interface ISdEngInfoBHService extends IService { /** * 电站下拉列表(根据基地编码筛选 + 支持名称模糊搜索) */ - List selectForDropdown(String baseId, String ennm); + List selectForDropdown(SdEngInfoBHRequest sdEngInfoBHRequest); Set getUserAuthorizedStationCodes(); @@ -56,5 +57,5 @@ public interface ISdEngInfoBHService extends IService { */ boolean deleteEngInfo(String stcd); - List selectRegDropdown(String baseId, String ennm); + List selectRegDropdown(SdEngInfoBHRequest sdEngInfoBHRequest); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java index 9219ece..60e4b2f 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdEngInfoBHServiceImpl.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.data.domain.SysUserDataScope; import com.yfd.platform.data.mapper.SysUserDataScopeMapper; import com.yfd.platform.env.domain.SdEngInfoBH; +import com.yfd.platform.env.domain.SdEngInfoBHRequest; import com.yfd.platform.env.mapper.SdEngInfoBHMapper; import com.yfd.platform.env.service.ISdEngInfoBHService; import com.yfd.platform.utils.SecurityUtils; @@ -65,9 +66,15 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl selectForDropdown(String baseId, String ennm) { + public List selectForDropdown(SdEngInfoBHRequest sdEngInfoBHRequest) { + String baseId = sdEngInfoBHRequest.getBaseId(); + String ennm = sdEngInfoBHRequest.getEnnm(); + List rvcds = sdEngInfoBHRequest.getRvcds(); + List hbrvcds = sdEngInfoBHRequest.getHbrvcds(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) + .in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getRvcd, rvcds) + .in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds) .like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm) .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm, SdEngInfoBH::getBaseId) .orderByAsc(SdEngInfoBH::getOrderIndex); @@ -143,9 +150,15 @@ public class SdEngInfoBHServiceImpl extends ServiceImpl selectRegDropdown(String baseId, String ennm) { + public List selectRegDropdown(SdEngInfoBHRequest sdEngInfoBHRequest) { + String baseId = sdEngInfoBHRequest.getBaseId(); + String ennm = sdEngInfoBHRequest.getEnnm(); + List rvcds = sdEngInfoBHRequest.getRvcds(); + List hbrvcds = sdEngInfoBHRequest.getHbrvcds(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(StringUtils.hasText(baseId), SdEngInfoBH::getBaseId, baseId) + .in(rvcds != null && !rvcds.isEmpty(), SdEngInfoBH::getRvcd, rvcds) + .in(hbrvcds != null && !hbrvcds.isEmpty(), SdEngInfoBH::getHbrvcd, hbrvcds) .like(StringUtils.hasText(ennm), SdEngInfoBH::getEnnm, ennm) .select(SdEngInfoBH::getStcd, SdEngInfoBH::getEnnm, SdEngInfoBH::getBaseId) .orderByAsc(SdEngInfoBH::getOrderIndex); diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index 5c9801d..ff63053 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -129,6 +129,7 @@ public class SmsVerifyCodeController { BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); user.setPassword(passwordEncoder.encode(user.getPassword())); user.setRegStatus(0); + user.setBelongingUnit(smsVerifyCodeRequest.getBelongingUnit()); user.setRegTime(new Date()); user.setStatus(1); user.setUsertype(1); @@ -184,7 +185,7 @@ public class SmsVerifyCodeController { /** * 验证验证码是否有效 */ - @GetMapping("/verifyCode") + @PostMapping("/verifyCode") @Operation(summary = "验证验证码") public ResponseResult verifyCode(@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String phone = smsVerifyCodeRequest.getPhone(); diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java index b754e5d..5a6e97b 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java @@ -24,6 +24,10 @@ public class SmsVerifyCodeRequest { */ private String username; + private String realName; + + private String belongingUnit; + /** * 密码 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index ed9b24f..bdf5fb3 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -131,6 +131,11 @@ public class SysUser implements Serializable { */ private String auditUser; + /** + * 所属单位 + */ + private String belongingUnit; + /** * 审核时间 */ diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java index 8e0c91f..2b939eb 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java @@ -21,7 +21,7 @@ import java.util.Random; @Service public class SmsVerifyCodeServiceImpl extends ServiceImpl implements ISmsVerifyCodeService { - private static final int CODE_VALID_MINUTES = 1; + private static final int CODE_VALID_MINUTES = 5; private static final Random RANDOM = new Random(); @Resource From 8f420250646ac21718274e7f97ac54982157c958 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 14:14:06 +0800 Subject: [PATCH 04/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/UserController.java | 10 +++--- .../system/domain/SysUserRequest.java | 34 +++++++++++++++++++ .../platform/system/service/IUserService.java | 2 +- .../system/service/impl/UserServiceImpl.java | 15 +++++--- .../resources/mapper/system/SysUserMapper.xml | 1 + 5 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java diff --git a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java index 6c9d287..6a569ae 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java @@ -6,6 +6,7 @@ import com.yfd.platform.annotation.Log; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.datasource.DataSource; import com.yfd.platform.system.domain.SysUser; +import com.yfd.platform.system.domain.SysUserRequest; import com.yfd.platform.system.service.IUserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -205,8 +206,9 @@ public class UserController { @PostMapping("/auditUser") @Operation(summary = "审核用户注册") @ResponseBody - public ResponseResult auditUser(@RequestParam String userId, - @RequestParam Integer auditStatus) { + public ResponseResult auditUser(@RequestBody SysUserRequest sysUserRequest) { + String userId = sysUserRequest.getUserId(); + Integer auditStatus = sysUserRequest.getRegStatus(); if (userId == null || userId.isEmpty()) { return ResponseResult.error("用户ID不能为空"); } @@ -224,8 +226,8 @@ public class UserController { @GetMapping("/queryPendingAuditUsers") @Operation(summary = "查询待审核用户列表") @ResponseBody - public ResponseResult queryPendingAuditUsers(Page page) { - Page result = userService.queryPendingAuditUsers(page); + public ResponseResult queryPendingAuditUsers(Page page,String name,String regStatus) { + Page result = userService.queryPendingAuditUsers(page,name,regStatus); return ResponseResult.successData(result); } } diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java new file mode 100644 index 0000000..d1847ac --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java @@ -0,0 +1,34 @@ +package com.yfd.platform.system.domain; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserRequest { + + /** + * 用户ID + */ + private String userId; + + /** + * 用户ID + */ + private List userIds; + + /** + * 审核状态 + */ + private Integer regStatus; + + /** + * 审批意见 + */ + private String commentInfo; +} diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index f86da52..266b4e1 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -170,6 +170,6 @@ public interface IUserService extends IService { *page 分页参数 * 返回值说明: 待审核用户分页列表 ************************************/ - Page queryPendingAuditUsers(Page page); + Page queryPendingAuditUsers(Page page,String name, String regStatus); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 537a57f..5831e27 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -18,6 +18,7 @@ import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.mapper.SysUserMapper; import com.yfd.platform.system.service.IUserService; import com.yfd.platform.utils.FileUtil; +import com.yfd.platform.utils.SecurityUtils; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import com.yfd.platform.config.FileSpaceProperties; @@ -515,7 +516,7 @@ public class UserServiceImpl extends ServiceImpl impleme Page page) { Page mapPage = sysUserMapper.queryUsers(orgid, username, page); - ;mapPage.getRecords().forEach(record -> { + mapPage.getRecords().forEach(record -> { String id = record.getId(); List sysRoles = sysRoleMapper.getRoleByUserId(id); record.setRoles(sysRoles); @@ -584,7 +585,7 @@ public class UserServiceImpl extends ServiceImpl impleme UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", userId) .set("reg_status", auditStatus) - .set("audit_user", getUsername()) + .set("audit_user", SecurityUtils.getUserId()) .set("audit_time", new Timestamp(System.currentTimeMillis())) .set("lastmodifydate", new Timestamp(System.currentTimeMillis())) .set("lastmodifier", getUsername()); @@ -597,9 +598,15 @@ public class UserServiceImpl extends ServiceImpl impleme } @Override - public Page queryPendingAuditUsers(Page page) { + public Page queryPendingAuditUsers(Page page,String name,String regStatus) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysUser::getRegStatus, 0); + queryWrapper.in(SysUser::getRegStatus, 0,1,2); + queryWrapper.eq(SysUser::getRegStatus, regStatus); + queryWrapper.and(StrUtil.isNotBlank(name), wrapper -> + wrapper.like(SysUser::getNickname, name) + .or() + .like(SysUser::getRealName, name) + ); queryWrapper.orderByDesc(SysUser::getRegTime); return this.page(page, queryWrapper); } diff --git a/backend/src/main/resources/mapper/system/SysUserMapper.xml b/backend/src/main/resources/mapper/system/SysUserMapper.xml index dfc56f0..ac59b81 100644 --- a/backend/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/src/main/resources/mapper/system/SysUserMapper.xml @@ -70,6 +70,7 @@ FROM sys_user u where 1=1 + and (u.REG_STATUS!=0 and u.REG_STATUS !=2) and u.usertype != 0 and u.orgid = #{orgid} From 864d9b31d42d9603a85f86cf4becfaf71c866060 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 16:38:01 +0800 Subject: [PATCH 05/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/config/SecurityConfig.java | 1 + .../data/controller/FishDraftDataController.java | 3 +++ .../yfd/platform/data/domain/FishDraftData.java | 6 ++++++ .../data/service/impl/FishImportServiceImpl.java | 7 ++++--- .../com/yfd/platform/env/domain/SdHycdDic.java | 11 +---------- .../controller/SmsVerifyCodeController.java | 15 ++++++++++++++- .../system/domain/SmsVerifyCodeRequest.java | 6 ++++++ .../yfd/platform/system/service/IUserService.java | 2 +- 8 files changed, 36 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index 2bcef19..e249dc7 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -53,6 +53,7 @@ public class SecurityConfig { .authorizeHttpRequests(auth -> auth .requestMatchers("/user/login").anonymous() .requestMatchers("/user/code").permitAll() + .requestMatchers("/system/user/auditUser").permitAll() .requestMatchers("/eng/**").permitAll() .requestMatchers("/env/**").permitAll() .requestMatchers("/sw/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index 85a449d..cf2b1d4 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -401,6 +401,9 @@ public class FishDraftDataController { importResult.getExcelFileName() : ""); map.put("failedRowDetails", importResult.getFailedRows() != null ? importResult.getFailedRows() : new ArrayList<>()); + + map.put("successRowDetails", importResult.getSuccessRows() != null ? + importResult.getSuccessRows() : new ArrayList<>()); return map; } diff --git a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java index dc6d5a4..530d0b7 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java @@ -221,6 +221,12 @@ public class FishDraftData implements Serializable { @TableField(exist = false) private String stnm; + /** + * 电站编码名称 + */ + @TableField(exist = false) + private String rstcd; + /** * 鱼类名称 */ diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index bd5d998..c9b4fb6 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -197,6 +197,7 @@ public class FishImportServiceImpl implements IFishImportService { data.setEnnm(cellValue.trim()); } else { data.setEnnm(cellValue.trim()); + data.setRstcd(stcd); } } break; @@ -274,12 +275,12 @@ public class FishImportServiceImpl implements IFishImportService { break; case "wt": if (!StringUtils.hasText(cellValue)) { - importRow.getWarnings().add(fieldName); +// importRow.getWarnings().add(fieldName); data.setWt(parseBigDecimal(cellValue)); } else { BigDecimal wt = parseBigDecimal(cellValue); if (wt == null) { - importRow.getWarnings().add(fieldName); +// importRow.getWarnings().add(fieldName); data.setWt(parseBigDecimal(cellValue)); } data.setWt(wt); @@ -344,7 +345,7 @@ public class FishImportServiceImpl implements IFishImportService { data.setStcd(cellValue.trim()); data.setStnm(cellValue.trim()); } else { - data.setStnm(stcd); + data.setStnm(cellValue.trim()); data.setStcd(stcd); } } diff --git a/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java b/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java index edf1562..48ea9e4 100644 --- a/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java +++ b/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java @@ -49,15 +49,6 @@ public class SdHycdDic implements Serializable { */ private Integer orderIndex; - /** - * 中心经度 - */ - private String lgtd; - - /** - * 中心纬度 - */ - private String lttd; /** * 所属国家,关联SD_COUNTRY_B.COUNTRY_ID @@ -72,7 +63,7 @@ public class SdHycdDic implements Serializable { /** * 简介 */ - private String des; + private String introduce; /** * 介绍图片 diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index ff63053..c3a0746 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -131,10 +131,14 @@ public class SmsVerifyCodeController { user.setRegStatus(0); user.setBelongingUnit(smsVerifyCodeRequest.getBelongingUnit()); user.setRegTime(new Date()); + user.setNickname(smsVerifyCodeRequest.getRealName()); user.setStatus(1); + user.setOrgid("e90063ced25e3d469860e88d920c082f"); user.setUsertype(1); - + user.setUsername(smsVerifyCodeRequest.getUsername()); boolean success = userService.save(user); + // 给注册用户加上默认权限 + this.addDefaultRole(smsVerifyCodeRequest); if (success) { return ResponseResult.success(); } else { @@ -142,6 +146,15 @@ public class SmsVerifyCodeController { } } + private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) { + String stationCode = smsVerifyCodeRequest.getStationCode(); + String companyCode = smsVerifyCodeRequest.getCompanyCode(); + String groupCode = smsVerifyCodeRequest.getGroupCode(); + String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); + + return true; + } + /** * 找回密码 */ diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java index 5a6e97b..70c3cb9 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCodeRequest.java @@ -42,6 +42,12 @@ public class SmsVerifyCodeRequest { * 流域编号 */ private String rvcdCode; + + /** + * 流域编号 + */ + private String hbrvcdCode; + /** * 集团编号 */ diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index 266b4e1..2674275 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -170,6 +170,6 @@ public interface IUserService extends IService { *page 分页参数 * 返回值说明: 待审核用户分页列表 ************************************/ - Page queryPendingAuditUsers(Page page,String name, String regStatus); + Page queryPendingAuditUsers(Page page,String name, Integer regStatus); } From 26931a5fbc9276be7725e129a4a70e22a90b6c1d Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 16:38:15 +0800 Subject: [PATCH 06/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/UserController.java | 4 +-- .../system/service/impl/UserServiceImpl.java | 24 +++++++------- .../resources/mapper/system/SysUserMapper.xml | 31 ++++++++++++------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java index 6a569ae..53ee18c 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java @@ -202,7 +202,7 @@ public class UserController { return ResponseResult.success(); } - @Log(module = "系统用户", value = "审核用户注册") +// @Log(module = "系统用户", value = "审核用户注册") @PostMapping("/auditUser") @Operation(summary = "审核用户注册") @ResponseBody @@ -226,7 +226,7 @@ public class UserController { @GetMapping("/queryPendingAuditUsers") @Operation(summary = "查询待审核用户列表") @ResponseBody - public ResponseResult queryPendingAuditUsers(Page page,String name,String regStatus) { + public ResponseResult queryPendingAuditUsers(Page page,String name,Integer regStatus) { Page result = userService.queryPendingAuditUsers(page,name,regStatus); return ResponseResult.successData(result); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 5831e27..12e0245 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -1,9 +1,11 @@ package com.yfd.platform.system.service.impl; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -582,26 +584,26 @@ public class UserServiceImpl extends ServiceImpl impleme @Override public boolean auditUser(String userId, Integer auditStatus) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", userId) - .set("reg_status", auditStatus) - .set("audit_user", SecurityUtils.getUserId()) - .set("audit_time", new Timestamp(System.currentTimeMillis())) - .set("lastmodifydate", new Timestamp(System.currentTimeMillis())) - .set("lastmodifier", getUsername()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(SysUser::getId, userId) + .set(SysUser::getRegStatus, auditStatus) + .set(SysUser::getAuditUser, SecurityUtils.getUserId()) + .set(SysUser::getAuditTime, new Timestamp(System.currentTimeMillis())) + .set(SysUser::getLastmodifydate, new Timestamp(System.currentTimeMillis())) + .set(SysUser::getLastmodifier, SecurityUtils.getCurrentUsername()); if (auditStatus == 1) { - updateWrapper.set("status", 1); + updateWrapper.set(SysUser::getStatus, 1); } else if (auditStatus == 2) { - updateWrapper.set("status", 0); + updateWrapper.set(SysUser::getStatus, 0); } return this.update(updateWrapper); } @Override - public Page queryPendingAuditUsers(Page page,String name,String regStatus) { + public Page queryPendingAuditUsers(Page page,String name,Integer regStatus) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SysUser::getRegStatus, 0,1,2); - queryWrapper.eq(SysUser::getRegStatus, regStatus); + queryWrapper.eq(ObjectUtil.isNotEmpty(regStatus),SysUser::getRegStatus, regStatus); queryWrapper.and(StrUtil.isNotBlank(name), wrapper -> wrapper.like(SysUser::getNickname, name) .or() diff --git a/backend/src/main/resources/mapper/system/SysUserMapper.xml b/backend/src/main/resources/mapper/system/SysUserMapper.xml index ac59b81..70ac49a 100644 --- a/backend/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/src/main/resources/mapper/system/SysUserMapper.xml @@ -69,9 +69,10 @@ u.lastmodifydate FROM sys_user u - where 1=1 - and (u.REG_STATUS!=0 and u.REG_STATUS !=2) - and u.usertype != 0 + WHERE + 1 = 1 + AND ( ( u.REG_STATUS != 0 AND u.REG_STATUS != 2 ) OR u.REG_STATUS IS NULL ) + AND u.usertype != 0 and u.orgid = #{orgid} @@ -81,15 +82,21 @@ ORDER BY u.lastmodifydate DESC From 15c5938dfe2ef4dba33c10ac42b8b5fb804667e7 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 18:10:47 +0800 Subject: [PATCH 07/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/FishImportServiceImpl.java | 10 ++-- .../env/controller/SdHycdDicController.java | 10 ++-- .../yfd/platform/env/domain/SdHycdDic.java | 2 +- .../env/service/ISdHycdDicService.java | 4 +- .../service/impl/SdHycdDicServiceImpl.java | 6 ++- .../controller/SmsVerifyCodeController.java | 48 ++++++++++++------- .../yfd/platform/system/domain/LoginUser.java | 2 +- .../platform/system/domain/SmsVerifyCode.java | 1 + .../system/service/impl/UserServiceImpl.java | 8 +++- 9 files changed, 61 insertions(+), 30 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index c9b4fb6..30a1dbe 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -188,12 +188,13 @@ public class FishImportServiceImpl implements IFishImportService { switch (fieldName) { case "stationName": if (!StringUtils.hasText(cellValue)) { - importRow.getWarnings().add("ennm"); + importRow.getWarnings().add("rstcd"); data.setEnnm(cellValue.trim()); + data.setRstcd(cellValue); } else { String stcd = resolveStationCode(cellValue.trim()); if (stcd == null) { - importRow.getWarnings().add("ennm"); + importRow.getWarnings().add("rstcd"); data.setEnnm(cellValue.trim()); } else { data.setEnnm(cellValue.trim()); @@ -330,6 +331,8 @@ public class FishImportServiceImpl implements IFishImportService { if (StringUtils.hasText(cellValue)) { String isfs = resolveIsfs(cellValue.trim(), importRow); data.setIsfs("1".equals(isfs) ? 1 : 0); + }else{ + importRow.getWarnings().add("isfs"); } break; case "sourceType": @@ -337,7 +340,8 @@ public class FishImportServiceImpl implements IFishImportService { break; case "stnm": if (!StringUtils.hasText(cellValue)) { - missingRequiredFields.add("stcd"); + importRow.getWarnings().add("stcd"); + data.setStcd(cellValue); } else { String stcd = resolveFpssCode(cellValue.trim()); if (stcd == null) { diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java index db5351f..d90c726 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java @@ -66,16 +66,18 @@ public class SdHycdDicController { @Operation(summary = "下拉框列表查询") public ResponseResult selectForDropdown( @RequestParam(required = false) String hynm, - @RequestParam(required = false) Integer grd) { - return ResponseResult.successData(hycdDicService.selectForDropdown(hynm, grd)); + @RequestParam(required = false) Integer grd, + @RequestParam(required = false) Integer lx) { + return ResponseResult.successData(hycdDicService.selectForDropdown(hynm, grd,lx)); } @GetMapping("/regDropdown") @Operation(summary = "下拉框列表查询(注册)") public ResponseResult regDropdown( @RequestParam(required = false) String hynm, - @RequestParam(required = false) Integer grd) { - return ResponseResult.successData(hycdDicService.regDropdown(hynm, grd)); + @RequestParam(required = false) Integer grd, + @RequestParam(required = false) Integer lx) { + return ResponseResult.successData(hycdDicService.regDropdown(hynm, grd,lx)); } diff --git a/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java b/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java index 48ea9e4..aadce20 100644 --- a/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java +++ b/backend/src/main/java/com/yfd/platform/env/domain/SdHycdDic.java @@ -78,6 +78,6 @@ public class SdHycdDic implements Serializable { /** * 类型 1:集团 ;2:公司 */ - private String lx; + private Integer lx; } diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java index ea2c24a..35a5214 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java @@ -46,7 +46,7 @@ public interface ISdHycdDicService extends IService { /** * 下拉框列表查询(支持名称和级别过滤) */ - List selectForDropdown(String hynm, Integer grd); + List selectForDropdown(String hynm, Integer grd,Integer lx); - List regDropdown(String hynm, Integer grd); + List regDropdown(String hynm, Integer grd,Integer lx); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java index 2c0e4f7..00b0ebf 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java @@ -58,19 +58,21 @@ public class SdHycdDicServiceImpl extends ServiceImpl selectForDropdown(String hynm, Integer grd) { + public List selectForDropdown(String hynm, Integer grd, Integer lx) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm) .eq(grd != null, SdHycdDic::getGrd, grd) + .eq(lx != null, SdHycdDic::getLx, lx) .orderByAsc(SdHycdDic::getOrderIndex) .list(); } @Override - public List regDropdown(String hynm, Integer grd) { + public List regDropdown(String hynm, Integer grd,Integer lx) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm) .eq(grd != null, SdHycdDic::getGrd, grd) + .eq(lx != null, SdHycdDic::getLx, lx) .orderByAsc(SdHycdDic::getOrderIndex) .list(); } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index c3a0746..7daf181 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -23,9 +23,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.web.bind.annotation.*; import java.sql.Timestamp; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** *

@@ -60,26 +58,42 @@ public class SmsVerifyCodeController { public ResponseResult sendVerifyCode(@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String phone = smsVerifyCodeRequest.getPhone(); Integer type = smsVerifyCodeRequest.getType(); + if (phone == null || phone.isEmpty()) { return ResponseResult.error("手机号不能为空"); } - if (type == null || (!type.equals(SmsVerifyCode.TYPE_REGISTER) && !type.equals(SmsVerifyCode.TYPE_FIND_PASSWORD))) { - return ResponseResult.error("类型错误:1-注册 2-找回密码"); + if (type == null) { + return ResponseResult.error("类型不能为空:1-注册 2-找回密码 3-登录"); } + // 1. 注册验证码校验 if (type.equals(SmsVerifyCode.TYPE_REGISTER)) { SysUser existUser = userService.getUserByPhone(phone); if (existUser != null) { return ResponseResult.error("该手机号已注册"); } } - - if (type.equals(SmsVerifyCode.TYPE_FIND_PASSWORD)) { + // 2. 找回密码验证码校验 + else if (type.equals(SmsVerifyCode.TYPE_FIND_PASSWORD)) { SysUser existUser = userService.getUserByPhone(phone); if (existUser == null) { return ResponseResult.error("该手机号未注册"); } } + // 3. 登录验证码校验(新增) + else if (type.equals(SmsVerifyCode.TYPE_LOGIN)) { + SysUser existUser = userService.getUserByPhone(phone); + if (existUser == null) { + return ResponseResult.error("该手机号未注册,请先注册"); + } + // 可选:如果用户状态异常(如被禁用),也可以在此处拦截 + // if (existUser.getStatus() == 0) { + // return ResponseResult.error("账号已被禁用"); + // } + } + else { + return ResponseResult.error("类型错误:1-注册 2-找回密码 3-登录"); + } String code = smsVerifyCodeService.sendVerifyCode(phone, type); if (code == null) { @@ -89,6 +103,7 @@ public class SmsVerifyCodeController { return ResponseResult.success(); } + /** * 注册用户 */ @@ -118,17 +133,16 @@ public class SmsVerifyCodeController { if (existUser != null) { return ResponseResult.error("该手机号已注册"); } - + SysUser user = new SysUser(); try { - RsaUtils.decryptByPrivateKey(privateKey, smsVerifyCodeRequest.getPassword()); + String password = RsaUtils.decryptByPrivateKey(privateKey, smsVerifyCodeRequest.getPassword()); + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + user.setPassword(passwordEncoder.encode(password)); } catch (Exception e) { return ResponseResult.error("密码解密失败"); } - - SysUser user = new SysUser(); - BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - user.setPassword(passwordEncoder.encode(user.getPassword())); user.setRegStatus(0); + user.setPhone(smsVerifyCodeRequest.getPhone()); user.setBelongingUnit(smsVerifyCodeRequest.getBelongingUnit()); user.setRegTime(new Date()); user.setNickname(smsVerifyCodeRequest.getRealName()); @@ -151,7 +165,9 @@ public class SmsVerifyCodeController { String companyCode = smsVerifyCodeRequest.getCompanyCode(); String groupCode = smsVerifyCodeRequest.getGroupCode(); String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); - + List roleIds=new ArrayList<>(); + roleIds.add("c13481a486c9ee559cf305284df4d207"); + roleIds.add("c13481a486c9ee559cf305284df4d207"); return true; } @@ -227,7 +243,7 @@ public class SmsVerifyCodeController { return ResponseResult.error("验证码不能为空"); } - boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_REGISTER); + boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_LOGIN); if (!verified) { return ResponseResult.error("验证码错误或已过期"); } @@ -290,7 +306,7 @@ public class SmsVerifyCodeController { webConfig.loginuserCache().put("login:" + userId, jsonStr); webConfig.loginuserCache().put("expire_time:" + userId, map.get("expire_time").toString()); - map.put("user", user); +// map.put("user", user); return ResponseResult.successData(map); } diff --git a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java index 902c628..1115c79 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java @@ -22,7 +22,7 @@ public class LoginUser implements UserDetails { private String username; - private List permissions; + private List permissions=new ArrayList<>(); public LoginUser(SysUser user, List permissions) { this.user = user; diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCode.java b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCode.java index 2cc1351..988e35a 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCode.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SmsVerifyCode.java @@ -23,6 +23,7 @@ public class SmsVerifyCode implements Serializable { public static final Integer TYPE_REGISTER = 1; public static final Integer TYPE_FIND_PASSWORD = 2; + public static final Integer TYPE_LOGIN = 3; public static final Integer STATUS_UNUSED = 0; public static final Integer STATUS_USED = 1; diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 12e0245..602f121 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -610,7 +610,13 @@ public class UserServiceImpl extends ServiceImpl impleme .like(SysUser::getRealName, name) ); queryWrapper.orderByDesc(SysUser::getRegTime); - return this.page(page, queryWrapper); + Page mapPage = this.page(page, queryWrapper); + mapPage.getRecords().forEach(record -> { + String id = record.getId(); + List sysRoles = sysRoleMapper.getRoleByUserId(id); + record.setRoles(sysRoles); + }); + return mapPage; } /*********************************** From 2ecb68fbb69cf37c4a6cc4d9cc715e854cdf550b Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 18:36:12 +0800 Subject: [PATCH 08/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=92=8C=E9=AA=8C=E8=AF=81=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/yfd/platform/config/SecurityConfig.java | 1 + .../platform/data/service/impl/FishImportServiceImpl.java | 8 ++++---- .../system/controller/SmsVerifyCodeController.java | 6 +++++- .../yfd/platform/system/service/impl/UserServiceImpl.java | 3 +-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index e249dc7..108616e 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -53,6 +53,7 @@ public class SecurityConfig { .authorizeHttpRequests(auth -> auth .requestMatchers("/user/login").anonymous() .requestMatchers("/user/code").permitAll() + .requestMatchers("/sms/resetPassword").permitAll() .requestMatchers("/system/user/auditUser").permitAll() .requestMatchers("/eng/**").permitAll() .requestMatchers("/env/**").permitAll() diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java index 30a1dbe..37fc0d2 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishImportServiceImpl.java @@ -439,7 +439,7 @@ public class FishImportServiceImpl implements IFishImportService { return STATION_NAME_CACHE.get(lowerName); } for (Map.Entry entry : STATION_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { + if (entry.getKey().contains(lowerName)) { return entry.getValue(); } } @@ -455,7 +455,7 @@ public class FishImportServiceImpl implements IFishImportService { return FPSS_BH_CACHE.get(lowerName); } for (Map.Entry entry : FPSS_BH_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { + if (entry.getKey().contains(lowerName)) { return entry.getValue(); } } @@ -487,7 +487,7 @@ public class FishImportServiceImpl implements IFishImportService { return BASE_NAME_CACHE.get(lowerName); } for (Map.Entry entry : BASE_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { + if (entry.getKey().contains(lowerName)) { return entry.getValue(); } } @@ -503,7 +503,7 @@ public class FishImportServiceImpl implements IFishImportService { return RIVER_NAME_CACHE.get(lowerName); } for (Map.Entry entry : RIVER_NAME_CACHE.entrySet()) { - if (entry.getKey().contains(lowerName) || lowerName.contains(entry.getKey())) { + if (entry.getKey().contains(lowerName)) { return entry.getValue(); } } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index 7daf181..774df19 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -199,7 +199,11 @@ public class SmsVerifyCodeController { if (existUser == null) { return ResponseResult.error("该手机号未注册"); } - + try { + password = RsaUtils.decryptByPrivateKey(privateKey, smsVerifyCodeRequest.getPassword()); + } catch (Exception e) { + return ResponseResult.error("密码解密失败"); + } BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); String encryptedPassword = passwordEncoder.encode(password); diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 602f121..383e7a3 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -577,8 +577,7 @@ public class UserServiceImpl extends ServiceImpl impleme updateWrapper.eq("phone", phone) .set("password", encryptedPassword) .set("pwdresettime", new Timestamp(System.currentTimeMillis())) - .set("lastmodifydate", new Timestamp(System.currentTimeMillis())) - .set("lastmodifier", getUsername()); + .set("lastmodifydate", new Timestamp(System.currentTimeMillis())); return this.update(updateWrapper); } From 8ed2545759583e885f23f447f90b3a77b85c26fa Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 28 Apr 2026 19:13:19 +0800 Subject: [PATCH 09/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=94=A8=E6=88=B7=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SdFishDictoryBController.java | 13 +- .../env/service/ISdFishDictoryBService.java | 4 + .../impl/SdFishDictoryBServiceImpl.java | 115 ++++++++++++++++++ .../controller/SmsVerifyCodeController.java | 18 ++- .../yfd/platform/system/domain/LoginUser.java | 8 +- .../yfd/platform/system/domain/SysUser.java | 9 ++ 6 files changed, 158 insertions(+), 9 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java index 25d4586..d7c6ee7 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdFishDictoryBController.java @@ -1,6 +1,7 @@ package com.yfd.platform.env.controller; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.annotation.Log; import com.yfd.platform.common.DataSourceRequest; @@ -55,8 +56,8 @@ public class SdFishDictoryBController { @Operation(summary = "根据名称查询所有鱼类字典") public ResponseResult listByName(@RequestParam(required = false) String name) { return ResponseResult.successData(sdFishDictoryBService.list( - new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() - .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name) + new LambdaQueryWrapper() + .eq(StrUtil.isNotBlank(name), SdFishDictoryB::getName, name).select(SdFishDictoryB::getId, SdFishDictoryB::getName, SdFishDictoryB::getAlias) )); } @@ -89,4 +90,12 @@ public class SdFishDictoryBController { boolean result = sdFishDictoryBService.deleteById(id); return result ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); } + + @GetMapping("/similar") + @Operation(summary = "查询相似鱼类列表") + public ResponseResult findSimilarFish( + @RequestParam String name, + @RequestParam(required = false, defaultValue = "10") Integer limit) { + return ResponseResult.successData(sdFishDictoryBService.findSimilarFish(name, limit)); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java index 05e03b8..0080982 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdFishDictoryBService.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.env.domain.SdFishDictoryB; +import java.util.List; + public interface ISdFishDictoryBService extends IService { Page selectPage(String name, String code, Integer type, Integer rare, Page page); @@ -15,4 +17,6 @@ public interface ISdFishDictoryBService extends IService { boolean deleteById(String id); SdFishDictoryB getById(String id); + + List findSimilarFish(String name, Integer limit); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java index 4a118c0..db00ef3 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdFishDictoryBServiceImpl.java @@ -9,6 +9,9 @@ import com.yfd.platform.env.service.ISdFishDictoryBService; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.util.*; +import java.util.stream.Collectors; + @Service public class SdFishDictoryBServiceImpl extends ServiceImpl implements ISdFishDictoryBService { @@ -62,4 +65,116 @@ public class SdFishDictoryBServiceImpl extends ServiceImpl findSimilarFish(String name, Integer limit) { + if (!StringUtils.hasText(name)) { + return Collections.emptyList(); + } + + String searchName = name.trim(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SdFishDictoryB::getIsDeleted, 0); + List allFish = list(wrapper); + + SdFishDictoryB referenceFish = allFish.stream() + .filter(f -> f.getName() != null && f.getName().equals(searchName)) + .findFirst() + .orElse(null); + + if (referenceFish == null) { + referenceFish = allFish.stream() + .filter(f -> f.getName() != null && f.getName().contains(searchName)) + .findFirst() + .orElse(null); + } + + if (referenceFish == null && allFish.stream().anyMatch(f -> + f.getName() != null && (f.getName().contains(searchName) || searchName.contains(f.getName())))) { + final String searchNameFinal = searchName; + referenceFish = allFish.stream() + .filter(f -> f.getName() != null && + (f.getName().contains(searchNameFinal) || searchNameFinal.contains(f.getName()))) + .findFirst() + .orElse(null); + } + + if (referenceFish == null) { + return allFish.stream() + .filter(f -> f.getName() != null && f.getName().contains(searchName)) + .limit(limit != null ? limit : 10) + .collect(Collectors.toList()); + } + + final SdFishDictoryB finalRefFish = referenceFish; + Map similarityMap = new HashMap<>(); + + for (SdFishDictoryB fish : allFish) { + if (fish.getId().equals(finalRefFish.getId())) { + continue; + } + + int score = calculateSimilarity(finalRefFish, fish); + if (score > 0) { + similarityMap.put(fish, score); + } + } + + return similarityMap.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(limit != null ? limit : 10) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + } + + private int calculateSimilarity(SdFishDictoryB ref, SdFishDictoryB target) { + int score = 0; + + if (ref.getOrders() != null && ref.getOrders().equals(target.getOrders())) { + score += 3; + } + if (ref.getFamily() != null && ref.getFamily().equals(target.getFamily())) { + score += 5; + } + if (ref.getGenus() != null && ref.getGenus().equals(target.getGenus())) { + score += 8; + } + if (ref.getSpecies() != null && ref.getSpecies().equals(target.getSpecies())) { + score += 10; + } + + if (ref.getType() != null && ref.getType().equals(target.getType())) { + score += 2; + } + + if (ref.getHabitat() != null && ref.getHabitat().equals(target.getHabitat())) { + score += 3; + } + + if (ref.getRare() != null && ref.getRare().equals(target.getRare())) { + score += 2; + } + + if (ref.getPtype() != null && ref.getPtype().equals(target.getPtype())) { + score += 2; + } + + if (ref.getResourceType() != null && ref.getResourceType().equals(target.getResourceType())) { + score += 2; + } + + if (ref.getHabitMigrat() != null && ref.getHabitMigrat().equals(target.getHabitMigrat())) { + score += 3; + } + + if (ref.getFeedingHabit() != null && ref.getFeedingHabit().equals(target.getFeedingHabit())) { + score += 2; + } + + if (ref.getSpawnCharact() != null && ref.getSpawnCharact().equals(target.getSpawnCharact())) { + score += 2; + } + + return score; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index 774df19..cefe7c8 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -5,6 +5,7 @@ import cn.hutool.jwt.JWTUtil; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.WebConfig; import com.yfd.platform.system.domain.*; +import com.yfd.platform.system.mapper.SysMenuMapper; import com.yfd.platform.system.service.ISmsVerifyCodeService; import com.yfd.platform.system.service.ISysLogService; import com.yfd.platform.system.service.IUserService; @@ -47,6 +48,9 @@ public class SmsVerifyCodeController { @Resource private ISysLogService sysLogService; + @Resource + private SysMenuMapper sysMenuMapper; + @Value("${rsa.private_key}") private String privateKey; @@ -150,6 +154,8 @@ public class SmsVerifyCodeController { user.setOrgid("e90063ced25e3d469860e88d920c082f"); user.setUsertype(1); user.setUsername(smsVerifyCodeRequest.getUsername()); + user.setGroupCode(smsVerifyCodeRequest.getGroupCode()); + user.setCompanyCode(smsVerifyCodeRequest.getCompanyCode()); boolean success = userService.save(user); // 给注册用户加上默认权限 this.addDefaultRole(smsVerifyCodeRequest); @@ -162,12 +168,9 @@ public class SmsVerifyCodeController { private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) { String stationCode = smsVerifyCodeRequest.getStationCode(); - String companyCode = smsVerifyCodeRequest.getCompanyCode(); - String groupCode = smsVerifyCodeRequest.getGroupCode(); String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); - List roleIds=new ArrayList<>(); - roleIds.add("c13481a486c9ee559cf305284df4d207"); - roleIds.add("c13481a486c9ee559cf305284df4d207"); + + return true; } @@ -277,7 +280,10 @@ public class SmsVerifyCodeController { LoginUser loginUser = new LoginUser(); loginUser.setUser(user); loginUser.setUsername(user.getUsername()); - + //Todo 根据用户查询权限信息 添加到LoginUser中 + List permissions = + sysMenuMapper.selectPermsByUserId(user.getId()); + loginUser.setPermissions( permissions); HttpServletRequest request = RequestHolder.getHttpServletRequest(); SysLog sysLog = new SysLog(); sysLog.setUsercode(user.getUsername()); diff --git a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java index 1115c79..baf4258 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/LoginUser.java @@ -24,9 +24,15 @@ public class LoginUser implements UserDetails { private List permissions=new ArrayList<>(); + /** + * 自定义构造函数(如果需要特殊逻辑) + */ public LoginUser(SysUser user, List permissions) { this.user = user; - this.permissions = permissions; + // 4. 增加非空判断,确保 permissions 永远不为 null + if (permissions != null) { + this.permissions = permissions; + } } @JSONField(serialize = false) diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index bdf5fb3..6d771f8 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -146,6 +146,15 @@ public class SysUser implements Serializable { */ private Date regTime; + /** + * 集团编号 + */ + private String groupCode; + /** + * 公司编号 + */ + private String companyCode; + @TableField(exist = false) List roles; } From 459fff4fc5fa5fc7f7dafa075a1d9bb018d51126 Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Apr 2026 08:51:20 +0800 Subject: [PATCH 10/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/config/MyMetaObjectHandler.java | 24 +++- .../env/controller/SdHycdDicController.java | 10 +- .../env/service/ISdHycdDicService.java | 4 +- .../service/impl/SdHycdDicServiceImpl.java | 6 +- .../controller/SmsVerifyCodeController.java | 113 +++++++++++++++++- .../system/controller/UserController.java | 1 + .../platform/system/service/IUserService.java | 4 + .../system/service/impl/UserServiceImpl.java | 50 ++++++-- backend/src/main/resources/application.yml | 2 +- 9 files changed, 187 insertions(+), 27 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java b/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java index 3e8a46e..5510e43 100644 --- a/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java +++ b/backend/src/main/java/com/yfd/platform/config/MyMetaObjectHandler.java @@ -27,11 +27,17 @@ public class MyMetaObjectHandler implements MetaObjectHandler { // 自动填充更新时间 this.strictInsertFill(metaObject, "updatedAt", Date.class, now); - // 自动填充更新时间 - this.strictInsertFill(metaObject, "createdBy", String.class, SecurityUtils.getUserId()); + try { + String userId = SecurityUtils.getUserId(); + // 自动填充更新时间 + this.strictInsertFill(metaObject, "createdBy", String.class, userId ); + + // 自动填充更新时间 + this.strictInsertFill(metaObject, "updatedBy", String.class, userId); + } catch (Exception e) { + e.printStackTrace(); + } - // 自动填充更新时间 - this.strictInsertFill(metaObject, "updatedBy", String.class, SecurityUtils.getUserId()); } /** @@ -41,7 +47,13 @@ public class MyMetaObjectHandler implements MetaObjectHandler { public void updateFill(MetaObject metaObject) { // 自动填充更新时间 this.strictUpdateFill(metaObject, "updatedAt", Date.class, new Date()); - // 自动填充更新人 - this.strictInsertFill(metaObject, "updatedBy", String.class, SecurityUtils.getUserId()); + try { + String userId = SecurityUtils.getUserId(); + // 自动填充更新人 + this.strictInsertFill(metaObject, "updatedBy", String.class, userId); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java index d90c726..cead7e6 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdHycdDicController.java @@ -67,8 +67,9 @@ public class SdHycdDicController { public ResponseResult selectForDropdown( @RequestParam(required = false) String hynm, @RequestParam(required = false) Integer grd, - @RequestParam(required = false) Integer lx) { - return ResponseResult.successData(hycdDicService.selectForDropdown(hynm, grd,lx)); + @RequestParam(required = false) Integer lx, + @RequestParam(required = false) String phycd) { + return ResponseResult.successData(hycdDicService.selectForDropdown(hynm, grd,lx,phycd)); } @GetMapping("/regDropdown") @@ -76,8 +77,9 @@ public class SdHycdDicController { public ResponseResult regDropdown( @RequestParam(required = false) String hynm, @RequestParam(required = false) Integer grd, - @RequestParam(required = false) Integer lx) { - return ResponseResult.successData(hycdDicService.regDropdown(hynm, grd,lx)); + @RequestParam(required = false) Integer lx, + @RequestParam(required = false) String phycd) { + return ResponseResult.successData(hycdDicService.regDropdown(hynm, grd,lx,phycd)); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java index 35a5214..7bf15b8 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdHycdDicService.java @@ -46,7 +46,7 @@ public interface ISdHycdDicService extends IService { /** * 下拉框列表查询(支持名称和级别过滤) */ - List selectForDropdown(String hynm, Integer grd,Integer lx); + List selectForDropdown(String hynm, Integer grd,Integer lx,String phycd); - List regDropdown(String hynm, Integer grd,Integer lx); + List regDropdown(String hynm, Integer grd,Integer lx,String phycd); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java index 00b0ebf..a87c2ef 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdHycdDicServiceImpl.java @@ -58,9 +58,10 @@ public class SdHycdDicServiceImpl extends ServiceImpl selectForDropdown(String hynm, Integer grd, Integer lx) { + public List selectForDropdown(String hynm, Integer grd, Integer lx,String phycd) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm) + .eq(phycd != null, SdHycdDic::getPhycd, phycd) .eq(grd != null, SdHycdDic::getGrd, grd) .eq(lx != null, SdHycdDic::getLx, lx) .orderByAsc(SdHycdDic::getOrderIndex) @@ -68,9 +69,10 @@ public class SdHycdDicServiceImpl extends ServiceImpl regDropdown(String hynm, Integer grd,Integer lx) { + public List regDropdown(String hynm, Integer grd,Integer lx,String phycd) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm) + .eq(phycd != null, SdHycdDic::getPhycd, phycd) .eq(grd != null, SdHycdDic::getGrd, grd) .eq(lx != null, SdHycdDic::getLx, lx) .orderByAsc(SdHycdDic::getOrderIndex) diff --git a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java index cefe7c8..5f40186 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SmsVerifyCodeController.java @@ -4,6 +4,11 @@ import cn.hutool.json.JSONUtil; import cn.hutool.jwt.JWTUtil; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.WebConfig; +import com.yfd.platform.data.domain.SysUserDataScope; +import com.yfd.platform.data.service.ISysUserDataScopeService; +import com.yfd.platform.env.domain.SdEngInfoBH; +import com.yfd.platform.env.service.ISdEngInfoBHService; +import com.yfd.platform.env.service.ISdHbrvDicService; import com.yfd.platform.system.domain.*; import com.yfd.platform.system.mapper.SysMenuMapper; import com.yfd.platform.system.service.ISmsVerifyCodeService; @@ -21,10 +26,12 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.sql.Timestamp; import java.util.*; +import java.util.stream.Collectors; /** *

@@ -51,6 +58,15 @@ public class SmsVerifyCodeController { @Resource private SysMenuMapper sysMenuMapper; + @Resource + private ISysUserDataScopeService sysUserDataScopeService; + + @Resource + private ISdEngInfoBHService engInfoBHService; + + @Resource + private ISdHbrvDicService hbrvDicService; + @Value("${rsa.private_key}") private String privateKey; @@ -113,6 +129,7 @@ public class SmsVerifyCodeController { */ @PostMapping("/register") @Operation(summary = "注册用户") + @Transactional public ResponseResult register(@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String code = smsVerifyCodeRequest.getCode(); if (smsVerifyCodeRequest.getPhone() == null || smsVerifyCodeRequest.getPhone().isEmpty()) { @@ -158,7 +175,10 @@ public class SmsVerifyCodeController { user.setCompanyCode(smsVerifyCodeRequest.getCompanyCode()); boolean success = userService.save(user); // 给注册用户加上默认权限 - this.addDefaultRole(smsVerifyCodeRequest); + SysUser savedUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone()); + if (savedUser != null) { + this.addDefaultRole(savedUser.getId(), smsVerifyCodeRequest); + } if (success) { return ResponseResult.success(); } else { @@ -166,11 +186,100 @@ public class SmsVerifyCodeController { } } - private boolean addDefaultRole(SmsVerifyCodeRequest smsVerifyCodeRequest) { + private boolean addDefaultRole(String userId, SmsVerifyCodeRequest smsVerifyCodeRequest) { + if (userId == null || userId.isEmpty()) { + return false; + } + String stationCode = smsVerifyCodeRequest.getStationCode(); String hbrvcdCode = smsVerifyCodeRequest.getHbrvcdCode(); + Set selectedStationCodes = new HashSet<>(); + if (StringUtils.isNotEmpty(stationCode)) { + selectedStationCodes.addAll(Arrays.asList(stationCode.split(","))); + } + Set selectedBasinCodes = new HashSet<>(); + if (StringUtils.isNotEmpty(hbrvcdCode)) { + selectedBasinCodes.addAll(Arrays.asList(hbrvcdCode.split(","))); + } + + Set addedStationCodes = new HashSet<>(); + + for (String basinCode : selectedBasinCodes) { + if (StringUtils.isEmpty(basinCode)) { + continue; + } + + List allStationsInBasin = engInfoBHService.lambdaQuery() + .eq(SdEngInfoBH::getHbrvcd, basinCode) + .list(); + + if (allStationsInBasin == null || allStationsInBasin.isEmpty()) { + SysUserDataScope scope = new SysUserDataScope(); + scope.setUserId(userId); + scope.setOrgType("HBRVCD"); + scope.setOrgId(basinCode); + scope.setStatus(1); + scope.setPermissionType("READ"); + sysUserDataScopeService.addDataScope(scope); + continue; + } + + Set allStationCodesInBasin = allStationsInBasin.stream() + .map(SdEngInfoBH::getStcd) + .collect(Collectors.toSet()); + + boolean allStationsSelected = allStationCodesInBasin.containsAll(selectedStationCodes) + && selectedStationCodes.containsAll(allStationCodesInBasin); + + if (allStationsSelected) { + SysUserDataScope scope = new SysUserDataScope(); + scope.setUserId(userId); + scope.setOrgType("HBRVCD"); + scope.setOrgId(basinCode); + scope.setStatus(1); + scope.setPermissionType("READ"); + sysUserDataScopeService.addDataScope(scope); + addedStationCodes.add(basinCode); + } else { + Set stationsInBasinAndSelected = allStationCodesInBasin.stream() + .filter(selectedStationCodes::contains) + .collect(Collectors.toSet()); + + for (String stationCd : stationsInBasinAndSelected) { + SysUserDataScope scope = new SysUserDataScope(); + scope.setUserId(userId); + scope.setOrgType("STATION"); + scope.setOrgId(stationCd); + scope.setStatus(1); + scope.setPermissionType("READ"); + sysUserDataScopeService.addDataScope(scope); + addedStationCodes.add(stationCd); + } + } + } + + Set standaloneStations = selectedStationCodes.stream() + .filter(code -> !addedStationCodes.contains(code)) + .collect(Collectors.toSet()); + + for (String stationCd : standaloneStations) { + if (StringUtils.isEmpty(stationCd)) { + continue; + } + SysUserDataScope scope = new SysUserDataScope(); + scope.setUserId(userId); + scope.setOrgType("STATION"); + scope.setOrgId(stationCd); + scope.setStatus(1); + scope.setPermissionType("READ"); + sysUserDataScopeService.addDataScope(scope); + } + SysUser user = new SysUser(); + user.setId(userId); + userService.updateUserRoles( user,"c13481a486c9ee559cf305284df4d207"); + // 加上角色权限 return true; } diff --git a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java index 53ee18c..3071d28 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/UserController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/UserController.java @@ -59,6 +59,7 @@ public class UserController { return ResponseResult.successData(reslut); } + @GetMapping("/queryUsers") @Operation(summary = "查询用户信息") @ResponseBody diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index 2674275..9d7f66e 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.system.domain.LoginUser; import com.yfd.platform.system.domain.SysUser; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.File; @@ -57,6 +58,9 @@ public interface IUserService extends IService { List list(String total, String size, String orgid, String username, String mobile, String status); + @Transactional(rollbackFor = Exception.class) + Map updateUserRoles(SysUser sysUser, String roleids); + /*********************************** * 用途说明:根据ID查询用户详情 * 参数说明 diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 383e7a3..8741b09 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -9,20 +9,16 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yfd.platform.config.FileProperties; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.system.domain.LoginUser; -import com.yfd.platform.system.domain.SysOrganization; import com.yfd.platform.system.domain.SysRole; import com.yfd.platform.system.domain.SysUser; -import com.yfd.platform.system.mapper.SysOrganizationMapper; import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.mapper.SysUserMapper; import com.yfd.platform.system.service.IUserService; import com.yfd.platform.utils.FileUtil; import com.yfd.platform.utils.SecurityUtils; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.StringUtils; import com.yfd.platform.config.FileSpaceProperties; import jakarta.annotation.Resource; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -33,8 +29,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import jakarta.annotation.Resource; -import jakarta.validation.constraints.NotBlank; import java.io.File; import java.sql.Timestamp; import java.util.*; @@ -272,6 +266,46 @@ public class UserServiceImpl extends ServiceImpl impleme return result; } + @Transactional(rollbackFor = Exception.class) + @Override + public Map updateUserRoles(SysUser sysUser, String roleids) { + Map result = new HashMap<>(); + + try { + + Timestamp currentTime = new Timestamp(System.currentTimeMillis()); + sysUser.setLastmodifydate(currentTime); + + // 更新用户信息 + boolean ok = this.updateById(sysUser); + if (!ok) { + result.put("status", "error"); + result.put("msg", "用户信息修改失败!"); + return result; + } + + // 处理角色分配 + String userId = sysUser.getId(); + if (StrUtil.isNotEmpty(roleids)) { + handleUserRoles(userId, roleids); + } else { + // 清空所有角色 + sysUserMapper.delRoleUsersByUserid(userId); + } + + result.put("status", "sucess"); + result.put("msg", "用户信息修改成功!"); + + } catch (Exception e) { + log.error("更新用户信息失败", e); + result.put("status", "error"); + result.put("msg", "操作失败:" + e.getMessage()); + throw e; // 抛出异常,触发事务回滚 + } + + return result; + } + /** * 处理用户角色分配(增量更新) * @param userId 用户 ID @@ -284,7 +318,6 @@ public class UserServiceImpl extends ServiceImpl impleme // 解析新角色列表 String[] newRoles = roleIds.split(","); - Set newRoleSet = new HashSet<>(Arrays.asList(newRoles)); // 需要新增的角色(新角色 - 当前角色) for (String roleId : newRoles) { @@ -298,9 +331,6 @@ public class UserServiceImpl extends ServiceImpl impleme sysUserMapper.delInRoleUsersByUserid(userId, newRoles); } -// ... existing code ... - - @Override public Map getOneById(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index cfbf0b8..f3b5aa4 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: devtw + active: prod jasypt: encryptor: From daa70d3f20a351c6befec63d95d82ca0c5d0bfeb Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Apr 2026 09:31:08 +0800 Subject: [PATCH 11/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/FishDraftDataServiceImpl.java | 5 ++-- .../system/controller/UserController.java | 16 ++++++++----- .../system/service/ISmsVerifyCodeService.java | 9 +++++++ .../platform/system/service/IUserService.java | 2 +- .../impl/SmsVerifyCodeServiceImpl.java | 24 +++++++++++++++++++ .../system/service/impl/UserServiceImpl.java | 8 +++---- .../com/yfd/platform/utils/SecurityUtils.java | 14 +++++++++++ backend/src/main/resources/application.yml | 2 +- 8 files changed, 65 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java index 86961e7..6594175 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/FishDraftDataServiceImpl.java @@ -22,6 +22,7 @@ import com.yfd.platform.utils.QgcQueryWrapperUtil; import com.yfd.platform.utils.SecurityUtils; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; +import org.springframework.security.core.GrantedAuthority; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -67,9 +68,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl { * 生成6位数字验证码 */ String generateCode(); + + /** + * 发送审核结果通知短信 + * @param phone 手机号 + * @param auditStatus 审核状态 1-通过 2-驳回 + * @param reason 驳回原因(可选) + * @return 是否发送成功 + */ + boolean sendAuditNotify(String phone, Integer auditStatus, String reason); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index 9d7f66e..ad95d1d 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -101,7 +101,7 @@ public interface IUserService extends IService { *id 重置密码的 用户id * 返回值说明: 判断是否重置成功 ************************************/ - boolean resetPassword(String id) throws Exception; + ResponseResult resetPassword(String id) throws Exception; /*********************************** * 用途说明:设置账号状态(管理员) diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java index 2b939eb..2c9b072 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java @@ -96,4 +96,28 @@ public class SmsVerifyCodeServiceImpl extends ServiceImpl impleme * 返回值说明: 判断是重置成功 ************************************/ @Override - public boolean resetPassword(String id) throws Exception { - boolean isOk = false; + public ResponseResult resetPassword(String id) throws Exception { //根据当前用户id 查询角色表的级别 currentUser.getUser() 获取当前用户id String level = sysUserMapper.getMaxLevel(id); //判断是否获取级别 @@ -443,10 +442,11 @@ public class UserServiceImpl extends ServiceImpl impleme new Timestamp(System.currentTimeMillis())).set( "lastmodifier", getUsername()); //是否修改成功 - isOk = this.update(updateWrapper); + this.update(updateWrapper); + return ResponseResult.success("重置密码成功"); } } - return isOk; + return ResponseResult.error(); } /*********************************** diff --git a/backend/src/main/java/com/yfd/platform/utils/SecurityUtils.java b/backend/src/main/java/com/yfd/platform/utils/SecurityUtils.java index 4e8f518..8d667c1 100644 --- a/backend/src/main/java/com/yfd/platform/utils/SecurityUtils.java +++ b/backend/src/main/java/com/yfd/platform/utils/SecurityUtils.java @@ -22,10 +22,12 @@ import com.yfd.platform.exception.BadRequestException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; +import java.util.Collection; import java.util.List; /** @@ -91,4 +93,16 @@ public class SecurityUtils { return JSONUtil.toList(array,Long.class); } + // 在 SecurityUtils.java 中 + public static boolean hasPermission(String permission) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null || !authentication.isAuthenticated()) { + return false; + } + + Collection authorities = authentication.getAuthorities(); + return authorities != null && authorities.stream() + .anyMatch(auth -> permission.equals(auth.getAuthority())); + } + } diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index f3b5aa4..cfbf0b8 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: prod + active: devtw jasypt: encryptor: From 70aeee3dc1593cefdac0e35d10c7b011d185d00a Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Apr 2026 10:15:33 +0800 Subject: [PATCH 12/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yfd/platform/data/domain/FishDraftData.java | 2 +- .../yfd/platform/data/domain/vo/FishDraftDataVO.java | 2 +- .../data/service/impl/ApprovalMainServiceImpl.java | 2 +- .../data/service/impl/FishDraftDataServiceImpl.java | 8 ++++---- .../system/controller/SmsVerifyCodeController.java | 6 +++--- .../yfd/platform/system/controller/UserController.java | 7 ++++--- .../java/com/yfd/platform/system/domain/SysUser.java | 4 ++-- .../com/yfd/platform/system/domain/SysUserRequest.java | 2 +- .../platform/system/service/ISmsVerifyCodeService.java | 2 +- .../com/yfd/platform/system/service/IUserService.java | 4 ++-- .../system/service/impl/SmsVerifyCodeServiceImpl.java | 6 +++--- .../platform/system/service/impl/UserServiceImpl.java | 10 +++++----- 12 files changed, 28 insertions(+), 27 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java index 530d0b7..f29767b 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/FishDraftData.java @@ -124,7 +124,7 @@ public class FishDraftData implements Serializable { private String approvalId; /** - * 状态(DRAFT未提交 / SUBMITTED已提交 / APPROVED已通过 / REJECTED已驳回) + * 状态(DRAFT未提交 / PENDING已提交 / APPROVED已通过 / REJECTED已驳回) */ private String status; diff --git a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java index 65c0f48..24a8199 100644 --- a/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java +++ b/backend/src/main/java/com/yfd/platform/data/domain/vo/FishDraftDataVO.java @@ -113,7 +113,7 @@ public class FishDraftDataVO implements Serializable { private String approvalId; /** - * 状态(DRAFT未提交 / SUBMITTED已提交 / APPROVED已通过 / REJECTED已驳回) + * 状态(DRAFT未提交 / PENDING已提交 / APPROVED已通过 / REJECTED已驳回) */ private String status; diff --git a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java index 72f3d57..cab10cd 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/data/service/impl/ApprovalMainServiceImpl.java @@ -106,7 +106,7 @@ public class ApprovalMainServiceImpl extends ServiceImpl validIds = new ArrayList<>(); for (FishDraftData fishDraftData : dataList) { - if ("SUBMITTED".equals(fishDraftData.getStatus())) { + if ("PENDING".equals(fishDraftData.getStatus())) { validIds.add(fishDraftData.getId()); if (fishDraftData.getApprovalId() != null) { processedApprovalIds.add(fishDraftData.getApprovalId()); @@ -339,7 +339,7 @@ public class FishDraftDataServiceImpl extends ServiceImpl page,String name,Integer regStatus) { + public ResponseResult queryPendingAuditUsers(Page page,String name,String regStatus) { Page result = userService.queryPendingAuditUsers(page,name,regStatus); return ResponseResult.successData(result); } diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java index 6d771f8..1fae968 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUser.java @@ -122,9 +122,9 @@ public class SysUser implements Serializable { private String realName; /** - * 注册状态:0-待审核 1-已通过 2-已驳回 + * 审批状态(PENDING待审批 / APPROVED已通过 / REJECTED已驳回) */ - private Integer regStatus; + private String regStatus; /** * 审核人ID diff --git a/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java b/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java index d1847ac..346d8cc 100644 --- a/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java +++ b/backend/src/main/java/com/yfd/platform/system/domain/SysUserRequest.java @@ -25,7 +25,7 @@ public class SysUserRequest { /** * 审核状态 */ - private Integer regStatus; + private String regStatus; /** * 审批意见 diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISmsVerifyCodeService.java b/backend/src/main/java/com/yfd/platform/system/service/ISmsVerifyCodeService.java index 7c10d95..95b3765 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISmsVerifyCodeService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISmsVerifyCodeService.java @@ -45,5 +45,5 @@ public interface ISmsVerifyCodeService extends IService { * @param reason 驳回原因(可选) * @return 是否发送成功 */ - boolean sendAuditNotify(String phone, Integer auditStatus, String reason); + boolean sendAuditNotify(String phone, String auditStatus, String reason); } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java index ad95d1d..00a2868 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/IUserService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/IUserService.java @@ -166,7 +166,7 @@ public interface IUserService extends IService { * auditStatus 审核状态:1-通过 2-驳回 * 返回值说明: 是否审核成功 ************************************/ - boolean auditUser(String userId, Integer auditStatus); + boolean auditUser(String userId, String auditStatus); /*********************************** * 用途说明:查询待审核用户列表 @@ -174,6 +174,6 @@ public interface IUserService extends IService { *page 分页参数 * 返回值说明: 待审核用户分页列表 ************************************/ - Page queryPendingAuditUsers(Page page,String name, Integer regStatus); + Page queryPendingAuditUsers(Page page,String name, String regStatus); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java index 2c9b072..6f25515 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SmsVerifyCodeServiceImpl.java @@ -98,14 +98,14 @@ public class SmsVerifyCodeServiceImpl extends ServiceImpl impleme } @Override - public boolean auditUser(String userId, Integer auditStatus) { + public boolean auditUser(String userId, String auditStatus) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(SysUser::getId, userId) .set(SysUser::getRegStatus, auditStatus) @@ -620,18 +620,18 @@ public class UserServiceImpl extends ServiceImpl impleme .set(SysUser::getAuditTime, new Timestamp(System.currentTimeMillis())) .set(SysUser::getLastmodifydate, new Timestamp(System.currentTimeMillis())) .set(SysUser::getLastmodifier, SecurityUtils.getCurrentUsername()); - if (auditStatus == 1) { + if ("APPROVED".equals(auditStatus)) { updateWrapper.set(SysUser::getStatus, 1); - } else if (auditStatus == 2) { + } else if ("REJECTED".equals(auditStatus)) { updateWrapper.set(SysUser::getStatus, 0); } return this.update(updateWrapper); } @Override - public Page queryPendingAuditUsers(Page page,String name,Integer regStatus) { + public Page queryPendingAuditUsers(Page page,String name,String regStatus) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(SysUser::getRegStatus, 0,1,2); + queryWrapper.in(SysUser::getRegStatus, "PENDING","APPROVED","REJECTED"); queryWrapper.eq(ObjectUtil.isNotEmpty(regStatus),SysUser::getRegStatus, regStatus); queryWrapper.and(StrUtil.isNotBlank(name), wrapper -> wrapper.like(SysUser::getNickname, name) From de0a291f700484089fbcaf78315bb1e0cb759d2e Mon Sep 17 00:00:00 2001 From: tangwei Date: Wed, 29 Apr 2026 11:19:09 +0800 Subject: [PATCH 13/23] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E9=87=8D=E7=BD=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/FishDraftDataController.java | 22 ++ .../data/service/AttachmentUploadService.java | 61 ++++++ .../platform/system/mapper/SysUserMapper.java | 2 +- .../system/service/impl/UserServiceImpl.java | 13 +- .../yfd/platform/utils/PasswordGenerator.java | 205 ++++++++++++++++++ .../resources/mapper/system/SysUserMapper.xml | 9 +- 6 files changed, 303 insertions(+), 9 deletions(-) create mode 100644 backend/src/main/java/com/yfd/platform/utils/PasswordGenerator.java diff --git a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java index cf2b1d4..03ff9bb 100644 --- a/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java +++ b/backend/src/main/java/com/yfd/platform/data/controller/FishDraftDataController.java @@ -11,6 +11,7 @@ import com.yfd.platform.data.domain.ImportTask; import com.yfd.platform.data.domain.BatchApproveRequest; import com.yfd.platform.data.domain.BatchRejectRequest; import com.yfd.platform.data.domain.vo.FishDraftDataVO; +import com.yfd.platform.data.service.AttachmentUploadService; import com.yfd.platform.data.service.IFishDraftDataService; import com.yfd.platform.data.service.IFishImportService; import com.yfd.platform.data.service.IImportTaskService; @@ -47,6 +48,9 @@ public class FishDraftDataController { @Resource private ObjectMapper objectMapper; + @Resource + private AttachmentUploadService attachmentUploadService; + @PostMapping("/page") @Operation(summary = "分页查询过鱼数据(关联电站和设施)") public ResponseResult queryPageList(@RequestBody DataSourceRequest dataSourceRequest) { @@ -417,4 +421,22 @@ public class FishDraftDataController { return ResponseResult.error("清理失败: " + e.getMessage()); } } + + @PostMapping("/deleteAttachment") + @Operation(summary = "删除附件") + public ResponseResult deleteAttachment(@RequestParam String id, + @RequestHeader("token") String token) { + if (id == null || id.isEmpty()) { + return ResponseResult.error("附件ID不能为空"); + } + if (token == null || token.isEmpty()) { + return ResponseResult.error("token不能为空"); + } + boolean result = attachmentUploadService.deleteFile(id, token); + if (result) { + return ResponseResult.success("删除成功"); + } else { + return ResponseResult.error("删除失败"); + } + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/data/service/AttachmentUploadService.java b/backend/src/main/java/com/yfd/platform/data/service/AttachmentUploadService.java index 146d18a..5b50d41 100644 --- a/backend/src/main/java/com/yfd/platform/data/service/AttachmentUploadService.java +++ b/backend/src/main/java/com/yfd/platform/data/service/AttachmentUploadService.java @@ -260,4 +260,65 @@ public class AttachmentUploadService { return null; } } + + private static final String DELETE_URL = "https://211.99.26.225:12125/delete"; + + public boolean deleteFile(String attachmentId, String token) { + if (attachmentId == null || attachmentId.isEmpty()) { + log.warn("附件ID为空"); + return false; + } + + try { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, String authType) {} + public void checkServerTrusted(X509Certificate[] chain, String authType) {} + public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } + } + }; + + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new SecureRandom()); + + HttpClient secureClient = HttpClient.newBuilder() + .sslContext(sc) + .build(); + + String formData = "id=" + attachmentId; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(DELETE_URL)) + .header("Content-Type", "application/x-www-form-urlencoded") + .header("token", token) + .POST(HttpRequest.BodyPublishers.ofString(formData)) + .build(); + + HttpResponse response = secureClient.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() == 200) { + String responseBody = response.body(); + return parseDeleteResult(responseBody); + } else { + log.error("删除附件失败: {}, 状态码: {}", attachmentId, response.statusCode()); + return false; + } + } catch (Exception e) { + log.error("删除附件过程中发生异常: {}", attachmentId, e); + return false; + } + } + + private boolean parseDeleteResult(String jsonResponse) { + if (jsonResponse == null || jsonResponse.isEmpty()) { + return false; + } + try { + JSONObject json = JSONObject.parseObject(jsonResponse); + return json.containsKey("success") && json.getBoolean("success"); + } catch (Exception e) { + log.error("解析删除结果失败: {}", jsonResponse, e); + return false; + } + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java b/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java index 7aae6a3..f031cf8 100644 --- a/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java +++ b/backend/src/main/java/com/yfd/platform/system/mapper/SysUserMapper.java @@ -62,7 +62,7 @@ public interface SysUserMapper extends BaseMapper { * userid 用户id * 返回值说明: ************************************/ - String getMaxLevel(@Param("userid") String userid); + String getMaxLevel(@Param("userId") String userId); /*********************************** * 用途说明:根据用户id删除所分配的角色 diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java index 063d93b..e2bc0c9 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/UserServiceImpl.java @@ -17,6 +17,7 @@ import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.mapper.SysUserMapper; import com.yfd.platform.system.service.IUserService; import com.yfd.platform.utils.FileUtil; +import com.yfd.platform.utils.PasswordGenerator; import com.yfd.platform.utils.SecurityUtils; import lombok.RequiredArgsConstructor; import com.yfd.platform.config.FileSpaceProperties; @@ -429,12 +430,14 @@ public class UserServiceImpl extends ServiceImpl impleme //根据当前用户id 查询角色表的级别 currentUser.getUser() 获取当前用户id String level = sysUserMapper.getMaxLevel(id); //判断是否获取级别 - if (StrUtil.isNotEmpty(level)) { + if ("admin".equals(SecurityUtils.getCurrentUsername())||StrUtil.isNotEmpty(level)) { //判断当前用户级别 管理员及以上权限 - if (Integer.parseInt(level) <= 2) { + if ("admin".equals(SecurityUtils.getCurrentUsername())||Integer.parseInt(level) <= 2) { + SysUser sysUser = sysUserMapper.selectById(id); UpdateWrapper updateWrapper = new UpdateWrapper<>(); + String password = PasswordGenerator.generateRandomPassword(sysUser.getUsername()); //根据id 修改密码,密码修改时间,最近修改者,最近修改日期 将密码修改为 123456 - String cryptPassword = passwordEncoder.encode("123456"); + String cryptPassword = passwordEncoder.encode(password); updateWrapper.eq("id", id).set("password", cryptPassword).set( "pwdresettime", new Timestamp(System.currentTimeMillis())).set( @@ -443,7 +446,7 @@ public class UserServiceImpl extends ServiceImpl impleme "lastmodifier", getUsername()); //是否修改成功 this.update(updateWrapper); - return ResponseResult.success("重置密码成功"); + return ResponseResult.successData(password); } } return ResponseResult.error(); @@ -462,7 +465,7 @@ public class UserServiceImpl extends ServiceImpl impleme //根据当前用户id 查询角色表的级别 currentUser.getUser() 获取当前用户id String level = sysUserMapper.getMaxLevel(id); //判断当前用户级别 管理员及以上权限 - if (Integer.parseInt(level) <= 2) { + if ("admin".equals(SecurityUtils.getCurrentUsername())||Integer.parseInt(level) <= 2) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); //根据id修改用户状态,最近修改人,最近修改时间 updateWrapper.eq("id", id).set("status", status).set( diff --git a/backend/src/main/java/com/yfd/platform/utils/PasswordGenerator.java b/backend/src/main/java/com/yfd/platform/utils/PasswordGenerator.java new file mode 100644 index 0000000..0f910c7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/utils/PasswordGenerator.java @@ -0,0 +1,205 @@ +package com.yfd.platform.utils; + +import java.security.SecureRandom; + +/** + * 随机密码生成器,满足以下规则: + * 1. 必须包含大写字母、小写字母、数字、特殊字符中的至少三类 + * 2. 不能包含2位及以上相同字符的连续重复(如11、aa) + * 3. 不能包含2位及以上连续递增或递减的数字(如12、21) + * 4. 不能包含2位及以上连续递增或递减的字母(如ab、ba,忽略大小写) + * 5. 不能包含用户名(忽略大小写) + * 6. 密码的字母部分不能是用户名的子串(忽略大小写,连续子串) + * 7. 密码不能与用户名存在明显关联(字母部分不能等于用户名或其反转) + * 8. 密码开头和结尾不能是特殊字符 + * 9. 密码长度可配置(默认10-12位) + */ +public class PasswordGenerator { + + private static final String LOWERS = "abcdefghijklmnopqrstuvwxyz"; + private static final String UPPERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + private static final String DIGITS = "0123456789"; + private static final String SPECIALS = "!@#$%^&*()_+-=[]{}|;:,.<>?"; + + private static final SecureRandom RANDOM = new SecureRandom(); + private static final int DEFAULT_MIN_LEN = 10; + private static final int DEFAULT_MAX_LEN = 12; + private static final int MAX_ATTEMPTS = 100; + + private static int minLength = DEFAULT_MIN_LEN; + private static int maxLength = DEFAULT_MAX_LEN; + + public static void configure(int minLen, int maxLen) { + if (minLen < 6) { + minLen = 6; + } + if (maxLen > 32) { + maxLen = 32; + } + if (minLen > maxLen) { + minLen = maxLen; + } + minLength = minLen; + maxLength = maxLen; + } + + public static String generateRandomPassword(String username) { + return generateRandomPassword(username, minLength, maxLength); + } + + public static String generateRandomPassword(String username, int minLen, int maxLen) { + int configuredMin = minLen > 0 ? minLen : DEFAULT_MIN_LEN; + int configuredMax = maxLen > 0 ? maxLen : DEFAULT_MAX_LEN; + if (configuredMin > configuredMax) { + configuredMin = configuredMax; + } + for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) { + int length = configuredMin + RANDOM.nextInt(configuredMax - configuredMin + 1); + String candidate = generateRandomString(length); + if (isValidPassword(candidate, username)) { + return candidate; + } + } + throw new RuntimeException("Unable to generate a valid password after " + MAX_ATTEMPTS + " attempts"); + } + + private static String generateRandomString(int length) { + String lowerChars = LOWERS; + String upperChars = UPPERS; + String digitChars = DIGITS; + String specialChars = SPECIALS; + + StringBuilder sb = new StringBuilder(length); + + int firstCharIdx = RANDOM.nextInt(lowerChars.length() + upperChars.length() + digitChars.length()); + String firstPool = lowerChars + upperChars + digitChars; + sb.append(firstPool.charAt(firstCharIdx)); + + for (int i = 1; i < length - 1; i++) { + int choice = RANDOM.nextInt(100); + String charsToUse; + if (choice < 25) { + charsToUse = specialChars; + } else if (choice < 55) { + charsToUse = lowerChars; + } else if (choice < 80) { + charsToUse = upperChars; + } else { + charsToUse = digitChars; + } + int idx = RANDOM.nextInt(charsToUse.length()); + sb.append(charsToUse.charAt(idx)); + } + + int lastCharIdx = RANDOM.nextInt(lowerChars.length() + upperChars.length() + digitChars.length()); + String lastPool = lowerChars + upperChars + digitChars; + sb.append(lastPool.charAt(lastCharIdx)); + + return sb.toString(); + } + + private static boolean isValidPassword(String password, String username) { + if (password == null || password.length() < minLength) return false; + + if (!hasEnoughCategories(password)) return false; + if (hasConsecutiveRepeats(password)) return false; + if (hasSequentialDigits(password)) return false; + if (hasSequentialLetters(password)) return false; + if (!isNormalChar(password.charAt(0))) return false; + if (!isNormalChar(password.charAt(password.length() - 1))) return false; + + if (username != null && !username.isEmpty()) { + if (containsIgnoreCase(password, username)) return false; + String lettersOnly = extractLetters(password); + if (containsIgnoreCase(lettersOnly, username)) return false; + if (isObviousRelation(lettersOnly, username)) return false; + } + return true; + } + + private static boolean isNormalChar(char c) { + return Character.isLowerCase(c) || Character.isUpperCase(c) || Character.isDigit(c); + } + + private static boolean hasEnoughCategories(String s) { + boolean hasLower = false, hasUpper = false, hasDigit = false, hasSpecial = false; + for (char c : s.toCharArray()) { + if (Character.isLowerCase(c)) hasLower = true; + else if (Character.isUpperCase(c)) hasUpper = true; + else if (Character.isDigit(c)) hasDigit = true; + else hasSpecial = true; + } + int cnt = (hasLower ? 1 : 0) + (hasUpper ? 1 : 0) + (hasDigit ? 1 : 0) + (hasSpecial ? 1 : 0); + return cnt >= 3; + } + + private static boolean hasConsecutiveRepeats(String s) { + for (int i = 0; i < s.length() - 1; i++) { + if (s.charAt(i) == s.charAt(i + 1)) return true; + } + return false; + } + + private static boolean hasSequentialDigits(String s) { + for (int i = 0; i < s.length() - 1; i++) { + char c1 = s.charAt(i); + char c2 = s.charAt(i + 1); + if (Character.isDigit(c1) && Character.isDigit(c2)) { + int diff = c2 - c1; + if (Math.abs(diff) == 1) return true; + } + } + return false; + } + + private static boolean hasSequentialLetters(String s) { + for (int i = 0; i < s.length() - 1; i++) { + char c1 = s.charAt(i); + char c2 = s.charAt(i + 1); + if (Character.isLetter(c1) && Character.isLetter(c2)) { + char low1 = Character.toLowerCase(c1); + char low2 = Character.toLowerCase(c2); + int diff = low2 - low1; + if (Math.abs(diff) == 1) return true; + } + } + return false; + } + + private static boolean containsIgnoreCase(String str, String search) { + if (str == null || search == null) return false; + return str.toLowerCase().contains(search.toLowerCase()); + } + + private static String extractLetters(String s) { + StringBuilder sb = new StringBuilder(); + for (char c : s.toCharArray()) { + if (Character.isLetter(c)) sb.append(c); + } + return sb.toString(); + } + + private static boolean isObviousRelation(String lettersOnly, String username) { + String lowerLetters = lettersOnly.toLowerCase(); + String lowerUser = username.toLowerCase(); + if (lowerLetters.equals(lowerUser)) return true; + String reversedUser = new StringBuilder(lowerUser).reverse().toString(); + return lowerLetters.equals(reversedUser); + } + + public static void main(String[] args) { + configure(10, 12); + String username = "admin"; + String resetPwd = generateRandomPassword(username); + System.out.println("Generated password: " + resetPwd); + System.out.println("Password length: " + resetPwd.length()); + System.out.println("First char: '" + resetPwd.charAt(0) + "' (is special: " + !isNormalChar(resetPwd.charAt(0)) + ")"); + System.out.println("Last char: '" + resetPwd.charAt(resetPwd.length() - 1) + "' (is special: " + !isNormalChar(resetPwd.charAt(resetPwd.length() - 1)) + ")"); + + configure(8, 16); + System.out.println("\nAfter configure(8, 16):"); + resetPwd = generateRandomPassword(username); + System.out.println("Generated password: " + resetPwd); + System.out.println("Password length: " + resetPwd.length()); + } +} \ No newline at end of file diff --git a/backend/src/main/resources/mapper/system/SysUserMapper.xml b/backend/src/main/resources/mapper/system/SysUserMapper.xml index 70ac49a..1ee549f 100644 --- a/backend/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/src/main/resources/mapper/system/SysUserMapper.xml @@ -49,9 +49,12 @@