diff --git a/全自动水压检测仪/DATA/DatabaseInitializer.cs b/全自动水压检测仪/DATA/DatabaseInitializer.cs
new file mode 100644
index 0000000..0910757
--- /dev/null
+++ b/全自动水压检测仪/DATA/DatabaseInitializer.cs
@@ -0,0 +1,206 @@
+using Dapper;
+using MySql.Data.MySqlClient;
+using System;
+using System.Diagnostics;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 数据库初始化辅助类
+ /// 用于创建用户表和初始化默认管理员账户
+ ///
+ public static class DatabaseInitializer
+ {
+ private static readonly string _connectionString = "Server=localhost;Database=fullautowaterpressure;User=root;Password=123456;port=3306;charset=utf8;";
+
+ ///
+ /// 初始化用户表和默认管理员账户
+ ///
+ public static void Initialize()
+ {
+ try
+ {
+ CreateUsersTable();
+ CreateDefaultAdminIfNotExists();
+ }
+ catch (Exception ex)
+ {
+ throw new Exception($"数据库初始化失败:{ex.Message}", ex);
+ }
+ }
+
+ ///
+ /// 强制重置默认用户(删除并重新创建)
+ ///
+ public static void ForceResetDefaultUsers()
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ try
+ {
+ // 删除现有的默认用户
+ connection.Execute("DELETE FROM sys_users WHERE username IN ('admin', 'cgx')");
+ Debug.WriteLine("已删除现有默认用户");
+
+ // 重新创建
+ CreateUserIfNotExists(connection, "admin", "admin123", 1);
+ CreateUserIfNotExists(connection, "cgx", "123", 0);
+
+ Debug.WriteLine("默认用户重置完成!");
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"重置用户失败: {ex.Message}");
+ throw;
+ }
+ }
+ }
+
+ ///
+ /// 创建用户表
+ ///
+ private static void CreateUsersTable()
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 先检查表是否存在,如果不存在则创建
+ string checkTableSql = @"SELECT COUNT(*) FROM information_schema.tables
+ WHERE table_schema = @database AND table_name = 'sys_users'";
+ int tableExists = connection.ExecuteScalar(checkTableSql, new { database = "fullautowaterpressure" });
+
+ if (tableExists == 0)
+ {
+ string sql = @"
+ CREATE TABLE `sys_users` (
+ `id` INT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+ `username` VARCHAR(50) NOT NULL COMMENT '用户名',
+ `password_hash` VARCHAR(255) NOT NULL COMMENT '密码哈希值',
+ `salt` VARCHAR(64) NOT NULL COMMENT '盐值',
+ `user_role` TINYINT NOT NULL DEFAULT 0 COMMENT '用户角色:0=普通用户,1=管理员',
+ `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0=禁用,1=启用',
+ `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `last_login_time` DATETIME DEFAULT NULL COMMENT '最后登录时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_username` (`username`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表'";
+
+ connection.Execute(sql);
+ }
+ }
+ }
+
+ ///
+ /// 创建默认管理员账户(如果不存在)
+ /// 默认账户:admin / admin123
+ ///
+ private static void CreateDefaultAdminIfNotExists()
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ try
+ {
+ // 先检查 sys_users 表是否存在
+ string checkTableSql = @"SELECT COUNT(*) FROM information_schema.tables
+ WHERE table_schema = @database AND table_name = 'sys_users'";
+ int tableExists = connection.ExecuteScalar(checkTableSql, new { database = "fullautowaterpressure" });
+
+ if (tableExists == 0)
+ {
+ Debug.WriteLine("sys_users table does not exist, skipping admin creation");
+ return;
+ }
+
+ // 创建默认管理员账户 admin / admin123
+ CreateUserIfNotExists(connection, "admin", "admin123", 1);
+
+ // 创建默认普通用户账户 cgx / 123
+ CreateUserIfNotExists(connection, "cgx", "123", 0);
+ }
+ catch (Exception ex)
+ {
+ // 捕获其他异常
+ Debug.WriteLine($"✗ Error creating default users: {ex.GetType().Name} - {ex.Message}");
+ }
+ }
+ }
+
+ ///
+ /// 创建用户(如果不存在)
+ ///
+ /// 数据库连接
+ /// 用户名
+ /// 密码(明文)
+ /// 用户角色:0=普通用户,1=管理员
+ private static void CreateUserIfNotExists(MySqlConnection connection, string username, string password, int userRole)
+ {
+ try
+ {
+ // 检查用户是否已存在
+ string checkUserSql = "SELECT COUNT(*) FROM `sys_users` WHERE `username` = @username";
+ int userExists = connection.ExecuteScalar(checkUserSql, new { username });
+
+ if (userExists > 0)
+ {
+ Debug.WriteLine($"用户 '{username}' 已存在,跳过创建");
+ return;
+ }
+
+ // 简单明文密码存储
+ // password_hash 字段存储明文密码
+ // salt 字段存储空字符串(保持兼容性)
+ string passwordHash = password; // 直接使用明文
+ string salt = ""; // 空字符串
+
+ // 调试输出
+ Debug.WriteLine($"\n=== 创建用户: {username} ===");
+ Debug.WriteLine($" 密码: {password}");
+ Debug.WriteLine($" 角色: {(userRole == 1 ? "管理员" : "普通用户")}");
+
+ // 插入用户
+ string insertSql = @"
+ INSERT INTO `sys_users`
+ (`username`, `password_hash`, `salt`, `user_role`, `status`, `create_time`)
+ VALUES (@username, @passwordHash, @salt, @userRole, @status, NOW())";
+
+ int rowsAffected = connection.Execute(insertSql, new
+ {
+ username = username,
+ passwordHash = passwordHash,
+ salt = salt,
+ userRole = userRole,
+ status = 1 // 启用
+ });
+
+ if (rowsAffected > 0)
+ {
+ string roleText = userRole == 1 ? "管理员" : "普通用户";
+ Debug.WriteLine($"✓ 用户创建成功: {username} / {password} ({roleText})");
+ }
+ else
+ {
+ Debug.WriteLine($"✗ 创建用户失败: {username}");
+ }
+ }
+ catch (MySqlException ex)
+ {
+ Debug.WriteLine($"✗ MySQL错误 (创建用户 '{username}'): [{ex.Number}] {ex.Message}");
+
+ if (ex.Number == 1062)
+ {
+ Debug.WriteLine($"用户 '{username}' 已存在(重复键)");
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"✗ 异常 (创建用户 '{username}'): {ex.Message}");
+ }
+ }
+ }
+}
diff --git a/全自动水压检测仪/DATA/LoginData.cs b/全自动水压检测仪/DATA/LoginData.cs
index 3f1932a..f8afb74 100644
--- a/全自动水压检测仪/DATA/LoginData.cs
+++ b/全自动水压检测仪/DATA/LoginData.cs
@@ -1,9 +1,11 @@
-namespace 全自动水压检测仪
+using System;
+
+namespace 全自动水压检测仪
{
public class LoginData
{
static string _userName = "";
- public string UserName
+ public static string UserName
{
get { return _userName; }
set { _userName = value; }
@@ -11,11 +13,51 @@
//登陆权限
static int _userPower = 0;//0为普通用户,1为管理员
- public int UserPower
+ public static int UserPower
{
get { return _userPower; }
set { _userPower = value; }
}
+ static int _currentUserId = 0; // 当前登录用户ID
+ public static int CurrentUserId
+ {
+ get { return _currentUserId; }
+ set { _currentUserId = value; }
+ }
+
+ static DateTime _loginTime = DateTime.Now;
+ public static DateTime LoginTime
+ {
+ get { return _loginTime; }
+ set { _loginTime = value; }
+ }
+
+ ///
+ /// 检查是否为管理员
+ ///
+ public static bool IsAdmin()
+ {
+ return _userPower == 1;
+ }
+
+ ///
+ /// 检查是否为普通用户
+ ///
+ public static bool IsNormalUser()
+ {
+ return _userPower == 0;
+ }
+
+ ///
+ /// 退出登录,清空会话信息
+ ///
+ public static void Logout()
+ {
+ _userName = "";
+ _userPower = 0;
+ _currentUserId = 0;
+ _loginTime = DateTime.Now;
+ }
}
}
diff --git a/全自动水压检测仪/DATA/LoginDebugHelper.cs b/全自动水压检测仪/DATA/LoginDebugHelper.cs
new file mode 100644
index 0000000..8ed3ed2
--- /dev/null
+++ b/全自动水压检测仪/DATA/LoginDebugHelper.cs
@@ -0,0 +1,167 @@
+using System;
+using System.Diagnostics;
+using MySql.Data.MySqlClient;
+using Dapper;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 登录调试辅助类
+ /// 用于测试和调试登录功能
+ ///
+ public static class LoginDebugHelper
+ {
+ private static readonly string _connectionString = "Server=localhost;Database=fullautowaterpressure;User=root;Password=123456;port=3306;charset=utf8;";
+
+ ///
+ /// 测试密码加密和验证
+ ///
+ public static void TestPasswordEncryption()
+ {
+ Debug.WriteLine("=== 测试密码加密 ===");
+
+ // 测试 admin123
+ string salt1 = PasswordHelper.GenerateSalt();
+ string hash1 = PasswordHelper.HashPassword("admin123", salt1);
+ bool verify1 = PasswordHelper.VerifyPassword("admin123", hash1, salt1);
+
+ Debug.WriteLine($"密码: admin123");
+ Debug.WriteLine($"盐值: {salt1}");
+ Debug.WriteLine($"哈希: {hash1}");
+ Debug.WriteLine($"验证: {verify1}");
+ Debug.WriteLine("");
+
+ // 测试 123
+ string salt2 = PasswordHelper.GenerateSalt();
+ string hash2 = PasswordHelper.HashPassword("123", salt2);
+ bool verify2 = PasswordHelper.VerifyPassword("123", hash2, salt2);
+
+ Debug.WriteLine($"密码: 123");
+ Debug.WriteLine($"盐值: {salt2}");
+ Debug.WriteLine($"哈希: {hash2}");
+ Debug.WriteLine($"验证: {verify2}");
+ }
+
+ ///
+ /// 查看数据库中的用户信息
+ ///
+ public static void ShowDatabaseUsers()
+ {
+ try
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ var users = connection.Query("SELECT * FROM sys_users");
+
+ Debug.WriteLine("=== 数据库用户列表 ===");
+ foreach (var user in users)
+ {
+ Debug.WriteLine($"ID: {user.Id}");
+ Debug.WriteLine($"用户名: {user.Username}");
+ Debug.WriteLine($"角色: {(user.UserRole == 1 ? "管理员" : "普通用户")}");
+ Debug.WriteLine($"状态: {(user.Status == 1 ? "启用" : "禁用")}");
+ Debug.WriteLine($"密码哈希: {user.PasswordHash}");
+ Debug.WriteLine($"盐值: {user.Salt}");
+ Debug.WriteLine($"创建时间: {user.CreateTime}");
+ Debug.WriteLine("---");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"查询用户失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 重置所有默认用户
+ ///
+ public static void ResetDefaultUsers()
+ {
+ try
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 删除现有用户
+ connection.Execute("DELETE FROM sys_users WHERE username IN ('admin', 'cgx')");
+ Debug.WriteLine("已删除现有默认用户");
+
+ // 重新创建 admin
+ string salt1 = PasswordHelper.GenerateSalt();
+ string hash1 = PasswordHelper.HashPassword("admin123", salt1);
+ connection.Execute(@"
+ INSERT INTO sys_users (username, password_hash, salt, user_role, status, create_time)
+ VALUES (@username, @hash, @salt, @role, 1, NOW())",
+ new { username = "admin", hash = hash1, salt = salt1, role = 1 });
+ Debug.WriteLine("✓ 创建管理员: admin / admin123");
+
+ // 重新创建 cgx
+ string salt2 = PasswordHelper.GenerateSalt();
+ string hash2 = PasswordHelper.HashPassword("123", salt2);
+ connection.Execute(@"
+ INSERT INTO sys_users (username, password_hash, salt, user_role, status, create_time)
+ VALUES (@username, @hash, @salt, @role, 1, NOW())",
+ new { username = "cgx", hash = hash2, salt = salt2, role = 0 });
+ Debug.WriteLine("✓ 创建普通用户: cgx / 123");
+
+ Debug.WriteLine("默认用户重置完成!");
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"重置用户失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 测试登录
+ ///
+ public static void TestLogin(string username, string password)
+ {
+ try
+ {
+ Debug.WriteLine($"=== 测试登录: {username} ===");
+
+ var repository = new UserRepository();
+ var user = repository.GetUserByUsername(username);
+
+ if (user == null)
+ {
+ Debug.WriteLine("❌ 用户不存在");
+ return;
+ }
+
+ Debug.WriteLine($"✓ 找到用户: {user.Username}");
+ Debug.WriteLine($" 角色: {(user.UserRole == 1 ? "管理员" : "普通用户")}");
+ Debug.WriteLine($" 状态: {(user.Status == 1 ? "启用" : "禁用")}");
+ Debug.WriteLine($" 密码哈希: {user.PasswordHash}");
+ Debug.WriteLine($" 盐值: {user.Salt}");
+
+ bool isValid = PasswordHelper.VerifyPassword(password, user.PasswordHash, user.Salt);
+
+ if (isValid)
+ {
+ Debug.WriteLine("✓ 密码验证成功!");
+ }
+ else
+ {
+ Debug.WriteLine("❌ 密码验证失败!");
+
+ // 测试重新生成哈希
+ string testHash = PasswordHelper.HashPassword(password, user.Salt);
+ Debug.WriteLine($" 输入密码的哈希: {testHash}");
+ Debug.WriteLine($" 数据库的哈希: {user.PasswordHash}");
+ Debug.WriteLine($" 是否匹配: {testHash == user.PasswordHash}");
+ }
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine($"测试登录失败: {ex.Message}");
+ }
+ }
+ }
+}
diff --git a/全自动水压检测仪/DATA/PasswordGenerator.cs b/全自动水压检测仪/DATA/PasswordGenerator.cs
new file mode 100644
index 0000000..b6a61ce
--- /dev/null
+++ b/全自动水压检测仪/DATA/PasswordGenerator.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Windows.Forms;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 密码生成器 - 用于生成正确的密码哈希
+ ///
+ public class PasswordGenerator : Form
+ {
+ private TextBox txtPassword;
+ private TextBox txtSalt;
+ private TextBox txtHash;
+ private Button btnGenerate;
+ private Label lblPassword;
+ private Label lblSalt;
+ private Label lblHash;
+ private Button btnGenerateSalt;
+ private TextBox txtSqlUpdate;
+ private Label lblSql;
+
+ public PasswordGenerator()
+ {
+ InitializeComponent();
+ }
+
+ private void InitializeComponent()
+ {
+ this.lblPassword = new Label();
+ this.txtPassword = new TextBox();
+ this.lblSalt = new Label();
+ this.txtSalt = new TextBox();
+ this.btnGenerateSalt = new Button();
+ this.lblHash = new Label();
+ this.txtHash = new TextBox();
+ this.btnGenerate = new Button();
+ this.lblSql = new Label();
+ this.txtSqlUpdate = new TextBox();
+
+ this.SuspendLayout();
+
+ // lblPassword
+ this.lblPassword.Location = new System.Drawing.Point(20, 20);
+ this.lblPassword.Size = new System.Drawing.Size(100, 20);
+ this.lblPassword.Text = "密码:";
+
+ // txtPassword
+ this.txtPassword.Location = new System.Drawing.Point(120, 20);
+ this.txtPassword.Size = new System.Drawing.Size(300, 25);
+
+ // lblSalt
+ this.lblSalt.Location = new System.Drawing.Point(20, 60);
+ this.lblSalt.Size = new System.Drawing.Size(100, 20);
+ this.lblSalt.Text = "盐值:";
+
+ // txtSalt
+ this.txtSalt.Location = new System.Drawing.Point(120, 60);
+ this.txtSalt.Size = new System.Drawing.Size(300, 25);
+ this.txtSalt.ReadOnly = true;
+
+ // btnGenerateSalt
+ this.btnGenerateSalt.Location = new System.Drawing.Point(430, 58);
+ this.btnGenerateSalt.Size = new System.Drawing.Size(100, 28);
+ this.btnGenerateSalt.Text = "生成盐值";
+ this.btnGenerateSalt.Click += BtnGenerateSalt_Click;
+
+ // lblHash
+ this.lblHash.Location = new System.Drawing.Point(20, 100);
+ this.lblHash.Size = new System.Drawing.Size(100, 20);
+ this.lblHash.Text = "密码哈希:";
+
+ // txtHash
+ this.txtHash.Location = new System.Drawing.Point(120, 100);
+ this.txtHash.Size = new System.Drawing.Size(410, 25);
+ this.txtHash.ReadOnly = true;
+
+ // btnGenerate
+ this.btnGenerate.Location = new System.Drawing.Point(220, 140);
+ this.btnGenerate.Size = new System.Drawing.Size(120, 35);
+ this.btnGenerate.Text = "生成哈希";
+ this.btnGenerate.Click += BtnGenerate_Click;
+
+ // lblSql
+ this.lblSql.Location = new System.Drawing.Point(20, 190);
+ this.lblSql.Size = new System.Drawing.Size(100, 20);
+ this.lblSql.Text = "SQL更新语句:";
+
+ // txtSqlUpdate
+ this.txtSqlUpdate.Location = new System.Drawing.Point(20, 220);
+ this.txtSqlUpdate.Size = new System.Drawing.Size(510, 100);
+ this.txtSqlUpdate.Multiline = true;
+ this.txtSqlUpdate.ReadOnly = true;
+ this.txtSqlUpdate.ScrollBars = ScrollBars.Vertical;
+
+ // PasswordGenerator
+ this.ClientSize = new System.Drawing.Size(560, 350);
+ this.Controls.Add(this.lblPassword);
+ this.Controls.Add(this.txtPassword);
+ this.Controls.Add(this.lblSalt);
+ this.Controls.Add(this.txtSalt);
+ this.Controls.Add(this.btnGenerateSalt);
+ this.Controls.Add(this.lblHash);
+ this.Controls.Add(this.txtHash);
+ this.Controls.Add(this.btnGenerate);
+ this.Controls.Add(this.lblSql);
+ this.Controls.Add(this.txtSqlUpdate);
+ this.FormBorderStyle = FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.StartPosition = FormStartPosition.CenterScreen;
+ this.Text = "密码哈希生成器";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+ }
+
+ private void BtnGenerateSalt_Click(object sender, EventArgs e)
+ {
+ txtSalt.Text = PasswordHelper.GenerateSalt();
+ }
+
+ private void BtnGenerate_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(txtPassword.Text))
+ {
+ MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ if (string.IsNullOrEmpty(txtSalt.Text))
+ {
+ MessageBox.Show("请先生成盐值!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ string hash = PasswordHelper.HashPassword(txtPassword.Text, txtSalt.Text);
+ txtHash.Text = hash;
+
+ // 生成SQL更新语句
+ string sql = $@"-- 更新用户密码
+UPDATE sys_users
+SET password_hash = '{hash}',
+ salt = '{txtSalt.Text}'
+WHERE username = 'admin'; -- 修改为对应的用户名";
+
+ txtSqlUpdate.Text = sql;
+
+ MessageBox.Show("密码哈希生成成功!\n\n可以复制SQL语句到数据库执行。", "成功",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new PasswordGenerator());
+ }
+ }
+}
diff --git a/全自动水压检测仪/DATA/PasswordHelper.cs b/全自动水压检测仪/DATA/PasswordHelper.cs
new file mode 100644
index 0000000..7a2b63e
--- /dev/null
+++ b/全自动水压检测仪/DATA/PasswordHelper.cs
@@ -0,0 +1,140 @@
+using System;
+using System.Security.Cryptography;
+using System.Text;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 密码加密辅助类
+ /// 使用 SHA256 + 盐值加密
+ /// 精确简单的实现,确保100%匹配
+ ///
+ public static class PasswordHelper
+ {
+ ///
+ /// 生成随机盐值(16字节)
+ ///
+ /// Base64编码的盐值字符串
+ public static string GenerateSalt()
+ {
+ byte[] saltBytes = new byte[16];
+ using (var rng = new RNGCryptoServiceProvider())
+ {
+ rng.GetBytes(saltBytes);
+ }
+ return Convert.ToBase64String(saltBytes);
+ }
+
+ ///
+ /// 使用 SHA256 哈希密码
+ /// 精确实现:密码 + 盐值 -> SHA256 -> Base64
+ ///
+ /// 明文密码
+ /// 盐值
+ /// Base64编码的密码哈希值
+ public static string HashPassword(string password, string salt)
+ {
+ if (string.IsNullOrEmpty(password))
+ throw new ArgumentNullException(nameof(password));
+
+ if (string.IsNullOrEmpty(salt))
+ throw new ArgumentNullException(nameof(salt));
+
+ // 拼接密码和盐值
+ string combined = password + salt;
+
+ // 转换为字节数组
+ byte[] combinedBytes = Encoding.UTF8.GetBytes(combined);
+
+ // 计算 SHA256 哈希
+ using (var sha256 = SHA256.Create())
+ {
+ byte[] hashBytes = sha256.ComputeHash(combinedBytes);
+
+ // 转换为 Base64 字符串
+ string hash = Convert.ToBase64String(hashBytes);
+
+ return hash;
+ }
+ }
+
+ ///
+ /// 验证密码是否匹配
+ /// 精确实现:重新计算哈希并比较
+ ///
+ /// 输入的明文密码
+ /// 存储的密码哈希值
+ /// 盐值
+ /// 密码是否匹配
+ public static bool VerifyPassword(string inputPassword, string storedHash, string salt)
+ {
+ if (string.IsNullOrEmpty(inputPassword))
+ return false;
+
+ if (string.IsNullOrEmpty(storedHash))
+ return false;
+
+ if (string.IsNullOrEmpty(salt))
+ return false;
+
+ try
+ {
+ // 使用相同的方法计算输入密码的哈希
+ string inputHash = HashPassword(inputPassword, salt);
+
+ // 精确比较(区分大小写)
+ bool isMatch = string.Equals(inputHash, storedHash, StringComparison.Ordinal);
+
+ // 调试输出
+ System.Diagnostics.Debug.WriteLine($"[密码验证]");
+ System.Diagnostics.Debug.WriteLine($" 输入密码: {inputPassword}");
+ System.Diagnostics.Debug.WriteLine($" 盐值: {salt}");
+ System.Diagnostics.Debug.WriteLine($" 计算的哈希: {inputHash}");
+ System.Diagnostics.Debug.WriteLine($" 存储的哈希: {storedHash}");
+ System.Diagnostics.Debug.WriteLine($" 是否匹配: {isMatch}");
+
+ return isMatch;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"[密码验证异常] {ex.Message}");
+ return false;
+ }
+ }
+
+ ///
+ /// 测试密码加密功能
+ ///
+ public static void TestPasswordEncryption()
+ {
+ System.Diagnostics.Debug.WriteLine("=== 测试密码加密功能 ===");
+
+ // 测试 1: admin123
+ string salt1 = GenerateSalt();
+ string hash1 = HashPassword("admin123", salt1);
+ bool verify1 = VerifyPassword("admin123", hash1, salt1);
+
+ System.Diagnostics.Debug.WriteLine($"\n测试 1: admin123");
+ System.Diagnostics.Debug.WriteLine($" 盐值: {salt1}");
+ System.Diagnostics.Debug.WriteLine($" 哈希: {hash1}");
+ System.Diagnostics.Debug.WriteLine($" 验证: {verify1} (应该为 True)");
+
+ // 测试 2: 123
+ string salt2 = GenerateSalt();
+ string hash2 = HashPassword("123", salt2);
+ bool verify2 = VerifyPassword("123", hash2, salt2);
+
+ System.Diagnostics.Debug.WriteLine($"\n测试 2: 123");
+ System.Diagnostics.Debug.WriteLine($" 盐值: {salt2}");
+ System.Diagnostics.Debug.WriteLine($" 哈希: {hash2}");
+ System.Diagnostics.Debug.WriteLine($" 验证: {verify2} (应该为 True)");
+
+ // 测试 3: 错误密码
+ bool verify3 = VerifyPassword("wrongpassword", hash1, salt1);
+ System.Diagnostics.Debug.WriteLine($"\n测试 3: 错误密码");
+ System.Diagnostics.Debug.WriteLine($" 验证: {verify3} (应该为 False)");
+
+ System.Diagnostics.Debug.WriteLine("\n=== 测试完成 ===\n");
+ }
+ }
+}
diff --git a/全自动水压检测仪/DATA/User.cs b/全自动水压检测仪/DATA/User.cs
new file mode 100644
index 0000000..5dab064
--- /dev/null
+++ b/全自动水压检测仪/DATA/User.cs
@@ -0,0 +1,29 @@
+using System;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 用户模型类
+ ///
+ public class User
+ {
+ public int Id { get; set; }
+ public string Username { get; set; }
+ public string PasswordHash { get; set; }
+ public string Salt { get; set; }
+ public int UserRole { get; set; } // 0=普通用户,1=管理员
+ public int Status { get; set; } // 0=禁用,1=启用
+ public DateTime CreateTime { get; set; }
+ public DateTime? UpdateTime { get; set; }
+ public DateTime? LastLoginTime { get; set; }
+ }
+
+ ///
+ /// 用户角色枚举
+ ///
+ public enum UserRoleEnum
+ {
+ Normal = 0, // 普通用户
+ Admin = 1 // 管理员
+ }
+}
diff --git a/全自动水压检测仪/DATA/UserRepository.cs b/全自动水压检测仪/DATA/UserRepository.cs
new file mode 100644
index 0000000..7203107
--- /dev/null
+++ b/全自动水压检测仪/DATA/UserRepository.cs
@@ -0,0 +1,290 @@
+using Dapper;
+using MySql.Data.MySqlClient;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+
+namespace 全自动水压检测仪.DATA
+{
+ ///
+ /// 用户数据访问层
+ ///
+ public class UserRepository
+ {
+ private readonly string _connectionString;
+
+ public UserRepository()
+ {
+ _connectionString = "Server=localhost;Database=fullautowaterpressure;User=root;Password=123456;port=3306;charset=utf8;";
+ }
+
+ ///
+ /// 根据用户名查询用户
+ ///
+ /// 用户名
+ /// 用户对象,不存在返回null
+ public User GetUserByUsername(string username)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 明确指定字段映射,避免命名差异问题
+ string sql = @"SELECT
+ id AS Id,
+ username AS Username,
+ password_hash AS PasswordHash,
+ salt AS Salt,
+ user_role AS UserRole,
+ status AS Status,
+ create_time AS CreateTime,
+ update_time AS UpdateTime,
+ last_login_time AS LastLoginTime
+ FROM sys_users
+ WHERE username = @username AND status = 1";
+
+ var user = connection.QueryFirstOrDefault(sql, new { username });
+
+ // 调试输出
+ if (user != null)
+ {
+ System.Diagnostics.Debug.WriteLine($"\n[GetUserByUsername] 查询结果:");
+ System.Diagnostics.Debug.WriteLine($" 用户名: {user.Username}");
+ System.Diagnostics.Debug.WriteLine($" PasswordHash: '{user.PasswordHash ?? "(null)"}'");
+ System.Diagnostics.Debug.WriteLine($" PasswordHash 长度: {user.PasswordHash?.Length ?? 0}");
+ System.Diagnostics.Debug.WriteLine($" Salt: '{user.Salt ?? "(null)"}'");
+ System.Diagnostics.Debug.WriteLine($" UserRole: {user.UserRole}");
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine($"\n[GetUserByUsername] 未找到用户: {username}");
+ }
+
+ return user;
+ }
+ }
+
+ ///
+ /// 根据ID查询用户
+ ///
+ /// 用户ID
+ /// 用户对象,不存在返回null
+ public User GetUserById(int userId)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 明确指定字段映射
+ string sql = @"SELECT
+ id AS Id,
+ username AS Username,
+ password_hash AS PasswordHash,
+ salt AS Salt,
+ user_role AS UserRole,
+ status AS Status,
+ create_time AS CreateTime,
+ update_time AS UpdateTime,
+ last_login_time AS LastLoginTime
+ FROM sys_users
+ WHERE id = @id";
+
+ return connection.QueryFirstOrDefault(sql, new { id = userId });
+ }
+ }
+
+ ///
+ /// 创建用户
+ ///
+ /// 用户对象
+ /// 明文密码
+ /// 是否创建成功
+ public bool CreateUser(User user, string plainPassword)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 简单明文密码存储
+ string passwordHash = plainPassword; // 直接使用明文
+ string salt = ""; // 空字符串
+
+ string sql = @"INSERT INTO sys_users
+ (username, password_hash, salt, user_role, status, create_time)
+ VALUES
+ (@username, @passwordHash, @salt, @userRole, 1, CURRENT_TIMESTAMP)";
+
+ int result = connection.Execute(sql, new
+ {
+ username = user.Username,
+ passwordHash = passwordHash,
+ salt = salt,
+ userRole = user.UserRole
+ });
+
+ return result > 0;
+ }
+ }
+
+ ///
+ /// 更新用户信息
+ ///
+ /// 用户对象
+ /// 是否更新成功
+ public bool UpdateUser(User user)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+ string sql = @"UPDATE sys_users
+ SET username = @username, user_role = @userRole, status = @status
+ WHERE id = @id";
+
+ int result = connection.Execute(sql, new
+ {
+ username = user.Username,
+ userRole = user.UserRole,
+ status = user.Status,
+ id = user.Id
+ });
+
+ return result > 0;
+ }
+ }
+
+ ///
+ /// 删除用户
+ ///
+ /// 用户ID
+ /// 是否删除成功
+ public bool DeleteUser(int userId)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+ string sql = @"DELETE FROM sys_users WHERE id = @id";
+ int result = connection.Execute(sql, new { id = userId });
+ return result > 0;
+ }
+ }
+
+ ///
+ /// 获取所有用户
+ ///
+ /// 用户列表
+ public List GetAllUsers()
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 明确指定字段映射
+ string sql = @"SELECT
+ id AS Id,
+ username AS Username,
+ password_hash AS PasswordHash,
+ salt AS Salt,
+ user_role AS UserRole,
+ status AS Status,
+ create_time AS CreateTime,
+ update_time AS UpdateTime,
+ last_login_time AS LastLoginTime
+ FROM sys_users
+ ORDER BY create_time DESC";
+
+ return connection.Query(sql).ToList();
+ }
+ }
+
+ ///
+ /// 用户修改密码
+ ///
+ /// 用户ID
+ /// 旧密码
+ /// 新密码
+ /// 是否修改成功
+ public bool ChangePassword(int userId, string oldPassword, string newPassword)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 先验证旧密码
+ User user = GetUserById(userId);
+ if (user == null)
+ return false;
+
+ // 简单明文密码比较
+ if (user.PasswordHash != oldPassword)
+ return false;
+
+ // 更新新密码(明文)
+ string newPasswordHash = newPassword;
+ string newSalt = "";
+
+ string sql = @"UPDATE sys_users
+ SET password_hash = @passwordHash, salt = @salt, update_time = CURRENT_TIMESTAMP
+ WHERE id = @id";
+
+ int result = connection.Execute(sql, new
+ {
+ passwordHash = newPasswordHash,
+ salt = newSalt,
+ id = userId
+ });
+
+ return result > 0;
+ }
+ }
+
+ ///
+ /// 管理员重置用户密码
+ ///
+ /// 用户ID
+ /// 新密码
+ /// 是否重置成功
+ public bool ResetPassword(int userId, string newPassword)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+
+ // 简单明文密码存储
+ string newPasswordHash = newPassword;
+ string newSalt = "";
+
+ string sql = @"UPDATE sys_users
+ SET password_hash = @passwordHash, salt = @salt, update_time = CURRENT_TIMESTAMP
+ WHERE id = @id";
+
+ int result = connection.Execute(sql, new
+ {
+ passwordHash = newPasswordHash,
+ salt = newSalt,
+ id = userId
+ });
+
+ return result > 0;
+ }
+ }
+
+ ///
+ /// 更新最后登录时间
+ ///
+ /// 用户名
+ /// 是否更新成功
+ public bool UpdateLastLoginTime(string username)
+ {
+ using (var connection = new MySqlConnection(_connectionString))
+ {
+ connection.Open();
+ string sql = @"UPDATE sys_users
+ SET last_login_time = CURRENT_TIMESTAMP
+ WHERE username = @username";
+ int result = connection.Execute(sql, new { username });
+ return result > 0;
+ }
+ }
+ }
+}
diff --git a/全自动水压检测仪/Forms/ChangePasswordForm.Designer.cs b/全自动水压检测仪/Forms/ChangePasswordForm.Designer.cs
new file mode 100644
index 0000000..5fbfa35
--- /dev/null
+++ b/全自动水压检测仪/Forms/ChangePasswordForm.Designer.cs
@@ -0,0 +1,167 @@
+namespace 全自动水压检测仪
+{
+ partial class ChangePasswordForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnConfirm = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.txtConfirmPassword = new System.Windows.Forms.TextBox();
+ this.lblConfirmPassword = new System.Windows.Forms.Label();
+ this.txtNewPassword = new System.Windows.Forms.TextBox();
+ this.lblNewPassword = new System.Windows.Forms.Label();
+ this.txtOldPassword = new System.Windows.Forms.TextBox();
+ this.lblOldPassword = new System.Windows.Forms.Label();
+ this.panelMain = new System.Windows.Forms.Panel();
+ this.panelMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // btnConfirm
+ //
+ this.btnConfirm.Location = new System.Drawing.Point(120, 250);
+ this.btnConfirm.Name = "btnConfirm";
+ this.btnConfirm.Size = new System.Drawing.Size(90, 35);
+ this.btnConfirm.TabIndex = 6;
+ this.btnConfirm.Text = "确定";
+ this.btnConfirm.UseVisualStyleBackColor = true;
+ this.btnConfirm.Click += new System.EventHandler(this.btnConfirm_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(230, 250);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(90, 35);
+ this.btnCancel.TabIndex = 7;
+ this.btnCancel.Text = "取消";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // txtConfirmPassword
+ //
+ this.txtConfirmPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.txtConfirmPassword.Location = new System.Drawing.Point(120, 200);
+ this.txtConfirmPassword.Name = "txtConfirmPassword";
+ this.txtConfirmPassword.PasswordChar = '*';
+ this.txtConfirmPassword.Size = new System.Drawing.Size(200, 25);
+ this.txtConfirmPassword.TabIndex = 2;
+ //
+ // lblConfirmPassword
+ //
+ this.lblConfirmPassword.AutoSize = true;
+ this.lblConfirmPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblConfirmPassword.Location = new System.Drawing.Point(30, 205);
+ this.lblConfirmPassword.Name = "lblConfirmPassword";
+ this.lblConfirmPassword.Size = new System.Drawing.Size(88, 20);
+ this.lblConfirmPassword.TabIndex = 5;
+ this.lblConfirmPassword.Text = "确认密码:";
+ //
+ // txtNewPassword
+ //
+ this.txtNewPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.txtNewPassword.Location = new System.Drawing.Point(120, 155);
+ this.txtNewPassword.Name = "txtNewPassword";
+ this.txtNewPassword.PasswordChar = '*';
+ this.txtNewPassword.Size = new System.Drawing.Size(200, 25);
+ this.txtNewPassword.TabIndex = 1;
+ //
+ // lblNewPassword
+ //
+ this.lblNewPassword.AutoSize = true;
+ this.lblNewPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblNewPassword.Location = new System.Drawing.Point(30, 160);
+ this.lblNewPassword.Name = "lblNewPassword";
+ this.lblNewPassword.Size = new System.Drawing.Size(88, 20);
+ this.lblNewPassword.TabIndex = 3;
+ this.lblNewPassword.Text = "新密码:";
+ //
+ // txtOldPassword
+ //
+ this.txtOldPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.txtOldPassword.Location = new System.Drawing.Point(120, 110);
+ this.txtOldPassword.Name = "txtOldPassword";
+ this.txtOldPassword.PasswordChar = '*';
+ this.txtOldPassword.Size = new System.Drawing.Size(200, 25);
+ this.txtOldPassword.TabIndex = 0;
+ //
+ // lblOldPassword
+ //
+ this.lblOldPassword.AutoSize = true;
+ this.lblOldPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblOldPassword.Location = new System.Drawing.Point(30, 115);
+ this.lblOldPassword.Name = "lblOldPassword";
+ this.lblOldPassword.Size = new System.Drawing.Size(88, 20);
+ this.lblOldPassword.TabIndex = 4;
+ this.lblOldPassword.Text = "旧密码:";
+ //
+ // panelMain
+ //
+ this.panelMain.BackColor = System.Drawing.Color.White;
+ this.panelMain.Controls.Add(this.txtConfirmPassword);
+ this.panelMain.Controls.Add(this.lblConfirmPassword);
+ this.panelMain.Controls.Add(this.txtNewPassword);
+ this.panelMain.Controls.Add(this.lblNewPassword);
+ this.panelMain.Controls.Add(this.txtOldPassword);
+ this.panelMain.Controls.Add(this.lblOldPassword);
+ this.panelMain.Location = new System.Drawing.Point(60, 50);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.Size = new System.Drawing.Size(380, 320);
+ this.panelMain.TabIndex = 0;
+ //
+ // ChangePasswordForm
+ //
+ this.AcceptButton = this.btnConfirm;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(500, 400);
+ this.Controls.Add(this.btnConfirm);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.panelMain);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "ChangePasswordForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "修改密码";
+ this.panelMain.ResumeLayout(false);
+ this.panelMain.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox txtOldPassword;
+ private System.Windows.Forms.Label lblOldPassword;
+ private System.Windows.Forms.TextBox txtNewPassword;
+ private System.Windows.Forms.Label lblNewPassword;
+ private System.Windows.Forms.TextBox txtConfirmPassword;
+ private System.Windows.Forms.Label lblConfirmPassword;
+ private System.Windows.Forms.Button btnConfirm;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Panel panelMain;
+ }
+}
diff --git a/全自动水压检测仪/Forms/ChangePasswordForm.cs b/全自动水压检测仪/Forms/ChangePasswordForm.cs
new file mode 100644
index 0000000..820c946
--- /dev/null
+++ b/全自动水压检测仪/Forms/ChangePasswordForm.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Windows.Forms;
+using 全自动水压检测仪.DATA;
+
+namespace 全自动水压检测仪
+{
+ public partial class ChangePasswordForm : Form
+ {
+ private UserRepository _userRepository;
+
+ public ChangePasswordForm()
+ {
+ InitializeComponent();
+ _userRepository = new UserRepository();
+ }
+
+ ///
+ /// 确定按钮
+ ///
+ private void btnConfirm_Click(object sender, EventArgs e)
+ {
+ string oldPassword = txtOldPassword.Text;
+ string newPassword = txtNewPassword.Text;
+ string confirmPassword = txtConfirmPassword.Text;
+
+ // 验证
+ if (string.IsNullOrEmpty(oldPassword))
+ {
+ MessageBox.Show("请输入旧密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtOldPassword.Focus();
+ return;
+ }
+
+ if (string.IsNullOrEmpty(newPassword))
+ {
+ MessageBox.Show("请输入新密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtNewPassword.Focus();
+ return;
+ }
+
+ if (newPassword.Length < 6)
+ {
+ MessageBox.Show("新密码长度不能少于6位!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtNewPassword.Focus();
+ return;
+ }
+
+ if (string.IsNullOrEmpty(confirmPassword))
+ {
+ MessageBox.Show("请输入确认密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtConfirmPassword.Focus();
+ return;
+ }
+
+ if (newPassword != confirmPassword)
+ {
+ MessageBox.Show("两次输入的密码不一致!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtConfirmPassword.Focus();
+ return;
+ }
+
+ try
+ {
+ if (_userRepository.ChangePassword(LoginData.CurrentUserId, oldPassword, newPassword))
+ {
+ MessageBox.Show("密码修改成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ this.DialogResult = DialogResult.OK;
+ this.Close();
+ }
+ else
+ {
+ MessageBox.Show("旧密码错误,请重新输入!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ txtOldPassword.Clear();
+ txtOldPassword.Focus();
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"修改密码失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 取消按钮
+ ///
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ this.Close();
+ }
+ }
+}
diff --git a/全自动水压检测仪/Forms/LoginForm.Designer.cs b/全自动水压检测仪/Forms/LoginForm.Designer.cs
new file mode 100644
index 0000000..7d630ef
--- /dev/null
+++ b/全自动水压检测仪/Forms/LoginForm.Designer.cs
@@ -0,0 +1,203 @@
+namespace 全自动水压检测仪
+{
+ partial class LoginForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.lblUsername = new System.Windows.Forms.Label();
+ this.lblPassword = new System.Windows.Forms.Label();
+ this.txtUsername = new System.Windows.Forms.TextBox();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.btnLogin = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.panelMain = new System.Windows.Forms.Panel();
+ this.rbNormalUser = new System.Windows.Forms.RadioButton();
+ this.rbAdmin = new System.Windows.Forms.RadioButton();
+ this.lblUserType = new System.Windows.Forms.Label();
+ this.panelMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lblUsername
+ //
+ this.lblUsername.AutoSize = true;
+ this.lblUsername.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.lblUsername.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.lblUsername.Location = new System.Drawing.Point(91, 97);
+ this.lblUsername.Name = "lblUsername";
+ this.lblUsername.Size = new System.Drawing.Size(88, 25);
+ this.lblUsername.TabIndex = 1;
+ this.lblUsername.Text = "用户名:";
+ //
+ // lblPassword
+ //
+ this.lblPassword.AutoSize = true;
+ this.lblPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.lblPassword.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.lblPassword.Location = new System.Drawing.Point(91, 150);
+ this.lblPassword.Name = "lblPassword";
+ this.lblPassword.Size = new System.Drawing.Size(69, 25);
+ this.lblPassword.TabIndex = 2;
+ this.lblPassword.Text = "密码:";
+ //
+ // txtUsername
+ //
+ this.txtUsername.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.txtUsername.Location = new System.Drawing.Point(194, 94);
+ this.txtUsername.Name = "txtUsername";
+ this.txtUsername.Size = new System.Drawing.Size(285, 31);
+ this.txtUsername.TabIndex = 2;
+ //
+ // txtPassword
+ //
+ this.txtPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.txtPassword.Location = new System.Drawing.Point(194, 147);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '●';
+ this.txtPassword.Size = new System.Drawing.Size(285, 31);
+ this.txtPassword.TabIndex = 3;
+ this.txtPassword.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtPassword_KeyDown);
+ //
+ // btnLogin
+ //
+ this.btnLogin.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
+ this.btnLogin.FlatAppearance.BorderSize = 0;
+ this.btnLogin.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnLogin.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F, System.Drawing.FontStyle.Bold);
+ this.btnLogin.ForeColor = System.Drawing.Color.White;
+ this.btnLogin.Location = new System.Drawing.Point(194, 199);
+ this.btnLogin.Name = "btnLogin";
+ this.btnLogin.Size = new System.Drawing.Size(126, 35);
+ this.btnLogin.TabIndex = 4;
+ this.btnLogin.Text = "登录";
+ this.btnLogin.UseVisualStyleBackColor = false;
+ this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(230)))), ((int)(((byte)(230)))));
+ this.btnCancel.FlatAppearance.BorderSize = 0;
+ this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnCancel.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.btnCancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.btnCancel.Location = new System.Drawing.Point(354, 199);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(126, 35);
+ this.btnCancel.TabIndex = 5;
+ this.btnCancel.Text = "退出";
+ this.btnCancel.UseVisualStyleBackColor = false;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // panelMain
+ //
+ this.panelMain.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(235)))), ((int)(((byte)(240)))));
+ this.panelMain.Controls.Add(this.rbNormalUser);
+ this.panelMain.Controls.Add(this.rbAdmin);
+ this.panelMain.Controls.Add(this.lblUserType);
+ this.panelMain.Controls.Add(this.btnCancel);
+ this.panelMain.Controls.Add(this.btnLogin);
+ this.panelMain.Controls.Add(this.txtPassword);
+ this.panelMain.Controls.Add(this.lblPassword);
+ this.panelMain.Controls.Add(this.lblUsername);
+ this.panelMain.Controls.Add(this.txtUsername);
+ this.panelMain.Location = new System.Drawing.Point(91, 53);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.Size = new System.Drawing.Size(571, 265);
+ this.panelMain.TabIndex = 4;
+ this.panelMain.Paint += new System.Windows.Forms.PaintEventHandler(this.panelMain_Paint);
+ //
+ // rbNormalUser
+ //
+ this.rbNormalUser.AutoSize = true;
+ this.rbNormalUser.Checked = true;
+ this.rbNormalUser.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.rbNormalUser.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.rbNormalUser.Location = new System.Drawing.Point(354, 42);
+ this.rbNormalUser.Name = "rbNormalUser";
+ this.rbNormalUser.Size = new System.Drawing.Size(109, 29);
+ this.rbNormalUser.TabIndex = 1;
+ this.rbNormalUser.TabStop = true;
+ this.rbNormalUser.Text = "普通用户";
+ this.rbNormalUser.UseVisualStyleBackColor = true;
+ this.rbNormalUser.CheckedChanged += new System.EventHandler(this.rbUserType_CheckedChanged);
+ //
+ // rbAdmin
+ //
+ this.rbAdmin.AutoSize = true;
+ this.rbAdmin.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.rbAdmin.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.rbAdmin.Location = new System.Drawing.Point(211, 42);
+ this.rbAdmin.Name = "rbAdmin";
+ this.rbAdmin.Size = new System.Drawing.Size(90, 29);
+ this.rbAdmin.TabIndex = 0;
+ this.rbAdmin.Text = "管理员";
+ this.rbAdmin.UseVisualStyleBackColor = true;
+ this.rbAdmin.CheckedChanged += new System.EventHandler(this.rbUserType_CheckedChanged);
+ //
+ // lblUserType
+ //
+ this.lblUserType.AutoSize = true;
+ this.lblUserType.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F);
+ this.lblUserType.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
+ this.lblUserType.Location = new System.Drawing.Point(91, 44);
+ this.lblUserType.Name = "lblUserType";
+ this.lblUserType.Size = new System.Drawing.Size(107, 25);
+ this.lblUserType.TabIndex = 6;
+ this.lblUserType.Text = "用户类型:";
+ //
+ // LoginForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(230)))), ((int)(((byte)(235)))), ((int)(((byte)(240)))));
+ this.ClientSize = new System.Drawing.Size(754, 371);
+ this.Controls.Add(this.panelMain);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "LoginForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "用户登录";
+ this.panelMain.ResumeLayout(false);
+ this.panelMain.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lblUsername;
+ private System.Windows.Forms.Label lblPassword;
+ private System.Windows.Forms.TextBox txtUsername;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Button btnLogin;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Panel panelMain;
+ private System.Windows.Forms.Label lblUserType;
+ private System.Windows.Forms.RadioButton rbAdmin;
+ private System.Windows.Forms.RadioButton rbNormalUser;
+ }
+}
diff --git a/全自动水压检测仪/Forms/LoginForm.cs b/全自动水压检测仪/Forms/LoginForm.cs
new file mode 100644
index 0000000..a72d81a
--- /dev/null
+++ b/全自动水压检测仪/Forms/LoginForm.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Windows.Forms;
+using 全自动水压检测仪.DATA;
+
+namespace 全自动水压检测仪
+{
+ public partial class LoginForm : Form
+ {
+ private UserRepository _userRepository;
+ private int _selectedUserType = 0; // 0=普通用户, 1=管理员
+
+ public LoginForm()
+ {
+ InitializeComponent();
+ _userRepository = new UserRepository();
+ }
+
+ ///
+ /// 用户类型切换事件
+ ///
+ private void rbUserType_CheckedChanged(object sender, EventArgs e)
+ {
+ if (rbAdmin.Checked)
+ {
+ _selectedUserType = 1; // 管理员
+ }
+ else if (rbNormalUser.Checked)
+ {
+ _selectedUserType = 0; // 普通用户
+ }
+
+ // 切换用户类型时自动清空用户名和密码
+ txtUsername.Clear();
+ txtPassword.Clear();
+ txtUsername.Focus();
+ }
+
+ ///
+ /// 登录按钮点击事件
+ ///
+ private void btnLogin_Click(object sender, EventArgs e)
+ {
+ string username = txtUsername.Text.Trim();
+ string password = txtPassword.Text;
+
+ // 输入验证
+ if (string.IsNullOrEmpty(username))
+ {
+ MessageBox.Show("请输入用户名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtUsername.Focus();
+ return;
+ }
+
+ if (string.IsNullOrEmpty(password))
+ {
+ MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtPassword.Focus();
+ return;
+ }
+
+ try
+ {
+ // 查询用户
+ User user = _userRepository.GetUserByUsername(username);
+
+ if (user == null)
+ {
+ MessageBox.Show("用户名或密码错误!", "登录失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ txtPassword.Clear();
+ txtPassword.Focus();
+ return;
+ }
+
+ // 获取数据库中存储的密码
+ string storedPassword = user.PasswordHash ?? "";
+
+ // 详细调试输出
+ System.Diagnostics.Debug.WriteLine($"\n========== 登录验证详细信息 ==========");
+ System.Diagnostics.Debug.WriteLine($"用户名: {username}");
+ System.Diagnostics.Debug.WriteLine($"输入密码: '{password}'");
+ System.Diagnostics.Debug.WriteLine($"输入密码长度: {password.Length}");
+ System.Diagnostics.Debug.WriteLine($"数据库密码: '{storedPassword}'");
+ System.Diagnostics.Debug.WriteLine($"数据库密码长度: {storedPassword.Length}");
+ System.Diagnostics.Debug.WriteLine($"盐值: '{user.Salt ?? "(null)"}'");
+
+ // 检查是否是旧的加密格式(Base64 编码的哈希值)
+ bool isOldFormat = storedPassword.Length > 20 && (storedPassword.Contains("+") || storedPassword.Contains("/") || storedPassword.Contains("="));
+ System.Diagnostics.Debug.WriteLine($"是否旧格式: {isOldFormat}");
+
+ bool passwordValid = false;
+
+ if (isOldFormat)
+ {
+ // 旧格式:需要重置
+ System.Diagnostics.Debug.WriteLine($"检测到旧的加密格式,需要重置密码");
+ MessageBox.Show("检测到旧的密码格式!\n\n请重启程序,系统会自动修复密码。\n\n或者手动运行 SQL 脚本:\n查询并修复密码.sql",
+ "需要重置密码", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtPassword.Clear();
+ txtPassword.Focus();
+ return;
+ }
+ else
+ {
+ // 新格式:明文比较
+ passwordValid = (password == storedPassword);
+ System.Diagnostics.Debug.WriteLine($"明文比较结果: {passwordValid}");
+
+ // 逐字符比较(用于调试)
+ if (!passwordValid && password.Length == storedPassword.Length)
+ {
+ System.Diagnostics.Debug.WriteLine($"逐字符比较:");
+ for (int i = 0; i < password.Length; i++)
+ {
+ char c1 = password[i];
+ char c2 = storedPassword[i];
+ System.Diagnostics.Debug.WriteLine($" 位置 {i}: 输入='{c1}'({(int)c1}) 数据库='{c2}'({(int)c2}) 相同={c1 == c2}");
+ }
+ }
+ }
+
+ System.Diagnostics.Debug.WriteLine($"最终验证结果: {passwordValid}");
+ System.Diagnostics.Debug.WriteLine($"======================================\n");
+
+ if (!passwordValid)
+ {
+ MessageBox.Show("用户名或密码错误!", "登录失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ txtPassword.Clear();
+ txtPassword.Focus();
+ return;
+ }
+
+ // 验证用户类型是否匹配
+ if (user.UserRole != _selectedUserType)
+ {
+ string expectedType = _selectedUserType == 1 ? "管理员" : "普通用户";
+ string actualType = user.UserRole == 1 ? "管理员" : "普通用户";
+ MessageBox.Show($"用户类型不匹配!\n\n该账户是【{actualType}】\n请选择正确的用户类型后重新登录。",
+ "登录失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ // 登录成功
+ _userRepository.UpdateLastLoginTime(username);
+
+ // 保存登录信息到LoginData
+ LoginData.UserName = username;
+ LoginData.UserPower = user.UserRole;
+ LoginData.CurrentUserId = user.Id;
+ LoginData.LoginTime = DateTime.Now;
+
+ // 关闭登录窗体,返回 DialogResult.OK
+ this.DialogResult = DialogResult.OK;
+ this.Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"登录失败:{ex.Message}\n\n请检查数据库连接是否正常。", "错误",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 退出按钮点击事件
+ ///
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ Application.Exit();
+ }
+
+ ///
+ /// 回车键快速登录
+ ///
+ private void txtPassword_KeyDown(object sender, KeyEventArgs e)
+ {
+ if (e.KeyCode == Keys.Enter)
+ {
+ btnLogin_Click(sender, e);
+ }
+ }
+
+ private void panelMain_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+ }
+}
diff --git a/全自动水压检测仪/Forms/LoginForm.resx b/全自动水压检测仪/Forms/LoginForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/全自动水压检测仪/Forms/LoginForm.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/全自动水压检测仪/Forms/UserEditForm.Designer.cs b/全自动水压检测仪/Forms/UserEditForm.Designer.cs
new file mode 100644
index 0000000..7c01ae8
--- /dev/null
+++ b/全自动水压检测仪/Forms/UserEditForm.Designer.cs
@@ -0,0 +1,185 @@
+namespace 全自动水压检测仪
+{
+ partial class UserEditForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnSave = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.chkStatus = new System.Windows.Forms.CheckBox();
+ this.cmbUserRole = new System.Windows.Forms.ComboBox();
+ this.lblUserRole = new System.Windows.Forms.Label();
+ this.lblPassword = new System.Windows.Forms.Label();
+ this.lblUsername = new System.Windows.Forms.Label();
+ this.txtPassword = new System.Windows.Forms.TextBox();
+ this.txtUsername = new System.Windows.Forms.TextBox();
+ this.panelMain = new System.Windows.Forms.Panel();
+ this.panelMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // btnSave
+ //
+ this.btnSave.Location = new System.Drawing.Point(150, 230);
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Size = new System.Drawing.Size(90, 35);
+ this.btnSave.TabIndex = 6;
+ this.btnSave.Text = "保存";
+ this.btnSave.UseVisualStyleBackColor = true;
+ this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(260, 230);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(90, 35);
+ this.btnCancel.TabIndex = 7;
+ this.btnCancel.Text = "取消";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+ //
+ // chkStatus
+ //
+ this.chkStatus.AutoSize = true;
+ this.chkStatus.Checked = true;
+ this.chkStatus.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.chkStatus.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.chkStatus.Location = new System.Drawing.Point(150, 190);
+ this.chkStatus.Name = "chkStatus";
+ this.chkStatus.Size = new System.Drawing.Size(78, 24);
+ this.chkStatus.TabIndex = 5;
+ this.chkStatus.Text = "启用";
+ //
+ // cmbUserRole
+ //
+ this.cmbUserRole.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cmbUserRole.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.cmbUserRole.FormattingEnabled = true;
+ this.cmbUserRole.Items.AddRange(new object[] {
+ "普通用户",
+ "管理员"});
+ this.cmbUserRole.Location = new System.Drawing.Point(150, 155);
+ this.cmbUserRole.Name = "cmbUserRole";
+ this.cmbUserRole.Size = new System.Drawing.Size(200, 28);
+ this.cmbUserRole.TabIndex = 4;
+ //
+ // lblUserRole
+ //
+ this.lblUserRole.AutoSize = true;
+ this.lblUserRole.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblUserRole.Location = new System.Drawing.Point(60, 160);
+ this.lblUserRole.Name = "lblUserRole";
+ this.lblUserRole.Size = new System.Drawing.Size(68, 20);
+ this.lblUserRole.TabIndex = 3;
+ this.lblUserRole.Text = "用户角色:";
+ //
+ // lblPassword
+ //
+ this.lblPassword.AutoSize = true;
+ this.lblPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblPassword.Location = new System.Drawing.Point(60, 120);
+ this.lblPassword.Name = "lblPassword";
+ this.lblPassword.Size = new System.Drawing.Size(68, 20);
+ this.lblPassword.TabIndex = 2;
+ this.lblPassword.Text = "密码:";
+ //
+ // lblUsername
+ //
+ this.lblUsername.AutoSize = true;
+ this.lblUsername.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.lblUsername.Location = new System.Drawing.Point(60, 80);
+ this.lblUsername.Name = "lblUsername";
+ this.lblUsername.Size = new System.Drawing.Size(68, 20);
+ this.lblUsername.TabIndex = 1;
+ this.lblUsername.Text = "用户名:";
+ //
+ // txtPassword
+ //
+ this.txtPassword.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.txtPassword.Location = new System.Drawing.Point(150, 117);
+ this.txtPassword.Name = "txtPassword";
+ this.txtPassword.PasswordChar = '*';
+ this.txtPassword.Size = new System.Drawing.Size(200, 25);
+ this.txtPassword.TabIndex = 1;
+ //
+ // txtUsername
+ //
+ this.txtUsername.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+ this.txtUsername.Location = new System.Drawing.Point(150, 77);
+ this.txtUsername.Name = "txtUsername";
+ this.txtUsername.Size = new System.Drawing.Size(200, 25);
+ this.txtUsername.TabIndex = 0;
+ //
+ // panelMain
+ //
+ this.panelMain.BackColor = System.Drawing.Color.White;
+ this.panelMain.Controls.Add(this.chkStatus);
+ this.panelMain.Controls.Add(this.cmbUserRole);
+ this.panelMain.Controls.Add(this.lblUserRole);
+ this.panelMain.Controls.Add(this.lblPassword);
+ this.panelMain.Controls.Add(this.lblUsername);
+ this.panelMain.Controls.Add(this.txtPassword);
+ this.panelMain.Controls.Add(this.txtUsername);
+ this.panelMain.Location = new System.Drawing.Point(60, 50);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.Size = new System.Drawing.Size(400, 300);
+ this.panelMain.TabIndex = 0;
+ //
+ // UserEditForm
+ //
+ this.AcceptButton = this.btnSave;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(520, 380);
+ this.Controls.Add(this.btnSave);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.panelMain);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "UserEditForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "UserEditForm";
+ this.panelMain.ResumeLayout(false);
+ this.panelMain.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TextBox txtUsername;
+ private System.Windows.Forms.TextBox txtPassword;
+ private System.Windows.Forms.Label lblUsername;
+ private System.Windows.Forms.Label lblPassword;
+ private System.Windows.Forms.Label lblUserRole;
+ private System.Windows.Forms.ComboBox cmbUserRole;
+ private System.Windows.Forms.CheckBox chkStatus;
+ private System.Windows.Forms.Button btnSave;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Panel panelMain;
+ }
+}
diff --git a/全自动水压检测仪/Forms/UserEditForm.cs b/全自动水压检测仪/Forms/UserEditForm.cs
new file mode 100644
index 0000000..bfe2403
--- /dev/null
+++ b/全自动水压检测仪/Forms/UserEditForm.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Windows.Forms;
+using 全自动水压检测仪.DATA;
+
+namespace 全自动水压检测仪
+{
+ public partial class UserEditForm : Form
+ {
+ private UserRepository _userRepository;
+ private User _user;
+ private bool _isEditMode;
+
+ public UserEditForm() : this(null) { }
+
+ public UserEditForm(User user)
+ {
+ InitializeComponent();
+ _userRepository = new UserRepository();
+ _user = user;
+ _isEditMode = user != null;
+
+ InitializeFormData();
+ }
+
+ ///
+ /// 初始化表单数据
+ ///
+ private void InitializeFormData()
+ {
+ if (_isEditMode)
+ {
+ this.Text = "编辑用户";
+ txtUsername.Text = _user.Username;
+ txtUsername.ReadOnly = true; // 编辑模式不能修改用户名
+ txtPassword.Visible = false;
+ lblPassword.Visible = false;
+ cmbUserRole.SelectedIndex = _user.UserRole;
+ chkStatus.Checked = _user.Status == 1;
+ }
+ else
+ {
+ this.Text = "添加用户";
+ cmbUserRole.SelectedIndex = 0; // 默认为普通用户
+ chkStatus.Checked = true;
+ }
+ }
+
+ ///
+ /// 保存按钮
+ ///
+ private void btnSave_Click(object sender, EventArgs e)
+ {
+ string username = txtUsername.Text.Trim();
+ string password = txtPassword.Text;
+ int userRole = cmbUserRole.SelectedIndex;
+ int status = chkStatus.Checked ? 1 : 0;
+
+ // 验证
+ if (string.IsNullOrEmpty(username))
+ {
+ MessageBox.Show("请输入用户名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtUsername.Focus();
+ return;
+ }
+
+ if (!_isEditMode && string.IsNullOrEmpty(password))
+ {
+ MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtPassword.Focus();
+ return;
+ }
+
+ if (!_isEditMode && password.Length < 6)
+ {
+ MessageBox.Show("密码长度不能少于6位!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ txtPassword.Focus();
+ return;
+ }
+
+ try
+ {
+ if (_isEditMode)
+ {
+ // 编辑模式:更新用户信息
+ _user.Username = username;
+ _user.UserRole = userRole;
+ _user.Status = status;
+
+ if (_userRepository.UpdateUser(_user))
+ {
+ MessageBox.Show("用户信息更新成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ this.DialogResult = DialogResult.OK;
+ this.Close();
+ }
+ else
+ {
+ MessageBox.Show("用户信息更新失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ else
+ {
+ // 添加模式:创建新用户
+ var newUser = new User
+ {
+ Username = username,
+ UserRole = userRole,
+ Status = status
+ };
+
+ if (_userRepository.CreateUser(newUser, password))
+ {
+ MessageBox.Show("用户创建成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ this.DialogResult = DialogResult.OK;
+ this.Close();
+ }
+ else
+ {
+ MessageBox.Show("用户创建失败,用户名可能已存在!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"操作失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 取消按钮
+ ///
+ private void btnCancel_Click(object sender, EventArgs e)
+ {
+ this.DialogResult = DialogResult.Cancel;
+ this.Close();
+ }
+ }
+}
diff --git a/全自动水压检测仪/Forms/UserManagerForm.Designer.cs b/全自动水压检测仪/Forms/UserManagerForm.Designer.cs
new file mode 100644
index 0000000..a39f3ca
--- /dev/null
+++ b/全自动水压检测仪/Forms/UserManagerForm.Designer.cs
@@ -0,0 +1,190 @@
+namespace 全自动水压检测仪
+{
+ partial class UserManagerForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.dgvUsers = new System.Windows.Forms.DataGridView();
+ this.btnRefresh = new System.Windows.Forms.Button();
+ this.btnResetPassword = new System.Windows.Forms.Button();
+ this.btnDeleteUser = new System.Windows.Forms.Button();
+ this.btnEditUser = new System.Windows.Forms.Button();
+ this.btnAddUser = new System.Windows.Forms.Button();
+ this.panelTop = new System.Windows.Forms.Panel();
+ this.lblTitle = new System.Windows.Forms.Label();
+ this.panelBottom = new System.Windows.Forms.Panel();
+ this.panelMain = new System.Windows.Forms.Panel();
+ ((System.ComponentModel.ISupportInitialize)(this.dgvUsers)).BeginInit();
+ this.panelTop.SuspendLayout();
+ this.panelBottom.SuspendLayout();
+ this.panelMain.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // dgvUsers
+ //
+ this.dgvUsers.AllowUserToAddRows = false;
+ this.dgvUsers.AllowUserToDeleteRows = false;
+ this.dgvUsers.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
+ this.dgvUsers.BackgroundColor = System.Drawing.Color.White;
+ this.dgvUsers.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.dgvUsers.Location = new System.Drawing.Point(10, 10);
+ this.dgvUsers.Name = "dgvUsers";
+ this.dgvUsers.ReadOnly = true;
+ this.dgvUsers.RowHeadersVisible = false;
+ this.dgvUsers.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
+ this.dgvUsers.Size = new System.Drawing.Size(780, 350);
+ this.dgvUsers.TabIndex = 0;
+ this.dgvUsers.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvUsers_CellClick);
+ //
+ // btnRefresh
+ //
+ this.btnRefresh.Location = new System.Drawing.Point(450, 10);
+ this.btnRefresh.Name = "btnRefresh";
+ this.btnRefresh.Size = new System.Drawing.Size(90, 35);
+ this.btnRefresh.TabIndex = 4;
+ this.btnRefresh.Text = "刷新";
+ this.btnRefresh.UseVisualStyleBackColor = true;
+ this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click);
+ //
+ // btnResetPassword
+ //
+ this.btnResetPassword.Location = new System.Drawing.Point(340, 10);
+ this.btnResetPassword.Name = "btnResetPassword";
+ this.btnResetPassword.Size = new System.Drawing.Size(90, 35);
+ this.btnResetPassword.TabIndex = 3;
+ this.btnResetPassword.Text = "重置密码";
+ this.btnResetPassword.UseVisualStyleBackColor = true;
+ this.btnResetPassword.Click += new System.EventHandler(this.btnResetPassword_Click);
+ //
+ // btnDeleteUser
+ //
+ this.btnDeleteUser.Location = new System.Drawing.Point(230, 10);
+ this.btnDeleteUser.Name = "btnDeleteUser";
+ this.btnDeleteUser.Size = new System.Drawing.Size(90, 35);
+ this.btnDeleteUser.TabIndex = 2;
+ this.btnDeleteUser.Text = "删除用户";
+ this.btnDeleteUser.UseVisualStyleBackColor = true;
+ this.btnDeleteUser.Click += new System.EventHandler(this.btnDeleteUser_Click);
+ //
+ // btnEditUser
+ //
+ this.btnEditUser.Location = new System.Drawing.Point(120, 10);
+ this.btnEditUser.Name = "btnEditUser";
+ this.btnEditUser.Size = new System.Drawing.Size(90, 35);
+ this.btnEditUser.TabIndex = 1;
+ this.btnEditUser.Text = "编辑用户";
+ this.btnEditUser.UseVisualStyleBackColor = true;
+ this.btnEditUser.Click += new System.EventHandler(this.btnEditUser_Click);
+ //
+ // btnAddUser
+ //
+ this.btnAddUser.Location = new System.Drawing.Point(10, 10);
+ this.btnAddUser.Name = "btnAddUser";
+ this.btnAddUser.Size = new System.Drawing.Size(90, 35);
+ this.btnAddUser.TabIndex = 0;
+ this.btnAddUser.Text = "添加用户";
+ this.btnAddUser.UseVisualStyleBackColor = true;
+ this.btnAddUser.Click += new System.EventHandler(this.btnAddUser_Click);
+ //
+ // panelTop
+ //
+ this.panelTop.Controls.Add(this.lblTitle);
+ this.panelTop.Dock = System.Windows.Forms.DockStyle.Top;
+ this.panelTop.Location = new System.Drawing.Point(0, 0);
+ this.panelTop.Name = "panelTop";
+ this.panelTop.Size = new System.Drawing.Size(800, 50);
+ this.panelTop.TabIndex = 1;
+ //
+ // lblTitle
+ //
+ this.lblTitle.AutoSize = true;
+ this.lblTitle.Font = new System.Drawing.Font("Microsoft YaHei UI", 16F, System.Drawing.FontStyle.Bold);
+ this.lblTitle.Location = new System.Drawing.Point(15, 10);
+ this.lblTitle.Name = "lblTitle";
+ this.lblTitle.Size = new System.Drawing.Size(108, 31);
+ this.lblTitle.TabIndex = 0;
+ this.lblTitle.Text = "用户管理";
+ //
+ // panelBottom
+ //
+ this.panelBottom.Controls.Add(this.btnRefresh);
+ this.panelBottom.Controls.Add(this.btnResetPassword);
+ this.panelBottom.Controls.Add(this.btnDeleteUser);
+ this.panelBottom.Controls.Add(this.btnEditUser);
+ this.panelBottom.Controls.Add(this.btnAddUser);
+ this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.panelBottom.Location = new System.Drawing.Point(0, 420);
+ this.panelBottom.Name = "panelBottom";
+ this.panelBottom.Size = new System.Drawing.Size(800, 60);
+ this.panelBottom.TabIndex = 2;
+ //
+ // panelMain
+ //
+ this.panelMain.Controls.Add(this.dgvUsers);
+ this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.panelMain.Location = new System.Drawing.Point(0, 50);
+ this.panelMain.Name = "panelMain";
+ this.panelMain.Size = new System.Drawing.Size(800, 370);
+ this.panelMain.TabIndex = 3;
+ //
+ // UserManagerForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(800, 480);
+ this.Controls.Add(this.panelMain);
+ this.Controls.Add(this.panelBottom);
+ this.Controls.Add(this.panelTop);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.MaximizeBox = false;
+ this.Name = "UserManagerForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "用户管理";
+ this.Load += new System.EventHandler(this.UserManagerForm_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.dgvUsers)).EndInit();
+ this.panelTop.ResumeLayout(false);
+ this.panelTop.PerformLayout();
+ this.panelBottom.ResumeLayout(false);
+ this.panelMain.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.DataGridView dgvUsers;
+ private System.Windows.Forms.Button btnRefresh;
+ private System.Windows.Forms.Button btnResetPassword;
+ private System.Windows.Forms.Button btnDeleteUser;
+ private System.Windows.Forms.Button btnEditUser;
+ private System.Windows.Forms.Button btnAddUser;
+ private System.Windows.Forms.Panel panelTop;
+ private System.Windows.Forms.Label lblTitle;
+ private System.Windows.Forms.Panel panelBottom;
+ private System.Windows.Forms.Panel panelMain;
+ }
+}
diff --git a/全自动水压检测仪/Forms/UserManagerForm.cs b/全自动水压检测仪/Forms/UserManagerForm.cs
new file mode 100644
index 0000000..fb39461
--- /dev/null
+++ b/全自动水压检测仪/Forms/UserManagerForm.cs
@@ -0,0 +1,287 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using 全自动水压检测仪.DATA;
+
+namespace 全自动水压检测仪
+{
+ public partial class UserManagerForm : Form
+ {
+ private UserRepository _userRepository;
+ private List _users;
+
+ public UserManagerForm()
+ {
+ InitializeComponent();
+ _userRepository = new UserRepository();
+ }
+
+ ///
+ /// 窗体加载事件
+ ///
+ private void UserManagerForm_Load(object sender, EventArgs e)
+ {
+ LoadUsers();
+ }
+
+ ///
+ /// 加载用户列表
+ ///
+ private void LoadUsers()
+ {
+ try
+ {
+ _users = _userRepository.GetAllUsers();
+
+ // 配置 DataGridView 列
+ dgvUsers.Columns.Clear();
+ dgvUsers.AutoGenerateColumns = false;
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "Id",
+ HeaderText = "ID",
+ Visible = false
+ });
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "Username",
+ HeaderText = "用户名"
+ });
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "UserRole",
+ HeaderText = "角色"
+ });
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "Status",
+ HeaderText = "状态"
+ });
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "CreateTime",
+ HeaderText = "创建时间",
+ DefaultCellStyle = new DataGridViewCellStyle { Format = "yyyy-MM-dd HH:mm:ss" }
+ });
+
+ dgvUsers.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ DataPropertyName = "LastLoginTime",
+ HeaderText = "最后登录时间",
+ DefaultCellStyle = new DataGridViewCellStyle { Format = "yyyy-MM-dd HH:mm:ss", NullValue = "" }
+ });
+
+ // 绑定数据
+ var displayData = _users.Select(u => new
+ {
+ u.Id,
+ u.Username,
+ UserRole = u.UserRole == 1 ? "管理员" : "普通用户",
+ Status = u.Status == 1 ? "启用" : "禁用",
+ u.CreateTime,
+ LastLoginTime = u.LastLoginTime.HasValue ? u.LastLoginTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
+ }).ToList();
+
+ dgvUsers.DataSource = displayData;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"加载用户列表失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 添加用户按钮
+ ///
+ private void btnAddUser_Click(object sender, EventArgs e)
+ {
+ var addUserForm = new UserEditForm();
+ if (addUserForm.ShowDialog() == DialogResult.OK)
+ {
+ LoadUsers();
+ MessageBox.Show("用户添加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+
+ ///
+ /// 编辑用户按钮
+ ///
+ private void btnEditUser_Click(object sender, EventArgs e)
+ {
+ if (dgvUsers.CurrentRow == null)
+ {
+ MessageBox.Show("请先选择要编辑的用户!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ int userId = Convert.ToInt32(dgvUsers.CurrentRow.Cells[0].Value);
+ User selectedUser = _userRepository.GetUserById(userId);
+
+ if (selectedUser == null)
+ {
+ MessageBox.Show("未找到用户信息!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ var editUserForm = new UserEditForm(selectedUser);
+
+ if (editUserForm.ShowDialog() == DialogResult.OK)
+ {
+ LoadUsers();
+ MessageBox.Show("用户信息更新成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+
+ ///
+ /// 删除用户按钮
+ ///
+ private void btnDeleteUser_Click(object sender, EventArgs e)
+ {
+ if (dgvUsers.CurrentRow == null)
+ {
+ MessageBox.Show("请先选择要删除的用户!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ int userId = Convert.ToInt32(dgvUsers.CurrentRow.Cells[0].Value);
+ string username = dgvUsers.CurrentRow.Cells[1].Value.ToString();
+
+ if (userId == LoginData.CurrentUserId)
+ {
+ MessageBox.Show("不能删除当前登录的用户!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ if (MessageBox.Show($"确定要删除用户 {username} 吗?", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ try
+ {
+ if (_userRepository.DeleteUser(userId))
+ {
+ LoadUsers();
+ MessageBox.Show("用户删除成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("用户删除失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"删除用户失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+
+ ///
+ /// 重置密码按钮
+ ///
+ private void btnResetPassword_Click(object sender, EventArgs e)
+ {
+ if (dgvUsers.CurrentRow == null)
+ {
+ MessageBox.Show("请先选择要重置密码的用户!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ int userId = Convert.ToInt32(dgvUsers.CurrentRow.Cells[0].Value);
+ string username = dgvUsers.CurrentRow.Cells[1].Value.ToString();
+
+ string newPassword = string.Empty;
+
+ using (var inputForm = new Form())
+ {
+ inputForm.Text = "重置密码";
+ inputForm.FormBorderStyle = FormBorderStyle.FixedDialog;
+ inputForm.StartPosition = FormStartPosition.CenterScreen;
+ inputForm.Size = new System.Drawing.Size(300, 150);
+
+ var label = new Label
+ {
+ Text = $"请输入 {username} 的新密码:",
+ Location = new System.Drawing.Point(10, 10),
+ Size = new System.Drawing.Size(280, 20)
+ };
+
+ var textBox = new TextBox
+ {
+ Location = new System.Drawing.Point(10, 35),
+ Size = new System.Drawing.Size(260, 25),
+ PasswordChar = '*'
+ };
+
+ var btnOk = new Button
+ {
+ Text = "确定",
+ DialogResult = DialogResult.OK,
+ Location = new System.Drawing.Point(70, 70),
+ Size = new System.Drawing.Size(80, 30)
+ };
+
+ var btnCancel = new Button
+ {
+ Text = "取消",
+ DialogResult = DialogResult.Cancel,
+ Location = new System.Drawing.Point(160, 70),
+ Size = new System.Drawing.Size(80, 30)
+ };
+
+ inputForm.Controls.AddRange(new Control[] { label, textBox, btnOk, btnCancel });
+ inputForm.AcceptButton = btnOk;
+ inputForm.CancelButton = btnCancel;
+
+ if (inputForm.ShowDialog() == DialogResult.OK)
+ {
+ newPassword = textBox.Text.Trim();
+ }
+ }
+
+ if (string.IsNullOrEmpty(newPassword) || newPassword.Length < 6)
+ {
+ MessageBox.Show("密码长度不能少于6位!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ try
+ {
+ if (_userRepository.ResetPassword(userId, newPassword))
+ {
+ MessageBox.Show("密码重置成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("密码重置失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"重置密码失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// 刷新按钮
+ ///
+ private void btnRefresh_Click(object sender, EventArgs e)
+ {
+ LoadUsers();
+ }
+
+ ///
+ /// 表格行点击事件
+ ///
+ private void dgvUsers_CellClick(object sender, DataGridViewCellEventArgs e)
+ {
+ if (e.RowIndex >= 0 && e.RowIndex < dgvUsers.Rows.Count)
+ {
+ dgvUsers.Rows[e.RowIndex].Selected = true;
+ }
+ }
+ }
+}
diff --git a/全自动水压检测仪/NormalTemperatureMode.cs b/全自动水压检测仪/NormalTemperatureMode.cs
index e0c96b4..333b51c 100644
--- a/全自动水压检测仪/NormalTemperatureMode.cs
+++ b/全自动水压检测仪/NormalTemperatureMode.cs
@@ -708,6 +708,24 @@ namespace 全自动水压检测仪
private void NormalTemperatureMode_Load(object sender, EventArgs e)
{
+ // 权限检查:只有管理员才能看到"录入系统"按钮
+ if (!LoginData.IsAdmin())
+ {
+ // 普通用户隐藏"录入系统"按钮
+ uiButton7.Visible = false;
+
+ // 调试输出
+ System.Diagnostics.Debug.WriteLine($"[NormalTemperatureMode] 普通用户登录,隐藏录入系统按钮");
+ }
+ else
+ {
+ // 管理员显示"录入系统"按钮
+ uiButton7.Visible = true;
+
+ // 调试输出
+ System.Diagnostics.Debug.WriteLine($"[NormalTemperatureMode] 管理员登录,显示录入系统按钮");
+ }
+
string plcIp = "192.168.1.10";
//string plcIp = "127.0.0.1";
bool initSuccess = Data.ModbusResourceManager.Instance.Init(plcIp, 502);
diff --git a/全自动水压检测仪/Program.cs b/全自动水压检测仪/Program.cs
index ed289bb..063cbc2 100644
--- a/全自动水压检测仪/Program.cs
+++ b/全自动水压检测仪/Program.cs
@@ -10,29 +10,193 @@ namespace 全自动水压检测仪
{
internal static class Program
{
-
+
///
/// 应用程序的主入口点。
///
[STAThread]
- static void Main()
- {
+ static void Main(string[] args)
+ {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
- //Coeffiicientsetting coeffiicientsetting = new Coeffiicientsetting();
- //HighTemperatureMode highTemperatureMode = new HighTemperatureMode();
- //NormalTemperatureMode normalTemperatureMode = new NormalTemperatureMode();
+ try
+ {
+ // 测试密码加密功能
+ System.Diagnostics.Debug.WriteLine("\n========================================");
+ System.Diagnostics.Debug.WriteLine("程序启动 - 密码加密测试");
+ System.Diagnostics.Debug.WriteLine("========================================");
+ PasswordHelper.TestPasswordEncryption();
- //FormManager.Instance
- // .RegisterForm(coeffiicientsetting)
- // .RegisterForm(highTemperatureMode)
- // .RegisterForm(normalTemperatureMode);
+ // 检查是否有重置参数
+ bool forceReset = args.Length > 0 && args[0].ToLower() == "--reset-users";
+ if (forceReset)
+ {
+ var result = MessageBox.Show(
+ "确定要重置默认用户吗?\n\n这将删除并重新创建:\n• admin / admin123 (管理员)\n• cgx / 123 (普通用户)\n\n其他用户不受影响。",
+ "重置默认用户",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question);
- //Application.Run(normalTemperatureMode);
- Application.Run(new ScanImport());
+ if (result == DialogResult.Yes)
+ {
+ DatabaseInitializer.Initialize();
+ DatabaseInitializer.ForceResetDefaultUsers();
+ MessageBox.Show("默认用户已重置!\n\n管理员: admin / admin123\n普通用户: cgx / 123",
+ "重置成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ return;
+ }
+
+ // 初始化数据库表和默认管理员账户
+ System.Diagnostics.Debug.WriteLine("\n========================================");
+ System.Diagnostics.Debug.WriteLine("初始化数据库");
+ System.Diagnostics.Debug.WriteLine("========================================");
+ DatabaseInitializer.Initialize();
+
+ // 检查并修复损坏的密码数据
+ System.Diagnostics.Debug.WriteLine("\n========================================");
+ System.Diagnostics.Debug.WriteLine("检查密码数据完整性");
+ System.Diagnostics.Debug.WriteLine("========================================");
+ CheckAndFixPasswordData();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"数据库初始化失败:{ex.Message}\n\n请检查:\n1. MySQL服务是否启动\n2. 数据库连接配置是否正确\n3. 数据库 fullautowaterpressure 是否存在\n\n应用程序将退出。",
+ "初始化错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ // 显示登录窗体
+ using (var loginForm = new LoginForm())
+ {
+ if (loginForm.ShowDialog() == DialogResult.OK)
+ {
+ // 登录成功,根据用户权限显示对应窗体
+ if (LoginData.IsAdmin())
+ {
+ // 管理员登录,显示 ScanImport 页面
+ Application.Run(new ScanImport());
+ }
+ else
+ {
+ // 普通用户登录,显示 NormalTemperatureMode 页面
+ Application.Run(new NormalTemperatureMode());
+ }
+ }
+ // 登录失败或取消,直接退出
+ }
+ }
+
+ ///
+ /// 检查并修复损坏的密码数据
+ ///
+ private static void CheckAndFixPasswordData()
+ {
+ try
+ {
+ var userRepo = new UserRepository();
+
+ // 检查默认用户
+ var adminUser = userRepo.GetUserByUsername("admin");
+ var cgxUser = userRepo.GetUserByUsername("cgx");
+
+ bool needsReset = false;
+
+ // 检查 admin 用户
+ if (adminUser != null)
+ {
+ string storedPassword = adminUser.PasswordHash ?? "";
+
+ System.Diagnostics.Debug.WriteLine($"\n检查 admin 用户:");
+ System.Diagnostics.Debug.WriteLine($" 当前密码值: '{storedPassword}'");
+ System.Diagnostics.Debug.WriteLine($" 密码长度: {storedPassword.Length}");
+
+ // 检查是否为空
+ if (string.IsNullOrEmpty(storedPassword))
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 密码为空");
+ needsReset = true;
+ }
+ // 检查是否是旧的加密格式(包含 Base64 特殊字符)
+ else if (storedPassword.Length > 20 && (storedPassword.Contains("+") || storedPassword.Contains("/") || storedPassword.Contains("=")))
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 旧的加密格式");
+ needsReset = true;
+ }
+ // 检查是否是正确的明文密码
+ else if (storedPassword != "admin123")
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 密码不正确(应该是 'admin123')");
+ needsReset = true;
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: ✓ 正确");
+ }
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine($"\nadmin 用户不存在");
+ needsReset = true;
+ }
+
+ // 检查 cgx 用户
+ if (cgxUser != null)
+ {
+ string storedPassword = cgxUser.PasswordHash ?? "";
+
+ System.Diagnostics.Debug.WriteLine($"\n检查 cgx 用户:");
+ System.Diagnostics.Debug.WriteLine($" 当前密码值: '{storedPassword}'");
+ System.Diagnostics.Debug.WriteLine($" 密码长度: {storedPassword.Length}");
+
+ if (string.IsNullOrEmpty(storedPassword))
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 密码为空");
+ needsReset = true;
+ }
+ else if (storedPassword.Length > 20 && (storedPassword.Contains("+") || storedPassword.Contains("/") || storedPassword.Contains("=")))
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 旧的加密格式");
+ needsReset = true;
+ }
+ else if (storedPassword != "123")
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: 密码不正确(应该是 '123')");
+ needsReset = true;
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine($" 状态: ✓ 正确");
+ }
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine($"\ncgx 用户不存在");
+ needsReset = true;
+ }
+
+ if (needsReset)
+ {
+ System.Diagnostics.Debug.WriteLine("\n检测到密码数据异常,自动重置默认用户...");
+ DatabaseInitializer.ForceResetDefaultUsers();
+ System.Diagnostics.Debug.WriteLine("密码数据已修复!");
+ System.Diagnostics.Debug.WriteLine(" admin 密码: admin123");
+ System.Diagnostics.Debug.WriteLine(" cgx 密码: 123");
+ }
+ else
+ {
+ System.Diagnostics.Debug.WriteLine("\n密码数据检查通过 ✓");
+ }
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Debug.WriteLine($"密码数据检查失败: {ex.Message}");
+ System.Diagnostics.Debug.WriteLine($"详细信息: {ex}");
+ // 不影响程序启动,继续运行
+ }
}
}
}
diff --git a/全自动水压检测仪/packages.config b/全自动水压检测仪/packages.config
index 83a7bef..989dcad 100644
--- a/全自动水压检测仪/packages.config
+++ b/全自动水压检测仪/packages.config
@@ -9,6 +9,9 @@
+
+
+