mrDarker
2025-09-04 f5d3efdcec2d59e4adf6a3ae534082023e2df345
1. 配方列表中添加设备配方参数
2. 测试权限功能
已修改5个文件
251 ■■■■ 文件已修改
SourceCode/Bond/Servo/PageRecipe.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/RecipeManager.cpp 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/UserManager.cpp 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/UserManager.h 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRecipe.cpp
@@ -56,9 +56,9 @@
    CString strIniFile, strItem;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPCTSTR)theApp.m_strAppDir);
    int width[] = { 0, 60, 150, 150 };
    int width[] = { 0, 60, 100, 100, 150 };
    for (int i = 0; i < 4; i++) {
    for (int i = 0; i < 5; i++) {
        strItem.Format(_T("Col_Device_%d_Width"), i);
        width[i] = GetPrivateProfileInt(_T("PageRecipeListCtrl"), strItem, width[i], strIniFile);
    }
@@ -67,6 +67,7 @@
    m_listPPID.InsertColumn(1, _T("No."), LVCFMT_CENTER, width[1]);
    m_listPPID.InsertColumn(2, _T("Recipe ID"), LVCFMT_CENTER, width[2]);
    m_listPPID.InsertColumn(3, _T("Recipe 名称"), LVCFMT_CENTER, width[3]);
    m_listPPID.InsertColumn(4, _T("Recipe 参数"), LVCFMT_CENTER, width[4]);
}
void CPageRecipe::UpdateRecipeByPPID(const CString& strPPID)
SourceCode/Bond/Servo/RecipeManager.cpp
@@ -488,7 +488,8 @@
    std::ostringstream sql;
    sql << "CREATE TABLE IF NOT EXISTS " << deviceName << "_Recipes ("
        << "recipe_id INTEGER PRIMARY KEY, "
        << "recipe_name TEXT NOT NULL"
        << "recipe_name TEXT NOT NULL,"
        << "recipe_para TEXT NOT NULL"
        << ");";
    m_pDB->executeQuery(sql.str());
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -27,6 +27,7 @@
#include "CPageReport.h"
#include "CPageCollectionEvent.h"
#include "CControlJobDlg.h"
#include "InputDialog.h"
#ifdef _DEBUG
@@ -956,6 +957,28 @@
LRESULT CServoDlg::OnToolbarBtnClicked(WPARAM wParam, LPARAM lParam)
{
    int id = (int)lParam;
    if (id == IDC_BUTTON_RUN || id == IDC_BUTTON_STOP) {
        //CInputDialog inputDialog(_T("验证用户"), _T("请输入用户密码:"));
        //if (inputDialog.DoModal() != IDOK) {
        //    AfxMessageBox(_T("取消验证!"));
        //    return 0;
        //}
        //CString inputText = inputDialog.GetInputText();
        //std::string strPass = UserManager::getInstance().getCurrentPass();
        //if (inputText.Compare(strPass.c_str()) != 0) {
        //    AfxMessageBox(_T("密码错误!"));
        //    SystemLogManager::getInstance().log(SystemLogManager::LogType::Info, _T("验证时,密码错误!"));
        //    return 0;
        //}
        UserRole emRole = UserManager::getInstance().getCurrentUserRole();
        if (emRole != UserRole::SuperAdmin) {
            AfxMessageBox(_T("当前用户并非管理员!!!"));
            return 1;
        }
    }
    if (id == IDC_BUTTON_RUN) {
        if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::MSERROR) {
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
SourceCode/Bond/Servo/UserManager.cpp
@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "UserManager.h"
#include <chrono>
#include <iostream>
@@ -12,7 +12,7 @@
const std::string INITIAL_ADMIN_USERNAME = "admin";
const std::string INITIAL_ADMIN_PASSWORD = "admin";
// 获取单例实例
// 获取单例实例
UserManager& UserManager::getInstance() {
    static UserManager instance;
    return instance;
@@ -29,12 +29,12 @@
    terminateIdleDetection();
}
// 提供数据库连接
// 提供数据库连接
std::unique_ptr<BL::Database>& UserManager::getDatabaseInstance() {
    return m_pDB;
}
// 初始化数据库,创建用户表并插入初始管理员用户
// 初始化数据库,创建用户表并插入初始管理员用户
bool UserManager::initializeDatabase() {
    std::string dbFilePath = getDatabaseFilePath();
    if (!m_pDB->connect(dbFilePath, true)) {
@@ -65,35 +65,35 @@
    return true;
}
// 对密码进行哈希处理
// 对密码进行哈希处理
std::string UserManager::hashPassword(const std::string& password) {
    return std::to_string(std::hash<std::string>{}(password));
}
// 简单的加密和解密函数
// 简单的加密和解密函数
std::string UserManager::simpleEncryptDecrypt(const std::string& data, const std::string& key) {
    std::string result = data;
    for (size_t i = 0; i < data.size(); ++i) {
        result[i] ^= key[i % key.size()];  // 简单异或加密
        result[i] ^= key[i % key.size()];  // 简单异或加密
    }
    return result;
}
// 从会话文件加载会话信息
// 从会话文件加载会话信息
bool UserManager::loadSession() {
    std::ifstream sessionFile(getSessionFilePath(), std::ios::binary);
    if (!sessionFile.is_open()) {
        return false;
    }
    // 从文件读取加密数据
    // 从文件读取加密数据
    std::string encryptedData((std::istreambuf_iterator<char>(sessionFile)), std::istreambuf_iterator<char>());
    sessionFile.close();
    // 解密数据
    // 解密数据
    std::string decryptedData = simpleEncryptDecrypt(encryptedData, "my_secret_key");
    // 解析解密的数据
    // 解析解密的数据
    std::istringstream sessionData(decryptedData);
    std::string username;
    std::string password;
@@ -103,7 +103,7 @@
    sessionData >> username >> password >> lastLoginTime >> timeoutMinutes >> expirationHours;
    // 验证时间戳有效性
    // 验证时间戳有效性
    auto now = std::chrono::system_clock::now();
    auto lastLogin = std::chrono::system_clock::from_time_t(lastLoginTime);
    auto sessionDuration = std::chrono::duration_cast<std::chrono::hours>(now - lastLogin);
@@ -113,7 +113,7 @@
        return false;
    }
    // 恢复会话数据
    // 恢复会话数据
    m_strCurrentUser = username;
    m_strCurrentPass = password;
    m_tpLastLogin = lastLogin;
@@ -126,23 +126,23 @@
    return true;
}
// 保存会话信息到文件
// 保存会话信息到文件
void UserManager::saveSession() {
    if (!m_isRememberMe) {
        clearSession();
        return;
    }
    // 原始会话数据
    // 原始会话数据
    std::stringstream sessionData;
    std::time_t lastLoginTime = std::chrono::system_clock::to_time_t(m_tpLastLogin);
    sessionData << m_strCurrentUser << " " << m_strCurrentPass << " " << lastLoginTime << " "
        << m_tmSessionTimeout.count() << " " << m_tmSessionExpiration.count();
    // 加密数据
    // 加密数据
    std::string encryptedData = simpleEncryptDecrypt(sessionData.str(), "my_secret_key");
    // 写入加密数据到文件
    // 写入加密数据到文件
    std::ofstream sessionFile(getSessionFilePath(), std::ios::binary);
    if (sessionFile.is_open()) {
        sessionFile << encryptedData;
@@ -150,19 +150,19 @@
    }
}
// 清除会话文件
// 清除会话文件
void UserManager::clearSession() {
    std::remove(getSessionFilePath().c_str());
}
// 获取程序路径下的config文件夹路径
// 获取程序路径下的config文件夹路径
std::string UserManager::getConfigFolderPath() {
    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文件夹
    // 检查并创建config文件夹
    DWORD fileAttr = GetFileAttributes(dbDir.c_str());
    if (fileAttr == INVALID_FILE_ATTRIBUTES) {
        CreateDirectory(dbDir.c_str(), NULL);
@@ -171,17 +171,17 @@
    return dbDir;
}
// 获取session.dat文件路径
// 获取session.dat文件路径
std::string UserManager::getSessionFilePath() {
    return getConfigFolderPath() + SESSION_FILE;
}
// 获取数据库文件路径
// 获取数据库文件路径
std::string UserManager::getDatabaseFilePath() {
    return getConfigFolderPath() + DATABASE_FILE;
}
// 登录方法
// 登录方法
bool UserManager::login(const std::string& username, const std::string& password, bool rememberMeFlag) {
    std::string query = "SELECT username, password, role, session_timeout, session_expiration FROM users WHERE username = '" + username + "'";
    auto result = m_pDB->fetchResults(query);
@@ -208,7 +208,7 @@
    return true;
}
// 登出方法
// 登出方法
void UserManager::logout() {
    if (m_isLoggedIn) {
        std::cout << "User logged out: " << m_strCurrentUser << std::endl;
@@ -220,17 +220,17 @@
    }
}
// 返回当前用户的登录状态
// 返回当前用户的登录状态
bool UserManager::isLoggedIn() const {
    return m_isLoggedIn;
}
// 返回当前用户的记住登录状态
// 返回当前用户的记住登录状态
bool UserManager::isRememberMe() const {
    return m_isRememberMe;
}
// 创建新用户,仅超级管理员有权限
// 创建新用户,仅超级管理员有权限
bool UserManager::createUser(const std::string& username, const std::string& password, UserRole role,
    std::chrono::minutes timeout, std::chrono::hours expiration) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
@@ -244,7 +244,7 @@
    return m_pDB->executeQuery(query);
}
// 删除用户,仅超级管理员有权限,且不能删除自己
// 删除用户,仅超级管理员有权限,且不能删除自己
bool UserManager::deleteUser(const std::string& username) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can delete users." << std::endl;
@@ -259,14 +259,14 @@
    return m_pDB->executeQuery(query);
}
// 获取所有用户信息,仅超级管理员有权限
// 获取所有用户信息,仅超级管理员有权限
std::vector<std::vector<std::string>> UserManager::getUsers() {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can retrieve user data." << std::endl;
        return {};
    }
    // 查询整个用户表
    // 查询整个用户表
    std::string query = "SELECT username, password, role, session_timeout, session_expiration, last_login FROM users";
    std::vector<std::vector<std::string>> results = m_pDB->fetchResults(query);
    for (auto& row : results) {
@@ -276,21 +276,21 @@
    return results;
}
// 设置整个用户表的数据,仅超级管理员有权限
// 设置整个用户表的数据,仅超级管理员有权限
bool UserManager::setUsers(const std::vector<std::vector<std::string>>& usersData) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can set user data." << std::endl;
        return false;
    }
    // 清空用户表
    // 清空用户表
    std::string deleteQuery = "DELETE FROM users";
    if (!m_pDB->executeQuery(deleteQuery)) {
        std::cerr << "Failed to clear the users table." << std::endl;
        return false;
    }
    // 插入新的用户数据
    // 插入新的用户数据
    for (const auto& user : usersData) {
        if (user.size() != 6) {
            std::cerr << "Invalid data format for user. Each user must have 6 fields." << std::endl;
@@ -309,7 +309,7 @@
    return true;
}
// 修改用户名,仅超级管理员有权限
// 修改用户名,仅超级管理员有权限
bool UserManager::changeUsername(const std::string& username, const std::string& newUsername) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can change usernames." << std::endl;
@@ -319,11 +319,11 @@
    std::string query = "UPDATE users SET username = '" + newUsername + "' WHERE username = '" + username + "'";
    bool success = m_pDB->executeQuery(query);
    // 如果是当前登录用户修改自己的用户名,更新成员变量并保存会话文件
    // 如果是当前登录用户修改自己的用户名,更新成员变量并保存会话文件
    if (success && m_strCurrentUser == username) {
        m_strCurrentUser = newUsername;
        // 如果“记住密码”已启用,更新会话文件
        // 如果“记住密码”已启用,更新会话文件
        if (m_isRememberMe) {
            saveSession();
        }
@@ -331,7 +331,7 @@
    return success;
}
// 修改用户密码(仅允许当前用户或超级管理员)
// 修改用户密码(仅允许当前用户或超级管理员)
bool UserManager::changePassword(const std::string& username, const std::string& newPassword) {
    if (username != m_strCurrentUser && m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Permission denied: Only the user or SuperAdmin can change passwords." << std::endl;
@@ -342,7 +342,7 @@
        "' WHERE username = '" + username + "'";
    bool success = m_pDB->executeQuery(query);
    // 如果是当前用户修改自己的密码,退出登录并清除会话文件
    // 如果是当前用户修改自己的密码,退出登录并清除会话文件
    if (success && m_strCurrentUser == username) {
        logout();
        std::cout << "Password changed successfully. Please log in again." << std::endl;
@@ -351,14 +351,14 @@
    return success;
}
// 更改用户角色,仅超级管理员有权限
// 更改用户角色,仅超级管理员有权限
bool UserManager::changeUserRole(const std::string& username, UserRole newRole) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can change user roles." << std::endl;
        return false;
    }
    // 防止管理员更改自己的角色
    // 防止管理员更改自己的角色
    if (m_strCurrentUser == username) {
        std::cerr << "SuperAdmin cannot change their own role." << std::endl;
        return false;
@@ -369,7 +369,7 @@
    return m_pDB->executeQuery(query);
}
// 修改用户的 session_timeout,仅超级管理员有权限
// 修改用户的 session_timeout,仅超级管理员有权限
bool UserManager::changeUserSessionTimeout(const std::string& username, int newTimeoutMinutes) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can change session timeout." << std::endl;
@@ -379,7 +379,7 @@
    std::string query = "UPDATE users SET session_timeout = " + std::to_string(newTimeoutMinutes) +
        " WHERE username = '" + username + "'";
    bool success = m_pDB->executeQuery(query);
    // 如果是当前登录用户修改自己的超时设置,更新成员变量
    // 如果是当前登录用户修改自己的超时设置,更新成员变量
    if (success && m_strCurrentUser == username) {
        m_tmSessionTimeout = std::chrono::minutes(newTimeoutMinutes);
@@ -390,7 +390,7 @@
    return success;
}
// 修改用户的 session_expiration,仅超级管理员有权限
// 修改用户的 session_expiration,仅超级管理员有权限
bool UserManager::changeUserSessionExpiration(const std::string& username, int newExpirationHours) {
    if (m_enCurrentUserRole != UserRole::SuperAdmin) {
        std::cerr << "Only SuperAdmin can change session expiration." << std::endl;
@@ -400,7 +400,7 @@
    std::string query = "UPDATE users SET session_expiration = " + std::to_string(newExpirationHours) +
        " WHERE username = '" + username + "'";
    bool success = m_pDB->executeQuery(query);
    // 如果是当前登录用户修改自己的过期设置,更新成员变量
    // 如果是当前登录用户修改自己的过期设置,更新成员变量
    if (success && m_strCurrentUser == username) {
        m_tmSessionExpiration = std::chrono::hours(newExpirationHours);
@@ -411,7 +411,7 @@
    return success;
}
// 获取所有用户名称
// 获取所有用户名称
std::vector<std::string> UserManager::getUsernames() {
    std::vector<std::string> usernames;
    std::string query = "SELECT username FROM users";
@@ -419,50 +419,50 @@
    for (const auto& row : results) {
        if (!row.empty()) {
            usernames.push_back(row[0]); // 获取用户名列的值
            usernames.push_back(row[0]); // 获取用户名列的值
        }
    }
    return usernames;
}
// 获取指定用户名的用户信息
// 获取指定用户名的用户信息
std::vector<std::string> UserManager::getUserInfo(const std::string& username)
{
    // 构建查询语句
    // 构建查询语句
    std::ostringstream query;
    query << "SELECT username, password, role, session_timeout, session_expiration, last_login "
        << "FROM users WHERE username = '" << username << "'";
    // 执行查询并获取结果
    // 执行查询并获取结果
    auto results = m_pDB->fetchResults(query.str());
    if (results.empty()) {
        return {};
    }
    // 返回查询到的第一行数据
    // 返回查询到的第一行数据
    return results[0];
}
// 更新最后活动时间,用于无操作超时检测
// 更新最后活动时间,用于无操作超时检测
void UserManager::updateActivityTime() {
    m_tpLastActivity = std::chrono::system_clock::now();
    std::cout << "Activity updated at: " << std::chrono::system_clock::to_time_t(m_tpLastActivity) << std::endl;
}
// 设置无操作超时时间
// 设置无操作超时时间
void UserManager::setSessionTimeout(std::chrono::minutes timeout) {
    m_tmSessionTimeout = timeout;
}
// 检查是否超过无操作超时时间
// 检查是否超过无操作超时时间
bool UserManager::isInactiveTimeout() const {
    auto now = std::chrono::system_clock::now();
    auto elapsedSeconds = std::chrono::duration_cast<std::chrono::seconds>(now - m_tpLastActivity).count();
    return elapsedSeconds > m_tmSessionTimeout.count() * 60;
}
// 初始化无操作检测,包括设置全局鼠标和键盘钩子
// 初始化无操作检测,包括设置全局鼠标和键盘钩子
void UserManager::initializeIdleDetection(HWND hwnd) {
    updateActivityTime();
    m_hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, (HINSTANCE) nullptr, 0);
@@ -470,7 +470,7 @@
    ::SetTimer(hwnd, 1, 60000, nullptr);
}
// 终止无操作检测,清除鼠标和键盘钩子
// 终止无操作检测,清除鼠标和键盘钩子
void UserManager::terminateIdleDetection() {
    if (m_hMouseHook) {
        UnhookWindowsHookEx(m_hMouseHook);
@@ -483,47 +483,47 @@
    ::KillTimer(nullptr, 1);
}
// 获取当前登录用户名
// 获取当前登录用户名
std::string UserManager::getCurrentUser() const {
    return m_strCurrentUser;
}
// 修改当前登录用户名
// 修改当前登录用户名
void UserManager::setCurrentUser(const std::string& strName) {
    m_strCurrentUser = strName;
}
// 获取当前登录用户密码
// 获取当前登录用户密码
std::string UserManager::getCurrentPass() const {
    return m_strCurrentPass;
}
// 修改当前登录用户密码
// 修改当前登录用户密码
void UserManager::setCurrentPass(const std::string& strPass) {
    m_strCurrentPass = strPass;
}
// 获取当前登录用户角色
// 获取当前登录用户角色
UserRole UserManager::getCurrentUserRole() const {
    return m_enCurrentUserRole;
}
// 修改当前登录用户角色
// 修改当前登录用户角色
void UserManager::setCurrentUserRole(UserRole emRole) {
    m_enCurrentUserRole = emRole;
}
// 获取当前登录用户的无操作超时时间
// 获取当前登录用户的无操作超时时间
std::chrono::minutes UserManager::getSessionTimeout() const {
    return m_tmSessionTimeout;
}
// 获取当前登录用户的会话过期时间
// 获取当前登录用户的会话过期时间
std::chrono::hours UserManager::getSessionExpiration() const {
    return m_tmSessionExpiration;
}
// 全局鼠标钩子回调,记录活动时间
// 全局鼠标钩子回调,记录活动时间
LRESULT CALLBACK UserManager::LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        UserManager::getInstance().updateActivityTime();
@@ -532,7 +532,7 @@
    return CallNextHookEx(nullptr, nCode, wParam, lParam);
}
// 全局键盘钩子回调,记录活动时间
// 全局键盘钩子回调,记录活动时间
LRESULT CALLBACK UserManager::LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        UserManager::getInstance().updateActivityTime();
SourceCode/Bond/Servo/UserManager.h
@@ -1,4 +1,4 @@
#ifndef USER_MANAGER_H
#ifndef USER_MANAGER_H
#define USER_MANAGER_H
#include <string>
@@ -7,16 +7,16 @@
#include <windows.h>
#include "Database.h"
// 用户角色定义
// 用户角色定义
enum class UserRole {
    SuperAdmin = 0,   // 超级管理员:系统最高权限,管理所有用户和权限
    ProcessEngineer,  // 制程工程师:负责工艺制定与优化
    EquipmentEngineer,// 设备工程师:负责设备维护与技术支持
    Operator,         // 操作员:执行日常生产操作
    Unknown           // 未知角色:默认或未识别的角色
    SuperAdmin = 0,   // 超级管理员:系统最高权限,管理所有用户和权限
    ProcessEngineer,  // 制程工程师:负责工艺制定与优化
    EquipmentEngineer,// 设备工程师:负责设备维护与技术支持
    Operator,         // 操作员:执行日常生产操作
    Unknown           // 未知角色:默认或未识别的角色
};
// 用户管理类,采用单例模式
// 用户管理类,采用单例模式
class UserManager {
public:
    static UserManager& getInstance();
@@ -24,10 +24,10 @@
    UserManager(const UserManager&) = delete;
    UserManager& operator=(const UserManager&) = delete;
    // 提供数据库连接
    // 提供数据库连接
    std::unique_ptr<BL::Database>& getDatabaseInstance();
    // 用户操作
    // 用户操作
    bool login(const std::string& username, const std::string& password, bool rememberMe = false);
    void logout();
    bool isLoggedIn() const;
@@ -46,87 +46,87 @@
    std::vector<std::string> getUsernames();
    std::vector<std::string> getUserInfo(const std::string& username);
    // 会话文件操作
    bool loadSession();     // 从会话文件加载会话信息
    void saveSession();     // 保存会话信息到文件
    void clearSession();    // 清除会话文件
    // 会话文件操作
    bool loadSession();     // 从会话文件加载会话信息
    void saveSession();     // 保存会话信息到文件
    void clearSession();    // 清除会话文件
    // 配置文件夹路径管理
    // 配置文件夹路径管理
    static std::string getConfigFolderPath();
    static std::string getSessionFilePath();
    static std::string getDatabaseFilePath();
    // 更新最后活动时间(用于无操作超时检测)
    // 更新最后活动时间(用于无操作超时检测)
    void updateActivityTime();
    // 设置用户的无操作超时时间
    // 设置用户的无操作超时时间
    void setSessionTimeout(std::chrono::minutes timeout);
    // 检查是否无操作超时
    // 检查是否无操作超时
    bool isInactiveTimeout() const;
    // 初始化无操作检测(设置全局钩子和定时器)
    // 初始化无操作检测(设置全局钩子和定时器)
    void initializeIdleDetection(HWND hwnd);
    // 终止无操作检测(清除钩子和定时器)
    // 终止无操作检测(清除钩子和定时器)
    void terminateIdleDetection();
    // 获取当前登录用户名
    // 获取当前登录用户名
    std::string getCurrentUser() const;
    // 修改当前登录用户名
    // 修改当前登录用户名
    void setCurrentUser(const std::string& strName);
    // 获取当前登录用户密码
    // 获取当前登录用户密码
    std::string getCurrentPass() const;
    // 修改当前登录用户密码
    // 修改当前登录用户密码
    void setCurrentPass(const std::string& strPass);
    // 获取当前登录用户角色
    // 获取当前登录用户角色
    UserRole getCurrentUserRole() const;
    // 修改当前登录用户角色
    // 修改当前登录用户角色
    void setCurrentUserRole(UserRole emRole);
    // 获取当前登录用户的无操作超时时间
    // 获取当前登录用户的无操作超时时间
    std::chrono::minutes getSessionTimeout() const;
    // 获取当前登录用户的会话过期时间
    // 获取当前登录用户的会话过期时间
    std::chrono::hours getSessionExpiration() const;
private:
    UserManager();
    ~UserManager();
    // 初始化数据库连接和用户表
    // 初始化数据库连接和用户表
    bool initializeDatabase();
    // 哈希密码,用于加密用户密码
    // 哈希密码,用于加密用户密码
    std::string hashPassword(const std::string& password);
    // 加密和解密函数
    // 加密和解密函数
    std::string simpleEncryptDecrypt(const std::string& data, const std::string& key);
    // 键盘和鼠标钩子函数
    // 键盘和鼠标钩子函数
    static LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
    // 属性定义
    std::string m_strCurrentUser;                     // 当前登录用户名
    std::string m_strCurrentPass;                     // 当前登录密码
    UserRole m_enCurrentUserRole;                     // 当前登录用户角色
    bool m_isLoggedIn;                                // 是否已登录
    bool m_isRememberMe;                              // 是否记住登录状态
    // 属性定义
    std::string m_strCurrentUser;                     // 当前登录用户名
    std::string m_strCurrentPass;                     // 当前登录密码
    UserRole m_enCurrentUserRole;                     // 当前登录用户角色
    bool m_isLoggedIn;                                // 是否已登录
    bool m_isRememberMe;                              // 是否记住登录状态
    std::chrono::time_point<std::chrono::system_clock> m_tpLastLogin;     // 上次登录时间
    std::chrono::time_point<std::chrono::system_clock> m_tpLastActivity;  // 最后活动时间
    std::chrono::minutes m_tmSessionTimeout;          // 无操作超时时间
    std::chrono::hours m_tmSessionExpiration;         // 会话过期时间
    HHOOK m_hMouseHook;                               // 鼠标钩子句柄
    HHOOK m_hKeyboardHook;                            // 键盘钩子句柄
    std::chrono::time_point<std::chrono::system_clock> m_tpLastLogin;     // 上次登录时间
    std::chrono::time_point<std::chrono::system_clock> m_tpLastActivity;  // 最后活动时间
    std::chrono::minutes m_tmSessionTimeout;          // 无操作超时时间
    std::chrono::hours m_tmSessionExpiration;         // 会话过期时间
    HHOOK m_hMouseHook;                               // 鼠标钩子句柄
    HHOOK m_hKeyboardHook;                            // 键盘钩子句柄
    std::unique_ptr<BL::Database> m_pDB;              // 数据库接口
    std::unique_ptr<BL::Database> m_pDB;              // 数据库接口
};
#endif // USER_MANAGER_H