feat: 完善用户界面,添加绑定与解除绑定的功能

This commit is contained in:
2025-07-12 17:46:23 +08:00
parent 0fb0c4e395
commit f253a33c83
11 changed files with 1654 additions and 185 deletions

View File

@@ -41,6 +41,11 @@ public class DataController : ControllerBase
/// 用户关联的板卡ID
/// </summary>
public Guid BoardID { get; set; }
/// <summary>
/// 用户绑定板子的过期时间
/// </summary>
public DateTime? BoardExpireTime { get; set; }
}
/// <summary>
@@ -148,6 +153,7 @@ public class DataController : ControllerBase
Name = user.Name,
EMail = user.EMail,
BoardID = user.BoardID,
BoardExpireTime = user.BoardExpireTime,
});
}
@@ -194,32 +200,32 @@ public class DataController : ControllerBase
/// <summary>
/// 获取一个空闲的实验板(普通用户权限)
/// </summary>
/// <param name="durationHours">绑定持续时间小时默认为1小时</param>
[Authorize]
[HttpGet("GetAvailableBoard")]
[EnableCors("Users")]
[ProducesResponseType(typeof(Database.Board), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult GetAvailableBoard()
public IActionResult GetAvailableBoard(int durationHours = 1)
{
try
{
using var db = new Database.AppDataConnection();
var boardOpt = db.GetAvailableBoard();
if (!boardOpt.HasValue)
return NotFound("没有可用的实验板");
// 绑定用户与实验板
var userName = User.Identity?.Name;
if (string.IsNullOrEmpty(userName))
return Unauthorized("未找到用户名信息");
using var db = new Database.AppDataConnection();
var userRet = db.GetUserByName(userName);
if (!userRet.IsSuccessful || !userRet.Value.HasValue)
return BadRequest("用户不存在");
var user = userRet.Value.Value;
db.BindUserToBoard(user.ID, boardOpt.Value.ID);
var expireTime = DateTime.UtcNow.AddHours(durationHours);
var boardOpt = db.GetAvailableBoard(user.ID, expireTime);
if (!boardOpt.HasValue)
return NotFound("没有可用的实验板");
return Ok(boardOpt.Value);
}
@@ -230,6 +236,67 @@ public class DataController : ControllerBase
}
}
/// <summary>
/// 解除当前用户绑定的实验板(普通用户权限)
/// </summary>
[Authorize]
[HttpPost("UnbindBoard")]
[EnableCors("Users")]
[ProducesResponseType(typeof(bool), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult UnbindBoard()
{
try
{
var userName = User.Identity?.Name;
if (string.IsNullOrEmpty(userName))
return Unauthorized("未找到用户名信息");
using var db = new Database.AppDataConnection();
var userRet = db.GetUserByName(userName);
if (!userRet.IsSuccessful || !userRet.Value.HasValue)
return BadRequest("用户不存在");
var user = userRet.Value.Value;
var result = db.UnbindUserFromBoard(user.ID);
return Ok(result > 0);
}
catch (Exception ex)
{
logger.Error(ex, "解除实验板绑定时发生异常");
return StatusCode(StatusCodes.Status500InternalServerError, "解除失败,请稍后重试");
}
}
/// <summary>
/// 用户根据实验板ID获取实验板信息普通用户权限
/// </summary>
[Authorize]
[HttpGet("GetBoardByID")]
[EnableCors("Users")]
[ProducesResponseType(typeof(Database.Board), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public IActionResult GetBoardByID(Guid id)
{
try
{
using var db = new Database.AppDataConnection();
var ret = db.GetBoardByID(id);
if (!ret.IsSuccessful)
return StatusCode(StatusCodes.Status500InternalServerError, "数据库操作失败");
if (!ret.Value.HasValue)
return NotFound("未找到对应的实验板");
return Ok(ret.Value.Value);
}
catch (Exception ex)
{
logger.Error(ex, "获取实验板信息时发生异常");
return StatusCode(StatusCodes.Status500InternalServerError, "获取失败,请稍后重试");
}
}
/// <summary>
/// 新增板子(管理员权限)
/// </summary>