From e49bdd2992c2c3dc6a8201d5894c0f4737a7f716 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 4 Aug 2026 10:56:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 1 + .../controller/SmsVerifyCodeController.java | 67 +++++++++++-------- .../system/controller/SysRoleController.java | 15 +++++ .../system/service/ISysRoleService.java | 9 +++ .../service/impl/SysRoleServiceImpl.java | 66 +++++++++++++++++- .../system/service/impl/UserServiceImpl.java | 13 +++- .../resources/mapper/system/SysUserMapper.xml | 2 +- 7 files changed, 140 insertions(+), 33 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 0833307f..7a0f3060 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -63,6 +63,7 @@ public class SecurityConfig { .requestMatchers("/data/fishDraft/previewFile").permitAll() .requestMatchers("/tempFile/**").permitAll() .requestMatchers("/system/user/auditUser").permitAll() + .requestMatchers("/register/accessToken").permitAll() .requestMatchers("/api/oauth2/oauth/token").permitAll() .requestMatchers("/dict/cache/**").permitAll() .requestMatchers("/sys/psbmodulelbb/**").permitAll() 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 4b58e319..f3f93d22 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 @@ -2,6 +2,7 @@ package com.yfd.platform.system.controller; import cn.hutool.json.JSONUtil; import cn.hutool.jwt.JWTUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yfd.platform.config.ResponseResult; import com.yfd.platform.config.WebConfig; import com.yfd.platform.qgc_data.domain.SysUserDataScope; @@ -11,6 +12,8 @@ import com.yfd.platform.qgc_base.service.ISdEngInfoBHService; import com.yfd.platform.qgc_base.service.ISdHbrvDicService; import com.yfd.platform.system.domain.*; import com.yfd.platform.system.mapper.SysMenuMapper; +import com.yfd.platform.system.mapper.SysOrganizationMapper; +import com.yfd.platform.system.mapper.SysRoleMapper; import com.yfd.platform.system.mapper.SysUserTenantMapper; import com.yfd.platform.system.service.ISmsVerifyCodeService; import com.yfd.platform.system.service.ISysLogService; @@ -61,6 +64,12 @@ public class SmsVerifyCodeController { @Resource private SysMenuMapper sysMenuMapper; + @Resource + private SysOrganizationMapper organizationMapper; + + @Resource + private SysRoleMapper roleMapper; + @Resource private ISysUserDataScopeService sysUserDataScopeService; @@ -77,14 +86,14 @@ public class SmsVerifyCodeController { @Value("${rsa.private_key}") private String privateKey; - private static final String URGE_CONTENT ="根据生态环境部要求,请贵电站尽快完成过鱼数据的报送工作,感谢支持。"; + private static final String URGE_CONTENT = "根据生态环境部要求,请贵电站尽快完成过鱼数据的报送工作,感谢支持。"; /** * 发送验证码 */ @PostMapping("/sendCode") @Operation(summary = "发送验证码") - public ResponseResult sendVerifyCode(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult sendVerifyCode(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String phone = smsVerifyCodeRequest.getPhone(); Integer type = smsVerifyCodeRequest.getType(); @@ -97,21 +106,21 @@ public class SmsVerifyCodeController { // 1. 注册验证码校验 if (type.equals(SmsVerifyCode.TYPE_REGISTER)) { - SysUser existUser = userService.getUserByPhone(phone,tenantId); + SysUser existUser = userService.getUserByPhone(phone, tenantId); if (existUser != null) { return ResponseResult.error("该手机号已注册"); } } // 2. 找回密码验证码校验 else if (type.equals(SmsVerifyCode.TYPE_FIND_PASSWORD)) { - SysUser existUser = userService.getUserByPhone(phone,tenantId); + SysUser existUser = userService.getUserByPhone(phone, tenantId); if (existUser == null) { return ResponseResult.error("该手机号未注册"); } } // 3. 登录验证码校验(新增) else if (type.equals(SmsVerifyCode.TYPE_LOGIN)) { - SysUser existUser = userService.getUserByPhone(phone,tenantId); + SysUser existUser = userService.getUserByPhone(phone, tenantId); if (existUser == null) { return ResponseResult.error("该手机号未注册,请先注册"); } @@ -119,12 +128,11 @@ public class SmsVerifyCodeController { // if (existUser.getStatus() == 0) { // return ResponseResult.error("账号已被禁用"); // } - } - else { + } else { return ResponseResult.error("类型错误:1-注册 2-找回密码 3-登录"); } - String code = smsVerifyCodeService.sendVerifyCode(phone, type,tenantId); + String code = smsVerifyCodeService.sendVerifyCode(phone, type, tenantId); if (code == null) { return ResponseResult.error("验证码发送失败,请稍后重试"); } @@ -138,10 +146,10 @@ public class SmsVerifyCodeController { */ @PostMapping("/batchSendContent") @Operation(summary = "批量发送短信") - public ResponseResult batchSendContent(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult batchSendContent(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { List phoneList = smsVerifyCodeRequest.getPhoneList(); - if(phoneList==null){ + if (phoneList == null) { return ResponseResult.error("手机号不能为空"); } @@ -154,7 +162,7 @@ public class SmsVerifyCodeController { */ @PostMapping("/batchUrgeContent") @Operation(summary = "催促") - public ResponseResult batchUrgeContent(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult batchUrgeContent(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { List userIds = smsVerifyCodeRequest.getUserIds(); String content = smsVerifyCodeRequest.getContent(); @@ -167,7 +175,7 @@ public class SmsVerifyCodeController { } try { - int successCount = smsVerifyCodeService.urgeByUserIds(tenantId,userIds, content); + int successCount = smsVerifyCodeService.urgeByUserIds(tenantId, userIds, content); Map result = new HashMap<>(); // result.put("successCount", successCount); result.put("totalCount", userIds.size()); @@ -179,14 +187,13 @@ public class SmsVerifyCodeController { } - /** * 注册用户 */ @PostMapping("/register") @Operation(summary = "注册用户") @Transactional(rollbackFor = Exception.class) - public ResponseResult register(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult register(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String code = smsVerifyCodeRequest.getCode(); if (smsVerifyCodeRequest.getPhone() == null || smsVerifyCodeRequest.getPhone().isEmpty()) { return ResponseResult.error("手机号不能为空"); @@ -201,12 +208,12 @@ public class SmsVerifyCodeController { return ResponseResult.error("验证码不能为空"); } - boolean verified = smsVerifyCodeService.verifyCode(smsVerifyCodeRequest.getPhone(), code, SmsVerifyCode.TYPE_REGISTER,tenantId); + boolean verified = smsVerifyCodeService.verifyCode(smsVerifyCodeRequest.getPhone(), code, SmsVerifyCode.TYPE_REGISTER, tenantId); if (!verified) { return ResponseResult.error("验证码错误或已过期"); } - SysUser existUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone(),tenantId); + SysUser existUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone(), tenantId); if (existUser != null) { return ResponseResult.error("该手机号已注册"); } @@ -218,13 +225,15 @@ public class SmsVerifyCodeController { } catch (Exception e) { return ResponseResult.error("密码解密失败"); } + SysOrganization aDefault = organizationMapper.selectOne(new LambdaQueryWrapper().eq(SysOrganization::getCustom1, "default")); + String orgid = aDefault == null ? null : aDefault.getId(); user.setRegStatus("PENDING"); user.setPhone(smsVerifyCodeRequest.getPhone()); user.setBelongingUnit(smsVerifyCodeRequest.getBelongingUnit()); user.setRegTime(new Date()); user.setNickname(smsVerifyCodeRequest.getRealName()); user.setStatus(0); - user.setOrgid("e90063ced25e3d469860e88d920c082f"); + user.setOrgid(orgid); user.setUsertype(1); user.setTenantId(tenantId); user.setUsername(smsVerifyCodeRequest.getUsername()); @@ -232,7 +241,7 @@ public class SmsVerifyCodeController { user.setCompanyCode(smsVerifyCodeRequest.getCompanyCode()); boolean success = userService.save(user); // 给注册用户加上默认权限 - SysUser savedUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone(),tenantId); + SysUser savedUser = userService.getUserByPhone(smsVerifyCodeRequest.getPhone(), tenantId); if (savedUser != null) { SysUserTenant sysUserTenant = new SysUserTenant(); sysUserTenant.setTenantId(tenantId); @@ -340,8 +349,10 @@ public class SmsVerifyCodeController { // sysUserDataScopeService.addDataScope(scope); // } SysUser user = new SysUser(); + SysRole aDefault = roleMapper.selectOne(new LambdaQueryWrapper().eq(SysRole::getCustom1, "default")); + String roleids = aDefault == null ? null : aDefault.getId(); user.setId(userId); - userService.updateUserRoles( user,"c13481a486c9ee559cf305284df4d207"); + userService.updateUserRoles(user, roleids); // 加上角色权限 return true; } @@ -351,7 +362,7 @@ public class SmsVerifyCodeController { */ @PostMapping("/resetPassword") @Operation(summary = "找回密码") - public ResponseResult resetPassword(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult resetPassword(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String password = smsVerifyCodeRequest.getPassword(); String phone = smsVerifyCodeRequest.getPhone(); String code = smsVerifyCodeRequest.getCode(); @@ -365,12 +376,12 @@ public class SmsVerifyCodeController { return ResponseResult.error("新密码不能为空"); } - boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_FIND_PASSWORD,tenantId); + boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_FIND_PASSWORD, tenantId); if (!verified) { return ResponseResult.error("验证码错误或已过期"); } - SysUser existUser = userService.getUserByPhone(phone,tenantId); + SysUser existUser = userService.getUserByPhone(phone, tenantId); if (existUser == null) { return ResponseResult.error("该手机号未注册"); } @@ -395,11 +406,11 @@ public class SmsVerifyCodeController { */ @PostMapping("/verifyCode") @Operation(summary = "验证验证码") - public ResponseResult verifyCode(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult verifyCode(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String phone = smsVerifyCodeRequest.getPhone(); String code = smsVerifyCodeRequest.getCode(); Integer type = smsVerifyCodeRequest.getType(); - boolean valid = smsVerifyCodeService.verifyCode(phone, code, type,tenantId); + boolean valid = smsVerifyCodeService.verifyCode(phone, code, type, tenantId); if (valid) { return ResponseResult.success(); } else { @@ -412,7 +423,7 @@ public class SmsVerifyCodeController { */ @PostMapping("/login") @Operation(summary = "短信验证码登录") - public ResponseResult smsLogin(@RequestHeader(value = "Tenant_id", required = false) String tenantId,@RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { + public ResponseResult smsLogin(@RequestHeader(value = "Tenant_id", required = false) String tenantId, @RequestBody SmsVerifyCodeRequest smsVerifyCodeRequest) { String phone = smsVerifyCodeRequest.getPhone(); String code = smsVerifyCodeRequest.getCode(); if (phone == null || phone.isEmpty()) { @@ -422,12 +433,12 @@ public class SmsVerifyCodeController { return ResponseResult.error("验证码不能为空"); } - boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_LOGIN,tenantId); + boolean verified = smsVerifyCodeService.verifyCode(phone, code, SmsVerifyCode.TYPE_LOGIN, tenantId); if (!verified) { return ResponseResult.error("验证码错误或已过期"); } - SysUser user = userService.getUserByPhone(phone,tenantId); + SysUser user = userService.getUserByPhone(phone, tenantId); if (user == null) { return ResponseResult.error("该手机号未注册"); } @@ -461,7 +472,7 @@ public class SmsVerifyCodeController { } else { permissions = sysMenuMapper.selectPermsByUserId(user.getId(), tenantId); } - loginUser.setPermissions( permissions); + 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/controller/SysRoleController.java b/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java index 3570aef8..cf264e46 100644 --- a/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java +++ b/backend/src/main/java/com/yfd/platform/system/controller/SysRoleController.java @@ -58,6 +58,21 @@ public class SysRoleController { return roleService.selectRoleList(rolename, tenantId); } + /*********************************** + * 用途说明:按门户分组查询角色(门户 → 角色两层结构) + * 参数说明 + * rolename 角色名称(可选,模糊搜索) + * 返回值说明: [{"tenantId":"...","tenantName":"水利门户","roles":[...]}, ...] + * 门户中文名通过字典 PLATFORM_TENANT 获取 + ***********************************/ + @PostMapping("/listGroupedByTenant") + @Operation(summary = "按门户分组查询角色(含门户中文名)") + @ResponseBody + public List> listGroupedByTenant(@RequestParam(required = false) String rolename, + @RequestParam(required = false) String tenantId) { + return roleService.selectRoleListGroupedByTenant(tenantId,rolename); + } + /*********************************** * 用途说明:根据Id获取当个角色 * 参数说明 diff --git a/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java b/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java index 244983bf..1b6f25e1 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java +++ b/backend/src/main/java/com/yfd/platform/system/service/ISysRoleService.java @@ -67,4 +67,13 @@ public interface ISysRoleService extends IService { List selectRoleList(String rolename, String tenantId); List queryRolesList(String roleName, String tenantId); + + /*********************************** + * 用途说明:按门户分组查询角色(门户 → 角色两层结构) + * 参数说明 + * rolename 角色名称(可选,模糊搜索) + * 返回值说明: [{"tenantId":"...","tenantName":"水利门户","roles":[...]}, ...] + * 门户中文名通过字典 PLATFORM_TENANT 获取 + ***********************************/ + List> selectRoleListGroupedByTenant(String tenantId,String rolename); } diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java index 97908d08..5135292e 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysRoleServiceImpl.java @@ -6,8 +6,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.system.domain.SysDictionary; +import com.yfd.platform.system.domain.SysDictionaryItems; import com.yfd.platform.system.domain.SysRole; import com.yfd.platform.system.mapper.SysRoleMapper; +import com.yfd.platform.system.service.ISysDictionaryItemsService; +import com.yfd.platform.system.service.ISysDictionaryService; import com.yfd.platform.system.service.ISysRoleService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -16,8 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import jakarta.annotation.Resource; import java.sql.Timestamp; import java.text.DecimalFormat; -import java.util.List; -import java.util.Map; +import java.util.*; /** *

@@ -37,6 +40,12 @@ public class SysRoleServiceImpl extends ServiceImpl impl @Resource private UserServiceImpl currentuser; + @Resource + private ISysDictionaryService sysDictionaryService; + + @Resource + private ISysDictionaryItemsService sysDictionaryItemsService; + /*********************************** * 用途说明:新增角色 * 参数说明 @@ -185,4 +194,57 @@ public class SysRoleServiceImpl extends ServiceImpl impl return sysRoleList; } + /*********************************** + * 用途说明:按门户分组查询角色(门户 → 角色两层结构) + * 参数说明 + * rolename 角色名称(可选,模糊搜索) + * 返回值说明: [{"tenantId":"...","tenantName":"水利门户","roles":[...]}, ...] + * 门户中文名通过字典 PLATFORM_TENANT 获取 + ***********************************/ + @Override + public List> selectRoleListGroupedByTenant(String tenantId,String rolename) { + // 1. 查询所有角色(排除超级管理员级别,支持角色名称模糊搜索) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StrUtil.isNotBlank(tenantId), SysRole::getTenantId, tenantId); + queryWrapper.like(StrUtil.isNotBlank(rolename), SysRole::getRolename, rolename); +// queryWrapper.ne(SysRole::getLevel, "1"); + queryWrapper.orderByAsc(SysRole::getTenantId).orderByAsc(SysRole::getLevel); + List roleList = this.list(queryWrapper); + + // 2. 查询 PLATFORM_TENANT 字典项,构建 tenantId → tenantName 映射 + Map tenantNameMap = new HashMap<>(); + SysDictionary tenantDict = sysDictionaryService.getByDictCode("PLATFORM_TENANT"); + if (tenantDict != null) { + List items = sysDictionaryItemsService.list(new LambdaQueryWrapper().eq(SysDictionaryItems::getDictId, tenantDict.getId()).eq(StrUtil.isNotBlank(tenantId),SysDictionaryItems::getItemCode, tenantId).select(SysDictionaryItems::getItemCode, SysDictionaryItems::getDictName)); + if (items != null) { + for (SysDictionaryItems item : items) { + if (StrUtil.isNotBlank(item.getItemCode())) { + tenantNameMap.put(item.getItemCode(), item.getDictName()); + } + } + } + } + + // 3. 按 tenantId 分组(跳过无门户的角色) + Map> grouped = new LinkedHashMap<>(); + for (SysRole role : roleList) { + String code = role.getTenantId(); + if (StrUtil.isBlank(code)) { + continue; + } + grouped.computeIfAbsent(code, k -> new ArrayList<>()).add(role); + } + + // 4. 组装两层结构:门户 → 角色 + List> result = new ArrayList<>(); + for (Map.Entry> entry : grouped.entrySet()) { + Map group = new HashMap<>(); + group.put("tenantId", entry.getKey()); + group.put("tenantName", tenantNameMap.getOrDefault(entry.getKey(), entry.getKey())); + group.put("roles", entry.getValue()); + result.add(group); + } + return 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 3d59f975..96172af7 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 @@ -371,12 +371,21 @@ public class UserServiceImpl extends ServiceImpl impleme // 解析新角色列表 String[] newRoles = roleIds.split(","); - + String operator; + try { + operator = SecurityUtils.getUserId(); + } catch (Exception e) { + // 记录日志,方便排查 + log.error("获取当前用户ID失败", e); + // 根据业务需求处理:可返回默认值、抛出业务异常或置空 + operator = null; // 或 "anonymous" 等默认值 + } // 需要新增的角色(新角色 - 当前角色) for (String roleId : newRoles) { if (!currentRoleSet.contains(roleId)) { String id = IdUtil.fastSimpleUUID(); - sysUserMapper.addUserRoles(SecurityUtils.getUserId(),id, roleId, userId); + + sysUserMapper.addUserRoles(operator,id, roleId, userId); } } diff --git a/backend/src/main/resources/mapper/system/SysUserMapper.xml b/backend/src/main/resources/mapper/system/SysUserMapper.xml index a7c0bed3..8ba9cf6e 100644 --- a/backend/src/main/resources/mapper/system/SysUserMapper.xml +++ b/backend/src/main/resources/mapper/system/SysUserMapper.xml @@ -88,7 +88,7 @@ and (ut.TENANT_ID = #{tenantId} OR u.tenant_id = #{tenantId}) - ORDER BY u.lastmodifydate DESC + ORDER BY u.username