删除敌情数据库中不需要的字段

- 删除enemy_records表中的enemy_type和description字段
- 更新EnemyRecord和EnemyInfo结构体定义
- 修改所有相关的CRUD操作和查询方法
- 更新表格显示界面,去掉敌人类型列
- 修改CSV导出功能,移除冗余字段
- 简化数据结构,专注核心敌情信息
pull/8/head
123 6 days ago
parent 56101770bf
commit d0a98be624

@ -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 ;

@ -28,9 +28,7 @@ struct EnemyRecord {
double latitude; ///< 纬度坐标
QString threatLevel; ///< 威胁等级 (高/中/低)
QDateTime discoveryTime; ///< 发现时间
QString enemyType; ///< 敌人类型
QString status; ///< 状态 (活跃/失联/已消除)
QString description; ///< 描述信息
QDateTime updateTime; ///< 最后更新时间
};

@ -37,7 +37,6 @@ struct EnemyInfo {
double latitude; ///< 纬度坐标
QString threatLevel; ///< 威胁等级
QDateTime discoveryTime; ///< 发现时间
QString enemyType; ///< 敌人类型
QString status; ///< 状态
};

@ -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)) {

@ -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;
}

@ -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;
}

Loading…
Cancel
Save