hookehuyr

docs: 为LangChain Agent添加完整的表单配置文档集

添加详细的文档集,为LangChain Agent生成表单配置提供完整的参考指南。包括:
- 数据结构总览:核心FormField、ComponentProps、Option等结构定义
- 组件类型参考:30+种表单组件的详细说明和配置要点
- 配置规范:component_props的完整属性规范和数据提交格式
- LangChain Agent使用指南:自然语言到组件的映射、必填识别、选项提取规则
- 示例数据:20+个真实配置示例和完整表单模板
- 规则控制系统:字段显示/隐藏规则的详细实现机制
- API接口文档:表单管理和数据操作的所有接口说明
- 页面数据提取指南:从实际运行表单中提取配置的方法
1 +# 变更日志
2 +
3 +记录项目开发过程中的重要变更和完成任务。
4 +
5 +## 2026-03-16
6 +
7 +### 16:54:40 - 完成任务
8 +
9 +**影响文件**:
10 +- `CLAUDE.md`
11 +
12 +**变更摘要**:
13 +- 无详细描述
1 +# 数据结构总览
2 +
3 +## 核心数据结构
4 +
5 +### 1. 表单字段结构 (FormField)
6 +
7 +每个表单字段都是一个对象,包含以下核心属性:
8 +
9 +```typescript
10 +interface FormField {
11 + // 字段标识
12 + key: string // 字段唯一标识,如 "field_1"
13 + name: string // 表单验证用的名称,通常等于 key
14 +
15 + // 字段值
16 + value: any // 字段当前值
17 + default?: any // 默认值
18 +
19 + // 组件相关
20 + component: Component // Vue 组件引用
21 + component_props: ComponentProps // 组件属性配置
22 +
23 + // 验证相关
24 + required?: boolean // 是否必填
25 + rules?: ValidationRule[] // 验证规则
26 + type?: string // 表单输入类型(text/textarea等)
27 +
28 + // 其他
29 + index?: number // 字段排序索引
30 +}
31 +```
32 +
33 +### 2. 组件属性结构 (ComponentProps)
34 +
35 +```typescript
36 +interface ComponentProps {
37 + // 基础属性
38 + tag: string // 组件类型标识(如 "input", "radio")
39 + name: string // 组件名称
40 + label: string // 字段标签(显示名称)
41 + placeholder?: string // 占位符文本
42 + default?: any // 默认值
43 +
44 + // 显示控制
45 + disabled?: boolean // 是否隐藏
46 + disabled_show?: boolean // 隐藏时是否显示图标
47 + readonly?: boolean // 是否只读
48 + required?: boolean // 是否必填
49 +
50 + // 选项类组件
51 + options?: Option[] // 选项列表(radio/checkbox/select)
52 +
53 + // 样式相关
54 + align?: string // 文本对齐方式(left/center/right)
55 + direction?: string // 排列方向(vertical/horizontal)
56 + background_color?: string // 背景色
57 +
58 + // 高级功能
59 + note?: string // 提示文本(支持HTML)
60 + is_camera_scan?: boolean // 是否启用微信扫一扫
61 + camera_scan_type?: string // 扫码类型(ALL_CODE/QR_CODE/BAR_CODE)
62 +
63 + // 图片上传
64 + max_count?: number // 最大上传数量
65 + max_size?: number // 最大文件大小(MB)
66 +
67 + // 评分
68 + x_score?: number // 分数值
69 +
70 + // 分组相关
71 + is_field_group?: boolean // 是否是集合组
72 + group_field_name?: string // 所属组字段名
73 +}
74 +```
75 +
76 +### 3. 选项结构 (Option)
77 +
78 +用于 Radio、Checkbox、Picker 等组件:
79 +
80 +```typescript
81 +interface Option {
82 + // 基础
83 + title: string // 选项显示文本
84 + value: any // 选项值
85 + checked?: boolean // 是否默认选中
86 +
87 + // 样式
88 + color?: string // 选项颜色
89 + background_color?: string // 背景色
90 +
91 + // 状态
92 + disabled?: boolean // 是否禁用
93 +
94 + // 描述信息
95 + desc_text?: string // 描述文本
96 + desc_type?: string // 描述类型(text/url)
97 + desc_url?: string // 描述链接URL
98 + desc_btn_name?: string // 描述按钮名称
99 +
100 + // 补充信息
101 + is_input?: boolean // 是否需要输入补充信息
102 + input_required?: boolean // 补充信息是否必填
103 + input_placeholder?: string // 补充信息占位符
104 + affix?: string // 补充信息值
105 +}
106 +```
107 +
108 +### 4. API 响应结构
109 +
110 +```typescript
111 +interface APIResponse<T = any> {
112 + code: number // 状态码:1=成功,其他=失败
113 + msg: string // 响应消息
114 + data: T // 响应数据
115 + show?: boolean // 是否显示错误提示
116 +}
117 +```
118 +
119 +## 数据流转
120 +
121 +### 1. 表单渲染流程
122 +
123 +```
124 +后端API → 表单配置数据 → createComponentType() → 动态组件渲染
125 +```
126 +
127 +### 2. 表单提交流程
128 +
129 +```
130 +用户输入 → 组件v-model → item.value → addFormDataAPI() → 后端保存
131 +```
132 +
133 +## 关键概念
134 +
135 +### 1. 动态组件系统
136 +
137 +项目使用 `component_props.tag` 属性决定渲染哪种组件:
138 +- 系统通过 `src/hooks/useComponentType.js` 中的 `createComponentType()` 函数
139 +- 根据 `tag` 值动态分配对应的 Vue 组件
140 +- 支持 30+ 种组件类型
141 +
142 +### 2. 验证系统
143 +
144 +- 基于 Vant Form 的验证系统
145 +- 通过 `rules` 数组配置验证规则
146 +- 必填项自动添加 `{ required: true, message: 'xxx' }`
147 +
148 +### 3. 规则系统
149 +
150 +- 字段可以通过规则控制其他字段的显示/隐藏
151 +- 通过 `emit("active")` 触发规则检查
152 +- 规则组件:`RuleField``MultiRuleField`
153 +
154 +### 4. Cookie 保存
155 +
156 +- 未完成表单自动保存到 Cookie
157 +- 格式:`{ form_code: { field_key: value } }`
158 +- 过期时间:1 天
159 +
160 +### 5. 周期选择
161 +
162 +- 某些表单支持周期选择
163 +- 通过 API `/srv/?a=cycle_list` 获取可用周期
164 +- 周期选择后 URL 会携带 `x_cycle` 参数
1 +# 表单字段组件类型
2 +
3 +## 支持的组件类型列表
4 +
5 +项目支持 **30+ 种** 动态表单字段组件,通过 `component_props.tag` 属性指定。
6 +
7 +## 文本输入类
8 +
9 +### 1. input - 单行文本输入
10 +- **组件**: `TextField`
11 +- **用途**: 短文本输入,如姓名、标题等
12 +- **特殊功能**: 微信扫一扫(`is_camera_scan`
13 +
14 +### 2. textarea - 多行文本输入
15 +- **组件**: `TextareaField`
16 +- **用途**: 长文本输入,如备注、描述等
17 +- **特性**: 自动高度(`autosize`
18 +
19 +### 3. number - 数字输入
20 +- **组件**: `NumberField`
21 +- **用途**: 数字类型输入,如年龄、数量等
22 +
23 +## 选择类
24 +
25 +### 4. radio - 单项选择
26 +- **组件**: `RadioField`
27 +- **用途**: 单选选项,如性别、是否等
28 +- **数据结构**: `options` 数组
29 +- **特殊功能**:
30 + - 选项颜色(`color`, `background_color`
31 + - 补充信息输入(`is_input`
32 + - 描述信息(`desc_text`, `desc_url`
33 +
34 +### 5. checkbox - 多项选择
35 +- **组件**: `CheckboxField`
36 +- **用途**: 多选选项,如爱好、标签等
37 +- **数据结构**: `options` 数组
38 +- **排列方向**: `direction` (vertical/horizontal)
39 +
40 +### 6. select - 单列选择器
41 +- **组件**: `PickerField`
42 +- **用途**: 下拉单选
43 +- **数据结构**: `options` 数组
44 +- **返回值**: 选中的 `value`
45 +
46 +## 日期时间类
47 +
48 +### 7. date - 日期选择器
49 +- **组件**: `DatePickerField`
50 +- **用途**: 选择日期
51 +
52 +### 8. time - 时间选择器
53 +- **组件**: `TimePickerField`
54 +- **用途**: 选择时间
55 +
56 +### 9. datetime - 日期时间选择器
57 +- **组件**: `DateTimePickerField`
58 +- **用途**: 选择日期和时间
59 +
60 +### 10. calendar - 日历选择器
61 +- **组件**: `CalendarField`
62 +- **用途**: 日历形式选择日期
63 +
64 +## 上传类
65 +
66 +### 11. image_uploader - 图片上传
67 +- **组件**: `ImageUploaderField`
68 +- **用途**: 上传图片到七牛云
69 +- **配置**:
70 + - `max_count`: 最大数量
71 + - `max_size`: 最大文件大小(MB)
72 +- **返回值**: `[{ url, name }]`
73 +
74 +### 12. file_uploader - 文件上传
75 +- **组件**: `FileUploaderField`
76 +- **用途**: 上传普通文件
77 +
78 +## 特殊输入类
79 +
80 +### 13. phone - 手机号输入
81 +- **组件**: `PhoneField`
82 +- **用途**: 手机号码输入和验证
83 +- **验证**: 11位手机号格式
84 +
85 +### 14. email - 邮箱输入
86 +- **组件**: `EmailField`
87 +- **用途**: 邮箱地址输入和验证
88 +
89 +### 15. id_card - 身份证输入
90 +- **组件**: `IdentityField`
91 +- **用途**: 身份证号码输入和验证
92 +
93 +### 16. name - 姓名输入
94 +- **组件**: `NameField`
95 +- **用途**: 中文姓名输入
96 +
97 +### 17. gender - 性别选择
98 +- **组件**: `GenderField`
99 +- **用途**: 性别选择(男/女)
100 +
101 +## 位置类
102 +
103 +### 18. address - 地址选择器
104 +- **组件**: `AreaPickerField`
105 +- **用途**: 省/市/区三级联动选择
106 +- **数据**: 使用 `@vant/area-data`
107 +
108 +## 展示类
109 +
110 +### 19. desc - 文字描述
111 +- **组件**: `DesField`
112 +- **用途**: 纯文字展示,不支持输入
113 +
114 +### 20. divider - 分割线
115 +- **组件**: `DividerField`
116 +- **用途**: 视觉分割线
117 +
118 +### 21. note - 富文本控件
119 +- **组件**: `NoteField`
120 +- **用途**: 富文本内容展示
121 +
122 +### 22. marquee - 跑马灯
123 +- **组件**: `MarqueeField`
124 +- **用途**: 滚动公告文字
125 +
126 +## 特殊功能类
127 +
128 +### 23. sign - 电子签名
129 +- **组件**: `SignField`
130 +- **用途**: 手写签名板
131 +- **依赖**: `vue-esign`
132 +
133 +### 24. rate - 评分选择器
134 +- **组件**: `RatePickerField`
135 +- **用途**: 星级评分
136 +
137 +### 25. appointment - 预约控件
138 +- **组件**: `AppointmentField`
139 +- **用途**: 时间段预约选择
140 +- **数据结构**: 复杂的日期+时间段结构
141 +
142 +### 26. rule - 活动规则控件
143 +- **组件**: `RuleField`
144 +- **用途**: 显示规则说明,支持弹窗
145 +
146 +### 27. multi_rule - 活动规则控件(多选)
147 +- **组件**: `MultiRuleField`
148 +- **用途**: 多选规则选项
149 +
150 +### 28. contact - 联系人控件
151 +- **组件**: `ContactField`
152 +- **用途**: 联系人信息输入
153 +
154 +### 29. button - 按钮控件
155 +- **组件**: `ButtonField`
156 +- **用途**: 自定义按钮
157 +
158 +### 30. custom - 自定义控件
159 +- **组件**: `CustomField`
160 +- **用途**: 完全自定义的组件
161 +
162 +## 高级类
163 +
164 +### 31. group - 组集合输入控件
165 +- **组件**: `GroupField`
166 +- **用途**: 将多个字段分组显示
167 +- **配置**: `field_groups` 数组
168 +
169 +### 32. org_picker - 树形选择控件
170 +- **组件**: `OrgPickerField`
171 +- **用途**: 组织架构树形选择
172 +
173 +### 33. volunteer_group - 义工组别选择
174 +- **组件**: `VolunteerGroupField`
175 +- **用途**: 义工组别单选
176 +
177 +### 34. table_editor - 表格编辑控件
178 +- **组件**: `TableField`
179 +- **用途**: 动态表格编辑,支持增删行
180 +
181 +### 35. video - 视频控件
182 +- **组件**: `VideoField`
183 +- **状态**: 已注释,暂未使用
184 +
185 +## 组件注册位置
186 +
187 +所有组件在 `src/hooks/useComponentType.js` 中注册:
188 +
189 +```javascript
190 +export function createComponentType(data) {
191 + _.each(data, (item, index) => {
192 + // 统一名称
193 + item.name = item.key
194 +
195 + // 根据 tag 分配组件
196 + if (item.component_props.tag === 'input') {
197 + item.component = TextField;
198 + }
199 + if (item.component_props.tag === 'radio') {
200 + item.component = RadioField;
201 + }
202 + // ... 更多组件
203 + })
204 +}
205 +```
206 +
207 +## 新增组件流程
208 +
209 +1.`src/components/` 下创建组件目录
210 +2. 创建 `index.vue` 组件文件
211 +3.`src/hooks/useComponentType.js` 添加 if 判断分支
212 +4. 组件必须支持以下 props:
213 + - `item`: Object (包含 component_props 和 value)
214 + - 必须通过 emit 发送 "active" 事件
1 +# component_props 配置规范
2 +
3 +## 通用属性
4 +
5 +所有组件类型都支持的属性:
6 +
7 +| 属性 | 类型 | 必填 | 默认值 | 说明 |
8 +|------|------|------|--------|------|
9 +| `tag` | string | ✅ | - | 组件类型标识,决定渲染哪个组件 |
10 +| `name` | string | ✅ | - | 组件名称 |
11 +| `label` | string | ✅ | - | 字段标签(显示名称) |
12 +| `default` | any | ❌ | - | 默认值 |
13 +| `placeholder` | string | ❌ | "请输入" | 占位符文本 |
14 +| `required` | boolean | ❌ | false | 是否必填 |
15 +| `disabled` | boolean | ❌ | false | 是否隐藏字段 |
16 +| `disabled_show` | boolean | ❌ | false | 隐藏时是否显示闭眼图标 |
17 +| `readonly` | boolean | ❌ | false | 是否只读 |
18 +| `note` | string | ❌ | - | 提示文本(支持HTML) |
19 +
20 +## 选项类组件属性
21 +
22 +Radio、Checkbox、Picker 等组件额外支持:
23 +
24 +| 属性 | 类型 | 说明 |
25 +|------|------|------|
26 +| `options` | Option[] | 选项列表数组 |
27 +| `direction` | string | 排列方向:`vertical`(垂直)/ `horizontal`(水平) |
28 +| `align` | string | 文本对齐:`left` / `center` / `right` |
29 +
30 +### Option 结构
31 +
32 +```typescript
33 +interface Option {
34 + title: string // 显示文本
35 + value: any // 选项值
36 + checked?: boolean // 默认选中
37 + disabled?: boolean // 禁用状态
38 + color?: string // 选项颜色
39 + background_color?: string // 背景色
40 +
41 + // 描述信息
42 + desc_text?: string // 描述文本
43 + desc_type?: string // "text" 或 "url"
44 + desc_url?: string // 描述链接
45 + desc_btn_name?: string // 描述按钮名称
46 +
47 + // 补充信息
48 + is_input?: boolean // 是否需要补充信息输入
49 + input_required?: boolean // 补充信息是否必填
50 + input_placeholder?: string // 补充信息占位符
51 + affix?: string // 补充信息值
52 +}
53 +```
54 +
55 +## 文本输入类属性
56 +
57 +### input / textarea / number
58 +
59 +| 属性 | 类型 | 说明 |
60 +|------|------|------|
61 +| `align` | string | 文本对齐方式 |
62 +| `is_camera_scan` | boolean | 是否启用微信扫一扫 |
63 +| `camera_scan_type` | string | 扫码类型:`ALL_CODE` / `QR_CODE` / `BAR_CODE` |
64 +| `is_edit_camera_scan_result` | boolean | 是否允许编辑扫码结果 |
65 +
66 +## 上传类属性
67 +
68 +### image_uploader
69 +
70 +| 属性 | 类型 | 默认值 | 说明 |
71 +|------|------|--------|------|
72 +| `max_count` | number | 9 | 最大上传数量 |
73 +| `max_size` | number | 10 | 最大文件大小(MB) |
74 +| `image_type` | string | "jpg/..." | 允许的图片类型 |
75 +
76 +**返回值结构**:
77 +```javascript
78 +{
79 + key: "image_uploader",
80 + filed_name: "field_1",
81 + value: [
82 + { url: "https://...", name: "image.jpg" }
83 + ]
84 +}
85 +```
86 +
87 +### file_uploader
88 +
89 +`image_uploader` 类似,用于普通文件上传。
90 +
91 +## 日期时间类属性
92 +
93 +### date / time / datetime / calendar
94 +
95 +| 属性 | 类型 | 说明 |
96 +|------|------|------|
97 +| `min_date` | Date/Date[] | 最小可选日期 |
98 +| `max_date` | Date/Date[] | 最大可选日期 |
99 +| `formatter` | Function | 格式化函数 |
100 +
101 +## 预约控件属性
102 +
103 +### appointment
104 +
105 +**复杂配置结构**:
106 +
107 +```javascript
108 +{
109 + tag: "appointment",
110 + label: "预约时间",
111 + appointment_title: "选择入寺时间",
112 + options: [
113 + {
114 + title: "03月27日", // 日期标题
115 + placeholder: "剩余余量 9878", // 提示信息
116 + disabled: false, // 是否禁用该日期
117 + columns: [ // 时间段列表
118 + {
119 + checked: false,
120 + disabled: false,
121 + value: "1",
122 + text: "16:00-17:30 余1399"
123 + }
124 + ]
125 + }
126 + ]
127 +}
128 +```
129 +
130 +## 规则控件属性
131 +
132 +### rule / multi_rule
133 +
134 +| 属性 | 类型 | 说明 |
135 +|------|------|------|
136 +| `desc_text` | string | 规则内容(支持 `\n` 换行) |
137 +| `desc_type` | string | `text`(弹窗)或 `url`(跳转) |
138 +| `desc_url` | string | 规则详情链接 |
139 +| `desc_btn_name` | string | 按钮名称,如"查看详情" |
140 +
141 +## 组集合控件属性
142 +
143 +### group
144 +
145 +```javascript
146 +{
147 + tag: "group",
148 + label: "物品详情",
149 + field_groups: [
150 + {
151 + tag: "input",
152 + label: "物品描述",
153 + field_name: "field_10",
154 + group_field_name: "field_4", // 所属组字段
155 + // ... 其他属性
156 + }
157 + ]
158 +}
159 +```
160 +
161 +## 评分控件属性
162 +
163 +### rate
164 +
165 +| 属性 | 类型 | 说明 |
166 +|------|------|------|
167 +| `x_score` | number | 显示分值(会显示在标签旁) |
168 +
169 +## 表格控件属性
170 +
171 +### table_editor
172 +
173 +| 属性 | 类型 | 说明 |
174 +|------|------|------|
175 +| `default` | string/html | 默认表格内容(HTML格式) |
176 +
177 +## 特殊功能属性
178 +
179 +### 微信扫码
180 +
181 +`input` 类型支持:
182 +
183 +```javascript
184 +{
185 + tag: "input",
186 + is_camera_scan: true,
187 + camera_scan_type: "ALL_CODE" // ALL_CODE | QR_CODE | BAR_CODE
188 +}
189 +```
190 +
191 +### 补充信息
192 +
193 +Radio、Checkbox 支持选择后输入补充信息:
194 +
195 +```javascript
196 +options: [
197 + {
198 + title: "其他",
199 + value: "other",
200 + is_input: true, // 启用补充输入
201 + input_required: true, // 补充信息必填
202 + input_placeholder: "请输入补充信息",
203 + affix: "" // 补充信息值
204 + }
205 +]
206 +```
207 +
208 +### 显示隐藏控制
209 +
210 +通过规则动态控制字段显示/隐藏:
211 +
212 +```javascript
213 +{
214 + tag: "input",
215 + disabled: false // true=隐藏,false=显示
216 +}
217 +```
218 +
219 +## 样式属性
220 +
221 +### 对齐方式
222 +
223 +```javascript
224 +{
225 + align: "left" // left | center | right
226 +}
227 +```
228 +
229 +### 颜色
230 +
231 +选项类组件支持单独配置颜色:
232 +
233 +```javascript
234 +options: [
235 + {
236 + title: "重要",
237 + value: "important",
238 + color: "#ff0000", // 文字颜色
239 + background_color: "#fff0f0" // 背景色
240 + }
241 +]
242 +```
243 +
244 +## 数据提交格式
245 +
246 +### 普通字段
247 +
248 +```javascript
249 +{
250 + key: "field_1",
251 + value: "用户输入的值"
252 +}
253 +```
254 +
255 +### 选项类字段(Radio)
256 +
257 +```javascript
258 +{
259 + key: "field_1",
260 + value: "选项值",
261 + affix: "补充信息: xxx", // 如果有补充信息
262 + type: "radio"
263 +}
264 +```
265 +
266 +### 选项类字段(Checkbox)
267 +
268 +```javascript
269 +{
270 + key: "field_1",
271 + value: ["值1", "值2"], // 数组
272 + type: "checkbox"
273 +}
274 +```
275 +
276 +### 图片上传
277 +
278 +```javascript
279 +{
280 + key: "field_1",
281 + filed_name: "field_1",
282 + value: [
283 + { url: "https://...", name: "image.jpg" }
284 + ],
285 + type: "image_uploader"
286 +}
287 +```
1 +# API 接口文档
2 +
3 +## 基础配置
4 +
5 +### 请求基础配置
6 +
7 +所有请求默认携带参数:
8 +```javascript
9 +{
10 + f: 'custom_form' // 固定参数
11 +}
12 +```
13 +
14 +### 响应格式
15 +
16 +```typescript
17 +interface APIResponse<T = any> {
18 + code: number // 1=成功,其他=失败
19 + msg: string // 响应消息
20 + data: T // 响应数据
21 + show?: boolean // 是否显示错误提示(code !== 1 时)
22 +}
23 +```
24 +
25 +### 请求封装
26 +
27 +```javascript
28 +import { fn, fetch } from '@/api/fn';
29 +
30 +// GET 请求
31 +fn(fetch.get('/srv/?a=xxx', params))
32 +
33 +// POST 请求
34 +fn(fetch.post('/srv/?a=xxx', params))
35 +```
36 +
37 +## 表单管理接口
38 +
39 +### 1. 新增表单
40 +
41 +**接口**: `/srv/?a=add_form`
42 +**方法**: POST
43 +**参数**:
44 +```javascript
45 +{
46 + client_id: string, // 主体客户id
47 + name: string, // 表单名称
48 + note: string // 表单描述
49 +}
50 +```
51 +
52 +### 2. 查询表单配置(字段和规则)
53 +
54 +**接口**: `/srv/?a=query_form_all_field`
55 +**方法**: GET
56 +**参数**:
57 +```javascript
58 +{
59 + f: "custom_form", // 固定参数
60 + form_code: string, // 表单唯一标识(必填)
61 + page_type: string, // 页面类型:add/edit/view(可选)
62 + data_id: string, // 数据ID(编辑时使用)
63 + flow_node_code: string // 流程节点代码(可选)
64 +}
65 +```
66 +
67 +**返回**:
68 +```javascript
69 +{
70 + code: 1,
71 + msg: "OK",
72 + data: {
73 + id: 835950,
74 + code: "nxqkbf",
75 + name: "表单名称",
76 + table_name: "customize_35697_nxqkbf",
77 + max_field_num: 3,
78 + field_list: [
79 + {
80 + tag: "input", // 组件类型
81 + field_name: "field_1", // 字段名
82 + label: "姓名", // 显示标签
83 + required: true, // 是否必填
84 + data_type: "text", // 数据类型
85 + placeholder: "请输入",
86 + disabled: false,
87 + readonly: false
88 + }
89 + ],
90 + rule_list: [ // 字段显示/隐藏规则
91 + {
92 + field_names: ["field_2"],
93 + mode: "SHOW",
94 + logical_op: "OR",
95 + expr_list: [...]
96 + }
97 + ],
98 + flow_process_list: null // 工作流流程列表
99 + }
100 +}
101 +```
102 +
103 +**调用示例**:
104 +```bash
105 +curl "https://oa-dev.onwall.cn/srv/?a=query_form_all_field&f=custom_form&form_code=nxqkbf"
106 +```
107 +
108 +---
109 +
110 +### 2.1. 查询表单设置(表单级配置)
111 +
112 +**接口**: `/srv/?a=query_form_setting`
113 +**方法**: GET
114 +**参数**:
115 +```javascript
116 +{
117 + f: "custom_form", // 固定参数
118 + form_code: string // 表单唯一标识(必填)
119 +}
120 +```
121 +
122 +**返回**:
123 +```javascript
124 +{
125 + code: 1,
126 + msg: "OK",
127 + data: [{
128 + id: 835950,
129 + code: "nxqkbf",
130 + name: "表单名称",
131 + max_field_num: 3, // 最大字段数
132 + data_count: 7, // 已提交数据条数
133 + extend: {
134 + server_time: "2026-03-16 17:15:40",
135 + is_back_user: false // 是否后台用户
136 + },
137 + property_list: {
138 + sjsj_enable: 1, // 是否启用数据收集
139 + commit_action: "text", // 提交动作类型
140 + commit_text_type: "default",
141 + commit_text_template: "提交成功", // 提交文本模板
142 + edit_commit_action: "text",
143 + edit_commit_text_type: "default",
144 + edit_commit_text_template: "提交成功"
145 + }
146 + }]
147 +}
148 +```
149 +
150 +**调用示例**:
151 +```bash
152 +curl "https://oa-dev.onwall.cn/srv/?a=query_form_setting&f=custom_form&form_code=nxqkbf"
153 +```
154 +
155 +---
156 +
157 +### 2.2. 两个接口的区别
158 +
159 +| 接口 | 获取内容 | 用途 |
160 +|------|---------|------|
161 +| `query_form_all_field` | 字段列表、规则列表 | 渲染表单结构 |
162 +| `query_form_setting` | 表单配置、提交设置 | 获取表单级属性 |
163 +
164 +### 3. 添加表单字段
165 +
166 +**接口**: `/srv/?a=add_form_field`
167 +**方法**: POST
168 +**参数**:
169 +```javascript
170 +{
171 + form_code: string, // 表单唯一标识
172 + component_code: string // 组件标识
173 +}
174 +```
175 +
176 +### 4. 添加表单字段属性设置
177 +
178 +**接口**: `/srv/?a=add_form_setting`
179 +**方法**: POST
180 +**参数**:
181 +```javascript
182 +{
183 + form_code: string, // 表单唯一标识
184 + field_name: string, // 表单字段名(表单级属性可为空)
185 + component_code: string, // 组件标识
186 + property_code: string, // 属性标识
187 + setting_value: string // 属性值(JSON数组字符串)
188 +}
189 +```
190 +
191 +### 5. 查询表单设置
192 +
193 +**接口**: `/srv/?a=query_form_setting`
194 +**方法**: GET
195 +**参数**:
196 +```javascript
197 +{
198 + form_code: string // 表单唯一标识
199 +}
200 +```
201 +
202 +**返回**:
203 +```javascript
204 +{
205 + enable: number, // 0=停止表单,1=开启表单
206 + is_time_range: number, // 0=不设定,1=设定
207 + is_count_down: number, // 0=不显示,1=显示
208 + begin_time: string, // 开启时间
209 + end_time: string // 停止时间
210 +}
211 +```
212 +
213 +### 6. 验证便当密码
214 +
215 +**接口**: `/srv/?a=verify_password`
216 +**方法**: POST
217 +**参数**:
218 +```javascript
219 +{
220 + form_code: string, // 表单唯一标识
221 + mmtx_password: string // 用户输入的密码
222 +}
223 +```
224 +
225 +### 7. 义工组长查询义工信息
226 +
227 +**接口**: `/srv/?a=volunteer_source_leader`
228 +**方法**: GET
229 +**参数**:
230 +```javascript
231 +{
232 + form_code: string, // 表单唯一标识
233 + page_type: string, // 页面类型
234 + force_back: string, // 是否强制后台账号模式检查
235 + volunteer_source: string, // 报名渠道:self/leader
236 + volunteer_phone: string // 义工手机号
237 +}
238 +```
239 +
240 +## 数据管理接口
241 +
242 +### 1. 添加表单数据
243 +
244 +**接口**: `/srv/?a=add_formdata`
245 +**方法**: POST
246 +**参数**:
247 +```javascript
248 +{
249 + form_code: string, // 表单唯一标识
250 + data: object // 待添加的数据(JSON对象)
251 +}
252 +```
253 +
254 +**示例**:
255 +```javascript
256 +{
257 + form_code: "form_001",
258 + data: {
259 + field_1: "张三",
260 + field_2: "13800138000",
261 + field_3: ["选项1", "选项2"]
262 + }
263 +}
264 +```
265 +
266 +### 2. 查询表单数据
267 +
268 +**接口**: `/srv/?a=query_formdata`
269 +**方法**: GET
270 +**参数**:
271 +```javascript
272 +{
273 + form_code: string, // 表单唯一标识
274 + id: string // 数据ID
275 +}
276 +```
277 +
278 +### 3. 修改表单数据
279 +
280 +**接口**: `/srv/?a=modi_formdata`
281 +**方法**: POST
282 +**参数**:
283 +```javascript
284 +{
285 + form_code: string, // 表单唯一标识
286 + id: string, // 数据ID
287 + data: object // 待修改的数据(JSON对象)
288 +}
289 +```
290 +
291 +### 4. 流程表单数据
292 +
293 +**接口**: `/srv/?a=flow_formdata`
294 +**方法**: POST
295 +**参数**:
296 +```javascript
297 +{
298 + form_code: string, // 表单唯一标识
299 + data_id: string, // 数据ID
300 + data: object, // 表单数据
301 + flow_node_code: string, // 流程节点
302 + flow_node_action_id: string, // 流程节点按钮ID
303 + flow_content: string // 流程审批意见
304 +}
305 +```
306 +
307 +## 组件接口
308 +
309 +### 1. 查询组件
310 +
311 +**接口**: `/srv/?a=query_component`
312 +**方法**: GET
313 +**参数**:
314 +```javascript
315 +{
316 + group_code: string, // 分组标识
317 + component_code: string, // 组件标识
318 + name: string // 组件名称(模糊查询)
319 +}
320 +```
321 +
322 +### 2. 查询部门列表
323 +
324 +**接口**: `/srv/?a=flow_setting&t=flow_dept_list`
325 +**方法**: GET
326 +**参数**:
327 +```javascript
328 +{
329 + form_code: string // 表单code
330 +}
331 +```
332 +
333 +**请求头建议**:
334 +```javascript
335 +{
336 + headers: {
337 + "only-data": true, // 去重
338 + "keep-data": true // 缓存
339 + }
340 +}
341 +```
342 +
343 +### 3. 查询角色列表
344 +
345 +**接口**: `/srv/?a=flow_setting&t=flow_role_list`
346 +**方法**: GET
347 +**参数**:
348 +```javascript
349 +{
350 + form_code: string // 表单code
351 +}
352 +```
353 +
354 +### 4. 搜索用户部门角色
355 +
356 +**接口**: `/srv/?a=flow_setting&t=search_user_dept_role`
357 +**方法**: GET
358 +**参数**:
359 +```javascript
360 +{
361 + form_code: string, // 表单code
362 + word: string // 搜索内容
363 +}
364 +```
365 +
366 +## 通用接口
367 +
368 +### 1. 发送验证码
369 +
370 +**接口**: `/srv/?a=sms`
371 +**方法**: POST
372 +**参数**:
373 +```javascript
374 +{
375 + phone: string // 手机号码
376 +}
377 +```
378 +
379 +### 2. 获取七牛上传 Token
380 +
381 +**接口**: `/srv/?a=upload`
382 +**方法**: POST
383 +**参数**:
384 +```javascript
385 +qs.stringify({
386 + name: string, // 文件名
387 + hash: string // 文件哈希(ETag)
388 +})
389 +```
390 +
391 +### 3. 保存文件
392 +
393 +**接口**: `/srv/?a=upload&t=save_file`
394 +**方法**: POST
395 +**参数**:
396 +```javascript
397 +qs.stringify({
398 + format: string, // 图片格式
399 + hash: string, // 文件哈希
400 + height: number, // 图片高度
401 + width: number, // 图片宽度
402 + filekey: string // 七牛返回的文件key
403 +})
404 +```
405 +
406 +## 周期接口
407 +
408 +### 1. 获取周期列表
409 +
410 +**接口**: `/srv/?a=cycle_list`
411 +**方法**: GET
412 +**参数**:
413 +```javascript
414 +{
415 + form_code: string // 表单唯一标识
416 +}
417 +```
418 +
419 +**返回**:
420 +```javascript
421 +{
422 + is_cycle: boolean, // 是否需要周期选择
423 + cycle_list: [ // 周期列表
424 + {
425 + cycle_id: string,
426 + cycle_name: string,
427 + start_date: string,
428 + end_date: string
429 + }
430 + ]
431 +}
432 +```
433 +
434 +## HTTP 请求缓存控制
435 +
436 +### 请求去重(only-data)
437 +
438 +避免短时间内重复请求:
439 +
440 +```javascript
441 +fn(fetch.get('/api/xxx', params, {
442 + headers: { "only-data": true }
443 +}))
444 +```
445 +
446 +### 持久化缓存(keep-data)
447 +
448 +缓存请求结果(30秒,最多50条):
449 +
450 +```javascript
451 +fn(fetch.get('/api/xxx', params, {
452 + headers: { "keep-data": true }
453 +}))
454 +```
455 +
456 +### 同时使用
457 +
458 +```javascript
459 +fn(fetch.get('/api/xxx', params, {
460 + headers: {
461 + "only-data": true,
462 + "keep-data": true
463 + }
464 +}))
465 +```
466 +
467 +## 错误处理
468 +
469 +### 特殊错误码
470 +
471 +| 错误码 | 说明 | 处理 |
472 +|--------|------|------|
473 +| 402 | 未授权/登录失效 | 跳转登录页,show=false |
474 +| 其他 | 业务错误 | 显示错误提示 |
475 +
476 +### 402 处理示例
477 +
478 +```javascript
479 +if (response.data.code === 402) {
480 + response.data.show = false; // 不显示默认错误
481 + showToast({
482 + message: '登录失效!将跳转到登录页面',
483 + duration: 1500,
484 + onClose: () => {
485 + window.location.href = location.origin + '/admin/';
486 + }
487 + })
488 +}
489 +```
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
1 +# docs 文档索引
2 +
3 +本文档目录为 LangChain Agent 设计表单生成功能提供完整的项目架构和数据结构参考。
4 +
5 +## 文档列表
6 +
7 +### 00-数据结构总览.md
8 +**用途**:了解项目的核心数据结构
9 +**内容**
10 +- 表单字段结构 (FormField)
11 +- 组件属性结构 (ComponentProps)
12 +- 选项结构 (Option)
13 +- API 响应结构
14 +- 数据流转流程
15 +
16 +**适合**:Agent 需要理解整体数据模型时
17 +
18 +---
19 +
20 +### 01-表单字段组件类型.md
21 +**用途**:了解所有支持的组件类型
22 +**内容**
23 +- 30+ 种组件类型完整列表
24 +- 每种组件的用途和配置要点
25 +- 组件注册位置
26 +- 新增组件流程
27 +
28 +**适合**:Agent 需要选择合适的组件类型时
29 +
30 +---
31 +
32 +### 02-component_props-配置规范.md
33 +**用途**:了解组件属性的详细配置
34 +**内容**
35 +- 通用属性(所有组件)
36 +- 各类组件专属属性
37 +- Option 结构详解
38 +- 数据提交格式
39 +- 样式属性
40 +
41 +**适合**:Agent 生成具体组件配置时
42 +
43 +---
44 +
45 +### 03-API-接口文档.md
46 +**用途**:了解后端 API 接口
47 +**内容**
48 +- 表单管理接口(增删改查)
49 +- 数据管理接口
50 +- 组件接口
51 +- 通用接口(上传、验证码等)
52 +- HTTP 缓存控制
53 +
54 +**适合**:Agent 需要与后端交互时
55 +
56 +---
57 +
58 +### 04-示例数据.md
59 +**用途**:提供各类组件的配置示例
60 +**内容**
61 +- 20+ 个真实配置示例
62 +- 完整表单配置示例
63 +- 数据提交格式示例
64 +- LangChain Prompt 模板
65 +
66 +**适合**:Few-shot Learning、Prompt 模板构建
67 +
68 +---
69 +
70 +### 05-LangChain-Agent-使用指南.md
71 +**用途**:Agent 开发指南
72 +**内容**
73 +- 自然语言到组件映射表
74 +- 必填/数量/选项识别规则
75 +- 复杂需求处理
76 +- Prompt 模板
77 +- LangChain 代码示例
78 +- 验证和错误处理
79 +
80 +**适合****开发 LangChain Agent 的主要参考文档**
81 +
82 +---
83 +
84 +### 06-规则控制系统.md
85 +**用途**:表单字段显示/隐藏规则系统
86 +**内容**
87 +- 规则系统概述(SHOW/HIDE 模式、AND/OR 逻辑)
88 +- 规则数据结构(rule_list、Rule、RuleExpr)
89 +- 核心函数分析(checkRules、evaluateMultipleRules、evaluateRuleCondition、handleCascadeHiding)
90 +- 触发机制(@active 事件)
91 +- 实际示例(简单/复杂/多规则/级联隐藏)
92 +- LangChain Agent 集成要点
93 +
94 +**适合**:Agent 需要生成规则配置或理解字段间依赖关系时
95 +
96 +---
97 +
98 +### 07-页面数据提取指南.md
99 +**用途**:从实际运行的表单页面中提取配置数据
100 +**内容**
101 +- Pinia Store 数据存储结构
102 +- 数据提取方法(Chrome DevTools MCP / Vue DevTools API / 直接 API)
103 +- 完整提取流程(打开页面 → 等待加载 → 提取数据 → 解析配置)
104 +- 数据提取模板和代码示例
105 +- 数据转换和验证
106 +
107 +**适合**:用户提供表单 URL 时,需要从页面提取完整配置
108 +
109 +---
110 +
111 +## 快速查找指南
112 +
113 +### 按场景查找
114 +
115 +| 场景 | 推荐文档 |
116 +|------|----------|
117 +| 理解项目架构 | 00-数据结构总览 |
118 +| 选择组件类型 | 01-表单字段组件类型、05-LangChain-Agent-使用指南 |
119 +| 生成配置 | 02-component_props-配置规范、04-示例数据 |
120 +| Few-shot 示例 | 04-示例数据 |
121 +| 开发 Agent | 05-LangChain-Agent-使用指南 |
122 +| 生成规则配置 | 06-规则控制系统 |
123 +| 理解字段依赖 | 06-规则控制系统 |
124 +| **从 URL 提取表单** | **07-页面数据提取指南** |
125 +
126 +### 按组件类型查找
127 +
128 +| 组件类别 | 文档位置 |
129 +|----------|----------|
130 +| 文本输入类 | 01-表单字段组件类型(文档输入类) |
131 +| 选择类 | 01-表单字段组件类型(选择类)、04-示例数据(示例4-6) |
132 +| 日期时间类 | 01-表单字段组件类型(日期时间类)、04-示例数据(示例8) |
133 +| 上传类 | 01-表单字段组件类型(上传类)、04-示例数据(示例9) |
134 +| 特殊功能类 | 01-表单字段组件类型(特殊功能类)、04-示例数据(示例11-20) |
135 +
136 +### 按属性查找
137 +
138 +| 属性 | 文档位置 |
139 +|------|----------|
140 +| 通用属性 | 02-component_props-配置规范(通用属性) |
141 +| options 配置 | 02-component_props-配置规范(选项类组件属性) |
142 +| 图片上传配置 | 02-component_props-配置规范(上传类属性) |
143 +| 样式属性 | 02-component_props-配置规范(样式属性) |
144 +| 规则配置 | 06-规则控制系统(数据结构、触发机制) |
145 +| 字段显示/隐藏 | 06-规则控制系统(SHOW/HIDE 模式) |
146 +| 级联隐藏 | 06-规则控制系统(级联隐藏逻辑) |
147 +
148 +## Agent 开发建议
149 +
150 +### 1. 先读顺序
151 +
152 +1. **05-LangChain-Agent-使用指南** - 了解 Agent 设计要点
153 +2. **01-表单字段组件类型** - 了解可用的组件
154 +3. **04-示例数据** - 获取 Few-shot 示例
155 +4. **02-component_props-配置规范** - 深入了解配置细节
156 +5. **06-规则控制系统** - 了解字段显示/隐藏规则(如需动态表单)
157 +
158 +### 2. 关键数据结构
159 +
160 +Agent 必须正确理解的核心结构:
161 +
162 +```typescript
163 +// 最核心的结构
164 +FormField {
165 + key: string
166 + value: any
167 + component_props: {
168 + tag: string // 决定组件类型
169 + label: string // 显示名称
170 + required: boolean
171 + // ... 其他属性
172 + }
173 +}
174 +```
175 +
176 +### 3. 组件类型映射表
177 +
178 +直接参考 `05-LangChain-Agent-使用指南` 中的映射表,建立用户描述 → 组件类型的映射。
179 +
180 +### 4. Few-shot 示例使用
181 +
182 +`04-示例数据.md` 中提取典型示例作为 Prompt 的一部分,提高输出质量。
183 +
184 +### 5. 验证策略
185 +
186 +生成配置后,验证以下内容:
187 +- [ ] tag 值是否有效(参考 01 文档的组件列表)
188 +- [ ] required 是否为布尔值
189 +- [ ] 选项类组件是否有 options 数组
190 +- [ ] 上传类组件是否有合理的数量限制
191 +
192 +## 数据流转图
193 +
194 +```
195 +用户自然语言
196 +
197 + [Agent 解析]
198 +
199 + 意图识别 + 实体提取
200 +
201 + 组件类型选择 + 配置生成
202 +
203 + [验证输出]
204 +
205 +表单字段配置 JSON
206 +
207 + createComponentType()
208 +
209 + 动态表单渲染
210 +```
211 +
212 +## 联系方式
213 +
214 +如有问题或需要补充文档,请查阅:
215 +- 项目源码:`src/hooks/useComponentType.js`
216 +- 组件目录:`src/components/`
217 +- API 目录:`src/api/`