asai-vue-host-form 0.2.16 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/readme +0 -527
package/package.json
CHANGED
package/readme
DELETED
|
@@ -1,527 +0,0 @@
|
|
|
1
|
-
# asai-vue-host-form — 动态表单渲染引擎
|
|
2
|
-
|
|
3
|
-
## 概述
|
|
4
|
-
|
|
5
|
-
`asai-vue-host-form` 是 AsaiWeb CMS 系统中的动态表单渲染插件。核心思路:通过 `asaidata` 配置对象(包含数据、规则、国际化映射等)驱动,根据字段值的类型自动匹配对应的表单组件,支持递归渲染嵌套对象和数组。
|
|
6
|
-
|
|
7
|
-
## 安装
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
// 作为 Vue 插件安装
|
|
11
|
-
import AsaiVueHostForm from 'asai-vue-host-form';
|
|
12
|
-
|
|
13
|
-
app.use(AsaiVueHostForm, {
|
|
14
|
-
loadfn: loadfn,
|
|
15
|
-
loadvue: loadvue,
|
|
16
|
-
});
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
插件通过 `import.meta.glob` 自动扫描 `./asui/form/` 和 `./asui/formbase/` 下的所有 `.vue` 文件,按需加载并注册。
|
|
20
|
-
|
|
21
|
-
## 核心用法
|
|
22
|
-
|
|
23
|
-
```vue
|
|
24
|
-
<template>
|
|
25
|
-
<AsaiForm :ujt="ujt" :asaidata="asaidata" :opt="{ isedit: 1 }" />
|
|
26
|
-
</template>
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### 参数说明
|
|
30
|
-
|
|
31
|
-
| Prop | 类型 | 说明 |
|
|
32
|
-
|------|------|------|
|
|
33
|
-
| `ujt` | `any` | **工具对象** — 解构出 `$fn`、`$global`、`$model` 等全局工具/状态,是整个系统的胶水层 |
|
|
34
|
-
| `asaidata` | `any` | **表单配置对象** — 包含 `data`(表单值)、`rule`(字段规则)、`lang`(国际化标签映射)、`comp`(自定义组件映射)等 |
|
|
35
|
-
| `opt` | `any` | **选项** — `opt.isedit = 1` 进入编辑模式;`opt.isedit` 不传则进入新增模式 |
|
|
36
|
-
|
|
37
|
-
### asaidata 结构
|
|
38
|
-
|
|
39
|
-
```ts
|
|
40
|
-
{
|
|
41
|
-
data: {
|
|
42
|
-
// 表单数据,直接 v-model 绑定
|
|
43
|
-
username: '张三',
|
|
44
|
-
age: 28,
|
|
45
|
-
enabled: true,
|
|
46
|
-
tags: ['a', 'b'],
|
|
47
|
-
address: { city: '北京', street: '长安街' }
|
|
48
|
-
},
|
|
49
|
-
rule: {
|
|
50
|
-
// 字段规则配置
|
|
51
|
-
username: { type: 'text', maxlength: 20, require: true },
|
|
52
|
-
age: { type: 'number', min: 0, max: 150 },
|
|
53
|
-
enabled: { type: 'checkbox' },
|
|
54
|
-
tags: { type: 'select', data: [['a', '标签A'], ['b', '标签B']] },
|
|
55
|
-
address: {} // 对象类型自动递归渲染
|
|
56
|
-
},
|
|
57
|
-
lang: {
|
|
58
|
-
// 国际化标签(字段名显示文字)
|
|
59
|
-
username: '用户名',
|
|
60
|
-
age: '年龄'
|
|
61
|
-
},
|
|
62
|
-
comp: {
|
|
63
|
-
// 自定义组件映射(可选)
|
|
64
|
-
select: 'AsaiSelect'
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## 组件层级
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
AsaiForm (容器入口)
|
|
73
|
-
└── AsaiFormLi (列表迭代器)
|
|
74
|
-
├── AsaiFormShow (只读展示)
|
|
75
|
-
├── AsaiFormObject (嵌套对象/数组,可折叠)
|
|
76
|
-
│ └── AsaiFormLi (递归)
|
|
77
|
-
├── AsaiInput (智能输入 — 自动选择 AsfCheck / AsfInput)
|
|
78
|
-
├── AsaiSelect (下拉选择)
|
|
79
|
-
├── AsaiSelectLv (权限等级选择 — 按用户级别过滤)
|
|
80
|
-
├── AsaiSelectCl (分类选择 — 支持树形 nodeMap)
|
|
81
|
-
├── AsaiTextarea (多行文本)
|
|
82
|
-
├── AsaiTextJson (JSON 文本)
|
|
83
|
-
├── AsaiRichEditor (富文本编辑器)
|
|
84
|
-
├── AsaiUpload (二进制文件上传)
|
|
85
|
-
├── AsaiUploadImg (图片上传 → 裁剪弹窗)
|
|
86
|
-
│ └── AsaiUploadImgCutPop (裁剪弹窗包装器)
|
|
87
|
-
│ └── AsaiUploadImgCut (图片裁剪面板)
|
|
88
|
-
└── AsaiUpBinary (二进制直传上传)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## 组件详解
|
|
92
|
-
|
|
93
|
-
### 一、容器层
|
|
94
|
-
|
|
95
|
-
#### AsaiForm
|
|
96
|
-
|
|
97
|
-
| Prop | 类型 | 说明 |
|
|
98
|
-
|------|------|------|
|
|
99
|
-
| `ujt` | `any` | 工具对象 |
|
|
100
|
-
| `asaidata` | `any` | 表单配置 — 写入 `asaidata.comp`(组件映射)和 `asaidata.cmComp`(动态获取函数) |
|
|
101
|
-
| `opt` | `any` | 选项 — `opt.isedit = 1` 进入编辑模式 |
|
|
102
|
-
|
|
103
|
-
容器创建组件加载器缓存,自动扫描同级目录下(除自身外)的所有 `.vue` 文件供动态渲染调用。
|
|
104
|
-
|
|
105
|
-
#### AsaiFormLi
|
|
106
|
-
|
|
107
|
-
| Prop | 类型 | 说明 |
|
|
108
|
-
|------|------|------|
|
|
109
|
-
| `ujt` | `any` | 工具对象 |
|
|
110
|
-
| `asaidata` | `any` | 表单配置 |
|
|
111
|
-
| `formdata` | `any` | 当前层级数据 |
|
|
112
|
-
| `opt` | `any` | 选项(可选),传递 `opt.isedit` |
|
|
113
|
-
|
|
114
|
-
**渲染逻辑:**
|
|
115
|
-
- 字段规则中 `noedit`(编辑模式)或 `noadd`(新增模式)为 `2` → 渲染 `AsaiFormShow` 只读
|
|
116
|
-
- 字段规则中 `noedit` / `noadd` 为 `1` → 跳过隐藏
|
|
117
|
-
- 字段值为对象 → 优先用 `cmComp('object')`,否则用 `AsaiFormObject`
|
|
118
|
-
- 否则 → 用 `cmComp(key)` 查找对应组件,找不到则 fallback 到 `AsaiInput`
|
|
119
|
-
|
|
120
|
-
### 二、布局/标签组件
|
|
121
|
-
|
|
122
|
-
#### AsaiFormLabel
|
|
123
|
-
|
|
124
|
-
| Prop | 类型 | 说明 |
|
|
125
|
-
|------|------|------|
|
|
126
|
-
| `ujt` | `any` | — |
|
|
127
|
-
| `asaidata` | `any` | 使用 `asaidata.ic`(缩进层级)、`asaidata.eq`(格式模式)、`asaidata.lang`(国际化标签) |
|
|
128
|
-
| `formdata` | `any` | — |
|
|
129
|
-
| `formkey` | `any` | 字段键名,用于从 `lang` 中取显示文本 |
|
|
130
|
-
|
|
131
|
-
- `asaidata.ic > 1` → 显示图标前缀(🔸 普通, 🔹 数字)
|
|
132
|
-
- `asaidata.eq > 2` → 键名带双引号
|
|
133
|
-
- `asaidata.eq` 为真 → 键名后带冒号
|
|
134
|
-
- `asaidata.eq > 2` → 值后带逗号
|
|
135
|
-
- `rule?.[formkey]?.require` → 标签后显示红色 `*`
|
|
136
|
-
|
|
137
|
-
#### AsaiFormLabelArea
|
|
138
|
-
|
|
139
|
-
| Prop | 类型 | 说明 |
|
|
140
|
-
|------|------|------|
|
|
141
|
-
| `ujt` | `any` | — |
|
|
142
|
-
| `asaidata` | `any` | 从 `rule?.[formkey]?.nolabel` 和 `typeof formdata[formkey]` 决定用 `label` 还是 `div` |
|
|
143
|
-
| `formdata` | `any` | — |
|
|
144
|
-
| `formkey` | `any` | — |
|
|
145
|
-
|
|
146
|
-
- `nolabel` 为 true 或字段值是对象 → 渲染 `<div>`(无原生 label 语义)
|
|
147
|
-
- 否则 → 渲染 `<label>`
|
|
148
|
-
- 支持 `rule?.[formkey]?.class` 和 `rule?.[formkey]?.style`
|
|
149
|
-
|
|
150
|
-
#### AsaiFormShow
|
|
151
|
-
|
|
152
|
-
| Prop | 类型 | 说明 |
|
|
153
|
-
|------|------|------|
|
|
154
|
-
| `ujt` | `any` | — |
|
|
155
|
-
| `asaidata` | `any` | — |
|
|
156
|
-
| `formdata` | `any` | — |
|
|
157
|
-
| `formkey` | `any` | — |
|
|
158
|
-
|
|
159
|
-
内部使用 `AsfInput` 并设置 `opt.noedit = true`,渲染为只读输入框。用于 `noedit=2` / `noadd=2` 的场景。
|
|
160
|
-
|
|
161
|
-
#### AsaiFormObject
|
|
162
|
-
|
|
163
|
-
| Prop | 类型 | 说明 |
|
|
164
|
-
|------|------|------|
|
|
165
|
-
| `ujt` | `any` | — |
|
|
166
|
-
| `asaidata` | `any` | `asaidata.ic` 控制图标显示 |
|
|
167
|
-
| `formdata` | `any` | — |
|
|
168
|
-
| `formkey` | `any` | — |
|
|
169
|
-
|
|
170
|
-
- 点击标题可折叠/展开
|
|
171
|
-
- `asaidata.eq > 1` → 显示 `{` / `}` 或 `[` / `]` 包裹
|
|
172
|
-
- 递归调用 `AsaiFormLi` 渲染子字段
|
|
173
|
-
|
|
174
|
-
### 三、字段输入组件
|
|
175
|
-
|
|
176
|
-
#### AsaiInput
|
|
177
|
-
|
|
178
|
-
**智能输入组件** — 根据字段类型自动切换为复选框或文本输入。
|
|
179
|
-
|
|
180
|
-
| Prop | 类型 | 说明 |
|
|
181
|
-
|------|------|------|
|
|
182
|
-
| `ujt` | `any` | 需要 `$fn`、`$fn.As.toArr`、`$fn.lg` |
|
|
183
|
-
| `asaidata` | `any` | `rule?.[formkey]` 配置规则 |
|
|
184
|
-
| `formdata` | `any` | — |
|
|
185
|
-
| `formkey` | `any` | — |
|
|
186
|
-
|
|
187
|
-
**选择逻辑:**
|
|
188
|
-
- `type === 'checkbox'` 或值是 boolean → 渲染 `AsfCheck`
|
|
189
|
-
- 否则 → 渲染 `AsfInput`,类型从规则或值类型推断(`number` / `text`)
|
|
190
|
-
|
|
191
|
-
**规则参数:**
|
|
192
|
-
- `rule?.[formkey]?.type` — 输入类型(`text`, `number`, `checkbox`)
|
|
193
|
-
- `rule?.[formkey]?.max` / `min` — 数字范围
|
|
194
|
-
- `rule?.[formkey]?.data` — 选项列表
|
|
195
|
-
- `rule?.[formkey]?.opt` — 透传到基础组件的附加参数
|
|
196
|
-
|
|
197
|
-
#### AsaiSelect
|
|
198
|
-
|
|
199
|
-
| Prop | 类型 | 说明 |
|
|
200
|
-
|------|------|------|
|
|
201
|
-
| `ujt` | `any` | — |
|
|
202
|
-
| `asaidata` | `any` | — |
|
|
203
|
-
| `formdata` | `any` | — |
|
|
204
|
-
| `formkey` | `any` | — |
|
|
205
|
-
|
|
206
|
-
内部使用 `AsfSelect`,数据源获取方式与 `AsaiInput` 相同(`lang` → `rule` → `$fn.lg` 三源回退)。
|
|
207
|
-
|
|
208
|
-
#### AsaiSelectLv
|
|
209
|
-
|
|
210
|
-
**权限等级选择** — 与 `AsaiSelect` 类似,但多了用户等级过滤:`data.filter(item => Number(item[0]) < userLv)`,只显示低于当前用户等级的选项。
|
|
211
|
-
|
|
212
|
-
| Prop | 类型 | 说明 |
|
|
213
|
-
|------|------|------|
|
|
214
|
-
| `ujt` | `any` | 额外需要 `$global.user.info.lv` |
|
|
215
|
-
| `asaidata` | `any` | — |
|
|
216
|
-
| `formdata` | `any` | — |
|
|
217
|
-
| `formkey` | `any` | — |
|
|
218
|
-
|
|
219
|
-
#### AsaiSelectCl
|
|
220
|
-
|
|
221
|
-
**分类选择** — 支持树形 `nodeMap` 和深度信息,自动设置默认值(过滤掉 `asai` 前缀的项)。
|
|
222
|
-
|
|
223
|
-
| Prop | 类型 | 说明 |
|
|
224
|
-
|------|------|------|
|
|
225
|
-
| `ujt` | `any` | — |
|
|
226
|
-
| `asaidata` | `any` | `rule?.[formkey]?.data` 可以是 `{ nodeMap, depthMap }` 树形结构 |
|
|
227
|
-
| `formdata` | `any` | — |
|
|
228
|
-
| `formkey` | `any` | — |
|
|
229
|
-
|
|
230
|
-
#### AsaiTextarea
|
|
231
|
-
|
|
232
|
-
**多行文本输入** — 包装 `AsfTextarea`。
|
|
233
|
-
|
|
234
|
-
| Prop | 类型 | 说明 |
|
|
235
|
-
|------|------|------|
|
|
236
|
-
| `ujt` | `any` | — |
|
|
237
|
-
| `asaidata` | `any` | `rule?.[formkey]?.opt` 透传到 textarea |
|
|
238
|
-
| `formdata` | `any` | — |
|
|
239
|
-
| `formkey` | `any` | — |
|
|
240
|
-
|
|
241
|
-
#### AsaiTextJson
|
|
242
|
-
|
|
243
|
-
**JSON 文本输入** — 与 `AsaiTextarea` 结构相同,用于编辑 JSON 字符串。
|
|
244
|
-
|
|
245
|
-
#### AsaiRichEditor
|
|
246
|
-
|
|
247
|
-
**富文本编辑器** — 基于 `contenteditable` 实现。
|
|
248
|
-
|
|
249
|
-
| Prop | 类型 | 说明 |
|
|
250
|
-
|------|------|------|
|
|
251
|
-
| `ujt` | `any` | 需要 `$global` 提供国际化文本 |
|
|
252
|
-
| `asaidata` | `any` | `rule?.[formkey]?.editorty`(初始视图模式: 0=编辑,1=源码,2=分屏), `rule?.[formkey]?.style` |
|
|
253
|
-
| `formdata` | `any` | — |
|
|
254
|
-
| `formkey` | `any` | — |
|
|
255
|
-
|
|
256
|
-
工具栏功能:字号、标题(H1-H6)、加粗、下划线、斜体、删除线、字体颜色、背景色、有序/无序列表、对齐、删除、链接、图片/视频/文件插入、HTML 源码切换。支持图片压缩(最大宽度288px, quality 0.8),粘贴自动清理不安全的 HTML。
|
|
257
|
-
|
|
258
|
-
### 四、上传组件
|
|
259
|
-
|
|
260
|
-
#### AsaiUpload
|
|
261
|
-
|
|
262
|
-
| Prop | 类型 | 说明 |
|
|
263
|
-
|------|------|------|
|
|
264
|
-
| `ujt` | `any` | 需要 `$fn.apisys.apiUpload`、`$global.sys.syspath.updir`、`$fn.As.getName` |
|
|
265
|
-
| `asaidata` | `any` | `rule?.[formkey]?.accept`(文件类型过滤)、`rule?.[formkey]?.filename`(自定义文件名) |
|
|
266
|
-
| `formdata` | `any` | — |
|
|
267
|
-
| `formkey` | `any` | — |
|
|
268
|
-
|
|
269
|
-
上传 URL: `/api/asaifile/manage/upbinary/`,支持图片预览和文件名展示。
|
|
270
|
-
|
|
271
|
-
#### AsaiUploadImg
|
|
272
|
-
|
|
273
|
-
**图片上传(带裁剪弹窗)** — 通过 `FileReader` 读取为 base64,弹出裁剪弹窗。
|
|
274
|
-
|
|
275
|
-
| Prop | 类型 | 说明 |
|
|
276
|
-
|------|------|------|
|
|
277
|
-
| `ujt` | `any` | 需要 `$fn.apisys.apiPost`、`$global.sys.syspath.updir`、`$fn.As.getName` |
|
|
278
|
-
| `asaidata` | `any` | `rule?.[formkey]?.accept` |
|
|
279
|
-
| `formdata` | `any` | — |
|
|
280
|
-
| `formkey` | `any` | — |
|
|
281
|
-
|
|
282
|
-
上传 URL: `/api/asaifile/manage/upbase64/`,图片通过 `AsaiUploadImgCutPop` 弹窗进行裁剪。
|
|
283
|
-
|
|
284
|
-
#### AsaiUploadImgCutPop
|
|
285
|
-
|
|
286
|
-
**裁剪弹窗包装器** — 监听 `$global.pop['popupload' + formkey].stat` 控制弹窗显示。
|
|
287
|
-
|
|
288
|
-
| Prop | 类型 | 说明 |
|
|
289
|
-
|------|------|------|
|
|
290
|
-
| `ujt` | `any` | — |
|
|
291
|
-
| `formkey` | `any` | 与 `AsaiUploadImg` 相同的 formkey |
|
|
292
|
-
|
|
293
|
-
内部渲染 `PopBox` + `AsaiUploadImgCut`。
|
|
294
|
-
|
|
295
|
-
#### AsaiUploadImgCut
|
|
296
|
-
|
|
297
|
-
**图片裁剪组件** — 支持拖拽移动裁剪框、四角调整大小。
|
|
298
|
-
|
|
299
|
-
| Prop | 类型 | 说明 |
|
|
300
|
-
|------|------|------|
|
|
301
|
-
| `ujt` | `any` | — |
|
|
302
|
-
| `params` | `any` | `{ base64Data, asaidata, formdata, formkey, fn, min }` |
|
|
303
|
-
|
|
304
|
-
- `params.base64Data` — 图片 base64
|
|
305
|
-
- `params.fn` — 裁剪完成后的回调函数
|
|
306
|
-
- `params.min` — 裁剪框最小尺寸(默认1)
|
|
307
|
-
- `params.asaidata.rule[formkey].data` — 可选,最终输出图片的最大尺寸限制 `{ width, height }`
|
|
308
|
-
|
|
309
|
-
#### AsaiUpBinary
|
|
310
|
-
|
|
311
|
-
**二进制直传上传** — 与 `AsaiUpload` 类似,上传后直接设置值。
|
|
312
|
-
|
|
313
|
-
| Prop | 类型 | 说明 |
|
|
314
|
-
|------|------|------|
|
|
315
|
-
| `ujt` | `any` | — |
|
|
316
|
-
| `asaidata` | `any` | `rule?.[formkey]?.accept` |
|
|
317
|
-
| `formdata` | `any` | — |
|
|
318
|
-
| `formkey` | `any` | — |
|
|
319
|
-
|
|
320
|
-
### 五、基础组件(formbase)
|
|
321
|
-
|
|
322
|
-
基础组件是底层原子组件,统一 Props 约定:
|
|
323
|
-
|
|
324
|
-
| Prop | 类型 | 说明 |
|
|
325
|
-
|------|------|------|
|
|
326
|
-
| `ujt` | `any` | 工具对象 |
|
|
327
|
-
| `opt` | `any` | 配置选项(详见各组件说明) |
|
|
328
|
-
| `modelValue` | `any` | v-model 绑定值 |
|
|
329
|
-
|
|
330
|
-
#### AsfInput — 基础输入框
|
|
331
|
-
|
|
332
|
-
| opt 参数 | 类型 | 说明 |
|
|
333
|
-
|----------|------|------|
|
|
334
|
-
| `type` | `string` | `'text'` / `'number'` |
|
|
335
|
-
| `max` / `min` | `number` | 数字范围 |
|
|
336
|
-
| `maxlength` | `number` | 文本最大长度 |
|
|
337
|
-
| `step` | `number` | 步进 |
|
|
338
|
-
| `height` | `string` | 高度(CSS) |
|
|
339
|
-
| `placeholder` | `string` | 占位提示 |
|
|
340
|
-
| `readonly` | `boolean` | 只读 |
|
|
341
|
-
| `noedit` | `boolean` | 只读模式(光标禁用) |
|
|
342
|
-
| `unit` | `string` | 单位后缀 |
|
|
343
|
-
| `style` | `object` | 样式 |
|
|
344
|
-
| `attr` | `object` | 原生 HTML 属性 |
|
|
345
|
-
| `onChange` | `function` | 值变化回调 `(newVal, oldVal) => void` |
|
|
346
|
-
|
|
347
|
-
#### AsfInputSn — 验证码/序列号分段输入
|
|
348
|
-
|
|
349
|
-
| opt 参数 | 类型 | 说明 |
|
|
350
|
-
|----------|------|------|
|
|
351
|
-
| `snlen` | `number` | 总长度(默认 8) |
|
|
352
|
-
| `snge` | `number` | 分组间隔(每隔几个插入分隔符) |
|
|
353
|
-
| `snger` | `number` | 分组例外规则 |
|
|
354
|
-
|
|
355
|
-
每个字符一个输入框,自动聚焦下一个,支持粘贴。
|
|
356
|
-
|
|
357
|
-
#### AsfSelect — 下拉选择器
|
|
358
|
-
|
|
359
|
-
| opt 参数 | 类型 | 说明 |
|
|
360
|
-
|----------|------|------|
|
|
361
|
-
| `selectdata` | `array/object/Map` | 选项数据,支持多种格式(见下方) |
|
|
362
|
-
| `input` | `boolean` | 可搜索 |
|
|
363
|
-
| `type` | `string` | `'number'` / `'text'` |
|
|
364
|
-
| `height` | `string` | 高度 |
|
|
365
|
-
| `up` | `number` | 展开方向(0=下, 1=上) |
|
|
366
|
-
| `checkin` | `boolean` | 自动选择第一个 |
|
|
367
|
-
| `style` | `object` | 样式 |
|
|
368
|
-
| `stylelist` | `object` | 列表样式 |
|
|
369
|
-
| `unit` | `string` | 单位后缀 |
|
|
370
|
-
| `onChange` | `function` | 值变化回调 |
|
|
371
|
-
|
|
372
|
-
**selectdata 支持格式:**
|
|
373
|
-
|
|
374
|
-
```ts
|
|
375
|
-
// 1. 二维数组 [[value, label, depth?], ...]
|
|
376
|
-
[['a', '选项A'], ['b', '选项B']]
|
|
377
|
-
|
|
378
|
-
// 2. 对象 { value: label, ... }
|
|
379
|
-
{ a: '选项A', b: '选项B' }
|
|
380
|
-
|
|
381
|
-
// 3. 树形 Map(带层级)
|
|
382
|
-
{ nodeMap: Map, depthMap: Map }
|
|
383
|
-
|
|
384
|
-
// 4. 对象数组 [{ value, label, depth }, ...]
|
|
385
|
-
[{ value: 'a', label: '选项A' }]
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
#### AsfCheck — 开关切换
|
|
389
|
-
|
|
390
|
-
| opt 参数 | 类型 | 说明 |
|
|
391
|
-
|----------|------|------|
|
|
392
|
-
| `selectdata` | `array` | 自定义开关文本,默认 `[[false, 'off'], [true, 'on']]` |
|
|
393
|
-
| `height` | `string` | 高度 |
|
|
394
|
-
| `style` | `object` | 样式 |
|
|
395
|
-
| `onChange` | `function` | 值变化回调 |
|
|
396
|
-
|
|
397
|
-
点击在 `selectdata[0][0]` 和 `selectdata[1][0]` 之间切换。
|
|
398
|
-
|
|
399
|
-
#### AsfTick — 勾选框(多选)
|
|
400
|
-
|
|
401
|
-
| opt 参数 | 类型 | 说明 |
|
|
402
|
-
|----------|------|------|
|
|
403
|
-
| `value` | `any` | 该勾选框代表的值 |
|
|
404
|
-
| `height` | `string` | 高度 |
|
|
405
|
-
| `style` | `object` | 样式 |
|
|
406
|
-
| `onChange` | `function` | 值变化回调 |
|
|
407
|
-
|
|
408
|
-
存入数组,选中/取消切换。
|
|
409
|
-
|
|
410
|
-
#### AsfTextarea — 多行文本框
|
|
411
|
-
|
|
412
|
-
| opt 参数 | 类型 | 说明 |
|
|
413
|
-
|----------|------|------|
|
|
414
|
-
| `height` | `string` | 高度 |
|
|
415
|
-
| `placeholder` | `string` | 占位提示 |
|
|
416
|
-
| `readonly` | `boolean` | 只读 |
|
|
417
|
-
| `style` | `object` | 样式 |
|
|
418
|
-
| `attr` | `object` | 原生 HTML 属性 |
|
|
419
|
-
| `onChange` | `function` | 值变化回调 |
|
|
420
|
-
|
|
421
|
-
#### AsfUploadFile — 文件上传
|
|
422
|
-
|
|
423
|
-
| opt 参数 | 类型 | 说明 |
|
|
424
|
-
|----------|------|------|
|
|
425
|
-
| `accept` | `string` | 文件类型过滤,如 `'image/*'` |
|
|
426
|
-
| `path` | `string` | 上传路径(默认 `'uploadtmp'`) |
|
|
427
|
-
| `height` | `string` | 高度 |
|
|
428
|
-
| `css` | `string` | 自定义容器类名 |
|
|
429
|
-
| `attr` | `object` | 原生 HTML 属性 |
|
|
430
|
-
| `onChange` | `function` | 值变化回调 |
|
|
431
|
-
|
|
432
|
-
支持 slot `#default="{ option }"` 暴露 `clickUpload` 方法自定义触发按钮。
|
|
433
|
-
|
|
434
|
-
#### AsfUploadText — 文本文件上传
|
|
435
|
-
|
|
436
|
-
与 `AsfUploadFile` 类似,但将文件内容读取为文本。额外支持:
|
|
437
|
-
|
|
438
|
-
| opt 参数 | 类型 | 说明 |
|
|
439
|
-
|----------|------|------|
|
|
440
|
-
| `type` | `string` | `'json'` — 自动做 JSON 序列化/反序列化 |
|
|
441
|
-
|
|
442
|
-
## rule 字段规则配置参考
|
|
443
|
-
|
|
444
|
-
| 键 | 类型 | 说明 | 适用组件 |
|
|
445
|
-
|---|------|------|----------|
|
|
446
|
-
| `type` | `string` | 输入类型:`text`, `number`, `checkbox` | All |
|
|
447
|
-
| `max` / `min` | `number` | 数字输入范围 | AsaiInput, AsfInput |
|
|
448
|
-
| `maxlength` | `number` | 文本最大长度 | AsaiInput, AsfInput |
|
|
449
|
-
| `require` | `boolean` | 标签后显示红色 `*` | AsaiFormLabel |
|
|
450
|
-
| `noedit` | `number` | 编辑模式:`2`=只读, `1`=隐藏 | AsaiFormLi |
|
|
451
|
-
| `noadd` | `number` | 新增模式:`2`=只读, `1`=隐藏 | AsaiFormLi |
|
|
452
|
-
| `placeholder` | `string` | 占位提示 | All 输入组件 |
|
|
453
|
-
| `data` | `array/object/Map` | 下拉选项数据 | AsaiSelect, AsaiSelectLv, AsaiSelectCl, AsfSelect |
|
|
454
|
-
| `accept` | `string` | 上传文件类型过滤 | AsaiUpload, AsaiUploadImg, AsaiUpBinary, AsfUploadFile |
|
|
455
|
-
| `editorty` | `number` | 富文本初始视图(0=编辑,1=源码,2=分屏) | AsaiRichEditor |
|
|
456
|
-
| `filename` | `string` | 上传文件自定义保存名 | AsaiUpload |
|
|
457
|
-
| `class` / `style` | `string/object` | 标签样式 | AsaiFormLabel, AsaiFormLabelArea |
|
|
458
|
-
| `nolabel` | `boolean` | 隐藏标签/使用 div | AsaiFormLabelArea |
|
|
459
|
-
| `opt` | `object` | 透传到基础组件的额外配置 | All |
|
|
460
|
-
| `comp` | `string` | 指定自定义组件名 | AsaiFormLi |
|
|
461
|
-
| `onChange` | `function` | 值变化回调 | 基础组件 |
|
|
462
|
-
|
|
463
|
-
## 动态组件映射
|
|
464
|
-
|
|
465
|
-
`AsaiForm` 会自动扫描目录下的 `.vue` 文件注册到 `asaidata.comp`。你可以通过 `asaidata.comp` 手动注册或覆盖:
|
|
466
|
-
|
|
467
|
-
```ts
|
|
468
|
-
asaidata.comp = {
|
|
469
|
-
myCustomField: MyCustomComponent, // 自定义组件,通过 rule[formkey].comp 引用
|
|
470
|
-
select: AsaiSelect, // 覆盖默认 select 处理
|
|
471
|
-
};
|
|
472
|
-
```
|
|
473
|
-
|
|
474
|
-
组件查找优先级:`rule[formkey].comp` → `comp[key]` → `comp['object']`(对象类型时)→ `AsaiInput`(兜底)。
|
|
475
|
-
|
|
476
|
-
## 完整示例
|
|
477
|
-
|
|
478
|
-
```vue
|
|
479
|
-
<template>
|
|
480
|
-
<AsaiForm :ujt="ujt" :asaidata="cfg" :opt="{ isedit: 1 }" />
|
|
481
|
-
</template>
|
|
482
|
-
|
|
483
|
-
<script setup lang="ts">
|
|
484
|
-
const ujt = { $fn, $global, $model }; // 系统注入
|
|
485
|
-
|
|
486
|
-
const cfg = {
|
|
487
|
-
eq: 0, // 格式模式: 0=无格式, 1=带冒号, 2=JSON紧凑, 3=JSON带引号
|
|
488
|
-
ic: 1, // 缩进层级
|
|
489
|
-
|
|
490
|
-
data: {
|
|
491
|
-
project: '工业控制系统',
|
|
492
|
-
version: 2.0,
|
|
493
|
-
enabled: true,
|
|
494
|
-
tags: ['PLC', 'SCADA'],
|
|
495
|
-
config: { timeout: 5000, retry: 3 },
|
|
496
|
-
description: '',
|
|
497
|
-
},
|
|
498
|
-
|
|
499
|
-
rule: {
|
|
500
|
-
project: { type: 'text', maxlength: 50, require: true },
|
|
501
|
-
version: { type: 'number', min: 0, step: 0.1 },
|
|
502
|
-
enabled: { type: 'checkbox' },
|
|
503
|
-
tags: {
|
|
504
|
-
type: 'select',
|
|
505
|
-
data: [['PLC', 'PLC控制'], ['SCADA', '监控系统'], ['HMI', '人机界面']],
|
|
506
|
-
opt: { input: true }, // 可搜索
|
|
507
|
-
},
|
|
508
|
-
description: {
|
|
509
|
-
type: 'textarea',
|
|
510
|
-
placeholder: '请输入项目描述',
|
|
511
|
-
},
|
|
512
|
-
// config 是对象类型,自动递归渲染
|
|
513
|
-
},
|
|
514
|
-
|
|
515
|
-
lang: {
|
|
516
|
-
project: '项目名称',
|
|
517
|
-
version: '版本号',
|
|
518
|
-
enabled: '启用',
|
|
519
|
-
tags: '标签',
|
|
520
|
-
config: '配置',
|
|
521
|
-
timeout: '超时(ms)',
|
|
522
|
-
retry: '重试次数',
|
|
523
|
-
description: '描述',
|
|
524
|
-
},
|
|
525
|
-
};
|
|
526
|
-
</script>
|
|
527
|
-
```
|