增加用户授权、公司授权 以及优化部门、角色、用户接口

This commit is contained in:
龙运模
2024-07-08 19:58:03 +08:00
parent c2fe2415a4
commit e5ebcbcdbe
25 changed files with 2243 additions and 380 deletions
@@ -0,0 +1,348 @@
<template>
<el-container class="mainBox">
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" @click="savePermission">保存权限</el-button>
</div>
<div class="right-panel"><div class="companyName">{{name}}</div></div>
</el-header>
<el-main class="nopadding">
<div class="treeTable">
<div :class="list.length===0?'thenTitle thenTitleBottom':'thenTitle'">
<div class="tr">
<div class="th module">功能模块</div>
<div class="th check"><el-checkbox :indeterminate="isCheckFun" @change="allCheckChange" v-model="checkedFun" :size="size" /></div>
<div class="th thFlex">
<div class="menu name">菜单</div>
<div class="th authority">数据操作权限</div>
</div>
</div>
</div>
<div class="tableBody">
<div class="tr" v-for="(item,index) in list" :key="index">
<div class="td module">{{item.meta.title}}</div>
<div class="td check"><el-checkbox v-model="item.checked" :indeterminate="item.isCheck" @change="menuCheckChange(item)" :size="size" /></div>
<div class="td tdChild">
<div class="nextTd" v-for="(em,ind) in item.children" :key="ind">
<div class="tdName menu">
<el-checkbox @change="moduleCheckChange(item,em)" :indeterminate="em.isCheck" v-model="em.checked" :size="size">{{em.meta.title}}</el-checkbox>
</div>
<div class="tdName authority">
<div class="childTr">
<div class="preBox" v-for="(li,lidex) in em.meta.data_permission" :key="lidex">
<el-checkbox @change="checkChange(item,em)" v-model="li.checked" :size="size">{{li.title}}</el-checkbox>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</el-main>
</el-container>
</template>
<script>
export default {
name: "addPermission",
data(){
return{
size:'small',
id: this.$route.query.id,
name:this.$route.query.name,
list:[]
}
},
computed:{
isCheckFun(){
let isTrue = false;
let num = this.list.length;
let checkNum = this.list.filter((item)=>item.checked).length;
let isCheckNum = this.list.filter((item)=>item.isCheck).length;
isTrue = checkNum>0 && checkNum == num?false:checkNum>0 || isCheckNum>0 ? true:false;
return isTrue
},
checkedFun(){
let isTrue = false;
let num = this.list.length;
let checkNum = this.list.filter((item)=>item.checked).length;
isTrue = checkNum>0 && checkNum == num?true:false;
return isTrue
}
},
mounted() {
this.getPermission();
},
methods:{
async getPermission() {
let params = {
company_id:this.id
}
const res = await this.$API.system.company.permission.post(params);
res.data.forEach(item=>{
if(item.children){
item.children.forEach(em=>{
if(em.meta.data_permission){
let check = em.meta.data_permission.filter((li)=>li.checked).length;
let ed = em.meta.data_permission.length;
em.isCheck = check>0 && check != ed?true:false;
if(ed>0){
em.checked = check>0 && check== ed?true:false;
}
}
})
let check = item.children.filter((em)=>em.checked).length;
let isCheck = item.children.filter((em)=>em.isCheck).length;
let ed = item.children.length;
item.isCheck = (check>0 && check != ed) || (isCheck>0 && check!=ed)?true:false;
item.checked = check>0 && check== ed?true:false;
}
})
this.list = res.data;
},
allCheckChange(e){
this.list.forEach(item=>{
item.checked = e;
if(item.children){
item.children.forEach(em=>{
em.checked = e;
if(em.meta.data_permission){
em.meta.data_permission.forEach((li)=>{
li.checked = e;
})
}
if(em.checked){
em.isCheck = false;
}
})
if(item.checked){
item.isCheck = false;
}
}
})
},
menuCheckChange(e){
this.list.forEach(item=>{
if(e.id == item.id){
if(item.children){
item.children.forEach(em=>{
em.checked = e.checked;
if(em.meta.data_permission){
em.meta.data_permission.forEach((li)=>{
li.checked = e.checked;
})
}
if(em.checked){
em.isCheck = false;
}
})
}
if(item.checked){
item.isCheck = false;
}
}
})
},
moduleCheckChange(pre,e){
this.list.forEach(item=>{
if(pre.id == item.id){
if(item.children){
item.children.forEach(em=>{
if(em.id == e.id){
if(em.meta.data_permission){
em.meta.data_permission.forEach((li)=>{
li.checked = e.checked;
})
}
if(e.checked){
e.isCheck = false;
}
}
})
let check = item.children.filter((em)=>em.checked).length;
let isCheck = item.children.filter((em)=>em.isCheck).length;
let ed = item.children.length;
item.checked = check>0 && check == ed?true:false;
item.isCheck = (check>0 || isCheck>0) && ed!=check?true:false;
}
}
})
},
checkChange(max,pre){
this.list.forEach(item=>{
if(item.id == max.id){
if(item.children){
item.children.forEach((em)=>{
if(pre.id == em.id){
let check = em.meta.data_permission.filter((em)=>em.checked).length;
let ed = em.meta.data_permission.length;
em.checked = check>0 && check == ed?true:false;
em.isCheck = check>0 && check != ed?true:false;
}
})
}
let check = item.children.filter((em)=>em.checked).length;
let isCheck = item.children.filter((em)=>em.isCheck).length;
let ed = item.children.length;
item.checked = check>0 && check == ed?true:false;
item.isCheck = (check>0 || isCheck>0) && ed!=check?true:false;
}
})
},
async savePermission() {
let params = this.setList();
const res = await this.$API.system.company.moduleAdd.post(params);
if(res.code == 200){
this.$message.success("授权成功");
this.getPermission();
}
},
setList(){
let obj = {
company_id:this.id,
menu_permission:[],
data_permission:[]
}
this.list.forEach(item=>{
if(item.checked || item.isCheck){
obj.menu_permission.push(item.meta.code);
}
if(item.children){
item.children.forEach(em=>{
if(em.checked || em.isCheck){
obj.menu_permission.push(em.meta.code);
}
if(em.meta.data_permission){
let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{
let obj = {
actions:u.actions,
title:u.title
}
return obj
});
if(list.length>0){
obj.data_permission.push({[em.meta.code]:list})
}
}
})
}
})
return obj
}
}
}
</script>
<style lang="scss" scoped>
.companyName{
color: var(--el-color-primary);
font-size: 14px;
}
.nopadding{
padding: 10px 0;
}
.module{
flex-basis: 120px;
display: flex;
align-items: center;
justify-content: center;
}
.check{
flex-basis: 60px;
display: flex;
align-items: center;
justify-content: center;
}
.menu{
flex-basis: 180px;
}
.authority{
flex:1;
text-align: center;
}
.treeTable{
border: 1px solid var(--el-border-color-light);
}
.thenTitle .tr {
display: flex;
align-items: stretch;
border-bottom:1px solid var(--el-border-color-light);
height: 40px;
background: var(--el-bg-color-overlay);
.th{
padding: 0 10px;
border-left: 1px solid var(--el-border-color-light);
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.th:first-child{
border-left: none;
}
.thFlex{
display: flex;
flex: 1;
padding: 0;
.name{
flex-basis: 180px;
padding: 10px;
}
}
}
.thenTitleBottom .tr{
border-bottom: 0;
}
.tableBody .tr{
display: flex;
align-items: stretch;
justify-content: space-between;
border-bottom:1px solid var(--el-border-color-light);
.td{
padding: 0 10px;
border-left: 1px solid var(--el-border-color-light);
.nextTd{
display: flex;
align-items: center;
border-bottom:1px solid var(--el-border-color-light);
}
.nextTd:last-child{
border-bottom: 0;
}
}
.td:first-child{
border-left: 0;
}
.tdChild{
flex: 1;
padding: 0;
border-left: 1px solid var(--el-border-color-light);
.tdName:last-child{
border-left: 1px solid var(--el-border-color-light);
}
.tdName{
padding: 0 10px;
min-height: 33px;
}
.childTr{
display: flex;
flex-wrap: wrap;
flex: 1;
.preBox{
display: flex;
align-items: center;
flex-wrap: wrap;
margin-right: 20px;
width: 110px;
}
}
}
}
.tableBody .tr:last-child{
border-bottom: 0;
}
</style>
+25 -3
View File
@@ -49,9 +49,9 @@
<el-dropdown-menu>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">查看详情</el-dropdown-item>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑公司</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-AbilityAuthorization" divided>功能授权</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-DataAuthorization">数据授权</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-UserList" divided>用户列表</el-dropdown-item>
<el-dropdown-item icon="sc-icon-AbilityAuthorization" @click="table_empower(scope.row)" divided>功能授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-DataAuthorization">数据授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-UserList" @click="table_user_ist(scope.row)" divided>用户列表</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除公司</el-dropdown-item>
</el-dropdown-menu>
</template>
@@ -162,6 +162,27 @@ export default {
})
},
// 功能授权
table_empower(row){
this.$router.push({
path: '/setting/company/add-permission',
query: {
id: row.id,
name:row.name
}
})
},
// 公司用户列表
table_user_ist(row){
this.$message.warning(row.name+' 暂无接口')
// this.$router.push({
// path: '/setting/user/company-user-list',
// query: {
// id: row.id,
// name:row.name
// }
// })
},
//表格选择后回调事件
selectionChange(selection){
this.selection = selection;
@@ -178,6 +199,7 @@ export default {
if(res.code !=200){
row.active_status = !row.active_status;
}
delete row.$switch_status;
delete row.$switch_yx;
}, 500);
},
+48 -10
View File
@@ -13,7 +13,7 @@
<el-input v-model="form.domain" placeholder="公司系统入口地址" clearable></el-input>
</el-form-item>
<el-form-item label="公司类型" prop="company_type">
<el-select v-model="form.company_type" @visible-change="getCompanyTypeSelect" placeholder="请输入部门名称" clearable style="width: 100%;">
<el-select v-model="form.company_type" @visible-change="getCompanyTypeSelect" placeholder="请选择公司类型" clearable style="width: 100%;">
<el-option v-for="item in setMap.companyType" :key="item" :label="item.label" :value="item.company_type"></el-option>
</el-select>
</el-form-item>
@@ -22,6 +22,10 @@
</el-form-item>
<el-form-item label="证件照" prop="doc_url">
<ossImgListUpload :list="form.doc_url" :length="3" @parentParams="faultParentParams" />
<p class="el-form-item-msg">可接受格式为:jpg、jpeg、png、gif,图片大小不超过5M。</p>
<p class="el-form-item-msg">可接受证件类型:营业执照、组织机构代码证、统一社会信用代码证、事业单位法人证书。</p>
<p class="el-form-item-msg">可以添加"高德开放平台备案、地图开发申请、地图开发认证"等水印。</p>
<p class="el-form-item-msg">但不能遮挡关键信息,例如公司名称、公司证件号。</p>
</el-form-item>
<el-form-item label="公司LOGO" prop="logo">
<ossImgUpload @parentParams="parentParams" :url="form.logo" />
@@ -30,23 +34,29 @@
<el-input type="textarea" placeholder="请输入备注"></el-input>
</el-form-item>
<div class="dialogBoxTitle"><span class="make"></span><span class="name">企业管理员信息</span></div>
<el-form-item label="负责人/联系方式" prop="status">
<el-form-item label="负责人/联系方式" required>
<el-row justify="space-between">
<el-col :span="5">
<el-input v-model="form.owner" placeholder="公司负责人"></el-input>
<el-form-item prop="owner">
<el-input v-model="form.owner" placeholder="负责人"></el-input>
</el-form-item>
</el-col>
<el-col :span="7">
<el-input v-model="form.mobile" placeholder="联系方式"></el-input>
<el-form-item prop="mobile">
<el-input v-model="form.mobile" placeholder="联系方式"></el-input>
</el-form-item>
</el-col>
<el-col :span="10">
<el-input v-model="form.email" placeholder="邮箱地址"></el-input>
<el-form-item prop="email">
<el-input v-model="form.email" placeholder="邮箱地址"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="账号" prop="admin_access">
<el-input v-model="form.admin_access" placeholder="请填写管理员账号"></el-input>
</el-form-item>
<el-form-item label="登录密码" prop="password">
<el-form-item label="登录密码" prop="password" v-if="mode == 'add'">
<el-input v-model="form.password" type="password" placeholder="请填写密码"></el-input>
</el-form-item>
<el-form-item label="生成系统使用协议" prop="accord">
@@ -100,6 +110,30 @@ export default {
full_name: [
{required: true, message: '公司名称不能为空', trigger: 'blur'}
],
name:[
{required: true, message: '公司简称不能为空', trigger: 'blur'}
],
domain:[
{required: true, message: '入口地址不能为空', trigger: 'blur'}
],
address:[
{required: true, message: '请填写公司地址', trigger: 'blur'}
],
email:[
{required: true, message: '请填写邮件地址', trigger: 'blur'}
],
mobile:[
{required: true, message: '请填写联系方式', trigger: 'blur'}
],
logo:[
{required: true, message: '公司LOGO不能为空'}
],
doc_url:[
{required: true, message: '证件照不能为空'}
],
owner:[
{required: true, message: '负责人不能为空', trigger: 'blur'}
],
admin_access: [
{required: true, message: '账号不能为空', trigger: 'blur'}
],
@@ -120,7 +154,7 @@ export default {
return this
},
//加载树数据
// 加载公司类型
async getCompanyTypeSelect(e){
if(!e) return
const res = await this.$API.system.company.typeSelect.post();
@@ -139,7 +173,12 @@ export default {
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
this.isSave = true;
const res = await this.$API.system.company.add.post(this.form);
let res
if(this.mode == "add"){
res = await this.$API.system.company.add.post(this.form);
}else{
res = await this.$API.system.company.update.post(this.form);
}
this.isSave = false;
if(res.code == 200){
this.$emit('success', this.form, this.mode);
@@ -154,7 +193,6 @@ export default {
let params = {
id:data.id
}
const res = await this.$API.system.company.info.post(params);
if(res.code == 200){
this.form.id = res.data.id;
@@ -165,7 +203,7 @@ export default {
this.form.address = res.data.address;
this.form.email = res.data.platform_user && res.data.platform_user.email?res.data.platform_user.email:'';
this.form.logo = res.data.logo;
this.form.doc_url = [];
this.form.doc_url = res.data.doc_attach && res.data.doc_attach.length>0?res.data.doc_attach.map(em=>em.doc_url):[];
this.form.owner = res.data.owner;
this.form.mobile = res.data.mobile;
this.form.admin_access = res.data.admin_access;
+30 -8
View File
@@ -4,23 +4,26 @@
<el-form-item label="公司名称" prop="full_name">
<span>{{form.full_name}}</span>
</el-form-item>
<el-form-item label="公司系统入口地址" prop="label">
<el-form-item label="公司系统入口地址" prop="domain">
<span>{{form.domain}}</span>
</el-form-item>
<el-form-item label="系统开通日期" prop="label">
<el-form-item label="系统开通日期" prop="activation_date">
<span>{{form.activation_date}}</span>
</el-form-item>
<el-form-item label="公司类型" prop="label">
<span></span>
<el-form-item label="公司类型" prop="company_type_name">
<span>{{form.company_type_name}}</span>
</el-form-item>
<el-form-item label="公司地址" prop="label">
<el-form-item label="公司地址" prop="address">
<span>{{form.address}}</span>
</el-form-item>
<el-form-item label="负责人/联系方式" prop="status">
<el-form-item label="负责人/联系方式" prop="owner">
<span>{{form.owner}} {{form.mobile}}</span>
</el-form-item>
<el-form-item label="证件照" prop="remark">
<el-image style="height: 40px" :src="form.logo"></el-image>
<el-form-item label="公司LOGO" prop="logo">
<el-image style="height: 80px;width: 80px;border-radius: 2px;" fit="cover" :src="form.logo"></el-image>
</el-form-item>
<el-form-item label="证件照" prop="doc_attach">
<el-image v-for="item in form.doc_attach" :key="item" style="height: 80px;width: 80px;border-radius: 2px;" fit="cover" :src="item.doc_url"></el-image>
</el-form-item>
</el-form>
<template #footer>
@@ -38,6 +41,9 @@ export default {
titleMap: {
show: '查看公司详情'
},
setMap:{
companyType:[]
},
visible: false,
//表单数据
form: {},
@@ -53,14 +59,30 @@ export default {
this.visible = true;
return this
},
// 加载公司类型
async getCompanyTypeSelect(e){
if(!e) return
const res = await this.$API.system.company.typeSelect.post();
if(res.code == 200){
this.setMap['companyType'] = res.data;
}
},
//表单注入数据
async setData(data) {
let params = {
id:data.id
}
await this.getCompanyTypeSelect(true);
const res = await this.$API.system.company.info.post(params);
if(res.code == 200){
this.form = res.data;
this.form.company_type_name = "";
this.setMap.companyType.forEach(em=>{
if(em.company_type === res.data.company_type){
this.form.company_type_name = em.label
}
})
}
}
}