# Snapshot 一个简洁、安全的临时文件分享平台。无需注册,上传即分享。 ## 特性 - **文件上传** — 支持多文件上传,单文件最大 500MB,最多 10 个文件 - **文本分享** — 支持纯文本、Markdown、代码、JSON 四种格式,代码高亮显示 - **灵活过期** — 1 小时 ~ 7 天,或永不过期;自定义下载次数限制 - **密码保护** — 可选访问密码,SHA-256 哈希存储 - **ID 前缀匹配** — 输入 ID 前几位即可自动跳转(字典树算法) - **打包下载** — 一键 ZIP 打包下载所有文件 - **自动清理** — 定时清理过期内容,释放存储空间 - **双数据库** — SQLite(零配置开箱即用)/ MySQL 一键切换 - **一体化部署** — 前端打包进后端 JAR,单进程运行 - **后端驱动配置** — 文件大小、数量限制统一在后端配置,前端自动获取 ## 技术栈 | 层级 | 技术 | |------|------| | 前端 | Vue 3.3 + Vue Router 4 + Pinia + Axios | | 后端 | Spring Boot 2.7.18 + MyBatis + JPA + Java 17 | | 数据库 | SQLite(默认)/ MySQL 8.0+ | | 构建 | Maven + npm | ## 快速开始 ### 环境要求 - Java 17+ - Maven 3.6+ - Node.js 16+ / npm 8+(仅开发或一体化部署时需要) ### 一体化部署(推荐) 1. 复制配置模板并按需修改: ```bash cd backend/src/main/resources cp application.properties.example application.properties # 如需 MySQL,还需: cp application-mysql.properties.example application-mysql.properties # 编辑 application-mysql.properties 填入数据库密码 ``` 2. 构建并启动: **Windows:** ```bash deploy.bat ``` **Linux / macOS:** ```bash chmod +x deploy.sh && ./deploy.sh ``` 构建完成后启动: ```bash cd backend java -jar target/snapshot-backend-1.0.0.jar ``` 访问 http://localhost:7626 即可使用。 > 首次启动默认使用 SQLite,无需安装任何数据库。 ## 数据库配置 项目通过 Spring Profile 切换数据库,配置位于 `backend/src/main/resources/application.properties`: ```properties # 使用 SQLite(默认,零配置) spring.profiles.active=dev,sqlite # 使用 MySQL # spring.profiles.active=dev,mysql ``` ### SQLite(默认) 无需任何额外配置,启动时自动在 `data/` 目录创建数据库文件。适合个人使用或轻量部署。 ### MySQL 1. 创建数据库: ```bash mysql -uroot -p < backend/src/main/resources/sql/create.sql ``` 2. 修改 `application-mysql.properties` 中的数据库连接信息: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/snapshot?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=your_password ``` 3. 切换 Profile 为 `dev,mysql` ## 项目结构 ``` snapshot/ ├── backend/ # Spring Boot 后端 │ ├── src/main/java/com/snapshot/ │ │ ├── config/ # 配置(CORS、SQLite方言、MyBatis、数据库初始化) │ │ ├── controller/ # REST 控制器 │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # JPA 实体类 │ │ ├── exception/ # 全局异常处理 │ │ ├── mapper/ # MyBatis Mapper 接口 │ │ ├── repository/ # JPA Repository │ │ ├── service/ # 业务逻辑 │ │ └── util/ # 工具类(ID生成、密码哈希) │ ├── src/main/resources/ │ │ ├── mapper/ # MyBatis XML 映射 │ │ ├── sql/ # 数据库初始化脚本 │ │ ├── static/ # 前端构建产物(一体化部署) │ │ ├── application.properties # 主配置 │ │ ├── application-mysql.properties # MySQL 配置 │ │ └── application-sqlite.properties # SQLite 配置 │ └── pom.xml │ ├── frontend/ # Vue 3 前端 │ ├── src/ │ │ ├── api/ # API 接口封装 │ │ ├── components/ # 组件(Markdown渲染、代码高亮、Toast) │ │ ├── router/ # 路由配置 │ │ ├── stores/ # Pinia 状态管理 │ │ ├── styles/ # 全局样式 │ │ ├── views/ # 页面(Home、Share、NotFound) │ │ ├── config.js # 前端配置(启动时从后端获取) │ │ └── main.js │ └── package.json │ ├── api/ │ └── API_DOCUMENT.md # RESTful API 接口文档 └── deploy.bat / deploy.sh # 一体化部署脚本 ``` ## API 概览 完整接口文档请参考 [API_DOCUMENT.md](api/API_DOCUMENT.md)。 | 分类 | 方法 | 端点 | 说明 | |------|------|------|------| | 配置 | GET | `/api/config` | 获取前端配置 | | 上传 | POST | `/api/upload` | 创建上传记录 | | 上传 | POST | `/api/upload/{id}/files` | 上传文件 | | 上传 | GET | `/api/upload/{id}` | 获取上传详情 | | 上传 | DELETE | `/api/upload/{id}` | 删除上传记录 | | 上传 | GET | `/api/upload/resolve/{prefix}` | 前缀解析ID | | 分享 | GET | `/api/share/{id}` | 访问分享内容 | | 分享 | POST | `/api/share/{id}/verify` | 密码验证 | | 分享 | GET | `/api/share/{id}/file/{fileId}` | 下载单个文件 | | 分享 | GET | `/api/share/{id}/download-all` | ZIP打包下载 | ## 配置说明 所有核心配置集中在 `application.properties`,前端在启动时通过 `/api/config` 自动获取: ```properties # 服务端口 server.port=7626 # 文件限制(前端自动读取) app.file.max-size=524288000 # 单文件最大 500MB app.file.max-count=10 # 最多 10 个文件 # 存储路径 app.file.upload-dir=./uploads # ID生成 app.id.length=8 app.id.charset=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ # 过期清理(每2小时) app.cleanup.cron=0 0 */2 * * ? app.cleanup.enabled=true ``` 修改配置后重启后端即可生效,无需重新构建前端。 ## 安全设计 - **密码哈希** — SHA-256 存储密码,不保存明文 - **SQL 注入防护** — JPA 参数化查询 - **XSS 防护** — Vue 自动转义 + DOMPurify 清理 Markdown 输出 - **CORS 限制** — 可配置允许的跨域来源 - **文件隔离** — 上传文件存储在 Web 根目录外 - **自动清理** — 过期内容和物理文件定时删除 ## 文档 - [API 接口文档](api/API_DOCUMENT.md) — 完整的 RESTful API 说明 - [贡献指南](CONTRIBUTING.md) — 开发规范和 PR 流程 ## 许可证 [MIT License](LICENSE)