插件设置与表单组件
Halo 已经在 Console 和用户中心注册了 FormKit,并通过 @halo-dev/components 提供页面、列表、弹窗和反馈组件。插件应复用宿主能力,使交互、校验、权限和视觉样式与 Halo 保持一致。
Setting Schema 的字段、默认值、敏感数据边界以及 Halo 扩展输入组件统一参考表单定义与组件速查。本页只说明如何在插件中关联设置,以及何时使用 Setting 或自定义 Vue 表单。
先选择正确的表单入口
插件通过 plugin.yaml 的 spec.settingName 和 spec.configMapName 关联 Setting 后,Halo 会在插件详情页自动渲染设置表单。插件 UI 不需要再注册普通设置路由,也不需要自行读取或更新 ConfigMap。只有 Setting Schema 无法表达的独立业务流程,才应创建自定义设置页面。
定义插件设置
在 src/main/resources/plugin.yaml 中声明 Setting 名称和用于保存配置的 ConfigMap 名称:
然后在 src/main/resources/extensions/settings.yaml 中提供对应的 Setting 资源:
spec.settingName 必须与 Setting 的 metadata.name 一致。spec.configMapName 应使用插件专属的稳定名称,并在后续版本中保持不变。插件安装或启动后,Halo 会加载 Setting,在插件详情页渲染表单,并将每个 group 的值保存到对应 ConfigMap。
服务端应通过 ReactiveSettingFetcher 读取配置,不要直接操作配置 ConfigMap。密码、Token、API Key 等敏感信息必须使用 secret 组件和 Halo Secret,不能直接保存在 Setting 中。
在 Vue 页面中使用 FormKit
FormKit 由 Halo 全局注册,插件不需要再次安装、初始化或自定义一套基础输入样式。页面和弹窗表单使用 Vue 3、<script setup lang="ts"> 和 FormKit 的提交、校验机制:
表单数据只在确实与 API 模型不同的情况下定义单独类型。插件 API 的资源模型、列表结果和请求参数应使用生成的 API Client,不要再手写一份同名类型。
Halo 还提供附件、文章、单页面、分类、标签、菜单、图标和 Secret 等 FormKit 输入组件。可用类型及引入版本参考表单定义与组件速查。需要注册插件自定义输入时,再参考 FormKit 扩展。
复用页面和列表组件
插件 UI 应先在目标版本的 Halo Core 或当前官方插件中查找相同页面类型,再选择组件:
- 普通管理页使用
VPageHeader和VCard。 - 资源列表使用
VEntityContainer、VEntity、VEntityField、VEmpty和VLoading。 - 关键词搜索使用
SearchInput。 - 确认和删除操作使用
Dialog,操作结果使用Toast。 - 创建和编辑弹窗使用
VModal与 FormKit。
组件需要从 @halo-dev/components 导入时,应使用包的公开导出,不要复制 Halo 内部组件源码或重新实现按钮、输入框、弹窗、提示和颜色体系。
权限和验证
- 路由、菜单和按钮的权限应与后端 API 和 RoleTemplate 保持一致,UI 隐藏不能代替后端鉴权。
- 使用 FormKit 的
required、url、min、max等规则提供即时校验,服务端仍必须验证所有不可信输入。 - 保存期间禁用重复提交,并使用宿主的 loading、Toast 和错误处理模式。
- 变更完成后检查桌面端和窄屏布局,以及 loading、空数据、错误和无权限状态。