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 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` | `data` |
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` | `data` |
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;
@@ -4,6 +4,7 @@ type __VLS_Props = {
4
4
  uploadUrl?: string;
5
5
  downloadUrl?: string;
6
6
  uploadParse?: string;
7
+ fileHeaders?: Record<string, string>;
7
8
  };
8
9
  declare function importLayout(json: any): void;
9
10
  declare const _default: import('vue').DefineComponent<__VLS_Props, {
@@ -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>>;