archieve-projects/后事管理系统/admin/src/components/role/role.vue

736 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="main">
<el-card class="box-card">
<div class="tableHead">
<el-button class="addButton" size="primary" plain @click="addBind">添加</el-button>
</div>
<!-- 表格 -->
<el-table :row-style="{ height: '55px' }" id="out-table" :data="list" style="width: 100%;height: 700px;"
height="height" size="mini" :fit="true">
<el-table-column fixed prop="name" label="名称" min-width="100" align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column prop="description" label="描述" min-width="140" align="left" show-overflow-tooltip>
<template slot-scope="scope">
<span style="cursor: pointer;" @click="lookDescription(scope.row.description)">{{
scope.row.description }}</span>
</template>
</el-table-column>
<el-table-column prop="module" label="权限列表" min-width="280" align="left" show-overflow-tooltip>
<template slot-scope="scope">
<span style="cursor: pointer;" @click="lookDescription(scope.row.module)">{{
scope.row.module }}</span>
</template>
</el-table-column>
<el-table-column fixed prop="update_time" label="更新时间" width="150" align="center" show-overflow-tooltip>
</el-table-column>
<el-table-column fixed="right" label="操作" min-width="180" align="center">
<template slot-scope="scope">
<el-button type="primary" icon="el-icon-s-order" circle size="mini"
@click="look(scope.$index)"></el-button>
<el-button type="primary" icon="el-icon-edit" circle size="mini"
@click="edit(scope.$index)"></el-button>
<el-button type="danger" icon="el-icon-delete" circle size="mini"
@click="del(scope.$index)"></el-button>
</template>
</el-table-column>
</el-table>
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="currentPage"
:page-sizes="[10, 12, 20, 30, 50]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="count">
</el-pagination>
</el-card>
<el-dialog :visible.sync="editShow" width="590px" title="修改角色信息" :before-close="handleCloseTree">
<el-form label-width="80px" style="text-align: left;">
<el-form-item label="名称">
<el-input v-model="item.name"></el-input>
</el-form-item>
<el-form-item label="描述">
<el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8 }" placeholder="请输入描述内容.."
:show-word-limit="true" maxlength="100" v-model="item.description">
</el-input>
</el-form-item>
<el-form-item label="权限列表">
<el-tree ref="edittree" :data="roleList" :default-checked-keys="moduleList.idList"
:default-expand-all="true" :check-strictly="true" show-checkbox node-key="id" :props="defaultProps"
@check-change="editchange">
</el-tree>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editShow = false">取 消</el-button>
<el-button type="primary" @click="update()">保 存</el-button>
</span>
</el-dialog>
<el-dialog :visible.sync="cardShow" width="590px" title="添加角色">
<el-form label-width="80px" style="text-align: left;">
<el-form-item label="名称">
<el-input v-model="item.name" placeholder="请输入角色名称"></el-input>
</el-form-item>
<el-form-item label="描述">
<el-input type="textarea" :autosize="{ minRows: 4, maxRows: 8 }" placeholder="请输入描述内容.."
:show-word-limit="true" maxlength="100" v-model="item.description">
</el-input>
</el-form-item>
<el-form-item label="权限列表">
<el-tree ref="tree" :data="roleList" :default-checked-keys="[1, 2, 3, 8, 13, 16, 29, 11, 27, 7, 15]"
:default-expand-all="true" :check-strictly="true" show-checkbox node-key="id" :props="defaultProps"
@check-change="change">
</el-tree>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editShow = false">取 消</el-button>
<el-button type="primary" @click="add()">保 存</el-button>
</span>
</el-dialog>
<el-dialog :visible.sync="lookShow" width="500px" title="查看权限列表">
<el-tree :data="moduleList.data" :default-expand-all="true" node-key="id" :props="defaultProps">
</el-tree>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
list: [],
currentPage: 1,
count: 0,
pageSize: 12,
height: 670,
search: '',
isyuan: false,
item: {},
cardShow: false,
editShow: false,
status: 0,
defaultProps: {
children: 'children',
label: 'name'
},
lookShow: false,
roleList: [
{
"id": 1,
"name": "遗嘱管理",
disabled: true,
"children": [
{
"id": 2,
"name": "数据管理",
disabled: true
},
{
"id": 3,
"name": "添加遗嘱",
disabled: true
}
]
},
{
"id": 4,
"name": "律师管理",
"children": [
{
"id": 5,
"name": "律师管理",
},
{
"id": 6,
"name": "添加律师",
}
]
},
{
"id": 7,
"name": "紧急联系人管理",
disabled: true,
"children": [
{
"id": 9,
"name": "紧急联系人记录",
},
{
"id": 10,
"name": "添加紧急联系人",
}
]
},
{
"id": 21,
"name": "角色权限",
"children": [
{
"id": 22,
"name": "角色管理",
},
{
"id": 23,
"name": "权限设置",
}
]
},
{
"id": 24,
"name": "管理员",
"children": [
{
"id": 25,
"name": "管理员管理",
},
{
"id": 26,
"name": "管理员添加",
}
]
},
{
"id": 27,
"name": "系统设置",
disabled: true,
"children": [
{
"id": 28,
"name": "系统设置",
},
{
"id": 29,
"name": "信息修改",
disabled: true
}
]
}
],
moduleList: {
data: [],
idList: []
}
}
},
activated() {
this.$http.get(`admin/role/list?page=${this.currentPage}&limit=${this.pageSize}`).then(res => {
if (res.data.code == 200) {
this.list = res.data.data
} else {
this.$message.error(res.data.msg)
}
})
},
methods: {
copy(uuid) {
//复制到剪切板
navigator.clipboard.writeText(uuid);
this.$message({
type: 'success',
message: '复制成功'
})
},
lookDescription(info) {
this.$alert(info, '详细信息', {
confirmButtonText: '确定',
callback: action => {
}
});
},
card(index) {
this.item = this.list[index]
this.cardShow = true
this.status = this.item.status
},
look(index) {
let a = JSON.stringify(this.list[index])
this.item = JSON.parse(a)
// this.editShow = true
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$http.get('admin/role/module?role=' + this.item.id).then(res => {
loading.close()
if (res.data.code == 200) {
let obj = {
data: res.data.data,
idList: res.data.idList.split(',')
}
obj.data.unshift({
"id": 0,
"name": "首页",
disabled: true,
})
this.moduleList = obj
this.lookShow = true
} else {
this.$message.error(res.data.msg)
}
})
},
edit(index) {
let a = JSON.stringify(this.list[index])
this.item = JSON.parse(a)
// this.editShow = true
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
this.$http.get('admin/role/module?role=' + this.item.id).then(res => {
loading.close()
if (res.data.code == 200) {
let obj = {
data: res.data.data,
idList: res.data.idList.split(',')
}
this.moduleList = obj
this.editShow = true
} else {
this.$message.error(res.data.msg)
}
})
},
handleCloseTree() {
this.$refs.edittree.setCheckedKeys([], false)
this.editShow = false
},
addBind() {
this.item = {
name: '',
description: '',
module: '1,2,3,8,13,16,29,11,27,7,15'
}
this.cardShow = true
},
add() {
function removeParentIds(arr, data) {
// const ids = data.map(item => item.id);
let ids = arr
data.forEach(item => {
if (arr.includes(item.id)) {
const childrenIds = item.children.map(child => child.id);
if (!childrenIds.some(id => arr.includes(id))) {
ids = ids.filter(id => id !== item.id);
}
}
});
return ids;
}
//修改需要增加权限的修改还有一个是查看权限列表增加一个查看角色权限接口有id和list以及权限管理权限管理内容是所有的界面
let arr = this.item.module.split(',').map(Number);
let arrnode = removeParentIds(arr, this.roleList)
this.item.module = arrnode.join(',')
if (this.item.name == '' || this.item.description == '') return this.$message.error('请填写完整信息')
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
let data = {
name: this.item.name,
description: this.item.description,
module: this.item.module
}
this.$http.post('admin/role/add', data).then(res => {
loading.close()
if (res.data.code == '200') {
this.$message.success('添加成功')
this.cardShow = false
this.getInfo()
this.item = {}
} else {
this.$message.error(res.data.msg)
}
})
},
editchange() {
const checkedKeys = this.$refs.edittree.getCheckedKeys();
let arr = checkedKeys
function findParentIds(node, arr) {
if (node.children) {
for (const child of node.children) {
if (arr.includes(child.id)) {
arr.push(node.id);
}
findParentIds(child, arr);
}
}
}
let yourArray = this.roleList;
// 遍历每个节点
for (const node of yourArray) {
findParentIds(node, arr);
}
let arr1 = [...new Set(arr)]
this.item.module = arr1.join(',')
},
change() {
const checkedKeys = this.$refs.tree.getCheckedKeys();
let arr = checkedKeys
function findParentIds(node, arr) {
if (node.children) {
for (const child of node.children) {
if (arr.includes(child.id)) {
arr.push(node.id);
}
findParentIds(child, arr);
}
}
}
let yourArray = this.roleList;
// 遍历每个节点
for (const node of yourArray) {
findParentIds(node, arr);
}
let arr1 = [...new Set(arr)]
this.item.module = arr1.join(',')
},
update() {
if (this.item.name == '' || this.item.description == '') return this.$message.error('请填写完整信息')
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
function removeParentIds(arr, data) {
// const ids = data.map(item => item.id);
let ids = arr
data.forEach(item => {
if (arr.includes(item.id)) {
const childrenIds = item.children.map(child => child.id);
if (!childrenIds.some(id => arr.includes(id))) {
ids = ids.filter(id => id !== item.id);
}
}
});
return ids;
}
let arr = this.item.module.split(',').map(Number);
let arrnode = removeParentIds(arr, this.roleList)
this.item.module = arrnode.join(',')
console.log(this.item.module);
let data = {
id: this.item.id,
name: this.item.name,
description: this.item.description,
modules: this.item.module
}
this.$http.put('admin/role/edit', data).then(res => {
loading.close()
if (res.data.code == '200') {
this.$message.success('修改成功')
this.editShow = false
this.getInfo()
} else {
this.$message.error(res.data.msg)
}
})
},
updateSet() {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
let data = {
set: 1,
id: this.item.id,
status: this.item.status
}
console.log(data);
this.$http.put('admin/updateEnchanter', data).then(res => {
loading.close()
if (res.data.code == '200') {
this.$message.success('修改成功')
this.editShow = false
this.getInfo()
} else {
this.$message.error(res.data.msg)
}
})
},
del(index) {
this.item = this.list[index]
// / admin / deleteEnchanter
this.$prompt('此操作会删除重要数据,<span style="color:#a93a3a">拥有该角色的用户会修改为普通管理员</span>,如确认删除,请在下方输入 “ 确认删除 ”', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /确认删除/,
inputErrorMessage: '请确认删除',
dangerouslyUseHTMLString: true,
inputPlaceholder: '请输入确认删除'
}).then(({ value }) => {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
this.$http.delete('admin/role/del?id=' + this.list[index].id).then(res => {
loading.close()
if (res.data.code == '200') {
this.$message.success('删除成功')
this.getInfo()
} else {
this.$message.error(res.data.msg)
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '取消删除'
});
});
},
// 分页,页数改变时触发
handleCurrentChange(val) {
this.currentPage = val
this.$http.get(`admin/role/list?page=${this.currentPage}&limit=${this.pageSize}`).then(res => {
if (res.data.code == 200) {
this.list = res.data.data
this.count = res.data.count;
} else {
this.$message.error(res.data.msg)
}
})
},
// 分页,每页条数改变时触发
handleSizeChange(val) {
this.pageSize = val
this.$http.get(`admin/role/list?page=${this.currentPage}&limit=${this.pageSize}`).then(res => {
if (res.data.code == 200) {
this.list = res.data.data
} else {
this.$message.error(res.data.msg)
}
})
},
// 初始化函数
getInfo() {
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
})
this.$http.get(`admin/role/list?page=${this.currentPage}&limit=${this.pageSize}`).then(res => {
loading.close()
if (res.data.code == 200) {
this.list = res.data.data;
this.count = res.data.total;
loading.close()
} else {
this.$message.error(res.data.msg)
}
})
},
// 操作,跳转
det(id) {
localStorage.setItem('menu', '/lifebook/data')
this.$router.push({
path: '/lifebook/info',
query: {
uuid: id
}
})
},
},
created() {
this.getInfo();
}
}
</script>
<style lang="less" scoped>
.el-table /deep/ .el-icon-arrow-down:before {
color: #000 !important;
font-size: 20px !important;
position: relative;
top: 5px;
}
.uuid {
cursor: pointer;
}
.uuid:hover {
//下划线
color: #0d4fbb;
}
.tableHead {
width: 100%;
position: relative;
top: -10px;
.addButton {
position: absolute;
right: 56px
}
}
.main {
width: 100%;
height: 100%;
line-height: auto;
.head {
width: 100%;
height: 40px;
display: flex;
align-items: center;
position: relative;
background: #fff;
.el-button /deep/ .el-icon-arrow-down:before {
color: #1a7cff !important;
}
.el-dropdown {
position: absolute;
right: 20px;
}
.dy {
position: absolute;
right: 130px;
}
.tag {
height: 8px;
width: 25px;
border-radius: 4px;
background-color: #1a7cff;
}
.tagTitle {
font-size: 14px;
color: #000;
margin-left: 20px;
}
.daoBack {
position: absolute;
right: 10px
}
}
.el-card {
// height: calc(100% - 60px);
height: 100%;
position: relative;
// margin-top: 10px;
box-shadow: 0px 0px 20px rgba(215, 215, 215, 1);
overflow: auto;
.tableHead {
height: 60px;
display: flex;
align-items: center;
/deep/ .searchInput {
width: 300px !important;
position: absolute;
left: 30px;
}
.searchButton {
position: absolute;
left: 348px;
}
.yuan {
position: absolute;
left: 428px;
}
}
.el-table {
height: 100%;
}
.el-pagination {
margin-top: 10px;
display: flex;
justify-content: flex-end;
margin-right: 15px;
}
}
.card {
width: 450px;
padding: 20px;
background: #fff;
text-align: left;
position: relative;
min-height: 257px;
overflow: hidden;
border-radius: 5px;
overflow: hidden;
box-sizing: border-box;
background-image: url('../../../images/450.jpg');
background-repeat: no-repeat;
background-position: center;
.card-status {
position: absolute;
top: 20px;
right: 20px;
font-family: '华文隶书 Bold', '华文隶书';
}
.card-head {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-start;
text-align: left;
.el-image {
border-radius: 3px;
}
.card-info {
margin-left: 10px;
.card-name {
color: #185ed1;
font-weight: bold;
font-size: 18px;
}
.card-uuid {
display: block;
margin-top: 5px;
color: #aaa;
}
}
}
.card-dosc {
display: block;
line-height: 24px;
font-size: 14px;
margin-top: 16px;
// margin-left: 65px;
color: #979797;
}
}
}
</style>