devject-design 0.2.3 → 0.3.0
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/README.md +33 -2
- package/dist/devject/devject-design/src/core/builtin/utils.d.ts +4 -0
- package/dist/devject/devject-design/src/pages/FormDesigner.d.ts +1 -0
- package/dist/devject/devject-design/src/ui/PreviewDialog.d.ts +2 -0
- package/dist/devject/devject-design/src/ui/preview/FormRenderer.d.ts +1 -0
- package/dist/devject/devject-design/src/ui/state/designerState.d.ts +2 -29
- package/dist/devject/devject-design/src/ui/state/injectionKeys.d.ts +1 -0
- package/dist/index.es.js +3519 -8165
- package/dist/index.umd.js +13 -13
- package/dist/style.css +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ Devject Design 是一个基于 Vue 3 和 Element Plus 的可视化表单设计
|
|
|
10
10
|
- 🎨 **Element Plus 风格**:与 Element Plus UI 完美融合。
|
|
11
11
|
- 🧩 **可视化设计器**:支持拖拽、属性配置、实时预览。
|
|
12
12
|
- 📝 **表单渲染器**:根据 JSON 结构自动渲染表单,支持数据双向绑定与校验。
|
|
13
|
+
- 👁️ **节点可见/只读**:所有内置组件支持“可见”控制,输入类组件支持“只读”控制。
|
|
13
14
|
- 📤 **导入/导出**:支持 JSON 格式的布局与数据导入导出。
|
|
14
15
|
- 📊 **高级组件**:
|
|
15
16
|
- **静态表格 (StaticTable)**:支持 Excel 导入(自动识别表头、清空旧数据)与导出。
|
|
@@ -52,6 +53,7 @@ npm install xlsx
|
|
|
52
53
|
| `upload-url` | 文件上传接口地址 | `string` | - |
|
|
53
54
|
| `download-url` | 文件下载/访问基础路径 | `string` | - |
|
|
54
55
|
| `upload-parse` | 上传响应解析路径,支持 `$`、`$.data.url` 这类写法 | `string` | `$` |
|
|
56
|
+
| `file-headers` | 文件上传与下载时透传的请求头(如 `Authorization`) | `Record<string, string>` | - |
|
|
55
57
|
|
|
56
58
|
### 示例
|
|
57
59
|
|
|
@@ -70,18 +72,30 @@ VITE_DEVJECT_UPLOAD_PARSE=$.data.url
|
|
|
70
72
|
:upload-url="uploadUrl"
|
|
71
73
|
:download-url="downloadUrl"
|
|
72
74
|
:upload-parse="uploadParse"
|
|
75
|
+
:file-headers="fileHeaders"
|
|
73
76
|
/>
|
|
74
77
|
</template>
|
|
75
78
|
|
|
76
79
|
<script setup lang="ts">
|
|
77
80
|
import { FormDesigner } from 'devject-design'
|
|
81
|
+
import { getToken } from '@/utils/common'
|
|
78
82
|
|
|
79
83
|
const uploadUrl = import.meta.env.VITE_DEVJECT_UPLOAD_URL
|
|
80
84
|
const downloadUrl = import.meta.env.VITE_DEVJECT_DOWNLOAD_URL
|
|
81
85
|
const uploadParse = import.meta.env.VITE_DEVJECT_UPLOAD_PARSE || '$'
|
|
86
|
+
const token = getToken()
|
|
87
|
+
const fileHeaders = token ? { Authorization: token.startsWith('Bearer ') ? token : `Bearer ${token}` } : {}
|
|
82
88
|
</script>
|
|
83
89
|
```
|
|
84
90
|
|
|
91
|
+
### 上传/下载鉴权
|
|
92
|
+
|
|
93
|
+
当你的文件接口启用了登录校验时,请通过 `file-headers` 透传认证头。
|
|
94
|
+
`file-headers` 会同时作用于:
|
|
95
|
+
|
|
96
|
+
- 文件上传组件(`/upload` 请求)
|
|
97
|
+
- 文件下载/图片预览(`/download` 请求)
|
|
98
|
+
|
|
85
99
|
## 🚀 快速开始
|
|
86
100
|
|
|
87
101
|
### 全局注册
|
|
@@ -124,6 +138,7 @@ FormDesigner 支持通过 `v-model` 双向绑定布局数据,并提供了导
|
|
|
124
138
|
:upload-url="uploadUrl"
|
|
125
139
|
:download-url="downloadUrl"
|
|
126
140
|
:upload-parse="uploadParse"
|
|
141
|
+
:file-headers="fileHeaders"
|
|
127
142
|
/>
|
|
128
143
|
</div>
|
|
129
144
|
</template>
|
|
@@ -132,10 +147,13 @@ FormDesigner 支持通过 `v-model` 双向绑定布局数据,并提供了导
|
|
|
132
147
|
import { ref } from 'vue'
|
|
133
148
|
import { FormDesigner } from 'devject-design'
|
|
134
149
|
import type { LayoutSchema } from 'devject-design'
|
|
150
|
+
import { getToken } from '@/utils/common'
|
|
135
151
|
|
|
136
152
|
const uploadUrl = import.meta.env.VITE_DEVJECT_UPLOAD_URL
|
|
137
153
|
const downloadUrl = import.meta.env.VITE_DEVJECT_DOWNLOAD_URL
|
|
138
154
|
const uploadParse = import.meta.env.VITE_DEVJECT_UPLOAD_PARSE || '$'
|
|
155
|
+
const token = getToken()
|
|
156
|
+
const fileHeaders = token ? { Authorization: token.startsWith('Bearer ') ? token : `Bearer ${token}` } : {}
|
|
139
157
|
|
|
140
158
|
// 双向绑定布局数据
|
|
141
159
|
const layoutSchema = ref<LayoutSchema>()
|
|
@@ -179,6 +197,7 @@ FormRenderer 支持通过 `v-model` 绑定表单数据,并提供了数据导
|
|
|
179
197
|
:upload-url="uploadUrl"
|
|
180
198
|
:download-url="downloadUrl"
|
|
181
199
|
:upload-parse="uploadParse"
|
|
200
|
+
:file-headers="fileHeaders"
|
|
182
201
|
/>
|
|
183
202
|
</div>
|
|
184
203
|
</template>
|
|
@@ -187,10 +206,13 @@ FormRenderer 支持通过 `v-model` 绑定表单数据,并提供了数据导
|
|
|
187
206
|
import { ref } from 'vue'
|
|
188
207
|
import { FormRenderer } from 'devject-design'
|
|
189
208
|
import type { LayoutSchema, FormDataModel } from 'devject-design'
|
|
209
|
+
import { getToken } from '@/utils/common'
|
|
190
210
|
|
|
191
211
|
const uploadUrl = import.meta.env.VITE_DEVJECT_UPLOAD_URL
|
|
192
212
|
const downloadUrl = import.meta.env.VITE_DEVJECT_DOWNLOAD_URL
|
|
193
213
|
const uploadParse = import.meta.env.VITE_DEVJECT_UPLOAD_PARSE || '$'
|
|
214
|
+
const token = getToken()
|
|
215
|
+
const fileHeaders = token ? { Authorization: token.startsWith('Bearer ') ? token : `Bearer ${token}` } : {}
|
|
194
216
|
|
|
195
217
|
const rendererRef = ref()
|
|
196
218
|
// 表单结构定义
|
|
@@ -260,7 +282,8 @@ const setFormData = () => {
|
|
|
260
282
|
| `modelValue` | 表单布局结构绑定 (v-model) | `LayoutSchema` | - |
|
|
261
283
|
| `upload-url` | 文件上传接口地址 | `string` | - |
|
|
262
284
|
| `download-url` | 文件下载/访问基础路径 | `string` | - |
|
|
263
|
-
| `upload-parse` | 上传响应解析路径 | `string` |
|
|
285
|
+
| `upload-parse` | 上传响应解析路径 | `string` | `$` |
|
|
286
|
+
| `file-headers` | 文件上传/下载透传请求头 | `Record<string, string>` | - |
|
|
264
287
|
|
|
265
288
|
#### Exposed Methods
|
|
266
289
|
|
|
@@ -281,7 +304,8 @@ const setFormData = () => {
|
|
|
281
304
|
| `modelValue` | **(必填)** 表单数据绑定 (v-model) | `FormDataModel` | `{}` |
|
|
282
305
|
| `upload-url` | 文件上传接口地址 | `string` | - |
|
|
283
306
|
| `download-url` | 文件下载/访问基础路径 | `string` | - |
|
|
284
|
-
| `upload-parse` | 上传响应解析路径 | `string` |
|
|
307
|
+
| `upload-parse` | 上传响应解析路径 | `string` | `$` |
|
|
308
|
+
| `file-headers` | 文件上传/下载透传请求头 | `Record<string, string>` | - |
|
|
285
309
|
|
|
286
310
|
#### Exposed Methods
|
|
287
311
|
|
|
@@ -478,6 +502,13 @@ registerComponent({
|
|
|
478
502
|
- **手动触发**:通过 `FormRenderer` 的 `validate()` 方法。
|
|
479
503
|
- **导出时触发**:调用 `exportData()` 时默认会自动校验,校验失败则抛出异常。
|
|
480
504
|
|
|
505
|
+
### 4. 可见与只读
|
|
506
|
+
|
|
507
|
+
- 所有内置组件都支持 `visible` 属性;当值为 `false` 时,节点会在 `FormRenderer` 预览态中隐藏。
|
|
508
|
+
- 设计器画布不会因为 `visible=false` 而隐藏节点,方便继续选中和编辑。
|
|
509
|
+
- 输入类组件额外支持 `readonly` 属性,用于将单个组件设为只读。
|
|
510
|
+
- `FormRenderer` 顶层 `readonly` 仍然保留,适合整张表单统一只读;节点级 `readonly` 适合精细控制单个组件。
|
|
511
|
+
|
|
481
512
|
|
|
482
513
|
## 📄 许可证
|
|
483
514
|
|
|
@@ -2,8 +2,12 @@ import { Ref } from 'vue';
|
|
|
2
2
|
import { FormItemRule } from 'element-plus';
|
|
3
3
|
import { PropConfigItem } from '../../../../../devject-design/devject-design/src/core/registry';
|
|
4
4
|
import { SchemaNode, FormDataModel } from '../../../../../devject-design/devject-design/src/ui/state/types';
|
|
5
|
+
export declare function commonVisibilityConfig(): PropConfigItem[];
|
|
6
|
+
export declare function commonContainerTitleConfig(): PropConfigItem[];
|
|
5
7
|
export declare function commonFieldConfig(includePlaceholder?: boolean): PropConfigItem[];
|
|
6
8
|
export declare const commonDefault: (label: string, fieldPrefix: string) => {
|
|
9
|
+
visible: boolean;
|
|
10
|
+
readonly: boolean;
|
|
7
11
|
label: string;
|
|
8
12
|
field: string;
|
|
9
13
|
placeholder: string;
|
|
@@ -15,6 +15,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
15
15
|
uploadUrl?: string;
|
|
16
16
|
downloadUrl?: string;
|
|
17
17
|
uploadParse?: string;
|
|
18
|
+
fileHeaders?: Record<string, string>;
|
|
18
19
|
}> & Readonly<{
|
|
19
20
|
"onUpdate:modelValue"?: ((v: FormDataModel) => any) | undefined;
|
|
20
21
|
}>, {
|
|
@@ -39,6 +40,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {
|
|
|
39
40
|
uploadUrl?: string;
|
|
40
41
|
downloadUrl?: string;
|
|
41
42
|
uploadParse?: string;
|
|
43
|
+
fileHeaders?: Record<string, string>;
|
|
42
44
|
}> & Readonly<{
|
|
43
45
|
"onUpdate:modelValue"?: ((v: FormDataModel) => any) | undefined;
|
|
44
46
|
}>, {
|
|
@@ -6,6 +6,7 @@ type __VLS_Props = {
|
|
|
6
6
|
uploadUrl?: string;
|
|
7
7
|
downloadUrl?: string;
|
|
8
8
|
uploadParse?: string;
|
|
9
|
+
fileHeaders?: Record<string, string>;
|
|
9
10
|
};
|
|
10
11
|
declare function importData(data: FormDataModel): void;
|
|
11
12
|
declare function exportData(validateBeforeExport?: boolean): Promise<FormDataModel>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FormDataModel } from '../../../../../devject-design/devject-design/src/ui/state/types';
|
|
1
|
+
import { FormDataModel, LayoutSchema } from '../../../../../devject-design/devject-design/src/ui/state/types';
|
|
2
2
|
declare function undo(): void;
|
|
3
3
|
declare function redo(): void;
|
|
4
4
|
declare function applySchema(input: unknown): void;
|
|
@@ -27,34 +27,7 @@ declare function setFormData(next: FormDataModel): void;
|
|
|
27
27
|
declare function exportFormData(): FormDataModel;
|
|
28
28
|
declare function importFormData(next: unknown): void;
|
|
29
29
|
export declare function useDesignerState(): {
|
|
30
|
-
schema: import('vue').ComputedRef<
|
|
31
|
-
version: 1;
|
|
32
|
-
root: {
|
|
33
|
-
children: {
|
|
34
|
-
id: string;
|
|
35
|
-
type: string;
|
|
36
|
-
props: Record<string, any>;
|
|
37
|
-
children?: /*elided*/ any[] | undefined;
|
|
38
|
-
columns?: {
|
|
39
|
-
id: string;
|
|
40
|
-
width?: number | undefined;
|
|
41
|
-
widthType?: "fr" | "px" | undefined;
|
|
42
|
-
children: /*elided*/ any[];
|
|
43
|
-
}[] | undefined;
|
|
44
|
-
items?: {
|
|
45
|
-
id: string;
|
|
46
|
-
title: string;
|
|
47
|
-
name: string;
|
|
48
|
-
children: /*elided*/ any[];
|
|
49
|
-
}[] | undefined;
|
|
50
|
-
tabs?: {
|
|
51
|
-
id: string;
|
|
52
|
-
label: string;
|
|
53
|
-
children: /*elided*/ any[];
|
|
54
|
-
}[] | undefined;
|
|
55
|
-
}[];
|
|
56
|
-
};
|
|
57
|
-
}>;
|
|
30
|
+
schema: import('vue').ComputedRef<LayoutSchema>;
|
|
58
31
|
selection: {
|
|
59
32
|
selectedNodeId: import('vue').Ref<string | null, string | null>;
|
|
60
33
|
};
|
|
@@ -2,3 +2,4 @@ import { InjectionKey, Ref } from 'vue';
|
|
|
2
2
|
export declare const UPLOAD_URL_KEY: InjectionKey<Ref<string | undefined>>;
|
|
3
3
|
export declare const DOWNLOAD_URL_KEY: InjectionKey<Ref<string | undefined>>;
|
|
4
4
|
export declare const UPLOAD_PARSE_KEY: InjectionKey<Ref<string | undefined>>;
|
|
5
|
+
export declare const FILE_HEADERS_KEY: InjectionKey<Ref<Record<string, string> | undefined>>;
|