6 changed files with 735 additions and 7 deletions
@ -0,0 +1,616 @@ |
|||
<!-- |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-23 13:29:28 |
|||
@ 备注: App应用授权 |
|||
--> |
|||
<script lang='ts' setup> |
|||
import { appTableBut, appListBut,appDetailBut,formBaseBut,appGroupBut } from "@/utils/workflow/const"; |
|||
import { AppMenuPowerTree, AppPowerTreeMaster, SetupAppMenuPower } from "@/api/system/roleapi/types"; |
|||
import { getAppGroupo,getGroupAppList,getAppMenuList,appGroupPowerConfig,appPowerConfig } from "@/api/system/roleapi/postrole"; |
|||
import { orgInfo } from "@/api/displayboardapi/types"; |
|||
|
|||
const props = defineProps({ |
|||
appType: { |
|||
type: String, |
|||
default: "app" |
|||
}, |
|||
powerType: { |
|||
type: String, |
|||
default: "org" |
|||
}, |
|||
roleId: { |
|||
type: String, |
|||
default: "313" |
|||
}, |
|||
orgTree: { |
|||
type: Array as PropType<orgInfo[]>, |
|||
default: () => [] |
|||
} |
|||
}) |
|||
const orgTree = computed(() => props.orgTree); |
|||
const oneGroupActiveTab = ref<string>("first"); //单个分组权限选择 |
|||
const oneAppActiveTab = ref<string>("first"); //单个分组权限选择 |
|||
const appGroupPower = reactive<SetupAppMenuPower>({ |
|||
groupButPower:[], |
|||
appList:[] |
|||
}); //应用分组权限 |
|||
const oneGroupAppList = ref<AppPowerTreeMaster[]>([]); |
|||
const oneAppMenuList = ref<AppMenuPowerTree[]>([]); |
|||
const systemMenuTreePropsing = { |
|||
children: "child", |
|||
label: "name", |
|||
value: "id", |
|||
}; |
|||
const groupLoading = ref<boolean>(false); |
|||
const appLoading = ref<boolean>(false); |
|||
const menuLoading = ref<boolean>(false); |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 10:36:22 |
|||
@ 功能: 初始化获取数据 |
|||
*/ |
|||
const getAppList = () => { |
|||
groupLoading.value = true; |
|||
let sendData = { |
|||
powerId: props.roleId, |
|||
powerType: props.powerType, |
|||
} |
|||
getAppGroupo(sendData).then((res:any) => { |
|||
console.log("初始化获取数据--->",res) |
|||
if(res.code == 0){ |
|||
appGroupPower.groupButPower = res.data.groupButPower; |
|||
appGroupPower.appList = res.data.groupList; |
|||
if(res.data.groupList && Array.isArray(res.data.groupList) && res.data.groupList.length > 0){ |
|||
oneGroupActiveTab.value = res.data.groupList[0].id; |
|||
nextTick(() => { |
|||
getGroupAppListOne(); |
|||
}) |
|||
} |
|||
} |
|||
groupLoading.value = false; |
|||
}).finally(() => { |
|||
groupLoading.value = false; |
|||
}) |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 11:07:44 |
|||
@ 功能: 获取App列表 |
|||
*/ |
|||
const getGroupAppListOne = () => { |
|||
appLoading.value = true; |
|||
menuLoading.value = true; |
|||
let sendData = { |
|||
roleId: props.roleId, |
|||
powerType: props.powerType, |
|||
group: oneGroupActiveTab.value, |
|||
} |
|||
getGroupAppList(sendData).then((res:any) => { |
|||
console.log("获取App列表--->",res) |
|||
if(res.code == 0){ |
|||
oneGroupAppList.value = res.data; |
|||
if(res.data && Array.isArray(res.data) && res.data.length > 0){ |
|||
oneAppActiveTab.value = res.data[0].id; |
|||
nextTick(() => { |
|||
getAppMenuListOne(); |
|||
}) |
|||
} |
|||
} |
|||
appLoading.value = false; |
|||
}).finally(() => { |
|||
appLoading.value = false; |
|||
}) |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 13:36:45 |
|||
@ 功能: 获取菜单列表 |
|||
*/ |
|||
const getAppMenuListOne = () => { |
|||
menuLoading.value = true; |
|||
let sendData = { |
|||
roleId: props.roleId, |
|||
powerType: props.powerType, |
|||
group: oneGroupActiveTab.value, |
|||
appId: oneAppActiveTab.value, |
|||
} |
|||
getAppMenuList(sendData).then((res:any) => { |
|||
console.log("获取菜单列表--->",res) |
|||
if(res.code == 0){ |
|||
// oneGroupAppList.value = res.data; |
|||
oneAppMenuList.value = res.data; |
|||
} |
|||
menuLoading.value = false; |
|||
}).finally(() => { |
|||
menuLoading.value = false; |
|||
}) |
|||
} |
|||
|
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 16:21:19 |
|||
@ 功能: 监听变化App分组 |
|||
*/ |
|||
watch(() => oneGroupActiveTab.value, (newVal, oldVal) => { |
|||
if(newVal != oldVal){ |
|||
getGroupAppListOne(); |
|||
} |
|||
},{ |
|||
deep: true |
|||
}) |
|||
|
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 16:30:05 |
|||
@ 功能: 监听变化App应用 |
|||
*/ |
|||
watch(() => oneAppActiveTab.value, (newVal, oldVal) => { |
|||
if(newVal != oldVal){ |
|||
getAppMenuListOne(); |
|||
} |
|||
},{ |
|||
deep: true |
|||
}) |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 16:40:07 |
|||
@ 功能: app权限全选 |
|||
*/ |
|||
const pickAppAllPower = (item:AppPowerTreeMaster) => { |
|||
console.log("app权限全选--->",item) |
|||
if(item.isPick){ |
|||
item.operationButton = ["bjapp","scapp","xzfg","scfg","yzfg","xz","bj","sc","yz","jczdh","yysz","yyfb"] |
|||
}else{ |
|||
item.operationButton = []; |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 13:58:21 |
|||
@ 功能: 选择App菜单是选中状态下,关联操作按钮 |
|||
*/ |
|||
const handleAppMenuChange = (item:any) => { |
|||
console.log("----------------选择App菜单---------->",item) |
|||
if(item.isTrue){ |
|||
item.formPower = [ "zc", "tj", "dy", "sc", "fz"] |
|||
item.formPowerIsAll = true |
|||
item.listPower = [ "newAdd", "import", "export", "sc", "dy", "showQrCode","del","bj"] |
|||
item.listPowerIsAll = true |
|||
}else{ |
|||
item.formPower = [] |
|||
item.listPower = [] |
|||
item.listPowerIsAll = false |
|||
item.formPowerIsAll = false |
|||
} |
|||
if(item.children && Array.isArray(item.children)){ |
|||
item.children = handleAppChange(item.children,item.isTrue) |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-18 11:23:40 |
|||
@ 功能: 循环递归联动赋值 |
|||
*/ |
|||
const handleAppChange = (item:any,isTrue:boolean) => { |
|||
// console.log("--------循环递归联动赋值------------------>",item) |
|||
if(item && Array.isArray(item)){ |
|||
item.forEach((menu:any) => { |
|||
menu.isTrue = isTrue |
|||
if(isTrue){ |
|||
menu.formPower = [ "zc", "tj", "dy", "sc", "fz"] |
|||
menu.listPower = [ "newAdd", "import", "export", "sc", "dy", "showQrCode","del","bj"] |
|||
menu.listPowerIsAll = true |
|||
menu.formPowerIsAll = true |
|||
}else{ |
|||
menu.formPower = [] |
|||
menu.listPower = [] |
|||
menu.listPowerIsAll = false |
|||
menu.formPowerIsAll = false |
|||
} |
|||
if(menu.children && Array.isArray(menu.children)){ |
|||
menu.children = handleAppChange(menu.children,isTrue) |
|||
} |
|||
}) |
|||
} |
|||
|
|||
return item |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-20 15:33:37 |
|||
@ 功能: 全选 |
|||
*/ |
|||
const pickAllBut = (item:any,types:number) => { |
|||
console.log("--全选------------------------>",item,types) |
|||
// item.isTrue = !item.isTrue |
|||
switch(types){ |
|||
case 1: |
|||
// item.pagePowerIsAll = item.isTrue |
|||
item.pagePower = item.pagePowerIsAll ? ["lc","lb","sj","dy","nc"] : [] |
|||
|
|||
break |
|||
case 2: |
|||
// item.formPowerIsAll = item.isTrue |
|||
item.formPower = item.formPowerIsAll ? ["zc", "tj", "dy", "sc", "fz"] : [] |
|||
break |
|||
case 3: |
|||
// item.listPowerIsAll = item.isTrue |
|||
item.listPower = item.listPowerIsAll ? ["newAdd", "import", "export", "sc", "dy", "showQrCode","del","bj"] : [] |
|||
break |
|||
case 4: |
|||
// item.isTrue = item.isTrue |
|||
item.operationButton = item.isPick ? ["bjapp","scapp","xzfg","scfg","yzfg","xz","bj","sc","yz","jczdh","yysz","yyfb"] : [] |
|||
break |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-26 15:50:20 |
|||
@ 功能: 分组全选全选 |
|||
*/ |
|||
const pickAllGroupBut = (item:any) => { |
|||
console.log("分组全选全选--->",item) |
|||
if(item){ |
|||
appGroupPower.groupButPower = ["xz","dl","bj","xzapp"] |
|||
}else{ |
|||
appGroupPower.groupButPower = [] |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-25 16:53:11 |
|||
@ 功能: 页面授权联动 |
|||
*/ |
|||
const changePageButBox = (item:any,types:number) => { |
|||
console.log("页面授权联动--->",item.pagePower.length,item,types) |
|||
if(item.pagePower.length == types){ |
|||
item.pagePowerIsAll = true |
|||
}else{ |
|||
item.pagePowerIsAll = false |
|||
} |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-26 15:47:23 |
|||
@ 功能: 分组授权 |
|||
*/ |
|||
const changeGroupPageButBox = () => { |
|||
groupLoading.value = true |
|||
let sendData = { |
|||
powerId: props.roleId, |
|||
powerType: props.powerType, |
|||
groupButPower: appGroupPower.groupButPower, |
|||
} |
|||
appGroupPowerConfig(sendData).then((res:any) => { |
|||
if(res.code == 0){ |
|||
ElMessage({ |
|||
message: "分组授权成功", |
|||
type: "success", |
|||
}); |
|||
}else{ |
|||
ElMessage({ |
|||
message: res.msg, |
|||
type: "error", |
|||
}); |
|||
} |
|||
groupLoading.value = false |
|||
}).finally(() => { |
|||
groupLoading.value = false |
|||
}) |
|||
console.log("分组授权--->",sendData) |
|||
} |
|||
/** |
|||
@ 作者: 秦东 |
|||
@ 时间: 2025-12-26 16:31:11 |
|||
@ 功能: 提交应用授权 |
|||
*/ |
|||
const submintAppPower = (appCont:AppPowerTreeMaster) => { |
|||
menuLoading.value = true |
|||
let sendData = { |
|||
powerId: props.roleId, |
|||
powerType: props.powerType, |
|||
appId: appCont.id, |
|||
appIsTrue: appCont.isTrue, |
|||
appPower: appCont.operationButton, |
|||
menuList: oneAppMenuList.value, |
|||
} |
|||
appPowerConfig(sendData).then((res:any) => { |
|||
if(res.code == 0){ |
|||
ElMessage({ |
|||
message: "应用授权成功", |
|||
type: "success", |
|||
}); |
|||
}else{ |
|||
ElMessage({ |
|||
message: res.msg, |
|||
type: "error", |
|||
}); |
|||
} |
|||
menuLoading.value = false |
|||
}).finally(() => { |
|||
menuLoading.value = false |
|||
}) |
|||
|
|||
console.log("提交应用授权--->",sendData) |
|||
console.log("提交应用授权--appCont->",appCont) |
|||
} |
|||
defineExpose({ |
|||
getAppList |
|||
}) |
|||
</script> |
|||
<template> |
|||
<div class="app-tabs-content"> |
|||
<div class="appGroupPowerBut"> |
|||
<div class="appGroupPowerButTitle">应用分组权限</div> |
|||
<div class="appGroupPowerButList"> |
|||
<el-checkbox label="全选" @change="pickAllGroupBut" /> |
|||
<el-checkbox-group v-model="appGroupPower.groupButPower"> |
|||
<el-checkbox |
|||
v-for="city in appGroupBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</div> |
|||
<div class="appGroupPowerButAuth"> |
|||
<el-button type="primary" v-loading="groupLoading" element-loading-text="Loading..." @click="changeGroupPageButBox">分组授权</el-button> |
|||
</div> |
|||
</div> |
|||
<div class="appGroupTabs"> |
|||
<el-tabs v-model="oneGroupActiveTab" class="demo-tabs" v-loading="groupLoading" element-loading-text="Loading..."> |
|||
<el-tab-pane v-for="item in appGroupPower.appList " :key="item.id" label="应用权限" :name="item.id"> |
|||
<template #label> |
|||
<div class="appTabsCheckbox"> |
|||
<el-checkbox v-model="item.isTrue" /><span>{{item.name}}</span> |
|||
</div> |
|||
</template> |
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
<div class="appMenuBox"> |
|||
<div class="appInfoBox"> |
|||
<el-tabs v-model="oneAppActiveTab" class="demo-tabs left_hight" tab-position="left" v-loading="appLoading" element-loading-text="Loading..."> |
|||
<el-tab-pane v-for="item in oneGroupAppList " :key="item.id" label="应用权限" :name="item.id"> |
|||
<template #label> |
|||
<div class="apptitle"> |
|||
<el-checkbox v-model="item.isTrue" /><span>{{item.name}}</span> |
|||
</div> |
|||
</template> |
|||
<div class="oneAppPower" v-loading="menuLoading" element-loading-text="Loading..."> |
|||
|
|||
<div class="appGroupPowerButTitle">App应用权限</div> |
|||
<div style="width:100%; padding:0 5px;"> |
|||
<el-checkbox label="全选" v-model="item.isPick" @change="pickAppAllPower(item)" /> |
|||
</div> |
|||
<div class="app-form-checkbox"> |
|||
<el-checkbox-group v-model="item.operationButton"> |
|||
<el-checkbox |
|||
v-for="city in appDetailBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</div> |
|||
<div class="shouquan"> |
|||
<el-button type="primary" v-loading="menuLoading" element-loading-text="Loading..." @click="submintAppPower(item)">提交App权限</el-button> |
|||
</div> |
|||
</div> |
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
</div> |
|||
<div class="appMenuBody"> |
|||
|
|||
<el-table |
|||
:data="oneAppMenuList" |
|||
style="width: 100%;" |
|||
class="tableScrollbar" |
|||
row-key="id" |
|||
border |
|||
default-expand-all |
|||
v-loading="menuLoading" element-loading-text="Loading..." |
|||
> |
|||
<el-table-column prop="name" label="栏目名称" > |
|||
<template #default="scope"> |
|||
<el-checkbox v-model="scope.row.isTrue" :value="scope.row.isTrue" @change="handleAppMenuChange(scope.row)"></el-checkbox> |
|||
{{ scope.row.name }} |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="pagePower" label="页面权力" > |
|||
<template #header> |
|||
<el-text>页面权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox label="全选" v-model="scope.row.pagePowerIsAll" @change="pickAllBut(scope.row,1)" /> |
|||
<el-checkbox-group v-model="scope.row.pagePower"> |
|||
<el-checkbox |
|||
v-for="city in formBaseBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
@change="changePageButBox(scope.row,formBaseBut.length)" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="formPower" label="表单权限" > |
|||
<template #header> |
|||
<el-text>表单权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox label="全选" v-model="scope.row.formPowerIsAll" @change="pickAllBut(scope.row,2)" /> |
|||
<el-checkbox-group v-model="scope.row.formPower"> |
|||
<el-checkbox |
|||
v-for="city in appTableBut" |
|||
:key="city.value" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="listPower" label="listPower" > |
|||
<template #header> |
|||
<el-text>列表权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-checkbox v-model="scope.row.listPowerIsAll" label="全选" @change="pickAllBut(scope.row,3)" /> |
|||
<el-checkbox-group v-model="scope.row.listPower"> |
|||
<el-checkbox |
|||
v-for="city in appListBut" |
|||
:key="city.key" |
|||
:label="city.label" |
|||
:value="city.value" |
|||
> |
|||
{{ city.label }} |
|||
</el-checkbox> |
|||
</el-checkbox-group> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="visibleRange" label="数据权限" > |
|||
<template #header> |
|||
<el-text>数据权限</el-text> |
|||
</template> |
|||
<template #default="scope"> |
|||
<el-radio-group |
|||
v-model="scope.row.visibleRange.types" |
|||
> |
|||
<el-row> |
|||
<el-col :span="24"><el-radio :value="1">本人</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="2">本岗位</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="3">本部门</el-radio></el-col> |
|||
<el-col :span="24"><el-radio :value="4">本分部</el-radio></el-col> |
|||
<el-col :span="24"> |
|||
<el-radio :value="5">指定行政组织</el-radio> |
|||
<el-tree-select |
|||
v-if="scope.row.visibleRange.types == 5" |
|||
v-model="scope.row.visibleRange.attribute" |
|||
:data="orgTree" |
|||
style="width: 100%" |
|||
node-key="id" |
|||
:props="systemMenuTreePropsing" |
|||
clearable |
|||
multiple |
|||
:render-after-expand="false" |
|||
show-checkbox |
|||
collapse-tags |
|||
collapse-tags-tooltip |
|||
/> |
|||
</el-col> |
|||
<el-col :span="24"><el-radio :value="6">所有</el-radio></el-col> |
|||
</el-row> |
|||
</el-radio-group> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</template> |
|||
<style lang='scss' scoped> |
|||
.app-tabs-content { |
|||
width: 100%; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
.appGroupPowerBut{ |
|||
width: 120px; |
|||
border: 1px solid #e4e7ed; |
|||
|
|||
.appGroupPowerButList{ |
|||
padding: 5px; |
|||
} |
|||
.appGroupPowerButAuth{ |
|||
padding: 5px; |
|||
text-align: center; |
|||
button{ |
|||
width: 100%; |
|||
} |
|||
} |
|||
} |
|||
.appGroupTabs{ |
|||
width: calc(100% - 140px); |
|||
.appTabsCheckbox{ |
|||
display: flex; |
|||
align-items: center; |
|||
label{ |
|||
padding:0 5px 0 10px; |
|||
} |
|||
span{ |
|||
padding:0 10px 0 0; |
|||
} |
|||
} |
|||
:deep .el-tabs__content{ |
|||
padding: 0; |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
.left_hight{ |
|||
height: calc(100vh - 350px); |
|||
} |
|||
.appGroupPowerButTitle{ |
|||
font-size: 16px; |
|||
font-weight: bold; |
|||
background-color: #f5f7fa; |
|||
padding: 5px; |
|||
border-radius: 5px; |
|||
} |
|||
.oneAppPower{ |
|||
width: 120px; |
|||
border: 1px solid #e4e7ed; |
|||
.app-form-checkbox{ |
|||
padding:0 5px; |
|||
} |
|||
} |
|||
.tableScrollbar{ |
|||
width: 100%; |
|||
height: calc(100vh - 365px); |
|||
overflow: hidden; |
|||
overflow-y: auto; |
|||
margin-top: 15px; |
|||
} |
|||
.appMenuBox{ |
|||
display: flex; |
|||
justify-content: space-between; |
|||
.appInfoBox{ |
|||
width: 410px; |
|||
::deep .el-tabs__content{ |
|||
padding: 0; |
|||
} |
|||
} |
|||
.appMenuBody{ |
|||
width: calc(100% - 410px); |
|||
} |
|||
} |
|||
.apptitle{ |
|||
width: 200px; |
|||
text-align: left; |
|||
padding: 0 10px; |
|||
display: flex; |
|||
align-items: center; |
|||
overflow-x: auto; |
|||
word-wrap: break-word; /* 旧版浏览器兼容 */ |
|||
overflow-wrap: break-word; /* 标准属性 */ |
|||
word-break: break-all; /* 强制任意字符断行 */ |
|||
white-space: pre-wrap; /* 保留空格换行 */ |
|||
span{ |
|||
margin-left: 5px; |
|||
} |
|||
} |
|||
.shouquan{ |
|||
width: 100%; |
|||
text-align: center; |
|||
padding: 5px 0 10px 0; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue