feat: 增加了登录选项

This commit is contained in:
2025-07-11 16:36:28 +08:00
parent d88c710606
commit b4bb563782
8 changed files with 790 additions and 129 deletions

View File

@@ -2,6 +2,7 @@ using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
@@ -16,20 +17,47 @@ public class DataController : ControllerBase
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public class GetUserInfoResponse
{
/// <summary>
/// 用户的唯一标识符
/// </summary>
public Guid ID { get; set; }
/// <summary>
/// 用户的名称
/// </summary>
public required string Name { get; set; }
/// <summary>
/// 用户的电子邮箱
/// </summary>
public required string EMail { get; set; }
/// <summary>
/// 用户关联的板卡ID
/// </summary>
public Guid BoardID { get; set; }
}
/// <summary>
/// [TODO:description]
/// 用户登录,获取 JWT 令牌
/// </summary>
/// <param name="name">[TODO:parameter]</param>
/// <param name="password">[TODO:parameter]</param>
/// <returns>[TODO:return]</returns>
[HttpPost("login")]
/// <param name="name">用户名</param>
/// <param name="password">用户密码</param>
/// <returns>JWT 令牌字符串</returns>
[HttpPost("Login")]
[EnableCors("Users")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult Login(string name, string password)
{
// 验证用户密码
using var db = new Database.AppDataConnection();
var ret = db.CheckUserPassword(name, password);
if (!ret.IsSuccessful) return StatusCode(StatusCodes.Status500InternalServerError);
if (!ret.Value.HasValue) return BadRequest($"TODO");
if (!ret.IsSuccessful) return StatusCode(StatusCodes.Status500InternalServerError, "数据库操作失败");
if (!ret.Value.HasValue) return BadRequest("用户名或密码错误");
var user = ret.Value.Value;
// 生成 JWT
@@ -55,32 +83,94 @@ public class DataController : ControllerBase
}
/// <summary>
/// [TODO:description]
/// 测试用户认证,需携带有效 JWT
/// </summary>
/// <returns>[TODO:return]</returns>
[HttpGet("TestAuth")]
/// <returns>认证成功信息</returns>
[Authorize]
[HttpGet("TestAuth")]
[EnableCors("Users")]
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public IActionResult TestAuth()
{
return Ok("Authenticated!");
return Ok("认证成功!");
}
/// <summary>
/// 获取当前用户信息
/// </summary>
/// <returns>用户信息包括ID、用户名、邮箱和板卡ID</returns>
[Authorize]
[HttpGet("GetUserInfo")]
[EnableCors("Users")]
[ProducesResponseType(typeof(GetUserInfoResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public IActionResult GetUserInfo()
{
// Get User Name
var userName = User.Identity?.Name;
if (string.IsNullOrEmpty(userName))
return Unauthorized("未找到用户名信息");
// Get User Info
using var db = new Database.AppDataConnection();
var ret = db.GetUserByName(userName);
if (!ret.IsSuccessful)
return StatusCode(StatusCodes.Status500InternalServerError, "数据库操作失败");
if (!ret.Value.HasValue)
return BadRequest("用户不存在");
var user = ret.Value.Value;
return Ok(new GetUserInfoResponse
{
ID = user.ID,
Name = user.Name,
EMail = user.EMail,
BoardID = user.BoardID,
});
}
/// <summary>
/// 注册新用户
/// </summary>
/// <param name="name">用户名</param>
/// <param name="email">[TODO:parameter]</param>
/// <param name="password">[TODO:parameter]</param>
/// <returns>操作结果</returns>
/// <param name="name">用户名不超过255个字符</param>
/// <param name="email">邮箱地址</param>
/// <param name="password">用户密码</param>
/// <returns>操作结果,成功返回 true失败返回错误信息</returns>
[HttpPost("SignUpUser")]
[EnableCors("Users")]
[ProducesResponseType(typeof(bool), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult SignUpUser(string name, string email, string password)
{
if (name.Length > 255)
return BadRequest("Name Couln't over 255 characters");
// 验证输入参数
if (string.IsNullOrWhiteSpace(name))
return BadRequest("用户名不能为空");
using var db = new Database.AppDataConnection();
var ret = db.AddUser(name, email, password);
return Ok(ret);
if (name.Length > 255)
return BadRequest("用户名不能超过255个字符");
if (string.IsNullOrWhiteSpace(email))
return BadRequest("邮箱不能为空");
if (string.IsNullOrWhiteSpace(password))
return BadRequest("密码不能为空");
try
{
using var db = new Database.AppDataConnection();
var ret = db.AddUser(name, email, password);
return Ok(ret);
}
catch (Exception ex)
{
logger.Error(ex, "注册用户时发生异常");
return StatusCode(StatusCodes.Status500InternalServerError, "注册失败,请稍后重试");
}
}
}