Commit 1bb204adb53e79d49a89090711b4e47bf465ac58

Authored by YunaiV
1 parent e3ddb29c

1. 优化分配菜单的逻辑,使用批量插入

2. 修复 CodegenEngine 生成代码时,Mapper.XML 地址不对
yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/mapper/BaseMapperX.java
... ... @@ -75,12 +75,20 @@ public interface BaseMapperX<T> extends BaseMapper<T> {
75 75 return selectList(new LambdaQueryWrapper<T>().in(field, values));
76 76 }
77 77  
  78 + /**
  79 + * 逐条插入,适合少量数据插入,或者对性能要求不高的场景
  80 + *
  81 + * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法
  82 + * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类
  83 + *
  84 + * @param entities 实体们
  85 + */
78 86 default void insertBatch(Collection<T> entities) {
79   - // TODO 芋艿:修改成支持批量的
80 87 entities.forEach(this::insert);
81 88 }
82 89  
83 90 default void updateBatch(T update) {
84 91 update(update, new QueryWrapper<>());
85 92 }
  93 +
86 94 }
... ...
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmTaskAssignRuleServiceImpl.java
... ... @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.permission.RoleApi;
21 21 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
22 22 import lombok.extern.slf4j.Slf4j;
23 23 import org.flowable.bpmn.model.BpmnModel;
24   -import org.flowable.bpmn.model.FlowElement;
25 24 import org.flowable.bpmn.model.UserTask;
26 25 import org.springframework.context.annotation.Lazy;
27 26 import org.springframework.stereotype.Service;
... ...
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -217,7 +217,7 @@ public class CodegenEngine {
217 217 private static String mapperXmlFilePath() {
218 218 return "yudao-module-${table.moduleName}/" + // 顶级模块
219 219 "yudao-module-${table.moduleName}-impl/" + // 子模块
220   - "src/resources/mapper/${table.businessName}/${table.className}Mapper.xml";
  220 + "src/main/java/resources/mapper/${table.businessName}/${table.className}Mapper.xml";
221 221 }
222 222  
223 223 private static String vueTemplatePath(String path) {
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuBatchInsertMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.dal.mysql.permission;
  2 +
  3 +import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
  4 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 + * 实体 {@link RoleMenuDO} 的批量插入 Mapper
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Repository
  13 +public class RoleMenuBatchInsertMapper extends ServiceImpl<RoleMenuMapper, RoleMenuDO> {
  14 +}
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/RoleMenuMapper.java
... ... @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission;
3 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 4 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
5 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
6 7 import org.apache.ibatis.annotations.Mapper;
7 8 import org.apache.ibatis.annotations.Select;
  9 +import org.springframework.stereotype.Repository;
8 10  
9 11 import java.util.Collection;
10 12 import java.util.Date;
... ... @@ -14,18 +16,12 @@ import java.util.stream.Collectors;
14 16 @Mapper
15 17 public interface RoleMenuMapper extends BaseMapperX<RoleMenuDO> {
16 18  
17   - default List<RoleMenuDO> selectListByRoleId(Long roleId) {
18   - return selectList(new QueryWrapper<RoleMenuDO>().eq("role_id", roleId));
  19 + @Repository
  20 + class BatchInsertMapper extends ServiceImpl<RoleMenuMapper, RoleMenuDO> {
19 21 }
20 22  
21   - default void insertList(Long roleId, Collection<Long> menuIds) {
22   - List<RoleMenuDO> list = menuIds.stream().map(menuId -> {
23   - RoleMenuDO entity = new RoleMenuDO();
24   - entity.setRoleId(roleId);
25   - entity.setMenuId(menuId);
26   - return entity;
27   - }).collect(Collectors.toList());
28   - insertBatch(list);
  23 + default List<RoleMenuDO> selectListByRoleId(Long roleId) {
  24 + return selectList(new QueryWrapper<RoleMenuDO>().eq("role_id", roleId));
29 25 }
30 26  
31 27 default void deleteListByRoleIdAndMenuIds(Long roleId, Collection<Long> menuIds) {
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleBatchInsertMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.dal.mysql.permission;
  2 +
  3 +import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
  4 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 + * 实体 {@link UserRoleDO} 的批量插入 Mapper
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Repository
  13 +public class UserRoleBatchInsertMapper extends ServiceImpl<UserRoleMapper, UserRoleDO> {
  14 +}
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/permission/UserRoleMapper.java
... ... @@ -7,7 +7,6 @@ import org.apache.ibatis.annotations.Mapper;
7 7  
8 8 import java.util.Collection;
9 9 import java.util.List;
10   -import java.util.stream.Collectors;
11 10  
12 11 @Mapper
13 12 public interface UserRoleMapper extends BaseMapperX<UserRoleDO> {
... ... @@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX&lt;UserRoleDO&gt; {
20 19 return selectList(new QueryWrapper<UserRoleDO>().eq("role_id", roleId));
21 20 }
22 21  
23   -
24   - default void insertList(Long userId, Collection<Long> roleIds) {
25   - List<UserRoleDO> list = roleIds.stream().map(roleId -> {
26   - UserRoleDO entity = new UserRoleDO();
27   - entity.setUserId(userId);
28   - entity.setRoleId(roleId);
29   - return entity;
30   - }).collect(Collectors.toList());
31   - insertBatch(list);
32   - }
33   -
34 22 default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) {
35 23 delete(new QueryWrapper<UserRoleDO>().eq("user_id", userId)
36 24 .in("role_id", roleIds));
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceImpl.java
... ... @@ -8,7 +8,6 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
8 8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
9 9 import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
10 10 import cn.iocoder.yudao.framework.security.core.LoginUser;
11   -import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
12 11 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
13 12 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
14 13 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
... ... @@ -16,8 +15,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
16 15 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
17 16 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
18 17 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
  18 +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper;
19 19 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper;
  20 +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleBatchInsertMapper;
20 21 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
  22 +import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
21 23 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer;
22 24 import cn.iocoder.yudao.module.system.service.dept.DeptService;
23 25 import com.google.common.collect.ImmutableMultimap;
... ... @@ -79,7 +81,11 @@ public class PermissionServiceImpl implements PermissionService {
79 81 @Resource
80 82 private RoleMenuMapper roleMenuMapper;
81 83 @Resource
  84 + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper;
  85 + @Resource
82 86 private UserRoleMapper userRoleMapper;
  87 + @Resource
  88 + private UserRoleBatchInsertMapper userRoleBatchInsertMapper;
83 89  
84 90 @Resource
85 91 private RoleService roleService;
... ... @@ -202,7 +208,12 @@ public class PermissionServiceImpl implements PermissionService {
202 208 Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds);
203 209 // 执行新增和删除。对于已经授权的菜单,不用做任何处理
204 210 if (!CollectionUtil.isEmpty(createMenuIds)) {
205   - roleMenuMapper.insertList(roleId, createMenuIds);
  211 + roleMenuBatchInsertMapper.saveBatch(CollectionUtils.convertList(createMenuIds, menuId -> {
  212 + RoleMenuDO entity = new RoleMenuDO();
  213 + entity.setRoleId(roleId);
  214 + entity.setMenuId(menuId);
  215 + return entity;
  216 + }));
206 217 }
207 218 if (!CollectionUtil.isEmpty(deleteMenuIds)) {
208 219 roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds);
... ... @@ -240,7 +251,12 @@ public class PermissionServiceImpl implements PermissionService {
240 251 Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds);
241 252 // 执行新增和删除。对于已经授权的角色,不用做任何处理
242 253 if (!CollectionUtil.isEmpty(createRoleIds)) {
243   - userRoleMapper.insertList(userId, createRoleIds);
  254 + userRoleBatchInsertMapper.saveBatch(CollectionUtils.convertList(createRoleIds, roleId -> {
  255 + UserRoleDO entity = new UserRoleDO();
  256 + entity.setUserId(userId);
  257 + entity.setRoleId(roleId);
  258 + return entity;
  259 + }));
244 260 }
245 261 if (!CollectionUtil.isEmpty(deleteMenuIds)) {
246 262 userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds);
... ...
yudao-module-system/yudao-module-system-impl/src/test/java/cn/iocoder/yudao/module/system/service/permission/PermissionServiceTest.java
... ... @@ -5,7 +5,9 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
5 5 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
6 6 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
7 7 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
  8 +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper;
8 9 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper;
  10 +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleBatchInsertMapper;
9 11 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
10 12 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer;
11 13 import cn.iocoder.yudao.module.system.service.dept.DeptService;
... ... @@ -30,7 +32,8 @@ import static org.mockito.ArgumentMatchers.same;
30 32 import static org.mockito.Mockito.verify;
31 33 import static org.mockito.Mockito.when;
32 34  
33   -@Import(PermissionServiceImpl.class)
  35 +@Import({PermissionServiceImpl.class,
  36 + RoleMenuBatchInsertMapper.class, UserRoleBatchInsertMapper.class})
34 37 public class PermissionServiceTest extends BaseDbUnitTest {
35 38  
36 39 @Resource
... ... @@ -39,7 +42,11 @@ public class PermissionServiceTest extends BaseDbUnitTest {
39 42 @Resource
40 43 private RoleMenuMapper roleMenuMapper;
41 44 @Resource
  45 + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper;
  46 + @Resource
42 47 private UserRoleMapper userRoleMapper;
  48 + @Resource
  49 + private UserRoleBatchInsertMapper userRoleBatchInsertMapper;
43 50  
44 51 @MockBean
45 52 private RoleService roleService;
... ...