<template>
<div class="role-manage">
<div class="query-form">
<el-form ref="form" :inline="true" :model="queryForm">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="queryForm.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getRoleList">查询</el-button>
<el-button @click="handleReset('form')">重置</el-button>
</el-form-item>
</el-form>
</div>
<div class="base-table">
<div class="action">
<el-button type="primary" @click="handleAdd">创建</el-button>
</div>
<el-table :data="roleList">
<el-table-column
v-for="item in columns"
:key="item.prop"
:prop="item.prop"
:label="item.label"
:width="item.width"
:formatter="item.formatter"
>
</el-table-column>
<el-table-column label="操作" width="260">
<template #default="scope">
<el-button size="mini" @click="handleEdit(scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="primary"
@click="handleOpenPermission(scope.row)"
>设置权限</el-button
>
<el-button
type="danger"
size="mini"
@click="handleDel(scope.row._id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
class="pagination"
background
layout="prev, pager, next"
:total="pager.total"
:page-size="pager.pageSize"
@current-change="handleCurrentChange"
/>
</div>
<el-dialog title="用户新增" v-model="showModal">
<el-form
ref="dialogForm"
:model="roleForm"
label-width="100px"
:rules="rules"
>
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="roleForm.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
type="textarea"
:rows="2"
v-model="roleForm.remark"
placeholder="请输入备注"
/>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="handleSubmit">确 定</el-button>
</span>
</template>
</el-dialog>
<!-- 权限弹框-->
<el-dialog title="权限设置" v-model="showPermission">
<el-form label-width="100px">
<el-form-item label="角色名称">
{{ curRoleName }}
</el-form-item>
<el-form-item label="选择权限">
<el-tree
ref="tree"
:data="menuList"
show-checkbox
node-key="_id"
default-expand-all
:props="{ label: 'menuName' }"
>
</el-tree>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showPermission = false">取 消</el-button>
<el-button type="primary" @click="handlePermissionSubmit"
>确 定</el-button
>
</span>
</template>
</el-dialog>
</div>
</template>
<script>
import utils from "../utils/utils";
export default {
name: "role",
data() {
return {
queryForm: {
roleName: "",
},
columns: [
{
label: "角色名称",
prop: "roleName",
},
{
label: "备注",
prop: "remark",
},
{
label: "权限列表",
prop: "permissionList",
width: 200,
formatter: (row, column, value) => {
let names = [];
let list = value.halfCheckedKeys || [];
list.map((key) => {
let name = this.actionMap[key];
if (key && name) names.push(name);
});
return names.join(",");
},
},
{
label: "更新时间",
prop: "updateTime",
formatter(row, column, value) {
return utils.formateDate(new Date(value));
},
},
{
label: "创建时间",
prop: "createTime",
formatter(row, column, value) {
return utils.formateDate(new Date(value));
},
},
],
roleList: [],
pager: {
total: 0,
pageNum: 1,
pageSize: 10,
},
showModal: false,
action: "create",
roleForm: {},
rules: {
roleName: [
{
required: true,
message: "请输入角色角色名称",
},
],
},
// 权限展示
showPermission: false,
curRoleId: "",
curRoleName: "",
menuList: [],
// 菜单映射表
actionMap: {},
};
},
mounted() {
this.getRoleList();
this.getMenuList();
},
methods: {
// 角色列表初始化
async getRoleList() {
try {
let { list, page } = await this.$api.getRoleList({
...this.queryForm,
...this.pager,
});
this.roleList = list;
this.pager.total = page.total;
} catch (e) {
throw new Error(e);
}
},
// 菜单列表初始化
async getMenuList() {
try {
let list = await this.$api.getMenuList();
this.menuList = list;
this.getActionMap(list);
} catch (e) {
throw new Error(e);
}
},
// 表单重置
handleReset(form) {
this.$refs[form].resetFields();
},
// 角色添加
handleAdd() {
this.action = "create";
this.showModal = true;
},
// 角色编辑
handleEdit(row) {
this.action = "edit";
this.showModal = true;
this.$nextTick(() => {
this.roleForm = {
_id: row._id,
roleName: row.roleName,
remark: row.remark,
};
});
},
// 角色删除
async handleDel(_id) {
await this.$api.roleOperate({ _id, action: "delete" });
this.$message.success("删除成功");
this.getRoleList();
},
// 弹框关闭
handleClose() {
this.handleReset("dialogForm");
this.showModal = false;
},
// 角色提交
handleSubmit() {
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
let { roleForm, action } = this;
let params = { ...roleForm, action };
let res = await this.$api.roleOperate(params);
if (res) {
this.showModal = false;
this.$message.success("创建成功");
this.handleReset("dialogForm");
this.getRoleList();
}
}
});
},
handleCurrentChange(current) {
this.pager.pageNum = current;
this.getRoleList();
},
handleOpenPermission(row) {
this.curRoleId = row._id;
this.curRoleName = row.roleName;
this.showPermission = true;
let { checkedKeys } = row.permissionList;
setTimeout(() => {
this.$refs.tree.setCheckedKeys(checkedKeys);
});
},
async handlePermissionSubmit() {
let nodes = this.$refs.tree.getCheckedNodes();
let halfKeys = this.$refs.tree.getHalfCheckedKeys();
let checkedKeys = [];
let parentKeys = [];
nodes.map((node) => {
if (!node.children) {
checkedKeys.push(node._id);
} else {
parentKeys.push(node._id);
}
});
let params = {
_id: this.curRoleId,
permissionList: {
checkedKeys,
halfCheckedKeys: parentKeys.concat(halfKeys),
},
};
await this.$api.updatePermission(params);
this.showPermission = false;
this.$message.success("设置成功");
this.getRoleList();
},
getActionMap(list) {
let actionMap = {};
const deep = (arr) => {
while (arr.length) {
let item = arr.pop();
if (item.children && item.action) {
actionMap[item._id] = item.menuName;
}
if (item.children && !item.action) {
deep(item.children);
}
}
};
deep(JSON.parse(JSON.stringify(list)));
this.actionMap = actionMap;
},
},
};
</script>
<style lang="scss">
</style>
role.js
/**
* 用户管理模块
*/
const router = require('koa-router')()
const Role = require('../models/roleSchema')
const util = require('../utils/util')
const jwt = require('jsonwebtoken')
const md5 = require('md5')
router.prefix('/roles')
// 查询所有角色列表
router.get('/allList', async (ctx) => {
try {
const list = await Role.find({}, "_id roleName")
ctx.body = util.success(list);
} catch (error) {
ctx.body = util.fail(`查询失败:${error.stack}`)
}
})
// 按页获取角色列表
router.get('/list', async (ctx) => {
const { roleName } = ctx.request.query;
const { page, skipIndex } = util.pager(ctx.request.query)
try {
let params = {}
if (roleName) params.roleName = roleName;
const query = Role.find(params)
const list = await query.skip(skipIndex).limit(page.pageSize)
const total = await Role.countDocuments(params);
ctx.body = util.success({
list,
page: {
...page,
total
}
})
} catch (error) {
ctx.body = util.fail(`查询失败:${error.stack}`)
}
})
// 角色操作:创建、编辑和删除
router.post('/operate', async (ctx) => {
const { _id, roleName, remark, action } = ctx.request.body;
let res, info;
try {
if (action == 'create') {
res = await Role.create({ roleName, remark })
info = "创建成功"
} else if (action == 'edit') {
if (_id) {
let params = { roleName, remark }
params.update = new Date();
res = await Role.findByIdAndUpdate(_id, params)
info = "编辑成功"
} else {
ctx.body = util.fail("缺少参数params: _id")
return;
}
} else {
if (_id) {
res = await Role.findByIdAndRemove(_id)
info = "删除成功"
} else {
ctx.body = util.fail("缺少参数params: _id")
return;
}
}
ctx.body = util.success(res, info)
} catch (error) {
ctx.body = util.fail(error.stack)
}
})
// 权限设置
router.post('/update/permission', async (ctx) => {
const { _id, permissionList } = ctx.request.body;
try {
let params = { permissionList, update: new Date() }
let res = await Role.findByIdAndUpdate(_id, params)
ctx.body = util.success('', "权限设置成功")
} catch (error) {
ctx.body = util.fail("权限设置失败")
}
})
module.exports = router;