Browse Source

refactor(permission): 将权限数据规则方案相关代码迁移到common-online模块

- 将PermissionDataRuleSchema实体类从tenant-admin移动到common.online.model包
- 将IPermissionDataRuleSchemaService接口从tenant-admin移动到common.online.service包
- 将PermissionDataRuleSchemaMapper接口及其实现从tenant-admin移动到common.online.dao包
- 将PermissionDataRuleSchemaVo类从tenant-admin移动到common.online.vo包
- 更新OnlineFormController添加根据表单类型查询表单列表的功能
- 在ListDataOrmService中添加过滤器TODO注释
- 修改OnlineFormService和OnlineFormServiceImpl实现表单类型查询功能
feature/form-permission-control
chenchuchuan 3 weeks ago
parent
commit
1f96a131a6
  1. 10
      application-tenant/tenant-admin/src/main/java/apelet/tenantadmin/tenant/model/RoleFormButton.java
  2. 355
      application-tenant/tenant-admin/src/main/resources/tenant-admin-dev.yml
  3. 28
      common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataOrmService.java
  4. 10
      common/common-online/src/main/java/apelet/common/online/abstractplugin/ListDataService.java
  5. 19
      common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java
  6. 3
      common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml
  7. 26
      common/common-online/src/main/java/apelet/common/online/model/PermissionDataRuleSchema.java
  8. 35
      common/common-online/src/main/java/apelet/common/online/model/constant/DataRuleType.java
  9. 11
      common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java
  10. 15
      common/common-online/src/main/java/apelet/common/online/service/impl/PermissionDataRuleSchemaServiceImpl.java

10
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") @TableField(value = "button_config")
private String buttonConfig; private String buttonConfig;
@TableField(value = "create_by")
private String createBy;
@TableField(value = "create_time") @TableField(value = "create_time")
private Date createTime; private Date createTime;
@TableField(value = "update_by") @TableField(value = "create_user_id")
private String updateBy; private Long createUserId;
@TableField(value = "update_time") @TableField(value = "update_time")
private Date updateTime; private Date updateTime;
@TableField(value = "update_user_id")
private Long updateUserId;
@Mapper @Mapper
public interface RoleFormButtonModelMapper public interface RoleFormButtonModelMapper
extends BaseModelMapper<RoleFormButtonVo, RoleFormButton> { extends BaseModelMapper<RoleFormButtonVo, RoleFormButton> {

355
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

28
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.abstractplugin.model.GridData;
import apelet.common.online.dto.OnlineEventPluginExecuteDto; import apelet.common.online.dto.OnlineEventPluginExecuteDto;
import apelet.common.online.dto.OnlineFilterDto; import apelet.common.online.dto.OnlineFilterDto;
import apelet.common.online.model.OnlineColumn; import apelet.common.online.model.*;
import apelet.common.online.model.OnlineDatasourceRelation; import apelet.common.online.model.constant.DataRuleType;
import apelet.common.online.model.OnlineForm;
import apelet.common.online.model.OnlineTable;
import apelet.common.online.model.constant.FieldFilterType; import apelet.common.online.model.constant.FieldFilterType;
import apelet.common.online.model.constant.RelationType; import apelet.common.online.model.constant.RelationType;
import apelet.common.orm.impl.*; 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.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -61,12 +61,30 @@ public class ListDataOrmService extends ListDataService {
List<Map<String, Object>> resList = new ArrayList<>(); List<Map<String, Object>> resList = new ArrayList<>();
OnlineTable masterTable = datasourceResult.getData().getMasterTable(); OnlineTable masterTable = datasourceResult.getData().getMasterTable();
OnlineForm onlineForm = onlineFormService.getOnlineFormFromCache(dto.getFormId()); OnlineForm onlineForm = onlineFormService.getOnlineFormFromCache(dto.getFormId());
// 根据 metaCode 过滤权限规则:非空→基础数据权限,为空→列表权限
List<PermissionDataRuleSchema> ruleSchemaList = permissionDataRuleSchemaService.listByFormId(onlineForm.getFormId());
String conditionExpression = null;
if (CollUtil.isNotEmpty(ruleSchemaList)) {
List<PermissionDataRuleSchema> 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 widgetJson = JSON.parseObject(onlineForm.getWidgetJson());
JSONObject widgetList = widgetJson.getJSONObject("pc").getJSONObject("tableWidget"); JSONObject widgetList = widgetJson.getJSONObject("pc").getJSONObject("tableWidget");
Set<String> selectorSet = new TreeSet<>(); Set<String> selectorSet = new TreeSet<>();
getOrmSelector(widgetList, selectorSet, masterTable, new HashMap<>()); getOrmSelector(widgetList, selectorSet, masterTable, new HashMap<>());
// todo 过滤器
Filter filter = getFilter(); Filter filter = getFilter();
if (StrUtil.isNotBlank(conditionExpression)) {
//todo 这里调用 过滤器
}
Sorter sorter = new Sorter(); Sorter sorter = new Sorter();
if (orderParam != null) { if (orderParam != null) {

10
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.OnlineEventPluginExecuteDto;
import apelet.common.online.dto.OnlineFilterDto; import apelet.common.online.dto.OnlineFilterDto;
import apelet.common.online.model.OnlineDatasource; import apelet.common.online.model.OnlineDatasource;
import apelet.common.online.service.OnlineDictService; import apelet.common.online.service.*;
import apelet.common.online.service.OnlineFormService;
import apelet.common.online.service.OnlineOperationService;
import apelet.common.online.service.OnlineTableService;
import apelet.common.online.util.OnlineOperationHelper; import apelet.common.online.util.OnlineOperationHelper;
import apelet.common.orm.impl.Filter; import apelet.common.orm.impl.Filter;
import apelet.common.orm.impl.OrmDataSourceUtil; import apelet.common.orm.impl.OrmDataSourceUtil;
import apelet.common.orm.impl.Sorter; import apelet.common.orm.impl.Sorter;
import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.util.List; import java.util.List;
@ -41,6 +37,7 @@ public abstract class ListDataService {
protected MyPageParam pageParam; protected MyPageParam pageParam;
protected TraceParamDto traceParamDto; protected TraceParamDto traceParamDto;
protected OnlFormHead onlFormHead; protected OnlFormHead onlFormHead;
protected String metaCode;
protected OrmDataSourceUtil ormDataSourceUtil; protected OrmDataSourceUtil ormDataSourceUtil;
@ -51,6 +48,7 @@ public abstract class ListDataService {
protected OnlineOperationHelper onlineOperationHelper; protected OnlineOperationHelper onlineOperationHelper;
protected OnlineOperationService onlineOperationService; protected OnlineOperationService onlineOperationService;
protected OnlineTableService onlineTableService; protected OnlineTableService onlineTableService;
protected IPermissionDataRuleSchemaService permissionDataRuleSchemaService;
protected ResponseResult<OnlineDatasource> datasourceResult; protected ResponseResult<OnlineDatasource> datasourceResult;
@ -64,6 +62,7 @@ public abstract class ListDataService {
onlFormHead = (OnlFormHead) listParams.get("onlFormHead"); onlFormHead = (OnlFormHead) listParams.get("onlFormHead");
datasourceResult = datasourceResult =
(ResponseResult<OnlineDatasource>) listParams.get("datasourceResult"); (ResponseResult<OnlineDatasource>) listParams.get("datasourceResult");
metaCode = (String) listParams.get("metaCode");
onlineFormService = ApplicationContextHolder.getBean("onlineFormService"); onlineFormService = ApplicationContextHolder.getBean("onlineFormService");
onlFormFieldService = ApplicationContextHolder.getBean("onlFormFieldServiceImpl"); onlFormFieldService = ApplicationContextHolder.getBean("onlFormFieldServiceImpl");
@ -72,6 +71,7 @@ public abstract class ListDataService {
onlineOperationService = ApplicationContextHolder.getBean("onlineOperationService"); onlineOperationService = ApplicationContextHolder.getBean("onlineOperationService");
onlineTableService = ApplicationContextHolder.getBean("onlineTableService"); onlineTableService = ApplicationContextHolder.getBean("onlineTableService");
ormDataSourceUtil = ApplicationContextHolder.getBean("ormGenDataSourceUtil"); ormDataSourceUtil = ApplicationContextHolder.getBean("ormGenDataSourceUtil");
permissionDataRuleSchemaService = ApplicationContextHolder.getBean("permissionDataRuleSchemaService");
} }
@Setter @Setter

19
common/common-online/src/main/java/apelet/common/online/controller/OnlineOperationController.java

@ -817,7 +817,8 @@ public class OnlineOperationController {
@MyRequestBody MyPageParam pageParam, @MyRequestBody MyPageParam pageParam,
@MyRequestBody String ignoreMaskFields, @MyRequestBody String ignoreMaskFields,
@MyRequestBody TraceParamDto traceParamDto, @MyRequestBody TraceParamDto traceParamDto,
@MyRequestBody OnlineEventPluginExecuteDto onlineEventPluginExecuteDto @MyRequestBody OnlineEventPluginExecuteDto onlineEventPluginExecuteDto,
@MyRequestBody String metaCode
) { ) {
// 1. 验证数据源及其关联 // 1. 验证数据源及其关联
ResponseResult<OnlineDatasource> datasourceResult = ResponseResult<OnlineDatasource> datasourceResult =
@ -829,6 +830,16 @@ public class OnlineOperationController {
if (!filterDtoListResult.isSuccess()) { if (!filterDtoListResult.isSuccess()) {
return ResponseResult.errorFrom(filterDtoListResult); return ResponseResult.errorFrom(filterDtoListResult);
} }
// 透传 metaCode 到 ListDataOrmService,用于权限规则类型过滤
if (onlineEventPluginExecuteDto == null) {
onlineEventPluginExecuteDto = new OnlineEventPluginExecuteDto();
}
Map<String, Object> listParams = onlineEventPluginExecuteDto.getListParams();
if (listParams == null) {
listParams = new HashMap<>();
onlineEventPluginExecuteDto.setListParams(listParams);
}
listParams.put("metaCode", metaCode);
OnlFormHead onlFormHead = onlFormHeadService.getFormHeadByDatasource(datasourceId); OnlFormHead onlFormHead = onlFormHeadService.getFormHeadByDatasource(datasourceId);
GridData pluginData = this.exeListPlugin(formId,filterDtoList,orderParam,pageParam, GridData pluginData = this.exeListPlugin(formId,filterDtoList,orderParam,pageParam,
traceParamDto,onlFormHead,datasourceResult,onlineEventPluginExecuteDto traceParamDto,onlFormHead,datasourceResult,onlineEventPluginExecuteDto
@ -862,7 +873,10 @@ public class OnlineOperationController {
} }
onlineEventPluginExecuteDto.setFormId(formId); onlineEventPluginExecuteDto.setFormId(formId);
onlineEventPluginExecuteDto.setEventCode(EventEnum.LOADLISTDATA.getCode()); onlineEventPluginExecuteDto.setEventCode(EventEnum.LOADLISTDATA.getCode());
Map<String,Object> listParams = new HashMap<>(); Map<String,Object> listParams = onlineEventPluginExecuteDto.getListParams();
if (listParams == null) {
listParams = new HashMap<>();
}
listParams.put("filterDtoList",filterDtoList); listParams.put("filterDtoList",filterDtoList);
listParams.put("pageParam",pageParam); listParams.put("pageParam",pageParam);
listParams.put("orderParam",orderParam); listParams.put("orderParam",orderParam);
@ -895,7 +909,6 @@ public class OnlineOperationController {
return gridData; return gridData;
} }
private void normalizeFilterList(OnlineTable table private void normalizeFilterList(OnlineTable table
, List<OnlineFilterDto> filterList) { , List<OnlineFilterDto> filterList) {
OnlineDblink dblink = onlineDblinkService.getById(table.getDblinkId()); OnlineDblink dblink = onlineDblinkService.getById(table.getDblinkId());

3
common/common-online/src/main/java/apelet/common/online/dao/mapper/PermissionDataRuleSchemaMapper.xml

@ -16,6 +16,9 @@
<if test="filter.status != null"> <if test="filter.status != null">
AND status = #{filter.status} AND status = #{filter.status}
</if> </if>
<if test="filter.ruleType != null">
AND rule_type = #{filter.ruleType}
</if>
<if test="orderBy != null and orderBy != ''"> <if test="orderBy != null and orderBy != ''">
ORDER BY ${orderBy} ORDER BY ${orderBy}
</if> </if>

26
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; private String metaShowName;
/** /**
* 规则类型1-列表权限2-基础数据权限
* @see apelet.common.online.model.constant.DataRuleType
*/
@TableField(value = "rule_type")
@NotNull(message = "数据验证失败,规则类型不能为空!")
private Integer ruleType;
/**
* 状态1-启用0-禁用 * 状态1-启用0-禁用
*/ */
@TableField(value = "status") @TableField(value = "status")
@ -97,22 +105,16 @@ public class PermissionDataRuleSchema extends BaseModel implements Serializable
private String remark; private String remark;
/** /**
* 创建人
*/
@TableField(value = "create_by")
private String createBy;
/**
* 创建时间 * 创建时间
*/ */
@TableField(value = "create_time") @TableField(value = "create_time")
private Date createTime; private Date createTime;
/** /**
* 更新人 * 创建者
*/ */
@TableField(value = "update_by") @TableField(value = "create_user_id")
private String updateBy; private Long createUserId;
/** /**
* 更新时间 * 更新时间
@ -120,6 +122,12 @@ public class PermissionDataRuleSchema extends BaseModel implements Serializable
@TableField(value = "update_time") @TableField(value = "update_time")
private Date updateTime; private Date updateTime;
/**
* 更新者
*/
@TableField(value = "update_user_id")
private Long updateUserId;
// ========== MapStruct ========== // ========== MapStruct ==========
@Mapper @Mapper
public interface PermissionDataRuleSchemaModelMapper public interface PermissionDataRuleSchemaModelMapper

35
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<Object, String> 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() {
}
}

11
common/common-online/src/main/java/apelet/common/online/service/IPermissionDataRuleSchemaService.java

@ -12,8 +12,7 @@ import java.util.List;
* @author chenchuchuan * @author chenchuchuan
* @date 2026-07-15 * @date 2026-07-15
*/ */
public interface IPermissionDataRuleSchemaService public interface IPermissionDataRuleSchemaService extends IBaseService<PermissionDataRuleSchema, Long> {
extends IBaseService<PermissionDataRuleSchema, Long> {
/** /**
* 分页条件查询规则方案列表 * 分页条件查询规则方案列表
@ -25,15 +24,15 @@ public interface IPermissionDataRuleSchemaService
List<PermissionDataRuleSchema> getListByFilter(PermissionDataRuleSchema filter, String orderBy); List<PermissionDataRuleSchema> getListByFilter(PermissionDataRuleSchema filter, String orderBy);
/** /**
* 根据 tableId 查询启用状态的规则运行时用 * 根据 formId 查询启用状态的规则运行时用
* *
* @param tableId 在线表ID * @param formId 在线表ID
* @return 启用状态的规则列表 * @return 启用状态的规则列表
*/ */
List<PermissionDataRuleSchema> listByFormId(Long tableId); List<PermissionDataRuleSchema> listByFormId(Long formId);
/** /**
* 校验关联数据验证 tableId 对应的是主表或单表并自动填充 tableType * 校验关联数据验证 formId 对应的是主表或单表并自动填充 tableType
* *
* @param schema 待校验的规则方案对象 * @param schema 待校验的规则方案对象
* @return 校验结果 * @return 校验结果

15
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.generator.service.IOnlFormHeadService;
import apelet.common.online.dao.PermissionDataRuleSchemaMapper; import apelet.common.online.dao.PermissionDataRuleSchemaMapper;
import apelet.common.online.model.PermissionDataRuleSchema; import apelet.common.online.model.PermissionDataRuleSchema;
import apelet.common.online.model.constant.DataRuleType;
import apelet.common.online.service.IPermissionDataRuleSchemaService; import apelet.common.online.service.IPermissionDataRuleSchemaService;
import apelet.common.sequence.wrapper.IdGeneratorWrapper; import apelet.common.sequence.wrapper.IdGeneratorWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -22,11 +23,9 @@ import java.util.List;
* @author chenchuchuan * @author chenchuchuan
* @date 2026-07-15 * @date 2026-07-15
*/ */
@Service @Service("permissionDataRuleSchemaService")
@Slf4j @Slf4j
public class PermissionDataRuleSchemaServiceImpl public class PermissionDataRuleSchemaServiceImpl extends BaseService<PermissionDataRuleSchema, Long> implements IPermissionDataRuleSchemaService {
extends BaseService<PermissionDataRuleSchema, Long>
implements IPermissionDataRuleSchemaService {
@Autowired @Autowired
PermissionDataRuleSchemaMapper mapper; PermissionDataRuleSchemaMapper mapper;
@ -50,7 +49,7 @@ public class PermissionDataRuleSchemaServiceImpl
return mapper.getListByFilter(filter, orderBy); return mapper.getListByFilter(filter, orderBy);
} }
// ========== 按 tableId 查询启用状态的规则 ========== // ========== 按 formId 查询启用状态的规则 ==========
@Override @Override
public List<PermissionDataRuleSchema> listByFormId(Long formId) { public List<PermissionDataRuleSchema> listByFormId(Long formId) {
LambdaQueryWrapper<PermissionDataRuleSchema> qw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PermissionDataRuleSchema> qw = new LambdaQueryWrapper<>();
@ -62,15 +61,17 @@ public class PermissionDataRuleSchemaServiceImpl
// ========== 新增(含 ID生成 + 默认状态) ========== // ========== 新增(含 ID生成 + 默认状态) ==========
@Override @Override
public PermissionDataRuleSchema saveNew(PermissionDataRuleSchema schema) { public PermissionDataRuleSchema saveNew(PermissionDataRuleSchema schema) {
schema.setId(idGenerator.nextLongId());
if (schema.getStatus() == null) { if (schema.getStatus() == null) {
schema.setStatus(1); schema.setStatus(1);
} }
if (schema.getRuleType() == null) {
schema.setRuleType(DataRuleType.LIST);
}
this.save(schema); this.save(schema);
return schema; return schema;
} }
// ========== 核心校验: tableId → 主表/单表,自动填充 tableType ========== // ========== 核心校验: formId → 主表/单表,自动填充 tableType ==========
@Override @Override
public CallResult verifyRelatedData(PermissionDataRuleSchema schema) { public CallResult verifyRelatedData(PermissionDataRuleSchema schema) {
// 1. 通过 tableName 查询 onl_form_head 获取 tableType // 1. 通过 tableName 查询 onl_form_head 获取 tableType

Loading…
Cancel
Save