评教系统

This commit is contained in:
2026-07-25 18:41:53 +08:00 Unverified
parent 15a34a306c
commit 376bc0d0a1
12 changed files with 6667 additions and 487 deletions
@@ -13,7 +13,7 @@ using Microsoft.EntityFrameworkCore;
namespace Jiaowu.Api.Controllers;
[ApiController]
[Authorize(Roles = AttendanceRoles)]
[Authorize]
[Route("api/attendance")]
public sealed class AttendanceController(
AppDbContext db,
@@ -27,6 +27,7 @@ public sealed class AttendanceController(
SystemRoles.Teacher;
[HttpGet("my-tasks")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> GetMyTasks(
Guid? academicTermId,
CancellationToken cancellationToken)
@@ -57,6 +58,7 @@ public sealed class AttendanceController(
}
[HttpGet("sheets")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> GetSheets(
Guid teachingTaskId,
CancellationToken cancellationToken)
@@ -88,6 +90,7 @@ public sealed class AttendanceController(
}
[HttpPost("sheets")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> CreateSheet(
AttendanceSheetRequest request,
CancellationToken cancellationToken)
@@ -123,6 +126,7 @@ public sealed class AttendanceController(
}
[HttpGet("sheets/{id:guid}")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> GetSheet(Guid id, CancellationToken cancellationToken)
{
var sheet = await db.AttendanceSheets.AsNoTracking()
@@ -184,6 +188,7 @@ public sealed class AttendanceController(
}
[HttpPut("sheets/{id:guid}/records")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> UpdateRecords(
Guid id,
AttendanceRecordsRequest request,
@@ -193,6 +198,7 @@ public sealed class AttendanceController(
.Include(x => x.Records)
.Include(x => x.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
if (sheet is null) return NotFound();
if (!CanManageSheet(sheet)) return Forbid();
@@ -213,6 +219,7 @@ public sealed class AttendanceController(
}
[HttpPost("sheets/{id:guid}/import")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> Import(
Guid id,
IFormFile file,
@@ -223,6 +230,7 @@ public sealed class AttendanceController(
.ThenInclude(x => x.Student)
.Include(x => x.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
if (sheet is null) return NotFound();
if (!CanManageSheet(sheet)) return Forbid();
@@ -262,6 +270,7 @@ public sealed class AttendanceController(
}
[HttpGet("sheets/{id:guid}/export.xlsx")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> Export(Guid id, CancellationToken cancellationToken)
{
var sheetData = await db.AttendanceSheets.AsNoTracking()
@@ -308,11 +317,13 @@ public sealed class AttendanceController(
}
[HttpPost("sheets/{id:guid}/submit")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> Submit(Guid id, CancellationToken cancellationToken)
{
var sheet = await db.AttendanceSheets
.Include(x => x.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
if (sheet is null) return NotFound();
if (!CanManageSheet(sheet)) return Forbid();
@@ -496,6 +507,7 @@ public sealed class AttendanceController(
.Include(r => r.AttendanceSheet)
.ThenInclude(s => s!.TeachingTask)
.ThenInclude(t => t!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(r =>
r.AttendanceSheetId == attendanceSheetId &&
r.StudentId == studentId,
@@ -538,11 +550,13 @@ public sealed class AttendanceController(
}
[HttpDelete("sheets/{id:guid}")]
[Authorize(Roles = AttendanceRoles)]
public async Task<ActionResult> Delete(Guid id, CancellationToken cancellationToken)
{
var sheet = await db.AttendanceSheets
.Include(x => x.TeachingTask)
.ThenInclude(x => x!.Teachers)
.ThenInclude(x => x.Teacher)
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
if (sheet is null) return NotFound();
if (!CanManageSheet(sheet)) return Forbid();