From 552b0d6e5d9f02c5f50e7407f0b274f4b926a043 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 12 六月 2025 09:53:57 +0800
Subject: [PATCH] Merge branch 'clh'
---
SourceCode/Bond/Servo/UserManager.h | 130 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 130 insertions(+), 0 deletions(-)
diff --git a/SourceCode/Bond/Servo/UserManager.h b/SourceCode/Bond/Servo/UserManager.h
new file mode 100644
index 0000000..590b2e1
--- /dev/null
+++ b/SourceCode/Bond/Servo/UserManager.h
@@ -0,0 +1,130 @@
+#ifndef USER_MANAGER_H
+#define USER_MANAGER_H
+
+#include <string>
+#include <memory>
+#include <chrono>
+#include <windows.h>
+#include "Database.h"
+
+// 用户角色定义
+enum class UserRole {
+ SuperAdmin = 0, // 超级管理员
+ Engineer, // 工程师
+ Operator // 操作员
+};
+
+// 用户管理类,采用单例模式
+class UserManager {
+public:
+ static UserManager& getInstance();
+
+ 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;
+ bool isRememberMe() const;
+ bool createUser(const std::string& username, const std::string& password, UserRole role,
+ std::chrono::minutes timeout = std::chrono::minutes(30),
+ std::chrono::hours expiration = std::chrono::hours(72));
+ bool deleteUser(const std::string& username);
+ std::vector<std::vector<std::string>> getUsers();
+ bool setUsers(const std::vector<std::vector<std::string>>& usersData);
+ bool changeUsername(const std::string& username, const std::string& newUsername);
+ bool changePassword(const std::string& username, const std::string& newPassword);
+ bool changeUserRole(const std::string& username, UserRole newRole);
+ bool changeUserSessionTimeout(const std::string& username, int newTimeoutMinutes);
+ bool changeUserSessionExpiration(const std::string& username, int newExpirationHours);
+ std::vector<std::string> getUsernames();
+ std::vector<std::string> getUserInfo(const std::string& username);
+
+ // 会话文件操作
+ 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::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; // 数据库接口
+};
+
+#endif // USER_MANAGER_H
\ No newline at end of file
--
Gitblit v1.9.3