photo/README.md

141 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 照片管理系统项目文档
## 项目概述
本项目是一个基于 Flask 框架的照片管理系统,主要功能包括:
1. **人脸管理**:增删改查用户的人脸数据。
2. **照片上传与分类**:用户可以上传照片,系统会根据 EXIF 时间信息和数据库中的人脸数据进行分类存储。
3. **照片查询**:用户可以根据姓名和日期查找相应的照片。
## 技术栈
- **后端**FlaskPython
- **数据库**SQLAlchemySQLite / 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=[])
```
### 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)
```
## 前端页面示例
### 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>
```
## 目录结构
```
project_root/
│── app.py # Flask 入口文件
│── functions.py # 处理照片分类等功能
│── models.py # 数据库模型
│── templates/
│ ├── base.html # 公共模板
│ ├── upload.html # 上传页面
│ ├── search.html # 查询页面
│── static/
│ ├── uploads/ # 存储照片
│ ├── styles.css # 样式表
│── .venv/ # 虚拟环境
│── requirements.txt # 依赖文件
```
## 部署方式
1. **安装依赖**
```sh
pip install -r requirements.txt
```
2. **运行 Flask 服务器**
```sh
flask run
```
3. **访问应用**
在浏览器中打开 `http://127.0.0.1:5000`
## 未来优化方向
- **添加身份验证**:使用 Flask-Login 实现用户登录功能。
- **优化分类算法**:提高人脸识别和分类的准确率。
- **支持云存储**:将照片存储到云端,如 AWS S3 或阿里云 OSS。
---
本项目旨在提供一个高效、易用的照片管理系统,欢迎优化和扩展!