From b39a57ebdf7a7bd053dfadadb17f80f073486271 Mon Sep 17 00:00:00 2001 From: biss Date: Sun, 26 Jul 2026 21:32:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99=E7=BB=9F=E8=AE=A1=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=8A=A0=E7=89=88=E6=9C=AC=E5=B9=B6=E7=BB=91=E5=AE=9A=E7=8E=B0?= =?UTF-8?q?=E6=9C=89=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE/=E8=AF=BE?= =?UTF-8?q?=E8=A1=A8=E5=A4=B1=E6=95=88=E6=A0=87=E7=AD=BE=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E8=AE=A9=E6=BC=94=E7=A4=BA=E6=95=B0=E6=8D=AE=E3=80=81?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E6=95=B0=E6=8D=AE=E5=86=99=E5=85=A5=E4=B8=BB?= =?UTF-8?q?=E5=8A=A8=E6=B8=85=E7=90=86=E7=BB=9F=E8=AE=A1=E7=BC=93=E5=AD=98?= =?UTF-8?q?=EF=BC=9B=E4=B8=8D=E6=94=B9=E7=BB=9F=E8=AE=A1=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E3=80=81=E7=AD=9B=E9=80=89=E3=80=81=E5=AF=BC=E5=87=BA=E6=88=96?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=BB=93=E6=9E=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Jiaowu.Api/Controllers/PersonnelController.cs | 6 ++++++ src/Jiaowu.Api/Controllers/PersonnelExcelController.cs | 3 +++ src/Jiaowu.Api/Controllers/StatisticsController.cs | 6 +++++- src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs | 2 +- .../Infrastructure/Persistence/DemoDataSeeder.cs | 6 ++++++ tests/Jiaowu.Api.Tests/DemoDataSeederTests.cs | 4 ++++ tests/Jiaowu.Api.Tests/StatisticsControllerTests.cs | 10 ++++++++++ 7 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Jiaowu.Api/Controllers/PersonnelController.cs b/src/Jiaowu.Api/Controllers/PersonnelController.cs index 2c9d3e1..7640429 100644 --- a/src/Jiaowu.Api/Controllers/PersonnelController.cs +++ b/src/Jiaowu.Api/Controllers/PersonnelController.cs @@ -437,6 +437,9 @@ public sealed class PersonnelController( await cache.RemoveByTagAsync( AppCacheTags.Timetables, cancellationToken); + await cache.RemoveByTagAsync( + AppCacheTags.Analytics, + cancellationToken); return Created(string.Empty, new { id }); } catch (DbUpdateException) @@ -453,6 +456,9 @@ public sealed class PersonnelController( await cache.RemoveByTagAsync( AppCacheTags.Timetables, cancellationToken); + await cache.RemoveByTagAsync( + AppCacheTags.Analytics, + cancellationToken); return NoContent(); } catch (DbUpdateException) diff --git a/src/Jiaowu.Api/Controllers/PersonnelExcelController.cs b/src/Jiaowu.Api/Controllers/PersonnelExcelController.cs index ca57c56..b21c978 100644 --- a/src/Jiaowu.Api/Controllers/PersonnelExcelController.cs +++ b/src/Jiaowu.Api/Controllers/PersonnelExcelController.cs @@ -147,6 +147,9 @@ public sealed class PersonnelExcelController( await cache.RemoveByTagAsync( AppCacheTags.Timetables, cancellationToken); + await cache.RemoveByTagAsync( + AppCacheTags.Analytics, + cancellationToken); return Ok(result); } catch (DbUpdateException) diff --git a/src/Jiaowu.Api/Controllers/StatisticsController.cs b/src/Jiaowu.Api/Controllers/StatisticsController.cs index 8f53669..b712558 100644 --- a/src/Jiaowu.Api/Controllers/StatisticsController.cs +++ b/src/Jiaowu.Api/Controllers/StatisticsController.cs @@ -966,7 +966,11 @@ public sealed class StatisticsController( source.Value.GetType()); }, AppCacheProfile.Analytics, - [AppCacheTags.Analytics], + [ + AppCacheTags.Analytics, + AppCacheTags.BaseData, + AppCacheTags.Timetables + ], cancellationToken); return value; } diff --git a/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs b/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs index c81a7f9..2c2286e 100644 --- a/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs +++ b/src/Jiaowu.Api/Infrastructure/Caching/AppCache.cs @@ -179,7 +179,7 @@ public static class AppCacheKeys var filterPart = filters.Length == 0 ? "all" : string.Join(':', filters.Select(Normalize)); - return $"statistics:{Normalize(area)}:scope:{Normalize(dataScope)}:" + + return $"statistics:v2:{Normalize(area)}:scope:{Normalize(dataScope)}:" + $"college:{effectiveCollegeId?.ToString("N") ?? "all"}:{filterPart}"; } } diff --git a/src/Jiaowu.Api/Infrastructure/Persistence/DemoDataSeeder.cs b/src/Jiaowu.Api/Infrastructure/Persistence/DemoDataSeeder.cs index a59c781..639f605 100644 --- a/src/Jiaowu.Api/Infrastructure/Persistence/DemoDataSeeder.cs +++ b/src/Jiaowu.Api/Infrastructure/Persistence/DemoDataSeeder.cs @@ -1,11 +1,13 @@ using System.Data; using Jiaowu.Api.Domain.Academic; +using Jiaowu.Api.Infrastructure.Caching; using Microsoft.EntityFrameworkCore; namespace Jiaowu.Api.Infrastructure.Persistence; public sealed class DemoDataSeeder( AppDbContext db, + IAppCache cache, ILogger logger) { // MySql.EntityFrameworkCore 10 cannot type-map parameterized primitive @@ -47,6 +49,10 @@ public sealed class DemoDataSeeder( await LogSummaryAsync(cancellationToken); await transaction.CommitAsync(cancellationToken); }); + + await cache.RemoveByTagAsync(AppCacheTags.BaseData, cancellationToken); + await cache.RemoveByTagAsync(AppCacheTags.Timetables, cancellationToken); + await cache.RemoveByTagAsync(AppCacheTags.Analytics, cancellationToken); } private async Task EnsureDatabaseIsEmptyAsync(CancellationToken cancellationToken) diff --git a/tests/Jiaowu.Api.Tests/DemoDataSeederTests.cs b/tests/Jiaowu.Api.Tests/DemoDataSeederTests.cs index 6fde9fd..61ade12 100644 --- a/tests/Jiaowu.Api.Tests/DemoDataSeederTests.cs +++ b/tests/Jiaowu.Api.Tests/DemoDataSeederTests.cs @@ -1,4 +1,5 @@ using Jiaowu.Api.Domain.Academic; +using Jiaowu.Api.Infrastructure.Caching; using Jiaowu.Api.Infrastructure.Persistence; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; @@ -18,6 +19,7 @@ public sealed class DemoDataSeederTests var seeder = new DemoDataSeeder( db, + NoOpAppCache.Instance, NullLogger.Instance); await seeder.SeedAsync(); @@ -46,6 +48,7 @@ public sealed class DemoDataSeederTests var seeder = new DemoDataSeeder( db, + NoOpAppCache.Instance, NullLogger.Instance); var exception = await Assert.ThrowsAsync( @@ -70,6 +73,7 @@ public sealed class DemoDataSeederTests var seeder = new DemoDataSeeder( db, + NoOpAppCache.Instance, NullLogger.Instance); await Assert.ThrowsAsync(() => seeder.SeedAsync()); diff --git a/tests/Jiaowu.Api.Tests/StatisticsControllerTests.cs b/tests/Jiaowu.Api.Tests/StatisticsControllerTests.cs index 61b9949..e720ccc 100644 --- a/tests/Jiaowu.Api.Tests/StatisticsControllerTests.cs +++ b/tests/Jiaowu.Api.Tests/StatisticsControllerTests.cs @@ -52,6 +52,14 @@ public sealed class StatisticsControllerTests null, CancellationToken.None); Assert.Equal(1, TotalCourses(first)); + Assert.Equal( + new[] + { + AppCacheTags.Analytics, + AppCacheTags.BaseData, + AppCacheTags.Timetables + }, + cache.Tags.Single()); db.Courses.Add(CreateCourse("C003", firstCollege, category)); await db.SaveChangesAsync(); @@ -115,6 +123,7 @@ public sealed class StatisticsControllerTests public int SourceCalls { get; private set; } public IReadOnlyCollection Keys => values.Keys; + public List> Tags { get; } = []; public async Task GetOrCreateAsync( string key, @@ -127,6 +136,7 @@ public sealed class StatisticsControllerTests return (T)value; SourceCalls++; + Tags.Add(tags.ToArray()); var loaded = await factory(cancellationToken); values[key] = loaded!; return loaded;