搜索 K
Appearance
Appearance
这一组设计文档回答的不是「forge-admin-web 怎么用」,而是「它为什么是一台渲染引擎,而不是一堆手写页面」。只想把控制台跑起来、配出页面,请读使用指南;想知道一份 PageSchema 从下发到变成屏幕上的表格,中间经过哪些层、为什么这么分,本篇是入口。
前端的设计可以浓缩成一句话:以 PageSchema 为单一输入,用一台通用渲染引擎解释出所有页面;业务字段一律不写死,可变性收敛到一张多维加权注册表里。
后台管理天然面临一个矛盾:
传统做法「一个实体一套页面」把雷同的结构抄了 N 遍,新增实体的成本是线性的。forge 前端的解法是把结构与字段彻底分离:
新增实体的前端成本因此趋近于零。这是整个前端最重要的设计取舍:
| 设计取舍 | 选项 | 选择 | 理由 |
|---|---|---|---|
| 页面如何产生 | A. 每实体手写页面;B. schema 驱动通用引擎 | B | 把线性成本压成常数;新增实体零前端改动 |
| 字段表现谁定 | A. 前端写死控件;B. 后端下发中立组件名,前端选实现 | B | UI 库可换、字段可覆盖,前后端解耦 |
| 可变性放哪 | A. 散落在各页面 if-else;B. 收敛到一张注册表 | B | 自定义有唯一入口,覆盖优先级可计算 |
| 主线 | 解决的问题 | 关键载体 |
|---|---|---|
| 整体架构 | 九层如何分工、数据如何单向流动 | views / components / widgets / stores / api |
| 请求时序 | 登录、启动、列表、保存、详情各自的全链路 | router / Pinia / axios / ResourceListView |
| 渲染引擎(★) | 字段如何选到组件、自定义如何覆盖内置 | createRegistry / fieldRegistry / selectFieldWidget |
后续各篇会展开,这里先给全景:
field > model > component > dataType > scene 的数量级权重选最具体者。借鉴 oinone 的 SPI 思路,去掉 IoC/装饰器,保留纯函数 + 类型安全。json-bigint 在 axios 反序列化阶段把长整型转字符串,杜绝 JS Number 精度丢失。catch 块刻意留空,避免重复弹窗。前端只认 protocol.ts 里的接口定义。这些 schema 由后端的声明式建模与视图协议合成,前端不参与生产:
协议每个字段被前端如何消费、哪些已声明但未消费,见协议消费映射。