@utogether/udp-core 1.0.1-beta.15 → 1.0.1-beta.17

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.
Files changed (126) hide show
  1. package/build/plugins.ts +39 -39
  2. package/dist/{403-DpJevH-h.js → 403-C3cfjZIT.js} +1 -1
  3. package/dist/{404-BpqJK3YD.js → 404-Bg3j7QIo.js} +1 -1
  4. package/dist/{500-DyvRbMD_.js → 500-CMT7Zyy7.js} +1 -1
  5. package/dist/{AuthorityInfo-Cyu4XHXx.js → AuthorityInfo-B1mvqs4x.js} +1 -1
  6. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-BxmnEEFq.js → AuthorityInfo.vue_vue_type_style_index_0_lang-DwoW7QWO.js} +3 -3
  7. package/dist/{Company-BLygcYrI.js → Company-qTguidK8.js} +3 -3
  8. package/dist/{CompanyPanel-D5Tgw6LF.js → CompanyPanel-BBC-o-k3.js} +17 -17
  9. package/dist/{Department-qI9OninZ.js → Department-C3mKZOnK.js} +3 -3
  10. package/dist/{DepartmentPanel-P-P8fPZQ.js → DepartmentPanel-CNdpOHBT.js} +25 -25
  11. package/dist/{DesignPanel-BxjD0AZi.js → DesignPanel-D9jrRCoG.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-DN_OKxCu.js → DesignPanel.vue_vue_type_style_index_0_lang-A-Aj1Hl0.js} +6 -6
  13. package/dist/{DictView-PWL_Vf0T.js → DictView-CgdVkSiP.js} +15 -16
  14. package/dist/{InvOrganization-JXBXyn3G.js → InvOrganization-RE7s3vBq.js} +1 -1
  15. package/dist/{Org-DcTJn6YQ.js → Org-wXDGvTrS.js} +3 -3
  16. package/dist/{Preview-IKvbHI8a.js → Preview-Pvt1__BV.js} +1 -1
  17. package/dist/{ReportDefine-_G7ts7Ch.js → ReportDefine-xEQsgFyv.js} +1 -1
  18. package/dist/{ReportDesign-7h5oFklh.js → ReportDesign-jOSuEFH9.js} +9 -9
  19. package/dist/{ReportQuery-dj0BQUyi.js → ReportQuery-DxEmmGiN.js} +1 -1
  20. package/dist/{ReportQueryFrom-6WaZPg9i.js → ReportQueryFrom-CFlxfS5M.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-ChhcBPqa.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-iHpiYz8f.js} +1 -1
  22. package/dist/{ReportTemplate-DIvJ3RrB.js → ReportTemplate-Dtz3aet7.js} +11 -11
  23. package/dist/{Role-ia_3qAZU.js → Role-B_NsHIyE.js} +3 -3
  24. package/dist/{RoleAssign-D0zVl4y3.js → RoleAssign-C9wm4zq4.js} +8 -8
  25. package/dist/{RolePanel-CQxOiAzj.js → RolePanel-BlHidBR0.js} +1 -1
  26. package/dist/{RolePanel-BiGGmP2w.js → RolePanel-DWM9mfNs.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-BYDLRS_x.js → RolePanel.vue_vue_type_script_setup_true_lang-Cn4RRzXm.js} +1 -1
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Dwv5LFbf.js → RolePanel.vue_vue_type_script_setup_true_lang-DVQ9aqb1.js} +9 -9
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-gPP4duO8.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCm-_i8O.js} +8 -8
  30. package/dist/{Staff-Bf_oUqF6.js → Staff-BfDc61QS.js} +3 -3
  31. package/dist/{StaffInfo-D5aisjx2.js → StaffInfo-BaJFo4mg.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-6PX7Bx6A.js → StaffInfo.vue_vue_type_script_setup_true_lang-Bwj4x1wu.js} +7 -7
  33. package/dist/{StaffPanel--zKzd4rt.js → StaffPanel-B6I2ZS6A.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-BWZSIFpq.js → StaffPanel.vue_vue_type_script_setup_true_lang-vbyS4w3V.js} +2 -2
  35. package/dist/{SysUser-BelbESLR.js → SysUser-B_r9LYc5.js} +2 -2
  36. package/dist/{SysUserPanel-BixKqQcA.js → SysUserPanel-C4ajcHPV.js} +1 -1
  37. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-BhaWZEfo.js → SysUserPanel.vue_vue_type_script_setup_true_lang-8Q0VvC9B.js} +41 -37
  38. package/dist/{SystemMenu-D40tzcSj.js → SystemMenu-CyPG23uP.js} +10 -10
  39. package/dist/{UserInfo-DTyk071j.js → UserInfo-BkoGt4ib.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-p9MByikC.js → UserInfo.vue_vue_type_style_index_0_lang-DrzF1YYG.js} +10 -10
  41. package/dist/{childView-so5qSxr0.js → childView-9vEO8ymO.js} +1 -1
  42. package/dist/{childView-xL3iE1yN.js → childView-Dh0NyiQe.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-CKcXpSqa.js → childView.vue_vue_type_style_index_0_lang-BOeoZuAK.js} +7 -7
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-DK1ei5uM.js → childView.vue_vue_type_style_index_0_lang-CMOjfXBX.js} +1 -1
  45. package/dist/{code-rule-DC35y76w.js → code-rule-C7jI_1gJ.js} +6 -6
  46. package/dist/core.es.js +17 -12
  47. package/dist/{cron-task-BhjQ4S68.js → cron-task-Dg9DJXvv.js} +11 -11
  48. package/dist/{frameView-G_zhG9pf.js → frameView-CeR-_hjB.js} +1 -1
  49. package/dist/{index-C6ehxLLO.js → index-Bb7gIEvu.js} +739 -496
  50. package/dist/{layoutView-CO2U8qCQ.js → layoutView-wsLHrEeX.js} +1347 -1346
  51. package/dist/login-CluzzdqH.js +249 -0
  52. package/dist/{lov-view-Cr929NMD.js → lov-view-BvQCvwbW.js} +5 -5
  53. package/dist/{menuInfo-BWuROp7u.js → menuInfo-B8RLelIC.js} +1 -1
  54. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-9nouHUjO.js → menuInfo.vue_vue_type_style_index_0_lang-DvkapEZr.js} +7 -7
  55. package/dist/{pda-app-CQP1sMAI.js → pda-app-D3LNmD9a.js} +19 -19
  56. package/dist/{resource-BDQLrMpK.js → resource-D8JA_03-.js} +7 -7
  57. package/dist/{su-welcome-CZysrZQ1.js → su-welcome-BjxeEKSo.js} +88 -88
  58. package/dist/{sys-config-BiGNMYSA.js → sys-config-sbeLk9bP.js} +6 -6
  59. package/dist/udp-core.css +1 -9
  60. package/dist/utogether-MlnyYtNS.js +4 -0
  61. package/index.ts +48 -40
  62. package/package.json +1 -1
  63. package/src/App.vue +65 -65
  64. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  65. package/src/components/SuScrollTree/ScrollPanel.vue +170 -175
  66. package/src/components/udp/{grid.vue → grid/index.vue} +27 -24
  67. package/src/components/udp/index.ts +2 -9
  68. package/src/components/udp/utils.ts +60 -107
  69. package/src/layout/components/lay-navbar/index.vue +239 -239
  70. package/src/layout/components/lay-panel/index.vue +150 -150
  71. package/src/layout/components/lay-search/index.vue +25 -25
  72. package/src/layout/components/lay-select-org/index.vue +64 -64
  73. package/src/layout/components/lay-sidebar/horizontal.vue +190 -190
  74. package/src/layout/components/lay-sidebar/mixNav.vue +260 -260
  75. package/src/layout/components/lay-sidebar/sidebar-logo.vue +92 -92
  76. package/src/layout/components/lay-tag/index.vue +20 -48
  77. package/src/layout/hooks/useNav.ts +173 -173
  78. package/src/layout/hooks/useTag.ts +223 -233
  79. package/src/layout/types.ts +3 -2
  80. package/src/main.ts +117 -113
  81. package/src/plugins/i18n/en.ts +302 -302
  82. package/src/plugins/i18n/zh.ts +356 -354
  83. package/src/plugins/vxe-table/index.ts +116 -53
  84. package/src/plugins/vxe-table/render.tsx +956 -956
  85. package/src/router/index.ts +186 -177
  86. package/src/router/modules/remaining.ts +58 -58
  87. package/src/router/utils.ts +393 -377
  88. package/src/store/modules/app.ts +1 -3
  89. package/src/store/modules/multiTags.ts +110 -109
  90. package/src/store/modules/permission.ts +113 -100
  91. package/src/style/button.scss +85 -85
  92. package/src/style/login.css +1 -1
  93. package/src/style/vxetable.scss +25 -2
  94. package/src/utils/index.ts +3 -1
  95. package/src/views/organization/company/CompanyPanel.vue +259 -259
  96. package/src/views/organization/department/DepartmentPanel.vue +269 -283
  97. package/src/views/system/menu/SystemMenu.vue +183 -183
  98. package/src/views/system/menu/menuInfo.vue +363 -363
  99. package/src/views/system/role/UserInfo.vue +195 -195
  100. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  101. package/src/views/system/role-assign/RolePanel.vue +139 -139
  102. package/src/views/system/sys/sys-config.vue +336 -336
  103. package/src/views/system/sysUser/SysUserPanel.vue +279 -278
  104. package/src/views/uapp/pda/pda-app.vue +208 -208
  105. package/src/views/udev/dict/DictView.vue +118 -118
  106. package/src/views/udev/dict/childView.vue +1 -1
  107. package/src/views/udev/lov/lov-view.vue +91 -91
  108. package/src/views/ulogin/login.vue +2 -2
  109. package/src/views/upms/interface/log-out.vue +101 -101
  110. package/src/views/urpt/design/DesignPanel.vue +507 -507
  111. package/types/global.d.ts +2 -8
  112. package/dist/login-DzyK2soP.js +0 -278
  113. package/dist/utogether-BRirriOz.js +0 -182
  114. package/src/components/udp/count-down.vue +0 -536
  115. package/src/components/udp/flip-down/FlipCard/flip-card.vue +0 -251
  116. package/src/components/udp/flip-down/FlipCard/interfaces.ts +0 -4
  117. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +0 -113
  118. package/src/components/udp/form-upload.vue +0 -482
  119. package/src/components/udp/form.vue +0 -112
  120. package/src/components/udp/lov.vue +0 -388
  121. package/src/components/udp/modal-form.vue +0 -190
  122. package/src/components/udp/modal-grid.vue +0 -298
  123. package/src/components/udp/upload.vue +0 -423
  124. package/src/utils/udp/http/index.ts +0 -294
  125. package/src/utils/udp/http/types.d.ts +0 -49
  126. package/src/utils/udp/useRender.ts +0 -431
@@ -1,482 +0,0 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2022-11-04 14:53:36
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-08-18 11:17:57
6
- * @Description: form upload
7
- -->
8
- <template>
9
- <div class="flex w-full flex-wrap">
10
- <div class="ut-upload-list flex flex-wrap items-center">
11
- <div v-for="(item, idx) in fileList" :key="item" :class="'ut-upload-item--' + size">
12
- <div class="ut-upload--image flex items-center justify-center">
13
- <img
14
- v-if="getItemType(item) === 'img'"
15
- :src="item.url"
16
- class="ut-image select-none"
17
- @click="onPreview(item)"
18
- />
19
- <div v-else-if="renderMode === 'item' || dataStatus !== 'detail'" class="ut-image-hover">
20
- <div class="ut-image-file--wrapper">
21
- <i :class="getItemType(item)" class="ut-image-file ut-image" style="line-height: 1" />
22
- <div class="px-1 ut-image" :style="{ fontSize: size === 'small' ? '11px' : '10px' }">
23
- {{ maskFilenameFromPath(item) }}
24
- </div>
25
- </div>
26
- <i
27
- class="vxe-icon-download ut-download-icon"
28
- :style="{ fontSize: renderMode === 'item' ? '60px' : '48px' }"
29
- @click="onDownload(item)"
30
- />
31
- </div>
32
- <vxe-tooltip v-else :content="item.name" class="cursor-pointer">
33
- <div class="ut-image-hover">
34
- <div class="ut-image-file--wrapper">
35
- <i :class="getItemType(item)" class="ut-image-file ut-image" style="font-size: 32px" />
36
- <div class="px-1 ut-image" :style="{ fontSize: size === 'small' ? '11px' : '10px' }">
37
- {{ maskFilenameFromPath(item) }}
38
- </div>
39
- </div>
40
- <i
41
- class="vxe-icon-download ut-download-icon"
42
- :style="{ fontSize: renderMode === 'item' ? '60px' : '48px' }"
43
- @click="onDownload(item)"
44
- />
45
- </div>
46
- </vxe-tooltip>
47
- </div>
48
- <div v-if="dataStatus !== 'detail'" class="ut-upload--image-item-btn-wrapper">
49
- <div class="ut-upload-remove--btn"><i class="vxe-icon-close" @click="onRemove(item, idx)" /></div>
50
- </div>
51
- </div>
52
- <div
53
- v-if="dataStatus !== 'detail'"
54
- :class="'ut-upload-item--' + size"
55
- class="ut-upload--btn"
56
- style="border: 1px dashed var(--vxe-ui-input-border-color)"
57
- @click="onStartUpload"
58
- >
59
- <div class="flex items-center justify-center h-full flex-col cursor-pointer ut-upload--btn">
60
- <span v-if="!loading" class="vxe-icon-add" style="font-size: 18px" />
61
- <div v-if="!loading" style="font-size: 11px; padding: 0 1px; text-align: center">点击上传</div>
62
- <vxe-icon v-if="loading" name="spinner" status="primary" roll style="font-size: 24px" />
63
- <div v-if="loading" style="font-size: 11px; padding: 0 1px; text-align: center">{{ progressText }}</div>
64
- </div>
65
- </div>
66
- </div>
67
- <vxe-upload
68
- ref="xupload"
69
- v-model="list"
70
- style="display: none"
71
- v-bind="$attrs"
72
- :limit-count="limitCount"
73
- :limit-size="limitSize"
74
- :size="size"
75
- :mode="mode"
76
- :single-mode="singleMode"
77
- :image-types="imageTypes"
78
- :auto-hidden-button="autoHiddenButton"
79
- :show-error-status="showErrorStatus"
80
- :remove-method="handleRemove"
81
- :upload-method="httpRequest"
82
- :multiple="multiple"
83
- :show-download-button="showDownloadButton"
84
- :show-list="false"
85
- show-progress
86
- @upload-success="onSuccess"
87
- />
88
- </div>
89
- </template>
90
-
91
- <script lang="ts">
92
- export default { name: 'FormUpload' };
93
- </script>
94
-
95
- <script setup lang="ts">
96
- import { ref, computed, onBeforeMount, getCurrentInstance } from 'vue';
97
- import { cookies } from '@utogether/utils';
98
- import compressorjs from 'compressorjs';
99
- import { isString, isArray } from 'xe-utils';
100
- import { VxeUI, VxeUploadPropTypes } from 'vxe-pc-ui';
101
- import axios from 'axios';
102
-
103
- export interface IProps {
104
- record: object;
105
- imageTypes?: Array<string>;
106
- field: string;
107
- dataStatus?: string;
108
- renderMode?: string;
109
- size?: VxeUploadPropTypes.Size;
110
- mode?: VxeUploadPropTypes.Mode;
111
- limitCount?: number;
112
- limitSize?: number;
113
- compassorSize?: number;
114
- quality?: number;
115
- singleMode?: boolean;
116
- autoHiddenButton?: boolean;
117
- showErrorStatus?: boolean;
118
- showDownloadButton?: boolean;
119
- multiple?: boolean;
120
- success?: Function;
121
- remove?: Function;
122
- }
123
- const props = withDefaults(defineProps<IProps>(), {
124
- record: () => {
125
- return {};
126
- },
127
- imageTypes: () => {
128
- return ['jpg', 'jpeg', 'png', 'gif'];
129
- },
130
- field: '',
131
- renderMode: 'item',
132
- dataStatus: '',
133
- size: 'mini',
134
- mode: '',
135
- singleMode: false,
136
- autoHiddenButton: false,
137
- showDownloadButton: false,
138
- multiple: false,
139
- limitSize: 30,
140
- limitCount: 9,
141
- quality: 0.6,
142
- compassorSize: 2
143
- });
144
-
145
- const instance = getCurrentInstance()!;
146
- const baseUrl = instance.appContext.config.globalProperties.$url;
147
- const serviceApi = instance.appContext.config.globalProperties.$serviceApi;
148
- const progressText = ref('');
149
- const loading = ref(false);
150
-
151
- const imgTypes = ['image/gif', 'image/jpeg', 'image/png'];
152
- const xupload = ref(null);
153
-
154
- const headers = computed(() => {
155
- const kTOKENKEY = 'authorized-token';
156
- const token = cookies.get(kTOKENKEY)!;
157
- const data = JSON.parse(token);
158
- const headers = {
159
- Authorization: 'Bearer ' + data.accessToken
160
- };
161
- return headers;
162
- });
163
- const list = [];
164
- const fileList = ref<any>([]);
165
-
166
- const httpRequest = options => {
167
- if (imgTypes.includes(options.file.type) && options.file.size > 1024 * 1024 * props.compassorSize) {
168
- return new Promise((resolve, reject) => {
169
- new compressorjs(options.file, {
170
- quality: props.quality,
171
- mimeType: options.file.type,
172
- success(result: File) {
173
- const file = new File([result], result.name, { type: result.type });
174
- uploadProcess(resolve, reject, file);
175
- console.log({ result, file });
176
- }
177
- });
178
- });
179
- } else {
180
- return new Promise((resolve, reject) => uploadProcess(resolve, reject, options.file));
181
- }
182
- };
183
-
184
- const uploadProcess = (resolve, reject, file) => {
185
- const formBody = new FormData();
186
- formBody.append('file', file);
187
- const url = baseUrl + '/ufil/file/uploadMultipart';
188
- loading.value = true;
189
- return axios
190
- .post(url, formBody, {
191
- headers: Object.assign({ 'Content-Type': 'multipart/form-data' }, headers.value),
192
- onUploadProgress(progressEvent) {
193
- const progress = Math.round((progressEvent.loaded * 100) / (progressEvent.total || 0));
194
- progressText.value = `进度${progress}%`;
195
- }
196
- })
197
- .then(async response => {
198
- progressText.value = `处理中...`;
199
- file.path = response.data.data;
200
- file.url = `${baseUrl}/ufil${file.path}`;
201
- fileList.value.push(file);
202
- console.log(file);
203
- loading.value = false;
204
- resolve(file);
205
- })
206
- .catch(() => {
207
- loading.value = false;
208
- reject(null);
209
- });
210
-
211
- return serviceApi
212
- .post('/ufil/file/uploadMultipart', formBody, { headers })
213
- .then(async data => {
214
- file.path = data;
215
- file.url = `${baseUrl}/ufil${file.path}`;
216
- fileList.value.push(file);
217
- console.log(file);
218
- resolve(file);
219
- })
220
- .catch(() => {
221
- reject(null);
222
- });
223
- };
224
-
225
- const onStartUpload = () => {
226
- xupload.value.choose();
227
- };
228
-
229
- const onSuccess = ({ data }) => {
230
- if (props.success) {
231
- return props.success(data);
232
- } else {
233
- const field = props.field;
234
- Object.assign(props.record, { [field]: data.path });
235
- }
236
- console.log(props.record, fileList);
237
- };
238
-
239
- const handleRemove: VxeUploadPropTypes.RemoveMethod = ({ option }) => {
240
- if (props.remove) {
241
- return props.remove(option, fileList);
242
- }
243
- emit('remove', option, fileList);
244
- };
245
-
246
- const onRemove = (file, idx) => {
247
- fileList.value.splice(idx, 1);
248
- emit('remove', file, fileList);
249
- };
250
-
251
- const onPreview = item => {
252
- // console.log(item.url);
253
- VxeUI.previewImage({ activeIndex: 0, urlList: [item.url] });
254
- };
255
-
256
- const getItemType = item => {
257
- const type = item.type || item.url.split('.').pop();
258
- let icon = '';
259
- switch (type) {
260
- case 'jpg':
261
- case 'png':
262
- case 'jpeg':
263
- case 'webp':
264
- case 'image/jpeg':
265
- case 'image/png':
266
- case 'image/gif':
267
- icon = 'img';
268
- break;
269
- case 'doc':
270
- case 'docx':
271
- icon = 'vxe-icon-file-word';
272
- break;
273
- case 'xlsx':
274
- case 'xls':
275
- icon = 'vxe-icon-file-excel';
276
- break;
277
- case 'pdf':
278
- icon = 'vxe-icon-file-pdf';
279
- break;
280
- case 'txt':
281
- icon = 'vxe-icon-file-txt';
282
- break;
283
- case 'ppt':
284
- icon = 'vxe-icon-file-ppt';
285
- break;
286
- case 'markdown':
287
- icon = 'vxe-icon-file-markdown';
288
- break;
289
- case 'apk':
290
- icon = 'ri-android-fill';
291
- break;
292
- case 'ipa':
293
- icon = 'ri-apple-line';
294
- break;
295
-
296
- default:
297
- icon = 'vxe-icon-file';
298
- break;
299
- }
300
- return icon;
301
- };
302
-
303
- const maskFilenameFromPath = file => {
304
- let total = props.size === 'small' ? 10 : 9;
305
- // 提取纯文件名(含扩展名)
306
- const extractFilename = file => {
307
- if (file.name) return file.name;
308
- const path = file.url;
309
- const separator = path.includes('\\') ? '\\' : '/';
310
- return path.split(separator).pop();
311
- };
312
-
313
- // 处理文件名脱敏
314
- const maskFilename = filename => {
315
- const dotPos = filename.lastIndexOf('.');
316
- const name = dotPos > 0 ? filename.substring(0, dotPos) : filename;
317
- const ext = dotPos > 0 ? filename.substring(dotPos) : '';
318
-
319
- if (name.length <= total) return filename;
320
-
321
- const prefix = props.renderMode === 'item' ? name.substring(0, total - 5) : '';
322
- const suffix = name.substring(name.length - (total - 6));
323
- return `${prefix}...${suffix}${ext}`;
324
- };
325
-
326
- return maskFilename(extractFilename(file));
327
- };
328
-
329
- const onDownload = file => {
330
- console.log(file);
331
- };
332
- const emit = defineEmits<{
333
- (e: 'remove', file: any, fileList: any): void;
334
- }>();
335
-
336
- onBeforeMount(() => {
337
- const fileUrl = props.record[props.field];
338
- fileList.value = [
339
- // { name: '深圳友聚信息技术开发文档.doc', url: `xxx.pdf`, _X_KEY: '1111e' },
340
- // { name: '深圳友聚信息技术开发文档.doc', url: `xxx.xlsx`, _X_KEY: '111122' },
341
- // {
342
- // name: '15806d21e3f445dcae0e2e0825c76a79.apk',
343
- // url: `${baseUrl}/ufil/resource/image/20250817/15806d21e3f445dcae0e2e0825c76a79.apk`
344
- // }
345
- ];
346
- if (fileUrl) {
347
- if (fileUrl && isString(fileUrl)) {
348
- const name = fileUrl.match(/[^\/\\]+$/)[0];
349
- const file = { name, url: `${baseUrl}/ufil${fileUrl}` };
350
- if (props.singleMode) {
351
- fileList.value = file;
352
- } else {
353
- fileList.value.push(file);
354
- }
355
- } else if (isArray(fileUrl)) {
356
- fileUrl.forEach(url => {
357
- const name = url.match(/[^\/\\]+$/)[0];
358
- fileList.value.push({ name, url: `${baseUrl}/ufil${url}` });
359
- });
360
- }
361
- }
362
- console.log('fileList');
363
- });
364
- </script>
365
-
366
- <style lang="scss">
367
- .ut-upload-item--small {
368
- position: relative;
369
- width: var(--vxe-ui-upload-image-wh-small);
370
- height: var(--vxe-ui-upload-image-wh-small);
371
-
372
- margin: var(--vxe-ui-layout-padding-half);
373
- border: 1px solid var(--vxe-ui-input-border-color);
374
- border-radius: var(--vxe-ui-base-border-radius);
375
- .ut-upload--image {
376
- position: relative;
377
- border-radius: var(--vxe-ui-base-border-radius);
378
- width: var(--vxe-ui-upload-image-wh-small);
379
- height: var(--vxe-ui-upload-image-wh-small);
380
- .ut-image-file--wrapper {
381
- display: flex;
382
- flex-direction: column;
383
- align-items: center;
384
- .ut-image-file {
385
- font-size: 48px;
386
- }
387
- }
388
- }
389
- }
390
-
391
- .ut-upload-item--mini {
392
- position: relative;
393
- width: var(--vxe-ui-upload-image-wh-mini);
394
- height: var(--vxe-ui-upload-image-wh-mini);
395
-
396
- margin: var(--vxe-ui-layout-padding-half);
397
- border: 1px solid var(--vxe-ui-input-border-color);
398
- border-radius: var(--vxe-ui-base-border-radius);
399
- .ut-upload--image {
400
- position: relative;
401
- border-radius: var(--vxe-ui-base-border-radius);
402
- width: var(--vxe-ui-upload-image-wh-mini);
403
- height: var(--vxe-ui-upload-image-wh-mini);
404
- .ut-image-file--wrapper {
405
- display: flex;
406
- flex-direction: column;
407
- align-items: center;
408
- .ut-image-file {
409
- font-size: 42px;
410
- }
411
- }
412
- }
413
- }
414
-
415
- .ut-upload-item--xs {
416
- position: relative;
417
- width: 48px;
418
- height: 48px;
419
-
420
- margin: var(--vxe-ui-layout-padding-half);
421
- border: 1px solid var(--vxe-ui-input-border-color);
422
- border-radius: var(--vxe-ui-base-border-radius);
423
- .ut-upload--image {
424
- position: relative;
425
- border-radius: var(--vxe-ui-base-border-radius);
426
- width: 48px;
427
- height: 48px;
428
- .ut-image-file--wrapper {
429
- display: flex;
430
- flex-direction: column;
431
- align-items: center;
432
- .ut-image-file {
433
- font-size: 32px;
434
- }
435
- }
436
- }
437
- }
438
-
439
- .ut-upload--btn:hover {
440
- border: 1px dashed var(--udp-theme-vxeColor);
441
- color: var(--udp-theme-vxeColor);
442
- }
443
-
444
- .ut-upload--image-item-btn-wrapper {
445
- display: inline-flex;
446
- justify-content: center;
447
- position: absolute;
448
- top: calc(var(--vxe-ui-layout-padding-half) * -1);
449
- right: calc(var(--vxe-ui-layout-padding-half) * -1);
450
- .ut-upload-remove--btn {
451
- display: flex;
452
- flex-direction: row;
453
- justify-content: center;
454
- align-items: center;
455
- width: 1.8em;
456
- height: 1.8em;
457
- font-size: 0.8em;
458
- border-radius: 50%;
459
- color: #fff;
460
- background-color: var(--vxe-ui-status-error-color);
461
- z-index: 3;
462
- cursor: pointer;
463
- }
464
- }
465
-
466
- .ut-image {
467
- height: 100%;
468
- border-radius: var(--vxe-ui-base-border-radius);
469
- }
470
-
471
- .ut-image-hover:hover > .ut-image-file--wrapper {
472
- display: none;
473
- }
474
-
475
- .ut-image-hover:hover > .ut-download-icon {
476
- display: block;
477
- }
478
- .ut-download-icon {
479
- display: none;
480
- cursor: pointer;
481
- }
482
- </style>
@@ -1,112 +0,0 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2022-03-02 17:07:59
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-09-10 15:35:12
6
- * @Description: SuForm
7
- -->
8
-
9
- <template>
10
- <div class="width: 100%">
11
- <vxe-form
12
- ref="xForm"
13
- :data="record"
14
- :items="formItems"
15
- :rules="rules"
16
- :loading="loading"
17
- :vertical="vertical"
18
- :title-width="titleWidth"
19
- :disabled="dataStatus === 'detail'"
20
- title-align="right"
21
- title-bold
22
- v-bind="$attrs"
23
- >
24
- <template #collapseNode>
25
- <div class="flex justify-start">
26
- <vxe-checkbox
27
- v-model="collapseStatus"
28
- content="查看更多"
29
- :checked-value="false"
30
- :unchecked-value="true"
31
- class="pl-10"
32
- @change="onChange"
33
- />
34
- </div>
35
- </template>
36
- </vxe-form>
37
- </div>
38
- </template>
39
-
40
- <script lang="ts">
41
- export default {
42
- name: 'UtForm'
43
- };
44
- </script>
45
- <script setup lang="ts">
46
- import { useI18n } from 'vue-i18n';
47
- import { ref, computed } from 'vue';
48
- // import { formatRules } from '@utogether/utils';
49
- import { formatItems, formatRules } from './utils';
50
- import { clone } from 'xe-utils';
51
- // import type { IRecord, IFormItemProps } from '../../types';
52
-
53
- export interface IProps {
54
- record: IRecord; // 数据对象
55
- items: Array<IFormItemProps>; // form item
56
- loading?: boolean;
57
- vertical?: boolean;
58
- titleWidth?: number;
59
- span?: number;
60
- dataStatus?: string;
61
- }
62
-
63
- const props = withDefaults(defineProps<IProps>(), {
64
- record: (): IRecord => {
65
- return {};
66
- },
67
- items: () => [],
68
- loading: false,
69
- vertical: false,
70
- titleWidth: 100,
71
- span: 6,
72
- dataStatus: 'detail'
73
- });
74
- const xForm = ref(undefined);
75
- const { t } = useI18n();
76
- const collapseStatus = ref(true);
77
- /**
78
- * @description: 根据items 获取必填选
79
- */
80
- const rules = computed(() => {
81
- if (!props.items.length) return {};
82
- return formatRules(props.items, t);
83
- });
84
-
85
- const formItems = computed(() => {
86
- if (!props.items.length) return props.items;
87
- return formatItems(clone(props.items, true), 'edit', t, 6);
88
- });
89
-
90
- const onChange = () => {
91
- xForm.value.toggleCollapse();
92
- };
93
-
94
- /**
95
- * @deprecated
96
- * @description 使用validate替换
97
- * @param cb
98
- */
99
- const validateForm = (cb: Function) => {
100
- (xForm as any).value.validate(cb);
101
- };
102
- const validate = (cb: Function) => {
103
- (xForm as any).value.validate(cb);
104
- setTimeout(() => {
105
- xForm.value.clearValidate();
106
- }, 1600);
107
- };
108
- defineExpose({
109
- validateForm,
110
- validate
111
- });
112
- </script>