Commit e958657373c7919ea27c07bbb41ac98df6446033

Authored by 芋道源码
Committed by Gitee
2 parents d7308aa9 446f601c

!97 修复仅本人数据权限时,个人中心会报错的问题

Merge pull request !97 from 芋道源码/feature/1.6.1
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java
1 1 package cn.iocoder.yudao.module.infra.controller.admin.codegen.vo;
2 2  
  3 +import cn.hutool.core.util.ObjectUtil;
3 4 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.column.CodegenColumnBaseVO;
4 5 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTableBaseVO;
  6 +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
5 7 import io.swagger.annotations.ApiModel;
6 8 import io.swagger.annotations.ApiModelProperty;
7 9 import lombok.Data;
... ... @@ -9,6 +11,7 @@ import lombok.EqualsAndHashCode;
9 11 import lombok.ToString;
10 12  
11 13 import javax.validation.Valid;
  14 +import javax.validation.constraints.AssertTrue;
12 15 import javax.validation.constraints.NotNull;
13 16 import java.util.List;
14 17  
... ... @@ -28,11 +31,19 @@ public class CodegenUpdateReqVO {
28 31 @Data
29 32 @EqualsAndHashCode(callSuper = true)
30 33 @ToString(callSuper = true)
  34 + @Valid
31 35 public static class Table extends CodegenTableBaseVO {
32 36  
33 37 @ApiModelProperty(value = "编号", required = true, example = "1")
34 38 private Long id;
35 39  
  40 + @AssertTrue(message = "上级菜单不能为空")
  41 + public boolean isParentMenuIdValid() {
  42 + // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的
  43 + return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene())
  44 + || getParentMenuId() != null;
  45 + }
  46 +
36 47 }
37 48  
38 49 @ApiModel("更新表定义")
... ...
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
... ... @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.infra.service.codegen;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 6 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO;
6 7 import cn.iocoder.yudao.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO;
7 8 import cn.iocoder.yudao.module.infra.convert.codegen.CodegenConvert;
... ... @@ -14,21 +15,18 @@ import cn.iocoder.yudao.module.infra.dal.mysql.codegen.CodegenTableMapper;
14 15 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.SchemaColumnMapper;
15 16 import cn.iocoder.yudao.module.infra.dal.mysql.codegen.SchemaTableMapper;
16 17 import cn.iocoder.yudao.module.infra.enums.codegen.CodegenImportTypeEnum;
  18 +import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
17 19 import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
18 20 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenBuilder;
19 21 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenEngine;
20 22 import cn.iocoder.yudao.module.infra.service.codegen.inner.CodegenSQLParser;
21 23 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
22   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
23 24 import org.apache.commons.collections4.KeyValue;
24 25 import org.springframework.stereotype.Service;
25 26 import org.springframework.transaction.annotation.Transactional;
26 27  
27 28 import javax.annotation.Resource;
28   -import java.util.ArrayList;
29   -import java.util.List;
30   -import java.util.Map;
31   -import java.util.Set;
  29 +import java.util.*;
32 30 import java.util.stream.Collectors;
33 31  
34 32 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -266,27 +264,8 @@ public class CodegenServiceImpl implements CodegenService {
266 264 // TODO 强制移除 Quartz 的表,未来做成可配置
267 265 tables.removeIf(table -> table.getTableName().startsWith("QRTZ_"));
268 266 tables.removeIf(table -> table.getTableName().startsWith("ACT_"));
  267 + tables.removeIf(table -> table.getTableName().startsWith("FLW_"));
269 268 return tables;
270 269 }
271 270  
272   -// /**
273   -// * 修改保存参数校验
274   -// *
275   -// * @param genTable 业务信息
276   -// */
277   -// @Override
278   -// public void validateEdit(GenTable genTable) {
279   -// if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) {
280   -// String options = JSON.toJSONString(genTable.getParams());
281   -// JSONObject paramsObj = JSONObject.parseObject(options);
282   -// if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) {
283   -// throw new CustomException("树编码字段不能为空");
284   -// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) {
285   -// throw new CustomException("树父编码字段不能为空");
286   -// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) {
287   -// throw new CustomException("树名称字段不能为空");
288   -// }
289   -// }
290   -// }
291   -
292 271 }
... ...
yudao-module-infra/yudao-module-infra-impl/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java
... ... @@ -51,6 +51,8 @@ public class CodegenBuilder {
51 51 .put("image", CodegenColumnHtmlTypeEnum.UPLOAD_IMAGE)
52 52 .put("file", CodegenColumnHtmlTypeEnum.UPLOAD_FILE)
53 53 .put("content", CodegenColumnHtmlTypeEnum.EDITOR)
  54 + .put("description", CodegenColumnHtmlTypeEnum.EDITOR)
  55 + .put("demo", CodegenColumnHtmlTypeEnum.EDITOR)
54 56 .put("time", CodegenColumnHtmlTypeEnum.DATETIME)
55 57 .put("date", CodegenColumnHtmlTypeEnum.DATETIME)
56 58 .build();
... ... @@ -58,7 +60,7 @@ public class CodegenBuilder {
58 60 /**
59 61 * 多租户编号的字段名
60 62 */
61   - public static final String TENANT_ID_FIELD = "tenant_id";
  63 + public static final String TENANT_ID_FIELD = "tenantId";
62 64 /**
63 65 * {@link cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO} 的字段
64 66 */
... ... @@ -121,14 +123,13 @@ public class CodegenBuilder {
121 123 private void initTableDefault(CodegenTableDO table) {
122 124 // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 SystemDept
123 125 // 如果不希望 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 Dept 即可
124   - table.setModuleName(StrUtil.subBefore(table.getTableName(),
125   - '_', false)); // 第一个 _ 前缀的前面,作为 module 名字
  126 + table.setModuleName(subBefore(table.getTableName(), '_', false)); // 第一个 _ 前缀的前面,作为 module 名字
126 127 table.setBusinessName(toCamelCase(subAfter(table.getTableName(),
127 128 '_', false))); // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰
128   - table.setClassName(upperFirst(toCamelCase(table.getTableName()))); // 驼峰 + 首字母大写
  129 + table.setClassName(upperFirst(toCamelCase( // 驼峰 + 首字母大写
  130 + subAfter(table.getTableName(), '_', false)))); // 第一个 _ 前缀的前面,作为 class 名字
129 131 table.setClassComment(subBefore(table.getTableComment(), // 去除结尾的表,作为类描述
130 132 '表', true));
131   - table.setAuthor("芋艿"); // TODO 稍后改成创建人
132 133 table.setTemplateType(CodegenTemplateTypeEnum.CRUD.getType());
133 134 }
134 135  
... ... @@ -157,7 +158,7 @@ public class CodegenBuilder {
157 158 column.setJavaField(toCamelCase(column.getColumnName()));
158 159 // 处理 dictType 字段,暂无
159 160 // 处理 javaType 字段
160   - String dbType = StrUtil.subBefore(column.getColumnType(), '(', false);
  161 + String dbType = subBefore(column.getColumnType(), '(', false);
161 162 javaTypeMappings.entrySet().stream()
162 163 .filter(entry -> entry.getValue().contains(dbType))
163 164 .findFirst().ifPresent(entry -> column.setJavaType(entry.getKey()));
... ...
yudao-module-infra/yudao-module-infra-impl/src/main/resources/codegen/java/test/serviceTest.vm
1 1 package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
2 2  
  3 +import org.junit.jupiter.api.Disabled;
3 4 import org.junit.jupiter.api.Test;
4 5 import org.springframework.boot.test.mock.mockito.MockBean;
5 6  
... ... @@ -135,7 +136,8 @@ public class ${table.className}ServiceImplTest extends BaseDbUnitTest {
135 136 assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS);
136 137 }
137 138  
138   - @Test // TODO 请修改 null 为需要的值
  139 + @Test
  140 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
139 141 public void testGet${simpleClassName}Page() {
140 142 #getPageCondition("PageReqVO")
141 143  
... ... @@ -147,7 +149,8 @@ public class ${table.className}ServiceImplTest extends BaseDbUnitTest {
147 149 assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0));
148 150 }
149 151  
150   - @Test // TODO 请修改 null 为需要的值
  152 + @Test
  153 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
151 154 public void testGet${simpleClassName}List() {
152 155 #getPageCondition("ExportReqVO")
153 156  
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/AuthController.java
... ... @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 6 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
7   -import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
8 7 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 8 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.*;
10 9 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
... ... @@ -64,7 +63,6 @@ public class AuthController {
64 63  
65 64 @GetMapping("/get-permission-info")
66 65 @ApiOperation("获取登录用户的权限信息")
67   - @DataPermission(enable = false) // 标记不使用数据权限,避免【SELF】权限范围报错
68 66 public CommonResult<AuthPermissionInfoRespVO> getPermissionInfo() {
69 67 // 获得用户信息
70 68 AdminUserDO user = userService.getUser(getLoginUserId());
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserProfileController.java
... ... @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
5 5 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
6 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  7 +import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
7 8 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
8 9 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
9 10 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
... ... @@ -58,6 +59,7 @@ public class UserProfileController {
58 59  
59 60 @GetMapping("/get")
60 61 @ApiOperation("获得登录用户信息")
  62 + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。
61 63 public CommonResult<UserProfileRespVO> profile() {
62 64 // 获得用户基本信息
63 65 AdminUserDO user = userService.getUser(getLoginUserId());
... ...
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/framework/datapermission/config/DataPermissionConfiguration.java
... ... @@ -17,8 +17,11 @@ public class DataPermissionConfiguration {
17 17 @Bean
18 18 public DeptDataPermissionRuleCustomizer sysDeptDataPermissionRuleCustomizer() {
19 19 return rule -> {
  20 + // dept
20 21 rule.addDeptColumn(AdminUserDO.class);
21 22 rule.addDeptColumn(DeptDO.class, "id");
  23 + // user
  24 + rule.addUserColumn(AdminUserDO.class, "id");
22 25 };
23 26 }
24 27  
... ...
yudao-ui-admin/src/views/infra/codegen/basicInfoForm.vue
... ... @@ -13,7 +13,13 @@
13 13 </el-col>
14 14  
15 15 <el-col :span="12">
16   - <el-form-item label="实体类名称" prop="className">
  16 + <el-form-item prop="className">
  17 + <span slot="label">
  18 + 实体类名称
  19 + <el-tooltip content="默认去除表名的前缀。如果存在重复,则需要手动添加前缀,避免 MyBatis 报 Alias 重复的问题。" placement="top">
  20 + <i class="el-icon-question"></i>
  21 + </el-tooltip>
  22 + </span>
17 23 <el-input placeholder="请输入" v-model="info.className" />
18 24 </el-form-item>
19 25 </el-col>
... ...