You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

247 lines
8.1 KiB

<template>
<div>
<div style="margin:2px 2px 5px 2px;display: flex;justify-content:space-between;">
<div>
<el-input placeholder="输入关键字进行过滤" v-model="filterText" size="small" />
</div>
<div v-show="isRole && checkPagePriv(pagePriv.privs,'提交')">
<el-button @click="btnSubmit" size="small">提交</el-button>
</div>
</div>
<div style="overflow: scroll;height:450px;">
<el-tree :data="menuInfoView" :props="customerOrg.treeprops"
node-key="id" :filter-node-method="filterNode" show-checkbox
default-expand-all
:default-expanded-keys="customerOrg.defaultExpandedKeys"
@check-change="handleCheckChange" highlight-current ref="customerOrgTree"/>
</div>
</div>
</template>
<script>
import { mapState, mapMutations } from "vuex";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
import { getPagePriv,checkPagePriv, deepCopy,tcdate,arrayExistObj } from "../../utlis/proFunc";
import { getTreeNode, getTreeAllChildIdsByNode, getTreeAllChildIdsById, getTreePids } from "../../utlis/tree";
export default {
components: {},
props:["params"], // params = { opra: role/user 用户/角色, idVal: roleId/userId}
data() {
return {
pagePriv:{
routeUrlorPageName:'MenuInfoSet', //当前页面归属路由或归属页面权限名称
privs:[] // 页面权限
},
menuInfoView:[], //显示菜单
menuInfoSet:[], //设置菜单
checkedKeys:[], //勾选的菜单节点ID
filterText:''
};
},
computed: {
...mapState(["window", "dialogWin", "dataTransOpts", "customerOrg" ]),
// 是否角色
isRole(){
let ret = true
if(this.params && this.params.opra == "user"){
ret = false
}
return ret
},
},
//创建组件后
created() {
//获取用户当前页面的权限
let userPriv = window.sessionStorage.getItem('userPriv')
if(userPriv) this.pagePriv.privs = deepCopy(getPagePriv(this.pagePriv.routeUrlorPageName))
},
//挂载组件完成
mounted() {
},
methods: {
...mapMutations(["setData"]),checkPagePriv,
// 初始化数据,获取菜单列表树信息 及角色的授权菜单
initData(roleOrUser_Id) {
getapi("/api/app/menuinfo/getmenuinfotreelist").then((res) => {
if(res.code != -1){
this.menuInfoView = res.data
tcdate(this.menuInfoView);
// 如果不是角色,则不允许编辑权限
if(!this.isRole){
this.setTreeDisabled(this.menuInfoView,"treeChildren")
}
if(this.isRole){
return getapi(`/api/app/rolemenuinfo/getrolemenuinfolist?RoleId=${roleOrUser_Id}`) //
}else{
return getapi(`/api/app/menuinfo/getmymenuinfolistinuser?UserId=${roleOrUser_Id}`)
}
}
}).then(res =>{
if(res && res.code != -1){
// 勾选赋值
this.menuInfoSet = res.data
this.setCheckedKeys()
}
}).catch(err =>{
console.log(err)
});
},
// 用户只允查看权限,暂不允许修权限
setTreeDisabled(tree,childrenNodeName){
tree.forEach(e => {
e.disabled = true
if(e[childrenNodeName]) this.setTreeDisabled(e[childrenNodeName],childrenNodeName)
});
},
// 初始设置菜单勾选
setCheckedKeys(){
this.checkedKeys = []
if(!this.isRole){
this.menuInfoSet.forEach(e => {
e.menuInfoId = e.id
});
}
this.menuInfoSet.forEach(e => {
// 无下级节点时,勾选;有下级节点时,所有下级节点全部勾选时,才勾选
let node = getTreeNode(this.menuInfoView, "treeChildren", "id", e.menuInfoId)
if(node.treeChildren){
//获取所有下级节点值
let menuInfoIds = getTreeAllChildIdsByNode(node, "treeChildren", "id")
let count = 0
menuInfoIds.forEach(item => {
let lfind = arrayExistObj(this.menuInfoSet,"menuInfoId",item)
if(lfind > -1) count++
});
if(menuInfoIds.length == count) this.checkedKeys.push(e.menuInfoId)
}else{
this.checkedKeys.push(e.menuInfoId)
}
});
this.$refs["customerOrgTree"].setCheckedKeys(this.checkedKeys);
},
//提交按钮(保存角色权限)
btnSubmit(){
let body = {
roleId:this.dataTransOpts.tableS.adp_roles.id,
menuInfoIds:[]
}
this.menuInfoSet.forEach(e => {
if(e.menuInfoId) body.menuInfoIds.push(e.menuInfoId)
});
postapi('/api/app/rolemenuinfo/setrolemenuinfo',body).then(res =>{
if(res.code != -1){
console.log('操作成功!')
this.dialogWin.MenuPageSet = false
}
})
},
//勾选节点
handleCheckChange(data, checked, indeterminate) {
console.log('data, checked, indeterminate,this.menuInfoSet',data, checked, indeterminate,this.menuInfoSet);
let lfind = 0,count = 0
if(checked){
// 获取所有上级节点
let pids = getTreePids(this.menuInfoView, "treeChildren", "parentId", "id", data.id)
pids.push(data.id) //添加自身节点
pids.forEach(e => {
if(e){
lfind = arrayExistObj(this.menuInfoSet,'menuInfoId',e)
if(lfind == -1) this.menuInfoSet.push({ menuInfoId:e })
}
});
}else if(!indeterminate){
// 取消授权时
lfind = arrayExistObj(this.menuInfoSet,'menuInfoId',data.id)
if(lfind > -1) this.menuInfoSet.splice(lfind,1)
// 如果有下级节点,则取消所有下级节点的授权
// let node = getTreeNode(this.menuInfoView, "treeChildren", "id", data.id)
// if(node.treeChildren){
// let childs = getTreeAllChildIdsByNode(node, "treeChildren", "id")
// childs.forEach(id => {
// lfind = arrayExistObj(this.menuInfoSet,'menuInfoId',id)
// if(lfind > -1) this.menuInfoSet.splice(lfind,1)
// });
// }
// 所有平级节点都被取消时,上级节点也应取消
let parentIds = getTreePids(this.menuInfoView, "treeChildren", "parentId", "id", data.id)
parentIds.forEach(e => {
if(e){
let pNode = getTreeNode(this.menuInfoView, "treeChildren", "id", e)
count = pNode["treeChildren"].length
pNode["treeChildren"].forEach(item => {
lfind = arrayExistObj(this.menuInfoSet,'menuInfoId',item.id)
if(lfind == -1) count--
});
if(count == 0){
lfind = arrayExistObj(this.menuInfoSet,'menuInfoId',e)
if(lfind > -1) this.menuInfoSet.splice(lfind,1)
}
}
});
}
console.log('this.menuInfoSet',this.menuInfoSet)
},
//树过滤
filterNode(value, data) {
//console.log(value,data)
if (!value) return true;
return data['displayName'].indexOf(value) !== -1 || data['simpleCode'].indexOf(value.toUpperCase()) !== -1;
}
},
watch: {
// 刷新菜单
"dataTransOpts.refresh.role_menu_info.M":{
immediate:true,
handler(newVal, oldVal) {
let roleOrUser_Id
if(this.isRole){
roleOrUser_Id = this.dataTransOpts.tableS.adp_roles.id
}else{
roleOrUser_Id = this.dataTransOpts.tableS.adp_users.id
}
console.log(`watch ${this.isRole ? '角色':'用户'} 权限 newVal:${newVal} oldVal:${oldVal} registerCheckId: ${roleOrUser_Id}`);
this.initData(roleOrUser_Id)
}
},
"customerOrg.treeCurrentNodekey"(newVal,oldVal){
//console.log('watch:customerOrg.treeCurrentNodekey',newVal,oldVal)
if(newVal && newVal != oldVal){
this.$nextTick(() => {
this.$refs['customerOrgTree'].setCurrentKey(newVal);
})
}
},
"filterText"(newVal,oldVal){ //过滤菜单
this.$refs['customerOrgTree'].filter(newVal);
}
},
};
</script>
<style scoped>
@import "../../assets/css/global.css";
@import "../../assets/css/global_table.css";
</style>