@utogether/udp-core 1.0.1 → 1.0.3

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 (239) hide show
  1. package/build/plugins.ts +13 -2
  2. package/dist/{403-JWjatlxJ.js → 403-D6H3sArg.js} +7 -6
  3. package/dist/{404-BcdMJfPb.js → 404-DTyfysQ2.js} +14 -13
  4. package/dist/{500-bsa3F_cc.js → 500-DKaVDaBm.js} +10 -9
  5. package/dist/{AuthorityInfo-CqItgNs5.js → AuthorityInfo-DQULR69Y.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-CzAnoTnO.js +100 -0
  7. package/dist/{AuthorityPanel-BaLMwMgW.js → AuthorityPanel-BeBNiwqc.js} +1 -1
  8. package/dist/{AuthorityPanel.vue_vue_type_style_index_0_lang-C_bkqLD9.js → AuthorityPanel.vue_vue_type_style_index_0_lang-CIYmnP9-.js} +6 -6
  9. package/dist/{Company-DVff9IA7.js → Company-BWFrR-Cq.js} +3 -3
  10. package/dist/{CompanyPanel-CNrdq4XE.js → CompanyPanel-Dh814lsw.js} +16 -16
  11. package/dist/{Department-CqcpfL4i.js → Department-DagPxerl.js} +10 -10
  12. package/dist/{DepartmentPanel-Bvti4LGu.js → DepartmentPanel-BVy2YGED.js} +108 -78
  13. package/dist/{DesignPanel-CjykspE1.js → DesignPanel-DKfjfj2S.js} +1 -1
  14. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BK9EERdd.js → DesignPanel.vue_vue_type_style_index_0_lang-D-a8W08Y.js} +24 -26
  15. package/dist/DictView-CE5nEiKu.js +110 -0
  16. package/dist/InvOrganization-CZk_EbFZ.js +74 -0
  17. package/dist/Org-BO8jfnqN.js +39 -0
  18. package/dist/{Preview-Cm_7RhYU.js → Preview-DYJaP96f.js} +2 -2
  19. package/dist/{ReportDefine-CJVlQ--7.js → ReportDefine-DZXbs7iX.js} +1 -1
  20. package/dist/{ReportDesign-B0unlrkt.js → ReportDesign-CSdqOQ1D.js} +46 -46
  21. package/dist/{ReportQuery-BKuMCEvF.js → ReportQuery-_Vdt3CnA.js} +5 -5
  22. package/dist/{ReportQueryFrom-DAngMJLU.js → ReportQueryFrom-BWKddh9p.js} +1 -1
  23. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CPpwmztJ.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-DbdGwioi.js} +6 -5
  24. package/dist/{ReportTemplate-8YH3L8Pv.js → ReportTemplate-DS-DGao8.js} +26 -26
  25. package/dist/{Role-MxI30-0W.js → Role-BM0kEu7y.js} +6 -6
  26. package/dist/{RoleAssign-BzUY_y_y.js → RoleAssign-Cp05HUWn.js} +9 -9
  27. package/dist/{RolePanel-DS_TErTn.js → RolePanel-DeuHpCdK.js} +1 -1
  28. package/dist/{RolePanel-CXdcvsR5.js → RolePanel-hXeshcCZ.js} +1 -1
  29. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Ddl-A7Zh.js → RolePanel.vue_vue_type_script_setup_true_lang-Bf0pSCTN.js} +42 -36
  30. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CNyWCIJm.js +132 -0
  31. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-DnchUgIF.js → ScrollPanel.vue_vue_type_style_index_0_lang-BiKe39xG.js} +20 -20
  32. package/dist/{Staff-D7tXo_Gn.js → Staff-DLltLFMl.js} +3 -3
  33. package/dist/{StaffInfo-Bk8BY8PO.js → StaffInfo-pfELaI_i.js} +1 -1
  34. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DqKwZi5f.js → StaffInfo.vue_vue_type_script_setup_true_lang-BKKdNggm.js} +13 -13
  35. package/dist/{StaffPanel-VtpGCTIq.js → StaffPanel-D3Pk28JN.js} +1 -1
  36. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-D9HLeyKe.js +143 -0
  37. package/dist/{SysUser-D0Q6OvD7.js → SysUser-BOh7ejz3.js} +2 -2
  38. package/dist/{SysUserPanel-1_vrsANQ.js → SysUserPanel-RElVo0BV.js} +1 -1
  39. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-DoW0v5y9.js +341 -0
  40. package/dist/{SystemMenu-9PG3vESE.js → SystemMenu-DZneBqKO.js} +53 -51
  41. package/dist/{UserInfo-qgXUEGwi.js → UserInfo-D9qo_f_9.js} +1 -1
  42. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CN0C5rVk.js → UserInfo.vue_vue_type_style_index_0_lang-CY4dtMnZ.js} +35 -33
  43. package/dist/{childView-C7ZSA5fR.js → childView-CmlGxD9G.js} +1 -1
  44. package/dist/{childView-yV2QLwfA.js → childView-DStrPumM.js} +1 -1
  45. package/dist/{childView.vue_vue_type_style_index_0_lang-DdKxPGdh.js → childView.vue_vue_type_style_index_0_lang-B9k694be.js} +23 -24
  46. package/dist/childView.vue_vue_type_style_index_0_lang-Dtv1rrdP.js +177 -0
  47. package/dist/{code-rule-95K1jr-u.js → code-rule-CxzgQDH_.js} +42 -41
  48. package/dist/core.es.js +19 -10
  49. package/dist/{cron-task-DGrQwOHs.js → cron-task-kbyRTz97.js} +5 -5
  50. package/dist/flow-task-B07st2aD.js +10 -0
  51. package/dist/{frameView-7SmME93D.js → frameView-BawZlIge.js} +15 -14
  52. package/dist/img/l_img.svg +1 -1
  53. package/dist/img/minicolors.png +0 -0
  54. package/dist/img/v_img.svg +1 -1
  55. package/dist/index-nkstuOxE.js +5533 -0
  56. package/dist/{layoutView-C6WIVWGZ.js → layoutView-DVGqPJmA.js} +1776 -1764
  57. package/dist/{log-in-e7D5Ss1P.js → log-in-j2PZGLQH.js} +36 -29
  58. package/dist/log-out-DIJU-Vpf.js +130 -0
  59. package/dist/login-DvmHMcgD.js +251 -0
  60. package/dist/{login-log-CvVnyGi3.js → login-log-DJBGJVV0.js} +10 -8
  61. package/dist/{lov-view-DoF5LqFQ.js → lov-view-C-dIDLh8.js} +9 -9
  62. package/dist/{menuInfo-CNzGQwOD.js → menuInfo-D0mcKmrT.js} +1 -1
  63. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-51SYxVc_.js → menuInfo.vue_vue_type_style_index_0_lang-CbwS7aGl.js} +144 -121
  64. package/dist/pda-app-BjvyTDkw.js +710 -0
  65. package/dist/redirect-BqegffKC.js +15 -0
  66. package/dist/{resource-gVFFMO9l.js → resource-BknIxaTQ.js} +17 -17
  67. package/dist/{su-welcome-BN_s_RX_.js → su-welcome-CwtvamZC.js} +137 -139
  68. package/dist/sys-config-CCKhGcCL.js +370 -0
  69. package/dist/udp-core.css +1 -9
  70. package/dist/utogether-MlnyYtNS.js +4 -0
  71. package/index.ts +19 -6
  72. package/package.json +18 -17
  73. package/src/App.vue +2 -7
  74. package/src/api/http.ts +1 -4
  75. package/src/api/index.ts +5 -3
  76. package/src/api/user.ts +2 -2
  77. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  78. package/src/components/SuScrollTree/ScrollPanel.vue +4 -9
  79. package/src/components/udp/content/index.vue +88 -0
  80. package/src/components/udp/form/form.vue +109 -0
  81. package/src/components/udp/grid/index.vue +524 -0
  82. package/src/components/udp/index.ts +5 -4
  83. package/src/components/udp/ut-stamp-badge/index.vue +271 -0
  84. package/src/components/udp/utils.ts +408 -40
  85. package/src/directives/permission/index.ts +1 -1
  86. package/src/layout/components/lay-navbar/index.vue +9 -7
  87. package/src/layout/components/lay-panel/index.vue +3 -3
  88. package/src/layout/components/lay-search/index.vue +1 -1
  89. package/src/layout/components/lay-select-org/index.vue +4 -9
  90. package/src/layout/components/lay-setting/index.vue +503 -510
  91. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  92. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  93. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  94. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -98
  95. package/src/layout/components/lay-tag/index.vue +598 -625
  96. package/src/layout/hooks/useDataThemeChange.ts +1 -1
  97. package/src/layout/hooks/useNav.ts +176 -173
  98. package/src/layout/hooks/useTag.ts +227 -233
  99. package/src/layout/layoutView.vue +215 -215
  100. package/src/layout/types.ts +93 -92
  101. package/src/main.ts +115 -109
  102. package/src/plugins/i18n/en.ts +26 -13
  103. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  104. package/src/plugins/i18n/zh.ts +363 -337
  105. package/src/plugins/vxe-table/index.ts +116 -46
  106. package/src/plugins/vxe-table/render.tsx +950 -817
  107. package/src/router/index.ts +187 -183
  108. package/src/router/modules/flow.ts +35 -0
  109. package/src/router/modules/home.ts +32 -32
  110. package/src/router/modules/remaining.ts +1 -26
  111. package/src/router/utils.ts +420 -377
  112. package/src/store/modules/app.ts +2 -4
  113. package/src/store/modules/epTheme.ts +48 -49
  114. package/src/store/modules/multiTags.ts +15 -14
  115. package/src/store/modules/permission.ts +25 -15
  116. package/src/store/modules/system.ts +1 -3
  117. package/src/style/button.scss +11 -4
  118. package/src/style/login.css +1 -1
  119. package/src/style/tailwind.css +1 -68
  120. package/src/style/vxetable.scss +103 -11
  121. package/src/utils/authority/index.ts +1 -1
  122. package/src/utils/dataFormat/index.ts +222 -223
  123. package/src/utils/index.ts +3 -1
  124. package/src/utils/lifecycle.ts +39 -20
  125. package/src/utils/propTypes.ts +1 -6
  126. package/src/utils/storage/index.ts +2 -2
  127. package/src/utils/{http → udp/http}/index.ts +27 -30
  128. package/src/utils/{http → udp/http}/types.d.ts +2 -6
  129. package/src/views/login/login-view.vue +6 -20
  130. package/src/views/organization/company/CompanyPanel.vue +2 -2
  131. package/src/views/organization/department/Department.vue +58 -58
  132. package/src/views/organization/department/DepartmentPanel.vue +303 -283
  133. package/src/views/organization/inv-org/InvOrganization.vue +23 -9
  134. package/src/views/organization/org/Org.vue +9 -5
  135. package/src/views/organization/staff/StaffInfo.vue +127 -133
  136. package/src/views/organization/staff/StaffPanel.vue +171 -145
  137. package/src/views/system/cron/cron-task.vue +2 -12
  138. package/src/views/system/menu/AuthorityPanel.vue +2 -2
  139. package/src/views/system/menu/SystemMenu.vue +185 -191
  140. package/src/views/system/menu/menuInfo.vue +39 -23
  141. package/src/views/system/role/AuthorityInfo.vue +19 -15
  142. package/src/views/system/role/Role.vue +1 -5
  143. package/src/views/system/role/RolePanel.vue +11 -2
  144. package/src/views/system/role/UserInfo.vue +11 -9
  145. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  146. package/src/views/system/role-assign/RolePanel.vue +12 -9
  147. package/src/views/system/sys/sys-config.vue +70 -21
  148. package/src/views/system/sysUser/SysUserPanel.vue +347 -278
  149. package/src/views/uapp/pda/pda-app.vue +48 -16
  150. package/src/views/udev/coderule/code-rule.vue +132 -121
  151. package/src/views/udev/dict/DictView.vue +118 -106
  152. package/src/views/udev/dict/childView.vue +183 -222
  153. package/src/views/udev/lov/childView.vue +174 -180
  154. package/src/views/ufile/aggregation/File.vue +5 -5
  155. package/src/views/ufile/file/water-mark.vue +14 -14
  156. package/src/views/uhome/components/menu-favorite.vue +315 -331
  157. package/src/views/uhome/su-welcome.vue +319 -339
  158. package/src/views/ulogin/login.vue +325 -316
  159. package/src/views/upms/interface/log-in.vue +100 -106
  160. package/src/views/upms/interface/log-out.vue +104 -107
  161. package/src/views/upms/user/login-log.vue +54 -60
  162. package/src/views/urpt/design/DesignPanel.vue +16 -35
  163. package/src/views/urpt/design/Preview.vue +1 -0
  164. package/src/views/urpt/design/ReportDesign.vue +17 -23
  165. package/src/views/urpt/static-resource/resource.vue +3 -3
  166. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  167. package/src/views/utask/flow-task.vue +18 -0
  168. package/types/global.d.ts +231 -236
  169. package/vite.config.ts +13 -2
  170. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-32L40GY2.js +0 -102
  171. package/dist/DictView-q7kR9K--.js +0 -95
  172. package/dist/InvOrganization-DI45LqZV.js +0 -260
  173. package/dist/Org-CZju_ZiR.js +0 -35
  174. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DJKu6PXz.js +0 -126
  175. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-C3Ixs12y.js +0 -111
  176. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-C5XEmxsV.js +0 -288
  177. package/dist/childView.vue_vue_type_style_index_0_lang-bkmucBUL.js +0 -187
  178. package/dist/core.umd.js +0 -173
  179. package/dist/index-OswH7SsT.js +0 -9937
  180. package/dist/log-out--RRncZhN.js +0 -120
  181. package/dist/login-BhCMeCLS.js +0 -251
  182. package/dist/pda-app-nn3llDUx.js +0 -2209
  183. package/dist/redirect-CmMplDV4.js +0 -15
  184. package/dist/sys-config-DGutV-VX.js +0 -277
  185. package/dist/utogether-wFDCI28t.js +0 -182
  186. package/src/assets/images/empty.png +0 -0
  187. package/src/assets/images/logo.png +0 -0
  188. package/src/components/ReCountTo/README.md +0 -2
  189. package/src/components/ReCountTo/index.ts +0 -18
  190. package/src/components/ReCountTo/src/normal/index.tsx +0 -165
  191. package/src/components/ReCountTo/src/normal/props.ts +0 -37
  192. package/src/components/ReCountTo/src/rebound/index.tsx +0 -67
  193. package/src/components/ReCountTo/src/rebound/props.ts +0 -14
  194. package/src/components/ReCountTo/src/rebound/rebound.css +0 -77
  195. package/src/components/ReCropper/index.ts +0 -14
  196. package/src/components/ReCropper/src/index.tsx +0 -141
  197. package/src/components/ReFlicker/index.css +0 -39
  198. package/src/components/ReFlicker/index.ts +0 -50
  199. package/src/components/ReFlop/index.ts +0 -14
  200. package/src/components/ReFlop/src/Filpper.tsx +0 -99
  201. package/src/components/ReFlop/src/filpper.css +0 -184
  202. package/src/components/ReFlop/src/index.vue +0 -126
  203. package/src/components/ReFlowChart/index.ts +0 -24
  204. package/src/components/ReFlowChart/src/Control.vue +0 -139
  205. package/src/components/ReFlowChart/src/DataDialog.vue +0 -12
  206. package/src/components/ReFlowChart/src/NodePanel.vue +0 -151
  207. package/src/components/ReFlowChart/src/adpterForTurbo.ts +0 -160
  208. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.css +0 -49
  209. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.eot +0 -0
  210. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.js +0 -61
  211. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.json +0 -58
  212. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.svg +0 -47
  213. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.ttf +0 -0
  214. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff +0 -0
  215. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff2 +0 -0
  216. package/src/components/ReFlowChart/src/config.ts +0 -62
  217. package/src/components/ReSplitPane/index.css +0 -49
  218. package/src/components/ReSplitPane/index.tsx +0 -119
  219. package/src/components/ReSplitPane/resizer.css +0 -45
  220. package/src/components/ReSplitPane/resizer.tsx +0 -30
  221. package/src/components/SuCommon/card/components/Card.vue +0 -148
  222. package/src/components/SuCommon/card/components/DialogForm.vue +0 -127
  223. package/src/components/SuCommon/card/index.vue +0 -142
  224. package/src/components/SuCommon/icon-select/index.vue +0 -241
  225. package/src/components/SuCommon/table/index.vue +0 -208
  226. package/src/components/SuCommon/utils/index.ts +0 -103
  227. package/src/components/SuCommon/utils/slot.tsx +0 -50
  228. package/src/components/udp/form-upload.vue +0 -132
  229. package/src/components/udp/modal-form.vue +0 -180
  230. package/src/utils/udp/useRender.ts +0 -420
  231. package/src/views/components/contextmenu/basic.vue +0 -74
  232. package/src/views/components/contextmenu/context-menu.vue +0 -40
  233. package/src/views/components/contextmenu/menuDynamic.vue +0 -99
  234. package/src/views/components/contextmenu/menuGroup.vue +0 -71
  235. package/src/views/components/count-to/index.vue +0 -43
  236. package/src/views/components/cropping/index.vue +0 -59
  237. package/src/views/components/cropping/picture.jpeg +0 -0
  238. package/src/views/components/split-pane/index.vue +0 -82
  239. package/src/views/components/video/index.vue +0 -57
@@ -1,191 +1,185 @@
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
- @onClose="onClose"
24
- />
25
- <AuthorityPanel :show="data.showAuthority" :record="data.record" @onClose="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
- // const buttons = [{ code: 'add', status: 'u-cyan', icon: 'plus', auth: 'add' }];
67
-
68
- const columns = [
69
- { type: 'checkbox', width: 50, align: 'center' },
70
- { field: 'menuName', width: 180, treeNode: true },
71
- { field: 'menuNameEn', width: 140 },
72
- { field: 'sort', width: 70 },
73
- { field: 'menuCode', width: 140 },
74
- { field: 'permissionCode', minWidth: 180 },
75
- {
76
- field: 'menuCategory',
77
- title: 'message.menuType',
78
- formatter: ['formatDict', 'SU.MENU.TYPE'],
79
- width: 100
80
- },
81
- { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleUpdate) },
82
- {
83
- field: 'operate',
84
- width: 140,
85
- fixed: 'right',
86
- slots: {
87
- default: ({ row }) => {
88
- const type = row.menuType;
89
- const addCmp = (
90
- <ut-button status="u-cyan" icon="ri-add-fill" content="add" onTap={() => handleAdd(row)} />
91
- );
92
- const authCmp = (
93
- <ut-button icon="ri-lock-fill" content="auth" onTap={() => handleAuthorityPanel(row)} />
94
- );
95
- return [
96
- <>
97
- {!type ? (
98
- <>
99
- <ut-button
100
- status="success"
101
- icon="ri-edit-box-line"
102
- content="edit"
103
- onTap={() => handleEdit(row)}
104
- />
105
- {['0', '5'].includes(row.menuCategory) ? addCmp : authCmp}
106
- </>
107
- ) : null}
108
- </>
109
- ];
110
- }
111
- }
112
- }
113
- ];
114
-
115
- // const resetListQuery = () => {
116
- // data.listQuery.pageSize = 99;
117
- // data.listQuery.pageNum = 1;
118
- // getDataList();
119
- // };
120
-
121
- // const getDataList = async () => {
122
- // const res = (await serviceApi('sys/listMenus', data.listQuery)) as IResponseData;
123
- // data.dataList = res.list;
124
- // data.total = res.total;
125
- // };
126
-
127
- const handleToolClick = ({ code }) => {
128
- code === 'add' && handleAdd();
129
- code === 'del' && handleDel();
130
- };
131
-
132
- // 异步加载子节点
133
- const loadChildrenMethod = async ({ row }: any) => {
134
- const data = (await serviceApi.get(url, { parentId: row.id })) as IResponseData;
135
- return new Promise(resolve => {
136
- resolve(data.list);
137
- });
138
- };
139
-
140
- // 新增子类型
141
- // menuType:保持原有不懂, 0:菜单 1,数据权限
142
- // 新增menuCategory: 0、根目录 1、菜单 2、内部链接3、外部链接
143
- const handleAdd = (record?: IRecord) => {
144
- data.showDrawer = true;
145
- data.dataStatus = 'add';
146
- data.record.dispalyCode = record?.permissionCode; // 前缀
147
- data.record.permissionCode = record?.permissionCode;
148
- // data.record.menuType = !record || !record.parentId ? '0' : '1';
149
- data.record.menuType = '0';
150
- data.record.menuCategory = !record ? '0' : '';
151
- data.record.parentId = record?.id;
152
- data.record.hasChildren = record?.hasChildren;
153
- };
154
-
155
- // 编辑
156
- const handleEdit = (record: IRecord) => {
157
- data.showDrawer = true;
158
- data.dataStatus = 'update';
159
- data.record = clone(record, true);
160
- data.record.menuType = data.record.menuType.toString();
161
- data.record.dispalyCode = record.permissionCode;
162
- };
163
-
164
- // 启用/禁用
165
- async function handleUpdate({ row }) {
166
- await serviceApi.put(url, [row]);
167
- xgrid.value.refreshData();
168
- }
169
- // 删除
170
- const handleDel = async () => {
171
- const type = await VxeUI.modal.confirm(t('message.delRecord'));
172
- const records = xgrid.value.getInstance().getCheckboxRecords();
173
- if (type === 'confirm') {
174
- const [err] = await to(serviceApi.delete(url, records));
175
- }
176
- };
177
-
178
- const handleAuthorityPanel = record => {
179
- data.showAuthority = true;
180
- data.dataStatus = 'update';
181
- data.record = clone(record, true);
182
- data.record.menuType = data.record.menuType.toString();
183
- data.record.dispalyCode = record.permissionCode;
184
- };
185
-
186
- const onClose = () => {
187
- data.record = {};
188
- data.showDrawer = false;
189
- data.showAuthority = false;
190
- };
191
- </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', minWidth: 220, treeNode: true },
68
+ { field: 'menuNameEn', minWidth: 180 },
69
+ { field: 'sort', width: 70 },
70
+ { field: 'menuCode', minWidth: 220 },
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.showLink = 'Y';
139
+ data.record.isApprovalPage = 'N';
140
+ data.record.menuCategory = !record ? '0' : '';
141
+ data.record.parentId = record?.id;
142
+ data.record.hasChildren = record?.hasChildren;
143
+ data.record.children = data.record.children || [];
144
+ console.log(data.record);
145
+ row = record;
146
+ };
147
+
148
+ // 编辑
149
+ const handleEdit = (record: IRecord) => {
150
+ data.showDrawer = true;
151
+ data.dataStatus = 'update';
152
+ data.record = clone(record, true);
153
+ data.record.menuType = data.record.menuType.toString();
154
+ data.record.dispalyCode = record.permissionCode;
155
+ };
156
+
157
+ // 启用/禁用
158
+ async function handleUpdate({ row }) {
159
+ await serviceApi.put(url, [row]);
160
+ xgrid.value.refreshData();
161
+ }
162
+ // 删除
163
+ const handleDel = async () => {
164
+ const type = await VxeUI.modal.confirm(t('message.delRecord'));
165
+ const records = xgrid.value.getInstance().getCheckboxRecords();
166
+ if (type === 'confirm') {
167
+ const [err] = await to(serviceApi.delete(url, records));
168
+ }
169
+ };
170
+
171
+ const handleAuthorityPanel = record => {
172
+ data.showAuthority = true;
173
+ data.dataStatus = 'update';
174
+ data.record = clone(record, true);
175
+ data.record.menuType = data.record.menuType.toString();
176
+ data.record.dispalyCode = record.permissionCode;
177
+ };
178
+
179
+ const onClose = (type?, record?) => {
180
+ type === 'submit' && (row || record) && xgrid.value.getInstance().reloadTreeExpand(row || record);
181
+ data.record = {};
182
+ data.showDrawer = false;
183
+ data.showAuthority = false;
184
+ };
185
+ </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-04-08 15:43:16
5
+ * @LastEditTime: 2025-11-13 18:18:01
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"
@@ -112,6 +102,27 @@
112
102
  field="extraIcon"
113
103
  span="24"
114
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
+ />
115
126
  <vxe-form-item
116
127
  v-if="['0', '5'].includes(record.menuCategory)"
117
128
  :title="$t('message.redirect')"
@@ -155,7 +166,6 @@
155
166
  <script setup lang="ts">
156
167
  import { useI18n } from 'vue-i18n';
157
168
  import { ref, watch } from 'vue';
158
- import { VxeFormPropTypes } from 'vxe-table';
159
169
  import to from 'await-to-js';
160
170
  import { templateRef } from '@vueuse/core';
161
171
  import { useSystemStoreHook } from '../../../store/modules/system';
@@ -189,7 +199,7 @@ watch(
189
199
  const serviceApi = getServiceApi();
190
200
 
191
201
  const { t } = useI18n();
192
- const rules: VxeFormPropTypes.Rules = {
202
+ const rules = {
193
203
  menuCode: [
194
204
  {
195
205
  required: true,
@@ -242,7 +252,7 @@ const authority = ref(['fetch']);
242
252
  const url = '/uums/menu';
243
253
 
244
254
  const emit = defineEmits<{
245
- (e: 'onClose', type): void;
255
+ (e: 'close', type, data?): void;
246
256
  }>();
247
257
 
248
258
  const getPrefixCode = () => {
@@ -261,6 +271,7 @@ const onSubmit = () => {
261
271
  xForm.value.validate(async valid => {
262
272
  if (!valid) {
263
273
  loading.value = true;
274
+ let resData;
264
275
  const { record, dataStatus } = props;
265
276
  if (dataStatus === 'add') {
266
277
  record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
@@ -276,14 +287,20 @@ const onSubmit = () => {
276
287
  sort: (idx + 1) * 10
277
288
  };
278
289
  });
279
- await to(serviceApi.post(url, dataList));
290
+ const [err, res] = await to(serviceApi.post(url, dataList));
291
+ if (!err) {
292
+ // props.record.children.push(...res);
293
+ resData = res[0];
294
+ }
280
295
  }
281
296
  loading.value = false;
282
297
  } else {
298
+ record.permissionCode = record.dispalyCode;
283
299
  await to(serviceApi.put(url, [record]));
284
300
  loading.value = false;
301
+ resData = record;
285
302
  }
286
- handleClose('submit');
303
+ handleClose('submit', resData);
287
304
  }
288
305
  });
289
306
  };
@@ -304,8 +321,8 @@ const getLovList = code => {
304
321
  });
305
322
  };
306
323
  // 抽屉关闭
307
- function handleClose(type) {
308
- emit('onClose', type);
324
+ function handleClose(type, data?) {
325
+ emit('close', type, data);
309
326
  }
310
327
  </script>
311
328
 
@@ -324,7 +341,6 @@ function handleClose(type) {
324
341
  }
325
342
 
326
343
  .u-menu-prefix.vxe-input .vxe-input--inner {
327
- padding-left: 160px;
328
344
  border: 1px solid #dcdfe6;
329
345
  }
330
346
 
@@ -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 />
@@ -11,6 +11,7 @@
11
11
  ref="xgrid"
12
12
  :items="formItems"
13
13
  :columns="columns"
14
+ :check-method="checkMethod"
14
15
  url="/uums/role"
15
16
  mode="form"
16
17
  @buttonClick="onButtonClick"
@@ -39,7 +40,7 @@
39
40
  :url="url"
40
41
  :method="method"
41
42
  width="400"
42
- height="220"
43
+ height="240"
43
44
  data-status="update"
44
45
  :title="$t('message.title.authEdit')"
45
46
  @close="data.showModalView = false"
@@ -105,7 +106,7 @@ const columns = [
105
106
  // <ut-button content="edit" onTap={() => handleShowChild(row, 'update')} />
106
107
  return [
107
108
  <>
108
- <ut-button content="edit" auth="edit" onTap={() => handleEdit(row)} />
109
+ <ut-button content="edit" auth="edit" disabled={row.roleCode === 'admin'} onTap={() => handleEdit(row)} />
109
110
  <ut-button
110
111
  content="dispatchUser"
111
112
  status="warning"
@@ -174,6 +175,10 @@ const handleDispathUser = record => {
174
175
  };
175
176
  // 启用/禁用
176
177
  async function handleClick({ row }) {
178
+ if (row.roleCode === 'admin') {
179
+ row.enabled = '1';
180
+ return;
181
+ }
177
182
  await getServiceApi().put('/uums/role/singleUpdate', row);
178
183
  xgrid.value.refreshData();
179
184
  }
@@ -183,6 +188,10 @@ const onClose = () => {
183
188
  data.showAuthView = false;
184
189
  data.showUserView = false;
185
190
  };
191
+
192
+ const checkMethod = row => {
193
+ return row.roleCode !== 'admin';
194
+ };
186
195
  // 拷贝当前列表项的数据(字典类型)
187
196
  // const { clipboardRef } = useCopyToClipboard();
188
197
  // const cellDBLClickEvent: VxeTableEvents.CellDblclick = ({ row }) => {