dedsudiyu преди 2 години
родител
ревизия
263a0df936

BIN
src/assets/ZDimages/icon_wd_zw.png


BIN
src/assets/ZDimages/icon_znmj_lx.png


BIN
src/assets/ZDimages/icon_znmj_zx.png


BIN
src/assets/ZDimages/icon_zw_bk.png


+ 205 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/application.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>

+ 222 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/authorize.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>

+ 54 - 0
src/views/comprehensive/laboratoryManagement/accessAuthorization/index.vue

@@ -0,0 +1,54 @@
+<template>
+  <div class="app-container accessAuthorization">
+    <!--门禁授权-->
+    <authorize v-if="pageType == 1"></authorize>
+    <!--授权日志-->
+    <application v-if="pageType == 2"></application>
+  </div>
+</template>
+
+<script>
+import authorize from "./authorize.vue";
+import application from "./application.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>

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

@@ -0,0 +1,306 @@
+<!--
+=========================示例说明=========================
+<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 && !item.hasPermi" class="inquire-button-one" style="width:120px;" @click="buttonClick(item.parameter)">{{item.name}}</p>
+        <p v-if="item.type == 1 && item.hasPermi" 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/deviceList.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:11,
+        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' });
+          }).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>

Файловите разлики са ограничени, защото са твърде много
+ 1403 - 0
src/views/comprehensive/laboratoryManagement/subject/indexOne.vue


Файловите разлики са ограничени, защото са твърде много
+ 1377 - 0
src/views/comprehensive/laboratoryManagement/subject/indexTwo.vue


Файловите разлики са ограничени, защото са твърде много
+ 1021 - 0
src/views/comprehensive/personnel/student/index.vue


Файловите разлики са ограничени, защото са твърде много
+ 1538 - 0
src/views/comprehensive/personnel/teacher/index.vue


+ 941 - 0
src/views/mine/index.vue

@@ -0,0 +1,941 @@
+<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" }
+        ],
+        phonenumber: [
+          { 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" }
+        ],
+        // phone: [
+        //   { 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 = {};
+          obj.phonenumber = this.userform.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();
+          });
+        }
+      })
+    },
+    //手机号验证
+    checkPhone(rule, value, callback) {
+      if (!value) {
+        return callback(new Error('手机号码不能为空'))
+      } else {
+        if(value == '19999999999'){
+          return callback(new Error('请输入正确的手机号码'))
+        }
+        const reg = /^1[3|4|5|7|8|9][0-9]\d{8}$/
+        if (reg.test(value)) {
+          callback()
+        } else {
+          return callback(new Error('请输入正确的手机号码'))
+        }
+      }
+    },
+    //修改按钮密码
+    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/index.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 "./infoPage.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>

+ 176 - 0
src/views/secureAccess/whitelist/index.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 './addPage.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>

+ 278 - 0
src/views/securityCheck/release/index.vue

@@ -0,0 +1,278 @@
+<!--安全检查发布记录-->
+<template>
+  <div class="app-container releasePage">
+    <div class="releasePageMin" v-if="pageType == 1">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form-item label="检查名称" prop="releaseDescribe">
+          <el-input
+            v-model="queryParams.releaseDescribe"
+            placeholder="请输入检查名称"
+            clearable
+            size="small"
+          />
+        </el-form-item>
+        <el-form-item label="发布时间" label-width="70px">
+          <el-date-picker
+            :clearable="false"
+            v-model="dateRange"
+            size="small"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          ></el-date-picker>
+        </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>
+      <el-table v-loading="loading" border :data="releaseList" @selection-change="handleSelectionChange">
+        <!--<el-table-column type="selection" width="55" align="center" />-->
+        <!--<el-table-column label="创建人id" align="center" prop="id" />-->
+        <el-table-column label="检查名称" align="left" prop="releaseDescribe" />
+        <el-table-column label="实验室数量" align="left" prop="laboratorNum" />
+        <el-table-column label="隐患数量" align="left" prop="laboratorYhsl" />
+        <el-table-column label="已整改" align="left" prop="laboratorYzg" />
+        <el-table-column label="发布时间" align="left" prop="strTime" />
+        <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="120" v-if="tableButtonType">
+          <template slot-scope="scope">
+            <div class="button-box" style="display: flex;margin-left:20px;">
+            <p class="table-min-button"
+               @click="goPageInfo(2,scope.row)"
+               v-hasPermi="['laboratory:checkRecord:list']"
+            >查看</p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </div>
+    <list-page v-if="pageType == 2" :checkId="checkId"></list-page>
+    <!-- 添加或修改检查发布关系对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="检查表主键id" prop="checkId">
+          <el-input v-model="form.checkId" placeholder="请输入检查表主键id" />
+        </el-form-item>
+        <el-form-item label="描述" prop="releaseDescribe">
+          <el-input v-model="form.releaseDescribe" placeholder="请输入描述" />
+        </el-form-item>
+        <el-form-item label="创建人id" prop="createByid">
+          <el-input v-model="form.createByid" placeholder="请输入创建人id" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </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 { listRelease, getRelease, delRelease, addRelease, updateRelease } from "@/api/laboratory/release";
+import listPage from "./listPage.vue"
+
+export default {
+  name: "Release",
+  components: {
+    listPage
+  },
+  data() {
+    return {
+      tableButtonType:this.hasPermiDom(['laboratory:checkRecord:list']),
+      pageType:1,
+      checkId:"",
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 检查发布关系表格数据
+      releaseList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize:20,
+        checkId: null,
+        releaseDescribe: null,
+        createByid: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      },
+      dateRange:[]
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    //页面状态切换
+    goPageInfo(type,row){
+      if(type == 2){
+        this.pageType = 2;
+        this.checkId = row.checkId;
+      }else if(type == 1){
+        this.pageType = 1;
+        this.getList();
+      }
+    },
+    /** 查询检查发布关系列表 */
+    getList() {
+      this.loading = true;
+      if(this.dateRange&&this.dateRange.length>0){
+        this.queryParams.beginTime=this.dateRange[0]
+        this.queryParams.endTime=this.dateRange[1]
+      }else{
+        this.queryParams.beginTime=null;
+        this.queryParams.endTime=null
+      }
+      listRelease(this.queryParams).then( response => {
+        this.releaseList =  response.rows;
+        this.total =  response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        checkId: null,
+        releaseDescribe: null,
+        createByid: null,
+        createBy: null,
+        createTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams.beginTime = "";
+      this.queryParams.endTime = "";
+      // this.resetForm("queryForm");
+      this.$set(this,'queryParams',{
+        pageNum: 1,
+        pageSize:20,
+        releaseDescribe:"",
+      });
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加检查发布关系";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRelease(id).then( response => {
+        this.form =  response.data;
+        this.open = true;
+        this.title = "修改检查发布关系";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateRelease(this.form).then( response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addRelease(this.form).then( response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除检查发布关系编号为"' + ids + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delRelease(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('laboratory/release/export', {
+        ...this.queryParams
+      }, `laboratory_release.xlsx`)
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+  .releasePage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden !important;
+    box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+    .releasePageMin{
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden !important;
+      padding: 20px 20px 20px;
+    }
+  }
+</style>