# 基于SpringBoot+Vue+FastAPI+Agent的AI网盘系统 **Repository Path**: springmeng/wangpan ## Basic Information - **Project Name**: 基于SpringBoot+Vue+FastAPI+Agent的AI网盘系统 - **Description**: 小浣熊AI网盘系统整体由 Vue 3 前端、SpringBoot 3 后端、Python FastAPI RAG 服务 三个独立运行时构成,项目带AI功能,非常智能。star支持。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.javaclimb.com/ - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 1 - **Created**: 2026-05-28 - **Last Updated**: 2026-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringBoot, Vue, Python, FastAPI ## README # 🦝 小浣熊网盘 (smart-disk) ![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5.13-brightgreen) ![Java](https://img.shields.io/badge/Java-21-orange) ![Vue.js](https://img.shields.io/badge/Vue.js-3.x-42b883) ![Vite](https://img.shields.io/badge/Vite-5.4-blue) ![Python](https://img.shields.io/badge/Python-3.12-yellow) ![FastAPI](https://img.shields.io/badge/FastAPI-LangChain-009688) ![MySQL](https://img.shields.io/badge/MySQL-8.0-005c84) ![Redis](https://img.shields.io/badge/Redis-Lettuce-d82c20) ![License](https://img.shields.io/badge/License-MIT-lightgrey) **一个集「存・管・享・预览・智能问答」于一体的个人云网盘系统** 支持文件全格式预览 | 分片秒传 | 在线分享 | 智能文档 RAG 问答 | 多端响应式 [快速开始](#-快速开始) · [功能特性](#-功能特性) · [技术架构](#-技术架构) · [项目结构](#-项目结构) · [数据库说明](#-数据库说明) --- ## 📖 项目简介 **小浣熊网盘(smart-disk)** 是一个采用前后端分离 + AI 微服务三层架构的现代化云存储系统。系统围绕「存、管、享、预览」形成网盘业务闭环,并集成 **基于 RAG(检索增强生成)的智能文档** 能力——用户可将授权范围内的文档建立向量索引,进行多轮检索问答,同时支持在预览场景下提取文档要点摘要。 整体由 **Vue 3 前端、Spring Boot 3 后端、Python FastAPI RAG 服务** 三个独立运行时构成。Java 后端作为 BFF(Backend For Frontend)统一负责 Session 鉴权与文件归属校验后,再以内网调用方式访问 Python RAG 服务;向量检索、对话生成与会话持久化分工明确:MySQL 保存业务真相与 AI 台账,Chroma 保存向量,FastAPI 负责编排与模型调用。 --- ## ✨ 核心亮点 - 🗂️ **完整网盘业务闭环** - 上传、预览、分享、回收站、空间配额一站式管理 - 🤖 **智能文档 RAG 问答** - 多文件知识库 + SSE 流式回答 + 引用溯源 - 🔁 **大文件分片秒传** - 基于 spark-md5 的客户端分片 + 服务端 MD5 秒传 - 🎬 **全格式在线预览** - PDF / Office / 图片 / 文本 / 代码高亮 / HLS 音视频 - 🛡️ **权限分层 + AOP 拦截** - 登录、管理员、参数校验通过自定义注解一键开启 - 🔌 **可插拔 AI 后端** - 支持本地 Ollama / 云端 DeepSeek / OpenAI 兼容嵌入 - 🧱 **BFF 内网网关** - Java 统一鉴权后以 `X-Internal-Token` 内网调用 Python RAG - 🧹 **向量与文件联动清理** - 网盘删文件时异步清理 Chroma 向量与索引台账 - 👨‍💼 **后台管理系统** - 系统设置、用户管理、空间调整、用户文件运维 --- ## 🌟 功能特性 ### 📁 文件管理 - 文件上传(分片上传、MD5 秒传、断点续传) - 文件列表(分类视图 / 目录视图 / 网格视图) - 文件操作(重命名、移动、复制、删除) - 文件分类(视频、音频、图片、文档、其他) - 最近上传与最近访问 - 多选与批量操作 - 全文件类型在线预览 ### 👁️ 在线预览 - 📄 PDF 预览(`vue-pdf-embed`) - 📝 Office 预览(`docx-preview`、`xlsx`) - 🖼️ 图片预览(缩放、旋转) - 🎬 视频预览(DPlayer + HLS 自动转码) - 🎵 音频播放(aplayer) - 💻 代码高亮(highlight.js,支持多语言) - 📜 文本预览(Markdown 渲染) ### 🔗 文件分享 - 创建分享(有效期:1 天 / 7 天 / 30 天 / 永久) - 提取码保护 - 分享浏览次数统计 - 访客无登录访问 - 取消分享 / 查看分享列表 ### ♻️ 回收站 - 删除文件软删除入回收站 - 一键还原 - 永久删除 - 定时任务自动清理过期回收站 - 同步触发向量库清理 ### 🤖 智能文档 (AI / RAG) - 多选网盘文件建立 / 增量更新 **个人知识库** - 多轮会话管理(会话列表、重命名、删除) - **SSE 流式逐字** 输出,回答带引用文件 - `@` 文件指令引入上下文 - 预览页一键「提取要点摘要」 - 知识库管理:查看索引台账、从知识库移除 - 文档支持:txt / md / pdf / docx / xlsx / pptx / html 等 ### 🔐 用户系统 - 用户名 + 密码注册登录 - 邮箱验证码 + 图形验证码 - QQ 互联登录(回调集成) - 修改密码 / 修改头像 - 个人空间配额管理 - 个人中心 ### 🛡️ 后台管理 - 系统设置(注册开关、默认空间等) - 用户管理(启用 / 禁用 / 调整空间) - 用户文件查看(管理员视角浏览全部用户文件) - 超级管理员通过 `admin.nick-names` 配置识别 --- ## 🛠️ 技术架构 ### 后端技术栈(smart-disk-java) | 技术 | 版本 | 说明 | | --------------- | -------- | --------------------------------------- | | Spring Boot | 3.5.13 | 核心框架 | | Java | 21 | 运行时与编译目标(Maven Enforcer 强制) | | MySQL | 8.0+ | 业务数据库 | | MyBatis-Plus | 3.5.16 | ORM、分页、条件查询 | | Druid | 1.2.28 | 数据库连接池 | | Redis (Lettuce) | - | Session 缓存 / 业务缓存 | | OkHttp | 4.12.0 | 调用 local_rag 内网 HTTP / SSE | | Apache POI | 5.2.5 | Office 文档解析 | | PDFBox | 2.0.31 | PDF 文本抽取 | | Jsoup | 1.17.2 | HTML 解析 | | Fastjson | 1.2.83 | JSON 序列化 | | FFmpeg | 外部依赖 | 视频转码 / HLS 切片 | | Spring Mail | - | 邮件验证码 | | AOP | - | 统一登录 / 管理员 / 参数校验切面 | ### 前端技术栈(smart-disk-front) | 技术 | 版本 | 说明 | | ---------------- | ------ | ---------------------------- | | Vue | 3.2.x | 单页应用 UI | | Vite | 5.4.x | 开发服务器与生产构建 | | Element Plus | 2.2.x | 组件库 | | Pinia | 2.0.x | 状态管理(含智能文档 store) | | Vue Router | 4.1.x | 路由 + `needLogin` 守卫 | | Axios | 1.3.x | HTTP 请求封装 | | Marked | 18.x | AI 回答 Markdown 渲染 | | highlight.js | 11.x | 代码高亮 | | vue-pdf-embed | 1.1.x | PDF 在线预览 | | docx-preview | 0.1.x | Word 在线预览 | | xlsx | 0.18.x | Excel 在线预览 | | DPlayer / hls.js | - | 视频播放(含 HLS) | | APlayer | - | 音频播放 | | spark-md5 | 3.0.x | 客户端分片 MD5 计算 | | dompurify | 3.4.x | XSS 防御 | | Sass | 1.59.x | 样式预处理 | ### AI / RAG 技术栈(local_rag-main) | 技术 / 组件 | 形态 | 用途 | | ------------------------------ | ------------------------ | ----------------------------- | | Python | 3.12(uv 管理) | RAG 服务运行时 | | FastAPI + Uvicorn | HTTP 服务 | 对内 `/internal/*` API | | LangChain | 文档分片、向量库、LLM 链 | ingest、summary、对话 | | LangGraph / MemorySaver | 进程内 | 按 `thread_id` 的多轮会话记忆 | | Chroma | 持久化目录 `chroma_db/` | 按用户 collection 存储向量 | | Ollama | 默认 | 本地对话 LLM 与 Embedding | | DeepSeek / OpenAI-compatible | 可配置 | 云端对话或 Embedding 替代方案 | | RecursiveCharacterTextSplitter | chunk 1000 / overlap 200 | 文档分片 | | sentence-transformers | HuggingFace 本地 | 可选的本地 Embedding 方案 | --- ## 📂 项目结构 ```text smart-disk/ # 项目根目录 ├── docs/ # 项目文档 │ ├── 小浣熊网盘-技术文档.md # 技术说明 │ ├── 小浣熊网盘-部署文档.md # 部署指南 │ └── rag优化.md # RAG 优化方案 │ ├── smart-disk-java/ # 后端项目(Spring Boot 3.5 + Java 21) │ ├── src/main/ │ │ ├── java/com/smartdisk/ │ │ │ ├── SmartDiskApplication.java # 启动入口 │ │ │ ├── controller/ # REST Controller │ │ │ │ ├── AccountController.java # 注册 / 登录 / 验证码 │ │ │ │ ├── FileInfoController.java # 文件 CRUD / 分片上传 / 预览 │ │ │ │ ├── ShareController.java # 分享管理(登录用户) │ │ │ │ ├── WebShareController.java # 分享访问(访客) │ │ │ │ ├── RecycleController.java # 回收站 │ │ │ │ ├── AdminController.java # 后台管理 │ │ │ │ ├── AiController.java # AI / RAG 入口 │ │ │ │ └── AiChatController.java # AI 会话与消息 │ │ │ ├── service/ # 业务服务层 │ │ │ │ ├── FileInfoService(Impl) │ │ │ │ ├── FileShareService(Impl) │ │ │ │ ├── UserInfoService(Impl) │ │ │ │ ├── EmailCodeService(Impl) │ │ │ │ ├── AiFileIndexService # 知识库索引台账 │ │ │ │ ├── AiChatThreadService # AI 会话与消息 │ │ │ │ ├── RagProxyService # 组装 / 转发 RAG 请求 │ │ │ │ ├── RagVectorCleanupService # 删文件同步清理向量 │ │ │ │ └── DocumentPlainTextService # 多格式文档纯文本抽取 │ │ │ ├── mappers/ # MyBatis-Plus Mapper │ │ │ ├── entity/ │ │ │ │ ├── po/ # 持久化对象 │ │ │ │ ├── dto/ # 数据传输对象 │ │ │ │ ├── vo/ # 视图对象 │ │ │ │ ├── config/ # 业务配置类 │ │ │ │ └── constants/ # 常量 │ │ │ ├── aspect/ # AOP 切面(全局拦截器) │ │ │ ├── component/ # Redis / RAG 客户端组件 │ │ │ ├── config/ # AI / RAG 配置 Properties │ │ │ ├── task/ # 定时任务(如回收站清理) │ │ │ ├── utils/ # 工具类(OKHttp、JSON、日期等) │ │ │ └── spring/ # Spring 上下文工具 │ │ └── resources/ │ │ ├── application.yml # 主配置(DB / Redis / RAG / AI) │ │ ├── logback-spring.xml # 日志配置 │ │ └── com/smartdisk/mappers/ # MyBatis XML 映射 │ ├── ffmpeg/ # FFmpeg 可执行目录(视频转码) │ ├── smart-disk.sql # 数据库初始化脚本 │ └── pom.xml # Maven 依赖 │ ├── smart-disk-front/ # 前端项目(Vue 3 + Vite 5) │ ├── src/ │ │ ├── views/ # 页面 │ │ │ ├── Login.vue # 登录注册 │ │ │ ├── Framework.vue # 主框架 │ │ │ ├── main/ # 主页 / 上传 / 我的分享 │ │ │ ├── smart-doc/SmartDocWorkspace.vue # 智能文档工作台 │ │ │ ├── share/ # 我的分享 │ │ │ ├── webshare/ # 访客分享访问 │ │ │ ├── recycle/ # 回收站 │ │ │ ├── admin/ # 后台管理 │ │ │ ├── UpdatePassword.vue │ │ │ ├── UpdateAvatar.vue │ │ │ └── QqLoginCallback.vue │ │ ├── components/ # 公共组件 │ │ │ ├── preview/ # 文件预览组件集 │ │ │ ├── ai/ # AI 相关组件 │ │ │ │ ├── KnowledgeBaseManage.vue │ │ │ │ ├── KnowledgeBaseWizard.vue │ │ │ │ ├── FileMentionComposer.vue │ │ │ │ ├── DiskFilePicker.vue │ │ │ │ ├── PreviewAiToolbar.vue │ │ │ │ ├── MarkdownMessage.vue │ │ │ │ └── SmartDocDemoHost.vue │ │ │ ├── Avatar.vue / AvatarUpload.vue │ │ │ ├── Dialog.vue / Window.vue │ │ │ ├── Table.vue / Navigation.vue │ │ │ ├── FolderSelect.vue / NoData.vue │ │ │ └── Icon.vue │ │ ├── api/aiRag.js # AI / RAG 前端 API(含 SSE 解析) │ │ ├── router/ # Vue Router 路由 │ │ ├── stores/ # Pinia 状态管理 │ │ ├── utils/ # Request / Message / Verify 等 │ │ ├── assets/ # 静态资源(图标、样式) │ │ └── main.js # 应用入口 │ ├── public/ # 公共静态资源 │ ├── index.html │ ├── vite.config.js # Vite 配置(含 /api 代理) │ └── package.json │ ├── local_rag-main/ # AI / RAG 微服务(Python 3.12 + FastAPI) │ ├── rag.py # FastAPI 入口(含 /internal/* 接口) │ ├── rag_pipeline.py # 统一 RAG 流水线(路由 / 检索 / 生成) │ ├── app.py # Streamlit 演示界面 │ ├── settings.py # 读取与校验 config.yaml │ ├── logging_config.py # 日志配置 │ ├── config.yaml # LLM / Embedding Provider 配置 │ ├── pyproject.toml / uv.lock # uv 依赖管理 │ ├── requirements.txt # 兼容 pip 的依赖列表 │ ├── chroma_db/ # 向量数据库持久化目录 │ └── .env # 密钥与内网 Token │ └── project-folder/ # 网盘文件存储根目录(运行时生成) ├── file/ # 用户文件按日期分目录存储 ├── temp/ # 分片上传临时目录 └── logs/ # 运行日志 ``` --- ## 🚀 快速开始 ### 环境要求 | 软件 | 版本要求 | | ----------- | -------------------------------------------- | | **JDK** | 21 或以上 | | **Maven** | 3.8+ | | **Node.js** | 18 LTS 或 20 LTS | | **Python** | 3.10+(推荐 3.12,与 `local_rag-main` 一致) | | **MySQL** | 8.0+ 推荐 | | **Redis** | 5.0+ | | **Ollama** | 任意版本(启用本地 LLM 时可选) | | **FFmpeg** | 任意版本(启用视频转码时可选) | ### 后端部署 #### 1. 初始化数据库 ```bash # 登录 MySQL mysql -u root -p # 创建数据库 CREATE DATABASE `smart-disk` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 导入初始化脚本 USE `smart-disk`; SOURCE smart-disk-java/smart-disk.sql; ``` #### 2. 修改后端配置 编辑 `smart-disk-java/src/main/resources/application.yml`: ```yaml spring: datasource: url: jdbc:mysql://127.0.0.1:3306/smart-disk?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&useSSL=false username: root # 修改为你的数据库用户名 password: your_password # 修改为你的数据库密码 data: redis: host: 127.0.0.1 port: 6379 password: foobared # 修改为你的 Redis 密码 # 项目目录(用斜杠分隔,Windows 示例) project: folder: G:/pan/smart-disk/project-folder ffmpeg-bin: G:/pan/smart-disk/smart-disk-java/ffmpeg/bin # 不用视频可留空 # 超级管理员(按登录昵称白名单判定) admin: nick-names: admin # RAG 内网代理;与 Python 环境变量 RAG_INTERNAL_TOKEN 保持一致 rag: enabled: true base-url: http://127.0.0.1:8000 internal-token: "your_random_token" ``` #### 3. 启动后端 ```bash cd smart-disk-java mvn clean package -DskipTests mvn spring-boot:run # 或直接通过 IDEA 启动 SmartDiskApplication ``` 启动成功后访问 `http://127.0.0.1:7090/api`(返回 404 属正常)。 ### 前端部署 ```bash cd smart-disk-front # 安装依赖(推荐使用国内镜像) npm config set registry https://registry.npmmirror.com npm install # 启动开发服务器 npm run dev # 生产构建 npm run build ``` 浏览器打开 `http://127.0.0.1:1024` 即可访问。 ### RAG 智能文档服务部署 #### 1. 安装 Python 依赖 ```bash cd local_rag-main # 方式一:uv(推荐) uv sync # 方式二:pip pip install -r requirements.txt ``` #### 2. 配置 `.env` 与 `config.yaml` 在 `local_rag-main/` 目录创建 `.env`: ```env # 与 Java 端 rag.internal-token 保持一致 RAG_INTERNAL_TOKEN=your_random_token # DeepSeek 模式时配置(可选) DEEPSEEK_API_KEY=sk-your-key ``` 编辑 `config.yaml` 选择 LLM 与嵌入后端: ```yaml llm: provider: ollama # 可选:ollama / deepseek ollama: base_url: http://127.0.0.1:11434 chat_model: qwen3.5:4b embeddings: provider: ollama ollama: embed_model: nomic-embed-text ``` #### 3. 拉取 Ollama 模型(使用 Ollama 模式时) ```bash ollama pull nomic-embed-text ollama pull qwen3.5:4b ``` #### 4. 启动 RAG 服务 ```bash # uv 方式 uv run python rag.py # 或者 python rag.py ``` 启动成功后访问 `http://127.0.0.1:8000/docs` 查看 API 文档。 ### 验收 1. 浏览器打开 `http://127.0.0.1:1024` → 注册 / 登录 2. 上传文件、预览图片或 PDF 3. 进入「智能文档」→ 选择 txt/md/pdf/docx 文件 → 建立知识库 4. 新建会话提问,观察 SSE 流式逐字回答 --- ## 🗄️ 数据库说明 ### 主要数据表 | 表名 | 说明 | | ----------------- | ----------------------------------------------- | | **用户与认证** | | | `user_info` | 用户信息表(含 QQ 登录、空间配额) | | `email_code` | 邮箱验证码表 | | **网盘核心** | | | `file_info` | 文件元信息(含分类、转码状态、回收站标记) | | `file_share` | 文件分享记录(有效期、提取码、浏览次数) | | **智能文档 AI** | | | `ai_chat_thread` | AI 智能文档会话表 | | `ai_chat_message` | AI 会话消息表(含引用来源 JSON) | | `ai_file_index` | AI 知识库索引台账(indexed / failed / removed) | ### 关键字段速览 **`file_info`**:使用 `file_category` 区分(1视频 / 2音频 / 3图片 / 4文档 / 5其他),`file_type` 进一步细分;`del_flag` 0/1/2 表示删除/回收站/正常。 **`ai_file_index`**:以 `(user_id, file_id)` 作为唯一键,状态机覆盖索引/失败/移除全过程。 **`ai_chat_message`**:`extra_json` 存储引用来源(citations)等扩展信息,配合前端渲染引用气泡。 --- ## ⚙️ 配置说明 ### 端口与服务地址速查 | 服务 | 默认地址 | 备注 | | ------------ | -------------------------- | ---------------- | | 前端(开发) | http://127.0.0.1:1024 | Vite 开发服务器 | | Java API | http://127.0.0.1:7090/api | Spring Boot 后端 | | RAG 文档 | http://127.0.0.1:8000/docs | FastAPI 内网服务 | | Ollama | http://127.0.0.1:11434 | 本地 LLM 网关 | | MySQL | 127.0.0.1:3306 | 业务数据库 | | Redis | 127.0.0.1:6379 | Session / 缓存 | ### 关键配置项 | 配置前缀 | 说明 | | ------------------------------------------------ | ----------------------------------------- | | `spring.datasource` | MySQL 连接(Druid 连接池) | | `spring.data.redis` | Redis 连接 | | `spring.mail` | SMTP 邮件服务(验证码) | | `project.folder` | 网盘文件根目录 | | `project.ffmpeg-bin` | FFmpeg 可执行目录(视频转码 / HLS) | | `admin.nick-names` | 超级管理员昵称白名单(逗号分隔) | | `rag.enabled` | 是否启用智能文档能力 | | `rag.base-url` | RAG 服务内网地址 | | `rag.internal-token` | 内网鉴权令牌(必须与 RAG 端 `.env` 一致) | | `rag.connect-timeout-ms` / `rag.read-timeout-ms` | RAG 调用超时(流式建议 300000) | | `ai.chat.persist.enabled` | 是否启用服务端会话 / 消息持久化 | ### 安全建议 - 生产环境通过 **环境变量** 或 **外部配置中心** 覆盖数据库密码、Redis 密码、`rag.internal-token`、邮件凭证 - **避免** 将真实密钥提交到版本库(项目已通过 `.gitignore` 排除 `.env` 与 `config.yaml`) - RAG 服务 `:8000` 端口 **不要对公网开放**,仅允许 Java 后端在内网调用 - 文件归属校验严格基于 Session 用户身份,**不可** 信任请求体中的 `userId` 字段 --- ## 📸 系统截图 ![输入图片说明](pictures/ScreenShot_2026-05-28_144919_067.png) ![输入图片说明](pictures/ScreenShot_2026-05-28_144943_511.png) ![输入图片说明](pictures/ScreenShot_2026-05-28_145001_730.png) ![输入图片说明](pictures/ScreenShot_2026-05-28_145011_372.png) ![输入图片说明](pictures/ScreenShot_2026-05-28_145019_528.png) ![输入图片说明](pictures/ScreenShot_2026-05-28_145028_217.png) --- ## 💬 联系与反馈 如有问题或建议,欢迎通过以下方式联系: - 🐛 提交 Issue - ⭐ 给项目点个 Star 支持一下 --- ## 🙏 致谢 感谢以下开源项目: - [Spring Boot](https://spring.io/projects/spring-boot) - [MyBatis-Plus](https://baomidou.com/) - [Vue.js](https://vuejs.org/) - [Vite](https://vitejs.dev/) - [Element Plus](https://element-plus.org/) - [LangChain](https://www.langchain.com/) - [Chroma](https://www.trychroma.com/) - [Ollama](https://ollama.ai/) - [FastAPI](https://fastapi.tiangolo.com/) ---
**如果这个项目对你有帮助,请点个 ⭐ Star 支持一下!** Made with ❤️ by 小孟全栈开发团队