From badf10af5578f3fe4151824670bb7a794efc63dd Mon Sep 17 00:00:00 2001 From: wangting <675591594@qq.com> Date: 星期二, 03 十二月 2024 17:12:04 +0800 Subject: [PATCH] 数据授权 --- Source/plt-web/plt-web-ui/src/views/authority/ui/dataAuthorization/dataView.vue | 562 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 545 insertions(+), 17 deletions(-) diff --git a/Source/plt-web/plt-web-ui/src/views/authority/ui/dataAuthorization/dataView.vue b/Source/plt-web/plt-web-ui/src/views/authority/ui/dataAuthorization/dataView.vue index b2eb1c6..fe69008 100644 --- a/Source/plt-web/plt-web-ui/src/views/authority/ui/dataAuthorization/dataView.vue +++ b/Source/plt-web/plt-web-ui/src/views/authority/ui/dataAuthorization/dataView.vue @@ -1,27 +1,134 @@ <template> - <div style="padding: 10px 0"> - <el-tabs tab-position="left" :style="'height: '+height+';'"> - <el-tab-pane label="涓讳綋"> - <fieldset> - <legend> 涓婚 </legend> - <div> - <div v-if="!readOnly"> - <el-button plain size="mini" type="primary" @click="userHandler">閫変腑鐢ㄦ埛</el-button> - <el-button plain size="mini" type="primary" @click="roleHandler">閫夋嫨瑙掕壊</el-button> - <el-button plain size="mini" type="primary" @click="deptHandler">閫夋嫨鐢ㄦ埛缁�</el-button> + <div> + <el-tabs tab-position="left" :style="'height: '+height+'px;'"> + <el-tab-pane> + <span slot="label"><i class="el-icon-s-custom"></i> 涓讳綋</span> + <div v-if="!readOnly" style="margin-bottom: 10px;"> + <el-button plain size="mini" type="primary" @click="userHandler">閫夋嫨鐢ㄦ埛</el-button> + <el-button plain size="mini" type="primary" @click="roleHandler">閫夋嫨瑙掕壊</el-button> + <el-button plain size="mini" type="primary" @click="deptHandler">閫夋嫨鐢ㄦ埛缁�</el-button> + </div> + <div v-if="!readOnly" style="display: flex;justify-content: space-between;align-items: center;"> + <fieldset style="width: 48%"> + <legend> 涓讳綋 </legend> + <div> + <avue-crud ref="mainCrud" :data="mainData" :option="mainOption"> + <template #type="{ row }"> + <el-tag v-if="row.type=='鐢ㄦ埛'" :key="row.oid" effect="dark">{{ row.type }}</el-tag> + <el-tag v-else-if="row.type=='瑙掕壊'" type="info" :key="row.oid" effect="dark">{{ row.type }}</el-tag> + <el-tag v-else="row.type=='閮ㄩ棬'" type="warning" :key="row.oid" effect="dark">{{ row.type }}</el-tag> + </template> + </avue-crud> </div> + </fieldset> + <div style="text-align: center;"> + <el-button icon="el-icon-arrow-right" size="mini" @click="rightHandler" style="margin-bottom: 50px;"></el-button><br/> + <el-button icon="el-icon-arrow-left" size="mini" @click="leftHandler"></el-button> + </div> + <fieldset style="width: 42%"> + <legend> 鎺堟潈涓讳綋 </legend> + <div> + <avue-crud ref="authCrud" :data="authData" :option="authOption" :table-loading="tableLoading"> + </avue-crud> + </div> + </fieldset> + </div> + <div v-else> + <fieldset style="width: 99.5%"> + <legend> 鎺堟潈涓讳綋 </legend> + <div> + <avue-crud ref="authCrud" :data="authData" :option="authOption" :table-loading="tableLoading"> + </avue-crud> + </div> + </fieldset> + </div> + </el-tab-pane> + <el-tab-pane> + <span slot="label"><i class="el-icon-eleme"></i> 瀹綋</span> + <div> + <basic-form key="queryForm" style="margin-bottom: 0" + ref="form" + :span="8" + :formItems="formItems" + :formData="form" + @getFormData="getFormData"> + </basic-form> + <el-container v-if="!readOnly && (form.ruleType=='1' || form.ruleType=='3')"> + <el-aside style="width:350px"> + <fieldset> + <legend> 鍊欓�夋潯浠� </legend> + <div> + <avue-radio v-model="radioForm" :dic="radioDic" style="margin: 0 10px 5px"></avue-radio> + <div v-show="radioForm==1"> + 鏌ヨ妯℃澘瀹氫箟 + <avue-select @change="linkQueryDefineChange" class="el-input--small" v-model="linkQueryDefineForm" placeholder="璇烽�夋嫨鍐呭" type="tree" :dic="linkQueryDefineDic" style="width:245px"></avue-select> + <avue-tree :style="'width:335px;height: '+(height-155)+'px;'" :data="linkTreeData" :option="treeOption" @node-drag-start="handleDragStart" @node-drag-end="handleDragEnd"> + </avue-tree> + </div> + <div v-show="radioForm==0"> + 鏌ヨ妯℃澘瀹氫箟 + <avue-select @change="businessQueryDefineChange" class="el-input--small" v-model="businessQueryDefineForm" placeholder="璇烽�夋嫨鍐呭" type="tree" :dic="businessQueryDefineDic" style="width: 245px;"></avue-select> + <avue-tree :style="'width:335px;height: '+(height-155)+'px;'" :data="businessTreeData" :option="treeOption" @node-drag-start="handleDragStart" @node-drag-end="handleDragEnd"> + </avue-tree> + </div> + </div> + </fieldset> + </el-aside> + <el-main> + <fieldset style="margin: 0 10px"> + <legend> 鏌ヨ鏉′欢 </legend> + <form-query-dialog ref="formQuery" + :style="'height: '+(height-100)+'px;'" + :queryCondition="queryCondition" + :queryTree="queryTree" + :levelFlag.sync="form.levelFlag" + @queryHandler="queryHandler" + ></form-query-dialog> + </fieldset> + </el-main> + </el-container> + </div> + </el-tab-pane> + <el-tab-pane> + <span slot="label"><i class="el-icon-s-tools"></i> 鎿嶄綔</span> + <fieldset :style="'width:99.5%;height: '+(height-10)+'px;margin-bottom:10px;'"> + <legend> 涓�鑸搷浣� </legend> + <div> + <avue-checkbox :disabled="readOnly" key="actionCheck" :all="!readOnly" v-model="actionForm" placeholder="璇烽�夋嫨鍐呭" :dic="actionDic"></avue-checkbox> + </div> + </fieldset> + <fieldset v-if="0" :style="'width:99.5%;height: '+(height/2-30)+'px;'"> + <legend> 鍏崇郴鍜岃穬杩� </legend> + <div> + <avue-checkbox :disabled="readOnly" key="linkActionCheck" :all="!readOnly" v-model="linkactionForm" placeholder="璇烽�夋嫨鍐呭" :dic="linkactionDic"></avue-checkbox> </div> </fieldset> </el-tab-pane> - <el-tab-pane label="瀹綋">瀹綋</el-tab-pane> - <el-tab-pane label="鎿嶄綔">鎿嶄綔</el-tab-pane> </el-tabs> + <!-- 閫夋嫨鐢ㄦ埛绌挎妗� --> + <transfer ref="usertransfer" :left-role-data="leftUserData" :right-role-data="rightUserData" + :transferTitle="['鏈�夋嫨鐢ㄦ埛','宸查�夋嫨鐢ㄦ埛']" title="涓讳綋娣诲姞鐢ㄦ埛" + @transferSend="userSendHandler"> + </transfer> + <!-- 閫夋嫨鐢ㄦ埛绌挎妗� --> + <transfer ref="roletransfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData" + :transferTitle="['鐜版湁瑙掕壊','鎷ユ湁瑙掕壊']" title="娣诲姞瑙掕壊" + @transferSend="roleSendHandler"> + </transfer> </div> </template> <script> +import basicOption from "@/util/basic-option"; +import formQueryDialog from "@/views/modelingMenu/queryTemplate/linkTypeQuery/formQueryDialog.vue"; +import {queryTemplateListByAttr} from "@/api/queryTemplate/queryDefine"; +import {getCriteria} from "@/api/queryTemplate/linkTypeQuery"; +import {listUserByUserType} from "@/api/system/user/api"; +import {listUserByRoleOid, listUserUnInRoleOid, saveRight} from "@/api/system/role/api"; + export default { name: "dataView", + components:{formQueryDialog}, props: { //閫変腑鐨勪笟鍔$被鍨嬭妭鐐� btmNode: { @@ -29,7 +136,7 @@ default: {} }, //閫変腑琛屾暟鎹� - data: { + selectRow: { type: Object, default: {} }, @@ -38,26 +145,447 @@ default: false }, height: { - type: String, - default: '400px' + type: Number, + default: 400 }, + actionMap:{ + type: Object, + default: {} + } }, data() { return { + leftUserData: [], // 閫夋嫨鎴愬憳绌挎妗嗗乏渚у垵濮嬫暟鎹� + rightUserData: [], // 閫夋嫨鎴愬憳绌挎妗嗗彸渚у垵濮嬫暟鎹� + leftRoleData: [], // 閫夋嫨瑙掕壊绌挎妗嗗乏渚у垵濮嬫暟鎹� + rightRoleData: [], // 閫夋嫨瑙掕壊绌挎妗嗗彸渚у垵濮嬫暟鎹� + mainData:[], + tableLoading: false, + mainOption: { + ...basicOption, + header:false, + addBtn: false, + editBtn: false, + delBtn: false, + selection: false, + index:false, + menu:false, + height: this.height-80, + tip:false, + size:'mini', + highlightCurrentRow:true, + column: [{ + label: ' 鍒嗙被', + prop: 'type', + sortable: true, + width:110 + },{ + label: '缂栫爜', + prop: 'id' + },{ + label: '鍚嶇О', + prop: 'name' + }] + }, + authData:[], + authOption:{ + ...basicOption, + header:false, + addBtn: false, + editBtn: false, + delBtn: false, + selection: false, + index:false, + menu:false, + height: this.readOnly?this.height-50:this.height-80, + tip:false, + showHeader:false, + size:'mini', + highlightCurrentRow:true, + align:'left', + column: [{ + label: '鍚嶇О', + prop: 'name' + }] + }, + formItems:[{ + label: '瑙勫垯鍚嶇О', + prop: 'ruleName', + type: 'input', + span:8, + labelWidth: 100, + disabled:this.readOnly, + rules: [{ + required: true, + message: "璇疯緭鍏ヨ鍒欏悕绉�", + trigger: "blur" + }] + }, { + label: '瑙勫垯绫诲瀷', + prop: 'ruleType', + type: 'select', + span:6, + labelWidth:110, + disabled:this.readOnly, + dicData: [{ + label: '鍏ㄩ儴鍏佽', + value: '0' + }, { + label: '鍏佽鏉冮檺', + value: '1', + disabled:true + }, { + label: '鍏ㄩ儴鎷掔粷', + value: '2' + }, { + label: '鎷掔粷鏉冮檺', + value: '3', + disabled:true + }], + value: '0' + }], + form:{ + btmName:'', + qtName: '', + levelFlag:0,//0:鏅�氭煡璇㈡ā鏉�; 1:楂樼骇鏌ヨ妯℃澘" + queryTemplate:{},//瀹綋涓煡璇㈡潯浠� + "ID": "",//鏁版嵁鐨処D + "roles": "",//鏄剧ず鍒版巿鏉冧富浣撶晫闈紝瑙掕壊鍚嶇О锛屽涓娇鐢ㄩ�楀彿鍒嗛殧 + "userGroups": "",//鏄剧ず鍒版巿鏉冧富浣撶晫闈紝閮ㄩ棬鍚嶇О锛屽涓娇鐢ㄩ�楀彿鍒嗛殧 + "users": "",//鏄剧ず鍒版巿鏉冧富浣撶晫闈紝鐢ㄦ埛鍚嶇О锛屽涓娇鐢ㄩ�楀彿鍒嗛殧 + "expToSQL": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + "identifier": "terminology_query",//涓氬姟绫诲瀷锛坱erminology锛�+涓嬪垝绾匡紙_锛�+鎿嶄綔鍖虹殑涓�鑸搷浣滅殑鎸夐挳鑻辨枃鍚嶇О锛坬uery锛�,澶氫釜鎸夐挳鐨勮瘽鏄鏉℃暟鎹笉鏄娇鐢ㄩ�楀彿鍒嗛殧 + "isGrand": 49, //姝ゅ涓烘搷浣滃尯鐨勪竴鑸搷浣滅殑鎸夐挳鏄惁涓洪�夋嫨鎯呭喌锛屾湭閫変腑鍊间负48锛岄�変腑涓�49锛岃繖閲屾槸灏�0鍜�1杞负浜哹yte鍊硷紝鎵�浠ヤ负48锛�49 + "lexpToSQL": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + "lruleText": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + "lseniorRuleText": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + "ruleName": "assssss",//瑙勫垯鍚嶇О + "ruleText": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + "ruleType": "2",//0鍏ㄩ儴鍏佽锛�1鍏佽鏉冮檺锛�2鍏ㄩ儴鎷掔粷锛�3鎷掔粷鏉冮檺锛岀敱浜庢殏鏃跺彧鍋氬叏閮ㄥ厑璁镐笌鍏ㄩ儴鎷掔粷锛屾墍浠ユ殏鏃跺彲浠ヤ笉鐢ㄧ + "seniorRuleText": "",//姝ゅ涓哄厑璁告潈闄愭垨鎷掔粷鏉冮檺闇�濉厖鐨勬暟鎹紝鏆傛椂涓嶅仛澶勭悊锛屼负绌哄瓧绗︿覆鍗冲彲 + }, + radioForm:0, + radioDic:[{ + label:'涓氬姟绫诲瀷 ', + value:0 + },{ + label:'閾炬帴绫诲瀷', + value:1 + }], + treeOption: { + defaultExpandAll: true, + menu: false, + addBtn: false, + filter: false, + draggable: true, + allowDrop: () => { + return false; + }, + allowDrag: (dropNode) => { + if (dropNode.data.attrs && dropNode.data.attrs.length > 0) { + return false; + } else { + return true; + } + }, + props: { + label: 'name', + value: 'name', + children: 'attrs' + } + }, + linkQueryDefineForm:'',//閾炬帴绫诲瀷鏌ヨ妯℃澘瀹氫箟閫変腑鍊� + linkQueryDefineDic:[],//閾炬帴绫诲瀷鏌ヨ妯℃澘瀹氫箟涓嬫媺鏁版嵁 + //閾炬帴绫诲瀷鏌ヨ妯℃澘瀹氫箟閫変腑椤瑰睘鎬� + linkTreeData: [], + businessQueryDefineForm:'',//涓氬姟绫诲瀷鏌ヨ妯℃澘瀹氫箟閫変腑鍊� + businessQueryDefineDic:[],//涓氬姟绫诲瀷鏌ヨ妯℃澘瀹氫箟涓嬫媺鏁版嵁 + //涓氬姟绫诲瀷鏌ヨ妯℃澘瀹氫箟閫変腑椤瑰睘鎬� + businessTreeData: [], + //楂樼骇鏌ヨ鏉′欢 + queryTree:{}, + //鏅�氭煡璇㈡潯浠� + queryCondition:[], + actionForm:[],//涓�鑸搷浣滈�変腑鍊� + actionDic:[],//涓�鑸搷浣滈�変腑椤� + linkactionForm:[],//鍏崇郴鍜岃穬杩侀�変腑鍊� + linkactionDic:[]//鍏崇郴鍜岃穬杩侀�変腑椤� } }, created() { + listUserByUserType().then(res => { + if(typeof res.data == 'string'){ + res.data=eval('('+res.data +')') + } + // 缁勮濂界┛姊鍙敤鏁版嵁 + this.leftUserData = res.data.data.map(item => { + return { + name: item.name + `(${item.id})`, + oid: item.oid + } + }) + this.rightUserData = []; + }) + }, + watch: { + selectRow:{ + handler(val) { + this.authData=[]; + if(val && val.rules){ + //this.getTemp(true); + //this.getTemp(false) + //鏋勫缓鎺堟潈涓讳綋鏁版嵁 + if(val.rules.users){ + val.rules.users.split(',').forEach((item,i)=>{ + if(item){ + this.authData.push({ + name:'{'+item+', '+item+', user}' + }) + } + }) + } + if(val.rules.roles){ + val.rules.roles.split(',').forEach((item,i)=>{ + if(item){ + this.authData.push({ + name:'{'+item+', '+item+', role}' + }) + } + }) + } + if(val.rules.userGroups){ + val.rules.userGroups.split(',').forEach((item,i)=>{ + if(item){ + this.authData.push({ + name:'{'+item+', '+item+', userGroup}' + }) + } + }) + } + } + }, + immediate: true, + deep: true + }, + actionMap:{ + handler(val) { + this.actionDic=[]; + if(val){ + for(var i in val){ + this.actionDic.push({ + label:i, + value:val[i] + }) + } + }; + }, + immediate: true, + deep: true + }, }, methods: { + //閫変腑鐢ㄦ埛 + userHandler(){ + this.$refs.usertransfer.visible = true; + }, + // 閫変腑鐢ㄦ埛绌挎妗嗗洖濉� + userSendHandler(row) { + row.forEach((item,index)=>{ + this.authData.push({ + type:'user', + ...item + }) + }) + }, + //閫夋嫨瑙掕壊 + roleHandler(){ + Promise.all([ + listUserUnInRoleOid({pkRole: this.selectList.oid}), + listUserByRoleOid({pkRole: this.selectList.oid}) + ]).then(([unInRoleRes, byRoleRes]) => { + if (unInRoleRes.data.code === 200 && byRoleRes.data.code === 200) { + const leftData = [...unInRoleRes.data.data, ...byRoleRes.data.data]; + // 缁勮濂界┛姊鍙敤鏁版嵁 + this.leftRoleData = leftData.map(item => { + return { + name: item.name + `(${item.id})`, + oid: item.oid + } + }) + this.rightRoleData = byRoleRes.data.data.map(item => item.oid); + this.$refs.transfer.visible = true; + } + }); + }, + // 閫夋嫨瑙掕壊绌挎妗嗗洖濉� + roleSendHandler(row) { + row.forEach((item,index)=>{ + this.authData.push({ + type:'role', + ...item + }) + }) + }, + //閫夋嫨鐢ㄦ埛缁� + deptHandler(){ + + }, + initFormData() { + let formData = { + btmName: this.form.btmName, + qtName: this.form.qtName, + levelFlag: this.form.levelFlag, + queryTemplate: { + btmType: this.form.btmType, + clauseList: ['*'], + direction: this.form.direction, + id: this.form.qtName, + level: this.form.level, + linkType: this.form.btmName, + orderInfoList: this.orderInfoList, + queryISLeaf: this.form.queryISLeaf, + recReturnMode: 1,//閫掑綊杩斿洖鏁版嵁妯″紡:1锛歊ECRETURNMODE_FLAT, 2锛歊ECRETURNMODE_FILTER + rightFlag: true, + secretFlag: true, + type: 'link', + version: this.form.version + } + } + if (formData.levelFlag == 1) { + //楂樼骇 + let that = this; + function initValue(nodeChild) { + let children = []; + if (nodeChild) { + nodeChild.forEach((item, index) => { + if (item.label != '骞朵笖' && item.label != '鎴栬��') { + children.push(item.label); + } else { + children.push({ + connector: item.label, + child: initValue(item.children) + }) + } + }) + } + return children; + } + + let treeData = { + connector: this.$refs.formQuery.treeData[0].label + }; + if (this.$refs.formQuery.treeData[0].children) { + treeData.child = initValue(this.$refs.formQuery.treeData[0].children); + } + formData.tree = treeData + } + + formData.condition = this.$refs.formQuery.conditionList; + + return formData; + }, + getFormData(form) { + this.form = form; + }, + //鑾峰彇鏌ヨ妯℃澘瀹氫箟涓嬫媺 + getTemp(linkFlag) { + if (this.btmNode.attributes) { + queryTemplateListByAttr({btmName: this.btmNode.attributes.name, linkFlag: linkFlag,direction:linkFlag?null:this.form.direction}).then(res => { + const data = res.data.data.map(item => { + item.label = item.name + '-' + (item.linkTypeName || item.btmName); + item.value = item.name; + return item; + }); + if(linkFlag){ + this.linkQueryDefineDic=data + data.length>0 && (this.linkQueryDefineForm=data[0].value); + }else { + this.businessQueryDefineDic=data; + data.length>0 && (this.businessQueryDefineForm= data[0].value); + } + }) + } + }, + //閾炬帴绫诲瀷鏌ヨ妯℃澘鍒囨崲 + linkQueryDefineChange(data) { + if (data.value) { + this.linkTreeData = [{ + name: data.value, + attrs: data.item.attrs + }] + } + }, + //涓氬姟绫诲瀷鏌ヨ妯℃澘鍒囨崲 + businessQueryDefineChange(data) { + if (data.value) { + this.businessTreeData = [{ + name: data.value, + attrs: data.item.attrs + }] + } + }, + // 寮�濮嬫嫋鎷芥爲鑺傜偣浜嬩欢 + handleDragStart(node, ev) { + // 浣跨敤 setData 鏂规硶璁剧疆鏁版嵁 + ev.dataTransfer.setData('item', JSON.stringify(node.data)); + if(this.form.levelFlag==1){ + this.$refs.formQuery.$refs.tree.$emit('tree-node-drag-start', ev,{node:this.$refs.formQuery.initItem(node)}); + } + }, + handleDragEnd(draggingNode,endNode,position,ev){ + if(this.form.levelFlag==1) { + this.$refs.formQuery.$refs.tree.$emit('tree-node-drag-end', ev); + } + }, + //鏌ヨ + queryHandler(){ + this.$refs.form.validate((valid) => { + if (valid) { + this.$refs.formQuery.queryResultDialog.loading=true; + const formData=this.initFormData(); + getCriteria(formData).then(res => { + if (res.data.success) { + const data = res.data.data; + const result = data.map(item => { + const filteredAttrs = item.hisAttrValList.filter(attr => + attr.attrName === "OID" || attr.attrName === "CREATOR" || attr.attrName === "CREATETIME" + ); + + const newObj = filteredAttrs.reduce((acc, attr) => { + acc[attr.attrName] = attr.attrVal; + return acc; + }, {}); + + return newObj; + }); + + this.$refs.formQuery.resultData = result; + this.$refs.formQuery.queryResultDialog.showDialog = true; + this.$refs.formQuery.queryResultDialog.loading = false; + } + }); + } else { + return false; + } + }); + }, } } </script> -<style scoped> +<style lang="scss" scoped> +::v-deep { + .el-radio ,.el-checkbox{ + margin-right: 30px; + } +} +div{ + font-size: 14px; +} fieldset { padding: 10px 6px; - margin: 10px 0 0 0; + margin: 0; border: 1px solid #EBEEF5; } </style> -- Gitblit v1.9.3