hookehuyr

docs: 添加 CLAUDE.md 项目指南

- 项目概述和快速开始命令
- 核心架构说明(动态表单系统、路由、缓存)
- 30+ 表单字段组件类型列表
- 开发规范和常见陷阱说明

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Showing 1 changed file with 169 additions and 0 deletions
1 +# CLAUDE.md
2 +
3 +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4 +
5 +## 项目概述
6 +
7 +这是一个**移动端动态表单系统**,基于 Vue 3 + Vite 构建,使用 Vant 4 作为 UI 组件库。系统支持通过配置动态生成 30+ 种类型的表单字段组件。
8 +
9 +## 快速开始
10 +
11 +```bash
12 +# 安装依赖
13 +npm install
14 +
15 +# 开发(支持网络访问)
16 +npm run dev
17 +npm run start # 监听 0.0.0.0
18 +
19 +# 构建
20 +npm run build
21 +
22 +# 构建 + 打包 + 部署(一体化)
23 +npm run {env}_upload # env: dev, oa, mituo, guanzong, baorong, taishan, xys, zentea, behalo
24 +npm run all_upload # 部署到所有环境
25 +```
26 +
27 +## 技术栈
28 +
29 +- **框架**: Vue 3 (Composition API)
30 +- **构建**: Vite 2
31 +- **UI 库**: Vant 4
32 +- **状态管理**: Pinia
33 +- **路由**: Vue Router 4 (Hash 模式)
34 +- **HTTP**: Axios
35 +- **语言**: JavaScript/TypeScript 混合
36 +
37 +## 核心架构
38 +
39 +### 动态表单系统
40 +
41 +项目的核心是**动态表单字段组件系统**,通过 `component_props.tag` 属性决定渲染哪种组件:
42 +
43 +```javascript
44 +// src/hooks/useComponentType.js
45 +// 支持的组件类型包括:
46 +input, textarea, number, radio, checkbox, select, address,
47 +date, time, datetime, image_uploader, file_uploader, phone,
48 +email, sign, rate, calendar, id_card, desc, divider, marquee,
49 +contact, rule, multi_rule, button, note, name, gender,
50 +appointment, custom, group, org_picker, volunteer_group, table_editor
51 +```
52 +
53 +### 字段组件目录
54 +
55 +```
56 +src/components/
57 +├── TextField/ # 单行文本
58 +├── TextareaField/ # 多行文本
59 +├── RadioField/ # 单选
60 +├── CheckboxField/ # 多选
61 +├── PickerField/ # 选择器
62 +├── AreaPickerField/ # 地址选择
63 +├── DatePickerField/ # 日期选择
64 +├── ImageUploaderField/ # 图片上传
65 +├── SignField/ # 电子签名
66 +├── TableField/ # 表格编辑
67 +└── ...(30+ 组件)
68 +```
69 +
70 +### 路由系统
71 +
72 +**动态路由加载**:使用 `import.meta.globEager` 自动加载 `src/router/routes/modules/` 下的路由模块。
73 +
74 +**关键路由流程**
75 +1. 404 页面作为中转,动态加载异步路由
76 +2. 周期选择检查 (`checkCycleSelection`)
77 +3. 未完成表单恢复 (Cookie 检查)
78 +
79 +```javascript
80 +// src/router.js
81 +// 关键逻辑:404 → 动态路由加载 → 周期选择 → 表单检查 → 目标页面
82 +```
83 +
84 +### HTTP 请求缓存
85 +
86 +Axios 封装实现了两种缓存机制:
87 +- **only-data**: 请求去重,避免重复请求
88 +- **keep-data**: 持久化缓存(30秒,最多50条)
89 +
90 +```javascript
91 +// src/utils/axios.js
92 +// 通过请求头控制
93 +headers: {
94 + 'only-data': true, // 去重
95 + 'keep-data': true // 缓存
96 +}
97 +```
98 +
99 +## 关键约定
100 +
101 +### 组件开发规范
102 +
103 +1. **所有表单字段组件必须**
104 + - 使用 `v-model` 绑定值
105 + - 通过 `component_props` 接收配置
106 + - 支持 `placeholder` 属性
107 + - 支持 `required` 验证
108 +
109 +2. **组件命名规范**
110 + - 目录名:PascalCase(如 `TextField`
111 + - 文件名:`index.vue`
112 +
113 +### API 调用规范
114 +
115 +```javascript
116 +// 所有 API 默认携带参数 f: 'custom_form'
117 +// 使用封装的 fn() 处理响应
118 +import { fn } from '@/api/fn';
119 +```
120 +
121 +### 路由参数规范
122 +
123 +常用查询参数:
124 +- `code`: 表单唯一标识
125 +- `page_type`: 页面类型 (add/edit/view)
126 +- `model`: 模式 (preview/正式)
127 +- `x_cycle`: 跳过周期检查
128 +- `force_back`: 强制后台模式
129 +
130 +## 部署说明
131 +
132 +项目使用 SCP + SSH 自动化部署到多个环境(dev、oa、mituo 等)。部署流程:
133 +1. `npm run build` 构建
134 +2. 打包为 `dist.tar.gz`
135 +3. SCP 传输到目标服务器
136 +4. SSH 解压到指定目录
137 +
138 +## 常见陷阱
139 +
140 +### 1. 动态路由刷新白屏
141 +问题:动态路由刷新时 404
142 +解决:路由守卫中 404 作为中转,延迟 1s 后加载动态路由
143 +
144 +### 2. 表单字段组件未注册
145 +问题:新增组件后未在 `useComponentType.js` 中注册
146 +解决:在 `src/hooks/useComponentType.js` 添加对应的 if 判断分支
147 +
148 +### 3. Vant 组件需手动注册
149 +问题:某些 Vant 组件未全局注册
150 +解决:在 `src/main.js` 中添加 `app.use(ComponentName)`
151 +
152 +### 4. 路由周期检查死循环
153 +问题:周期选择页面互相跳转
154 +解决:检查 `cycle_selected` 参数和 sessionStorage 中的 `skip_cycle_check_for_auth`
155 +
156 +### 5. 移动端兼容性
157 +- 避免使用 PC 端特有的 API(如 `window.location.href` 赋值跳转,应使用 `router.push`
158 +- Vant 组件在小程序环境可能不兼容(项目为 H5 项目,无此问题)
159 +
160 +## 外部文档
161 +
162 +- Vant 4 文档: https://vant-ui.github.io/vant/#/zh-CN
163 +- Vue Router 文档: https://router.vuejs.org/zh/
164 +- Pinia 文档: https://pinia.vuejs.org/zh/
165 +- Vite 文档: https://cn.vitejs.dev/
166 +
167 +---
168 +
169 +*最后更新: 2026-03-16*