From d0a98be62496e41c49f550aa05013c41d5056e6c Mon Sep 17 00:00:00 2001 From: 123 <123@example.com> Date: Tue, 8 Jul 2025 11:24:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=95=8C=E6=83=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E4=B8=AD=E4=B8=8D=E9=9C=80=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除enemy_records表中的enemy_type和description字段 - 更新EnemyRecord和EnemyInfo结构体定义 - 修改所有相关的CRUD操作和查询方法 - 更新表格显示界面,去掉敌人类型列 - 修改CSV导出功能,移除冗余字段 - 简化数据结构,专注核心敌情信息 --- src/Client/database/remove_enemy_columns.sql | 81 +++++++++++++++++++ .../include/core/database/EnemyDatabase.h | 2 - .../include/ui/dialogs/EnemyStatsDialog.h | 1 - .../src/core/database/DatabaseHelper.cpp | 39 +++------ .../src/core/database/EnemyDatabase.cpp | 12 +-- .../src/ui/dialogs/EnemyStatsDialog.cpp | 29 ++----- 6 files changed, 102 insertions(+), 62 deletions(-) create mode 100644 src/Client/database/remove_enemy_columns.sql diff --git a/src/Client/database/remove_enemy_columns.sql b/src/Client/database/remove_enemy_columns.sql new file mode 100644 index 00000000..47d20fa8 --- /dev/null +++ b/src/Client/database/remove_enemy_columns.sql @@ -0,0 +1,81 @@ +-- 删除敌情表中不需要的字段 +-- Remove unnecessary columns from enemy table +-- +-- 删除 enemy_type 和 description 字段 +-- Remove enemy_type and description columns +-- +-- 使用方法:在MySQL中执行此脚本 +-- Usage: Execute this script in MySQL + +USE Client; + +-- 1. 首先备份当前数据(可选) +-- First backup current data (optional) +SELECT '开始修改敌情表结构' as 状态, NOW() as 时间; + +-- 2. 显示修改前的表结构 +-- Show table structure before modification +SELECT '修改前的表结构' as 信息; +DESCRIBE enemy_records; + +-- 3. 显示修改前的数据示例 +-- Show data sample before modification +SELECT '修改前的数据示例' as 信息; +SELECT id, enemy_type, description, threat_level, status +FROM enemy_records +LIMIT 5; + +-- 4. 删除 enemy_type 字段 +-- Remove enemy_type column +ALTER TABLE enemy_records DROP COLUMN enemy_type; + +-- 5. 删除 description 字段 +-- Remove description column +ALTER TABLE enemy_records DROP COLUMN description; + +-- 6. 显示修改后的表结构 +-- Show table structure after modification +SELECT '修改后的表结构' as 信息; +DESCRIBE enemy_records; + +-- 7. 验证数据完整性 +-- Verify data integrity +SELECT + '数据完整性检查' as 检查类型, + COUNT(*) as 总记录数, + COUNT(CASE WHEN id IS NULL OR id = '' THEN 1 END) as 空ID数量, + COUNT(CASE WHEN longitude IS NULL THEN 1 END) as 空经度数量, + COUNT(CASE WHEN latitude IS NULL THEN 1 END) as 空纬度数量, + COUNT(CASE WHEN threat_level IS NULL OR threat_level = '' THEN 1 END) as 空威胁等级数量, + COUNT(CASE WHEN discovery_time IS NULL THEN 1 END) as 空发现时间数量 +FROM enemy_records; + +-- 8. 显示修改后的数据统计 +-- Show data statistics after modification +SELECT + '修改后数据统计' as 统计类型, + COUNT(*) as 总记录数, + COUNT(CASE WHEN threat_level = '高' THEN 1 END) as 高威胁数量, + COUNT(CASE WHEN threat_level = '中' THEN 1 END) as 中威胁数量, + COUNT(CASE WHEN threat_level = '低' THEN 1 END) as 低威胁数量, + COUNT(CASE WHEN status = '活跃' THEN 1 END) as 活跃状态, + COUNT(CASE WHEN status = '失联' THEN 1 END) as 失联状态, + COUNT(CASE WHEN status = '已消除' THEN 1 END) as 已消除状态 +FROM enemy_records; + +-- 9. 显示修改后的数据示例 +-- Show data sample after modification +SELECT '修改后的数据示例' as 信息; +SELECT id, longitude, latitude, threat_level, discovery_time, status, update_time +FROM enemy_records +ORDER BY discovery_time DESC +LIMIT 10; + +-- 10. 检查索引是否需要调整 +-- Check if indexes need adjustment +SELECT '当前索引信息' as 信息; +SHOW INDEXES FROM enemy_records; + +SELECT + '敌情表字段删除完成!' as 状态, + NOW() as 完成时间; \ No newline at end of file diff --git a/src/Client/include/core/database/EnemyDatabase.h b/src/Client/include/core/database/EnemyDatabase.h index c33fd013..0ff313b4 100644 --- a/src/Client/include/core/database/EnemyDatabase.h +++ b/src/Client/include/core/database/EnemyDatabase.h @@ -28,9 +28,7 @@ struct EnemyRecord { double latitude; ///< 纬度坐标 QString threatLevel; ///< 威胁等级 (高/中/低) QDateTime discoveryTime; ///< 发现时间 - QString enemyType; ///< 敌人类型 QString status; ///< 状态 (活跃/失联/已消除) - QString description; ///< 描述信息 QDateTime updateTime; ///< 最后更新时间 }; diff --git a/src/Client/include/ui/dialogs/EnemyStatsDialog.h b/src/Client/include/ui/dialogs/EnemyStatsDialog.h index a11edd2e..588859bb 100644 --- a/src/Client/include/ui/dialogs/EnemyStatsDialog.h +++ b/src/Client/include/ui/dialogs/EnemyStatsDialog.h @@ -37,7 +37,6 @@ struct EnemyInfo { double latitude; ///< 纬度坐标 QString threatLevel; ///< 威胁等级 QDateTime discoveryTime; ///< 发现时间 - QString enemyType; ///< 敌人类型 QString status; ///< 状态 }; diff --git a/src/Client/src/core/database/DatabaseHelper.cpp b/src/Client/src/core/database/DatabaseHelper.cpp index 253e5771..f8c68882 100644 --- a/src/Client/src/core/database/DatabaseHelper.cpp +++ b/src/Client/src/core/database/DatabaseHelper.cpp @@ -358,16 +358,13 @@ bool DatabaseHelper::createEnemyRecordsTable(QSqlDatabase& db) latitude DOUBLE NOT NULL COMMENT '纬度坐标', threat_level VARCHAR(20) NOT NULL COMMENT '威胁等级:高/中/低', discovery_time DATETIME NOT NULL COMMENT '发现时间', - enemy_type VARCHAR(50) COMMENT '敌人类型:装甲车/步兵/坦克/侦察兵等', status VARCHAR(20) DEFAULT '活跃' COMMENT '状态:活跃/失联/已消除', - description TEXT COMMENT '描述信息', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间', INDEX idx_threat_level (threat_level), INDEX idx_status (status), INDEX idx_discovery_time (discovery_time), - INDEX idx_location (longitude, latitude), - INDEX idx_enemy_type (enemy_type) + INDEX idx_location (longitude, latitude) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='敌情记录表' )"; @@ -379,32 +376,16 @@ bool DatabaseHelper::createEnemyRecordsTable(QSqlDatabase& db) // 插入测试数据 QString insertTestData = R"( INSERT IGNORE INTO enemy_records ( - id, longitude, latitude, threat_level, discovery_time, - enemy_type, status, description + id, longitude, latitude, threat_level, discovery_time, status ) VALUES - ('ENEMY001', 116.4074, 39.9042, '高', '2025-07-08 08:30:00', - '装甲车', '活跃', '在北京市朝阳区发现的重型装甲车,配备主炮'), - - ('ENEMY002', 116.3912, 39.9139, '中', '2025-07-08 09:15:00', - '步兵', '活跃', '武装步兵小队,约5-8人,携带轻武器'), - - ('ENEMY003', 116.4231, 39.8876, '低', '2025-07-08 07:45:00', - '侦察兵', '失联', '单独行动的侦察兵,最后位置在CBD区域'), - - ('ENEMY004', 116.3845, 39.9254, '高', '2025-07-08 10:20:00', - '坦克', '活跃', '主战坦克,型号不明,具有强大火力'), - - ('ENEMY005', 116.4156, 39.9087, '中', '2025-07-08 11:00:00', - '装甲运兵车', '活跃', '运输型装甲车,可能载有多名士兵'), - - ('ENEMY006', 116.3978, 39.8945, '低', '2025-07-08 06:30:00', - '侦察无人机', '已消除', '小型侦察无人机,已被击落'), - - ('ENEMY007', 116.4298, 39.9178, '高', '2025-07-08 12:15:00', - '自行火炮', '活跃', '远程火炮系统,射程覆盖大片区域'), - - ('ENEMY008', 116.3756, 39.9034, '中', '2025-07-08 13:45:00', - '武装皮卡', '失联', '改装的武装皮卡车,机动性强') + ('ENEMY001', 116.4074, 39.9042, '高', '2025-07-08 08:30:00', '活跃'), + ('ENEMY002', 116.3912, 39.9139, '中', '2025-07-08 09:15:00', '活跃'), + ('ENEMY003', 116.4231, 39.8876, '低', '2025-07-08 07:45:00', '失联'), + ('ENEMY004', 116.3845, 39.9254, '高', '2025-07-08 10:20:00', '活跃'), + ('ENEMY005', 116.4156, 39.9087, '中', '2025-07-08 11:00:00', '活跃'), + ('ENEMY006', 116.3978, 39.8945, '低', '2025-07-08 06:30:00', '已消除'), + ('ENEMY007', 116.4298, 39.9178, '高', '2025-07-08 12:15:00', '活跃'), + ('ENEMY008', 116.3756, 39.9034, '中', '2025-07-08 13:45:00', '失联') )"; if (!query.exec(insertTestData)) { diff --git a/src/Client/src/core/database/EnemyDatabase.cpp b/src/Client/src/core/database/EnemyDatabase.cpp index f15b0ea0..980c61e6 100644 --- a/src/Client/src/core/database/EnemyDatabase.cpp +++ b/src/Client/src/core/database/EnemyDatabase.cpp @@ -121,8 +121,8 @@ bool EnemyDatabase::addEnemyRecord(const EnemyRecord &record) QSqlQuery query(db); QString insertSQL = R"( INSERT INTO enemy_records - (id, longitude, latitude, threat_level, discovery_time, enemy_type, status, description, update_time) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) + (id, longitude, latitude, threat_level, discovery_time, status, update_time) + VALUES (?, ?, ?, ?, ?, ?, ?) )"; query.prepare(insertSQL); @@ -131,9 +131,7 @@ bool EnemyDatabase::addEnemyRecord(const EnemyRecord &record) query.addBindValue(record.latitude); query.addBindValue(record.threatLevel); query.addBindValue(record.discoveryTime); - query.addBindValue(record.enemyType); query.addBindValue(record.status); - query.addBindValue(record.description); query.addBindValue(QDateTime::currentDateTime()); bool success = executeQuery(query, "添加敌情记录"); @@ -158,7 +156,7 @@ bool EnemyDatabase::updateEnemyRecord(const EnemyRecord &record) QString updateSQL = R"( UPDATE enemy_records SET longitude = ?, latitude = ?, threat_level = ?, discovery_time = ?, - enemy_type = ?, status = ?, description = ?, update_time = ? + status = ?, update_time = ? WHERE id = ? )"; @@ -167,9 +165,7 @@ bool EnemyDatabase::updateEnemyRecord(const EnemyRecord &record) query.addBindValue(record.latitude); query.addBindValue(record.threatLevel); query.addBindValue(record.discoveryTime); - query.addBindValue(record.enemyType); query.addBindValue(record.status); - query.addBindValue(record.description); query.addBindValue(QDateTime::currentDateTime()); query.addBindValue(record.id); @@ -422,9 +418,7 @@ EnemyRecord EnemyDatabase::queryToRecord(const QSqlQuery &query) record.latitude = query.value("latitude").toDouble(); record.threatLevel = query.value("threat_level").toString(); record.discoveryTime = query.value("discovery_time").toDateTime(); - record.enemyType = query.value("enemy_type").toString(); record.status = query.value("status").toString(); - record.description = query.value("description").toString(); record.updateTime = query.value("update_time").toDateTime(); return record; } diff --git a/src/Client/src/ui/dialogs/EnemyStatsDialog.cpp b/src/Client/src/ui/dialogs/EnemyStatsDialog.cpp index cda44829..75406a01 100644 --- a/src/Client/src/ui/dialogs/EnemyStatsDialog.cpp +++ b/src/Client/src/ui/dialogs/EnemyStatsDialog.cpp @@ -110,12 +110,12 @@ void EnemyStatsDialog::setupTable() QVBoxLayout *tableLayout = new QVBoxLayout(m_tableGroup); tableLayout->setContentsMargins(15, 20, 15, 15); - m_enemyTable = new QTableWidget(0, 7, this); + m_enemyTable = new QTableWidget(0, 6, this); m_enemyTable->setObjectName("EnemyTable"); // 设置表头 QStringList headers; - headers << "敌人ID" << "坐标位置" << "威胁等级" << "发现时间" << "敌人类型" << "状态" << "操作"; + headers << "敌人ID" << "坐标位置" << "威胁等级" << "发现时间" << "状态" << "操作"; m_enemyTable->setHorizontalHeaderLabels(headers); // 设置表格属性 @@ -130,9 +130,8 @@ void EnemyStatsDialog::setupTable() m_enemyTable->setColumnWidth(1, 180); // 坐标位置 m_enemyTable->setColumnWidth(2, 100); // 威胁等级 m_enemyTable->setColumnWidth(3, 150); // 发现时间 - m_enemyTable->setColumnWidth(4, 120); // 敌人类型 - m_enemyTable->setColumnWidth(5, 100); // 状态 - m_enemyTable->setColumnWidth(6, 120); // 操作 + m_enemyTable->setColumnWidth(4, 100); // 状态 + m_enemyTable->setColumnWidth(5, 120); // 操作 // 设置表头样式 m_enemyTable->horizontalHeader()->setStretchLastSection(false); @@ -360,7 +359,6 @@ void EnemyStatsDialog::loadTestData() enemy1.latitude = 39.9042; enemy1.threatLevel = "高"; enemy1.discoveryTime = QDateTime::currentDateTime().addSecs(-3600); - enemy1.enemyType = "装甲车"; enemy1.status = "活跃"; addEnemyInfo(enemy1); @@ -370,7 +368,6 @@ void EnemyStatsDialog::loadTestData() enemy2.latitude = 39.9139; enemy2.threatLevel = "中"; enemy2.discoveryTime = QDateTime::currentDateTime().addSecs(-1800); - enemy2.enemyType = "步兵"; enemy2.status = "活跃"; addEnemyInfo(enemy2); @@ -380,7 +377,6 @@ void EnemyStatsDialog::loadTestData() enemy3.latitude = 39.8876; enemy3.threatLevel = "低"; enemy3.discoveryTime = QDateTime::currentDateTime().addSecs(-900); - enemy3.enemyType = "侦察兵"; enemy3.status = "失联"; addEnemyInfo(enemy3); @@ -390,7 +386,6 @@ void EnemyStatsDialog::loadTestData() enemy4.latitude = 39.9254; enemy4.threatLevel = "高"; enemy4.discoveryTime = QDateTime::currentDateTime().addSecs(-300); - enemy4.enemyType = "坦克"; enemy4.status = "活跃"; addEnemyInfo(enemy4); @@ -428,11 +423,6 @@ void EnemyStatsDialog::addEnemyInfo(const EnemyInfo &enemy) timeItem->setTextAlignment(Qt::AlignCenter); m_enemyTable->setItem(row, 3, timeItem); - // 敌人类型 - QTableWidgetItem *typeItem = new QTableWidgetItem(enemy.enemyType); - typeItem->setTextAlignment(Qt::AlignCenter); - m_enemyTable->setItem(row, 4, typeItem); - // 状态 QTableWidgetItem *statusItem = new QTableWidgetItem(enemy.status); statusItem->setTextAlignment(Qt::AlignCenter); @@ -443,7 +433,7 @@ void EnemyStatsDialog::addEnemyInfo(const EnemyInfo &enemy) } else { statusItem->setForeground(QColor("#ffa502")); } - m_enemyTable->setItem(row, 5, statusItem); + m_enemyTable->setItem(row, 4, statusItem); // 操作按钮 QPushButton *deleteBtn = new QPushButton("🗑️ 删除"); @@ -464,7 +454,7 @@ void EnemyStatsDialog::addEnemyInfo(const EnemyInfo &enemy) connect(deleteBtn, &QPushButton::clicked, [this, enemy]() { removeEnemyInfo(enemy.id); }); - m_enemyTable->setCellWidget(row, 6, deleteBtn); + m_enemyTable->setCellWidget(row, 5, deleteBtn); } void EnemyStatsDialog::updateEnemyInfo(const QString &id, const EnemyInfo &enemy) @@ -480,8 +470,7 @@ void EnemyStatsDialog::updateEnemyInfo(const QString &id, const EnemyInfo &enemy m_enemyTable->item(row, 2)->setText(enemy.threatLevel); m_enemyTable->item(row, 2)->setBackground(getThreatLevelColor(enemy.threatLevel)); m_enemyTable->item(row, 3)->setText(enemy.discoveryTime.toString("yyyy-MM-dd hh:mm:ss")); - m_enemyTable->item(row, 4)->setText(enemy.enemyType); - m_enemyTable->item(row, 5)->setText(enemy.status); + m_enemyTable->item(row, 4)->setText(enemy.status); break; } } @@ -572,7 +561,7 @@ void EnemyStatsDialog::onExportData() out.setCodec("UTF-8"); // 写入CSV头部 - out << "敌人ID,经度,纬度,威胁等级,发现时间,敌人类型,状态\n"; + out << "敌人ID,经度,纬度,威胁等级,发现时间,状态\n"; // 写入数据 for (const auto &enemy : m_enemyList) { @@ -581,7 +570,6 @@ void EnemyStatsDialog::onExportData() << QString::number(enemy.latitude, 'f', 6) << "," << enemy.threatLevel << "," << enemy.discoveryTime.toString("yyyy-MM-dd hh:mm:ss") << "," - << enemy.enemyType << "," << enemy.status << "\n"; } @@ -694,7 +682,6 @@ EnemyInfo EnemyStatsDialog::recordToInfo(const EnemyRecord &record) info.latitude = record.latitude; info.threatLevel = record.threatLevel; info.discoveryTime = record.discoveryTime; - info.enemyType = record.enemyType; info.status = record.status; return info; }