按钮级别的新版本,多级别的组织架构
loulijun2021
2023-07-28 4692aca991b499f09dcd9fc44804795321961576
1.角色权限demo
已添加1个文件
已修改5个文件
1773 ■■■■■ 文件已修改
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Navbar.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 1229 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicSettings/rolePermission.vue 538 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -40,6 +40,7 @@
    "vue-easy-print": "0.0.8",
    "vue-print-nb": "^1.7.5",
    "vue-router": "3.0.6",
    "vue-splitpane": "^1.0.6",
    "vuedraggable": "^2.24.3"
  },
  "devDependencies": {
src/layout/components/Navbar.vue
@@ -239,7 +239,7 @@
    this.stu_torgname = getCookie('stu_torgname') === '' ? '系统管理员' : getCookie('stu_torgname')
  },
  mounted() {
    this.getHubConnectionBuilder()
    // this.getHubConnectionBuilder()
  },
  computed: {
    ...mapGetters([
src/router/index.js
@@ -84,6 +84,625 @@
  }
  // { path: '*', redirect: '/404', hidden: true }
]
// æœªä¸Šäº‘模块
export const asyncRoutes = [
  // {
  //   path: '/gtt',
  //   component: Layout,
  //   redirect: '/gtt/back',
  //   name: '基础设置',
  //   code: '1001',
  //   meta: { code: '1001', title: '基础设置', icon: 'tree' },
  //   alwaysShow: true, // å½“children只有一个时,也显示父菜单
  //   children: [{
  //     path: 'back',
  //     name: 'YYQDCancel',
  //     code: '1011',
  //     component: () => import('@/views/gantt_back/gantt_back'),
  //     meta: { code: '1011', title: '用户清单', icon: '', keepAlive: true }
  //   }, {
  //     path: 'zdpc2',
  //     name: 'YYQDCancel',
  //     code: '1012',
  //     component: () => import('@/views/gantt_back/zdpc2'),
  //     meta: { code: '1012', title: '自动排程2', icon: '', keepAlive: true }
  //   }]
  // },
  {
    path: '/basicSettings',
    component: Layout,
    redirect: '/basicSettings/organizationList',
    name: '基础设置',
    code: '1001',
    meta: { code: '1001', title: '基础设置', icon: 'tree2' },
    alwaysShow: true, // å½“children只有一个时,也显示父菜单
    children: [
      {
        path: 'organizationList',
        name: 'organizationListCancel',
        code: '1010',
        component: () => import('@/views/basicSettings/organizationList'),
        meta: { code: '1010', title: '组织架构', icon: '', keepAlive: true }
      }, {
        path: 'userList',
        name: 'userListCancel',
        code: '1011',
        component: () => import('@/views/basicSettings/userList'),
        meta: { code: '1011', title: '用户清单', icon: '', keepAlive: true }
      }, {
        path: 'roleList',
        name: 'roleListCancel',
        code: '1012',
        component: () => import('@/views/basicSettings/roleList'),
        meta: { code: '1012', title: '角色清单', icon: '', keepAlive: true }
      }, {
        path: 'contactUnitList',
        name: 'contactUnitListCancel',
        code: '1013',
        component: () => import('@/views/basicSettings/contactUnitList'),
        meta: { code: '1013', title: '往来单位', icon: '', keepAlive: true }
      }, {
        path: 'rolePermission',
        name: 'rolePermissionCancel',
        code: '1014',
        component: () => import('@/views/basicSettings/rolePermission'),
        meta: { code: '1014', title: '安灯设置', icon: '', keepAlive: true }
      }
      // {
      //   path: 'installationLampSetting',
      //   name: 'installationLampSettingCancel',
      //   code: '1014',
      //   component: () => import('@/views/basicSettings/installationLampSetting'),
      //   meta: { code: '1014', title: '安灯设置', icon: '', keepAlive: true }
      // }
    ]
  },
  {
    path: '/deviceManager',
    component: Layout,
    redirect: '/deviceManager/deviceType',
    name: '设备管理',
    code: '1002',
    meta: { code: '1002', title: '设备管理', icon: 'example' },
    alwaysShow: true,
    children: [
      {
        path: 'deviceType',
        name: 'deviceTypeCancel',
        code: '1020',
        component: () => import('@/views/deviceManager/deviceType'),
        meta: { code: '1020', title: '设备类型', icon: '', keepAlive: true }
      },
      {
        path: 'deviceGroup',
        name: 'deviceGroupCancel',
        code: '1021',
        component: () => import('@/views/deviceManager/deviceGroup'),
        meta: { code: '1021', title: '设备组', icon: '', keepAlive: true }
      }, {
        path: 'deviceList',
        name: 'deviceListCancel',
        code: '1022',
        component: () => import('@/views/deviceManager/deviceList'),
        meta: { code: '1022', title: '设备清单', icon: '', keepAlive: true }
      },
      {
        path: 'checkStandard',
        name: 'checkStandardCancel',
        code: '1023',
        component: () => import('@/views/deviceManager/checkStandard'),
        meta: { code: '1023', title: '点检标准', icon: '', keepAlive: true }
      },
      {
        path: 'checkPosition',
        name: 'checkPositionCancel',
        code: '1024',
        component: () => import('@/views/deviceManager/checkPosition'),
        meta: { code: '1024', title: '点检部位', icon: '', keepAlive: true }
      },
      {
        path: 'maintainStandard',
        name: 'maintainStandardCancel',
        code: '1025',
        component: () => import('@/views/deviceManager/maintainStandard'),
        meta: { code: '1025', title: '保养标准', icon: '', keepAlive: true }
      },
      {
        path: 'maintainPosition',
        name: 'maintainPositionCancel',
        code: '1026',
        component: () => import('@/views/deviceManager/maintainPosition'),
        meta: { code: '1026', title: '保养部位', icon: '', keepAlive: true }
      },
      {
        path: 'checkRecord',
        name: 'checkRecordCancel',
        code: '1027',
        component: () => import('@/views/deviceManager/checkRecord'),
        meta: { code: '1027', title: '点检记录', icon: '', keepAlive: true }
      },
      {
        path: 'maintainRecord',
        name: 'maintainRecordCancel',
        code: '1028',
        component: () => import('@/views/deviceManager/maintainRecord'),
        meta: { code: '1028', title: '保养记录', icon: '', keepAlive: true }
      },
      {
        path: 'repairRecord',
        code: '1029',
        name: 'repairRecordCancel',
        component: () => import('@/views/deviceManager/repairRecord'),
        meta: { code: '1029', title: '维修记录', icon: '', keepAlive: true }
      },
      {
        path: 'repairRequestRecord',
        name: 'repairRequestRecordCancel',
        code: '1019',
        component: () => import('@/views/deviceManager/repairRequestRecord'),
        meta: { code: '1019', title: '设备申请维修记录', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/gzgl',
    component: Layout,
    redirect: '/gzgl/gzlx',
    name: '工装管理',
    code: '1003',
    meta: { code: '1003', title: '工装管理', icon: 'component' },
    alwaysShow: true,
    children: [
      {
        path: 'gzlx',
        name: 'GZLXCancel',
        code: '1030',
        component: () => import('@/views/gzgl/gzlx'),
        meta: { code: '1030', title: '工装类型', icon: '', keepAlive: true }
      }, {
        path: 'sjxj',
        name: 'SJXJCancel',
        code: '1039',
        component: () => import('@/views/gzgl/sjxj'),
        meta: { code: '1039', title: '上机下机', icon: '', keepAlive: true }
      }, {
        path: 'ckrk',
        name: 'CKRKCancel',
        code: '1040',
        component: () => import('@/views/gzgl/ckrk'),
        meta: { code: '1040', title: '出库入库', icon: '', keepAlive: true }
      }, {
        path: 'gzqd',
        name: 'GZQDCancel',
        code: '1031',
        component: () => import('@/views/gzgl/gzqd'),
        meta: { code: '1031', title: '工装清单', icon: '', keepAlive: true }
      }, {
        path: 'djbz',
        name: 'DJBZCancel',
        code: '1032',
        component: () => import('@/views/gzgl/djbz'),
        meta: { code: '1032', title: '点检标准', icon: '', keepAlive: true }
      }, {
        path: 'djbw',
        name: 'DJBWCancel',
        code: '1033',
        component: () => import('@/views/gzgl/djbw'),
        meta: { code: '1033', title: '点检部位', icon: '', keepAlive: true }
      }, {
        path: 'bybz',
        name: 'BYBZCancel',
        code: '1034',
        component: () => import('@/views/gzgl/bybz'),
        meta: { code: '1034', title: '保养标准', icon: '', keepAlive: true }
      }, {
        path: 'bybw',
        name: 'BYBWCancel',
        code: '1035',
        component: () => import('@/views/gzgl/bybw'),
        meta: { code: '1035', title: '保养部位', icon: '', keepAlive: true }
      }, {
        path: 'djjl',
        name: 'DJJLCancel',
        code: '1036',
        component: () => import('@/views/gzgl/djjl'),
        meta: { code: '1036', title: '点检记录', icon: '', keepAlive: true }
      }, {
        path: 'byjl',
        name: 'BYJLCancel',
        code: '1037',
        component: () => import('@/views/gzgl/byjl'),
        meta: { code: '1037', title: '保养记录', icon: '', keepAlive: true }
      }, {
        path: 'gzwx',
        name: 'GZWXCancel',
        code: '1038',
        component: () => import('@/views/gzgl/gzwx'),
        meta: { code: '1038', title: '工装维修', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/materialManager',
    component: Layout,
    redirect: '/materialManager/storehouseDefine',
    name: '物料管理',
    code: '1004',
    meta: { code: '1004', title: '物料管理', icon: 'table' },
    alwaysShow: true,
    children: [
      {
        path: 'storehouseDefine',
        name: 'storehouseDefineCancel',
        code: '1050',
        component: () => import('@/views/materialManager/storehouseDefine'),
        meta: { code: '1050', title: '仓库定义', icon: '', keepAlive: true }
      },
      {
        path: 'locationDefine',
        name: 'locationDefineCancel',
        code: '1051',
        component: () => import('@/views/materialManager/locationDefine'),
        meta: { code: '1051', title: '库位定义', icon: '', keepAlive: true }
      }, {
        path: 'containerType',
        name: 'containerTypeCancel',
        code: '1052',
        component: () => import('@/views/materialManager/containerType'),
        meta: { code: '1052', title: '容器类型', icon: '', keepAlive: true }
      }, {
        path: 'containerList',
        name: 'containerListCancel',
        code: '1053',
        component: () => import('@/views/materialManager/containerList'),
        meta: { code: '1053', title: '容器清单', icon: '', keepAlive: true }
      }, {
        path: 'inOutboundRecord',
        name: 'inOutboundRecordCancel',
        code: '1054',
        component: () => import('@/views/materialManager/inOutboundRecord'),
        meta: { code: '1054', title: '出入库记录', icon: '', keepAlive: true }
      }, {
        path: 'inventoryQuery',
        name: 'inventoryQueryCancel',
        code: '1055',
        component: () => import('@/views/materialManager/inventoryQuery'),
        meta: { code: '1055', title: '库存查询', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/makeModel',
    component: Layout,
    redirect: '/makeModel/InventoryList',
    name: '制造模型',
    code: '1005',
    meta: { code: '1005', title: '制造模型', icon: 'icu' },
    alwaysShow: true,
    children: [
      {
        path: 'materialType',
        name: 'materialTypeCancel',
        code: '1060',
        component: () => import('@/views/makeModel/materialType'),
        meta: { code: '1060', title: '物料类型', icon: '', keepAlive: true }
      },
      {
        path: 'InventoryList',
        name: 'InventoryListCancel',
        code: '1061',
        component: () => import('@/views/makeModel/InventoryList'),
        meta: { code: '1061', title: '存货档案', icon: '', keepAlive: true }
      }, {
        path: 'materialList',
        name: 'materialListCancel',
        code: '1062',
        component: () => import('@/views/makeModel/materialList'),
        meta: { code: '1062', title: '物料清单', icon: '', keepAlive: true }
      },
      {
        path: 'processRoute',
        name: 'processRouteCancel',
        code: '1063',
        component: () => import('@/views/makeModel/processRoute'),
        meta: { code: '1063', title: '工艺路线', icon: '', keepAlive: true }
      }, {
        path: 'processDefine',
        name: 'processDefineCancel',
        code: '1064',
        component: () => import('@/views/makeModel/processDefine'),
        meta: { code: '1064', title: '工序定义', icon: '', keepAlive: true }
      },
      {
        path: 'meterPrice',
        name: 'meterPriceCancel',
        code: '1065',
        component: () => import('@/views/makeModel/meterPrice'),
        meta: { code: '1065', title: '节拍工价', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/produceManager',
    component: Layout,
    redirect: '/produceManager/produceOrder',
    name: '生产管理',
    code: '1006',
    meta: { code: '1006', title: '生产管理', icon: 'production' },
    alwaysShow: true,
    children: [
      {
        path: 'produceOrder',
        name: 'produceOrderCancel',
        code: '1070',
        component: () => import('@/views/produceManager/produceOrder'),
        meta: { code: '1070', title: '生产订单', icon: '', keepAlive: true }
      }, {
        path: 'workOrder',
        name: 'workOrderCancel',
        code: '1071',
        component: () => import('@/views/produceManager/workOrder'),
        meta: { code: '1071', title: '工单', icon: '', keepAlive: true }
      }, {
        path: 'workOrderDispatch',
        name: 'workOrderDispatchCancel',
        code: '1072',
        component: () => import('@/views/produceManager/workOrderDispatch'),
        meta: { code: '1072', title: '工单派工', icon: '', keepAlive: true }
      }, {
        path: 'produceStartOrder',
        name: 'produceStartOrderCancel',
        code: '1073',
        component: () => import('@/views/produceManager/produceStartOrder'),
        meta: { code: '1073', title: '生产开报工', icon: '', keepAlive: true }
      }, {
        path: 'workOrderBatchClose',
        name: 'workOrderBatchCloseCancel',
        code: '1074',
        component: () => import('@/views/produceManager/workOrderBatchClose'),
        meta: { code: '1074', title: '工单批量关闭', icon: '', keepAlive: true }
      }, {
        path: 'capacityPlanning',
        name: 'capacityPlanningCancel',
        code: '1075',
        component: () => import('@/views/produceManager/capacityPlanning'),
        meta: { code: '1075', title: '产能规划', icon: '', keepAlive: true }
      }, {
        path: 'AutoScheduling',
        name: 'AutoSchedulingCancel',
        code: '1076',
        component: () => import('@/views/produceManager/AutoScheduling'),
        meta: { code: '1076', title: '自动排程', icon: '', keepAlive: true }
      }, {
        path: 'productWarehouse',
        name: 'productWarehouseCancel',
        code: '1077',
        component: () => import('@/views/produceManager/productWarehouse'),
        meta: { code: '1077', title: '生产入库', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/qualityManager',
    component: Layout,
    redirect: '/qualityManager/defectDefine',
    name: '质量管理',
    code: '1007',
    meta: { code: '1007', title: '质量管理', icon: 'quality' },
    alwaysShow: true,
    children: [
      {
        path: 'qualityStandard',
        name: 'qualityStandardCancel',
        code: '1080',
        component: () => import('@/views/qualityManager/qualityStandard'),
        meta: { code: '1080', title: '质检标准', icon: '', keepAlive: true }
      }, {
        path: 'defectDefine',
        name: 'defectDefineCancel',
        code: '1081',
        component: () => import('@/views/qualityManager/defectDefine'),
        meta: { code: '1081', title: '缺陷定义', icon: '', keepAlive: true }
      }, {
        path: 'processCheck',
        name: 'processCheckCancel',
        code: '1082',
        component: () => import('@/views/qualityManager/processCheck'),
        meta: { code: '1082', title: '工序检验', icon: '', keepAlive: true }
      }, {
        path: 'logisticsCheck',
        name: 'logisticsCheckCancel',
        code: '1083',
        component: () => import('@/views/qualityManager/logisticsCheck'),
        meta: { code: '1083', title: '物流检验', icon: '', keepAlive: true }
      }, {
        path: 'defectStatistics',
        name: 'defectStatisticsCancel',
        code: '1084',
        component: () => import('@/views/qualityManager/defectStatistics'),
        meta: { code: '1084', title: '缺陷统计', icon: '', keepAlive: true }
      },
      {
        path: 'processCheckStandard',
        name: 'processCheckStandardCancel',
        code: '1085',
        component: () => import('@/views/qualityManager/processCheckStandard'),
        meta: { code: '1085', title: '工序检验标准', icon: '', keepAlive: true }
      },
      {
        path: 'processCheckItem',
        name: 'processCheckItemCancel',
        code: '1086',
        component: () => import('@/views/qualityManager/processCheckItem'),
        meta: { code: '1086', title: '工序检验项目', icon: '', keepAlive: true }
      }, {
        path: 'processCheckRecord',
        name: 'processCheckRecordCancel',
        code: '1087',
        component: () => import('@/views/qualityManager/processCheckRecord'),
        meta: { code: '1087', title: '工序检验记录', icon: '', keepAlive: true }
      }, {
        path: 'qualityPlaning',
        name: 'ZJFACancel',
        code: '1088',
        component: () => import('@/views/qualityManager/qualityPlaning'),
        meta: { code: '1088', title: '质检方案', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/reportManager',
    component: Layout,
    redirect: '/reportManager/groupSalaryList',
    name: '报表管理',
    code: '1008',
    meta: { code: '1008', title: '报表管理', icon: 'bbgl' },
    alwaysShow: true,
    children: [
      {
        path: 'produceSchedule',
        name: 'produceScheduleCancel',
        code: '1098',
        component: () => import('@/views/reportManager/produceSchedule'),
        meta: { code: '1098', title: '生产进度报表', icon: '', keepAlive: true }
      }, {
        path: 'groupSalaryList',
        name: 'groupSalaryListCancel',
        code: '1090',
        component: () => import('@/views/reportManager/groupSalaryList'),
        meta: { code: '1090', title: '班组工资统计', icon: '', keepAlive: true }
      }, {
        path: 'personSalaryList',
        name: 'personSalaryListCancel',
        code: '1091',
        component: () => import('@/views/reportManager/personSalaryList'),
        meta: { code: '1091', title: '人员工资', icon: '', keepAlive: true }
      }, {
        path: 'subcontractingOperation',
        name: 'subcontractingOperationCancel',
        code: '1092',
        component: () => import('@/views/reportManager/subcontractingOperation'),
        meta: { code: '1092', title: '委外工序', icon: '', keepAlive: true }
      }, {
        path: 'defectDetailList',
        name: 'defectDetailListCancel',
        code: '1093',
        component: () => import('@/views/reportManager/defectDetailList'),
        meta: { code: '1093', title: '不良明细', icon: '', keepAlive: true }
      }, {
        path: 'abnormalQualityList',
        name: 'abnormalQualityListCancel',
        code: '1094',
        component: () => import('@/views/reportManager/abnormalQualityList'),
        meta: { code: '1094', title: '品质异常', icon: '', keepAlive: true }
      }, {
        path: 'repairDetailList',
        name: 'repairDetailListCancel',
        code: '1095',
        component: () => import('@/views/reportManager/repairDetailList'),
        meta: { code: '1095', title: '维修明细', icon: '', keepAlive: true }
      }, {
        path: 'installationLampList',
        name: 'installationLampListCancel',
        code: '1096',
        component: () => import('@/views/reportManager/installationLampList'),
        meta: { code: '1096', title: '安灯报表', icon: '', keepAlive: true }
      }, {
        path: 'logisticsCheck',
        name: 'logisticsCheckCancel',
        code: '1097',
        component: () => import('@/views/reportManager/logisticsCheck'),
        meta: { code: '1097', title: '物流检验报表', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/systemSettings',
    component: Layout,
    redirect: '/systemSettings/bmgz',
    name: '系统设置',
    code: '1009',
    meta: { code: '1009', title: '系统设置', icon: 'xtsz' },
    alwaysShow: true,
    children: [
      {
        path: 'codingRules',
        name: 'codingRulesCancel',
        code: '1101',
        component: () => import('@/views/systemSettings/codingRules'),
        meta: { code: '1101', title: '编码规则', icon: '', keepAlive: true }
      }, {
        path: 'passwordEdit',
        name: 'passwordEditCancel',
        code: '1102',
        component: () => import('@/views/systemSettings/passwordEdit'),
        meta: { code: '1102', title: '密码修改', icon: '', keepAlive: true }
      }, {
        path: 'systemLog',
        name: 'systemLogCancel',
        code: '1103',
        component: () => import('@/views/systemSettings/systemLog'),
        meta: { code: '1103', title: '系统日志', icon: '', keepAlive: true }
      }, {
        path: 'sopUpload',
        name: 'sopUploadCancel',
        code: '1104',
        component: () => import('@/views/systemSettings/sopUpload'),
        meta: { code: '1104', title: 'SOP上传', icon: '', keepAlive: true }
      }, {
        path: 'shopNotice',
        name: 'shopNoticeCancel',
        code: '1105',
        component: () => import('@/views/systemSettings/shopNotice'),
        meta: { code: '1105', title: '车间公告', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/purchasesManager',
    component: Layout,
    redirect: '/purchasesManager/purchasesList',
    name: '采购管理',
    code: '1000',
    meta: { code: '1000', title: '采购管理', icon: 'cggl' },
    alwaysShow: true,
    children: [
      {
        path: 'purchasesList',
        name: 'CGDDCancel',
        code: '1201',
        component: () => import('@/views/purchasesManager/purchasesList'),
        meta: { code: '1201', title: '采购订单', icon: '', keepAlive: true }
      }, {
        path: 'arrivalNoticeList',
        name: 'arrivalNoticeListCancel',
        code: '1202',
        component: () => import('@/views/purchasesManager/arrivalNoticeList'),
        meta: { code: '1202', title: '采购收货单', icon: '', keepAlive: true }
      }, {
        path: 'salesStatisticsList',
        name: 'salesStatisticsCancel',
        code: '1203',
        component: () => import('@/views/purchasesManager/salesStatisticsList'),
        meta: { code: '1203', title: '销售订单', icon: '', keepAlive: true }
      }, {
        path: 'goodsStatisticsList',
        name: 'goodsStatisticsListCancel',
        code: '1204',
        component: () => import('@/views/purchasesManager/goodsStatisticsList'),
        meta: { code: '1204', title: '销货单', icon: '', keepAlive: true }
      }, {
        path: 'InventoryLedgerList',
        name: 'InventoryLedgerListCancel',
        code: '1205',
        component: () => import('@/views/purchasesManager/InventoryLedgerList'),
        meta: { code: '1205', title: '库存台账', icon: '', keepAlive: true }
      }
    ]
  }
]
// ä¸Šäº‘模块
export const asyncRoutesCloud = [
  // 1.系统管理(基础设置类)
@@ -713,616 +1332,6 @@
  //   ]
  // }
]
// æœªä¸Šäº‘模块
export const asyncRoutes = [
  // {
  //   path: '/gtt',
  //   component: Layout,
  //   redirect: '/gtt/back',
  //   name: '基础设置',
  //   code: '1001',
  //   meta: { code: '1001', title: '基础设置', icon: 'tree' },
  //   alwaysShow: true, // å½“children只有一个时,也显示父菜单
  //   children: [{
  //     path: 'back',
  //     name: 'YYQDCancel',
  //     code: '1011',
  //     component: () => import('@/views/gantt_back/gantt_back'),
  //     meta: { code: '1011', title: '用户清单', icon: '', keepAlive: true }
  //   }, {
  //     path: 'zdpc2',
  //     name: 'YYQDCancel',
  //     code: '1012',
  //     component: () => import('@/views/gantt_back/zdpc2'),
  //     meta: { code: '1012', title: '自动排程2', icon: '', keepAlive: true }
  //   }]
  // },
  {
    path: '/basicSettings',
    component: Layout,
    redirect: '/basicSettings/organizationList',
    name: '基础设置',
    code: '1001',
    meta: { code: '1001', title: '基础设置', icon: 'tree2' },
    alwaysShow: true, // å½“children只有一个时,也显示父菜单
    children: [
      {
        path: 'organizationList',
        name: 'organizationListCancel',
        code: '1010',
        component: () => import('@/views/basicSettings/organizationList'),
        meta: { code: '1010', title: '组织架构', icon: '', keepAlive: true }
      }, {
        path: 'userList',
        name: 'userListCancel',
        code: '1011',
        component: () => import('@/views/basicSettings/userList'),
        meta: { code: '1011', title: '用户清单', icon: '', keepAlive: true }
      }, {
        path: 'roleList',
        name: 'roleListCancel',
        code: '1012',
        component: () => import('@/views/basicSettings/roleList'),
        meta: { code: '1012', title: '角色清单', icon: '', keepAlive: true }
      }, {
        path: 'contactUnitList',
        name: 'contactUnitListCancel',
        code: '1013',
        component: () => import('@/views/basicSettings/contactUnitList'),
        meta: { code: '1013', title: '往来单位', icon: '', keepAlive: true }
      }, {
        path: 'installationLampSetting',
        name: 'installationLampSettingCancel',
        code: '1014',
        component: () => import('@/views/basicSettings/installationLampSetting'),
        meta: { code: '1014', title: '安灯设置', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/deviceManager',
    component: Layout,
    redirect: '/deviceManager/deviceType',
    name: '设备管理',
    code: '1002',
    meta: { code: '1002', title: '设备管理', icon: 'example' },
    alwaysShow: true,
    children: [
      {
        path: 'deviceType',
        name: 'deviceTypeCancel',
        code: '1020',
        component: () => import('@/views/deviceManager/deviceType'),
        meta: { code: '1020', title: '设备类型', icon: '', keepAlive: true }
      },
      {
        path: 'deviceGroup',
        name: 'deviceGroupCancel',
        code: '1021',
        component: () => import('@/views/deviceManager/deviceGroup'),
        meta: { code: '1021', title: '设备组', icon: '', keepAlive: true }
      }, {
        path: 'deviceList',
        name: 'deviceListCancel',
        code: '1022',
        component: () => import('@/views/deviceManager/deviceList'),
        meta: { code: '1022', title: '设备清单', icon: '', keepAlive: true }
      },
      {
        path: 'checkStandard',
        name: 'checkStandardCancel',
        code: '1023',
        component: () => import('@/views/deviceManager/checkStandard'),
        meta: { code: '1023', title: '点检标准', icon: '', keepAlive: true }
      },
      {
        path: 'checkPosition',
        name: 'checkPositionCancel',
        code: '1024',
        component: () => import('@/views/deviceManager/checkPosition'),
        meta: { code: '1024', title: '点检部位', icon: '', keepAlive: true }
      },
      {
        path: 'maintainStandard',
        name: 'maintainStandardCancel',
        code: '1025',
        component: () => import('@/views/deviceManager/maintainStandard'),
        meta: { code: '1025', title: '保养标准', icon: '', keepAlive: true }
      },
      {
        path: 'maintainPosition',
        name: 'maintainPositionCancel',
        code: '1026',
        component: () => import('@/views/deviceManager/maintainPosition'),
        meta: { code: '1026', title: '保养部位', icon: '', keepAlive: true }
      },
      {
        path: 'checkRecord',
        name: 'checkRecordCancel',
        code: '1027',
        component: () => import('@/views/deviceManager/checkRecord'),
        meta: { code: '1027', title: '点检记录', icon: '', keepAlive: true }
      },
      {
        path: 'maintainRecord',
        name: 'maintainRecordCancel',
        code: '1028',
        component: () => import('@/views/deviceManager/maintainRecord'),
        meta: { code: '1028', title: '保养记录', icon: '', keepAlive: true }
      },
      {
        path: 'repairRecord',
        code: '1029',
        name: 'repairRecordCancel',
        component: () => import('@/views/deviceManager/repairRecord'),
        meta: { code: '1029', title: '维修记录', icon: '', keepAlive: true }
      },
      {
        path: 'repairRequestRecord',
        name: 'repairRequestRecordCancel',
        code: '1019',
        component: () => import('@/views/deviceManager/repairRequestRecord'),
        meta: { code: '1019', title: '设备申请维修记录', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/gzgl',
    component: Layout,
    redirect: '/gzgl/gzlx',
    name: '工装管理',
    code: '1003',
    meta: { code: '1003', title: '工装管理', icon: 'component' },
    alwaysShow: true,
    children: [
      {
        path: 'gzlx',
        name: 'GZLXCancel',
        code: '1030',
        component: () => import('@/views/gzgl/gzlx'),
        meta: { code: '1030', title: '工装类型', icon: '', keepAlive: true }
      }, {
        path: 'sjxj',
        name: 'SJXJCancel',
        code: '1039',
        component: () => import('@/views/gzgl/sjxj'),
        meta: { code: '1039', title: '上机下机', icon: '', keepAlive: true }
      }, {
        path: 'ckrk',
        name: 'CKRKCancel',
        code: '1040',
        component: () => import('@/views/gzgl/ckrk'),
        meta: { code: '1040', title: '出库入库', icon: '', keepAlive: true }
      }, {
        path: 'gzqd',
        name: 'GZQDCancel',
        code: '1031',
        component: () => import('@/views/gzgl/gzqd'),
        meta: { code: '1031', title: '工装清单', icon: '', keepAlive: true }
      }, {
        path: 'djbz',
        name: 'DJBZCancel',
        code: '1032',
        component: () => import('@/views/gzgl/djbz'),
        meta: { code: '1032', title: '点检标准', icon: '', keepAlive: true }
      }, {
        path: 'djbw',
        name: 'DJBWCancel',
        code: '1033',
        component: () => import('@/views/gzgl/djbw'),
        meta: { code: '1033', title: '点检部位', icon: '', keepAlive: true }
      }, {
        path: 'bybz',
        name: 'BYBZCancel',
        code: '1034',
        component: () => import('@/views/gzgl/bybz'),
        meta: { code: '1034', title: '保养标准', icon: '', keepAlive: true }
      }, {
        path: 'bybw',
        name: 'BYBWCancel',
        code: '1035',
        component: () => import('@/views/gzgl/bybw'),
        meta: { code: '1035', title: '保养部位', icon: '', keepAlive: true }
      }, {
        path: 'djjl',
        name: 'DJJLCancel',
        code: '1036',
        component: () => import('@/views/gzgl/djjl'),
        meta: { code: '1036', title: '点检记录', icon: '', keepAlive: true }
      }, {
        path: 'byjl',
        name: 'BYJLCancel',
        code: '1037',
        component: () => import('@/views/gzgl/byjl'),
        meta: { code: '1037', title: '保养记录', icon: '', keepAlive: true }
      }, {
        path: 'gzwx',
        name: 'GZWXCancel',
        code: '1038',
        component: () => import('@/views/gzgl/gzwx'),
        meta: { code: '1038', title: '工装维修', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/materialManager',
    component: Layout,
    redirect: '/materialManager/storehouseDefine',
    name: '物料管理',
    code: '1004',
    meta: { code: '1004', title: '物料管理', icon: 'table' },
    alwaysShow: true,
    children: [
      {
        path: 'storehouseDefine',
        name: 'storehouseDefineCancel',
        code: '1050',
        component: () => import('@/views/materialManager/storehouseDefine'),
        meta: { code: '1050', title: '仓库定义', icon: '', keepAlive: true }
      },
      {
        path: 'locationDefine',
        name: 'locationDefineCancel',
        code: '1051',
        component: () => import('@/views/materialManager/locationDefine'),
        meta: { code: '1051', title: '库位定义', icon: '', keepAlive: true }
      }, {
        path: 'containerType',
        name: 'containerTypeCancel',
        code: '1052',
        component: () => import('@/views/materialManager/containerType'),
        meta: { code: '1052', title: '容器类型', icon: '', keepAlive: true }
      }, {
        path: 'containerList',
        name: 'containerListCancel',
        code: '1053',
        component: () => import('@/views/materialManager/containerList'),
        meta: { code: '1053', title: '容器清单', icon: '', keepAlive: true }
      }, {
        path: 'inOutboundRecord',
        name: 'inOutboundRecordCancel',
        code: '1054',
        component: () => import('@/views/materialManager/inOutboundRecord'),
        meta: { code: '1054', title: '出入库记录', icon: '', keepAlive: true }
      }, {
        path: 'inventoryQuery',
        name: 'inventoryQueryCancel',
        code: '1055',
        component: () => import('@/views/materialManager/inventoryQuery'),
        meta: { code: '1055', title: '库存查询', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/makeModel',
    component: Layout,
    redirect: '/makeModel/InventoryList',
    name: '制造模型',
    code: '1005',
    meta: { code: '1005', title: '制造模型', icon: 'icu' },
    alwaysShow: true,
    children: [
      {
        path: 'materialType',
        name: 'materialTypeCancel',
        code: '1060',
        component: () => import('@/views/makeModel/materialType'),
        meta: { code: '1060', title: '物料类型', icon: '', keepAlive: true }
      },
      {
        path: 'InventoryList',
        name: 'InventoryListCancel',
        code: '1061',
        component: () => import('@/views/makeModel/InventoryList'),
        meta: { code: '1061', title: '存货档案', icon: '', keepAlive: true }
      }, {
        path: 'materialList',
        name: 'materialListCancel',
        code: '1062',
        component: () => import('@/views/makeModel/materialList'),
        meta: { code: '1062', title: '物料清单', icon: '', keepAlive: true }
      },
      {
        path: 'processRoute',
        name: 'processRouteCancel',
        code: '1063',
        component: () => import('@/views/makeModel/processRoute'),
        meta: { code: '1063', title: '工艺路线', icon: '', keepAlive: true }
      }, {
        path: 'processDefine',
        name: 'processDefineCancel',
        code: '1064',
        component: () => import('@/views/makeModel/processDefine'),
        meta: { code: '1064', title: '工序定义', icon: '', keepAlive: true }
      },
      {
        path: 'meterPrice',
        name: 'meterPriceCancel',
        code: '1065',
        component: () => import('@/views/makeModel/meterPrice'),
        meta: { code: '1065', title: '节拍工价', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/produceManager',
    component: Layout,
    redirect: '/produceManager/produceOrder',
    name: '生产管理',
    code: '1006',
    meta: { code: '1006', title: '生产管理', icon: 'production' },
    alwaysShow: true,
    children: [
      {
        path: 'produceOrder',
        name: 'produceOrderCancel',
        code: '1070',
        component: () => import('@/views/produceManager/produceOrder'),
        meta: { code: '1070', title: '生产订单', icon: '', keepAlive: true }
      }, {
        path: 'workOrder',
        name: 'workOrderCancel',
        code: '1071',
        component: () => import('@/views/produceManager/workOrder'),
        meta: { code: '1071', title: '工单', icon: '', keepAlive: true }
      }, {
        path: 'workOrderDispatch',
        name: 'workOrderDispatchCancel',
        code: '1072',
        component: () => import('@/views/produceManager/workOrderDispatch'),
        meta: { code: '1072', title: '工单派工', icon: '', keepAlive: true }
      }, {
        path: 'produceStartOrder',
        name: 'produceStartOrderCancel',
        code: '1073',
        component: () => import('@/views/produceManager/produceStartOrder'),
        meta: { code: '1073', title: '生产开报工', icon: '', keepAlive: true }
      }, {
        path: 'workOrderBatchClose',
        name: 'workOrderBatchCloseCancel',
        code: '1074',
        component: () => import('@/views/produceManager/workOrderBatchClose'),
        meta: { code: '1074', title: '工单批量关闭', icon: '', keepAlive: true }
      }, {
        path: 'capacityPlanning',
        name: 'capacityPlanningCancel',
        code: '1075',
        component: () => import('@/views/produceManager/capacityPlanning'),
        meta: { code: '1075', title: '产能规划', icon: '', keepAlive: true }
      }, {
        path: 'AutoScheduling',
        name: 'AutoSchedulingCancel',
        code: '1076',
        component: () => import('@/views/produceManager/AutoScheduling'),
        meta: { code: '1076', title: '自动排程', icon: '', keepAlive: true }
      }, {
        path: 'productWarehouse',
        name: 'productWarehouseCancel',
        code: '1077',
        component: () => import('@/views/produceManager/productWarehouse'),
        meta: { code: '1077', title: '生产入库', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/qualityManager',
    component: Layout,
    redirect: '/qualityManager/defectDefine',
    name: '质量管理',
    code: '1007',
    meta: { code: '1007', title: '质量管理', icon: 'quality' },
    alwaysShow: true,
    children: [
      {
        path: 'qualityStandard',
        name: 'qualityStandardCancel',
        code: '1080',
        component: () => import('@/views/qualityManager/qualityStandard'),
        meta: { code: '1080', title: '质检标准', icon: '', keepAlive: true }
      }, {
        path: 'defectDefine',
        name: 'defectDefineCancel',
        code: '1081',
        component: () => import('@/views/qualityManager/defectDefine'),
        meta: { code: '1081', title: '缺陷定义', icon: '', keepAlive: true }
      }, {
        path: 'processCheck',
        name: 'processCheckCancel',
        code: '1082',
        component: () => import('@/views/qualityManager/processCheck'),
        meta: { code: '1082', title: '工序检验', icon: '', keepAlive: true }
      }, {
        path: 'logisticsCheck',
        name: 'logisticsCheckCancel',
        code: '1083',
        component: () => import('@/views/qualityManager/logisticsCheck'),
        meta: { code: '1083', title: '物流检验', icon: '', keepAlive: true }
      }, {
        path: 'defectStatistics',
        name: 'defectStatisticsCancel',
        code: '1084',
        component: () => import('@/views/qualityManager/defectStatistics'),
        meta: { code: '1084', title: '缺陷统计', icon: '', keepAlive: true }
      },
      {
        path: 'processCheckStandard',
        name: 'processCheckStandardCancel',
        code: '1085',
        component: () => import('@/views/qualityManager/processCheckStandard'),
        meta: { code: '1085', title: '工序检验标准', icon: '', keepAlive: true }
      },
      {
        path: 'processCheckItem',
        name: 'processCheckItemCancel',
        code: '1086',
        component: () => import('@/views/qualityManager/processCheckItem'),
        meta: { code: '1086', title: '工序检验项目', icon: '', keepAlive: true }
      }, {
        path: 'processCheckRecord',
        name: 'processCheckRecordCancel',
        code: '1087',
        component: () => import('@/views/qualityManager/processCheckRecord'),
        meta: { code: '1087', title: '工序检验记录', icon: '', keepAlive: true }
      }, {
        path: 'qualityPlaning',
        name: 'ZJFACancel',
        code: '1088',
        component: () => import('@/views/qualityManager/qualityPlaning'),
        meta: { code: '1088', title: '质检方案', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/reportManager',
    component: Layout,
    redirect: '/reportManager/groupSalaryList',
    name: '报表管理',
    code: '1008',
    meta: { code: '1008', title: '报表管理', icon: 'bbgl' },
    alwaysShow: true,
    children: [
      {
        path: 'produceSchedule',
        name: 'produceScheduleCancel',
        code: '1098',
        component: () => import('@/views/reportManager/produceSchedule'),
        meta: { code: '1098', title: '生产进度报表', icon: '', keepAlive: true }
      }, {
        path: 'groupSalaryList',
        name: 'groupSalaryListCancel',
        code: '1090',
        component: () => import('@/views/reportManager/groupSalaryList'),
        meta: { code: '1090', title: '班组工资统计', icon: '', keepAlive: true }
      }, {
        path: 'personSalaryList',
        name: 'personSalaryListCancel',
        code: '1091',
        component: () => import('@/views/reportManager/personSalaryList'),
        meta: { code: '1091', title: '人员工资', icon: '', keepAlive: true }
      }, {
        path: 'subcontractingOperation',
        name: 'subcontractingOperationCancel',
        code: '1092',
        component: () => import('@/views/reportManager/subcontractingOperation'),
        meta: { code: '1092', title: '委外工序', icon: '', keepAlive: true }
      }, {
        path: 'defectDetailList',
        name: 'defectDetailListCancel',
        code: '1093',
        component: () => import('@/views/reportManager/defectDetailList'),
        meta: { code: '1093', title: '不良明细', icon: '', keepAlive: true }
      }, {
        path: 'abnormalQualityList',
        name: 'abnormalQualityListCancel',
        code: '1094',
        component: () => import('@/views/reportManager/abnormalQualityList'),
        meta: { code: '1094', title: '品质异常', icon: '', keepAlive: true }
      }, {
        path: 'repairDetailList',
        name: 'repairDetailListCancel',
        code: '1095',
        component: () => import('@/views/reportManager/repairDetailList'),
        meta: { code: '1095', title: '维修明细', icon: '', keepAlive: true }
      }, {
        path: 'installationLampList',
        name: 'installationLampListCancel',
        code: '1096',
        component: () => import('@/views/reportManager/installationLampList'),
        meta: { code: '1096', title: '安灯报表', icon: '', keepAlive: true }
      }, {
        path: 'logisticsCheck',
        name: 'logisticsCheckCancel',
        code: '1097',
        component: () => import('@/views/reportManager/logisticsCheck'),
        meta: { code: '1097', title: '物流检验报表', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/systemSettings',
    component: Layout,
    redirect: '/systemSettings/bmgz',
    name: '系统设置',
    code: '1009',
    meta: { code: '1009', title: '系统设置', icon: 'xtsz' },
    alwaysShow: true,
    children: [
      {
        path: 'codingRules',
        name: 'codingRulesCancel',
        code: '1101',
        component: () => import('@/views/systemSettings/codingRules'),
        meta: { code: '1101', title: '编码规则', icon: '', keepAlive: true }
      }, {
        path: 'passwordEdit',
        name: 'passwordEditCancel',
        code: '1102',
        component: () => import('@/views/systemSettings/passwordEdit'),
        meta: { code: '1102', title: '密码修改', icon: '', keepAlive: true }
      }, {
        path: 'systemLog',
        name: 'systemLogCancel',
        code: '1103',
        component: () => import('@/views/systemSettings/systemLog'),
        meta: { code: '1103', title: '系统日志', icon: '', keepAlive: true }
      }, {
        path: 'sopUpload',
        name: 'sopUploadCancel',
        code: '1104',
        component: () => import('@/views/systemSettings/sopUpload'),
        meta: { code: '1104', title: 'SOP上传', icon: '', keepAlive: true }
      }, {
        path: 'shopNotice',
        name: 'shopNoticeCancel',
        code: '1105',
        component: () => import('@/views/systemSettings/shopNotice'),
        meta: { code: '1105', title: '车间公告', icon: '', keepAlive: true }
      }
    ]
  },
  {
    path: '/purchasesManager',
    component: Layout,
    redirect: '/purchasesManager/purchasesList',
    name: '采购管理',
    code: '1000',
    meta: { code: '1000', title: '采购管理', icon: 'cggl' },
    alwaysShow: true,
    children: [
      {
        path: 'purchasesList',
        name: 'CGDDCancel',
        code: '1201',
        component: () => import('@/views/purchasesManager/purchasesList'),
        meta: { code: '1201', title: '采购订单', icon: '', keepAlive: true }
      }, {
        path: 'arrivalNoticeList',
        name: 'arrivalNoticeListCancel',
        code: '1202',
        component: () => import('@/views/purchasesManager/arrivalNoticeList'),
        meta: { code: '1202', title: '采购收货单', icon: '', keepAlive: true }
      }, {
        path: 'salesStatisticsList',
        name: 'salesStatisticsCancel',
        code: '1203',
        component: () => import('@/views/purchasesManager/salesStatisticsList'),
        meta: { code: '1203', title: '销售订单', icon: '', keepAlive: true }
      }, {
        path: 'goodsStatisticsList',
        name: 'goodsStatisticsListCancel',
        code: '1204',
        component: () => import('@/views/purchasesManager/goodsStatisticsList'),
        meta: { code: '1204', title: '销货单', icon: '', keepAlive: true }
      }, {
        path: 'InventoryLedgerList',
        name: 'InventoryLedgerListCancel',
        code: '1205',
        component: () => import('@/views/purchasesManager/InventoryLedgerList'),
        meta: { code: '1205', title: '库存台账', icon: '', keepAlive: true }
      }
    ]
  }
]
const createRouter = () => new Router({
src/utils/request.js
@@ -42,7 +42,7 @@
    if (res.code === '300' || res.code === '303') {
      if (res.code === '300') {
        Message({
          message: res.Message || 'Error',
          message: res.message || 'Error',
          type: 'error',
          duration: 5 * 1000
        })
src/views/basicSettings/rolePermission.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,538 @@
<template>
  <div>
    <div class="body" :style="{height:mainHeight+'px'}">
      <div class="bodyTopButtonGroup" style="justify-content: space-between">
        <el-button v-waves type="primary" icon="el-icon-circle-plus-outline">新增</el-button>
        <el-button v-waves icon="el-icon-download">导入</el-button>
      </div>
      <div class="bodyTopFormGroup">
        <el-form
          ref="form"
          :model="form"
          label-width="100px"
          inline
          style="display: flex;"
        >
          <div class="elForm">
            <el-form-item label="母件编码" style=" display: flex;">
              <el-input v-model="form.OrgCode" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item label="母件名称" style=" display: flex;">
              <el-input v-model="form.OrgName" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item label="母件规格" style=" display: flex;">
              <el-input v-model="form.OrgName" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item label="版本编号" style=" display: flex;">
              <el-input v-model="form.OrgName" placeholder="请输入" style="width: 200px" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="创建人员" style=" display: flex;">
              <el-input v-model="form.UserName" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item v-show="isExpandForm" label="创建日期" style=" display: flex;">
              <el-date-picker
                v-model="form.createdate"
                style="width: 200px"
                type="date"
                placeholder="选择日期"
              />
            </el-form-item>
          </div>
          <div
            class="bodySearchReset"
            :style="{marginLeft:$store.state.app.sidebar.opened? $store.state.settings.menuIsHorizontal?'15%':'3%':'10%'}"
          >
            <el-button v-waves type="primary" icon="el-icon-search">查询</el-button>
            <el-button v-waves type="info" icon="el-icon-refresh">重置</el-button>
          </div>
        </el-form>
        <div
          class="bodyTopFormExpand"
        >
          <svg-icon
            v-show="mouseHoverType==='mouseout'"
            style="cursor: pointer"
            :icon-class="!isExpandForm?'doubleDown3':'doubleUp3'"
            @mouseenter="mouseHoverType=$event.type"
          />
          <svg-icon
            v-show="mouseHoverType==='mouseenter'"
            style="cursor: pointer"
            :icon-class="!isExpandForm?'doubleDown':'doubleUp'"
            @click="isExpandForm=!isExpandForm"
            @mouseout="mouseHoverType=$event.type"
          />
        </div>
      </div>
      <div
        class="elTableDiv"
      >
        <div style="width: 300px;">
          <el-tree
            ref="treeLeftRef"
            style="padding: 10px;"
            :style="{height:isExpandForm?tableHeight:(tableHeight+105)+'px'}"
            :data="treeLeft"
            node-key="code"
            highlight-current
            :props="defaultProps"
            :default-expand-all="true"
          />
        </div>
        <div
          style="margin-left: 15px;width:100%;"
        >
          <el-tabs v-model="activeName" type="border-card">
            <el-tab-pane label="PC端" name="PC端">
              <div style="display: flex;">
                <div
                  ref="scrollLeft"
                  style="border-right: 1px solid rgba(0,0,0,0.2);width: 200px;
                  overflow-y: auto;overflow-x:hidden;"
                  :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}"
                  @scroll="scrollLeftScroll()"
                  @mouseover="changeScrollLeftFlag(false)"
                >
                  <div style=" ">
                    <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> èœå•权限
                  </div>
                  <!--                  :style="{height:isExpandForm?tableHeight:(tableHeight+15)+'px',}"-->
                  <el-tree
                    ref="treeCenterRef"
                    style="padding-top: 10px;width: 199px;"
                    :data="treeCenter"
                    highlight-current
                    :props="defaultProps"
                    show-checkbox
                    node-key="code"
                    :default-expand-all="true"
                    @check-change="handleTreeCenterCheckChange"
                    @check="handleTreeCenterCheck"
                    @node-click="getLeftTreeNode"
                  />
                </div>
                <div
                  ref="scrollCenter"
                  style="border-right: 1px solid rgba(0,0,0,0.2);width: 500px;padding-left: 10px;overflow-y: auto"
                  :style="{height:isExpandForm?tableHeight:(tableHeight+35)+'px',}"
                  @scroll="scrollCenterScroll()"
                  @mouseover="changeScrollLeftFlag(true)"
                >
                  <div style=" ">
                    <i class="el-icon-s-operation" :style="{color:$store.state.settings.theme}" /> æŒ‰é’®æƒé™
                  </div>
                  <el-checkbox
                    v-model="buttonIsChecked"
                    style="height: 26px;display:flex;align-items: center;margin-top:10px;width:200px"
                    @change="handleCheckAllChange"
                  >全选
                  </el-checkbox>
                  <div v-for="item in treeCenter[0].children" :key="item.label">
                    <div
                      v-if="item.checkedButton"
                      style="margin-left: 40px;height:26px;display: flex;"
                    />
                    <el-checkbox-group
                      v-for="it in item.children"
                      v-if="item.expanded"
                      :key="it.code"
                      v-model="it.checkedButton"
                      style="margin-left: 40px;height:26px;display: flex"
                      @change="val=>handleCheckedButtonChange(val,it.code,it.checkedButton)"
                    >
                      <el-checkbox
                        v-for="i in it.itemButton"
                        :key="i"
                        :label="i"
                        style="display:flex;align-items: center"
                      >{{ i }}
                      </el-checkbox>
                    </el-checkbox-group>
                  </div>
                </div>
              </div>
            </el-tab-pane>
            <el-tab-pane label="APP端" name="APP端">大大</el-tab-pane>
            <el-tab-pane label="工控端" name="工控端">工控端</el-tab-pane>
          </el-tabs>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import Pagination from '@/components/Pagination'
import ImportPicker from '@/components/ImportPicker'
import elDragDialog from '@/directive/el-drag-dialog'
import waves from '@/directive/waves'
export default {
  name: 'Zzjg',
  components: {
    Pagination, ImportPicker
  },
  directives: { elDragDialog, waves },
  data() {
    return {
      mouseHoverType: 'mouseout',
      isExpandForm: false,
      mainHeight: 0,
      tableHeight: 0,
      form: {
        OrgCode: '', // ç»„织架构代码
        OrgName: '', // ç»„织架构名称
        OrgType: '', // ç»„织类型
        UserName: '', // åˆ›å»ºäººå‘˜
        createdate: '',
        prop: 'lm_date', // æŽ’序字段
        order: 'desc', // æŽ’序字段
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
      },
      treeLeft: [
        {
          code: '2000',
          label: '浙江新凯迪数字科技股份有限公司',
          children: [{
            code: '2001',
            label: '所有人'
          }, {
            code: '2002',
            label: '金工车间员工'
          }]
        }
      ],
      treeCenter: [
        {
          label: 'PC端页面',
          code: '1000',
          children: [{
            code: '2000',
            label: '基础设置',
            children: [{
              code: '2001',
              label: '组织架构'
            }, {
              code: '2002',
              label: '角色权限'
            }]
          }, {
            label: '设备管理',
            code: '3000',
            children: [{
              code: '3001',
              label: '设备清单'
            }, {
              code: '3002',
              label: '设备保养'
            }]
          }]
        }
      ],
      defaultProps: {
        children: 'children',
        label: 'label'
      },
      activeName: 'PC端',
      buttonIsChecked: false,
      // itemButton: ['新增', '修改', '删除', '下载', '上传'],
      // checkedButton: ['新增', '修改'],
      menuCheckedCodeArr: [], // èœå•权限数组选中的
      isScroll: false
    }
  },
  created() {
  },
  mounted() {
    window.addEventListener('resize', this.getHeight)
    this.getHeight()
    this.$nextTick(() => {
      this.$refs.treeLeftRef.setCurrentKey('2001') // é»˜è®¤é€‰ä¸­èŠ‚ç‚¹ç¬¬ä¸€ä¸ª
    })
    this.treeCenter[0].children.forEach(item => {
      if (item.children && item.children.length) {
        item.children.forEach(it => {
          it.itemButton = ['新增', '修改', '删除', '下载', '上传']
          // it.checkedButton = ['新增', '修改']
          it.checkedButton = []
        })
        item.itemButton = []
        item.checkedButton = []
        item.expanded = true
      }
    })
    console.log(JSON.parse(JSON.stringify(this.treeCenter)))
  },
  methods: {
    // å·¦è¾¹æ»šåŠ¨æ¡æ»‘åŠ¨æ—¶
    scrollLeftScroll() {
      if (!this.isScroll) {
        this.$refs.scrollCenter.scrollTop = this.$refs.scrollLeft.scrollTop
      }
    },
    // ä¸­é—´è¾¹æ»šåŠ¨æ¡æ»‘åŠ¨æ—¶
    scrollCenterScroll() {
      if (this.isScroll) {
        this.$refs.scrollLeft.scrollTop = this.$refs.scrollCenter.scrollTop
      }
    },
    resize() {
    },
    changeScrollLeftFlag(val) {
      this.isScroll = val
    },
    // å…¨é€‰æ”¹å˜
    handleCheckAllChange(val) {
      const checkedKeys = this.$refs.treeCenterRef.getCheckedKeys()
      if (val) {
        this.treeCenter[0].children.forEach(item => {
          if (item.children && item.children.length) {
            item.children.forEach(it => {
              if (checkedKeys.includes(it.code)) {
                it.checkedButton = it.itemButton
              }
            })
          }
        })
      } else {
        this.treeCenter[0].children.forEach(item => {
          if (item.children && item.children.length) {
            item.children.forEach(it => {
              if (checkedKeys.includes(it.code)) {
                it.checkedButton = []
              }
            })
          }
        })
      }
      console.log(this.treeCenter[0].children, 20)
    },
    // å•个按钮改变    oldValue æ›´æ–°å‰çš„值  code å¯¹åº”的菜单编码  newValue æ›´æ–°åŽçš„值
    handleCheckedButtonChange(oldValue, code, newValue) {
      // åˆ¤æ–­æ˜¯å¦åŒ…含在内
      if (!this.menuCheckedCodeArr.includes(code) && oldValue.length === 0 && newValue.length === 1) { // å¦
        this.menuCheckedCodeArr.push(code)
      } else if (this.menuCheckedCodeArr.includes(code) && oldValue.length === 1 && newValue.length === 0) { // æ˜¯
        this.menuCheckedCodeArr = this.menuCheckedCodeArr.filter(i => i !== code)
      }
      this.$refs.treeCenterRef.setCheckedKeys(this.menuCheckedCodeArr)
      // è¿™é‡Œæ˜¯åˆ¤æ–­å…¨é€‰checkbox æ˜¯å¦é€‰ä¸­
      let count = 0
      let childrenLength = 0
      this.treeCenter[0].children.forEach(item => {
        if (item.children && item.children.length) {
          item.children.forEach(it => {
            if (it.checkedButton.length === it.itemButton.length) {
              count++
            }
            childrenLength++
          })
        }
      })
      this.buttonIsChecked = count === childrenLength
      this.$forceUpdate()
    },
    getLeftTreeNode(data, Node, VueComponent) {
      console.log(data, Node, VueComponent, 2221)
      console.log(Node.expanded)
      this.treeCenter[0].children.forEach(item => {
        // console.log(item, 'item')
        if (item.label === data.label) {
          item.expanded = Node.expanded
        }
      })
      if (data.label === 'PC端页面') {
        Node.expanded = true // æš‚时先写成这个
        // this.treeCenter[0].children.forEach(item => {
        //   item.expanded = Node.expanded
        // })
      }
      this.$forceUpdate()
    },
    handleTreeCenterCheck(obj, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys }) {
      // console.log(obj, checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys)
    },
    handleTreeCenterCheckChange(obj, selfChecked, selfChildrenTreeCheck) {
      // console.log(obj, selfChecked, selfChildrenTreeCheck)
      if (!selfChildrenTreeCheck) {
        if (!selfChecked) {
          this.treeCenter[0].children.forEach(item => {
            if (item.children && item.children.length) {
              item.children.forEach(it => {
                if (it.code === obj.code) {
                  it.checkedButton = []
                }
              })
            }
          })
          this.$forceUpdate()
        }
      }
    },
    // èŽ·å–é¡µé¢é«˜åº¦
    getHeight() {
      this.$nextTick(() => {
        this.mainHeight = window.innerHeight - 85
        this.tableHeight = this.mainHeight - 255
        // this.$refs.tableDataRef.doLayout()
      })
    }
  }
}
</script>
<!--公共页面样式-->
<style lang="scss" scoped>
$main_color: #42b983;
::v-deep .el-button--text {
  font-size: 14px;
  cursor: pointer;
}
.el-icon-share, .el-icon-delete, .el-icon-edit-outline {
  color: $main_color;
  cursor: pointer;
}
.el-icon-edit-outline {
  margin-right: 15px;
}
::v-deep .el-button--primary, .el-button--default, .el-button--info {
  height: 34px;
  display: flex;
  align-items: center;
  padding: 0 15px;
}
::v-deep .el-button--primary {
  //background-color: $main_color !important;
}
::v-deep .el-button--default {
  background-color: #f8f8fa;
  border: none;
}
::v-deep .el-input__inner {
  height: 34px;
  line-height: 34px;
  //color: #a7a7a7;
}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
::v-deep .dialogVisibleRoles .el-dialog__body {
  padding: 20px 20px !important;
}
::v-deep .importPickerClass .el-dialog__body {
  padding: 20px 20px !important;
}
::v-deep .el-dialog__footer {
  display: flex;
  justify-content: flex-end;
}
::v-deep .el-table .caret-wrapper {
  transform: scale(0.8);
}
::v-deep .cell {
  display: flex;
  align-items: center;
  justify-content: space-between;
}
::v-deep .el-table::before {
  height: 0;
}
::v-deep .el-table__body-wrapper {
  background-color: #f8f8fa;
}
::v-deep .el-table__body .el-table__row.hover-row td {
  background-color: #eaecef;
}
::v-deep .el-form--inline .el-form-item__label {
  color: #a7a7a7;
}
.body ::v-deep .el-divider {
  border: 1px solid #eee;
  width: 99%;
  margin: 10px auto;
}
.body ::v-deep .el-form-item {
  margin-bottom: 0;
}
.userDialogVisible ::v-deep .el-form-item {
  margin-bottom: 0;
}
::v-deep .el-select__caret {
  display: flex;
  align-items: center;
  justify-content: center;
}
.tableFixed {
  ::v-deep .el-table__fixed-right {
    height: 100% !important;
  }
  ::v-deep .el-table__fixed {
    height: 100% !important;
  }
}
</style>
<style>
.el-table .custom-row {
  background: #f8f8fa;
}
</style>
src/views/login/index.vue
@@ -235,6 +235,7 @@
    },
    dialogVisibleCancel() {
      // localStorage.removeItem('token')
      this.dialogVisible = false
    },
    async dialogVisibleConfirm() {