diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..036c707b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "files.associations": { + "complex": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "algorithm": "cpp", + "variant": "cpp", + "string": "cpp", + "system_error": "cpp", + "fstream": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "qwidget": "cpp" + } +} \ No newline at end of file diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 00000000..b57615b2 --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,70 @@ +{ + "files.associations": { + "bitset": "cpp", + "chrono": "cpp", + "algorithm": "cpp", + "fstream": "cpp", + "deque": "cpp", + "list": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "system_error": "cpp", + "complex": "cpp", + "variant": "cpp", + "thread": "cpp", + "typeinfo": "cpp", + "qpushbutton": "cpp", + "condition_variable": "cpp", + "array": "cpp", + "string_view": "cpp", + "initializer_list": "cpp", + "utility": "cpp", + "optional": "cpp", + "istream": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "functional": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cstdint": "cpp", + "map": "cpp", + "set": "cpp", + "exception": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "random": "cpp", + "future": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "qmouseevent": "cpp", + "qpainter": "cpp", + "qdebug": "cpp", + "qcoreapplication": "cpp", + "qsqlerror": "cpp", + "qsqlquery": "cpp" + } +} \ No newline at end of file diff --git a/src/Client/BattlefieldExplorationSystem b/src/Client/BattlefieldExplorationSystem index a2e4e1e8..46d38f6f 100755 Binary files a/src/Client/BattlefieldExplorationSystem and b/src/Client/BattlefieldExplorationSystem differ diff --git a/src/Client/BattlefieldExplorationSystem.pro b/src/Client/BattlefieldExplorationSystem.pro index ec0debba..f7ebfe5b 100644 --- a/src/Client/BattlefieldExplorationSystem.pro +++ b/src/Client/BattlefieldExplorationSystem.pro @@ -24,6 +24,8 @@ SOURCES += \ src/main.cpp \ src/core/database/UAVDatabase.cpp \ src/core/database/DogDatabase.cpp \ + src/core/database/DatabaseConfig.cpp \ + src/core/database/DatabaseHelper.cpp \ src/ui/main/MainWindow.cpp \ src/ui/dialogs/DeviceDialog.cpp \ src/ui/components/DeviceCard.cpp \ @@ -36,6 +38,8 @@ SOURCES += \ HEADERS += \ include/core/database/UAVDatabase.h \ include/core/database/DogDatabase.h \ + include/core/database/DatabaseConfig.h \ + include/core/database/DatabaseHelper.h \ include/ui/main/MainWindow.h \ include/ui/dialogs/DeviceDialog.h \ include/ui/components/DeviceCard.h \ diff --git a/src/Client/config/database.ini b/src/Client/config/database.ini new file mode 100644 index 00000000..b3f305e7 --- /dev/null +++ b/src/Client/config/database.ini @@ -0,0 +1,39 @@ +# 战场探索系统数据库配置文件 +# Database Configuration for BattlefieldExplorationSystem +# +# 修改此文件中的配置后,重启应用程序生效 +# Restart the application after modifying this configuration file + +[Database] +# 数据库服务器地址 (Database server host) +host=localhost + +# 数据库端口 (Database port) +port=3306 + +# 数据库名称 (Database name) +databaseName=Client + +# 数据库用户名 (Database username) +username=root + +# 数据库密码 (Database password) +password=root + +# 连接超时时间,单位毫秒 (Connection timeout in milliseconds) +connectionTimeout=30000 + +# 数据库驱动名称 (Database driver name) +driverName=QMYSQL + +# 配置说明: +# 1. 如果你的MySQL用户名不是root,请修改username字段 +# 2. 如果你的MySQL密码不是root,请修改password字段 +# 3. 如果你的MySQL运行在不同的主机或端口,请修改host和port字段 +# 4. 如果你使用不同的数据库名称,请修改databaseName字段 +# +# Configuration Notes: +# 1. If your MySQL username is not 'root', modify the username field +# 2. If your MySQL password is not 'root', modify the password field +# 3. If your MySQL runs on different host or port, modify host and port fields +# 4. If you use different database name, modify databaseName field diff --git a/src/Client/include/ui/components/RightFunctionPanel.h b/src/Client/include/ui/components/RightFunctionPanel.h index 255dc286..0d6cff6e 100644 --- a/src/Client/include/ui/components/RightFunctionPanel.h +++ b/src/Client/include/ui/components/RightFunctionPanel.h @@ -112,6 +112,7 @@ protected: private: QString m_deviceName; ///< 设备名称 + QLabel *m_iconLabel; ///< 图标标签 QLabel *m_nameLabel; ///< 名称标签 QLabel *m_statusLabel; ///< 状态标签 bool m_isActive = false; ///< 是否选中状态 diff --git a/src/Client/src/core/database/DogDatabase.cpp b/src/Client/src/core/database/DogDatabase.cpp index c9d0238e..b3940c7a 100644 --- a/src/Client/src/core/database/DogDatabase.cpp +++ b/src/Client/src/core/database/DogDatabase.cpp @@ -1,4 +1,5 @@ #include "core/database/DogDatabase.h" +#include "core/database/DatabaseConfig.h" // 单例实例指针定义 DogDatabase *DogDatabase::m_instance = nullptr; @@ -27,7 +28,8 @@ DogDatabase::DogDatabase() //添加记录 bool DogDatabase::addDevice(const Dog &data) { - if(openDatabase("fly_land_database","root","hzk200407140238")) + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(openDatabase(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { beginAddField("dogdatabase"); addField("id"); @@ -62,8 +64,9 @@ Point DogDatabase::getDevicePosition(const QString &id) Point position; position.lon = 0; position.lat = 0; - - if(openDatabase("fly_land_database","root","hzk200407140238")) + + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(openDatabase(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { QSqlQuery query(m_sqlDatabase); @@ -99,7 +102,8 @@ Point DogDatabase::getDevicePosition(const QString &id) int DogDatabase::getDeviceState(const QString &id) { int state = -1; - if(openDatabase("fly_land_database","root","hzk200407140238")) + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(openDatabase(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { QSqlQuery query(m_sqlDatabase); diff --git a/src/Client/src/core/database/UAVDatabase.cpp b/src/Client/src/core/database/UAVDatabase.cpp index 59f30bbe..e52624e4 100644 --- a/src/Client/src/core/database/UAVDatabase.cpp +++ b/src/Client/src/core/database/UAVDatabase.cpp @@ -1,4 +1,5 @@ #include "core/database/UAVDatabase.h" +#include "core/database/DatabaseConfig.h" UAVDatabase *UAVDatabase::getInstance() { @@ -21,7 +22,8 @@ UAVDatabase::UAVDatabase() //添加记录 bool UAVDatabase::add(const UAV &data) { - if(open("fly_land_database","root","hzk200407140238")) + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(open(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { beginAddFiled("uavdatabase"); addFiled("id"); @@ -56,8 +58,9 @@ Point UAVDatabase::ReturnUAVPosition(QString id) Point position; position.lon = 0; position.lat = 0; - - if(open("fly_land_database","root","hzk200407140238")) + + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(open(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { QSqlQuery query(m_sqlDb); @@ -93,7 +96,8 @@ Point UAVDatabase::ReturnUAVPosition(QString id) int UAVDatabase::giveInfo(QString id) { int state = -1; - if(open("fly_land_database","root","hzk200407140238")) + DatabaseConnectionInfo dbInfo = DatabaseConfig::getInstance()->getConnectionInfo(); + if(open(dbInfo.databaseName, dbInfo.username, dbInfo.password)) { QSqlQuery query(m_sqlDb); diff --git a/src/Client/src/ui/components/DeviceCard.cpp b/src/Client/src/ui/components/DeviceCard.cpp index 8b4e53a0..62524214 100644 --- a/src/Client/src/ui/components/DeviceCard.cpp +++ b/src/Client/src/ui/components/DeviceCard.cpp @@ -8,6 +8,7 @@ #include "ui/components/DeviceCard.h" #include "utils/SystemLogger.h" +#include "core/database/DatabaseHelper.h" // Qt GUI头文件 #include @@ -729,12 +730,7 @@ bool DeviceCard::updateDeviceStatusInDatabase(DeviceStatus status) { // 创建唯一的数据库连接名称(包含时间戳避免重复) QString connectionName = QString("DeviceCard_%1_%2").arg(m_deviceInfo.id).arg(QDateTime::currentMSecsSinceEpoch()); - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", connectionName); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createConnection(connectionName); if (!db.open()) { qWarning() << "Failed to connect to database for device status update:" << db.lastError().text(); diff --git a/src/Client/src/ui/components/DeviceListPanel.cpp b/src/Client/src/ui/components/DeviceListPanel.cpp index 7a1d36f7..d6660932 100644 --- a/src/Client/src/ui/components/DeviceListPanel.cpp +++ b/src/Client/src/ui/components/DeviceListPanel.cpp @@ -8,6 +8,7 @@ #include "ui/components/DeviceListPanel.h" #include "utils/SystemLogger.h" +#include "core/database/DatabaseHelper.h" // Qt GUI头文件 #include @@ -474,12 +475,7 @@ QList DeviceListPanel::loadDevicesFromDatabase() qDebug() << "Attempting to connect to unified devices database..."; // 创建数据库连接 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DeviceListPanel_Connection"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("DeviceListPanel_Connection"); if (db.open()) { qDebug() << "Successfully connected to Client database"; @@ -554,12 +550,7 @@ bool DeviceListPanel::deleteDeviceFromDatabase(const QString &deviceId) qDebug() << "Attempting to delete device from database:" << deviceId; // 创建数据库连接 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DeviceListPanel_Delete_Connection"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("DeviceListPanel_Delete_Connection"); bool success = false; diff --git a/src/Client/src/ui/dialogs/DeviceDialog.cpp b/src/Client/src/ui/dialogs/DeviceDialog.cpp index c7bd330e..df8c3379 100644 --- a/src/Client/src/ui/dialogs/DeviceDialog.cpp +++ b/src/Client/src/ui/dialogs/DeviceDialog.cpp @@ -9,6 +9,7 @@ #include "ui/dialogs/DeviceDialog.h" #include "build/ui_DeviceDialog.h" #include "utils/SystemLogger.h" +#include "core/database/DatabaseHelper.h" // Qt headers #include @@ -156,12 +157,7 @@ void DeviceDialog::setDeviceInfo(const QString &deviceId, const QString &name, c void DeviceDialog::loadOperationLogs(const QString &deviceId) { // 连接数据库 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DeviceDialog_LogQuery"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("DeviceDialog_LogQuery"); if (!db.open()) { qWarning() << "Failed to connect to database for operation logs:" << db.lastError().text(); @@ -228,12 +224,7 @@ void DeviceDialog::refreshDeviceInfo() } // 连接数据库 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DeviceDialog_Refresh"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("DeviceDialog_Refresh"); if (!db.open()) { qWarning() << "Failed to connect to database for refresh:" << db.lastError().text(); @@ -573,12 +564,7 @@ void DeviceDialog::initializeOperationLogTable() void DeviceDialog::logOperation(const QString &operation, const QString &operatorName) { // 记录操作到数据库 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "DeviceDialog_LogOperation"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("DeviceDialog_LogOperation"); if (!db.open()) { qWarning() << "Failed to connect to database for logging operation:" << db.lastError().text(); diff --git a/src/Client/src/ui/main/MainWindow.cpp b/src/Client/src/ui/main/MainWindow.cpp index d3a09ec9..34bc3d9c 100644 --- a/src/Client/src/ui/main/MainWindow.cpp +++ b/src/Client/src/ui/main/MainWindow.cpp @@ -10,6 +10,7 @@ #include "build/ui_MainWindow.h" #include "ui/dialogs/DeviceDialog.h" #include "utils/SystemLogger.h" +#include "core/database/DatabaseHelper.h" // Qt GUI头文件 #include @@ -545,12 +546,7 @@ void MainWindow::onAddRobotClicked() double defaultLatitude = 39.9; // 默认纬度 // 尝试从数据库获取配置的地图中心位置 - QSqlDatabase configDb = QSqlDatabase::addDatabase("QMYSQL", "TempConnection_Config_Robot"); - configDb.setHostName("localhost"); - configDb.setPort(3306); - configDb.setDatabaseName("Client"); - configDb.setUserName("root"); - configDb.setPassword("hzk200407140238"); + QSqlDatabase configDb = DatabaseHelper::createTempConnection("TempConnection_Config_Robot"); if (configDb.open()) { QSqlQuery configQuery(configDb); @@ -582,12 +578,7 @@ void MainWindow::onAddRobotClicked() latitudeEdit->setToolTip(QString("默认地图中心纬度: %1°N").arg(defaultLatitude)); // 自动生成设备ID - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "TempConnection_DOG_ID_Add"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("TempConnection_DOG_ID_Add"); QString suggestedId = "DOG001"; if (db.open()) { @@ -736,12 +727,7 @@ void MainWindow::onAddUAVClicked() double defaultLatitude = 39.9; // 默认纬度 // 尝试从数据库获取配置的地图中心位置 - QSqlDatabase configDb = QSqlDatabase::addDatabase("QMYSQL", "TempConnection_Config"); - configDb.setHostName("localhost"); - configDb.setPort(3306); - configDb.setDatabaseName("Client"); - configDb.setUserName("root"); - configDb.setPassword("hzk200407140238"); + QSqlDatabase configDb = DatabaseHelper::createTempConnection("TempConnection_Config"); if (configDb.open()) { QSqlQuery configQuery(configDb); @@ -773,12 +759,7 @@ void MainWindow::onAddUAVClicked() latitudeEdit->setToolTip(QString("默认地图中心纬度: %1°N").arg(defaultLatitude)); // 自动生成设备ID - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "TempConnection_UAV_ID"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("TempConnection_UAV_ID"); QString suggestedId = "UAV001"; if (db.open()) { @@ -1029,12 +1010,7 @@ void MainWindow::onDeviceDetailsRequested(const QString &deviceId) qDebug() << "Device details requested for:" << deviceId; // 连接数据库获取设备详细信息 - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MainWindow_DeviceDetails"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("MainWindow_DeviceDetails"); if (!db.open()) { qWarning() << "Failed to connect to database for device details:" << db.lastError().text(); @@ -1203,12 +1179,7 @@ void MainWindow::initializeDeviceMarkersOnMap() bool MainWindow::addDeviceToDatabase(const QString &deviceId, const QString &name, const QString &type, const QString &ip, int port, int state, double longitude, double latitude) { - QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "MainWindow_AddDevice_Connection"); - db.setHostName("localhost"); - db.setPort(3306); - db.setDatabaseName("Client"); - db.setUserName("root"); - db.setPassword("hzk200407140238"); + QSqlDatabase db = DatabaseHelper::createTempConnection("MainWindow_AddDevice_Connection"); if (!db.open()) { qWarning() << "Failed to connect to database for adding device:" << db.lastError().text(); diff --git a/src/Client/verify_mysql_driver b/src/Client/verify_mysql_driver new file mode 100755 index 00000000..2049e87a Binary files /dev/null and b/src/Client/verify_mysql_driver differ