<template>
|
<!--
|
作者:参考 auth/role/edit
|
时间:2026-01-21
|
描述:区域代理商-角色管理-编辑角色
|
-->
|
<div v-loading="loading">
|
<!--form表单-->
|
<el-form size="small" ref="form" :model="form" :rules="formRules" label-width="180px">
|
<!--编辑角色-->
|
<div class="common-form">编辑角色</div>
|
|
<el-form-item label="角色名称:" prop="role_name">
|
<el-input v-model="form.role_name" placeholder="请输入角色名称" class="max-w460"></el-input>
|
</el-form-item>
|
|
<el-form-item label="权限列表:" v-model="form.access_id">
|
<el-tree
|
:data="treeData"
|
show-checkbox
|
node-key="access_id"
|
:default-expand-all="true"
|
:default-checked-keys="select_menu"
|
:props="defaultProps"
|
@check="handleCheckChange"
|
></el-tree>
|
</el-form-item>
|
|
<el-form-item label="排序:"><el-input type="number" v-model="form.sort" placeholder="请输入排序数字,数字越小越靠前" class="max-w460"></el-input></el-form-item>
|
|
<!--提交-->
|
<div class="common-button-wrapper">
|
<el-button size="small" type="info" @click="cancelFunc">取消</el-button>
|
<el-button type="primary" size="small" @click="onSubmit" :loading="loading">提交</el-button>
|
</div>
|
</el-form>
|
</div>
|
</template>
|
|
<script>
|
import PlusApi from '@/api/plus/region.js';
|
|
export default {
|
data() {
|
return {
|
/*是否正在加载*/
|
loading:true,
|
/*表单数据对象*/
|
form: {
|
access_id: [],
|
},
|
data: [], // 原始数据
|
treeData: [], // 树形结构数据
|
/*角色列表*/
|
roleList: [],
|
/*权限选中*/
|
select_menu: [],
|
/*权限树菜单重新自定义字段*/
|
defaultProps: {
|
children: 'children',
|
label: 'name'
|
},
|
role_id: 0,
|
/*form验证*/
|
formRules: {
|
role_name: [
|
{
|
required: true,
|
message: '请输入角色名称',
|
trigger: 'blur'
|
}
|
],
|
sort: [
|
{
|
required: true,
|
message: '请输入排序',
|
trigger: 'blur'
|
}
|
]
|
},
|
};
|
},
|
created() {
|
this.role_id = this.$route.query.role_id;
|
/*获取数据*/
|
this.getData();
|
},
|
methods: {
|
/*修改角色*/
|
onSubmit() {
|
let self = this;
|
let form = self.form;
|
self.$refs.form.validate(valid => {
|
if (valid) {
|
self.loading = true;
|
PlusApi.regionRoleEdit({
|
role_id: self.role_id,
|
params: JSON.stringify(form)
|
}, true)
|
.then(data => {
|
self.loading = false;
|
self.$message({
|
message: '修改成功',
|
type: 'success'
|
});
|
self.$router.push('/plus/region/auth/role/index');
|
})
|
.catch(error => {
|
self.loading = false;
|
});
|
}
|
});
|
},
|
|
/*获取所有的数据*/
|
getData() {
|
let self = this;
|
PlusApi.regionRoleEditInfo({
|
role_id: self.role_id
|
})
|
.then(data => {
|
self.treeData = data.data.accessList;
|
//self.treeData = self.buildTree(self.data); // 构建树形结构
|
self.select_menu = data.data.select_menu;
|
self.form = data.data.model;
|
self.roleList = data.data.roleList;
|
|
if (self.form.parent_id == 0) {
|
self.form.parent_id = 0 + '';
|
}
|
self.loading = false;
|
})
|
.catch(error => {
|
self.loading = false;
|
});
|
},
|
|
// 将扁平化数据转换为树形结构
|
buildTree(data) {
|
if (!data || !Array.isArray(data)) {
|
return [];
|
}
|
|
// 创建映射表
|
const map = {};
|
const roots = [];
|
|
// 首先创建映射
|
for (let i = 0; i < data.length; i++) {
|
map[data[i].access_id] = i;
|
// 初始化children数组
|
data[i].children = [];
|
}
|
|
// 然后建立父子关系
|
for (let i = 0; i < data.length; i++) {
|
const node = data[i];
|
if (node.parent_id === 0 || node.parent_id === '0') {
|
// 如果parent_id为0,则为根节点
|
roots.push(node);
|
} else {
|
// 查找父节点
|
const parentId = node.parent_id;
|
if (map.hasOwnProperty(parentId)) {
|
// 将当前节点添加到其父节点的children数组中
|
data[map[parentId]].children.push(node);
|
} else {
|
// 如果找不到父节点,也作为根节点处理
|
roots.push(node);
|
}
|
}
|
}
|
|
return roots;
|
},
|
|
/*清除数据*/
|
clearData(list, authlist) {
|
let total = 0;
|
let leng = list.length;
|
for (let i = 0; i < leng; i++) {
|
let item = list[i];
|
if (item.children != null && item.children.length > 0) {
|
let flag = this.clearData(item.children, authlist);
|
if (!flag) {
|
let _index = authlist.indexOf(item.access_id);
|
if (_index >= 0) {
|
authlist.splice(_index, 1);
|
}
|
}
|
}
|
if (authlist.indexOf(item.access_id) != -1) {
|
total++;
|
}
|
}
|
if (total < leng) {
|
return false;
|
} else {
|
return true;
|
}
|
},
|
|
/*监听选中*/
|
handleCheckChange(data, checked) {
|
this.form.access_id = checked.checkedKeys.concat(checked.halfCheckedKeys);
|
},
|
|
/*取消*/
|
cancelFunc() {
|
this.$router.back(-1);
|
}
|
|
}
|
};
|
</script>
|
|
<style lang="scss" scoped>
|
.basic-setting-content {
|
}
|
|
.product-add {
|
padding-bottom: 50px;
|
}
|
|
.img {
|
margin-top: 10px;
|
}
|
</style>
|