15902849627 5 bulan lalu
induk
melakukan
41a2093521

+ 1 - 1
index.html

@@ -12,7 +12,7 @@
     }
   </script>
   <script type="text/javascript"
-    src="https://webapi.amap.com/maps?v=2.0&key=1bb842e2ef7bc5cc8d4d5aaa5de6b5c6&&plugin=AMap.Scale"></script>
+    src="http://webapi.amap.com/maps?v=2.0&key=1bb842e2ef7bc5cc8d4d5aaa5de6b5c6&&plugin=AMap.Scale"></script>
 </head>
 
 <body>

+ 2 - 0
package.json

@@ -10,8 +10,10 @@
     "format": "prettier --write src/"
   },
   "dependencies": {
+    "@vitejs/plugin-legacy": "^7.1.0",
     "axios": "^1.10.0",
     "echarts": "^5.6.0",
+    "jquery": "^3.7.1",
     "moment": "^2.30.1",
     "vue": "^3.5.17",
     "vue-router": "^4.5.1",

+ 301 - 0
public/static/Player/index.html

@@ -0,0 +1,301 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8" />
+        <title>preview_demo</title>
+    </head>
+    <style>
+        html,
+        body {
+            padding: 0;
+            margin: 0;
+        }
+        .playWnd {
+            width: 1000px; /*播放容器的宽和高设定*/
+            height: 600px;
+        }
+    </style>
+
+    <body>
+        <!--视频窗口展示-->
+        <div id="playWnd" class="playWnd"></div>
+    </body>
+
+    <!--三个必要的js文件引入-->
+    <script src="jquery-1.12.4.min.js"></script>
+    <script src="jsencrypt.min.js"></script>
+    <!-- 用于RSA加密 -->
+    <script src="web-control_1.2.5.min.js"></script>
+    <!-- 用于前端与插件交互 -->
+
+    <script type="text/javascript">
+        var setting, videoList, windowWidth, windowHeight, windowTop, windowLeft;
+        //页面加载时创建播放实例初始化
+        // $(window).load(function () {
+        //     console.log(window.innerWidth);
+        //     console.log(window.innerHeight);
+        // });
+        window.addEventListener('message', function (e) {
+            if (e && e.data) {
+                console.log('接收视频播放信息', e.data);
+                if (e.data.action == 'videoInfo') {
+                    windowWidth = e.data.params.width;
+                    windowHeight = e.data.params.height;
+                    windowTop = e.data.params.top;
+                    windowLeft = e.data.params.left;
+                    videoList = e.data.params.videoList;
+                    initPlugin();
+                }
+            }
+        });
+        //声明公用变量
+        var initCount = 0;
+        var pubKey = '';
+        function geturlparam(field) {
+            let url = window.location.href;
+            let p = url.split('?')[1];
+            let params = new URLSearchParams(p);
+
+            if (params.get(field)) {
+                return params.get(field);
+            }
+        }
+        // 创建播放实例
+        function initPlugin() {
+            oWebControl = new WebControl({
+                szPluginContainer: 'playWnd', // 指定容器id
+                iServicePortStart: 15900, // 指定起止端口号,建议使用该值
+                iServicePortEnd: 15900,
+                szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
+                cbConnectSuccess: function () {
+                    // 创建WebControl实例成功
+                    oWebControl
+                        .JS_StartService('window', {
+                            // WebControl实例创建成功后需要启动服务
+                            dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
+                        })
+                        .then(
+                            function () {
+                                // 启动插件服务成功
+                                oWebControl.JS_SetWindowControlCallback({
+                                    // 设置消息回调
+                                    cbIntegrationCallBack: cbIntegrationCallBack
+                                });
+
+                                oWebControl.JS_CreateWnd('playWnd', windowWidth, windowHeight).then(function () {
+                                    //JS_CreateWnd创建视频播放窗口,宽高可设定
+                                    init(); // 创建播放实例成功后初始化
+                                });
+                            },
+                            function () {
+                                // 启动插件服务失败
+                            }
+                        );
+                },
+                cbConnectError: function () {
+                    // 创建WebControl实例失败
+                    oWebControl = null;
+                    $('#playWnd').html('插件未启动,正在尝试启动,请稍候...');
+                    WebControl.JS_WakeUp('VideoWebPlugin://'); // 程序未启动时执行error函数,采用wakeup来启动程序
+                    initCount++;
+                    if (initCount < 3) {
+                        setTimeout(function () {
+                            initPlugin();
+                        }, 3000);
+                    } else {
+                        alert('插件启动失败,请下载并安装插件后刷新页面重试');
+                        window.open('https://ore-1302260927.cos.ap-chengdu.myqcloud.com/saas/video/VideoWebPlugin.exe', '_blank');
+                        // $("#playWnd").html("插件启动失败,请检查插件是否安装!");
+                    }
+                },
+                cbConnectClose: function (bNormalClose) {
+                    // 异常断开:bNormalClose = false
+                    // JS_Disconnect正常断开:bNormalClose = true
+                    console.log('cbConnectClose');
+                    oWebControl = null;
+                    $('#playWnd').html('插件未启动,正在尝试启动,请稍候...');
+                    WebControl.JS_WakeUp('VideoWebPlugin://');
+                    initCount++;
+                    if (initCount < 3) {
+                        setTimeout(function () {
+                            initPlugin();
+                        }, 3000);
+                    } else {
+                        alert('插件启动失败,请下载并安装插件后刷新页面重试');
+                        window.open('https://ore-1302260927.cos.ap-chengdu.myqcloud.com/saas/video/VideoWebPlugin.exe', '_blank');
+                        // $("#playWnd").html("插件启动失败,请检查插件是否安装!");
+                    }
+                }
+            });
+        }
+
+        // 设置窗口控制回调
+        function setCallbacks() {
+            oWebControl.JS_SetWindowControlCallback({
+                cbIntegrationCallBack: cbIntegrationCallBack
+            });
+        }
+
+        // 推送消息
+        function cbIntegrationCallBack(oData) {
+            // showCBInfo(JSON.stringify(oData.responseMsg));
+        }
+
+        //初始化
+        function init() {
+            getPubKey(function () {
+                console.log(setting);
+                ////////////////////////////////// 请自行修改以下变量值	////////////////////////////////////
+                var appkey = '21356754'; //综合安防管理平台提供的appkey,必填
+                var secret = setEncrypt('ILaiJuzsMXa4PEbPqWPf'); //综合安防管理平台提供的secret,必填
+                var ip = '182.147.98.35'; //综合安防管理平台IP地址,必填
+                var playMode = 0; //初始播放模式:0-预览,1-回放
+                var port = 1443; //综合安防管理平台端口,若启用HTTPS协议,默认443
+                var snapDir = 'D:\\SnapDir'; //抓图存储路径
+                var videoDir = 'D:\\VideoDir'; //紧急录像或录像剪辑存储路径
+                var layout = '2x2'; //playMode指定模式的布局
+                if (videoList.length > 9) layout = '4x4';
+                else if (videoList.length > 4) layout = '3x3';
+                else if (videoList.length < 2) layout = '1x1';
+                var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
+                var encryptedFields = 'secret'; //加密字段,默认加密领域为secret
+                var showToolbar = 1; //是否显示工具栏,0-不显示,非0-显示
+                var showSmart = 1; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
+                var buttonIDs = '0,16,256,257,258,259,260,512,513,514,515,516,517,768,769'; //自定义工具条按钮
+                ////////////////////////////////// 请自行修改以上变量值	////////////////////////////////////
+
+                oWebControl
+                    .JS_RequestInterface({
+                        funcName: 'init',
+                        argument: JSON.stringify({
+                            appkey: appkey, //API网关提供的appkey
+                            secret: secret, //API网关提供的secret
+                            ip: ip, //API网关IP地址
+                            playMode: playMode, //播放模式(决定显示预览还是回放界面)
+                            port: port, //端口
+                            snapDir: snapDir, //抓图存储路径
+                            videoDir: videoDir, //紧急录像或录像剪辑存储路径
+                            layout: layout, //布局
+                            enableHTTPS: enableHTTPS, //是否启用HTTPS协议
+                            encryptedFields: encryptedFields, //加密字段
+                            showToolbar: showToolbar, //是否显示工具栏
+                            showSmart: showSmart, //是否显示智能信息
+                            buttonIDs: buttonIDs //自定义工具条按钮
+                        })
+                    })
+                    .then(function (oData) {
+                        oWebControl.oDocOffset.top = windowTop;
+                        oWebControl.oDocOffset.left = windowLeft;
+                        oWebControl.JS_Resize(windowWidth, windowHeight); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
+                        setTimeout(() => {
+                            videoList.map((item, i) => {
+                                startPlay(item, i);
+                            });
+                        }, 500);
+                    });
+            });
+        }
+
+        //获取公钥
+        function getPubKey(callback) {
+            oWebControl
+                .JS_RequestInterface({
+                    funcName: 'getRSAPubKey',
+                    argument: JSON.stringify({
+                        keyLength: 1024
+                    })
+                })
+                .then(function (oData) {
+                    if (oData.responseMsg.data) {
+                        pubKey = oData.responseMsg.data;
+                        callback();
+                    }
+                });
+        }
+
+        //RSA加密
+        function setEncrypt(value) {
+            var encrypt = new JSEncrypt();
+            encrypt.setPublicKey(pubKey);
+            return encrypt.encrypt(value);
+        }
+
+        // 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
+        $(window).resize(function () {
+            if (oWebControl != null) {
+                // oWebControl.JS_Resize(windowWidth, windowHeight);
+                // setWndCover();
+            }
+        });
+
+        // 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动
+        $(window).scroll(function () {
+            if (oWebControl != null) {
+                // oWebControl.JS_Resize(windowWidth, windowHeight);
+                // setWndCover();
+            }
+        });
+
+        // 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
+        function setWndCover() {
+            var iWidth = $(window).width();
+            var iHeight = $(window).height();
+            var oDivRect = $('#playWnd').get(0).getBoundingClientRect();
+
+            var iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0;
+            var iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0;
+            var iCoverRight = oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0;
+            var iCoverBottom = oDivRect.bottom - iHeight > 0 ? Math.round(oDivRect.bottom - iHeight) : 0;
+
+            iCoverLeft = iCoverLeft > windowWidth ? windowWidth : iCoverLeft;
+            iCoverTop = iCoverTop > windowHeight ? windowHeight : iCoverTop;
+            iCoverRight = iCoverRight > windowWidth ? windowWidth : iCoverRight;
+            iCoverBottom = iCoverBottom > windowHeight ? windowHeight : iCoverBottom;
+
+            oWebControl.JS_RepairPartWindow(0, 0, 1001, windowHeight); // 多1个像素点防止还原后边界缺失一个像素条
+            if (iCoverLeft != 0) {
+                oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, windowHeight);
+            }
+            if (iCoverTop != 0) {
+                oWebControl.JS_CuttingPartWindow(0, 0, 1001, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
+            }
+            if (iCoverRight != 0) {
+                oWebControl.JS_CuttingPartWindow(windowWidth - iCoverRight, 0, iCoverRight, windowHeight);
+            }
+            if (iCoverBottom != 0) {
+                oWebControl.JS_CuttingPartWindow(0, windowHeight - iCoverBottom, windowWidth, iCoverBottom);
+            }
+        }
+        function startPlay(item, i) {
+            var streamMode = 0; //主子码流标识:0-主码流,1-子码流
+            var transMode = 1; //传输协议:0-UDP,1-TCP
+            var gpuMode = 0; //是否启用GPU硬解,0-不启用,1-启用
+
+            oWebControl.JS_RequestInterface({
+                funcName: 'startPreview',
+                argument: JSON.stringify({
+                    cameraIndexCode: item.index_code, //监控点编号
+                    streamMode: streamMode, //主子码流标识
+                    transMode: transMode, //传输协议
+                    gpuMode: gpuMode, //是否开启GPU硬解
+                    wndId: i + 1 //可指定播放窗口
+                })
+            });
+        }
+
+        // 标签关闭
+        $(window).unload(function () {
+            if (oWebControl != null) {
+                oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
+                oWebControl.JS_Disconnect().then(
+                    function () {
+                        // 断开与插件服务连接成功
+                    },
+                    function () {
+                        // 断开与插件服务连接失败
+                    }
+                );
+            }
+        });
+    </script>
+</html>

File diff ditekan karena terlalu besar
+ 1 - 0
public/static/Player/jquery-1.12.4.min.js


File diff ditekan karena terlalu besar
+ 0 - 0
public/static/Player/jsencrypt.min.js


File diff ditekan karena terlalu besar
+ 0 - 0
public/static/Player/web-control_1.2.5.min.js


+ 2 - 1
src/components/page/counts.vue

@@ -115,7 +115,8 @@ export default {
             this.start();
         }
         if(this.length){
-          this.zero=this.length-String(this.endVal).length>0?this.length-String(this.endVal).length:0
+        this.zero=this.length-String(this.endVal).length>0?this.length-String(this.endVal).length:0
+        console.log(this.zero,this.endVal);
         }
         this.$emit('mountedCallback');
     },

+ 118 - 11
src/components/page/sindex.vue

@@ -74,7 +74,7 @@
                                             item.serveCarCount }}
                                         </div>
                                         <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration
-                                            }}</div>
+                                        }}</div>
                                     </div>
                                 </div>
                                 <div v-for="(item, i) in customerList" :key="'copy-' + i" class="table-row flex"
@@ -92,7 +92,7 @@
                                             item.serveCarCount }}
                                         </div>
                                         <div class="table-cell" style="width: 20%;text-align: center;">{{ item.duration
-                                            }}</div>
+                                        }}</div>
                                     </div>
                                 </div>
                             </div>
@@ -114,7 +114,8 @@
                                 <img class="statistic-icon" src="../../assets/imgs/dot.png" alt="">
                                 <div class="statistic-label fontMF">累计运载/吨</div>
                             </div>
-                            <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalWeight' separator="" />
+                            <counts bg :startVal="0" :length="6" :endVal='totalStatistics.totalWeight.toFixed(0)'
+                                separator="" />
                         </div>
                         <div class="statistic-item">
                             <div class="statistic-header">
@@ -155,7 +156,7 @@
                                     <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}
                                     </div>
                                     <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight
-                                        }}{{
+                                    }}{{
                                             item.unit }}</div>
                                     <div class="table-cell" style="width: 18%;text-align: center;">{{
                                         item.deliveredWeight }}{{
@@ -176,7 +177,7 @@
                                     <div class="table-cell" style="width: 28%;text-align: center;">{{ item.orderId }}
                                     </div>
                                     <div class="table-cell" style="width: 18%;text-align: center;">{{ item.totalWeight
-                                        }}{{
+                                    }}{{
                                             item.unit }}</div>
                                     <div class="table-cell" style="width: 18%;text-align: center;">{{
                                         item.deliveredWeight }}{{
@@ -200,11 +201,23 @@
 
             </div>
         </div>
+        <div id="right_modal">
+            <div class="mask"></div>
+            <div class="model_content">
+                <div class="model_title fontMF">监控信息</div>
+
+                <div class="list" v-if="videoList && videoList.length">
+                    <iframe id="videoIframe" :src="'/static/Player/index.html'" width="100%"
+                        style="height: 100%; box-shadow: rgb(29 24 32) 0px 0px 200px 30px" frameborder="0"
+                        scrolling="no" v-if="videoList && videoList.length"></iframe>
+                </div>
+            </div>
+        </div>
     </div>
 </template>
 
 <script setup>
-import { ref, reactive, computed, onMounted, onBeforeUnmount, defineComponent } from 'vue';
+import { ref, reactive, computed, onMounted, onBeforeUnmount, defineComponent, nextTick } from 'vue';
 import moment from 'moment';
 import Charts from '@/components/selfCP/charts.vue';
 import Chartsbar from '@/components/selfCP/chartsbar.vue';
@@ -214,7 +227,7 @@ import { POST, GET } from '@/server/api/common';
 import * as echarts from "echarts";
 import { useRoute } from 'vue-router';
 import { getCurrentInstance } from 'vue';
-
+import $ from 'jquery';
 const { appContext } = getCurrentInstance();
 const $config = appContext.config.globalProperties.$config;
 
@@ -358,7 +371,7 @@ function initAMap() {
             center: [108.155577, 35.167516], // 默认中心点
             expandZoomRange: true,
             zooms: [3, 20],
-            zoom:4.7,
+            zoom: 4.7,
             mapStyle: "amap://styles/blue",// 主题
             resizeEnable: true,
             showLabel: true,// 不显示文字标记
@@ -441,7 +454,7 @@ function _renderMarker(context) {
     let zoom = mapInstance.value.getZoom();
     let item = context.data[0]
     let iconUrl, iconSize
-    if (zoom > 12) {
+    if (zoom > 9) {
         // 根据类型设置图标
         if (item.type === 'truck') {
             iconUrl = 'https://cdn.sckaiwu.cn/kll/app/static/img/screen/marker3.png'
@@ -461,6 +474,7 @@ function _renderMarker(context) {
         let mapContent = `<div style="width:115px;height:67px;background:url(${iconUrl}) no-repeat center center" ><span style="color:#fff;font-size:11px;display:block;width:84px;text-align:center;line-height:30px; position:absolute;top:0px;right:0px;">${item.name.length > 7 ? item.name.substring(0, 8) + '...' : item.name}</span></div>`
         context.marker.setOffset(new AMap.Pixel(-iconSize[0] / 2, -iconSize[1] / 2));
         context.marker.setContent(mapContent)
+        context.marker.on('click', handleClickMarker)
     } else {
         var size = Math.round(30 + Math.pow(context.count / markers.length, 1 / 5) * 20);
         let mapcontent = `
@@ -486,7 +500,49 @@ function _renderClusterMarker(context) {
     context.marker.setOffset(new AMap.Pixel(-size / 2, -size / 2));
     context.marker.setContent(mapcontent)
 };
+const videoList = ref(null)
+function handleClickMarker(e) {
+    console.log(e);
+    $('#right_modal .model_content').animate({ right: '2%' }, 500, function () {
+        $('#right_modal .mask').show();
+        videoList.value = [{
+            index_code: "bf89769610224754b3df03294a353457",
+            sync_name: "地磅服务窗口1-A"
+        }];
+        nextTick(() => {
+            var videoIframe = document.getElementById('videoIframe');
+            let proportion = window.innerWidth / 1920
+            videoIframe.onload = function () {
+                videoIframe.contentWindow.postMessage(
+                    {
+                        action: 'videoInfo',
+                        msg: '更新Pos',
+                        params: {
+                            left: $('#right_modal .list').offset().left + 30 * proportion,
+                            top: $('#right_modal .list').offset().top,
+                            videoList: [{
+                                index_code: "bf89769610224754b3df03294a353457",
+                                sync_name: "地磅服务窗口1-A"
+                            }],
+                            width: $('#videoIframe').width() * proportion,
+                            height: $('#right_modal .model_content').height() * proportion - 134 * proportion
+                        }
+                    },
+                    '\*'
+                ); // '\*'表示跨域参数,请结合自身业务合理设置
+            };
+        });
+    });
 
+    $('#right_modal .mask').on('click', function () {
+        console.log('关闭视频播放器');
+        videoList.value = [];
+        $('#right_modal .model_content').animate({ right: '-930px' }, 500, function () {
+            $('#right_modal .mask').hide();
+        });
+    });
+
+}
 function getCarStatistics() {
     GET($config.carStatistics.url).then((res) => {
         console.log(res);
@@ -540,8 +596,6 @@ function getCarStatistics() {
             },
             yAxis: {
                 type: 'value',
-                max: 800,
-                interval: 100,
                 axisLine: {
                     show: false
                 },
@@ -1394,4 +1448,57 @@ onBeforeUnmount(() => {
         flex: 1;
     }
 }
+
+#right_modal {
+    .mask {
+        position: fixed;
+        width: 100%;
+        height: 100%;
+        left: 0;
+        top: 0;
+        z-index: 19;
+        display: none;
+        background: rgba(0, 0, 0, 0.5);
+    }
+
+    .model_content {
+        position: fixed;
+        width: 930px;
+        height: 1030px;
+        right: -930px;
+        bottom: 10px;
+        background-image: url(https://ore-1302260927.cos.ap-chengdu.myqcloud.com/data_screen/image/23.png);
+        background-repeat: no-repeat;
+        background-size: 100% 100%;
+        overflow: hidden;
+        z-index: 20;
+
+        .model_title {
+            font-size: 18px;
+            font-weight: 400;
+            color: #ffffff;
+            text-align: center;
+            line-height: 32px;
+        }
+
+        .list {
+            display: flex;
+            align-items: center;
+            flex-wrap: wrap;
+            justify-content: space-between;
+            padding: 0 60px;
+
+            .list_item {
+                width: 48%;
+                margin-bottom: 20px;
+
+                .title {
+                    font-size: 14px;
+                    font-weight: bold;
+                    color: #ffffff;
+                }
+            }
+        }
+    }
+}
 </style>

+ 1 - 1
src/router/index.js

@@ -1,7 +1,7 @@
 import { createRouter, createWebHistory } from 'vue-router'
 
 const router = createRouter({
-  history: createWebHistory(import.meta.env.BASE_URL),
+  history: createWebHistory(),
   routes: [
     {
       path: '/',

+ 5 - 1
vite.config.js

@@ -3,9 +3,13 @@ import { fileURLToPath, URL } from 'node:url'
 import { defineConfig } from 'vite'
 import vue from '@vitejs/plugin-vue'
 import vueDevTools from 'vite-plugin-vue-devtools'
-
 // https://vite.dev/config/
 export default defineConfig({
+  base: './', // 公共基础路径 打包路径
+  build: {
+    outDir: 'dist', // 输出目录
+    assetsDir: 'static', // 静态资源目录
+  },
   plugins: [
     vue({
       template: {

File diff ditekan karena terlalu besar
+ 862 - 14
yarn.lock


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini