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,12 +75,20 @@ public interface BaseMapperX<T> extends BaseMapper<T> {
75 return selectList(new LambdaQueryWrapper<T>().in(field, values)); 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 default void insertBatch(Collection<T> entities) { 86 default void insertBatch(Collection<T> entities) {
79 - // TODO 芋艿:修改成支持批量的  
80 entities.forEach(this::insert); 87 entities.forEach(this::insert);
81 } 88 }
82 89
83 default void updateBatch(T update) { 90 default void updateBatch(T update) {
84 update(update, new QueryWrapper<>()); 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,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.permission.RoleApi;
21 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 21 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
22 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
23 import org.flowable.bpmn.model.BpmnModel; 23 import org.flowable.bpmn.model.BpmnModel;
24 -import org.flowable.bpmn.model.FlowElement;  
25 import org.flowable.bpmn.model.UserTask; 24 import org.flowable.bpmn.model.UserTask;
26 import org.springframework.context.annotation.Lazy; 25 import org.springframework.context.annotation.Lazy;
27 import org.springframework.stereotype.Service; 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,7 +217,7 @@ public class CodegenEngine {
217 private static String mapperXmlFilePath() { 217 private static String mapperXmlFilePath() {
218 return "yudao-module-${table.moduleName}/" + // 顶级模块 218 return "yudao-module-${table.moduleName}/" + // 顶级模块
219 "yudao-module-${table.moduleName}-impl/" + // 子模块 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 private static String vueTemplatePath(String path) { 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,8 +3,10 @@ package cn.iocoder.yudao.module.system.dal.mysql.permission;
3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 3 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; 4 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
6 import org.apache.ibatis.annotations.Mapper; 7 import org.apache.ibatis.annotations.Mapper;
7 import org.apache.ibatis.annotations.Select; 8 import org.apache.ibatis.annotations.Select;
  9 +import org.springframework.stereotype.Repository;
8 10
9 import java.util.Collection; 11 import java.util.Collection;
10 import java.util.Date; 12 import java.util.Date;
@@ -14,18 +16,12 @@ import java.util.stream.Collectors; @@ -14,18 +16,12 @@ import java.util.stream.Collectors;
14 @Mapper 16 @Mapper
15 public interface RoleMenuMapper extends BaseMapperX<RoleMenuDO> { 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 default void deleteListByRoleIdAndMenuIds(Long roleId, Collection<Long> menuIds) { 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 +7,6 @@ import org.apache.ibatis.annotations.Mapper;
7 7
8 import java.util.Collection; 8 import java.util.Collection;
9 import java.util.List; 9 import java.util.List;
10 -import java.util.stream.Collectors;  
11 10
12 @Mapper 11 @Mapper
13 public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { 12 public interface UserRoleMapper extends BaseMapperX<UserRoleDO> {
@@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX&lt;UserRoleDO&gt; { @@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX&lt;UserRoleDO&gt; {
20 return selectList(new QueryWrapper<UserRoleDO>().eq("role_id", roleId)); 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 default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) { 22 default void deleteListByUserIdAndRoleIdIds(Long userId, Collection<Long> roleIds) {
35 delete(new QueryWrapper<UserRoleDO>().eq("user_id", userId) 23 delete(new QueryWrapper<UserRoleDO>().eq("user_id", userId)
36 .in("role_id", roleIds)); 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,7 +8,6 @@ import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 8 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
9 import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO; 9 import cn.iocoder.yudao.framework.datapermission.core.dept.service.dto.DeptDataPermissionRespDTO;
10 import cn.iocoder.yudao.framework.security.core.LoginUser; 10 import cn.iocoder.yudao.framework.security.core.LoginUser;
11 -import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;  
12 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; 11 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
13 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; 12 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
14 import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; 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,8 +15,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
16 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; 15 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
17 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; 16 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
18 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; 17 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
  18 +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper;
19 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; 19 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper;
  20 +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleBatchInsertMapper;
20 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; 21 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
  22 +import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum;
21 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; 23 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer;
22 import cn.iocoder.yudao.module.system.service.dept.DeptService; 24 import cn.iocoder.yudao.module.system.service.dept.DeptService;
23 import com.google.common.collect.ImmutableMultimap; 25 import com.google.common.collect.ImmutableMultimap;
@@ -79,7 +81,11 @@ public class PermissionServiceImpl implements PermissionService { @@ -79,7 +81,11 @@ public class PermissionServiceImpl implements PermissionService {
79 @Resource 81 @Resource
80 private RoleMenuMapper roleMenuMapper; 82 private RoleMenuMapper roleMenuMapper;
81 @Resource 83 @Resource
  84 + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper;
  85 + @Resource
82 private UserRoleMapper userRoleMapper; 86 private UserRoleMapper userRoleMapper;
  87 + @Resource
  88 + private UserRoleBatchInsertMapper userRoleBatchInsertMapper;
83 89
84 @Resource 90 @Resource
85 private RoleService roleService; 91 private RoleService roleService;
@@ -202,7 +208,12 @@ public class PermissionServiceImpl implements PermissionService { @@ -202,7 +208,12 @@ public class PermissionServiceImpl implements PermissionService {
202 Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds); 208 Collection<Long> deleteMenuIds = CollUtil.subtract(dbMenuIds, menuIds);
203 // 执行新增和删除。对于已经授权的菜单,不用做任何处理 209 // 执行新增和删除。对于已经授权的菜单,不用做任何处理
204 if (!CollectionUtil.isEmpty(createMenuIds)) { 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 if (!CollectionUtil.isEmpty(deleteMenuIds)) { 218 if (!CollectionUtil.isEmpty(deleteMenuIds)) {
208 roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds); 219 roleMenuMapper.deleteListByRoleIdAndMenuIds(roleId, deleteMenuIds);
@@ -240,7 +251,12 @@ public class PermissionServiceImpl implements PermissionService { @@ -240,7 +251,12 @@ public class PermissionServiceImpl implements PermissionService {
240 Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds); 251 Collection<Long> deleteMenuIds = CollUtil.subtract(dbRoleIds, roleIds);
241 // 执行新增和删除。对于已经授权的角色,不用做任何处理 252 // 执行新增和删除。对于已经授权的角色,不用做任何处理
242 if (!CollectionUtil.isEmpty(createRoleIds)) { 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 if (!CollectionUtil.isEmpty(deleteMenuIds)) { 261 if (!CollectionUtil.isEmpty(deleteMenuIds)) {
246 userRoleMapper.deleteListByUserIdAndRoleIdIds(userId, deleteMenuIds); 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,7 +5,9 @@ import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
5 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; 5 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
6 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO; 6 import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleMenuDO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO; 7 import cn.iocoder.yudao.module.system.dal.dataobject.permission.UserRoleDO;
  8 +import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuBatchInsertMapper;
8 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper; 9 import cn.iocoder.yudao.module.system.dal.mysql.permission.RoleMenuMapper;
  10 +import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleBatchInsertMapper;
9 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper; 11 import cn.iocoder.yudao.module.system.dal.mysql.permission.UserRoleMapper;
10 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer; 12 import cn.iocoder.yudao.module.system.mq.producer.permission.PermissionProducer;
11 import cn.iocoder.yudao.module.system.service.dept.DeptService; 13 import cn.iocoder.yudao.module.system.service.dept.DeptService;
@@ -30,7 +32,8 @@ import static org.mockito.ArgumentMatchers.same; @@ -30,7 +32,8 @@ import static org.mockito.ArgumentMatchers.same;
30 import static org.mockito.Mockito.verify; 32 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when; 33 import static org.mockito.Mockito.when;
32 34
33 -@Import(PermissionServiceImpl.class) 35 +@Import({PermissionServiceImpl.class,
  36 + RoleMenuBatchInsertMapper.class, UserRoleBatchInsertMapper.class})
34 public class PermissionServiceTest extends BaseDbUnitTest { 37 public class PermissionServiceTest extends BaseDbUnitTest {
35 38
36 @Resource 39 @Resource
@@ -39,7 +42,11 @@ public class PermissionServiceTest extends BaseDbUnitTest { @@ -39,7 +42,11 @@ public class PermissionServiceTest extends BaseDbUnitTest {
39 @Resource 42 @Resource
40 private RoleMenuMapper roleMenuMapper; 43 private RoleMenuMapper roleMenuMapper;
41 @Resource 44 @Resource
  45 + private RoleMenuBatchInsertMapper roleMenuBatchInsertMapper;
  46 + @Resource
42 private UserRoleMapper userRoleMapper; 47 private UserRoleMapper userRoleMapper;
  48 + @Resource
  49 + private UserRoleBatchInsertMapper userRoleBatchInsertMapper;
43 50
44 @MockBean 51 @MockBean
45 private RoleService roleService; 52 private RoleService roleService;