dedsudiyu 1 year ago
parent
commit
71f7bbc739

+ 1 - 1
src/api/commonality/noPermission.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询通用配置
 export function getLogoInfo(query) {
   return request({
-    url: '/system/config/logo/getConfInfo',
+    url: '/system/config/logo/getLogoInfo',
     method: 'get',
     params: query
   })

+ 102 - 0
src/api/serviceCenter/index.js

@@ -0,0 +1,102 @@
+import request from '@/utils/request'
+
+// 获取商户列表
+export function tenantList(data) {
+  return request({
+    url: '/system/tenant/list',
+    method: 'post',
+    data: data
+  })
+}
+
+// 新增商户
+export function tenantAdd(data) {
+  return request({
+    url: '/system/tenant/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 编辑商户
+export function tenantUpdate(data) {
+  return request({
+    url: '/system/tenant/update',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除商户
+export function tenantDelete(data) {
+  return request({
+    url: '/system/tenant/delete',
+    method: 'post',
+    data: data
+  })
+}
+
+// 商户详情
+export function tenantDetail(query) {
+  return request({
+    url: '/system/tenant/detail',
+    method: 'get',
+    params: query
+  })
+}
+
+//系统日志列表
+export function syslogList(data) {
+  return request({
+    url: '/system/syslog/list',
+    method: 'post',
+    data: data
+  })
+}
+
+//系统日志详情
+export function syslogDetail(query) {
+  return request({
+    url: '/system/syslog/detail',
+    method: 'get',
+    params: query
+  })
+}
+
+//算法日志列表
+export function algorithmList(data) {
+  return request({
+    url: '/system/log/algorithm/list',
+    method: 'post',
+    data: data
+  })
+}
+
+//算法日志详情
+export function algorithmDetail(query) {
+  return request({
+    url: '/system/log/algorithm/detail',
+    method: 'get',
+    params: query
+  })
+}
+
+//在线用户列表
+export function onlineList(data) {
+  return request({
+    url: '/system/online/list',
+    method: 'post',
+    data: data
+  })
+}
+
+//踢出登录
+export function onlineLogout(query) {
+  return request({
+    url: '/system/online/logout',
+    method: 'get',
+    params: query
+  })
+}
+
+

+ 36 - 0
src/api/systemManagement/index.js

@@ -159,3 +159,39 @@ export function optionselect() {
     method: 'get'
   })
 }
+
+//修改通用配置
+export function updateLogoInfo(data) {
+  return request({
+    url: '/system/config/logo/update',
+    method: 'post',
+    data: data
+  })
+}
+
+// 保存开发配置
+export function addUrlConfig(data) {
+  return request({
+    url: '/system/config/dev/update',
+    method: 'post',
+    data: data
+  })
+}
+
+
+// 获取文件列表
+export function getFileList(data) {
+  return request({
+    url: '/system/file/list',
+    method: 'post',
+    data: data
+  })
+}
+// 获取文件分类列表
+export function getFileCategory(query) {
+  return request({
+    url: '/system/file/category',
+    method: 'get',
+    params: query
+  })
+}

+ 0 - 3
src/assets/styles/zdStyles/ZDcolorClass.scss

@@ -285,7 +285,6 @@
   }
   .dialog-footer-button-info{
     width:70px;
-    height:30px;
     line-height:30px;
     text-align: center;
     border:1px solid #E0E0E0;
@@ -303,7 +302,6 @@
   }
   .dialog-footer-button-primary{
     width:70px;
-    height:30px;
     line-height:30px;
     text-align: center;
     border:1px solid #0045AF;
@@ -321,7 +319,6 @@
   }
   .dialog-footer-button-border{
     width:70px;
-    height:30px;
     line-height:30px;
     text-align: center;
     border:1px solid #0045AF;

+ 19 - 16
src/layout/components/TopNav/index.vue

@@ -7,7 +7,8 @@
   >
     <template v-for="(item, index) in topMenus">
       <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber">
-        {{ item.menuName }}
+        <!--<svg-icon :icon-class="item.meta.icon" />-->
+        {{ item.meta.title }}
       </el-menu-item>
     </template>
 
@@ -20,7 +21,8 @@
           :index="item.path"
           :key="index"
           v-if="index >= visibleNumber">
-          {{ item.menuName }}
+          <!--<svg-icon :icon-class="item.meta.icon" />-->
+          {{ item.meta.title }}
         </el-menu-item>
       </template>
     </el-submenu>
@@ -54,7 +56,7 @@ export default {
         if (menu.hidden !== true) {
           // 兼容顶部栏一级菜单内部跳转
           if (menu.path === "/") {
-              topMenus.push(menu.child[0]);
+              topMenus.push(menu.children[0]);
           } else {
               topMenus.push(menu);
           }
@@ -70,18 +72,18 @@ export default {
     childrenMenus() {
       var childrenMenus = [];
       this.routers.map((router) => {
-        for (var item in router.child) {
-          if (router.child[item].parentPath === undefined) {
+        for (var item in router.children) {
+          if (router.children[item].parentPath === undefined) {
             if(router.path === "/") {
-              router.child[item].path = "/redirect/" + router.child[item].path;
+              router.children[item].path = "/redirect/" + router.children[item].path;
             } else {
-              if(!this.ishttp(router.child[item].path)) {
-                router.child[item].path = router.path + "/" + router.child[item].path;
+              if(!this.ishttp(router.children[item].path)) {
+                router.children[item].path = router.path + "/" + router.children[item].path;
               }
             }
-            router.child[item].parentPath = router.path;
+            router.children[item].parentPath = router.path;
           }
-          childrenMenus.push(router.child[item]);
+          childrenMenus.push(router.children[item]);
         }
       });
       return constantRoutes.concat(childrenMenus);
@@ -138,12 +140,13 @@ export default {
           return true;
         }
       });
-      let matched = this.$route.matched.filter(item => item.menuName)
+      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
       for(let i=0;i<self.topMenus.length;i++){
         if(matched[0]){
           if(matched[0].path == self.topMenus[i].path){
-            if(matched[0].menuName != '数据可视化'){
-              store.dispatch('settings/setPageName', matched[0].menuName)
+            if(matched[0].meta.title != '数据可视化'){
+              // console.log('matched[0].meta.title',matched[0].meta.title);
+              store.dispatch('settings/setPageName', matched[0].meta.title)
             }
           }
         }
@@ -155,8 +158,8 @@ export default {
       let self = this;
       for(let i=0;i<self.topMenus.length;i++){
         if(key == self.topMenus[i].path){
-          if(self.topMenus[i].menuName != '数据可视化'){
-            store.dispatch('settings/setPageName', self.topMenus[i].menuName)
+          if(self.topMenus[i].meta.title != '数据可视化'){
+            store.dispatch('settings/setPageName', self.topMenus[i].meta.title)
           }
         }
       }
@@ -204,7 +207,7 @@ export default {
       if(routes.length > 0) {
         for(let i=0;i<self.topMenus.length;i++){
           if(key == self.topMenus[i].path){
-            localStorage.setItem('leftRoutesName',self.topMenus[i].menuName);
+            localStorage.setItem('leftRoutesName',self.topMenus[i].meta.title);
           }
         }
         localStorage.setItem('leftRoutesData',JSON.stringify(routes));

+ 38 - 1
src/store/modules/permission.js

@@ -34,7 +34,9 @@ const permission = {
         // 向后端请求路由数据
         getRouters().then(res => {
           //大屏跳转判定(路由地址修改)
-          let newData = JSON.parse(JSON.stringify(res.data));
+          let dataList = JSON.parse(JSON.stringify(res.data));
+          let newData = routeSetData(dataList);
+          console.log('newData',newData)
           localStorage.setItem('routeData',JSON.stringify(newData))
           for(let i=0;i<newData.length;i++){
             if( newData[i].path == 'https://www.sxitdlc.com'){
@@ -58,6 +60,41 @@ const permission = {
   }
 }
 
+//路由数据格式处理(后台返回数据与路由参数不匹配在这里重新处理格式)
+function routeSetData(list,type){
+  if(list && list[0]){
+    let newList = JSON.parse(JSON.stringify(list))
+    let listData = [];
+    for(let i=0;i<newList.length;i++){
+      let obj = {
+        hidden : !newList[i].visible,
+        meta : {
+          icon:newList[i].icon?newList[i].icon:'#',
+          link:null,
+          noCache:false,
+          title:newList[i].menuName,
+        },
+        component : newList[i].component,
+        name : firstToUpper1(newList[i].path),
+      }
+      if(!type){
+        obj.alwaysShow = newList[i].visible
+        obj.redirect = 'noRedirect'
+        obj.path = '/'+newList[i].path
+      }else{
+        obj.path = newList[i].path
+      }
+      if(newList[i].child && newList[i].menuType == 0){
+        obj.children = routeSetData(newList[i].child,true);
+      }
+      listData.push(obj);
+    }
+    return listData
+  }
+}
+function firstToUpper1(str) {
+  return str.trim().toLowerCase().replace(str[0], str[0].toUpperCase());
+}
 
 // 遍历后台传来的路由字符串,转换为组件对象
 function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {

+ 22 - 0
src/utils/request.js

@@ -164,6 +164,28 @@ service.interceptors.response.use(res => {
       }
     }
     else if (message.includes("Request failed with status code")) {
+      if(message.substr(message.length - 3) == 401){
+        if(!localStorage.getItem('serviceType')){
+          localStorage.setItem('serviceType','1')
+          MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', {
+              confirmButtonText: '确定',
+              showCancelButton:false,
+              closeOnClickModal:false,
+              cancelButtonText: '取消',
+              type: 'warning'
+            }
+          ).then(() => {
+            store.dispatch('LogOut').then(() => {
+              localStorage.removeItem('serviceType');
+              router.replace({
+                path: '/login'
+              })
+              // location.href = '/index';
+            })
+            return
+          }).catch(() => {});
+        }
+      }
       message = "系统接口" + message.substr(message.length - 3) + "异常";
     }
     if(!messageData){

+ 1 - 1
src/views/basicsModules/message.vue

@@ -33,7 +33,7 @@
 </template>
 
 <script>
-import { myAlllistContent } from "@/api/commonality/noPermission";
+import { myAlllistContent,noticeList } from "@/api/commonality/noPermission";
   export default {
     props:{
       videoData:[],

+ 217 - 0
src/views/serviceCenter/logManagement/algorithmLogs/index.vue

@@ -0,0 +1,217 @@
+<!--算法日志-->
+<template>
+  <div class="app-container algorithmLogs">
+    <div class="algorithmLogsPage" v-if="pageType == 1">
+      <div class="title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+          <el-form-item label="实验室" prop="data2" label-width="80px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.data2"
+              placeholder="请输入"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="请求时间" prop="dateRange">
+            <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 label="处理状态" prop="data1">
+            <el-select v-model="queryParams.data1" clearable placeholder="请选择" style="width: 200px">
+              <el-option label="已处理" :value="true"></el-option>
+              <el-option label="未处理" :value="false"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="是否通过" prop="data3">
+            <el-select v-model="queryParams.data3" clearable placeholder="请选择" style="width: 200px">
+              <el-option label="通过" :value="true"></el-option>
+              <el-option label="未通过" :value="false"></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>
+      </div>
+      <div class="content-box">
+        <el-table v-loading="loading" border :data="tableList" ref="multipleTable">
+          <el-table-column label="实验室" align="center" prop="subName" show-overflow-tooltip/>
+          <el-table-column label="识别名称" align="center" prop="checkName" show-overflow-tooltip/>
+          <el-table-column label="识别类型" align="center" prop="ipAddr" show-overflow-tooltip width="100">
+            <template slot-scope="scope">
+              {{scope.row.algorithmType == 'image'?'图片':'视频'}}
+            </template>
+          </el-table-column>
+          <el-table-column label="原文件" align="center" prop="originalFile" show-overflow-tooltip width="139">
+            <template slot-scope="scope">
+              <img style="width:118px;cursor: pointer" :src="scope.row.originalFile">
+            </template>
+          </el-table-column>
+          <el-table-column label="识别结果" align="center" prop="checkResult" show-overflow-tooltip width="139">
+            <template slot-scope="scope">
+              <img style="width:118px;cursor: pointer" :src="scope.row.checkResult">
+            </template>
+          </el-table-column>
+          <el-table-column label="处理状态" align="center" prop="state" show-overflow-tooltip width="100">
+            <template slot-scope="scope">
+              {{scope.row.state?'已处理':'未处理'}}
+            </template>
+          </el-table-column>
+          <el-table-column label="是否通过" align="center" prop="isPass" show-overflow-tooltip width="100">
+            <template slot-scope="scope">
+              {{scope.row.isPass?'通过':'未通过'}}
+            </template>
+          </el-table-column>
+          <el-table-column label="请求时间" align="center" prop="createTime" show-overflow-tooltip width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime,"{y}-{m}-{d} {h}:{i}:{s}") }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="处理耗时(ms)" align="center" prop="costTime" show-overflow-tooltip width="120">
+            <template slot-scope="scope">
+              <span>{{ scope.row.costTime }}ms</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" prop="deptName" width="170">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p" @click="tableButton(scope.row)">详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <infoPage v-if="pageType == 2" :propsData="propsData"></infoPage>
+  </div>
+</template>
+
+<script>
+  import { algorithmList,algorithmDetail } from "@/api/serviceCenter/index";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'algorithmLogs',
+    components: {
+      infoPage
+    },
+    data(){
+      return{
+        pageType:1,
+        loading:false,
+        dateRange:[],
+        queryParams:{
+          page:1,
+          pageSize:20,
+          data1:"",
+          data2:"",
+          data3:"",
+        },
+        tableList:[],
+        total:0,
+        propsData:{},
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      goPage(type){
+        if(this.pageType!=type){
+          this.$set(this,'pageType',type)
+          this.getList();
+        }
+      },
+      //详情按钮
+      tableButton(row){
+        algorithmDetail({logId:row.logId}).then(response => {
+          this.$set(this,'propsData',response.data);
+          this.$set(this,'pageType',2);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          data1:"",
+          data3:"",
+          data2:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        algorithmList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'tableList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .algorithmLogs{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    .algorithmLogsPage{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      .title-box{
+        padding-top:20px;
+        border-bottom:1px solid #dedede;
+        display: flex;
+      }
+      .content-box{
+        flex: 1;
+        display: flex;
+        flex-direction: column;
+        padding:20px;
+        overflow: hidden;
+      }
+    }
+  }
+</style>

+ 176 - 0
src/views/serviceCenter/logManagement/algorithmLogs/infoPage.vue

@@ -0,0 +1,176 @@
+<template>
+  <div class="algorithmLogsInfoPage">
+    <div class="title-box">
+      <p>详情</p>
+      <p class="reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <div class="left-content-box scrollbar-box">
+        <div>
+          <p>实验室:</p>
+          <p>{{propsData.subName}}</p>
+        </div>
+        <div>
+          <p>业务id:</p>
+          <p>{{propsData.extraId}}</p>
+        </div>
+        <div>
+          <p>算法ID:</p>
+          <p>{{propsData.respCode}}</p>
+        </div>
+        <div>
+          <p>算法名称:</p>
+          <p>{{propsData.checkName}}</p>
+        </div>
+        <div>
+          <p>识别类型:</p>
+          <p>{{propsData.algorithmType=='image'?'图片':'视频'}}</p>
+        </div>
+        <div>
+          <p>请求时间:</p>
+          <p>{{ parseTime(propsData.createTime,"{y}-{m}-{d} {h}:{i}:{s}") }}</p>
+        </div>
+        <div>
+          <p>响应时间:</p>
+          <p>{{ parseTime(propsData.updateTime,"{y}-{m}-{d} {h}:{i}:{s}") }}</p>
+        </div>
+        <div>
+          <p>请求耗时:</p>
+          <p>{{propsData.costTime}}ms</p>
+        </div>
+        <div>
+          <p>处理状态:</p>
+          <p>{{propsData.state?'已处理':'未处理'}}</p>
+        </div>
+        <div>
+          <p>是否通过:</p>
+          <p>{{propsData.isPass?'通过':'未通过'}}</p>
+        </div>
+        <div>
+          <p>响应参数:</p>
+          <el-input
+            style="width:700px;"
+            type="textarea"
+            disabled
+            resize="none"
+            :autosize="{ minRows: 10, maxRows: 10}"
+            placeholder="请输入内容"
+            v-model="propsData.respData">
+          </el-input>
+        </div>
+      </div>
+      <div class="right-content-box scrollbar-box">
+        <div>
+          <p>原文件</p>
+          <img :src="propsData.originalFile">
+        </div>
+        <div>
+          <p>识别结果</p>
+          <img :src="propsData.checkResult">
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'algorithmLogsInfoPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+
+      }
+    },
+    created(){},
+    mounted(){},
+    methods:{
+      backPage(){
+        this.$parent.goPage(1);
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .algorithmLogsInfoPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    font-weight:500;
+    .title-box{
+      display: flex;
+      border-bottom:1px solid #dedede;
+      p:nth-child(1){
+        margin-left:20px;
+        flex:1;
+        line-height:80px;
+        font-size:16px;
+        color:#333;
+      }
+      p:nth-child(2){
+        margin:20px;
+        width:80px;
+      }
+    }
+    .content-box{
+      flex:1;
+      display: flex;
+      overflow: hidden;
+      padding:20px;
+      .left-content-box{
+        flex:1;
+        margin-top:20px;
+        div{
+          display: flex;
+          p{
+            font-size:16px;
+            line-height:20px;
+            padding:10px 0;
+          }
+          p:nth-child(1){
+            width:140px;
+            text-align: right;
+          }
+          p:nth-child(2){
+            display: block;
+          }
+        }
+        ::v-deep .el-textarea.is-disabled .el-textarea__inner{
+          padding:10px;
+          color:#333;
+          background-color: #fff;
+          cursor: auto;
+        }
+      }
+      .right-content-box{
+        width:600px;
+        overflow-x: hidden;
+        div{
+          width:580px;
+          height:370px;
+          margin:0 0 10px 10px;
+          border:1px solid #dedede;
+          border-radius:4px;
+          box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
+          p{
+            margin:10px 10px 0;
+            border-bottom:1px solid #dedede;
+            color:#333;
+            line-height:28px;
+            font-size:14px;
+          }
+          img{
+            width:560px;
+            height:310px;
+            margin:10px;
+          }
+        }
+      }
+    }
+
+  }
+</style>

+ 202 - 0
src/views/serviceCenter/logManagement/systemLogs/index.vue

@@ -0,0 +1,202 @@
+<!--系统日志-->
+<template>
+  <div class="app-container systemLogs">
+    <div class="systemLogsPage" v-if="pageType == 1">
+      <div class="title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+          <el-form-item label="日志类型" prop="logType" label-width="90px">
+            <el-select v-model="queryParams.logType" clearable placeholder="请选择" style="width: 200px">
+              <el-option label="登录" :value="1"></el-option>
+              <el-option label="操作" :value="2"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="请求IP" prop="ipAddr">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.ipAddr"
+              placeholder="请输入"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="请求状态" prop="state">
+            <el-select v-model="queryParams.state" clearable placeholder="请选择" style="width: 200px">
+              <el-option label="成功" :value="true"></el-option>
+              <el-option label="失败" :value="false"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="请求时间" prop="dateRange">
+            <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" style="margin-right:10px;">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="content-box">
+        <el-table v-loading="loading" border :data="tableList" ref="multipleTable">
+          <el-table-column label="标题" align="center" prop="title" show-overflow-tooltip width="180"/>
+          <el-table-column label="操作类型" align="center" prop="businessType" show-overflow-tooltip/>
+          <el-table-column label="请求IP" align="center" prop="ipAddr" show-overflow-tooltip width="120"/>
+          <el-table-column label="IP所属地" align="center" prop="ipDesc" show-overflow-tooltip width="110"/>
+          <el-table-column label="用户代理" align="center" prop="userAgent" show-overflow-tooltip width="200"/>
+          <el-table-column label="请求接口" align="center" prop="reqUri" show-overflow-tooltip width="200"/>
+          <el-table-column label="请求时间" align="center" prop="reqTime" show-overflow-tooltip width="160">
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.reqTime,"{y}-{m}-{d} {h}:{i}:{s}") }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="耗时(ms)" align="center" prop="costTime" show-overflow-tooltip width="100">
+            <template slot-scope="scope">
+              <span>{{ scope.row.costTime }}ms</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" align="center" prop="state" show-overflow-tooltip width="80">
+            <template slot-scope="scope">
+              {{scope.row.state?'成功':'失败'}}
+            </template>
+          </el-table-column>
+          <el-table-column label="操作人" align="center" prop="operator" show-overflow-tooltip width="110"/>
+          <el-table-column label="操作" align="center" prop="deptName" width="170">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p" @click="tableButton(scope.row)">详情</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+    </div>
+    <infoPage v-if="pageType == 2" :propsData="propsData"></infoPage>
+  </div>
+</template>
+
+<script>
+  import { syslogList,syslogDetail } from "@/api/serviceCenter/index";
+  import infoPage from "./infoPage.vue";
+  export default {
+    name: 'systemLogs',
+    components: {
+      infoPage
+    },
+    data(){
+      return{
+        pageType:1,
+        loading:false,
+        dateRange:[],
+        queryParams:{
+          page:1,
+          pageSize:20,
+          logType:"",
+          ipAddr:"",
+          state:"",
+        },
+        tableList:[],
+        total:0,
+        propsData:{},
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      goPage(type){
+        if(this.pageType!=type){
+          this.$set(this,'pageType',type)
+          this.getList();
+        }
+      },
+      //详情按钮
+      tableButton(row){
+        syslogDetail({logId:row.logId}).then(response => {
+          this.$set(this,'propsData',response.data);
+          this.$set(this,'pageType',2);
+        });
+      },
+      //查询按钮
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      //重置按钮
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          logType:"",
+          state:"",
+          ipAddr:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        syslogList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'tableList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .systemLogs{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    .systemLogsPage{
+      flex:1;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+      .title-box{
+        padding-top:20px;
+        border-bottom:1px solid #dedede;
+        display: flex;
+      }
+      .content-box{
+        flex: 1;
+        display: flex;
+        flex-direction: column;
+        padding:20px;
+        overflow: hidden;
+      }
+    }
+  }
+</style>

+ 122 - 0
src/views/serviceCenter/logManagement/systemLogs/infoPage.vue

@@ -0,0 +1,122 @@
+<template>
+  <div class="systemLogsInfoPage">
+    <div class="title-box">
+      <p>详情</p>
+      <p class="reset-button-one" @click="backPage">返回</p>
+    </div>
+    <div class="content-box scrollbar-box">
+      <div>
+        <p>日志标题:</p>
+        <p>{{propsData.title}}</p>
+      </div>
+      <div>
+        <p>操作类型:</p>
+        <p>{{propsData.businessType}}</p>
+      </div>
+      <div>
+        <p>操作人:</p>
+        <p>{{propsData.operator}}</p>
+      </div>
+      <div>
+        <p>请求IP:</p>
+        <p>{{propsData.ipAddr}}</p>
+      </div>
+      <div>
+        <p>用户代理:</p>
+        <p>{{propsData.userAgent}}</p>
+      </div>
+      <div>
+        <p>请求方式:</p>
+        <p>{{propsData.reqMethod}}</p>
+      </div>
+      <div>
+        <p>请求接口:</p>
+        <p>{{propsData.reqUri}}</p>
+      </div>
+      <div>
+        <p>请求参数:</p>
+        <p>{{propsData.reqBody}}</p>
+      </div>
+      <div>
+        <p>请求时间:</p>
+        <p>{{propsData.reqTime}}</p>
+      </div>
+      <div>
+        <p>响应时间:</p>
+        <p>{{propsData.respTime}}</p>
+      </div>
+      <div>
+        <p>接口耗时:</p>
+        <p>{{propsData.logType}}ms</p>
+      </div>
+      <div>
+        <p>请求状态: </p>
+        <p>{{propsData.state?'成功':'失败'}}</p>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'systemLogsInfoPage',
+    props:{
+      propsData:{},
+    },
+    data(){
+      return{
+
+      }
+    },
+    created(){},
+    mounted(){},
+    methods:{
+      backPage(){
+        this.$parent.goPage(1);
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .systemLogsInfoPage{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    font-weight:500;
+    .title-box{
+      display: flex;
+      border-bottom:1px solid #dedede;
+      p:nth-child(1){
+        margin-left:20px;
+        flex:1;
+        line-height:80px;
+        font-size:16px;
+        color:#333;
+      }
+      p:nth-child(2){
+        margin:20px;
+        width:80px;
+      }
+    }
+    .content-box{
+      padding:20px;
+      div{
+        display: flex;
+        p{
+          font-size:16px;
+          line-height:20px;
+          padding:10px 0;
+        }
+        p:nth-child(1){
+          width:140px;
+          text-align: right;
+        }
+        p:nth-child(2){
+          flex:1;
+        }
+      }
+    }
+  }
+</style>

+ 0 - 116
src/views/serviceCenter/merchantManagement.vue

@@ -1,116 +0,0 @@
-<!--商户管理-->
-<template>
-    <div class="app-container merchantManagement">
-      <el-form :model="queryParams" ref="queryForm" :inline="true" class="form-box">
-        <el-form-item label="名称" prop="name" label-width="60px">
-          <el-input
-            v-model="queryParams.name"
-            placeholder="请输入商户名称"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item label="状态" prop="type">
-          <el-select v-model="queryParams.type" placeholder="请选择状态" clearable>
-            <el-option
-              v-for="item in typeList"
-              :key="item.id"
-              :label="item.value"
-              :value="item.id"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <p class="inquire-button-one" @click="handleQuery">查询</p>
-          <p class="reset-button-one" @click="resetQuery">重置</p>
-        </el-form-item>
-      </el-form>
-      <el-table v-loading="loading" border :data="dataList">
-        <el-table-column label="名称" align="left" prop="name" />
-        <el-table-column label="编号" align="left" prop="code" />
-        <el-table-column label="实验室危险源占比" align="left" prop="labScale">
-          <template slot-scope="scope">
-            <div class="progress-box">
-              <el-progress :text-inside="true" :stroke-width="20" color="#52a1fe" :percentage="scope.row.labScale>100?100:scope.row.labScale" style="margin-right:74px;"></el-progress>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="查看次数" align="left" prop="scanCount" width="100" />
-        <el-table-column label="二维码" align="left" width="100">
-          <template slot-scope="scope">
-            <div @click="dialogQrCodeOn(scope.row.qrCodeUrl)">
-              <vue-qr style="height:23px;width:23px;cursor:pointer;" :text="scope.row.qrCodeUrl" :size="200"></vue-qr>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="left" class-name="small-padding fixed-width" width="160" v-if="tableButtonType">
-          <template slot-scope="scope">
-            <div class="table-button-box">
-              <p class="table-button-null"></p>
-              <p class="table-button-p"
-                 @click="addLaboratoryButton(scope.row)"
-                 v-hasPermiAnd="['laboratory:hazard:query','laboratory:hazard:edit']"
-              >编辑</p>
-              <p class="table-button-p"
-                 @click="handleDelete(scope.row)"
-                 v-hasPermi="['laboratory:hazard:remove']"
-              >删除</p>
-              <p class="table-button-null"></p>
-            </div>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination :page-sizes="[20, 30, 40, 50]"
-                  v-show="total>0"
-                  :total="total"
-                  layout="total, prev, pager, next, sizes, jumper"
-                  :page.sync="queryParams.pageNum"
-                  :limit.sync="queryParams.pageSize"
-                  @pagination="getList"
-      />
-    </div>
-</template>
-
-<script>
-  export default {
-    name: 'merchantManagement',
-    data(){
-      return{
-        loading:false,
-        typeList:[
-          {id:"1",value:"启用"},
-          {id:"0",value:"禁用"}
-        ],
-        queryParams:{
-
-        },
-        dataList:[],
-      }
-    },
-    created(){
-
-    },
-    mounted(){
-
-    },
-    methods:{
-      handleQuery(){
-
-      },
-      resetQuery(){
-
-      },
-      getList(){
-
-      },
-    }
-  }
-</script>
-
-<style scoped lang="scss">
-  .merchantManagement{
-    display: flex!important;
-    flex-direction: column;
-    box-shadow: 0 0 8px 2px rgba(0, 0, 0, 0.1);
-    padding:20px!important;
-  }
-</style>

+ 185 - 0
src/views/serviceCenter/merchantManagement/index.vue

@@ -0,0 +1,185 @@
+<!--商户管理-->
+<template>
+    <div class="app-container merchantManagement">
+      <div class="title-box">
+        <el-form :model="queryParams" class="form-box" ref="queryForm"
+                 :inline="true" style="width:100%;">
+          <el-form-item label="名称" prop="fileName" label-width="60px">
+            <el-input
+              maxLength="30"
+              v-model="queryParams.fileName"
+              placeholder="名称"
+              clearable
+              style="width: 200px"
+            />
+          </el-form-item>
+          <el-form-item label="状态" prop="category" label-width="60px">
+            <el-select v-model="queryParams.category" clearable placeholder="请选择分类" style="width: 200px">
+              <el-option
+                v-for="item in optionList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <p class="inquire-button-one" @click="handleQuery" style="margin-right:10px;">查询</p>
+            <p class="reset-button-one" @click="resetQuery">重置</p>
+          </el-form-item>
+          <el-form-item label="" prop="title" style="float: right">
+            <el-col :span="1.5" style="margin-right:10px;">
+              <p class="add-button-one-90"
+                 @click="dialogOpen"
+              ><i class="el-icon-plus"></i>新增</p>
+            </el-col>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="content-box">
+        <el-table v-loading="loading" border :data="tableList" ref="multipleTable">
+          <el-table-column label="编号" align="center" prop="fileName" show-overflow-tooltip width="80"/>
+          <el-table-column label="名称" align="center" prop="fileType" show-overflow-tooltip/>
+          <el-table-column label="简称" align="center" prop="fileSize" show-overflow-tooltip width="80"/>
+          <el-table-column label="省" align="center" prop="fileUrl" show-overflow-tooltip width="80"/>
+          <el-table-column label="市" align="center" prop="fileUrl" show-overflow-tooltip width="80"/>
+          <el-table-column label="详细地址" align="center" prop="fileUrl" show-overflow-tooltip width="200"/>
+          <el-table-column label="联系人" align="center" prop="createTime" show-overflow-tooltip width="100"/>
+          <el-table-column label="联系电话" align="center" prop="userName" show-overflow-tooltip width="160"/>
+          <el-table-column label="状态" align="center" prop="userName" show-overflow-tooltip width="80"/>
+          <el-table-column label="创建时间" align="center" prop="userName" show-overflow-tooltip width="200"/>
+          <el-table-column label="操作" align="center" prop="deptName" width="170">
+            <template slot-scope="scope">
+              <div class="table-button-box">
+                <p class="table-button-null"></p>
+                <p class="table-button-p" @click="tableButton(1,scope.row)">编辑</p>
+                <p class="table-button-p" @click="tableButton(2,scope.row)">删除</p>
+                <p class="table-button-null"></p>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :page-sizes="[20, 30, 40, 50]"
+                    v-show="total>0"
+                    :total="total"
+                    :page.sync="queryParams.page"
+                    :limit.sync="queryParams.pageSize"
+                    @pagination="getList"
+        />
+      </div>
+      <!--新增弹窗-->
+      <el-dialog class="trainingCourseAddDialog" :title='dialogTitle' width="540px"
+                 :visible.sync="dialogType" v-if="dialogType" @close="dialogOff()"
+                  :close-on-click-modal="false" :close-on-press-escape="false">
+
+        <div slot="footer" class="dialog-footer dialog-footer-box" style="display: flex">
+          <p class="dialog-footer-button-null"></p>
+          <p class="dialog-footer-button-info" @click="dialogOff()">取消</p>
+          <p class="dialog-footer-button-primary" @click="dialogSubmit">确定</p>
+          <p class="dialog-footer-button-null"></p>
+        </div>
+      </el-dialog>
+    </div>
+</template>
+
+<script>
+  import { tenantList } from "@/api/serviceCenter/index";
+  export default {
+    name: 'merchantManagement',
+    data(){
+      return{
+        loading:false,
+        optionList:[{label:"启用",value:true},{label:"禁用",value:false}],
+        queryParams:{
+          page:1,
+          pageSize:20,
+          category:"",
+          fileName:"",
+        },
+        dateRange:[],
+        tableList:[],
+        total:0,
+        //dialog弹层数据
+        dialogTitle:"",
+        dialogType:false,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      //弹层关闭
+      dialogOff(){
+        this.$set(this,'dialogType',false);
+      },
+      //弹层开启
+      dialogOpen(){
+        this.$set(this,'dialogTitle','新增');
+        this.$set(this,'dialogType',true);
+      },
+      //弹层确定
+      dialogSubmit(){
+        this.$set(this,'dialogType',false);
+      },
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          category:"",
+          fileName:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        tenantList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'tableList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //预览
+      tableButton(){
+
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .merchantManagement{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .title-box{
+      padding-top:20px;
+      border-bottom:1px solid #dedede;
+      display: flex;
+    }
+    .content-box{
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      padding:20px;
+      overflow: hidden;
+    }
+  }
+</style>
+

+ 155 - 0
src/views/serviceCenter/onlineUser/index.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="app-container onlineUser">
+    <div class="title-box">
+      <el-form :model="queryParams" class="form-box" ref="queryForm"
+               :inline="true" style="width:100%;">
+        <el-form-item label="用户名称" prop="userName" label-width="90px">
+          <el-input
+            maxLength="30"
+            v-model="queryParams.userName"
+            placeholder="请输入"
+            clearable
+            style="width: 200px"
+          />
+        </el-form-item>
+        <el-form-item label="IP地址" prop="ipAddr">
+          <el-input
+            maxLength="30"
+            v-model="queryParams.ipAddr"
+            placeholder="请输入"
+            clearable
+            style="width: 200px"
+          />
+        </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>
+    </div>
+    <div class="content-box">
+      <el-table v-loading="loading" border :data="tableList" ref="multipleTable">
+        <el-table-column label="序号" type="index" align="center" width="50"/>
+        <el-table-column label="登录令牌" align="center" prop="token" show-overflow-tooltip/>
+        <el-table-column label="用户ID" align="center" prop="userId" show-overflow-tooltip width="180"/>
+        <el-table-column label="用户名" align="center" prop="userName" show-overflow-tooltip width="140"/>
+        <el-table-column label="账号" align="center" prop="account" show-overflow-tooltip width="140"/>
+        <el-table-column label="登录IP" align="center" prop="ipAddr" show-overflow-tooltip width="140"/>
+        <el-table-column label="登录时间" align="center" prop="loginTime" show-overflow-tooltip width="180">
+          <template slot-scope="scope">
+            {{parseTime(scope.row.loginTime,"{y}-{m}-{d} {h}:{i}:{s}")}}
+          </template>
+        </el-table-column>
+        <el-table-column label="过期时间" align="center" prop="expiresIn" show-overflow-tooltip width="180">
+          <template slot-scope="scope">
+            {{parseTime(scope.row.expiresIn,"{y}-{m}-{d} {h}:{i}:{s}")}}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" prop="deptName" width="140">
+          <template slot-scope="scope">
+            <div class="table-button-box">
+              <p class="table-button-null"></p>
+              <p class="table-button-p" @click="tableButton(scope.row)">踢出</p>
+              <p class="table-button-null"></p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination :page-sizes="[20, 30, 40, 50]"
+                  v-show="total>0"
+                  :total="total"
+                  :page.sync="queryParams.page"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+  import { onlineList,onlineLogout } from "@/api/serviceCenter/index";
+  export default {
+    name: 'index',
+    data(){
+      return{
+        loading:false,
+        optionList:[{label:"启用",value:true},{label:"禁用",value:false}],
+        queryParams:{
+          page:1,
+          pageSize:20,
+          userName:"",
+          ipAddr:"",
+        },
+        dateRange:[],
+        tableList:[],
+        total:0,
+        //dialog弹层数据
+        dialogTitle:"",
+        dialogType:false,
+      }
+    },
+    mounted(){
+      this.getList();
+    },
+    methods:{
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          userName:"",
+          ipAddr:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        onlineList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'tableList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //预览
+      tableButton(row){
+        onlineLogout({token:row.token}).then(response => {
+          this.msgSuccess(response.message)
+          this.getList();
+        });
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .onlineUser{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .title-box{
+      padding-top:20px;
+      border-bottom:1px solid #dedede;
+      display: flex;
+    }
+    .content-box{
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      padding:20px;
+      overflow: hidden;
+    }
+  }
+</style>

+ 163 - 0
src/views/systemManagement/filePreview/index.vue

@@ -0,0 +1,163 @@
+<template>
+  <div class="app-container filePreview">
+    <div class="title-box">
+      <el-form :model="queryParams" class="form-box" ref="queryForm" :inline="true">
+        <el-form-item label="分类" prop="category" label-width="60px">
+          <el-select v-model="queryParams.category" clearable placeholder="请选择分类" style="width: 200px">
+            <el-option
+              v-for="item in optionList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="文件名" prop="fileName">
+          <el-input
+            maxLength="30"
+            v-model="queryParams.fileName"
+            placeholder="文件名"
+            clearable
+            style="width: 200px"
+          />
+        </el-form-item>
+        <el-form-item label="上报时间" prop="dateRange">
+          <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" style="margin-right:10px;">查询</p>
+          <p class="reset-button-one" @click="resetQuery">重置</p>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="content-box">
+      <el-table v-loading="loading" border :data="tableList" ref="multipleTable">
+        <el-table-column label="文件名" align="center" prop="fileName" show-overflow-tooltip/>
+        <el-table-column label="类型" align="center" prop="fileType" show-overflow-tooltip width="130"/>
+        <el-table-column label="尺寸(MB)" align="center" prop="fileSize" show-overflow-tooltip width="130"/>
+        <el-table-column label="文件地址" align="center" prop="fileUrl" show-overflow-tooltip width="470"/>
+        <el-table-column label="上传时间" align="center" prop="createTime" show-overflow-tooltip width="200"/>
+        <el-table-column label="上传人" align="center" prop="userName" show-overflow-tooltip width="170"/>
+        <el-table-column label="操作" align="center" prop="deptName" width="170">
+          <template slot-scope="scope">
+            <div class="table-button-box">
+              <p class="table-button-null"></p>
+              <p class="table-button-p" @click="tableButton">预览</p>
+              <p class="table-button-null"></p>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination :page-sizes="[20, 30, 40, 50]"
+                  v-show="total>0"
+                  :total="total"
+                  :page.sync="queryParams.page"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+      />
+    </div>
+
+  </div>
+</template>
+
+<script>
+  import { getFileList,getFileCategory } from "@/api/systemManagement/index";
+  export default {
+    name: 'filePreview',
+    data(){
+      return{
+        loading:false,
+        optionList:[],
+        queryParams:{
+          page:1,
+          pageSize:20,
+          category:"",
+          fileName:"",
+        },
+        dateRange:[],
+        tableList:[],
+        total:0,
+      }
+    },
+    created(){
+
+    },
+    mounted(){
+      this.getFileCategory();
+      this.getList();
+    },
+    methods:{
+      handleQuery(){
+        this.$set(this.queryParams,'page',1);
+        this.getList();
+      },
+      resetQuery(){
+        this.$set(this,'dateRange',[])
+        this.$set(this,'queryParams',{
+          page:1,
+          pageSize:20,
+          category:"",
+          fileName:"",
+        });
+        this.getList();
+      },
+      //获取数据列表
+      getList(){
+        this.$set(this,'loading',true);
+        let obj = JSON.parse(JSON.stringify(this.queryParams))
+        if(this.dateRange[0]){
+          obj.startTime = this.dateRange[0]+'T00:00:00'
+          obj.endTime = this.dateRange[1]+'T23:59:59'
+        }else{
+          obj.startTime = "";
+          obj.endTime = "";
+        }
+        getFileList(obj).then(response => {
+          this.$set(this,'loading',false);
+          this.$set(this,'tableList',response.data.records);
+          this.$set(this,'total',response.data.total);
+        });
+      },
+      //预览
+      tableButton(){
+
+      },
+      //获取文件分类列表
+      getFileCategory(){
+        getFileCategory().then(response => {
+          this.$set(this,'optionList',response.data);
+        });
+      },
+    },
+  }
+</script>
+
+<style scoped lang="scss">
+  .filePreview{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    .title-box{
+      padding-top:20px;
+      border-bottom:1px solid #dedede;
+      display: flex;
+    }
+    .content-box{
+      flex: 1;
+      display: flex;
+      flex-direction: column;
+      padding:20px;
+      overflow: hidden;
+    }
+  }
+</style>

+ 15 - 6
src/views/systemManagement/menu/index.vue

@@ -113,10 +113,12 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="菜单类型" prop="menuType">
-              <el-radio-group v-model="form.menuType">
-                <el-radio :label="0">目录</el-radio>
-                <el-radio :label="1">菜单</el-radio>
-                <el-radio :label="2">按钮</el-radio>
+              <el-radio-group v-model="form.menuType" >
+                <el-radio v-for="item in menuTypeList"
+                          :disabled="item.disabled"
+                          :label="item.label">
+                  {{item.value}}
+                </el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -289,6 +291,11 @@ export default {
       showSearch: true,
       // 菜单表格树数据
       menuList: [],
+      menuTypeList:[
+        {label:0,value:'目录',disabled:false,},
+        {label:1,value:'菜单',disabled:false,},
+        {label:2,value:'按钮',disabled:false,},
+      ],
       // 菜单树选项
       menuOptions: [],
       // 弹出层标题
@@ -399,7 +406,7 @@ export default {
         icon: undefined,
         menuType: 0,
         orderNum: undefined,
-        isFrame: true,
+        isFrame: false,
         isCache: true,
         visible: true,
         status: true,
@@ -416,6 +423,7 @@ export default {
       this.resetForm("queryForm");
       this.handleQuery();
     },
+
     /** 新增按钮操作 */
     handleAdd(row) {
       this.reset();
@@ -443,7 +451,8 @@ export default {
       this.$refs["form"].validate(valid => {
         if (valid) {
           let obj = JSON.parse(JSON.stringify(this.form))
-          obj.component = obj.menuType != 0 ? obj.component:'Layout';
+          // obj.component = obj.menuType != 0 ? obj.component:'Layout';ParentView
+          obj.component = obj.parentId == 0 && obj.menuType == 0 ? 'Layout':(obj.parentId != 0 && obj.menuType == 0 ?'ParentView':obj.component);
           if (obj.menuId != undefined) {
             updateMenu(obj).then(response => {
               this.msgSuccess("修改成功");

+ 243 - 0
src/views/systemManagement/publicConfig/basicsConfig.vue

@@ -0,0 +1,243 @@
+<template>
+  <div class="public-config-page">
+    <el-form class="public-form-box scrollbar-box" :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
+      <div class="form-max-box">
+        <el-form-item label="学校名称:" prop="schoolName">
+          <el-input
+            v-model="form.schoolName"
+            maxLength="20"
+            placeholder="请输入学校名称"
+          />
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="圆形Logo:" prop="circularLogo">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'circularLogo')"
+            :headers="headers"
+            :before-upload="(file)=>beforeAvatarUpload(file,'1')">
+            <img v-if="form.circularLogo" :src="form.circularLogo" class="avatar" style="height:200px;width:200px;background: #dedede;padding:5px;border-radius:4px;">
+            <i v-if="!form.circularLogo" class="el-icon-plus avatar-uploader-icon" style="height:80px;width:80px;border-radius: 40px;line-height: 80px;">上传</i>
+          </el-upload>
+          <i v-if="form.circularLogo" class="el-icon-view" @click="lookImg(form.circularLogo)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        </el-form-item>
+        <p style="margin-left:160px;font-size:16px;color:#666;font-weight:500;">尺寸限制为200*200px,支持PNG格式</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="长方形Logo:" prop="rectangleLogo">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'rectangleLogo')"
+            :headers="headers"
+            :before-upload="(file)=>beforeAvatarUpload(file,'2')">
+            <img v-if="form.rectangleLogo" :src="form.rectangleLogo" class="avatar" style="height:110px;width:500px;background: #dedede;padding:5px;border-radius:4px;">
+            <i v-if="!form.rectangleLogo" class="el-icon-plus avatar-uploader-icon">上传</i>
+          </el-upload>
+          <i v-if="form.rectangleLogo" class="el-icon-view" @click="lookImg(form.rectangleLogo)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        </el-form-item>
+        <p style="margin-left:160px;font-size:16px;color:#666;font-weight:500;">尺寸限制为110*500px,支持PNG格式</p>
+      </div>
+    </el-form>
+    <div class="sub_btn">
+      <p class="null-p"></p>
+      <p class="inquire-button-one"  @click="submitForm">保存</p>
+      <p class="null-p"></p>
+    </div>
+    <!--查看图片-->
+    <el-dialog title="查看" :visible.sync="imgOpen" width="1200px" append-to-body>
+      <div class="scrollbar-box" style="width:1160px;margin:0 auto;max-height:700px;overflow-y: scroll">
+        <img :src="imgUrl" style="display:block;max-width:1160px;margin:0 auto">
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { getToken } from "@/utils/auth";
+  import { updateLogoInfo } from "@/api/systemManagement/index";
+  import { getLogoInfo} from "@/api/commonality/noPermission";
+  import store from '@/store'
+  export default {
+    name: "publicConfig",
+    data() {
+      return {
+        uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+        headers: {
+          Authorization: "Bearer " + getToken(),
+        },
+        form:{
+          userType:[],
+          expandType:[]
+        },
+        rules: {
+          schoolName: [
+            { required: true, message: "学校名称不能为空", trigger: "blur" },
+            { required: true, message: "学校名称不能为空", validator: this.spaceJudgment, trigger: "blur" }
+          ],
+          circularLogo: [
+            { required: true, message: "圆形Logo不能为空", trigger: "blur" }
+          ],
+          rectangleLogo: [
+            { required: true, message: "长方形Logo不能为空", trigger: "blur" }
+          ],
+        },
+        imgUrl:"",
+        imgOpen:false,
+      };
+    },
+    created() {
+
+    },
+    mounted(){
+      this.getLogoInfo();
+    },
+    methods: {
+      /** 提交按钮 */
+      submitForm: function() {
+        let self = this;
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            let obj = {
+              id:this.form.id,
+              schoolName:this.form.schoolName,
+              circularLogo:this.form.circularLogo,
+              rectangleLogo:this.form.rectangleLogo,
+            }
+
+            updateLogoInfo(obj).then(response => {
+              this.msgSuccess(response.message);
+              this.getLogoInfo();
+            });
+          }
+        });
+      },
+      //查看图片
+      lookImg(url){
+        this.imgUrl = url;
+        this.imgOpen = true;
+      },
+      //获取数据
+      getLogoInfo(){
+        getLogoInfo().then(response => {
+
+          this.$set(this,'form',response.data)
+        });
+      },
+      //上传
+      handleAvatarSuccess(res,type) {
+        if(type == 'circularLogo'){
+          this.$set(this.form,'circularLogo',res.data.url);
+        }else if(type == 'rectangleLogo'){
+          this.$set(this.form,'rectangleLogo',res.data.url);
+        }
+        this.$forceUpdate()
+      },
+      beforeAvatarUpload(file,type) {
+        return new Promise((resolve, reject) => {
+          if (file.type == 'image/png') {
+            let reader = new FileReader()
+            reader.readAsDataURL(file) // 必须用file.raw
+            reader.onload = e => { // 让页面中的img标签的src指向读取的路径
+              let img = e.target.result;
+              const image = new Image()
+              image.src=img
+              image.onload = _=>{
+                if(type == '1'){
+                  if(image.width == 200 && image.height == 200){
+                    resolve()
+                  }else{
+                    this.$message.error('尺寸限制为200*200px,支持PNG格式')
+                    reject();
+                  }
+                }else if(type == '2'){
+                  if(image.width == 500 && image.height == 110){
+                    resolve()
+                  }else{
+                    this.$message.error('尺寸限制为110*500px,支持PNG格式')
+                    reject();
+                  }
+                }
+              }
+            }
+          }else{
+            this.$message.error('请上传PNG格式');
+            reject();
+          }
+        })
+      },
+    },
+  };
+</script>
+
+<style scoped lang="scss">
+  .public-config-page{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    .public-form-box{
+      flex:1;
+      overflow-y: scroll;
+      overflow-x: hidden;
+    }
+    /*底部按钮弹框*/
+    .sub_btn{
+      display: flex;
+      background: #fff;
+      height: 112px;
+      .null-p{
+        flex:1;
+      }
+      .inquire-button-one{
+        cursor:pointer;
+        display: inline-block;
+        text-align: center;
+        width: 70px;
+        height: 40px;
+        border-radius: 6px;
+        border: 1px solid #0045af;
+        color:#ffffff;
+        background:#0045af;
+        margin:36px 10px 0 0;
+      }
+    }
+    *{
+      margin:0;
+    }
+    .title-box{
+      border-bottom:1px solid #dedede;
+      p{
+        margin-left:40px;
+        color:#0045af;
+        line-height:60px;
+      }
+    }
+    .form-max-box{
+      margin-top:20px;
+      margin-left: 100px;
+    }
+    .avatar-uploader-icon{
+      width: 200px;
+      height: 120px;
+      line-height: 120px;
+      font-size: 16px;
+      font-weight: 400;
+      color: #CCCCCC;
+    }
+    .avatar{
+      width: 200px;
+      height: 120px;
+    }
+  }
+</style>

+ 205 - 0
src/views/systemManagement/publicConfig/chemicalsConfig.vue

@@ -0,0 +1,205 @@
+<template>
+  <div class="public-config-page">
+    <el-form class="public-form-box scrollbar-box" :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
+      <div class="form-max-box">
+        <el-form-item label="使用身份配置" prop="userType">
+          <el-checkbox-group v-model="form.userType">
+            <el-checkbox style="margin:4px 87px 0 20px;" label="11">教职工</el-checkbox>
+            <el-checkbox label="22">学生</el-checkbox>
+          </el-checkbox-group>
+
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="扩展配置" prop="expandType">
+          <el-checkbox-group v-model="form.expandType">
+            <el-checkbox style="margin:4px 30px 0 20px;" label="11">化学品柜智能锁</el-checkbox>
+            <el-checkbox label="22">气瓶标签</el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </div>
+    </el-form>
+    <div class="sub_btn">
+      <p class="null-p"></p>
+      <p class="inquire-button-one"  @click="submitForm">保存</p>
+      <p class="null-p"></p>
+    </div>
+    <!--查看图片-->
+    <el-dialog title="查看" :visible.sync="imgOpen" width="1200px" append-to-body>
+      <div class="scrollbar-box" style="width:1160px;margin:0 auto;max-height:700px;overflow-y: scroll">
+        <img :src="imgUrl" style="display:block;max-width:1160px;margin:0 auto">
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { getToken } from "@/utils/auth";
+  import { updateLogoInfo } from "@/api/systemManagement/index";
+  import { getLogoInfo} from "@/api/commonality/noPermission";
+  import store from '@/store'
+  export default {
+    name: "publicConfig",
+    data() {
+      return {
+        uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+        headers: {
+          Authorization: "Bearer " + getToken(),
+        },
+        form:{
+          userType:[],
+          expandType:[]
+        },
+        rules: {
+
+          userType: [
+            { required: true, message: "请配置使用身份", trigger: "blur" }
+          ],
+          smartLock: [
+            { required: true, message: "请配置智能锁", trigger: "blur" }
+          ],
+          airBottle: [
+            { required: true, message: "请配置气瓶标签", trigger: "blur" }
+          ],
+          expandType: [
+            { required: true, message: "请配置扩展配置", trigger: "blur" }
+          ]
+        },
+        imgUrl:"",
+        imgOpen:false,
+      };
+    },
+    created() {
+
+    },
+    mounted(){
+      this.getLogoInfo();
+    },
+    methods: {
+      /** 提交按钮 */
+      submitForm: function() {
+        let self = this;
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            let obj = {
+              id:this.form.id,
+            }
+            //判断使用身份配置
+            if(self.form.userType[1]){
+              obj.userType = '-1';
+            }else{
+              if(self.form.userType[0] == '11'){
+                obj.userType = '11';
+              }else if(self.form.userType[0] == '22'){
+                obj.userType = '22';
+              }
+            }
+            //判断扩展配置(智能锁配置/气瓶标签配置)
+            let oneType = 0;
+            let twoType = 0;
+            for(let i=0;i<self.form.expandType.length;i++){
+              if(self.form.expandType[i] == '11'){
+                obj.smartLock = 1;
+                oneType++
+              }else if(self.form.expandType[i] == '22'){
+                obj.airBottle = 1;
+                twoType++
+              }
+            }
+            if(oneType==0){
+              obj.smartLock = 0;
+            }
+            if(twoType==0){
+              obj.airBottle = 0;
+            }
+            updateLogoInfo(obj).then(response => {
+              this.msgSuccess(response.message);
+              this.getLogoInfo();
+            });
+          }
+        });
+      },
+      //查看图片
+      lookImg(url){
+        this.imgUrl = url;
+        this.imgOpen = true;
+      },
+      //获取数据
+      getLogoInfo(){
+        getLogoInfo().then(response => {
+          //判断使用身份配置
+          let listOne = [];
+          if(response.data.userType == -1){
+            listOne.push('11')
+            listOne.push('22')
+          }else if(response.data.userType == 11){
+            listOne.push('11')
+          }else if(response.data.userType == 22){
+            listOne.push('22')
+          }
+          this.$set(response.data,'userType',listOne);
+          //判断扩展配置
+          let listTwo = [];
+          if(response.data.smartLock == 1){
+            listTwo.push('11')
+          }
+          if(response.data.airBottle == 1){
+            listTwo.push('22')
+          }
+          this.$set(response.data,'expandType',listTwo);
+          this.$set(this,'form',response.data)
+        });
+      },
+
+    },
+  };
+</script>
+
+<style scoped lang="scss">
+  .public-config-page{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    .public-form-box{
+      flex:1;
+      overflow-y: scroll;
+      overflow-x: hidden;
+    }
+    /*底部按钮弹框*/
+    .sub_btn{
+      display: flex;
+      background: #fff;
+      height: 112px;
+      .null-p{
+        flex:1;
+      }
+      .inquire-button-one{
+        cursor:pointer;
+        display: inline-block;
+        text-align: center;
+        width: 70px;
+        height: 40px;
+        border-radius: 6px;
+        border: 1px solid #0045af;
+        color:#ffffff;
+        background:#0045af;
+        margin:36px 10px 0 0;
+      }
+    }
+    *{
+      margin:0;
+    }
+    .title-box{
+      border-bottom:1px solid #dedede;
+      p{
+        margin-left:40px;
+        color:#0045af;
+        line-height:60px;
+      }
+    }
+    .form-max-box{
+      margin-top:20px;
+    }
+  }
+</style>

+ 310 - 0
src/views/systemManagement/publicConfig/exploitConfig.vue

@@ -0,0 +1,310 @@
+<!--开发配置-->
+<template>
+  <div class="public-config-page">
+    <el-form class="public-form-box scrollbar-box" :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
+      <div class="title-box">
+        <p>文件预览配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="kkFile预览地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.fileExtranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">https://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>调用后台文件预览服务时访问的地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="kkFile预览地址-内网:">
+          <el-input placeholder="请输入"  v-model="form.fileIntranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">http://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>调用后台文件预览服务时访问的地址</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>摄像头配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="代理访问地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.cameraExtranetAgent" style="width:400px;" maxLength="50">
+            <template slot="prepend">https://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>根据部署外网环境来配置的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="代理访问地址-内网:">
+          <el-input placeholder="请输入"  v-model="form.cameraIntranetAgent" style="width:400px;" maxLength="50">
+            <template slot="prepend">http://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>根据部署内网环境来配置的调用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="内网地址IP段:">
+          <el-input placeholder="请输入"  v-model="form.ipIdentify"  style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于判断用户当前访问的是内网地址还是外网地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="内网访问地址:">
+          <el-input placeholder="请输入"  v-model="form.cameraIntranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">http://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>在内网环境时连接摄像头所用地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="外网访问地址:">
+          <el-input placeholder="请输入"  v-model="form.cameraExtranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">https://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>在外网环境时连接摄像头所用地址</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>MQTT配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.mqttExtranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">wss://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>MQTT调用相关地址/账号配置</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT账号-外网:">
+          <el-input v-model="form.mqttExtranetUser" placeholder="请输入" style="width:400px;" maxLength="50"/>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT密码-外网:">
+          <el-input v-model="form.mqttExtranetPassword" placeholder="请输入" style="width:400px;" maxLength="50"/>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT地址-内网:">
+          <el-input placeholder="请输入"  v-model="form.mqttIntranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">ws://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>MQTT调用相关地址/账号配置</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT账号-内网:">
+          <el-input v-model="form.mqttIntranetUser" placeholder="请输入" style="width:400px;" maxLength="50"/>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="MQTT密码-内网:">
+          <el-input v-model="form.mqttIntranetPassword" placeholder="请输入" style="width:400px" maxLength="50"/>
+        </el-form-item>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>可视化大屏配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="访问地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.screenExtranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">https://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>跳转大屏时访问的地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="访问地址-内网:">
+          <el-input placeholder="请输入"  v-model="form.screenIntranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">http://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>跳转大屏时访问的地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="访问地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.pcExtranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">https://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>跳转后台时访问的地址</i>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="访问地址-内网:">
+          <el-input placeholder="请输入"  v-model="form.pcIntranetUrl" style="width:400px;" maxLength="50">
+            <template slot="prepend">http://</template>
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>跳转后台时访问的地址</i>
+      </div>
+      <div class="line"></div>
+      <div class="title-box">
+        <p>微信小程序二维码配置</p>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="kkFile预览地址-外网:">
+          <el-input placeholder="请输入"  v-model="form.codeOnlineAdd" style="width:400px;" maxLength="50">
+          </el-input>
+        </el-form-item>
+        <i class="tip"><i class="el-icon-question"></i>用于微信外部扫一扫跳转指引,需与微信小程序后台二维码规则配置一致</i>
+      </div>
+    </el-form>
+    <div class="sub_btn">
+      <p class="null-p"></p>
+      <p class="inquire-button-one"  @click="submitForm">保存</p>
+      <p class="null-p"></p>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { getToken } from "@/utils/auth";
+  import { addUrlConfig } from '@/api/systemManagement/index'
+  import { getLogoInfo,getUrlConfig} from "@/api/commonality/noPermission";
+  import store from '@/store'
+  import { Encrypt,Decrypt} from '@/utils/secret'
+  export default {
+    name: "publicConfig",
+    data() {
+      return {
+        uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+        headers: {
+          Authorization: "Bearer " + getToken(),
+        },
+        form:{
+
+        },
+        rules: {
+          fileExtranetUrl: [
+            { pattern:/http[s]{0,1}:\/\/([\w.]+\/?)\S*/, message: "请输入正确的联系方式", trigger: "blur" }
+          ],
+
+        },
+
+      };
+    },
+    created() {
+    },
+    mounted(){
+      this.getUrlConfig();
+    },
+    methods: {
+      /** 提交按钮 */
+      submitForm: function() {
+        let _this = this;
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            _this.form.mqttExtranetUrl=Encrypt(_this.form.mqttExtranetUrl)
+            _this.form.mqttExtranetUser=Encrypt(_this.form.mqttExtranetUser)
+            _this.form.mqttExtranetPassword=Encrypt(_this.form.mqttExtranetPassword)
+
+            _this.form.mqttIntranetUrl=Encrypt(_this.form.mqttIntranetUrl)
+            _this.form.mqttIntranetUser=Encrypt(_this.form.mqttIntranetUser)
+            _this.form.mqttIntranetPassword=Encrypt(_this.form.mqttIntranetPassword)
+            addUrlConfig(_this.form).then(response => {
+              _this.msgSuccess(response.message);
+              _this.getUrlConfig()
+
+            });
+          }
+        });
+      },
+      //获取数据
+      getUrlConfig(){
+        let _this=this;
+        getUrlConfig().then(response => {
+            _this.form=response.data
+
+          _this.form.mqttExtranetUrl=Decrypt(_this.form.mqttExtranetUrl)
+          _this.form.mqttExtranetUser=Decrypt(_this.form.mqttExtranetUser)
+          _this.form.mqttExtranetPassword=Decrypt(_this.form.mqttExtranetPassword)
+
+          _this.form.mqttIntranetUrl=Decrypt(_this.form.mqttIntranetUrl)
+          _this.form.mqttIntranetUser=Decrypt(_this.form.mqttIntranetUser)
+          _this.form.mqttIntranetPassword=Decrypt(_this.form.mqttIntranetPassword)
+        });
+      },
+    },
+  };
+</script>
+
+<style scoped lang="scss">
+  .public-config-page{
+    flex:1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    ::v-deep .el-input-group__prepend{
+      padding:0 10px;
+      width:80px;
+    }
+    .public-form-box{
+      flex:1;
+      overflow-y: scroll;
+      overflow-x: hidden;
+    }
+    /*底部按钮弹框*/
+    .sub_btn{
+      /*position: absolute;*/
+      display: flex;
+      right: 20px;
+      bottom: 0;
+      background: #fff;
+      height: 112px;
+      text-align: center;
+      .null-p{
+        flex:1;
+      }
+      .inquire-button-one{
+        cursor:pointer;
+        display: inline-block;
+        text-align: center;
+        width: 70px;
+        height: 40px;
+        border-radius: 6px;
+        border: 1px solid #0045af;
+        color:#ffffff;
+        background:#0045af;
+        margin:36px 10px 0 0;
+      }
+    }
+    *{
+      margin:0;
+    }
+    .title-box{
+      p{
+        margin-left:78px;
+        color:#0045af;
+        line-height:60px;
+        font-size: 16px;
+        font-weight: 400;
+        color: #333333;
+      }
+    }
+    .form-max-box{
+      margin-top:20px;
+      margin-left: 100px;
+      .tip{
+        font-size: 16px;
+        font-family: Microsoft YaHei-Regular, Microsoft YaHei;
+        font-weight: 400;
+        color: #333333;
+        line-height: 40px;
+        font-style: normal;
+        >i{
+          margin: 0 10px 0 24px;
+          color: #0045AF;
+        }
+      }
+    }
+    .line{
+      width: 100%;
+      height: 10px;
+      background: #F5F5F5;
+      margin-top: 40px;
+    }
+  }
+</style>

+ 104 - 0
src/views/systemManagement/publicConfig/index.vue

@@ -0,0 +1,104 @@
+<template>
+  <div class="app-container classifiedGrading">
+    <div class="top-button-max-box">
+      <div class="top-button-box" @click="buttonPageType(1)">
+        <p :class="pageType == 1 ? 'p-color':''">基础配置</p>
+        <p :class="pageType == 1 ? 'p-back':''"></p>
+      </div>
+      <div class="top-button-box" @click="buttonPageType(2)">
+        <p :class="pageType == 2 ? 'p-color':''">化学品终端</p>
+        <p :class="pageType == 2 ? 'p-back':''"></p>
+      </div>
+      <div class="top-button-box" @click="buttonPageType(3)">
+        <p :class="pageType == 3 ? 'p-color':''">一体机</p>
+        <p :class="pageType == 3 ? 'p-back':''"></p>
+      </div>
+      <div class="top-button-box" @click="buttonPageType(4)">
+        <p :class="pageType == 4 ? 'p-color':''">小程序</p>
+        <p :class="pageType == 4 ? 'p-back':''"></p>
+      </div>
+      <div class="top-button-box" @click="buttonPageType(5)">
+        <p :class="pageType == 5 ? 'p-color':''">开发配置</p>
+        <p :class="pageType == 5 ? 'p-back':''"></p>
+      </div>
+    </div>
+    <basics-config v-if="pageType == 1"></basics-config>
+    <chemicals-config v-if="pageType == 2"></chemicals-config>
+    <integrationConfig v-if="pageType == 3"></integrationConfig>
+    <program-config v-if="pageType == 4"></program-config>
+    <exploit-config v-if="pageType == 5"></exploit-config>
+  </div>
+</template>
+
+<script>
+import basicsConfig from "./basicsConfig.vue";
+import chemicalsConfig from "./chemicalsConfig.vue";
+import integrationConfig from "./integrationConfig.vue";
+import programConfig from "./programConfig.vue";
+import exploitConfig from "./exploitConfig.vue";
+export default {
+  name: "index",
+  components: {
+    basicsConfig,
+    chemicalsConfig,
+    integrationConfig,
+    programConfig,
+    exploitConfig,
+  },
+  data() {
+    return {
+      pageType:1,
+    }
+  },
+  created() {
+
+  },
+  mounted(){
+
+  },
+  methods:{
+    // 选项卡切换
+    buttonPageType(type){
+      if(this.pageType != type){
+        this.pageType = type;
+      }
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.classifiedGrading{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+  *{
+    margin:0;
+  }
+  .top-button-max-box{
+    display: flex;
+    padding:16px 10px 0;
+    border-bottom:1px solid #D8D8D8;
+    .top-button-box{
+      height:73px;
+      padding:0 25px;
+      p:nth-child(1){
+        line-height:68px;
+        text-align: center;
+        font-weight:500;
+        cursor: pointer;
+      }
+      p:nth-child(2){
+        height:5px;
+        border-radius:2px;
+      }
+      .p-color{
+        color:#0045AF;
+      }
+      .p-back{
+        background: #0045AF;
+      }
+    }
+  }
+}
+</style>

+ 354 - 0
src/views/systemManagement/publicConfig/integrationConfig.vue

@@ -0,0 +1,354 @@
+<!--一体机配置-->
+<template>
+  <div class="public-config-page integrationConfig">
+    <el-form class="public-form-box scrollbar-box"  :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
+      <div class="form-max-box">
+        <el-form-item label="信息牌模块:" prop="isStart">
+          <el-radio-group v-model="form.isStart" style="margin-top:4px;">
+            <el-radio :label="1" style="margin-right:30px;">启用</el-radio>
+            <el-radio :label="0">停用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="物联控制权限:" prop="lotControl">
+          <el-checkbox-group v-model="form.lotControl">
+            <el-checkbox v-for="item in citiesList" :label="item.id" :key="item.id" style="margin-right:20px;margin-top:2px;">{{item.name}}</el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item class="time-input-box" label="自动返回时间:" prop="returnTime">
+          <el-input-number :controls="false" :min="30" :max="600" placeholder="请输入内容" v-model="form.returnTime" style="width:500px;"/>
+          <span>秒</span>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item class="time-input-box" label="自动注销时间:" prop="logoutTime">
+          <el-input-number :controls="false" :min="30" :max="600" placeholder="请输入内容" v-model="form.logoutTime" style="width:500px;"/>
+          <span>秒</span>
+        </el-form-item>
+      </div>
+      <!--<div class="form-max-box">-->
+        <!--<el-form-item label="签到/离开示意图:" prop="signMap">-->
+          <!--<el-upload-->
+            <!--class="certificate-avatar-uploader"-->
+            <!--:action="uploadImgUrl"-->
+            <!--:show-file-list="false"-->
+            <!--accept="image/jpeg,image/gif,image/png"-->
+            <!--:on-success="(res)=>handleAvatarSuccess(res,'signMap')"-->
+            <!--:headers="headers"-->
+            <!--:before-upload="beforeAvatarUpload">-->
+            <!--<img v-if="form.signMap" :src="form.signMap" class="avatar">-->
+            <!--<i v-if="!form.signMap" class="el-icon-plus avatar-uploader-icon" >上传</i>-->
+          <!--</el-upload>-->
+          <!--<i v-if="form.signMap" class="el-icon-view" @click="lookImg(form.signMap)"-->
+             <!--style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;-->
+            <!--height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>-->
+        <!--</el-form-item>-->
+      <!--</div>-->
+      <div class="form-max-box">
+        <el-form-item label="视频封面:" prop="videoCover">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'videoCover')"
+            :headers="headers"
+            :before-upload="beforeAvatarUpload">
+            <img v-if="form.videoCover" :src="form.videoCover" class="avatar" >
+            <i v-if="!form.videoCover" class="el-icon-plus avatar-uploader-icon">上传</i>
+          </el-upload>
+          <i v-if="form.videoCover" class="el-icon-view" @click="lookImg(form.videoCover)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        </el-form-item>
+      </div>
+      <!--<div class="form-max-box">-->
+        <!--<el-form-item label="操作指南:" prop="operationGuide">-->
+          <!--<el-upload-->
+            <!--class="certificate-avatar-uploader"-->
+            <!--:action="uploadImgUrl"-->
+            <!--:show-file-list="false"-->
+            <!--accept="image/jpeg,image/gif,image/png"-->
+            <!--:on-success="(res)=>handleAvatarSuccess(res,'operationGuide')"-->
+            <!--:headers="headers"-->
+            <!--:before-upload="beforeAvatarUpload">-->
+            <!--<img v-if="form.operationGuide" :src="form.operationGuide" class="avatar">-->
+            <!--<i v-if="!form.operationGuide" class="el-icon-plus avatar-uploader-icon">上传</i>-->
+          <!--</el-upload>-->
+          <!--<i v-if="form.operationGuide" class="el-icon-view" @click="lookImg(form.operationGuide)"-->
+             <!--style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;-->
+            <!--height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>-->
+        <!--</el-form-item>-->
+      <!--</div>-->
+    </el-form>
+    <div class="sub_btn">
+      <p class="null-p"></p>
+      <p class="inquire-button-one"  @click="submitForm">保存</p>
+      <p class="null-p"></p>
+    </div>
+    <!--查看图片-->
+    <el-dialog title="查看" :visible.sync="imgOpen" width="1200px" append-to-body>
+      <div class="scrollbar-box" style="width:1160px;margin:0 auto;max-height:700px;overflow-y: scroll">
+        <img :src="imgUrl" style="display:block;max-width:1160px;margin:0 auto">
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getToken } from "@/utils/auth";
+import { updateLogoInfo } from "@/api/systemManagement/index";
+import { getLogoInfo} from "@/api/commonality/noPermission";
+import store from '@/store'
+export default {
+  name: "publicConfig",
+  data() {
+    return {
+      uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+      headers: {
+        Authorization: "Bearer " + getToken(),
+      },
+      form:{
+        lotControl:[],
+        userType:[],
+        expandType:[],
+        isStart:1,
+        returnTime:60,
+        logoutTime:120,
+      },
+      rules: {
+        lotControl:[
+          { required: true, message: "请选择物联控制权限", trigger: "blur" }
+        ],
+        signMap: [
+          { required: true, message: "签到/离开示意图不能为空", trigger: "blur" }
+        ],
+        videoCover: [
+          { required: true, message: "视频封面不能为空", trigger: "blur" }
+        ],
+        operationGuide: [
+          { required: true, message: "操作指南不能为空", trigger: "blur" }
+        ],
+        isStart:[
+          { required: true, message: "请选择信息牌模块", trigger: "blur" }
+        ],
+        returnTime:[
+          { required: true, message: "请输入自动返回时间", trigger: "blur" }
+        ],
+        logoutTime:[
+          { required: true, message: "请输入自动注销时间", trigger: "blur" }
+        ],
+
+
+
+      },
+      imgUrl:"",
+      imgOpen:false,
+      //物联控制权限
+      lotControl:[],
+      citiesList:[
+        //物联控制 1.实验室负责人,2.安全责任人,3.安全准入人员,4.白名单,-1.全部
+        {
+          id:'1',
+          name:"实验室负责人"
+        },
+        {
+          id:'2',
+          name:"安全责任人"
+        },
+        {
+          id:'3',
+          name:"安全准入人员"
+        },
+        {
+          id:'4',
+          name:"白名单"
+        },
+        {
+          id:'-1',
+          name:"全部人员"
+        },
+      ],
+    };
+  },
+  created() {
+
+  },
+  mounted(){
+    this.getLogoInfo();
+  },
+  methods: {
+    /** 提交按钮 */
+    submitForm: function() {
+      let self = this;
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if(this.form.returnTime == this.form.logoutTime){
+            this.msgError('自动返回时间与自动注销时间不能重复');
+            return
+          }
+          let obj = {
+            id:this.form.id,
+            signMap:this.form.signMap,
+            videoCover:this.form.videoCover,
+            operationGuide:this.form.operationGuide,
+            isStart:this.form.isStart,
+            returnTime:this.form.returnTime,
+            logoutTime:this.form.logoutTime,
+          }
+          let num = 0;
+          for(let i=0;i<self.form.lotControl.length;i++){
+            if(self.form.lotControl[i] == '-1'){
+              num++
+            }
+          }
+          if(num == 0){
+            obj.lotControl = self.form.lotControl+'';
+          }else{
+            obj.lotControl = '-1';
+          }
+          updateLogoInfo(obj).then(response => {
+            this.msgSuccess(response.message);
+            this.getLogoInfo();
+          });
+        }
+      });
+    },
+    //查看图片
+    lookImg(url){
+      this.imgUrl = url;
+      this.imgOpen = true;
+    },
+    //获取数据
+    getLogoInfo(){
+      getLogoInfo().then(response => {
+        localStorage.setItem('videoCover',response.data.videoCover)
+        if(!response.data.returnTime){
+          response.data.returnTime = 60;
+        }
+        if(!response.data.logoutTime){
+          response.data.logoutTime = 120;
+        }
+        this.$set(this,'form',response.data)
+        if(response.data.lotControl){
+          let list = response.data.lotControl.split(",");
+          this.$set(this.form,'lotControl',list);
+        }else{
+          this.$set(this.form,'lotControl',['1','2','3','4']);
+        }
+      });
+    },
+    //上传
+    handleAvatarSuccess(res,type) {
+       if(type == 'signMap'){
+        this.$set(this.form,'signMap',res.data.url);
+      }else if(type == 'videoCover'){
+        this.$set(this.form,'videoCover',res.data.url);
+      }else if(type == 'operationGuide'){
+        this.$set(this.form,'operationGuide',res.data.url);
+      }
+      this.$forceUpdate()
+    },
+    beforeAvatarUpload(file) {
+      let type = false;
+      console.log('file',file);
+      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;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.public-config-page{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  .public-form-box{
+    flex:1;
+    overflow-y: scroll;
+    overflow-x: hidden;
+  }
+  /*底部按钮弹框*/
+  .sub_btn{
+    display: flex;
+    background: #fff;
+    height: 112px;
+    .null-p{
+      flex:1;
+    }
+    .inquire-button-one{
+      cursor:pointer;
+      display: inline-block;
+      text-align: center;
+      width: 70px;
+      height: 40px;
+      border-radius: 6px;
+      border: 1px solid #0045af;
+      color:#ffffff;
+      background:#0045af;
+      margin:36px 10px 0 0;
+    }
+  }
+  *{
+    margin:0;
+  }
+  .title-box{
+    border-bottom:1px solid #dedede;
+    p{
+      margin-left:40px;
+      color:#0045af;
+      line-height:60px;
+    }
+  }
+  .form-max-box{
+    margin-top:20px;
+    margin-left: 100px;
+  }
+  .avatar-uploader-icon{
+    width: 200px;
+    height: 120px;
+    line-height: 120px;
+    font-size: 16px;
+    font-weight: 400;
+    color: #CCCCCC;
+  }
+  .avatar{
+    width: 200px;
+    height: 120px;
+  }
+}
+</style>
+<style lang="scss">
+  .integrationConfig{
+    .time-input-box{
+      input{
+        text-align: left;
+        border-top-right-radius:0;
+        border-bottom-right-radius:0;
+      }
+      span{
+        font-size:14px;
+        font-weight:500;
+        display: inline-block;
+        width:40px;
+        height:40px;
+        background: #E0E0E0;
+        text-align: center;
+        line-height: 40px;
+        border-top-right-radius:4px;
+        border-bottom-right-radius:4px;
+      }
+    }
+  }
+</style>
+

+ 210 - 0
src/views/systemManagement/publicConfig/programConfig.vue

@@ -0,0 +1,210 @@
+<!--一体机配置-->
+<template>
+  <div class="public-config-page">
+    <el-form class="public-form-box scrollbar-box"  :model="form" ref="form" :inline="true" :rules="rules" label-width="160px">
+      <div class="form-max-box">
+        <el-form-item label="登录页banner:" prop="loginBanner">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'loginBanner')"
+            :headers="headers"
+            :before-upload="beforeAvatarUpload">
+            <img v-if="form.loginBanner" :src="form.loginBanner" class="avatar" >
+            <i v-if="!form.loginBanner" class="el-icon-plus avatar-uploader-icon">上传</i>
+          </el-upload>
+          <i v-if="form.loginBanner" class="el-icon-view" @click="lookImg(form.loginBanner)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        </el-form-item>
+      </div>
+      <div class="form-max-box">
+        <el-form-item label="首页banner:" prop="homepageBanner">
+          <el-upload
+            class="certificate-avatar-uploader"
+            :action="uploadImgUrl"
+            :show-file-list="false"
+            accept="image/jpeg,image/gif,image/png"
+            :on-success="(res)=>handleAvatarSuccess(res,'homepageBanner')"
+            :headers="headers"
+            :before-upload="beforeAvatarUpload">
+            <img v-if="form.homepageBanner" :src="form.homepageBanner" class="avatar" >
+            <i v-if="!form.homepageBanner" class="el-icon-plus avatar-uploader-icon">上传</i>
+          </el-upload>
+          <i v-if="form.homepageBanner" class="el-icon-view" @click="lookImg(form.homepageBanner)"
+             style="position: absolute;top:0;right:0;z-index:999;border-radius:3px;cursor:pointer;width:20px;
+            height:20px;line-height:20px;text-align: center;background: rgba(0,0,0,0.2);color:#fff;"></i>
+        </el-form-item>
+      </div>
+    </el-form>
+    <div class="sub_btn">
+      <p class="null-p"></p>
+      <p class="inquire-button-one"  @click="submitForm">保存</p>
+      <p class="null-p"></p>
+    </div>
+    <!--查看图片-->
+    <el-dialog title="查看" :visible.sync="imgOpen" width="1200px" append-to-body>
+      <div class="scrollbar-box" style="width:1160px;margin:0 auto;max-height:700px;overflow-y: scroll">
+        <img :src="imgUrl" style="display:block;max-width:1160px;margin:0 auto">
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { getToken } from "@/utils/auth";
+import { updateLogoInfo } from "@/api/systemManagement/index";
+import { getLogoInfo} from "@/api/commonality/noPermission";
+import store from '@/store'
+export default {
+  name: "publicConfig",
+  data() {
+    return {
+      uploadImgUrl: this.uploadUrl(), // 上传的图片服务器地址
+      headers: {
+        Authorization: "Bearer " + getToken(),
+      },
+      form:{
+        userType:[],
+        expandType:[]
+      },
+      rules: {
+
+        loginBanner: [
+          { required: true, message: "登录页banner不能为空", trigger: "blur" }
+        ],
+        homepageBanner: [
+          { required: true, message: "首页banner不能为空", trigger: "blur" }
+        ],
+      },
+      imgUrl:"",
+      imgOpen:false,
+    };
+  },
+  created() {
+
+  },
+  mounted(){
+    this.getLogoInfo();
+  },
+  methods: {
+    /** 提交按钮 */
+    submitForm: function() {
+      let self = this;
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          let obj = {
+            id:this.form.id,
+            loginBanner:this.form.loginBanner,
+            homepageBanner:this.form.homepageBanner,
+          }
+
+          updateLogoInfo(obj).then(response => {
+            this.msgSuccess(response.message);
+            this.getLogoInfo();
+          });
+        }
+      });
+    },
+    //查看图片
+    lookImg(url){
+      this.imgUrl = url;
+      this.imgOpen = true;
+    },
+    //获取数据
+    getLogoInfo(){
+      getLogoInfo().then(response => {
+        this.$set(this,'form',response.data)
+      });
+    },
+    //上传
+    handleAvatarSuccess(res,type) {
+      if(type == 'loginBanner'){
+        this.$set(this.form,'loginBanner',res.data.url);
+      }else if(type == 'homepageBanner'){
+        this.$set(this.form,'homepageBanner',res.data.url);
+      }
+      this.$forceUpdate()
+    },
+    beforeAvatarUpload(file) {
+      let type = false;
+      console.log('file',file);
+      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;
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.public-config-page{
+  flex:1;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+  .public-form-box{
+    flex:1;
+    overflow-y: scroll;
+    overflow-x: hidden;
+  }
+  /*底部按钮弹框*/
+  .sub_btn{
+    /*position: absolute;*/
+    display: flex;
+    right: 20px;
+    bottom: 0;
+    background: #fff;
+    height: 112px;
+    text-align: center;
+    .null-p{
+      flex:1;
+    }
+    .inquire-button-one{
+      cursor:pointer;
+      display: inline-block;
+      text-align: center;
+      width: 70px;
+      height: 40px;
+      border-radius: 6px;
+      border: 1px solid #0045af;
+      color:#ffffff;
+      background:#0045af;
+      margin:36px 10px 0 0;
+    }
+  }
+  *{
+    margin:0;
+  }
+  .title-box{
+    border-bottom:1px solid #dedede;
+    p{
+      margin-left:40px;
+      color:#0045af;
+      line-height:60px;
+    }
+  }
+  .form-max-box{
+    margin-top:20px;
+    margin-left: 100px;
+  }
+  .avatar-uploader-icon{
+    width: 200px;
+    height: 120px;
+    line-height: 120px;
+    font-size: 16px;
+    font-weight: 400;
+    color: #CCCCCC;
+  }
+  .avatar{
+    width: 200px;
+    height: 120px;
+  }
+}
+</style>
+