From 8a7da61fc914ee49d973daf4d649dc183a02ef23 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Fri, 09 Jan 2026 10:16:23 +0800
Subject: [PATCH] feat:退出登录跳转地址跳转,样式微调

---
 applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue |  285 ++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 174 insertions(+), 111 deletions(-)

diff --git a/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue b/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
index 828427c..c9b0954 100644
--- a/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/DeviceHistoryDialog.vue
@@ -1,67 +1,94 @@
 <template>
 	<el-dialog
-		class="ztzf-dialog-mange data-cockpit-history-dialog"
+		class="ztzf-data-cockpit-dialog"
 		append-to-body
 		v-model="visibleModel"
 		:title="dialogTitle"
-		width="1100px"
 		:close-on-click-modal="false"
 		:destroy-on-close="true"
 	>
 		<div class="dialog-body">
-			<div class="device-summary">
-				<div class="item">
-					<span class="label">设备名称</span>
-					<span class="value">{{ device?.name || '反制设备名称' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">类型</span>
-					<span class="value">{{ device?.type || '-' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">厂商</span>
-					<span class="value">{{ device?.vendor || '-' }}</span>
-				</div>
-				<div class="item">
-					<span class="label">状态</span>
-					<span class="value">{{ device?.statusText || '-' }}</span>
-				</div>
-			</div>
+			<el-form ref="queryParamsRef" :model="searchParams" class="history-search">
+				<el-row :gutter="12">
+					<el-col :span="5">
+						<el-form-item label="关键字" prop="keyword">
+							<el-input v-model="searchParams.keyword" placeholder="名称/序列号" clearable @clear="handleSearch" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="5">
+						<el-form-item label="日期" prop="dateRange">
+							<el-date-picker
+								v-model="searchParams.dateRange"
+								type="daterange"
+								range-separator="至"
+								start-placeholder="开始日期"
+								end-placeholder="结束日期"
+								value-format="YYYY/MM/DD"
+								@change="handleSearch"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="5">
+						<el-form-item label="区域" prop="area">
+							<el-tree-select
+								v-model="searchParams.area"
+								:data="areaTree"
+								:props="areaTreeProps"
+								node-key="value"
+								check-strictly
+								clearable
+								placeholder="请选择"
+								@change="handleSearch"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="5">
+						<el-form-item label="无人机类型" prop="droneType">
+							<el-select
+								v-model="searchParams.droneType"
+								placeholder="请选择"
+								clearable
+								@change="handleSearch"
+							>
+								<el-option v-for="item in droneTypeOptions" :key="item" :label="item" :value="item" />
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="4" class="history-search-actions">
+						<el-form-item>
+							<el-button @click="resetForm">重置</el-button>
+							<el-button type="primary" @click="handleSearch">查询</el-button>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
 
-			<div class="table">
-				<div class="thead">
-					<div class="cell index">序号</div>
-					<div class="cell">无人机名称</div>
-					<div class="cell">无人机序列号</div>
-					<div class="cell">无人机类型</div>
-					<div class="cell">区域</div>
-					<div class="cell">数据来源</div>
-					<div class="cell">信号频段</div>
-					<div class="cell">发现时间</div>
-					<div class="cell">停留时间</div>
-					<div class="cell">反制方式</div>
-				</div>
-				<div class="tbody">
-					<div class="tr" v-for="(row, index) in historyList" :key="row.id">
-						<div class="cell index">{{ index + 1 }}</div>
-						<div class="cell">{{ row.droneName }}</div>
-						<div class="cell">{{ row.serialNumber }}</div>
-						<div class="cell">{{ row.droneType }}</div>
-						<div class="cell">{{ row.area }}</div>
-						<div class="cell">{{ row.dataSource }}</div>
-						<div class="cell">{{ row.frequency }}</div>
-						<div class="cell">{{ row.discoveredAt }}</div>
-						<div class="cell">{{ row.stayTime }}</div>
-						<div class="cell">{{ row.counterMethod }}</div>
-					</div>
-				</div>
+			<el-table v-loading="loading" :data="pagedList" height="360" class="history-table">
+				<el-table-column type="index" width="60" label="序号" />
+				<el-table-column prop="droneName" label="无人机名称" min-width="120" />
+				<el-table-column prop="serialNumber" label="无人机序列号" min-width="140" />
+				<el-table-column prop="droneType" label="无人机类型" min-width="110" />
+				<el-table-column prop="area" label="区域" min-width="90" />
+				<el-table-column prop="dataSource" label="数据来源" min-width="110" />
+				<el-table-column prop="frequency" label="信号频段" min-width="100" />
+				<el-table-column prop="discoveredAt" label="发现时间" min-width="150" />
+				<el-table-column prop="stayTime" label="停留时间" min-width="110" />
+				<el-table-column prop="counterMethod" label="反制方式" min-width="110" />
+			</el-table>
+
+			<div class="history-pagination">
+				<el-pagination
+					v-model:current-page="searchParams.current"
+					v-model:page-size="searchParams.size"
+					:total="total"
+				/>
 			</div>
 		</div>
 	</el-dialog>
 </template>
 
 <script setup>
-import { computed } from 'vue'
+import { computed, ref } from 'vue'
 
 const props = defineProps({
 	modelValue: {
@@ -84,6 +111,36 @@
 const dialogTitle = computed(() => {
 	return `反制设备名称 ${props.device?.name || ''}`.trim()
 })
+
+const initSearchParams = () => ({
+	keyword: '',
+	dateRange: [],
+	area: '',
+	droneType: '',
+	current: 1,
+	size: 6
+})
+const searchParams = ref(initSearchParams())
+const queryParamsRef = ref(null)
+const loading = ref(false)
+const areaTree = ref([
+	{
+		label: '古村区',
+		value: '古村区'
+	},
+	{
+		label: '新区',
+		value: '新区'
+	},
+	{
+		label: '产业园',
+		value: '产业园'
+	}
+])
+const areaTreeProps = {
+	label: 'label',
+	children: 'children'
+}
 
 const historyList = computed(() => {
 	const dataSource = props.device?.name || '侦测反制设备名称'
@@ -162,6 +219,50 @@
 		}
 	]
 })
+
+const droneTypeOptions = computed(() => {
+	const types = historyList.value.map((item) => item.droneType).filter(Boolean)
+	return Array.from(new Set(types))
+})
+
+const filteredList = computed(() => {
+	const { keyword, dateRange, area, droneType } = searchParams.value
+	const [startDate, endDate] = dateRange || []
+	return historyList.value.filter((item) => {
+		const keywordMatch =
+			!keyword || item.droneName.includes(keyword) || item.serialNumber.includes(keyword)
+		const typeMatch = !droneType || item.droneType === droneType
+		const areaMatch = !area || item.area.includes(area)
+		const dateMatch =
+			!startDate || !endDate || isWithinDateRange(item.discoveredAt, startDate, endDate)
+		return keywordMatch && typeMatch && areaMatch && dateMatch
+	})
+})
+
+const total = computed(() => filteredList.value.length)
+
+const pagedList = computed(() => {
+	const { current, size } = searchParams.value
+	const start = (current - 1) * size
+	return filteredList.value.slice(start, start + size)
+})
+
+function handleSearch() {
+	searchParams.value.current = 1
+}
+
+function resetForm() {
+	queryParamsRef.value?.resetFields()
+	searchParams.value.current = 1
+}
+
+function isWithinDateRange(value, start, end) {
+	const dateValue = new Date(value)
+	const startDate = new Date(`${start} 00:00:00`)
+	const endDate = new Date(`${end} 23:59:59`)
+	return dateValue >= startDate && dateValue <= endDate
+}
+
 </script>
 
 <style lang="scss" scoped>
@@ -172,74 +273,36 @@
 	color: #C3C3DD;
 }
 
-.device-summary {
-	display: flex;
-	flex-wrap: wrap;
-	gap: 16px 24px;
-
-	.item {
-		display: flex;
-		align-items: center;
-		gap: 8px;
-		font-size: 14px;
-
-		.label {
-			color: #8B8BA7;
-		}
-
-		.value {
-			color: #FFFFFF;
-		}
-	}
-}
-
-.table {
-	border: 1px solid rgba(255, 255, 255, 0.1);
-	border-radius: 6px;
-	overflow: hidden;
-}
-
-.thead,
-.tr {
-	display: grid;
-	grid-template-columns: 60px 1.1fr 1.1fr 0.9fr 0.8fr 1.2fr 0.9fr 1.3fr 0.9fr 0.9fr;
-	align-items: center;
-}
-
-.thead {
-	background: rgba(20, 24, 48, 0.9);
-	color: #FFFFFF;
-	font-size: 13px;
-	height: 42px;
-	border-bottom: 1px solid rgba(255, 255, 255, 0.08);
-}
-
-.tbody {
-	max-height: 360px;
-	overflow-y: auto;
+.history-search {
+	padding: 8px 12px 4px;
 	background: rgba(10, 14, 34, 0.6);
+	border: 1px solid rgba(255, 255, 255, 0.08);
+	border-radius: 6px;
 }
 
-.tr {
-	font-size: 12px;
-	color: #C3C3DD;
-	height: 40px;
-	border-bottom: 1px solid rgba(255, 255, 255, 0.05);
-
-	&:nth-child(2n) {
-		background: rgba(255, 255, 255, 0.02);
-	}
+.history-search :deep(.el-date-editor),
+.history-search :deep(.el-select),
+.history-search :deep(.el-tree-select) {
+	width: 100%;
 }
 
-.cell {
-	padding: 0 10px;
-	white-space: nowrap;
-	overflow: hidden;
-	text-overflow: ellipsis;
+.history-search-actions :deep(.el-form-item__content) {
+	justify-content: flex-end;
+	gap: 8px;
+}
 
-	&.index {
-		text-align: center;
-		color: #86909C;
-	}
+.history-table {
+	margin-top: 8px;
+	--el-table-border-color: rgba(255, 255, 255, 0.08);
+	--el-table-header-bg-color: rgba(20, 24, 48, 0.9);
+	--el-table-row-hover-bg-color: rgba(255, 255, 255, 0.03);
+	--el-table-text-color: #C3C3DD;
+	--el-table-header-text-color: #FFFFFF;
+}
+
+.history-pagination {
+	display: flex;
+	justify-content: flex-end;
+	padding-top: 8px;
 }
 </style>

--
Gitblit v1.9.3