heyang 2 年之前
父节点
当前提交
175347b39e
共有 25 个文件被更改,包括 13418 次插入1 次删除
  1. 72 0
      src/api/laboratory/subject.js
  2. 7 1
      src/api/system/user.js
  3. 二进制
      src/assets/ZDimages/icon_wd_zw.png
  4. 二进制
      src/assets/ZDimages/icon_znmj_lx.png
  5. 二进制
      src/assets/ZDimages/icon_znmj_zx.png
  6. 二进制
      src/assets/ZDimages/icon_zw_bk.png
  7. 205 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/applicationKDNH.vue
  8. 380 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizaErrorDetail.vue
  9. 218 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizaErrorKDNH.vue
  10. 222 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizeKDNH.vue
  11. 52 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/indexKDNH.vue
  12. 894 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/lookImpower.vue
  13. 305 0
      src/views/comprehensive/laboratoryManagement/accessAuthorization/lookImpowerSearch.vue
  14. 997 0
      src/views/comprehensive/laboratoryManagement/subject/deviceListKDNH.vue
  15. 1471 0
      src/views/comprehensive/laboratoryManagement/subject/indexKDNH.vue
  16. 1257 0
      src/views/comprehensive/personnel/student/addPageKDNH.vue
  17. 999 0
      src/views/comprehensive/personnel/student/indexKDNH.vue
  18. 1817 0
      src/views/comprehensive/personnel/teacher/addPageKDNH.vue
  19. 1517 0
      src/views/comprehensive/personnel/teacher/indexKDNH.vue
  20. 540 0
      src/views/medicUniversity-3_1/chemicalManagement/deviceManagement/SmartAccessControl/indexKDNH.vue
  21. 935 0
      src/views/mine/indexKDNH.vue
  22. 116 0
      src/views/secureAccess/approval/indexKDNH.vue
  23. 528 0
      src/views/secureAccess/approval/infoPageKDNH.vue
  24. 710 0
      src/views/secureAccess/whitelist/addPageKDNH.vue
  25. 176 0
      src/views/secureAccess/whitelist/indexKDNH.vue

+ 72 - 0
src/api/laboratory/subject.js

@@ -397,4 +397,76 @@ export function viewWarnMessage(query) {
     method: 'get',
   })
 }
+/* 智能门禁----------------- */
 
+//查询门禁授权列表
+export function getHaikangList(data) {
+  return request({
+    url: '/laboratory/haikang/user/subList?pageNum='+data.pageNum+'&pageSize='+data.pageSize,
+    method: 'post',
+    data: data,
+  })
+}
+//查询实验室已授权列表
+export function getHaikangUserList(data) {
+  return request({
+    url: '/laboratory/haikang/user/userList?pageNum='+data.pageNum+'&pageSize='+data.pageSize+'&startTime='+data.startTime+'&endTime='+data.endTime+'&searchValue='+data.searchValue+'&userType='+data.userType,
+    method: 'post',
+    data: data
+  })
+}
+//查询门禁授权类型
+export function getHaikangQueryTypes(data) {
+  return request({
+    url: '/laboratory/haikang/user/queryTypes',
+    method: 'post',
+    data: data
+  })
+}
+//新增用户授权
+export function AddImpowerHaikang(data) {
+  return request({
+    url: '/laboratory/haikang/user/add',
+    method: 'post',
+    data: data
+  })
+}
+//编辑用户授权
+export function editImpowerHaikang(data) {
+  return request({
+    url: '/laboratory/haikang/user/update',
+    method: 'post',
+    data: data
+  })
+}
+//新增用户授权
+export function retryImpowerHaikang(data) {
+  return request({
+    url: '/laboratory/haikang/user/retryAccredit',
+    method: 'post',
+    data: data
+  })
+}
+// 删除用户授权
+export function delUserHaikang(id) {
+  return request({
+    url: '/laboratory/haikang/user/' + id,
+    method: 'delete'
+  })
+}
+//门禁授权日志列表
+export function entranceUserLogList(query) {
+  return request({
+    url: '/laboratory/haikang/userLog/list',
+    method: 'get',
+    params: query
+  })
+}
+//门禁授权日志列表
+export function queryHardByTypeList(query) {
+  return request({
+    url: '/laboratory/hardware/queryHardByType',
+    method: 'get',
+    params: query
+  })
+}

+ 7 - 1
src/api/system/user.js

@@ -227,7 +227,13 @@ export function getSendCode(data) {
     params: data
   })
 }
-
+//指纹-查询用户指纹录取数量
+export function fingerprintQuantity(query) {
+  return request({
+    url: '/laboratory/haikang/userFinger/queryCount/'+query,
+    method: 'get',
+  })
+}
 //验证码校验
 export function phoneCheckCode(query) {
   return request({

二进制
src/assets/ZDimages/icon_wd_zw.png


二进制
src/assets/ZDimages/icon_znmj_lx.png


二进制
src/assets/ZDimages/icon_znmj_zx.png


二进制
src/assets/ZDimages/icon_zw_bk.png


+ 205 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/applicationKDNH.vue

@@ -0,0 +1,205 @@
+<!--授权日志-->
+<template>
+  <div class="application">
+    <div class="application-page" v-if="pageType == 1">
+      <div class="title-box">
+        <div @click="titleClick(1)">
+          <p>门禁授权</p>
+          <p></p>
+        </div>
+        <div @click="titleClick(2)">
+          <p>授权日志</p>
+          <p class="bottom-p-color"></p>
+        </div>
+      </div>
+      <div class="application-min">
+        <el-form :model="queryParamsData" ref="queryForm" :inline="true">
+          <el-form-item label="关键字" prop="searchValue" label-width="68px">
+            <el-input
+              maxlength="20"
+              v-model="queryParamsData.searchValue"
+              placeholder="姓名/实验室"
+              clearable
+              size="small"/>
+          </el-form-item>
+<!--          <el-form-item label="状态" prop="status" label-width="50px">-->
+<!--            <el-select v-model="queryParamsData.operate" clearable placeholder="请选择状态">-->
+<!--              <el-option-->
+<!--                v-for="item in optionsListTwo"-->
+<!--                :key="item.code"-->
+<!--                :label="item.name"-->
+<!--                :value="item.code">-->
+<!--              </el-option>-->
+<!--            </el-select>-->
+<!--          </el-form-item>-->
+          <el-form-item>
+            <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="loading" border :data="tableList">
+          <el-table-column label="名称" align="center" prop="nickName" show-overflow-tooltip/>
+          <el-table-column label="类别" align="center" prop="userType" show-overflow-tooltip/>
+          <el-table-column label="门禁" align="center" prop="hardName" show-overflow-tooltip/>
+          <el-table-column label="实验室" align="center" prop="subName" show-overflow-tooltip/>
+          <el-table-column label="实验室所属学院" align="center" prop="deptName" show-overflow-tooltip/>
+          <el-table-column label="实验室位置" align="center" prop="posi"  width="160px" show-overflow-tooltip/>
+          <el-table-column label="操作内容" align="center" prop="remark"  width="160px" show-overflow-tooltip/>
+          <el-table-column label="操作时间" align="center" prop="createTime"  width="160px" show-overflow-tooltip/>
+          <el-table-column label="操作人" align="center" prop="createBy"  width="160px" show-overflow-tooltip/>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParamsData.pageNum"
+                    :limit.sync="queryParamsData.pageSize"
+                    @pagination="getList"/>
+      </div>
+    </div>
+    <addPage v-if="pageType == 2"></addPage>
+  </div>
+</template>
+
+<script>
+import { applyList, entranceUserLogList } from '@/api/laboratory/subject'
+  import addPage from "./addPage.vue";
+  export default {
+    name: "application",
+    components: {
+      addPage
+    },
+    data(){
+      return{
+        pageType:1,
+        // table操作按钮校验
+        tableButtonType:this.hasPermiDom(['system:user_student:query','system:user_student:query']),
+        loading:false,
+        // 搜索数据
+        queryParamsData:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:'',
+          operate:'',
+        },
+        // 搜索实际发送数据
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+        },
+        dateRange:[],
+        //数据数量
+        total:10,
+        tableList:[],
+        //审批状态
+        optionsListTwo:[{code:null,name:'全部'},{code:0,name:'离线'},{code:2,name:'在线'}],
+      }
+    },
+    created() {
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      titleClick(type){
+        this.$parent.titleClick(type);
+      },
+      //页面状态切换
+      goPageButton(type){
+        if(type == 1){
+          this.pageType = 1;
+        }else if(type == 2){
+          this.pageType = 2;
+        }else if(type == 3){
+          this.resetQuery();
+          this.pageType = 1;
+        }
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParamsData.pageNum = 1;
+        this.queryParamsData.pageSize = 20;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParamsData',{});
+        this.$set(this,'dateRange',[]);
+        this.handleQuery();
+      },
+      //获取数据列表
+      getList(){
+        if(this.dateRange&&this.dateRange.length>0) {
+          this.queryParamsData.startTime = this.dateRange[0];
+          this.queryParamsData.endTime = this.dateRange[1];
+        } else {
+          this.queryParamsData.startTime = null;
+          this.queryParamsData.endTime = null;
+        }
+        entranceUserLogList(this.queryParamsData).then(response => {
+          this.tableList = response.rows;
+          this.total = response.total
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .application{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .application-page{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      .title-box{
+        display: flex;
+        border-bottom:1px solid #E0E0E0;
+        margin-bottom:20px;
+        div{
+          height:80px;
+          margin-right:20px;
+          cursor: pointer;
+          p:nth-child(1){
+            font-size:18px;
+            text-align: center;
+            padding:0 20px;
+            margin-top:26px;
+          }
+          p:nth-child(2){
+            width:40px;
+            height:4px;
+            border-radius:40px;
+            margin:12px auto;
+          }
+          .top-p-color{
+            color: #0045AF;
+          }
+          .bottom-p-color{
+            background: #0045AF;
+          }
+        }
+        .buttonTitleColorA{
+          color:#0045AF;
+        }
+        .buttonTitleColorB{
+          color:#999999;
+        }
+      }
+      .application-min{
+        flex:1;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        margin:0 20px!important;
+        .button-box{
+          display: flex;
+        }
+      }
+    }
+  }
+
+</style>

+ 380 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizaErrorDetail.vue

@@ -0,0 +1,380 @@
+<!--供应商管理-->
+<template>
+  <div class="supplier">
+    <div class="supplier-title">
+      <P>实验室名称-授权失败详情 </P>
+      <p class="button-p reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="supplier-page">
+      <el-form :model="queryParams" ref="queryForm" style="margin-top:20px;" :inline="true" label-width="120">
+        <el-form-item label="关键字" prop="name">
+          <el-input
+            v-model="queryParams.searchValue"
+            placeholder="请输入姓名/工号/学号"
+            clearable
+            maxLength="30"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="类别" prop="zgType" label-width="80px">
+          <el-select v-model="queryParams.userType" placeholder="请选择" clearable size="small">
+            <el-option label="学生" value="22" />
+            <el-option label="教师" value="11" />
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <p class="inquire-button-one" @click="handleQuery">查询</p>
+          <p class="reset-button-one" @click="resetQuery">重置</p>
+        </el-form-item>
+        <el-form-item label="" prop="title" style="float: right">
+          <p class="inquire-button-one"
+             style="width: 120px;margin-left: 10px;"
+             v-if="!admittance"
+             @click="handleClick('','','addStudent')"
+          >批量重试</p>
+        </el-form-item>
+      </el-form>
+      <el-table border v-loading="loading" :data="tableData" :row-key="getRowKeys"  highlight-current-row @selection-change="handleSelectionChange" >
+        <el-table-column type="selection"  width="55" :reserve-selection="true" align="center"></el-table-column>
+        <el-table-column label="所属单位" align="left" prop="deptName"/>
+        <el-table-column label="姓名" align="left" prop="nickName"></el-table-column>
+        <el-table-column label="验证方式" align="left" prop="verifyMode"></el-table-column>
+        <el-table-column label="类别" align="left" prop="userType"></el-table-column>
+        <el-table-column label="授权时间" align="left" prop="verifyTime"></el-table-column>
+        <el-table-column label="授权人" align="left" prop="verifyUser"></el-table-column>
+        <el-table-column label="状态" align="left" prop="verifyUser"></el-table-column>
+        <el-table-column label="失效时间" align="left" prop="invalidTime" width="250">
+          <template slot-scope="scope">
+            <el-date-picker
+              :disabled="(scope.row.userType=='学生' && admittance) || (scope.row.userType=='教师' && whiteList)"
+              :picker-options="pickerOptions0"
+              v-model="scope.row.invalidTime"
+              value-format="yyyy-MM-dd"
+              type="date"
+              placeholder="请选择失效时间">
+            </el-date-picker>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="120">
+          <template slot-scope="scope">
+            <div class="button-box">
+              <p class="table-min-button"
+                 v-if="(scope.row.userType=='学生' && !admittance) || (scope.row.userType=='教师' && !whiteList)"
+                 @click="handleClick('',scope.row,'delete')"
+              >删除</p>
+              <p class="table-min-button"  style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')">手动<i style="color: #0045AF;cursor: pointer;font-style: normal;text-decoration:underline">重试</i></p>
+              <p class="table-min-button"  style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')"  v-if="scope.row.userType=='学生' && admittance">安全准入<i style="color: #0045AF;cursor: pointer;font-style: normal;text-decoration:underline">重试</i></p>
+              <p class="table-min-button"  style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')" v-if="scope.row.userType=='教师' && whiteList">白名单<i style="color: #0045AF;cursor: pointer;font-style: normal;text-decoration:underline">重试</i></p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="display: flex;height:32px;margin-top:15px;">
+        <div style="flex:5;">
+          <pagination :page-sizes="[20, 30, 40, 50]"
+                      v-show="total>0"
+                      :total="total"
+                      style="margin:0;"
+                      :page.sync="queryParams.pageNum"
+                      :limit.sync="queryParams.pageSize"
+                      @pagination="getList"
+          />
+        </div>
+      </div>
+      <div style="text-align: center;">
+        <el-button class="color_ff back_one" style="width: 300px;" @click="loseTimeSubmitForm()">确定</el-button>
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  AddImpowerHaikang,
+  delUserHaikang,
+  editImpowerHaikang,
+  getHaikangUserList
+} from '@/api/laboratory/subject'
+
+export default {
+  name: "Approval",
+  components: {
+
+  },
+  props:{
+    pageData:{},
+  },
+  data() {
+    return {
+      loading:false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize:20,
+        searchValue:'',
+        userType:'',
+        hardId:'',
+      },
+      total:0,
+      tableData:[{}],
+      dateRange:[],
+      labWhiteJoinSubList:[],
+      userType:1,//判断是学生 1 教职工2
+      //提交
+      form:{},
+      // 设置只能选择当前日期及之后的日期
+      pickerOptions0: {
+        disabledDate(time) {
+          return time.getTime() < Date.now();//如果没有后面的-8.64e7就是不可以选择今天的
+        }
+      },
+      admittance:false,//智能门禁有没有勾选安全准入
+      whiteList:false,//智能门禁有没有勾选白名单
+    };
+
+
+  },
+  methods: {
+      getRowKeys(row) {
+        return row.userId;   //指定row-key的一个标识
+      },
+      //监听关联记录弹窗关闭
+      handleClose(){
+        console.log('弹窗关闭');
+        this.$refs.multipleTable.clearSelection();
+      },
+      //取消选中
+      toggleSelection(rows) {
+        let _this=this;
+        if (rows) {
+          rows.forEach(row => {
+            this.$refs.multipleTable.toggleRowSelection(row,true);
+          });
+
+        } else {
+          this.$refs.multipleTable.clearSelection();
+        }
+      },
+      //选中实验室
+      handleSelectionChange(val){
+        let _this=this;
+        this.labWhiteJoinSubList=[];
+        this.labWhiteJoinSubList=val;
+
+      },
+
+      handleClick(index,row,doType){
+        let _this=this;
+        if(doType=='delete'){//新增学生授权
+          this.$confirm('是否确认删除['+row.nickName+']门禁授权?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            delUserHaikang(row.id).then( response => {
+              _this.msgSuccess("删除成功");
+              _this.getList();
+            });
+          }).then(() => {
+            _this.getList();
+
+          }).catch(() => {});
+        }else if(doType=='again'){
+
+        }
+      },
+      /** 弹框搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 弹框重置按钮操作 */
+      resetQuery() {
+        this.queryParams.searchValue = "";
+        this.queryParams.userType = "";
+        this.handleQuery();
+      },
+      //返回
+      backPage(){
+        this.$parent.handleClick('','','back');
+        this.$parent.getList();
+      },
+      getList(){
+        let _this=this;
+        getHaikangUserList(_this.queryParams).then( response => {
+          let res=response.rows;
+         // _this.tableData=res;
+          _this.total=response.total;
+        });
+      },
+    //失效时间修改后提交
+      loseTimeSubmitForm(){
+        let _this=this;
+        let arr=[];
+        _this.tableData.forEach(function(item2) {
+          arr.push({'invalidTime':item2.invalidTime,'userId':item2.userId,'verifyMode':item2.verifyMode,id:item2.id})
+        })
+        _this.form.detailList=arr;
+        setTimeout(function () {
+          editImpowerHaikang(_this.form).then(response => {
+            if(response.code==200){
+              _this.msgSuccess("修改成功");
+              _this.getList();
+            }
+          });
+        },100)
+      },
+      /* 新增授权*/
+      submitForm(){
+        let _this=this;
+        let arr=[];
+        if(this.labWhiteJoinSubList.length>0){
+          this.labWhiteJoinSubList.forEach(function(item){
+            arr.push({'invalidTime':item.invalidTime,'userId':item.userId,'verifyMode':item.verifyMode})
+          })
+          _this.form.detailList=arr;
+          setTimeout(function () {
+            AddImpowerHaikang(_this.form).then(response => {
+              if(response.code==200){
+                setTimeout(function () {
+                  _this.msgSuccess("新增成功");
+                  _this.dialogVisible=false;
+                  _this.getList();
+                },1000)
+              }
+            });
+          },100)
+        }else{
+          this.msgError("请先选择人员!");
+        }
+
+
+
+      },
+  },
+  mounted() {
+    this.queryParams.hardId=this.pageData.hardId;
+    this.form.hardId=this.pageData.hardId;
+    this.admittance=this.pageData.controlScope.search("1") != -1
+    this.whiteList=this.pageData.controlScope.search("2") != -1
+    console.log('安全准入'+this.admittance)
+    console.log('白名单'+this.whiteList)
+    this.getList()
+  }
+};
+</script>
+
+<style lang="scss">
+.supplier{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+  /*顶部*/
+  .supplier-title{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    border-bottom: 1px solid #E0E0E0;
+    height: 90px;
+    p:nth-child(1){
+      line-height:60px;
+      color: #0045AF;
+      font-size:14px;
+      margin:0 12px 0 20px;
+    }
+    p:nth-child(2){
+      margin-right:20px;
+    }
+  }
+  .supplier-page{
+    flex:1;
+    display: flex!important;
+    flex-direction: column;
+   // box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    padding:20px 20px 20px!important;
+    border-radius:10px;
+  }
+  /*弹框*/
+  .btn_list{
+    width: 100%;
+    height: 40px;
+    background: rgba(1,131,250,0.1);
+    border-radius: 6px;
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    margin-bottom: 32px;
+    >i{
+      font-style: normal;
+      display: inline-block;
+      cursor: pointer;
+    }
+    >i:nth-of-type(1){
+      font-size: 20px;
+      color: #0045AF;
+      margin: 0 16px 0 14px;
+    }
+    >i:nth-of-type(2){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #999999;
+      line-height: 16px;
+    }
+    >i:nth-of-type(3){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+      margin: 0 28px 0 46px;
+    }
+    >i:nth-of-type(4){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+    }
+    >i:nth-of-type(5){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #FFA312;
+      line-height: 16px;
+      margin: 0 40px 0 28px;
+    }
+    .bottom-button-box{
+      display: flex;
+      width:220px;
+      margin: 0;
+      p{
+        font-size:14px;
+        height:30px;
+        width:100px;
+        line-height:30px;
+        text-align: center;
+        border-radius:4px;
+      }
+      p:nth-child(1){
+        border:1px solid #E0E0E0;
+        margin-right:20px;
+      }
+      p:nth-child(2){
+        border:1px solid #0045AF;
+      }
+    }
+  }
+  .configuration{
+    height: 70px;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    border-top: 1px solid #D8D8D8;
+    .el-form-item{
+      margin-bottom: 0!important;
+    }
+  }
+}
+</style>

+ 218 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizaErrorKDNH.vue

@@ -0,0 +1,218 @@
+<!--授权失败-->
+<template>
+  <div class="authorize">
+    <div class="authorize-page" v-if="pageType == 1">
+      <div class="title-box">
+        <div @click="titleClick(1)">
+          <p>门禁授权</p>
+          <p></p>
+        </div>
+        <div @click="titleClick(2)">
+          <p>授权失败</p>
+          <p class="bottom-p-color"></p>
+        </div>
+        <div @click="titleClick(3)">
+          <p>授权日志</p>
+          <p></p>
+        </div>
+      </div>
+      <div class="authorize-min">
+        <el-form :model="queryParamsData" ref="queryForm" :inline="true">
+          <el-form-item label="关键字" prop="searchValue" label-width="68px">
+            <el-input
+              maxlength="20"
+              v-model="queryParamsData.searchValue"
+              placeholder="姓名/实验室"
+              clearable
+              size="small"/>
+          </el-form-item>
+          <el-form-item label="状态" prop="status" label-width="50px">
+            <el-select v-model="queryParamsData.operate" clearable placeholder="请选择状态">
+              <el-option
+                v-for="item in optionsListTwo"
+                :key="item.code"
+                :label="item.name"
+                :value="item.code">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="loading" border :data="tableList">
+          <el-table-column label="所属学院" align="left" prop="deptName" />
+          <el-table-column label="实验室" align="left" prop="subName" />
+          <el-table-column label="位置" align="left" prop="posi"  />
+          <el-table-column label="实验室负责人" align="left" prop="adminName" />
+          <el-table-column label="门禁" align="left" prop="hardName" />
+          <el-table-column label="授权人数" align="left" prop="available"  />
+          <el-table-column label="状态" align="left" prop="operate" >
+            <template slot-scope="scope" v-if="scope.row.operate">
+              <span>{{scope.row.operate.name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="120">
+            <template slot-scope="scope">
+              <div class="button-box">
+                <p class="table-min-button"
+                   v-hasPermi="['haikang:user:list']"
+                   @click="handleClick('',scope.row,'detail')"
+                >查看</p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"/>
+      </div>
+    </div>
+    <detailPage v-if="pageType == 2" :pageData="pageData"></detailPage>
+  </div>
+</template>
+
+<script>
+import { getHaikangList } from '@/api/laboratory/subject'
+  import detailPage from "./authorizaErrorDetail";
+  export default {
+    name: "authorize",
+    components: {
+      detailPage
+    },
+    data(){
+      return{
+        pageType:1,
+        loading:false,
+        // 搜索数据
+        queryParamsData:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:'',
+          operate:'',
+        },
+        // 搜索实际发送数据
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+        },
+        //数据数量
+        total:10,
+        tableList:[{}],
+        //审批状态
+        optionsListTwo:[{code:null,name:'全部'},{code:0,name:'离线'},{code:2,name:'在线'}],
+        //详情
+        pageData:{},
+      }
+    },
+    created() {
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      handleClick(index,row,doType){
+        if(doType=='detail'){
+          this.pageType=2
+
+          this.pageData=row
+          console.log(this.pageData)
+        }else if(doType=='back'){
+          this.pageType=1
+        }
+
+      },
+      //操作接口
+      goPageButton(){
+        this.pageType = 1;
+      },
+      titleClick(type){
+        this.$parent.titleClick(type);
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParamsData.pageNum = 1;
+        this.queryParamsData.pageSize = 20;
+        this.queryParams = JSON.parse(JSON.stringify(this.queryParamsData));
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParamsData',{});
+        this.$set(this,'queryParams',{});
+        this.handleQuery();
+      },
+      //获取数据列表
+      getList(){
+        this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+        getHaikangList(this.queryParamsData).then(response => {
+          this.tableList = response.rows;
+          this.total = response.total
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .authorize{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .authorize-page{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      .title-box{
+        display: flex;
+        border-bottom:1px solid #E0E0E0;
+        margin-bottom:20px;
+        div{
+          height:80px;
+          margin-right:20px;
+          cursor: pointer;
+          p:nth-child(1){
+            font-size:18px;
+            text-align: center;
+            padding:0 20px;
+            margin-top:26px;
+          }
+          p:nth-child(2){
+            width:40px;
+            height:4px;
+            border-radius:40px;
+            margin:12px auto;
+          }
+          .top-p-color{
+            color: #0045AF;
+          }
+          .bottom-p-color{
+            background: #0045AF;
+          }
+        }
+        .buttonTitleColorA{
+          color:#0045AF;
+        }
+        .buttonTitleColorB{
+          color:#999999;
+        }
+      }
+      .authorize-min{
+        flex:1;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        margin:0 20px!important;
+        .button-box{
+          display: flex;
+        }
+      }
+    }
+  }
+</style>

+ 222 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/authorizeKDNH.vue

@@ -0,0 +1,222 @@
+<!--门禁授权-->
+<template>
+  <div class="authorize">
+    <div class="authorize-page" v-if="pageType == 1">
+      <div class="title-box">
+        <div>
+          <p class="top-p-color">门禁授权</p>
+          <p class="bottom-p-color"></p>
+        </div>
+        <div @click="titleClick(2)">
+          <p>授权日志</p>
+          <p></p>
+        </div>
+      </div>
+      <div class="authorize-min">
+        <el-form :model="queryParamsData" ref="queryForm" :inline="true">
+          <el-form-item label="关键字" prop="searchValue" label-width="68px">
+            <el-input
+              maxlength="20"
+              v-model="queryParamsData.searchValue"
+              placeholder="姓名/实验室"
+              clearable
+              size="small"/>
+          </el-form-item>
+          <el-form-item label="状态" prop="status" label-width="50px">
+            <el-select v-model="queryParamsData.operate" clearable placeholder="请选择状态">
+              <el-option
+                v-for="item in optionsListTwo"
+                :key="item.code"
+                :label="item.name"
+                :value="item.code">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="分类" prop="zgType" label-width="80px">
+            <el-select v-model="queryParamsData.leadAuditStaus" placeholder="请选择" clearable size="small">
+              <el-option label="全部" value="" />
+              <el-option label="授权验证成功" value="0" />
+              <el-option label="授权验证失败" value="1" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+        </el-form>
+        <el-table v-loading="loading" border :data="tableList">
+          <el-table-column label="所属学院" align="left" prop="deptName" />
+          <el-table-column label="实验室" align="left" prop="subName" />
+          <el-table-column label="位置" align="left" prop="posi"  />
+          <el-table-column label="实验室负责人" align="left" prop="adminName" />
+          <el-table-column label="门禁" align="left" prop="hardName" />
+          <el-table-column label="授权人数" align="left" prop="available"  />
+          <el-table-column label="验证方式失败数" align="left" prop="failNum"  />
+          <el-table-column label="状态" align="left" prop="operate" >
+            <template slot-scope="scope" v-if="scope.row.operate">
+              <span>{{scope.row.operate.name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="left" class-name="small-padding fixed-width"  width="120">
+            <template slot-scope="scope">
+              <div class="button-box">
+                <p class="table-min-button"
+                   v-hasPermi="['haikang:user:list']"
+                   @click="handleClick('',scope.row,'detail')"
+                >查看授权</p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.pageNum"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"/>
+      </div>
+    </div>
+    <lookImpower v-if="pageType == 2" :pageData="pageData"></lookImpower>
+  </div>
+</template>
+
+<script>
+import { getHaikangList } from '@/api/laboratory/subject'
+  import lookImpower from "./lookImpower.vue";
+  export default {
+    name: "authorize",
+    components: {
+      lookImpower
+    },
+    data(){
+      return{
+        pageType:1,
+        loading:false,
+        // 搜索数据
+        queryParamsData:{
+          pageNum:1,
+          pageSize:20,
+          searchValue:'',
+          operate:'',
+        },
+        // 搜索实际发送数据
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+        },
+        //数据数量
+        total:10,
+        tableList:[{}],
+        //审批状态
+        optionsListTwo:[{code:null,name:'全部'},{code:0,name:'离线'},{code:2,name:'在线'}],
+        //详情
+        pageData:{},
+      }
+    },
+    created() {
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      handleClick(index,row,doType){
+        if(doType=='detail'){
+          this.pageType=2
+
+          this.pageData=row
+          console.log(this.pageData)
+        }else if(doType=='back'){
+          this.pageType=1
+        }
+
+      },
+      //操作接口
+      goPageButton(){
+        this.pageType = 1;
+      },
+      titleClick(type){
+        this.$parent.titleClick(type);
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParamsData.pageNum = 1;
+        this.queryParamsData.pageSize = 20;
+        this.queryParams = JSON.parse(JSON.stringify(this.queryParamsData));
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParamsData',{});
+        this.$set(this,'queryParams',{});
+        this.handleQuery();
+      },
+      //获取数据列表
+      getList(){
+        this.queryParamsData = JSON.parse(JSON.stringify(this.queryParams));
+        getHaikangList(this.queryParamsData).then(response => {
+          this.tableList = response.rows;
+          this.total = response.total
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .authorize{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .authorize-page{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      .title-box{
+        display: flex;
+        border-bottom:1px solid #E0E0E0;
+        margin-bottom:20px;
+        div{
+          height:80px;
+          margin-right:20px;
+          cursor: pointer;
+          p:nth-child(1){
+            font-size:18px;
+            text-align: center;
+            padding:0 20px;
+            margin-top:26px;
+          }
+          p:nth-child(2){
+            width:40px;
+            height:4px;
+            border-radius:40px;
+            margin:12px auto;
+          }
+          .top-p-color{
+            color: #0045AF;
+          }
+          .bottom-p-color{
+            background: #0045AF;
+          }
+        }
+        .buttonTitleColorA{
+          color:#0045AF;
+        }
+        .buttonTitleColorB{
+          color:#999999;
+        }
+      }
+      .authorize-min{
+        flex:1;
+        display: flex;
+        flex-direction: column;
+        overflow: hidden;
+        margin:0 20px!important;
+        .button-box{
+          display: flex;
+        }
+      }
+    }
+  }
+</style>

+ 52 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/indexKDNH.vue

@@ -0,0 +1,52 @@
+<template>
+    <div class="app-container accessAuthorization">
+      <!--门禁授权-->
+      <authorize v-if="pageType == 1"></authorize>
+      <!--授权日志-->
+      <application v-if="pageType == 2"></application>
+    </div>
+</template>
+
+<script>
+  import authorize from "./authorizeKDNH.vue";
+  import application from "./applicationKDNH.vue";
+  export default {
+    name: "index",
+    components: {
+      authorize,
+      application,
+    },
+    data(){
+      return{
+        pageType:1,
+      }
+    },
+    created() {
+
+    },
+    mounted(){
+
+    },
+    methods:{
+      //选项卡切换
+      titleClick(type){
+        if(this.pageType != type){
+          this.pageType = type
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .accessAuthorization{
+    flex:1;
+    display: flex!important;
+    flex-direction: column;
+    overflow: hidden;
+    *{
+      margin:0;
+      font-weight:500;
+    }
+  }
+</style>

+ 894 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/lookImpower.vue

@@ -0,0 +1,894 @@
+<!--供应商管理-->
+<template>
+  <div class="supplier">
+    <div class="supplier-title">
+      <P>实验室名称-已授权列表 </P>
+      <p class="button-p reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="supplier-page">
+      <advanced-search :searchData="searchData"></advanced-search>
+        <el-table  v-loading="loading"  ref="multipleTable2"  border tooltip-effect="dark" :row-key="getRowKeys2" :data="tableData"
+                  highlight-current-row @selection-change="handleSelectionChange2">
+          <el-table-column type="selection"  width="55" :reserve-selection="true" align="center"></el-table-column>
+        <el-table-column label="所属单位" align="left" prop="deptName"/>
+        <el-table-column label="姓名" align="left" prop="nickName"></el-table-column>
+        <el-table-column  align="left" prop="verifyMode">
+          <template slot-scope="scope" slot="header">
+            <span>验证方式
+              <el-tooltip class="item" effect="dark" placement="top-start">
+                <i class= 'el-icon-question' style="color:#E6A23C; margin-left:5px;font-size: 16px;'"></i>
+                <div style="width: 200px;" slot="content">红色:表示此验证方式失败<br/>绿色表示此验证方式成功</div>
+              </el-tooltip>
+            </span>
+          </template>
+          <template slot-scope="scope">
+              <span  v-for="item in scope.row.verifyList" :class="item.verifyStatus?'verify-green':'verify-red'">{{item.name}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="授权状态" align="left" prop="isretry">
+          <template slot-scope="scope">
+            <span v-if="scope.row.impowerStatus">成功</span>
+            <span v-if="!scope.row.impowerStatus">失败</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="类别" align="left" prop="userType"></el-table-column>
+        <el-table-column label="授权时间" align="left" prop="verifyTime"></el-table-column>
+        <el-table-column label="授权人" align="left" prop="verifyUser"></el-table-column>
+        <el-table-column label="失效时间" align="left" prop="invalidTime" width="250">
+          <template slot-scope="scope">
+            <el-date-picker
+              :disabled="(scope.row.userType=='学生' && admittance) || (scope.row.userType=='教师' && whiteList)"
+              :picker-options="pickerOptions0"
+              v-model="scope.row.invalidTime"
+              value-format="yyyy-MM-dd"
+              type="date"
+              placeholder="请选择失效时间">
+            </el-date-picker>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="220">
+          <template slot-scope="scope">
+            <div class="button-box" style="display: flex;justify-content: flex-start;">
+              <p class="table-min-button" v-if="(scope.row.userType=='学生' && !admittance && !scope.row.isretry) || (scope.row.userType=='教师' && !whiteList) && !scope.row.isretry" style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')">手动<i style="color: #0183FA;cursor: pointer;font-style: normal;text-decoration:underline" @click="handleClick('',scope.row,'retry')">重试</i></p>
+              <p class="table-min-button" v-if="scope.row.userType=='学生' && admittance"  style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')"  >安全准入<i style="color: #0183FA;cursor: pointer;font-style: normal;text-decoration:underline" @click="handleClick('',scope.row,'retry')" v-if="!scope.row.isretry">重试</i></p>
+              <p class="table-min-button" v-if="scope.row.userType=='教师' && whiteList" style="color: #333;cursor: text" @click="handleClick('',scope.row,'again')" >白名单<i style="color: #0183FA;cursor: pointer;font-style: normal;text-decoration:underline" @click="handleClick('',scope.row,'retry')" v-if="!scope.row.isretry">重试</i></p>
+              <p class="table-min-button" v-if="(scope.row.userType=='学生' && !admittance) || (scope.row.userType=='教师' && !whiteList)"@click="handleClick('',scope.row,'delete')">删除</p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="display: flex;height:32px;margin-top:15px;">
+        <div style="flex:5;">
+          <pagination :page-sizes="[20, 30, 40, 50]"
+                      v-show="total>0"
+                      :total="total"
+                      style="margin:0;"
+                      :page.sync="queryParams.pageNum"
+                      :limit.sync="queryParams.pageSize"
+                      @pagination="getList"
+          />
+        </div>
+      </div>
+      <div style="text-align: center;">
+        <el-button class="color_ff back_one" style="width: 300px;" @click="loseTimeSubmitForm()">确定</el-button>
+      </div>
+
+    </div>
+    <!--关联实验室弹框-->
+    <el-dialog :title=dialogTitle @close="handleClose" :visible.sync="dialogVisible" width="80%">
+      <el-form :model="dialogForm" ref="dialogForm" :inline="true" label-width="140px">
+        <el-form-item label="关键字" prop="name" >
+          <el-input
+            v-model="dialogForm.searchValue"
+            placeholder="请输入名称/联系方式"
+            clearable
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="所属单位" prop="deptId" label-width="80px">
+          <el-select v-model="dialogForm.deptId" clearable placeholder="请选择学院">
+            <el-option
+              v-for="item in collegeOptions"
+              :key="item.deptId"
+              :label="item.deptName"
+              :value="item.deptId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <p class="inquire-button-one" style="margin-left:20px;" @click="onSearch">查询</p>
+          <p class="reset-button-one" style="margin-left:20px;" @click="resetForm">重置</p>
+        </el-form-item>
+      </el-form>
+      <div class="btn_list">
+        <i class="el-icon-warning"></i>
+        <i>已选择 {{labWhiteJoinSubList.length}} 项目</i>
+        <i @click="toggleSelection(dialogTable)">全选本页</i>
+        <i></i>
+        <i @click="toggleSelection()">清除选项</i>
+      </div>
+      <el-table ref="multipleTable"  border tooltip-effect="dark" :row-key="getRowKeys" :data="dialogTable"
+                highlight-current-row @selection-change="handleSelectionChange" style="cursor: pointer;height:500px;">
+        <el-table-column type="selection"  width="55" :reserve-selection="true" align="center"></el-table-column>
+        <el-table-column label="所属单位" align="left" prop="deptName"/>
+        <el-table-column label="姓名" align="left" prop="nickName" />
+        <el-table-column label="导师" align="left" prop="tutorUserName" v-if="userType==1"/>
+        <el-table-column label="专业" align="left" prop="major" v-if="userType==1"/>
+        <el-table-column label="身份" align="left" prop="positionName" v-if="userType==2"/>
+        <el-table-column label="验证方式" align="left" prop="verifyMode">
+          <template slot-scope="scope">
+            <el-select v-model="scope.row.verifyMode" @change="verifyModeFun(scope.row)" clearable >
+              <el-option
+                v-for="item in verifyWayList"
+                :key="item.key"
+                :label="item.value"
+                :value="item.key">
+              </el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="失效时间" align="left" prop="invalidTime">
+          <template slot-scope="scope">
+            <el-date-picker
+              @blur="invalidTimeFun(scope.row,$event)"
+              :picker-options="pickerOptions0"
+              v-model="scope.row.invalidTime"
+              value-format="yyyy-MM-dd"
+              type="date"
+              placeholder="请选择失效时间">
+            </el-date-picker>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination :page-sizes="[20, 30, 40, 50]"
+                  v-show="total>0"
+                  :total="total"
+                  :page.sync="dialogForm.pageNum"
+                  :limit.sync="dialogForm.pageSize"
+                  @pagination="getUserList"
+      />
+      <div class="configuration">
+        <el-form  :model="configuration" ref="queryForm" :inline="true" v-if="unifyDeploy">
+          <el-form-item label="验证方式:" prop="name">
+            <el-select v-model="configuration.verifyMode" clearable >
+              <el-option
+                v-for="item in verifyWayList"
+                :key="item.key"
+                :label="item.value"
+                :value="item.key">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="失效时间:" prop="name">
+            <el-date-picker
+              :picker-options="pickerOptions0"
+              v-model="configuration.invalidTime"
+              value-format="yyyy-MM-dd"
+              type="date"
+              placeholder="请选择失效时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-form>
+        <p :class="unifyDeploy?'add-button-one-120':'inquire-button-one'"  @click="unifyDeployFun()">{{unifyDeploy?'取消统一配置':'统一配置'}}</p>
+        <el-button class="color_ff back_one" @click="submitForm()">确定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listUser} from '@/api/permissionRequired'
+import { listDepartments } from '@/api/system/dept'
+import advancedSearch from "@/components/ZDcomponents/advancedSearch.vue"
+import {
+  AddImpowerHaikang,
+  delUserHaikang,
+  editImpowerHaikang,
+  getHaikangQueryTypes,
+  getHaikangUserList, retryImpowerHaikang
+} from '@/api/laboratory/subject'
+
+export default {
+  name: "Approval",
+
+  components: {
+    advancedSearch
+  },
+  props:{
+    pageData:{},
+  },
+  data() {
+    return {
+      loading:false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize:20,
+        searchValue:'',
+        userType:'',
+        hardId:'',
+        startTime:'',
+        endTime:'',
+      },
+      total:0,
+      tableData:[],
+      dateRange:[],
+      dialogForm:{
+        pageNum: 1,
+        pageSize: 20,
+        userType: '',
+        searchValue:'',
+        deptId:'',
+      },
+      dialogTitle:'选择学生',
+      dialogVisible:false,
+      collegeOptions:[],//学院
+      labWhiteJoinSubList:[],
+      dialogTable:[],
+      radioList:[],
+      userType:1,//判断是学生 1 教职工2
+      verifyWayList:[],
+      configuration:{
+        invalidTime:'',
+        verifyMode:'',
+      },
+      unifyDeploy:false,
+      //提交
+      form:{},
+      // 设置只能选择当前日期及之后的日期
+      pickerOptions0: {
+        disabledDate(time) {
+          return time.getTime() < Date.now();//如果没有后面的-8.64e7就是不可以选择今天的
+        }
+      },
+      impowerList:[],//授权列表选中
+      admittance:false,//智能门禁有没有勾选安全准入
+      whiteList:false,//智能门禁有没有勾选白名单
+      searchData:{
+        buttonList:[//按钮数组没有则为空
+          {
+            name:"批量重试",//按钮名称 只有再状态 1 时需要
+            type:"1", //按钮类型 1.按钮 2.导入 3.导出
+            parameter:"batchAgain",//按钮字符用于返回方法时的判断
+            hasPermi:[''], // 权限字段 如果没有则传空字符 hasPermi:"",
+            isHasPermi:false//判断是否需要使用权限字符
+          },
+        ],
+        searchList:[//搜索数组
+          {
+            name:"关键字",//描述名称
+            key:"searchValue",//键名 用于返回数据
+            value:"",//内容 用于组件内绑定数据
+            placeholder:"请输入姓名/工号/学号",//输入提示
+            level:"1",//1.普通搜索 2.高级搜索  普通搜索默认会在高级搜索时显示
+            type:"1",//类型 1.input 2.select 3.TimePicker
+            universal:'20',//通用参数 input时为最大长度 //TimePicker时可不传
+            width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
+          },
+          {
+            name:"类别",//描述名称
+            key:"userType",//键名 用于返回数据
+            value:"",//内容 用于组件内绑定数据
+            placeholder:"请选择类别",//输入提示
+            level:"1",//1.普通搜索 2.高级搜索  普通搜索默认会在高级搜索时显示
+            type:"2",//类型 1.input 2.select 3.TimePicker
+            universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
+              {label:"学生",value:"22"},{label:"教师",value:"11"},
+            ],
+            width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
+          },
+          {
+            name:"授权时间段",//描述名称
+            key:"dateRange",//键名 用于返回数据
+            value:"",//内容 用于组件内绑定数据
+            placeholder:"请选择",//输入提示
+            level:"2",//1.普通搜索 2.高级搜索  普通搜索默认会在高级搜索时显示
+            type:"3",//类型 1.input 2.select 3.TimePicker
+            width:'260',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
+          },
+          {
+            name:"分类",//描述名称
+            key:"state",//键名 用于返回数据
+            value:"",//内容 用于组件内绑定数据
+            placeholder:"请选择分类",//输入提示
+            level:"2",//1.普通搜索 2.高级搜索  普通搜索默认会在高级搜索时显示
+            type:"2",//类型 1.input 2.select 3.TimePicker
+            universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
+              {label:"全部",value:""},{label:"授权验证成功",value:true},{label:"授权验证失败",value:false},
+            ],
+            width:'175',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
+          },
+        ],
+      },
+    };
+
+
+  },
+  methods: {
+
+      //弹出层表格里验证方式改变重新赋值
+      verifyModeFun(d){
+        let _this=this;
+        this.dialogTable.forEach(function(item,index){
+          if(item.userId==d.userId){
+            _this.$set(_this.dialogTable,index,d)
+          }
+        })
+      },
+      //弹出层表格里失效时间改变重新赋值
+        invalidTimeFun(item,e){
+          this.dialogTable.splice(1,0);
+
+      },
+    //获取当前日期
+      getdate() {
+        const dates = new Date()
+        dates.setMonth(dates.getMonth() + 1)
+        var pastMonth = dates.getMonth() + 1
+        var pastDay = dates.getDate()
+        if (pastMonth >= 1 && pastMonth <= 9) {
+          pastMonth = '0' + pastMonth
+        }
+        if (pastDay >= 0 && pastDay <= 9) {
+          pastDay = '0' + pastDay
+        }
+        const endDate = dates.getFullYear() + '-' + pastMonth + '-' + pastDay
+        return endDate
+      },
+      //查询
+      onSearch() {
+        this.dialogForm.pageNo = 1;
+        this.getUserList();
+      },
+      //重置
+      resetForm() {
+        this.dialogForm.searchValue = '';
+        this.dialogForm.deptId = '';
+        this.onSearch();
+      },
+      //统一配置
+      unifyDeployFun(){
+          this.unifyDeploy=!this.unifyDeploy
+          if(this.unifyDeploy==false){
+            this.configuration.invalidTime='';
+            this.configuration.verifyMode='';
+          }
+      },
+      getRowKeys(row) {
+        return row.userId;   //指定row-key的一个标识
+      },
+      getRowKeys2(row) {
+        return row.id;   //指定row-key的一个标识
+      },
+      //监听关联记录弹窗关闭
+      handleClose(){
+        console.log('弹窗关闭');
+        this.$refs.multipleTable.clearSelection();
+        this.dialogForm.searchValue='';
+        this.dialogForm.pageNum=1;
+        this.dialogForm.deptId='';
+        this.configuration.invalidTime='';
+        this.configuration.verifyMode='';
+      },
+      //取消选中
+      toggleSelection(rows) {
+        let _this=this;
+        if (rows) {
+          rows.forEach(row => {
+            this.$refs.multipleTable.toggleRowSelection(row,true);
+          });
+
+        } else {
+          this.$refs.multipleTable.clearSelection();
+        }
+      },
+      //选中实验室
+      handleSelectionChange(val){
+        let _this=this;
+        this.labWhiteJoinSubList=[];
+        this.labWhiteJoinSubList=val;
+
+      },
+     //已授权列表
+      handleSelectionChange2(val){
+        let _this=this;
+        this.impowerList=[];
+        this.impowerList=val;
+
+      },
+
+      handleClick(index,row,doType){
+        let _this=this;
+        if(doType=='delete'){//删除
+          let _this=this
+          console.log(row)
+          this.$confirm('是否确认删除['+row.nickName+']门禁授权?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            delUserHaikang(row.id).then( response => {
+              _this.msgSuccess("删除成功");
+              _this.getList();
+            });
+          }).then(() => {
+            _this.getList();
+
+          }).catch(() => {});
+        }else if(doType=='retry'){
+          let arr=[];
+          arr.push({'id':row.id})
+          _this.retryImpowerHaikang(arr)
+        }
+      },
+      //获取学院列表
+      listDepartments(){
+        listDepartments().then(response => {
+          this.collegeOptions = response.data;
+        });
+      },
+      /** 弹框查询列表 */
+      getUserList() {//type 1学生 2教职工
+        let _this=this;
+        this.loading = true;
+        if(_this.userType==1){
+          this.dialogForm.userType=22
+          listUser(this.addDateRange(this.dialogForm, this.dateRange)).then(response => {
+              this.dialogTable = response.rows;
+              this.total = response.total;
+              this.loading = false;
+              this.dialogTable.forEach(function(item) {
+                  item.verifyMode='faceOrFpOrCardOrPw'
+                  item.invalidTime=_this.getdate()
+              })
+            }
+          );
+        }else if(_this.userType==2){
+          this.dialogForm.userType=11
+          listUser(this.addDateRange(this.dialogForm, this.dateRange)).then(response => {
+              this.dialogTable = response.rows;
+              this.total = response.total;
+              this.loading = false;
+              this.dialogTable.forEach(function(item) {
+                item.verifyMode='faceOrFpOrCardOrPw'
+                item.invalidTime=_this.getdate()
+              })
+            }
+          );
+
+        }
+      },
+      /** 查询门禁授权类型 */
+      getHaikangQueryTypes(){
+        getHaikangQueryTypes().then(response => {
+          if(response.code==200){
+            this.verifyWayList=response.data
+          }
+        });
+      },
+
+      //返回
+      backPage(){
+        this.$parent.handleClick('','','back');
+        this.$parent.getList();
+      },
+      //父组件必要此方法用于接收参数
+      searchClick(type,data){
+        let _this = this;
+        if(type == 1){ //type  1.查询
+          console.log(data);
+          this.queryParams = JSON.parse(JSON.stringify(data));
+          if(data.dateRange){
+            this.queryParams.startTime = data.dateRange[0];
+            this.queryParams.endTime = data.dateRange[1];
+            delete this.queryParams.dateRange
+          }else{
+            delete this.queryParams.dateRange
+          }
+          this.queryParams.hardId=this.pageData.hardId;
+          this.queryParams.pageNum = 1;
+          this.queryParams.pageSize = 20;
+          this.getList();
+        }else if(type == 2) { //type  1.重置
+          this.queryParams = {
+            pageNum: 1,
+            pageSize: 20,
+          };
+          this.getList();
+        }else if(type=='addStudent'){
+          _this.unifyDeploy=false;
+          _this.dialogVisible=true;
+          _this.dialogTitle='选择学生';
+          _this.userType=1;
+          this.getUserList();
+        }else if(type=='addTeacher'){
+          _this.unifyDeploy=false;
+          _this.dialogVisible=true;
+          _this.dialogTitle='选择教职工';
+          _this.userType=2;
+          this.getUserList();
+        }else if(type=='batchAgain'){
+          if(_this.impowerList.length<=0){
+            _this.msgError("请选择需要授权的数据!");
+          }else{
+            let arr=[];
+            this.impowerList.forEach(function(item){
+              arr.push({'id':item.id})
+            })
+            _this.retryImpowerHaikang(arr)
+
+          }
+
+        }
+      },
+      getList(){
+        let _this=this;
+        getHaikangUserList(_this.queryParams).then( response => {
+          let res=response.rows;
+          _this.tableData=res;
+          _this.total=response.total;
+          //先判断是或还是+,如果是或,判断有哪几种,并且判断每种显示红色还是绿色,如果是加,判断是否每个都是true,如果有一个不是那就是红色,入股都是那是绿色
+
+          _this.tableData.forEach(function(item) {
+            let verifyList=[];
+            let isVerify=true;//判断验证方式显示颜色
+            let isretry=true;//判断是否需要显示重试按钮
+            let impowerStatus=false;//授权状态
+            if(item.verifyMode.indexOf('或')!=-1){//或
+
+              if(item.verifyMode.search('密码')!=-1){
+                verifyList.push({verifyStatus:item.state,name:'密码'})
+                if(!item.state){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('人脸')!=-1){
+                verifyList.push({verifyStatus:item.ifFace,name:'人脸'})
+                if(!item.ifFace){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('刷卡')!=-1){
+                verifyList.push({verifyStatus:item.ifCard,name:'刷卡'})
+                if(!item.ifCard){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('指纹')!=-1){
+                verifyList.push({verifyStatus:item.ifFinger,name:'指纹'})
+                if(!item.ifFinger){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              item.verifyList=verifyList;
+              item.isretry=isretry;
+              item.impowerStatus=impowerStatus;
+
+            }else if(item.verifyMode.indexOf('+')!=-1){//+
+
+              if(item.verifyMode.search('密码')!=-1){
+                if(!item.state){
+                  isVerify=false;
+                  isretry=false;
+                  impowerStatus=false;
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('人脸')!=-1){
+                if(!item.ifFace){
+                  isVerify=false;
+                  isretry=false;
+                  impowerStatus=false;
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('刷卡')!=-1){
+                if(!item.ifCard){
+                  isVerify=false;
+                  isretry=false;
+                  impowerStatus=false;
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('指纹')!=-1){
+                if(!item.ifFinger){
+                  isVerify=false;
+                  isretry=false;
+                  impowerStatus=false;
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              verifyList.push({verifyStatus:isVerify,name:item.verifyMode})
+              item.verifyList=verifyList;
+              item.isretry=isretry;
+              item.impowerStatus=impowerStatus;
+            }else{//其他单个
+              if(item.verifyMode.search('密码')!=-1){
+                verifyList.push({verifyStatus:item.state,name:'密码'})
+                if(!item.state){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('人脸')!=-1){
+                verifyList.push({verifyStatus:item.ifFace,name:'人脸'})
+                if(!item.ifFace){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('刷卡')!=-1){
+                verifyList.push({verifyStatus:item.ifCard,name:'刷卡'})
+                if(!item.ifCard){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              if(item.verifyMode.search('指纹')!=-1){
+                verifyList.push({verifyStatus:item.ifFinger,name:'指纹'})
+                if(!item.ifFinger){
+                  isretry=false
+                }else{
+                  impowerStatus=true;
+                }
+              }
+              item.verifyList=verifyList;
+              item.isretry=isretry;
+              item.impowerStatus=impowerStatus;
+            }
+          })
+          console.log(_this.tableData)
+        });
+      },
+      //失效时间修改后提交
+      loseTimeSubmitForm(){
+        let _this=this;
+        let arr=[];
+        _this.tableData.forEach(function(item2) {
+          arr.push({'invalidTime':item2.invalidTime,'userId':item2.userId,'verifyMode':item2.verifyMode,id:item2.id})
+        })
+        _this.form.detailList=arr;
+        setTimeout(function () {
+          editImpowerHaikang(_this.form).then(response => {
+            if(response.code==200){
+              _this.msgSuccess("修改成功");
+              _this.getList();
+            }
+          });
+        },100)
+      },
+      //重试
+      retryImpowerHaikang(arr){
+        let _this=this;
+        _this.form.detailList=arr;
+        retryImpowerHaikang(_this.form).then(response => {
+          if(response.code==200){
+            _this.msgSuccess("重试成功");
+            _this.dialogVisible=false;
+            _this.$refs.multipleTable2.clearSelection();
+            _this.getList();
+          }else if(response.code==205){
+            _this.$confirm(response.msg, "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+              _this.dialogVisible=false;
+              _this.getList();
+            }).then(() => {
+              _this.dialogVisible=false;
+              _this.getList();
+            }).catch(() => {});
+          }
+        });
+      },
+      /* 新增授权*/
+      submitForm(){
+        let _this=this;
+        let arr=[];
+        if(this.labWhiteJoinSubList.length>0){
+          if(_this.configuration.invalidTime && _this.configuration.verifyMode){//统一配置
+            this.labWhiteJoinSubList.forEach(function(item){
+              arr.push({'invalidTime':_this.configuration.invalidTime,'userId':item.userId,'verifyMode':_this.configuration.verifyMode})
+            })
+          }else{
+            this.labWhiteJoinSubList.forEach(function(item){
+              arr.push({'invalidTime':item.invalidTime,'userId':item.userId,'verifyMode':item.verifyMode})
+            })
+          }
+          _this.form.detailList=arr;
+          AddImpowerHaikang(_this.form).then(response => {
+            if(response.code==200){
+              _this.msgSuccess("新增成功");
+              _this.dialogVisible=false;
+              _this.getList();
+            }else if(response.code==205){
+              _this.$confirm(response.msg, "警告", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+              }).then(function() {
+                _this.dialogVisible=false;
+                _this.getList();
+              }).then(() => {
+                _this.dialogVisible=false;
+                _this.getList();
+              }).catch(() => {});
+            }
+          });
+        }else{
+          this.msgError("请先选择人员!");
+        }
+
+
+
+      },
+  },
+  mounted() {
+    this.queryParams.hardId=this.pageData.hardId;
+    this.form.hardId=this.pageData.hardId;
+    this.admittance=this.pageData.controlScope.search("1") != -1
+    this.whiteList=this.pageData.controlScope.search("2") != -1
+    if(!this.admittance){//安全准入-学生授权
+      this.searchData.buttonList.unshift( {
+        name:"新增学生授权",//按钮名称 只有再状态 1 时需要
+        type:"1", //按钮类型 1.按钮 2.导入 3.导出
+        parameter:"addStudent",//按钮字符用于返回方法时的判断
+        hasPermi:[''], // 权限字段 如果没有则传空字符 hasPermi:"",
+        isHasPermi:false//判断是否需要使用权限字符
+      })
+    }
+    if(!this.whiteList){//白名单-教职工授权
+      this.searchData.buttonList.unshift({
+        name:"新增教职工授权",//按钮名称 只有再状态 1 时需要
+        type:"1", //按钮类型 1.按钮 2.导入 3.导出
+        parameter:"addTeacher",//按钮字符用于返回方法时的判断
+        hasPermi:[''], // 权限字段 如果没有则传空字符 hasPermi:"",
+        isHasPermi:false//判断是否需要使用权限字符
+      })
+    }
+    this.listDepartments();
+    this.getHaikangQueryTypes()
+    this.getList()
+  }
+};
+</script>
+
+<style lang="scss">
+.supplier{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+
+  /*顶部*/
+  .supplier-title{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    border-bottom: 1px solid #E0E0E0;
+    height: 90px;
+    p:nth-child(1){
+      line-height:60px;
+      color: #0045AF;
+      font-size:14px;
+      margin:0 12px 0 20px;
+    }
+    p:nth-child(2){
+      margin-right:20px;
+    }
+  }
+  .supplier-page{
+    flex:1;
+    display: flex!important;
+    flex-direction: column;
+   // box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    padding:20px 20px 20px!important;
+    border-radius:10px;
+  }
+  /*弹框*/
+  .btn_list{
+    width: 100%;
+    height: 40px;
+    background: rgba(1,131,250,0.1);
+    border-radius: 6px;
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    margin-bottom: 32px;
+    >i{
+      font-style: normal;
+      display: inline-block;
+      cursor: pointer;
+    }
+    >i:nth-of-type(1){
+      font-size: 20px;
+      color: #0045AF;
+      margin: 0 16px 0 14px;
+    }
+    >i:nth-of-type(2){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #999999;
+      line-height: 16px;
+    }
+    >i:nth-of-type(3){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+      margin: 0 28px 0 46px;
+    }
+    >i:nth-of-type(4){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+    }
+    >i:nth-of-type(5){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #FFA312;
+      line-height: 16px;
+      margin: 0 40px 0 28px;
+    }
+    .bottom-button-box{
+      display: flex;
+      width:220px;
+      margin: 0;
+      p{
+        font-size:14px;
+        height:30px;
+        width:100px;
+        line-height:30px;
+        text-align: center;
+        border-radius:4px;
+      }
+      p:nth-child(1){
+        border:1px solid #E0E0E0;
+        margin-right:20px;
+      }
+      p:nth-child(2){
+        border:1px solid #0045AF;
+      }
+    }
+  }
+  .configuration{
+    height: 70px;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    border-top: 1px solid #D8D8D8;
+    .el-form-item{
+      margin-bottom: 0!important;
+    }
+  }
+  /*验证方式*/
+  .verify-green{
+    color: #46D417;
+    margin-right: 10px;
+  }
+  .verify-red{
+    color: #FF0000;
+    margin-right: 10px;
+  }
+}
+</style>

+ 305 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/lookImpowerSearch.vue

@@ -0,0 +1,305 @@
+<!--
+=========================示例说明=========================
+<advanced-search :searchData="searchData"></advanced-search>
+import advancedSearch from "@/components/ZDcomponents/advancedSearch.vue"
+components: {
+  addPage,
+  advancedSearch
+},
+=========================必要参数=========================
+searchData:{
+  buttonList:[//按钮数组没有则为空
+    {
+      name:"新增",//按钮名称 只有再状态 1 时需要
+      type:"1", //按钮类型 1.按钮 2.导入 3.导出
+      parameter:"add",//按钮字符用于返回方法时的判断
+      hasPermi:['laboratory:gradeManage:add'] // 权限字段 如果没有则传空字符 hasPermi:"",
+    },
+    {
+      name:"导入",//按钮名称 只有再状态 1 时需要
+      type:"2", //按钮类型 1.按钮 2.导入 3.导出
+      parameter:"import",//按钮字符用于返回方法时的判断
+      hasPermi:['laboratory:gradeManage:import'] // 权限字段 如果没有则传空字符 hasPermi:"",
+    },
+    {
+      name:"导出",//按钮名称 只有再状态 1 时需要
+      type:"3", //按钮类型 1.按钮 2.导入 3.导出
+      parameter:"export",//按钮字符用于返回方法时的判断
+      hasPermi:['laboratory:gradeManage:export'] // 权限字段 如果没有则传空字符 hasPermi:"",
+    }
+  ],
+  searchList:[//搜索数组
+    {
+      name:"名称",//描述名称
+      key:"name",//键名 用于返回数据
+      value:"",//内容 用于组件内绑定数据
+      placeholder:"请输入名称",//输入提示
+      level:"1",//1.普通搜索 2.高级搜索  普通搜索默认会在高级搜索时显示
+      type:"1",//类型 1.input 2.select 3.TimePicker
+      universal:'10',//通用参数 input时为最大长度 //TimePicker时可不传
+      universal:[ //通用参数 select时为列表数据 //TimePicker时可不传
+        {label:"全部",value:""},{label:"开启",value:"1"},{label:"关闭",value:"0"},
+      ],
+      labelWidth:'100px',//label-width宽度  可传可不传 不传时为默认宽度
+      width:'200',//el-form-item 长度 可传可不传 不传时input/select默认180长度 TimePicker默认240长度
+    }
+  ]
+}
+=========================必要方法=========================
+//父组件必要此方法用于接收参数
+searchClick(type,data){
+  if(type == 1){ //type  1.查询
+    this.queryParams = JSON.parse(JSON.stringify(data));
+    this.queryParams.pageNum = 1;
+    this.queryParams.pageSize = 20;
+    this.getList();
+  }else if(type == 2){ //type  1.重置
+    this.queryParams = {
+      pageNum : 1,
+      pageSize:20,
+    };
+    this.getList();
+  }else if(type == 'add'){ //type  其他 自定义按钮
+    this.clickPageType(2);
+  }else if(type == 'import'){ //如果按钮类型是2或者3 这里data也会返回数据
+    console.log('data',data)
+  }else if(type == 'export'){ //如果按钮类型是2或者3 这里data也会返回数据
+    console.log('data',data)
+  }
+},
+-->
+
+<template>
+  <div class="advancedSearchMaxBigBox">
+    <el-form ref="queryForm" :inline="true" v-if="!searchState">
+      <el-form-item :label="item.name" :label-width="item.labelWidth?item.labelWidth:'px'" prop="searchValue" v-for="item in searchData.searchList" v-if="item.level == 1">
+        <el-input v-if="item.type == 1" v-model="item.value" :maxlength="item.universal" :placeholder="item.placeholder" clearable
+                  :style="item.width?'width:'+item.width+'px;':'width: 180px;'"/>
+        <el-select v-if="item.type == 2" v-model="item.value" :placeholder="item.placeholder" clearable
+                   :style="item.width?'width:'+item.width+'px;':'width: 180px;'">
+          <el-option :key="minItem.value" :label="minItem.label" :value="minItem.value" v-for="minItem in item.universal"></el-option>
+        </el-select>
+        <el-date-picker v-if="item.type == 3" v-model="item.value" :clearable="false" value-format="yyyy-MM-dd"
+                        :style="item.width?'width:'+item.width+'px;':'width: 240px;'"
+          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="buttonClick(1)">查询</p>
+        <p class="reset-button-one" @click="buttonClick(2)">重置</p>
+      </el-form-item>
+      <el-form-item>
+        <p class="advanced-button" @click="stateSwitch">高级搜索</p>
+      </el-form-item>
+      <el-form-item style="float: right" v-for="item in searchData.buttonList" >
+        <p v-if="item.type == 1" class="inquire-button-one" v-hasPermi="item.hasPermi" style="width:120px;" @click="buttonClick(item.parameter)">{{item.name}}</p>
+        <div style="float: right;" v-if="item.type == 2">
+          <el-dropdown @command="commandButton" v-hasPermi="item.hasPermi">
+            <div class="form-dropdown-box">
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_dr.png">
+              <p>导入</p>
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+            </div>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{item:item,command:1}">下载模板</el-dropdown-item>
+              <el-dropdown-item style="margin:0 10px;color:#666;" :command="{item:item,command:2}">导入数据</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+        <div style="float: right; "  v-if="item.type == 3">
+          <el-dropdown @command="commandButton" v-hasPermi="item.hasPermi">
+            <div class="form-dropdown-box">
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_sc.png">
+              <p>导出</p>
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+            </div>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{item:item,command:1}">导出全部数据</el-dropdown-item>
+              <el-dropdown-item style="margin:0 10px;color:#666;" :command="{item:item,command:2}">导出选中数据</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+      </el-form-item>
+    </el-form>
+    <el-form ref="queryForm" :inline="true" v-if="searchState">
+      <el-form-item :label="item.name" :label-width="item.labelWidth?item.labelWidth:'px'" prop="searchValue" v-for="item in searchData.searchList" >
+        <el-input v-if="item.type == 1" v-model="item.value" :maxlength="item.universal" :placeholder="item.placeholder" clearable
+                  :style="item.width?'width:'+item.width+'px;':'width: 180px;'"/>
+        <el-select v-if="item.type == 2" v-model="item.value" :placeholder="item.placeholder" clearable
+                   :style="item.width?'width:'+item.width+'px;':'width: 180px;'">
+          <el-option :key="minItem.value" :label="minItem.label" :value="minItem.value" v-for="minItem in item.universal"></el-option>
+        </el-select>
+        <el-date-picker v-if="item.type == 3" v-model="item.value" :clearable="false" value-format="yyyy-MM-dd"
+                        :style="item.width?'width:'+item.width+'px;':'width: 240px;'"
+                        type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+    </el-form>
+    <div class="advanced-max-big-box" v-if="searchState">
+      <div class="left-advanced-box"></div>
+      <div class="center-advanced-box">
+        <p class="inquire-button-one" @click="buttonClick(1)">查询</p>
+        <p class="reset-button-one" @click="buttonClick(2)">重置</p>
+      </div>
+      <div class="right-advanced-box">
+        <span class="ordinary-button" @click="stateSwitch">普通搜索</span>
+      </div>
+      <div v-for="item in searchData.buttonList">
+        <p v-if="item.type == 1" class="inquire-button-one"
+           v-hasPermi="item.hasPermi" style="width:120px;float: right;" @click="buttonClick(item.parameter)">{{item.name}}</p>
+        <div style="float: right;" v-if="item.type == 2">
+          <el-dropdown @command="commandButton" v-hasPermi="item.hasPermi">
+            <div class="form-dropdown-box">
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_dr.png">
+              <p>导入</p>
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+            </div>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{item:item,command:1}">下载模板</el-dropdown-item>
+              <el-dropdown-item style="margin:0 10px;color:#666;" :command="{item:item,command:2}">导入数据</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+        <div style="float: right; "  v-if="item.type == 3">
+          <el-dropdown @command="commandButton" v-hasPermi="item.hasPermi">
+            <div class="form-dropdown-box">
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzgxx_sc.png">
+              <p>导出</p>
+              <img src="@/assets/ZDimages/personnelManagement/icon_jzggl_xljt.png">
+            </div>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item style="border-bottom:1px solid #E0E0E0;margin:0 10px;color:#333;" :command="{item:item,command:1}">导出全部数据</el-dropdown-item>
+              <el-dropdown-item style="margin:0 10px;color:#666;" :command="{item:item,command:2}">导出选中数据</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "advancedSearch",
+    props:{
+      searchData:{}
+    },
+    data() {
+      return {
+        searchState:false,
+      }
+    },
+    created() {
+
+    },
+    mounted(){
+
+    },
+    methods: {
+      //普通/高级状态切换
+      stateSwitch(){
+        this.searchState = !this.searchState;
+      },
+      //导出/导入按钮
+      commandButton(data){
+        this.$parent.searchClick(data.item.parameter,data.command);
+      },
+      //按钮方法
+      buttonClick(type){
+        let self = this;
+        if(type == '1'){
+          //查找
+          let obj = {};
+          for(let i=0;i<self.searchData.searchList.length;i++){
+            if(self.searchState){
+              //高级搜索
+              obj[self.searchData.searchList[i].key] = self.searchData.searchList[i].value;
+            }else{
+              //普通搜索
+              if(self.searchData.searchList[i].level == '1'){
+                obj[self.searchData.searchList[i].key] = self.searchData.searchList[i].value;
+              }
+            }
+          }
+          self.$parent.searchClick(type,obj);
+        }else if(type == '2'){
+          //返回
+          for(let i=0;i<self.searchData.searchList.length;i++){
+            self.searchData.searchList[i].value = '';
+          }
+          self.$parent.searchClick(type);
+        }else{
+          self.$parent.searchClick(type);
+        }
+      },
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .advancedSearchMaxBigBox{
+    margin:0 20px;
+    .advanced-button{
+      margin:0 20px;
+      cursor: pointer;
+      line-height:40px;
+      font-weight:500;
+      font-size:14px;
+      color:#0183FA;
+    }
+    .advanced-max-big-box{
+      display: flex;
+      padding-bottom:20px;
+      padding-right:10px;
+      font-size:14px;
+      .left-advanced-box{
+        flex:1;
+      }
+      .center-advanced-box{
+
+      }
+      .right-advanced-box{
+        flex:1;
+        .ordinary-button{
+          margin:0 20px;
+          cursor: pointer;
+          line-height:40px;
+          font-weight:500;
+          font-size:14px;
+          color:#0183FA;
+        }
+      }
+    }
+    .form-dropdown-box{
+      display: flex;
+      margin:0;
+      padding:0 10px;
+      cursor: pointer;
+      height:40px;
+      img:nth-child(1){
+        width:16px;
+        height:16px;
+        margin-top:12px;
+      }
+      p{
+        width:47px;
+        text-align: center;
+        font-size:14px;
+        margin:0;
+        line-height:40px;
+      }
+      img:nth-child(3){
+        width:10px;
+        height:6px;
+        margin-top:17px;
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  .advancedSearchMaxBigBox{
+    .el-range-editor--medium.el-input__inner{
+      height:40px;
+    }
+  }
+</style>

+ 997 - 0
src/views/comprehensive/laboratoryManagement/subject/deviceListKDNH.vue

@@ -0,0 +1,997 @@
+<!--物联设备配置-->
+<template>
+  <div class="deviceList scrollbar-box">
+    <div class="title-box">
+      <p class="left-title">传感器</p>
+      <p class="right-button reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="for-max-box">
+      <div class="for-big-box" v-for="(item,index) in listCgq" :key="index">
+        <p class="for-title-p">{{subjectData.room}}-{{item.type.name}}传感器{{index+1}}</p>
+        <div class="for-text-box">
+          <p>网关编号:</p>
+          <el-tooltip class="item" effect="dark" :content="item.gatewayId" placement="top">
+            <p>{{item.gatewayId}}</p>
+          </el-tooltip>
+        </div>
+        <div class="for-button-box">
+          <p @click="editData(5,item)"><i class="el-icon-edit-outline"></i>编辑</p>
+          <p></p>
+          <p @click="delSensor(item)"><i class="el-icon-delete"></i>删除</p>
+        </div>
+      </div>
+      <p class="add-for-p" @click="addData(1)"><i class="el-icon-plus"></i>添加传感器</p>
+    </div>
+    <div class="title-box">
+      <p class="left-title">智能门禁</p>
+    </div>
+    <div class="for-max-box">
+      <div class="for-big-box" v-for="(item,index) in listHK" :key="index" style="width: 350px">
+        <p class="for-title-p">{{item.type.name}}-{{item.name}}</p>
+        <div class="for-text-box">
+          <p>门禁编号:</p>
+          <el-tooltip class="item" effect="dark" :content="item.hardwareNum" placement="top">
+            <p>{{item.hardwareNum}}</p>
+          </el-tooltip>
+        </div>
+        <div class="for-text-box">
+          <p>门禁授权:</p>
+          <el-checkbox-group v-model="item.controlScope==null?[]:item.controlScope.split(',')" style="margin-top: 6px" disabled>
+            <el-checkbox label="1" style="margin-right: 8px">关联安全准入</el-checkbox>
+            <el-checkbox label="2">关联白名单</el-checkbox>
+          </el-checkbox-group>
+        </div>
+        <div class="for-button-box">
+          <p @click="editData('editEntrance',item)"><i class="el-icon-edit-outline"></i>编辑</p>
+          <p></p>
+          <p @click="delEntrance(item)"><i class="el-icon-delete"></i>删除</p>
+        </div>
+      </div>
+      <p class="add-for-p" @click="addData('addEntrance')" style="width: 350px;height: 158px;" v-if="listHK.length<3"><i class="el-icon-plus"></i>添加智能门禁</p>
+    </div>
+    <div class="title-box">
+      <p class="left-title">一体机</p>
+    </div>
+    <div class="for-max-box">
+      <div class="for-big-box" v-for="(item,index) in listYtj" :key="index">
+        <p class="for-title-p">{{subjectData.room}}-{{item.type.name}}{{index+1}}</p>
+        <div class="for-text-box">
+          <p>一体机编号:</p>
+          <el-tooltip class="item" effect="dark" :content="item.hardwareNum" placement="top">
+            <p>{{item.hardwareNum}}</p>
+          </el-tooltip>
+        </div>
+        <div class="for-button-box">
+          <p @click="editData(6,item)"><i class="el-icon-edit-outline"></i>编辑</p>
+          <p></p>
+          <p @click="delHardware(item)"><i class="el-icon-delete"></i>删除</p>
+        </div>
+      </div>
+      <p class="add-for-p" @click="addData(2)"><i class="el-icon-plus"></i>添加一体机</p>
+    </div>
+    <div class="title-box">
+      <p class="left-title">控制设备</p>
+    </div>
+    <div class="for-max-box">
+      <div class="for-big-box-two" v-for="(item,index) in listkzsb" :key="index">
+        <p class="for-title-p">{{subjectData.room}}-{{item.type.name}}传感器{{index+1}}</p>
+        <div class="for-text-box">
+          <p>设备编号:</p>
+          <el-tooltip class="item" effect="dark" :content="item.relayCode" placement="top">
+            <p>{{item.relayCode}}</p>
+          </el-tooltip>
+        </div>
+        <div class="for-text-box">
+          <p>设备路由:</p>
+          <p>{{item.bit}}</p>
+        </div>
+        <div class="for-button-box">
+          <p @click="editData(7,item)"><i class="el-icon-edit-outline"></i>编辑</p>
+          <p></p>
+          <p @click="delHardwareTwo(item)"><i class="el-icon-delete"></i>删除</p>
+        </div>
+      </div>
+      <p class="add-for-p-two" @click="addData(3)"><i class="el-icon-plus"></i>添加控制设备</p>
+    </div>
+    <div class="title-box">
+      <p class="left-title">摄像头</p>
+    </div>
+    <div class="for-max-box">
+      <div class="for-big-box" v-for="(item,index) in listSpjk" :key="index">
+        <p class="for-title-p">{{subjectData.room}}-{{item.type.name}}{{index+1}}</p>
+        <div class="for-text-box">
+          <p>摄像头编号:</p>
+          <p></p>
+        </div>
+        <div class="for-text-box">
+          <p></p>
+          <el-tooltip class="item" effect="dark" :content="item.hardwareNum" placement="top">
+            <p>{{item.hardwareNum}}</p>
+          </el-tooltip>
+        </div>
+        <div class="for-button-box">
+          <p @click="editData(8,item)"><i class="el-icon-edit-outline"></i>编辑</p>
+          <p></p>
+          <p @click="delHardwareThree(item)"><i class="el-icon-delete"></i>删除</p>
+        </div>
+      </div>
+      <p class="add-for-p-two" @click="addData(4)"><i class="el-icon-plus"></i>添加摄像头</p>
+    </div>
+    <el-dialog :title="title" :visible.sync="addType" v-if="addType" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+        <div v-if="upType == 1 || upType == 5">
+          <el-form-item label="传感器类型" prop="type">
+            <el-select v-model="form.type" placeholder="请选择传感器类型" style="width:320px;">
+              <el-option
+                v-for="item in sensorAddOptions"
+                :key="item.enumName"
+                :label="item.name"
+                :value="item.enumName">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="网关编号" prop="gatewayId">
+            <el-input v-model="form.gatewayId" placeholder="请输入网关编号"
+                      maxlength="30" style="width:320px;"/>
+          </el-form-item>
+          <el-form-item label="路由" prop="routeNum">
+            <el-input v-model="form.routeNum" oninput="value=value.replace(/[^0-9.]/g,'')" maxlength="2" placeholder="请输入路由" style="width:320px;"></el-input>
+          </el-form-item>
+          <el-form-item label="传感器参数" prop="configName">
+            <el-input v-model="form.configName"  placeholder="请输入传感器参数"
+                      maxlength="30" style="width:320px;"></el-input>
+          </el-form-item>
+          <el-form-item label="状态参数" prop="configStatus">
+            <el-input v-model="form.configStatus"  placeholder="请输入状态参数"
+                      maxlength="30" style="width:320px;"></el-input>
+          </el-form-item>
+        </div>
+        <div v-if="upType == 2 || upType == 6">
+          <el-form-item label="一体机名称" prop="name">
+            <el-input
+              style="width:320px;"
+              v-model="form.name"
+              placeholder="请输入一体机名称"
+              maxlength="8"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="一体机类型" prop="pcType">
+            <el-select v-model="form.pcType" placeholder="请选择一体机类型" style="width:320px;">
+              <el-option label="管控一体机" value="0" />
+              <el-option label="学习一体机" value="1" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="一体机编号" prop="hardwareNum">
+            <el-input
+              style="width:320px;"
+              v-model="form.hardwareNum"
+              placeholder="请输入一体机编号"
+              maxlength="30"
+              size="small"
+            />
+          </el-form-item>
+        </div>
+        <div v-if="upType == 3 || upType == 7">
+          <el-form-item label="设备类型" prop="type">
+            <el-select v-model="form.type" placeholder="请选择设备类型" style="width:320px;" :disabled="disabledType">
+              <el-option key="1" label="电源开关" value="1"></el-option>
+              <el-option key="2" label="智能通风" value="2"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="设备版本" prop="hardwareType">
+            <el-radio-group v-model="form.hardwareType">
+              <el-radio :label="1">老继电器</el-radio>
+              <el-radio :label="2">新继电器</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="设备编号" prop="relayCode">
+            <el-input v-model="form.relayCode" placeholder="请输入设备编号"
+                      maxlength="30" style="width:320px;"/>
+          </el-form-item>
+          <el-form-item label="设备路由" prop="bit">
+            <el-input v-model="form.bit" oninput="value=value.replace(/[^0-9.]/g,'')" maxlength="2" placeholder="请输入路由" style="width:320px;"></el-input>
+          </el-form-item>
+          <el-form-item label="设备参数" prop="configName" v-if="form.hardwareType == 2">
+            <el-input v-model="form.configName" maxlength="30" placeholder="请输入设备参数" style="width:320px;"></el-input>
+          </el-form-item>
+          <el-form-item label="参数状态" prop="configStatus" v-if="form.hardwareType == 2">
+            <el-input v-model="form.configStatus" maxlength="30" placeholder="请输入参数状态" style="width:320px;"></el-input>
+          </el-form-item>
+        </div>
+        <div v-if="upType == 4 || upType == 8">
+          <el-form-item label="摄像头编号" prop="hardwareNum">
+            <el-input v-model="form.hardwareNum" placeholder="摄像头编号"
+                      maxlength="30" style="width:320px;"/>
+          </el-form-item>
+        </div>
+        <div v-if="upType == 'addEntrance'||  upType=='editEntrance'">
+          <el-form-item label="门禁编号" prop="hardwareNum">
+            <el-input
+              style="width:320px;"
+              v-model="form.hardwareNum"
+              placeholder="请输入门禁编号"
+              maxlength="20"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="门禁名称" prop="name" >
+            <el-input
+              style="width:320px;"
+              v-model="form.name"
+              placeholder="请输入门禁名称"
+              maxlength="8"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="IP" prop="ipAddress" >
+            <el-input
+              style="width:320px;"
+              v-model="form.ipAddress"
+              placeholder="请输入IP"
+              maxlength="15"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="端口" prop="port" >
+            <el-input
+              style="width:320px;"
+              v-model="form.port"
+              placeholder="请输入端口"
+              maxlength="6"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="设备管理证号" prop="harUser" >
+            <el-input
+              style="width:320px;"
+              v-model="form.harUser"
+              placeholder="请输入设备管理证号"
+              maxlength="30"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="设备管理密码" prop="harPsw" >
+            <el-input
+              style="width:320px;"
+              v-model="form.harPsw"
+              placeholder="请输入设备管理密码"
+              maxlength="30"
+              size="small"
+            />
+          </el-form-item>
+          <el-form-item label="门禁权限" style="margin-bottom: 0">
+            <el-checkbox-group v-model="form.controlScope">
+              <el-checkbox label="1" >关联安全准入</el-checkbox>
+              <el-checkbox label="2">关联白名单</el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+          <p style="margin:0 20px 0 104px;color: #FD2A2A;">关联之后申请安全准入或者白名单后自动授权门禁,不关联则需要单独授权门禁</p>
+        </div>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">取 消</el-button>
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listBySubjectId,addSensor,putSensor,delSensor,addHardware,putHardware,delHardware } from "@/api/laboratory/subject";
+import { getSensorList } from "@/api/laboratory/sensor";
+export default {
+  name: "deviceList",
+  props:{
+    subjectData:{},
+  },
+  data() {
+    return {
+      title:"",
+      addType:false,
+      listCgq:[],  //传感器
+      listYtj:[],  //一体机
+      listkzsb:[],
+      listSpjk:[],   //摄像头
+      listHK:[],//智能门禁
+      form:{
+      },
+      // 表单校验
+      rules: {
+        name:[
+          {required: true, message: '请输入名称', trigger: 'blur'},
+          { required: true, message: "请输入名称", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        type:[
+          {required: true, message: '类型不能为空', trigger: 'blur'}
+        ],
+        gatewayId:[
+          {required: true, message: '网关不能为空', trigger: 'blur'},
+          { required: true, message: "网关不能为空", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        hardwareNum:[
+          { required: true, message: "请输入编号", trigger: "blur" },
+          { required: true, message: "请输入编号", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        pcType: [
+          { required: true, message: "请选择类型", trigger: "blur" },
+        ],
+        hardwareType: [
+          { required: true, message: "请选择设备版本", trigger: "blur" },
+        ],
+        relayCode: [
+          { required: true, message: "请输入设备编号", trigger: "blur" },
+          { required: true, message: "请输入设备编号", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        bit: [
+          { required: true, message: "请输入路由", trigger: "blur" },
+          { required: true, message: "请输入路由", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        ipAddress: [
+          { required: true, message: "请输入IP", trigger: "blur" },
+          { required: true, message: "请输入IP", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        port: [
+          { required: true, message: "请输入端口", trigger: "blur" },
+          { required: true, message: "请输入端口", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+
+        harUser: [
+          { required: true, message: "请输入设备管理证号", trigger: "blur" },
+          { required: true, message: "请输入设备管理证号", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+        harPsw: [
+          { required: true, message: "请输入设备管理密码", trigger: "blur" },
+          { required: true, message: "请输入设备管理密码", validator: this.spaceJudgment, trigger: "blur" }
+        ],
+
+      },
+      //提交类型
+      upType:"",
+      //传感器类型
+      sensorAddOptions: [],
+    }
+  },
+  created() {
+    this.listBySubjectId();
+    this.getSensorList();
+  },
+  mounted(){
+
+  },
+  methods:{
+    // 取消按钮
+    cancel() {
+      this.addType = false;
+    },
+    // 提交
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if(this.upType == 1){
+            //新增传感器
+            this.addSensor();
+          }else if(this.upType == 5){
+            //编辑传感器
+            this.putSensor();
+          }else if(this.upType == 2){
+            //新增一体机
+            this.addHardware();
+          }else if(this.upType == 6){
+            //编辑一体机
+            this.putHardware();
+          }else if(this.upType == 3){
+            //新增控制设备
+            this.addHardwareTwo();
+          }else if(this.upType == 7){
+            //编辑控制设备
+            this.putHardwareTwo();
+          }else if(this.upType == 4){
+            //新增控制设备
+            this.addHardwareThree();
+          }else if(this.upType == 8){
+            //编辑控制设备
+            this.putHardwareThree();
+          }else if(this.upType == 'addEntrance'){
+            //新增智能门禁
+            this.addEntrance();
+          }else if(this.upType == 'editEntrance'){
+            //编辑智能门禁
+            this.editEntrance();
+          }
+        }
+      });
+    },
+    //删除智能门禁
+    delEntrance(item){
+      this.$confirm('确认要删除该智能门禁?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        //  确定
+        delHardware(item.id).then((response) => {
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        });
+      }).catch(function() {
+        //  取消
+      });
+    },
+    //新增摄像头
+    addHardwareThree(){
+      let obj = {
+        type:4,
+        hardwareNum:this.form.hardwareNum,
+        subjectId:this.subjectData.id,
+        deptId:this.subjectData.deptId,
+        deptName:this.subjectData.deptName,
+      }
+      addHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //编辑摄像头
+    putHardwareThree(){
+      let obj = {
+        id:this.form.id,
+        hardwareNum:this.form.hardwareNum,
+        subjectId:this.form.subjectId,
+        deptId:this.form.deptId,
+        deptName:this.form.deptName,
+      }
+      putHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //删除摄像头
+    delHardwareThree(item){
+      this.$confirm('确认要删除该摄像头?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        //  确定
+        delHardware(item.id).then((response) => {
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        });
+      }).catch(function() {
+        //  取消
+      });
+    },
+    //新增控制设备
+    addHardwareTwo(){
+      let obj = {
+        type:this.form.type,
+        hardwareType:this.form.hardwareType,
+        relayCode:this.form.relayCode,
+        bit:this.form.bit,
+        configName:this.form.configName,
+        configStatus:this.form.configStatus,
+        subjectId:this.subjectData.id,
+        deptId:this.subjectData.deptId,
+        deptName:this.subjectData.deptName,
+      }
+      addHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //编辑控制设备
+    putHardwareTwo(){
+      let obj = {
+        id:this.form.id,
+        hardwareType:this.form.hardwareType,
+        relayCode:this.form.relayCode,
+        bit:this.form.bit,
+        configName:this.form.configName,
+        configStatus:this.form.configStatus,
+        subjectId:this.form.subjectId,
+        deptId:this.form.deptId,
+        deptName:this.form.deptName,
+      }
+      putHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //删除控制设备
+    delHardwareTwo(item){
+      this.$confirm('确认要删除该一体机?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        //  确定
+        delHardware(item.id).then((response) => {
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        });
+      }).catch(function() {
+        //  取消
+      });
+    },
+    //添加一体机
+    addHardware(){
+      let obj = {
+        type:0,
+        name:this.form.name,
+        pcType:this.form.pcType,
+        hardwareNum:this.form.hardwareNum,
+        subjectId:this.subjectData.id,
+        deptId:this.subjectData.deptId,
+        deptName:this.subjectData.deptName,
+      }
+      addHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //编辑一体机
+    putHardware(){
+      let obj = {
+        id:this.form.id,
+        name:this.form.name,
+        pcType:this.form.pcType,
+        hardwareNum:this.form.hardwareNum,
+      }
+      putHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //删除一体机
+    delHardware(item){
+      this.$confirm('确认要删除该一体机?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        //  确定
+        delHardware(item.id).then((response) => {
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        });
+      }).catch(function() {
+        //  取消
+      });
+    },
+    //添加传感器
+    addSensor(){
+      let obj = {
+        type:this.form.type,
+        gatewayId:this.form.gatewayId,
+        routeNum:this.form.routeNum,
+        configName:this.form.configName,
+        configStatus:this.form.configStatus,
+        subjectId:this.subjectData.id
+      }
+      addSensor(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //编辑传感器
+    putSensor(){
+      let obj = {
+        type:this.form.type,
+        id:this.form.id,
+        gatewayId:this.form.gatewayId,
+        routeNum:this.form.routeNum,
+        configName:this.form.configName,
+        configStatus:this.form.configStatus,
+      }
+      putSensor(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //删除传感器
+    delSensor(item){
+      this.$confirm('确认要删除该传感器?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        //  确定
+        delSensor(item.id).then((response) => {
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        });
+      }).catch(function() {
+        //  取消
+      });
+    },
+    //新增智能门禁
+    addEntrance(){
+      let obj = {
+        type:10,
+        subjectId:this.subjectData.id,
+        hardwareNum:this.form.hardwareNum,
+        name:this.form.name,
+        ipAddress:this.form.ipAddress,
+        port:this.form.port,
+        harUser:this.form.harUser,
+        harPsw:this.form.harPsw,
+        controlScope:this.form.controlScope.join(','),
+      }
+      addHardware(obj).then(response => {
+        if(response.code==200){
+          this.msgSuccess(response.msg)
+          this.addType = false;
+          this.listBySubjectId();
+        }else if(response.code==205){
+          this.$confirm(response.msg, "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(() => {
+            //  确定
+            this.$router.push({ path: '/comprehensive/laboratoryManagement/accessAuthorization-KDNH' });
+          }).catch(function() {
+            //  取消
+          });
+        }
+      });
+    },
+    //编辑智能门禁
+    editEntrance(){
+      let obj = {
+        id:this.form.id,
+        hardwareNum:this.form.hardwareNum,
+        name:this.form.name,
+        ipAddress:this.form.ipAddress,
+        port:this.form.port,
+        harUser:this.form.harUser,
+        harPsw:this.form.harPsw,
+        controlScope:this.form.controlScope.join(','),
+        subjectId:this.subjectData.id
+      }
+      putHardware(obj).then(response => {
+        this.msgSuccess(response.msg)
+        this.addType = false;
+        this.listBySubjectId();
+      });
+    },
+    //添加
+    addData(type){
+      // this.resetForm("form");
+      if(type == 1){
+        this.title = '新增传感器';
+        this.$set(this,'form',{
+          type:"",
+          gatewayId:"",
+          routeNum:"",
+          configName:"",
+          configStatus:"",
+        });
+      }else if(type == 2){
+        this.title = '新增一体机';
+        this.$set(this,'form',{
+          name:"",
+          pcType:"",
+          hardwareNum:"",
+        });
+      }else if(type == 3){
+        this.title = '新增控制设备';
+        this.form.hardwareType = 1;
+        this.disabledType = false;
+        this.$set(this,'form',{
+          type:"",
+          hardwareType:"",
+          relayCode:"",
+          bit:"",
+          configName:"",
+          configStatus:"",
+        });
+      }else if(type == 4){
+        this.title = '新增摄像头';
+        this.$set(this,'form',{
+          hardwareNum:"",
+        });
+      }else if(type == 'addEntrance'){
+        this.title = '新增智能门禁';
+        this.$set(this,'form',{
+          hardwareNum:"",
+          name:"",
+          ipAddress:"",
+          port:"",
+          harUser:"",
+          harPsw:"",
+          controlScope:[],
+        });
+      }
+      this.addType = true;
+      this.upType = type;
+    },
+    //编辑
+    editData(type,row){
+      if(type == 5){
+        this.title = '编辑传感器';
+        this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+        this.$set(this.form,'type',JSON.parse(JSON.stringify(row.type.enumName)));
+      }else if(type == 6){
+        this.title = '编辑一体机';
+        this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+        this.$set(this.form,'pcType',JSON.parse(JSON.stringify(row.pcType+'')));
+      }else if(type == 7){
+        this.title = '编辑控制设备';
+        this.disabledType = true;
+        this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+        this.$set(this.form,'type',JSON.parse(JSON.stringify(row.type.code+'')));
+      }else if(type == 8){
+        this.title = '编辑摄像头';
+        this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+      }else if(type == 'editEntrance'){
+        this.title = '编辑智能门禁';
+        this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+        if(row.controlScope){
+          this.form.controlScope=row.controlScope.split(',')
+        }else{
+          this.form.controlScope=[]
+        }
+
+      }
+      this.addType = true;
+      this.upType = type;
+    },
+    //获取列表
+    listBySubjectId(){
+      let obj = {
+        subjectId:this.subjectData.id
+      };
+      console.log("obj",obj)
+      listBySubjectId(obj).then(response => {
+        this.$set(this,'listCgq',response.data.listCgq);
+        this.$set(this,'listYtj',response.data.listYtj);
+        this.$set(this,'listkzsb',response.data.listkzsb);
+        this.$set(this,'listSpjk',response.data.listSpjk);
+        this.$set(this,'listHK',response.data.listHK);
+      });
+    },
+    //返回上一页
+    backPage(){
+      this.$parent.clickPage(1);
+    },
+    //传感器类型
+    getSensorList(){
+      getSensorList().then(response => {
+        this.sensorAddOptions = response.data;
+      });
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.deviceList{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+  padding-bottom:20px;
+  border-radius:10px!important;
+  margin:5px 20px 20px 10px!important;
+  box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1) !important;
+  *{
+    margin:0;
+  }
+  .title-box{
+    display: flex;
+    margin:0 20px;
+    .left-title{
+      flex:1;
+      height:80px;
+      line-height:80px;
+      color:#0045AF;
+      font-size:18px;
+    }
+    .right-button{
+      margin:20px 0;
+    }
+  }
+  .for-max-box{
+    margin:0 40px;
+    font-weight:500;
+    .for-big-box{
+      border: 1px solid #E0E0E0;
+      display: inline-block;
+      overflow: hidden;
+      width:280px;
+      min-height:130px;
+      padding-bottom:10px;
+      border-radius: 6px;
+      margin:0 20px 20px 0;
+      .for-title-p{
+        background: rgba(182,214,254,1);
+        color:#0183FA;
+        font-size:16px;
+        line-height:40px;
+        display:block;
+        overflow:hidden;
+        text-overflow:ellipsis;
+        white-space:nowrap;
+        padding:0 16px;
+        margin-bottom:10px;
+        font-weight:700;
+      }
+      .for-text-box{
+        display: flex;
+        padding:0 23px;
+        p{
+          font-size:14px;
+          line-height:30px;
+          flex:1;
+        }
+        p:nth-child(1){
+          color:#333;
+          text-align: left;
+        }
+        p:nth-child(2){
+          color:#999;
+          text-align: right;
+          overflow:hidden;
+          text-overflow:ellipsis;
+          white-space:nowrap;
+        }
+      }
+      .for-button-box{
+        display: flex;
+        line-height:26px;
+        margin-top:10px;
+        p{
+          text-align: center;
+          font-size:14px;
+          color:#666666;
+        }
+        p:nth-child(1){
+          flex:1;
+          cursor: pointer;
+          i{
+            color:#1151b4;
+            margin-right:10px;
+          }
+        }
+        p:nth-child(2){
+          width:2px;
+          height:14px;
+          margin:6px 0;
+          background: #CCCCCC;
+        }
+        p:nth-child(3){
+          flex:1;
+          cursor: pointer;
+          i{
+            color:#ff6868;
+            margin-right:10px;
+          }
+        }
+      }
+    }
+    .for-big-box-two{
+      border: 1px solid #E0E0E0;
+      display: inline-block;
+      overflow: hidden;
+      width:280px;
+      min-height:158px;
+      padding-bottom:10px;
+      border-radius: 6px;
+      margin:0 20px 20px 0;
+      .for-title-p{
+        background: rgba(182,214,254,1);
+        color:#0183FA;
+        font-size:16px;
+        line-height:40px;
+        display:block;
+        overflow:hidden;
+        text-overflow:ellipsis;
+        white-space:nowrap;
+        padding:0 16px;
+        margin-bottom:10px;
+        font-weight:700;
+      }
+      .for-text-box{
+        display: flex;
+        padding:0 23px;
+        p{
+          font-size:14px;
+          line-height:30px;
+          flex:1;
+        }
+        p:nth-child(1){
+          text-align: left;
+          color:#333;
+        }
+        p:nth-child(2){
+          color:#999;
+          text-align: right;
+          overflow:hidden;
+          text-overflow:ellipsis;
+          white-space:nowrap;
+        }
+      }
+      .for-button-box{
+        display: flex;
+        line-height:26px;
+        margin-top:10px;
+        p{
+          text-align: center;
+          font-size:14px;
+          color:#666666;
+        }
+        p:nth-child(1){
+          flex:1;
+          cursor: pointer;
+          i{
+            color:#1151b4;
+            margin-right:10px;
+          }
+        }
+        p:nth-child(2){
+          width:2px;
+          height:14px;
+          margin:6px 0;
+          background: #CCCCCC;
+        }
+        p:nth-child(3){
+          flex:1;
+          cursor: pointer;
+          i{
+            color:#ff6868;
+            margin-right:10px;
+          }
+        }
+      }
+    }
+    .add-for-p{
+      font-size:14px;
+      border: 1px solid #E0E0E0;
+      display: inline-block;
+      overflow: hidden;
+      width:280px;
+      height:130px;
+      line-height:130px;
+      text-align: center;
+      border-radius: 6px;
+      color:#999999;
+      cursor: pointer;
+      margin:0 20px 20px 0;
+      i{
+        margin-right:10px;
+      }
+    }
+    .add-for-p-two{
+      font-size:14px;
+      border: 1px solid #E0E0E0;
+      display: inline-block;
+      overflow: hidden;
+      width:280px;
+      height:158px;
+      line-height:158px;
+      text-align: center;
+      border-radius: 6px;
+      color:#999999;
+      cursor: pointer;
+      margin:0 20px 20px 0;
+      i{
+        margin-right:10px;
+      }
+    }
+  }
+}
+</style>

文件差异内容过多而无法显示
+ 1471 - 0
src/views/comprehensive/laboratoryManagement/subject/indexKDNH.vue


文件差异内容过多而无法显示
+ 1257 - 0
src/views/comprehensive/personnel/student/addPageKDNH.vue


文件差异内容过多而无法显示
+ 999 - 0
src/views/comprehensive/personnel/student/indexKDNH.vue


文件差异内容过多而无法显示
+ 1817 - 0
src/views/comprehensive/personnel/teacher/addPageKDNH.vue


文件差异内容过多而无法显示
+ 1517 - 0
src/views/comprehensive/personnel/teacher/indexKDNH.vue


+ 540 - 0
src/views/medicUniversity-3_1/chemicalManagement/deviceManagement/SmartAccessControl/indexKDNH.vue

@@ -0,0 +1,540 @@
+<!--智能门禁-->
+<template>
+  <div class="app-container SmartAccessControl">
+    <el-form :model="queryParamsData" class="form-box" ref="queryForm" :inline="true">
+      <el-form-item label="关键字" prop="searchValue">
+        <el-input
+          maxLength="30"
+          v-model="queryParamsData.searchValue"
+          placeholder="门禁锁编号/实验室"
+          clearable
+          size="small"
+          style="width: 240px"
+        />
+      </el-form-item>
+      <el-form-item label="学院" prop="deptId">
+        <el-select v-model="queryParamsData.deptId" clearable placeholder="请选择学院">
+          <el-option
+            v-for="item in optionsListOne"
+            :key="item.deptId"
+            :label="item.deptName"
+            :value="item.deptId">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态" prop="useStatus">
+        <el-select v-model="queryParamsData.operate" clearable placeholder="请选择状态">
+          <el-option
+            v-for="item in optionsListTwo"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+        <p class="reset-button-one" @click="resetQuery">重置</p>
+      </el-form-item>
+      <el-form-item style="float: right;">
+        <el-col :span="1.5" v-hasPermi="['laboratory:hardware6:add']">
+          <p class="add-button-one-90"
+             @click="pageToggle(1)"
+          ><i class="el-icon-plus"></i>新增</p>
+        </el-col>
+      </el-form-item>
+    </el-form>
+    <el-table  border :data="tableList" ref="multipleTable">
+      <el-table-column label="门禁锁编号" align="center" prop="hardwareNum"/>
+      <el-table-column label="学院" align="center" prop="deptName" width="250"/>
+      <el-table-column label="实验室" align="center" prop="posi" width="250" show-overflow-tooltip/>
+      <el-table-column label="设备状态" align="center" prop="status" width="100">
+        <template slot-scope="scope">{{scope.row.operate.name}}</template>
+      </el-table-column>
+      <el-table-column label="创建人" align="center" prop="createBy" width="150"/>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="250"/>
+      <el-table-column label="操作" align="center" width="140" class-name="small-padding fixed-width" v-if="tableButtonType">
+        <template slot-scope="scope">
+          <div class="button-box">
+            <p class="table-min-button" style="margin-right:10px;" v-hasPermi="['laboratory:hardware6:edit']" @click="pageToggle(2,scope.row)">编辑</p>
+            <p class="table-min-button" v-hasPermi="['laboratory:hardware6:remove']" @click="pageToggle(3,scope.row)">删除</p>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination :page-sizes="[20, 30, 40, 50]"
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParamsData.pageNum"
+      :limit.sync="queryParamsData.pageSize"
+      @pagination="getList"
+    />
+
+    <!--新增/编辑-->
+    <el-dialog :title="dialogTitle" :visible.sync="addDialogType" v-if="addDialogType" width="520px" append-to-body class="add-dialog-box">
+      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
+        <el-form-item label="实验室:" prop="subjectId">
+          <el-select
+            style="width:360px;"
+            v-model="form.subjectId"
+            filterable
+            remote
+            clearable
+            @focus="selectFocus"
+            reserve-keyword
+            @clear="clearClick"
+            placeholder="搜索选择实验室"
+            :remote-method="getSelectList"
+            :loading="loading">
+            <el-option
+              v-for="item in selectList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="门禁编号" prop="hardwareNum">
+          <el-input
+            style="width:320px;"
+            v-model="form.hardwareNum"
+            placeholder="请输入门禁编号"
+            maxlength="20"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="门禁名称" prop="name" >
+          <el-input
+            style="width:320px;"
+            v-model="form.name"
+            placeholder="请输入门禁名称"
+            maxlength="8"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="IP" prop="ipAddress" >
+          <el-input
+            style="width:320px;"
+            v-model="form.ipAddress"
+            placeholder="请输入IP"
+            maxlength="15"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="端口" prop="port" >
+          <el-input
+            style="width:320px;"
+            v-model="form.port"
+            placeholder="请输入端口"
+            maxlength="6"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="设备管理证号" prop="harUser" >
+          <el-input
+            style="width:320px;"
+            v-model="form.harUser"
+            placeholder="请输入设备管理证号"
+            maxlength="30"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="设备管理密码" prop="harPsw" >
+          <el-input
+            style="width:320px;"
+            v-model="form.harPsw"
+            placeholder="请输入设备管理密码"
+            maxlength="30"
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="门禁权限" style="margin-bottom: 0">
+          <el-checkbox-group v-model="form.controlScope">
+            <el-checkbox label="1" >关联安全准入</el-checkbox>
+            <el-checkbox label="2">关联白名单</el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { hxpSmartTerminal,filterDept,getSubList,addHxpSmartTerminal,putHxpSmartTerminal,getHxpSmartTerminal,delHxpSmartTerminal } from "@/api/medicUniversity-3_1/index";
+  import { listHardware, delHardware, addHardware, updateHardware } from "@/api/medicUniversity-3_1/index";
+  import { listDepartments } from "@/api/system/dept";
+  import { getToken } from "@/utils/auth";
+  export default {
+    name: "SmartAccessControl-jinan",
+    data() {
+      return {
+        // table操作按钮校验
+        tableButtonType:this.hasPermiDom(['laboratory:hardware6:edit','laboratory:hardware6:remove']),
+        //上传相关配置
+        uploadImgUrl: window.location.href.split('://')[0]+'://' + process.env.VUE_APP_BASE_API + "/laboratory/hardware/importData", // 上传地址
+        headers: {
+          Authorization: "Bearer " + getToken(),
+        },
+        // 遮罩层
+        loading:false,
+        //页面状态
+        pageType:1,
+        // 搜索数据
+        queryParamsData:{
+          pageNum:1,
+          pageSize:20,
+        },
+        //数据数量
+        total:0,
+        //数据数组
+        tableList:[],
+        //学院列表
+        optionsListOne:[],
+        //状态列表
+        optionsListTwo:[{id:"ONLINE",name:"在线"},{id:"OFFLINE",name:"离线"}],
+        //编辑新增相关
+        dialogTitle:"",
+        addDialogType:false,
+        form:{},
+        selectList:[],
+        selectListData:[],
+        rules:{
+          name: [
+            { required: true, trigger: "blur", message: "请输入门禁名称" },
+          ],
+          hardwareNum: [
+            { required: true, trigger: "blur", message: "最大20个字符,包含大小写字母、数字" },
+            { required: true, message: "最大20个字符,包含大小写字母、数字", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          subjectId: [
+            { required: true, trigger: "blur", message: "搜索选择实验室" },
+          ],
+          relayCode: [
+            { required: true, message: "请输入设备编号", trigger: "blur" },
+            { required: true, message: "请输入设备编号", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          bit: [
+            { required: true, message: "请输入路由", trigger: "blur" },
+            { required: true, message: "请输入路由", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          ipAddress: [
+            { required: true, message: "请输入IP", trigger: "blur" },
+            { required: true, message: "请输入IP", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          port: [
+            { required: true, message: "请输入端口", trigger: "blur" },
+            { required: true, message: "请输入端口", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+
+          harUser: [
+            { required: true, message: "请输入设备管理证号", trigger: "blur" },
+            { required: true, message: "请输入设备管理证号", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          harPsw: [
+            { required: true, message: "请输入设备管理密码", trigger: "blur" },
+            { required: true, message: "请输入设备管理密码", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+
+        },
+      };
+    },
+    created() {
+
+    },
+    mounted(){
+      this.filterDept();
+      this.listDepartments();
+      this.getList();
+    },
+    methods: {
+      selectFocus(){
+        if(!this.selectList[0]){
+          this.filterDept();
+        }
+      },
+      //获取学院列表
+      listDepartments(){
+        listDepartments().then(response => {
+          this.optionsListOne = response.data;
+        });
+      },
+      pageToggle(type,row){
+        let self = this;
+        if(type == 1){
+          //新增
+          this.dialogTitle = '新增';
+          this.$set(this,'form',{
+            subjectId:"",
+            hardwareNum:"",
+            name:"",
+            ipAddress:"",
+            port:"",
+            harUser:"",
+            harPsw:"",
+            controlScope:[],
+          });
+          this.clearClick();
+          this.addDialogType = true;
+        }else if(type == 2){
+          // 编辑
+          this.dialogTitle = '编辑';
+          this.$set(this,'form',JSON.parse(JSON.stringify(row)));
+          if(row.controlScope){
+            this.form.controlScope=row.controlScope.split(',')
+          }else{
+            this.form.controlScope=[]
+          }
+          this.clearClick();
+          this.addDialogType = true;
+        }else if(type == 3){
+          // 删除
+          this.$confirm('确认要删除吗?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            delHardware(row.id).then(response => {
+              if (response.code == 200){
+                self.msgSuccess(response.msg);
+                self.getList();
+              }
+            });
+          }).then(() => {
+          }).catch(() => {});
+        }
+      },
+      //查询当前院系
+      filterDept(){
+        filterDept().then(response => {
+          let idText = "";
+          for(let i=0;i<response.data.length;i++){
+            if(i==0){
+              idText = idText + response.data[i].deptId;
+            }else{
+              idText = idText +','+ response.data[i].deptId;
+            }
+          }
+          //查询院系下实验室
+          getSubList(idText).then(response => {
+            //当前列表
+            this.selectList = JSON.parse(JSON.stringify(response.data));
+            //原始列表数据
+            this.selectListData = JSON.parse(JSON.stringify(response.data));
+          });
+        });
+      },
+      /** 实验室-本地懒加载 */
+      getSelectList(val) {
+        let self = this;
+        let list = [];
+        for(let i=0;i<self.selectListData.length;i++){
+          if(self.selectListData[i].name.indexOf(val) != -1){
+            list.push(self.selectListData[i]);
+          }
+        }
+        this.selectList = JSON.parse(JSON.stringify(list))
+      },
+      //实验室选中清除
+      clearClick(){
+        this.selectList = JSON.parse(JSON.stringify(this.selectListData))
+      },
+      submitForm(){
+        this.$refs["form"].validate((valid) => {
+          if (valid) {
+            if(this.form.id){
+              //编辑
+              this.form.type = 10;
+              this.form.controlScope=this.form.controlScope.join(','),
+              updateHardware(this.form).then(response => {
+                if (response.code == 200){
+                  this.addDialogType = false;
+                  this.msgSuccess(response.msg);
+                  this.getList();
+                }
+              });
+            }else{
+              //新增
+              let obj = {
+                type:10,
+                subjectId:this.form.subjectId,
+                hardwareNum:this.form.hardwareNum,
+                name:this.form.name,
+                ipAddress:this.form.ipAddress,
+                port:this.form.port,
+                harUser:this.form.harUser,
+                harPsw:this.form.harPsw,
+                controlScope:this.form.controlScope.join(','),
+              }
+              addHardware(obj).then(response => {
+                if (response.code == 200){
+                  this.addDialogType = false;
+                  this.msgSuccess(response.msg);
+                  this.resetQuery();
+                }else if(response.code == 205){
+                  this.$confirm(response.msg, "警告", {
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+                    type: "warning"
+                  }).then(() => {
+                    //  确定
+                    this.$router.push({ path: '/comprehensive/laboratoryManagement/accessAuthorization-KDNH' });
+                  }).catch(function() {
+                    //  取消
+                  });
+                }
+              });
+            }
+          }
+        })
+      },
+      cancel(){
+        this.addDialogType = false;
+      },
+      //获取数据列表
+      getList(){
+        this.queryParamsData.type = 'HK_DOOR';
+        listHardware(this.queryParamsData).then(response => {
+          this.total = response.total;
+          this.tableList = response.rows;
+        });
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParamsData.pageNum = 1;
+        this.queryParamsData.pageSize = 20;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.$set(this,'queryParamsData',{});
+        this.handleQuery();
+      },
+
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .SmartAccessControl{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden!important;
+    padding:20px !important;
+    p{
+      margin:0;
+      padding:0;
+    }
+    .form-box{
+      .form-dropdown-box{
+        display: flex;
+        margin:0;
+        padding:0 10px;
+        cursor: pointer;
+        height:40px;
+        img:nth-child(1){
+          width:16px;
+          height:16px;
+          margin-top:12px;
+        }
+        p{
+          width:47px;
+          text-align: center;
+          font-size:14px;
+          margin:0;
+          line-height:40px;
+        }
+        img:nth-child(3){
+          width:10px;
+          height:6px;
+          margin-top:17px;
+        }
+      }
+    }
+    .button-box{
+      display: flex;
+    }
+  }
+</style>
+<style lang="scss">
+  .import-dialog-box{
+    .import-dialog-upLoad-box{
+      .el-upload{
+        width:450px;
+        margin:0 55px;
+        .el-upload-dragger{
+          width:450px;
+          .el-icon-upload{
+            font-size:100px;
+            color:#CBE6FE;
+          }
+          .el-upload__text{
+            margin-top:20px;
+          }
+        }
+      }
+      .el-upload__tip{
+        margin-left:60px;
+        font-size:14px;
+        margin-top:10px;
+      }
+      .el-upload-text-box{
+        background: #F5F5F5;
+        border-radius: 10px;
+        margin:15px 30px 0;
+        padding:0 20px 15px;
+        overflow: hidden;
+        *{
+          margin:0;
+        }
+        .img-text-box{
+          display: flex;
+          margin-top:15px;
+          img{
+            width:16px;
+            height:16px;
+            margin-right:13px;
+          }
+          p{
+            height:16px;
+            line-height:16px;
+            font-size:12px;
+          }
+        }
+        .text-p{
+          margin-top:15px;
+          margin-left:29px;
+          height:16px;
+          line-height:16px;
+          font-size:12px;
+        }
+      }
+    }
+    .teacher-import-dialog-button-box{
+      display: flex;
+      width:190px;
+      margin:0 auto;
+      p{
+        width:70px;
+        height:30px;
+        line-height:30px;
+        font-size:14px;
+        margin:0 auto;
+      }
+    }
+    .teacher-import-dialog-position-box{
+      width:100%;
+      height:100%;
+      position: absolute;
+      top:0;
+      left:0;
+      z-index: 999;
+      background: rgba(255,255,255,0.4);
+      border-radius:20px;
+    }
+  }
+</style>

+ 935 - 0
src/views/mine/indexKDNH.vue

@@ -0,0 +1,935 @@
+<template>
+    <div class="mine">
+      <!--<navbar />-->
+      <div class="mine-page">
+        <div class="left-max-box scrollbar-box">
+          <p class="left-title">个人中心</p>
+          <div class="left-user-img">
+            <userAvatar :user="user" />
+          </div>
+          <p class="left-name">{{user.nickName}}</p>
+          <p class="left-num">{{user.userType=='11'?'工号:':(user.userType=='22'?'学号:':'其他:')}}{{user.userName}}</p>
+          <div class="left-text-max-box">
+            <div class="left-text-big-box">
+              <div class="left-text-big-box-left">
+                <img v-if="user.userType == '22'" src="@/assets/ZDimages/mine/icon_grzx_xl.png">
+                <img v-else src="@/assets/ZDimages/mine/icon_grzx_zc.png">
+                <p>{{user.education?user.education:'未设置'}}</p>
+              </div>
+              <div class="left-text-big-box-right">
+                <img class="img-two" v-if="user.userType == '22'" src="@/assets/ZDimages/mine/icon_grzx_zy.png">
+                <img class="img-one" v-else src="@/assets/ZDimages/mine/icon_grzx_zw.png">
+                <p>{{user.major?user.major:'未设置'}}</p>
+              </div>
+            </div>
+            <div class="left-text-min-box">
+              <img src="@/assets/ZDimages/mine/icon_grzx_sjh.png">
+              <p>{{user.phonenumber?user.phonenumber:'未设置'}}</p>
+            </div>
+            <div class="left-text-min-box">
+              <img src="@/assets/ZDimages/mine/icon_grzx_yx.png">
+              <p>{{user.email?user.email:'未设置'}}</p>
+            </div>
+            <div class="left-text-min-box">
+              <img src="@/assets/ZDimages/mine/icon_grzx_bgl.png">
+              <p>{{user.deptName?user.deptName:'未设置'}}</p>
+            </div>
+          </div>
+          <div class="left-type-text-max-box">
+            <div>
+              <p>联系方式</p>
+              <p :class="user.phonenumber?'p-color-a':'p-color-b'">{{user.phonenumber?'已设置':'未设置'}}</p>
+            </div>
+            <div>
+              <p>系统头像</p>
+              <p :class="user.avatar?'p-color-a':'p-color-b'">{{user.avatar?'已设置':'未设置'}}</p>
+            </div>
+            <div>
+              <p>人脸照片</p>
+              <p :class="user.faceImg?'p-color-a':'p-color-b'">{{user.faceImg?'已设置':'未设置'}}</p>
+            </div>
+            <div>
+              <p>电子签名</p>
+              <p :class="user.signature?'p-color-a':'p-color-b'">{{user.signature?'已设置':'未设置'}}</p>
+            </div>
+          </div>
+        </div>
+        <div class="right-max-box scrollbar-box">
+          <div class="right-title-box">
+            <div class="title-button-min-box" @click="buttonTypeClick(1)">
+              <p :class="buttonType == '1'?'bottomColor':''">基本资料</p>
+              <p :class="buttonType == '1'?'bottomBack':''"></p>
+            </div>
+            <div class="title-button-min-box" @click="buttonTypeClick(2)">
+              <p :class="buttonType == '2'?'bottomColor':''">安全设置</p>
+              <p :class="buttonType == '2'?'bottomBack':''"></p>
+            </div>
+            <p class="right-null-p"></p>
+            <!--<p class="reset-button-one right-out-button" @click="outButton">返回</p>-->
+          </div>
+          <div v-if="buttonType == 1">
+            <el-form :model="userform" ref="userform" :rules="rules" :inline="true" >
+              <div>
+                <el-form-item class="form-item-min input-number-none-box" label="联系方式:" prop="phonenumber" label-width="120px">
+                  <el-input-number
+                    :max="19999999999"
+                    v-model="userform.phonenumber"
+                    placeholder="请输入联系方式"
+                    clearable/>
+                </el-form-item>
+                <el-form-item class="form-item-min" label="邮箱:" prop="email" label-width="120px">
+                  <el-input
+                    maxlength="40"
+                    v-model="userform.email"
+                    placeholder="请输入邮箱"
+                    clearable
+                    style="width:200px;"
+                    size="small"
+                  />
+                </el-form-item>
+                <el-form-item class="form-item-min" label="出生年月:" prop="dateBirth" label-width="120px">
+                  <el-date-picker
+                    v-model="userform.dateBirth"
+                    value-format="yyyy-MM-dd"
+                    type="date"
+                    style="width:200px;"
+                    placeholder="请选择出生日期">
+                  </el-date-picker>
+                </el-form-item>
+              </div>
+              <div>
+                <el-form-item class="form-item-min" label="人脸照片:" prop="searchValue" label-width="120px">
+                  <div class="up-data-box" style="width:200px;">
+                    <div class="up-data-min-box" style="display: flex;">
+                      <div class="up-data-button" v-if="!user.faceImg" @click="upFaceOpenClick(2)">
+                        <p>+</p>
+                        <p>上传</p>
+                      </div>
+                      <img class="img-one" :src="user.faceImg" v-if="user.faceImg" @click="upFaceOpenClick(2)">
+                    </div>
+                  </div>
+                </el-form-item>
+                <el-form-item class="form-item-min" label="电子签名:" prop="searchValue" label-width="120px">
+                  <div class="up-data-box">
+                    <div class="up-data-min-box" style="display: flex;">
+                      <el-upload
+                        class="position-button"
+                        :action="uploadImgUrlTwo"
+                        :show-file-list="false"
+                        :auto-upload="false"
+                        :on-change="signatureChange"
+                        accept="image/jpeg,image/gif,image/png"
+                        :headers="headers"
+                        :before-upload="beforeAvatarUpload">
+                        <div class="up-data-button" v-if="!user.signature">
+                          <p>+</p>
+                          <p>上传</p>
+                        </div>
+                        <img class="img-two" :src="user.signature" v-if="user.signature">
+                      </el-upload>
+                    </div>
+                  </div>
+                </el-form-item>
+                <el-form-item class="form-item-min" label="指纹:" prop="searchValue" label-width="120px">
+                    <div class="fingerprint_no" v-if="Quantity==0">
+                      <p>暂未录入指纹</p>
+                      <p>(请在小程序端操作)</p>
+                    </div>
+                  <div class="fingerprint_yes" v-if="Quantity!=0">
+                    <div class="fingerprint_yes_img">
+                      <img src="@/assets/ZDimages/icon_zw_bk.png">
+                      <img src="@/assets/ZDimages/icon_wd_zw.png">
+                    </div>
+                    <p>已录入{{Quantity}}个指纹</p>
+                  </div>
+                </el-form-item>
+              </div>
+            </el-form>
+            <p class="type-one-max-box add-button-one-120" @click="upDataProfile">保存</p>
+          </div>
+          <div v-if="buttonType == 2">
+            <el-form :model="form" ref="form" :inline="true" :rules="rules">
+              <div>
+                <el-form-item class="form-item-min" label="原始密码:" prop="oldPassword" label-width="120px">
+                  <el-input
+                    maxlength="16"
+                    type="password"
+                    v-model.trim="form.oldPassword"
+                    placeholder="请输入原始密码"
+                    clearable
+                    size="small"
+                  />
+                </el-form-item>
+                <el-form-item class="form-item-min" label="新密码:" prop="newPassword" label-width="120px">
+                  <el-input
+                    maxlength="16"
+                    type="password"
+                    v-model.trim="form.newPassword"
+                    placeholder="请输入新密码"
+                    clearable
+                    size="small"
+                  />
+                </el-form-item>
+                <el-form-item class="form-item-min" label="确认密码:" prop="confirmPassword" label-width="120px">
+                  <el-input
+                    maxlength="16"
+                    type="password"
+                    v-model.trim="form.confirmPassword"
+                    placeholder="请确认密码"
+                    clearable
+                    size="small"
+                  />
+                </el-form-item>
+                <span class="type-one-max-box add-button-one-120" style="margin-left:20px;display: inline-block;" @click="submit">保存</span>
+              </div>
+            </el-form>
+          </div>
+        </div>
+      </div>
+      <!--电子签名-->
+      <el-dialog class="up-img-box" title="上传电子签名" :visible.sync="upImgOpen" width="600px" append-to-body>
+        <p>示例</p>
+        <img class="img-one" src="@/assets/ZDimages/icon_scdzqm_sl.png">
+        <p>正楷签名</p>
+        <div class="cropper-box">
+          <vueCropper
+            ref="cropper"
+            :img="option.img"
+            :outputSize="option.outputSize"
+            :outputType="option.outputType"
+            :info="option.info"
+            :canScale="option.canScale"
+            :autoCrop="option.autoCrop"
+            :autoCropWidth="option.autoCropWidth"
+            :autoCropHeight="option.autoCropHeight"
+            :fixed="option.fixed"
+            :fixedNumber="option.fixedNumber"
+            :full="option.full"
+            :fixedBox="option.fixedBox"
+            :canMove="option.canMove"
+            :canMoveBox="option.canMoveBox"
+            :original="option.original"
+            :centerBox="option.centerBox"
+            :height="option.height"
+            :infoTrue="option.infoTrue"
+            :maxImgSize="option.maxImgSize"
+            :enlarge="option.enlarge"
+            :mode="option.mode"
+            @realTime="realTime"
+            @imgLoad="imgLoad"
+          ></vueCropper>
+          <p class="cropper-button" @click="upImgButton">保存查看</p>
+          <el-upload
+            class="position-button"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            :auto-upload="false"
+            :on-change="signatureChange"
+            accept="image/jpeg,image/gif,image/png"
+            :headers="headers"
+            :before-upload="beforeAvatarUpload">
+            <p style="position: absolute;right:100px;top:10px;z-index:1;color:#fff;background:#14AE10;cursor: pointer;padding:5px 10px;margin:0;border-radius:6px;">选择签名</p>
+          </el-upload>
+        </div>
+        <p style="color:#999;">请将签名置于选择框内以便提高识别度</p>
+        <img class="cropper-img" v-if="signatureData" :src="signatureData">
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="upImgOpenClick(1)">取 消</el-button>
+          <el-button type="primary" @click="upSignatureData">确 定</el-button>
+        </div>
+      </el-dialog>
+      <!--上传照片-->
+      <el-dialog class="up-img-box" title="上传照片" :visible.sync="upFaceOpen" width="600px" append-to-body>
+        <el-upload
+          ref="faceUpLoad"
+          class="position-button"
+          :action="uploadImgUrl"
+          :show-file-list="false"
+          :auto-upload="false"
+          :on-change="faceChange"
+          accept="image/jpeg,image/gif,image/png"
+          :on-success="(res)=>handleAvatarSuccess(res)"
+          :headers="headers"
+          :before-upload="beforeAvatarUpload">
+          <div v-if="!upFaceUrl" style="width:300px;height:300px;border: 1px dashed #E0E0E0;cursor: pointer;margin:20px 130px 0;">
+            <p style="text-align: center;color:#999;font-weight:500;font-size: 20px;line-height:300px;margin:0;">+</p>
+          </div>
+          <div v-if="upFaceUrl" class="scrollbar-box" style="width:560px;margin:0 auto;max-height:700px;overflow-y: scroll">
+            <img :src="upFaceUrl" style="max-width:560px;border: 1px dashed #E0E0E0;cursor: pointer;margin:0 auto;">
+          </div>
+        </el-upload>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="faceButton(1)">取 消</el-button>
+          <el-button type="primary" @click="faceButton(2)">确 定</el-button>
+        </div>
+      </el-dialog>
+    </div>
+</template>
+
+<script>
+  import { Navbar } from '@/layout/components'
+  import userAvatar from "./userAvatar";
+  import { getUserProfile,updateUserPwd,changePhone,genSign,updateSignature,upDataProfile,fingerprintQuantity} from "@/api/system/user";
+  import { getToken } from "@/utils/auth";
+  export default {
+    name: "mine",
+    components: {
+      Navbar,
+      userAvatar
+    },
+    data(){
+      const equalToPassword = (rule, value, callback) => {
+        if (this.form.confirmPassword !== value) {
+          callback(new Error("两次输入的密码不一致"));
+        } else {
+          callback();
+        }
+      };
+      const equalToPasswordTwo = (rule, value, callback) => {
+        if (this.form.newPassword !== value) {
+          callback(new Error("两次输入的密码不一致"));
+        } else {
+          callback();
+        }
+      };
+      const validatePass = (rule, value, callback) => {
+        let reg = /^(?![A-z0-9]+$)(?=.[^%&',;=?$\x22])(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,16}$/
+        console.log("reg.test(value)",reg.test(value))
+        if(reg.test(value)){
+          callback()
+        }else{
+          return callback(new Error('密码应在8-16位包括数字和字母与特殊字符'));
+        }
+      };
+      return{
+        buttonType:'1',
+        uploadImgUrl: window.location.href.split('://')[0]+'://' + process.env.VUE_APP_BASE_API + "/laboratory/studentinfo/commit/face", // 上传的图片服务器地址
+        uploadImgUrlTwo: window.location.href.split('://')[0]+'://' + process.env.VUE_APP_BASE_API + "/file/upload", // 上传的图片服务器地址
+        headers: {
+          Authorization: "Bearer " + getToken(),
+        },
+        pageType:false,
+        user: {},
+        roleGroup: {},
+        postGroup: {},
+        activeTab: "resetPwd",
+        form:{
+          oldPassword:"",
+          newPassword:"",
+          confirmPassword:""
+        },
+        userform:{},
+        userformData:{},
+        open:false,
+        phoneForm:{
+          phone:"",
+        },
+        // 表单校验
+        rules: {
+          oldPassword: [
+            { required: true, message: "旧密码不能为空", trigger: "blur" },
+          ],
+          newPassword: [
+            { required: true, message: "新密码不能为空", trigger: "blur" },
+            { min: 8, max: 16, message: "长度在 8 到 16 个字符", trigger: "blur" },
+            { required: true, validator: equalToPassword, trigger: "blur" },
+            { required: true, message: "请输入8-16位密码,不能输入连续性和重复性的密码,密码中需要包含:大写字母、小写字符、数字和字符", validator: validatePass, trigger: "blur" }
+          ],
+          confirmPassword: [
+            { required: true, message: "确认密码不能为空", trigger: "blur" },
+            { min: 8, max: 16, message: "长度在 8 到 16 个字符", trigger: "blur" },
+            { required: true, validator: equalToPasswordTwo, trigger: "blur" },
+            { required: true, message: "请输入8-16位密码,不能输入连续性和重复性的密码,密码中需要包含:大写字母、小写字符、数字和字符", validator: validatePass, trigger: "blur" }
+          ],
+          // phone: [
+          //   { required: true, message: "请输入11位手机号码", trigger: "blur" },
+          //   { validator: this.checkPhone, trigger: 'blur' },
+          //   { min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
+          //   { required: true, message: "请输入11位手机号码", validator: this.spaceJudgment, trigger: "blur" }
+          // ],
+          // phonenumber: [
+          //   { required: true, message: "请输入手机号码", trigger: "blur" },
+          //   { required: true, message: "请输入手机号码", validator: this.spaceJudgment, trigger: "blur" }
+          // ],
+          // email: [
+          //   { required: true, message: "请输入邮箱地址", trigger: "blur" },
+          //   { required: true, message: "请输入正确的邮箱地址", type: 'email'},
+          //   { required: true, message: "请输入邮箱地址", validator: this.spaceJudgment, trigger: "blur" }
+          // ],
+          // dateBirth: [
+          //   { required: true, message: "请选择出生日期", trigger: "blur" }
+          // ],
+        },
+        //上传签名开关
+        upImgOpen:false,
+        option:{
+          img: '', // 裁剪图片的地址
+          outputSize: 1,       //裁剪生成图片的质量(可选0.1 - 1)
+          outputType: 'png',  //裁剪生成图片的格式(jpeg || png || webp)
+          info: true,          //图片大小信息
+          canScale: true,      //图片是否允许滚轮缩放
+          autoCrop: true,      //是否默认生成截图框
+          autoCropWidth: 240,  //默认生成截图框宽度
+          autoCropHeight: 80, //默认生成截图框高度
+          fixed: true,         //是否开启截图框宽高固定比例
+          fixedNumber: [3, 1], //截图框的宽高比例
+          full: false,         //false按原比例裁切图片,不失真
+          fixedBox: true,      //固定截图框大小,不允许改变
+          canMove: false,      //上传图片是否可以移动
+          canMoveBox: true,    //截图框能否拖动
+          original: false,     //上传图片按照原始比例渲染
+          centerBox: false,    //截图框是否被限制在图片里面
+          height: true,        //是否按照设备的dpr 输出等比例图片
+          infoTrue: false,     //true为展示真实输出图片宽高,false展示看到的截图框宽高
+          maxImgSize: 3000,    //限制图片最大宽度和高度
+          enlarge: 1,          //图片根据截图框输出比例倍数
+          mode: '560px 400px'  //图片默认渲染方式
+        },
+        previews:{},
+        //上传人脸
+        upFaceOpen:false,
+        upFaceUrl:"",
+        //临时签名数据
+        signatureData:"",
+        Quantity:0,//指纹录取数量
+      }
+    },
+    created() {
+      this.getUser();
+      this.fingerprintQuantityFun();
+    },
+    methods: {
+      //修改用户信息
+      upDataProfile(){
+        this.$refs["userform"].validate(valid => {
+          if (valid) {
+            if(!this.userform.phonenumber&&!this.userform.email&&!this.userform.dateBirth){
+              this.msgError('联系方式/邮箱/出生年月,请至少填写一项进行修改')
+              return
+            }
+            if((this.userform.phonenumber == this.userformData.phonenumber)&&
+              (this.userform.email == this.userformData.email)&&
+              (this.userform.dateBirth == this.userformData.dateBirth)){
+              this.msgError('联系方式/邮箱/出生年月,请至少修改一项再进行保存操作')
+              return
+            }
+            // let obj = JSON.parse(JSON.stringify(this.userform));
+            let obj = {};
+            if(this.userform.phonenumber){
+              let regex = /^1[23456789]\d{9}$/;
+              if(!regex.test(this.userform.phonenumber)){
+                this.msgError('请输入正确的联系方式')
+                return
+              }else{
+                obj.phonenumber = this.userform.phonenumber;
+              }
+            }else {
+              obj.phonenumber = '';
+            }
+            if(this.userform.email){
+              let regex = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
+              if(!regex.test(this.userform.email)){
+                this.msgError('请输入正确的邮箱地址')
+                return
+              }else{
+                obj.email = this.userform.email;
+              }
+            }else {
+              obj.email = '';
+            }
+            if(this.userform.dateBirth){
+              obj.dateBirth = this.userform.dateBirth;
+            }else{
+              obj.dateBirth = '';
+            }
+            obj.userId = this.user.userId;
+            upDataProfile(obj).then(response => {
+              this.msgSuccess('操作成功');
+              this.getUser();
+            });
+          }
+        })
+      },
+      //修改按钮密码
+      submit() {
+        let self = this;
+        self.$refs["form"].validate(valid => {
+          if (valid) {
+            this.$confirm('确定要修改吗', "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(function() {
+              self.updateUserPwd();
+            }).then(() => {
+            }).catch(() => {});
+          }
+        });
+      },
+      //指纹-查询用户指纹录取数量
+      fingerprintQuantityFun(){
+        let _this=this;
+        fingerprintQuantity(localStorage.getItem('userId')).then(response => {
+            if(response.code == 200){
+              _this.Quantity=response.data;
+            }
+          }
+        );
+      },
+      //修改密码接口
+      updateUserPwd(){
+        updateUserPwd(this.form.oldPassword, this.form.newPassword).then(
+          response => {
+            this.form.oldPassword = "";
+            this.form.newPassword = "";
+            this.form.confirmPassword = "";
+            this.msgSuccess("修改成功");
+          }
+        );
+      },
+      //返回按钮
+      outButton(){
+        this.$router.go(-1)
+      },
+      //页面按钮点击
+      buttonTypeClick(type){
+        if(this.buttonType != type){
+          this.buttonType = type;
+        }
+      },
+      //获取信息
+      getUser() {
+        getUserProfile().then(response => {
+          this.user = response.data;
+          this.roleGroup = response.roleGroup;
+          this.postGroup = response.postGroup;
+          let obj = {
+            phonenumber:response.data.phonenumber,
+            email:response.data.email,
+            dateBirth:response.data.dateBirth,
+          }
+          this.$set(this,'userform',JSON.parse(JSON.stringify(obj)));
+          this.$set(this,'userformData',JSON.parse(JSON.stringify(obj)));
+          this.pageType = true;
+        });
+      },
+      //上传签名
+      upSignatureData(){
+        if(!this.signatureData){
+          this.msgError('请先选择签名上传并保存查看')
+        }
+        var blob = this.dataURLtoBlob(this.signatureData);
+        var file = this.blobToFile(blob, 'dx.jpg');
+        let formData = new FormData();
+        formData.append('file',file,"DX.jpg")
+        console.log("formData",formData);
+        updateSignature(formData).then(response => {
+          if(response.code == 200){
+            this.msgSuccess("操作成功");
+            this.upImgOpen = false;
+            this.getUser();
+          }
+        });
+      },
+      //照片页面开关
+      upFaceOpenClick(type){
+        if(type == 1){
+          this.upFaceOpen = false;
+        }else if (type == 2){
+          this.upFaceUrl = this.user.faceImg;
+          this.upFaceOpen = true;
+        }
+      },
+      //签名页面开关
+      upImgOpenClick(type){
+        if(type == 1){
+          this.upImgOpen = false;
+        }else if (type == 2){
+          this.option.img = this.user.signature;
+          this.signatureData = this.user.signature;
+          this.upImgOpen = true;
+        }
+      },
+      //确定签名
+      upImgButton(){
+        let self = this;
+        this.$refs.cropper.getCropBlob(async (data) => {
+          let formData = new FormData();
+          formData.append('file',data,"DX.jpg")
+          genSign(formData).then(response => {
+            if(response.code == 200){
+              this.signatureData = 'data:image/png;base64,'+response.data;
+            } else {
+              this.msgError(response.msg)
+            }
+          });
+        })
+      },
+      //照片选择
+      faceChange(val){
+        const windowURL = window.URL || window.webkitURL;
+        this.upFaceUrl = windowURL.createObjectURL(val.raw)
+      },
+      //签名选择
+      signatureChange(val){
+        const windowURL = window.URL || window.webkitURL;
+        this.option.img = windowURL.createObjectURL(val.raw)
+        this.signatureData = "";
+        this.upImgOpen = true;
+      },
+      // 照片上传按钮
+      faceButton(type){
+        if(type==1){
+          this.upFaceOpen = false;
+        }else if(type == 2){
+          this.$refs.faceUpLoad.submit();
+        }
+      },
+      //上传
+      handleAvatarSuccess(res, type) {
+        if(res.code == 200){
+          this.user.faceImg = res.data.cardUrl;
+          this.upFaceOpen = false;
+          this.getUser();
+          this.msgSuccess(res.msg)
+          this.$forceUpdate()
+        }else{
+          this.msgError(res.msg)
+        }
+      },
+      beforeAvatarUpload(file) {
+        let type = false;
+        if (file.type == 'image/png' || file.type == 'image/jpeg' || file.type == 'image/gif') {
+          type = true;
+        }else{
+          this.$message.error('只能上传png/jpeg/gif格式图片');
+          type = false;
+        }
+        return type;
+      },
+      // 实时预览函数
+      realTime(data) {
+        console.log("实时预览函数",data)
+        this.previews = data;
+      },
+      //图片加载的回调 imgLoad 返回结果success, error
+      imgLoad (msg) {
+        console.log("图片加载的回调",msg)
+        // console.log('imgLoad')
+        // console.log(msg)
+      },
+      //将base64转换为blob
+      dataURLtoBlob: function(dataurl) {
+        var  arr = dataurl.split(',')
+        var  mime = arr[0].match(/:(.*?);/)[1]
+        var  bstr = atob(arr[1])
+        var  n = bstr.length
+        var  u8arr = new Uint8Array(n)
+        while (n--) {
+          u8arr[n] = bstr.charCodeAt(n);
+        }
+        return new Blob([u8arr], { type: mime });
+      },
+      //将blob转换为file
+      blobToFile: function(theBlob, fileName){
+        theBlob.lastModifiedDate = new Date();
+        theBlob.name = fileName;
+        return theBlob;
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .mine{
+    height:100%;
+    width:100%;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    *{
+      margin:0;
+    }
+    .mine-page{
+      flex:1;
+      display: flex;
+      overflow: hidden;
+      .left-max-box{
+        width:300px;
+        /*margin:20px;*/
+        margin:5px 20px 20px 10px;
+        box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+        border-radius:10px;
+        .left-title{
+          font-size:18px;
+          text-align: center;
+          line-height: 30px;
+          margin-top:30px;
+          color:#0045af;
+        }
+        .left-user-img{
+          width:130px;
+          height:130px;
+          overflow: hidden;
+          border-radius:50%;
+          margin:30px auto 20px;
+        }
+        .left-name{
+          font-size:20px;
+          line-height:43px;
+          text-align: center;
+        }
+        .left-num{
+          font-size:16px;
+          line-height:38px;
+          text-align: center;
+        }
+        .left-text-max-box{
+          border-top:1px dashed #dedede;
+          border-bottom:1px dashed #dedede;
+          margin:24px 10px 0;
+          padding:20px 0;
+          .left-text-big-box{
+            display: flex;
+            .left-text-big-box-left{
+              width:100px;
+              height:38px;
+              display: flex;
+              margin-right:10px;
+              img{
+                width:16px;
+                height:16px;
+                margin:11px 10px 0;
+              }
+              p{
+                flex:1;
+                font-size:14px;
+                line-height:38px;
+              }
+            }
+            .left-text-big-box-right{
+              height:38px;
+              flex:1;
+              display: flex;
+              .img-one{
+                width:16px;
+                height:14px;
+                margin:12px 10px 0;
+              }
+              .img-two{
+                width:16px;
+                height:16px;
+                margin:11px 10px 0;
+              }
+              p{
+                flex:1;
+                font-size:14px;
+                line-height:38px;
+              }
+            }
+          }
+          .left-text-min-box{
+            display: flex;
+            height:38px;
+            img{
+              width:16px;
+              height:16px;
+              margin:11px 10px 0;
+            }
+            p{
+              flex:1;
+              font-size:14px;
+              line-height:38px;
+            }
+          }
+        }
+        .left-type-text-max-box{
+          padding:20px 0;
+          div{
+            display: flex;
+            p{
+              flex:1;
+              font-size:14px;
+              color:#333;
+              line-height:40px;
+            }
+            p:nth-child(1){
+              text-align: left;
+              margin-left:32px;
+            }
+            p:nth-child(2){
+              text-align: right;
+              margin-right:48px;
+            }
+            .p-color-a{
+              color:#06B924;
+            }
+            .p-color-b{
+              color:#FF9735;
+            }
+          }
+        }
+      }
+      .right-max-box{
+        flex:1;
+        /*margin:20px 20px 20px 0;*/
+        margin:5px 20px 20px 0;
+        box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+        border-radius:10px;
+        display: flex;
+        flex-direction: column;
+        .right-title-box{
+          display: flex;
+          border-bottom:1px solid #dedede;
+          .title-button-min-box{
+            height:90px;
+            margin:0 20px;
+            cursor: pointer;
+            p:nth-child(1){
+              margin-top:6px;
+              line-height:78px;
+              font-size:16px;
+            }
+            p:nth-child(2){
+              height:6px;
+              border-radius:4px;
+            }
+            .bottomColor{
+              color:#0045AF;
+            }
+            .bottomBack{
+              background:#0045AF ;
+            }
+          }
+          .right-null-p{
+            flex:1;
+          }
+          .right-out-button{
+            margin:20px;
+          }
+        }
+        .type-one-max-box{
+          width:100px;
+          margin:40px auto;
+        }
+        .up-data-box{
+          display: inline-block;
+          width:280px;
+          line-height:20px;
+          margin-bottom:30px;
+          .up-data-min-box{
+            .up-data-title{
+              font-size:15px;
+              color:#333;
+            }
+            .up-data-button{
+              width:120px;
+              height:120px;
+              border: 1px dashed #E0E0E0;
+              cursor: pointer;
+              p{
+                text-align: center;
+                color:#999;
+                font-weight:500;
+              }
+              p:nth-child(1){
+                font-size: 20px;
+                line-height:40px;
+                margin-top:20px;
+              }
+              p:nth-child(2){
+                font-size: 16px;
+
+              }
+            }
+            .img-one{
+              width:120px;
+              height:120px;
+            }
+            .img-two{
+              width: 240px;
+              height:80px;
+            }
+          }
+        }
+        .fingerprint_no{
+          >p:nth-of-type(1){
+            color: #666666;
+          }
+          >p:nth-of-type(2){
+            color: #F56C6C;
+          }
+        }
+        .fingerprint_yes{
+          .fingerprint_yes_img{
+            width: 122px;
+            height: 142px;
+            position: relative;
+            >img:nth-of-type(1){
+              width: 122px;
+              height: 142px;
+              position: absolute;
+            }
+            >img:nth-of-type(2){
+              width: 65px;
+              height: 88px;
+              position: absolute;
+              left: 29px;
+              top: 29px;
+            }
+          }
+          >p{
+            color: #666;
+            text-align: center;
+          }
+        }
+        .form-item-min{
+          margin-top:40px;
+        }
+      }
+    }
+  }
+</style>
+<style lang="scss">
+  .up-img-box{
+    .el-dialog__body{
+      padding-top:0;
+    }
+    .img-one{
+      width:560px;
+      height:150px;
+    }
+    .cropper-img{
+      display: block;
+      border:1px solid #e0e0e0;
+      width:360px;
+      height:120px;
+      margin:0 auto;
+    }
+    .cropper-box{
+      width:560px;
+      height:270px;
+      position: relative;
+      .cropper-button{
+        position: absolute;
+        right:10px;top:10px;
+        z-index:1;
+        background: #0183FA;
+        color:#fff;
+        cursor: pointer;
+        padding:5px 10px;
+        margin:0;
+        border-radius:6px;
+      }
+    }
+  }
+  .mine{
+    .mine-page{
+      .input-number-none-box{
+        input{
+          text-align: left;
+        }
+      }
+    }
+  }
+</style>

+ 116 - 0
src/views/secureAccess/approval/indexKDNH.vue

@@ -0,0 +1,116 @@
+<!--准入资格审核-->
+<template>
+  <div class="app-container approval">
+    <div class="top-big-box" v-if="pageType==1||pageType==2||pageType==3">
+      <div>
+        <p :class="pageType==1?'color_one':'color_99'" @click="tableClick(1)">待审核</p>
+        <p :class="{'back_one':pageType==1}"></p>
+      </div>
+      <div>
+        <p :class="pageType==2?'color_one':'color_99'" @click="tableClick(2)">已通过</p>
+        <p :class="{'back_one':pageType==2}"></p>
+      </div>
+      <div>
+        <p :class="pageType==3?'color_one':'color_99'" @click="tableClick(3)">未通过</p>
+        <p :class="{'back_one':pageType==3}"></p>
+      </div>
+      <p class="null-p"></p>
+      <!--<p class="add-button-one-120" @click="tableClick(4)"-->
+      <!--&gt;<i class="el-icon-plus"></i>准入资格配置</p>-->
+    </div>
+    <pending v-if="pageType==1"></pending>
+    <passed v-if="pageType==2"></passed>
+    <failed v-if="pageType==3"></failed>
+    <!--<configuration v-if="pageType==4"></configuration>-->
+    <info-page v-if="pageType==5" :infoData="infoData"></info-page>
+  </div>
+</template>
+<script>
+  import pending from "./pending.vue";
+  import passed from "./passed.vue";
+  import failed from "./failed.vue";
+  // import configuration from "./configuration.vue";
+  import infoPage from "./infoPageKDNH.vue";
+
+export default {
+  components: {
+    pending,
+    passed,
+    failed,
+    // configuration,
+    infoPage
+  },
+  name: "Approval",
+  data() {
+    return {
+      pageType:1,
+      pageTypeTwo:1,
+      infoData:{
+        type:null,
+        list:0,//type=0,审核,1查看
+      }
+    };
+  },
+  created() {
+
+  },
+  methods: {
+    pageClick(type,row){
+      this.infoData.type = type;
+      this.infoData.list = row;
+      this.pageType = 5;
+    },
+    pageOff(){
+      // this.pageType = JSON.parse(JSON.stringify(this.pageTypeTwo));
+      this.pageType = this.pageTypeTwo;
+    },
+    //选项卡切换
+    tableClick(type){
+      if(this.pageType!=type){
+        if(type == 4){
+          // this.pageTypeTwo = JSON.parse(JSON.stringify(this.pageType));
+          this.pageTypeTwo = this.pageType;
+        }
+        this.pageType = type;
+      }
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+  .approval {
+    display: flex!important;
+    flex-direction: column;
+    box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    padding:20px!important;
+    .top-big-box{
+      display: flex;
+      border-bottom:2px solid #E0E0E0;
+      margin-top:-9px;
+      margin-bottom:32px;
+      div{
+        cursor:pointer;
+        width:128px;
+        p:nth-child(1){
+          line-height:58px;
+          font-size:18px;
+          text-align: center;
+          margin:0;
+        }
+        p:nth-child(2){
+          width:80px;
+          height:4px;
+          margin:0 auto;
+          border-radius:1px;
+        }
+      }
+      .null-p{
+        flex:1;
+      }
+      .add-button-one-120{
+        margin-top:9px;
+        margin-right:20px;
+      }
+    }
+  }
+</style>

+ 528 - 0
src/views/secureAccess/approval/infoPageKDNH.vue

@@ -0,0 +1,528 @@
+<!--准入审核详情-->
+<template>
+  <div class="info-page" v-if="pageType">
+    <div class="top-title-box">
+      <p>准入信息</p>
+      <p class="button-p reset-button-one" @click="backPage">返回</p>
+    </div>
+    <!--<div class="item-max-box" style="margin-top:30px;">-->
+      <!--<div class="item-title-box">{{subjectData.labSecurityApply.userType == '11'?'教师信息(关联教师信息材料):':(subjectData.labSecurityApply.userType == '22'?'学生信息(关联学生信息材料):':'')}}</div>-->
+      <!--<div class="item-user-box">-->
+        <!--<div>姓名:{{subjectData.labSecurityApply.userName}}</div>-->
+        <!--<div>{{subjectData.labSecurityApply.userType == '11'?'工号:':(subjectData.labSecurityApply.userType == '22'?'学号:':'')}}{{subjectData.labSecurityApply.userNumber}}</div>-->
+        <!--<div>学院:{{subjectData.labSecurityApply.deptName}}</div>-->
+        <!--<div v-if="subjectData.labSecurityApply.userType == '22'">专业:{{subjectData.labSecurityApply.major}}</div>-->
+      <!--</div>-->
+    <!--</div>-->
+    <div class="admittance_info">
+      <li>申请实验室:<i>{{subjectData.labSecurityApply.laboratoryDeptName}}-{{subjectData.labSecurityApply.subjectName}}</i></li>
+      <li>实验室负责人:<i>{{subjectData.fzrsysUser[0].nick_name}}</i></li>
+      <li>申请时间:<i>{{subjectData.labSecurityApply.creatTime}} {{subjectData.labSecurityApply.hi}}</i></li>
+      <li>有效期:<i>{{subjectData.labSecurityApply.validBeginTime}} 至 {{subjectData.labSecurityApply.validEndTime}}</i></li>
+      <li>申请状态:<i>{{subjectData.labSecurityApply.auditStatus == 0?'待审核':(subjectData.labSecurityApply.auditStatus == 1?'已驳回':(subjectData.labSecurityApply.auditStatus == 2?'已通过':''))}}</i></li>
+      <li v-if="isLook">审核时间:<i>{{subjectData.labSecurityApply.auditTime}}</i></li>
+      <li v-if="isLook">审核人:<i>{{subjectData.labSecurityApply.auditName}}</i></li>
+      <li v-if="isLook">审核备注:<i>{{subjectData.labSecurityApply.rejectCause}}</i></li>
+    </div>
+    <div class="admittance_materials">
+      <p class="admittance_materials_title">准入材料</p>
+      <div v-for="(item,index) in subjectData.listTemp" :key="index">
+        <div class="item-title-box" v-if="item.materialType==2&&item.relationType==1"><i style="color: #F56C6C;">*</i>身份信息:(关联学生信息材料)</div>
+        <div class="identity" v-if="item.materialType==2&&item.relationType==1">
+          <li>姓名:<i>{{subjectData.sysUser.nickName}}</i></li>
+          <li>学号:<i>{{subjectData.sysUser.userName}}</i></li>
+          <li>卡号:<i>{{subjectData.sysUser.cardNum}}</i></li>
+          <li>联系方式:<i>{{subjectData.sysUser.phonenumber}}</i></li>
+          <li>导师:<i>{{subjectData.sysUser.tutorUserName}}</i></li>
+          <li>班级:<i>{{subjectData.sysUser.grade}}</i></li>
+          <li>学院:<i>{{subjectData.labSecurityApply.deptName}}</i></li>
+          <li>专业:<i>{{subjectData.sysUser.major}}</i></li>
+          <li>申请备注:<i>{{subjectData.labSecurityApply.applyCause}}</i></li>
+        </div>
+        <div class="item-title-box" v-if="item.materialType==1"><i style="color: #F56C6C;">*</i>{{item.materialName}}</div>
+        <div class="file_list"  v-for="(minItem,minIndex) in item.upList">
+          <el-checkbox  @change="checkedImg(minItem)" v-if="isLook" >{{minItem.name}}</el-checkbox>
+          <i v-if="!isLook" >{{minItem.name}}</i>
+          <i class="file_list_look" @click="lookFile(minItem)">查看</i>
+<!--          <a class="file_list_look" :href="item2.dataUrl.split(';')[1].replace(/,/g,'')" target="_blank">查看</a>-->
+          <i v-if="isLook" class="file_list_look" @click="handleExport(1,minItem)">下载</i>
+        </div>
+      </div>
+      <div class="item-title-box" v-if="subjectData.labSecurityApply.auditStatus!=2">审核备注:</div>
+      <el-input type="textarea" style="margin-top: 20px" v-model="rejectCause" placeholder="请输入审核备注" maxlength="50" v-if="subjectData.labSecurityApply.auditStatus!=2"/>
+     <div class="btn_list">
+       <p v-if="isLook" class="button-p reset-button-one" style="width:100px;" @click="handleExport(2,'')">打包下载</p>
+       <p v-if="isLook&&subjectData.labSecurityApply.auditStatus!=2" class="inquire-button-one" style="width:100px;" @click="backPage()">确定</p>
+       <p v-if="!isLook" class="button-p reset-button-one" style="width:100px;" @click="auditClick(1)">驳回</p>
+       <p v-if="!isLook" class="inquire-button-one" style="width:100px;" @click="auditClick(2)">通过</p>
+     </div>
+    </div>
+    <div v-for="(item,index) in subjectData.listTemp" :key="index">
+<!--      <div class="item-max-box" style="margin-top:30px;" v-if="item.materialType==2&&item.relationType==1">
+        <div class="item-title-box">{{subjectData.labSecurityApply.userType == '11'?'教师信息(关联教师信息材料):':(subjectData.labSecurityApply.userType == '22'?'学生信息(关联学生信息材料):':'')}}</div>
+        <div class="item-user-box">
+          <div>
+            <p>姓名:</p>
+            <p>{{subjectData.labSecurityApply.userName}}</p>
+          </div>
+          <div>
+            <p>{{subjectData.labSecurityApply.userType == '11'?'工号:':(subjectData.labSecurityApply.userType == '22'?'学号:':'')}}</p>
+            <p>{{subjectData.labSecurityApply.userNumber}}</p>
+          </div>
+          <div>
+            <p>学院:</p>
+            <p>{{subjectData.labSecurityApply.deptName}}</p>
+          </div>
+          <div v-if="subjectData.labSecurityApply.userType == '22'">
+            <p>专业:</p>
+            <p>{{subjectData.labSecurityApply.userMajor}}</p>
+          </div>
+        </div>
+      </div>-->
+<!--      <div class="item-max-box" v-if="item.materialType==2&&item.relationType==2&&subjectData.labSecurityApply.userType == '22'">
+        <div class="item-title-box">安全考试证书:</div>
+        <img v-if="subjectData.listcert[0]" class="item-img-box" :src="subjectData.listcert[0].cert_url">
+        <p v-if="!subjectData.listcert[0]" style="margin-left:40px;color:#999;font-size:14px;">暂无证书</p>
+      </div>
+      <div class="item-max-box" v-if="item.materialType==1">
+        <div class="item-title-box">{{item.materialName}}:</div>
+        <div class="item-for-text-box">
+          <p :class="iframeSrc[index].forIndex == minIndex ?'color-p':''" v-for="(minItem,minIndex) in item.upList" @click="forClick(minItem,minIndex,index)">{{minItem.name}}</p>
+        </div>
+        <iframe
+          class="item-html-box"
+          :src="iframeSrc[index].url" scrolling="auto" frameborder="0">
+        </iframe>
+      </div>-->
+    </div>
+
+    <!-- 添加或修改安全准入申请材料配置对话框 -->
+    <el-dialog title="准入资格审核-未通过" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="未通过材料" prop="materialName">
+          <el-checkbox-group v-model="checkList">
+            <el-checkbox :label="item.id" style="display: block" v-for="(item,index) in subjectData.listTemp" :key="index">{{item.materialName}}</el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="未通过原因" prop="rejectCause">
+          <el-input type="textarea" v-model="form.rejectCause" placeholder="请输入未通过原因" maxlength="100"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="laboratoryApply(1)">确 定</el-button>
+        <!--<el-button @click="cancel">取 消</el-button>-->
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+let Base64 = require('js-base64').Base64;
+import {downloadwBatch, getDetails, laboratoryApply} from "@/api/laboratory/approval";
+import {optionHazard} from "@/api/laboratory/hazard";
+  export default {
+    name: "info-page",
+    props:{
+      infoData: {},
+    },
+    data() {
+      return {
+        pageType:false,
+        forIndex:0,
+        subjectData:{},
+        iframeSrc:[],
+        open:false,
+        form:{},
+        checkList:[],
+        rejectCause:'',//审核备注
+        isLook:false,//判断是查看还是审核
+        //打包下载查询参数
+        packDown:{
+          userName:'',
+          userNumber:'',
+          subjectName:'',
+          fileList:'',
+
+        },
+        mrList:[],
+        // 表单校验
+        rules: {
+          name: [
+            { required: true, message: "请输入检查项名称", trigger: "blur" },
+            { required: true, message: "请输入检查项名称", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          code: [
+            { required: true, message: "请输入条款号", trigger: "blur" },
+            { required: true, message: "请输入条款号", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+      };
+    },
+    created() {
+
+      if(this.infoData.type==0){
+        this.isLook=false;
+
+      }else if(this.infoData.type==1){
+        this.isLook=true;
+      }
+      this.getDetails();
+
+
+    },
+    methods: {
+      lookFile(item){
+        let visitUrl=window.location.href.split('://')[0]+'://'+process.env.VUE_APP_BASE_API+'/admin/'+item.url;
+        console.log(visitUrl)
+        window.open(localStorage.getItem('filePreviewUrl') + '/onlinePreview?url='+encodeURIComponent(Base64.encode(visitUrl)));
+
+      },
+      /** 导出按钮操作 */
+      handleExport(type,item) {
+        console.log(item)
+        if(type==1){//单个
+          this.packDown.userName=this.subjectData.sysUser.nickName
+          this.packDown.userNumber=this.subjectData.sysUser.userName
+          this.packDown.subjectName=this.subjectData.labSecurityApply.subjectName
+          let visitUrl=item.name+';'+item.url+',';
+
+          this.packDown.fileList=visitUrl
+
+          this.download('/laboratory/apply/downloadwBatch', {
+            ...this.packDown
+          }, this.packDown.userName+'_'+this.packDown.userNumber+'_'+this.packDown.subjectName+`.zip`)
+
+
+
+
+
+        }else if(type==2){// 打包下载
+          console.log(this.mrList)
+          if(this.mrList.length<=0){
+            this.msgInfo("请先勾选需要打包下载的文件!");
+          }else{
+            let list=[];
+            this.mrList.forEach(function (item){
+                list.push(item+',')
+            })
+            console.log(list)
+            this.packDown.userName=this.subjectData.sysUser.nickName
+            this.packDown.userNumber=this.subjectData.sysUser.userName
+            this.packDown.subjectName=this.subjectData.labSecurityApply.subjectName
+            this.packDown.fileList= list.join('@@')
+
+
+
+            this.download('/laboratory/apply/downloadwBatch', {
+              ...this.packDown
+            }, this.packDown.userName+'_'+this.packDown.userNumber+'_'+this.packDown.subjectName+`.zip`)
+          }
+
+        }
+
+
+      },
+      checkedImg(item){
+        console.log(item)
+        if(event.target.checked==false){
+          this.mrList.splice(this.mrList.indexOf(item.url),1);
+        }else{
+          this.mrList.push(item.name+';'+item.url)
+        }
+        console.log(this.mrList)
+
+
+      },
+      //审核按钮
+      auditClick(type){
+        let self = this;
+        if(type == 1){
+          this.open = true;
+        }else if(type == 2){
+          this.$confirm('是否确认审核?', "", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            self.laboratoryApply(type);
+          }).then(() => {}).catch(() => {});
+        }
+      },
+      laboratoryApply(type){
+        let obj = {
+          id:this.infoData.list.id,
+          auditStatus:type,
+          rejectCause:this.rejectCause
+        };
+        if(type == 1){
+          obj.rejectCause = this.form.rejectCause;
+          obj.rejectMaterial = this.checkList + '';
+        }
+        laboratoryApply(obj).then(response => {
+          if(response.code==200){
+            this.msgSuccess("操作成功");
+            this.$parent.tableClick(1);
+          }else if(response.code==205){
+            this.$confirm(response.msg, "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(() => {
+              //  确定
+              this.$router.push({ path: '/comprehensive/laboratoryManagement/accessAuthorization-KDNH' });
+            }).catch(function() {
+              //  取消
+              this.$parent.tableClick(1);
+            });
+          }
+        })
+      },
+      //点击切换文件
+      forClick(item,index,bigIndex){
+        this.iframeSrc[bigIndex].forIndex = index;
+        this.iframeSrc[bigIndex].url = this.urlJudge(item.url)
+      },
+      //获取数据
+      getDetails(){
+        let self = this;
+        getDetails({id:this.infoData.list.id}).then(response => {
+          let dataList = [];
+          for(let i=0;i<response.data.listTemp.length;i++){
+            if(response.data.listTemp[i].materialType == 2 && response.data.listTemp[i].materialType == 2){
+              dataList.unshift(response.data.listTemp[i]);
+            }
+          }
+          for(let i=0;i<response.data.listTemp.length;i++){
+            if(response.data.listTemp[i].materialType == 1){
+              dataList.push(response.data.listTemp[i]);
+            }
+          }
+          for(let i=0;i<response.data.listTemp.length;i++){
+            if(response.data.listTemp[i].materialType == 2 && response.data.listTemp[i].materialType == 1){
+              dataList.unshift(response.data.listTemp[i]);
+            }
+          }
+          this.$set(response.data,'listTemp',dataList);
+          let newList = [];
+          for(let i=0;i<response.data.listTemp.length;i++){
+            if(response.data.listTemp[i].materialType == 1){
+              let maxList = [];
+              for(let o=0;o<response.data.listTemp[i].listMr.length;o++){
+                let bigList = response.data.listTemp[i].listMr[o].dataUrl.split(',');
+                for(let x=0;x<bigList.length;x++){
+                  if(bigList[x]){
+                    let minList = bigList[x].split(';');
+                    let obj = {
+                      name:minList[0],
+                      url:minList[1],
+                    };
+                    maxList.push(obj);
+                  }
+                }
+              }
+              response.data.listTemp[i].upList = maxList;
+              let obj ={};
+              if(maxList.length>0){
+                 obj = {
+                  forIndex:0,
+                  url:this.urlJudge(maxList[0].url)
+                }
+              }
+              newList.push(obj);
+            }else{
+              let obj = {
+                forIndex:"",
+                url:""
+              }
+              newList.push(obj);
+            }
+          }
+          this.$set(this,"iframeSrc",newList);
+          this.$set(this,"subjectData",response.data);
+          //审核备注
+          if(this.isLook){
+
+            this.rejectCause=response.data.labSecurityApply.rejectCause
+          }
+          this.$forceUpdate()
+          this.pageType = true;
+        })
+      },
+      //返回
+      backPage(){
+        if(this.isLook){
+          this.$parent.tableClick(2);
+        }else{
+          this.$parent.tableClick(1);
+        }
+
+      },
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .info-page {
+    flex:1;
+    display: flex!important;
+    flex-direction: column;
+    /*box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);*/
+    /*border-radius:10px;*/
+    .top-title-box{
+      display: flex;
+      border-bottom: 1px solid #E0E0E0;
+      /*padding-top:20px;*/
+      p:nth-child(1){
+        flex: 1;
+        line-height:60px;
+        color: #0045AF;
+        font-size:18px;
+        margin:0 0 0 40px;
+      }
+      p:nth-child(2){
+        margin-right:20px;
+      }
+      p:nth-child(3){
+        margin-right:20px;
+      }
+      p:nth-child(4){
+        margin-right:20px;
+      }
+    }
+    /*准入信息*/
+    .admittance_info{
+      display: flex;
+      justify-content: flex-start;
+      flex-wrap: wrap;
+      padding-left: 80px;
+      box-sizing: border-box;
+      >li{
+        list-style-type:none;
+        font-size: 16px;
+        font-family: Microsoft YaHei;
+        font-weight: 500;
+        color: #999999;
+        line-height: 70px;
+        margin-right: 20px;
+        >i{
+          margin-left: 10px;
+          display: inline-block;
+          font-style:normal;
+          font-size: 16px;
+          font-family: Microsoft YaHei;
+          font-weight: 500;
+          color: #333333;
+          line-height: 70px;
+        }
+      }
+    }
+    /*准入材料*/
+    .admittance_materials{
+      padding-left: 40px;
+      box-sizing: border-box;
+      .admittance_materials_title{
+        flex: 1;
+        line-height:60px;
+        color: #0045AF;
+        font-size:18px;
+
+        border-bottom: 1px solid #E0E0E0;
+        margin-top: 0;
+      }
+      .identity{
+        display: flex;
+        justify-content: flex-start;
+        flex-wrap: wrap;
+        padding-left: 40px;
+        box-sizing: border-box;
+        >li{
+          list-style-type:none;
+          font-size: 16px;
+          font-family: Microsoft YaHei;
+          font-weight: 500;
+          color: #999999;
+          line-height: 70px;
+          margin-right: 20px;
+          >i{
+            margin-left: 10px;
+            display: inline-block;
+            font-style:normal;
+            font-size: 16px;
+            font-family: Microsoft YaHei;
+            font-weight: 500;
+            color: #333333;
+            line-height: 70px;
+          }
+        }
+      }
+      .file_list{
+        padding-left: 80px;
+        box-sizing: border-box;
+        >i{
+          font-style: normal;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: bold;
+          color: #0183FA;
+          line-height: 70px;
+        }
+        .file_list_look{
+          padding-left: 40px;
+          cursor: pointer;
+          font-style: normal;
+          font-size: 14px;
+          font-family: Microsoft YaHei;
+          font-weight: bold;
+          color: #0183FA;
+          line-height: 70px;
+        }
+
+      }
+      .btn_list{
+        text-align: center;
+        margin-top: 40px;
+        >p{
+          margin-right: 20px;
+        }
+      }
+    }
+    .item-max-box{
+      .item-title-box{
+        margin-left:50px;
+        font-size:16px;
+        line-height:80px;
+      }
+      .item-user-box{
+        display: flex;
+        margin-left:65px;
+        div{
+          display: flex;
+          margin-right:60px;
+          font-size:14px;
+        }
+      }
+      .item-img-box{
+        width:240px;
+        margin-left:50px;
+      }
+      .item-for-text-box{
+        margin-left:77px;
+        p{
+          display: inline-block;
+          font-size:14px;
+          line-height:40px;
+          margin:0 57px 0 0;
+        }
+        .color-p{
+          color:#0045AF;
+        }
+      }
+      .item-html-box{
+        margin:20px 0 40px 58px;
+        width:900px;
+        height:900px;
+        background: #F5F5F5;
+      }
+    }
+  }
+</style>

+ 710 - 0
src/views/secureAccess/whitelist/addPageKDNH.vue

@@ -0,0 +1,710 @@
+<!--白名单新增-->
+<template>
+  <div class="add-whitelist">
+    <div class="top-max-button-title-box">
+      <p>新增准入白名单</p>
+      <p class="button-p reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="form-max-box">
+      <div class="left">
+        <el-form :model="form" ref="drawerForm" :rules="rules" >
+          <el-form-item label="姓名" prop="userIds" style="margin-top:40px;">
+            <el-select
+              :disabled="isEdit"
+              v-model="form.userIds"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请输入姓名"
+              :remote-method="userSelectList"
+              @change="selectChange"
+              :loading="loading">
+              <el-option
+                v-for="item in optionsUser"
+                :key="item.userId"
+                :label="item.nickName"
+                :value="item.userId">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <div class="for-max-box">
+            <div class="for-box" v-for="(item,index) in userList" :key="index">
+              <div class="for-min-box">
+                <p>{{item.deptName ? item.deptName+'-'+item.userName:item.userName}}</p>
+                <img src="@/assets/newImages/off.png" @click="delItem(index)" v-if="!isEdit">
+              </div>
+            </div>
+          </div>
+          <p class="inquire-button-one" style="margin:100px 50px;" @click="upButton">提交</p>
+        </el-form>
+      </div>
+      <div class="right">
+        <div style="text-align: right;margin: 20px;" class="right_t"> <p class="inquire-button-one"  style="width: 150px" @click="newAdmittance">新增准入实验室</p></div>
+        <el-table class="right_b" border v-loading="loading" :data="subjectList">
+          <el-table-column label="申请实验室" align="left" prop="name" />
+          <el-table-column label="楼栋" align="left" prop="building" />
+          <el-table-column label="楼层" align="left" prop="buildName" />
+          <el-table-column label="学院" align="left" prop="deptName" />
+          <el-table-column label="实验室负责人" align="left" prop="adminName" />
+          <el-table-column label="安全分级" align="left" prop="levelName" />
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <div class="button-box">
+                <p class="table-min-button"  @click="handleClick(scope.$index, scope.row,'delete')" ><i class="el-icon-delete"></i>删除</p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <!--关联实验室弹框-->
+    <el-dialog title='新增准入实验室' @close="handleClose" :visible.sync="dialogVisible" width="80%">
+      <el-form :model="dialogForm" ref="dialogForm" :inline="true" label-width="140px">
+        <el-form-item label="实验室名称" prop="name" >
+          <el-input
+            v-model="dialogForm.name"
+            placeholder="请输入实验室名称"
+            clearable
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="楼栋" prop="buildId">
+          <el-select v-model="dialogForm.buildId" placeholder="请选择楼栋" clearable  @change="buildChange">
+            <el-option v-for="(item,index) in buildsDataList" :key="index" :label="item.deptName" :value="item.deptId" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="楼层" prop="floorId">
+          <el-select v-model="dialogForm.floorId" placeholder="请选择楼层" >
+            <el-option
+              v-for="dict in floorList"
+              :key="dict.id"
+              :label="dict.name"
+              :value="dict.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <p class="inquire-button-one" style="margin-left:20px;" @click="onSearch">查询</p>
+          <p class="reset-button-one" style="margin-left:20px;" @click="resetForm">重置</p>
+        </el-form-item>
+      </el-form>
+      <div class="btn_list">
+        <i class="el-icon-warning"></i>
+        <i>已选择 {{labWhiteJoinSubList.length}} 项</i>
+        <i @click="toggleSelection(dialogTable)">全选本页</i>
+        <!--        <i>选择全部</i>-->
+        <i></i>
+        <i @click="toggleSelection()">清除选项</i>
+        <div class="bottom-button-box">
+          <el-button class="color_99" @click="closeDialog(1)">关闭</el-button>
+          <el-button class="color_ff back_one" @click="closeDialog(2)">确定</el-button>
+        </div>
+      </div>
+      <el-table ref="multipleTable" border tooltip-effect="dark" :row-key="getRowKeys" :data="dialogTable"
+                highlight-current-row @selection-change="handleSelectionChange" style="cursor: pointer;height:500px;">
+        <el-table-column type="selection"  width="55" :reserve-selection="true" align="center"></el-table-column>
+        <el-table-column label="申请实验室名称" show-overflow-tooltip align="left" prop="name"/>
+        <el-table-column label="楼栋" align="left" prop="building" />
+        <el-table-column label="楼层" align="left" prop="buildName" />
+        <el-table-column label="学院" align="left" prop="deptName" />
+        <el-table-column label="实验室负责人" align="left" prop="adminName" />
+        <el-table-column label="安全分级" align="left" prop="levelName" >
+          <template slot-scope="scope">
+            <span :style="'color:'+scope.row.fiedColor+';'">{{scope.row.levelName}}</span>
+          </template>
+        </el-table-column>
+
+      </el-table>
+      <pagination :page-sizes="[20, 30, 40, 50]"
+        v-show="total>0"
+        :total="total"
+        :page.sync="dialogForm.pageNum"
+        :limit.sync="dialogForm.pageSize"
+        @pagination="getUserRoleBySub"
+      />
+<!--      <div class="bottom-button-box" style="padding-top: 20px;text-align: right;">
+        <el-button class="color_99" @click="closeDialog()">取消</el-button>
+        <el-button class="color_ff back_one" @click="confirmDialog()">确定</el-button>
+      </div>-->
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getAllSubjectByParame,
+  selectUserListByName,
+  whitelistAddList,
+  whitelistEdit, whitelistEditList,
+  whitelistList,
+  whitelistSubListEdit
+} from "@/api/laboratory/whitelist";
+  import {listInfo} from "@/api/laboratory/gradeManage";
+  import {delPlan, getUserRoleBySub} from "@/api/laboratory/plan";
+  import {buildsList} from "@/api/laboratory/sparseHardware";
+  import {listFloorByBuildId} from "@/api/laboratory/building";
+  export default {
+    name: "add-whitelist",
+    props:{
+      pageData:{},
+    },
+    data() {
+      return {
+        isEdit:false,
+        form:{},
+        loading:false,
+        // 表单校验
+        rules: {
+          userIds: [
+            { required: true, message: "请输入标题", trigger: "blur" },
+            { required: true, message: "请输入标题", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+        },
+        //展示数组
+        userList:[],
+        //搜索角色数组
+        optionsUser:[],
+        queryParams:{
+          pageNum:1,
+          pageSize:20,
+        },
+        total:0,
+        subjectList:[],
+        dialogVisible:false,
+        dialogForm:{
+          pageNum: 1,
+          pageSize:20,
+          name: null,
+          floorId: null,
+          whiteUserId:null,
+          deptId:JSON.parse(localStorage.getItem('user')).deptId,
+
+        },
+        dialogTable:[],
+        buildsDataList:[],
+        floorList:[],
+        labWhiteJoinSubList:[],
+        arr:[],
+
+      };
+    },
+    created() {
+      if(this.pageData.id){
+        console.log('编辑')
+        this.isEdit=true;
+        this.whitelistEdit();
+        this.whitelistSubListEdit();
+        this.dialogForm.whiteUserId=this.pageData.userId;
+        this.getUserRoleBySub();
+      }else{
+        this.isEdit=false;
+        this.getUserRoleBySub();
+      }
+      this.buildsList();
+    },
+    methods: {
+
+      getRowKeys(row) {
+        return row.subjectId;   //指定row-key的一个标识
+      },
+      //关闭实验室弹窗
+      closeDialog(type){
+        if(type == 1){
+          this.dialogVisible=false;
+        }else if(type == 2){
+          this.subjectList = JSON.parse(JSON.stringify(this.labWhiteJoinSubList));
+          this.dialogVisible=false;
+        }
+      },
+      //监听关联记录弹窗关闭
+      handleClose(){
+        console.log('弹窗关闭');
+        /*if(this.arr){
+          console.log('实验室信息回显')
+          this.$nextTick(() => {
+            this.arr.forEach(row => {
+              this.$refs.multipleTable.toggleRowSelection(row,true);
+            });
+          })
+        }*/
+      },
+      //取消选中
+      toggleSelection(rows) {
+        let _this=this;
+        if (rows) {
+         // this.$refs.multipleTable.clearSelection();
+          rows.forEach(row => {
+            this.$refs.multipleTable.toggleRowSelection(row,true);
+            //_this.arr.push(row)
+            //_this.subjectList.push(row)
+          });
+
+        } else {
+          this.$refs.multipleTable.clearSelection();
+        }
+      },
+      //选中实验室
+      handleSelectionChange(val){
+        console.log(val)
+        console.log(this.labWhiteJoinSubList)
+        let _this=this;
+        this.labWhiteJoinSubList=[];
+        this.labWhiteJoinSubList=val;
+
+        // _this.subjectList=this.labWhiteJoinSubList
+        _this.arr=this.labWhiteJoinSubList
+
+      },
+      //查询楼栋
+      buildsList(){
+        buildsList().then( response => {
+          this.buildsDataList = response.data;
+        });
+      },
+      //选择楼栋
+      buildChange(e){
+        console.log("选择楼栋",e)
+        //根据学院获取楼栋
+        listFloorByBuildId(this.dialogForm.buildId).then(response => {
+          this.$set(this,'floorList', response.data)
+          this.$set(this.form,'floorId', "")
+        });
+      },
+      //查询
+      onSearch() {
+        this.dialogForm.pageNo = 1;
+        this.getUserRoleBySub();
+      },
+      //重置
+      resetForm() {
+        this.dialogForm.name = '';
+        this.dialogForm.floorId = '';
+        this.dialogForm.buildId = '';
+        this.floorList=[];
+        this.onSearch();
+      },
+      //新增准入实验室
+      newAdmittance(){
+        let _this=this;
+        this.dialogVisible=true;
+        if(_this.subjectList[0]){
+          setTimeout(function(){
+            _this.$refs.multipleTable.clearSelection();
+            console.log("============>1")
+            _this.subjectList.forEach(row => {
+              console.log("============>2")
+              _this.$refs.multipleTable.toggleRowSelection(row,true);
+            });
+            _this.getUserRoleBySub();
+          },100);
+        }else{
+          if(_this.$refs.multipleTable){
+            _this.$refs.multipleTable.clearSelection();
+          }
+        }
+        // if(this.arr){
+        //   console.log('实验室信息回显')
+        //   console.log(this.arr)
+        //   if(_this.arr.length==0){
+        //     if(_this.$refs.multipleTable){
+        //       _this.$refs.multipleTable.clearSelection();
+        //     }
+        //   }else{
+        //     _this.$nextTick(() => {
+        //       setTimeout(function(){
+        //         console.log("============>1")
+        //         _this.subjectList.forEach(row => {
+        //           console.log("============>2")
+        //           _this.$refs.multipleTable.toggleRowSelection(row,true);
+        //         });
+        //       },300);
+        //     })
+        //   }
+        // }
+      },
+      //确认按钮
+      confirmDialog(){
+          let _this=this;
+         /*if(_this.labWhiteJoinSubList){
+           _this.subjectList= _this.labWhiteJoinSubList
+           _this.arr= _this.labWhiteJoinSubList
+           _this.dialogVisible=false;
+         }*/
+      },
+      //编辑查询人员信息
+      whitelistEdit(){
+        whitelistEdit(this.pageData.id).then(response => {
+          let data=response.data;
+          console.log(data)
+          if(data.userId){
+            this.$set(this.form,'userIds',data.userName)
+            this.userSelectList(data.userName);
+            //this.userList=data
+            let obj = {
+              deptId:data.deptId,
+              deptName:data.deptName,
+              userId:data.userId,
+              userName:data.userName,
+              userNumber:data.userName,
+              userTelephone:data.phonenumber,
+              userType:data.userType,
+            }
+            this.userList.push(obj);
+          }
+        });
+      },
+      //编辑-查询实验室信息
+      whitelistSubListEdit(){
+        whitelistSubListEdit(this.pageData.userId).then(response => {
+          if(response.code==200){
+            let data=response.rows;
+            this.subjectList=data
+          }
+
+        });
+      },
+      /** 查询实验室列表 */
+      getUserRoleBySub() {
+        this.loading = true;
+        let _this=this;
+        getAllSubjectByParame(this.dialogForm).then(response => {
+          if(response.code==200){
+            this.dialogTable = response.rows;
+            this.total = response.total;
+            this.loading = false;
+            console.log(_this.subjectList)
+            console.log(_this.arr)
+            if(_this.arr.length==0){
+              _this.dialogTable.forEach(function (item,index){
+                _this.subjectList.forEach(function (item2,index2){
+                  if(item.subjectId==item2.subjectId){
+                    _this.arr.push(item)
+                    console.log(_this.arr)
+                    if(_this.$refs.multipleTable){
+                      _this.$nextTick(() => {
+                        _this.$refs.multipleTable.toggleRowSelection(item,true);
+                      })
+                    }
+
+                  }
+                })
+              })
+            }else{
+
+              _this.dialogTable.forEach(function (item,index){
+                _this.arr.forEach(function (item2,index2){
+                  if(item.subjectId==item2.subjectId){
+                    if(_this.$refs.multipleTable){
+                      _this.$nextTick(() => {
+                        _this.$refs.multipleTable.toggleRowSelection(item,true);
+                      })
+                    }
+
+                  }
+                })
+              })
+            }
+
+          }
+        });
+
+      },
+
+      // 上传按钮
+      upButton(){
+        let self = this;
+        if(!this.userList[0]){
+          this.msgError("请先添加人员")
+          return
+        }
+        this.$confirm('是否确认提交?', "", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+            console.log(444444)
+            console.log(self.pageData.id)
+
+          if(self.pageData.id){
+            console.log('编辑提交')
+            self.whitelistEditList();
+          }else{
+            console.log('新增提交')
+            self.whitelistAddList();
+          }
+        }).then(() => {}).catch(() => {});
+      },
+      //新增提交
+      whitelistAddList(){
+        let labWhiteJoinSubList=[];
+        this.subjectList.forEach(function (item,index){
+          labWhiteJoinSubList.push({'subjectId':item.subjectId})
+        })
+        let obj = {
+          labWhitelist:this.userList,
+          labWhiteJoinSubList:labWhiteJoinSubList
+        }
+        whitelistAddList(obj).then(response => {
+
+          if(response.code==200){
+            this.msgSuccess("操作成功")
+            this.backPage();
+          }else if(response.code==205){
+            this.$confirm(response.msg, "警告", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning"
+            }).then(() => {
+              //  确定
+              this.$router.push({ path: '/comprehensive/laboratoryManagement/accessAuthorization-KDNH' });
+            }).catch(function() {
+              //  取消
+              this.backPage();
+            });
+          }
+        });
+      },
+      //编辑提交
+      whitelistEditList(){
+        console.log(this.subjectList)
+        let labWhiteJoinSubList=[];
+        //循环取出实验室id
+        this.subjectList.forEach(function (item,index){
+          labWhiteJoinSubList.push({'subjectId':item.subjectId})
+        })
+        let obj = {
+          userId:this.userList[0].userId,
+          labWhiteJoinSubList:labWhiteJoinSubList
+        }
+        whitelistEditList(obj).then(response => {
+          this.msgSuccess("操作成功")
+          this.backPage();
+        });
+      },
+      handleClick(index, row, doType){
+        console.log(this.subjectList)
+        let _this=this;
+        if(doType == 'delete'){//定制预案
+          this.$confirm('是否确认删除?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(() => {
+            if(_this.$refs.multipleTable){
+              _this.$refs.multipleTable.toggleRowSelection(row,false);
+            }
+            //this.subjectList.splice(this.subjectList.indexOf(row),1);
+            let index = this.subjectList.indexOf(row);
+            if(index!=-1){
+              this.subjectList.splice(index,1);
+              return
+            }
+
+
+            _this.arr=[];
+            _this.subjectList.forEach(function (item,index){
+              _this.dialogTable.forEach(function (item2,index2){
+                if(item.subjectId==item2.subjectId){
+                  _this.arr.push(item2)
+                }else{
+                }
+              })
+            })
+
+
+            this.msgSuccess("删除成功");
+          }).catch(() => {
+            this.msgInfo("取消成功");
+          });
+        }
+      },
+      //删除
+      delItem(index){
+        this.userList.splice(index,1);
+      },
+      //新增
+      selectChange(id){
+        let self = this;
+        for(let o=0;o<self.optionsUser.length;o++){
+          if( id == self.optionsUser[o].userId){
+            let num = 0;
+            for(let s=0;s<self.userList.length;s++){
+              if(self.userList[s].userId == self.optionsUser[o].userId){
+                num++
+              }
+            }
+            if(num == 0){
+              let obj = {
+                deptId:self.optionsUser[o].deptId,
+                deptName:self.optionsUser[o].deptName,
+                userId:self.optionsUser[o].userId,
+                userName:self.optionsUser[o].nickName,
+                userNumber:self.optionsUser[o].userName,
+                userTelephone:self.optionsUser[o].phonenumber,
+                userType:self.optionsUser[o].userType,
+              }
+              self.userList.push(obj);
+            }else{
+              self.msgError(self.optionsUser[o].nickName+'已在列表中')
+            }
+          }
+        }
+      },
+      //返回
+      backPage(){
+        this.$parent.pageClick(1);
+      },
+      //数据懒加载
+      userSelectList(query) {
+        if (query !== '' && query.length>1) {
+          this.loading = true;
+          this.userSelectList.nickName=query;
+          selectUserListByName(query).then(response => {
+            this.optionsUser = response.data;
+            this.loading = false;
+          });
+        } else {
+          this.optionsUser = [];
+        }
+      },
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .add-whitelist {
+    display: flex !important;
+    flex-direction: column;
+    height: 100%;
+    /*box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);*/
+    padding:20px 20px 20px!important;
+    .top-max-button-title-box{
+      display: flex;
+      border-bottom:1px solid #E0E0E0;
+      p:nth-child(1){
+        flex:1;
+        font-size:16px;
+        color:#0045AF;
+      }
+      p:nth-child(2){
+        margin-right:20px;
+      }
+    }
+    .form-max-box{
+      height: 100%;
+      display: flex;
+      .left{
+        width: 24%;
+        .for-max-box{
+          margin-left:40px;
+          .for-box{
+            display: inline-block;
+            border-radius:6px;
+            background: rgba(1,131,250,0.2);
+            margin:0 10px 10px;
+            .for-min-box{
+              display: flex;
+              p{
+                flex:1;
+                padding:0 20px;
+                margin:0;
+                line-height:40px;
+                color:#0183FA;
+              }
+              img{
+                width:16px;
+                height:16px;
+                margin:12px 12px;
+                cursor: pointer;
+              }
+            }
+          }
+        }
+      }
+      .right{
+        display: flex;
+        width: 76%;
+        position: relative;
+        .right_t{
+          position: absolute;
+          right: 20px;
+        }
+        .right_b{
+          margin-top: 80px;
+        }
+      }
+
+    }
+  }
+  .btn_list{
+    width: 100%;
+    height: 40px;
+    background: rgba(1,131,250,0.1);
+    border-radius: 6px;
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+    margin-bottom: 32px;
+    >i{
+      font-style: normal;
+      display: inline-block;
+      cursor: pointer;
+    }
+    >i:nth-of-type(1){
+      font-size: 20px;
+      color: #0045AF;
+      margin: 0 16px 0 14px;
+    }
+    >i:nth-of-type(2){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #999999;
+      line-height: 16px;
+    }
+    >i:nth-of-type(3){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+      margin: 0 28px 0 46px;
+    }
+    >i:nth-of-type(4){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #0045AF;
+      line-height: 16px;
+    }
+    >i:nth-of-type(5){
+      font-size: 16px;
+      font-family: Source Han Sans CN;
+      font-weight: bold;
+      color: #FFA312;
+      line-height: 16px;
+      margin: 0 40px 0 28px;
+    }
+    .bottom-button-box{
+      display: flex;
+      width:220px;
+      margin: 0;
+      p{
+        font-size:14px;
+        height:30px;
+        width:100px;
+        line-height:30px;
+        text-align: center;
+        border-radius:4px;
+      }
+      p:nth-child(1){
+        border:1px solid #E0E0E0;
+        margin-right:20px;
+      }
+      p:nth-child(2){
+        border:1px solid #0045AF;
+      }
+    }
+  }
+</style>

+ 176 - 0
src/views/secureAccess/whitelist/indexKDNH.vue

@@ -0,0 +1,176 @@
+<!--白名单列表-->
+<template>
+  <div class="app-container whitelist">
+    <div class="whitelist-page" v-if="pageType == 1">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+        <el-form-item label="关键字" prop="userName">
+          <el-input
+            v-model="queryParams.searchValue"
+            placeholder="姓名/工号/联系方式"
+            clearable
+            maxLength="30"
+            size="small"
+          />
+        </el-form-item>
+
+        <el-form-item>
+          <p class="inquire-button-one" @click="handleQuery">查询</p>
+          <p class="reset-button-one" @click="resetQuery">重置</p>
+        </el-form-item>
+        <el-form-item style="float: right;">
+          <el-button
+            style="margin-left: 20px"
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="mini"
+            @click="pageClick(2)"
+            v-hasPermi="['laboratory:whitelist:add']"
+          >新增</el-button>
+        </el-form-item>
+      </el-form>
+      <el-table v-loading="loading" border :data="safe_bookList" >
+        <el-table-column label="姓名" align="left" prop="userName"/>
+        <el-table-column label="工号" align="left" prop="userNumber"/>
+        <el-table-column label="联系方式" align="left" prop="userTelephone"/>
+        <el-table-column label="学院" align="left" prop="deptName"/>
+        <el-table-column label="操作" align="center" width="160" v-if="tableButtonType">
+          <template slot-scope="scope">
+            <div class="button-box">
+              <p class="table-min-button"
+                 style="margin-right: 10px"
+                 @click="pageEditClick(2,scope.row)"
+                 v-hasPermiAnd="['laboratory:whitelist:query','laboratory:whitelist:edit']"
+              >编辑</p>
+              <p class="table-min-button"
+                 @click="delButton(scope.row)"
+                 v-hasPermi="['laboratory:whitelist:remove']"
+              >移除</p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination :page-sizes="[20, 30, 40, 50]"
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+    <add-page v-if="pageType == 2" :pageData="pageData"></add-page>
+  </div>
+</template>
+
+<script>
+  import { whitelistList,whitelistDel } from "@/api/laboratory/whitelist";
+  import addPage from './addPageKDNH.vue'
+  export default {
+    components:{
+      addPage
+    },
+    name: "whitelist",
+    data() {
+      return {
+        tableButtonType:this.hasPermiDom(['laboratory:whitelist:query','laboratory:whitelist:edit','laboratory:whitelist:remove']),
+        pageType:1,
+        // 遮罩层
+        loading: false,
+        // 显示搜索条件
+        showSearch: true,
+        // 总条数
+        total: 0,
+        // 实验室安全制度表格数据
+        safe_bookList: [],
+        // 查询参数
+        queryParams: {
+          pageNum: 1,
+          pageSize:20,
+          searchValue: null,
+        },
+        pageData:{},
+      };
+    },
+    created() {
+      this.getList();
+    },
+    methods: {
+      delButton(item){
+        let self = this;
+        this.$confirm('确定移除当前准入信息,移除后将无法进入实验室?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          self.whitelistDel(item);
+        }).then(() => {}).catch(() => {});
+      },
+      whitelistDel(item){
+        whitelistDel(item.id).then(response => {
+          this.msgSuccess("删除成功");
+          this.getList();
+        });
+      },
+      getList(){
+        this.loading = true;
+        whitelistList(this.queryParams).then(response => {
+          this.safe_bookList = response.rows;
+          this.loading = false;
+        });
+      },
+      //新增
+      pageClick(type){
+        if(this.pageType != type){
+          this.pageType = type;
+          this.pageData= {};
+          if(type == 1){
+            this.getList();
+          }
+        }
+      },
+      //编辑
+      pageEditClick(type,item){
+        if(this.pageType != type){
+          this.pageType = type;
+          this.pageData=item;
+          if(type == 1){
+            this.getList();
+          }
+        }
+      },
+      /** 搜索按钮操作 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 重置按钮操作 */
+      resetQuery() {
+        this.queryParams.searchValue='';
+        this.handleQuery();
+      },
+      handleDelete(){
+
+      },
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .whitelist {
+    display: flex !important;
+    flex-direction: column;
+    box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    .whitelist-page{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      padding:11px 20px 20px!important;
+      .button-box{
+        margin:0 auto;
+        width:190px;
+        display: flex;
+      }
+    }
+  }
+</style>