@utogether/udp-core 1.0.1-beta.3 → 1.0.1-beta.30

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 (165) hide show
  1. package/build/plugins.ts +3 -3
  2. package/dist/{403-BuP9jvH9.js → 403-DdjDWbkf.js} +1 -1
  3. package/dist/{404-DfQk8kKl.js → 404-D9vF2gFz.js} +1 -1
  4. package/dist/{500-OgROWdiZ.js → 500-mVaDmUjL.js} +1 -1
  5. package/dist/{AuthorityInfo-q2ksfkWH.js → AuthorityInfo-DOUJ_Zrj.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-B12sAzqt.js +100 -0
  7. package/dist/{Company-DgqowAxc.js → Company-DY__kM9F.js} +3 -3
  8. package/dist/{CompanyPanel-BNb1rUhD.js → CompanyPanel-C5N8QcMA.js} +17 -17
  9. package/dist/{Department-Cl8CROSU.js → Department-DsuDZdy5.js} +3 -3
  10. package/dist/{DepartmentPanel-D5VkqKeP.js → DepartmentPanel-CdwI7Rzu.js} +25 -25
  11. package/dist/{DesignPanel-BGvEusHC.js → DesignPanel-B50-g0TL.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BQF1uQ7w.js → DesignPanel.vue_vue_type_style_index_0_lang-KV8JOZ6v.js} +28 -30
  13. package/dist/DictView-Be2Z5Obk.js +110 -0
  14. package/dist/InvOrganization-Lui1q3Ou.js +74 -0
  15. package/dist/Org-qO5ExsPN.js +39 -0
  16. package/dist/{Preview-BaGmXH7r.js → Preview-Dq4dfV2D.js} +2 -2
  17. package/dist/{ReportDefine-DkQdBErt.js → ReportDefine-DH3FvbS1.js} +1 -1
  18. package/dist/{ReportDesign-DzB_A_G6.js → ReportDesign-Bou01Jbr.js} +43 -43
  19. package/dist/{ReportQuery-DRcMb6ya.js → ReportQuery-BBkmPPSw.js} +1 -1
  20. package/dist/{ReportQueryFrom-CeA9xhR4.js → ReportQueryFrom-BCY8lTJ7.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CgGtcs5V.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-CpktcM8J.js} +1 -1
  22. package/dist/{ReportTemplate-qaiTMQuT.js → ReportTemplate-C_yJXxQ-.js} +28 -28
  23. package/dist/{Role-DsFulAjq.js → Role-CTatYsrC.js} +6 -6
  24. package/dist/{RoleAssign-DMRdocpa.js → RoleAssign-Cqt3CelK.js} +9 -9
  25. package/dist/{RolePanel-wXVysDHM.js → RolePanel-C3JMpNu8.js} +1 -1
  26. package/dist/{RolePanel-B9POS_pg.js → RolePanel-brKRJIhD.js} +1 -1
  27. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DD8u9pq8.js +132 -0
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-CleVvkcY.js → RolePanel.vue_vue_type_script_setup_true_lang-i6Gq4r5B.js} +44 -38
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-DlXUs0j9.js → ScrollPanel.vue_vue_type_style_index_0_lang-CiWKyjm3.js} +23 -23
  30. package/dist/{Staff-Cq4V7ruC.js → Staff-Cd3twQ6Y.js} +3 -3
  31. package/dist/{StaffInfo-CJDKMbud.js → StaffInfo-DJp0a0qd.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DQ4DL1KY.js → StaffInfo.vue_vue_type_script_setup_true_lang-Dp2AhJ4I.js} +16 -16
  33. package/dist/{StaffPanel-CG-uggdr.js → StaffPanel-B93hClzs.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-DAgN7zN2.js → StaffPanel.vue_vue_type_script_setup_true_lang-CXjUzq7n.js} +2 -2
  35. package/dist/{SysUser-kwnzRNdD.js → SysUser-BvI6vaqI.js} +2 -2
  36. package/dist/{SysUserPanel-DTlZf3vk.js → SysUserPanel-C9V8X-Ek.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-bMqTui07.js +343 -0
  38. package/dist/{SystemMenu-BVT0n-L2.js → SystemMenu-D4WME5d0.js} +27 -27
  39. package/dist/{UserInfo-BbTQ9Zat.js → UserInfo-D-AfdfJs.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-D_bpYDmI.js → UserInfo.vue_vue_type_style_index_0_lang-C-JQYIxe.js} +41 -39
  41. package/dist/{childView-BJbIhjmf.js → childView--WMSo-wH.js} +1 -1
  42. package/dist/{childView-DCsGFrG-.js → childView-1MTl6Kaj.js} +1 -1
  43. package/dist/childView.vue_vue_type_style_index_0_lang-B8Losc4Y.js +170 -0
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-BCDxpVoD.js → childView.vue_vue_type_style_index_0_lang-BAVKNIXs.js} +1 -1
  45. package/dist/{code-rule-DePU6cdp.js → code-rule-D-RqrQB6.js} +42 -41
  46. package/dist/core.es.js +19 -10
  47. package/dist/{cron-task-DUM1SIGL.js → cron-task-D-X-KFZm.js} +11 -11
  48. package/dist/flow-task-B07st2aD.js +10 -0
  49. package/dist/{frameView-CEUTDtSm.js → frameView-MAW_-GHJ.js} +1 -1
  50. package/dist/index-Bc9vCX7z.js +2904 -0
  51. package/dist/{layoutView-PCjwVwkX.js → layoutView-De2QIEr2.js} +1639 -1629
  52. package/dist/{log-in-e7D5Ss1P.js → log-in-CpGqc33f.js} +5 -4
  53. package/dist/{log-out--RRncZhN.js → log-out-D1b4VRMZ.js} +30 -24
  54. package/dist/{login-log-CvVnyGi3.js → login-log-BNRXLeMi.js} +4 -3
  55. package/dist/login-rdZ0GPYc.js +249 -0
  56. package/dist/{lov-view-D8wwkxFJ.js → lov-view-Ao7LMspL.js} +5 -5
  57. package/dist/{menuInfo-B5JKVwrB.js → menuInfo-DmOcK6An.js} +1 -1
  58. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-CcM9WX4n.js → menuInfo.vue_vue_type_style_index_0_lang-Ln-zFWV7.js} +121 -99
  59. package/dist/{pda-app-DIa1p1Ww.js → pda-app-DY63mQ2T.js} +202 -188
  60. package/dist/{resource-CCQ7Dd-5.js → resource-B21uV58T.js} +18 -18
  61. package/dist/{su-welcome-CLp9YaJa.js → su-welcome-DgjzJeDF.js} +122 -121
  62. package/dist/sys-config-DOtK2I32.js +370 -0
  63. package/dist/udp-core.css +1 -9
  64. package/dist/utogether-MlnyYtNS.js +4 -0
  65. package/index.ts +19 -6
  66. package/package.json +3 -3
  67. package/src/App.vue +65 -70
  68. package/src/api/http.ts +1 -4
  69. package/src/api/index.ts +5 -3
  70. package/src/api/user.ts +2 -2
  71. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  72. package/src/components/SuScrollTree/ScrollPanel.vue +4 -9
  73. package/src/components/udp/content/index.vue +89 -0
  74. package/src/components/udp/form/form.vue +109 -0
  75. package/src/components/udp/{grid.vue → grid/index.vue} +524 -500
  76. package/src/components/udp/index.ts +4 -6
  77. package/src/components/udp/ut-stamp-badge/index.vue +272 -0
  78. package/src/components/udp/utils.ts +408 -379
  79. package/src/directives/permission/index.ts +1 -1
  80. package/src/layout/components/lay-navbar/index.vue +8 -6
  81. package/src/layout/components/lay-panel/index.vue +150 -150
  82. package/src/layout/components/lay-search/index.vue +1 -1
  83. package/src/layout/components/lay-select-org/index.vue +4 -9
  84. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  85. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  86. package/src/layout/components/lay-sidebar/sidebar-logo.vue +8 -12
  87. package/src/layout/components/lay-tag/index.vue +596 -625
  88. package/src/layout/hooks/useTag.ts +12 -18
  89. package/src/layout/types.ts +3 -2
  90. package/src/main.ts +115 -110
  91. package/src/plugins/i18n/en.ts +302 -291
  92. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  93. package/src/plugins/i18n/zh.ts +362 -338
  94. package/src/plugins/vxe-table/index.ts +116 -53
  95. package/src/plugins/vxe-table/render.tsx +183 -57
  96. package/src/router/index.ts +101 -97
  97. package/src/router/modules/flow.ts +35 -0
  98. package/src/router/modules/remaining.ts +1 -26
  99. package/src/router/utils.ts +50 -7
  100. package/src/store/modules/app.ts +1 -3
  101. package/src/store/modules/multiTags.ts +15 -14
  102. package/src/store/modules/permission.ts +25 -15
  103. package/src/store/modules/system.ts +1 -3
  104. package/src/style/button.scss +85 -85
  105. package/src/style/login.css +1 -1
  106. package/src/style/vxetable.scss +348 -258
  107. package/src/utils/authority/index.ts +1 -1
  108. package/src/utils/index.ts +3 -1
  109. package/src/utils/propTypes.ts +1 -6
  110. package/src/utils/{http → udp/http}/index.ts +27 -30
  111. package/src/utils/{http → udp/http}/types.d.ts +2 -6
  112. package/src/views/login/login-view.vue +6 -20
  113. package/src/views/organization/company/CompanyPanel.vue +259 -259
  114. package/src/views/organization/department/DepartmentPanel.vue +6 -20
  115. package/src/views/organization/inv-org/InvOrganization.vue +22 -7
  116. package/src/views/organization/org/Org.vue +9 -5
  117. package/src/views/system/cron/cron-task.vue +2 -12
  118. package/src/views/system/menu/SystemMenu.vue +185 -197
  119. package/src/views/system/menu/menuInfo.vue +384 -372
  120. package/src/views/system/role/AuthorityInfo.vue +19 -15
  121. package/src/views/system/role/Role.vue +1 -5
  122. package/src/views/system/role/RolePanel.vue +11 -2
  123. package/src/views/system/role/UserInfo.vue +11 -9
  124. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  125. package/src/views/system/role-assign/RolePanel.vue +12 -9
  126. package/src/views/system/sys/sys-config.vue +70 -21
  127. package/src/views/system/sysUser/SysUserPanel.vue +132 -62
  128. package/src/views/uapp/pda/pda-app.vue +48 -16
  129. package/src/views/udev/coderule/code-rule.vue +132 -121
  130. package/src/views/udev/dict/DictView.vue +118 -106
  131. package/src/views/udev/dict/childView.vue +71 -111
  132. package/src/views/udev/lov/childView.vue +1 -7
  133. package/src/views/udev/lov/lov-view.vue +91 -91
  134. package/src/views/ufile/aggregation/File.vue +5 -5
  135. package/src/views/ufile/file/water-mark.vue +14 -14
  136. package/src/views/uhome/components/menu-favorite.vue +314 -331
  137. package/src/views/uhome/su-welcome.vue +3 -3
  138. package/src/views/ulogin/login.vue +19 -12
  139. package/src/views/upms/interface/log-in.vue +2 -8
  140. package/src/views/upms/interface/log-out.vue +2 -8
  141. package/src/views/upms/user/login-log.vue +2 -8
  142. package/src/views/urpt/design/DesignPanel.vue +16 -35
  143. package/src/views/urpt/design/Preview.vue +1 -0
  144. package/src/views/urpt/design/ReportDesign.vue +17 -23
  145. package/src/views/urpt/static-resource/resource.vue +3 -3
  146. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  147. package/src/views/utask/flow-task.vue +18 -0
  148. package/types/global.d.ts +4 -9
  149. package/vite.config.ts +2 -1
  150. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-Bwsf6lMH.js +0 -102
  151. package/dist/DictView-BnxfaOBv.js +0 -96
  152. package/dist/InvOrganization-5y79ZLdY.js +0 -66
  153. package/dist/Org-2oBAXN2r.js +0 -35
  154. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-t6S_0zmJ.js +0 -126
  155. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-BW6PlGjM.js +0 -288
  156. package/dist/childView.vue_vue_type_style_index_0_lang-CDtsalCm.js +0 -187
  157. package/dist/index-ZdgOD7cF.js +0 -3399
  158. package/dist/login-B1CjWVKu.js +0 -252
  159. package/dist/sys-config-BBmf_SqF.js +0 -277
  160. package/dist/utogether-Bkptx2lB.js +0 -182
  161. package/src/components/udp/form-upload.vue +0 -183
  162. package/src/components/udp/lov.vue +0 -410
  163. package/src/components/udp/modal-form.vue +0 -180
  164. package/src/components/udp/modal-grid.vue +0 -297
  165. package/src/utils/udp/useRender.ts +0 -420
@@ -1,372 +1,384 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-17 16:44:08
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-24 09:42:27
6
- * @Description: file content
7
- -->
8
-
9
- <template>
10
- <div class="ut-menu-wrapper">
11
- <el-drawer
12
- :model-value="show"
13
- :title="$t('message.title.memuInfo')"
14
- :before-close="handleClose"
15
- direction="rtl"
16
- destroy-on-close
17
- size="50%"
18
- >
19
- <vxe-form
20
- ref="xForm"
21
- :data="record"
22
- :rules="rules"
23
- :loading="loading"
24
- title-colon
25
- title-align="right"
26
- title-width="110"
27
- >
28
- <vxe-form-item
29
- v-if="record.menuType === '0'"
30
- :title="$t('message.menuType')"
31
- field="menuCategory"
32
- span="24"
33
- >
34
- <template #default="{ data }">
35
- <vxe-select v-model="data.menuCategory" :disabled="data.menuCategory === '0'">
36
- <!-- v-for="dict in dictData['SU.MENU.TYPE']?.children" -->
37
- <vxe-option
38
- v-for="dict in getLovList('SU.MENU.TYPE')"
39
- :key="dict.dictCode"
40
- :value="dict.dictCode"
41
- :label="dict.dictName"
42
- :disabled="dict.enabled"
43
- />
44
- </vxe-select>
45
- </template>
46
- </vxe-form-item>
47
- <vxe-form-item :title="$t('message.permissionCode')" field="dispalyCode" span="24">
48
- <template #default="{ data }">
49
- <vxe-input
50
- v-model="data.dispalyCode"
51
- clearable
52
- :class="{ 'u-menu-prefix': dataStatus === 'add' }"
53
- :disabled="dataStatus !== 'add'"
54
- >
55
- <template v-if="dataStatus === 'add'" #prefix>
56
- <span>{{ prefixCode }}</span>
57
- </template>
58
- </vxe-input>
59
- </template>
60
- </vxe-form-item>
61
- <vxe-form-item
62
- v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
63
- :title="$t('message.menuCode')"
64
- :item-render="{ name: '$input' }"
65
- field="menuCode"
66
- span="24"
67
- />
68
- <vxe-form-item
69
- :title="$t('message.menuName')"
70
- :item-render="{ name: '$input' }"
71
- field="menuName"
72
- span="24"
73
- />
74
- <vxe-form-item
75
- :title="$t('message.menuNameEn')"
76
- field="menuNameEn"
77
- span="24"
78
- :item-render="{ name: '$input' }"
79
- />
80
- <vxe-form-item
81
- v-if="!(record.menuType * 1)"
82
- :title="$t('message.menuPath')"
83
- :item-render="{ name: '$input' }"
84
- field="menuPath"
85
- span="24"
86
- />
87
- <vxe-form-item
88
- v-if="!(record.menuType * 1)"
89
- :title="$t('message.i18nField')"
90
- :item-render="{ name: '$input' }"
91
- field="i18nField"
92
- span="24"
93
- />
94
- <vxe-form-item
95
- v-if="record.menuCategory === '2'"
96
- :title="$t('message.frameSrc')"
97
- :item-render="{ name: '$input' }"
98
- field="frameSrc"
99
- span="24"
100
- />
101
- <vxe-form-item
102
- v-if="record.menuCategory === '3'"
103
- :title="$t('message.externalURI')"
104
- :item-render="{ name: '$input' }"
105
- field="menuCode"
106
- span="24"
107
- />
108
- <vxe-form-item
109
- v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
110
- :title="$t('message.extraIcon')"
111
- :item-render="{ name: '$input' }"
112
- field="extraIcon"
113
- span="24"
114
- />
115
- <vxe-form-item
116
- v-if="['0', '5'].includes(record.menuCategory)"
117
- :title="$t('message.redirect')"
118
- :item-render="{ name: '$input' }"
119
- field="redirect"
120
- span="24"
121
- />
122
- <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.sort')" span="24">
123
- <template #default="{ data }">
124
- <vxe-input v-model="data.sort" type="number" step="10" clearable />
125
- </template>
126
- </vxe-form-item>
127
- <vxe-form-item
128
- v-if="dataStatus === 'add' && ['2', '1'].includes(record.menuCategory)"
129
- :title="$t('message.btn.auth')"
130
- >
131
- <template #default>
132
- <vxe-checkbox-group v-model="authority">
133
- <vxe-checkbox label="add" :content="$t('message.btn.add')" />
134
- <vxe-checkbox label="del" :content="$t('message.btn.delete')" />
135
- <vxe-checkbox label="edit" :content="$t('message.btn.edit')" />
136
- <vxe-checkbox label="fetch" :content="$t('message.btn.fetch')" />
137
- <vxe-checkbox label="export" :content="$t('message.btn.export')" />
138
- </vxe-checkbox-group>
139
- </template>
140
- </vxe-form-item>
141
- <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.icon')" span="24">
142
- <template #default="{ data }">
143
- <ut-icon-select v-model="data.icon" />
144
- </template>
145
- </vxe-form-item>
146
- </vxe-form>
147
- <el-divider />
148
- <el-row type="flex" justify="end" style="padding-right: 22px">
149
- <ut-button content="cancel" status="warning" @tap="handleClose" />
150
- <ut-button content="confirm" status="primary" @tap="onSubmit" />
151
- </el-row>
152
- </el-drawer>
153
- </div>
154
- </template>
155
- <script setup lang="ts">
156
- import { useI18n } from 'vue-i18n';
157
- import { ref, watch } from 'vue';
158
- import to from 'await-to-js';
159
- import { templateRef } from '@vueuse/core';
160
- import { useSystemStoreHook } from '../../../store/modules/system';
161
- import { getServiceApi } from '../../../api';
162
-
163
- interface IProps {
164
- show: boolean;
165
- record: IRecord;
166
- dataStatus?: string;
167
- direction?: string;
168
- }
169
-
170
- const dictData = useSystemStoreHook().getDataDict;
171
-
172
- const props = withDefaults(defineProps<IProps>(), {
173
- show: false,
174
- record: (): IRecord => {
175
- return {};
176
- },
177
- dataStatus: 'detail',
178
- direction: 'rtl'
179
- });
180
-
181
- watch(
182
- () => props.show,
183
- () => {
184
- prefixCode.value = props.show && getPrefixCode();
185
- }
186
- );
187
-
188
- const serviceApi = getServiceApi();
189
-
190
- const { t } = useI18n();
191
- const rules = {
192
- menuCode: [
193
- {
194
- required: true,
195
- message: `${t('message.required')}${t('message.menuCode')}`
196
- }
197
- ],
198
- menuName: [
199
- {
200
- required: true,
201
- message: `${t('message.required')}${t('message.menuName')}`
202
- }
203
- ],
204
- menuPath: [
205
- {
206
- required: true,
207
- message: `${t('message.required')}${t('message.menuPath')}`
208
- }
209
- ],
210
- frameSrc: [
211
- {
212
- required: true,
213
- message: `${t('message.required')}${t('message.externalURI')}`
214
- }
215
- ],
216
- i18nField: [
217
- {
218
- required: true,
219
- message: `${t('message.required')}${t('message.i18nField')}`
220
- }
221
- ],
222
- dispalyCode: [
223
- {
224
- required: true,
225
- message: `${t('message.required')}${t('message.permissionCode')}`
226
- }
227
- ],
228
- menuCategory: [
229
- {
230
- required: true,
231
- message: `${t('message.required')}${t('message.menuType')}`
232
- }
233
- ]
234
- };
235
-
236
- const xForm = templateRef<any>('xForm', null);
237
- const loading = ref(false);
238
- const prefixCode = ref('');
239
- const authority = ref(['fetch']);
240
-
241
- const url = '/uums/menu';
242
-
243
- const emit = defineEmits<{
244
- (e: 'close', type, data?): void;
245
- }>();
246
-
247
- const getPrefixCode = () => {
248
- const { record, dataStatus } = props;
249
- const { id, parentId, hasChildren } = record;
250
- if (dataStatus === 'update') return;
251
- if (!id && !parentId) return 'su';
252
- if (hasChildren || dataStatus === 'add') {
253
- record.dispalyCode = '';
254
- return record.permissionCode;
255
- }
256
- return record.permissionCode;
257
- };
258
-
259
- const onSubmit = () => {
260
- xForm.value.validate(async valid => {
261
- if (!valid) {
262
- loading.value = true;
263
- let resData;
264
- const { record, dataStatus } = props;
265
- if (dataStatus === 'add') {
266
- record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
267
- const [err, data]: [Error, any] = await to(serviceApi.post(url, [record]));
268
- if (!err && !['0', '5'].includes(record.menuCategory) && authority.value.length) {
269
- const dataList = authority.value.map((auth, idx) => {
270
- return {
271
- permissionCode: record.permissionCode + '.' + auth,
272
- parentId: data[0].id,
273
- menuName: getAuthName(auth),
274
- menuType: 1,
275
- enabled: '1',
276
- sort: (idx + 1) * 10
277
- };
278
- });
279
- const [err, res] = await to(serviceApi.post(url, dataList));
280
- if (!err) {
281
- // props.record.children.push(...res);
282
- resData = res[0];
283
- }
284
- }
285
- loading.value = false;
286
- } else {
287
- record.permissionCode = record.dispalyCode;
288
- await to(serviceApi.put(url, [record]));
289
- loading.value = false;
290
- }
291
- handleClose('submit', resData);
292
- }
293
- });
294
- };
295
- const getAuthName = code => {
296
- const auth = {
297
- fetch: t('message.btn.fetch'),
298
- add: t('message.btn.add'),
299
- edit: t('message.btn.edit'),
300
- del: t('message.btn.delete'),
301
- export: t('message.btn.export')
302
- };
303
- return auth[code];
304
- };
305
- const getLovList = code => {
306
- return dictData[code]?.children.map(m => {
307
- m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
308
- return m;
309
- });
310
- };
311
- // 抽屉关闭
312
- function handleClose(type, data) {
313
- emit('close', type, data);
314
- }
315
- </script>
316
-
317
- <style lang="scss">
318
- .u-menu-prefix.vxe-input {
319
- height: 34px;
320
- }
321
-
322
- .u-menu-prefix.vxe-input .vxe-input--prefix {
323
- top: 1px;
324
- width: 150px;
325
- height: 24px;
326
- text-align: center;
327
- background-color: #f5f7fa;
328
- border-right: 1px solid #dcdfe6;
329
- }
330
-
331
- .u-menu-prefix.vxe-input .vxe-input--inner {
332
- border: 1px solid #dcdfe6;
333
- }
334
-
335
- .ut-menu-wrapper {
336
- .el-drawer__header {
337
- margin-bottom: 16px;
338
- }
339
-
340
- .el-drawer__body {
341
- margin-bottom: 12px;
342
- overflow: auto;
343
- }
344
-
345
- .el-divider {
346
- margin: 15px 0;
347
- }
348
- }
349
-
350
- .menu-icon {
351
- display: flex;
352
- flex-wrap: wrap;
353
- width: 100%;
354
-
355
- li {
356
- display: flex;
357
- align-items: center;
358
- justify-content: center;
359
- width: 36px;
360
- height: 36px;
361
- margin: 0 2px;
362
- margin-top: 5px;
363
- cursor: pointer;
364
- border: 1px solid #ddd;
365
- }
366
-
367
- .active-icon {
368
- color: #fff;
369
- background-color: #59bfc1;
370
- }
371
- }
372
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-17 16:44:08
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-11-13 18:18:01
6
+ * @Description: file content
7
+ -->
8
+
9
+ <template>
10
+ <div class="ut-menu-wrapper">
11
+ <el-drawer
12
+ :model-value="show"
13
+ :title="$t('message.title.memuInfo')"
14
+ :before-close="handleClose"
15
+ direction="rtl"
16
+ destroy-on-close
17
+ size="50%"
18
+ >
19
+ <vxe-form
20
+ ref="xForm"
21
+ :data="record"
22
+ :rules="rules"
23
+ :loading="loading"
24
+ title-colon
25
+ title-align="right"
26
+ title-width="110"
27
+ transfer
28
+ >
29
+ <vxe-form-item v-if="record.menuType === '0'" :title="$t('message.menuType')" field="menuCategory" span="24">
30
+ <template #default="{ data }">
31
+ <vxe-select v-model="data.menuCategory" :disabled="data.menuCategory === '0'" :transfer="false">
32
+ <vxe-option
33
+ v-for="dict in getLovList('SU.MENU.TYPE')"
34
+ :key="dict.dictCode"
35
+ :value="dict.dictCode"
36
+ :label="dict.dictName"
37
+ :disabled="dict.enabled"
38
+ />
39
+ </vxe-select>
40
+ </template>
41
+ </vxe-form-item>
42
+ <vxe-form-item :title="$t('message.permissionCode')" field="dispalyCode" span="24">
43
+ <template #default="{ data }">
44
+ <vxe-input
45
+ v-model="data.dispalyCode"
46
+ clearable
47
+ :class="{ 'u-menu-prefix': dataStatus === 'add' }"
48
+ :disabled="dataStatus !== 'add'"
49
+ >
50
+ <template v-if="dataStatus === 'add'" #prefix>
51
+ <span>{{ prefixCode }}</span>
52
+ </template>
53
+ </vxe-input>
54
+ </template>
55
+ </vxe-form-item>
56
+ <vxe-form-item
57
+ v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
58
+ :title="$t('message.menuCode')"
59
+ :item-render="{ name: '$input' }"
60
+ field="menuCode"
61
+ span="24"
62
+ />
63
+ <vxe-form-item :title="$t('message.menuName')" :item-render="{ name: '$input' }" field="menuName" span="24" />
64
+ <vxe-form-item
65
+ :title="$t('message.menuNameEn')"
66
+ field="menuNameEn"
67
+ span="24"
68
+ :item-render="{ name: '$input' }"
69
+ />
70
+ <vxe-form-item
71
+ v-if="!(record.menuType * 1)"
72
+ :title="$t('message.menuPath')"
73
+ :item-render="{ name: '$input' }"
74
+ field="menuPath"
75
+ span="24"
76
+ />
77
+ <vxe-form-item
78
+ v-if="!(record.menuType * 1)"
79
+ :title="$t('message.i18nField')"
80
+ :item-render="{ name: '$input' }"
81
+ field="i18nField"
82
+ span="24"
83
+ />
84
+ <vxe-form-item
85
+ v-if="record.menuCategory === '2'"
86
+ :title="$t('message.frameSrc')"
87
+ :item-render="{ name: '$input' }"
88
+ field="frameSrc"
89
+ span="24"
90
+ />
91
+ <vxe-form-item
92
+ v-if="record.menuCategory === '3'"
93
+ :title="$t('message.externalURI')"
94
+ :item-render="{ name: '$input' }"
95
+ field="menuCode"
96
+ span="24"
97
+ />
98
+ <vxe-form-item
99
+ v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
100
+ :title="$t('message.extraIcon')"
101
+ :item-render="{ name: '$input' }"
102
+ field="extraIcon"
103
+ span="24"
104
+ />
105
+ <vxe-form-item
106
+ :visible-method="({ data }) => data.menuCategory === '1'"
107
+ :title="$t('message.udp.showLink')"
108
+ :item-render="{
109
+ name: 'VxeSwitch',
110
+ props: { openLabel: '显示', closeLabel: '隐藏', closeValue: 'N', openValue: 'Y' }
111
+ }"
112
+ field="showLink"
113
+ span="24"
114
+ />
115
+ <vxe-form-item
116
+ :visible-method="({ data }) => data.menuCategory === '1'"
117
+ :title="$t('message.udp.isApprovalPage')"
118
+ :item-render="{
119
+ name: 'VxeSwitch',
120
+
121
+ props: { openLabel: '是', closeLabel: '否', closeValue: 'N', openValue: 'Y' }
122
+ }"
123
+ field="isApprovalPage"
124
+ span="24"
125
+ />
126
+ <vxe-form-item
127
+ v-if="['0', '5'].includes(record.menuCategory)"
128
+ :title="$t('message.redirect')"
129
+ :item-render="{ name: '$input' }"
130
+ field="redirect"
131
+ span="24"
132
+ />
133
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.sort')" span="24">
134
+ <template #default="{ data }">
135
+ <vxe-input v-model="data.sort" type="number" step="10" clearable />
136
+ </template>
137
+ </vxe-form-item>
138
+ <vxe-form-item
139
+ v-if="dataStatus === 'add' && ['2', '1'].includes(record.menuCategory)"
140
+ :title="$t('message.btn.auth')"
141
+ >
142
+ <template #default>
143
+ <vxe-checkbox-group v-model="authority">
144
+ <vxe-checkbox label="add" :content="$t('message.btn.add')" />
145
+ <vxe-checkbox label="del" :content="$t('message.btn.delete')" />
146
+ <vxe-checkbox label="edit" :content="$t('message.btn.edit')" />
147
+ <vxe-checkbox label="fetch" :content="$t('message.btn.fetch')" />
148
+ <vxe-checkbox label="export" :content="$t('message.btn.export')" />
149
+ </vxe-checkbox-group>
150
+ </template>
151
+ </vxe-form-item>
152
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.icon')" span="24">
153
+ <template #default="{ data }">
154
+ <ut-icon-select v-model="data.icon" />
155
+ </template>
156
+ </vxe-form-item>
157
+ </vxe-form>
158
+ <el-divider />
159
+ <el-row type="flex" justify="end" style="padding-right: 22px">
160
+ <ut-button content="cancel" status="warning" @tap="handleClose" />
161
+ <ut-button content="confirm" status="primary" @tap="onSubmit" />
162
+ </el-row>
163
+ </el-drawer>
164
+ </div>
165
+ </template>
166
+ <script setup lang="ts">
167
+ import { useI18n } from 'vue-i18n';
168
+ import { ref, watch } from 'vue';
169
+ import to from 'await-to-js';
170
+ import { templateRef } from '@vueuse/core';
171
+ import { useSystemStoreHook } from '../../../store/modules/system';
172
+ import { getServiceApi } from '../../../api';
173
+
174
+ interface IProps {
175
+ show: boolean;
176
+ record: IRecord;
177
+ dataStatus?: string;
178
+ direction?: string;
179
+ }
180
+
181
+ const dictData = useSystemStoreHook().getDataDict;
182
+
183
+ const props = withDefaults(defineProps<IProps>(), {
184
+ show: false,
185
+ record: (): IRecord => {
186
+ return {};
187
+ },
188
+ dataStatus: 'detail',
189
+ direction: 'rtl'
190
+ });
191
+
192
+ watch(
193
+ () => props.show,
194
+ () => {
195
+ prefixCode.value = props.show && getPrefixCode();
196
+ }
197
+ );
198
+
199
+ const serviceApi = getServiceApi();
200
+
201
+ const { t } = useI18n();
202
+ const rules = {
203
+ menuCode: [
204
+ {
205
+ required: true,
206
+ message: `${t('message.required')}${t('message.menuCode')}`
207
+ }
208
+ ],
209
+ menuName: [
210
+ {
211
+ required: true,
212
+ message: `${t('message.required')}${t('message.menuName')}`
213
+ }
214
+ ],
215
+ menuPath: [
216
+ {
217
+ required: true,
218
+ message: `${t('message.required')}${t('message.menuPath')}`
219
+ }
220
+ ],
221
+ frameSrc: [
222
+ {
223
+ required: true,
224
+ message: `${t('message.required')}${t('message.externalURI')}`
225
+ }
226
+ ],
227
+ i18nField: [
228
+ {
229
+ required: true,
230
+ message: `${t('message.required')}${t('message.i18nField')}`
231
+ }
232
+ ],
233
+ dispalyCode: [
234
+ {
235
+ required: true,
236
+ message: `${t('message.required')}${t('message.permissionCode')}`
237
+ }
238
+ ],
239
+ menuCategory: [
240
+ {
241
+ required: true,
242
+ message: `${t('message.required')}${t('message.menuType')}`
243
+ }
244
+ ]
245
+ };
246
+
247
+ const xForm = templateRef<any>('xForm', null);
248
+ const loading = ref(false);
249
+ const prefixCode = ref('');
250
+ const authority = ref(['fetch']);
251
+
252
+ const url = '/uums/menu';
253
+
254
+ const emit = defineEmits<{
255
+ (e: 'close', type, data?): void;
256
+ }>();
257
+
258
+ const getPrefixCode = () => {
259
+ const { record, dataStatus } = props;
260
+ const { id, parentId, hasChildren } = record;
261
+ if (dataStatus === 'update') return;
262
+ if (!id && !parentId) return 'su';
263
+ if (hasChildren || dataStatus === 'add') {
264
+ record.dispalyCode = '';
265
+ return record.permissionCode;
266
+ }
267
+ return record.permissionCode;
268
+ };
269
+
270
+ const onSubmit = () => {
271
+ xForm.value.validate(async valid => {
272
+ if (!valid) {
273
+ loading.value = true;
274
+ let resData;
275
+ const { record, dataStatus } = props;
276
+ if (dataStatus === 'add') {
277
+ record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
278
+ const [err, data]: [Error, any] = await to(serviceApi.post(url, [record]));
279
+ if (!err && !['0', '5'].includes(record.menuCategory) && authority.value.length) {
280
+ const dataList = authority.value.map((auth, idx) => {
281
+ return {
282
+ permissionCode: record.permissionCode + '.' + auth,
283
+ parentId: data[0].id,
284
+ menuName: getAuthName(auth),
285
+ menuType: 1,
286
+ enabled: '1',
287
+ sort: (idx + 1) * 10
288
+ };
289
+ });
290
+ const [err, res] = await to(serviceApi.post(url, dataList));
291
+ if (!err) {
292
+ // props.record.children.push(...res);
293
+ resData = res[0];
294
+ }
295
+ }
296
+ loading.value = false;
297
+ } else {
298
+ record.permissionCode = record.dispalyCode;
299
+ await to(serviceApi.put(url, [record]));
300
+ loading.value = false;
301
+ resData = record;
302
+ }
303
+ handleClose('submit', resData);
304
+ }
305
+ });
306
+ };
307
+ const getAuthName = code => {
308
+ const auth = {
309
+ fetch: t('message.btn.fetch'),
310
+ add: t('message.btn.add'),
311
+ edit: t('message.btn.edit'),
312
+ del: t('message.btn.delete'),
313
+ export: t('message.btn.export')
314
+ };
315
+ return auth[code];
316
+ };
317
+ const getLovList = code => {
318
+ return dictData[code]?.children.map(m => {
319
+ m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
320
+ return m;
321
+ });
322
+ };
323
+ // 抽屉关闭
324
+ function handleClose(type, data?) {
325
+ emit('close', type, data);
326
+ }
327
+ </script>
328
+
329
+ <style lang="scss">
330
+ .u-menu-prefix.vxe-input {
331
+ height: 34px;
332
+ }
333
+
334
+ .u-menu-prefix.vxe-input .vxe-input--prefix {
335
+ top: 1px;
336
+ width: 150px;
337
+ height: 24px;
338
+ text-align: center;
339
+ background-color: #f5f7fa;
340
+ border-right: 1px solid #dcdfe6;
341
+ }
342
+
343
+ .u-menu-prefix.vxe-input .vxe-input--inner {
344
+ border: 1px solid #dcdfe6;
345
+ }
346
+
347
+ .ut-menu-wrapper {
348
+ .el-drawer__header {
349
+ margin-bottom: 16px;
350
+ }
351
+
352
+ .el-drawer__body {
353
+ margin-bottom: 12px;
354
+ overflow: auto;
355
+ }
356
+
357
+ .el-divider {
358
+ margin: 15px 0;
359
+ }
360
+ }
361
+
362
+ .menu-icon {
363
+ display: flex;
364
+ flex-wrap: wrap;
365
+ width: 100%;
366
+
367
+ li {
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ width: 36px;
372
+ height: 36px;
373
+ margin: 0 2px;
374
+ margin-top: 5px;
375
+ cursor: pointer;
376
+ border: 1px solid #ddd;
377
+ }
378
+
379
+ .active-icon {
380
+ color: #fff;
381
+ background-color: #59bfc1;
382
+ }
383
+ }
384
+ </style>