第一个项目
·
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 # 环境变量配置
分层说明
项目采用经典的三层架构:
- API路由层 (
api/) — 接收HTTP请求,参数校验,调用Service层 - Service业务层 (
service/) — 核心业务逻辑,数据库操作 - 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())
工作流程:
- 用户选择图书 + 输入问题
- 从数据库读取图书内容(限制4096字符)
- 调用Dify工作流API
- 解析返回结果,保存对话记录
- 前端展示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天过期
七、项目亮点总结
- 全栈自研:从数据库设计 → 后端API → 前端界面,完整闭环
- AI赋能阅读:通过Dify工作流引擎,实现基于图书内容的智能问答和摘要生成
- 架构清晰:采用API+Service分层,职责分明,易于扩展
- 安全可靠:密码SHA256加密,JWT无状态鉴权,SQLAlchemy防SQL注入
- 用户体验友好:响应式设计、Toast提示、弹窗交互、数据统计大盘
- 部署简单:单文件启动,环境变量配置,开箱即用
八、未来展望
- 支持多用户协作(共享书单、笔记)
- 集成更多AI模型(如本地LLM)
- 增加阅读计时功能
- 导出笔记为Markdown/PDF格式
- 移动端适配优化
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)