role-permission.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <template>
  2. <div>
  3. <el-tree
  4. class="mgb10"
  5. ref="tree"
  6. :data="data"
  7. node-key="id"
  8. default-expand-all
  9. show-checkbox
  10. :default-checked-keys="checkedKeys"
  11. />
  12. <el-button type="primary" @click="onSubmit">保存权限</el-button>
  13. </div>
  14. </template>
  15. <script setup >
  16. import { ref } from 'vue';
  17. import { ElTree } from 'element-plus';
  18. import { menuData } from '@/components/menu';
  19. const props = defineProps({
  20. permissOptions: {
  21. type: Object,
  22. required: true,
  23. },
  24. });
  25. const menuObj = ref({});
  26. // const data = menuData.map((item) => {
  27. // if (item.children) {
  28. // menuObj.value[item.id] = item.children.map((sub) => sub.id);
  29. // }
  30. // return {
  31. // id: item.id,
  32. // label: item.title,
  33. // children: item.children?.map((child) => {
  34. // return {
  35. // id: child.id,
  36. // label: child.title,
  37. // };
  38. // }),
  39. // };
  40. // });
  41. const getTreeData = (data) => {
  42. return data.map((item) => {
  43. const obj = {
  44. id: item.id,
  45. label: item.title,
  46. };
  47. if (item.children) {
  48. menuObj.value[item.id] = item.children.map((sub) => sub.id);
  49. obj.children = getTreeData(item.children);
  50. }
  51. return obj;
  52. });
  53. };
  54. const data = getTreeData(menuData);
  55. const checkData = (data) => {
  56. return data.filter((item) => {
  57. return !menuObj.value[item] || data.toString().includes(menuObj.value[item].toString());
  58. });
  59. };
  60. // 获取当前权限
  61. const checkedKeys = ref(checkData(props.permissOptions.permiss));
  62. // 保存权限
  63. const tree = ref(null);
  64. const onSubmit = () => {
  65. // 获取选中的权限
  66. const keys = [...tree.value.getCheckedKeys(false), ...tree.value.getHalfCheckedKeys()];
  67. console.log(keys);
  68. };
  69. </script>
  70. <style scoped></style>