From c027533d4ff421c4b6e412d0dfee22357f6081d3 Mon Sep 17 00:00:00 2001 From: tcy <1193318383@qq.com> Date: Mon, 22 Sep 2025 16:49:50 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat(=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F):=20=E9=87=8D=E6=9E=84=E5=AF=B9=E8=AF=9D=E6=A1=86?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=B9=B6=E6=B7=BB=E5=8A=A0=E8=AF=A6=E7=BB=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整对话框布局和样式,增加顶部对齐 - 添加设备状态、运行信息等详细展示区域 - 实现不同状态的颜色区分显示 - 默认隐藏对话框,改为点击触发显示 --- src/assets/styles/dialog.scss | 101 +++++++++++++++++- .../siteOverview/components/status.vue | 89 ++++++++++++++- 2 files changed, 185 insertions(+), 5 deletions(-) diff --git a/src/assets/styles/dialog.scss b/src/assets/styles/dialog.scss index a00f472..5e92c76 100644 --- a/src/assets/styles/dialog.scss +++ b/src/assets/styles/dialog.scss @@ -1,8 +1,12 @@ #custom-dialog { padding: 0; + top: 0; .el-dialog__header { - display: none; + // display: none; + border: none; + padding: 0; + margin: 0; } .el-dialog__body { @@ -10,7 +14,100 @@ } .alert-content { - padding: 80px; background: linear-gradient(180deg, rgba(0, 119, 255, 0.23) 0%, rgba(255, 255, 255, 0) 100%); + display: flex; + align-items: center; + justify-content: space-between; + padding-left: 20px; + padding-right: 50px; + + .info { + display: flex; + flex-direction: column; + gap: 10px; + + .title { + color: rgba(0, 30, 59, 1); + font-size: 20px; + font-weight: bold; + } + + .name { + color: rgba(0, 30, 59, 1); + font-weight: bold; + } + + .icon { + display: flex; + align-items: center; + font-size: 12px; + + .last-update { + // font-size: ; + color: rgba(113, 128, 150, 1); + margin-left: 15px; + } + + svg { + width: 15px; + height: 15px; + } + + .text { + font-size: 12px; + margin-left: 10px; + } + + + } + + + } + + .img { + width: 240px; + height: 240px; + + img { + width: 100%; + height: 100%; + display: block; + } + } + + .info-box { + font-size: 12px; + display: flex; + gap: 40px; + margin-left: 30px; + + .item { + display: flex; + flex-direction: column; + gap: 20px; + } + + .title { + color: rgba(113, 128, 150, 1); + margin-bottom: 10px; + } + + .text { + font-weight: bold; + color: rgba(0, 30, 59, 1); + } + } + } + + .alert-content .success { + color: rgba(0, 184, 122, 1) !important; + } + + .alert-content .orange { + color: rgba(255, 153, 0, 1) !important; + } + + .alert-content .red { + color: rgba(227, 39, 39, 1) !important; } } \ No newline at end of file diff --git a/src/views/pvSystem/siteOverview/components/status.vue b/src/views/pvSystem/siteOverview/components/status.vue index f99e9e3..db31309 100644 --- a/src/views/pvSystem/siteOverview/components/status.vue +++ b/src/views/pvSystem/siteOverview/components/status.vue @@ -54,11 +54,94 @@ - -
+ +
+
+
INV-2023-001
+
华为 SUN2000-60KTL-M0
+
+
+ + + + + + + + + + + + + + + + + +
正常运行
+
最后更新:刚刚
+
+
+
+
+
+
+
安装位置
+
光伏区A区-3排-08号
+
+
+
运行时长
+
402天18小时
+
+
+
+
+
安装日期
+
2022-06-15
+
+
+
上次维护
+
2025-05-20
+
+
+
+
+
通讯状态
+
正常
+
+
+
固件版本
+
V200R001CC00SPC105
+
+
+
+
+
IP地址
+
192.168.1.1
+
+
+
累计发电量
+
128,562.4Kwh
+
+
+
@@ -84,7 +167,7 @@ const formInline = ref({}) const total = ref(0); const loading = ref(false); -const dialogVisible = ref(true); +const dialogVisible = ref(false); const listData = [ { id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 1 }, { id: "INV-2023-001", shuchu: "12.8kw", xiaolv: "98.2%", wendu: "42℃", fadian: "158.5kWh", status: 1 }, From 6d960a1fc7d1eda31704343493e83acbc6ea57c0 Mon Sep 17 00:00:00 2001 From: tcy <1193318383@qq.com> Date: Mon, 22 Sep 2025 19:47:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(=E7=AB=99=E7=82=B9=E6=A6=82=E8=A7=88):?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E7=8A=B6=E6=80=81=E5=92=8C=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E8=87=AA=E5=AE=9A=E4=B9=89=E5=BC=B9=E7=AA=97=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor(样式): 重构弹窗样式并分离状态和告警样式 style: 调整页面间距和布局 --- src/assets/styles/1.html | 16 +++ src/assets/styles/dialog.scss | 117 +++++++++++++++- src/components/TitleComponent/index.vue | 4 +- .../pvSystem/mainSystemDiagram/index.vue | 2 +- .../components/CustomDialogAlarm.vue | 93 +++++++++++++ .../components/CustomDialogStatus.vue | 102 ++++++++++++++ .../siteOverview/components/status.vue | 130 +++--------------- src/views/pvSystem/siteOverview/index.vue | 9 +- 8 files changed, 353 insertions(+), 120 deletions(-) create mode 100644 src/assets/styles/1.html create mode 100644 src/views/pvSystem/siteOverview/components/CustomDialogAlarm.vue create mode 100644 src/views/pvSystem/siteOverview/components/CustomDialogStatus.vue diff --git a/src/assets/styles/1.html b/src/assets/styles/1.html new file mode 100644 index 0000000..880c800 --- /dev/null +++ b/src/assets/styles/1.html @@ -0,0 +1,16 @@ +
+
+ +
+
+ + \ No newline at end of file diff --git a/src/assets/styles/dialog.scss b/src/assets/styles/dialog.scss index 5e92c76..6ed33de 100644 --- a/src/assets/styles/dialog.scss +++ b/src/assets/styles/dialog.scss @@ -1,3 +1,7 @@ +.no-header-dialog { + height: auto; +} + #custom-dialog { padding: 0; top: 0; @@ -11,9 +15,11 @@ .el-dialog__body { padding: 0 !important; + // height: auto !important; + max-height: none !important; } - .alert-content { + .status-alert-content { background: linear-gradient(180deg, rgba(0, 119, 255, 0.23) 0%, rgba(255, 255, 255, 0) 100%); display: flex; align-items: center; @@ -99,15 +105,118 @@ } } - .alert-content .success { + .status-alert-content .success { color: rgba(0, 184, 122, 1) !important; } - .alert-content .orange { + .status-alert-content .orange { color: rgba(255, 153, 0, 1) !important; } - .alert-content .red { + .status-alert-content .red { + color: rgba(227, 39, 39, 1) !important; + } + + .alarm-alert-content { + background: linear-gradient(180deg, rgba(255, 87, 51, 0.23) 0%, rgba(255, 219, 219, 0) 100%); + padding-left: 50px; + padding-right: 50px; + padding-bottom: 50px; + + .top { + display: flex; + gap: 50px; + align-items: center; + padding: 50px 0; + padding-bottom: 20px; + + .info { + display: flex; + flex-direction: column; + gap: 15px; + + .title { + color: rgba(227, 39, 39, 1); + font-size: 28px; + font-weight: bold; + } + + .alarm-id { + color: rgba(0, 30, 59, 1); + font-size: 18px; + font-weight: bold; + } + + .status-box { + display: flex; + gap: 20px; + + .status { + font-weight: bold; + } + + .last-update { + color: rgba(113, 128, 150, 1); + } + } + } + + .info-box { + .list { + display: flex; + gap: 90px; + + .item { + display: flex; + flex-direction: column; + gap: 30px; + + .title { + color: rgba(113, 128, 150, 1); + margin-bottom: 10px; + } + + .text { + color: rgba(0, 30, 59, 1); + font-weight: bold; + } + } + } + } + } + + .progress-box { + .title { + color: rgba(0, 30, 59, 1); + font-weight: bold; + font-size: 20px; + margin-bottom: 24px; + } + } + + .notice-box { + display: flex; + justify-content: space-between; + } + + .item { + display: flex; + flex-direction: column; + gap: 10px; + color: rgba(113, 128, 150, 1); + + .time { + font-size: 12px; + } + } + + .title.active { + color: rgba(247, 89, 10, 1); + font-weight: bold; + } + } + + .alarm-alert-content .red { color: rgba(227, 39, 39, 1) !important; } } \ No newline at end of file diff --git a/src/components/TitleComponent/index.vue b/src/components/TitleComponent/index.vue index 8b44219..4eddf81 100644 --- a/src/components/TitleComponent/index.vue +++ b/src/components/TitleComponent/index.vue @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/src/views/pvSystem/siteOverview/components/CustomDialogStatus.vue b/src/views/pvSystem/siteOverview/components/CustomDialogStatus.vue new file mode 100644 index 0000000..79cac99 --- /dev/null +++ b/src/views/pvSystem/siteOverview/components/CustomDialogStatus.vue @@ -0,0 +1,102 @@ + + + \ No newline at end of file diff --git a/src/views/pvSystem/siteOverview/components/status.vue b/src/views/pvSystem/siteOverview/components/status.vue index db31309..7f027a2 100644 --- a/src/views/pvSystem/siteOverview/components/status.vue +++ b/src/views/pvSystem/siteOverview/components/status.vue @@ -1,7 +1,8 @@ - \ No newline at end of file From 4163b11d3d43b40a02203439e1440620ec66ffe3 Mon Sep 17 00:00:00 2001 From: tcy <1193318383@qq.com> Date: Tue, 23 Sep 2025 20:37:04 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat(=E8=A7=86=E9=A2=91=E7=9B=91=E6=8E=A7):?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E6=91=84=E5=83=8F=E5=A4=B4=E9=A2=84?= =?UTF-8?q?=E7=BD=AE=E4=BD=8D=E7=AE=A1=E7=90=86=E5=92=8C=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增摄像头预置位管理功能,包括添加、修改、删除和调用预置位 实现视频监控页面,支持扩展视图和普通视图切换 添加获取摄像头列表接口,优化视频播放器初始化逻辑 完善分页功能,根据视图类型动态调整请求数量 --- src/api/devicePreset/index.ts | 74 ++++ src/api/devicePreset/types.ts | 86 ++++ src/api/securitySurveillance/index.js | 8 + src/views/camera/components/presetAdd.vue | 288 ++++++++++++++ src/views/camera/index.vue | 371 ++++++++++++++++++ .../securitySurveillance/components/spjk.vue | 203 ++++++---- 6 files changed, 959 insertions(+), 71 deletions(-) create mode 100644 src/api/devicePreset/index.ts create mode 100644 src/api/devicePreset/types.ts create mode 100644 src/views/camera/components/presetAdd.vue create mode 100644 src/views/camera/index.vue diff --git a/src/api/devicePreset/index.ts b/src/api/devicePreset/index.ts new file mode 100644 index 0000000..d5baf2e --- /dev/null +++ b/src/api/devicePreset/index.ts @@ -0,0 +1,74 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DevicePresetVO, DevicePresetForm, DevicePresetQuery } from '@/api/camera/devicePreset/types'; + +/** + * 查询摄像头预置位列表 + * @param query + * @returns {*} + */ + +export const listDevicePreset = (query?: DevicePresetQuery): AxiosPromise => { + return request({ + url: '/camera/devicePreset/list', + method: 'get', + params: query + }); +}; + +/** + * 查询摄像头预置位详细 + * @param id + */ +export const getDevicePreset = (id: string | number): AxiosPromise => { + return request({ + url: '/camera/devicePreset/' + id, + method: 'get' + }); +}; + +/** + * 新增摄像头预置位 + * @param data + */ +export const addDevicePreset = (data: DevicePresetForm) => { + return request({ + url: '/camera/devicePreset', + method: 'post', + data: data + }); +}; + +/** + * 修改摄像头预置位 + * @param data + */ +export const updateDevicePreset = (data: DevicePresetForm) => { + return request({ + url: '/camera/devicePreset', + method: 'put', + data: data + }); +}; + +/** + * 删除摄像头预置位 + * @param id + */ +export const delDevicePreset = (id: string | number | Array) => { + return request({ + url: '/camera/devicePreset/' + id, + method: 'delete' + }); +}; +/** + * 调用摄像头预置位 + * @param data + */ +export const callDevicePreset = (data: DevicePresetForm) => { + return request({ + url: '/camera/devicePreset/call', + method: 'post', + data: data + }); +}; diff --git a/src/api/devicePreset/types.ts b/src/api/devicePreset/types.ts new file mode 100644 index 0000000..87dfe79 --- /dev/null +++ b/src/api/devicePreset/types.ts @@ -0,0 +1,86 @@ +export interface DevicePresetVO { + /** + * 主键id + */ + id: string | number; + + /** + * 设备序列号 + */ + deviceSerial: string; + + /** + * 通道号 + */ + channelNo: number; + + /** + * 预置点序号 + */ + presetIndex: number; + + /** + * 预置点 + */ + presetName: string; + +} + +export interface DevicePresetForm extends BaseEntity { + /** + * 主键id + */ + id?: string | number; + + /** + * 设备序列号 + */ + deviceSerial?: string; + + /** + * 通道号 + */ + channelNo?: number; + + /** + * 预置点序号 + */ + presetIndex?: number; + + /** + * 预置点 + */ + presetName?: string; + +} + +export interface DevicePresetQuery extends PageQuery { + + /** + * 设备序列号 + */ + deviceSerial?: string; + + /** + * 通道号 + */ + channelNo?: number; + + /** + * 预置点序号 + */ + presetIndex?: number; + + /** + * 预置点 + */ + presetName?: string; + + /** + * 日期范围参数 + */ + params?: any; +} + + + diff --git a/src/api/securitySurveillance/index.js b/src/api/securitySurveillance/index.js index b088582..1ec5c7e 100644 --- a/src/api/securitySurveillance/index.js +++ b/src/api/securitySurveillance/index.js @@ -6,3 +6,11 @@ export function getToken() { method: 'get', }) } +// 获取摄像头列表 +export function getMonitoringList(data) { + return request({ + url: '/ops/monitoriing/getMonitoringList', + method: 'post', + data + }) +} diff --git a/src/views/camera/components/presetAdd.vue b/src/views/camera/components/presetAdd.vue new file mode 100644 index 0000000..ccfd69b --- /dev/null +++ b/src/views/camera/components/presetAdd.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/src/views/camera/index.vue b/src/views/camera/index.vue new file mode 100644 index 0000000..a052ae5 --- /dev/null +++ b/src/views/camera/index.vue @@ -0,0 +1,371 @@ + + + diff --git a/src/views/securitySurveillance/components/spjk.vue b/src/views/securitySurveillance/components/spjk.vue index 255fd57..1024f97 100644 --- a/src/views/securitySurveillance/components/spjk.vue +++ b/src/views/securitySurveillance/components/spjk.vue @@ -23,14 +23,14 @@ :id="`bigVideo`">
-
+
@@ -49,8 +49,8 @@ const displayIndex = (activeIndex + i) % videoList.length; activeIndex = displayIndex; }" :id="`smallVideo-expanded-${i}`"> -
{{ videoList[(activeIndex + i) % videoList.length].name }} -
+
@@ -71,7 +71,7 @@
-
{{ item.name }}
+
@@ -86,7 +86,7 @@ @@ -96,59 +96,27 @@