tangning пре 3 година
родитељ
комит
9a6135c65c

Разлика између датотеке није приказан због своје велике величине
+ 63 - 0
public/noAccess.html


+ 9 - 4
src/request/config.js

@@ -129,10 +129,11 @@ export const deleteScene = '/web/scene/delete'
 
 
 
-
-/** ----------------相机接口----------------  getUserCameraList  ==>> getPageList*/
+ 
+/** ----------------相机接口----------------  getUserCameraList  ==>> getPageList /web/camera/getListByUser */ 
 // 获取相机列表
 export const getCameraList = '/web/camera/getPageList'
+export const getListByUser = '/web/camera/getListByUser'
 // 获取相机选项
 export const getCameraOptions = '/web/camera/getPageList?pageNum=1&pageSize=100000&type=1'
 // 获取相机选项(自己)
@@ -157,7 +158,7 @@ export const getTreeselect = '/web/department/treeselect'
 export const delTreeitem = '/web/department/del/'
 export const editTreeitem = '/web/department/edit'
 export const addTreeitem = '/web/department/add'
-
+export const checkUserCamera = '/web/department/checkUserCamera/'
 /** ----------------火调项目---------------- */
 // 获取火调列表
 export const getFireList = '/web/fireProject/queryProject'
@@ -215,9 +216,13 @@ export const uploadAttachImage = '/web/fireProject/uploadImage'
   export const getDownloadProcess = '/web/scene/downloadProcess'
   // 下载
   export const downloadScene = '/web/scene/downloadScene/'
+  // 带看相关接口
+  export const offLine = '/web/fireProject/offLine/'//{roomId}
+  export const onLine = '/web/fireProject/onLine/'//{roomId}
+  export const onLineCheck = '/web/fireProject/onLineCheck/'
 
 // 不需要登录就能请求的接口
-export const notLoginUrls = [userLogin, getCode, sendUserMsg, userReg, updatePsw, getCompanyList, fireDetailByPsw, getAttachListByPsw]
+export const notLoginUrls = [userLogin, getCode, sendUserMsg, userReg, updatePsw, getCompanyList, fireDetailByPsw, getAttachListByPsw,onLineCheck]
 // 需要用表单提交的数据
 export const fromUrls = [auditHouse, dismissHouse]
 // 带文件的请求

+ 1 - 2
src/request/loading.js

@@ -1,8 +1,7 @@
 
 import { getApp } from '@/app'
 
-const notOpenUrls = [
-]
+const notOpenUrls = ['/web/scene/downloadProcess' ]
 
 let loading
 

+ 11 - 0
src/util/index.js

@@ -149,4 +149,15 @@ export const downloadFile = (url, fileName) => {
   }
   let treeList = assemble(tree)
   return treeList
+}
+
+/** 
+ * 获取url 问号后面的参数
+**/
+export const getQueryString = (search) => {
+  if(typeof search !== "string" || !search) return search;
+  return search.split("&").reduce((res, cur) => {
+    const arr = cur.split("=");
+    return Object.assign({[arr[0]]: arr[1]}, res)
+  }, {})
 }

+ 5 - 2
src/view/dispatch/index.vue

@@ -118,7 +118,7 @@
         </template>
         <!-- -if="user.info.id == row.creatorId || user.roleKey == 'admin-dept'" -->
         <template v-else>
-          <span class="oper-span" v-power="'share'" @click="row.sceneNum && shareHandle(row)">分享</span>
+          <span class="oper-span" v-power="'share'" @click="shareHandle(row)">分享</span>
           <span class="oper-span" v-power="'edit'" @click="auth.update && user.info.deptId == row.deptId && editInfo(row)" :class="{disable: !(auth.update && user.info.deptId == row.deptId)}">编辑</span>
           <span class="oper-span" 
             @click="auth.delete && user.info.deptId == row.deptId && dataList.delete(row)" 
@@ -565,7 +565,7 @@ export default {
           }
         })
 
-        this.searchOptions = res.data.list
+        this.searchOptions =  res.data.records || res.data.list 
       } catch (e) {
         console.error(e)
       } finally {
@@ -674,6 +674,9 @@ export default {
       this.share.show = false
     },
     async shareHandle(item) {
+      if(!item.sceneNum){
+        return this.$message.error('暂未生成场景', '提示')
+      }
       let res = await axios.get(getFirePsw, {params: {projectId: item.id}})
       
       this.share.show = true

+ 1 - 1
src/view/layout/top/index.vue

@@ -92,7 +92,7 @@ export default {
   methods: {
     async getInfo(){
       let res =  await axios.get(getUserInfo)
-      setInfo(res.data.user)
+      setInfo({...res.data.user,cameraSns:res.data.cameraSns})
       setRoleKey(res.data.roles[0].roleKey)
       sessionStorage.setItem('roleLevel',res.data.roleLevel)
       setInfoPermission(res.data.permissionsList || [])

+ 1 - 1
src/view/organization/seeInfo.vue

@@ -12,7 +12,7 @@
       <el-form-item label="组织类型" :class="required?'mandatory':''">
         <p class="tip">{{ type }}</p>
       </el-form-item>
-      <el-form-item label="上级组织">
+      <el-form-item label="上级组织" :class="required?'mandatory':''">
         <p class="tip">{{ detail.parentName }}</p>
       </el-form-item>
       <el-form-item label="负责人">

+ 89 - 0
src/view/role/const.js

@@ -0,0 +1,89 @@
+// { id: 1, value: "全部数据" },
+// { id: 3, value: "所属组织及下级组织数据" },
+// { id: 4, value: "所属组织内部数据" },
+// { id: 5, value: "个人创建数据" },
+export const roleList = (key) =>{
+      let roleLevel =  sessionStorage.getItem('roleLevel')
+      const obj = {
+          1:1,
+          2:1,
+          3:3,
+          4:4,
+          5:4,
+      }
+      const list = {
+        1:{},//默认1
+        2:{//默认1
+            503:'no',
+            504:'no',
+            506:'no',
+            606:'no',
+            607:'no',
+            702:'no',
+            703:'no',
+            704:'no',
+            710:'no',
+            808:'no',
+            809:'no',
+            102:3,
+            103:3,
+            104:3,
+            106:3,
+            201:3,
+            202:4,
+            203:3,
+            204:3,
+        },
+        3:{//默认 3
+            201:3,
+            202:4,
+            203:3,
+            204:3,
+            503:5,
+            506:5,
+            606:4,
+            607:4,
+            702:4,
+            703:4,
+            704:4,
+        },
+        4:{//默认 4
+            101:3,
+            102:3,
+            103:3,
+            104:3,
+            106:3,
+            301:3,
+            302:3,
+            303:3,
+            304:3,
+            501:3,
+            503:5,
+            504:3,
+            506:5,
+            507:3,
+            601:3,
+            701:3,
+            706:3,
+            708:3,
+            710:'no',
+            801:3,
+            806:3,
+            807:3,
+            808:3,
+            809:'no',
+        },
+        5:{//默认 4
+            301:5,
+            302:'no',
+            303:'no',
+            304:'no',
+            503:5,
+            506:5,
+            710:'no',
+            809:'no',
+        }
+    }
+    console.log('list[roleLevel].key',list[roleLevel][key],roleLevel,key)
+    return list[roleLevel][key] || obj[roleLevel]
+}

+ 14 - 2
src/view/role/index.vue

@@ -142,6 +142,7 @@
                 <el-radio
                   style="line-height:28px"
                   v-for="item in roleSelct"
+                  v-show="roleSelctShow(item.id)"
                   :key="item.id"
                   :label="item.id"
                   size="medium"
@@ -168,6 +169,7 @@ import user from "@/state/user";
 import { getRoke } from '@/util'
 import axios from "axios";
 import { ADMIN_USER_ID } from "@/constant";
+import { roleList } from './const'
 import {
   getTreeselect,
   getRoleTree,
@@ -261,6 +263,14 @@ export default {
       data.newShow = true;
       
     };
+    const roleSelctShow = (id) => {
+      console.log('dataroleSelct',data.selectShow)
+      if(data.roleLevel<= id){
+        return true
+      }else{
+        return false
+      }
+    }
     const data = reactive({
       newShow: false,
       editName: "", //修改编辑用户名称
@@ -269,7 +279,7 @@ export default {
       deptIdList: [],
       halfCheckedKeys:[],
       radio: 1,
-      roleLevel:sessionStorage.getItem('roleLevel'),
+      roleLevel:1,
       radioData: {},
       nodekey: "",
       selectShow: false,
@@ -296,6 +306,7 @@ export default {
     return {
       ...state,
       ...toRefs(data),
+      roleSelctShow,
       flag,
       getTreedata,
       headList,
@@ -350,7 +361,8 @@ export default {
     },
     setselectShow(selectShow, id) {
       this.selectShow = selectShow;
-      this.radio = parseInt(this.radioData[id] || 1)
+      this.roleLevel = roleList(id)
+      this.radio = parseInt(this.radioData[id] || this.roleLevel)
       if(!this.radioData[id]&& this.operateType !== '查看')this.radioData[id] = 1
     },
     handcurrentChange(a, b) {

+ 23 - 2
src/view/scene/Initiator.vue

@@ -15,10 +15,11 @@
 </template>
 
 <script>
-import { fireDetailByPsw, getAttachListByPsw } from '@/request/config'
+import { fireDetailByPsw, getAttachListByPsw,offLine,onLine } from '@/request/config'
 import axios from 'axios';
 import comDialog from "@/components/dialog";
 import { types } from '@/constant'
+import { getQueryString } from '@/util'
 
 export default {
   data() {
@@ -31,6 +32,7 @@ export default {
       list: [],
       showInfo: false,
       loadSuccess: false,
+      roomId:'',
     }
   },
   watch: {
@@ -45,6 +47,7 @@ export default {
     url() {
       let ssurl = sessionStorage.getItem('initiator')
       const {sceneNum,id} = this.$route.query
+      console.log('VUE_APP_DOMAIN',process.env.VUE_APP_DOMAIN)
       if(ssurl){
         return process.env.VUE_APP_DOMAIN + '/fire-rtc-live.html' + ssurl.substr(ssurl.indexOf('?') || 0)
       }
@@ -96,12 +99,25 @@ export default {
         this.showImg = item.fileOssUrl
       }
     },
+    async setStateLine(type){
+      let apiUrl = type?onLine:offLine
+      await axios.get(apiUrl+this.roomId, {})
+    },
     async handleMessage(event){
+        let that = this
         if(event.data){
             const {liveStatus,url} = event.data
-            url&&sessionStorage.setItem('initiator',url)
+            if(url){
+              sessionStorage.setItem('initiator',url)//保存url
+              let { roomId } = getQueryString(url)
+              console.log('建立链接url参数===>',roomId)
+              that.roomId = roomId
+              roomId&&that.setStateLine(true)
+            }
             if(liveStatus == 0){//已结束
+                console.log('已结束===>',event)
                 sessionStorage.removeItem('initiator')
+                that.setStateLine(false)
             }
         }
         console.log('handleMessage===>',event)
@@ -136,4 +152,9 @@ export default {
 
 <style lang="scss" scoped>
 @import "./style.scss";
+</style>
+<style lang="scss">
+.messageMobile{
+  width: 80% !important;
+}
 </style>

+ 23 - 3
src/view/scene/visitor.vue

@@ -14,10 +14,11 @@
 </template>
 
 <script>
-// import { fireDetailByPsw, getAttachListByPsw } from '@/request/config'
-// import axios from 'axios';
+import { onLineCheck } from '@/request/config'
+import axios from 'axios';
 import comDialog from "@/components/dialog";
 import { types } from '@/constant'
+import { getQueryString } from '@/util'
 
 export default {
   data() {
@@ -25,11 +26,13 @@ export default {
       detail: {
 
       },
+      modelType:false,
       showImg: '',
       confirm: {show: false, psw: ''},
       list: [],
       showInfo: false,
       loadSuccess: false,
+      token:localStorage.getItem('token'),
     }
   },
   watch: {
@@ -110,21 +113,38 @@ export default {
                 let isOk = await this.$alert(
                     "带看已结束",
                     "确定"
-                    ,{
+                    ,{  
+                        customClass:that.modelType?'messageMobile':'',
                         showClose:false,
                         showCancelButton:false,
                         closeOnClickModal:false,
                     }
                 );
                 if(isOk){
+                  if(that.token){
                     that.$router.push({name: 'home'})
+                  }else{
+                    that.lineCheck()
+                  }
                 }
             }
         console.log('handleMessage===>',event.data)
         }
+    },
+    async lineCheck(){
+      let { roomId } = getQueryString(this.url)
+      let {data} = await axios.get(onLineCheck+roomId, {})
+      console.log('房间号不存在===>',data)
+      if(data.error){
+          window.location.href = 'noAccess.html'
+      }
     }
   },
   mounted() {
+    this.lineCheck()
+    if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
+				this.modelType = true
+			}
     this.loadData()
     window.addEventListener('message',this.handleMessage)    
     var iframe = document.createElement('iframe'); 

+ 15 - 3
src/view/user/index.vue

@@ -110,12 +110,16 @@
         <el-form-item label="所属架构" class="mandatory" v-if="user.roleKey !== 'admin-ordinary'">
           <el-cascader
             style="width: 100%"
+            :disabled="editData.tips"
             v-model="editData.deptIdList"
             @change="editChange"
             :options="treedata"
             :props="{ checkStrictly: true, label: 'name', value: 'id' }"
           ></el-cascader>
         </el-form-item>
+        <el-form-item v-if="editData.tips" class="tips" style="margin-bottom: 0;position: relative;bottom:10px" label="">
+          <p class="maker">注:该用户已绑定相机,不可修改所属架构。</p>
+        </el-form-item>
         <el-form-item label="用户角色" class="roleName mandatory">
          <com-role :deptId="relationDeptId" v-model="editData.roleId" style="width: 100%" allText="请选择" hideAll :notDefault="true" />
         </el-form-item>
@@ -190,7 +194,7 @@ import {PHONE,EPSW} from '@/constant/REG'
 import { ADMIN_USER_ID } from "@/constant";
 import { getRoke,assembleTree } from '@/util'
 
-import { getTreeselect,getUserList, updateUser, deleUser, changeUserStatus,userAdd,userEdit } from "@/request/config";
+import { getTreeselect,getUserList, updateUser, deleUser, changeUserStatus,userAdd,userEdit,checkUserCamera } from "@/request/config";
 import { getApp } from "../../app";
 
 export default {
@@ -214,18 +218,20 @@ export default {
     const headList = ref([{ name: "用户管理", value: 2 }]);
     const roleKey = ref({ 'admin': "admin-dept", 'admin-dept': 'admin-ordinary' });
     const operRoleId = ref("");
-    const updateInfo = (row) => {
+    const updateInfo = async (row) => {
       if (!row.status) {
         return getApp().$message.error("请先启用用户", "提示");
       }
+      let check =  await axios.get(checkUserCamera+row.id, {});
+      let tips = check.data !== 0
       let treeList = assembleTree(data.treedata)
       let superiorValue = treeList && treeList[row.deptId] //val.ancestors && val.ancestors.split(',').slice(1)
       data.editData = {
         editName:row.nickName,
         roleId:row.roleId,
         deptIdList:superiorValue,
+        tips,
       }
-      console.log('editData',data.editData)
       data.relationDeptId = row.deptId
       operRoleId.value = row.roleId;
       state.oper.value.readyUpdate(row);
@@ -254,6 +260,7 @@ export default {
         editName:'',
         roleId:'',
         deptIdList:'',
+        tips:false,
       },//修改编辑用户名称
       deptIdList:[],
       treedata:[],
@@ -482,4 +489,9 @@ export default {
     text-overflow: ellipsis;
     white-space: nowrap;
 }
+.maker {
+  font-weight: 400;
+  color: #969799;
+  line-height: 20px;
+}
 </style>

+ 9 - 8
src/view/vrmodel/index.vue

@@ -54,7 +54,7 @@
         <span class="oper-span" v-power="'view'" @click="shareHandle(row)">查看</span>
         <span class="oper-span" :class="{disable:!butisShow}" v-power="'edit'" @click="editModel(row)">编辑</span>
         <span class="oper-span" @click="download(row)" v-if="row.num" >下载</span>
-        <span :class="!butisShow?'disable oper-span':'oper-span'" v-power="'del'" @click="dataList.delete(row)" style="color: var(--primaryColor)"  >删除</span
+        <span :class="!((butisShow)&&~user.info.cameraSns.indexOf(row.snCode))?'disable oper-span':'oper-span'" v-power="'del'" @click="dataList.delete(row)" style="color: var(--primaryColor)"  >删除</span
         >
       </el-table-column>
     </el-table>
@@ -93,9 +93,9 @@
           <el-select v-model="cameraCompany.data" placeholder="请选择">
             <el-option
               v-for="item in cameras"
-              :key="item.snCode"
-              :label="item.snCode"
-              :value="item.snCode">
+              :key="item.cameraSn"
+              :label="item.cameraSn"
+              :value="item.cameraSn">
             </el-option>
           </el-select>
         </el-form-item>
@@ -173,7 +173,7 @@ import {
   getSceneList,
   deleteScene,
   // getCameraOptions,
-  getCameraOptions,
+  getListByUser,
   checkHasDownload,
   getDownloadProcess,
   downloadScene,
@@ -239,7 +239,7 @@ export default {
       }
       let roleLevel =  sessionStorage.getItem('roleLevel')
       this.butisShow = list[roleLevel] || false
-
+      console.log('user.info.cameraSns',this.user.info.cameraSns)
   },
   methods: {
     download(item) {
@@ -274,8 +274,9 @@ export default {
         });
     },
     async activated() {
-      let res = await axios.get(getCameraOptions)
-      this.cameras = res.data.records
+      let res = await axios.get(getListByUser)
+      console.log('cameras',res)
+      this.cameras = res.data
     },
     editModel(item) {
       window.open(process.env.VUE_APP_DOMAIN + '/epc.html?m=' + item.num + '&token=' + user.value.token)