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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/build/plugins.ts +39 -32
  2. package/dist/{403-Dp617CWX.js → 403-Ctxjn4q8.js} +1 -1
  3. package/dist/{404-Cz_Axb6Y.js → 404-W5yzyiZ9.js} +1 -1
  4. package/dist/{500-BGCtRNse.js → 500-DXuGEOm4.js} +1 -1
  5. package/dist/{AuthorityInfo-DGGfm7IS.js → AuthorityInfo-C2tflCt8.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-SVgy3HX7.js +100 -0
  7. package/dist/{Company-IV3GTnzY.js → Company-PLez5GoH.js} +3 -3
  8. package/dist/{CompanyPanel-qV-_VtoL.js → CompanyPanel-CIGaQooL.js} +16 -16
  9. package/dist/{Department-B3W-OxW8.js → Department-B9wLsXFm.js} +3 -3
  10. package/dist/{DepartmentPanel-Cw3OWxE7.js → DepartmentPanel-DSM4lTaz.js} +1 -1
  11. package/dist/{DesignPanel-BFxR2fHJ.js → DesignPanel-B6a9wW_A.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-DljbeFba.js → DesignPanel.vue_vue_type_style_index_0_lang-DtHfoDQk.js} +24 -26
  13. package/dist/DictView-DhFbQxdJ.js +110 -0
  14. package/dist/InvOrganization-D90AbR3b.js +66 -0
  15. package/dist/Org-DxBkYabD.js +39 -0
  16. package/dist/{Preview-BlDMmpdR.js → Preview-BFtRpBxw.js} +1 -1
  17. package/dist/{ReportDefine-Cub_85LA.js → ReportDefine-BIa2QryC.js} +1 -1
  18. package/dist/{ReportDesign-hFhq5UVE.js → ReportDesign-CnyjI-WD.js} +43 -43
  19. package/dist/{ReportQuery-ChkWEyxT.js → ReportQuery-BiK7yEhV.js} +1 -1
  20. package/dist/{ReportQueryFrom-KVyD_8Dj.js → ReportQueryFrom-C2rqdFTm.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CLNODquq.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Ba9HLnXQ.js} +1 -1
  22. package/dist/{ReportTemplate-ag9NDvh2.js → ReportTemplate-DdkLscP3.js} +28 -28
  23. package/dist/{Role-_q3lQ8CZ.js → Role-BrsxgK8D.js} +6 -6
  24. package/dist/{RoleAssign-DZb9IRsm.js → RoleAssign-DiqwJqDa.js} +8 -8
  25. package/dist/{RolePanel-CsLsz-Ds.js → RolePanel-BDusGyo7.js} +1 -1
  26. package/dist/{RolePanel-BQb1LlhD.js → RolePanel-Dqx5dI3f.js} +1 -1
  27. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-2Z1q_5uW.js +132 -0
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-BrnRgHEk.js → RolePanel.vue_vue_type_script_setup_true_lang-B5lUnaMI.js} +44 -38
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-CaFKRwXu.js → ScrollPanel.vue_vue_type_style_index_0_lang-vSP23fEq.js} +21 -21
  30. package/dist/{Staff-BSf9Ypbk.js → Staff-Cwi9LQiZ.js} +3 -3
  31. package/dist/{StaffInfo-BNKasyMF.js → StaffInfo-XjVtyaMv.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DDZ7ukd0.js → StaffInfo.vue_vue_type_script_setup_true_lang-wSrAuyet.js} +11 -11
  33. package/dist/{StaffPanel-Bpq0WVlH.js → StaffPanel-C-wYcFdv.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-DZNArmnC.js} +2 -2
  35. package/dist/{SysUser-FAABuNti.js → SysUser-O4tvr-Ur.js} +2 -2
  36. package/dist/{SysUserPanel-PxJeOgHm.js → SysUserPanel-B853docZ.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-DhiYYC97.js +294 -0
  38. package/dist/{SystemMenu-C-7NAGon.js → SystemMenu-CXR6mrXr.js} +26 -26
  39. package/dist/{UserInfo-ClXKtyGo.js → UserInfo-BkP8pE2a.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-8N7P4Hl7.js → UserInfo.vue_vue_type_style_index_0_lang-D4r_umjV.js} +39 -37
  41. package/dist/{childView-C_HmDQNd.js → childView-D0HwbgDT.js} +1 -1
  42. package/dist/{childView-uUlBcTza.js → childView-TRqUkSDC.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-Ckjmw6wJ.js → childView.vue_vue_type_style_index_0_lang-BzISq0Jf.js} +40 -40
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-y0sDvYx5.js → childView.vue_vue_type_style_index_0_lang-DQRgNsJY.js} +1 -1
  45. package/dist/{code-rule-AgCVDKFy.js → code-rule-BV7PQWhK.js} +9 -10
  46. package/dist/core.es.js +14 -11
  47. package/dist/{cron-task-C6FgQxTi.js → cron-task-9ZS9bi7K.js} +1 -1
  48. package/dist/{frameView-BDgISK7N.js → frameView-DE83AN50.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-DVARtten.js +2623 -0
  53. package/dist/{layoutView-yb3DV2DQ.js → layoutView-D1U-c4By.js} +111 -110
  54. package/dist/{login-log-CvVnyGi3.js → login-log-kqKzKTto.js} +1 -1
  55. package/dist/{login-RRpljbkm.js → login-sPCEiTGT.js} +106 -113
  56. package/dist/{lov-view-C9-rjzZR.js → lov-view-76NcYTYl.js} +2 -2
  57. package/dist/{menuInfo-CzPQyFhp.js → menuInfo-CxjfjFpm.js} +1 -1
  58. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-BumXunCg.js → menuInfo.vue_vue_type_style_index_0_lang-C2qahH3r.js} +100 -97
  59. package/dist/{pda-app-Dvy3U-b6.js → pda-app-BUH16bLj.js} +211 -197
  60. package/dist/{resource-Fy0lFkSV.js → resource-CCuHzoA6.js} +15 -15
  61. package/dist/{su-welcome-DYvSCUST.js → su-welcome-mRArONsd.js} +109 -110
  62. package/dist/{sys-config-DJ1vNQTy.js → sys-config-Cvt05yF6.js} +7 -7
  63. package/dist/udp-core.css +2 -2
  64. package/dist/{utogether-CjmJiHoE.js → utogether-Dm_VBQHR.js} +1 -1
  65. package/index.ts +40 -36
  66. package/package.json +1 -1
  67. package/src/App.vue +65 -70
  68. package/src/api/index.ts +1 -1
  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 +11 -2
  81. package/src/components/udp/modal-grid.vue +288 -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 +1 -1
  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-sidebar/breadCrumb.vue +1 -1
  89. package/src/layout/components/lay-tag/index.vue +625 -625
  90. package/src/layout/layoutView.vue +215 -215
  91. package/src/main.ts +23 -13
  92. package/src/plugins/i18n/en.ts +302 -289
  93. package/src/plugins/i18n/zh.ts +348 -337
  94. package/src/plugins/vxe-table/index.ts +53 -46
  95. package/src/plugins/vxe-table/render.tsx +956 -817
  96. package/src/router/index.ts +187 -183
  97. package/src/router/modules/remaining.ts +58 -83
  98. package/src/style/button.scss +85 -78
  99. package/src/style/tailwind.css +1 -68
  100. package/src/style/vxetable.scss +44 -11
  101. package/src/utils/authority/index.ts +1 -1
  102. package/src/utils/{http → udp/http}/index.ts +8 -24
  103. package/src/utils/{http → udp/http}/types.d.ts +8 -5
  104. package/src/utils/udp/useRender.ts +17 -6
  105. package/src/views/login/login-view.vue +2 -2
  106. package/src/views/organization/company/CompanyPanel.vue +259 -259
  107. package/src/views/organization/inv-org/InvOrganization.vue +2 -3
  108. package/src/views/organization/org/Org.vue +9 -5
  109. package/src/views/system/menu/SystemMenu.vue +183 -197
  110. package/src/views/system/menu/menuInfo.vue +363 -371
  111. package/src/views/system/role/AuthorityInfo.vue +19 -15
  112. package/src/views/system/role/Role.vue +1 -5
  113. package/src/views/system/role/RolePanel.vue +11 -2
  114. package/src/views/system/role/UserInfo.vue +195 -193
  115. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  116. package/src/views/system/role-assign/RolePanel.vue +139 -136
  117. package/src/views/system/sys/sys-config.vue +1 -1
  118. package/src/views/system/sysUser/SysUserPanel.vue +278 -278
  119. package/src/views/uapp/pda/pda-app.vue +208 -176
  120. package/src/views/udev/dict/DictView.vue +118 -106
  121. package/src/views/udev/dict/childView.vue +7 -7
  122. package/src/views/udev/lov/lov-view.vue +91 -91
  123. package/src/views/ufile/aggregation/File.vue +5 -5
  124. package/src/views/ufile/file/water-mark.vue +14 -14
  125. package/src/views/uhome/su-welcome.vue +3 -3
  126. package/src/views/ulogin/login.vue +14 -9
  127. package/src/views/upms/user/login-log.vue +1 -1
  128. package/src/views/urpt/design/DesignPanel.vue +507 -526
  129. package/src/views/urpt/design/ReportDesign.vue +15 -19
  130. package/src/views/urpt/static-resource/resource.vue +3 -3
  131. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  132. package/types/global.d.ts +2 -1
  133. package/vite.config.ts +6 -2
  134. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BqccGW7v.js +0 -102
  135. package/dist/DictView-C-i7e4hZ.js +0 -95
  136. package/dist/InvOrganization-cfT6riGU.js +0 -260
  137. package/dist/Org-CA7vTDIF.js +0 -35
  138. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-cmW7zBLu.js +0 -126
  139. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-njefUln5.js +0 -288
  140. package/dist/index-DzOzUkf6.js +0 -3388
@@ -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 }) => {
@@ -1,193 +1,195 @@
1
- <template>
2
- <div class="u-dict-config_wrapper">
3
- <el-drawer
4
- :model-value="show"
5
- :title="$t('message.title.authUser', { role: record.roleName })"
6
- :before-close="handleClose"
7
- direction="rtl"
8
- destroy-on-close
9
- size="80%"
10
- >
11
- <vxe-grid ref="xgrid" v-bind="gridOptions" v-on="gridEvents" />
12
- <ut-modal-grid
13
- v-if="showModalView"
14
- url="/uums/user/listUserToRole"
15
- :default-params="{ roleId: record.id }"
16
- :items="modalFormItems"
17
- :columns="modalColum"
18
- :show-footer="true"
19
- :editable="false"
20
- width="60%"
21
- @close="showModalView = false"
22
- @confirm="onConfirm"
23
- />
24
- </el-drawer>
25
- </div>
26
- </template>
27
- <script setup lang="ts">
28
- import { onBeforeMount, reactive, ref } from 'vue';
29
- import { VxeGridProps, VxeGridListeners, VxeGridInstance } from 'vxe-table';
30
- import to from 'await-to-js';
31
- import { getServiceApi } from '../../../api';
32
-
33
- interface IProps {
34
- record: IRecord;
35
- show: boolean;
36
- direction?: string;
37
- }
38
-
39
- const props = withDefaults(defineProps<IProps>(), {
40
- record: (): IRecord => {
41
- return {};
42
- },
43
- show: false,
44
- direction: 'rtl'
45
- });
46
- const loading = ref(false);
47
- const showModalView = ref(false);
48
-
49
- const serviceApi = getServiceApi();
50
-
51
- const emit = defineEmits<{
52
- (e: 'onClose'): void;
53
- }>();
54
- const formItems: IFormItemProps[] = [
55
- {
56
- field: 'userName',
57
- title: 'message.userCode',
58
- span: 8,
59
- itemRender: { name: '$input' }
60
- },
61
- {
62
- field: 'name',
63
- title: 'message.userName',
64
- span: 8,
65
- itemRender: { name: '$input' }
66
- },
67
- {
68
- span: 8,
69
- align: 'right',
70
- itemRender: {
71
- name: '$buttons',
72
- children: [
73
- {
74
- props: {
75
- type: 'submit',
76
- content: 'message.btn.search',
77
- icon: 'ri-search-line',
78
- status: 'primary'
79
- }
80
- },
81
- { props: { type: 'reset', icon: 'ri-refresh-line', content: 'message.btn.reset' } }
82
- ]
83
- }
84
- }
85
- ];
86
- // 列字段
87
- const columns: ITableColProps[] = [
88
- { type: 'checkbox', width: 50, align: 'center' },
89
- {
90
- field: 'userName',
91
- title: 'message.userCode'
92
- },
93
- {
94
- field: 'name',
95
- title: 'message.userName'
96
- },
97
- {
98
- field: 'enabled',
99
- title: 'message.enabled',
100
- width: 70,
101
- editRender: {
102
- name: '$select',
103
- options: [
104
- { label: '启用', value: '1' },
105
- { label: '禁用', value: '0' }
106
- ],
107
- defaultValue: '1'
108
- }
109
- }
110
- ];
111
- // 新增/删除/保存
112
- const buttons = [
113
- { code: 'add', name: 'message.btn.add', status: 'u-cyan', icon: 'ri-add-line' },
114
- { code: 'delete', name: 'message.btn.del', status: 'danger', icon: 'ri-delete-bin-5-fill' }
115
- ];
116
- const modalFormItems = [
117
- { field: 'userName', title: 'message.userCode' },
118
- { field: 'name', title: 'message.userName' }
119
- ];
120
- const modalColum = [
121
- { type: 'checkbox', width: 40 },
122
- { field: 'userName', title: 'message.userCode' },
123
- { field: 'name', title: 'message.userName' },
124
- { field: 'enabled', width: 70, formatter: ['formatDict', 'SU.ENABLE'] }
125
- ];
126
- const xgrid = ref({} as VxeGridInstance);
127
- const gridOptions = reactive<VxeGridProps>({
128
- height: 560,
129
- border: true,
130
- pagerConfig: {},
131
- toolbarConfig: { buttons, perfect: true },
132
- loading: false,
133
- formConfig: { titleWidth: 100, titleAlign: 'right', items: formItems },
134
- // data: props.record.children,
135
- proxyConfig: {
136
- form: true, // 查询是需要启用表单代理
137
- ajax: {
138
- // 接收 Promise
139
- query: ({ page, form }) => {
140
- const queryParams = Object.assign({}, form);
141
- queryParams.id = props.record.id;
142
- queryParams.pageNum = page.currentPage;
143
- queryParams.pageSize = page.pageSize;
144
- return serviceApi.get('/uums/user/listRoleUsers', queryParams);
145
- },
146
- // body 对象: { removeRecords }
147
- delete: ({ body: { removeRecords } }) => {
148
- const param = {
149
- roleId: props.record.id,
150
- userIds: removeRecords.map(v => v.id).join()
151
- };
152
- return serviceApi.delete('/uums/role/deleteRoleUsers', param);
153
- }
154
- }
155
- },
156
- columns
157
- });
158
- // grid点击事件监听
159
- const gridEvents: VxeGridListeners = {
160
- toolbarButtonClick({ code }) {
161
- if (code === 'add') {
162
- showModalView.value = true;
163
- }
164
- }
165
- };
166
- // 监听modal table确定
167
- const onConfirm = async records => {
168
- const param = { userIds: '', roleId: props.record.id };
169
- param.userIds = records.map(m => m.id).join(',');
170
- gridOptions.loading = true;
171
- const [err] = await to(serviceApi.post('/uums/role/addUserRole', param));
172
- gridOptions.loading = false;
173
- if (!err) {
174
- xgrid.value.commitProxy('query');
175
- showModalView.value = false;
176
- }
177
- };
178
- // 抽屉关闭
179
- function handleClose() {
180
- emit('onClose');
181
- }
182
- onBeforeMount(() => {
183
- loading.value = true;
184
- });
185
- </script>
186
-
187
- <style lang="scss">
188
- .u-dict-config_wrapper {
189
- .el-drawer__header {
190
- margin-bottom: 0;
191
- }
192
- }
193
- </style>
1
+ <template>
2
+ <div class="u-dict-config_wrapper">
3
+ <el-drawer
4
+ :model-value="show"
5
+ :title="$t('message.title.authUser', { role: record.roleName })"
6
+ :before-close="handleClose"
7
+ direction="rtl"
8
+ destroy-on-close
9
+ size="80%"
10
+ >
11
+ <vxe-grid ref="xgrid" v-bind="gridOptions" v-on="gridEvents" />
12
+ <ut-modal-grid
13
+ v-if="showModalView"
14
+ url="/uums/user/listUserToRole"
15
+ :default-params="{ roleId: record.id }"
16
+ :items="modalFormItems"
17
+ :columns="modalColum"
18
+ :show-footer="true"
19
+ :editable="false"
20
+ :title="$t('message.udp.userList')"
21
+ width="60%"
22
+ height="75%"
23
+ @close="showModalView = false"
24
+ @confirm="onConfirm"
25
+ />
26
+ </el-drawer>
27
+ </div>
28
+ </template>
29
+ <script setup lang="ts">
30
+ import { onBeforeMount, reactive, ref } from 'vue';
31
+ import { VxeGridProps, VxeGridListeners, VxeGridInstance } from 'vxe-table';
32
+ import to from 'await-to-js';
33
+ import { getServiceApi } from '../../../api';
34
+
35
+ interface IProps {
36
+ record: IRecord;
37
+ show: boolean;
38
+ direction?: string;
39
+ }
40
+
41
+ const props = withDefaults(defineProps<IProps>(), {
42
+ record: (): IRecord => {
43
+ return {};
44
+ },
45
+ show: false,
46
+ direction: 'rtl'
47
+ });
48
+ const loading = ref(false);
49
+ const showModalView = ref(false);
50
+
51
+ const serviceApi = getServiceApi();
52
+
53
+ const emit = defineEmits<{
54
+ (e: 'onClose'): void;
55
+ }>();
56
+ const formItems: IFormItemProps[] = [
57
+ {
58
+ field: 'userName',
59
+ title: 'message.udp.userCode',
60
+ span: 8,
61
+ itemRender: { name: '$input' }
62
+ },
63
+ {
64
+ field: 'name',
65
+ title: 'message.udp.userName',
66
+ span: 8,
67
+ itemRender: { name: '$input' }
68
+ },
69
+ {
70
+ span: 8,
71
+ align: 'right',
72
+ itemRender: {
73
+ name: '$buttons',
74
+ children: [
75
+ {
76
+ props: {
77
+ type: 'submit',
78
+ content: 'message.btn.search',
79
+ icon: 'ri-search-line',
80
+ status: 'primary'
81
+ }
82
+ },
83
+ { props: { type: 'reset', icon: 'ri-refresh-line', content: 'message.btn.reset' } }
84
+ ]
85
+ }
86
+ }
87
+ ];
88
+ // 列字段
89
+ const columns: ITableColProps[] = [
90
+ { type: 'checkbox', width: 50, align: 'center' },
91
+ {
92
+ field: 'userName',
93
+ title: 'message.udp.userCode'
94
+ },
95
+ {
96
+ field: 'name',
97
+ title: 'message.udp.userName'
98
+ },
99
+ {
100
+ field: 'enabled',
101
+ title: 'message.enabled',
102
+ width: 70,
103
+ editRender: {
104
+ name: '$select',
105
+ options: [
106
+ { label: '启用', value: '1' },
107
+ { label: '禁用', value: '0' }
108
+ ],
109
+ defaultValue: '1'
110
+ }
111
+ }
112
+ ];
113
+ // 新增/删除/保存
114
+ const buttons = [
115
+ { code: 'add', name: 'message.btn.add', status: 'u-cyan', icon: 'ri-add-line' },
116
+ { code: 'delete', name: 'message.btn.del', status: 'danger', icon: 'ri-delete-bin-5-fill' }
117
+ ];
118
+ const modalFormItems = [
119
+ { field: 'userName', title: 'message.udp.userCode', span: 9 },
120
+ { field: 'name', title: 'message.udp.userName', span: 9 }
121
+ ];
122
+ const modalColum = [
123
+ { type: 'checkbox', width: 40 },
124
+ { field: 'userName', title: 'message.udp.userCode' },
125
+ { field: 'name', title: 'message.udp.userName' },
126
+ { field: 'enabled', width: 70, formatter: ['formatDict', 'SU.ENABLE'] }
127
+ ];
128
+ const xgrid = ref({} as VxeGridInstance);
129
+ const gridOptions = reactive<VxeGridProps>({
130
+ height: 'auto',
131
+ border: true,
132
+ pagerConfig: {},
133
+ toolbarConfig: { buttons, perfect: true },
134
+ loading: false,
135
+ formConfig: { titleWidth: 100, titleAlign: 'right', items: formItems },
136
+ // data: props.record.children,
137
+ proxyConfig: {
138
+ form: true, // 查询是需要启用表单代理
139
+ ajax: {
140
+ // 接收 Promise
141
+ query: ({ page, form }) => {
142
+ const queryParams = Object.assign({}, form);
143
+ queryParams.id = props.record.id;
144
+ queryParams.pageNum = page.currentPage;
145
+ queryParams.pageSize = page.pageSize;
146
+ return serviceApi.get('/uums/user/listRoleUsers', queryParams);
147
+ },
148
+ // body 对象: { removeRecords }
149
+ delete: ({ body: { removeRecords } }) => {
150
+ const param = {
151
+ roleId: props.record.id,
152
+ userIds: removeRecords.map(v => v.id).join()
153
+ };
154
+ return serviceApi.delete('/uums/role/deleteRoleUsers', param);
155
+ }
156
+ }
157
+ },
158
+ columns
159
+ });
160
+ // grid点击事件监听
161
+ const gridEvents: VxeGridListeners = {
162
+ toolbarButtonClick({ code }) {
163
+ if (code === 'add') {
164
+ showModalView.value = true;
165
+ }
166
+ }
167
+ };
168
+ // 监听modal table确定
169
+ const onConfirm = async records => {
170
+ const param = { userIds: '', roleId: props.record.id };
171
+ param.userIds = records.map(m => m.id).join(',');
172
+ gridOptions.loading = true;
173
+ const [err] = await to(serviceApi.post('/uums/role/addUserRole', param));
174
+ gridOptions.loading = false;
175
+ if (!err) {
176
+ xgrid.value.commitProxy('query');
177
+ showModalView.value = false;
178
+ }
179
+ };
180
+ // 抽屉关闭
181
+ function handleClose() {
182
+ emit('onClose');
183
+ }
184
+ onBeforeMount(() => {
185
+ loading.value = true;
186
+ });
187
+ </script>
188
+
189
+ <style lang="scss">
190
+ .u-dict-config_wrapper {
191
+ .el-drawer__header {
192
+ margin-bottom: 0;
193
+ }
194
+ }
195
+ </style>
@@ -1,57 +1,57 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-26 14:37:07
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2024-06-24 20:20:57
6
- * @Description: 角色分配业务单元
7
- -->
8
- <template>
9
- <div class="u-content-panel">
10
- <div class="u-left-panel">
11
- <ScrollPane
12
- :title="$t('SuOrg')"
13
- :tree-otions="{ children: 'children', label: 'orgName' }"
14
- extParam="{ pageSize: 500 }"
15
- url="/uums/org"
16
- />
17
- </div>
18
- <div class="content">
19
- <role-panel />
20
- </div>
21
- </div>
22
- </template>
23
-
24
- <script lang="ts" setup>
25
- import { ref, provide } from 'vue';
26
- import ScrollPane from '../../../components/SuScrollTree/ScrollPanel.vue';
27
- import RolePanel from './RolePanel.vue';
28
- const active: any = ref({});
29
- const scrollPanelChange: any = ref(false);
30
- const treeList: any = ref([]);
31
- provide('active', active);
32
-
33
- provide('scrollPanelChange', scrollPanelChange);
34
-
35
- provide('treeList', treeList);
36
- </script>
37
-
38
- <style lang="scss" scoped>
39
- .u-content-panel {
40
- box-sizing: border-box;
41
- display: flex;
42
- width: 100%;
43
- height: 84vh;
44
- padding: 5px;
45
-
46
- .u-left-panel {
47
- width: 250px;
48
- }
49
-
50
- .content {
51
- flex: 1;
52
- width: calc(100% - 250px);
53
- height: 82vh;
54
- margin: 0 10px;
55
- }
56
- }
57
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-26 14:37:07
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-08-06 17:55:03
6
+ * @Description: 角色分配业务单元
7
+ -->
8
+ <template>
9
+ <div class="u-content-panel">
10
+ <div class="u-left-panel">
11
+ <ScrollPane
12
+ :title="$t('SuOrg')"
13
+ :tree-otions="{ children: 'children', label: 'orgName' }"
14
+ :default-params="{ pageSize: 500 }"
15
+ url="/uums/org"
16
+ />
17
+ </div>
18
+ <div class="content">
19
+ <role-panel />
20
+ </div>
21
+ </div>
22
+ </template>
23
+
24
+ <script lang="ts" setup>
25
+ import { ref, provide } from 'vue';
26
+ import ScrollPane from '../../../components/SuScrollTree/ScrollPanel.vue';
27
+ import RolePanel from './RolePanel.vue';
28
+ const active: any = ref({});
29
+ const scrollPanelChange: any = ref(false);
30
+ const treeList: any = ref([]);
31
+ provide('active', active);
32
+
33
+ provide('scrollPanelChange', scrollPanelChange);
34
+
35
+ provide('treeList', treeList);
36
+ </script>
37
+
38
+ <style lang="scss" scoped>
39
+ .u-content-panel {
40
+ box-sizing: border-box;
41
+ display: flex;
42
+ width: 100%;
43
+ height: 84vh;
44
+ padding: 5px;
45
+
46
+ .u-left-panel {
47
+ width: 250px;
48
+ }
49
+
50
+ .content {
51
+ flex: 1;
52
+ width: calc(100% - 250px);
53
+ height: 82vh;
54
+ margin: 0 10px;
55
+ }
56
+ }
57
+ </style>