Files
FullAutoWaterCheck/全自动水压检测仪/DATA/UserRepository.cs
2026-04-17 10:45:45 +08:00

291 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Dapper;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
namespace .DATA
{
/// <summary>
/// 用户数据访问层
/// </summary>
public class UserRepository
{
private readonly string _connectionString;
public UserRepository()
{
_connectionString = DatabaseConnectionManager.ConnectionString;
}
/// <summary>
/// 根据用户名查询用户
/// </summary>
/// <param name="username">用户名</param>
/// <returns>用户对象不存在返回null</returns>
public User GetUserByUsername(string username)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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<User>(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;
}
}
/// <summary>
/// 根据ID查询用户
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns>用户对象不存在返回null</returns>
public User GetUserById(int userId)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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<User>(sql, new { id = userId });
}
}
/// <summary>
/// 创建用户
/// </summary>
/// <param name="user">用户对象</param>
/// <param name="plainPassword">明文密码</param>
/// <returns>是否创建成功</returns>
public bool CreateUser(User user, string plainPassword)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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;
}
}
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="user">用户对象</param>
/// <returns>是否更新成功</returns>
public bool UpdateUser(User user)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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;
}
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="userId">用户ID</param>
/// <returns>是否删除成功</returns>
public bool DeleteUser(int userId)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
connection.Open();
string sql = @"DELETE FROM sys_users WHERE id = @id";
int result = connection.Execute(sql, new { id = userId });
return result > 0;
}
}
/// <summary>
/// 获取所有用户
/// </summary>
/// <returns>用户列表</returns>
public List<User> GetAllUsers()
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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<User>(sql).ToList();
}
}
/// <summary>
/// 用户修改密码
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="oldPassword">旧密码</param>
/// <param name="newPassword">新密码</param>
/// <returns>是否修改成功</returns>
public bool ChangePassword(int userId, string oldPassword, string newPassword)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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;
}
}
/// <summary>
/// 管理员重置用户密码
/// </summary>
/// <param name="userId">用户ID</param>
/// <param name="newPassword">新密码</param>
/// <returns>是否重置成功</returns>
public bool ResetPassword(int userId, string newPassword)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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;
}
}
/// <summary>
/// 更新最后登录时间
/// </summary>
/// <param name="username">用户名</param>
/// <returns>是否更新成功</returns>
public bool UpdateLastLoginTime(string username)
{
using (var connection = DatabaseConnectionManager.CreateConnection())
{
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;
}
}
}
}