using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LB_SmartVisionCommon { public class UserManager { private Dictionary _users; private readonly string _dataFilePath; private RecordUserData _currentUser; private static UserManager _instance; /// /// 线程锁 /// private static readonly object _lock = new object(); private UserManager(string dataFilePath = "users.json") { _dataFilePath = dataFilePath; _users = new Dictionary(); _currentUser = null; LoadUsers(); } public static UserManager Instance { get { // 双重检查锁定确保线程安全 if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new UserManager(); } } } return _instance; } } /// /// 当前登录用户 /// public RecordUserData CurrentUser => _currentUser; /// /// 用户列表(只读) /// public Dictionary Users { get { return _users; } } /// /// 用户数量 /// public int UserCount => _users.Count; /// /// 用户登录 /// /// 账户 /// 密码 /// public bool Login(string account, string password) { var user = _users.FirstOrDefault(u => u.Value.EmployeeAccount == account && AESHelper.Decrypt(u.Value.EmployeePassword) == password); if (user.Value != null && user.Value != null) { _currentUser = user.Value; return true; } return false; } /// /// 用户登出 /// public void Logout() { _currentUser = null; } /// /// 检查当前用户权限 /// /// 是否是管理员? /// 返回权限 private bool CheckPermission(bool requireAdmin = false) { if (_currentUser == null) return false; if (requireAdmin) return _currentUser.EmployeePermission == UserPermission.Administrator; return true; } /// /// 添加用户(需要管理员权限) /// /// RecordUserData user /// 是否添加成功! public bool AddUser(RecordUserData user) { if (_currentUser == null) { _currentUser = user; } //if (!CheckPermission(true)) //{ // MessageBox.Show("需要管理员权限才能添加用户!", "权限不足", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return false; //} if (_users.Any(u => u.Value.EmployeeNumber == user.EmployeeNumber || u.Value.EmployeeAccount == user.EmployeeAccount)) { MessageBox.Show("员工号或账号已存在!", "添加失败", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } RecordUserData recordUserData = new RecordUserData(); recordUserData.EmployeeNumber = user.EmployeeNumber; recordUserData.EmployeeAccount = user.EmployeeAccount; recordUserData.EmployeePassword = AESHelper.Encrypt(user.EmployeePassword); recordUserData.EmployeeName = user.EmployeeName; recordUserData.EmployeePermission = user.EmployeePermission; _users.Add(recordUserData.EmployeeNumber, recordUserData); SaveUsers(); return true; } /// /// 删除用户(需要管理员权限) /// /// string employeeNumber /// 是否删除成功 public bool DeleteUser(string employeeNumber) { //if (!CheckPermission(true)) //{ // MessageBox.Show("需要管理员权限才能删除用户!", "权限不足", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return false; //} //// 管理员不能删除自己 //if (_currentUser.EmployeeNumber == employeeNumber) //{ // MessageBox.Show("不能删除当前登录的用户!", "删除失败", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return false; //} var user = _users.FirstOrDefault(u => u.Value.EmployeeNumber == employeeNumber); if (user.Value != null) { _users.Remove(user.Key); SaveUsers(); return true; } return false; } /// /// 更新用户信息 /// /// RecordUserData updatedUser /// 是否更新成功 public bool UpdateUser(RecordUserData updatedUser) { // 普通用户只能修改自己的信息,管理员可以修改所有用户信息 bool canModify = _currentUser.EmployeePermission == UserPermission.Administrator || _currentUser.EmployeeNumber == updatedUser.EmployeeNumber; if (!canModify) { MessageBox.Show("没有权限修改此用户信息!", "权限不足", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } var existingUser = _users.FirstOrDefault(u => u.Value.EmployeeNumber == updatedUser.EmployeeNumber); if (existingUser.Value != null) { // 检查账号是否重复(排除自己) if (_users.Any(u => u.Value.EmployeeAccount == updatedUser.EmployeeAccount && u.Value.EmployeeNumber != updatedUser.EmployeeNumber)) { MessageBox.Show("账号已存在!", "更新失败", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; } // 更新用户信息 existingUser.Value.EmployeeName = updatedUser.EmployeeName; existingUser.Value.EmployeeAccount = updatedUser.EmployeeAccount; existingUser.Value.EmployeePassword = AESHelper.Encrypt(updatedUser.EmployeePassword); // 只有管理员可以修改权限 if (_currentUser.EmployeePermission == UserPermission.Administrator) { existingUser.Value.EmployeePermission = updatedUser.EmployeePermission; } SaveUsers(); return true; } return false; } /// /// 根据员工号查询用户 /// /// string employeeNumber /// RecordUserData public RecordUserData GetUserByNumber(string employeeNumber) { return _users.FirstOrDefault(u => u.Value.EmployeeNumber == employeeNumber).Value.Clone(); } /// /// 根据账号查询用户 /// /// string account /// RecordUserData public RecordUserData GetUserByAccount(string account) { return _users.FirstOrDefault(u => u.Value.EmployeeAccount == account).Value.Clone(); } /// /// 获取所有用户列表 /// /// List public List GetAllUsers() { return _users.Select(u => u.Value.Clone()).ToList(); } /// /// 根据权限筛选用户 /// /// UserPermission permission /// List public List GetUsersByPermission(UserPermission permission) { return _users.Where(u => u.Value.EmployeePermission == permission) .Select(u => u.Value.Clone()).ToList(); } /// /// 保存用户数据到JSON文件 /// private void SaveUsers() { try { ConfigManager>.SaveConfig>(_users, _dataFilePath); } catch (Exception ex) { MessageBox.Show($"保存用户数据失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// 从JSON文件加载用户数据 /// private void LoadUsers() { try { if (File.Exists(_dataFilePath)) { _users = ConfigManager>.LoadConfig>(_dataFilePath) ?? new Dictionary(); } } catch (Exception ex) { MessageBox.Show($"加载用户数据失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); _users = new Dictionary(); } } /// /// 验证员工号是否唯一 /// /// string employeeNumber /// string excludeEmployeeNumber = null /// 员工号是否唯一? public bool IsEmployeeNumberUnique(string employeeNumber, string excludeEmployeeNumber = null) { return !_users.Any(u => u.Value.EmployeeNumber == employeeNumber && u.Value.EmployeeNumber != excludeEmployeeNumber); } /// /// 验证账号是否唯一 /// /// string account /// string excludeEmployeeNumber = null /// 账号是否唯一? public bool IsAccountUnique(string account, string excludeEmployeeNumber = null) { return !_users.Any(u => u.Value.EmployeeAccount == account && u.Value.EmployeeNumber != excludeEmployeeNumber); } } }