@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,161 @@
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 { getDictItemList } from '@/api/modules/configData';
5
+ import { getRbacOrgInfo, postRbacOrgAddOrg, postRbacOrgUpdateOrg } from '@/api/modules/rbac';
6
+ import { useToggle } from '@vueuse/core';
7
+ import { message } from 'ant-design-vue';
8
+ import { ACTION } from '../enum';
9
+
10
+ defineOptions({
11
+ name: 'OrganizationEdit',
12
+ });
13
+
14
+ const emit = defineEmits(['submit']);
15
+
16
+ const rules: Record<string, Rule[]> = {
17
+ name: [{ required: true, message: '请输入组织名称', trigger: 'blur' },
18
+ { max: 128, message: '长度不能超过128位', trigger: 'change' }],
19
+ code: [{ required: true, message: '请输入组织编码', trigger: 'blur' },
20
+ { max: 50, message: '长度不能超过50位', trigger: 'change' }],
21
+ type: [{ required: true, message: '请输入组织类型', trigger: 'blur' }],
22
+ areaCode: [{ max: 16, message: '长度不能超过16位', trigger: 'change' }],
23
+ creditCode: [{ max: 50, message: '长度不能超过50位', trigger: 'change' }],
24
+ contactPerson: [{ max: 50, message: '长度不能超过50位', trigger: 'change' }],
25
+ contactMobile: [{ max: 20, message: '长度不能超过20位', trigger: 'change' }],
26
+ };
27
+ const state = reactive({
28
+ title: '',
29
+ type: '',
30
+ });
31
+ const [open, setOpen] = useToggle(false);
32
+ const formRef = ref<FormExpose>();
33
+ const typeOptions: Ref<{ label?: string, value?: string }[] | undefined> = ref([]);
34
+
35
+ getDictItemList({ dictCode: 'orgType' }).then((res: API.ResponseDataListDictItemVo) => {
36
+ typeOptions.value = res.data?.map((e) => {
37
+ return {
38
+ label: e.dictLabel,
39
+ value: e.dictValue,
40
+ };
41
+ });
42
+ });
43
+ const form = ref<Partial<API.PubOrg & { parentName: string } >>({ parentId: '', enable: true });
44
+ async function onOpen(key: ACTION, record?: API.PubOrg) {
45
+ setOpen(true);
46
+ state.title = key;
47
+ if (key === ACTION.EDIT) {
48
+ const res = await getRbacOrgInfo({ id: record?.id as string });
49
+ if (res.success) {
50
+ form.value = res.data ?? {};
51
+ }
52
+ }
53
+ else if (key === ACTION.ADDNEXT) {
54
+ form.value = {
55
+ parentName: record?.name,
56
+ parentId: record?.id,
57
+ enable: true,
58
+ district: false,
59
+ };
60
+ }
61
+ else {
62
+ form.value = {
63
+ parentId: '',
64
+ enable: true,
65
+ district: false,
66
+ };
67
+ }
68
+ }
69
+
70
+ const [loading, setLoading] = useToggle(false);
71
+ function onSubmit() {
72
+ const request = state.title === ACTION.EDIT ? postRbacOrgUpdateOrg : postRbacOrgAddOrg;
73
+ formRef.value?.validate().then(() => {
74
+ setLoading(true);
75
+ const params: any = { ...form.value };
76
+ request(params)
77
+ .then((res: API.ResponseDataPubOrg) => {
78
+ if (res.success) {
79
+ message.success(`${state.title}成功!`);
80
+ setOpen(false);
81
+ emit('submit', { ...form.value });
82
+ }
83
+ })
84
+ .finally(() => setLoading(false));
85
+ });
86
+ }
87
+ function close() {
88
+ form.value = {
89
+ enable: false,
90
+ };
91
+ setOpen(false);
92
+ }
93
+
94
+ defineExpose({
95
+ open: onOpen,
96
+ });
97
+ </script>
98
+
99
+ <template>
100
+ <a-drawer
101
+ v-model:open="open"
102
+ :title="`${state.title}组织`"
103
+ placement="right"
104
+ :width="600"
105
+ destroy-on-close
106
+ :footer-style="{ textAlign: 'right' }"
107
+ @close="close"
108
+ >
109
+ <a-form
110
+ ref="formRef"
111
+ :model="form"
112
+ :rules="rules"
113
+ :label-col="{ span: 6 }"
114
+ :label-wrap="true"
115
+ >
116
+ <a-form-item v-if="form.parentId !== '' && form.parentId !== '0'" label="所属上级">
117
+ {{ form.parentName }}
118
+ </a-form-item>
119
+ <a-form-item label="组织名称" name="name">
120
+ <a-input v-model:value="form.name" />
121
+ </a-form-item>
122
+ <a-form-item label="组织编码" name="code">
123
+ <a-input v-model:value="form.code" />
124
+ </a-form-item>
125
+ <a-form-item label="组织类型" name="type">
126
+ <a-select v-model:value="form.type" :options="typeOptions" />
127
+ </a-form-item>
128
+ <a-form-item label="是否行政区划">
129
+ <a-switch v-model:checked="form.district" />
130
+ </a-form-item>
131
+ <a-form-item v-if="form.district" label="行政区划编码" name="areaCode">
132
+ <a-input v-model:value="form.areaCode" />
133
+ </a-form-item>
134
+ <a-form-item label="是否启用">
135
+ <a-switch v-model:checked="form.enable" />
136
+ </a-form-item>
137
+ <a-form-item label="排序">
138
+ <a-input-number v-model:value="form.sort" />
139
+ </a-form-item>
140
+ <a-form-item label="统一社会信用代码" name="creditCode">
141
+ <a-input v-model:value="form.creditCode" />
142
+ </a-form-item>
143
+ <a-form-item label="联系人" name="contactPerson">
144
+ <a-input v-model:value="form.contactPerson" />
145
+ </a-form-item>
146
+ <a-form-item label="联系方式" name="contactMobile">
147
+ <a-input v-model:value="form.contactMobile" />
148
+ </a-form-item>
149
+ </a-form>
150
+ <template #footer>
151
+ <a-space>
152
+ <a-button @click="close">
153
+ 取消
154
+ </a-button>
155
+ <a-button type="primary" :loading="loading" @click="onSubmit()">
156
+ 提交
157
+ </a-button>
158
+ </a-space>
159
+ </template>
160
+ </a-drawer>
161
+ </template>
@@ -0,0 +1,159 @@
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 { getRbacOrgRoleGetByOrgId, postRbacOrgRoleSaveOrgRole } from '@/api/modules/rbac';
5
+ import useAppAndResource from '@/components/ResourceSelector/hooks/useAppAndResource';
6
+ import { useToggle } from '@vueuse/core';
7
+ import { message } from 'ant-design-vue';
8
+ import RoleSelect from './roleSelect.vue';
9
+
10
+ defineOptions({
11
+ name: 'DrawerRole',
12
+ });
13
+
14
+ const emit = defineEmits(['submit']);
15
+
16
+ const {
17
+ resourceModelRef,
18
+ selectedResources,
19
+ setSelectedResources,
20
+ openResourceModel,
21
+ } = useAppAndResource();
22
+
23
+ const rules: Record<string, Rule[]> = {
24
+ isInherit: [{ required: true, message: '请选择是否可继承', trigger: 'change' }],
25
+ };
26
+
27
+ const state = reactive<{ title: string, type: string }>({
28
+ title: '',
29
+ type: '',
30
+ });
31
+ const [open, setOpen] = useToggle(false);
32
+ const formRef = ref<FormExpose>();
33
+ const form = ref<Partial<API.PubOrgRoleBo>>({ isInherit: '0' });
34
+ const orgId = ref('');
35
+ async function onOpen(record?: API.PubRoleResourceBo) {
36
+ orgId.value = record?.id || '';
37
+ const fv = await getRbacOrgRoleGetByOrgId({ orgId: orgId.value });
38
+ form.value = fv.data || {};
39
+ setOpen(true);
40
+ }
41
+
42
+ const [loading, setLoading] = useToggle(false);
43
+
44
+ const roleModelRef = ref();
45
+ function chooseRole() {
46
+ roleModelRef.value.open((form.value.roleList || []).map((item: API.PubRole) => item.id));
47
+ }
48
+ function onRoleSelected(data: API.PubRole[]) {
49
+ form.value.roleList = data;
50
+ }
51
+ function onSubmit() {
52
+ formRef.value?.validate().then(() => {
53
+ setLoading(true);
54
+ const rIds = (form.value.roleList || []).map((item: API.PubRole) => {
55
+ // 在下拉框中选择之后,roleIds每一项的值会变成一个对象
56
+ if (typeof item === 'object' && item.id) {
57
+ return item.id;
58
+ }
59
+ // 若未更改过,其原始值是string,直接返回
60
+ return '';
61
+ });
62
+ postRbacOrgRoleSaveOrgRole({ orgId: orgId.value, roleIds: rIds.join(','), isInherit: form.value.isInherit || '0' })
63
+ .then((res) => {
64
+ if (res.success) {
65
+ message.success(`授权成功!`);
66
+ setOpen(false);
67
+ emit('submit');
68
+ }
69
+ })
70
+ .finally(() => setLoading(false));
71
+ });
72
+ }
73
+ function close() {
74
+ form.value = {
75
+ isInherit: '0',
76
+ };
77
+ setOpen(false);
78
+ }
79
+
80
+ defineExpose({
81
+ open: onOpen,
82
+ });
83
+ </script>
84
+
85
+ <template>
86
+ <a-drawer
87
+ v-model:open="open"
88
+ title="组织角色授权"
89
+ placement="right"
90
+ :width="600"
91
+ destroy-on-close
92
+ :footer-style="{ textAlign: 'right' }"
93
+ @close="close"
94
+ >
95
+ <a-form
96
+ ref="formRef"
97
+ :model="form"
98
+ :rules="rules"
99
+ label-align="left"
100
+ :label-col="{ span: 4 }"
101
+ >
102
+ <a-form-item label="是否可继承" name="name">
103
+ <a-switch v-model:checked="form.isInherit" checked-value="1" un-checked-value="0" />
104
+ <!-- <a-radio-group v-model:value="form.isInherit">
105
+ <a-radio value="1">
106
+
107
+ </a-radio>
108
+ <a-radio value="0">
109
+
110
+ </a-radio>
111
+ </a-radio-group> -->
112
+ </a-form-item>
113
+ <a-form-item label="基础角色权限" name="roleList">
114
+ <a-button type="primary" @click="chooseRole">
115
+ 选择角色
116
+ </a-button>
117
+ </a-form-item>
118
+ <a-form-item v-show="form.roleList && form.roleList.length > 0" label="已选角色">
119
+ <div class="mt-2px">
120
+ <template v-for="ite in form.roleList" :key="ite.id">
121
+ <a-tooltip v-if="(ite?.name || '').length > 20" :title="ite.name">
122
+ <span class="inline-block mb-6px mr-6px bg-[#E8F3FF] rounded-2px px-8px py-3px whitespace-nowrap dark:bg-[#141414]">
123
+ {{ `${ite?.name?.slice(0, 20)}...` }}
124
+ </span>
125
+ </a-tooltip>
126
+ <span v-else class="inline-block mb-6px mr-6px bg-[#E8F3FF] rounded-2px px-8px py-3px whitespace-nowrap dark:bg-[#141414]">
127
+ {{ ite.name }}
128
+ </span>
129
+ </template>
130
+ </div>
131
+ </a-form-item>
132
+ <a-form-item v-show="form.inheritRoleList && form.inheritRoleList.length > 0" label="继承角色">
133
+ <div class="mt-2px">
134
+ <template v-for="ite in form.inheritRoleList" :key="ite.id">
135
+ <a-tooltip v-if="(ite?.name || '').length > 20" :title="ite.name">
136
+ <span class="inline-block mb-6px mr-6px bg-[#E8F3FF] rounded-2px px-8px py-3px whitespace-nowrap dark:bg-[#141414]">
137
+ {{ `${ite?.name?.slice(0, 20)}...` }}
138
+ </span>
139
+ </a-tooltip>
140
+ <span v-else class="inline-block mb-6px mr-6px bg-[#E8F3FF] rounded-2px px-8px py-3px whitespace-nowrap dark:bg-[#141414]">
141
+ {{ ite.name }}
142
+ </span>
143
+ </template>
144
+ </div>
145
+ </a-form-item>
146
+ </a-form>
147
+ <template #footer>
148
+ <a-space>
149
+ <a-button @click="close">
150
+ 取消
151
+ </a-button>
152
+ <a-button type="primary" :loading="loading" @click="onSubmit()">
153
+ 提交
154
+ </a-button>
155
+ </a-space>
156
+ </template>
157
+ <RoleSelect ref="roleModelRef" @select="onRoleSelected" />
158
+ </a-drawer>
159
+ </template>
@@ -0,0 +1,258 @@
1
+ <script setup lang="ts">
2
+ import { getRbacPubRoleGroupGetAll, getRbacPubRoleGroupGetById, getRbacRoleRoleList } from '@/api/modules/rbac';
3
+ import { SearchOutlined } from '@ant-design/icons-vue';
4
+ import { useToggle } from '@vueuse/core';
5
+
6
+ defineOptions({
7
+ name: 'RoleSelect',
8
+ });
9
+
10
+ const emit = defineEmits(['select']);
11
+
12
+ const loading = ref(false);
13
+ const checkedKeys: Ref<string[]> = ref([]);
14
+ const rightItems: Ref<API.PubRole[]> = ref([]);
15
+ const roleData = ref<API.PubRole[]>([]);
16
+ const searchContent = ref('');
17
+ const open = defineModel<boolean>('open');
18
+ const selectedGroupId = ref('');
19
+ const roleGroupOptions = ref<API.PubRoleGroup[]>([]);
20
+ const roleInGroup = ref<API.PubRole[]>([]);
21
+
22
+ const setOpen = useToggle(open);
23
+ watch(() => checkedKeys.value, (val) => {
24
+ rightItems.value = val.reduce((acc: API.PubRole[], ite: string) => {
25
+ const temp = roleData.value.find(item => item.id === ite) || {};
26
+ acc.push(temp);
27
+ return acc;
28
+ }, []);
29
+ }, { deep: true });
30
+ watch(() => selectedGroupId.value, (val) => {
31
+ changeGroup(val);
32
+ });
33
+ async function onOpen(ids: string[]) {
34
+ // 获取所有角色组
35
+ const groupRes = await getRbacPubRoleGroupGetAll({ name: '' });
36
+ roleGroupOptions.value = groupRes.data || [];
37
+ selectedGroupId.value = '';
38
+ await changeGroup('');
39
+ checkedKeys.value = [...ids];
40
+ setOpen(true);
41
+ }
42
+
43
+ function clearAllChecked() {
44
+ checkedKeys.value = [];
45
+ }
46
+
47
+ function handleCloseTag(removedTagId: string) {
48
+ const index = checkedKeys.value.findIndex(item => item === removedTagId);
49
+ if (index >= 0) {
50
+ checkedKeys.value.splice(index, 1);
51
+ }
52
+ }
53
+
54
+ function notifySelect() {
55
+ emit('select', rightItems.value);
56
+ setOpen(false);
57
+ }
58
+
59
+ function filterName(v: API.PubRole) {
60
+ return roleInGroup.value.findIndex(item => item.id === v.id) > -1 && v.name?.includes(searchContent.value);
61
+ }
62
+
63
+ // 切换角色组
64
+ async function changeGroup(value: string | undefined) {
65
+ loading.value = true;
66
+ if (value) {
67
+ const res = await getRbacPubRoleGroupGetById({ id: value });
68
+ loading.value = false;
69
+ roleInGroup.value = res.data?.roles || [];
70
+ }
71
+ else {
72
+ const res = await getRbacRoleRoleList();
73
+ loading.value = false;
74
+ roleData.value = res.data || [];
75
+ // 获取两个数组交集
76
+ roleInGroup.value = [...roleData.value].filter(x => [...(res.data || [])].some(y => y.id === x.id));
77
+ }
78
+ }
79
+ defineExpose({
80
+ open: onOpen,
81
+ });
82
+ </script>
83
+
84
+ <template>
85
+ <a-modal
86
+ v-model:open="open"
87
+ class="custom_modal"
88
+ title="角色选择"
89
+ :mask-closable="false"
90
+ :width="750"
91
+ >
92
+ <div class="h-340px border-1px border-solid flex flex-row border_color">
93
+ <div class="w-360px flex flex-col">
94
+ <div class="flex-1 overflow-hidden py-10px px-10px">
95
+ <a-input v-model:value="searchContent" placeholder="请输入" allow-clear>
96
+ <template #addonBefore>
97
+ <a-select v-model:value="selectedGroupId" style="width: 90px;">
98
+ <a-select-option value="">
99
+ 全部
100
+ </a-select-option>
101
+ <a-select-option v-for="item in roleGroupOptions" :key="item.id" :value="item.id">
102
+ <a-tooltip :title="item.name">
103
+ {{ item.name }}
104
+ </a-tooltip>
105
+ </a-select-option>
106
+ </a-select>
107
+ </template>
108
+ <template #suffix>
109
+ <SearchOutlined />
110
+ </template>
111
+ </a-input>
112
+ <div class="overflow-y-auto overflow-x-hidden h-[calc(100%-30px)] mt-10px">
113
+ <a-spin v-if="loading" class="cent" />
114
+ <a-checkbox-group v-else v-model:value="checkedKeys" class="w-full">
115
+ <div v-for="ite in roleData" v-show="filterName(ite)" :key="ite.id" class="w-full py-10px bodb">
116
+ <a-checkbox :value="ite.id">
117
+ <a-tooltip v-if="(ite.name || '').length > 22" :title="ite.name">
118
+ {{ `${ite?.name?.slice(0, 22)}...` }}
119
+ </a-tooltip>
120
+ <span v-else>{{ ite.name }}</span>
121
+ </a-checkbox>
122
+ </div>
123
+ </a-checkbox-group>
124
+ </div>
125
+ </div>
126
+ </div>
127
+
128
+ <div class="flex-1 flex flex-col border-solid border-0px border-l-1px border_color">
129
+ <div class="w-full h-34px bg-[#F2F3F5] flex px-15px items-center justify-between text-[#1D2129] dark:bg-[#1D2129] dark:text-[#F2F3F5]">
130
+ <div class="">
131
+ 已选角色
132
+ </div>
133
+ <div class="cursor-pointer text-[#165DFF]" @click="clearAllChecked">
134
+ 清空
135
+ </div>
136
+ </div>
137
+ <div class="flex-1 p-10px overflow-auto">
138
+ <div v-for="item in rightItems" :key="item.id" class="inline-block mb-6px max-w-300px">
139
+ <a-tooltip v-if="(item.name || '').length > 20" :title="item.name">
140
+ <a-tag class="custom_tag bg-[#e8f3ff] dark:bg-[#141414]" closable @close="handleCloseTag(item.id || '')">
141
+ {{ `${item?.name?.slice(0, 20)}...` }}
142
+ </a-tag>
143
+ </a-tooltip>
144
+ <a-tag
145
+ v-else
146
+ class="custom_tag bg-[#e8f3ff] dark:bg-[#141414]"
147
+ closable
148
+ @close="handleCloseTag(item.id || '')"
149
+ >
150
+ {{ item.name }}
151
+ </a-tag>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </div>
156
+
157
+ <template #footer>
158
+ <a-button @click="setOpen(false)">
159
+ 取消
160
+ </a-button>
161
+ <a-button type="primary" @click="notifySelect">
162
+ 确定
163
+ </a-button>
164
+ </template>
165
+ </a-modal>
166
+ </template>
167
+
168
+ <style lang="scss" scoped>
169
+ .cent {
170
+ position: relative;
171
+ top: 50%;
172
+ left: 50%;
173
+ transform: translate(-50%, -50%);
174
+ }
175
+
176
+ .border_color {
177
+ border-color: #e5e6eb;
178
+ }
179
+
180
+ [data-theme="dark"] {
181
+ .border_color {
182
+ border-color: rgb(253 253 253 / 12%);
183
+ }
184
+ }
185
+
186
+ .border_c {
187
+ border: 1px dashed #ccc;
188
+ border-radius: 10px;
189
+ }
190
+
191
+ :deep(.ant-dropdown-link) {
192
+ padding: 4px 6px;
193
+ font-size: 12px;
194
+ border-radius: 2px;
195
+ transform: scale(0.7);
196
+ }
197
+ </style>
198
+
199
+ <style lang='scss' scoped>
200
+ .custom_modal {
201
+ :deep(.ant-modal-content) {
202
+ padding: 0;
203
+ border-radius: 0;
204
+ }
205
+
206
+ :deep(.ant-modal-header) {
207
+ padding: 12px 16px;
208
+ margin-bottom: 0;
209
+ border-bottom: 1px solid #e5e6eb;
210
+ }
211
+
212
+ :deep(.ant-modal-title) {
213
+ font-size: 16px;
214
+ font-weight: 500;
215
+ color: #1d2129;
216
+ }
217
+
218
+ :deep(.ant-modal-body) {
219
+ padding: 16px;
220
+ }
221
+
222
+ .bodb {
223
+ border-bottom: 1px solid #e5e6eb;
224
+ }
225
+
226
+ :deep(.ant-modal-footer) {
227
+ padding: 16px;
228
+ border-top: 1px solid #e5e6eb;
229
+
230
+ .ant-btn {
231
+ border-radius: 2px;
232
+ }
233
+ }
234
+ }
235
+
236
+ :deep(.ant-tree-checkbox) {
237
+ margin-block-start: 0;
238
+ margin-inline-end: 2px;
239
+ }
240
+
241
+ :deep(.ant-tree-checkbox + span .ant-tree-iconEle) {
242
+ margin-right: 4px;
243
+ }
244
+
245
+ .custom_tag {
246
+ padding: 3px 8px;
247
+ border-width: 0;
248
+ border-radius: 2px;
249
+
250
+ :deep(.ant-tag-close-icon) {
251
+ color: rgb(22 93 255 / 60%);
252
+
253
+ &:hover {
254
+ color: #165dff;
255
+ }
256
+ }
257
+ }
258
+ </style>
@@ -0,0 +1,26 @@
1
+ export enum ACTION {
2
+ AUTHORIZE = '授权',
3
+ ADD = '新增',
4
+ ADDNEXT = '新增下级',
5
+ /** 详情 */
6
+ EDIT = '编辑',
7
+ /** 删除 */
8
+ REMOVE = '删除',
9
+ }
10
+
11
+ export enum RESOURCE_TYPE {
12
+ OWNER = '1',
13
+ ALL = '2',
14
+ }
15
+ export enum ENABLE_TYPE {
16
+ ON = 1,
17
+ OFF = 0,
18
+ }
19
+ export const kjOptions = [
20
+ { label: '仅自己', value: RESOURCE_TYPE.OWNER },
21
+ { label: '全部可见', value: RESOURCE_TYPE.ALL },
22
+ ];
23
+ export const enableOptons = [
24
+ { label: '正常', value: ENABLE_TYPE.ON },
25
+ { label: '关闭', value: ENABLE_TYPE.OFF },
26
+ ];