permission.vue 4.63 KB
<script setup lang="ts">
import { reactive, ref, getCurrentInstance, onMounted } from "vue";
import { rolePermissionSave, rolePermission } from "@/api/user/role";
import { useRoute } from "vue-router";
import { back } from "@/utils/tool";
import type Node from "element-plus/es/components/tree/src/model/node";
import type { ElForm } from "element-plus";
import type { ElTree } from "element-plus";
const {
  appContext: {
    config: { globalProperties },
  },
} = getCurrentInstance();
let form = reactive({
  data: {
    roleId: useRoute().query.roleId,
    permissionIds: [],
  },
  loading: false,
  permissions: [],
  collections: [],
});
const ruleFormRef = ref<InstanceType<typeof ElForm>>();
const addTreeTest = ref<InstanceType<typeof ElTree>>();
/**
 * 表单重置
 */
const resetForm = (formEl: InstanceType<typeof ElForm> | undefined) => {
  if (!formEl) return;
  addTreeTest.value!.setCheckedNodes([]);
  formEl.resetFields();
};
/**
 * 表单提交
 */
const submitForm = (formEl: InstanceType<typeof ElForm> | undefined) => {
  form.loading = true;
  if (!formEl) return;
  formEl.validate((valid) => {
    if (valid) {
      rolePermissionSave(form.data)
        .then((res) => {
          if (res) {
            globalProperties.$message.success("操作成功");
            history.go(-1);
          }
        })
        .catch((error) => {
          console.log(error);
        })
        .finally(() => {
          form.loading = false;
        });
    } else {
      globalProperties.$message.error("请检查表单格式");
      form.loading = false;
      return false;
    }
  });
};
/**
 * 获取角色权限
 * @param {number | string} roleId 角色id
 */
const getPermissions = async (roleId = useRoute().query.roleId) => {
  try {
    let res = await rolePermission({ roleId: roleId });
    form.permissions = res?.data?.data;
    form.data.permissionIds = getCheckedPermissions(res?.data?.data);
  } catch (e) {
    console.log(e);
  }
};
interface Tree {
  label: string;
  children?: Tree[];
}
/**
 * 树组件自定义属性
 */
const defaultProps: Tree = {
  children: "menuList",
  label: "name",
};
/**
 * 选中树节点回显
 * @param {array} menuArray 树数组
 * @returns {array}
 */
const getCheckedPermissions = (menuArray: Tree[]) => {
  if (menuArray) {
    menuArray.map((item: Tree) => {
      if (item.menuList) {
        getCheckedPermissions(item.menuList);
      }
      if (item.selected) {
        form.collections.push(item.id);
      }
    });
  }
  return form.collections;
};
/**
 * 获取选中的树节点
 * @param {object} node 树节点对象
 * @param {array} array 树数组
 */
const getCheckedRoles = (node: Node, data: Node[]) => {
  // form.data.permissionIds = data.checkedKeys;
  // 严格模式用下面这句,选上级带下级一堆用上面这句
  form.data.permissionIds = [...data.checkedKeys, ...data.halfCheckedKeys];
};
onMounted(() => {
  getPermissions();
});
</script>

<template>
  <div class="page-container">
    <el-card class="form_card" style="max-width: 1303px">
      <h1 v-show="form.dataType === 'edit'">角色权限</h1>
      <el-form
        :inline="true"
        :model="form.data"
        ref="ruleFormRef"
        label-width="120px"
        class="card-form"
      >
        <el-form-item label="角色名称" prop="roleName" style="width: 100%">
          <el-input
            v-model.trim="useRoute().query.roleName"
            placeholder="请填写角色名称"
            maxlength="15"
            disabled
          />
        </el-form-item>
        <el-form-item label="角色ID" prop="roleDesc" style="width: 100%">
          <el-input
            v-model.trim="useRoute().query.roleId"
            placeholder="请填写角色ID"
            maxlength="15"
            disabled
          />
        </el-form-item>
        <el-form-item label="角色权限" prop="permissionIds" style="width: 100%">
          <el-tree
            :data="form.permissions"
            :props="defaultProps"
            :default-checked-keys="form.data.permissionIds"
            node-key="id"
            ref="addTreeTest"
            show-checkbox
            :check-strictly="true"
            @check="getCheckedRoles"
          />
        </el-form-item>
        <el-form-item style="width: 100%">
          <el-button
            type="primary"
            @click.prevent="submitForm(ruleFormRef)"
            :loading="form.loading"
            >提交</el-button
          >
          <el-button type="info" @click="resetForm(ruleFormRef)"
            >置空</el-button
          >
          <el-button type="info" @click="back">返回</el-button>
        </el-form-item>
      </el-form>
    </el-card>
  </div>
</template>