效果图如下:
子组件:
<template>
<el-drawer
:visible.sync="dialogVisible"
:direction="direction"
:show-close="false"
@close="close"
@open="open"
>
<div slot="title" class="demo-drawer__header">
<span>{{ title }}</span>
</div>
<div class="demo-drawer__content">
<el-form ref="form" :model="data" :rules="rules" label-width="80px">
<el-form-item label="角色名称" prop="roleName">
<el-input
size="small"
v-model.trim="data.roleName"
placeholder="请输入"
maxlength="20"
show-word-limit
clearable
:disabled="disabled"
></el-input>
</el-form-item>
<el-form-item label="角色描述">
<el-input
type="textarea"
v-model="data.remark"
placeholder="请输入角色描述..."
:disabled="disabled"
></el-input>
</el-form-item>
<el-form-item label="页面授权" required>
<el-tree
class="page_box"
:data="treeData"
show-checkbox
node-key="id"
:props="props"
ref="tree"
>
</el-tree>
</el-form-item>
<el-form-item label="数据权限">
<el-checkbox v-model="data.seeAllOkr" :disabled="disabled"
>查看全部目标(包含私密目标)</el-checkbox
>
</el-form-item>
</el-form>
<div class="demo-drawer__footer">
<el-button size="mini" @click="close">取 消</el-button>
<el-button size="mini" type="primary" @click="submitForm"
>确 定</el-button
>
</div>
</div>
</el-drawer>
</template>
<script>
import { addRole, updateRole } from "@/api/roles";
export default {
props: [
"title",
"visible",
"treeData",
"data",
"props",
"checkedKeys",
"currentNodeKey",
"disabled",
],
data() {
return {
dialogVisible: this.visible,
checkedKeysArr: this.checkedKeys,
direction: "rtl",
rules: {
roleName: [
{
required: true,
message: "请输入",
trigger: "blur",
},
],
menuIds: [
{
required: true,
message: "请选择",
trigger: ["change", "focus"],
},
],
},
};
},
created() {},
mounted() {},
watch: {
visible(newVal) {
this.dialogVisible = newVal;
},
checkedKeys(newVal) {
this.checkedKeysArr = newVal;
},
},
methods: {
// 所有菜单节点数据
getMenuAllCheckedKeys() {
// 目前被选中的菜单节点
let checkedKeys = this.$refs.tree.getCheckedKeys();
return checkedKeys;
},
close() {
this.$refs["form"].resetFields();
this.$refs.tree.setCheckedKeys(this.checkedKeysArr);
this.$emit("close");
},
open() {
this.$nextTick(() => {
this.$refs.tree.setCheckedKeys(this.checkedKeysArr);
});
},
show() {
this.dialogVisible = true;
},
submitForm() {
this.$refs["form"].validate(async (valid) => {
if (valid) {
this.data.menuIds = this.getMenuAllCheckedKeys();
if (this.data.menuIds.length == 0) {
this.$message.error("请勾选页面授权!");
return;
}
if (this.title === "添加角色") {
const { msg, code, data } = await addRole(this.data);
if (code === 200) {
this.successFun(msg);
} else {
this.$message.error(msg);
}
} else {
const { msg, code, data } = await updateRole(this.data);
if (code === 200) {
this.successFun(msg);
} else {
this.$message.error(msg);
}
}
}
});
},
successFun(msg) {
this.$message.success(msg);
this.$refs["form"].resetFields();
this.$emit("success");
this.$emit("close");
},
},
};
</script>
<style scoped lang="scss">
.demo-drawer__content {
display: flex;
flex-direction: column;
height: 100%;
padding: 0 40px;
.page_box {
margin-top: 7px;
}
}
.demo-drawer__content form {
flex: 1;
}
.demo-drawer__footer {
display: flex;
padding: 20px;
justify-content: flex-end;
}
.demo-drawer__header {
background: #4ab26c;
align-items: center;
color: #fff;
display: flex;
padding: 15px 10px;
}
/deep/.el-drawer__header {
padding: 0px;
}
/deep/.el-drawer:focus {
outline: 0;
}
</style>
父组件:
<template>
<div>
<!-- 顶部 -->
<commonHeader class="commonHeader"></commonHeader>
<!-- 添加角色 -->
<create-role
ref="roleMenuTree"
:title="title"
:visible="drawer"
:treeData="menuData"
:data="form"
:props="defaultProps"
:checkedKeys="checkedKeys"
:disabled="disabled"
@close="close"
@success="getList"
></create-role>
<div class="content-wrap paddingTop48">
<div class="main-box">
<div class="top-box">
<div class="left-panel">
<el-row :gutter="24">
<el-col :xs="24" :sm="24" :md="4" :lg="5" :xl="5">
<span class="top-label">角色名称:</span>
<el-input
size="small"
v-model.trim="queryParams.roleName"
placeholder="请输入"
clearable
class="search-input"
@clear="clearName"
></el-input>
</el-col>
<el-col :xs="24" :sm="24" :md="4" :lg="5" :xl="5">
<span class="top-label">角色简介:</span>
<el-input
size="small"
v-model.trim="queryParams.remark"
placeholder="请输入"
clearable
class="search-input"
@clear="clearName"
></el-input>
</el-col>
<el-col :xs="24" :sm="24" :md="4" :lg="5" :xl="5">
<el-button type="success" size="mini" @click="handleQuery"
>搜 索</el-button
>
</el-col>
<el-col
:xs="24"
:sm="24"
:md="4"
:lg="9"
:xl="9"
class="text-right"
>
<el-button size="mini" @click="handleAdd">添加角色</el-button>
</el-col>
</el-row>
</div>
</div>
<el-table
v-loading="listLoading"
:data="tableData"
fit
style="width: 100%"
>
<el-table-column align="center" prop="roleName" label="角色名称">
</el-table-column>
<el-table-column align="center" prop="remark" label="角色简介">
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button @click="handleEdit(scope.row)" type="text" size="small"
>编辑</el-button
>
<el-button
@click="handleDelete(scope.row)"
type="text"
size="small"
>删除</el-button
>
<el-button
@click="handleDetail(scope.row)"
type="text"
size="small"
>权限范围</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
:background="background"
:current-page="queryParams.pageNum"
:layout="layout"
:page-size="queryParams.pageSize"
:total="total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
></el-pagination>
</div>
</div>
</div>
</template>
<script>
import commonHeader from "@/components/header.vue";
import createRole from "./components/createRole.vue";
import {
getList,
getRole,
delRole,
menuTreeSelect,
roleMenuTreeselect,
} from "@/api/roles";
export default {
components: {
commonHeader,
createRole,
},
data() {
return {
title: "",
disabled: false,
drawer: false,
dialogFormVisible: false,
listLoading: false,
background: true,
layout: "total, sizes, prev, pager, next, jumper",
total: 0,
queryParams: {
pageNum: 1,
pageSize: 10,
roleName: "",
remark: "",
},
form: {
roleName: "",
remark: "",
seeAllOkr: false,
menuIds: [],
},
menuData: [],
checkedKeys: [],
defaultProps: {
children: "children",
label: "label",
},
tableData: [],
};
},
created() {
this.getList();
},
mounted() {},
methods: {
// 查询菜单树结构
async getMenuTreeSelect() {
const { msg, code, data } = await menuTreeSelect();
if (code === 200) {
this.menuData = data;
} else {
this.$message.error(msg);
}
},
// 根据角色ID查询菜单树结构
async getRoleMenuTreeselect(roleId) {
const { msg, code, menus, checkedKeys } = await roleMenuTreeselect(
roleId
);
if (code === 200) {
this.menuData = menus;
this.checkedKeys = checkedKeys;
} else {
this.$message.error(msg);
}
},
//获取列表数据
async getList() {
this.listLoading = true;
const { msg, code, rows, total } = await getList(this.queryParams);
if (code === 200) {
this.tableData = rows;
this.total = total;
} else {
this.$message.error(msg);
}
this.listLoading = false;
},
//页码改变
handleCurrentChange(val) {
this.queryParams.pageNum = val;
this.getList();
},
//每页条数改变
handleSizeChange(val) {
this.queryParams.pageSize = val;
this.queryParams.pageNum = 1;
this.getList();
},
// 搜索
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
// input清空事件
clearName() {
this.queryParams.pageNum = 1;
this.getList();
},
handleClick(row) {
this.dialogFormVisible = true;
},
async showEdit(row, detail) {
if (!row) {
this.title = "添加角色";
this.disabled = false;
this.getMenuTreeSelect();
} else {
if (!detail) {
this.title = "编辑角色";
this.disabled = false;
} else {
this.title = "权限范围";
this.disabled = true;
}
await this.getRoleMenuTreeselect(row.roleId);
const { msg, code, data, roleIds } = await getRole(row.roleId);
if (code === 200) {
this.form = data;
} else {
this.$message.error(msg);
}
}
this.drawer = true;
},
handleAdd() {
this.form = {};
this.showEdit();
},
handleEdit(row) {
this.showEdit(row);
},
handleDelete(row) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
const { msg, code, data } = await delRole(row.roleId);
if (code === 200) {
this.$message.success(msg);
this.getList();
} else {
this.$message.error(msg);
}
})
.catch(() => {});
},
handleDetail(row) {
this.showEdit(row, "detail");
},
close() {
this.drawer = false;
this.checkedKeys = [];
},
},
};
</script>
<style scoped lang="scss">
@import "../../../assets/css/roles/roles.scss";
</style>
版权声明:本文为zyg1515330502原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。