20260812221200

This commit is contained in:
oneao committed 2026-08-12 22:12:01 +08:00
1 parent 87b2d3c482
commit 4bd730f649
47 files changed
+6286 -1881

No files matched your search

+82
View File
@@ -0,0 +1,82 @@
# AI Context — 模块设计器原型
## 项目目标
这是一个 **FMS 模块管理系统的"字段设计器"交互原型**,用 React 实现,用于验证设计思路和交互方案。
解决的问题:原有系统将字段的列表、编辑、查询配置分散在 4 个 Tab 中,操作碎片化。目标是把所有配置围绕"字段"聚合,所见即所得。
## 技术栈
| 项 | 值 |
|---|-----|
| 框架 | React 19 + TypeScript 6 |
| 构建 | Vite 8 |
| 样式 | Tailwind CSS v4 (`@tailwindcss/vite`) |
| 拖拽 | `@dnd-kit/core` + `@dnd-kit/sortable` |
| 包管理 | pnpm |
## 文件结构
```
src/
├── types/index.ts # 所有 TS 类型定义 + FieldTypeDef 常量
├── data/moduleData.ts # Mock 数据 + 工厂函数
├── components/
│ ├── ModuleSettings.tsx # 顶部模块设置面板(编码/名称/编辑模式等)
│ ├── FormPreview.tsx # 左侧:表单预览(按分组排列,可拖拽排序)
│ ├── TablePreview.tsx # 左侧:表格预览(可拖拽列排序 + 列宽调整)
│ ├── FieldConfigList.tsx # 右侧:字段配置列表(L/E/Q 拨动开关 + 展开快捷编辑)
│ └── DataSourceDrawer.tsx # 下拉数据源配置抽屉(视图/静态选项)
├── App.tsx # 主布局 + 全局状态
├── main.tsx # 入口
└── index.css # Tailwind + 自定义 CSS(toggle、drawer 等)
```
## 核心设计理念
1. **两栏布局**:左侧实时预览(表单/表格切换),右侧字段配置列表
2. **零点击高频操作**:列表/编辑/查询开关做成拨动开关(toggle),直接拨不用展开
3. **内联快捷编辑**:点击字段行 → 下方展开标签/编码/类型/分组/列宽等基础配置
4. **拖拽排序**:表单模式和表格模式都支持拖拽调整字段顺序
5. **表格列宽调整**:表格预览下拖拽列头右边缘可调整列宽
6. **数据源配置**:下拉字段才有的复杂配置,用右侧抽屉单独处理
## 数据结构
### ModuleField(核心)
```ts
{
id: number, code: string, label: string, type: string,
groupId: string | null, order: number,
// 列表
listOn: boolean, listW: number, listAlign: "left"|"center"|"right",
// 编辑
editOn: boolean, editReq: boolean, editRO: boolean,
// 查询
queryOn: boolean, queryOp: string, queryDef: string,
// 数据源(下拉字段专用)
ds: { type:"view"|"static", ... } | null
}
```
### FieldGroup
```ts
{ id: string, name: string }
```
## 当前状态
- [ ] 基本功能:模块设置、表单预览、表格预览、字段配置列表、数据源抽屉 均已实现
- [ ] 无 lint 错误
- [ ] 表单预览可拖拽排序
- [ ] 表格预览可拖拽列排序 + 列宽调整
- [ ] 右侧 L/E/Q 拨动开关正常
- [x] 安装依赖 `pnpm install`
- [x] 启动 `pnpm dev`(端口 3000)
## 注意事项
- `@dnd-kit/modifiers` 不可用,用本地 `Modifier` 函数替代了 `restrictToVerticalAxis` / `restrictToHorizontalAxis`
- 所有样式在 `src/index.css` 中,使用 class 名而非 Tailwind 原子类的地方(toggle、drawer、field-row 等)是因为这些需要状态驱动的复杂样式
- 类型定义在 `src/types/index.ts`,修改字段结构时记得同步更新 `src/data/moduleData.ts` 中的 `makeField()` 工厂函数