LAPTOP-SNT8I5JK\Boounion
2025-09-05 fc8d367963a16de61dfbc4a0ff34c78c91ec2cfe
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();