49379fd045
- /api/v1/user: PATCH 改昵称、POST 上传头像、DELETE 注销账号(软删除+匿名化) - /api/v1/feedback: 提交反馈(内容/联系方式/截图入库) - 新增 media 模块(图片落盘+魔数校验)+ /media 静态服务 - feedback 表 + Alembic 迁移(部署需 alembic upgrade head) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""用户反馈表(帮助与反馈)。
|
|
|
|
每条 = 用户一次提交。content 必填,contact 必填(微信/QQ/手机,便于回访),images 为可选的
|
|
截图 URL 列表(/media/feedback/...,JSON 存)。status: new(待处理)/ handled(已处理)。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import JSON, DateTime, ForeignKey, Integer, String, Text, func
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from app.db.base import Base
|
|
|
|
|
|
class Feedback(Base):
|
|
__tablename__ = "feedback"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
user_id: Mapped[int] = mapped_column(
|
|
Integer, ForeignKey("user.id"), index=True, nullable=False
|
|
)
|
|
content: Mapped[str] = mapped_column(Text, nullable=False)
|
|
contact: Mapped[str] = mapped_column(String(128), nullable=False)
|
|
# 截图 URL 列表(相对路径,如 ["/media/feedback/u1_ab12.jpg"]);无图为 None
|
|
images: Mapped[list[str] | None] = mapped_column(JSON, nullable=True)
|
|
# new(待处理) / handled(已处理)
|
|
status: Mapped[str] = mapped_column(String(16), nullable=False, default="new")
|
|
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
DateTime(timezone=True), server_default=func.now(), index=True, nullable=False
|
|
)
|
|
|
|
def __repr__(self) -> str: # pragma: no cover
|
|
return f"<Feedback id={self.id} user_id={self.user_id} status={self.status}>"
|