bind.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <el-drawer v-model="visible" :size="600" append-to-body @closed="$emit('closed')">
  3. <template #header="{ titleId, titleClass }">
  4. <span :id="titleId" :class="titleClass">【{{ form.name }}】菜单分配</span>
  5. </template>
  6. <el-tree ref="formRef" v-loading="loading" node-key="id" :data="menuTree" :default-checked-keys="form.menuIdList" expand-on-click-node show-checkbox check-strictly>
  7. <template #default="{ data }">
  8. <vxe-text-ellipsis :id="data.id" :title="data.title" class="custom-tree-node" :content="data.title"></vxe-text-ellipsis>
  9. </template>
  10. </el-tree>
  11. <template #footer>
  12. <el-button auto-insert-space @click="visible = false">取消</el-button>
  13. <el-button :loading="isSaving" type="primary" auto-insert-space @click="submit">保存</el-button>
  14. </template>
  15. </el-drawer>
  16. </template>
  17. <script setup>
  18. import XEUtils from "xe-utils";
  19. import API from "@/api";
  20. import TOOL from "@/utils/tool";
  21. const $emit = defineEmits(["success", "closed"]);
  22. const visible = ref(false);
  23. const loading = ref(false);
  24. const isSaving = ref(false);
  25. const menuTree = ref([]);
  26. const form = ref({
  27. id: null,
  28. name: null,
  29. menuIdList: []
  30. });
  31. const setData = data => {
  32. visible.value = true;
  33. XEUtils.objectEach(form.value, (_, key) => XEUtils.set(form.value, key, XEUtils.get(data, key)));
  34. fetchBindMenu();
  35. }
  36. const fetchBindMenu = () => {
  37. const mode = TOOL.data.get("USER_INFO").tenantId === "0" ? "get" : "build";
  38. loading.value = true;
  39. Promise.all([
  40. API.system.menu[mode](),
  41. API.system.roleMenu.get({ roleId: form.value.id })
  42. ]).then(res => {
  43. loading.value = false;
  44. menuTree.value = XEUtils.toArrayTree(XEUtils.first(res), { parentKey: "pid", sortKey: "menuSort" });
  45. form.value.menuIdList = XEUtils.map(XEUtils.last(res), item => item.menuId);
  46. }).catch(() => {
  47. loading.value = false;
  48. menuTree.value = [];
  49. form.value.menuIdList = [];
  50. });
  51. }
  52. const formRef = ref();
  53. const submit = () => {
  54. const data = {
  55. roleId: form.value.id,
  56. menuIdList: formRef.value.getCheckedKeys()
  57. }
  58. isSaving.value = true;
  59. API.system.roleMenu.edit(data).then(res => {
  60. isSaving.value = false;
  61. ElMessage.success("操作成功");
  62. visible.value = false;
  63. }).catch(() => isSaving.value = false);
  64. }
  65. defineExpose({
  66. setData
  67. });
  68. </script>
  69. <style scoped>
  70. .el-tree {width: calc(100% - 40px);margin: auto;}
  71. .el-tree :deep(.el-tree-node.is-current > .el-tree-node__content) {color: var(--el-text-color-primary);}
  72. </style>