web
13 小时以前 d20fcd6ad28a534d763273c48381cdc36ff2891f
fix:对接监控视频
已修改9个文件
585 ■■■■ 文件已修改
package-lock.json 281 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/screen/graphic/index.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/screen/flow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/flow/graphic/index.vue 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/flow/home/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/screen/temperature/monitor/index.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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",
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
    })
}
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')
      },
      {
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>
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('登录失败!')
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>
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;
}
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;
                        }
                    }