@pubinfo/module-rbac 2.0.0-beta.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 (291) hide show
  1. package/package.json +53 -0
  2. package/src/api/modules/assist/gonggaofuwu.ts +109 -0
  3. package/src/api/modules/assist/index.ts +5 -0
  4. package/src/api/modules/assist/qunzujiekou.ts +95 -0
  5. package/src/api/modules/assist/quyujiekou.ts +97 -0
  6. package/src/api/modules/assist/typings.d.ts +364 -0
  7. package/src/api/modules/configData/heibaimingdanfuwu.ts +95 -0
  8. package/src/api/modules/configData/index.ts +5 -0
  9. package/src/api/modules/configData/typings.d.ts +347 -0
  10. package/src/api/modules/configData/xitongpeizhifuwu.ts +322 -0
  11. package/src/api/modules/configData/zidianfuwu.ts +151 -0
  12. package/src/api/modules/log/caozuorizhifuwu.ts +37 -0
  13. package/src/api/modules/log/denglurizhifuwu.ts +37 -0
  14. package/src/api/modules/log/index.ts +4 -0
  15. package/src/api/modules/log/typings.d.ts +179 -0
  16. package/src/api/modules/rbac/gangweijiekou.ts +93 -0
  17. package/src/api/modules/rbac/index.ts +13 -0
  18. package/src/api/modules/rbac/jiaosejiekou.ts +124 -0
  19. package/src/api/modules/rbac/pubJiaosezukongzhiqi.ts +113 -0
  20. package/src/api/modules/rbac/shujuquanxianzhubiaokongzhiqi.ts +186 -0
  21. package/src/api/modules/rbac/typings.d.ts +2001 -0
  22. package/src/api/modules/rbac/yonghujiekou.ts +225 -0
  23. package/src/api/modules/rbac/yonghushoucangbiaojiekou.ts +93 -0
  24. package/src/api/modules/rbac/yonghuzuijinchangyongbiaojiekou.ts +72 -0
  25. package/src/api/modules/rbac/ziyuanjiekou.ts +223 -0
  26. package/src/api/modules/rbac/zuhuguanlijiekou.ts +91 -0
  27. package/src/api/modules/rbac/zuzhijiaosebiaokongzhiqi.ts +76 -0
  28. package/src/api/modules/rbac/zuzhijiekou.ts +171 -0
  29. package/src/api/request.ts +3 -0
  30. package/src/assets/icons/403.svg +1 -0
  31. package/src/assets/icons/403_dark.svg +1 -0
  32. package/src/assets/icons/404.svg +1 -0
  33. package/src/assets/icons/404_dark.svg +1 -0
  34. package/src/assets/icons/add-child.svg +1 -0
  35. package/src/assets/icons/authority.svg +1 -0
  36. package/src/assets/icons/authorize.svg +1 -0
  37. package/src/assets/icons/blacklist-disable.svg +1 -0
  38. package/src/assets/icons/blacklist-enable.svg +1 -0
  39. package/src/assets/icons/browser-360.svg +1 -0
  40. package/src/assets/icons/browser-chrome.svg +1 -0
  41. package/src/assets/icons/browser-edge.svg +1 -0
  42. package/src/assets/icons/browser-ie.svg +1 -0
  43. package/src/assets/icons/browser-other.svg +1 -0
  44. package/src/assets/icons/browser-qq.svg +1 -0
  45. package/src/assets/icons/browser-safari.svg +1 -0
  46. package/src/assets/icons/browser-uc.svg +1 -0
  47. package/src/assets/icons/change-org.svg +1 -0
  48. package/src/assets/icons/edit.svg +1 -0
  49. package/src/assets/icons/empty-data.svg +1 -0
  50. package/src/assets/icons/favorites.svg +1 -0
  51. package/src/assets/icons/icard.svg +1 -0
  52. package/src/assets/icons/icon_animation.svg +1 -0
  53. package/src/assets/icons/icon_breadcrumb.svg +1 -0
  54. package/src/assets/icons/icon_copyright.svg +1 -0
  55. package/src/assets/icons/icon_jt.svg +1 -0
  56. package/src/assets/icons/icon_layout.svg +1 -0
  57. package/src/assets/icons/icon_mainpage.svg +1 -0
  58. package/src/assets/icons/icon_menu.svg +1 -0
  59. package/src/assets/icons/icon_page_size.svg +1 -0
  60. package/src/assets/icons/icon_position_type.svg +1 -0
  61. package/src/assets/icons/icon_safe_manage.svg +1 -0
  62. package/src/assets/icons/icon_screen_scale.svg +6 -0
  63. package/src/assets/icons/icon_system_manage.svg +1 -0
  64. package/src/assets/icons/icon_tabbar.svg +1 -0
  65. package/src/assets/icons/icon_toolbar.svg +1 -0
  66. package/src/assets/icons/icon_topbar.svg +1 -0
  67. package/src/assets/icons/icon_watermark.svg +1 -0
  68. package/src/assets/icons/image-load-fail.svg +1 -0
  69. package/src/assets/icons/log-center.svg +1 -0
  70. package/src/assets/icons/logo-sig.svg +1 -0
  71. package/src/assets/icons/logo.svg +1 -0
  72. package/src/assets/icons/mima.svg +1 -0
  73. package/src/assets/icons/not-data.svg +1 -0
  74. package/src/assets/icons/org-main.svg +1 -0
  75. package/src/assets/icons/org-unmain.svg +1 -0
  76. package/src/assets/icons/process-management.svg +1 -0
  77. package/src/assets/icons/project-management.svg +1 -0
  78. package/src/assets/icons/rbac.svg +1 -0
  79. package/src/assets/icons/remove.svg +1 -0
  80. package/src/assets/icons/resource-app.svg +1 -0
  81. package/src/assets/icons/resource-btn.svg +1 -0
  82. package/src/assets/icons/resource-index.svg +1 -0
  83. package/src/assets/icons/resource-menu.svg +1 -0
  84. package/src/assets/icons/resource-nonmenu.svg +1 -0
  85. package/src/assets/icons/setting-manage.svg +1 -0
  86. package/src/assets/icons/test.svg +1 -0
  87. package/src/assets/icons/theme-check-mark.svg +1 -0
  88. package/src/assets/icons/theme-title.svg +1 -0
  89. package/src/assets/icons/toolbar-collapse.svg +1 -0
  90. package/src/assets/icons/tree_icon.svg +1 -0
  91. package/src/assets/icons/tree_icon_checked.svg +1 -0
  92. package/src/assets/icons/view.svg +1 -0
  93. package/src/assets/icons/workbench.svg +1 -0
  94. package/src/assets/icons/zddata.svg +1 -0
  95. package/src/assets/icons/zy_checked.svg +1 -0
  96. package/src/assets/icons/zy_default.svg +1 -0
  97. package/src/assets/images/layout/item1.webp +0 -0
  98. package/src/assets/images/layout/item1_dark.webp +0 -0
  99. package/src/assets/images/layout/item2.webp +0 -0
  100. package/src/assets/images/layout/item2_dark.webp +0 -0
  101. package/src/assets/images/layout/item3.webp +0 -0
  102. package/src/assets/images/layout/item3_dark.webp +0 -0
  103. package/src/assets/images/layout/item4.webp +0 -0
  104. package/src/assets/images/layout/item4_dark.webp +0 -0
  105. package/src/assets/images/layout/item5.webp +0 -0
  106. package/src/assets/images/layout/item5_dark.webp +0 -0
  107. package/src/assets/images/page-width/anto_min_w_dark.webp +0 -0
  108. package/src/assets/images/page-width/auto.webp +0 -0
  109. package/src/assets/images/page-width/auto_dark.webp +0 -0
  110. package/src/assets/images/page-width/auto_min_w.webp +0 -0
  111. package/src/assets/images/page-width/auto_min_w_dark.webp +0 -0
  112. package/src/assets/images/page-width/icon_auto.webp +0 -0
  113. package/src/assets/images/page-width/icon_auto_dark.webp +0 -0
  114. package/src/assets/images/page-width/icon_auto_min_w.webp +0 -0
  115. package/src/assets/images/page-width/icon_auto_min_w_dark.webp +0 -0
  116. package/src/assets/images/page-width/icon_middle.webp +0 -0
  117. package/src/assets/images/page-width/icon_middle_dark.webp +0 -0
  118. package/src/assets/images/page-width/icon_middle_max_w.webp +0 -0
  119. package/src/assets/images/page-width/icon_middle_max_w_dark.webp +0 -0
  120. package/src/assets/images/page-width/middle.webp +0 -0
  121. package/src/assets/images/page-width/middle_dark.webp +0 -0
  122. package/src/assets/images/page-width/middle_max_w.webp +0 -0
  123. package/src/assets/images/page-width/middle_max_w_dark.webp +0 -0
  124. package/src/assets/lottie/breadcrumb/dark/enable.json +1 -0
  125. package/src/assets/lottie/breadcrumb/dark/enableMainMenu.json +1 -0
  126. package/src/assets/lottie/breadcrumb/dark/style.json +1 -0
  127. package/src/assets/lottie/breadcrumb/light/enable.json +1 -0
  128. package/src/assets/lottie/breadcrumb/light/enableMainMenu.json +1 -0
  129. package/src/assets/lottie/breadcrumb/light/style.json +1 -0
  130. package/src/assets/lottie/layout/data-test.json +1 -0
  131. package/src/assets/lottie/layout/data.json +1 -0
  132. package/src/assets/lottie/menu/dark/enableHotkeys.json +1 -0
  133. package/src/assets/lottie/menu/dark/enableSubMenuCollapseButton.json +1 -0
  134. package/src/assets/lottie/menu/dark/isRounded.json +1 -0
  135. package/src/assets/lottie/menu/dark/menuActiveStyle.json +1 -0
  136. package/src/assets/lottie/menu/dark/subMenuCollapse.json +1 -0
  137. package/src/assets/lottie/menu/dark/subMenuUniqueOpened.json +1 -0
  138. package/src/assets/lottie/menu/light/enableHotkeys.json +1 -0
  139. package/src/assets/lottie/menu/light/enableSubMenuCollapseButton.json +1 -0
  140. package/src/assets/lottie/menu/light/isRounded.json +1 -0
  141. package/src/assets/lottie/menu/light/menuActiveStyle.json +1 -0
  142. package/src/assets/lottie/menu/light/subMenuCollapse.json +1 -0
  143. package/src/assets/lottie/menu/light/subMenuUniqueOpened.json +1 -0
  144. package/src/assets/lottie/other/dark/enableCopyright.json +1 -0
  145. package/src/assets/lottie/other/dark/enableHotkeys.json +1 -0
  146. package/src/assets/lottie/other/dark/switchTabbarAndToolbar.json +1 -0
  147. package/src/assets/lottie/other/light/enableCopyright.json +1 -0
  148. package/src/assets/lottie/other/light/enableHotkeys.json +1 -0
  149. package/src/assets/lottie/other/light/switchTabbarAndToolbar.json +1 -0
  150. package/src/assets/lottie/page_animation/dark/fadeinout.json +1 -0
  151. package/src/assets/lottie/page_animation/dark/fadeinout_old.json +1 -0
  152. package/src/assets/lottie/page_animation/dark/tobottom.json +1 -0
  153. package/src/assets/lottie/page_animation/dark/tobottom_old.json +1 -0
  154. package/src/assets/lottie/page_animation/dark/toleft.json +1 -0
  155. package/src/assets/lottie/page_animation/dark/toleft_old.json +1 -0
  156. package/src/assets/lottie/page_animation/dark/toright.json +1 -0
  157. package/src/assets/lottie/page_animation/dark/toright_old.json +1 -0
  158. package/src/assets/lottie/page_animation/dark/totop.json +1 -0
  159. package/src/assets/lottie/page_animation/dark/totop_old.json +1 -0
  160. package/src/assets/lottie/page_animation/light/fadeinout.json +1 -0
  161. package/src/assets/lottie/page_animation/light/tobottom.json +1 -0
  162. package/src/assets/lottie/page_animation/light/toleft.json +1 -0
  163. package/src/assets/lottie/page_animation/light/toright.json +1 -0
  164. package/src/assets/lottie/page_animation/light/totop.json +1 -0
  165. package/src/assets/lottie/tabbar/dark/enable.json +1 -0
  166. package/src/assets/lottie/tabbar/dark/enableHotkeys.json +1 -0
  167. package/src/assets/lottie/tabbar/dark/enableIcon.json +1 -0
  168. package/src/assets/lottie/tabbar/dark/enableMemory.json +1 -0
  169. package/src/assets/lottie/tabbar/dark/style.json +1 -0
  170. package/src/assets/lottie/tabbar/light/enable.json +1 -0
  171. package/src/assets/lottie/tabbar/light/enableHotkeys.json +1 -0
  172. package/src/assets/lottie/tabbar/light/enableIcon.json +1 -0
  173. package/src/assets/lottie/tabbar/light/enableMemory.json +1 -0
  174. package/src/assets/lottie/tabbar/light/style.json +1 -0
  175. package/src/assets/lottie/toolbar/dark/enableColorScheme.json +1 -0
  176. package/src/assets/lottie/toolbar/dark/enableFullscreen.json +1 -0
  177. package/src/assets/lottie/toolbar/dark/enableI18n.json +1 -0
  178. package/src/assets/lottie/toolbar/dark/enableNotification.json +1 -0
  179. package/src/assets/lottie/toolbar/dark/enablePageReload.json +1 -0
  180. package/src/assets/lottie/toolbar/dark/enableUserPreferences.json +1 -0
  181. package/src/assets/lottie/toolbar/dark/navSearchEnable.json +1 -0
  182. package/src/assets/lottie/toolbar/dark/navSearchEnableHotkeys.json +1 -0
  183. package/src/assets/lottie/toolbar/light/enableColorScheme.json +1 -0
  184. package/src/assets/lottie/toolbar/light/enableFullscreen.json +1 -0
  185. package/src/assets/lottie/toolbar/light/enableI18n.json +1 -0
  186. package/src/assets/lottie/toolbar/light/enableNotification.json +1 -0
  187. package/src/assets/lottie/toolbar/light/enablePageReload.json +1 -0
  188. package/src/assets/lottie/toolbar/light/enableUserPreferences.json +1 -0
  189. package/src/assets/lottie/toolbar/light/navSearchEnable.json +1 -0
  190. package/src/assets/lottie/toolbar/light/navSearchEnableHotkeys.json +1 -0
  191. package/src/assets/lottie/watermark/dark/enableWatermark.json +1 -0
  192. package/src/assets/lottie/watermark/light/enableWatermark.json +1 -0
  193. package/src/assets/styles/vxe-table.css +13 -0
  194. package/src/components/GroupSelector/index.vue +311 -0
  195. package/src/components/OrgTree/index.vue +91 -0
  196. package/src/components/OrgUserSelector/OrgSelector.vue +135 -0
  197. package/src/components/OrgUserSelector/UserSelector.vue +164 -0
  198. package/src/components/OrgUserSelector/index.ts +47 -0
  199. package/src/components/OrgUserSelector/provider.ts +373 -0
  200. package/src/components/ResourceSelector/enum.ts +5 -0
  201. package/src/components/ResourceSelector/hooks/useAppAndResource.ts +96 -0
  202. package/src/components/ResourceSelector/index.vue +432 -0
  203. package/src/composables/useLottie.ts +65 -0
  204. package/src/index.ts +31 -0
  205. package/src/interface.ts +54 -0
  206. package/src/routes/index.ts +156 -0
  207. package/src/routes/modules/authority.manage.menu.ts +105 -0
  208. package/src/routes/modules/log.manage.menu.ts +45 -0
  209. package/src/routes/modules/safe.manage.menu.ts +71 -0
  210. package/src/routes/modules/stylesetting.manage.menu.ts +130 -0
  211. package/src/routes/modules/system.manage.menu.ts +92 -0
  212. package/src/stores/index.ts +1 -0
  213. package/src/views/blackWhiteList/components/drawerBlackWhiteList.vue +132 -0
  214. package/src/views/blackWhiteList/enum.ts +7 -0
  215. package/src/views/blackWhiteList/index.vue +309 -0
  216. package/src/views/blackWhiteList/types.ts +4 -0
  217. package/src/views/breadcrumb_setting/animationData.ts +15 -0
  218. package/src/views/breadcrumb_setting/index.vue +147 -0
  219. package/src/views/components/HCheckList.vue +47 -0
  220. package/src/views/components/animation_item.vue +37 -0
  221. package/src/views/components/setItem.vue +126 -0
  222. package/src/views/data-permission/components/createAndEditDataPermission.vue +354 -0
  223. package/src/views/data-permission/enum.ts +59 -0
  224. package/src/views/data-permission/index.vue +190 -0
  225. package/src/views/dictionary/components/drawerDictionary.vue +108 -0
  226. package/src/views/dictionary/components/drawerDictionaryItem.vue +115 -0
  227. package/src/views/dictionary/enum.ts +8 -0
  228. package/src/views/dictionary/index.vue +194 -0
  229. package/src/views/dictionary/itemlist.vue +164 -0
  230. package/src/views/group/components/drawerGroup.vue +177 -0
  231. package/src/views/group/enum.ts +25 -0
  232. package/src/views/group/index.vue +207 -0
  233. package/src/views/layout_setting/index.vue +306 -0
  234. package/src/views/log_center/components/browserType.vue +35 -0
  235. package/src/views/log_center/components/loginHistoryDetail.vue +71 -0
  236. package/src/views/log_center/components/operateHistoryDetail.vue +80 -0
  237. package/src/views/log_center/login_history.vue +239 -0
  238. package/src/views/log_center/operate_history.vue +233 -0
  239. package/src/views/menu_setting/animationData.ts +27 -0
  240. package/src/views/menu_setting/index.vue +207 -0
  241. package/src/views/organization/components/drawerOrganization.vue +161 -0
  242. package/src/views/organization/components/drawerRole.vue +159 -0
  243. package/src/views/organization/components/roleSelect.vue +258 -0
  244. package/src/views/organization/enum.ts +26 -0
  245. package/src/views/organization/index.vue +516 -0
  246. package/src/views/other_setting/animationData.ts +15 -0
  247. package/src/views/other_setting/index.vue +250 -0
  248. package/src/views/other_setting/interface.ts +26 -0
  249. package/src/views/page_animation_setting/animationData.ts +23 -0
  250. package/src/views/page_animation_setting/index.vue +200 -0
  251. package/src/views/page_w_setting/index.vue +238 -0
  252. package/src/views/position/components/drawerPosition.vue +131 -0
  253. package/src/views/position/enum.ts +8 -0
  254. package/src/views/position/index.vue +167 -0
  255. package/src/views/region/components/drawerRegion.vue +143 -0
  256. package/src/views/region/enum.ts +24 -0
  257. package/src/views/region/index.vue +246 -0
  258. package/src/views/resource/components/ResourceEdit.vue +209 -0
  259. package/src/views/resource/components/RoleRelation.vue +100 -0
  260. package/src/views/resource/enum.ts +35 -0
  261. package/src/views/resource/index.vue +237 -0
  262. package/src/views/resource/interface.ts +6 -0
  263. package/src/views/role/components/ResourceRelation.vue +113 -0
  264. package/src/views/role/components/drawerRole.vue +191 -0
  265. package/src/views/role/enum.ts +26 -0
  266. package/src/views/role/index.vue +183 -0
  267. package/src/views/role/interface.ts +6 -0
  268. package/src/views/role_group/components/ResourceRelation.vue +91 -0
  269. package/src/views/role_group/components/drawerRole.vue +153 -0
  270. package/src/views/role_group/components/roleSelect.vue +224 -0
  271. package/src/views/role_group/enum.ts +22 -0
  272. package/src/views/role_group/index.vue +170 -0
  273. package/src/views/role_group/interface.ts +6 -0
  274. package/src/views/safe_setting/index.vue +237 -0
  275. package/src/views/tabbar_setting/animationData.ts +23 -0
  276. package/src/views/tabbar_setting/index.vue +186 -0
  277. package/src/views/tenant/components/TenantEdit.vue +226 -0
  278. package/src/views/tenant/index.vue +192 -0
  279. package/src/views/tenant/interface.ts +4 -0
  280. package/src/views/theme_setting/index.vue +465 -0
  281. package/src/views/toolbar_setting/animationData.ts +42 -0
  282. package/src/views/toolbar_setting/index.vue +189 -0
  283. package/src/views/user/components/OrgAndPosition.vue +156 -0
  284. package/src/views/user/components/UserAuthorization.vue +260 -0
  285. package/src/views/user/components/UserEdit.vue +267 -0
  286. package/src/views/user/components/roleSelect.vue +258 -0
  287. package/src/views/user/enum.ts +13 -0
  288. package/src/views/user/index.vue +266 -0
  289. package/src/views/user/interface.ts +43 -0
  290. package/src/views/watermark_setting/animationData.ts +7 -0
  291. package/src/views/watermark_setting/index.vue +236 -0
@@ -0,0 +1,24 @@
1
+ export enum ACTION {
2
+ /** 新增 */
3
+ ADD = '新增',
4
+ /** 编辑 */
5
+ EDIT = '编辑',
6
+ /** 删除 */
7
+ REMOVE = '删除',
8
+ /** 新建下级 */
9
+ ADDNEXT = '新建下级',
10
+ }
11
+
12
+ export enum RANGE {
13
+ /** 省 */
14
+ PROVINCE = '1',
15
+ /** 市 */
16
+ CITY = '2',
17
+ /** 区/县 */
18
+ COUNTY = '3',
19
+ }
20
+ export const rangeOptions = [
21
+ { label: '省', value: RANGE.PROVINCE },
22
+ { label: '市', value: RANGE.CITY },
23
+ { label: '区/县', value: RANGE.COUNTY },
24
+ ];
@@ -0,0 +1,246 @@
1
+ <script setup lang="tsx">
2
+ import type { ProColumns } from '@pubinfo/pro-components';
3
+ import type { Key } from 'ant-design-vue/es/vc-table/interface';
4
+ import { getRegionDeleteRegionByCode, getRegionGetListByParentId } from '@/api/modules/assist';
5
+ import { ProTable } from '@pubinfo/pro-components';
6
+ import { message, Modal } from 'ant-design-vue';
7
+ import { cloneDeep } from 'lodash-es';
8
+ import DrawerRegion from './components/drawerRegion.vue';
9
+ import { ACTION } from './enum';
10
+
11
+ defineOptions({
12
+ name: 'RegionManage',
13
+ });
14
+ const { auth } = useAuth();
15
+
16
+ type TreeNode = API.PubRegion & {
17
+ children?: TreeNode[]
18
+ };
19
+ const query = ref<API.getRegionGetListByParentIdParams>({ parentId: '' });
20
+
21
+ const data: Ref<TreeNode[]> = ref([]);
22
+ const chilData = ref<TreeNode>({});
23
+
24
+ const tableRef = ref<typeof ProTable>();
25
+ const drawerRegionRef = ref<InstanceType<typeof DrawerRegion>>();
26
+
27
+ // 刷新数据展开未重置的问题
28
+ const expandedRowKeys = ref<Key[]>([]);
29
+ function expandedRowsChange(expandedRows: Key[]): void {
30
+ expandedRowKeys.value = expandedRows;
31
+ }
32
+
33
+ const columns: ProColumns<TreeNode> = [
34
+ {
35
+ minWidth: 240,
36
+ title: '区域名称',
37
+ dataIndex: 'name',
38
+ ellipsis: true,
39
+ },
40
+ {
41
+ minWidth: 100,
42
+ title: '区域范围',
43
+ dataIndex: 'type',
44
+ },
45
+ {
46
+ minWidth: 140,
47
+ title: '行政区划编码',
48
+ dataIndex: 'code',
49
+ ellipsis: true,
50
+ },
51
+ {
52
+ minWidth: 100,
53
+ title: '区域编码',
54
+ dataIndex: 'regionCode',
55
+ },
56
+ {
57
+ minWidth: 100,
58
+ title: '显示顺序',
59
+ dataIndex: 'sort',
60
+ },
61
+ {
62
+ hideInSearch: true,
63
+ title: '操作',
64
+ dataIndex: 'action',
65
+ width: 240,
66
+ fixed: 'right',
67
+ hideInTable() {
68
+ return !auth([
69
+ 'region_add_child',
70
+ 'region_edit',
71
+ 'region_remove',
72
+ ]);
73
+ },
74
+ },
75
+ ];
76
+
77
+ function onAction(key: string, record?: TreeNode): void {
78
+ switch (key) {
79
+ case ACTION.ADDNEXT:
80
+ query.value.parentId = record!.id;
81
+ chilData.value = record!;
82
+ drawerRegionRef.value?.open(key, record);
83
+ break;
84
+ case ACTION.ADD:
85
+ query.value.parentId = '';
86
+ chilData.value = {};
87
+ drawerRegionRef.value?.open(key);
88
+ break;
89
+ case ACTION.EDIT:
90
+ query.value.parentId = record!.parentId;
91
+ chilData.value = getNodeById(data.value, query.value.parentId!);
92
+ drawerRegionRef.value?.open(key, record);
93
+ break;
94
+ case ACTION.REMOVE:
95
+ query.value.parentId = record!.parentId;
96
+ chilData.value = getNodeById(data.value, query.value.parentId!);
97
+ Modal.confirm({
98
+ title: '删除',
99
+ content: '确定要删除该区域吗?',
100
+ onOk() {
101
+ getRegionDeleteRegionByCode({ code: record!.code! })
102
+ .then((res: API.ResponseDataBoolean) => {
103
+ if (res.success) {
104
+ message.success('删除成功');
105
+ getRegionData();
106
+ }
107
+ });
108
+ },
109
+ });
110
+ break;
111
+ }
112
+ }
113
+
114
+ /* 获取表格数据 */
115
+ async function request() {
116
+ const res = await getRegionGetListByParentId({
117
+ ...query.value,
118
+ });
119
+ if (Object.keys(chilData.value).length > 0) {
120
+ const length = res.data!.length;
121
+ if (length > 0) {
122
+ chilData.value.children = res.data?.map((e: API.PubRegion) => {
123
+ return {
124
+ ...e,
125
+ children: e.isLeaf ? undefined : [],
126
+ };
127
+ }) as TreeNode[];
128
+ }
129
+ else {
130
+ chilData.value.children = undefined;
131
+ }
132
+ }
133
+ else {
134
+ expandedRowKeys.value = [];
135
+ data.value = res.data?.map((e: API.PubRegion) => {
136
+ return {
137
+ ...e,
138
+ children: e.isLeaf ? undefined : [],
139
+ };
140
+ }) as TreeNode[];
141
+ }
142
+ return {
143
+ success: true,
144
+ data: data.value,
145
+ };
146
+ }
147
+
148
+ /* 表格中父节点展开 */
149
+ function expand(flag: boolean, data: TreeNode) {
150
+ const dataTemp = cloneDeep(data);
151
+ if (flag) {
152
+ if (dataTemp.children?.length === 0) {
153
+ query.value.parentId = data.id;
154
+ chilData.value = data;
155
+ tableRef.value?.fetch();
156
+ }
157
+ }
158
+ }
159
+
160
+ /* 新建或者编辑后刷新列表 */
161
+ function getRegionData() {
162
+ tableRef.value?.reload();
163
+ }
164
+
165
+ /* 获取某节点的信息 */
166
+ function getNodeById(nodes: TreeNode[], id: string): any {
167
+ for (const node of nodes) {
168
+ if (node.id === id) {
169
+ return node;
170
+ }
171
+ if (node.children) {
172
+ const foundNode = getNodeById(node.children, id);
173
+ if (foundNode) {
174
+ return foundNode;
175
+ }
176
+ }
177
+ }
178
+ return undefined;
179
+ }
180
+ </script>
181
+
182
+ <template>
183
+ <div
184
+ w-full
185
+ h-full
186
+ py-10px
187
+ px-10px
188
+ >
189
+ <ProTable
190
+ ref="tableRef"
191
+ row-key="id"
192
+ :search="false"
193
+ :request="request"
194
+ :columns="columns"
195
+ :data-source="data"
196
+ :pagination="false"
197
+ auto-height
198
+ :expanded-row-keys="expandedRowKeys"
199
+ :scroll="{ x: 1100 }"
200
+ @expanded-rows-change="expandedRowsChange"
201
+ @expand="expand"
202
+ >
203
+ <template #toolbar>
204
+ <a-button v-auth="'region_add'" type="primary" @click="onAction(ACTION.ADD)">
205
+ <PlusCircleOutlined />
206
+ {{ ACTION.ADD }}
207
+ </a-button>
208
+ </template>
209
+ <template #bodyCell="{ column, record }">
210
+ <template v-if="column.dataIndex === 'action'">
211
+ <a-space>
212
+ <a
213
+ v-auth="'region_add_child'"
214
+ class="flex items-center"
215
+ @click="onAction(ACTION.ADDNEXT, record)"
216
+ >
217
+ <PubinfoIcon name="add-child" class="text-base" />
218
+ <span class="ml-4px">{{ ACTION.ADDNEXT }}</span>
219
+ </a>
220
+ <a
221
+ v-auth="'region_edit'"
222
+ class="flex items-center"
223
+ @click="onAction(ACTION.EDIT, record)"
224
+ >
225
+ <PubinfoIcon name="edit" class="text-base" />
226
+ <span class="ml-4px">{{ ACTION.EDIT }}</span>
227
+ </a>
228
+ <span
229
+ v-auth="'region_remove'"
230
+ class="flex items-center text-red-500 hover:cursor-pointer hover:opacity-80"
231
+ @click="onAction(ACTION.REMOVE, record)"
232
+ >
233
+ <PubinfoIcon name="remove" class="text-base" />
234
+ <span class="ml-4px">{{ ACTION.REMOVE }}</span>
235
+ </span>
236
+ </a-space>
237
+ </template>
238
+ </template>
239
+ </ProTable>
240
+ <DrawerRegion
241
+ ref="drawerRegionRef"
242
+ :tree-data="data"
243
+ @submit="getRegionData()"
244
+ />
245
+ </div>
246
+ </template>
@@ -0,0 +1,209 @@
1
+ <script setup lang="ts">
2
+ import type { Rule } from 'ant-design-vue/es/form';
3
+ import type { FormExpose } from 'ant-design-vue/es/form/Form';
4
+ import type { AddForm, EditForm, Form, TreeNode } from '../interface';
5
+ import { getRbacResourceInfo, postRbacResourceAddResource, postRbacResourceResourceUpdate } from '@/api/modules/rbac';
6
+ import { DATA_PERMISSION_TYPE, dataPermissionOptions } from '@/views/data-permission/enum';
7
+ import { useToggle } from '@vueuse/core';
8
+ import { message } from 'ant-design-vue';
9
+ import { cloneDeep } from 'lodash-es';
10
+ import { ACTION, RESOURCE_TYPE, resourceOptions } from '../enum';
11
+
12
+ defineOptions({
13
+ name: 'ResourceEdit',
14
+ });
15
+
16
+ const props = defineProps<{ dataSource: TreeNode[] }>();
17
+ const emit = defineEmits(['submit']);
18
+
19
+ const [open, setOpen] = useToggle(false);
20
+ const formRef = ref<FormExpose>();
21
+ const form = ref<Partial<Form>>({});
22
+ const state = reactive<{
23
+ title: string
24
+ record: TreeNode
25
+ initData: Partial<Form>
26
+ }>({
27
+ title: '',
28
+ record: {},
29
+ initData: {
30
+ type: RESOURCE_TYPE.APP,
31
+ sort: 0,
32
+ enable: true,
33
+ enableDataPermission: false,
34
+ dataPermissionType: DATA_PERMISSION_TYPE.ALL,
35
+ },
36
+ });
37
+
38
+ const rules: Record<string, Rule[]> = {
39
+ name: [{ required: true, message: '请输入资源名称', trigger: 'blur' }],
40
+ type: [{ required: true, message: '请选择资源类型', trigger: 'change' }],
41
+ code: [{ required: true, message: '请输入资源编码', trigger: 'blur' }],
42
+ sort: [{ type: 'number', required: true, message: '请输入排序', trigger: 'blur' }],
43
+ enable: [{ type: 'boolean', required: true, message: '请选择是否启用', trigger: 'change' }],
44
+ };
45
+
46
+ const parentNode = computed(() => {
47
+ return recursiveTreeFind(props.dataSource, node => node.id === form.value.parentId);
48
+ });
49
+ function recursiveTreeFind<T extends { children?: T[] }>(tree: T[], fn: (node: T) => boolean) {
50
+ const list = [...tree];
51
+ for (const node of list) {
52
+ if (fn(node)) {
53
+ return node;
54
+ }
55
+ if (node.children) {
56
+ list.push(...node.children);
57
+ }
58
+ }
59
+ return null;
60
+ }
61
+
62
+ const resourceComputedOptions = computed(() => {
63
+ switch (parentNode.value?.type) {
64
+ case RESOURCE_TYPE.APP:
65
+ case RESOURCE_TYPE.INDEX:
66
+ return resourceOptions.filter(node => node.value !== RESOURCE_TYPE.APP);
67
+
68
+ case RESOURCE_TYPE.MENU:
69
+ case RESOURCE_TYPE.NON_MENU:
70
+ return resourceOptions.filter(node => (node.value === RESOURCE_TYPE.BUTTON || node.value === RESOURCE_TYPE.NON_MENU));
71
+
72
+ case RESOURCE_TYPE.BUTTON:
73
+ return [];
74
+
75
+ default:
76
+ return resourceOptions.filter(node => node.value === RESOURCE_TYPE.APP);
77
+ }
78
+ });
79
+
80
+ const dataPermissionVisible = computed(() => {
81
+ return form.value.type === RESOURCE_TYPE.BUTTON || form.value.type === RESOURCE_TYPE.MENU || form.value.type === RESOURCE_TYPE.NON_MENU;
82
+ });
83
+
84
+ async function onOpen(key: ACTION, record?: Form) {
85
+ state.title = key;
86
+ form.value = cloneDeep(state.initData);
87
+ setOpen(true);
88
+
89
+ if (key === ACTION.ADD_CHILD) {
90
+ form.value.parentId = record?.id as string;
91
+ form.value.type = resourceComputedOptions.value[0].value;
92
+ }
93
+
94
+ if (key === ACTION.EDIT) {
95
+ const res = await getRbacResourceInfo({ id: record?.id as string });
96
+ if (res.success) {
97
+ form.value = res.data ?? {};
98
+ }
99
+ }
100
+ }
101
+
102
+ const [loading, setLoading] = useToggle(false);
103
+ function onSubmit() {
104
+ formRef.value?.validate().then(() => {
105
+ const params = {
106
+ ...form.value,
107
+ };
108
+
109
+ // app, 目录等不参与数据权限筛选
110
+ if (!dataPermissionVisible.value) {
111
+ params.enableDataPermission = false;
112
+ }
113
+
114
+ const promise
115
+ = state.title === ACTION.EDIT
116
+ ? postRbacResourceResourceUpdate(params as EditForm)
117
+ : postRbacResourceAddResource({ parentId: '', ...params } as AddForm);
118
+ setLoading(true);
119
+ promise
120
+ .then((res) => {
121
+ if (res?.success) {
122
+ message.success(`${state.title}成功!`);
123
+ setOpen(false);
124
+ emit('submit');
125
+ }
126
+ })
127
+ .finally(() => setLoading(false));
128
+ });
129
+ }
130
+
131
+ defineExpose({
132
+ open: onOpen,
133
+ });
134
+ </script>
135
+
136
+ <template>
137
+ <a-drawer
138
+ v-model:open="open"
139
+ :title="state.title"
140
+ placement="right"
141
+ :width="520"
142
+ destroy-on-close
143
+ :footer-style="{ textAlign: 'right' }"
144
+ >
145
+ <a-form
146
+ ref="formRef"
147
+ :model="form"
148
+ :rules="rules"
149
+ :label-col="{ span: 6 }"
150
+ >
151
+ <a-form-item v-if="parentNode?.name" name="parentId">
152
+ <template #label>
153
+ <DatabaseOutlined class="mr-1" />
154
+ 父资源
155
+ </template>
156
+ {{ parentNode?.name }}
157
+ </a-form-item>
158
+ <a-form-item label="资源名称" name="name">
159
+ <a-input v-model:value="form.name" placeholder="请输入资源名称" :maxlength="128" />
160
+ </a-form-item>
161
+ <a-form-item label="资源类型" name="type">
162
+ <a-radio-group
163
+ v-model:value="form.type"
164
+ :options="resourceComputedOptions"
165
+ option-type="button"
166
+ button-style="solid"
167
+ />
168
+ </a-form-item>
169
+ <a-form-item label="资源编码" name="code">
170
+ <a-input v-model:value="form.code" placeholder="请输入资源编码" :maxlength="50" />
171
+ </a-form-item>
172
+ <a-form-item label="显示顺序" name="sort">
173
+ <a-input-number v-model:value="form.sort" :max="999" />
174
+ </a-form-item>
175
+ <a-form-item label="是否启用" name="enable">
176
+ <a-switch v-model:checked="form.enable" />
177
+ </a-form-item>
178
+ <a-form-item label="权限标识" name="permissionCode">
179
+ <a-input v-model:value="form.permissionCode" placeholder="请输入权限标识" :maxlength="128" />
180
+ </a-form-item>
181
+ <a-form-item label="描述" name="description">
182
+ <a-textarea
183
+ v-model:value="form.description"
184
+ placeholder="请输入描述"
185
+ :maxlength="255"
186
+ :auto-size="{ minRows: 2 }"
187
+ show-count
188
+ />
189
+ </a-form-item>
190
+ <a-form-item v-if="dataPermissionVisible" label="启用数据权限" name="enableDataPermission">
191
+ <a-switch v-model:checked="form.enableDataPermission" />
192
+ </a-form-item>
193
+ <a-form-item v-if="dataPermissionVisible && form.enableDataPermission" label="数据权限规则" name="dataPermissionType">
194
+ <a-select v-model:value="form.dataPermissionType" :options="dataPermissionOptions" />
195
+ </a-form-item>
196
+ </a-form>
197
+
198
+ <template #footer>
199
+ <a-space>
200
+ <a-button @click="setOpen(false)">
201
+ 取消
202
+ </a-button>
203
+ <a-button type="primary" :loading="loading" @click="onSubmit()">
204
+ 提交
205
+ </a-button>
206
+ </a-space>
207
+ </template>
208
+ </a-drawer>
209
+ </template>
@@ -0,0 +1,100 @@
1
+ <script setup lang="ts">
2
+ import type { ColumnsType } from 'ant-design-vue/es/table';
3
+ import type { TreeNode } from '../interface';
4
+ import { getRbacResourceGetRoleListByResourceId } from '@/api/modules/rbac';
5
+ import { useToggle } from '@vueuse/core';
6
+ import { useRequest } from 'alova/client';
7
+ import { theme } from 'ant-design-vue';
8
+
9
+ defineOptions({
10
+ name: 'RoleRelation',
11
+ });
12
+
13
+ const { token } = theme.useToken();
14
+
15
+ const [open, setOpen] = useToggle(false);
16
+ const { loading, data: dataSource, send } = useRequest(
17
+ params => getRbacResourceGetRoleListByResourceId(params, {
18
+ transform(data) {
19
+ return data.data ?? [];
20
+ },
21
+ }),
22
+ { immediate: false },
23
+ );
24
+
25
+ const columns: ColumnsType<API.PubRoleBo> = [
26
+ {
27
+ title: '角色名称',
28
+ dataIndex: 'name',
29
+ ellipsis: true,
30
+ },
31
+ {
32
+ title: '创建人',
33
+ dataIndex: 'createUserName',
34
+ width: 180,
35
+ ellipsis: true,
36
+ },
37
+ ];
38
+
39
+ function onOpen(record: TreeNode) {
40
+ setOpen(true);
41
+ send({ id: record.id });
42
+ computeTableHeight();
43
+ }
44
+
45
+ const tableHeight = computed(() => {
46
+ return window.innerHeight
47
+ - 57 // Drawer header
48
+ - 48 // Drawer padding
49
+ - 55 // Table header
50
+ - 64; // Table pagination
51
+ });
52
+
53
+ function computeTableHeightHandler() {
54
+ nextTick(() => {
55
+ const tableBody = document.querySelector('.role-relation')?.querySelector<HTMLElement>('.ant-table-body');
56
+ if (tableBody) {
57
+ tableBody.style.height = `${tableHeight.value}px`;
58
+ }
59
+ });
60
+ }
61
+
62
+ function computeTableHeight() {
63
+ nextTick(computeTableHeightHandler);
64
+ }
65
+
66
+ defineExpose({
67
+ open: onOpen,
68
+ });
69
+ </script>
70
+
71
+ <template>
72
+ <a-drawer
73
+ v-model:open="open"
74
+ title="分配查看"
75
+ placement="right"
76
+ :width="520"
77
+ :footer-style="{ textAlign: 'right' }"
78
+ >
79
+ <a-table
80
+ row-key="id"
81
+ :loading="loading"
82
+ :columns="columns"
83
+ :data-source="dataSource"
84
+ :scroll="{ y: `${tableHeight}px` }"
85
+ :pagination="{ defaultPageSize: 20, showSizeChanger: true }"
86
+ class="role-relation"
87
+ >
88
+ <template #bodyCell="{ column, text }">
89
+ <template v-if="column.dataIndex === 'name'">
90
+ <div class="w-full truncate space-x-2">
91
+ <a-avatar size="small" :style="{ backgroundColor: token.colorPrimary }">
92
+ {{ text[0] }}
93
+ </a-avatar>
94
+ <span>{{ text }}</span>
95
+ </div>
96
+ </template>
97
+ </template>
98
+ </a-table>
99
+ </a-drawer>
100
+ </template>
@@ -0,0 +1,35 @@
1
+ /** 操作按钮 */
2
+ export enum ACTION {
3
+ /** 分配查看 */
4
+ ROLE_RELATION = '分配查看',
5
+ /** 新建 */
6
+ ADD = '新建',
7
+ /** 新建下级 */
8
+ ADD_CHILD = '新建下级',
9
+ /** 修改 */
10
+ EDIT = '修改',
11
+ /** 删除 */
12
+ REMOVE = '删除',
13
+ }
14
+
15
+ /** 资源类型 */
16
+ export enum RESOURCE_TYPE {
17
+ /** 应用 */
18
+ APP = '1',
19
+ /** 目录 */
20
+ INDEX = '2',
21
+ /** 菜单 */
22
+ MENU = '3',
23
+ /** 按钮 */
24
+ BUTTON = '4',
25
+ /** 非菜单页 */
26
+ NON_MENU = '5',
27
+ }
28
+
29
+ export const resourceOptions = [
30
+ { label: '应用', value: RESOURCE_TYPE.APP },
31
+ { label: '目录', value: RESOURCE_TYPE.INDEX },
32
+ { label: '菜单', value: RESOURCE_TYPE.MENU },
33
+ { label: '按钮', value: RESOURCE_TYPE.BUTTON },
34
+ { label: '非菜单页', value: RESOURCE_TYPE.NON_MENU },
35
+ ];