一个集「存・管・享・预览・智能问答」于一体的个人云网盘系统
支持文件全格式预览 | 分片秒传 | 在线分享 | 智能文档 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 天 / 永久)
- 提取码保护
- 分享浏览次数统计
- 访客无登录访问
- 取消分享 / 查看分享列表
- 删除文件软删除入回收站
- 一键还原
- 永久删除
- 定时任务自动清理过期回收站
- 同步触发向量库清理
- 多选网盘文件建立 / 增量更新 个人知识库
- 多轮会话管理(会话列表、重命名、删除)
- SSE 流式逐字 输出,回答带引用文件
@文件指令引入上下文- 预览页一键「提取要点摘要」
- 知识库管理:查看索引台账、从知识库移除
- 文档支持:txt / md / pdf / docx / xlsx / pptx / html 等
- 用户名 + 密码注册登录
- 邮箱验证码 + 图形验证码
- QQ 互联登录(回调集成)
- 修改密码 / 修改头像
- 个人空间配额管理
- 个人中心
- 系统设置(注册开关、默认空间等)
- 用户管理(启用 / 禁用 / 调整空间)
- 用户文件查看(管理员视角浏览全部用户文件)
- 超级管理员通过
admin.nick-names配置识别
| 技术 | 版本 | 说明 |
|---|---|---|
| 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 | - | 统一登录 / 管理员 / 参数校验切面 |
| 技术 | 版本 | 说明 |
|---|---|---|
| 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 | 样式预处理 |
| 技术 / 组件 | 形态 | 用途 |
|---|---|---|
| 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 方案 |
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 | 任意版本(启用视频转码时可选) |
# 登录 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;编辑 smart-disk-java/src/main/resources/application.yml:
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"cd smart-disk-java
mvn clean package -DskipTests
mvn spring-boot:run
# 或直接通过 IDEA 启动 SmartDiskApplication启动成功后访问 http://127.0.0.1:7090/api(返回 404 属正常)。
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 即可访问。
cd local_rag-main
# 方式一:uv(推荐)
uv sync
# 方式二:pip
pip install -r requirements.txt在 local_rag-main/ 目录创建 .env:
# 与 Java 端 rag.internal-token 保持一致
RAG_INTERNAL_TOKEN=your_random_token
# DeepSeek 模式时配置(可选)
DEEPSEEK_API_KEY=sk-your-key编辑 config.yaml 选择 LLM 与嵌入后端:
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-textollama pull nomic-embed-text
ollama pull qwen3.5:4b# uv 方式
uv run python rag.py
# 或者
python rag.py启动成功后访问 http://127.0.0.1:8000/docs 查看 API 文档。
- 浏览器打开
http://127.0.0.1:1024→ 注册 / 登录 - 上传文件、预览图片或 PDF
- 进入「智能文档」→ 选择 txt/md/pdf/docx 文件 → 建立知识库
- 新建会话提问,观察 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字段
如有问题或建议,欢迎通过以下方式联系:
- 🐛 提交 Issue
- ⭐ 给项目点个 Star 支持一下
感谢以下开源项目:
Made with ❤️ by 小孟全栈开发团队





