@utogether/udp-core 1.0.1-beta.1 → 1.0.1-beta.11

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 (147) hide show
  1. package/build/plugins.ts +39 -32
  2. package/dist/{403-Dp617CWX.js → 403-Dsgsr2M-.js} +1 -1
  3. package/dist/{404-Cz_Axb6Y.js → 404-DmPHEfqM.js} +1 -1
  4. package/dist/{500-BGCtRNse.js → 500-OYEgHR2a.js} +1 -1
  5. package/dist/{AuthorityInfo-DGGfm7IS.js → AuthorityInfo-B1H1txG-.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BUlmQtjQ.js +100 -0
  7. package/dist/{Company-IV3GTnzY.js → Company-C8ojgx93.js} +3 -3
  8. package/dist/{CompanyPanel-qV-_VtoL.js → CompanyPanel-Dageer1t.js} +16 -16
  9. package/dist/{Department-B3W-OxW8.js → Department-Dr94_85I.js} +3 -3
  10. package/dist/{DepartmentPanel-Cw3OWxE7.js → DepartmentPanel-Bc5r1HpT.js} +1 -1
  11. package/dist/{DesignPanel-BFxR2fHJ.js → DesignPanel-CcWt1Myp.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-DljbeFba.js → DesignPanel.vue_vue_type_style_index_0_lang-CKA6nx1l.js} +24 -26
  13. package/dist/DictView-BHj6wexC.js +110 -0
  14. package/dist/InvOrganization-DP3Le9g-.js +72 -0
  15. package/dist/Org-BRGHTwsw.js +39 -0
  16. package/dist/{Preview-BlDMmpdR.js → Preview-CqMaUD_3.js} +1 -1
  17. package/dist/{ReportDefine-Cub_85LA.js → ReportDefine-PEQdTCOY.js} +1 -1
  18. package/dist/{ReportDesign-hFhq5UVE.js → ReportDesign-CB4bv8ba.js} +43 -43
  19. package/dist/{ReportQuery-ChkWEyxT.js → ReportQuery-B7t4lMK0.js} +1 -1
  20. package/dist/{ReportQueryFrom-KVyD_8Dj.js → ReportQueryFrom-VBxUIMRJ.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CLNODquq.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-HeLA4Qs5.js} +1 -1
  22. package/dist/{ReportTemplate-ag9NDvh2.js → ReportTemplate-DNkv7F5p.js} +28 -28
  23. package/dist/{Role-_q3lQ8CZ.js → Role-BGfTpZK4.js} +6 -6
  24. package/dist/{RoleAssign-DZb9IRsm.js → RoleAssign-DrKFWZzA.js} +8 -8
  25. package/dist/{RolePanel-CsLsz-Ds.js → RolePanel-3lvRh7aS.js} +1 -1
  26. package/dist/{RolePanel-BQb1LlhD.js → RolePanel-BRI5QYe4.js} +1 -1
  27. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-BXKZb7yt.js +132 -0
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-BrnRgHEk.js → RolePanel.vue_vue_type_script_setup_true_lang-Cci_Ysty.js} +44 -38
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-CaFKRwXu.js → ScrollPanel.vue_vue_type_style_index_0_lang-BmId6zzA.js} +21 -21
  30. package/dist/{Staff-BSf9Ypbk.js → Staff-Dr0dq3fW.js} +3 -3
  31. package/dist/{StaffInfo-BNKasyMF.js → StaffInfo-_N9g2hPa.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DDZ7ukd0.js → StaffInfo.vue_vue_type_script_setup_true_lang-DiTJY2ug.js} +11 -11
  33. package/dist/{StaffPanel-Bpq0WVlH.js → StaffPanel-mxJQiW3G.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-BhiJ0Q-Q.js → StaffPanel.vue_vue_type_script_setup_true_lang-GRGn-5t6.js} +2 -2
  35. package/dist/{SysUser-FAABuNti.js → SysUser-DgA19hZE.js} +2 -2
  36. package/dist/{SysUserPanel-PxJeOgHm.js → SysUserPanel-Bc85z5_K.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-BHDrP1Pk.js +294 -0
  38. package/dist/{SystemMenu-C-7NAGon.js → SystemMenu-Be-gFIie.js} +26 -26
  39. package/dist/{UserInfo-ClXKtyGo.js → UserInfo-BCYuwFmr.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-8N7P4Hl7.js → UserInfo.vue_vue_type_style_index_0_lang-B1lgokO6.js} +39 -37
  41. package/dist/{childView-C_HmDQNd.js → childView-DhcBr1UA.js} +1 -1
  42. package/dist/{childView-uUlBcTza.js → childView-Dk4zZoXd.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-Ckjmw6wJ.js → childView.vue_vue_type_style_index_0_lang-CVnLnl03.js} +40 -40
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-y0sDvYx5.js → childView.vue_vue_type_style_index_0_lang-D4GYVhOc.js} +1 -1
  45. package/dist/{code-rule-AgCVDKFy.js → code-rule-BSwPwuAL.js} +9 -10
  46. package/dist/core.es.js +14 -11
  47. package/dist/{cron-task-C6FgQxTi.js → cron-task-T1ztyra7.js} +1 -1
  48. package/dist/{frameView-BDgISK7N.js → frameView-BDgngiBq.js} +1 -1
  49. package/dist/img/l_img.svg +1 -1
  50. package/dist/img/minicolors.png +0 -0
  51. package/dist/img/v_img.svg +1 -1
  52. package/dist/index-BSj2AtVL.js +4468 -0
  53. package/dist/{layoutView-yb3DV2DQ.js → layoutView-i7dLLBzJ.js} +1181 -1176
  54. package/dist/{login-RRpljbkm.js → login-K5Ludp8x.js} +105 -113
  55. package/dist/{login-log-CvVnyGi3.js → login-log-kqKzKTto.js} +1 -1
  56. package/dist/{lov-view-C9-rjzZR.js → lov-view-lAexiucu.js} +2 -2
  57. package/dist/{menuInfo-CzPQyFhp.js → menuInfo-BaN5YZPp.js} +1 -1
  58. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-BumXunCg.js → menuInfo.vue_vue_type_style_index_0_lang-yI4QOYxG.js} +100 -97
  59. package/dist/{pda-app-Dvy3U-b6.js → pda-app-DEtDXFvM.js} +211 -197
  60. package/dist/{resource-Fy0lFkSV.js → resource-Bztmz7pn.js} +15 -15
  61. package/dist/{su-welcome-DYvSCUST.js → su-welcome-Bx8nBPi9.js} +109 -110
  62. package/dist/sys-config-nvrtYGgi.js +290 -0
  63. package/dist/udp-core.css +2 -2
  64. package/dist/{utogether-CjmJiHoE.js → utogether-yPnwDAIH.js} +1 -1
  65. package/index.ts +40 -36
  66. package/package.json +18 -18
  67. package/src/App.vue +65 -70
  68. package/src/api/index.ts +31 -31
  69. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  70. package/src/components/SuScrollTree/ScrollPanel.vue +3 -3
  71. package/src/components/udp/count-down.vue +536 -0
  72. package/src/components/udp/flip-down/FlipCard/flip-card.vue +251 -0
  73. package/src/components/udp/flip-down/FlipCard/interfaces.ts +4 -0
  74. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +113 -0
  75. package/src/components/udp/form-upload.vue +414 -64
  76. package/src/components/udp/form.vue +112 -0
  77. package/src/components/udp/grid.vue +495 -0
  78. package/src/components/udp/index.ts +10 -4
  79. package/src/components/udp/lov.vue +388 -0
  80. package/src/components/udp/modal-form.vue +13 -3
  81. package/src/components/udp/modal-grid.vue +298 -0
  82. package/src/components/udp/upload.vue +423 -0
  83. package/src/components/udp/utils.ts +447 -40
  84. package/src/directives/permission/index.ts +1 -1
  85. package/src/layout/components/lay-navbar/index.vue +239 -237
  86. package/src/layout/components/lay-panel/index.vue +150 -150
  87. package/src/layout/components/lay-search/index.vue +25 -25
  88. package/src/layout/components/lay-select-org/index.vue +64 -69
  89. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  90. package/src/layout/components/lay-sidebar/horizontal.vue +190 -191
  91. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  92. package/src/layout/components/lay-sidebar/sidebar-logo.vue +92 -98
  93. package/src/layout/components/lay-tag/index.vue +625 -625
  94. package/src/layout/hooks/useNav.ts +173 -173
  95. package/src/layout/layoutView.vue +215 -215
  96. package/src/main.ts +119 -109
  97. package/src/plugins/i18n/en.ts +302 -289
  98. package/src/plugins/i18n/zh.ts +349 -337
  99. package/src/plugins/vxe-table/index.ts +53 -46
  100. package/src/plugins/vxe-table/render.tsx +956 -817
  101. package/src/router/index.ts +177 -183
  102. package/src/router/modules/remaining.ts +58 -83
  103. package/src/store/modules/permission.ts +1 -4
  104. package/src/style/button.scss +85 -78
  105. package/src/style/tailwind.css +1 -68
  106. package/src/style/vxetable.scss +44 -11
  107. package/src/utils/authority/index.ts +1 -1
  108. package/src/utils/{http → udp/http}/index.ts +283 -297
  109. package/src/utils/{http → udp/http}/types.d.ts +8 -5
  110. package/src/utils/udp/useRender.ts +17 -6
  111. package/src/views/login/login-view.vue +300 -314
  112. package/src/views/organization/company/CompanyPanel.vue +259 -259
  113. package/src/views/organization/inv-org/InvOrganization.vue +68 -54
  114. package/src/views/organization/org/Org.vue +9 -5
  115. package/src/views/system/menu/SystemMenu.vue +183 -197
  116. package/src/views/system/menu/menuInfo.vue +363 -371
  117. package/src/views/system/role/AuthorityInfo.vue +19 -15
  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 +287 -291
  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/su-welcome.vue +3 -3
  132. package/src/views/ulogin/login.vue +12 -8
  133. package/src/views/upms/user/login-log.vue +1 -1
  134. package/src/views/urpt/design/DesignPanel.vue +507 -526
  135. package/src/views/urpt/design/ReportDesign.vue +15 -19
  136. package/src/views/urpt/static-resource/resource.vue +3 -3
  137. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  138. package/types/global.d.ts +2 -1
  139. package/vite.config.ts +6 -2
  140. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BqccGW7v.js +0 -102
  141. package/dist/DictView-C-i7e4hZ.js +0 -95
  142. package/dist/InvOrganization-cfT6riGU.js +0 -260
  143. package/dist/Org-CA7vTDIF.js +0 -35
  144. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-cmW7zBLu.js +0 -126
  145. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-njefUln5.js +0 -288
  146. package/dist/index-DzOzUkf6.js +0 -3388
  147. package/dist/sys-config-DJ1vNQTy.js +0 -277
@@ -1,371 +1,363 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-17 16:44:08
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-16 16:45:56
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 { VxeFormPropTypes } from 'vxe-table';
159
- import to from 'await-to-js';
160
- import { templateRef } from '@vueuse/core';
161
- import { useSystemStoreHook } from '../../../store/modules/system';
162
- import { getServiceApi } from '../../../api';
163
-
164
- interface IProps {
165
- show: boolean;
166
- record: IRecord;
167
- dataStatus?: string;
168
- direction?: string;
169
- }
170
-
171
- const dictData = useSystemStoreHook().getDataDict;
172
-
173
- const props = withDefaults(defineProps<IProps>(), {
174
- show: false,
175
- record: (): IRecord => {
176
- return {};
177
- },
178
- dataStatus: 'detail',
179
- direction: 'rtl'
180
- });
181
-
182
- watch(
183
- () => props.show,
184
- () => {
185
- prefixCode.value = props.show && getPrefixCode();
186
- }
187
- );
188
-
189
- const serviceApi = getServiceApi();
190
-
191
- const { t } = useI18n();
192
- const rules: VxeFormPropTypes.Rules = {
193
- menuCode: [
194
- {
195
- required: true,
196
- message: `${t('message.required')}${t('message.menuCode')}`
197
- }
198
- ],
199
- menuName: [
200
- {
201
- required: true,
202
- message: `${t('message.required')}${t('message.menuName')}`
203
- }
204
- ],
205
- menuPath: [
206
- {
207
- required: true,
208
- message: `${t('message.required')}${t('message.menuPath')}`
209
- }
210
- ],
211
- frameSrc: [
212
- {
213
- required: true,
214
- message: `${t('message.required')}${t('message.externalURI')}`
215
- }
216
- ],
217
- i18nField: [
218
- {
219
- required: true,
220
- message: `${t('message.required')}${t('message.i18nField')}`
221
- }
222
- ],
223
- dispalyCode: [
224
- {
225
- required: true,
226
- message: `${t('message.required')}${t('message.permissionCode')}`
227
- }
228
- ],
229
- menuCategory: [
230
- {
231
- required: true,
232
- message: `${t('message.required')}${t('message.menuType')}`
233
- }
234
- ]
235
- };
236
-
237
- const xForm = templateRef<any>('xForm', null);
238
- const loading = ref(false);
239
- const prefixCode = ref('');
240
- const authority = ref(['fetch']);
241
-
242
- const url = '/uums/menu';
243
-
244
- const emit = defineEmits<{
245
- (e: 'close', type): void;
246
- }>();
247
-
248
- const getPrefixCode = () => {
249
- const { record, dataStatus } = props;
250
- const { id, parentId, hasChildren } = record;
251
- if (dataStatus === 'update') return;
252
- if (!id && !parentId) return 'su';
253
- if (hasChildren || dataStatus === 'add') {
254
- record.dispalyCode = '';
255
- return record.permissionCode;
256
- }
257
- return record.permissionCode;
258
- };
259
-
260
- const onSubmit = () => {
261
- xForm.value.validate(async valid => {
262
- if (!valid) {
263
- loading.value = true;
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
- await to(serviceApi.post(url, dataList));
280
- // if (!err && record.children?.length) {
281
- // // props.record.children.push(...res);
282
- // }
283
- }
284
- loading.value = false;
285
- } else {
286
- await to(serviceApi.put(url, [record]));
287
- loading.value = false;
288
- }
289
- handleClose('submit');
290
- }
291
- });
292
- };
293
- const getAuthName = code => {
294
- const auth = {
295
- fetch: t('message.btn.fetch'),
296
- add: t('message.btn.add'),
297
- edit: t('message.btn.edit'),
298
- del: t('message.btn.delete'),
299
- export: t('message.btn.export')
300
- };
301
- return auth[code];
302
- };
303
- const getLovList = code => {
304
- return dictData[code]?.children.map(m => {
305
- m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
306
- return m;
307
- });
308
- };
309
- // 抽屉关闭
310
- function handleClose(type) {
311
- emit('close', type);
312
- }
313
- </script>
314
-
315
- <style lang="scss">
316
- .u-menu-prefix.vxe-input {
317
- height: 34px;
318
- }
319
-
320
- .u-menu-prefix.vxe-input .vxe-input--prefix {
321
- top: 1px;
322
- width: 150px;
323
- height: 24px;
324
- text-align: center;
325
- background-color: #f5f7fa;
326
- border-right: 1px solid #dcdfe6;
327
- }
328
-
329
- .u-menu-prefix.vxe-input .vxe-input--inner {
330
- padding-left: 160px;
331
- border: 1px solid #dcdfe6;
332
- }
333
-
334
- .ut-menu-wrapper {
335
- .el-drawer__header {
336
- margin-bottom: 16px;
337
- }
338
-
339
- .el-drawer__body {
340
- margin-bottom: 12px;
341
- overflow: auto;
342
- }
343
-
344
- .el-divider {
345
- margin: 15px 0;
346
- }
347
- }
348
-
349
- .menu-icon {
350
- display: flex;
351
- flex-wrap: wrap;
352
- width: 100%;
353
-
354
- li {
355
- display: flex;
356
- align-items: center;
357
- justify-content: center;
358
- width: 36px;
359
- height: 36px;
360
- margin: 0 2px;
361
- margin-top: 5px;
362
- cursor: pointer;
363
- border: 1px solid #ddd;
364
- }
365
-
366
- .active-icon {
367
- color: #fff;
368
- background-color: #59bfc1;
369
- }
370
- }
371
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-17 16:44:08
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-08-01 17:38:53
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
+ v-if="['0', '5'].includes(record.menuCategory)"
107
+ :title="$t('message.redirect')"
108
+ :item-render="{ name: '$input' }"
109
+ field="redirect"
110
+ span="24"
111
+ />
112
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.sort')" span="24">
113
+ <template #default="{ data }">
114
+ <vxe-input v-model="data.sort" type="number" step="10" clearable />
115
+ </template>
116
+ </vxe-form-item>
117
+ <vxe-form-item
118
+ v-if="dataStatus === 'add' && ['2', '1'].includes(record.menuCategory)"
119
+ :title="$t('message.btn.auth')"
120
+ >
121
+ <template #default>
122
+ <vxe-checkbox-group v-model="authority">
123
+ <vxe-checkbox label="add" :content="$t('message.btn.add')" />
124
+ <vxe-checkbox label="del" :content="$t('message.btn.delete')" />
125
+ <vxe-checkbox label="edit" :content="$t('message.btn.edit')" />
126
+ <vxe-checkbox label="fetch" :content="$t('message.btn.fetch')" />
127
+ <vxe-checkbox label="export" :content="$t('message.btn.export')" />
128
+ </vxe-checkbox-group>
129
+ </template>
130
+ </vxe-form-item>
131
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.icon')" span="24">
132
+ <template #default="{ data }">
133
+ <ut-icon-select v-model="data.icon" />
134
+ </template>
135
+ </vxe-form-item>
136
+ </vxe-form>
137
+ <el-divider />
138
+ <el-row type="flex" justify="end" style="padding-right: 22px">
139
+ <ut-button content="cancel" status="warning" @tap="handleClose" />
140
+ <ut-button content="confirm" status="primary" @tap="onSubmit" />
141
+ </el-row>
142
+ </el-drawer>
143
+ </div>
144
+ </template>
145
+ <script setup lang="ts">
146
+ import { useI18n } from 'vue-i18n';
147
+ import { ref, watch } from 'vue';
148
+ import to from 'await-to-js';
149
+ import { templateRef } from '@vueuse/core';
150
+ import { useSystemStoreHook } from '../../../store/modules/system';
151
+ import { getServiceApi } from '../../../api';
152
+
153
+ interface IProps {
154
+ show: boolean;
155
+ record: IRecord;
156
+ dataStatus?: string;
157
+ direction?: string;
158
+ }
159
+
160
+ const dictData = useSystemStoreHook().getDataDict;
161
+
162
+ const props = withDefaults(defineProps<IProps>(), {
163
+ show: false,
164
+ record: (): IRecord => {
165
+ return {};
166
+ },
167
+ dataStatus: 'detail',
168
+ direction: 'rtl'
169
+ });
170
+
171
+ watch(
172
+ () => props.show,
173
+ () => {
174
+ prefixCode.value = props.show && getPrefixCode();
175
+ }
176
+ );
177
+
178
+ const serviceApi = getServiceApi();
179
+
180
+ const { t } = useI18n();
181
+ const rules = {
182
+ menuCode: [
183
+ {
184
+ required: true,
185
+ message: `${t('message.required')}${t('message.menuCode')}`
186
+ }
187
+ ],
188
+ menuName: [
189
+ {
190
+ required: true,
191
+ message: `${t('message.required')}${t('message.menuName')}`
192
+ }
193
+ ],
194
+ menuPath: [
195
+ {
196
+ required: true,
197
+ message: `${t('message.required')}${t('message.menuPath')}`
198
+ }
199
+ ],
200
+ frameSrc: [
201
+ {
202
+ required: true,
203
+ message: `${t('message.required')}${t('message.externalURI')}`
204
+ }
205
+ ],
206
+ i18nField: [
207
+ {
208
+ required: true,
209
+ message: `${t('message.required')}${t('message.i18nField')}`
210
+ }
211
+ ],
212
+ dispalyCode: [
213
+ {
214
+ required: true,
215
+ message: `${t('message.required')}${t('message.permissionCode')}`
216
+ }
217
+ ],
218
+ menuCategory: [
219
+ {
220
+ required: true,
221
+ message: `${t('message.required')}${t('message.menuType')}`
222
+ }
223
+ ]
224
+ };
225
+
226
+ const xForm = templateRef<any>('xForm', null);
227
+ const loading = ref(false);
228
+ const prefixCode = ref('');
229
+ const authority = ref(['fetch']);
230
+
231
+ const url = '/uums/menu';
232
+
233
+ const emit = defineEmits<{
234
+ (e: 'close', type, data?): void;
235
+ }>();
236
+
237
+ const getPrefixCode = () => {
238
+ const { record, dataStatus } = props;
239
+ const { id, parentId, hasChildren } = record;
240
+ if (dataStatus === 'update') return;
241
+ if (!id && !parentId) return 'su';
242
+ if (hasChildren || dataStatus === 'add') {
243
+ record.dispalyCode = '';
244
+ return record.permissionCode;
245
+ }
246
+ return record.permissionCode;
247
+ };
248
+
249
+ const onSubmit = () => {
250
+ xForm.value.validate(async valid => {
251
+ if (!valid) {
252
+ loading.value = true;
253
+ let resData;
254
+ const { record, dataStatus } = props;
255
+ if (dataStatus === 'add') {
256
+ record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
257
+ const [err, data]: [Error, any] = await to(serviceApi.post(url, [record]));
258
+ if (!err && !['0', '5'].includes(record.menuCategory) && authority.value.length) {
259
+ const dataList = authority.value.map((auth, idx) => {
260
+ return {
261
+ permissionCode: record.permissionCode + '.' + auth,
262
+ parentId: data[0].id,
263
+ menuName: getAuthName(auth),
264
+ menuType: 1,
265
+ enabled: '1',
266
+ sort: (idx + 1) * 10
267
+ };
268
+ });
269
+ const [err, res] = await to(serviceApi.post(url, dataList));
270
+ if (!err) {
271
+ // props.record.children.push(...res);
272
+ resData = res[0];
273
+ }
274
+ }
275
+ loading.value = false;
276
+ } else {
277
+ record.permissionCode = record.dispalyCode;
278
+ await to(serviceApi.put(url, [record]));
279
+ loading.value = false;
280
+ resData = record;
281
+ }
282
+ handleClose('submit', resData);
283
+ }
284
+ });
285
+ };
286
+ const getAuthName = code => {
287
+ const auth = {
288
+ fetch: t('message.btn.fetch'),
289
+ add: t('message.btn.add'),
290
+ edit: t('message.btn.edit'),
291
+ del: t('message.btn.delete'),
292
+ export: t('message.btn.export')
293
+ };
294
+ return auth[code];
295
+ };
296
+ const getLovList = code => {
297
+ return dictData[code]?.children.map(m => {
298
+ m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
299
+ return m;
300
+ });
301
+ };
302
+ // 抽屉关闭
303
+ function handleClose(type, data) {
304
+ emit('close', type, data);
305
+ }
306
+ </script>
307
+
308
+ <style lang="scss">
309
+ .u-menu-prefix.vxe-input {
310
+ height: 34px;
311
+ }
312
+
313
+ .u-menu-prefix.vxe-input .vxe-input--prefix {
314
+ top: 1px;
315
+ width: 150px;
316
+ height: 24px;
317
+ text-align: center;
318
+ background-color: #f5f7fa;
319
+ border-right: 1px solid #dcdfe6;
320
+ }
321
+
322
+ .u-menu-prefix.vxe-input .vxe-input--inner {
323
+ border: 1px solid #dcdfe6;
324
+ }
325
+
326
+ .ut-menu-wrapper {
327
+ .el-drawer__header {
328
+ margin-bottom: 16px;
329
+ }
330
+
331
+ .el-drawer__body {
332
+ margin-bottom: 12px;
333
+ overflow: auto;
334
+ }
335
+
336
+ .el-divider {
337
+ margin: 15px 0;
338
+ }
339
+ }
340
+
341
+ .menu-icon {
342
+ display: flex;
343
+ flex-wrap: wrap;
344
+ width: 100%;
345
+
346
+ li {
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ width: 36px;
351
+ height: 36px;
352
+ margin: 0 2px;
353
+ margin-top: 5px;
354
+ cursor: pointer;
355
+ border: 1px solid #ddd;
356
+ }
357
+
358
+ .active-icon {
359
+ color: #fff;
360
+ background-color: #59bfc1;
361
+ }
362
+ }
363
+ </style>