@utogether/udp-core 1.0.1-beta.2 → 1.0.1-beta.20

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 (159) hide show
  1. package/build/plugins.ts +8 -1
  2. package/dist/{403-BBQoJwTM.js → 403-Bz5EJPLA.js} +1 -1
  3. package/dist/{404-BbJPSIWM.js → 404-ClOnaj9V.js} +1 -1
  4. package/dist/{500-BtFL9R4M.js → 500-DCUfhV7Y.js} +1 -1
  5. package/dist/{AuthorityInfo-DhiwCeLN.js → AuthorityInfo-q6E-js1r.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BM52QDgn.js +100 -0
  7. package/dist/{Company-CGqmslx-.js → Company-BSShW3Q4.js} +3 -3
  8. package/dist/{CompanyPanel-hlDsxD-6.js → CompanyPanel-Dl8eOYLk.js} +26 -26
  9. package/dist/{Department-BZyJtacc.js → Department-CVIxAnUN.js} +3 -3
  10. package/dist/{DepartmentPanel-D-a_EBFt.js → DepartmentPanel-Sa3IDl4z.js} +25 -25
  11. package/dist/{DesignPanel-Bl4luWDV.js → DesignPanel-DnRipagE.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-I8C3iGvz.js → DesignPanel.vue_vue_type_style_index_0_lang-DGNyp3Vl.js} +28 -30
  13. package/dist/DictView-uf2K9A1d.js +109 -0
  14. package/dist/InvOrganization-CG9VCpXl.js +74 -0
  15. package/dist/Org-W2CBN1B8.js +39 -0
  16. package/dist/{Preview-pHD84xqI.js → Preview-DPBxdDvW.js} +2 -2
  17. package/dist/{ReportDefine-DnnCNQWS.js → ReportDefine-Dsx9VM-I.js} +1 -1
  18. package/dist/{ReportDesign-BnI_Q4pg.js → ReportDesign-DiIGfte0.js} +43 -43
  19. package/dist/{ReportQuery-Dby2MmtM.js → ReportQuery-9A4Bfs1M.js} +1 -1
  20. package/dist/{ReportQueryFrom-Blm1N8P1.js → ReportQueryFrom-M5qLoGAa.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CnG_Ybnt.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-OQ9pUCKP.js} +1 -1
  22. package/dist/{ReportTemplate-D65RXRY_.js → ReportTemplate-C34FWAuK.js} +28 -28
  23. package/dist/{Role-eFZoTpXc.js → Role-jG3VTeOF.js} +6 -6
  24. package/dist/{RoleAssign-D9-Y3UNz.js → RoleAssign-BfHpCequ.js} +9 -9
  25. package/dist/{RolePanel-DlFw6HSf.js → RolePanel-DW9pNl0L.js} +1 -1
  26. package/dist/{RolePanel-CoUOc3sX.js → RolePanel-xRN2-rkk.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Clwk-MHw.js → RolePanel.vue_vue_type_script_setup_true_lang-BVEHqEq9.js} +44 -38
  28. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-C0rTy6vZ.js +132 -0
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-M2FQJwPU.js → ScrollPanel.vue_vue_type_style_index_0_lang-D65sJYWT.js} +23 -23
  30. package/dist/{Staff-DFBLCsAd.js → Staff-BqBVEjau.js} +3 -3
  31. package/dist/{StaffInfo-d2CK0oBA.js → StaffInfo-DXeyyEFL.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-4m8wK9tq.js → StaffInfo.vue_vue_type_script_setup_true_lang-Dg0iYgRf.js} +16 -16
  33. package/dist/{StaffPanel-D6aWLKN3.js → StaffPanel-iE-8VtUm.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-C7YT2CVb.js → StaffPanel.vue_vue_type_script_setup_true_lang-BrrvE1xm.js} +2 -2
  35. package/dist/{SysUser-BdZvYxQH.js → SysUser-DSZyW30i.js} +2 -2
  36. package/dist/{SysUserPanel-BIVa6LLr.js → SysUserPanel-CbiG6GQF.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-B1Y1fmBe.js +298 -0
  38. package/dist/{SystemMenu-C-5VKlHK.js → SystemMenu-DreuWY-a.js} +33 -33
  39. package/dist/{UserInfo-DqXCRZts.js → UserInfo-DXrzKAim.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-N3TwfpPx.js → UserInfo.vue_vue_type_style_index_0_lang-C44E20b4.js} +41 -39
  41. package/dist/{childView-B2lSsqS3.js → childView-VCidWgY6.js} +1 -1
  42. package/dist/{childView-DRUNqgjI.js → childView-k5IkJOBr.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-B9XBDDU_.js → childView.vue_vue_type_style_index_0_lang-C6ftwwvZ.js} +1 -1
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-oGriyFTv.js → childView.vue_vue_type_style_index_0_lang-DmG82dVB.js} +43 -43
  45. package/dist/{code-rule-DZC9T6cl.js → code-rule-7WQMabpW.js} +13 -15
  46. package/dist/core.es.js +18 -10
  47. package/dist/{cron-task-BJwPeA5F.js → cron-task-D1t56MSu.js} +11 -11
  48. package/dist/{frameView-C6wkvok-.js → frameView-CWsIFBgU.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-DxWAYxai.js +5495 -0
  53. package/dist/{layoutView-CeJBpZb_.js → layoutView-DLpHSner.js} +1564 -1559
  54. package/dist/{log-in-e7D5Ss1P.js → log-in-CpGqc33f.js} +5 -4
  55. package/dist/{log-out--RRncZhN.js → log-out-D1b4VRMZ.js} +30 -24
  56. package/dist/login-OjDiQmz8.js +249 -0
  57. package/dist/{login-log-CvVnyGi3.js → login-log-BNRXLeMi.js} +4 -3
  58. package/dist/{lov-view-DRF-99U4.js → lov-view-D28X6m3k.js} +5 -5
  59. package/dist/{menuInfo-3Sjvs9nM.js → menuInfo-DwPB6rHz.js} +1 -1
  60. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-DrQ560nm.js → menuInfo.vue_vue_type_style_index_0_lang-l5DNRfb7.js} +34 -32
  61. package/dist/{pda-app-B9tn7jdv.js → pda-app-Bdms2PRY.js} +202 -188
  62. package/dist/{resource-BqnxbQNe.js → resource-y6SHrHoq.js} +18 -18
  63. package/dist/{su-welcome-VwifUK_O.js → su-welcome-D9G6EuK2.js} +118 -120
  64. package/dist/sys-config-DFnGHiFc.js +355 -0
  65. package/dist/udp-core.css +1 -9
  66. package/dist/utogether-MlnyYtNS.js +4 -0
  67. package/index.ts +17 -5
  68. package/package.json +1 -1
  69. package/src/App.vue +2 -7
  70. package/src/api/http.ts +1 -4
  71. package/src/api/index.ts +5 -3
  72. package/src/api/user.ts +2 -2
  73. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  74. package/src/components/SuScrollTree/ScrollPanel.vue +170 -175
  75. package/src/components/udp/form/form.vue +109 -0
  76. package/src/components/udp/grid/index.vue +509 -0
  77. package/src/components/udp/index.ts +4 -4
  78. package/src/components/udp/utils.ts +405 -40
  79. package/src/directives/permission/index.ts +1 -1
  80. package/src/layout/components/lay-navbar/index.vue +9 -7
  81. package/src/layout/components/lay-panel/index.vue +3 -3
  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/breadCrumb.vue +1 -1
  85. package/src/layout/components/lay-sidebar/horizontal.vue +4 -5
  86. package/src/layout/components/lay-sidebar/mixNav.vue +6 -4
  87. package/src/layout/components/lay-sidebar/sidebar-logo.vue +94 -98
  88. package/src/layout/components/lay-tag/index.vue +596 -625
  89. package/src/layout/hooks/useTag.ts +223 -233
  90. package/src/layout/layoutView.vue +215 -215
  91. package/src/layout/types.ts +3 -2
  92. package/src/main.ts +39 -31
  93. package/src/plugins/i18n/en.ts +26 -13
  94. package/src/plugins/i18n/zh.ts +35 -16
  95. package/src/plugins/vxe-table/index.ts +67 -4
  96. package/src/plugins/vxe-table/render.tsx +945 -817
  97. package/src/router/index.ts +186 -183
  98. package/src/router/modules/remaining.ts +1 -26
  99. package/src/router/utils.ts +393 -377
  100. package/src/store/modules/app.ts +1 -3
  101. package/src/store/modules/multiTags.ts +110 -109
  102. package/src/store/modules/permission.ts +113 -103
  103. package/src/store/modules/system.ts +1 -3
  104. package/src/style/button.scss +10 -3
  105. package/src/style/login.css +1 -1
  106. package/src/style/tailwind.css +1 -68
  107. package/src/style/vxetable.scss +348 -256
  108. package/src/utils/authority/index.ts +1 -1
  109. package/src/utils/index.ts +3 -1
  110. package/src/utils/propTypes.ts +1 -6
  111. package/src/views/login/login-view.vue +6 -20
  112. package/src/views/organization/company/CompanyPanel.vue +2 -2
  113. package/src/views/organization/department/DepartmentPanel.vue +269 -283
  114. package/src/views/organization/inv-org/InvOrganization.vue +23 -9
  115. package/src/views/organization/org/Org.vue +9 -5
  116. package/src/views/system/menu/SystemMenu.vue +183 -197
  117. package/src/views/system/menu/menuInfo.vue +8 -18
  118. package/src/views/system/role/AuthorityInfo.vue +19 -15
  119. package/src/views/system/role/Role.vue +1 -5
  120. package/src/views/system/role/RolePanel.vue +11 -2
  121. package/src/views/system/role/UserInfo.vue +11 -9
  122. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  123. package/src/views/system/role-assign/RolePanel.vue +12 -9
  124. package/src/views/system/sys/sys-config.vue +66 -21
  125. package/src/views/system/sysUser/SysUserPanel.vue +44 -43
  126. package/src/views/uapp/pda/pda-app.vue +48 -16
  127. package/src/views/udev/coderule/code-rule.vue +120 -121
  128. package/src/views/udev/dict/DictView.vue +16 -4
  129. package/src/views/udev/dict/childView.vue +8 -8
  130. package/src/views/ufile/aggregation/File.vue +5 -5
  131. package/src/views/ufile/file/water-mark.vue +14 -14
  132. package/src/views/uhome/components/menu-favorite.vue +314 -331
  133. package/src/views/uhome/su-welcome.vue +3 -3
  134. package/src/views/ulogin/login.vue +19 -12
  135. package/src/views/upms/interface/log-in.vue +100 -106
  136. package/src/views/upms/interface/log-out.vue +2 -8
  137. package/src/views/upms/user/login-log.vue +54 -60
  138. package/src/views/urpt/design/DesignPanel.vue +16 -35
  139. package/src/views/urpt/design/Preview.vue +1 -0
  140. package/src/views/urpt/design/ReportDesign.vue +17 -23
  141. package/src/views/urpt/static-resource/resource.vue +3 -3
  142. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  143. package/types/global.d.ts +4 -9
  144. package/vite.config.ts +6 -2
  145. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-Duyweh89.js +0 -102
  146. package/dist/DictView-B4a7Hs1X.js +0 -95
  147. package/dist/InvOrganization-q4T3y8dQ.js +0 -260
  148. package/dist/Org-BTGTrAVz.js +0 -35
  149. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DKHgNWQP.js +0 -126
  150. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-BsBKpYR7.js +0 -288
  151. package/dist/index-DZc3qRTx.js +0 -2650
  152. package/dist/login-BOxwzwdB.js +0 -252
  153. package/dist/sys-config-C0-gSBFO.js +0 -277
  154. package/dist/utogether-Di1byIum.js +0 -182
  155. package/src/components/udp/form-upload.vue +0 -183
  156. package/src/components/udp/modal-form.vue +0 -180
  157. package/src/utils/http/index.ts +0 -297
  158. package/src/utils/http/types.d.ts +0 -46
  159. package/src/utils/udp/useRender.ts +0 -420
@@ -2,7 +2,7 @@
2
2
  * @Author: wei.li
3
3
  * @Date: 2021-11-29 11:32:07
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-04-29 10:22:16
5
+ * @LastEditTime: 2025-09-05 10:49:38
6
6
  * @Description: 库存组织
7
7
  -->
8
8
  <template>
@@ -21,8 +21,7 @@ export default { name: 'InvOrganization' };
21
21
  <script setup lang="tsx">
22
22
  import { ref, reactive } from 'vue';
23
23
  import to from 'await-to-js';
24
- // import { useRender } from '@utogether/utils';
25
- import { useRender } from '../../../utils/udp/useRender';
24
+ import { useRender } from '@utogether/utils';
26
25
  import { getServiceApi } from '../../../api';
27
26
 
28
27
  const url = '/uums/cusOrganization';
@@ -30,20 +29,35 @@ const url = '/uums/cusOrganization';
30
29
  const xgrid = ref(null);
31
30
  const renderHook = useRender();
32
31
 
33
- const formItems = [{ field: 'organizationCode' }, { field: 'organizationName' }];
32
+ const formItems = [
33
+ { field: 'organizationCode', title: 'message.udp.organizationCode' },
34
+ { field: 'organizationName', title: 'message.udp.organizationName' }
35
+ ];
34
36
 
35
37
  // 列字段
36
38
  const columns = [
37
39
  { type: 'checkbox', width: 40, align: 'center' },
38
- { field: 'organizationCode', width: 120, required: true, editRender: renderHook.renderInput() },
39
- { field: 'organizationName', minWidth: 120, required: true, editRender: renderHook.renderInput() },
40
- { field: 'orgName', minWidth: 170, required: true, editRender: renderHook.renderBU() },
41
- { field: 'orgCode', width: 110 },
40
+ {
41
+ field: 'organizationCode',
42
+ width: 120,
43
+ title: 'message.udp.organizationCode',
44
+ required: true,
45
+ editRender: renderHook.renderInput()
46
+ },
47
+ {
48
+ field: 'organizationName',
49
+ minWidth: 120,
50
+ title: 'message.udp.organizationName',
51
+ required: true,
52
+ editRender: renderHook.renderInput()
53
+ },
54
+ { field: 'orgName', minWidth: 170, title: 'message.udp.orgName', required: true, editRender: renderHook.renderBU() },
55
+ { field: 'orgCode', width: 110, title: 'message.udp.orgCode' },
42
56
  { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleClick) }
43
57
  ];
44
58
 
45
59
  // 启用/禁用
46
- async function handleClick(row) {
60
+ async function handleClick({ row }) {
47
61
  const [err] = await to(getServiceApi().put(url, [row]));
48
62
  !err && xgrid.value.refreshData();
49
63
  }
@@ -24,14 +24,18 @@ const url = '/uums/org';
24
24
  const xgrid = ref(null);
25
25
  const renderHook = useRender();
26
26
 
27
- const formItems = [{ field: 'orgCode' }, { field: 'orgName' }, { field: 'orgAlias' }];
27
+ const formItems = [
28
+ { field: 'orgCode', title: 'message.udp.orgCode' },
29
+ { field: 'orgName', title: 'message.udp.orgName' },
30
+ { field: 'orgAlias', title: 'message.udp.orgAlias' }
31
+ ];
28
32
  // 列字段
29
33
  const columns = [
30
34
  { type: 'checkbox', width: 50, align: 'center' },
31
- { field: 'orgCode', required: true, editRender: { name: '$input' } },
32
- { field: 'orgName', required: true, minWidth: 200, editRender: { name: '$input' } },
33
- { field: 'orgAlias', editRender: { name: '$input' } },
34
- { field: 'orgDesc', editRender: { name: '$input' } },
35
+ { field: 'orgCode', title: 'message.udp.orgCode', required: true, editRender: { name: '$input' } },
36
+ { field: 'orgName', title: 'message.udp.orgName', required: true, minWidth: 200, editRender: { name: '$input' } },
37
+ { field: 'orgAlias', title: 'message.udp.orgAlias', editRender: { name: '$input' } },
38
+ { field: 'orgDesc', title: 'message.udp.orgDesc', editRender: { name: '$input' } },
35
39
  { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleClick) }
36
40
  ];
37
41
 
@@ -1,197 +1,183 @@
1
- <template>
2
- <div class="page-content">
3
- <ut-grid
4
- ref="xgrid"
5
- :tree-config="{
6
- childrenField: 'children',
7
- lazy: true,
8
- hasChild: 'hasChildren',
9
- loadMethod: loadChildrenMethod,
10
- iconOpen: 'ri-checkbox-indeterminate-line ri-lg',
11
- iconClose: 'ri-add-box-line ri-lg'
12
- }"
13
- :columns="columns"
14
- :url="url"
15
- :stripe="false"
16
- mode="form"
17
- @toolbarButtonClick="handleToolClick"
18
- />
19
- <MenuInfo
20
- :show="data.showDrawer"
21
- :record="data.record"
22
- :data-status="data.dataStatus"
23
- @close="onClose"
24
- />
25
- <AuthorityPanel :show="data.showAuthority" :record="data.record" @close="onClose" />
26
- </div>
27
- </template>
28
-
29
- <script lang="tsx">
30
- export default { name: 'SystemMenu' };
31
- </script>
32
- <script setup lang="tsx">
33
- import { useI18n } from 'vue-i18n';
34
- import { ref, reactive } from 'vue';
35
- import MenuInfo from './menuInfo.vue';
36
- import AuthorityPanel from './AuthorityPanel.vue';
37
- import { clone } from 'xe-utils';
38
- import to from 'await-to-js';
39
- import { VxeUI } from 'vxe-pc-ui';
40
- import { useRender } from '@utogether/utils';
41
- import { getServiceApi } from '../../../api';
42
-
43
- const data = reactive<IRecord>({
44
- record: {},
45
- dataList: [],
46
- submitLoading: false,
47
- showDrawer: false,
48
- dataStatus: '',
49
- total: 0,
50
- listQuery: {
51
- pageSize: 10,
52
- pageNum: 1
53
- }
54
- });
55
-
56
- const { t } = useI18n();
57
-
58
- const renderHook = useRender();
59
-
60
- const serviceApi = getServiceApi();
61
-
62
- const xgrid = ref(null);
63
-
64
- const url = '/uums/menu';
65
-
66
- let row;
67
-
68
- // const buttons = [{ code: 'add', status: 'u-cyan', icon: 'plus', auth: 'add' }];
69
-
70
- const columns = [
71
- { type: 'checkbox', width: 50, align: 'center' },
72
- { field: 'menuName', width: 180, treeNode: true },
73
- { field: 'menuNameEn', width: 140 },
74
- { field: 'sort', width: 70 },
75
- { field: 'menuCode', width: 140 },
76
- { field: 'permissionCode', minWidth: 180 },
77
- {
78
- field: 'menuCategory',
79
- title: 'message.menuType',
80
- formatter: ['formatDict', 'SU.MENU.TYPE'],
81
- width: 100
82
- },
83
- { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleUpdate) },
84
- {
85
- field: 'operate',
86
- width: 140,
87
- fixed: 'right',
88
- slots: {
89
- default: ({ row }) => {
90
- const type = row.menuType;
91
- const addCmp = (
92
- <ut-button status="u-cyan" icon="ri-add-fill" content="add" onTap={() => handleAdd(row)} />
93
- );
94
- const authCmp = (
95
- <ut-button icon="ri-lock-fill" content="auth" onTap={() => handleAuthorityPanel(row)} />
96
- );
97
- return [
98
- <>
99
- {!type ? (
100
- <>
101
- <ut-button
102
- status="success"
103
- icon="ri-edit-box-line"
104
- content="edit"
105
- onTap={() => handleEdit(row)}
106
- />
107
- {['0', '5'].includes(row.menuCategory) ? addCmp : authCmp}
108
- </>
109
- ) : null}
110
- </>
111
- ];
112
- }
113
- }
114
- }
115
- ];
116
-
117
- // const resetListQuery = () => {
118
- // data.listQuery.pageSize = 99;
119
- // data.listQuery.pageNum = 1;
120
- // getDataList();
121
- // };
122
-
123
- // const getDataList = async () => {
124
- // const res = (await serviceApi('sys/listMenus', data.listQuery)) as IResponseData;
125
- // data.dataList = res.list;
126
- // data.total = res.total;
127
- // };
128
-
129
- const handleToolClick = ({ code }) => {
130
- code === 'add' && handleAdd();
131
- code === 'del' && handleDel();
132
- };
133
-
134
- // 异步加载子节点
135
- const loadChildrenMethod = async ({ row }: any) => {
136
- const data = (await serviceApi.get(url, { parentId: row.id })) as IResponseData;
137
- return new Promise(resolve => {
138
- resolve(data.list);
139
- });
140
- };
141
-
142
- // 新增子类型
143
- // menuType:保持原有不懂, 0:菜单 1,数据权限
144
- // 新增menuCategory: 0、根目录 1、菜单 2、内部链接3、外部链接
145
- const handleAdd = (record?: IRecord) => {
146
- data.showDrawer = true;
147
- data.dataStatus = 'add';
148
- data.record.dispalyCode = record?.permissionCode; // 前缀
149
- data.record.permissionCode = record?.permissionCode;
150
- // data.record.menuType = !record || !record.parentId ? '0' : '1';
151
- data.record.menuType = '0';
152
- data.record.menuCategory = !record ? '0' : '';
153
- data.record.parentId = record?.id;
154
- data.record.hasChildren = record?.hasChildren;
155
- data.record.children = data.record.children || [];
156
- console.log(data.record);
157
- row = record;
158
- };
159
-
160
- // 编辑
161
- const handleEdit = (record: IRecord) => {
162
- data.showDrawer = true;
163
- data.dataStatus = 'update';
164
- data.record = clone(record, true);
165
- data.record.menuType = data.record.menuType.toString();
166
- data.record.dispalyCode = record.permissionCode;
167
- };
168
-
169
- // 启用/禁用
170
- async function handleUpdate({ row }) {
171
- await serviceApi.put(url, [row]);
172
- xgrid.value.refreshData();
173
- }
174
- // 删除
175
- const handleDel = async () => {
176
- const type = await VxeUI.modal.confirm(t('message.delRecord'));
177
- const records = xgrid.value.getInstance().getCheckboxRecords();
178
- if (type === 'confirm') {
179
- const [err] = await to(serviceApi.delete(url, records));
180
- }
181
- };
182
-
183
- const handleAuthorityPanel = record => {
184
- data.showAuthority = true;
185
- data.dataStatus = 'update';
186
- data.record = clone(record, true);
187
- data.record.menuType = data.record.menuType.toString();
188
- data.record.dispalyCode = record.permissionCode;
189
- };
190
-
191
- const onClose = (type?, record?) => {
192
- type === 'submit' && row && xgrid.value.getInstance().reloadTreeExpand(row || record);
193
- data.record = {};
194
- data.showDrawer = false;
195
- data.showAuthority = false;
196
- };
197
- </script>
1
+ <template>
2
+ <div class="page-content">
3
+ <ut-grid
4
+ ref="xgrid"
5
+ :tree-config="{
6
+ childrenField: 'children',
7
+ lazy: true,
8
+ hasChild: 'hasChildren',
9
+ loadMethod: loadChildrenMethod,
10
+ iconOpen: 'ri-checkbox-indeterminate-line ri-lg',
11
+ iconClose: 'ri-add-box-line ri-lg'
12
+ }"
13
+ :columns="columns"
14
+ :url="url"
15
+ :stripe="false"
16
+ mode="form"
17
+ @toolbarButtonClick="handleToolClick"
18
+ />
19
+ <MenuInfo :show="data.showDrawer" :record="data.record" :data-status="data.dataStatus" @close="onClose" />
20
+ <AuthorityPanel :show="data.showAuthority" :record="data.record" @close="onClose" />
21
+ </div>
22
+ </template>
23
+
24
+ <script lang="tsx">
25
+ export default { name: 'SystemMenu' };
26
+ </script>
27
+ <script setup lang="tsx">
28
+ import { useI18n } from 'vue-i18n';
29
+ import { ref, reactive } from 'vue';
30
+ import MenuInfo from './menuInfo.vue';
31
+ import AuthorityPanel from './AuthorityPanel.vue';
32
+ import { clone } from 'xe-utils';
33
+ import to from 'await-to-js';
34
+ import { VxeUI } from 'vxe-pc-ui';
35
+ import { useRender } from '@utogether/utils';
36
+ import { getServiceApi } from '../../../api';
37
+
38
+ const data = reactive<IRecord>({
39
+ record: {},
40
+ dataList: [],
41
+ submitLoading: false,
42
+ showDrawer: false,
43
+ dataStatus: '',
44
+ total: 0,
45
+ listQuery: {
46
+ pageSize: 10,
47
+ pageNum: 1
48
+ }
49
+ });
50
+
51
+ const { t } = useI18n();
52
+
53
+ const renderHook = useRender();
54
+
55
+ const serviceApi = getServiceApi();
56
+
57
+ const xgrid = ref(null);
58
+
59
+ const url = '/uums/menu';
60
+
61
+ let row;
62
+
63
+ // const buttons = [{ code: 'add', status: 'u-cyan', icon: 'plus', auth: 'add' }];
64
+
65
+ const columns = [
66
+ { type: 'checkbox', width: 50, align: 'center' },
67
+ { field: 'menuName', width: 180, treeNode: true },
68
+ { field: 'menuNameEn', width: 140 },
69
+ { field: 'sort', width: 70 },
70
+ { field: 'menuCode', width: 140 },
71
+ { field: 'permissionCode', minWidth: 180 },
72
+ {
73
+ field: 'menuCategory',
74
+ title: 'message.menuType',
75
+ formatter: ['formatDict', 'SU.MENU.TYPE'],
76
+ width: 100
77
+ },
78
+ { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleUpdate) },
79
+ {
80
+ field: 'operate',
81
+ width: 140,
82
+ fixed: 'right',
83
+ slots: {
84
+ default: ({ row }) => {
85
+ const type = row.menuType;
86
+ const addCmp = <ut-button status="u-cyan" icon="ri-add-fill" content="add" onTap={() => handleAdd(row)} />;
87
+ const authCmp = <ut-button icon="ri-lock-fill" content="auth" onTap={() => handleAuthorityPanel(row)} />;
88
+ return [
89
+ <>
90
+ {!type ? (
91
+ <>
92
+ <ut-button status="success" icon="ri-edit-box-line" content="edit" onTap={() => handleEdit(row)} />
93
+ {['0', '5'].includes(row.menuCategory) ? addCmp : authCmp}
94
+ </>
95
+ ) : null}
96
+ </>
97
+ ];
98
+ }
99
+ }
100
+ }
101
+ ];
102
+
103
+ // const resetListQuery = () => {
104
+ // data.listQuery.pageSize = 99;
105
+ // data.listQuery.pageNum = 1;
106
+ // getDataList();
107
+ // };
108
+
109
+ // const getDataList = async () => {
110
+ // const res = (await serviceApi('sys/listMenus', data.listQuery)) as IResponseData;
111
+ // data.dataList = res.list;
112
+ // data.total = res.total;
113
+ // };
114
+
115
+ const handleToolClick = ({ code }) => {
116
+ code === 'add' && handleAdd();
117
+ code === 'del' && handleDel();
118
+ };
119
+
120
+ // 异步加载子节点
121
+ const loadChildrenMethod = async ({ row }: any) => {
122
+ const data = (await serviceApi.get(url, { parentId: row.id })) as IResponseData;
123
+ return new Promise(resolve => {
124
+ resolve(data.list);
125
+ });
126
+ };
127
+
128
+ // 新增子类型
129
+ // menuType:保持原有不懂, 0:菜单 1,数据权限
130
+ // 新增menuCategory: 0、根目录 1、菜单 2、内部链接3、外部链接
131
+ const handleAdd = (record?: IRecord) => {
132
+ data.showDrawer = true;
133
+ data.dataStatus = 'add';
134
+ data.record.dispalyCode = record?.permissionCode; // 前缀
135
+ data.record.permissionCode = record?.permissionCode;
136
+ // data.record.menuType = !record || !record.parentId ? '0' : '1';
137
+ data.record.menuType = '0';
138
+ data.record.menuCategory = !record ? '0' : '';
139
+ data.record.parentId = record?.id;
140
+ data.record.hasChildren = record?.hasChildren;
141
+ data.record.children = data.record.children || [];
142
+ console.log(data.record);
143
+ row = record;
144
+ };
145
+
146
+ // 编辑
147
+ const handleEdit = (record: IRecord) => {
148
+ data.showDrawer = true;
149
+ data.dataStatus = 'update';
150
+ data.record = clone(record, true);
151
+ data.record.menuType = data.record.menuType.toString();
152
+ data.record.dispalyCode = record.permissionCode;
153
+ };
154
+
155
+ // 启用/禁用
156
+ async function handleUpdate({ row }) {
157
+ await serviceApi.put(url, [row]);
158
+ xgrid.value.refreshData();
159
+ }
160
+ // 删除
161
+ const handleDel = async () => {
162
+ const type = await VxeUI.modal.confirm(t('message.delRecord'));
163
+ const records = xgrid.value.getInstance().getCheckboxRecords();
164
+ if (type === 'confirm') {
165
+ const [err] = await to(serviceApi.delete(url, records));
166
+ }
167
+ };
168
+
169
+ const handleAuthorityPanel = record => {
170
+ data.showAuthority = true;
171
+ data.dataStatus = 'update';
172
+ data.record = clone(record, true);
173
+ data.record.menuType = data.record.menuType.toString();
174
+ data.record.dispalyCode = record.permissionCode;
175
+ };
176
+
177
+ const onClose = (type?, record?) => {
178
+ type === 'submit' && (row || record) && xgrid.value.getInstance().reloadTreeExpand(row || record);
179
+ data.record = {};
180
+ data.showDrawer = false;
181
+ data.showAuthority = false;
182
+ };
183
+ </script>
@@ -2,7 +2,7 @@
2
2
  * @Author: wei.li
3
3
  * @Date: 2021-11-17 16:44:08
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-17 18:47:22
5
+ * @LastEditTime: 2025-08-01 17:38:53
6
6
  * @Description: file content
7
7
  -->
8
8
 
@@ -24,16 +24,11 @@
24
24
  title-colon
25
25
  title-align="right"
26
26
  title-width="110"
27
+ transfer
27
28
  >
28
- <vxe-form-item
29
- v-if="record.menuType === '0'"
30
- :title="$t('message.menuType')"
31
- field="menuCategory"
32
- span="24"
33
- >
29
+ <vxe-form-item v-if="record.menuType === '0'" :title="$t('message.menuType')" field="menuCategory" span="24">
34
30
  <template #default="{ data }">
35
- <vxe-select v-model="data.menuCategory" :disabled="data.menuCategory === '0'">
36
- <!-- v-for="dict in dictData['SU.MENU.TYPE']?.children" -->
31
+ <vxe-select v-model="data.menuCategory" :disabled="data.menuCategory === '0'" :transfer="false">
37
32
  <vxe-option
38
33
  v-for="dict in getLovList('SU.MENU.TYPE')"
39
34
  :key="dict.dictCode"
@@ -65,12 +60,7 @@
65
60
  field="menuCode"
66
61
  span="24"
67
62
  />
68
- <vxe-form-item
69
- :title="$t('message.menuName')"
70
- :item-render="{ name: '$input' }"
71
- field="menuName"
72
- span="24"
73
- />
63
+ <vxe-form-item :title="$t('message.menuName')" :item-render="{ name: '$input' }" field="menuName" span="24" />
74
64
  <vxe-form-item
75
65
  :title="$t('message.menuNameEn')"
76
66
  field="menuNameEn"
@@ -155,7 +145,6 @@
155
145
  <script setup lang="ts">
156
146
  import { useI18n } from 'vue-i18n';
157
147
  import { ref, watch } from 'vue';
158
- import { VxeFormPropTypes } from 'vxe-table';
159
148
  import to from 'await-to-js';
160
149
  import { templateRef } from '@vueuse/core';
161
150
  import { useSystemStoreHook } from '../../../store/modules/system';
@@ -189,7 +178,7 @@ watch(
189
178
  const serviceApi = getServiceApi();
190
179
 
191
180
  const { t } = useI18n();
192
- const rules: VxeFormPropTypes.Rules = {
181
+ const rules = {
193
182
  menuCode: [
194
183
  {
195
184
  required: true,
@@ -285,8 +274,10 @@ const onSubmit = () => {
285
274
  }
286
275
  loading.value = false;
287
276
  } else {
277
+ record.permissionCode = record.dispalyCode;
288
278
  await to(serviceApi.put(url, [record]));
289
279
  loading.value = false;
280
+ resData = record;
290
281
  }
291
282
  handleClose('submit', resData);
292
283
  }
@@ -329,7 +320,6 @@ function handleClose(type, data) {
329
320
  }
330
321
 
331
322
  .u-menu-prefix.vxe-input .vxe-input--inner {
332
- padding-left: 160px;
333
323
  border: 1px solid #dcdfe6;
334
324
  }
335
325
 
@@ -2,7 +2,7 @@
2
2
  * @Author: wei.li
3
3
  * @Date: 2021-11-22 19:50:48
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-14 14:58:13
5
+ * @LastEditTime: 2025-08-12 09:02:46
6
6
  * @Description: file content
7
7
  -->
8
8
 
@@ -14,32 +14,29 @@
14
14
  :before-close="handleClose"
15
15
  direction="rtl"
16
16
  destroy-on-close
17
+ body-class="ut-draw-body"
17
18
  size="40%"
18
19
  >
19
- <div
20
- v-spinning="loading"
21
- element-loading-text="Loading..."
22
- style="position: relative; height: 80vh"
23
- >
24
- <div style="height: 85%; overflow: auto">
20
+ <div v-spinning="loading" style="position: relative; height: 100%">
21
+ <div>
25
22
  <el-tree-v2
26
23
  ref="xTree"
27
24
  :data="data.dataList"
28
25
  :props="{ children: 'children', label: 'menuName' }"
29
26
  :default-checked-keys="data.defaultCheckedKeys"
30
- :height="420"
27
+ :height="height"
31
28
  show-checkbox
32
29
  node-key="id"
33
30
  />
34
31
  </div>
35
- <div style="position: absolute; width: 100%; height: 15%">
36
- <el-divider style="margin: 16px 0" />
37
- <el-row type="flex" justify="end" style="padding-right: 20px">
38
- <ut-button content="cancel" icon="ri-close-fill" status="warning" @tap="handleClose" />
39
- <ut-button content="confirm" icon="ri-save-3-fill" status="u-cyan" @tap="onSubmit" />
40
- </el-row>
41
- </div>
42
32
  </div>
33
+ <template #footer>
34
+ <el-divider style="margin: 16px 0" />
35
+ <el-row type="flex" justify="end" style="padding-right: 20px">
36
+ <ut-button content="cancel" icon="ri-close-fill" status="warning" @tap="handleClose" />
37
+ <ut-button content="confirm" icon="ri-save-3-fill" status="u-cyan" @tap="onSubmit" />
38
+ </el-row>
39
+ </template>
43
40
  </el-drawer>
44
41
  </div>
45
42
  </template>
@@ -72,9 +69,12 @@ const data = reactive({
72
69
  defaultCheckedKeys: [] // 默认权限
73
70
  });
74
71
 
72
+ const height = window.innerHeight - 180;
73
+
75
74
  const emit = defineEmits<{
76
75
  (e: 'onClose'): void;
77
76
  }>();
77
+
78
78
  // 菜单列表
79
79
  const getDataList = async () => {
80
80
  const res = (await getServiceApi().get('/uums/menu/listMenuTree', {})) as [IRecord];
@@ -126,4 +126,8 @@ onBeforeMount(() => {
126
126
  .el-drawer__header {
127
127
  margin-bottom: 12px;
128
128
  }
129
+
130
+ .ut-draw-body {
131
+ padding: 0 12px;
132
+ }
129
133
  </style>
@@ -8,11 +8,7 @@
8
8
  <template>
9
9
  <div class="u-content-panel">
10
10
  <div class="u-left-panel">
11
- <ScrollPane
12
- :title="$t('company')"
13
- url="/uums/unit"
14
- :tree-otions="{ children: 'children', label: 'unitName' }"
15
- />
11
+ <ScrollPane :title="$t('company')" url="/uums/unit" :tree-otions="{ children: 'children', label: 'unitName' }" />
16
12
  </div>
17
13
  <div class="content">
18
14
  <role-panel />