From d20fcd6ad28a534d763273c48381cdc36ff2891f Mon Sep 17 00:00:00 2001
From: web <candymxq888@outlook.com>
Date: 星期六, 19 四月 2025 17:25:44 +0800
Subject: [PATCH] fix:对接监控视频

---
 src/screen/flow.vue                            |    2 
 src/views/login.vue                            |    2 
 package-lock.json                              |  281 +++++++++++++++++++++++----
 src/views/screen/flow/home/index.vue           |    9 
 package.json                                   |    2 
 src/views/screen/temperature/monitor/index.vue |   18 +
 src/views/screen/flow/graphic/index.vue        |  256 +++++++++++++++++--------
 src/api/screen/graphic/index.js                |   11 +
 src/router/index.js                            |    4 
 9 files changed, 453 insertions(+), 132 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 4ccd443..afe1a1c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,9 +15,9 @@
         "axios": "0.27.2",
         "echarts": "^5.5.1",
         "element-plus": "^2.5.0",
+        "ezuikit-js": "^8.1.9-beta.3",
         "file-saver": "2.0.5",
         "fuse.js": "6.6.2",
-        "html2canvas": "^1.4.1",
         "js-cookie": "3.0.5",
         "jsencrypt": "3.3.2",
         "moment": "^2.30.1",
@@ -445,6 +445,67 @@
         "node": ">=12"
       }
     },
+    "node_modules/@ezuikit/player-ezopen": {
+      "version": "8.1.9-beta.3",
+      "resolved": "https://registry.npmjs.org/@ezuikit/player-ezopen/-/player-ezopen-8.1.9-beta.3.tgz",
+      "integrity": "sha512-4YEA/Otp/lW8iiCOhgajhpkrbdFePUN3oMnSumrvYvDfiIMAKJLAiAmCCiXieoJ8hIzrCeXKjYUPgY5/HALHdg==",
+      "dependencies": {
+        "@ezuikit/player-plugin-record": "8.1.8-beta.3",
+        "@ezuikit/utils-i18n": "^1.0.1",
+        "@ezuikit/utils-logger": "^1.0.1",
+        "@ezuikit/utils-service": "1.0.1",
+        "@ezuikit/utils-tools": "^1.0.4",
+        "@juggle/resize-observer": "^3.4.0",
+        "dayjs": "^1.11.10",
+        "deepmerge": "^4.3.1",
+        "eventemitter3": "^5.0.1",
+        "jquery": "^3.7.1",
+        "screenfull": "^5.2.0",
+        "ua-parser-js": "1.0.37"
+      }
+    },
+    "node_modules/@ezuikit/player-ezopen/node_modules/eventemitter3": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+    },
+    "node_modules/@ezuikit/player-plugin-record": {
+      "version": "8.1.8-beta.3",
+      "resolved": "https://registry.npmjs.org/@ezuikit/player-plugin-record/-/player-plugin-record-8.1.8-beta.3.tgz",
+      "integrity": "sha512-YcQ5MR8zyg8b+o/ktr6r+YCXkiEX43HVmzVkfJsERgaokaHzoNIpOomEl51j/13gcemjSXuN6i1apCRC2v32pg=="
+    },
+    "node_modules/@ezuikit/utils-collect": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@ezuikit/utils-collect/-/utils-collect-0.1.1.tgz",
+      "integrity": "sha512-BgEOnTtAq8rQRBAKv5rLXbQLGOnfOZ6NS0QTmiviey80JbMJlxrLiqmjL5lxvkm4JtCcXCtSgPA4tskQKN4eDA=="
+    },
+    "node_modules/@ezuikit/utils-i18n": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@ezuikit/utils-i18n/-/utils-i18n-1.0.1.tgz",
+      "integrity": "sha512-uUjN3ADHV2ZG4QznuA7FB89/ck8AGV4qS8hm/sqeSA6/ie4ryYw8MS4wIv71WgPBIgIVDfASuEapyLOwq7R2aQ==",
+      "dependencies": {
+        "i18n-js": "^4.3.2"
+      }
+    },
+    "node_modules/@ezuikit/utils-logger": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@ezuikit/utils-logger/-/utils-logger-1.0.1.tgz",
+      "integrity": "sha512-qak0MXh4vWZCji3aSCfHdWR3EbZCaqS0iMT8/QWuWPRr0vDmTRMP3kFOAw1MuMraR0ocjPBE2PaTEmUuwVqaAw=="
+    },
+    "node_modules/@ezuikit/utils-service": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@ezuikit/utils-service/-/utils-service-1.0.1.tgz",
+      "integrity": "sha512-iNjYuU7AScBJxvKBM9PjiGI2y64QJNPT/H1Fy/Y7ZIAlw4DO//TP+x50qCho+i+EOUpWLtOqBQvtRb7a0O4X4Q==",
+      "dependencies": {
+        "@ezuikit/utils-tools": "^1.0.1",
+        "dayjs": "^1.11.10"
+      }
+    },
+    "node_modules/@ezuikit/utils-tools": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@ezuikit/utils-tools/-/utils-tools-1.0.4.tgz",
+      "integrity": "sha512-w+LZ03qowSqrSqDnuONKPpmEn0cuCaF2pkgHL1YicR0of/ZelCho5X8cy5TXQe7UsrQkIM2M7vVennv5KnAdpQ=="
+    },
     "node_modules/@floating-ui/core": {
       "version": "1.6.4",
       "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.4.tgz",
@@ -471,6 +532,11 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
       "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+    },
+    "node_modules/@juggle/resize-observer": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
+      "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
@@ -1013,6 +1079,11 @@
         }
       }
     },
+    "node_modules/abortcontroller-polyfill": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz",
+      "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ=="
+    },
     "node_modules/acorn": {
       "version": "8.12.1",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
@@ -1224,19 +1295,19 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/base64-arraybuffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
-      "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
     "node_modules/big.js": {
       "version": "5.2.2",
       "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
       "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
       "dev": true,
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/bignumber.js": {
+      "version": "9.2.1",
+      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz",
+      "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==",
       "engines": {
         "node": "*"
       }
@@ -1518,14 +1589,6 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/css-line-break": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz",
-      "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
-      "dependencies": {
-        "utrie": "^1.0.2"
-      }
-    },
     "node_modules/css-select": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
@@ -1704,6 +1767,11 @@
       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz",
       "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg=="
     },
+    "node_modules/debounce-promise": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
+      "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
+    },
     "node_modules/debug": {
       "version": "4.3.5",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
@@ -1747,6 +1815,14 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/define-data-property": {
@@ -1800,6 +1876,11 @@
       "engines": {
         "node": ">=0.4.0"
       }
+    },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
     },
     "node_modules/dom-serializer": {
       "version": "0.2.2",
@@ -2284,6 +2365,28 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/ezuikit-js": {
+      "version": "8.1.9-beta.3",
+      "resolved": "https://registry.npmjs.org/ezuikit-js/-/ezuikit-js-8.1.9-beta.3.tgz",
+      "integrity": "sha512-BtpkKOafxRmZroVcol5yOpASVHi1ddUy7DGzFb/TLkoh3VER7xEOzJepiK0O7dOsXAMmxXwooMLO+DIfMXFXnw==",
+      "dependencies": {
+        "@ezuikit/player-ezopen": "8.1.9-beta.3",
+        "@ezuikit/utils-collect": "0.1.1",
+        "@ezuikit/utils-i18n": "^1.0.1",
+        "@ezuikit/utils-logger": "^1.0.1",
+        "@ezuikit/utils-tools": "^1.0.4",
+        "@juggle/resize-observer": "^3.4.0",
+        "abortcontroller-polyfill": "^1.7.5",
+        "debounce-promise": "^3.1.2",
+        "deepmerge": "^4.3.1",
+        "delegate": "3.2.0",
+        "formdata-polyfill": "^4.0.10",
+        "jquery": "^3.3.1",
+        "lodash-es": "^4.17.21",
+        "screenfull": "^5.2.0",
+        "uuid": "^8.3.0"
+      }
+    },
     "node_modules/fast-diff": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
@@ -2312,6 +2415,28 @@
       "dev": true,
       "dependencies": {
         "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
       }
     },
     "node_modules/file-saver": {
@@ -2379,6 +2504,17 @@
       },
       "engines": {
         "node": ">= 6"
+      }
+    },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
       }
     },
     "node_modules/fragment-cache": {
@@ -2721,18 +2857,6 @@
         "he": "bin/he"
       }
     },
-    "node_modules/html2canvas": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
-      "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
-      "dependencies": {
-        "css-line-break": "^2.1.0",
-        "text-segmentation": "^1.0.3"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
     "node_modules/htmlparser2": {
       "version": "3.10.1",
       "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
@@ -2745,6 +2869,16 @@
         "entities": "^1.1.1",
         "inherits": "^2.0.1",
         "readable-stream": "^3.1.1"
+      }
+    },
+    "node_modules/i18n-js": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.5.1.tgz",
+      "integrity": "sha512-n7jojFj1WC0tztgr0I8jqTXuIlY1xNzXnC3mjKX/YjJhimdM+jXM8vOmn9d3xQFNC6qDHJ4ovhdrGXrRXLIGkA==",
+      "dependencies": {
+        "bignumber.js": "*",
+        "lodash": "*",
+        "make-plural": "*"
       }
     },
     "node_modules/image-size": {
@@ -3150,6 +3284,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg=="
+    },
     "node_modules/js-base64": {
       "version": "2.6.4",
       "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
@@ -3275,6 +3414,11 @@
       "dependencies": {
         "@jridgewell/sourcemap-codec": "^1.4.15"
       }
+    },
+    "node_modules/make-plural": {
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz",
+      "integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg=="
     },
     "node_modules/map-cache": {
       "version": "0.2.2",
@@ -3529,6 +3673,24 @@
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "engines": {
+        "node": ">=10.5.0"
       }
     },
     "node_modules/normalize-path": {
@@ -4326,6 +4488,17 @@
         "node": ">=14.0.0"
       }
     },
+    "node_modules/screenfull": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
+      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/scule": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
@@ -4976,14 +5149,6 @@
         "node": ">=10.13.0"
       }
     },
-    "node_modules/text-segmentation": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz",
-      "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
-      "dependencies": {
-        "utrie": "^1.0.2"
-      }
-    },
     "node_modules/to-object-path": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
@@ -5207,6 +5372,28 @@
       },
       "engines": {
         "node": ">=14.17"
+      }
+    },
+    "node_modules/ua-parser-js": {
+      "version": "1.0.37",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz",
+      "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/ua-parser-js"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/faisalman"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/faisalman"
+        }
+      ],
+      "engines": {
+        "node": "*"
       }
     },
     "node_modules/ufo": {
@@ -5441,12 +5628,12 @@
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
       "dev": true
     },
-    "node_modules/utrie": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz",
-      "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
-      "dependencies": {
-        "base64-arraybuffer": "^1.0.2"
+    "node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "bin": {
+        "uuid": "dist/bin/uuid"
       }
     },
     "node_modules/vary": {
@@ -5591,6 +5778,14 @@
         "vue": "^3.2.0"
       }
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webpack-sources": {
       "version": "3.2.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
diff --git a/package.json b/package.json
index b323d65..4e1884a 100644
--- a/package.json
+++ b/package.json
@@ -22,9 +22,9 @@
     "axios": "0.27.2",
     "echarts": "^5.5.1",
     "element-plus": "^2.5.0",
+    "ezuikit-js": "^8.1.9-beta.3",
     "file-saver": "2.0.5",
     "fuse.js": "6.6.2",
-    "html2canvas": "^1.4.1",
     "js-cookie": "3.0.5",
     "jsencrypt": "3.3.2",
     "moment": "^2.30.1",
diff --git a/src/api/screen/graphic/index.js b/src/api/screen/graphic/index.js
index b414851..e51f17b 100644
--- a/src/api/screen/graphic/index.js
+++ b/src/api/screen/graphic/index.js
@@ -10,4 +10,15 @@
         method: 'post',
         data
     })
+}
+
+/**
+ * 获取流量监测数据
+ */
+export const getFlowVideoData = (params) => {
+    return  publicRequest({
+        url: '/waterFlow/getVideo',
+        method: 'get',
+        params
+    })
 }
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
index 0d21012..de49203 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -36,7 +36,7 @@
   {
     path: '/',
     hidden: true,
-    redirect: '/screen'
+    redirect: '/flow'
   },
   {
     path: '/login',
@@ -76,7 +76,7 @@
         component: () => import('@/views/screen/flow/ecology/index.vue')
       },
       {
-        path: 'graphic',
+        path: 'graphic/:id?',
         component: () => import('@/views/screen/flow/graphic/index.vue')
       },
       {
diff --git a/src/screen/flow.vue b/src/screen/flow.vue
index d8e80dc..03c0a0c 100644
--- a/src/screen/flow.vue
+++ b/src/screen/flow.vue
@@ -21,7 +21,7 @@
         <div class="content">
             <router-view></router-view>
             <div class="warningBox" v-if="openWarn">
-                <img src="@/assets/images/flow/warn-icon.png">
+                <img src="@/assets/images/flow/warn-icon.png" alt="">
                 <div class="text">{{text}}</div>
             </div>
         </div>
diff --git a/src/views/login.vue b/src/views/login.vue
index 603f261..8024280 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -208,7 +208,7 @@
                 localStorage.setItem('id', JSON.stringify(res.data.id))
                 localStorage.setItem('userType', JSON.stringify(res.data.userType))
 
-                router.push("/screen");
+                router.push("/flow");
             }).catch(error => {
                 loading.value = false;
                 proxy.$modal.msgError('登录失败!')
diff --git a/src/views/screen/flow/graphic/index.vue b/src/views/screen/flow/graphic/index.vue
index 4d3ba4d..47b28aa 100644
--- a/src/views/screen/flow/graphic/index.vue
+++ b/src/views/screen/flow/graphic/index.vue
@@ -1,55 +1,112 @@
 <script setup>
-import {onMounted, ref} from "vue";
+import {onMounted, ref, onUnmounted} from "vue";
 import {getUserType} from '@/utils/auth.js'
-import html2canvas from "html2canvas";
 import {getFlowPointList} from '@/api/screen/index'
+import {getFlowVideoData} from '@/api/screen/graphic/index.js'
+import EZUIKit from 'ezuikit-js';
+import {useRoute} from "vue-router";
+
+const route = useRoute();
 
 const menuList = ref([])
 const userType = ref(getUserType())
-const monitorRef = ref()
 const searchVal = ref('')
-const video = ref()
+const playerData = ref([])
+const hasFullScreen = ref(false)
+let ezKitList = []; //视频组件实例数组
+let ezKitId = []; //视频盒子id数组
+let timer = null;
 
 // 全屏操作
 const handleFullScreen = () => {
-    monitorRef.value.requestFullscreen()
+    const dom = document.getElementById(ezKitId[0])
+    dom.requestFullscreen()
 }
+
+// 监听全屏状态,是否要开起蒙层
+document.addEventListener('fullscreenchange', (val) => {
+    if (!document.fullscreenElement) {  //退出全屏
+        hasFullScreen.value = false;
+    } else { //开起全屏
+        hasFullScreen.value = true;
+    }
+});
 
 // 抓拍
-const handleSnap = () => {
-    if(video.value) {
-        html2canvas(video.value).then(canvas => {
-            const link = document.createElement("a");
-            link.href = canvas.toDataURL("image/png");
-            link.download = '截图.png';
-            link.click()
-        })
-    }
+const handleSnap = (index) => {
+    ezKitList[index].capturePicture(`capture-${new Date().getTime()}`, 0.8); // 参数:回调函数,图片格式,质量(0-1)
 }
 
-const handleSearch = async () => {
-}
-
-
-// 获取监控点
+// 获取监控点菜单
 const getMoitorList = () => {
     getFlowPointList().then(res => {
         menuList.value = res.data
     })
 }
 
+// 选择菜单
+const handleSelect = (id) => {
+    ezKitList = []
+    ezKitId = []
+    playerData.value = []
+    clearInterval(timer)
+    getPlayerList(id)
+}
+
+// 搜索
+const handleSearch = () => {
+    ezKitList = []
+    ezKitId = []
+    playerData.value = []
+    clearInterval(timer)
+    getPlayerList()
+}
+
+// 获取监控点
+const getPlayerList = async (id) => {
+    getFlowVideoData({pointId: id, pointName: searchVal.value}).then(async res => {
+        res.data.forEach((item, index) => {
+            ezKitId[index] = `ezuikitPlayer${index}`
+        })
+        playerData.value = res.data
+        await nextTick()
+
+        // 渲染视频
+        res.data.forEach((item, index) => {
+            ezKitList[index] = new EZUIKit.EZUIKitPlayer({
+                id: ezKitId[index],
+                url: item.url,
+                accessToken: item.accessToken,
+            })
+        })
+    })
+
+    //  挂载定时器, 只获取数据,不重新渲染视频节点
+    timer = setInterval(() => {
+        getFlowVideoData({pointId: id, pointName: searchVal.value}).then(res => {
+            playerData.value = res.data
+        })
+    }, 10000)
+}
+
 
 onMounted(() => {
     getMoitorList()
+    getPlayerList(route.params.id || '')
 })
 
+onUnmounted(() => {
+    if (timer) {
+        clearInterval(timer)
+    }
+})
 </script>
 
 <template>
     <div class="graphic">
         <div class="graphic-menu">
             <div class="menu-t">监控点列表</div>
-            <el-menu class="el-menu">
+            <el-menu class="el-menu" @select="handleSelect">
                 <template v-for="(item, index) in menuList" :key="index+1">
                     <template v-if="item?.childrenList?.length === 0">
                         <el-menu-item :index="item.id">{{ item.pointName }}</el-menu-item>
@@ -70,81 +127,81 @@
         <div class="graphic-monitor">
             <div class="monitor-tool">
                 <div class="tool-l">
-                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入监测点名称" />
-                    <el-button @click="handleSearch"><el-icon><Search /></el-icon>搜索</el-button>
-                    <el-button style="margin-left: 0" v-if="userType === '1'"><el-icon><Plus /></el-icon>新增</el-button>
+                    <el-input v-model="searchVal" style="width: 20rem" placeholder="请输入监测点名称" clearable/>
+                    <el-button @click="handleSearch">
+                        <el-icon>
+                            <Search/>
+                        </el-icon>
+                        搜索
+                    </el-button>
+                    <el-button style="margin-left: 0" v-if="userType === '1'">
+                        <el-icon>
+                            <Plus/>
+                        </el-icon>
+                        新增
+                    </el-button>
                 </div>
                 <div class="tool-r" @click="handleFullScreen">
-                    <img src="@/assets/images/flow/fullscreen.png" />
+                    <img src="@/assets/images/flow/fullscreen.png"/>
                     全屏
                 </div>
             </div>
-            <div class="monitor-box" ref="monitorRef">
+            <div class="monitor-box">
                 <div class="monitor-list">
-                    <div class="item">
-                        <div class="title">新扎口流量监测点</div>
-                        <div class="videoBox" ref="video"></div>
+                    <div class="item" v-for="(item, index) in playerData" :key="index">
+                        <div class="title">{{ item.pointName }}</div>
+                        <div class="videoBox" :id="ezKitId[index]"></div>
                         <div class="info">
                             <div class="info-list">
                                 <div class="info-item">
                                     <div class="name">水位:</div>
-                                    <div class="val"><span>2332</span>m</div>
+                                    <div class="val"><span>{{ item.waterLevel }}</span>m</div>
                                 </div>
                                 <div class="info-item">
-                                    <div class="name">表面流速:</div>
-                                    <div class="val"><span>4.5</span>m/s</div>
+                                    <div class="name">流速:</div>
+                                    <div class="val"><span>{{ item.flowVelocity }}</span>m/s</div>
                                 </div>
                                 <div class="info-item">
-                                    <div class="name">水面宽度:</div>
-                                    <div class="val"><span>100</span>m</div>
+                                    <div class="name">瞬时流量:</div>
+                                    <div class="val"><span>{{ item.newFlow }}</span>m³/h</div>
                                 </div>
                                 <div class="info-item">
-                                    <div class="name">平均流速:</div>
-                                    <div class="val"><span>4.5</span>m/s</div>
-                                </div>
-                                <div class="info-item">
-                                    <div class="name">过水面积:</div>
-                                    <div class="val"><span>30</span>㎡</div>
-                                </div>
-                                <div class="info-item">
-                                    <div class="name">雷达流速:</div>
-                                    <div class="val"><span>4.5</span>m/s</div>
-                                </div>
-                                <div class="info-item">
-                                    <div class="name">实时流速:</div>
-                                    <div class="val"><span>120</span>㎡/s</div>
-                                </div>
-                                <div class="info-item">
-                                    <div class="name">起点距:</div>
-                                    <div class="val"><span>500</span>m</div>
+                                    <div class="name">累计流量:</div>
+                                    <div class="val"><span>{{ item.totalFlow }}</span>m³</div>
                                 </div>
                             </div>
                             <div class="info-btn">
-                                <el-button style="width: 6rem" @click="handleSnap">抓拍</el-button>
+                                <el-button style="width: 6rem" @click="handleSnap(index)">抓拍</el-button>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
         </div>
+        <div class="mask" v-show="hasFullScreen">
+            <div class="mask-item"></div>
+        </div>
     </div>
 </template>
 
 <style scoped lang="scss">
-.graphic{
+.graphic {
     height: 100%;
     display: flex;
-    &-menu{
+
+    &-menu {
         flex-shrink: 0;
         width: 20%;
         height: 100%;
         padding: 10px 0;
-        background: linear-gradient( 135deg, #91BDDB 0%, #9EC2DB 99%);
+        background: linear-gradient(135deg, #91BDDB 0%, #9EC2DB 99%);
         overflow-y: scroll;
+
         &::-webkit-scrollbar {
             display: none;
         }
-        .menu-t{
+
+        .menu-t {
             height: 40px;
             line-height: 40px;
             padding-left: 20px;
@@ -153,112 +210,134 @@
             background: url("@/assets/images/flow/monitor-title-bg.png") no-repeat;
             background-size: 100% 100%;
         }
-        .el-menu{
+
+        .el-menu {
             background-color: transparent;
             border-right: none;
-            :deep(.el-menu){
+
+            :deep(.el-menu) {
                 background-color: transparent;
             }
+
             :deep(.el-sub-menu__title:hover) {
                 background-color: rgba(0, 0, 0, 0.06);
             }
+
             :deep(.el-menu-item.is-active) {
                 color: #fff;
             }
         }
     }
-    &-monitor{
+
+    &-monitor {
         flex-shrink: 0;
         width: 80%;
         height: 100%;
-        .monitor-tool{
+
+        .monitor-tool {
             width: 100%;
             height: 60px;
             padding: 0 30px;
-            background: linear-gradient( 90deg, #91BDDB 0%, #DADFE3 100%);
+            background: linear-gradient(90deg, #91BDDB 0%, #DADFE3 100%);
             display: flex;
             align-items: center;
             justify-content: space-between;
-            .tool-l{
+
+            .tool-l {
                 display: flex;
                 align-items: center;
                 gap: 1rem;
-                .name{
+
+                .name {
                     font-size: 1.1rem;
                 }
             }
-            .tool-r{
+
+            .tool-r {
                 display: flex;
                 align-items: center;
-                img{
+
+                img {
                     width: 25px;
                     margin-right: 10px;
                 }
             }
         }
-        .monitor-box{
+
+        .monitor-box {
             height: calc(100% - 60px);
             background: linear-gradient(180deg, #91BDDB 0%, rgba(102, 102, 102, 0.5) 100%);
-            .monitor-list{
+
+            .monitor-list {
                 height: 100%;
                 display: flex;
                 align-items: center;
                 justify-content: space-between;
                 padding: 0 30px;
-                .item{
+
+                .item {
                     width: 48%;
                     height: 96%;
-                    background: rgba(23,108,229,0.3);
+                    background: rgba(23, 108, 229, 0.3);
                     border: 1px solid #176CE5;
                     padding: 20px;
                     border-radius: 8px;
-                    .title{
+
+                    .title {
                         height: 12%;
                         text-align: center;
                         font-size: 42px;
                         color: #fff;
                     }
-                    .videoBox{
+
+                    .videoBox {
                         width: 100%;
                         height: 60%;
                         background-color: #000;
                     }
-                    .info{
+
+                    .info {
                         width: 100%;
                         height: 25%;
                         display: flex;
                         margin-top: 20px;
-                        .info-list{
+
+                        .info-list {
                             width: 80%;
                             display: flex;
                             flex-wrap: wrap;
                             color: #fff;
                             font-size: 20px;
-                            .info-item{
+
+                            .info-item {
                                 width: 50%;
                                 padding: 8px 0;
                                 flex-shrink: 0;
                                 display: flex;
                                 align-items: center;
-                                .name{
+
+                                .name {
                                     width: 100px;
                                 }
-                                .val span{
+
+                                .val span {
                                     display: inline-block;
                                     padding: 0 20px;
                                 }
                             }
                         }
-                        .info-btn{
+
+                        .info-btn {
                             width: 20%;
                             padding: 1rem 0;
                             display: flex;
                             align-items: flex-end;
-                            :deep(.el-button){
+
+                            :deep(.el-button) {
                                 color: #fff;
-                                background: rgba(94,229,92,0.6);
+                                background: rgba(94, 229, 92, 0.6);
                                 border-radius: 4px 4px 4px 4px;
-                                border: 1px solid rgba(94,229,92,0.6);
+                                border: 1px solid rgba(94, 229, 92, 0.6);
                             }
                         }
                     }
@@ -266,5 +345,22 @@
             }
         }
     }
+
+    .mask{
+        position: absolute;
+        left: 0;
+        top: 0;
+        z-index: 100;
+        width: 100vw;
+        height: 100vh;
+        .mask-item{
+            position: absolute;
+            left: 5%;
+            bottom: 10%;
+            height: 400px;
+            width: 300px;
+            background-color: rgba(0, 0, 0, 0.4);
+        }
+    }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/screen/flow/home/index.vue b/src/views/screen/flow/home/index.vue
index dfbc0b7..79da287 100644
--- a/src/views/screen/flow/home/index.vue
+++ b/src/views/screen/flow/home/index.vue
@@ -6,7 +6,7 @@
                 <div class="point-address" @click="handleShow(index)"></div>
                 <div class="point-message" v-show="item.showMsg">
                     <div class="msg-box">
-                        <div class="video-box" :style="{backgroundImage: `url(${item.imageRul})`}">
+                        <div class="video-box" :style="{backgroundImage: `url(${item.imageRul})`}" @click="jumpMonitor(item.id)">
                             <el-icon><VideoPlay /></el-icon>
                         </div>
                         <div class="info-box">
@@ -44,6 +44,8 @@
 <script setup>
 import {ref, onMounted} from "vue";
 import {getHomePonit} from '@/api/screen/home/index.js'
+import {useRouter} from "vue-router";
+const router = useRouter();
 
 // 标点配置
 const config = [
@@ -75,6 +77,11 @@
     })
 }
 
+// 跳转监控点
+const jumpMonitor = (id) => {
+    router.push({ path: `/flow/graphic/${id}` })
+}
+
 const handleShow = (index) => {
     pointList.value[index].showMsg = !pointList.value[index].showMsg;
 }
diff --git a/src/views/screen/temperature/monitor/index.vue b/src/views/screen/temperature/monitor/index.vue
index 414c2ed..0ffcbff 100644
--- a/src/views/screen/temperature/monitor/index.vue
+++ b/src/views/screen/temperature/monitor/index.vue
@@ -173,9 +173,11 @@
                         <div class="item-btn">
                             <el-button size="large" type="success" @click="setMonitorData(item)">应用</el-button>
                         </div>
-                        <!--                        <div class="item-error">-->
-                        <!--                            <img src="@/assets/images/warning.png" />-->
-                        <!--                        </div>-->
+                        <div class="item-error" v-if="Number(item.waterTemperature) < Number(item.lowWaterLevel) || Number(item.waterTemperature) > Number(item.tallWaterLevel)">
+                            <img src="@/assets/images/warning.png" alt="" />
+                            <div v-if="Number(item.waterTemperature) < Number(item.lowWaterLevel)">水温达到下限值</div>
+                            <div v-else-if="Number(item.waterTemperature) > Number(item.tallWaterLevel)">水温达到上限值</div>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -297,9 +299,19 @@
                         width: 100%;
                         height: 100%;
                         background: rgba(0, 0, 0, 0.3);
+                        display: flex;
+                        flex-direction: column;
+                        align-items: center;
+                        justify-content: center;
 
                         img {
+                            width: 70%;
+                        }
+                        div{
                             width: 100%;
+                            text-align: center;
+                            font-size: 3rem;
+                            color: #f65252;
                         }
                     }
 

--
Gitblit v1.9.3