一个功能完善的 B/S 架构照片管理系统,基于 React + Spring Boot + MySQL 构建,集成阿里云千问AI实现智能标签生成和自然语言搜索。
- 照片管理: 上传、删除、恢复、编辑
- 用户认证: JWT令牌认证,安全可靠
- 智能标签: EXIF自动提取 + AI内容识别
- 高级搜索: 关键词、标签、日期多维度搜索
- AI对话搜索: 自然语言照片检索
- 轮播展示: 全屏轮播浏览照片
- 垃圾桶: 软删除机制,支持恢复
- 响应式设计: 完美适配桌面端和移动端
- AI集成: 阿里云千问视觉模型(qwen-vl-plus)+ 文本模型(qwen-plus)
- EXIF提取: 自动读取相机型号、拍摄参数、GPS位置等元数据
- 多尺寸图片: 自动生成缩略图(300x300)和中等尺寸(1200x1200)
- 实时同步: 前后端数据实时更新
- 容器化部署: Docker Compose一键启动
- React 18.2.0
- Vite 5.0(构建工具)
- React Router 6(路由管理)
- Axios 1.6.0(HTTP客户端)
- Nginx(生产环境)
- Java 17
- Spring Boot 3.2.0
- Spring Security + JWT
- Spring Data JPA
- MySQL 8.0
- Apache Commons Imaging(EXIF提取)
- Thumbnailator(图片处理)
- 阿里云千问API
- Docker & Docker Compose
- 多阶段构建优化镜像大小
- Nginx反向代理
- Docker 20.10+
- Docker Compose V2
- 至少2GB可用内存
git clone https://github.com/yourusername/photorepo.git
cd photorepocp .env.example .env
# 编辑 .env 文件,配置必要的环境变量必须配置的变量:
MYSQL_ROOT_PASSWORD: 数据库root密码JWT_SECRET: JWT密钥(至少32个字符)
可选配置:
ALIYUN_API_KEY: 阿里云API密钥(用于AI功能)
./start.sh或手动启动:
docker-compose up --build -d- 前端: http://localhost:3000
- 后端 API: http://localhost:8080
- MySQL: http://localhost:3306
# 查看所有服务日志
docker-compose logs -f
# 查看特定服务日志
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f mysqldocker-compose down
# 同时删除数据卷(会清空数据库)
docker-compose down -vcd frontend
npm install
npm run dev # 访问 http://localhost:5173cd backend
mvn spring-boot:run # 访问 http://localhost:8080数据库会在首次启动时自动执行 build.sql 初始化脚本。
默认测试账号:
- 管理员: admin / 123456
- 普通用户: testuser / 123456
photorepo/
├── frontend/ # React 前端
│ ├── src/
│ │ ├── App.jsx # 主组件
│ │ └── App.css # 样式
│ ├── Dockerfile # 前端镜像
│ └── nginx.conf # Nginx 配置
├── backend/ # Spring Boot 后端
│ ├── src/main/java/com/photorepo/
│ │ ├── PhotoRepoApplication.java
│ │ ├── PhotoController.java
│ │ └── PhotoService.java
│ └── Dockerfile # 后端镜像
├── build.sql # 数据库建表脚本
├── docker-compose.yaml # 容器编排
├── design_report.typ # 设计文档
└── start.sh # 启动脚本
POST /api/photos/upload
Content-Type: multipart/form-data
{
"file": <binary>
}响应:
{
"success": true,
"photoId": "550e8400-e29b-41d4-a716-446655440000",
"message": "Photo uploaded successfully",
"exifData": {
"cameraMake": "Canon",
"cameraModel": "Canon EOS 5D Mark IV",
"dateTimeOriginal": "2024:12:14 15:30:45",
"imageWidth": 6720,
"imageHeight": 4480,
"iso": "100",
"aperture": "f/2.8",
"shutterSpeed": "1/200s",
"focalLength": "85.0mm",
"lens": "EF 85mm f/1.8 USM",
"latitude": 30.274084,
"longitude": 120.155070
}
}EXIF 数据字段说明:
cameraMake: 相机制造商cameraModel: 相机型号dateTimeOriginal: 拍摄时间imageWidth/imageHeight: 图片尺寸iso: ISO感光度aperture: 光圈值shutterSpeed: 快门速度focalLength: 焦距lens: 镜头型号latitude/longitude: GPS坐标(如有)
详见 build.sql,包含:
- users(用户表)
- photos(照片表)
- photo_metadata(元数据表)
- 用户注册和登录
- JWT 认证中间件
- EXIF 元数据提取
- 照片与数据库集成
- 标签管理
- 搜索和查询
- AI 智能分析(阿里云千问-VL API)
- AI 对话搜索(网站内自然语言搜索)
- 相册管理
- 移动端响应式
- 幻灯片播放
后端已集成阿里云千问-VL API,自动分析上传的照片并生成中文标签。AI 功能通过以下环境变量配置:
ALIYUN_API_KEY: 阿里云 API 密钥(必需)ALIYUN_API_URL: API 地址(默认:https://dashscope.aliyuncs.com/compatible-mode/v1)AI_ENABLED: 启用/禁用 AI 功能(默认:true)
AI 生成的标签会自动添加 AI- 前缀,在前端用蓝色样式显示。
网站内置 AI 对话窗口,用户可以用自然语言搜索照片:
- 点击照片列表页的 "💬 AI 搜索" 按钮打开对话窗口
- 输入自然语言查询,如:
- "找出所有风景照片"
- "显示昨天拍的照片"
- "搜索包含人物的照片"
- AI 理解意图后自动搜索并展示结果
工作原理:
- 用户输入自然语言查询
- 阿里云千问分析意图,提取关键词、标签、日期等搜索参数
- 后端执行搜索,返回匹配的照片
- 对话窗口展示结果,可直接点击照片查看详情
详见 design/CHAT_SEARCH.md。
见 LICENSE
