深度分页问题优化方案

问题原因

Mysql使用select * from table limit offset, rows分页在深度分页的情况下, 性能急剧下降。

例如:select * 的情况下直接⽤limit 600000,10 扫描的是约60万条数据,并且是需要回表 60W次,也就是说⼤部分性能都耗在随机访问上,到头来只⽤到10条数据(总共取600010条数据只留10条记录)

优化方案

前端方案:业务层面限制跨度比较大的跳页

提供2种风格分页器供用户选择

  1. 标准分页器,展示最后一页和跳转指定页输入框
    image.png
  2. 简单分页器
    image.png

参考
百度方案: 不展示最后一页和直接跳转指定分页的输入框
image.png
Google方案:只展示查看下一页的按钮
image.png

界面设计器选表格/画廊的属性面板提供分页器风格的属性下拉选择

image.png

xml示例
<!-- 表格使用的标准分页器 --> <view type="TABLE" paginationStyle="SIMPLE"> <!-- fields --> </view> <!-- 画廊使用默认的标准分页器 --> <view type="GALLERY" paginationStyle="STANDARD"> <!-- fields --> </view>

后端方案

  1. 使用索引:确保数据库表中的相关字段上创建了适当的索引。索引可以加快查询速度,特别是在处理大数据量时。

  2. 分批查询:将大数据分成多个较小的批次进行查询,而不是一次性查询全部数据。可以通过限制每次查询的数据量和使用合适的偏移量来实现分批查询,例如使用LIMIT和OFFSET子句。

  3. 基于游标的分页:使用基于游标的分页技术,而不是传统的偏移分页。游标分页是通过记录上一次查询的游标位置,在下一次查询时从该位置开始获取新的数据,避免了大偏移量的影响。这可以通过数据库自身的功能(例如MySQL的CURSOR)或使用第三方库来实现。

  4. 缓存数据:如果数据变化较少,可以考虑将查询结果缓存到内存中,以避免频繁地查询数据库。这样可以提高页面相应速度,并减轻数据库负担。缓存的数据应该根据业务需要及时更新。

  5. 数据预处理:如果查询结果经常需要进行复杂的计算或处理,可以考虑提前对数据进行预处理并缓存结果,以减少每次查询的计算负担。

  6. 数据库优化:针对具体数据库系统,可以根据实际情况进行数据库调优。例如,合理设置数据库连接池大小、调整数据库参数等。

  7. 分布式存储和计算:对于非关系型数据库或分布式存储系统,可以考虑使用分布式存储和计算方案,将数据分散存储在多个节点上,并通过计算节点并行处理查询请求,以提高性能和可伸缩性。

参考链接

MySQL深分页场景下的性能优化

Oinone社区 作者:原创文章,如若转载,请注明出处:https://doc.oinone.top/other/75.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
's avatar
Previous 2023年6月20日 pm4:07
Next 2023年11月2日 pm1:58

相关推荐

  • 正式版发布:Oinone 6.3.0 版本 集成设计器新增 MCP,流程设计器优化,邀您体验

    版本号: 6.3.0 版本发布日期:2025.09.05更新要点:集成设计器新增 MCP,流程设计器优化 6.3.0 版本 GitHub: 后端: https://github.com/oinone/oinone-pamirs 前端: https://github.com/oinone/oinone-kunlun Gitee: 后端: https://gitee.com/oinone/oinone-pamirs 前端: https://gitee.com/oinone/oinone-kunlun 20260430 镜像版本升级: 6.3.11.1 –> 6.3.12 后端版本升级: 6.3.11.1 –> 6.3.13 Excel模版定义(ExcelHelper)新增支持列宽自适应API; 同步导入支持业务异常信息提示到页面; 导出如果无数据生成空文件(解决:目前无数据浏览器显示一串JSON问题) 修复逻辑删除未更新[更新时间]的问题,涉及到gauss、postgresql、kdb、oracle 和 sqlsever; 优化postgresql等字段大小写敏感导致第二次启动失败问题。 20260119 镜像版本升级: 6.3.10.1 –> 6.3.11.1 后端版本升级: 6.3.10.1 –> 6.3.11.1 前端版本升级 修复语言保存时毫秒格式验证错误的问题 修复元数据导入时菜单无法更新动作的问题 修复工作流集成接口在某些情况下参数处理错误的问题 20260109 升级此版本需要开启元数据全量刷新 pamirs.distribution.session.allMetaRefresh=true 镜像版本升级: 6.3.9 –> 6.3.10.1 后端版本升级: 6.3.9 –> 6.3.10.1 前端版本升级 修复工作流数据安装 增加对函数操作日志 增加函数操作规则设置 用户登录日志增加扩展点 时间格式支持毫秒 Eip日志增加毫秒支持 优化导出API 的文档结构 点击查看用户手册 集成接口日志参数信息支持 JSON/XML 格式切换及一键复制 点击查看用户手册 数据库 API 支持格式化 / 压缩SQL格式 点击查看用户手册 数据流程增加毫秒支持 语言增加毫秒支持 集成接口和开发接口日志统计增加日期范围筛选 增加标准心跳检查 trigger增加扩展点,适配多租户场景 增加导入文件URL错误,获取不到JSON的日志 解决元数据增强可能出现的死循环 20251229 升级内容 镜像版本升级: 6.3.8.2 –> 6.3.9 后端版本升级: 6.3.8 –> 6.3.9 前端版本升级 修复工作流元数据安装异常的问题 前端包名变更:@kunlun/vue-grid-layout@2.3.13 –> @oinone/vue-grid-layout@2.3.13 前端包名变更:webpack-aliyun-oss@0.5.2 –> @oinone/webpack-aliyun-oss@0.5.2 npmrc 统一配置 registry=https://registry.npmmirror.com/ @oinone:registry=http://nexus.shushi.pro/repository/kunlun/ legacy-peer-deps=true 20251218 升级内容 镜像版本升级: 6.3.7.1 –> 6.3.8.2 后端版本升级: 6.3.7 –> 6.3.8 前端版本升级 新增 SaaS 租户扩展包 界面设计器上传图片组件新增cdnKey配置 修复主表格行内编辑错误更新关联关系对象的问题 修复业务审计导出按钮无法配置权限的问题 修复导入/导出任务在某些情况下模块名称未正确显示的问题 修复体验镜像RocketMQ无法正常启动的问题 20251217 升级内容 镜像版本升级: 6.3.7 –> 6.3.7.1 前端版本升级 修复 minLength 和 maxLength 配置 -1 时未正确移除验证的问题 修复工作流节点预览页面无法正常查看的问题 20251211 升级内容 镜像版本升级: 6.3.6 –> 6.3.7 后端版本升级: 6.3.6 –> 6.3.7 修复默认视图标题为空的问题 修复界面设计器导出时无法导出上游菜单的问题 修复元数据导入时无代码模型未正确安装的问题 20251127 升级内容 镜像版本升级: 6.3.5.1 –> 6.3.6 后端版本升级: 6.3.5.1 –> 6.3.6 前端版本升级 工作流表格切换、添加审批人表格列宽度塌陷 修复在画布被滚动后缩放中心偏移问题 流程设计器与流程图添加平移功能 流程图在拖拽与平移时添加边界检测 管理中心员工和用户名称修改同步工作流委托与交接实现变更 修复数据可视化交叉表查询异常的问题 20251126 升级内容 镜像版本升级: 6.3.5 –> 6.3.5.1 后端版本升级: 6.3.5 –> 6.3.5.1…

    2025年9月5日
    1.9K00
  • 数据可视化创建图表

    在数据可视化模块中,可以通过三种不同的数据源类型来创建图表:模型字段(现有功能)、数据库(新功能)、集成应用(新功能)。

    2024年10月8日
    3.1K00
  • 5.1.0版本feature:新增用户会话配置项,请升级对应版本

    版本号: 5.1.13 版本发布日期:2024.09.18更新要点:新增用户会话配置项 5.1.13 版本 升级说明及步骤(已升级为5.0.0版本忽略) 此版本与4.7.8版本的兼容方案如下,请严格参照升级说明及步骤进行1、【重要】升级前备份base库和用户权限模块所在的库 2、【重要】升级过程执行SQL严格按照升级文档中的步骤执行。特别注意:部分SQL是要求【发布前执行】,部分SQL是要求【发布后执行】 5.0.0升级详细说明及步骤 升级内容(5.1.0) 新增用户会话配置项 修复用户会话过期时间续约的问题 修复时间范围组件打开后选中的时间为当前时间 修复表达式计算含有小数点的金额错误 修复权限组名称长度从128到256 修复Excel模板初始化异常的问题 修复EIP验证AccessToken过期时效的问题 修复字段权限【全部】未生效的问题 pamirs: user: # 超级管理员默认配置,仅首次启动时生效 admin: # 登录名 login: admin # 默认密码 password: admin # 默认昵称 name: 超级管理员 session: # 用户会话模式(使用其他值可自定义会话模式:pro.shushi.pamirs.user.api.spi.UserCacheApi) # 单用户会话(single):一个用户仅可以在一个浏览器登录,后登录的用户会强制先登录的用户下线。 # 多用户会话(multiple):一个用户可以在多个浏览器登录,不限会话数量。 mode: multiple # 用户会话过期时间;单位:秒; expire: 7200 # 2个小时后过期 # 用户会话续约时间;单位:秒;(建议续约时间小于等于会话过期时间) renewed-expire: 7200 # 每次操作续约2个小时 # 用户会话续约过滤URL;指定请求被接收时,不进行续约; renewed-filter-urls: – /pamirs/message # 内置过滤URL,无需配置,不可移除。 请尽可能保证业务工程前后端服务以及设计器同步升级前端服务仅需重新执行npm install即可自动升级到最新版本 版本包信息 Oinone平台部署及依赖说明(v5.0) 未使用到的版本号请忽略,按项目中使用到的进行替换。 <!– 平台基础 –> <pamirs.middleware.version>5.0.3</pamirs.middleware.version> <pamirs.k2.version>5.1.7</pamirs.k2.version> <pamirs.framework.version>5.1.13</pamirs.framework.version> <pamirs.boot.version>5.1.8</pamirs.boot.version> <pamirs.distribution.version>5.1.7</pamirs.distribution.version> <!– 平台功能 –> <pamirs.metadata.manager>5.1.2</pamirs.metadata.manager> <pamirs.designer.metadata.version>5.1.3</pamirs.designer.metadata.version> <pamirs.core.version>5.1.20</pamirs.core.version> <pamirs.workflow.version>5.1.8</pamirs.workflow.version> <pamirs.workbench.version>5.1.0</pamirs.workbench.version> <pamirs.data.visualization.version>5.1.3</pamirs.data.visualization.version> <!– 设计器 –> <pamirs.designer.common.version>5.1.2</pamirs.designer.common.version> <pamirs.flow.designer.base.version>5.1.3</pamirs.flow.designer.base.version> <pamirs.workflow.designer.version>5.1.2</pamirs.workflow.designer.version> <pamirs.model.designer.version>5.1.4</pamirs.model.designer.version> <pamirs.ui.designer.version>5.1.9</pamirs.ui.designer.version> <pamirs.data.designer.version>5.1.2</pamirs.data.designer.version> <pamirs.dataflow.designer.version>5.1.1</pamirs.dataflow.designer.version> <pamirs.eip.designer.version>5.1.2</pamirs.eip.designer.version> 注意镜像名称变化 镜像说明 所有镜像均使用docker manifest支持amd64和arm64架构。如镜像拉取过慢,可在对应镜像Tag添加-amd64、-arm64后缀获取单一架构镜像。 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.13.1-amd64 docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.13.1-arm64 镜像拉取 镜像或JAR版本:5.1.13.1 体验镜像:(所有中间件及前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-full-v5.1:5.1.13.1 部署镜像:(包含前后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/oinone-designer-mini-v5.1:5.1.13.1 流程设计器镜像:(包含前后端服务,仅包含流程设计器) docker pull harbor.oinone.top/oinone/workflow-designer-v5.1:5.1.13.1 后端镜像:(仅包含后端服务,包含全部设计器) docker pull harbor.oinone.top/oinone/designer-backend-v5.1:5.1.13.1 前端镜像:(仅包含前端服务,包含全部设计器) PS:前端镜像版本为独立版本,与其他镜像版本不同。原基础镜像为nginx-1.21.0版本,从5.0.7版本开始使用nginx-1.24.0版为基础镜像 docker pull harbor.oinone.top/oinone/designer-frontend-v5.1:5.1.19 独立部署所有设计器JAR:(后端服务,包含所有设计器)pamirs-designer-boot-v5.1-5.1.13.1.jarpamirs-designer-boot-v5.1-latest.jar 独立部署流程设计器JAR:(后端服务,仅包含流程设计器)pamirs-workflow-designer-boot-v5.1-5.1.13.1.jarpamirs-workflow-designer-boot-v5.1-latest.jar 后端无代码设计器Jar包启动方法 如果您有任何问题、建议或反馈,请随时联系我们。为了获得最佳体验,请及时更新至最新版本。我们将继续努力改进产品,提供更好的服务。谢谢!

    2024年9月18日
    1.3K00
  • 元数据在线发布(5.1.0及以上版本)

    一 产品功能说明 1. 设计同步部署 设计同步部署功能实现不同环境设计数据一键同步的目标,即将A环境设计完成的模型、界面、等设计数据一键部署至B环境。 使用此功能,需要在‘应用中心’安装‘应用环境’: ‘应用环境’安装完成,进入发起同步部署环境——>业务应用——>‘应用环境’,对要进行快速部署的发起环境、目标环境进行配置: 在进行多个环境同步部署设计数据时,必须正确配置发起环境、目标环境。 完成配置后,在应用中心,选择目标‘已安装’应用,在操作下拉菜单选择待部署设计类型,即可按照指引完成操作: 2. 设计导出 设计导出功能具备将已安装应用所属(应用技术名称)设计元数据,如模型、界面、流程、集成设计、数据可视化导出为json文件的能力,具备筛选导出、一键导出两种方式以满足不同业务场景需要。 目标是实现在多个环境通过技术接口调用、或通过应用中心导入界面完成导入,使设计元数据在不同环境之间快速迁移同步: 因平台允许多个应用名称相同,能够唯一定位具体应用使用的是‘应用技术名称’,因此识别应用标识的依据为应用技术名称。 3. 设计导入 3.1. 迁移导入 对于已导出设计元数据json文件,如果导出类型为‘迁移导出’,可以在不同环境,通过应用中心——>已安装应用——>设计导入(迁移),实现设计数据导入: 3.2. 标品导入 对于导出类型为‘标品导出’的设计元数据,目前只支持通过技术接口形式完成导入,暂不支持界面进行可视化导入操作。 4. 导出导入任务 不同环境设计元数据以导入json文件方式进行迁移的基础是设计导出,基于界面导入实现设计元数据在不同环境进行迁移场景、或通过技术接口导入以实现标品升级的场景,存在导出类型为迁移导出、标品导出的区别。 使用此功能的操作者需要依据实际需求场景进行相应导出类型的选择。 4.1. 导出任务查看 对于已经执行导出的任务,可通过‘应用环境——>设计导出’查看导出任务信息: 4.2. 导入任务查看 对于已经执行导入的任务,可通过‘应用环境——>设计导入’查看导入任务状态、进度、详细信息: 5. 部署任务 部署任务功能用于查看设计数据同步部署功能任务状态、详细信息;分为发起环境任务查看、目标环境任务查看。 无论是发起环境,或是目标环境,均通过所属环境‘应用环境’中‘部署任务’功能进行查看: 二 产品功能操作手册 1. 设计导出 1.1. 环境迁移导出 点击‘业务应用——>应用中心’,进入应用中心,默认显示‘应用列表’标签页: 选择‘已安装’应用——>操作,出现操作菜单: 选择‘设计导出’,显示支持导出的各设计项: 1.1.1. 模型导出 操作菜单选择‘模型导出’: 打开模型导出信息弹窗: 在弹窗页中存在要素信息项及操作项: 导出类型:选择‘迁移导出’。 文件名称:默认为‘应用名称+设计类型’。 导出模式:异步模式,不可修改。 导出格式:JSON文件,不可修改。 一键导出:操作项,直接导出当前应用下的所有无代码模型,不需要筛选。 筛选导出:操作项,进入无代码模型导出筛选页,选择要导出的设计数据。 1.1.1.1. 一键导出 点击‘一键导出’,关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.1.2. 筛选导出 点击‘筛选导出’,进入无代码模型导出筛选页: 筛选页面按照‘模型类型’、‘可用/废弃’、‘来源’选择或输入查找条件,点击‘搜索’,进行条件搜索,查找满足条件无代码模型: 点击‘重置’按钮,清空已输入查找条件: 点击列表标题栏勾选框,可进行全选/取消全选操作,全选——选择全部模型,取消全选——取消所有已勾选项: 勾选要导出模型,点击‘导出’按钮: 回到应用中心,右上角提示导出信息: 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.2. 界面导出 ‘业务应用——>应用中心’,进入应用中心,选择已安装应用——>操作——>设计导出——>界面导出,弹出界面导出信息项弹窗,‘导出类型’选择‘迁移导出’: 1.1.2.1. 一键导出 点击‘一键导出’,关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 界面导出会将所选菜单项、菜单目录路径、菜单绑定页面、页面使用的自定义组件全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.2.2. 筛选导出 点击‘筛选导出’,进入应用环境——>界面导出筛选页面,显示当前应用下所有菜单项: 查询项‘菜单名称’输入名称,点击‘搜索’按钮,进行模糊查找匹配的菜单项: 点击‘清除’按钮,清除已输入的查询内容: 勾选菜单项后,点击‘导出’按钮: 回到应用中心页面,同时页面右上角提示导出进行中信息: 界面导出会将所选菜单项、上级菜单目录项、菜单绑定页面、页面使用的自定义组件全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.3. 流程导出 点击‘业务应用——>应用中心’,进入应用中心,选择已安装应用——>操作——>设计导出——>流程导出,弹出导出信息弹窗: ‘导出类型’选择‘迁移导出’。 1.1.3.1. 一键导出 点击‘一键导出’: 关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 一键导出流程数据会按照应用技术名称,将当前应用下所有流程、元数据、涉及的业务数据如审批用户、角色等全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.3.2. 筛选导出 点击‘筛选导出’: 进入流程数据筛选页面,显示当前应用(技术名称)下所有已发布流程: 支持按照流程名称(模糊匹配)、触发方式(模型触发、定时触发、日期触发、子流程)进行筛选;输入筛选条件,点击搜索按钮,查找匹配结果: 点击‘清除’按钮,清空筛选内容: 勾选列表流程项,点击‘导出’按钮: 返回应用中心,同时页面右上角提示导出信息: 流程导出会将应用(技术名称)下的所有已发布流程及相关元数据、业务数据全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.4. 集成导出 点击‘业务应用——>应用中心’,进入应用中心,选择已安装应用——>操作——>设计导出——>集成导出,弹出集成导出信息项弹窗,‘导出类型’选择‘迁移导出’: 1.1.4.1. 一键导出 点击‘一键导出’,关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 一键导出集成数据会按照应用技术名称,将所有已发布数据流程;以及所有已启用连接器(与应用无关)、已启用开放接口(与应用无关)全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.4.2. 筛选导出 点击‘筛选导出’: 进入集成数据筛选页面,默认显示‘连接器’标签页——>应用(已启用)数据项列表: 可选项: 连接器:应用(已启用状态)、数据库(已启用状态)、与应用无关。 数据流程:已发布状态,且属于发起导出应用(技术名称)下的数据流程。 开放平台:API接口(已启用状态)、与应用无关。 以上各项在列表中展示的数据均可勾选并支持导出为json文件: 勾选列表数据项,点击‘导出’按钮: 回到应用中心,右上角显示导出提示信息: 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.5. 数据可视化导出 点击‘业务应用——>应用中心’,进入应用中心,选择已安装应用——>操作——>设计导出——>数据可视化导出,弹出数据可视化导出信息项弹窗,‘导出类型’选择‘迁移导出’: 1.1.5.1. 一键导出 点击‘一键导出’: 关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 一键导出数据可视化会将所有已发布图表(含路径目录)、报表(含路径目录)、数据大屏(含路径目录)、图表模版全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.1.5.2. 筛选导出 点击‘筛选导出’: 进入数据可视化筛选列表页面,默认显示‘图表’标签页,并展示已发布图表数据项列表: 标签页: 图表:显示所有已发布状态图表,以树形结构展示,支持按照‘图表名称’模糊匹配查找。 报表:显示所有已发布状态报表,以树形结构展示,支持按照‘报表名称’模糊匹配查找。 数据大屏:显示所有已发布状态数据大屏,以树形结构展示,支持按照‘数据大屏名称’模糊匹配查找。 图表模版:显示所有图表模版,列表形式展示,支持按照‘图表名称’模糊匹配查找。 勾选列表数据项,点击‘导出’按钮: 关闭弹窗,回到应用中心,右上角出现导出进行中提示信息: 筛选导出数据可视化数据会将所有已发布图表(含路径目录)、报表(含路径目录)、数据大屏(含路径目录)、图表模版全部导出为json文件。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.2. 标品导出 点击‘业务应用——>应用中心’,进入应用中心,点击‘应用列表’标签项;选择‘已安装’应用,点击操作,出现操作菜单: 选择‘设计导出’,显示支持导出的各设计项: 1.2.1. 模型导出 点击‘业务应用——>应用中心’,进入应用中心;点击已安装应用——>操作,出现操作菜单: 选择‘设计导出——>模型导出’: 打开导出信息弹窗: 1.2.1.1. 一键导出 导出过程同《1.1.1.1 设计导出/环境迁移导出/模型导出/一键导出》,区别是标品导出json文件无法通过前端页面导入其它环境,只能通过技术接口导入。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.2.1.2. 筛选导出 导出过程同《1.1.1.2 设计导出/环境迁移导出/模型导出/筛选导出》,区别是标品导出json文件无法通过前端页面导入其它环境,只能通过技术接口导入。 导出任务状态信息、导出任务详细信息查看方式参见《1.3 设计导出/导出任务查看》。 1.2.2.…

    2024年9月2日
    94700
  • 组件SPI机制(v4)

    阅读之前 你应该: 了解DSL相关内容。母版-布局-DSL 渲染基础(v4) 组件SPI简介 不论是母版、布局还是DSL,所有定义在模板中的标签都是通过组件SPI机制获取到对应Class Component(ts)并继续执行渲染逻辑。 基本概念: 标签:xml中的标签,json中的dslNodeType属性。 Token组件:用于收集一组Class Component(ts)的基础组件。通常该基础组件包含了对应的一组基础能力(属性、函数等) 维度(dsl属性):用于从Token组件收集的所有Class Component(ts)组件中查找最佳匹配的参数。 组件SPI机制将通过指定维度按照有权重的最长路径匹配算法获取最佳匹配的组件。 组件注册到指定Token组件 以BaseFieldWidget这个SPIToken组件为例,可以用如下方式,注册一个可以被field标签处理的自定义组件: (以下示例仅仅为了体现SPI注册的维度,而并非实际业务中使用的组件代码) 注册一个String类型组件 维度: 视图类型:表单(FORM) 字段业务类型:String类型 说明: 该字段组件可以在表单(FORM)视图中使用 并且该字段的业务类型是String类型 @SPI.ClassFactory( BaseFieldWidget.Token({ viewType: ViewType.Form, ttype: ModelFieldType.String }) ) export class FormStringFieldWidget extends BaseFieldWidget { …… } 注册一个多值的String类型组件 维度: 视图类型:表单(FORM) 字段业务类型:String类型 是否多值:是 说明: 该字段组件可以在表单(FORM)视图中使用 并且该字段的业务类型是String类型 并且该字段为多值字段 @SPI.ClassFactory( BaseFieldWidget.Token({ viewType: ViewType.Form, ttype: ModelFieldType.String, multi: true }) ) export class FormStringMultiFieldWidget extends BaseFieldWidget { …… } 注册一个String类型的Hyperlinks组件 维度: 视图类型:表单(FORM) 字段业务类型:String类型 组件名称:Hyperlinks 说明: 该字段组件仅可以在表单(FORM)视图中使用 并且该字段的业务类型是String类型 并且组件名称必须指定为Hyperlinks @SPI.ClassFactory( BaseFieldWidget.Token({ viewType: ViewType.Form, ttype: ModelFieldType.String, widget: 'Hyperlinks' }) ) export class FormStringHyperlinksFieldWidget extends BaseFieldWidget { …… } 当上述组件全部按顺序注册在BaseFieldWidget这个SPIToken组件中时,将形成一个以BaseFieldWidget为根节点的树: “` mermaidgraph TDBaseFieldWidget —> FormStringFieldWidgetBaseFieldWidget —> FormStringMultiFieldWidgetFormStringFieldWidget —> FormStringHyperlinksFieldWidget“` 树的构建 上述形成的组件树实际并非真实的存储结构,真实的存储结构是通过维度进行存储的,如下图所示: (圆角矩形表示维度上的属性和值,矩形表示对应的组件) “` mermaidgraph TDviewType([viewType: ViewType.Form]) —>ttype([ttype: ModelFieldType.Strng]) —>multi([multi: true]) & widget([widget: &#039;Hyperlinks&#039;]) direction LRttype —> FormStringFieldWidgetmulti —> FormStringMultiFieldWidgetwidget —> FormStringHyperlinksFieldWidget“` 有权重的最长路径匹配 同样以上述BaseFieldWidget组件为例,该组件可用的维度有: viewType:ViewType[Enum] ttype:ModelFieldType[Enum] multi:[Boolean] widget:[String] model:[String] viewName:[String] name:[String] 当field标签被渲染时,我们会组装一个描述当前获取维度的对象: { "viewType": "FORM", "ttype": "STRING", "multi": false, "widget": "", // 在dsl中定义的任意值 "model": "", // 在dsl编译后自动填充 "viewName": "", // 当前视图名称 "name": "" // 字段的name属性,在dsl编译后自动填充 } 当我们需要使用FormStringHyperlinksFieldWidget这个组件时,我们在dsl中会使用如下方式定义: <view type="FORM" title="演示表单" name="演示模型form" model="demo.DemoModel"> <field data="name" widget="Hyperlinks" /> </view> 此时,我们虽然没有在dsl中定义维度中的其他信息,但在dsl返回到前端时,经过了后端编译填充了对应元数据相关属性,我们可以得到如下所示的对象: { "viewType": "FORM", "ttype": "STRING", "multi": false, "widget":…

    2023年11月1日
    1.3K00

Leave a Reply

Please Login to Comment