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