AI图书阅读助手 — 一个基于FastAPI+Dify的全栈智能阅读平台

目录

一、项目背景
二、技术栈
三、项目架构
四、数据库设计
五、核心功能实现
六、部署与运行
七、项目亮点总结
八、未来展望

一、项目背景

在日常阅读中,我们常常会遇到几个痛点:

  • 读过的书容易忘记核心内容
  • 做笔记和整理摘抄比较繁琐
  • 遇到书中不理解的概念,需要手动搜索

为了解决这些问题,我开发了 AI图书阅读助手,一个集图书管理、阅读笔记、AI智能问答于一体的全栈Web应用。通过对接 Dify工作流引擎,用户可以直接与图书内容进行对话,实现智能问答和摘要生成。


二、技术栈

层级 技术选型
后端框架 FastAPI (Python)
数据库 MySQL + SQLAlchemy ORM
认证鉴权 JWT (python-jose)
AI引擎 Dify工作流API
前端 原生HTML/CSS/JavaScript
运行环境 Uvicorn

三、项目架构

ai_book_reader/
├── api/                    # API路由层
│   ├── __init__.py
│   ├── user_api.py         # 用户模块接口
│   ├── book_api.py         # 图书模块接口
│   ├── note_api.py         # 笔记模块接口
│   └── ai_api.py           # AI对话模块接口
├── service/                # 业务逻辑层
│   ├── __init__.py
│   ├── user_service.py     # 用户业务逻辑
│   ├── book_service.py     # 图书业务逻辑
│   ├── note_service.py     # 笔记业务逻辑
│   └── ai_service.py       # AI对话业务逻辑
├── models.py               # 数据库模型定义
├── config.py               # 全局配置
├── utils.py                # 工具函数(JWT、密码加密等)
├── main.py                 # 应用入口
├── static/                 # 前端静态文件
│   ├── css/style.css       # 样式文件
│   └── js/app.js           # 前端主逻辑
├── templates/
│   └── index.html          # 首页模板(SPA单页应用)
└── .env                    # 环境变量配置

分层说明

项目采用经典的三层架构:

  1. API路由层 (api/) — 接收HTTP请求,参数校验,调用Service层
  2. Service业务层 (service/) — 核心业务逻辑,数据库操作
  3. Model数据层 (models.py) — SQLAlchemy ORM模型定义

四、数据库设计

项目设计了5张核心数据表,通过外键建立完整关联:

1. 用户表 (user)

  • 字段:id, username, password(加密), nickname, avatar, intro, create_time, update_time
  • 关联:一对多 → 图书、笔记、对话记录、浏览历史

2. 图书表 (book)

  • 字段:id, user_id, title, author, category, description, cover_url, content, read_progress, is_collected 等
  • 支持存储图书文本内容、阅读进度追踪、收藏功能

3. 阅读笔记表 (reading_note)

  • 字段:id, book_id, user_id, note_type(摘抄/感悟/批注), content, create_time
  • 三种笔记类型,满足不同阅读场景

4. AI对话记录表 (chat_history)

  • 字段:id, user_id, book_id, user_question, ai_answer, create_time
  • 保存完整对话上下文,支持历史回顾

5. 浏览历史表 (view_history)

  • 字段:id, user_id, book_id, view_time
  • 记录用户浏览行为,支持最近阅读展示

核心代码片段(models.py):

from sqlalchemy import create_engine, Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

# 数据库连接配置
DB_URL = f"mysql+pymysql://{MYSQL_CONFIG['user']}:{MYSQL_CONFIG['password']}@{MYSQL_CONFIG['host']}:{MYSQL_CONFIG['port']}/{MYSQL_CONFIG['database']}?charset=utf8mb4"

engine = create_engine(DB_URL, pool_size=20, max_overflow=50, pool_recycle=3600)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), unique=True, nullable=False)
    password = Column(String(255), nullable=False)  # SHA256加密存储
    # ... 关联关系
    books = relationship("Book", back_populates="user", cascade="all, delete-orphan")
    notes = relationship("ReadingNote", back_populates="user", cascade="all, delete-orphan")

五、核心功能实现

1. JWT用户认证

密码使用 SHA256 加密存储,登录后签发JWT Token,有效期30天。前端将Token存入 localStorage,每次请求自动携带。

utils.py 核心代码:

def hash_password(password: str) -> str:
    return hashlib.sha256(password.encode()).hexdigest()

def create_access_token(data: dict):
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(minutes=TOKEN_EXPIRE_MINUTES)
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, TOKEN_SECRET, algorithm=TOKEN_ALGORITHM)

def verify_access_token(token: str):
    payload = jwt.decode(token, TOKEN_SECRET, algorithms=[TOKEN_ALGORITHM])
    return payload.get("user_id")

2. 图书管理(CRUD + 封面上传)

支持图书的增删改查,包含分类筛选、关键词搜索、分页查询。封面支持 JPG/PNG 格式上传,限制2MB以内。

book_api.py 关键路由:

router = APIRouter(prefix="/api/book", tags=["图书模块"])

@router.post("/create")
async def create(token: str = Query(...), title: str = Form(...), 
                 cover: UploadFile = File(None), db: Session = Depends(get_db)):
    user_id = get_current_user(token)
    # 处理封面上传、保存到数据库...
    return add_book(db, user_id, title, ...)

@router.get("")
def get_list(token: str = Query(...), page: int = 1, size: int = 10, ...):
    user_id = get_current_user(token)
    return get_book_list(db, user_id, page, size, ...)

3. 阅读笔记系统

支持三种笔记类型:摘抄(原文引用)、感悟(个人体会)、批注(即时点评)。可按图书筛选,支持关键词搜索。

4. AI智能问答 — 对接Dify工作流

这是项目的核心亮点。用户选择图书后,可以针对图书内容提问,系统将图书文本和问题一起发送给Dify工作流进行处理。

ai_service.py 核心实现:

def call_dify_workflow(book_content: str, user_question: str, task_type: str):
    url = f"{DIFY_API_URL}/workflows/run"
    headers = {
        "Authorization": f"Bearer {DIFY_API_KEY}",
        "Content-Type": "application/json"
    }
    payload = {
        "inputs": {
            "book_content": book_content,    # 图书内容
            "user_question": user_question,  # 用户问题
            "task_type": task_type           # 问答/摘要
        },
        "response_mode": "blocking"
    }
    response = requests.post(url, json=payload, headers=headers, timeout=60)
    return extract_answer(response.json())

工作流程:

  1. 用户选择图书 + 输入问题
  2. 从数据库读取图书内容(限制4096字符)
  3. 调用Dify工作流API
  4. 解析返回结果,保存对话记录
  5. 前端展示AI回答

5. 前端SPA架构

前端采用 单页应用(SPA) 模式,通过JavaScript动态切换页面内容,无需刷新。支持5个核心页面:

  • 首页 — 数据统计大盘(图书数、笔记数、对话数、收藏数)+ 最近阅读 + 收藏展示
  • 我的图书 — 图书列表(支持搜索筛选)+ 添加/编辑/删除/收藏/查看详情
  • 阅读笔记 — 按图书筛选笔记列表
  • AI问答 — 选择图书 → 选择任务类型(问答/摘要)→ 发起对话,带历史记录
  • 个人中心 — 个人信息编辑

六、部署与运行

环境要求

  • Python 3.10+
  • MySQL 5.7+
  • Dify 服务(可选,AI功能需要)

快速启动

# 1. 克隆项目
git clone <your-repo>
cd ai_book_reader

# 2. 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Linux/Mac
# 或 .venv\Scripts\activate  # Windows

# 3. 安装依赖
pip install -r requirements.txt

# 4. 配置环境变量(修改 .env 文件)
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=your_password
MYSQL_DB=ai_book_reader
DIFY_API_KEY=your_dify_api_key

# 5. 启动服务
python main.py
# 访问 http://localhost:8000

核心配置(config.py)

MYSQL_CONFIG = {
    "host": os.getenv("MYSQL_HOST", "localhost"),
    "port": int(os.getenv("MYSQL_PORT", 3306)),
    "user": os.getenv("MYSQL_USER", "root"),
    "password": os.getenv("MYSQL_PASSWORD", "123456"),
    "database": os.getenv("MYSQL_DB", "ai_book_reader"),
    "charset": "utf8mb4"
}
TOKEN_EXPIRE_MINUTES = 30 * 24 * 60  # JWT 30天过期

七、项目亮点总结

  1. 全栈自研:从数据库设计 → 后端API → 前端界面,完整闭环
  2. AI赋能阅读:通过Dify工作流引擎,实现基于图书内容的智能问答和摘要生成
  3. 架构清晰:采用API+Service分层,职责分明,易于扩展
  4. 安全可靠:密码SHA256加密,JWT无状态鉴权,SQLAlchemy防SQL注入
  5. 用户体验友好:响应式设计、Toast提示、弹窗交互、数据统计大盘
  6. 部署简单:单文件启动,环境变量配置,开箱即用

八、未来展望

  • 支持多用户协作(共享书单、笔记)
  • 集成更多AI模型(如本地LLM)
  • 增加阅读计时功能
  • 导出笔记为Markdown/PDF格式
  • 移动端适配优化
Logo

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

更多推荐