aidress/README.md
2025-03-21 23:22:54 +08:00

454 lines
10 KiB
Markdown
Raw Permalink 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.

# AI-Dressing API
基于 FastAPI 框架和阿里云 DashScope 接口的 AI 服务 API。
## 功能特点
- 集成阿里云 DashScope 的大模型 API支持通义千问系列模型
- 提供图像生成 API支持 Stable Diffusion XL、万相等模型
- 集成腾讯云 COS 对象存储服务,支持文件上传、下载等功能
- 使用 MySQL 数据库存储服装数据
- RESTful API 风格,支持异步处理
- 易于扩展的模块化设计
## 环境要求
- Python 3.8+
- 阿里云 DashScope API 密钥
- 腾讯云 API 密钥(用于 COS 对象存储)
- MySQL 5.7+ 数据库
## 数据库设置
在使用应用程序之前,您需要创建 MySQL 数据库。登录到 MySQL 并执行以下命令:
```sql
CREATE DATABASE ai_dressing CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'ai_user'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON ai_dressing.* TO 'ai_user'@'%';
FLUSH PRIVILEGES;
```
## 快速开始
### 1. 安装依赖
```bash
pip install -r requirements.txt
```
### 2. 配置环境变量
复制 `.env.example` 文件为 `.env`,并填写您的 API 密钥:
```bash
cp .env.example .env
```
然后编辑 `.env` 文件:
```
# DashScope API密钥
DASHSCOPE_API_KEY=your_api_key_here
# 腾讯云配置
QCLOUD_SECRET_ID=your_secret_id_here
QCLOUD_SECRET_KEY=your_secret_key_here
QCLOUD_COS_REGION=ap-guangzhou
QCLOUD_COS_BUCKET=your-bucket-name
QCLOUD_COS_DOMAIN=https://your-bucket-name.cos.ap-guangzhou.myqcloud.com
# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USER=ai_user
DB_PASSWORD=your_password
DB_NAME=ai_dressing
```
### 3. 数据库迁移
首次运行或模型变更后,需要创建或更新数据库表:
```bash
# 创建迁移(仅在模型变更时需要)
python create_migration.py create -m "初始化数据库"
# 应用迁移
python create_migration.py upgrade
```
### 4. 启动服务
```bash
python run.py
```
服务将在 http://localhost:9001 启动,您可以访问 http://localhost:9001/docs 查看 API 文档。
## Docker 部署
本项目支持使用 Docker 进行部署,提供了完整的 Docker 配置文件。
### 前提条件
- 安装 [Docker](https://docs.docker.com/get-docker/)
- 安装 [Docker Compose](https://docs.docker.com/compose/install/)
### 使用 Docker 部署
1. **配置环境变量**
复制 `.env.docker` 文件为 `.env`,并填写您的 API 密钥:
```bash
cp .env.docker .env
```
编辑 `.env` 文件,填入您的 API 密钥和其他配置。
2. **构建并启动服务**
```bash
docker-compose up -d
```
这将启动两个容器:
- `ai-dressing-app`:运行 FastAPI 应用程序
- `ai-dressing-db`:运行 MySQL 数据库
3. **初始化数据库**
应用启动后,执行迁移以创建数据库表:
```bash
docker-compose exec app python3 create_migration.py upgrade
```
4. **访问服务**
服务将在 `http://localhost:9001` 启动,您可以访问 `http://localhost:9001/docs` 查看 API 文档。
### Docker 环境管理
- **查看日志**
```bash
docker-compose logs -f app # 查看应用日志
docker-compose logs -f db # 查看数据库日志
```
- **重启服务**
```bash
docker-compose restart app
```
- **停止服务**
```bash
docker-compose down # 停止所有服务
```
- **停止并删除数据卷**
```bash
docker-compose down -v # 谨慎使用,这将删除数据库中的所有数据
```
## Docker构建和环境变量配置指南
## 使用.env文件构建Docker镜像
本项目提供了多种方式将`.env`文件中的环境变量传递到Docker容器中。
### 方法一使用build.sh脚本推荐
这种方法会自动读取`.env`文件中的所有环境变量并传递给Docker构建过程
```bash
# 赋予执行权限
chmod +x build.sh
# 执行构建脚本
./build.sh
```
构建完成后,可以直接运行容器:
```bash
docker run -p 9001:8000 ai-dressing:latest
```
### 方法二使用Docker Compose
使用专门的docker-compose文件进行构建该文件会读取.env中的环境变量
```bash
# 先加载.env文件到当前shell
export $(grep -v '^#' .env | xargs)
# 使用专用的构建配置文件
docker-compose -f docker-compose.build.yml build
# 启动服务
docker-compose -f docker-compose.build.yml up -d
```
### 方法三:手动构建
如果你希望手动指定部分环境变量,可以使用以下命令:
```bash
docker build \
--build-arg DASHSCOPE_API_KEY=your_key \
--build-arg DB_HOST=your_db_host \
--build-arg DB_USER=your_db_user \
--build-arg DB_PASSWORD=your_db_password \
-t ai-dressing:latest .
```
## 验证环境变量
构建完成后,你可以通过以下命令验证环境变量是否正确加载:
```bash
# 查看容器日志
docker logs ai-dressing-app
# 或者进入容器查看环境变量
docker exec -it ai-dressing-app bash -c "env | sort"
```
## 环境变量优先级
环境变量的加载优先级从高到低如下:
1. docker run或docker-compose启动时通过`-e`或`environment`指定的环境变量
2. 通过卷挂载到容器中的`.env`文件
3. 构建时通过`--build-arg`传入并保存到容器内`.env.built`文件的变量
4. 代码中的默认值
## 注意事项
- 生产环境中应避免将敏感信息硬编码在Dockerfile中
- 敏感信息应通过环境变量或Docker secrets进行管理
- 建议将`.env`文件添加到`.gitignore`中,避免意外提交
## API接口文档
服务启动后可通过以下地址访问API文档
- Swagger UI: http://localhost:9001/docs
- ReDoc: http://localhost:9001/redoc
## API响应格式
系统支持两种API响应格式可以通过环境变量进行配置
### 标准响应格式 (USE_STANDARD_RESPONSE=1)
所有API接口都会返回统一的标准格式
```json
{
"code": 200,
"message": "操作成功",
"data": { ... }
}
```
错误响应示例:
```json
{
"code": 400,
"message": "请求参数错误",
"data": null
}
```
### 简洁响应格式 (USE_STANDARD_RESPONSE=0)
API接口直接返回数据不包含额外的包装
```json
{ ... } // 直接返回业务数据
```
错误响应仍然保持标准格式,以确保错误信息清晰:
```json
{
"code": 400,
"message": "请求参数错误",
"data": null
}
```
> 注意:健康检查端点 `/health` 和 `/` 始终返回简洁格式,不受环境变量影响。
## 主要 API 端点
### 大模型对话
```
POST /api/dashscope/chat
```
### 图像生成
```
POST /api/dashscope/generate-image
```
### 获取支持的模型列表
```
GET /api/dashscope/models
```
### 文件上传到腾讯云 COS
```
POST /api/qcloud/upload
```
### 从腾讯云 COS 获取文件列表
```
GET /api/qcloud/files
```
### 生成 COS 临时上传凭证
```
POST /api/qcloud/sts-token
```
### 服装管理 API
```
# 创建服装
POST /api/dresses/
# 获取服装列表
GET /api/dresses/
# 获取单个服装
GET /api/dresses/{dress_id}
# 更新服装
PUT /api/dresses/{dress_id}
# 删除服装
DELETE /api/dresses/{dress_id}
```
## 项目结构
```
.
├── alembic/ # 数据库迁移相关文件
│ ├── versions/ # 迁移版本文件
│ ├── env.py # 迁移环境配置
│ └── script.py.mako # 迁移脚本模板
├── app/ # 应用主目录
│ ├── __init__.py
│ ├── main.py # FastAPI 应用程序
│ ├── database/ # 数据库相关
│ │ └── __init__.py
│ ├── models/ # 数据库模型
│ │ ├── __init__.py
│ │ └── dress.py
│ ├── routers/ # API 路由
│ │ ├── __init__.py
│ │ ├── dashscope_router.py
│ │ ├── qcloud_router.py
│ │ └── dress_router.py
│ ├── schemas/ # Pydantic 模型
│ │ ├── __init__.py
│ │ └── dress.py
│ ├── services/ # 业务逻辑服务
│ │ ├── __init__.py
│ │ ├── dashscope_service.py
│ │ └── qcloud_service.py
│ └── utils/ # 工具类
│ ├── __init__.py
│ └── config.py
├── .env.example # 环境变量示例
├── alembic.ini # Alembic 配置
├── create_migration.py # 数据库迁移工具
├── requirements.txt # 项目依赖
├── README.md # 项目文档
└── run.py # 应用入口
```
## 开发指南
### 添加新的路由
1.`app/routers/` 目录下创建新的路由文件
2.`app/main.py` 中注册新的路由
### 添加新的数据库模型
1.`app/models/` 目录下创建新的模型文件
2.`app/schemas/` 目录下创建对应的 Pydantic 模型
3. 创建数据库迁移: `python create_migration.py create -m "添加新模型"`
4. 应用迁移: `python create_migration.py upgrade`
### 添加新的服务
`app/services/` 目录下创建新的服务类。
## 腾讯云 COS 使用指南
### 前端直传文件
1. 首先从服务端获取临时上传凭证:
```javascript
const response = await fetch('/api/qcloud/sts-token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'allow_prefix=uploads/&duration_seconds=1800'
});
const stsData = await response.json();
```
2. 使用临时凭证进行文件上传:
```javascript
// 使用腾讯云COS SDK上传
const cos = new COS({
getAuthorization: function(options, callback) {
callback({
TmpSecretId: stsData.credentials.tmpSecretId,
TmpSecretKey: stsData.credentials.tmpSecretKey,
SecurityToken: stsData.credentials.sessionToken,
ExpiredTime: stsData.expiration
});
}
});
cos.putObject({
Bucket: stsData.bucket,
Region: stsData.region,
Key: 'uploads/example.jpg',
Body: file,
onProgress: function(progressData) {
console.log(progressData);
}
}, function(err, data) {
if (err) {
console.error('上传失败', err);
} else {
console.log('上传成功', data);
}
});
```
## 许可证
MIT