主要变更:
新增统一缓存封装:[AppCache.cs (line 12)](/E:/jiaowu/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs:12) 接入 HybridCache 和可选 Redis:[Program.cs (line 153)](/E:/jiaowu/src/Jiaowu.Api/Program.cs:153) 缓存学生激活选项、基础数据、公开课表和课表选项。 个人课表、选课容量、成绩、权限、通知和任务状态保持实时查询。 基础数据、课程、教师、教学任务、作息、考试和课表发布后自动失效相关缓存。 新增 /health/cache,Redis 故障不影响 /health/ready。 Compose 增加 256MB、allkeys-lfu、无持久化的 redis:8.8-alpine 服务;该镜像标签已由 Docker 官方镜像仓库核对。 更新 [.env.example (line 1)](/E:/jiaowu/.env.example:1) 和 [README.md (line 190)](/E:/jiaowu/README.md:190) 部署说明。
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Jiaowu.Api.Controllers;
|
||||
using Jiaowu.Api.Domain.Academic;
|
||||
using Jiaowu.Api.Infrastructure.Caching;
|
||||
using Jiaowu.Api.Infrastructure.Persistence;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Data.Sqlite;
|
||||
@@ -70,7 +71,7 @@ public sealed class ScheduleSettingsControllerTests
|
||||
secondTask);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
var controller = new ScheduleSettingsController(db);
|
||||
var controller = new ScheduleSettingsController(db, NoOpAppCache.Instance);
|
||||
var result = await controller.SaveConstraintsBatch(
|
||||
new TeachingTaskScheduleConstraintBatchRequest(
|
||||
term.Id,
|
||||
@@ -174,7 +175,7 @@ public sealed class ScheduleSettingsControllerTests
|
||||
db.AddRange(college, course, term, teacher, classroom, task, constraint);
|
||||
await db.SaveChangesAsync();
|
||||
|
||||
var result = await new ScheduleSettingsController(db)
|
||||
var result = await new ScheduleSettingsController(db, NoOpAppCache.Instance)
|
||||
.GetConstraints(term.Id, CancellationToken.None);
|
||||
|
||||
var ok = Assert.IsType<OkObjectResult>(result);
|
||||
@@ -269,20 +270,26 @@ public sealed class ScheduleSettingsControllerTests
|
||||
await db.SaveChangesAsync();
|
||||
db.ChangeTracker.Clear();
|
||||
|
||||
var result = await new ScheduleSettingsController(db)
|
||||
var result = await new ScheduleSettingsController(db, NoOpAppCache.Instance)
|
||||
.GetConstraints(term.Id, CancellationToken.None);
|
||||
|
||||
var ok = Assert.IsType<OkObjectResult>(result);
|
||||
var payload = Assert.IsAssignableFrom<IEnumerable>(ok.Value);
|
||||
Assert.Contains(payload.Cast<object>(), item =>
|
||||
JsonSerializer.Serialize(item).Contains(task.TaskNumber));
|
||||
var timeSlotsResult = await new ScheduleSettingsController(db)
|
||||
var timeSlotsResult = await new ScheduleSettingsController(
|
||||
db,
|
||||
NoOpAppCache.Instance)
|
||||
.GetTimeSlots(term.Id, CancellationToken.None);
|
||||
var timeSlotsOk = Assert.IsType<OkObjectResult>(timeSlotsResult);
|
||||
var timeSlotsJson = JsonSerializer.Serialize(timeSlotsOk.Value);
|
||||
Assert.Contains("08:00", timeSlotsJson);
|
||||
|
||||
var examTimeSlotsResult = await new ExamsController(db, null!, null!)
|
||||
var examTimeSlotsResult = await new ExamsController(
|
||||
db,
|
||||
null!,
|
||||
null!,
|
||||
NoOpAppCache.Instance)
|
||||
.GetTimeSlotsForTerm(term.Id, CancellationToken.None);
|
||||
var examTimeSlotsOk =
|
||||
Assert.IsType<OkObjectResult>(examTimeSlotsResult);
|
||||
|
||||
Reference in New Issue
Block a user