RoleDrawer.vue 5.86 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' }"
          :checkedkeys="roleMenus"
          checkable
          toolbar
          ref="tree"
          title="菜单分配"
          @check="handleCheckClick"
        />
      </template>
    </BasicForm>
  </BasicDrawer>
</template>
<script lang="ts">
  import { defineComponent, ref, computed, unref, getCurrentInstance } 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';
  import { RoleEnum } from '/@/enums/roleEnum';
  // import useCurrentInstance from '/@/hooks/web/useCurrentInstance';

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

      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);
          }
        });
      }

      /**
       * 根据角色id获取所有的菜单ids----里面包含父级id---会造成回显数据时
       * 存在父级id则默认勾选所有子级id
       */
      function useChildrenIdsRemoveParentId(str, arr) {
        let index = arr.indexOf(str);
        arr.splice(index, 1);
        return arr;
      }

      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 (unref(isUpdate)) {
          if (data.record) {
            //通过角色id去获取角色对应的菜单的ids
            roleMenus.value = await getMenusIdsByRoleId(data.record.id);
            treeData.value.map((m) => {
              roleMenus.value.map((m1) => {
                if (m.key === m1) {
                  proxy.useChildrenIdsRemoveParentId(m1, roleMenus.value);
                }
              });
            });
            proxy.$refs.tree.setCheckedKeys(roleMenus.value);
            roleId.value = data.record.id;
          }
          setFieldsValue({
            ...data.record,
          });
        }

        // if (data.record) {
        //   roleMenus.value = await getMenusIdsByRoleId(data.record.id);
        //   roleId.value = data.record.id;
        // }
        // isUpdate.value = !!data?.isUpdate;
        // if (unref(isUpdate)) {
        //   setFieldsValue({
        //     ...data.record,
        //   });
        // }
      });

      // Tree check事件
      const handleCheckClick = (_, e) => {
        allCheckedKeys.value = [];
        let nodes = e.checkedNodes;
        let halfKeys = e.halfCheckedKeys;
        nodes.map((node) => {
          if (node.key != halfKeys[0] && halfKeys.length == []) {
            allCheckedKeys.value.push(node.key);
          } else {
            allCheckedKeys.value.push(node.key);
          }
        });
        allCheckedKeys.value.push(...halfKeys);
      };

      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,
            roleType: RoleEnum.ROLE_TENANT_ADMIN,
            menu: allCheckedKeys.value as string[],
          };
          console.log(req, '请求参数');
          await saveOrUpdateRoleInfoWithMenu(req);
          closeDrawer();
          emit('success');
        } finally {
          setDrawerProps({ confirmLoading: false });
        }
      }

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