feat: 完成提交作业的后端
This commit is contained in:
@@ -2,6 +2,7 @@ using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using DotNext;
|
||||
using Database;
|
||||
|
||||
namespace server.Controllers;
|
||||
|
||||
@@ -14,11 +15,18 @@ public class ExamController : ControllerBase
|
||||
{
|
||||
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
||||
|
||||
private readonly Database.ExamManager _examManager;
|
||||
private readonly ExamManager _examManager;
|
||||
private readonly ResourceManager _resourceManager;
|
||||
private readonly UserManager _userManager;
|
||||
|
||||
public ExamController(Database.ExamManager examManager)
|
||||
public ExamController(
|
||||
ExamManager examManager,
|
||||
ResourceManager resourceManager,
|
||||
UserManager userManager)
|
||||
{
|
||||
_examManager = examManager;
|
||||
_resourceManager = resourceManager;
|
||||
_userManager = userManager;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -211,6 +219,222 @@ public class ExamController : ControllerBase
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"更新实验失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 提交作业
|
||||
/// </summary>
|
||||
/// <param name="examId">实验ID</param>
|
||||
/// <param name="file">提交的文件</param>
|
||||
/// <returns>提交结果</returns>
|
||||
[Authorize]
|
||||
[HttpPost("commit/{examId}")]
|
||||
[EnableCors("Users")]
|
||||
[ProducesResponseType(typeof(Resource), StatusCodes.Status201Created)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public async Task<IActionResult> SubmitHomework(string examId, IFormFile file)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(examId))
|
||||
return BadRequest("实验ID不能为空");
|
||||
|
||||
if (file == null || file.Length == 0)
|
||||
return BadRequest("文件不能为空");
|
||||
|
||||
try
|
||||
{
|
||||
// 获取当前用户信息
|
||||
var userName = User.Identity?.Name;
|
||||
if (string.IsNullOrEmpty(userName))
|
||||
return Unauthorized("无法获取用户信息");
|
||||
|
||||
var userResult = _userManager.GetUserByName(userName);
|
||||
if (!userResult.IsSuccessful || !userResult.Value.HasValue)
|
||||
return Unauthorized("用户不存在");
|
||||
|
||||
var user = userResult.Value.Value;
|
||||
|
||||
// 检查实验是否存在
|
||||
var examResult = _examManager.GetExamByID(examId);
|
||||
if (!examResult.IsSuccessful)
|
||||
{
|
||||
logger.Error($"检查实验是否存在时出错: {examResult.Error.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"检查实验失败: {examResult.Error.Message}");
|
||||
}
|
||||
|
||||
if (!examResult.Value.HasValue)
|
||||
{
|
||||
logger.Warn($"实验不存在: {examId}");
|
||||
return NotFound($"实验 {examId} 不存在");
|
||||
}
|
||||
|
||||
// 读取文件内容
|
||||
byte[] fileData;
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
await file.CopyToAsync(memoryStream);
|
||||
fileData = memoryStream.ToArray();
|
||||
}
|
||||
|
||||
// 提交作业
|
||||
var commitResult = _resourceManager.AddResource(
|
||||
user.ID, ResourceTypes.Compression, ResourcePurpose.Homework,
|
||||
file.FileName, fileData, examId);
|
||||
if (!commitResult.IsSuccessful)
|
||||
{
|
||||
logger.Error($"提交作业时出错: {commitResult.Error.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"提交作业失败: {commitResult.Error.Message}");
|
||||
}
|
||||
|
||||
var commit = commitResult.Value;
|
||||
|
||||
logger.Info($"用户 {userName} 成功提交实验 {examId} 的作业,Commit ID: {commit.ID}");
|
||||
return CreatedAtAction(nameof(GetCommitsByExamId), new { examId = examId }, commit);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"提交实验 {examId} 作业时出错: {ex.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"提交作业失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户在指定实验中的提交记录
|
||||
/// </summary>
|
||||
/// <param name="examId">实验ID</param>
|
||||
/// <returns>提交记录列表</returns>
|
||||
[Authorize]
|
||||
[HttpGet("commits/{examId}")]
|
||||
[EnableCors("Users")]
|
||||
[ProducesResponseType(typeof(Resource[]), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public IActionResult GetCommitsByExamId(string examId)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(examId))
|
||||
return BadRequest("实验ID不能为空");
|
||||
|
||||
try
|
||||
{
|
||||
// 获取当前用户信息
|
||||
var userName = User.Identity?.Name;
|
||||
if (string.IsNullOrEmpty(userName))
|
||||
return Unauthorized("无法获取用户信息");
|
||||
|
||||
var userResult = _userManager.GetUserByName(userName);
|
||||
if (!userResult.IsSuccessful || !userResult.Value.HasValue)
|
||||
return Unauthorized("用户不存在");
|
||||
|
||||
var user = userResult.Value.Value;
|
||||
|
||||
// 检查实验是否存在
|
||||
var examResult = _examManager.GetExamByID(examId);
|
||||
if (!examResult.IsSuccessful)
|
||||
{
|
||||
logger.Error($"检查实验是否存在时出错: {examResult.Error.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"检查实验失败: {examResult.Error.Message}");
|
||||
}
|
||||
|
||||
if (!examResult.Value.HasValue)
|
||||
{
|
||||
logger.Warn($"实验不存在: {examId}");
|
||||
return NotFound($"实验 {examId} 不存在");
|
||||
}
|
||||
|
||||
// 获取用户的提交记录
|
||||
var commitsResult = _resourceManager.GetResourceListByType(
|
||||
ResourceTypes.Compression, ResourcePurpose.Homework, examId);
|
||||
if (!commitsResult.IsSuccessful)
|
||||
{
|
||||
logger.Error($"获取提交记录时出错: {commitsResult.Error.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"获取提交记录失败: {commitsResult.Error.Message}");
|
||||
}
|
||||
|
||||
var commits = commitsResult.Value;
|
||||
|
||||
logger.Info($"成功获取用户 {userName} 在实验 {examId} 中的提交记录,共 {commits.Length} 条");
|
||||
return Ok(commits);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"获取实验 {examId} 提交记录时出错: {ex.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"获取提交记录失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除提交记录
|
||||
/// </summary>
|
||||
/// <param name="commitId">提交记录ID</param>
|
||||
/// <returns>删除结果</returns>
|
||||
[Authorize]
|
||||
[HttpDelete("commit/{commitId}")]
|
||||
[EnableCors("Users")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
|
||||
public IActionResult DeleteCommit(string commitId)
|
||||
{
|
||||
if (!Guid.TryParse(commitId, out _))
|
||||
return BadRequest("提交记录ID格式不正确");
|
||||
|
||||
try
|
||||
{
|
||||
// 获取当前用户信息
|
||||
var userName = User.Identity?.Name;
|
||||
if (string.IsNullOrEmpty(userName))
|
||||
return Unauthorized("无法获取用户信息");
|
||||
|
||||
var userResult = _userManager.GetUserByName(userName);
|
||||
if (!userResult.IsSuccessful || !userResult.Value.HasValue)
|
||||
return Unauthorized("用户不存在");
|
||||
|
||||
var user = userResult.Value.Value;
|
||||
|
||||
// 检查是否是管理员
|
||||
var isAdmin = user.Permission == UserPermission.Admin;
|
||||
|
||||
// 如果不是管理员,检查提交记录是否属于当前用户
|
||||
if (!isAdmin)
|
||||
{
|
||||
var commitResult = _resourceManager.GetResourceById(commitId);
|
||||
if (!commitResult.HasValue)
|
||||
{
|
||||
logger.Warn($"提交记录不存在: {commitId}");
|
||||
return NotFound($"提交记录 {commitId} 不存在");
|
||||
}
|
||||
|
||||
var commit = commitResult.Value;
|
||||
if (commit.UserID != user.ID)
|
||||
{
|
||||
logger.Warn($"用户 {userName} 尝试删除不属于自己的提交记录: {commitId}");
|
||||
return Forbid("您只能删除自己的提交记录");
|
||||
}
|
||||
}
|
||||
|
||||
// 执行删除
|
||||
var deleteResult = _resourceManager.DeleteResource(commitId);
|
||||
if (!deleteResult)
|
||||
{
|
||||
logger.Warn($"提交记录不存在: {commitId}");
|
||||
return NotFound($"提交记录 {commitId} 不存在");
|
||||
}
|
||||
|
||||
logger.Info($"用户 {userName} 成功删除提交记录: {commitId}");
|
||||
return Ok($"提交记录 {commitId} 已成功删除");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error($"删除提交记录 {commitId} 时出错: {ex.Message}");
|
||||
return StatusCode(StatusCodes.Status500InternalServerError, $"删除提交记录失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -258,7 +482,7 @@ public class ExamInfo
|
||||
/// </summary>
|
||||
public bool IsVisibleToUsers { get; set; } = true;
|
||||
|
||||
public ExamInfo(Database.Exam exam)
|
||||
public ExamInfo(Exam exam)
|
||||
{
|
||||
ID = exam.ID;
|
||||
Name = exam.Name;
|
||||
|
||||
Reference in New Issue
Block a user