目标: 建立基础架构与开发环境,确定整体项目结构。 周期建议:1 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🔧 后端初始化 | 1. 使用 dotnet new webapi 创建主项目。2. 引入必要依赖:EF Core、Swashbuckle(Swagger)、AutoMapper、Serilog。 3. 按分层架构组织(Domain / Application / Infrastructure / API)。 |
可运行的 .NET8 Web API + Swagger 文档。 |
| 🧱 数据访问层 | 1. 连接 MSSQL。 2. 创建基础实体:Article、Category、Comment、User。 3. 配置 DbContext 与 Migration。 |
数据库结构 + 初始迁移。 |
| 📦 前端初始化 | 1. 使用 Vite + React + TypeScript 初始化前端项目。2. 引入 React Router、Axios、Tailwind CSS。 3. 配置基本路由(Home / Categories / About / Admin)。 |
可运行的前端项目 + 路由框架。 |
| ⚙️ 环境配置 | 建立 .env 文件体系,区分 dev / prod。 |
环境配置标准化。 |
目标: 完成文章、分类、评论的基础 API,支持前端调用。 周期建议:2–3 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🧩 文章模块 | 1. ArticleController:CRUD 接口。 2. 支持 Markdown 字段。 3. EF Core + AutoMapper 实现 DTO。 |
/api/articles 全功能接口。 |
| 🧭 分类模块 | 1. CategoryController:查询分类与分类下文章。 2. 提供汇总信息(归档、数量)。 |
/api/categories 接口。 |
| 💬 评论模块 | 1. CommentController:游客评论(带邮箱/昵称)。 2. 审核与反垃圾机制(后续)。 |
/api/comments 接口。 |
| 👤 用户认证模块 | 1. 使用 JWT + ASP.NET Identity 实现单管理员登录。 2. 登录、刷新 Token、权限控制。 |
/api/auth 登录认证体系。 |
| 🧠 Minimal API 辅助端点 | 暴露少量管理工具端点(如:缓存清理、健康检查)。 | /api/tools/* Minimal API。 |
目标: 实现博客主要页面与数据绑定。 周期建议:3–4 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🏠 博客首页 | 1. 调用文章列表 API。 2. 模块化布局(日历、天气、归档、最新评论)。 3. 引入状态管理(Zustand 或 Redux Toolkit)。 |
首页完成。 |
| 🗂️ 分类页 | 1. 动态生成分类导航。 2. 展示该分类下的文章。 |
分类详情页完成。 |
| 🧑💼 关于页 | 静态内容 + 服务器信息(后端返回时间、版本、构建时间)。 | 关于页完成。 |
| 📄 文章详情页 | 1. Markdown 渲染。 2. 评论区。 3. 分享与收藏(Cookie 本地存储)。 |
文章页完成。 |
目标: 构建管理员专用后台,实现博客管理能力。 周期建议:3–4 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 📝 博文管理 | 1. 在线 Markdown 编辑器。 2. 文件上传(md/txt/doc/docx)。 3. 文章隐藏、封禁、删除。 |
可用的文章管理页。 |
| 🎛️ 系统管理 | 1. “维护模式” 开关。 2. 一键主题切换(深色/节日主题)。 3. 附件管理、上传日志。 |
管理仪表盘完成。 |
| 🔑 管理端安全 | 1. 前端路由保护。 2. 管理端部署独立域名(如 admin.myblog.com)。 |
独立可访问管理端。 |
目标: 提升响应速度与系统稳定性。 周期建议:2–3 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🧩 Redis 缓存 | 1. 缓存首页文章列表、热门文章、统计信息。 2. 添加缓存中间件与失效机制。 |
Redis 缓存系统。 |
| 🔍 Elasticsearch 搜索 | 1. 同步文章数据到 ES。 2. 提供搜索接口 + 前端搜索框。 |
全文搜索功能。 |
| 🔄 博文同步服务 | 1. 构建后台 Worker(Hangfire 或 BackgroundService)。 2. 实现同步微信公众号 / CSDN 的最小版本。 |
自动同步后台任务。 |
目标: 将系统上线并建立可持续部署机制。 周期建议:1–2 周
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🐳 |
2. 使用 Docker Compose 统一编排。 |
|
| ☁️ 部署 | 1. 配置生产数据库 / Redis / Nginx 反向代理。 2. 启用 HTTPS。 |
线上可访问网站。 |
| 🔔 CI/CD | 1. GitHub Actions 或 Azure DevOps 自动构建。 2. 自动注入版本号与构建时间(前后端)。 |
自动化构建与版本信息。 |
目标: 提升系统稳定性与可维护性。 持续进行
| 模块 | 关键任务 | 产出 |
|---|---|---|
| 🧩 日志与监控 | Serilog + Seq / Elastic APM 监控运行状况。 | 可视化监控仪表盘。 |
| 🧹 优化与重构 | 定期代码审查、升级依赖、优化性能。 | 稳定的长期版本。 |
| 🧑🏫 文档维护 | 编写开发手册、部署文档、API 文档。 | 完整文档体系。 |
为推进项目完整性与可落地性,下面将阶段性评审的结果整理为后期待办(已按优先级排列)。该改动为单文件小改动,跳过单独计划。
- 紧急修复(现在)(Pending)
- 修复
UnitOfWork构造与Dispose/ 事务生命周期,实现或支持IAsyncDisposable,确保能通过构建并避免资源泄露。 - 修复
PackResultMiddleware:在所有分支恢复HttpContext.Response.Body;保留或携带原始 HTTPStatusCode;不要将内部异常详情(ex.Message/堆栈)回传给客户端;对于大文件/流式响应和非application/json类型跳过包装以避免内存压力与语义破坏。
- 近期(1–2 周)(Pending)
- 审查并修正
AutoMapper配置,确保敏感字段(如密码/密钥)不被映射至 DTO;统一DateTime时区/Kind 处理策略。 - 短码(
IShortCodeService)安全:将密钥存放在安全存储(UserSecrets/KeyVault),在生成时进行唯一性检测并实现有限重试策略以避免碰撞。 - 评论/输入安全:对 Markdown/HTML 渲染做 XSS 过滤或白名单 Sanitizer;为公开评论加速率限制与反垃圾机制(简单 CAPTCHA 或 IP 限制)。
- 中期(2–4 周)
- 添加单元测试与集成测试:覆盖中间件(JSON 包装/非 JSON/状态码)、UnitOfWork 事务、仓储分页与短码 encode/decode 边界。
- 引入 Redis 缓存关键视图/API(首页、热门文章、统计)并实现缓存失效策略与穿透保护;优化 EF 查询(
AsNoTracking()、投影、避免 N+1)并建议必要的 DB 索引。 - 分页接口改进:分页方法应返回包含
totalCount的分页结果对象,便于前端分页控件使用。
- 长期(上线前)
- 完整安全审计:依赖漏洞扫描、密钥与配置管理、CSP/CORS 策略、Token 撤销与会话管理。
- 性能调优与监控:索引优化、压力测试、APM(如 Elastic APM / Application Insights)、日志聚合与告警策略。
当前重点
- 优先完成“紧急修复”以保证项目能编译并通过本地验证(UnitOfWork 与 PackResultMiddleware 为首要);随后补充测试覆盖防止回归,再推进缓存、CI 与部署准备工作。
上线时记得同步数据库 UDF
- 启用 clr 程序集
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;- 信任程序集
exec sp_add_trusted_assembly
@hash = -- 计算最新的 TMod.Blog.Extensions.DBFunctions 的 Hash 值,
@description = N'扩展方法'- 删除然后重建程序集
create assembly [TMod.Blog.Extensions.DBFunctions]
from N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER_2022\MSSQL\External_Assemblies\TMod.Blog.Extensions.DBFunctions.dll'
with permission_set = safe;- 创建 UDF
create function dbo.UDF_GetSimilarity(
@s1 nvarchar(max),
@s2 nvarchar(max),
@weight1 float,
@weight2 float
)
returns float
as external name [TMod.Blog.Extensions.DBFunctions].[TMod.Blog.Extensions.DBFunctions.StringExtensionDBFunctions].[GetSimilarity];
create function dbo.UDF_IsSimilarTo(
@s1 nvarchar(max),
@s2 nvarchar(max),
@threshold float
)
returns bit
as external name [TMod.Blog.Extensions.DBFunctions].[TMod.Blog.Extensions.DBFunctions.StringExtensionDBFunctions].[IsSimilarTo]