From 5cfed17956ba1b20c438317e78348a682bd4e89f Mon Sep 17 00:00:00 2001 From: chenxing Date: Thu, 13 Aug 2026 19:15:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E6=94=BE=E6=8E=A5=E5=8F=A3=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E8=8E=B7=E5=8F=96=E7=BB=84=E6=95=B0=E6=8D=AE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OpenApiAuthEnforceConfiguration.java | 1 + .../config/UserBaseUserDetailsProvider.java | 1 + .../controller/api/SysUserController.java | 1 + .../userbase/service/ISysGroupService.java | 27 ++++ .../service/impl/SysGroupService.java | 122 ++++++++++++++++++ 5 files changed, 152 insertions(+) diff --git a/src/main/java/com/yunhai/userbase/config/OpenApiAuthEnforceConfiguration.java b/src/main/java/com/yunhai/userbase/config/OpenApiAuthEnforceConfiguration.java index 72917c5..2779fac 100644 --- a/src/main/java/com/yunhai/userbase/config/OpenApiAuthEnforceConfiguration.java +++ b/src/main/java/com/yunhai/userbase/config/OpenApiAuthEnforceConfiguration.java @@ -3,6 +3,7 @@ package com.yunhai.userbase.config; import com.yunhai.platform.appauth.AppAuthFilter; import com.yunhai.platform.appauth.AppAuthProperties; import com.yunhai.platform.auth.UserDetailsProvider; +import com.yunhai.userbase.repository.ApplicationInfoRepository; import com.yunhai.userbase.service.impl.UserCenterService; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; diff --git a/src/main/java/com/yunhai/userbase/config/UserBaseUserDetailsProvider.java b/src/main/java/com/yunhai/userbase/config/UserBaseUserDetailsProvider.java index 6de8f35..ccfec7b 100644 --- a/src/main/java/com/yunhai/userbase/config/UserBaseUserDetailsProvider.java +++ b/src/main/java/com/yunhai/userbase/config/UserBaseUserDetailsProvider.java @@ -3,6 +3,7 @@ package com.yunhai.userbase.config; import com.yunhai.platform.auth.UserDetailsProvider; import com.yunhai.platform.utils.model.BoaUser; import com.yunhai.userbase.service.impl.UserCenterService; +import com.yunhai.userbase.service.impl.UserCenterService; /** * 平台 {@link UserDetailsProvider} 的 UserBase 本地实现:CAS 会话流解析出登录名/手机号后, diff --git a/src/main/java/com/yunhai/userbase/controller/api/SysUserController.java b/src/main/java/com/yunhai/userbase/controller/api/SysUserController.java index bb31fae..186d5d7 100644 --- a/src/main/java/com/yunhai/userbase/controller/api/SysUserController.java +++ b/src/main/java/com/yunhai/userbase/controller/api/SysUserController.java @@ -43,6 +43,7 @@ public class SysUserController { @PostMapping("Add") public void add(@RequestBody @Validated(ValidationGroups.Create.class) SysUserRequest request) { List data=new ArrayList<>(); + sysUserService.add(request); } diff --git a/src/main/java/com/yunhai/userbase/service/ISysGroupService.java b/src/main/java/com/yunhai/userbase/service/ISysGroupService.java index ae3ad47..3ffc6e0 100644 --- a/src/main/java/com/yunhai/userbase/service/ISysGroupService.java +++ b/src/main/java/com/yunhai/userbase/service/ISysGroupService.java @@ -5,6 +5,7 @@ import com.yunhai.userbase.model.sysgroup.SysGroupMoveRequest; import com.yunhai.userbase.model.sysgroup.SysGroupQuery; import com.yunhai.userbase.model.sysgroup.SysGroupRequest; import com.yunhai.userbase.model.sysgroup.SysGroupSortRequest; +import com.yunhai.platform.utils.model.BoaGroup; import com.yunhai.userbase.model.sysgroup.SysGroupVo; import java.util.List; @@ -51,4 +52,30 @@ public interface ISysGroupService { * @return 含自身在内的组ID集合;组不存在时返回仅含自身的集合 */ List listSelfAndDescendantIds(Integer groupId); + + /** + * 获取整个平台的组树:从根节点(pid=0)开始,children 递归嵌套全部后代。
+ * 根节点唯一,取最小 id 作为树入口。表为空时返回 null。 + */ + BoaGroup getGroups(); + + /** + * 获取单个组;withSub=true 时递归挂上全部子孙(整棵子树),false/不传时只返回节点本身(children 为 null)。
+ * 组不存在时返回 null。 + * + * @param groupId 组ID + * @param withSub 是否展开子节点,缺省 false + * @return 组节点(BoaGroup) + */ + BoaGroup getGroupById(Integer groupId, Boolean withSub); + + /** + * 批量获取组;ids 逗号/空格分隔,按入参顺序返回,不存在的 id 跳过。
+ * withSub 语义同 {@link #getGroupById(Integer, Boolean)}。 + * + * @param ids 组ID列表(逗号/空格分隔) + * @param withSub 是否展开子节点,缺省 false + * @return 组节点列表(按入参顺序;不存在的跳过) + */ + List getGroupList(String ids, Boolean withSub); } diff --git a/src/main/java/com/yunhai/userbase/service/impl/SysGroupService.java b/src/main/java/com/yunhai/userbase/service/impl/SysGroupService.java index 54bc3fb..f357502 100644 --- a/src/main/java/com/yunhai/userbase/service/impl/SysGroupService.java +++ b/src/main/java/com/yunhai/userbase/service/impl/SysGroupService.java @@ -2,6 +2,7 @@ package com.yunhai.userbase.service.impl; import com.yunhai.userbase.entity.SysGroup; import com.yunhai.platform.utils.exception.DException; +import com.yunhai.platform.utils.model.BoaGroup; import com.yunhai.userbase.enums.GroupTypeEnum; import com.yunhai.userbase.enums.IEnum; import com.yunhai.userbase.model.sysgroup.SysGroupBatchRequest; @@ -223,6 +224,77 @@ public class SysGroupService implements ISysGroupService { return vo; } + // ===================== 开放接口:组树(BoaGroup) ===================== + + /** + * 获取整个平台的组树:从根节点(pid=0)开始,children 递归嵌套全部后代。
+ * 根节点唯一,取最小 id 作为树入口。表为空或无根时返回 null。 + */ + @Override + public BoaGroup getGroups() { + List all = sysGroupRepository.findAll(); + if (all.isEmpty()) { + return null; + } + Map> childrenMap = buildSortedChildrenMap(all); + List roots = childrenMap.getOrDefault(ROOT_PARENT_ID, new ArrayList<>()); + if (roots.isEmpty()) { + return null; + } + // 根节点唯一,取最小 id 作为整棵树入口 + SysGroup root = roots.stream() + .min(Comparator.comparingInt(SysGroup::getId)) + .orElse(roots.get(0)); + return buildBoaNode(root, childrenMap, true); + } + + /** + * 获取单个组;withSub=true 时递归挂上全部子孙(整棵子树),false/不传时只返回节点本身(children 为 null)。
+ * 组不存在时返回 null。 + */ + @Override + public BoaGroup getGroupById(Integer groupId, Boolean withSub) { + if (groupId == null) { + return null; + } + SysGroup entity = sysGroupRepository.findById(groupId).orElse(null); + if (entity == null) { + return null; + } + if (!Boolean.TRUE.equals(withSub)) { + return convertToBoaGroup(entity); + } + List all = sysGroupRepository.findAll(); + Map> childrenMap = buildSortedChildrenMap(all); + return buildBoaNode(entity, childrenMap, true); + } + + /** + * 批量获取组;ids 逗号/空格分隔,按入参顺序返回,不存在的 id 跳过。
+ * withSub 语义同 {@link #getGroupById(Integer, Boolean)}。 + */ + @Override + public List getGroupList(String ids, Boolean withSub) { + List idList = parseIds(ids); + if (idList.isEmpty()) { + return new ArrayList<>(); + } + boolean expand = Boolean.TRUE.equals(withSub); + List all = sysGroupRepository.findAll(); + Map allMap = all.stream() + .collect(Collectors.toMap(SysGroup::getId, g -> g, (a, b) -> a)); + Map> childrenMap = buildSortedChildrenMap(all); + List result = new ArrayList<>(); + for (Integer id : idList) { + SysGroup g = allMap.get(id); + if (g == null) { + continue; + } + result.add(expand ? buildBoaNode(g, childrenMap, true) : convertToBoaGroup(g)); + } + return result; + } + // ===================== 批量新增 ===================== @Override @@ -374,6 +446,56 @@ public class SysGroupService implements ISysGroupService { // ===================== 私有工具 ===================== + /** SysGroup -> BoaGroup(id/name/parentId/type/sort);children 默认 null(未展开)。 */ + private BoaGroup convertToBoaGroup(SysGroup entity) { + BoaGroup bg = new BoaGroup(); + bg.setId(entity.getId()); + bg.setName(entity.getName()); + bg.setParentId(entity.getParentId()); + bg.setType(entity.getType() == null ? null : entity.getType().getKey()); + bg.setSort(entity.getSort()); + return bg; + } + + /** + * 递归组装 BoaGroup 树节点。withSub=true 时挂上全部子孙(子树),children 为列表(无子则空列表); + * withSub=false 时直接返回节点,children 保持 null(表示未展开)。 + */ + private BoaGroup buildBoaNode(SysGroup node, Map> childrenMap, boolean withSub) { + BoaGroup bg = convertToBoaGroup(node); + if (!withSub) { + return bg; + } + List childBgs = new ArrayList<>(); + List children = childrenMap.get(node.getId()); + if (children != null) { + for (SysGroup child : children) { + childBgs.add(buildBoaNode(child, childrenMap, true)); + } + } + bg.setChildren(childBgs); + return bg; + } + + /** 解析逗号/空格分隔的 id 串为 Integer 列表;非数字片段忽略。 */ + private List parseIds(String ids) { + List result = new ArrayList<>(); + if (ids == null || ids.trim().isEmpty()) { + return result; + } + for (String s : ids.split("[,\\s]+")) { + if (s == null || s.trim().isEmpty()) { + continue; + } + try { + result.add(Integer.parseInt(s.trim())); + } catch (NumberFormatException ignored) { + // 跳过非数字片段 + } + } + return result; + } + /** pid 下已有子节点的最大 sort +1;无子节点返回 1。 */ private int nextSort(Integer pid) { Integer max = sysGroupRepository.findMaxSortByParentId(pid);