RoleDrawer.vue 3.79 KB
<template>
  <BasicDrawer
    v-bind="$attrs"
    @register="registerDrawer"
    showFooter
    :title="getTitle"
    width="500px"
    @ok="handleSubmit"
  >
    <BasicForm @register="registerForm">
      <template #menu="{ model, field }">
        <BasicTree
          v-model:value="model[field]"
          :treeData="treeData"
          :replaceFields="{ title: 'menuName' }"
          :checked-keys="roleMenus"
          checkable
          toolbar
          title="菜单分配"
        />
      </template>
    </BasicForm>
  </BasicDrawer>
</template>
<script lang="ts">
import {defineComponent, ref, computed, unref} from 'vue';
import {BasicForm, useForm} from '/@/components/Form/index';
import {formSchema} from './role.data';
import {BasicDrawer, useDrawerInner} from '/@/components/Drawer';
import {BasicTree, TreeItem} from '/@/components/Tree';

const {t} = useI18n(); //加载国际化

// import { getMenuList } from '/@/api/demo/system';

// 加载菜单数据
import {getMenuList, getMenusIdsByRoleId} from '/@/api/sys/menu';
import {useI18n} from "/@/hooks/web/useI18n";
import {RouteItem} from "/@/api/sys/model/menuModel";
import {saveOrUpdateRoleInfoWithMenu} from "/@/api/system/system";

export default defineComponent({
  name: 'RoleDrawer',
  components: {BasicDrawer, BasicForm, BasicTree},
  emits: ['success', 'register'],
  setup(_, {emit}) {
    const isUpdate = ref(true);
    const treeData = ref<TreeItem[]>([]);
    const roleMenus = ref<string[]>([]);
    const roleId = ref("");

    const [registerForm, {resetFields, setFieldsValue, validate}] = useForm({
      labelWidth: 90,
      schemas: formSchema,
      showActionButtonGroup: false,
    });

    function processChildren(items: RouteItem[]) {
      items.map((item) => {
        item.menuName = t(item.meta.title);
        item.icon = item.meta.icon;
        item.key=item.id;
        if (item.children) {
          processChildren(item.children);
        }
      });
    }

    const [registerDrawer, {setDrawerProps, closeDrawer}] = useDrawerInner(async (data) => {
      resetFields();
      roleId.value = "";
      setDrawerProps({confirmLoading: false});
      // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
      if (unref(treeData).length === 0) {
        const menuListModel = await getMenuList();
        processChildren(menuListModel);
        let treeValues = new Array<TreeItem>();
        menuListModel.map((item) => {
          const data = {
            menuName: t(item.meta.title),
            icon: item.meta.icon,
            key: item.id,
            children: item.children as any as TreeItem[],
          }
          treeValues.push(data);
        })
        treeData.value = treeValues;
      }
      if (data.record) {
        roleMenus.value = await getMenusIdsByRoleId(data.record.id);
        console.log(roleMenus.value,"roleMenus.value")
        roleId.value = data.record.id;
      }
      isUpdate.value = !!data?.isUpdate;
      if (unref(isUpdate)) {
        setFieldsValue({
          ...data.record,
        });
      }
    });

    const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色'));

    async function handleSubmit() {
      try {
        const values = await validate();
        setDrawerProps({confirmLoading: true});
        const req = {
          id: roleId.value,
          name: values.name,
          remark: values.remark,
          status: values.status,
          menu: [...values.menu]
        }
        saveOrUpdateRoleInfoWithMenu(req).then(()=>{
          closeDrawer();
          emit('success');
        })
      } finally {
        setDrawerProps({confirmLoading: false});
      }
    }

    return {
      registerDrawer,
      registerForm,
      getTitle,
      handleSubmit,
      treeData,
      roleMenus,
    };
  },
});
</script>