diff --git a/src/views/dashboard1/index.less b/src/views/dashboard1/index.less
index 85debb0..8df452d 100644
--- a/src/views/dashboard1/index.less
+++ b/src/views/dashboard1/index.less
@@ -352,6 +352,18 @@
content: "视";
}
+ .evidence-photo {
+ display: block;
+ width: 88px;
+ height: 52px;
+ object-fit: cover;
+ border: 1px solid rgba(87, 198, 255, 0.18);
+ box-shadow:
+ inset 0 0 0 1px rgba(130, 232, 255, 0.08),
+ 0 8px 18px rgba(2, 10, 18, 0.24);
+ background: rgba(8, 31, 62, 0.58);
+ }
+
.table-actions {
display: flex;
align-items: center;
@@ -637,7 +649,6 @@
.tree-panel {
flex: 1;
min-height: 0;
- overflow: auto;
display: flex;
flex-direction: column;
gap: 12px;
@@ -703,10 +714,45 @@
.tree-device-list {
margin-top: 10px;
+ flex: 1;
+ min-height: 0;
+ overflow: auto;
display: flex;
flex-direction: column;
gap: 8px;
padding-left: 10px;
+ padding-right: 2px;
+ }
+
+ .tree-panel-footer {
+ padding: 12px 10px 2px;
+ border-top: 1px solid rgba(77, 188, 248, 0.12);
+ }
+
+ .tree-playback-btn {
+ width: 100%;
+ height: 40px;
+ border: 1px solid rgba(102, 235, 255, 0.28);
+ background: linear-gradient(
+ 90deg,
+ rgba(20, 86, 152, 0.94) 0%,
+ rgba(10, 42, 86, 0.98) 100%
+ );
+ color: #eefcff;
+ font-size: 13px;
+ font-weight: 700;
+ letter-spacing: 1px;
+ cursor: pointer;
+ box-shadow: inset 0 0 0 1px rgba(102, 235, 255, 0.08),
+ 0 0 18px rgba(29, 133, 222, 0.12);
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
+ }
+
+ .tree-playback-btn:hover {
+ transform: translateY(-1px);
+ border-color: rgba(102, 235, 255, 0.54);
+ box-shadow: inset 0 0 0 1px rgba(102, 235, 255, 0.12),
+ 0 0 24px rgba(52, 177, 255, 0.18);
}
.tree-device-btn {
@@ -762,7 +808,7 @@
.grid-switch-btn,
.playback-btn,
- .playback-filter input {
+ .playback-field input {
height: 34px;
border: 1px solid rgba(87, 198, 255, 0.18);
background: rgba(8, 31, 62, 0.72);
@@ -872,42 +918,103 @@
letter-spacing: 1px;
}
- .playback-panel {
- margin-top: 16px;
- padding: 14px 16px;
- background: rgba(8, 34, 68, 0.62);
- border: 1px solid rgba(77, 188, 248, 0.12);
+ .playback-dialog-mask {
+ position: fixed;
+ inset: 0;
+ z-index: 90;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(1, 8, 18, 0.74);
+ backdrop-filter: blur(8px);
}
- .playback-header,
- .playback-controls,
- .playback-filter {
+ .playback-dialog {
+ width: min(960px, calc(100vw - 80px));
+ max-height: calc(100vh - 90px);
+ display: flex;
+ flex-direction: column;
+ gap: 18px;
+ padding: 24px 24px 22px;
+ background: linear-gradient(
+ 180deg,
+ rgba(8, 30, 58, 0.98) 0%,
+ rgba(4, 18, 36, 0.98) 100%
+ );
+ border: 1px solid rgba(89, 203, 255, 0.24);
+ box-shadow: 0 24px 54px rgba(0, 0, 0, 0.34),
+ inset 0 0 0 1px rgba(64, 180, 244, 0.08);
+ }
+
+ .playback-dialog-header,
+ .playback-dialog-controls {
display: flex;
align-items: center;
}
- .playback-header {
+ .playback-dialog-header {
justify-content: space-between;
gap: 16px;
}
- .playback-title {
+ .playback-dialog-title {
color: #f2fbff;
- font-size: 15px;
+ font-size: 20px;
font-weight: 700;
+ letter-spacing: 1px;
}
- .playback-filter {
+ .playback-dialog-meta {
+ margin-top: 6px;
+ color: rgba(166, 219, 245, 0.76);
+ font-size: 12px;
+ }
+
+ .playback-dialog-filter {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr)) 136px;
+ gap: 14px;
+ align-items: end;
+ }
+
+ .playback-field {
+ display: flex;
+ flex-direction: column;
gap: 8px;
}
- .playback-filter input {
- padding: 0 10px;
+ .playback-field span {
+ color: rgba(182, 232, 248, 0.78);
+ font-size: 12px;
}
- .playback-controls {
+ .playback-field input {
+ width: 100%;
+ padding: 0 12px;
+ }
+
+ .playback-launch-btn {
+ height: 38px;
+ }
+
+ .playback-preview {
+ position: relative;
+ height: 420px;
+ overflow: hidden;
+ border: 1px solid rgba(82, 191, 255, 0.16);
+ background: radial-gradient(circle at 50% 50%, rgba(34, 116, 190, 0.16), rgba(4, 16, 33, 0.96));
+ }
+
+ .playback-preview video {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ display: block;
+ }
+
+ .playback-dialog-controls {
gap: 10px;
- margin-top: 14px;
+ flex-wrap: wrap;
}
.playback-track {
@@ -1366,9 +1473,12 @@
flex: 1;
overflow: hidden;
background:
- radial-gradient(circle at 50% 50%, rgba(32, 112, 183, 0.12), transparent 45%),
- linear-gradient(180deg, rgba(5, 17, 35, 0.94) 0%, rgba(3, 12, 27, 0.96) 100%);
+ radial-gradient(circle at 50% 58%, rgba(46, 163, 224, 0.12), transparent 34%),
+ linear-gradient(180deg, rgba(6, 18, 31, 0.96) 0%, rgba(3, 10, 22, 0.98) 100%);
border: 1px solid rgba(82, 191, 255, 0.16);
+ box-shadow:
+ inset 0 0 38px rgba(24, 92, 140, 0.18),
+ inset 0 -46px 72px rgba(0, 0, 0, 0.34);
}
.nav-map-stage::before {
@@ -1376,10 +1486,24 @@
position: absolute;
inset: 0;
background:
- linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px),
- linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px);
- background-size: 48px 48px;
- opacity: 0.5;
+ linear-gradient(180deg, rgba(255, 255, 255, 0.015) 0, transparent 36%),
+ linear-gradient(rgba(102, 208, 255, 0.028) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(102, 208, 255, 0.022) 1px, transparent 1px);
+ background-size:
+ 100% 100%,
+ 46px 46px,
+ 46px 46px;
+ opacity: 0.42;
+ pointer-events: none;
+ }
+
+ .nav-map-stage::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background:
+ linear-gradient(90deg, rgba(2, 8, 18, 0.62), transparent 18%, transparent 82%, rgba(2, 8, 18, 0.62)),
+ linear-gradient(180deg, rgba(2, 8, 18, 0.3), transparent 20%, transparent 80%, rgba(2, 8, 18, 0.54));
pointer-events: none;
}
@@ -1393,35 +1517,60 @@
stroke-width: 1;
}
- .cloud-layer circle {
- fill: rgba(140, 230, 255, 0.74);
+ .corridor-lane {
+ fill: rgba(14, 48, 76, 0.46);
+ stroke: rgba(104, 222, 255, 0.08);
+ stroke-width: 1.2;
+ filter: drop-shadow(0 0 16px rgba(54, 163, 235, 0.2));
+ }
+
+ .corridor-edge {
+ fill: none;
+ stroke: rgba(133, 224, 255, 0.36);
+ stroke-width: 1.5;
+ stroke-dasharray: 4 8;
+ stroke-linecap: round;
+ opacity: 0.72;
+ }
+
+ .wall-layer circle {
+ fill: rgba(153, 241, 255, 0.82);
opacity: 0.88;
- filter: drop-shadow(0 0 4px rgba(82, 198, 255, 0.28));
+ filter: drop-shadow(0 0 8px rgba(86, 214, 255, 0.24));
+ }
+
+ .wall-upper circle {
+ fill: rgba(151, 234, 255, 0.76);
+ }
+
+ .wall-lower circle {
+ fill: rgba(110, 216, 255, 0.64);
}
.route-glow {
fill: none;
- stroke: rgba(88, 219, 255, 0.18);
- stroke-width: 18;
+ stroke: rgba(88, 219, 255, 0.16);
+ stroke-width: 12;
stroke-linecap: round;
stroke-linejoin: round;
}
.route-line {
fill: none;
- stroke: #67e3ff;
- stroke-width: 5;
+ stroke: #76efff;
+ stroke-width: 4;
stroke-linecap: round;
stroke-linejoin: round;
- stroke-dasharray: 12 12;
+ stroke-dasharray: 10 8;
animation: routeFlow 12s linear infinite;
- filter: drop-shadow(0 0 10px rgba(70, 212, 255, 0.32));
+ filter: drop-shadow(0 0 10px rgba(70, 212, 255, 0.26));
}
.checkpoint circle {
- fill: rgba(6, 22, 51, 0.95);
- stroke: #7ae5ff;
+ fill: rgba(5, 18, 42, 0.96);
+ stroke: #8becff;
stroke-width: 2;
+ filter: drop-shadow(0 0 12px rgba(97, 220, 255, 0.24));
}
.checkpoint text {
@@ -1451,6 +1600,7 @@
color: rgba(183, 234, 255, 0.82);
font-size: 11px;
letter-spacing: 0.7px;
+ text-shadow: 0 0 8px rgba(56, 190, 248, 0.22);
}
.nav-map-overlay.top-left {
@@ -1808,27 +1958,73 @@
rgba(8, 31, 68, 0.92) 0%,
rgba(10, 49, 92, 0.58) 100%
);
- border-left: 3px solid rgba(92, 196, 255, 0.76);
- box-shadow: inset 0 0 0 1px rgba(65, 174, 243, 0.08);
+ border: 1px solid rgba(78, 194, 255, 0.14);
+ box-shadow:
+ inset 0 0 0 1px rgba(65, 174, 243, 0.08),
+ 0 12px 22px rgba(3, 14, 28, 0.22);
}
- .alert-main {
+ .alert-content {
display: flex;
align-items: center;
- justify-content: space-between;
+ gap: 14px;
+ }
+
+ .alert-thumbnail {
+ width: 124px;
+ height: 78px;
+ flex: 0 0 124px;
+ object-fit: cover;
+ border: 1px solid rgba(116, 219, 255, 0.24);
+ box-shadow: 0 0 0 1px rgba(78, 194, 255, 0.08);
+ background: rgba(6, 22, 39, 0.72);
+ }
+
+ .alert-info {
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+ gap: 10px;
+ }
+
+ .alert-summary {
+ width: 100%;
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) minmax(92px, auto);
gap: 12px;
- margin-bottom: 8px;
+ align-items: start;
+ }
+
+ .alert-field {
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .alert-field-right {
+ align-items: flex-start;
+ }
+
+ .alert-label {
+ color: rgba(146, 213, 238, 0.72);
+ font-size: 11px;
+ line-height: 1;
}
.alert-title {
color: #f0fbff;
font-size: 15px;
font-weight: 700;
+ letter-spacing: 0.4px;
+ line-height: 1.2;
}
.alert-level {
- min-width: 46px;
- padding: 3px 8px;
+ min-width: 48px;
+ padding: 4px 10px;
border-radius: 999px;
text-align: center;
font-size: 11px;
@@ -1853,12 +2049,17 @@
border: 1px solid rgba(110, 255, 197, 0.2);
}
- .alert-meta {
+ .alert-time-row {
+ width: 100%;
display: flex;
- justify-content: space-between;
- gap: 10px;
- color: rgba(171, 223, 246, 0.8);
- font-size: 11px;
+ flex-direction: column;
+ gap: 6px;
+ }
+
+ .alert-time {
+ color: rgba(190, 234, 249, 0.84);
+ font-size: 12px;
+ line-height: 1.2;
}
.alert-empty {
@@ -1872,8 +2073,12 @@
}
.video-card {
+ > .card-header .title {
+ margin-left: 80px;
+ }
+
.video-panel {
- margin: 12px 24px 0;
+ margin: 12px 4px 0 20px;
height: calc(100% - 56px);
display: flex;
flex-direction: column;
@@ -1984,8 +2189,12 @@
}
.control-card {
+ > .card-header .title {
+ margin-left: 80px;
+ }
+
.control-panel {
- margin: 12px 24px 0;
+ margin: 12px 4px 0 20px;
display: flex;
flex-direction: column;
gap: 14px;
@@ -2032,7 +2241,7 @@
.control-top-row {
display: grid;
- grid-template-columns: minmax(0, calc(50% - 10px)) minmax(0, calc(50% + 10px));
+ grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
align-items: stretch;
}
@@ -2064,6 +2273,45 @@
font-size: 12px;
}
+ .drive-mode-tabs {
+ width: 100%;
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 8px;
+ margin: 2px 0 10px;
+ }
+
+ .drive-mode-tab {
+ height: 34px;
+ border: 1px solid rgba(87, 198, 255, 0.18);
+ background: rgba(8, 31, 62, 0.72);
+ color: rgba(192, 235, 250, 0.78);
+ font-size: 12px;
+ font-weight: 700;
+ cursor: pointer;
+ transition:
+ border-color 0.18s ease,
+ background 0.18s ease,
+ box-shadow 0.18s ease,
+ transform 0.18s ease;
+
+ &:hover {
+ transform: translateY(-1px);
+ border-color: rgba(102, 235, 255, 0.38);
+ }
+
+ &.active {
+ color: #eefcff;
+ border-color: rgba(102, 235, 255, 0.7);
+ background: linear-gradient(
+ 90deg,
+ rgba(24, 102, 180, 0.88),
+ rgba(35, 158, 215, 0.88)
+ );
+ box-shadow: 0 0 14px rgba(52, 177, 255, 0.18);
+ }
+ }
+
.vehicle-pad {
width: 208px;
height: 208px;
@@ -2310,6 +2558,63 @@
transform: scale(0.88);
}
+ .gimbal-preset-panel {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin: 2px 0 10px;
+ padding: 0 2px;
+ }
+
+ .gimbal-preset-group {
+ display: flex;
+ flex: 1;
+ min-width: 0;
+ }
+
+ .gimbal-preset-select {
+ width: 100%;
+ height: 40px;
+ padding: 0 12px;
+ border: 1px solid rgba(91, 208, 255, 0.22);
+ background: linear-gradient(
+ 180deg,
+ rgba(10, 36, 72, 0.9) 0%,
+ rgba(7, 23, 48, 0.82) 100%
+ );
+ color: #eefcff;
+ font-size: 12px;
+ outline: none;
+ box-shadow: inset 0 0 14px rgba(62, 177, 248, 0.08);
+ }
+
+ .gimbal-preset-btn {
+ flex: 0 0 72px;
+ height: 38px;
+ border: 1px solid rgba(91, 208, 255, 0.26);
+ background: linear-gradient(
+ 90deg,
+ rgba(16, 74, 132, 0.96) 0%,
+ rgba(8, 38, 78, 0.98) 56%,
+ rgba(7, 26, 52, 0.98) 100%
+ );
+ color: #eefcff;
+ font-size: 12px;
+ font-weight: 700;
+ letter-spacing: 0.8px;
+ cursor: pointer;
+ box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.08),
+ 0 0 18px rgba(29, 133, 222, 0.12);
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
+
+ &:hover {
+ transform: translateY(-1px);
+ border-color: rgba(102, 235, 255, 0.72);
+ box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.12),
+ 0 0 22px rgba(52, 177, 255, 0.22);
+ }
+ }
+
.lift-control-panel {
display: flex;
flex-direction: column;
diff --git a/src/views/dashboard1/pages/AlarmManagementPage.vue b/src/views/dashboard1/pages/AlarmManagementPage.vue
index bc95d6a..84fb44a 100644
--- a/src/views/dashboard1/pages/AlarmManagementPage.vue
+++ b/src/views/dashboard1/pages/AlarmManagementPage.vue
@@ -1,13 +1,13 @@
@@ -1056,7 +1740,6 @@ onBeforeUnmount(() => {
| 设备编号 |
设备名称 |
- 所属项目 |
当前电量 |
当前状态 |
云台序列号 |
@@ -1068,7 +1751,6 @@ onBeforeUnmount(() => {
| {{ device.id }} |
{{ device.name }} |
- {{ device.project }} |
{{ device.battery }} |
{
|
- |
+ |
当前筛选条件下暂无设备数据
|
@@ -1159,45 +1841,17 @@ onBeforeUnmount(() => {
设备名称
-
-
-
+
{{ formError }}
@@ -1227,35 +1881,34 @@ onBeforeUnmount(() => {
>