Commit 3263b0ab5b18c9dd655008bbd764dc584c9028ed
Committed by
Gitee
!114 1. 优化分配菜单的逻辑,使用批量插入 2. 修复 CodegenEngine 生成代码时,Mapper.XML 地址不对
Merge pull request !114 from 芋道源码/feature/1.6.2
Showing
9 changed files
with
71 additions
and
29 deletions
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<UserRoleDO> { | @@ -20,17 +19,6 @@ public interface UserRoleMapper extends BaseMapperX<UserRoleDO> { | ||
| 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; |