diff --git a/continew-system/src/main/java/top/continew/admin/system/container/SystemContainer.java b/continew-system/src/main/java/top/continew/admin/system/container/SystemContainer.java
new file mode 100644
index 00000000..16bd40ca
--- /dev/null
+++ b/continew-system/src/main/java/top/continew/admin/system/container/SystemContainer.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.admin.system.container;
+
+import cn.crane4j.annotation.ContainerMethod;
+import cn.crane4j.annotation.MappingType;
+import cn.hutool.core.collection.CollUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+import top.continew.admin.common.constant.ContainerConstants;
+import top.continew.admin.system.mapper.RoleMapper;
+import top.continew.admin.system.mapper.UserRoleMapper;
+import top.continew.admin.system.model.entity.RoleDO;
+import top.continew.admin.system.model.entity.UserRoleDO;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 系统管理容器(Crane4j 数据填充)
+ *
不建议复用,Crane4j 对列表填充聚合查询,优化性能
+ *
+ * @author Charles7c
+ * @since 2025/6/29 11:51
+ */
+@Component
+@RequiredArgsConstructor
+public class SystemContainer {
+
+ private final UserRoleMapper userRoleMapper;
+ private final RoleMapper roleMapper;
+
+ /**
+ * 根据用户 ID 列表获取角色 ID 列表
+ *
+ * @param userIds 用户 ID 列表
+ * @return 角色 ID 列表
+ */
+ @ContainerMethod(namespace = ContainerConstants.USER_ROLE_ID_LIST, resultKey = "userId", resultType = UserRoleDO.class, type = MappingType.ONE_TO_MANY)
+ public List listRoleIdByUserId(List userIds) {
+ return userRoleMapper.lambdaQuery()
+ .select(UserRoleDO::getRoleId, UserRoleDO::getUserId)
+ .in(UserRoleDO::getUserId, userIds)
+ .list();
+ }
+
+ /**
+ * 根据角色 ID 列表获取角色名称列表
+ *
+ * @param ids 角色 ID 列表
+ * @return 角色名称列表
+ */
+ @ContainerMethod(namespace = ContainerConstants.USER_ROLE_NAME_LIST, resultType = RoleDO.class)
+ public List listRoleNameByIds(List ids) {
+ if (CollUtil.isEmpty(ids)) {
+ return Collections.emptyList();
+ }
+ return roleMapper.lambdaQuery().select(RoleDO::getName, RoleDO::getId).in(RoleDO::getId, ids).list();
+ }
+}
diff --git a/continew-system/src/main/java/top/continew/admin/system/model/resp/role/RoleUserResp.java b/continew-system/src/main/java/top/continew/admin/system/model/resp/role/RoleUserResp.java
index 6e0b010a..dd4f3cbe 100644
--- a/continew-system/src/main/java/top/continew/admin/system/model/resp/role/RoleUserResp.java
+++ b/continew-system/src/main/java/top/continew/admin/system/model/resp/role/RoleUserResp.java
@@ -19,6 +19,7 @@ package top.continew.admin.system.model.resp.role;
import cn.crane4j.annotation.Assemble;
import cn.crane4j.annotation.Mapping;
import cn.crane4j.core.executor.handler.ManyToManyAssembleOperationHandler;
+import cn.crane4j.core.executor.handler.OneToManyAssembleOperationHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import top.continew.admin.common.constant.ContainerConstants;
@@ -60,7 +61,7 @@ public class RoleUserResp implements Serializable {
* 用户 ID
*/
@Schema(description = "用户 ID", example = "1")
- @Assemble(prop = ":roleIds", sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST)
+ @Assemble(props = @Mapping(src = "roleId", ref = "roleIds"), sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST, handlerType = OneToManyAssembleOperationHandler.class)
private Long userId;
/**
diff --git a/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserDetailResp.java b/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserDetailResp.java
index 89204fa2..aa61f3a3 100644
--- a/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserDetailResp.java
+++ b/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserDetailResp.java
@@ -22,6 +22,7 @@ import cn.crane4j.annotation.ContainerMethod;
import cn.crane4j.annotation.Mapping;
import cn.crane4j.annotation.condition.ConditionOnExpression;
import cn.crane4j.core.executor.handler.ManyToManyAssembleOperationHandler;
+import cn.crane4j.core.executor.handler.OneToManyAssembleOperationHandler;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -51,7 +52,7 @@ import java.util.Objects;
@Data
@ExcelIgnoreUnannotated
@Schema(description = "用户详情响应参数")
-@Assemble(key = "id", prop = ":roleIds", sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST)
+@Assemble(key = "id", props = @Mapping(src = "roleId", ref = "roleIds"), sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST, handlerType = OneToManyAssembleOperationHandler.class)
public class UserDetailResp extends BaseDetailResp {
@Serial
@@ -105,7 +106,7 @@ public class UserDetailResp extends BaseDetailResp {
* 角色 ID 列表
*/
@Schema(description = "角色 ID 列表", example = "2")
- @Assemble(prop = ":roleNames", container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
+ @Assemble(props = @Mapping(src = "name", ref = "roleNames"), container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
@ExcelProperty(value = "角色 ID 列表", converter = ExcelListConverter.class, order = 8)
private List roleIds;
diff --git a/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserResp.java b/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserResp.java
index d661a3f8..7fbc9aea 100644
--- a/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserResp.java
+++ b/continew-system/src/main/java/top/continew/admin/system/model/resp/user/UserResp.java
@@ -17,7 +17,9 @@
package top.continew.admin.system.model.resp.user;
import cn.crane4j.annotation.Assemble;
+import cn.crane4j.annotation.Mapping;
import cn.crane4j.core.executor.handler.ManyToManyAssembleOperationHandler;
+import cn.crane4j.core.executor.handler.OneToManyAssembleOperationHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import top.continew.admin.common.model.resp.BaseDetailResp;
@@ -40,7 +42,7 @@ import java.util.Objects;
*/
@Data
@Schema(description = "用户响应参数")
-@Assemble(key = "id", prop = ":roleIds", sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST)
+@Assemble(key = "id", props = @Mapping(src = "roleId", ref = "roleIds"), sort = 0, container = ContainerConstants.USER_ROLE_ID_LIST, handlerType = OneToManyAssembleOperationHandler.class)
public class UserResp extends BaseDetailResp {
@Serial
@@ -118,7 +120,7 @@ public class UserResp extends BaseDetailResp {
* 角色 ID 列表
*/
@Schema(description = "角色 ID 列表", example = "2")
- @Assemble(prop = ":roleNames", container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
+ @Assemble(props = @Mapping(src = "name", ref = "roleNames"), container = ContainerConstants.USER_ROLE_NAME_LIST, handlerType = ManyToManyAssembleOperationHandler.class)
private List roleIds;
/**
diff --git a/continew-system/src/main/java/top/continew/admin/system/service/RoleService.java b/continew-system/src/main/java/top/continew/admin/system/service/RoleService.java
index 6b94c39f..3ab04120 100644
--- a/continew-system/src/main/java/top/continew/admin/system/service/RoleService.java
+++ b/continew-system/src/main/java/top/continew/admin/system/service/RoleService.java
@@ -61,14 +61,6 @@ public interface RoleService extends BaseService listPermissionByUserId(Long userId);
- /**
- * 根据 ID 列表查询
- *
- * @param ids ID 列表
- * @return 名称列表
- */
- List listNameByIds(List ids);
-
/**
* 根据用户 ID 查询角色编码
*
diff --git a/continew-system/src/main/java/top/continew/admin/system/service/impl/RoleServiceImpl.java b/continew-system/src/main/java/top/continew/admin/system/service/impl/RoleServiceImpl.java
index 929b8582..e64b4e7d 100644
--- a/continew-system/src/main/java/top/continew/admin/system/service/impl/RoleServiceImpl.java
+++ b/continew-system/src/main/java/top/continew/admin/system/service/impl/RoleServiceImpl.java
@@ -16,7 +16,6 @@
package top.continew.admin.system.service.impl;
-import cn.crane4j.annotation.ContainerMethod;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alicp.jetcache.anno.CacheInvalidate;
@@ -25,7 +24,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import top.continew.admin.common.constant.CacheConstants;
-import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.constant.SysConstants;
import top.continew.admin.common.context.RoleContext;
import top.continew.admin.common.context.UserContext;
@@ -165,15 +163,6 @@ public class RoleServiceImpl extends BaseServiceImpl listNameByIds(List ids) {
- if (CollUtil.isEmpty(ids)) {
- return Collections.emptyList();
- }
- return baseMapper.lambdaQuery().select(RoleDO::getName, RoleDO::getId).in(RoleDO::getId, ids).list();
- }
-
@Override
public Set listCodeByUserId(Long userId) {
List roleIdList = userRoleService.listRoleIdByUserId(userId);
diff --git a/continew-system/src/main/java/top/continew/admin/system/service/impl/UserRoleServiceImpl.java b/continew-system/src/main/java/top/continew/admin/system/service/impl/UserRoleServiceImpl.java
index 9723c636..aec19b39 100644
--- a/continew-system/src/main/java/top/continew/admin/system/service/impl/UserRoleServiceImpl.java
+++ b/continew-system/src/main/java/top/continew/admin/system/service/impl/UserRoleServiceImpl.java
@@ -17,8 +17,6 @@
package top.continew.admin.system.service.impl;
import cn.crane4j.annotation.AutoOperate;
-import cn.crane4j.annotation.ContainerMethod;
-import cn.crane4j.annotation.MappingType;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -27,7 +25,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import top.continew.admin.common.constant.ContainerConstants;
import top.continew.admin.common.constant.SysConstants;
import top.continew.admin.system.mapper.UserRoleMapper;
import top.continew.admin.system.model.entity.UserRoleDO;
@@ -117,7 +114,6 @@ public class UserRoleServiceImpl implements UserRoleService {
}
@Override
- @ContainerMethod(namespace = ContainerConstants.USER_ROLE_ID_LIST, type = MappingType.ORDER_OF_KEYS)
public List listRoleIdByUserId(Long userId) {
return baseMapper.lambdaQuery()
.select(UserRoleDO::getRoleId)