Schema 动态字段
受众:开发者 摘要:Schema / Dynamic Field 字段定义、校验规则和渲染元数据底座。
spring-open-starter-schema 提供跨 Form、商户入驻、Install 配置、Plugin 配置等场景复用的动态字段底座。它只负责字段定义、校验和渲染元数据,不承载业务提交流程,也不创建数据库表。 Form 平台已在后端字段保存和公开提交校验中复用 Schema starter;Payment Platform 商户入驻已提供后台字段 Schema contract 并在 Admin 详情页复用动态字段渲染;Install 配置已提供安装配置字段 Schema contract 并由安装页消费;Plugin 配置已把插件描述符里的 configKeys 映射为后台只读配置字段 Schema。
Maven 依赖
<dependency>
<groupId>com.springopen</groupId>
<artifactId>spring-open-starter-schema</artifactId>
</dependency>自动配置类由 SchemaServiceProvider.configure(...) 声明,并交给 lifecycle starter 在 Spring Boot 自动配置导入阶段统一汇总。普通 starter 不再手写 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。
配置前缀
spring:
open:
schema:
enabled: true代码中使用 PropertyPrefixes.SCHEMA 维护配置前缀,避免业务模块手写字符串。
字段结构
核心模型是 SchemaFieldDefinition:
key:字段唯一标识。label:展示名称,未配置时使用key。type:字段类型。required:是否必填。description:字段说明。defaultValue:默认值。options:选项型字段的候选项。validationRules:声明式校验规则。render:前端渲染元数据。metadata:业务扩展元数据。
字段类型覆盖文本、数字、布尔、单选、多选、日期时间、评分、文件、图片和 JSON 等常见动态表单场景。
已接入场景
- Form 平台:字段定义保存前校验 Schema 定义,公开提交时校验 Schema 值;App / PC 公开填写页使用动态字段组件渲染。
- Payment Platform 商户入驻:后台
GET /api/v1/admin/payment-platform/merchants/onboarding-schema输出商户资料字段 Schema,Admin 商户详情抽屉使用SchemaDynamicField只读展示字段值。 - Install 配置:
GET /api/v1/install/config/schema输出站点、管理员、数据库、Redis 和 Storage 字段 Schema,安装页消费 label / description / required / options,接口不返回配置值或敏感默认值。 - Plugin 配置:
GET /api/v1/admin/plugins/{id}/config/schema输出插件描述符 configKeys 映射出的只读字段 Schema,Admin 插件详情抽屉使用SchemaDynamicField展示配置声明;当前不读取或回显配置值。
校验规则
内置规则包括:
REQUIREDMIN_LENGTH/MAX_LENGTHMIN/MAXPATTERNEMAIL/URLENUMMIN_ITEMS/MAX_ITEMS
校验结果通过 SchemaValidationResult 返回,包含 SchemaValidationIssue 列表。业务模块可以在保存配置、预览表单、提交答案前调用 SchemaManager.validateDefinition(...) / SchemaManager.validateValues(...) 做统一校验。
渲染元数据
SchemaRenderMetadata 描述跨端渲染提示:
component:推荐控件类型。placeholder:占位文案。helpText:辅助说明。group:分组或步骤标识。order:组内排序。width:布局宽度提示。hidden/readonly/disabled:基础交互状态。props:控件扩展属性。
这些元数据是提示而不是业务授权来源。服务端仍应在提交或保存时重新校验字段可见性、必填和类型约束。
渲染 contract
业务模块需要把 Schema 输出给 Admin / PC / App 渲染时,优先调用 SchemaManager.render(...):
SchemaManager.render(SchemaDefinition)返回SchemaRenderDefinition。SchemaRenderDefinition.groups()按render.group分组,未配置时归入default。- 组和字段默认按
render.order升序排列;未配置order时保留字段定义顺序。 - 默认过滤
render.hidden=true字段,避免普通填写页渲染后台隐藏字段。 - 设计器、预览器等需要显示隐藏字段时,使用
SchemaRenderRequest.includeHidden(schema)。
render(...) 只做字段展示队列整理,不替代提交校验、权限判断、条件显示和业务状态判断。
前端组件
三端已经提供可复用动态字段组件:
| 端 | 入口 |
|---|---|
| Admin | views/admin/src/components/SchemaField/SchemaDynamicField.vue |
| PC | views/pc/app/components/schema/SchemaDynamicField.vue |
| App | views/app/src/components/SchemaField/SchemaDynamicField.vue |
PC 与 App 同时提供 schema-field helper,用于解析旧 Form 字段结构和新 Schema 字段结构:
- PC:
views/pc/app/types/schema-field.ts - App:
views/app/src/services/schema-field.js
helper 兼容 questionType、optionsJson、validationJson,也兼容新的 type、options、validationRules、render。后续业务页面接入时应优先复用这些 helper,不再在页面内复制选项解析、分步、可见性和文件答案展示逻辑。
边界
- Schema starter 不依赖业务模块。
- Schema starter 不持久化字段定义。
- 动态字段组件不直接调用业务 API。
- 业务模块仍负责表单版本、提交记录、配置来源、权限和审计。