邮轮穿舱件管理系统 - 图像管理功能文档
概述
本文档详细分析了邮轮穿舱件管理系统后台的图像上传、存储、映射和处理功能。系统采用基于CVCore(计算机视觉核心)的架构,实现了完整的图像生命周期管理,包括图像上传、存储、与工件的绑定关系管理以及计算机视觉功能集成。
系统架构
核心组件关系图
flowchart TD
subgraph 前端层
A[Web界面]
B[移动端应用]
end
subgraph API路由层
C[Image Router]
D[WeChat图像接口]
end
subgraph 业务服务层
E[Image Service]
F[Image Mapping Service]
end
subgraph 数据模型层
G[Image Model]
H[Image Mapping Model]
I[Workpiece Model]
end
subgraph 外部服务集成
J[CVCore服务]
K[OSS存储]
end
A --> C
B --> D
C --> E
D --> E
E --> G
E --> H
E --> J
H --> I
J --> K
数据模型设计
图像实体模型 (Image Model)
图像实体模型负责存储图像的基本信息和在CVCore中的存储位置。
类定义:
class Image(Model):
id = fields.IntField(description="图片ID", null=False, pk=True)
key = fields.CharField(description="图片OSS Key", null=False, max_length=255)
created_by = fields.IntField(description="创建人", null=True, default=-1)
updated_by = fields.IntField(description="更新人", null=True, default=-1)
created_at = fields.DatetimeField(description="创建时间", null=False, auto_now_add=True)
updated_at = fields.DatetimeField(description="更新时间", null=False, auto_now=True)
字段说明:
id: 主键,唯一标识图像实体key: 在CVCore OSS中的存储键值,用于定位图像文件created_by/updated_by: 操作人追踪created_at/updated_at: 时间戳记录
参考源文件:
图像映射模型 (Image Mapping Model)
图像映射模型管理图像与工件之间的多对多关系。
类定义:
class ImageMapping(Model):
workpiece_id = fields.IntField(description="工件ID AKA Product ID", null=False)
image_id = fields.IntField(description="图片ID AKA Image ID", null=False)
created_by = fields.IntField(description="创建人", null=True, default=-1)
updated_by = fields.IntField(description="更新人", null=True, default=-1)
created_at = fields.DatetimeField(description="创建时间", null=False, auto_now_add=True)
updated_at = fields.DatetimeField(description="更新时间", null=False, auto_now=True)
参考源文件:
实体关系图
erDiagram
IMAGE ||--o{ IMAGE_MAPPING : "has"
IMAGE {
int id PK
string key
int created_by
int updated_by
datetime created_at
datetime updated_at
}
IMAGE_MAPPING {
int workpiece_id FK
int image_id FK
int created_by
int updated_by
datetime created_at
datetime updated_at
}
WORKPIECE ||--o{ IMAGE_MAPPING : "has"
WORKPIECE {
int workpiece_id PK
string name
string description
}
计算机视觉核心功能 (CVCore)
CVCore集成架构
系统通过cvcore.py模块与外部CVCore服务进行集成,实现图像处理和分析功能。
核心功能类图:
classDiagram
class ImageInSchema {
+pic_name: str
+product_id: str
+oss_name: str
}
class CVCoreClient {
+list_cvcore_image(target: str) Dict
+upload_image_to_cvcore(image: bytes) Dict
+get_image_from_cvcore(key: str) bytes
+sdk_add_image(image: ImageInSchema) Dict
+sdk_delete_image(product_id: str, pic_name: str) Dict
+sdk_search_image(key: str) Dict
}
ImageInSchema --> CVCoreClient : 参数
图像上传流程
序列图:
sequenceDiagram
participant User as 用户
participant Router as Image Router
participant Service as Image Service
participant CVCore as CVCore服务
participant DB as 数据库
User->>Router: POST /image/create (上传文件)
Router->>Service: service_upload_new_image()
Service->>CVCore: upload_image_to_cvcore()
CVCore-->>Service: 返回file_key
Service->>DB: Image.create(key=file_key)
DB-->>Service: 返回image_id
Service-->>Router: 返回image_id
Router-->>User: 上传成功响应
上传功能实现:
async def upload_image_to_cvcore(image: bytes) -> Dict:
"""上传图像到CVCore"""
url = f"{settings.cvc_target_url}/commonUpload/uploadImage"
filename = "upload.jpg"
mime = "image/jpeg"
files = {"file": (filename, image, mime)}
response = await async_requests.post(url, headers=headers, files=files)
return response.json()
参考源文件:
图像搜索功能
系统支持基于图像内容的搜索功能,通过CVCore的AI能力实现相似图像检索。
搜索流程:
async def sdk_search_image(key: str):
"""从图像识别系统中搜索图片"""
url = f"{settings.cvc_target_url}/image/search"
data = {
"pic_name": "",
"product_id": "",
"oss_name": key # 输入的是图片的oss-name
}
response = await async_requests.post(url, headers=headers, json=data)
return response.json()
参考源文件:
图像绑定管理
绑定关系状态机
stateDiagram-v2
[*] --> 未绑定
未绑定 --> 已绑定 : 绑定操作
已绑定 --> 未绑定 : 解绑操作
已绑定 --> 已绑定 : 重新绑定(错误)
未绑定 --> 未绑定 : 重复上传(错误)
绑定操作实现
绑定流程:
async def service_bind_image_to_workpiece(image_id: int, workpiece_id: int) -> dict:
# 1. 验证图像存在性
image_orm = await Image.filter(id=image_id).first()
if not image_orm:
raise HTTPException(status_code=404, detail="图片不存在")
# 2. 检查是否已绑定
existing_mapping = await ImageMapping.filter(image_id=image_id).first()
if existing_mapping:
raise HTTPException(status_code=400, detail="图片已绑定到其他工件")
# 3. 调用CVCore SDK添加图像
image_in_schema = ImageInSchema(
product_id=gen_product_id(workpiece_id),
pic_name=gen_pic_name(workpiece_id, image_orm.key),
oss_name=image_orm.key,
)
resp = await sdk_add_image(image_in_schema)
# 4. 创建映射关系
image_mapping_tuple = await ImageMapping.create(
image_id=image_id,
workpiece_id=workpiece_id
)
return {"message": "图片绑定到工件成功", "tuple_id": image_mapping_tuple.id}
参考源文件:
命名规则生成
系统使用统一的命名规则生成图像标识:
def gen_product_id(workpiece_id: int) -> str:
return str(workpiece_id)
def gen_pic_name(workpiece_id: int, image_oss_key: str) -> str:
return str(workpiece_id) + "_" + image_oss_key.replace("/", "_")
参考源文件:
API接口设计
图像管理接口
| 接口路径 | 方法 | 功能描述 | 参数 | 返回值 |
|---|---|---|---|---|
/image/create | POST | 创建新图片实体 | UploadFile | image_id |
/image/delete | DELETE | 删除图片实体 | image_id | 成功消息 |
/image/keyById | GET | 获取图片OSS键 | id | 图片实体 |
/image/enable/bind | POST | 绑定图片到工件 | ImageWorkpieceTuple | 绑定结果 |
/image/disable/bind | POST | 解绑图片到工件 | ImageWorkpieceTuple | 解绑结果 |
/image/status/list/unbinds | GET | 获取未绑定图片 | 无 | 图片ID列表 |
/image/status/list/binds | GET | 获取所有绑定元组 | 无 | 映射列表 |
/image/status/list/imageEntity | GET | 获取所有图片实体 | 无 | 图片列表 |
/image/searchByKey | GET | 根据key搜索图片 | key | 搜索结果 |
/image/searchById | GET | 根据ID搜索图片 | image_id | 搜索结果 |
参考源文件:
请求/响应模型
图像工件绑定元组:
class ImageWorkpieceTuple(BaseModel):
image_id: int
workpiece_id: int
图像输入模式:
class ImageInSchema(BaseModel):
pic_name: str = Field(default="", description="图像名称")
product_id: str = Field(default="", description="产品ID")
oss_name: str = Field(default="", description="OSS名称")
配置管理
CVCore服务配置
系统通过环境配置管理CVCore服务连接:
# CVCore HTTP API配置
cvc_target_url: str = Field(default="http://localhost:8000", description="目标的URL")
cvc_api_key: str = Field(default="abc", description="CVC API Key")
参考源文件:
错误处理机制
异常处理策略
系统实现了完整的错误处理机制:
- 图像不存在错误:返回404状态码
- 重复绑定错误:返回400状态码
- CVCore服务错误:返回500状态码
- 文件上传错误:返回500状态码
错误处理示例
try:
image_orm = await service_upload_new_image(image)
return image_orm
except Exception as e:
logger.error(f"创建新图片失败: {e}")
raise HTTPException(status_code=500, detail="创建新图片失败")
性能优化考虑
图像处理优化
- 异步处理:所有图像操作均采用异步模式
- 批量操作:支持批量获取图像信息
- 缓存策略:可扩展的图像缓存机制
- 连接池:HTTP请求连接池优化
内存管理
- 流式处理:大文件上传采用流式处理
- 及时释放:图像字节数据及时释放
- 分页查询:大量数据采用分页查询
安全考虑
访问控制
- JWT认证:所有图像接口需要JWT令牌验证
- 权限检查:操作权限验证
- 输入验证:严格的参数验证
- 日志记录:完整的操作审计日志
索引
邮轮穿舱件管理系统的图像管理功能提供了完整的图像生命周期管理解决方案,包括:
- 完整的图像处理流程:从上传、存储到检索的全流程管理
- 智能图像识别:集成CVCore的AI能力实现图像搜索
- 灵活的绑定机制:支持图像与工件的动态绑定关系
- 企业级可靠性:完善的错误处理和性能优化
- 标准化接口:RESTful API设计,易于集成和扩展
该系统为邮轮制造业提供了强大的图像管理能力,支持生产过程中的质量控制和追溯需求。
主要参考文件: