diff --git a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/model/RoleFormButton.java b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/model/RoleFormButton.java index a58e55c..6529b76 100644 --- a/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/model/RoleFormButton.java +++ b/application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/model/RoleFormButton.java @@ -47,18 +47,18 @@ public class RoleFormButton extends BaseModel implements Serializable { @TableField(value = "button_config") private String buttonConfig; - @TableField(value = "create_by") - private String createBy; - @TableField(value = "create_time") private Date createTime; - @TableField(value = "update_by") - private String updateBy; + @TableField(value = "create_user_id") + private Long createUserId; @TableField(value = "update_time") private Date updateTime; + @TableField(value = "update_user_id") + private Long updateUserId; + @Mapper public interface RoleFormButtonModelMapper extends BaseModelMapper { diff --git a/application-tenant/tenant-admin/src/main/resources/tenant-admin-dev.yml b/application-tenant/tenant-admin/src/main/resources/tenant-admin-dev.yml new file mode 100644 index 0000000..ec4b018 --- /dev/null +++ b/application-tenant/tenant-admin/src/main/resources/tenant-admin-dev.yml @@ -0,0 +1,355 @@ +logging: + level: + # 这里设置的日志级别优先于logback-spring.xml文件Loggers中的日志级别。 + apelet: info + config: classpath:logback-spring.xml + +server: + port: 8075 + +application: + # Jwt令牌加密的签名值。该值的长度要超过10个字符(过短会报错)。 + tokenSigningKey: tenantadmin-signing-key-signing-key + # Jwt令牌在Http Header中的键名称。 + tokenHeaderKey: Authorization + # Jwt令牌刷新后在Http Header中的键名称。 + refreshedTokenHeaderKey: RefreshedToken + # Jwt令牌过期时间(毫秒)。 + expiration: 72000000 + # 初始化密码。 + defaultUserPassword: 123456 + # 缺省的文件上传根目录。 + uploadFileBaseDir: ./zz-resource/upload-files/tenant-admin + # 跨域的IP(http://192.168.10.10:8086)白名单列表,多个IP之间逗号分隔(* 表示全部信任,空白表示禁用跨域信任)。 + credentialIpList: "*" + # 同步租户公共管理数据到消息队列的主题,再由同步消费者服务将数据同步到目标数据库中。 + tenantSyncTopic: TenantSync + # Session会话和用户和权限在Redis中的过期时间(秒)。 + sessionExpiredSeconds: 86400 + # Session的数据权限信息在Redis中的过期时间(秒)。 + dataPermExpiredSeconds: 86460 + # 是否排他登录。 + excludeLogin: false +common-eas: + urlPrefix: /tenantadmin/eas +common-ext: + urlPrefix: /tenantadmin/commonext +common-mobile: + # 注意不要以反斜杠(/)结尾。 + urlPrefix: /tenantadmin/mobile + # 在线表单业务数据上传资源路径 + uploadFileBaseDir: ./zz-resource/upload-files/mobile +common-online: + # 注意不要以反斜杠(/)结尾。 + urlPrefix: /tenantadmin/online + # 打印接口的路径,不要以反斜杠(/)结尾。 + printUrlPath: /tenantadmin/report/reportPrint/print + # 在线表单业务数据上传资源路径 + uploadFileBaseDir: ./zz-resource/upload-files/online + # 如果为false,在线表单模块中所有Controller接口将不能使用。 + operationEnabled: true + # 1: minio 2: aliyun-oss 3: qcloud-cos。 + distributeStoreType: 2 + # 调用render接口时候,是否打开一级缓存加速。 + enableRenderCache: false + # 脱敏字段的掩码字符,只能为单个字符。 + maskChar: '*' + # 下面的url列表,请保持反斜杠(/)结尾。 + viewUrlList: + - ${common-online.urlPrefix}/onlineOperation/viewByDatasourceId/ + - ${common-online.urlPrefix}/onlineOperation/viewByOneToManyRelationId/ + - ${common-online.urlPrefix}/onlineOperation/listByDatasourceId/ + - ${common-online.urlPrefix}/onlineOperation/listByOneToManyRelationId/ + - ${common-online.urlPrefix}/onlineOperation/exportByDatasourceId/ + - ${common-online.urlPrefix}/onlineOperation/exportByOneToManyRelationId/ + - ${common-online.urlPrefix}/onlineOperation/downloadDatasource/ + - ${common-online.urlPrefix}/onlineOperation/downloadOneToManyRelation/ + - ${common-online.urlPrefix}/onlineOperation/print/ + editUrlList: + - ${common-online.urlPrefix}/onlineOperation/addDatasource/ + - ${common-online.urlPrefix}/onlineOperation/addOneToManyRelation/ + - ${common-online.urlPrefix}/onlineOperation/updateDatasource/ + - ${common-online.urlPrefix}/onlineOperation/updateOneToManyRelation/ + - ${common-online.urlPrefix}/onlineOperation/deleteDatasource/ + - ${common-online.urlPrefix}/onlineOperation/deleteOneToManyRelation/ + - ${common-online.urlPrefix}/onlineOperation/deleteBatchDatasource/ + - ${common-online.urlPrefix}/onlineOperation/deleteBatchOneToManyRelation/ + - ${common-online.urlPrefix}/onlineOperation/uploadDatasource/ + - ${common-online.urlPrefix}/onlineOperation/uploadOneToManyRelation/ + +common-flow: + # 请慎重修改urlPrefix的缺省配置,注意不要以反斜杠(/)结尾。如必须修改其他路径,请同步修改数据库脚本。 + urlPrefix: /tenantadmin/flow + # 如果为false,流程模块的所有Controller中的接口将不能使用。 + operationEnabled: true + +common-report: + # 注意不要以反斜杠(/)结尾。 + urlPrefix: /tenantadmin/report + # 如果为false,报表模块的所有Controller中的接口将不能使用。 + operationEnabled: true + # 该配置项仅当打印模板中,打印图片字段时,才会需要。 + # 这里的url配置只是一个示例,并不能保证开箱即用,代码示例和说明可参考common-report模块 + # example包内的ReportExampleController中的代码和详细说明。 + imageDownloadUrl: "http://localhost:8083/tenantadmin/report/example/downloadDirectly" + # 该配置用于报表部分的数据权限过滤功能。 + # 当前数据权限需要获取指定部门Ids的所有下级子部门Ids的时候,会调用该接口。 + dataPermAllChildrenDeptIdUrl: "http://localhost:8083/tenantadmin/upms/sysDept/listAllChildDeptIdByParentIds" + # 当前服务是否为可视化后台服务。 + isVisualization: false + # 下面的url列表,请保持反斜杠(/)结尾。 + viewUrlList: + - ${common-report.urlPrefix}/reportOperation/listData/ + +datasync: + producer: + # upms服务作为生产者,需要打开该选项。 + enabled: true + # Redisson 分布式锁的名称。 + # 当存在多个发送者实例时,需要分布式锁控制只有一个实例可以执行消息流水读取并发送到MQ的操作。 + distributeLockName: tenant-datasync + # 每次读取生产者消息流水的等待时间间隔,单位分钟。 + fetchTransIntervalMins: 2 + # 每次读取生产者消息流水的记录数量。 + fetchCount: 10 + +rocketmq: + name-server: 127.0.0.1:9876 + producer: + group: apelet_saas + +datafilter: + tenant: + enabled: false + dataperm: + enabled: true + # 在拼接数据权限过滤的SQL时,我们会用到sys_dept_relation表,该表的前缀由此配置项指定。 + # 如果没有前缀,请使用 "" 。 + deptRelationTablePrefix: xy_ + # 是否在每次执行数据权限查询过滤时,都要进行菜单Id和URL之间的越权验证。 + enableMenuPermVerify: true + +sequence: + # 是否使用基于美团Leaf的分布式Id生成器。 + advanceIdGenerator: true + # 多个zk服务之间逗号分隔。 + zkAddress: localhost:2181 + # 与本机的ip一起构成zk中标识不同服务实例的key值。 + idPort: 18083 + # zk中生成WorkNode的路径。不同的业务可以使用不同的路径,以免冲突。 + zkPath: apelet + +common-log: + # 操作日志配置,对应配置文件common-log/OperationLogProperties.java + operation-log: + enabled: false + kafkaTopic: SysOperationLog-TenantAdmin + +mybatis-plus: + mapper-locations: classpath:apelet/tenantadmin/tenant/dao/mapper/*Mapper.xml,apelet/tenantadmin/upms/dao/mapper/*Mapper.xml,apelet/common/report/dao/mapper/*Mapper.xml,apelet/common/datasync/dao/mapper/*Mapper.xml,apelet/common/log/dao/mapper/*Mapper.xml,apelet/common/flow/dao/mapper/*Mapper.xml,apelet/common/online/dao/mapper/*Mapper.xml,apelet/common/generator/dao/mapper/*Mapper.xml,apelet/common/botp/dao/mapper/*Mapper.xml,apelet/tenantadmin/app/dao/mapper/*Mapper.xml,apelet/common/mobile/dao/mapper/*Mapper.xml,apelet/common/eas/dao/mapper/*Mapper.xml,classpath:mapper/*Mapper.xml + type-aliases-package: apelet.tenantadmin.*.model,apelet.common.report.model,apelet.common.datasync.model,apelet.common.log.model,apelet.common.flow.model,apelet.common.online.model,apelet.common.mobile.model,apelet.common.eas.model + global-config: + db-config: + logic-delete-value: -1 + logic-not-delete-value: 1 + +# 自动分页的配置 +pagehelper: + helperDialect: mysql + reasonable: true + supportMethodsArguments: false + params: count=countSql + +aj: + captcha: + # 缓存local/redis.. + cache-type: redis + # 验证码类型default两种都实例化。 + type: default + # 右下角水印文字(我的水印) + water-mark: 我的水印 + #点选字体样式 默认Font.BOLD + font-style: 1 + #点选字体字体大小 + font-size: 25 + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/jigsaw + jigsaw: classpath:images/jigsaw + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/pic-click + pic-click: classpath:images/pic-click + history-data-clear-enable: false + # 接口请求次数一分钟限制是否开启 true|false + req-frequency-limit-enable: false + # 验证失败5次,get接口锁定 + req-get-lock-limit: 5 + # 验证失败后,锁定时间间隔,s + req-get-lock-seconds: 360 + # get接口一分钟内请求数限制 + req-get-minute-limit: 30 + # check接口一分钟内请求数限制 + req-check-minute-limit: 30 + # verify接口一分钟内请求数限制 + req-verify-minute-limit: 60 + # 校验滑动拼图允许误差偏移量(默认5像素) + slip-offset: 5 + # aes加密坐标开启或者禁用(true|false) + aes-status: true + # 滑动干扰项(0/1/2) + interference-options: 2 + +# 开发数据库相关配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + druid: + # 租户管理数据源。 + tenant-admin: + url: jdbc:mysql://192.168.100.35:3306/apelet_admin_xk?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: X7&9p8L2@6z4K7!8 + # 租户业务平台的通用业务数据,如字典、在线表单、流程、报表的定义等数据。 + tenant-common: + url: jdbc:mysql://192.168.100.35:3306/apelet_admin_xk?characterEncoding=utf8&useSSL=true&serverTimezone=Asia/Shanghai + username: root + password: X7&9p8L2@6z4K7!8 + # 默认生成的操作日志数据源配置。 + operation-log: + url: jdbc:mysql://192.168.100.35:3306/apelet_admin_xk?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: X7&9p8L2@6z4K7!8 + driverClassName: com.mysql.cj.jdbc.Driver + name: tenant-admin + initialSize: 10 + minIdle: 10 + maxActive: 50 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + poolPreparedStatements: true + maxPoolPreparedStatementPerConnectionSize: 20 + maxOpenPreparedStatements: 20 + validationQuery: SELECT 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + filters: stat,wall + useGlobalDataSourceStat: true + web-stat-filter: + enabled: true + url-pattern: "/*" + exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*,/actuator/*,/ai/*" + stat-view-servlet: + enabled: true + urlPattern: /druid/* + resetEnable: true +eas: + config: + easurl: + userName: + password: 1 + dcName: + dbType: 2 + ltpaToken: C:\work\company\project\plat\orm\apelet_saas\common\common-eas\src\main\resources\LtpaToken.properties + #easurl: https://ehr.jztweb.com + #userName: SSQadmin + #password: SSQadmin + #dcName: EHR_001 + #dbType: 2 + #ltpaToken: C:\work\company\project\plat\orm\apelet_saas\common\common-eas\src\main\resources\LtpaToken_zs.properties +hubCloud: + #测试 + #secret: RXmdRE0lf5ngGfLJSSj4 + #appId: 501019058 + secret: + appId: +dingTalk: + secret: 95gAMy_7nWGqRwFbt_kLzRpI9BqKhB7LM3SPgpcvV8Q7s0Az_PMei_yRxWE6LmhV +project: + server: + url: https://jgzy-api.nbjgcloud.com + sync: + url: http://10.22.98.37:9999 + loginUrl: /sys/login + loginName: nbjg + loginPassword: NBjj123456 + userUrl: + projectUrl: +ai: + dify: + baseUrl: + datasetKey: + appKey: + appUrl: + pandoc: + panurl: pandoc + genurl: + templateFileName: sample-orgin-change.docx + luaFileName: parse-html.lua + preUrl: +mineru: + workspace: + batchfile: + timeout: 10000 + baseurl: http://192.168.77.6:8000 + pdfurl: /file_parse + mdSaveDir: /app/work/pdf +cqurl: + config: + url: + gys: + #client_id: xy_mobile + #client_secret: asdasdnsandlkadnlkas!@#@!3WWW + #username: sunquan + client_id: + client_secret: + username: + accountId: + +msg: + notice: + # 是否启用定时消息提醒(true启用,false禁用) + enabled: true + + # 定时任务cron表达式,控制提醒执行频率 + # 默认值:0 0 * * * ? (每小时整点执行) + # 常用示例: + # 0 0 * * * ? - 每小时执行一次 + # 0 0 */2 * * ? - 每2小时执行一次 + # 0 0 9 * * ? - 每天上午9点执行 + # 0 0 9,18 * * ? - 每天上午9点和下午6点执行 + # 0 */30 * * * ? - 每30分钟执行一次 + cron: "0 0 * * * ?" + + # 默认提醒消息内容 + default-message: hello + + # ==================================== + # 短信通知配置 + # ==================================== + sms: + # 是否启用短信通知 + enabled: false + # 短信API地址(根据实际短信服务商配置) + api-url: https://sms.example.com/send + # 短信API密钥 + api-key: your-sms-api-key + # 短信签名 + sign: "【您的签名】" + + # ==================================== + # 邮箱通知配置 + # ==================================== + email: + # 是否启用邮箱通知 + enabled: true + # SMTP服务器地址 + smtp-host: smtp.qq.com + # SMTP端口(25或465或587) + smtp-port: 465 + # 发件人邮箱地址 + from-email: 287962685@qq.com + # 发件人密码或授权码 + password: evccxezdmdnpbhbh + # 是否启用SSL(如果使用465端口,建议启用SSL) + ssl-enabled: true + diff --git a/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataOrmService.java b/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataOrmService.java index 040b36b..47022c8 100644 --- a/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataOrmService.java +++ b/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataOrmService.java @@ -6,13 +6,13 @@ import apelet.common.core.object.ResponseResult; import apelet.common.online.abstractplugin.model.GridData; import apelet.common.online.dto.OnlineEventPluginExecuteDto; import apelet.common.online.dto.OnlineFilterDto; -import apelet.common.online.model.OnlineColumn; -import apelet.common.online.model.OnlineDatasourceRelation; -import apelet.common.online.model.OnlineForm; -import apelet.common.online.model.OnlineTable; +import apelet.common.online.model.*; +import apelet.common.online.model.constant.DataRuleType; import apelet.common.online.model.constant.FieldFilterType; import apelet.common.online.model.constant.RelationType; import apelet.common.orm.impl.*; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -61,12 +61,30 @@ public class ListDataOrmService extends ListDataService { List> resList = new ArrayList<>(); OnlineTable masterTable = datasourceResult.getData().getMasterTable(); OnlineForm onlineForm = onlineFormService.getOnlineFormFromCache(dto.getFormId()); + // 根据 metaCode 过滤权限规则:非空→基础数据权限,为空→列表权限 + List ruleSchemaList = permissionDataRuleSchemaService.listByFormId(onlineForm.getFormId()); + String conditionExpression = null; + if (CollUtil.isNotEmpty(ruleSchemaList)) { + List filtered = new ArrayList<>(); + if (StrUtil.isNotBlank(metaCode)) { + filtered = ruleSchemaList.stream().filter(s -> DataRuleType.BASIC_DATA == s.getRuleType() && metaCode.equals(s.getMetaCode())).collect(Collectors.toList()); + } + if (CollUtil.isEmpty(filtered)) { + filtered = ruleSchemaList.stream().filter(s -> DataRuleType.LIST == s.getRuleType()).collect(Collectors.toList()); + } + if (CollUtil.isNotEmpty(filtered)) { + conditionExpression = filtered.stream().map(PermissionDataRuleSchema::getConditionExpression).collect(Collectors.joining(") AND (", "(", ")")); + } + } + JSONObject widgetJson = JSON.parseObject(onlineForm.getWidgetJson()); JSONObject widgetList = widgetJson.getJSONObject("pc").getJSONObject("tableWidget"); Set selectorSet = new TreeSet<>(); getOrmSelector(widgetList, selectorSet, masterTable, new HashMap<>()); - // todo 过滤器 Filter filter = getFilter(); + if (StrUtil.isNotBlank(conditionExpression)) { + //todo 这里调用 过滤器 + } Sorter sorter = new Sorter(); if (orderParam != null) { diff --git a/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataService.java b/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataService.java index b710c96..b96fc92 100644 --- a/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataService.java +++ b/common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataService.java @@ -11,15 +11,11 @@ import apelet.common.online.abstractplugin.model.GridData; import apelet.common.online.dto.OnlineEventPluginExecuteDto; import apelet.common.online.dto.OnlineFilterDto; import apelet.common.online.model.OnlineDatasource; -import apelet.common.online.service.OnlineDictService; -import apelet.common.online.service.OnlineFormService; -import apelet.common.online.service.OnlineOperationService; -import apelet.common.online.service.OnlineTableService; +import apelet.common.online.service.*; import apelet.common.online.util.OnlineOperationHelper; import apelet.common.orm.impl.Filter; import apelet.common.orm.impl.OrmDataSourceUtil; import apelet.common.orm.impl.Sorter; -import lombok.Getter; import lombok.Setter; import java.util.List; @@ -41,6 +37,7 @@ public abstract class ListDataService { protected MyPageParam pageParam; protected TraceParamDto traceParamDto; protected OnlFormHead onlFormHead; + protected String metaCode; protected OrmDataSourceUtil ormDataSourceUtil; @@ -51,6 +48,7 @@ public abstract class ListDataService { protected OnlineOperationHelper onlineOperationHelper; protected OnlineOperationService onlineOperationService; protected OnlineTableService onlineTableService; + protected IPermissionDataRuleSchemaService permissionDataRuleSchemaService; protected ResponseResult datasourceResult; @@ -64,6 +62,7 @@ public abstract class ListDataService { onlFormHead = (OnlFormHead) listParams.get("onlFormHead"); datasourceResult = (ResponseResult) listParams.get("datasourceResult"); + metaCode = (String) listParams.get("metaCode"); onlineFormService = ApplicationContextHolder.getBean("onlineFormService"); onlFormFieldService = ApplicationContextHolder.getBean("onlFormFieldServiceImpl"); @@ -72,6 +71,7 @@ public abstract class ListDataService { onlineOperationService = ApplicationContextHolder.getBean("onlineOperationService"); onlineTableService = ApplicationContextHolder.getBean("onlineTableService"); ormDataSourceUtil = ApplicationContextHolder.getBean("ormGenDataSourceUtil"); + permissionDataRuleSchemaService = ApplicationContextHolder.getBean("permissionDataRuleSchemaService"); } @Setter diff --git a/common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java b/common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java index 65dcef9..ca3a766 100644 --- a/common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java +++ b/common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java @@ -817,7 +817,8 @@ public class OnlineOperationController { @MyRequestBody MyPageParam pageParam, @MyRequestBody String ignoreMaskFields, @MyRequestBody TraceParamDto traceParamDto, - @MyRequestBody OnlineEventPluginExecuteDto onlineEventPluginExecuteDto + @MyRequestBody OnlineEventPluginExecuteDto onlineEventPluginExecuteDto, + @MyRequestBody String metaCode ) { // 1. 验证数据源及其关联 ResponseResult datasourceResult = @@ -829,6 +830,16 @@ public class OnlineOperationController { if (!filterDtoListResult.isSuccess()) { return ResponseResult.errorFrom(filterDtoListResult); } + // 透传 metaCode 到 ListDataOrmService,用于权限规则类型过滤 + if (onlineEventPluginExecuteDto == null) { + onlineEventPluginExecuteDto = new OnlineEventPluginExecuteDto(); + } + Map listParams = onlineEventPluginExecuteDto.getListParams(); + if (listParams == null) { + listParams = new HashMap<>(); + onlineEventPluginExecuteDto.setListParams(listParams); + } + listParams.put("metaCode", metaCode); OnlFormHead onlFormHead = onlFormHeadService.getFormHeadByDatasource(datasourceId); GridData pluginData = this.exeListPlugin(formId,filterDtoList,orderParam,pageParam, traceParamDto,onlFormHead,datasourceResult,onlineEventPluginExecuteDto @@ -862,7 +873,10 @@ public class OnlineOperationController { } onlineEventPluginExecuteDto.setFormId(formId); onlineEventPluginExecuteDto.setEventCode(EventEnum.LOADLISTDATA.getCode()); - Map listParams = new HashMap<>(); + Map listParams = onlineEventPluginExecuteDto.getListParams(); + if (listParams == null) { + listParams = new HashMap<>(); + } listParams.put("filterDtoList",filterDtoList); listParams.put("pageParam",pageParam); listParams.put("orderParam",orderParam); @@ -895,7 +909,6 @@ public class OnlineOperationController { return gridData; } - private void normalizeFilterList(OnlineTable table , List filterList) { OnlineDblink dblink = onlineDblinkService.getById(table.getDblinkId()); diff --git a/common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml b/common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml index d9705fa..c9fe0ef 100644 --- a/common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml +++ b/common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml @@ -16,6 +16,9 @@ AND status = #{filter.status} + + AND rule_type = #{filter.ruleType} + ORDER BY ${orderBy} diff --git a/common/common-online/src/main/java/apelet/common/online/model/PermissionDataRuleSchema.java b/common/common-online/src/main/java/apelet/common/online/model/PermissionDataRuleSchema.java index 7f4c3b6..40b9e76 100644 --- a/common/common-online/src/main/java/apelet/common/online/model/PermissionDataRuleSchema.java +++ b/common/common-online/src/main/java/apelet/common/online/model/PermissionDataRuleSchema.java @@ -85,6 +85,14 @@ public class PermissionDataRuleSchema extends BaseModel implements Serializable private String metaShowName; /** + * 规则类型:1-列表权限,2-基础数据权限。 + * @see apelet.common.online.model.constant.DataRuleType + */ + @TableField(value = "rule_type") + @NotNull(message = "数据验证失败,规则类型不能为空!") + private Integer ruleType; + + /** * 状态:1-启用,0-禁用。 */ @TableField(value = "status") @@ -97,22 +105,16 @@ public class PermissionDataRuleSchema extends BaseModel implements Serializable private String remark; /** - * 创建人。 - */ - @TableField(value = "create_by") - private String createBy; - - /** * 创建时间。 */ @TableField(value = "create_time") private Date createTime; /** - * 更新人。 + * 创建者。 */ - @TableField(value = "update_by") - private String updateBy; + @TableField(value = "create_user_id") + private Long createUserId; /** * 更新时间。 @@ -120,6 +122,12 @@ public class PermissionDataRuleSchema extends BaseModel implements Serializable @TableField(value = "update_time") private Date updateTime; + /** + * 更新者。 + */ + @TableField(value = "update_user_id") + private Long updateUserId; + // ========== MapStruct ========== @Mapper public interface PermissionDataRuleSchemaModelMapper diff --git a/common/common-online/src/main/java/apelet/common/online/model/constant/DataRuleType.java b/common/common-online/src/main/java/apelet/common/online/model/constant/DataRuleType.java new file mode 100644 index 0000000..02752e1 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/model/constant/DataRuleType.java @@ -0,0 +1,35 @@ +package apelet.common.online.model.constant; + +import java.util.HashMap; +import java.util.Map; + +/** + * 数据权限规则类型常量。 + * + * @author chenchuchuan + * @date 2026-07-21 + */ +public final class DataRuleType { + + /** + * 列表权限。 + */ + public static final int LIST = 1; + /** + * 基础数据权限。 + */ + public static final int BASIC_DATA = 2; + + private static final Map DICT_MAP = new HashMap<>(2); + static { + DICT_MAP.put(LIST, "列表权限"); + DICT_MAP.put(BASIC_DATA, "基础数据权限"); + } + + public static boolean isValid(Integer value) { + return value != null && DICT_MAP.containsKey(value); + } + + private DataRuleType() { + } +} diff --git a/common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java b/common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java index 8620df7..b65e53e 100644 --- a/common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java +++ b/common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java @@ -12,8 +12,7 @@ import java.util.List; * @author chenchuchuan * @date 2026-07-15 */ -public interface IPermissionDataRuleSchemaService - extends IBaseService { +public interface IPermissionDataRuleSchemaService extends IBaseService { /** * 分页条件查询规则方案列表。 @@ -25,15 +24,15 @@ public interface IPermissionDataRuleSchemaService List getListByFilter(PermissionDataRuleSchema filter, String orderBy); /** - * 根据 tableId 查询启用状态的规则(运行时用)。 + * 根据 formId 查询启用状态的规则(运行时用)。 * - * @param tableId 在线表ID。 + * @param formId 在线表ID。 * @return 启用状态的规则列表。 */ - List listByFormId(Long tableId); + List listByFormId(Long formId); /** - * 校验关联数据:验证 tableId 对应的是主表或单表,并自动填充 tableType。 + * 校验关联数据:验证 formId 对应的是主表或单表,并自动填充 tableType。 * * @param schema 待校验的规则方案对象。 * @return 校验结果。 diff --git a/common/common-online/src/main/java/apelet/common/online/service/impl/PermissionDataRuleSchemaServiceImpl.java b/common/common-online/src/main/java/apelet/common/online/service/impl/PermissionDataRuleSchemaServiceImpl.java index 435c697..53eeac1 100644 --- a/common/common-online/src/main/java/apelet/common/online/service/impl/PermissionDataRuleSchemaServiceImpl.java +++ b/common/common-online/src/main/java/apelet/common/online/service/impl/PermissionDataRuleSchemaServiceImpl.java @@ -7,6 +7,7 @@ import apelet.common.generator.model.OnlFormHead; import apelet.common.generator.service.IOnlFormHeadService; import apelet.common.online.dao.PermissionDataRuleSchemaMapper; import apelet.common.online.model.PermissionDataRuleSchema; +import apelet.common.online.model.constant.DataRuleType; import apelet.common.online.service.IPermissionDataRuleSchemaService; import apelet.common.sequence.wrapper.IdGeneratorWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -22,11 +23,9 @@ import java.util.List; * @author chenchuchuan * @date 2026-07-15 */ -@Service +@Service("permissionDataRuleSchemaService") @Slf4j -public class PermissionDataRuleSchemaServiceImpl - extends BaseService - implements IPermissionDataRuleSchemaService { +public class PermissionDataRuleSchemaServiceImpl extends BaseService implements IPermissionDataRuleSchemaService { @Autowired PermissionDataRuleSchemaMapper mapper; @@ -50,7 +49,7 @@ public class PermissionDataRuleSchemaServiceImpl return mapper.getListByFilter(filter, orderBy); } - // ========== 按 tableId 查询启用状态的规则 ========== + // ========== 按 formId 查询启用状态的规则 ========== @Override public List listByFormId(Long formId) { LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); @@ -62,15 +61,17 @@ public class PermissionDataRuleSchemaServiceImpl // ========== 新增(含 ID生成 + 默认状态) ========== @Override public PermissionDataRuleSchema saveNew(PermissionDataRuleSchema schema) { - schema.setId(idGenerator.nextLongId()); if (schema.getStatus() == null) { schema.setStatus(1); } + if (schema.getRuleType() == null) { + schema.setRuleType(DataRuleType.LIST); + } this.save(schema); return schema; } - // ========== 核心校验: tableId → 主表/单表,自动填充 tableType ========== + // ========== 核心校验: formId → 主表/单表,自动填充 tableType ========== @Override public CallResult verifyRelatedData(PermissionDataRuleSchema schema) { // 1. 通过 tableName 查询 onl_form_head 获取 tableType