前后端分离架构实战与项目落地:AI智能学习笔记管理系统
·
AI智能学习笔记管理系统
基于FastAPI + SQLAlchemy + 原生HTML/CSS/JavaScript构建的AI智能学习笔记管理系统,支持笔记CRUD、AI摘要生成、AI对话交互等功能。
目录
Gitee代码仓库地址:https://gitee.com/stephon_curry/ai-notes
技术栈
后端
- FastAPI - 高性能Python Web框架
- SQLAlchemy 2.0 - ORM数据库操作
- Pydantic - 数据校验
- JWT - 身份认证
- requests - HTTP请求
- MySQL - 数据库
前端
- 原生HTML/CSS/JavaScript - 无框架依赖
- Axios - HTTP客户端(CDN引入)
AI服务
- Dify API - AI对话和生成服务
功能特性
1. 用户管理模块
- 用户注册(用户名唯一、密码bcrypt加密)
- 用户登录(JWT令牌生成、前端localStorage存储)
- 全局JWT身份鉴权
- 退出登录功能
2. 笔记CRUD模块
- 新增笔记(标题必填、正文可选)
- 笔记列表分页查询(默认每页10条、按创建时间倒序)
- 笔记详情查询
- 笔记编辑(更新时间自动刷新)
- 笔记软删除(is_deleted标记)
- 笔记模糊搜索(标题/正文/标签)
3. 基础AI生成模块(Dify单向调用)
- AI智能摘要生成(30-50字)
- AI自动标签推荐(3-5个,逗号分隔)
- AI文本纠错优化
4. AI对话交互模块(Dify多轮对话)
- 单笔记专属会话自动创建
- 对话消息发送与AI响应
- 历史对话消息自动加载
- 会话清空重置功能
- 4个预设快捷指令:拆解知识点、生成练习题、梳理背诵提纲、解释专业术语
项目结构
ai-note-system/
├── backend/ # 后端代码
│ ├── app/ # 应用核心代码
│ │ ├── config/ # 配置文件
│ │ │ └── settings.py # 环境变量配置
│ │ ├── core/ # 核心模块
│ │ │ ├── database.py # 数据库连接
│ │ │ ├── security.py # JWT安全认证
│ │ │ ├── exceptions.py # 异常处理
│ │ │ └── dependencies.py # 依赖注入
│ │ ├── models/ # SQLAlchemy模型
│ │ ├── schemas/ # Pydantic数据模型
│ │ ├── services/ # 业务逻辑层
│ │ ├── api/ # API路由
│ │ │ └── v1/ # API版本控制
│ │ └── utils/ # 工具类
│ │ └── dify_client.py # Dify API客户端
│ ├── .env.example # 环境变量示例
│ └── requirements.txt # Python依赖
├── frontend/ # 前端代码
│ ├── static/ # 静态资源
│ │ ├── css/ # 样式文件
│ │ └── js/ # JavaScript文件
│ └── templates/ # HTML模板
└── README.md # 项目说明文档
数据库表设计
实体关系图(ER图)
┌──────────────┐ ┌──────────────┐
│ users │ │ notes │
│──────────────│ │──────────────│
│ id (PK) │<──────│ user_id (FK) │
│ username │ │ title │
│ password_hash│ │ content │
│ email │ │ summary │
│ created_at │ │ tags │
│ updated_at │ │ created_at │
│ is_deleted │ │ updated_at │
└──────────────┘ │ is_deleted │
└──────┬───────┘
│
│ note_id (FK)
▼
┌───────────────┐
│chat_sessions │
│───────────────│
│ id (PK) │
│ user_id (FK) │
│ note_id (UK) │
│ session_id │
│ created_at │
│ updated_at │
│ is_deleted │
└──────┬────────┘
│ chat_session_id (FK)
▼
┌───────────────┐
│chat_messages │
│───────────────│
│ id (PK) │
│ chat_session_id│
│ role │
│ content │
│ created_at │
│ is_deleted │
└───────────────┘
表详细设计
1. users 表(用户表)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一标识 |
| username | VARCHAR(50) | NOT NULL, UNIQUE, INDEX | 用户名,唯一 |
| password_hash | VARCHAR(255) | NOT NULL | 密码哈希值(bcrypt加密) |
| VARCHAR(100) | UNIQUE, INDEX | 邮箱地址,可选 | |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
| is_deleted | TINYINT(1) | DEFAULT 0 | 软删除标记(0=正常,1=已删除) |
2. notes 表(笔记表)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 笔记唯一标识 |
| user_id | INT | NOT NULL, INDEX, FOREIGN KEY | 所属用户ID |
| title | VARCHAR(200) | NOT NULL, INDEX | 笔记标题 |
| content | TEXT | NULL | 笔记正文内容 |
| summary | VARCHAR(200) | NULL | AI生成的摘要(30-50字) |
| tags | VARCHAR(200) | NULL | 标签,逗号分隔 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
| is_deleted | TINYINT(1) | DEFAULT 0 | 软删除标记 |
外键约束: user_id REFERENCES users(id) ON DELETE CASCADE
3. chat_sessions 表(对话会话表)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 会话唯一标识 |
| user_id | INT | NOT NULL, INDEX, FOREIGN KEY | 所属用户ID |
| note_id | INT | NOT NULL, UNIQUE, INDEX, FOREIGN KEY | 关联笔记ID(一篇笔记一个会话) |
| session_id | VARCHAR(50) | NOT NULL | Dify平台的会话ID |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
| is_deleted | TINYINT(1) | DEFAULT 0 | 软删除标记 |
外键约束:
user_idREFERENCESusers(id)ON DELETE CASCADEnote_idREFERENCESnotes(id)ON DELETE CASCADE
4. chat_messages 表(对话消息表)
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 消息唯一标识 |
| chat_session_id | INT | NOT NULL, INDEX, FOREIGN KEY | 所属会话ID |
| role | VARCHAR(20) | NOT NULL | 角色(user/assistant) |
| content | TEXT | NOT NULL | 消息内容 |
| created_at | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| is_deleted | TINYINT(1) | DEFAULT 0 | 软删除标记 |
外键约束: chat_session_id REFERENCES chat_sessions(id) ON DELETE CASCADE
数据库建表SQL
CREATE DATABASE IF NOT EXISTS ai_note_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE ai_note_db;
-- 用户表
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT(1) DEFAULT 0,
INDEX idx_users_username (username),
INDEX idx_users_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 笔记表
CREATE TABLE IF NOT EXISTS notes (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(200) NOT NULL,
content TEXT,
summary VARCHAR(200),
tags VARCHAR(200),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT(1) DEFAULT 0,
INDEX idx_notes_user_id (user_id),
INDEX idx_notes_title (title),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 对话会话表
CREATE TABLE IF NOT EXISTS chat_sessions (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
note_id INT NOT NULL UNIQUE,
session_id VARCHAR(50) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
is_deleted TINYINT(1) DEFAULT 0,
INDEX idx_chat_sessions_user_id (user_id),
INDEX idx_chat_sessions_note_id (note_id),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (note_id) REFERENCES notes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 对话消息表
CREATE TABLE IF NOT EXISTS chat_messages (
id INT AUTO_INCREMENT PRIMARY KEY,
chat_session_id INT NOT NULL,
role VARCHAR(20) NOT NULL,
content TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_deleted TINYINT(1) DEFAULT 0,
INDEX idx_chat_messages_chat_session_id (chat_session_id),
FOREIGN KEY (chat_session_id) REFERENCES chat_sessions(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
业务流程设计
1. 用户注册流程
2. 用户登录流程
3. 笔记CRUD流程
创建笔记
笔记列表与搜索
笔记编辑与删除
4. AI生成流程
5. AI对话流程
6. 预设快捷指令流程
快速开始
1. 环境要求
- Python 3.10+
- MySQL 5.7+
2. 数据库创建
执行上述数据库建表SQL创建数据库和表结构。
3. 环境变量配置
复制 .env.example 为 .env 并配置:
APP_ENV=development
APP_HOST=0.0.0.0
APP_PORT=8000
DATABASE_URL=mysql+pymysql://username:password@localhost:3306/ai_note_db
JWT_SECRET_KEY=your-secret-key-here-must-be-at-least-32-characters
JWT_ALGORITHM=HS256
JWT_EXPIRE_MINUTES=30
DIFY_API_KEY=your-dify-api-key-here
DIFY_API_BASE_URL=https://api.dify.ai/v1
4. Dify应用搭建
- 登录 Dify 创建账号
- 创建一个"对话应用"
- 在应用设置中获取API Key
- 将API Key填入
.env文件的DIFY_API_KEY
5. 安装依赖
cd backend
pip install -r requirements.txt
6. 启动项目
cd backend
python -m uvicorn app.main:app --reload
7. 访问地址
- 后端API: http://localhost:8000
- 前端页面: 通过HTTP服务器访问
frontend/templates/login.html
API接口
用户管理
| 接口 | 方法 | 描述 | 需要认证 |
|---|---|---|---|
/api/v1/users/register |
POST | 用户注册 | 否 |
/api/v1/users/login |
POST | 用户登录 | 否 |
/api/v1/users/me |
GET | 获取当前用户信息 | 是 |
/api/v1/users/logout |
POST | 退出登录 | 是 |
笔记管理
| 接口 | 方法 | 描述 | 需要认证 |
|---|---|---|---|
/api/v1/notes |
GET | 获取笔记列表(分页+搜索) | 是 |
/api/v1/notes |
POST | 创建笔记 | 是 |
/api/v1/notes/{note_id} |
GET | 获取笔记详情 | 是 |
/api/v1/notes/{note_id} |
PUT | 更新笔记 | 是 |
/api/v1/notes/{note_id} |
DELETE | 删除笔记(软删除) | 是 |
AI生成
| 接口 | 方法 | 描述 | 需要认证 |
|---|---|---|---|
/api/v1/ai/summary |
POST | 生成摘要 | 是 |
/api/v1/ai/tags |
POST | 生成标签 | 是 |
/api/v1/ai/proofread |
POST | 文本纠错 | 是 |
AI对话
| 接口 | 方法 | 描述 | 需要认证 |
|---|---|---|---|
/api/v1/chat/message |
POST | 发送消息 | 是 |
/api/v1/chat/history/{note_id} |
GET | 获取对话历史 | 是 |
/api/v1/chat/clear |
POST | 清空对话 | 是 |
/api/v1/chat/preset-commands |
GET | 获取预设指令 | 是 |
响应格式
所有接口统一返回格式:
{
"code": 200,
"message": "success",
"data": {}
}
状态码说明:
200- 成功201- 创建成功400- 请求参数错误401- 未授权(需要登录)403- 禁止访问(权限不足)404- 资源不存在500- 服务器内部错误
注意事项
- 请确保MySQL服务正常运行,并正确配置数据库连接信息
- Dify API Key需要正确配置才能使用AI功能,否则AI相关接口将返回失败提示
- 前端页面需要通过HTTP服务器访问(如Python http.server或Live Server),不能直接双击打开
- JWT_SECRET_KEY需要设置至少32个字符的密钥,建议使用随机生成的安全密钥
- 所有数据库查询都会自动过滤
is_deleted=0的记录,实现软删除逻辑 - 用户只能操作自己的数据,后端会自动校验用户权限
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)