2025-02-06 15:26:21 +08:00
|
|
|
|
# 照片管理系统项目文档
|
|
|
|
|
|
|
|
|
|
## 项目概述
|
|
|
|
|
本项目是一个基于 Flask 框架的照片管理系统,主要功能包括:
|
|
|
|
|
1. **人脸管理**:增删改查用户的人脸数据。
|
|
|
|
|
2. **照片上传与分类**:用户可以上传照片,系统会根据 EXIF 时间信息和数据库中的人脸数据进行分类存储。
|
|
|
|
|
3. **照片查询**:用户可以根据姓名和日期查找相应的照片。
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
- **后端**:Flask(Python)
|
|
|
|
|
- **数据库**:SQLAlchemy(SQLite / MySQL)
|
|
|
|
|
- **前端**:HTML + CSS + Jinja2
|
|
|
|
|
- **存储**:文件系统存储上传的照片
|
|
|
|
|
|
|
|
|
|
## 数据库设计
|
|
|
|
|
### 1. `users` 表(用户信息表)
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|--------|------|------|
|
|
|
|
|
| id | 主键 | 自动生成 |
|
|
|
|
|
| username | 字符串 | 用户名,唯一且非空 |
|
|
|
|
|
| encoding | 二进制数据 | 人脸识别编码,用于匹配 |
|
|
|
|
|
| photo | 字符串 | 用户头像照片路径 |
|
|
|
|
|
|
|
|
|
|
### 2. `photos` 表(照片信息表)
|
|
|
|
|
| 字段名 | 类型 | 说明 |
|
|
|
|
|
|--------|------|------|
|
|
|
|
|
| id | 主键 | 自动生成 |
|
|
|
|
|
| user_id | 外键 | 关联到 `users` 表的 `id` |
|
|
|
|
|
| created_at | 时间戳 | 照片拍摄时间(来自 EXIF 信息) |
|
|
|
|
|
| classification | 布尔值 | 照片是否分类(默认 `False`,分类成功后 `True`) |
|
|
|
|
|
| classification_confidence | 浮点数 | 照片分类置信度(默认 `0`) |
|
|
|
|
|
| classification_image_path | 字符串 | 分类后的照片存储路径 |
|
|
|
|
|
|
|
|
|
|
## 主要功能实现
|
|
|
|
|
### 1. 用户管理
|
|
|
|
|
- **添加用户**:用户可上传照片,系统提取人脸编码并存入数据库。
|
|
|
|
|
- **查看用户列表**:显示所有用户及其头像。
|
|
|
|
|
- **删除用户**:从数据库中删除用户信息及相关照片。
|
|
|
|
|
|
|
|
|
|
### 2. 照片上传与分类
|
|
|
|
|
- **上传照片**:用户上传照片,系统解析 EXIF 数据确定拍摄时间。
|
|
|
|
|
- **人脸匹配分类**:系统根据数据库中的人脸编码进行匹配,分类并存储到相应目录。
|
|
|
|
|
- **存储路径规则**:
|
|
|
|
|
```
|
|
|
|
|
static/uploads/users/{用户名}/{日期(年-月-日)}/照片文件名
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 3. 照片查询
|
|
|
|
|
- **基于姓名和日期查询**:用户输入姓名和日期,系统返回符合条件的照片。
|
|
|
|
|
- **展示分类结果**:前端页面显示照片缩略图,并提供原始照片下载链接。
|
|
|
|
|
|
|
|
|
|
## 关键代码
|
|
|
|
|
### 1. 照片上传(`upload` 端点)
|
|
|
|
|
```python
|
|
|
|
|
@app.route('/upload', methods=['GET', 'POST'])
|
|
|
|
|
def upload():
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
photos = request.files.getlist('photos')
|
|
|
|
|
classify_photos(photos) # 进行分类处理
|
|
|
|
|
|
|
|
|
|
# 获取最新照片并关联用户信息
|
|
|
|
|
recent_photos = Photo.query.order_by(Photo.created_at.desc()).limit(len(photos)).all()
|
|
|
|
|
photos_with_users = []
|
|
|
|
|
for photo in recent_photos:
|
|
|
|
|
user = User.query.get(photo.user_id)
|
|
|
|
|
photos_with_users.append({
|
|
|
|
|
"filename": photo.classification_image_path,
|
|
|
|
|
"username": user.username if user else "未知",
|
|
|
|
|
"created_at": photo.created_at
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
return render_template('upload.html', photos=photos_with_users)
|
|
|
|
|
|
|
|
|
|
return render_template('upload.html', photos=[])
|
|
|
|
|
```
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
### 2. 照片查询(`search` 端点)
|
|
|
|
|
```python
|
|
|
|
|
@app.route('/search', methods=['POST'])
|
|
|
|
|
def search():
|
|
|
|
|
name = request.form['name']
|
|
|
|
|
date = request.form['date']
|
|
|
|
|
|
|
|
|
|
user = User.query.filter_by(username=name).first()
|
|
|
|
|
if not user:
|
|
|
|
|
return render_template('search.html', photos=[], message="用户不存在")
|
|
|
|
|
|
|
|
|
|
photos = Photo.query.filter_by(user_id=user.id).filter(Photo.created_at.like(f"{date}%")).all()
|
|
|
|
|
return render_template('search.html', photos=photos)
|
|
|
|
|
```
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
## 前端页面示例
|
|
|
|
|
### 1. 照片查询页面(`search.html`)
|
|
|
|
|
```html
|
|
|
|
|
<form action="{{ url_for('search') }}" method="POST">
|
|
|
|
|
<label for="name">姓名:</label>
|
|
|
|
|
<input type="text" id="name" name="name" placeholder="请输入用户名" required>
|
|
|
|
|
<label for="date">日期:</label>
|
|
|
|
|
<input type="date" id="date" name="date" required>
|
|
|
|
|
<button type="submit">查询照片</button>
|
|
|
|
|
</form>
|
|
|
|
|
```
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
## 目录结构
|
2025-02-05 12:29:13 +08:00
|
|
|
|
```
|
2025-02-06 15:26:21 +08:00
|
|
|
|
project_root/
|
|
|
|
|
│── app.py # Flask 入口文件
|
|
|
|
|
│── functions.py # 处理照片分类等功能
|
|
|
|
|
│── models.py # 数据库模型
|
|
|
|
|
│── templates/
|
|
|
|
|
│ ├── base.html # 公共模板
|
|
|
|
|
│ ├── upload.html # 上传页面
|
|
|
|
|
│ ├── search.html # 查询页面
|
|
|
|
|
│── static/
|
|
|
|
|
│ ├── uploads/ # 存储照片
|
|
|
|
|
│ ├── styles.css # 样式表
|
|
|
|
|
│── .venv/ # 虚拟环境
|
|
|
|
|
│── requirements.txt # 依赖文件
|
2025-02-05 12:29:13 +08:00
|
|
|
|
```
|
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
## 部署方式
|
|
|
|
|
1. **安装依赖**
|
|
|
|
|
```sh
|
2025-02-05 12:29:13 +08:00
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
```
|
2025-02-06 15:26:21 +08:00
|
|
|
|
2. **运行 Flask 服务器**
|
|
|
|
|
```sh
|
|
|
|
|
flask run
|
2025-02-05 12:29:13 +08:00
|
|
|
|
```
|
2025-02-06 15:26:21 +08:00
|
|
|
|
3. **访问应用**
|
|
|
|
|
在浏览器中打开 `http://127.0.0.1:5000`
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
## 未来优化方向
|
|
|
|
|
- **添加身份验证**:使用 Flask-Login 实现用户登录功能。
|
|
|
|
|
- **优化分类算法**:提高人脸识别和分类的准确率。
|
|
|
|
|
- **支持云存储**:将照片存储到云端,如 AWS S3 或阿里云 OSS。
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|
2025-02-06 15:26:21 +08:00
|
|
|
|
---
|
|
|
|
|
本项目旨在提供一个高效、易用的照片管理系统,欢迎优化和扩展!
|
2025-02-05 12:29:13 +08:00
|
|
|
|
|