Files
trans-form-component/DESIGN.md
T
windychen fd5f7a0752
Node.js Build / build (push) Has been skipped
docs: 补全 Q1-Q61 完整设计决策文档
2026-08-07 10:25:52 +08:00

145 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# @windychen/trans-form-component — Design (Q1–Q61)
> 设计基线:grill-me 61 题访谈结论(2026-08-06)。配套包:`@windychen/trans-form-middleware`。
## 角色定位
Schema 驱动的 Vue 3 动态查询表单:接收 schema 数组,输出扁平 filter 数组(含可选 `logic`、状态标记、`empty` 标记)。
```jsonc
// 输入 schema 示例
[
{
"row": 6,
"value-component": "input",
"field": "name",
"field-name": "名称",
"query-option": [
{ "value": "EQ", "label": "=", "desc-cn": "等于" },
{ "value": "GT", "label": ">", "desc-cn": "大于" }
]
}
]
// 输出 filters 示例
[
{ "field": "name", "value": "xx", "query": "EQ", "op": "=" }
]
```
---
## 一、架构与发布
| # | 决策 |
|---|------|
| 1 | middleware:Node.js 纯 JS |
| 2 | middleware 输出:结构化过滤器,不碰 SQL |
| 3 | **两个独立 Gitea 仓库**,各自 CI、各自发版 |
| 4 | component:**无 UI 库依赖**,slot/渲染器由宿主提供 |
| 5 | 字符串 `value-component`:**内置 headless 原生控件** |
| 10 | component 源码:**纯 JavaScript**(与 middleware 一致) |
| 20 | component 发布:**ESM only** |
| 21 | CI:**复制 windychen-utils 模式**(三关键词 → Verdaccio + Gitea Packages + Release + 钉钉) |
| 22 | 包名:`@windychen/trans-form-component`、`@windychen/trans-form-middleware` |
| 23 | `peerDependencies: vue@^3.4`(Vue 3 only) |
| 26 | component 构建:**vue-tsc + Vite**(library 模式) |
| 28 | 测试:**Vitest**,CI 里 `npm test` 通过才发布 |
| 29 | 版本号:**完全独立**,兼容性写 README |
| 47 | component 仓库带 **Storybook** |
| 48 | 宿主通过 `app.use(TransFormPlugin)` 全局注册 |
---
## 二、Schema / 布局 / 渲染
### 布局
| # | 决策 |
|---|------|
| 15 | `row`:**12 栅格**,一行总宽 12,累加超 12 自动换行 |
| 30 | field 布局:同一 row 内 **name 3 / query 2 / value 7**(inline) |
| 35 | 栅格比例:**全局固定**,`setConfig` 一次设定 |
### 条件逻辑
| # | 决策 |
|---|------|
| 16 | 输入 schema 每条可带 **`logic: 'AND'\|'OR'`** |
| 17 | 操作符:**下拉可改**;支持 **`query-component`**(规则同 `value-component`) |
| 18 | 未指定 `query-component` 时:**继承 value renderer**,绑定 query 字段 |
| 19 | `setConfig` / `component-map`:**全局单例** |
| 34 | 未写 `default-query`:默认 **`query-option` 第一项** |
| 57 | logic:**UI 可改** AND/OR,输出以 UI 为准 |
### 组件解析
| # | 决策 |
|---|------|
| 36 | 未注册 `value-component`:**占位 + console warn**,不阻断其它 field |
| 37 | 未注册 `query-component`:同上,默认继承 value renderer |
| 43 | 自定义组件 props:`{ field, fieldName, queryOption, schema }` 等上下文 |
| 45 | `options`:**组件自主维护**,schema 不强制固定字段 |
### 样式
| # | 决策 |
|---|------|
| 42 | 样式:**内置最小样式 + `--tf-*` CSS 变量**(5 个变量) |
### 内置控件(v1)
| # | 决策 |
|---|------|
| 58 | 内置类型:`input`、`textarea`、`select`、`number`、`date` + **`tags`** |
| 32 | BETWEEN UI:可配 `between-ui`,**默认双 input** |
| 33 | IN/NOT_IN UI:可配 `in-ui`,**默认 tags** |
### 字段状态
| # | 决策 |
|---|------|
| 59 | field 状态:支持 **`hidden` / `disabled` / `readOnly`** |
| 31 | IS_NULL/IS_NOT_NULL:value **禁用但占位** |
| 55 | `schema`:**响应式 prop**,变化时保留同名 field 状态 |
| 56 | 匹配 key:按 **`field` 名** |
---
## 三、输出协议
| # | 决策 |
|---|------|
| 6 | 多条件:**schema 可配 and/or,支持嵌套分组** |
| 7 | 输出形态:**扁平数组 + `logic` 字段** |
| 9 | 空 value:**保留并标记 `empty: true`** |
| 11 | 对外 API:**emit `@change` + ref `getFilters()`** |
| 12 | v1 操作符:比较 + LIKE/IN/NOT_IN + BETWEEN/IS_NULL/IS_NOT_NULL |
| 13 | 多值 `value`:**逗号分隔字符串**(如 `"10,20"`、`"a,b,c"`) |
| 51 | 只内置 **重置**(`reset()` + 可选按钮),查询由宿主触发 |
| 52 | 重置:回到 **schema 初始态** |
| 53 | `@change`:`changeEmit: 'immediate' \| 'debounce' \| 'manual'`,默认 immediate |
| 54 | **第一条不带 `logic`**,从第二条起表示与前一条的连接 |
| 60 | filters **全部输出带状态标记**(`disabled` / `hidden` / `readOnly`) |
---
## 四、与 middleware 的协议对齐
| 项 | 约定 |
|----|------|
| 输出字段 | `field`、`value`、`query`(原始码)、`op`(标准符号)、`logic?`、`values?`、`empty?` |
| 状态标记 | `disabled: true` / `hidden: true` → middleware 默认跳过;`readOnly` → 正常解析 |
| 空值 | `empty: true` → middleware 默认保留,`skipEmpty` 可配 |
| 操作符码表 | `EQ NE GT GTE LT LTE LIKE IN NOT_IN BETWEEN IS_NULL IS_NOT_NULL` |
---
## 五、CI 触发约定
commit message 必须同时包含 `chore` + `版本` + `更新` 才触发构建发布;否则 job 显示 skipped(设计行为,防误触)。
```bash
git commit -m "chore: 版本 0.1.0 更新 ..."
```