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; } }