feat: AI套图分层方案 + Gemini集成 - 4种图案类型处理 + 正片叠底 + 宽高比 + 模型选择
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
31
Server/app/models/chat.py
Normal file
31
Server/app/models/chat.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""
|
||||
AI 对话模型
|
||||
- ChatSession: 对话会话(按用户隔离)
|
||||
- ChatMessage: 对话消息
|
||||
"""
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Text, ForeignKey, func
|
||||
from app.db import Base
|
||||
|
||||
|
||||
class ChatSession(Base):
|
||||
"""对话会话表 — 每个用户可以有多个对话"""
|
||||
__tablename__ = "chat_sessions"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
||||
username = Column(String(64), nullable=False, index=True)
|
||||
title = Column(String(200), default="新对话") # 对话标题(取首条消息摘要)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
||||
|
||||
|
||||
class ChatMessage(Base):
|
||||
"""对话消息表"""
|
||||
__tablename__ = "chat_messages"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
session_id = Column(Integer, ForeignKey("chat_sessions.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
role = Column(String(20), nullable=False) # user / assistant / system
|
||||
content = Column(Text, nullable=False) # 消息内容
|
||||
tool_calls = Column(Text, nullable=True) # 工具调用 JSON(预留)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
94
Server/app/models/logs.py
Normal file
94
Server/app/models/logs.py
Normal file
@@ -0,0 +1,94 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
PLT处理记录和用户操作日志模型
|
||||
"""
|
||||
|
||||
from sqlalchemy import Column, Integer, String, DateTime, func, ForeignKey, Text, JSON, Float
|
||||
from sqlalchemy.orm import relationship
|
||||
from app.db import Base
|
||||
|
||||
|
||||
class PltProcessRecord(Base):
|
||||
"""PLT处理记录表"""
|
||||
__tablename__ = "plt_process_records"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
||||
|
||||
# 文件信息
|
||||
filename = Column(String(255), nullable=True)
|
||||
file_size = Column(Integer, nullable=True) # 字节
|
||||
rotated_filename = Column(String(255), nullable=True) # 旋转对比文件名
|
||||
|
||||
# 处理参数
|
||||
size_labels = Column(JSON, nullable=True) # ["S", "M", "L", ...]
|
||||
dpi = Column(Integer, default=150)
|
||||
rotation = Column(Integer, default=0)
|
||||
|
||||
# 处理结果
|
||||
total_groups = Column(Integer, default=0) # 裁片组数
|
||||
total_pieces = Column(Integer, default=0) # 裁片总数
|
||||
process_time_ms = Column(Integer, nullable=True) # 处理耗时(毫秒)
|
||||
|
||||
# 状态
|
||||
status = Column(String(20), default='success') # success, error
|
||||
error_message = Column(Text, nullable=True)
|
||||
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
|
||||
# 关联
|
||||
user = relationship("User", backref="plt_records")
|
||||
pieces = relationship("PltPiece", back_populates="record", cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class PltPiece(Base):
|
||||
"""PLT裁片详情表"""
|
||||
__tablename__ = "plt_pieces"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
record_id = Column(Integer, ForeignKey("plt_process_records.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
|
||||
# 裁片信息
|
||||
group_id = Column(Integer, nullable=False) # 组号
|
||||
size = Column(String(20), nullable=False) # 尺码
|
||||
image_url = Column(String(500), nullable=True) # 七牛云 URL
|
||||
|
||||
# 尺寸信息
|
||||
width_px = Column(Integer, default=0)
|
||||
height_px = Column(Integer, default=0)
|
||||
width_cm = Column(Float, default=0)
|
||||
height_cm = Column(Float, default=0)
|
||||
left_cm = Column(Float, default=0)
|
||||
top_cm = Column(Float, default=0)
|
||||
center_x_cm = Column(Float, default=0)
|
||||
center_y_cm = Column(Float, default=0)
|
||||
|
||||
# 关联
|
||||
record = relationship("PltProcessRecord", back_populates="pieces")
|
||||
|
||||
|
||||
class UserActionLog(Base):
|
||||
"""用户操作日志表"""
|
||||
__tablename__ = "user_action_logs"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False, index=True)
|
||||
|
||||
# 会话追踪
|
||||
session_id = Column(String(64), nullable=True, index=True)
|
||||
|
||||
# 操作信息
|
||||
action_type = Column(String(50), nullable=False, index=True) # plt.upload, plt.process, etc.
|
||||
action_params = Column(JSON, nullable=True) # 操作参数
|
||||
page = Column(String(50), nullable=True) # 所在页面
|
||||
|
||||
# 结果
|
||||
result = Column(String(20), default='success') # success, error
|
||||
error_message = Column(Text, nullable=True)
|
||||
|
||||
# 时间
|
||||
duration_ms = Column(Integer, nullable=True) # 操作耗时
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
|
||||
|
||||
# 关联
|
||||
user = relationship("User", backref="action_logs")
|
||||
Reference in New Issue
Block a user