Browse Source

'2020-07-27-1'

yjj 5 years ago
parent
commit
b77c527558

BIN
dist.zip


+ 1 - 0
package.json

@@ -8,6 +8,7 @@
     "build:module": "vue-cli-service build --target lib src/module.js"
   },
   "dependencies": {
+    "@cycjimmy/jsmpeg-player": "^5.0.1",
     "cnpm": "^6.1.1",
     "core-js": "^3.3.2",
     "echarts": "^4.8.0",

+ 1 - 1
src/sdk/config.js

@@ -1,6 +1,6 @@
 export default {
   serverAddress: 'http://115.238.57.190:8010',
-  // serverAddress: '',
+  // serverAddress: 'http://121.36.134.218:8010',
   timeout:50000,
   method:'POST',
   clientid:1,//客户端编号

+ 7 - 1
src/store/index.js

@@ -8,10 +8,13 @@ export default new Vuex.Store({
 	strict: true,
 	state: {
 		token: localStorage.getItem("token"),
-		publicConfig: []
+		publicConfig: localStorage.getItem("publicConfig")? localStorage.getItem("publicConfig"):[],
+		loginIp:localStorage.getItem("loginIp"),
 	},
 	getters: {
 		token: state => state.token,
+		publicConfig:state => state.publicConfig,
+		loginIp: state=>state.loginIp
 	},
 	mutations: {
 		setToken(state, token) {
@@ -21,6 +24,9 @@ export default new Vuex.Store({
 		savaPublicConfig(state, parmas) {
 			console.log(parmas)
 			state.publicConfig = parmas
+		},
+		setLoginIp(state,param) {
+			state.loginIp = param
 		}
 	},
 	actions: {

+ 8 - 9
src/views/Home/Home.vue

@@ -218,18 +218,17 @@ export default {
         onLogOut() {
             this.$router.push('login')
         },
-        //加载公共配置 到vuex中
+        //加载环境变量 到vuex中
         loadPublicConfig() {
             this.fetch({
-                api: "/publics/sysconf/list",
+                api: "/publics/sysconf/get",
+                data:{code:'env-variable'},
                 success: res => {
-                    console.log(res);
-                    // this.configList = res;
-                    let temp = res.map(item => {
-                        return JSON.parse(item.conf.data)
-                    })
-                    console.log(temp)
-                    this.savaPublicConfig(temp)
+                    if(res){
+                        let conf = JSON.parse(res.conf.data)
+                        this.savaPublicConfig(conf)
+                        localStorage.setItem("publicConfig", conf)
+                    }
                 }
             });
         },

+ 6 - 3
src/views/Login/Login.vue

@@ -37,7 +37,7 @@
     </div>
 </template>
 <script>
-import { mapActions } from "vuex";
+import { mapActions,mapMutations } from "vuex";
 import sdk from "../../sdk/index";
 
 export default {
@@ -66,6 +66,7 @@ export default {
     },
     methods: {
         ...mapActions(["login", "fetch"]),
+        ...mapMutations(["setLoginIp"]),
         handleSet: function() {
             if (!this.orgSelected) {
                 this.$message.info("请先选择组织");
@@ -80,9 +81,11 @@ export default {
                 success: res => {
                     console.log("登录结果", res);
                     localStorage.setItem("token", res.token)
-                    this.login(res.token);
+                    this.login(res.token)
+                    this.setLoginIp(res.loginIp)
+                    localStorage.setItem("loginIp", res.loginIp)
                     // 显示一个dialog 让用户选择组
-                    this.doOrganizationChoose();
+                    this.doOrganizationChoose()
                 },
                 fail: err => {
                     console.log("登录失败", err);

+ 74 - 0
src/views/common/jsmpeg-player/index.vue

@@ -0,0 +1,74 @@
+<template>
+    <div>
+        <div id="playerBox"></div>
+        <div class="msgbox" v-if="showInfo">{{message}}</div>
+    </div>
+</template>
+
+<script>
+    // import JSMpeg from './jsmpeg.min'
+    import JSMpeg from '@cycjimmy/jsmpeg-player'
+    export default {
+        name: "index",
+        props:["rtspData"],
+        data(){
+            return {
+                player:null,
+                playerBox:null,
+                showInfo:false,
+                message:'',
+                ws:'ws://183.129.98.135:8088/'// 后期会动态生成
+            }
+        },
+        watch: {
+            rtspData: {
+                handler(nv, ov) {
+                    console.log("新值1->", nv);
+                    if (
+                        nv != null &&
+                        nv.rtsp &&
+                        /rtsp:\/\/.+/.test(nv.rtsp)
+                    ) {
+                        this.play()
+                    }
+                },
+                deep:true
+            }
+        },
+        mounted() {
+            this.playerBox = this.$refs.playerBox
+            console.log(this.$refs.playerBox)
+        },
+        destroyed() {
+            this.stop()
+        },
+        methods:{
+            play(){
+                this.stop()
+                let url = this.ws+"?rtsp="+encodeURIComponent(this.rtspData.rtsp.trim())+'&videoSize='+this.rtspData.videoSize.trim()
+                console.log(url)
+                this.player = new JSMpeg.VideoElement('#playerBox',url)//new JSMpeg.Player(url,{canvas:document.getElementById('playerBox')})
+                this.player.play()
+            },
+            stop(){
+                if(this.player){
+                    this.player.stop()
+                    this.player.destroy()
+                }
+            },
+            showMsg(msg){
+                this.message = msg
+                this.showInfo=true
+            },
+            hideMsg(){
+                this.showInfo=false
+            }
+        }
+    }
+</script>
+
+<style scoped>
+    .msgbox{
+        z-index: 100000;
+    }
+</style>

File diff suppressed because it is too large
+ 1 - 0
src/views/common/jsmpeg-player/jsmpeg.min.js


+ 108 - 29
src/views/deviceManagement/CameraManagement.vue

@@ -7,6 +7,7 @@
             </el-col>
         </el-row>
         <hr style="border-top: 2px solid #eee;margin: 10px 0;" />
+
         <el-row>
             <el-table :data="deviceList.content">
                 <el-table-column prop="id" label="序号" width="120px"></el-table-column>
@@ -130,16 +131,25 @@
             </div>
         </el-dialog>
         <!-- 摄像头播放 -->
-        <el-dialog :title="videoData.title" @close="handleStop" :visible.sync="isShowVideo" :fullscreen="true">
-            <rtsp-player ref="rtspPlayer" :rtspData="videoData"></rtsp-player>
-        </el-dialog>
+        <div v-show="isShowVideo" ref="playerBox" class="player">
+            <div class="title">
+                <div>{{videoData.title}}</div>
+                <el-button class="btn-close" @click="handleStop" type="danger" icon="el-icon-close" circle></el-button>
+            </div>
+            <div id="videoWrapper"></div>
+            <div id="loading">
+                <i class="el-icon-loading"></i>
+            </div>
+        </div>
     </div>
 </template>
 
 <script>
-import { mapActions } from "vuex";
-import rtspPlayer from "../common/rtsp-player/index";
+import { mapActions,mapState } from "vuex";
+// import rtspPlayer from "../common/rtsp-player/index";
+// import jsmpegPlayer from "../common/jsmpeg-player"
 
+import JSMpeg from '@cycjimmy/jsmpeg-player'
 // 表单验证规则
 const rules = {
     name: [{ required: true, message: "请输入摄像头名称", trigger: "blur" }],
@@ -152,7 +162,6 @@ const pageSize = 10;
 
 export default {
     name: "CameraManagement",
-    components: { rtspPlayer },
     data() {
         return {
             id: "",
@@ -171,8 +180,10 @@ export default {
             videoData: {
                 title: null,
                 rtsp: null,
-                ws: null
+                ws: null,
+                videoSize:'1366x768'
             },
+            player:null,
             configItems: 2, // 配置项的通道配置项数
             isAdd: true,
             rules,
@@ -180,9 +191,32 @@ export default {
             page: 1
         };
     },
+    computed: mapState({
+        wanIp:function (state) {
+            for(let idx in state.publicConfig){
+                if(state.publicConfig[idx].key==='currIp')
+                    return state.publicConfig[idx].val
+            }
+            return null
+        },
+        lanIp:function (state) {
+            for(let idx in state.publicConfig){
+                if(state.publicConfig[idx].key==='lanIp')
+                    return state.publicConfig[idx].val
+            }
+            return null
+        },
+        loginIp:state=>state.loginIp
+    }),
     created() {
         // 获取摄像头 树
         this.getTreeByCode(cameraCode);
+        console.log(this.wanIp,this.lanIp,this.loginIp)
+        // 初始化摄像头播放地址
+        if(this.wanIp === this.loginIp)
+            this.videoData.ws = "ws://"+this.lanIp+":8088/"
+        else
+            this.videoData.ws = "ws://"+this.wanIp+":8088/"
     },
     methods: {
         ...mapActions(["fetch"]),
@@ -347,28 +381,42 @@ export default {
         },
         // 播放
         handlePlay(row) {
+
             console.log(row);
             if (row.meta.channel && row.meta.channel.length > 0) {
                 let channals = JSON.parse(row.meta.channel);
                 let rtsp = channals[0].rtsp;
-                let ws = channals[0].ws;
-                console.log("rtsp==>>  " + rtsp);
-                console.log("ws==>>  " + ws);
-                if (row.data && row.data["curr-ip"]) {
-                    //要更换IP
-                    ws = ws.replace("ip-addr", row.data["curr-ip"]);
+                let size = channals[0].size;//临时
+                // console.log(rtsp)
+                this.videoData.title=row.name//标题
+                let url = this.videoData.ws+"?rtsp="+encodeURIComponent(rtsp.trim())+'&videoSize='+size.trim()
+                console.log(url)
+                if(this.$refs.playerBox){
+                    if(this.player){
+                        this.player.stop()
+                        this.player.destroy()
+                    }
+                    // 创建一个 canvas
+                    let videoBox =document.getElementById('videoWrapper')
+                    let p = document.createElement("canvas")
+                    p.style.width='100%'
+                    videoBox.appendChild(p)
+                    this.player = new JSMpeg.Player(url,{canvas:p,onSourceEstablished:()=>{
+                        //去掉loading
+                            document.getElementById('loading').style.display='none'
+                        }})
+                    this.player.play()
+                    this.isShowVideo = true;
                 }
-                this.videoData = {
-                    rtsp,
-                    ws,
-                    title: row.name
-                };
-                this.isShowVideo = true;
             } else this.$message.info("配置信息不正确");
         },
         handleStop(done) {
-            console.log(this.$refs.rtspPlayer);
-            // if (this.$refs.rtspPlayer) this.$refs.rtspPlayer.close();
+            if(this.player){
+                this.player.stop()
+                this.player.destroy()
+                this.player = null
+            }
+            this.isShowVideo = false
         },
         // 编辑
         edit(row) {
@@ -413,15 +461,46 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.CameraManagement {
-    .dialog {
-        .item_row {
-            display: flex;
+    .CameraManagement {
+        .dialog {
+            .item_row {
+                display: flex;
+            }
         }
     }
-}
 
-.pagination {
-    margin-top: 20px;
-}
+    .pagination {
+        margin-top: 20px;
+    }
+    .player{
+        z-index: 10000;
+        position: fixed;
+        background-color: #ffffff;
+        top: 80px;
+        left:0;
+        right: 0;
+        margin:auto;
+        display: flex;
+        /*border: 1px solid  #028c58;*/
+        border-radius: 5px;
+        flex-direction: column;
+        width: 1024px;
+        min-height: 480px;
+        .title{
+            display: flex;
+            justify-content: space-between;
+            .btn-close{
+                width: 32px;
+                height: 32px;
+                padding: 0;
+            }
+        }
+        #loading{
+            display: flex;
+            flex-direction: column;
+            left:0;
+            right: 0;
+            margin:auto;
+        }
+    }
 </style>

+ 32 - 34
yarn.lock

@@ -1475,6 +1475,24 @@
     lodash "^4.17.19"
     to-fast-properties "^2.0.0"
 
+"@cycjimmy/awesome-js-funcs@^2.3.0":
+  version "2.3.0"
+  resolved "https://registry.npm.taobao.org/@cycjimmy/awesome-js-funcs/download/@cycjimmy/awesome-js-funcs-2.3.0.tgz#a6a746461c41affd7932630ec94d02c9823fb7f7"
+  integrity sha1-pqdGRhxBr/15MmMOyU0CyYI/t/c=
+
+"@cycjimmy/jsmpeg-player@^5.0.1":
+  version "5.0.1"
+  resolved "https://registry.npm.taobao.org/@cycjimmy/jsmpeg-player/download/@cycjimmy/jsmpeg-player-5.0.1.tgz#f29ca77641af518498df1fca91bfacb1101032d8"
+  integrity sha1-8pyndkGvUYSY3x/Kkb+ssRAQMtg=
+  dependencies:
+    "@cycjimmy/awesome-js-funcs" "^2.3.0"
+    "@cycjimmy/sass-lib" "^1.0.3"
+
+"@cycjimmy/sass-lib@^1.0.3":
+  version "1.0.3"
+  resolved "https://registry.npm.taobao.org/@cycjimmy/sass-lib/download/@cycjimmy/sass-lib-1.0.3.tgz#df5fbd7edc3dcbb6531bf186713e2e052391c3dc"
+  integrity sha1-31+9ftw9y7ZTG/GGcT4uBSORw9w=
+
 "@hapi/address@2.x.x":
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.2.tgz#1c794cd6dbf2354d1eb1ef10e0303f573e1c7222"
@@ -3930,7 +3948,7 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
   dependencies:
     ms "^2.1.1"
 
-debuglog@*, debuglog@^1.0.1:
+debuglog@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npm.taobao.org/debuglog/download/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
   integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
@@ -4266,6 +4284,13 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
 
+echarts@^4.8.0:
+  version "4.8.0"
+  resolved "https://registry.npm.taobao.org/echarts/download/echarts-4.8.0.tgz#b2c1cfb9229b13d368ee104fc8eea600b574d4c4"
+  integrity sha1-ssHPuSKbE9No7hBPyO6mALV01MQ=
+  dependencies:
+    zrender "4.3.1"
+
 editor@~1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/editor/download/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
@@ -5863,7 +5888,7 @@ import-local@^2.0.0:
     pkg-dir "^3.0.0"
     resolve-cwd "^2.0.0"
 
-imurmurhash@*, imurmurhash@^0.1.4:
+imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
@@ -6859,11 +6884,6 @@ lockfile@^1.0.4:
   dependencies:
     signal-exit "^3.0.2"
 
-lodash._baseindexof@*:
-  version "3.1.0"
-  resolved "https://registry.npm.taobao.org/lodash._baseindexof/download/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
-  integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=
-
 lodash._baseuniq@~4.6.0:
   version "4.6.0"
   resolved "https://registry.npm.taobao.org/lodash._baseuniq/download/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
@@ -6872,33 +6892,11 @@ lodash._baseuniq@~4.6.0:
     lodash._createset "~4.0.0"
     lodash._root "~3.0.0"
 
-lodash._bindcallback@*:
-  version "3.0.1"
-  resolved "https://registry.npm.taobao.org/lodash._bindcallback/download/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
-  integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
-
-lodash._cacheindexof@*:
-  version "3.0.2"
-  resolved "https://registry.npm.taobao.org/lodash._cacheindexof/download/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
-  integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=
-
-lodash._createcache@*:
-  version "3.1.2"
-  resolved "https://registry.npm.taobao.org/lodash._createcache/download/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
-  integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=
-  dependencies:
-    lodash._getnative "^3.0.0"
-
 lodash._createset@~4.0.0:
   version "4.0.3"
   resolved "https://registry.npm.taobao.org/lodash._createset/download/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
   integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
 
-lodash._getnative@*, lodash._getnative@^3.0.0:
-  version "3.9.1"
-  resolved "https://registry.npm.taobao.org/lodash._getnative/download/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
-  integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
-
 lodash._root@~3.0.0:
   version "3.0.1"
   resolved "https://registry.npm.taobao.org/lodash._root/download/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
@@ -6929,11 +6927,6 @@ lodash.memoize@^4.1.2:
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
   integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
 
-lodash.restparam@*:
-  version "3.6.1"
-  resolved "https://registry.npm.taobao.org/lodash.restparam/download/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
-  integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
-
 lodash.transform@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
@@ -11933,3 +11926,8 @@ yorkie@^2.0.0:
     is-ci "^1.0.10"
     normalize-path "^1.0.0"
     strip-indent "^2.0.0"
+
+zrender@4.3.1:
+  version "4.3.1"
+  resolved "https://registry.npm.taobao.org/zrender/download/zrender-4.3.1.tgz#baf8aa6dc8187a2f819692d7d5f9bedfa2b90fa3"
+  integrity sha1-uviqbcgYei+BlpLX1fm+36K5D6M=