ソースを参照

Merge branch 'master' into 'feature/dashujuceping'

Master

See merge request dcuc-tjdsj/auth-web!59
林倩 2 年 前
コミット
4c64378949

+ 1 - 1
config/btn-icon-config.js

@@ -6,7 +6,7 @@ const btnAttr = [
     ['功能配置', 'el-icon-menu'],
     ['导入', 'el-icon-upload2'],
     ['新增', 'el-icon-circle-plus-outline'],
-    ['同步', 'el-icon-refresh'],
+    ['同步,同步数据资源', 'el-icon-refresh'],
     ['权限变更申请', 'el-icon-circle-plus-outline'],
     ['批量添加', 'el-icon-circle-plus-outline'],
     ['批量设置名单级别', 'el-icon-setting'],

+ 2 - 3
config/dev.env.js

@@ -13,7 +13,7 @@ module.exports = merge(prodEnv, {
   QQQ: '"/easy-mock2"',
 
   //是否需要登录验证
-  NEED_LOGIN: 'false',
+  NEED_LOGIN: 'true',
 
   //需要依赖的系统名称
   // INSTALLED_PROJECT: "'zfba,demo2,cross-env'",
@@ -27,10 +27,9 @@ module.exports = merge(prodEnv, {
 
   // 布局结构配置,可选项包含 `layout-menu-top`, `layout`
   LAYOUT: '"layout"',
-  PORT: '8871',
+  PORT: '8872',
   //是否启用本地mock
   IS_MOCK: 'false',
-  PROT: '8871',
   PROXY_TABLE: JSON.stringify({
     '/dcucauth': {
       target: "http://10.11.1.237:8861"

+ 1 - 1
config/index.js

@@ -13,7 +13,7 @@ module.exports = {
         assetsPublicPath: "/",
         // Various Dev Server settings
         host: "0.0.0.0", // can be overwritten by process.env.HOST
-        port: 8871, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+        port: 8872, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
         autoOpenBrowser: false,
         errorOverlay: true,
         notifyOnErrors: true,

+ 1 - 1
config/prod.env.js

@@ -4,7 +4,7 @@ module.exports = {
     IS_BASE_PACKAGE: "true",
     FILE_BASE_PATH: '"http://192.168.10.14:1665"',
 
-    NEED_LOGIN: "false",
+    NEED_LOGIN: "true",
     BASE_API: '"/dcucauth"',
     BUILD_PATH: '"../dist"',
     IS_OAUTH2: "false",

ファイルの差分が大きいため隠しています
+ 22399 - 1
package-lock.json


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "dcuc-web-auth",
-  "version": "2.4.0-tjdsj",
+  "version": "2.4.0-xjaks",
   "description": "",
   "private": false,
   "main": "lib/static/js/app.js",

+ 70 - 0
src/api/data-auth.js

@@ -5,8 +5,21 @@
  */
 
 import request from '@/utils/request';
+import qs from "qs"
 const baseUrl = '/authsvr/v2/dataauth';
 
+
+// 数据资源树联动勾选
+export function reactTree(data) {
+  return request({
+    url: `${baseUrl}/tree-react`,
+    method: 'POST',
+    data
+  });
+}
+
+
+
 /********************************************  数据授权  ******************************************/
 
 // 标签树
@@ -194,6 +207,63 @@ export function delFieldClassify(id) {
   });
 }
 
+// 字段分类关系接口
+const fieldRelBaseUrl = "/cloumnRelation/v2"
+export const fieldRelTabelUrl = `${fieldRelBaseUrl}/search`;
+
+// 获取关系分类
+export function getSecLevelColumn() {
+  return request({
+    url: `/fieldclassifysvr/v2/getSecLevelColumn`,
+    method: 'POST',
+    data: qs.stringify({
+      searchCondition: JSON.stringify([]),
+      page: 0,
+      size: 100
+    })
+  });
+}
+
+
+// 获取字段分类详情
+export function getfieldRelDetail(id) {
+  return request({
+    url: `${fieldRelBaseUrl}/detail`,
+    method: 'get',
+    params: {
+      id
+    }
+  });
+}
+// 添加字段分类
+export function saveFieldRel(data) {
+  return request({
+    url: `${fieldRelBaseUrl}/relationAdd`,
+    method: 'POST',
+    data
+  });
+}
+
+// 修改字段分类
+export function updateFieldRel(data) {
+  return request({
+    url: `${fieldRelBaseUrl}/relationUpdate`,
+    method: 'POST',
+    data
+  });
+}
+// 删除字段分类
+export function delFieldRel(id) {
+  return request({
+    url: `${fieldRelBaseUrl}/deleteById`,
+    method: 'DELETE',
+    params: {
+      id
+    }
+  });
+}
+
+
 /************************************ 清单  *****************************************/
 
 // 清单列表

+ 5 - 0
src/api/sync.js

@@ -38,6 +38,11 @@ export const orgSyncUrl = `${baseUrl}/orgSync`
 // 机构增量同步
 export const orgAddSyncUrl = `${baseUrl}/orgAddSync`
 
+// 字段关系同步
+export const fieldRelSyncUrl = `${baseUrl}/columnRelationSync`
+
+// 表和列同步
+export const tableColumnSyncUrl = `${baseUrl}/tableColumnSync`
 
 
 export function sync(url) {

+ 10 - 2
src/filters/index.js

@@ -1,6 +1,6 @@
 import utils from '@/common/utils';
 const { ztMoment } = utils;
-import iconMap from "../../config/btn-icon-config"
+import iconMap from '../../config/btn-icon-config';
 
 function pluralize(time, label) {
   if (time === 1) {
@@ -55,7 +55,15 @@ export function optIcon(type, defaultIcon) {
   if (defaultIcon) {
     return defaultIcon;
   }
-  const icon = iconMap.get(type);
+  let icon = '';
+  for (const item of iconMap) {
+    const texts = item[0].split(',').map(ele => ele.trim());
+    if (texts.includes(type)) {
+      icon = item[1];
+      break;
+    }
+  }
+  // const icon = iconMap.get(type);
   return icon ? icon : 'el-icon-edit';
 }
 

+ 4 - 2
src/pages/auth-object-manage/sort-code-manage/field-sort-code.vue

@@ -28,7 +28,7 @@ import operateBar from '@/components/operate-bar';
 import newTable from '@/components/new-table';
 import { fieldSortConfig, pageOptList, tableOptList, fieldSortConditionForm } from './DataConfig';
 import { fieldClassifyTableUrl, delFieldClassify, getFieldClassifyDetail, saveFieldClassify, updateFieldClassify } from '@/api/data-auth';
-import { fieldSortSyncUrl } from '@/api/sync';
+import { fieldSortSyncUrl, tableColumnSyncUrl} from '@/api/sync';
 import { searchOpt, importOpt, syncOpt, addEditOpt } from '@/mixins/page-opt';
 const area = ['900px', '400px'];
 const labelWidth = '160px';
@@ -41,7 +41,7 @@ export default {
       tableHeader: fieldSortConfig,
       fieldSortConditionForm,
       tableOptList: tableOptList.slice(1, 3),
-      pageOptList
+      pageOptList: ["新增", "同步", "同步数据资源"],
     };
   },
   computed: {},
@@ -66,6 +66,8 @@ export default {
         this.handleSync(fieldSortSyncUrl);
       } else if (opt == '导入') {
         // this.handleImport(dataLevelImportUrl, 'dataLevel', '数据资源分类表码导入');
+      } else if (opt == '同步数据资源') {
+        this.handleSync(tableColumnSyncUrl);
       }
     },
     /**

+ 96 - 0
src/pages/auth-object-manage/sort-code-manage/filed-rel-sort-form.vue

@@ -0,0 +1,96 @@
+<!--
+字段关系分类表单
+@Author: linqian
+ * @date: 2022-09-29  14:35
+ */
+-->
+<template>
+  <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+    <dg-row>
+      <el-form-item label="字段分类一" prop="columnClaIdOne">
+        <dg-select v-model="form.columnClaIdOne" placeholder="请选择字段分类一" :data="sortList" valueName="id" labelName="name" @change="handleChange"> </dg-select>
+      </el-form-item>
+      <el-form-item label="字段分类二" prop="columnClaIdTwo">
+        <dg-select v-model="form.columnClaIdTwo" placeholder="请选择字段分类二" :data="sortList" valueName="id" labelName="name" @change="handleChange"> </dg-select>
+      </el-form-item>
+      <el-form-item label="字段关系分类" prop="label">
+        <el-input v-model="form.label" placeholder="请选择字段分类一和字段分类二" disabled> </el-input>
+      </el-form-item>
+    </dg-row>
+    <div v-footer>
+        <dg-button @click="$emit('close')">取消</dg-button>
+        <dg-button @click="handleSave" type="primary">保存</dg-button>
+    </div>
+  </el-form>
+</template>
+
+<script>
+  import * as Api from "@/api/data-auth"
+export default {
+  props: {
+    id: String
+  },
+  components: {},
+  data() {
+    return {
+      form: {
+        columnClaIdOne: "",
+        columnClaIdTwo: "",
+        label: ""
+      },
+      sortList: [],
+      rules: {
+        columnClaIdOne: [{ required: true, message: "请选择字段分类一", trigger: "blur" }],
+        columnClaIdTwo: [{ required: true, message: "请选择字段分类二", trigger: "blur" }],
+        label: [{ required: true, message: "请选择字段分类一和分类二", trigger: "blur" }],
+      }
+    };
+  },
+  computed: {},
+  methods: {
+    handleChange() {
+        if (this.form.columnClaIdOne && this.form.columnClaIdTwo) {
+          this.form.label = this.sortList.find(item => item.id == this.form.columnClaIdOne).name +"->"+this.sortList.find(item => item.id == this.form.columnClaIdTwo).name
+        }
+    },
+    handleSave() {
+        this.$refs.form.validate(valid => {
+            if (valid) {
+              if (this.form.columnClaIdOne == this.form.columnClaIdTwo) {
+                this.$message.warning("字段分类一和字段分类二值不能相同");
+                return;
+              }
+               let api;
+               if (this.id) {
+                api = "updateFieldRel"
+               } else {
+                api = "saveFieldRel"
+               }
+               const {label, ...params} = this.form;
+               Api[api]({...params}).then(res => {
+                this.$message.success("保存成功!");
+                this.$emit("success");
+               })
+            }
+        })
+    }
+  },
+  async created() {
+   const res =  await Api.getSecLevelColumn();
+   this.sortList = res.data.content;
+    if (this.id) {
+      Api.getfieldRelDetail(this.id).then(res => {
+          const { columnClaNameOne, columnClaNameTwo, ...other } = res.data.content;
+          this.form = {
+            ...other,
+            label: columnClaNameOne+"->"+columnClaNameTwo
+          }
+      })
+    }
+  },
+  mounted() {}
+};
+</script>
+
+<style lang='scss'>
+</style>

+ 105 - 0
src/pages/auth-object-manage/sort-code-manage/filed-rel-sort.vue

@@ -0,0 +1,105 @@
+<!--
+字段关系分类表码列表
+@Author: linqian
+@Date: 2022-09-29 13:57
+-->
+<template>
+    <div>
+      <!-- 搜索栏 -->
+      <search-bar :conditionForm="conditionForm" @submitSearch="receiveSearch"></search-bar>
+      <!-- 操作栏 -->
+      <operate-bar :pageOptList="pageOptList" @submitPageOpt="receviceOpt"></operate-bar>
+      <!-- 列表 -->
+      <new-table
+        ref="table"
+        :tableUrl="tableUrl"
+        :tableHeader="tableHeader"
+        :condition="condition"
+        :tableOptList="tableOptList"
+        @submitTableOpt="receviceOpt"
+      >
+      </new-table>
+    </div>
+  </template>
+  <script>
+  import searchBar from '@/components/search-bar';
+  import operateBar from '@/components/operate-bar';
+  import newTable from '@/components/new-table';
+  import { fieldRelSyncUrl } from '@/api/sync';
+  import { searchOpt, syncOpt } from '@/mixins/page-opt';
+  import { fieldRelTabelUrl, delFieldRel } from "@/api/data-auth"
+  export default {
+    components: { searchBar, operateBar, newTable },
+    mixins: [searchOpt, syncOpt],
+    data() {
+      return {
+        tableUrl: fieldRelTabelUrl,
+        tableHeader: [{
+           label: "字段关系分类",
+           prop: "columnRelation"
+        },{
+           label: "代码",
+           prop: "codeValue"
+        }],
+        tableOptList: ["修改", "删除"],
+        pageOptList: ["新增", "同步"],
+        conditionForm: [
+          {
+           label: '字段关系分类',
+            name: 'columnRelation',
+            op: 'like',
+           value: '',
+           component: 'ElInput'
+  },
+        ]
+      };
+    },
+    computed: {},
+    methods: {
+       receviceOpt(opt, row) {    
+        if (opt == '新增') {
+            this.handleEdit({});
+        } else if (opt == '修改') {
+            this.handleEdit(row);
+        } else if (opt == '删除') {
+          this.handleDelete(row);
+        } else if (opt == '同步') {
+          this.handleSync(fieldRelSyncUrl);
+        } 
+      },
+      handleEdit(row) {
+        const vm = this;
+        const layer = this.$dgLayer({
+            title: '修改',
+            area: ['700px', '500px'],
+            content: require("./filed-rel-sort-form.vue"),
+            props: {
+              id: row.id
+            },
+            on: {
+              success() {
+                layer.close(layer.dialogIndex);
+                vm.handleSearch();
+               
+              }
+            }
+          });
+
+      },
+      handleDelete(row) {
+        this.$dgConfirm(`是否确定删除这条数据!`, '提示', {}).then(() => {
+          delFieldRel(row.id).then(res => {
+             this.$message.success("删除成功!");
+             this.handleSearch();
+          })
+        });
+      }
+   
+    },
+    created() {},
+    mounted() {}
+  };
+  </script>
+  
+  <style lang='scss'>
+  </style>

+ 4 - 1
src/pages/auth-object-manage/sort-code-manage/index.vue

@@ -10,6 +10,7 @@
             <el-tab-pane label="数据安全级别表码" name="safeLevelCode"></el-tab-pane>
             <el-tab-pane label="数据资源分类表码" name="sourceSortCode"></el-tab-pane>
             <el-tab-pane label="字段分类表码" name="fieldSortCode"></el-tab-pane>
+            <el-tab-pane label="字段关系分类表码" name="fieldRelSort"></el-tab-pane>
         </el-tabs>
         <keep-alive>
            <component :is="activeName"></component>         
@@ -22,12 +23,14 @@ import dataLevel from "./data-level.vue";
 import fieldSortCode from "./field-sort-code";
 import safeLevelCode from "./safe-level-code";
 import sourceSortCode from "./source-sort-code";
+import fieldRelSort from "./filed-rel-sort.vue"
 export default {
     components: {
         dataLevel,
         fieldSortCode,
         safeLevelCode,
-        sourceSortCode
+        sourceSortCode,
+        fieldRelSort
     },
     data() {
         return {

+ 1 - 1
src/pages/auth-object-manage/sort-code-manage/safe-level-code.vue

@@ -1,7 +1,7 @@
 <!--
 数据安全级别表码列表
 @Author: linqian
-@Date: 2021-03-31 15:30:11
+@Date: 2021-03-31 15:30:
 -->
 <template>
   <div>

+ 4 - 2
src/pages/auth-object-manage/sort-code-manage/source-sort-code.vue

@@ -30,7 +30,7 @@ import {
   saveDataSourceCla,
   updateDataSourceCla
 } from '@/api/data-auth';
-import { dataSourceSyncUrl } from '@/api/sync';
+import { dataSourceSyncUrl, tableColumnSyncUrl } from '@/api/sync';
 import searchBar from '@/components/search-bar';
 import operateBar from '@/components/operate-bar';
 import newTable from '@/components/new-table';
@@ -46,7 +46,7 @@ export default {
       dataSourceClaTableUrl,
       sourceSortConditionForm,
       tableHeader: sourceSortConfig.slice(0, -1),
-      pageOptList,
+      pageOptList: ["新增", "同步", "同步数据资源"],
       tableOptList,
       optList: [
         { icon: 'el-icon-edit', tooltip: '修改', on: this.handleEdit },
@@ -76,6 +76,8 @@ export default {
         this.handleSync(dataSourceSyncUrl);
       } else if (opt == '导入') {
         // this.handleImport(dataLevelImportUrl, 'dataLevel', '数据资源分类表码导入');
+      } else if (opt == '同步数据资源') {
+        this.handleSync(tableColumnSyncUrl);
       }
     },
     /**

+ 1 - 1
src/pages/data-auth-manage/components/business-tag-tree.vue

@@ -106,7 +106,7 @@ export default {
         }
     }
     &__content {
-        height: calc(100vh - 19rem);
+        height: calc(100vh - 17.6rem);
     }
 }
 </style>

+ 70 - 23
src/pages/data-auth-manage/components/set-auth-tree.vue

@@ -14,8 +14,6 @@
                 >
             </p>
             <div class="tree__content">
-                    <!-- @node-click="handleNodeClick" -->
-
                 <dg-tree
                     ref="authTree"
                     node-key="id"
@@ -34,12 +32,12 @@
                             <i class="el-icon-document" v-else></i>
                             <span>
                                 <span class="tree-node__name">{{ data.label }}</span>
-                                <span
+                                <!-- <span
                                     class="tree-node__operate"
                                     v-if="!data.treeNode && tab == 'TABLE'"
                                     @click="handleViewCheckList($event, data)"
                                     >查看数据资源</span
-                                >
+                                > -->
                                 <el-popover placement="top-start" width="400" trigger="hover" :open-delay="1000">
                                     <div class="tip-box">
                                         <h3>{{ data.label }}</h3>
@@ -58,6 +56,7 @@
 
 <script>
 import tableCheckLayer from "./table-check-layer";
+import { reactTree } from "@/api/data-auth"
 export default {
     props: {
         treeData: {
@@ -74,7 +73,8 @@ export default {
         idcard: {
             type: String,
             default: ""
-        }
+        },
+        reactTree: Boolean,
     },
     activated() {},
     components: {},
@@ -95,27 +95,66 @@ export default {
         };
     },
     computed: {},
+    watch: {
+        // treeData: {
+        //     deep: true,
+        //     handler(val){
+        //         debugger
+        //         this.selectkeys = val.selectNodes ? val.selectNodes.map((item) => item.dataId) : [];
+        //         this.selectNodesNum = this.selectkeys.length;
+        //         console.log("selectkeys",this.selectkeys)
+        //     }
+        // }
+    },
     methods: {
-        /**
-         * @description: 点击节点
-         * @param {*} node
-         */
-        handleNodeClick(node, a, b) {
-            const { id, isParent, name } = node;
-            if (this.selectkeys.includes(id)) {
-                this.$refs.authTree.setChecked(id, false, true);
-            } else {
-                this.$refs.authTree.setChecked(id, true, true);
-            }
-            this.getSelectKeys();
-        },
         /**
          * @description: 复选框选中值
          * @param {object} data 当前选中数据
          * @param {array} checkedKeys 当前选中key集合
          */
-        handleCheckTree(data, { checkedKeys }) {
+        handleCheckTree(data, params) {
             this.getSelectKeys();
+
+            // 勾选联动,点击数据资源分类和字段分类的数据会联动,点击其他的不联动
+            if (data.classifyCode !== "DATA_LEVEL" && data.classifyCode !== "COLUMN_SECURITY_LEVEL" && data.classifyCode !== "COLUMN_RELATION_CATALOG") {
+                let vo = {
+                    operateType: "",
+                    operateList: [],
+                    authList: []
+                }
+                console.log(this.oldSelectNodes)
+                const currentCheckNodes = this.$refs.authTree.getCheckedNodes(true);
+                if (currentCheckNodes.length > this.oldSelectNodes.length) {
+                  // 说明是新增节点
+                  vo.operateType = "ADD";
+                   for (let i = 0; i < currentCheckNodes.length; i++) {
+                    const {id, code, classifyCode} = currentCheckNodes[i];
+                    if (this.oldSelectNodes.filter(item => item.id == id) < 1) {
+                        vo.operateList.push({
+                            dataId: id,
+                            dataCode: code,
+                            classifyCode
+                        })
+                    }                   
+                   }
+                   
+                } else {
+                 // 说明是取消节点 
+                 vo.operateType = "DEL";
+                   for (let i = 0; i < this.oldSelectNodes.length; i++) {
+                    const {id, code, classifyCode} = this.oldSelectNodes[i];
+                    if (currentCheckNodes.filter(item => item.id == id) < 1) {
+                        vo.operateList.push({
+                            dataId: id,
+                            dataCode: code,
+                            classifyCode
+                        })
+                    }                   
+                   }
+                }
+                this.oldSelectNodes = currentCheckNodes;                
+               this.$emit("checkChange", vo)
+            }
         },
         /**
          * @description: 获取选中的节点key
@@ -126,15 +165,16 @@ export default {
             this.selectNodesNum = this.selectkeys.length;
             const nodes = selectNodes.map((item) => {
                 return {
-                    dataType: item.dataType,
+                    dataCode: item.code,
                     dataId: item.id,
-                    innerId: item.innerId
+                    classifyCode: item.classifyCode
                 };
             });
             this.$emit("getSelectNodes", {
                 type: this.treeData.id,
                 selectNodes: nodes
             });
+            // return nodes
         },
 
         // 查看清单
@@ -146,8 +186,7 @@ export default {
                 content: tableCheckLayer,
                 props: {
                     tab: vm.tab,
-                    codeDataTypeStr: data.codeDataTypeStr,
-                    idcard: vm.idcard
+                   resourceId: data.id
                 },
                 on: {
                     success(params) {
@@ -165,6 +204,14 @@ export default {
     },
     created() {
         this.selectkeys = this.treeData.selectNodes ? this.treeData.selectNodes.map((item) => item.dataId) : [];
+        const oldSelectNodes = this.$lodash.cloneDeep(this.treeData.selectNodes || []);
+        this.oldSelectNodes = oldSelectNodes.map(item => {
+            return {
+                id: item.dataId,
+                code: item.dataCode,
+                classifyCode: item.classifyCode
+            }
+        })
         this.selectNodesNum = this.selectkeys.length;
         this.defaultExpandKeys = this.treeData.nodes[0] ? [this.treeData.nodes[0].id] : [];
     },

+ 77 - 11
src/pages/data-auth-manage/components/set-auth.vue

@@ -9,31 +9,44 @@
             <el-tabs v-model="activeName" @tab-click="handleClick">
                 <el-tab-pane label="表授权" name="TABLE">
                     <table-column-auth
-                        :key="tableKey"
+                         ref="tableAuth"
+                        :key="key"
                         :subId="subId"
                         :subType="subType"
                         :saveApi="saveApi"
+                        :singleAuthData="singleAuthData"
+                        :reactTree="reactTree"
+                        @checkChange="checkChange"
                         tab="TABLE"
-                        @submitReset="submitReset"
                     ></table-column-auth>
                 </el-tab-pane>
                 <el-tab-pane label="列授权" name="COLUMN">
                     <table-column-auth
-                        :key="columnKey"
+                         ref="columnAuth"
+                        :key="key"
                         :subId="subId"
                         :subType="subType"
                         :saveApi="saveApi"
+                        :reactTree="reactTree"
+                        :singleAuthData="singleAuthData"
+                        @checkChange="checkChange"
                         tab="COLUMN"
-                        @submitReset="submitReset"
                     ></table-column-auth>
                 </el-tab-pane>
             </el-tabs>
+            <el-row class="property-wapper__right-btn">
+                <!-- <el-button @click="handleViewAuthList" v-if="showCheckListBtn">清单</el-button> -->
+                <dg-button v-if="subId" @click="handleReset" :icon="'重置' | optIcon">重置</dg-button>
+                <dg-button v-if="subId" type="primary" @click="handleSave" :icon="'保存' | optIcon">保存</dg-button>
+            </el-row>
         </dg-card>
     </div>
 </template>
 
 <script>
 import tableColumnAuth from "./table-column-auth";
+import * as api from "@/api/data-auth.js";
+
 export default {
     props: {
         shadow: {
@@ -54,8 +67,10 @@ export default {
         return {
             // 激活的tab
             activeName: "TABLE",
-            tableKey: 0,
-            columnKey: 0
+            key: 0,
+            singleAuthData: [],
+            reactTree: false
+         
         };
     },
     computed: {},
@@ -69,13 +84,61 @@ export default {
          * @description: 重置
          * @param {*} tab
          */
-        submitReset(tab) {
-            if (tab == "TABLE") {
-                this.tableKey++;
+         handleReset() {
+            this.reactTree = false;
+            this.singleAuthData = [];
+            this.key++;
+        },
+        checkChange(vo){
+            this.reactTree = true;
+            const params = {
+                ...vo,
+                authList: this.getSaveData().authVoList
+            }
+            api.reactTree(params).then(res => {
+                this.singleAuthData = res.data.content;
+            })
+            
+        },
+        getSaveData(){
+            let key = "";
+            if (this.subType == "BUSINESS") {
+                // 业务域
+                key = "businessCode";
+            } else if (this.subType == "ORG") {
+                // 机构
+                key = "orgCode";
             } else {
-                this.columnKey++;
+                // 人员
+                key = "idcard";
             }
+            let params1 = this.$refs.tableAuth.handleSave();
+            let params2 = this.$refs.columnAuth.handleSave();
+            let params = {
+                authVoList: [...params1, ...params2]
+            }
+            params[key] = this.subId;  
+            console.log("最终保存的参数", params);
+            return params
+        },
+        handleSave() {
+            const params = this.getSaveData();
+            let obj = {};
+             for (let i = 0; i < params.authVoList.length; i++) {
+                const element = params.authVoList[i];
+                if (!obj[element.dataType]) {
+                    obj[element.dataType] = [element.dataId];
+                } else {
+                    obj[element.dataType].push(element.dataId)
+                }
+                
+             }
+             console.log("勾选联动接口参数",params);
+            api[this.saveApi](params).then((res) => {
+                this.$message.success("保存成功!");
+            });
         }
+
     },
     created() {
         console.log("权限设置初始化");
@@ -84,7 +147,7 @@ export default {
 };
 </script>
 
-<style lang='scss'>
+<style lang='scss' scoped>
 .property-wapper__right {
     &-search {
         margin-bottom: 20px;
@@ -97,6 +160,9 @@ export default {
         .el-tabs__header {
             margin-bottom: 8px;
         }
+        .el-card__body{
+           height: 45rem;
+         }
     }
 }
 </style>

+ 6 - 15
src/pages/data-auth-manage/components/table-check-layer.vue

@@ -33,27 +33,19 @@ import newTable from '@/components/new-table';
 export default {
   props: {
     tab: String,
-    codeDataTypeStr: String,
-    idcard: {
-      type: String,
-      default: ''
-    }
+    resourceId: String
   },
   components: { newTable },
   data() {
     return {
       condition: {
-        codeDataTypeStr: {
-          value: '',
+        resourceId: {
+          value: this.resourceId,
           op: '='
         },
         resourceName: {
-          value: '',
-          op: 'like'
-        },
-        idcard: {
-          value: '',
-          op: '='
+          value: "",
+          op:"like"
         }
       },
       searchCondition: {},
@@ -107,8 +99,7 @@ export default {
     }
   },
   created() {
-    this.condition.codeDataTypeStr.value = this.codeDataTypeStr;
-    this.condition.idcard.value = this.idcard;
+    this.condition.resourceId.value = this.resourceId;
     this.searchCondition = this.condition;
   },
   mounted() {}

+ 72 - 42
src/pages/data-auth-manage/components/table-column-auth.vue

@@ -7,21 +7,20 @@
     <div>
         <div v-if="subId">
             <div style="height: calc(100vh - 22rem)">
-                <dg-scrollbar>
+                <dg-scrollbar :key="key">
                     <set-auth-tree
+                        :ref="'authTree_'+index"
                         :tab="tab"
                         v-for="(item, index) in authData"
                         :key="index"
                         :treeData="item"
+                        :reactTree="reactTree"
                         @getSelectNodes="getSelectNodes"
+                        @checkChange="checkChange"
                     ></set-auth-tree>
                 </dg-scrollbar>
             </div>
-            <el-row class="property-wapper__right-btn">
-                <!-- <el-button @click="handleViewAuthList" v-if="showCheckListBtn">清单</el-button> -->
-                <dg-button @click="handleReset" :icon="'重置' | optIcon">重置</dg-button>
-                <dg-button type="primary" @click="handleSave" :icon="'保存' | optIcon">保存</dg-button>
-            </el-row>
+         
         </div>
         <div v-else>
             <p v-if="subType == 'BUSINESS'">请选择标签。</p>
@@ -41,7 +40,9 @@ export default {
         subId: String,
         subType: String,
         saveApi: String,
-        tab: String
+        tab: String,
+        reactTree:Boolean,
+        singleAuthData: Array
     },
     components: {
         setAuthTree
@@ -51,9 +52,39 @@ export default {
             authData: [],
             showCheckListBtn: false,
             saveAuthVoList: {},
+            key:0
         };
     },
     computed: {},
+    watch: {
+        singleAuthData: {
+            deep: true,
+            handler(val) {
+              if (this.reactTree) {
+                let _authData = this.$lodash.cloneDeep(this.authData);
+                for (let i = 0; i < val.length; i++) {
+                        const { id, tickedDatas } = val[i];
+                        for (let j = 0; j < _authData.length; j++) {
+                            let element = _authData[j];
+                            if (element.id == id) {
+                                element.selectNodes = tickedDatas.map((item) => {
+                                    const { dataId, dataType, dataCode, classifyCode } = item;
+                                    return {
+                                        dataId,
+                                        classifyCode,
+                                        dataCode
+                                    };
+                                });
+                            }
+                        }
+                    }
+                    this.authData = _authData;
+                    this.key++
+                    console.log("authData",this.authData);
+              }
+            }
+        }
+    },
     methods: {
         handleViewAuthList() {
             const vm = this;
@@ -86,48 +117,45 @@ export default {
         /**
          * @description: 保存授权
          */
-        handleSave() {
-            let key = "";
-            if (this.subType == "BUSINESS") {
-                // 业务域
-                key = "businessCode";
-            } else if (this.subType == "ORG") {
-                // 机构
-                key = "orgCode";
-            } else {
-                // 人员
-                key = "idcard";
-            }
-
+        handleSave() {        
             // 保存的树节点
-            let authVoList = [];
-            for (const key in this.saveAuthVoList) {
-                const element = this.saveAuthVoList[key];
-                authVoList = [...authVoList, ...element];
-            }
-            // 数组去重
-            let obj = {};
-            const _authVoList = authVoList.reduce((cur, next) => {
-                obj[next.dataId] ? "" : (obj[next.dataId] = true && cur.push(next));
-                return cur;
-            }, []);
+            // let authVoList = [];
+            // for (const key in this.saveAuthVoList) {
+            //     const element = this.saveAuthVoList[key];
+            //     authVoList = [...authVoList, ...element];
+            // }
+            // // 数组去重
+            // let obj = {};
+            // const _authVoList = authVoList.reduce((cur, next) => {
+            //     obj[next.dataId] ? "" : (obj[next.dataId] = true && cur.push(next));
+            //     return cur;
+            // }, []);
 
-            let params = {
-                authType: this.tab,
-                authVoList: _authVoList
-            };
-            params[key] = this.subId;
-            console.log("保存的参数", params);
+            //  return _authVoList
+            let attr = []
+            for (let i = 0; i < this.authData.length; i++) {
+                const selectNode = this.$refs['authTree_'+i][0].$refs.authTree.getCheckedNodes(true);
+                attr = [...attr, ...selectNode]
+            }
+            console.log("attr",attr)              
 
-            api[this.saveApi](params).then((res) => {
-                this.$message.success("保存成功!");
-            });
+            return attr.map(item => {
+                return {
+                    dataId: item.id,
+                    dataCode: item.code,
+                    classifyCode: item.classifyCode
+                }
+            })
+           
         },
 
         // 获取勾选的节点
         getSelectNodes({ type, selectNodes }) {
             this.saveAuthVoList[type] = selectNodes;
         },
+        checkChange(vo) {
+            this.$emit("checkChange", vo)
+        },
         // 查询单个主体相关数据权限
         getSubDataAuth() {
             return new Promise((resolve) => {
@@ -162,10 +190,11 @@ export default {
                             let element = authTree[j];
                             if (element.id == id) {
                                 this.saveAuthVoList[id] = element.selectNodes = tickedDatas.map((item) => {
-                                    const { dataId, dataType } = item;
+                                    const { dataId, dataType, dataCode, classifyCode } = item;
                                     return {
                                         dataId,
-                                        dataType
+                                        classifyCode,
+                                        dataCode
                                     };
                                 });
                             }
@@ -174,6 +203,7 @@ export default {
                 } else {
                     this.showCheckListBtn = false;
                 }
+                console.log("saveAuthVoList", this.saveAuthVoList);
                 this.authData = authTree;
             }
         }

+ 1 - 1
src/pages/data-auth-manage/org-auth.vue

@@ -12,7 +12,7 @@
                     <org-tree
                         ref="tree"
                         class="u-pm__left"
-                        treeHeight="calc(100vh - 19rem)"
+                        treeHeight="calc(100vh - 17.6rem)"
                         :search="true"
                         paddingRight="15px"
                         @handleGetNode="handleGetNode"

+ 4 - 0
src/pages/data-auth-manage/person-auth.vue

@@ -116,4 +116,8 @@ export default {
 </script>
 
 <style lang='scss' scoped>
+  @import "./index.scss";
+  /deep/ .el-card__body {
+    height: 45rem;
+  }
 </style>

+ 4 - 4
src/pages/layout/components/navbar.vue

@@ -46,11 +46,11 @@ export default {
     },
     logout() {
       this.$confirm('是否确定退出系统').then(() => {
-        if (process.env.NEED_LOGIN) {
+        // if (process.env.NEED_LOGIN == true) {
           window.loginUtil.logout(this);
-        } else {
-          window.location.href = `https://login.iam.com/apphub/logout`;
-        }
+        // } else {
+        //   window.location.href = `https://login.iam.com/apphub/logout`;
+        // }
       });
     },
     handleClickSearch() {

+ 5 - 0
src/pages/permission-to-search/data-auth-search.vue

@@ -126,6 +126,11 @@ export default {
 </script>
 
 <style lang='scss' scoped>
+  /deep/ .property-wapper__left {
+    .el-card__body { 
+      height: 45rem;
+    }
+  }
 /deep/ .org-card {
   .el-card__body {
     padding: 20px 5px 20px 20px;

+ 13 - 13
src/router/index.js

@@ -140,19 +140,19 @@ export const asyncRouterMap = [
     ]
   },
   // 权限综合查询
-  {
-    path: '/permission-to-searchS',
-    component: Layout,
-    meta: { title: '权限综合查询', icon: 'icon-othersearch', noCache: true, permission: ['QXGL_SQCX'] },
-    children: [
-      {
-        path: 'data-auth-search',
-        component: () => import('@/pages/permission-to-search/data-auth-search.vue'),
-        name: 'data-auth-search',
-        meta: { title: '数据权限查询', noCache: true, layout: 'page',  permission: ['QXGL_SQCX_SJSQCX'] }
-      }
-    ]
-  },
+  // {
+  //   path: '/permission-to-searchS',
+  //   component: Layout,
+  //   meta: { title: '权限综合查询', icon: 'icon-othersearch', noCache: true, permission: ['QXGL_SQCX'] },
+  //   children: [
+  //     {
+  //       path: 'data-auth-search',
+  //       component: () => import('@/pages/permission-to-search/data-auth-search.vue'),
+  //       name: 'data-auth-search',
+  //       meta: { title: '数据权限查询', noCache: true, layout: 'page',  permission: ['QXGL_SQCX_SJSQCX'] }
+  //     }
+  //   ]
+  // },
   listManageRouter,
   ...logManage,
   statisticsManageRouter

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません