@utogether/udp-core 1.0.0 → 1.0.1-beta.10

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 (201) hide show
  1. package/build/plugins.ts +39 -26
  2. package/dist/{403-B1R-4vXw.js → 403-Ctxjn4q8.js} +9 -8
  3. package/dist/{404-fXPl8csw.js → 404-W5yzyiZ9.js} +15 -14
  4. package/dist/{500-eI5842YB.js → 500-DXuGEOm4.js} +11 -10
  5. package/dist/{AuthorityInfo-CfVH6PaB.js → AuthorityInfo-C2tflCt8.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-SVgy3HX7.js +100 -0
  7. package/dist/{AuthorityPanel-BaLMwMgW.js → AuthorityPanel-BeBNiwqc.js} +1 -1
  8. package/dist/{AuthorityPanel.vue_vue_type_style_index_0_lang-C_bkqLD9.js → AuthorityPanel.vue_vue_type_style_index_0_lang-CIYmnP9-.js} +6 -6
  9. package/dist/{Company-CYC9Avfz.js → Company-PLez5GoH.js} +3 -3
  10. package/dist/{CompanyPanel-B4MzoqN_.js → CompanyPanel-CIGaQooL.js} +20 -20
  11. package/dist/{Department-B4BNSiYx.js → Department-B9wLsXFm.js} +3 -3
  12. package/dist/{DepartmentPanel-zJO89L2O.js → DepartmentPanel-DSM4lTaz.js} +23 -23
  13. package/dist/{DesignPanel-S8P0J97f.js → DesignPanel-B6a9wW_A.js} +1 -1
  14. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-DW-_Vqrr.js → DesignPanel.vue_vue_type_style_index_0_lang-DtHfoDQk.js} +28 -30
  15. package/dist/DictView-DhFbQxdJ.js +110 -0
  16. package/dist/{InvOrganization-MuM2jtsG.js → InvOrganization-D90AbR3b.js} +2 -2
  17. package/dist/Org-DxBkYabD.js +39 -0
  18. package/dist/{Preview-CRyiwUIR.js → Preview-BFtRpBxw.js} +1 -1
  19. package/dist/{ReportDefine-WZYIx8Sm.js → ReportDefine-BIa2QryC.js} +1 -1
  20. package/dist/{ReportDesign-D-7GKgpb.js → ReportDesign-CnyjI-WD.js} +44 -44
  21. package/dist/{ReportQuery-BIIJny6w.js → ReportQuery-BiK7yEhV.js} +5 -5
  22. package/dist/{ReportQueryFrom-OoUl7N2O.js → ReportQueryFrom-C2rqdFTm.js} +1 -1
  23. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-B878fgj8.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Ba9HLnXQ.js} +6 -5
  24. package/dist/{ReportTemplate-Cfeq9US-.js → ReportTemplate-DdkLscP3.js} +30 -30
  25. package/dist/{Role-BwTV2QMH.js → Role-BrsxgK8D.js} +6 -6
  26. package/dist/{RoleAssign-De1JjOun.js → RoleAssign-DiqwJqDa.js} +8 -8
  27. package/dist/{RolePanel-pUBXsqCM.js → RolePanel-BDusGyo7.js} +1 -1
  28. package/dist/{RolePanel-E3RcdByM.js → RolePanel-Dqx5dI3f.js} +1 -1
  29. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-2Z1q_5uW.js +132 -0
  30. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-B2pQwHb0.js → RolePanel.vue_vue_type_script_setup_true_lang-B5lUnaMI.js} +40 -34
  31. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-vMR1fBi0.js → ScrollPanel.vue_vue_type_style_index_0_lang-vSP23fEq.js} +23 -23
  32. package/dist/{Staff-Czm7A8vI.js → Staff-Cwi9LQiZ.js} +3 -3
  33. package/dist/StaffInfo-XjVtyaMv.js +4 -0
  34. package/dist/{StaffInfo.vue_vue_type_style_index_0_lang-DMTL7KCh.js → StaffInfo.vue_vue_type_script_setup_true_lang-wSrAuyet.js} +16 -16
  35. package/dist/{StaffPanel-CHk60LEz.js → StaffPanel-C-wYcFdv.js} +1 -1
  36. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-iPKLb5wG.js → StaffPanel.vue_vue_type_script_setup_true_lang-DZNArmnC.js} +46 -49
  37. package/dist/{SysUser-BGwbttRn.js → SysUser-O4tvr-Ur.js} +2 -2
  38. package/dist/{SysUserPanel-BCbKoLKt.js → SysUserPanel-B853docZ.js} +1 -1
  39. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-DhiYYC97.js +294 -0
  40. package/dist/{SystemMenu-BkqZSDKl.js → SystemMenu-CXR6mrXr.js} +52 -50
  41. package/dist/{UserInfo-BsyAcT2d.js → UserInfo-BkP8pE2a.js} +1 -1
  42. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-D0-KDxAh.js → UserInfo.vue_vue_type_style_index_0_lang-D4r_umjV.js} +38 -36
  43. package/dist/{childView-CyuLTUqC.js → childView-D0HwbgDT.js} +1 -1
  44. package/dist/{childView-CF83nhxb.js → childView-TRqUkSDC.js} +1 -1
  45. package/dist/{childView.vue_vue_type_style_index_0_lang-CNSgGda3.js → childView.vue_vue_type_style_index_0_lang-BzISq0Jf.js} +43 -43
  46. package/dist/{childView.vue_vue_type_style_index_0_lang-Cch4lE-i.js → childView.vue_vue_type_style_index_0_lang-DQRgNsJY.js} +1 -1
  47. package/dist/{code-rule-Bz-gnktN.js → code-rule-BV7PQWhK.js} +13 -14
  48. package/dist/core.es.js +13 -10
  49. package/dist/{cron-task-CIifSUdW.js → cron-task-9ZS9bi7K.js} +11 -11
  50. package/dist/{frameView-_d2mqjjQ.js → frameView-DE83AN50.js} +15 -14
  51. package/dist/img/l_img.svg +1 -1
  52. package/dist/img/minicolors.png +0 -0
  53. package/dist/img/v_img.svg +1 -1
  54. package/dist/index-DVARtten.js +2623 -0
  55. package/dist/{layoutView-DLKVepB8.js → layoutView-D1U-c4By.js} +730 -724
  56. package/dist/{login-log-CvVnyGi3.js → login-log-kqKzKTto.js} +1 -1
  57. package/dist/{login-LREiDfFU.js → login-sPCEiTGT.js} +107 -113
  58. package/dist/{lov-view-DDrIVILB.js → lov-view-76NcYTYl.js} +5 -5
  59. package/dist/{menuInfo-B1FUV-Sk.js → menuInfo-CxjfjFpm.js} +1 -1
  60. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-Cnk3vdtD.js → menuInfo.vue_vue_type_style_index_0_lang-C2qahH3r.js} +98 -95
  61. package/dist/pda-app-BUH16bLj.js +710 -0
  62. package/dist/redirect-BqegffKC.js +15 -0
  63. package/dist/{resource-BCwx9fEv.js → resource-CCuHzoA6.js} +18 -18
  64. package/dist/{su-welcome-189A7N4r.js → su-welcome-mRArONsd.js} +133 -133
  65. package/dist/{sys-config-BZ3sejow.js → sys-config-Cvt05yF6.js} +21 -21
  66. package/dist/udp-core.css +2 -2
  67. package/dist/{utogether-r08LNiIZ.js → utogether-Dm_VBQHR.js} +6 -6
  68. package/index.ts +40 -36
  69. package/package.json +4 -2
  70. package/src/App.vue +65 -70
  71. package/src/api/index.ts +1 -1
  72. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  73. package/src/components/SuScrollTree/ScrollPanel.vue +3 -3
  74. package/src/components/udp/count-down.vue +536 -0
  75. package/src/components/udp/flip-down/FlipCard/flip-card.vue +251 -0
  76. package/src/components/udp/flip-down/FlipCard/interfaces.ts +4 -0
  77. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +113 -0
  78. package/src/components/udp/form-upload.vue +482 -0
  79. package/src/components/udp/form.vue +112 -0
  80. package/src/components/udp/grid.vue +495 -0
  81. package/src/components/udp/index.ts +10 -0
  82. package/src/components/udp/lov.vue +388 -0
  83. package/src/components/udp/modal-form.vue +189 -0
  84. package/src/components/udp/modal-grid.vue +288 -0
  85. package/src/components/udp/upload.vue +423 -0
  86. package/src/components/udp/utils.ts +447 -0
  87. package/src/directives/permission/index.ts +1 -1
  88. package/src/layout/components/lay-navbar/index.vue +1 -1
  89. package/src/layout/components/lay-panel/index.vue +150 -150
  90. package/src/layout/components/lay-search/index.vue +25 -25
  91. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  92. package/src/layout/components/lay-tag/index.vue +625 -625
  93. package/src/layout/layoutView.vue +215 -215
  94. package/src/main.ts +25 -14
  95. package/src/plugins/i18n/en.ts +302 -289
  96. package/src/plugins/i18n/zh.ts +348 -337
  97. package/src/plugins/vxe-table/index.ts +53 -46
  98. package/src/plugins/vxe-table/render.tsx +956 -397
  99. package/src/router/index.ts +187 -183
  100. package/src/router/modules/remaining.ts +58 -83
  101. package/src/style/button.scss +85 -78
  102. package/src/style/tailwind.css +1 -68
  103. package/src/style/vxetable.scss +44 -11
  104. package/src/utils/authority/index.ts +1 -1
  105. package/src/utils/{http → udp/http}/index.ts +8 -24
  106. package/src/utils/{http → udp/http}/types.d.ts +8 -5
  107. package/src/utils/udp/useRender.ts +431 -0
  108. package/src/views/login/login-view.vue +2 -2
  109. package/src/views/organization/company/CompanyPanel.vue +259 -259
  110. package/src/views/organization/inv-org/InvOrganization.vue +1 -1
  111. package/src/views/organization/org/Org.vue +9 -5
  112. package/src/views/organization/staff/StaffInfo.vue +0 -30
  113. package/src/views/organization/staff/StaffPanel.vue +4 -3
  114. package/src/views/system/menu/AuthorityPanel.vue +2 -2
  115. package/src/views/system/menu/SystemMenu.vue +183 -191
  116. package/src/views/system/menu/menuInfo.vue +363 -368
  117. package/src/views/system/role/AuthorityInfo.vue +19 -33
  118. package/src/views/system/role/Role.vue +1 -5
  119. package/src/views/system/role/RolePanel.vue +11 -2
  120. package/src/views/system/role/UserInfo.vue +195 -193
  121. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  122. package/src/views/system/role-assign/RolePanel.vue +139 -136
  123. package/src/views/system/sys/sys-config.vue +1 -1
  124. package/src/views/system/sysUser/SysUserPanel.vue +278 -278
  125. package/src/views/uapp/pda/pda-app.vue +208 -176
  126. package/src/views/udev/dict/DictView.vue +118 -106
  127. package/src/views/udev/dict/childView.vue +7 -7
  128. package/src/views/udev/lov/lov-view.vue +91 -91
  129. package/src/views/ufile/aggregation/File.vue +5 -5
  130. package/src/views/ufile/file/water-mark.vue +14 -14
  131. package/src/views/uhome/components/menu-favorite.vue +1 -1
  132. package/src/views/uhome/su-welcome.vue +4 -4
  133. package/src/views/ulogin/login.vue +15 -10
  134. package/src/views/upms/user/login-log.vue +1 -1
  135. package/src/views/urpt/design/DesignPanel.vue +507 -526
  136. package/src/views/urpt/design/ReportDesign.vue +15 -19
  137. package/src/views/urpt/static-resource/resource.vue +3 -3
  138. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  139. package/types/global.d.ts +2 -2
  140. package/vite.config.ts +13 -2
  141. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-DbK-f8jH.js +0 -102
  142. package/dist/DictView-bIS5-rK-.js +0 -95
  143. package/dist/Org-kXHSjsgJ.js +0 -35
  144. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CTIad9_Q.js +0 -126
  145. package/dist/StaffInfo-DJzvBuxy.js +0 -4
  146. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-0QUjnhjF.js +0 -289
  147. package/dist/core.umd.js +0 -173
  148. package/dist/index-BKIw8tSn.js +0 -9195
  149. package/dist/pda-app-CRhVGijN.js +0 -2209
  150. package/dist/redirect-DiaNDu8F.js +0 -15
  151. package/src/assets/images/empty.png +0 -0
  152. package/src/assets/images/logo.png +0 -0
  153. package/src/components/ReCountTo/README.md +0 -2
  154. package/src/components/ReCountTo/index.ts +0 -18
  155. package/src/components/ReCountTo/src/normal/index.tsx +0 -165
  156. package/src/components/ReCountTo/src/normal/props.ts +0 -37
  157. package/src/components/ReCountTo/src/rebound/index.tsx +0 -67
  158. package/src/components/ReCountTo/src/rebound/props.ts +0 -14
  159. package/src/components/ReCountTo/src/rebound/rebound.css +0 -77
  160. package/src/components/ReCropper/index.ts +0 -14
  161. package/src/components/ReCropper/src/index.tsx +0 -141
  162. package/src/components/ReFlicker/index.css +0 -39
  163. package/src/components/ReFlicker/index.ts +0 -50
  164. package/src/components/ReFlop/index.ts +0 -14
  165. package/src/components/ReFlop/src/Filpper.tsx +0 -99
  166. package/src/components/ReFlop/src/filpper.css +0 -184
  167. package/src/components/ReFlop/src/index.vue +0 -126
  168. package/src/components/ReFlowChart/index.ts +0 -24
  169. package/src/components/ReFlowChart/src/Control.vue +0 -139
  170. package/src/components/ReFlowChart/src/DataDialog.vue +0 -12
  171. package/src/components/ReFlowChart/src/NodePanel.vue +0 -151
  172. package/src/components/ReFlowChart/src/adpterForTurbo.ts +0 -160
  173. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.css +0 -49
  174. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.eot +0 -0
  175. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.js +0 -61
  176. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.json +0 -58
  177. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.svg +0 -47
  178. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.ttf +0 -0
  179. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff +0 -0
  180. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff2 +0 -0
  181. package/src/components/ReFlowChart/src/config.ts +0 -62
  182. package/src/components/ReSplitPane/index.css +0 -49
  183. package/src/components/ReSplitPane/index.tsx +0 -119
  184. package/src/components/ReSplitPane/resizer.css +0 -45
  185. package/src/components/ReSplitPane/resizer.tsx +0 -30
  186. package/src/components/SuCommon/card/components/Card.vue +0 -148
  187. package/src/components/SuCommon/card/components/DialogForm.vue +0 -127
  188. package/src/components/SuCommon/card/index.vue +0 -142
  189. package/src/components/SuCommon/icon-select/index.vue +0 -241
  190. package/src/components/SuCommon/table/index.vue +0 -208
  191. package/src/components/SuCommon/utils/index.ts +0 -103
  192. package/src/components/SuCommon/utils/slot.tsx +0 -50
  193. package/src/views/components/contextmenu/basic.vue +0 -74
  194. package/src/views/components/contextmenu/context-menu.vue +0 -40
  195. package/src/views/components/contextmenu/menuDynamic.vue +0 -99
  196. package/src/views/components/contextmenu/menuGroup.vue +0 -71
  197. package/src/views/components/count-to/index.vue +0 -43
  198. package/src/views/components/cropping/index.vue +0 -59
  199. package/src/views/components/cropping/picture.jpeg +0 -0
  200. package/src/views/components/split-pane/index.vue +0 -82
  201. package/src/views/components/video/index.vue +0 -57
@@ -0,0 +1,482 @@
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>
@@ -0,0 +1,112 @@
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2022-03-02 17:07:59
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-08-19 10:19:16
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 #dividerPrefix />
25
+ <template #collapseNode>
26
+ <div class="flex justify-start">
27
+ <vxe-checkbox
28
+ v-model="collapseStatus"
29
+ content="查看更多"
30
+ :checked-value="false"
31
+ :unchecked-value="true"
32
+ class="pl-10"
33
+ @change="onChange"
34
+ />
35
+ </div>
36
+ </template>
37
+ </vxe-form>
38
+ </div>
39
+ </template>
40
+
41
+ <script lang="ts">
42
+ export default {
43
+ name: 'UtForm'
44
+ };
45
+ </script>
46
+ <script setup lang="ts">
47
+ import { useI18n } from 'vue-i18n';
48
+ import { ref, computed } from 'vue';
49
+ // import { formatRules } from '@utogether/utils';
50
+ import { formatItems, formatRules } from './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(props.items, 'edit', 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>