前言

作为一个开发者,我们写博客不仅仅是为了记录,更是为了成长。但如果能有一个系统,帮你自动分析每一篇文章的技术难度、情感倾向,对你的全部博客做全局画像,甚至为你推荐个性化的进阶学习路线——这样的博客系统是不是很酷?

这就是 Blog AI System——一个面向个人开发者的智能博客管理与 AI 分析平台。


一、项目概览

Blog AI System 是一个全栈博客系统,核心定位是博客写作 + AI 智能分析。它不仅能帮你完成博客的 CRUD 管理和数据统计,更重要的是接入了 Dify AI 平台,提供三种维度的 AI 分析能力:

分析类型 功能描述
单篇博客分析 对指定文章进行智能分析,输出摘要、关键词、难度等级、技术分类
全局综合分析 对用户全部博客做整体画像:主题聚类、写作风格总结
学习路线推荐 基于用户博客历史,生成个性化进阶学习路线(含阶段划分、技能建议、外部资源推荐)

二、技术架构

2.1 技术栈一览

层级 技术选型 说明
后端框架 FastAPI (Python 3.12+) 异步高性能 Web 框架,自动生成 OpenAPI 文档
ORM SQLAlchemy 2.0 异步模式,声明式模型定义
数据库 MySQL 通过 aiomysql 异步驱动连接
数据校验 Pydantic v2 请求/响应模型的类型校验与序列化
认证 JWT + bcrypt 无状态 Bearer Token 认证,密码 bcrypt 哈希
AI 能力 Dify API 对接 Dify 平台的对话/工作流能力
HTTP 客户端 httpx 异步 HTTP 请求,用于调用 Dify API
前端 Jinja2 + 原生 JS SPA 风格的模板渲染,纯原生无框架

2.2 项目架构分层

项目采用经典的分层架构,职责清晰:

app/
├── main.py              # FastAPI 入口,挂载静态文件 & 模板路由
├── api/v1/              # 路由层:auth、blogs、users、statistics、ai_analysis
├── services/            # 业务逻辑层:认证、AI分析、用户服务
├── crud/                # 数据访问层:user、blog、ai_analysis
├── models/              # ORM 模型层:users、blogs、ai_analysis
├── schemas/             # Pydantic 请求/响应模型
├── core/                # 基础设施:config、database、security、middleware
├── deps/                # 依赖注入:JWT → 当前用户
├── utils/               # 工具/外部集成:Dify 客户端封装
└── common/              # 通用模块:日志、响应格式、异常

2.3 数据库设计

五张核心业务表:

![[Pasted image 20260515154627.png]]

  • t_user:用户表,bcrypt 哈希存储密码
  • t_blog:博客表,支持 Markdown 内容 + draft/published 状态
  • t_blog_analysis:单篇分析结果,与博客 1:1 关联,级联删除
  • t_global_analysis:全局分析结果,按用户维度存储主题聚类和综合总结
  • t_learning_path:学习路线推荐,包含阶段划分和外部资源推荐

三、核心功能详解

3.1 JWT 认证体系

系统实现了完整的无状态认证链路:

  1. 注册:用户名 + 密码 → bcrypt 哈希 → 存入数据库
  2. 登录:验证密码 → 签发 JWT(默认 1440 分钟有效)→ 返回 access_token
  3. 鉴权OAuth2PasswordBearer 从请求头提取 Token → decode_access_tokenget_current_user 依赖注入
# 权限校验示例(crud/blog.py)
async def delete_blog(db: AsyncSession, blog_id: int, user_id: int):
    blog = await get_blog(db, blog_id)
    if blog.user_id != user_id:
        raise PermissionError("无权操作该博客")
    await db.delete(blog)

所有博客操作都校验所有权(blog.user_id == current_user.id),确保数据隔离。

3.2 AI 分析——系统的灵魂

这是整个项目最出彩的部分。通过封装 Dify 客户端,将 AI 能力无缝集成到博客工作流中。

Dify 客户端封装

dify_client.py中,封装了两种调用模式:

  • 阻塞模式 (chat_blocking):等待 AI 完整返回结果
  • 流式模式 (chat_stream):逐 token 返回,适合实时展示

同时,系统配置了三个独立的 Dify 工作流 API Key,分别对应单篇分析、全局分析、学习路线推荐三类场景,做到了职责分离。

单篇博客分析

调用 Dify 工作流,传入博客标题和内容,返回结构化 JSON:

{
    "summary": "200字以内的文章摘要",
    "keywords": "Python, FastAPI, 异步编程, ...",
    "difficulty": "中级",
    "category": "Python后端"
}

全局综合分析

将所有博客列表传给 Dify,进行主题聚类和技术画像:

  • topic_clusters:按技术方向聚类(如前端开发、后端开发、AI/机器学习等),最多 5 个聚类
  • overall_summary:300 字以内的整体总结,涵盖写作风格、技术栈偏好、成长轨迹

学习路线推荐

基于用户博客中体现的技术栈和兴趣方向,生成 3~5 个阶段的学习路线,并推荐 5~8 个外部学习资源(书籍、文档、课程、开源项目等)。

3.3 数据统计模块

统计模块提供了 6 个维度的数据分析接口:

接口 功能
/statistics/overview 概览面板:总博客数、本月博客数、总字数、今日字数、已发布数、草稿数、平均字数
/statistics/monthly 近 12 个月每月发布数/草稿数/总字数趋势
/statistics/daily_words 近 30 天每日写作字数趋势
/statistics/status_distribution 按状态分组统计篇数/字数,含颜色标签
/statistics/top_blogs 按字数降序排列的 TOP10 博客
/statistics/writing_hours 按小时维度统计写作活跃时段(0-23 点)

这里有一个很巧妙的设计:统计字数时,需要剥离 Markdown 语法字符,只统计纯文本字数。在 statistics.py中的 strip_markdown() 函数,通过正则表达式逐步移除代码块、图片、链接、标题标记、粗体斜体、引用、列表等 Markdown 语法,确保字数统计的准确性。

3.4 前端页面

前端采用 Jinja2 模板 + 原生 JavaScript 的 SPA 风格,共 7 个页面:

页面 路由 功能
登录/注册 / 用户认证入口
仪表盘 /dashboard 概览数据
写博客 /write Markdown 编辑器
博客列表 /blogs 博客管理列表
AI 分析 /ai-analysis AI 分析入口页
数据统计 /statistics 可视化统计图表
个人设置 /settings 用户信息修改

四、设计亮点

4.1 统一响应格式

通过 success_responseerror_response 两个工具函数,所有 API 返回统一的 JSON 结构:

{"code": 200, "message": "success", "data": {...}}

这让前端可以统一处理响应,降低了对接成本。

4.2 异步数据库会话管理

通过依赖注入 + try/except 模式管理数据库事务:

async def get_session():
    async with SessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise

正常流程自动提交,异常时自动回滚,兼顾了简洁性和健壮性。

4.3 Base 基类统一时间字段

DeclarativeBase 中定义了 create_timeupdate_time 两个公共字段:

class Base(DeclarativeBase):
    create_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    update_time: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())

所有模型继承 Base 即自动拥有这两个字段,避免了重复定义,也保证了数据库层面的时间一致性。

4.4 配置管理

使用 .env 文件 + python-dotenv 管理环境变量,数据库连接串、JWT 密钥、Dify API Key 等敏感信息全部配置化,开发与生产环境隔离。


五、总结与展望

Blog AI System 是一个麻雀虽小五脏俱全的项目。它展示了如何用 FastAPI 搭建一个标准的分层架构后端,以及如何将 Dify 这样的 AI 平台能力集成到业务系统中。

项目的几个可扩展方向:

  1. Markdown 编辑器增强:引入 CodeMirror 或 Monaco Editor,支持实时预览、图片上传
  2. CSDN/掘金一键发布:对接各平台 API,实现博客的多平台分发
  3. AI 分析缓存优化:对分析结果做缓存,避免重复调用 Dify API(节省 Token)
  4. 知识图谱:基于全局分析的主题聚类,构建用户的知识体系图谱
  5. Docker 化部署:编写 Dockerfile + docker-compose,实现一键部署

如果你也在用 FastAPI 做个人项目,或者想体验 AI + 博客的化学反应,这个项目的架构思路和代码实现值得参考。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐