From b692a94d3cb07e11048327f34fecea479d042859 Mon Sep 17 00:00:00 2001
From: MSuMshk <2039814060@qq.com>
Date: Mon, 1 Dec 2025 19:58:07 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=20Redis=20=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE=E4=B8=8E=E8=B0=83=E5=BA=A6=E4=BE=9D=E8=B5=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Document/10_TODO.md | 83 ++++++++++---------
.../appsettings.Development.json | 4 +-
.../appsettings.Production.json | 4 +-
.../Constants/DatabaseConstants.cs | 6 +-
.../DatabaseServiceCollectionExtensions.cs | 11 ++-
.../Services/RecurringJobRegistrar.cs | 25 +-----
6 files changed, 62 insertions(+), 71 deletions(-)
diff --git a/Document/10_TODO.md b/Document/10_TODO.md
index 48327f0..6ec07f3 100644
--- a/Document/10_TODO.md
+++ b/Document/10_TODO.md
@@ -1,57 +1,58 @@
# TODO Roadmap
-> 当前列表为原 11 号文档中的待办事项,已迁移到此处并统一以复选框形式标记。若无特殊说明,均尚未完成。
+> 当前列表为原 11 号文档中的待办事项,已迁移到此处并统一以复选框形式标记。若无特殊说明,均尚未完成?
## 1. 配置与基础设施(高优)
-- [x] Development/Production 数据库连接与 Secret 落地(Staging 暂不需要)。
-- [x] Redis 服务部署完毕并记录配置。
-- [x] RabbitMQ 服务部署完毕并记录配置。
-- [x] COS 密钥配置补录完毕。
-- [ ] OSS 密钥配置补录完毕(待采购)。
-- [ ] SMS 平台密钥配置补录完毕(待采购)。
-- [x] WeChat Mini 程序密钥配置补录完毕(AppID:wx30f91e6afe79f405,AppSecret:64324a7f604245301066ba7c3add488e,已同步到 admin/mini 配置并登记更新人)。
-- [x] PostgreSQL 基础实例部署完毕并记录配置。
-- [x] Postgres/Redis 接入文档 + IaC/脚本补齐(见 Document/infra/postgres_redis.md 与 deploy/postgres|redis)。
+- [x] Development/Production 数据库连接与 Secret 落地(Staging 暂不需要)?
+- [x] Redis 服务部署完毕并记录配置?
+- [x] RabbitMQ 服务部署完毕并记录配置?
+- [x] COS 密钥配置补录完毕?
+- [ ] OSS 密钥配置补录完毕(待采购)?
+- [ ] SMS 平台密钥配置补录完毕(待采购)?
+- [x] WeChat Mini 程序密钥配置补录完毕(AppID:wx30f91e6afe79f405,AppSecret?4324a7f604245301066ba7c3add488e,已同步?admin/mini 配置并登记更新人)?
+- [x] PostgreSQL 基础实例部署完毕并记录配置?
+- [x] Postgres/Redis 接入文档 + IaC/脚本补齐(见 Document/infra/postgres_redis.md ?deploy/postgres|redis)?
- [x] RabbitMQ/Redis/Hangfire storage scripts available (see deploy/postgres and deploy/redis).
-- [ ] admin/mini/user/gateway 网关域名、证书、CORS 列表整理完成。
-- [ ] Hangfire Dashboard 启用并新增 Admin 角色验证/网关白名单。
+- [ ] admin/mini/user/gateway 网关域名、证书、CORS 列表整理完成?
+- [ ] Hangfire Dashboard 启用并新?Admin 角色验证/网关白名单?
-## 2. 数据与迁移(高优)
-- [ ] App/Identity/Dictionary/Hangfire 四个 DbContext 均生成初始 Migration 并成功 update database。
-- [ ] 商户/门店/商品/订单/支付/配送等实体与仓储实现完成,提供 CRUD + 查询。
-- [ ] 系统参数、默认租户、管理员账号、基础字典的种子脚本可重复执行。
+## 2. 数据与迁移(高优?
+- [x] App/Identity/Dictionary/Hangfire ĸ DbContext ɳʼ Migration ɹ update database
+- [ ] 商户/门店/商品/订单/支付/配送等实体与仓储实现完成,提供 CRUD + 查询?
+- [ ] 系统参数、默认租户、管理员账号、基础字典的种子脚本可重复执行?
## 3. 稳定性与质量
-- [ ] Dictionary/Identity/Storage/Sms/Messaging/Scheduler 的 xUnit+FluentAssertions 单元测试框架搭建。
-- [ ] WebApplicationFactory + Testcontainers 拉起 Postgres/Redis/RabbitMQ/MinIO 的集成测试模板。
-- [ ] .editorconfig、.globalconfig、Roslyn 分析器配置仓库通用规则并启用 CI 检查。
+- [ ] Dictionary/Identity/Storage/Sms/Messaging/Scheduler ?xUnit+FluentAssertions 单元测试框架搭建?
+- [ ] WebApplicationFactory + Testcontainers 拉起 Postgres/Redis/RabbitMQ/MinIO 的集成测试模板?
+- [ ] .editorconfig?globalconfig、Roslyn 分析器配置仓库通用规则并启?CI 检查?
-## 4. 安全与合规
-- [ ] RBAC 权限、租户隔离、用户/权限洞察 API 完整演示并在 Swagger 中提供示例。
-- [ ] 登录/刷新流程增加 IP 校验、租户隔离、验证码/频率限制。
-- [ ] 登录/权限/敏感操作日志可追溯,提供查询接口或 Kibana Saved Search。
-- [ ] Secret Store/KeyVault/KMS 管理敏感配置,禁止密钥写入 Git/数据库明文。
+## 4. 安全与合?
+- [ ] RBAC 权限、租户隔离、用?权限洞察 API 完整演示并在 Swagger 中提供示例?
+- [ ] 登录/刷新流程增加 IP 校验、租户隔离、验证码/频率限制?
+- [ ] 登录/权限/敏感操作日志可追溯,提供查询接口?Kibana Saved Search?
+- [ ] Secret Store/KeyVault/KMS 管理敏感配置,禁止密钥写?Git/数据库明文?
-## 5. 观测与运维
-- [ ] TraceId 贯通,并在 Serilog 中输出 Console/File/ELK 三种目标。
-- [ ] Prometheus exporter 暴露关键指标,/health 探针与告警规则同步推送。
-- [ ] PostgreSQL 全量/增量备份脚本及一次真实恢复演练报告。
+## 5. 观测与运?
+- [ ] TraceId 贯通,并在 Serilog 中输?Console/File/ELK 三种目标?
+- [ ] Prometheus exporter 暴露关键指标?health 探针与告警规则同步推送?
+- [ ] PostgreSQL 全量/增量备份脚本及一次真实恢复演练报告?
## 6. 业务能力补全
-- [ ] 商户/门店/菜品 API 完成并在 MQ 中投递上架/支付成功事件。
-- [ ] 配送对接 API 支持下单/取消/查询并完成签名验签中间件。
-- [ ] 小程序端商品浏览、下单、支付、评价、图片直传等 API 可闭环跑通。
+- [ ] 商户/门店/菜品 API 完成并在 MQ 中投递上?支付成功事件?
+- [ ] 配送对?API 支持下单/取消/查询并完成签名验签中间件?
+- [ ] 小程序端商品浏览、下单、支付、评价、图片直传等 API 可闭环跑通?
-## 7. 前后台 UI 对接
-- [ ] Admin UI 通过 OpenAPI 生成或手写界面,接入 Hangfire Dashboard/MQ 监控只读模式。
-- [ ] 小程序端完成登录、菜单浏览、下单、支付、物流轨迹、素材直传闭环。
+## 7. 前后?UI 对接
+- [ ] Admin UI 通过 OpenAPI 生成或手写界面,接入 Hangfire Dashboard/MQ 监控只读模式?
+- [ ] 小程序端完成登录、菜单浏览、下单、支付、物流轨迹、素材直传闭环?
-## 8. CI/CD 与发布
-- [ ] CI/CD 流水线覆盖构建、发布、静态扫描、数据库迁移。
-- [ ] Dev/Staging/Prod 多环境配置矩阵 + 基础设施 IaC 脚本。
-- [ ] 版本与发布说明模板整理并在仓库中提供示例。
+## 8. CI/CD 与发?
+- [ ] CI/CD 流水线覆盖构建、发布、静态扫描、数据库迁移?
+- [ ] Dev/Staging/Prod 多环境配置矩?+ 基础设施 IaC 脚本?
+- [ ] 版本与发布说明模板整理并在仓库中提供示例?
## 9. 文档与知识库
-- [ ] 接口文档、领域模型、关键约束使用 Markdown 或 API Portal 完整记录。
-- [ ] 运行手册包含部署步骤、资源拓扑、故障排查手册。
-- [ ] 安全合规模板覆盖数据分级、密钥管理、审计流程并形成可复用表格。
+- [ ] 接口文档、领域模型、关键约束使?Markdown ?API Portal 完整记录?
+- [ ] 运行手册包含部署步骤、资源拓扑、故障排查手册?
+- [ ] 安全合规模板覆盖数据分级、密钥管理、审计流程并形成可复用表格?
+
diff --git a/src/Api/TakeoutSaaS.AdminApi/appsettings.Development.json b/src/Api/TakeoutSaaS.AdminApi/appsettings.Development.json
index 6762606..4eb2c0e 100644
--- a/src/Api/TakeoutSaaS.AdminApi/appsettings.Development.json
+++ b/src/Api/TakeoutSaaS.AdminApi/appsettings.Development.json
@@ -1,4 +1,7 @@
{
+ "ConnectionStrings": {
+ "Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false"
+ },
"Database": {
"DataSources": {
"AppDatabase": {
@@ -30,7 +33,6 @@
}
}
},
- "Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
diff --git a/src/Api/TakeoutSaaS.AdminApi/appsettings.Production.json b/src/Api/TakeoutSaaS.AdminApi/appsettings.Production.json
index 6762606..4eb2c0e 100644
--- a/src/Api/TakeoutSaaS.AdminApi/appsettings.Production.json
+++ b/src/Api/TakeoutSaaS.AdminApi/appsettings.Production.json
@@ -1,4 +1,7 @@
{
+ "ConnectionStrings": {
+ "Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false"
+ },
"Database": {
"DataSources": {
"AppDatabase": {
@@ -30,7 +33,6 @@
}
}
},
- "Redis": "49.232.6.45:6379,password=MsuMshk112233,abortConnect=false",
"Identity": {
"Jwt": {
"Issuer": "takeout-saas",
diff --git a/src/Core/TakeoutSaaS.Shared.Abstractions/Constants/DatabaseConstants.cs b/src/Core/TakeoutSaaS.Shared.Abstractions/Constants/DatabaseConstants.cs
index cc18844..cf8a78e 100644
--- a/src/Core/TakeoutSaaS.Shared.Abstractions/Constants/DatabaseConstants.cs
+++ b/src/Core/TakeoutSaaS.Shared.Abstractions/Constants/DatabaseConstants.cs
@@ -1,7 +1,7 @@
-namespace TakeoutSaaS.Shared.Abstractions.Constants;
+namespace TakeoutSaaS.Shared.Abstractions.Constants;
///
-/// 数据源名称常量,统一配置键与使用。
+/// 数据源名称常量,统一配置键与使用说明。
///
public static class DatabaseConstants
{
@@ -16,7 +16,7 @@ public static class DatabaseConstants
public const string IdentityDataSource = "IdentityDatabase";
///
- /// �����ֵ�⣨DictionaryDatabase����
+ /// 字典库(DictionaryDatabase)。
///
public const string DictionaryDataSource = "DictionaryDatabase";
}
diff --git a/src/Infrastructure/TakeoutSaaS.Infrastructure/Common/Extensions/DatabaseServiceCollectionExtensions.cs b/src/Infrastructure/TakeoutSaaS.Infrastructure/Common/Extensions/DatabaseServiceCollectionExtensions.cs
index bbc2b00..c1047d7 100644
--- a/src/Infrastructure/TakeoutSaaS.Infrastructure/Common/Extensions/DatabaseServiceCollectionExtensions.cs
+++ b/src/Infrastructure/TakeoutSaaS.Infrastructure/Common/Extensions/DatabaseServiceCollectionExtensions.cs
@@ -42,10 +42,13 @@ public static class DatabaseServiceCollectionExtensions
string dataSourceName)
where TContext : DbContext
{
- services.AddDbContext((sp, options) =>
- {
- ConfigureDbContextOptions(sp, options, dataSourceName, DatabaseConnectionRole.Write);
- });
+ services.AddDbContext(
+ (sp, options) =>
+ {
+ ConfigureDbContextOptions(sp, options, dataSourceName, DatabaseConnectionRole.Write);
+ },
+ contextLifetime: ServiceLifetime.Scoped,
+ optionsLifetime: ServiceLifetime.Singleton);
services.AddDbContextFactory((sp, options) =>
{
diff --git a/src/Modules/TakeoutSaaS.Module.Scheduler/Services/RecurringJobRegistrar.cs b/src/Modules/TakeoutSaaS.Module.Scheduler/Services/RecurringJobRegistrar.cs
index 1da22a0..6e3d559 100644
--- a/src/Modules/TakeoutSaaS.Module.Scheduler/Services/RecurringJobRegistrar.cs
+++ b/src/Modules/TakeoutSaaS.Module.Scheduler/Services/RecurringJobRegistrar.cs
@@ -1,4 +1,4 @@
-using Hangfire;
+using Hangfire;
using TakeoutSaaS.Module.Scheduler.Abstractions;
using TakeoutSaaS.Module.Scheduler.Jobs;
@@ -9,29 +9,12 @@ namespace TakeoutSaaS.Module.Scheduler.Services;
///
public sealed class RecurringJobRegistrar : IRecurringJobRegistrar
{
- private readonly OrderTimeoutJob _orderTimeoutJob;
- private readonly CouponExpireJob _couponExpireJob;
- private readonly LogCleanupJob _logCleanupJob;
-
- ///
- /// 初始化注册器。
- ///
- public RecurringJobRegistrar(
- OrderTimeoutJob orderTimeoutJob,
- CouponExpireJob couponExpireJob,
- LogCleanupJob logCleanupJob)
- {
- _orderTimeoutJob = orderTimeoutJob;
- _couponExpireJob = couponExpireJob;
- _logCleanupJob = logCleanupJob;
- }
-
///
public Task RegisterAsync(CancellationToken cancellationToken = default)
{
- RecurringJob.AddOrUpdate("orders.timeout-cancel", () => _orderTimeoutJob.ExecuteAsync(), "*/5 * * * *");
- RecurringJob.AddOrUpdate("coupons.expire", () => _couponExpireJob.ExecuteAsync(), "0 */1 * * *");
- RecurringJob.AddOrUpdate("logs.cleanup", () => _logCleanupJob.ExecuteAsync(), "0 3 * * *");
+ RecurringJob.AddOrUpdate("orders.timeout-cancel", job => job.ExecuteAsync(), "*/5 * * * *");
+ RecurringJob.AddOrUpdate("coupons.expire", job => job.ExecuteAsync(), "0 */1 * * *");
+ RecurringJob.AddOrUpdate("logs.cleanup", job => job.ExecuteAsync(), "0 3 * * *");
return Task.CompletedTask;
}
}