| SourceCode/Bond/Servo/Servo.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/Servo.rc | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/ServoDlg.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/SystemLogManager.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/SystemLogManager.h | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| SourceCode/Bond/Servo/UserManager.cpp | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
SourceCode/Bond/Servo/Servo.cpp
@@ -9,6 +9,8 @@ #include "AlarmManager.h" #include "SECSRuntimeManager.h" #include "TransferManager.h" #include "SystemLogManager.h" #include "UserManager.h" #include "VerticalLine.h" #include "HorizontalLine.h" #include "EqsGraphWnd.h" @@ -162,6 +164,37 @@ return FALSE; } // 初始化运行日志管理库 try { if (!SystemLogManager::getInstance().initializeLogTable()) { AfxMessageBox("初始化运行日志管理库失败!"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化运行日志管理库失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // 初始化用户管理库 try { UserManager& userManager = UserManager::getInstance(); #if !defined(_DEBUG) userManager.initializeIdleDetection(AfxGetMainWnd()->m_hWnd); SetTimer(1, 60000, nullptr); #endif userManager.loadSession(); } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化用户管理库失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } CServoDlg dlg; m_pMainWnd = &dlg; SourceCode/Bond/Servo/Servo.rcBinary files differ
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -15,6 +15,12 @@ #include "HmTab.h" #include "CRobotCmdContainerDlg.h" #include "CRobotCmdTestDlg.h" #include "LoginDlg.h" #include "ChangePasswordDlg.h" #include "UserManagerDlg.h" #include "SystemLogManagerDlg.h" #include "UserManager.h" #include "SystemLogManager.h" #ifdef _DEBUG @@ -347,6 +353,12 @@ // 初始化master以后需要控件绑定数据 m_pPageGraph1->BindEquipmentToGraph(); // 更新登录状态 UpdateLoginStatus(); //SystemLogManager::getInstance.log(SystemLogManager::LogType::Info, _T("BondEq启动...")); //SystemLogManager::getInstance. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE @@ -806,6 +818,39 @@ } } void CServoDlg::UpdateLoginStatus() { HMENU hMenu = m_pTopToolbar->GetOperatorMenu(); UserManager& userManager = UserManager::getInstance(); if (userManager.isLoggedIn()) { ::EnableMenuItem(hMenu, ID_OPEATOR_LOGIN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); ::EnableMenuItem(hMenu, ID_OPERATOR_CHANGE_PASSWORD, MF_BYCOMMAND | MF_ENABLED); ::EnableMenuItem(hMenu, ID_OPERATOR_SYSTEM_LOG, MF_BYCOMMAND | MF_ENABLED); ::EnableMenuItem(hMenu, ID_OPEATOR_SWITCH, MF_BYCOMMAND | MF_ENABLED); ::EnableMenuItem(hMenu, ID_OPERATOR_LOGOUT, MF_BYCOMMAND | MF_ENABLED); if (userManager.getCurrentUserRole() == UserRole::SuperAdmin) { ::EnableMenuItem(hMenu, ID_OPEATOR_USER_MANAGER, MF_BYCOMMAND | MF_ENABLED); } else { ::EnableMenuItem(hMenu, ID_OPEATOR_USER_MANAGER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } m_pTopToolbar->SetOperatorBtnText(userManager.getCurrentUser().c_str()); } else { ::EnableMenuItem(hMenu, ID_OPEATOR_LOGIN, MF_BYCOMMAND | MF_ENABLED); ::EnableMenuItem(hMenu, ID_OPERATOR_CHANGE_PASSWORD, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); ::EnableMenuItem(hMenu, ID_OPEATOR_USER_MANAGER, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); ::EnableMenuItem(hMenu, ID_OPERATOR_SYSTEM_LOG, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); ::EnableMenuItem(hMenu, ID_OPEATOR_SWITCH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); ::EnableMenuItem(hMenu, ID_OPERATOR_LOGOUT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); m_pTopToolbar->SetOperatorBtnText(_T("未登录")); } } LRESULT CServoDlg::OnToolbarBtnClicked(WPARAM wParam, LPARAM lParam) { int id = (int)lParam; @@ -823,6 +868,58 @@ dlg.SetEFEM(pEFEM); dlg.DoModal(); } else if (id == IDC_BUTTON_OPERATOR) { int menuId = (int)wParam; SystemLogManager& logManager = SystemLogManager::getInstance(); UserManager& userManager = UserManager::getInstance(); if (menuId == 0) { CLoginDlg loginDlg; loginDlg.DoModal(); } else if (1 == menuId) { CChangePasswordDlg changePasswordDlg; changePasswordDlg.DoModal(); } else if (2 == menuId) { CUserManagerDlg dlg; if (dlg.DoModal() != IDOK) { logManager.log(SystemLogManager::LogType::Operation, _T("用户管理的预操作被取消!")); } } else if (3 == menuId) { CSystemLogManagerDlg dlg; dlg.DoModal(); } else if (4 == menuId) { int ret = AfxMessageBox(_T("是否切换用户?切换用户会退出当前账号!"), MB_OKCANCEL | MB_ICONEXCLAMATION); if (ret != IDOK) { return 0; } logManager.log(SystemLogManager::LogType::Operation, _T("确认切换角色!")); if (userManager.isLoggedIn()) { logManager.log(SystemLogManager::LogType::Info, _T("退出登录!")); userManager.logout(); } CLoginDlg loginDlg; loginDlg.DoModal(); } else { CString cstrMessage; cstrMessage.Format(_T("是否退出用户 [%s]?"), userManager.getCurrentUser().c_str()); int ret = AfxMessageBox(_T(cstrMessage), MB_OKCANCEL | MB_ICONEXCLAMATION); if (ret != IDOK) { return 0; } logManager.log(SystemLogManager::LogType::Info, _T("退出登录!")); userManager.logout(); } UpdateLoginStatus(); } return 0; } SourceCode/Bond/Servo/ServoDlg.h
@@ -34,6 +34,7 @@ void InitRxWindows(); void Resize(); void ShowChildPage(int index); void UpdateLoginStatus(); CString& GetRuntimeFormatText(CString& strText, const char* pszSuffix); private: SourceCode/Bond/Servo/SystemLogManager.cpp
@@ -16,25 +16,40 @@ } // 构造函数 SystemLogManager::SystemLogManager() : m_pDB(nullptr) {} SystemLogManager::SystemLogManager() : m_pDB(nullptr) { m_pDB = new BL::SQLiteDatabase(); } // 析构函数 SystemLogManager::~SystemLogManager() { m_pDB = nullptr; // 清除指针引用 if (m_pDB) { delete m_pDB; m_pDB = nullptr; } // 设置数据库连接 void SystemLogManager::setDatabase(BL::Database* db) { std::lock_guard<std::mutex> lock(m_mutex); m_pDB = db; } // 初始化日志表 bool SystemLogManager::initializeLogTable() { if (!m_pDB) { throw std::runtime_error("Database connection is not set."); // 获取可执行文件路径 char szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, MAX_PATH); std::string exePath(szPath); std::string dbDir = exePath.substr(0, exePath.find_last_of("\\/")) + "\\DB"; // 创建 DB 目录 if (!CreateDirectory(dbDir.c_str(), NULL) && GetLastError() != ERROR_ALREADY_EXISTS) { throw std::runtime_error("创建数据库目录失败"); } // 构造数据库路径 std::string dbPath = dbDir + "\\SystemLog.db"; // 连接数据库 if (!m_pDB->connect(dbPath, true)) { throw std::runtime_error("连接日志数据库失败"); } // 创建日志表 SQL 语句 const std::string createTableQuery = R"( CREATE TABLE IF NOT EXISTS system_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, SourceCode/Bond/Servo/SystemLogManager.h
@@ -20,9 +20,6 @@ // 获取单例实例 static SystemLogManager& getInstance(); // 设置数据库连接 void setDatabase(BL::Database* db); // 初始化日志表 bool initializeLogTable(); SourceCode/Bond/Servo/UserManager.cpp
@@ -157,18 +157,18 @@ // 获取程序路径下的config文件夹路径 std::string UserManager::getConfigFolderPath() { char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); std::string exePath = std::string(path).substr(0, std::string(path).find_last_of("\\/")); std::string configPath = exePath + "\\Config\\"; char szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, MAX_PATH); std::string exePath(szPath); std::string dbDir = exePath.substr(0, exePath.find_last_of("\\/")) + "\\DB"; // 检查并创建config文件夹 DWORD fileAttr = GetFileAttributes(configPath.c_str()); DWORD fileAttr = GetFileAttributes(dbDir.c_str()); if (fileAttr == INVALID_FILE_ATTRIBUTES) { CreateDirectory(configPath.c_str(), NULL); CreateDirectory(dbDir.c_str(), NULL); } return configPath; return dbDir; } // 获取session.dat文件路径