4512b6ecac
用户反馈后台:区分反馈类型(比价反馈/普通反馈)+ 审核可给用户留言;提现后台:按提现类型筛选。 - feedback 表加 source(profile/comparison)/scene/admin_reply + 迁移;提交接口 /api/v1/feedback 接收 source/scene,来源判定显式 source 优先、否则据 scene 有无派生(有=comparison); /records 带回 scene + admin_reply。 - admin 反馈:列表加「反馈类型」筛选;采纳/拒绝支持存 admin_reply(给用户的回复,用户端可见); FeedbackOut 带出 source/scene/admin_reply。 - admin 提现:WithdrawOut 暴露 source,列表加「提现类型」筛选(coin_cash=福利页提现 / invite_cash=邀请提现)。 - 补 4 项测试:来源派生、回复存取、反馈按类型筛选、提现按类型筛选。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: zzhyyyyy <2685922758@qq.com> Reviewed-on: #105 Co-authored-by: zhuzihao <zhuzihao@wonderable.ai> Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
"""反馈相关响应 schema。请求是 multipart 表单(content/contact/images),在路由里直接校验。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class FeedbackOut(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
status: str
|
|
created_at: datetime
|
|
|
|
|
|
class FeedbackQrConfigOut(BaseModel):
|
|
"""反馈页二维码卡配置(运营后台可配)。App 反馈页据此渲染整张「加群二维码」卡。
|
|
|
|
image_url 是相对 /media 路径(客户端按自己的 BASE_URL 拼绝对地址),为空 → 客户端走本地兜底。
|
|
"""
|
|
|
|
enabled: bool
|
|
image_url: str | None = None
|
|
title: str
|
|
group_name: str
|
|
subtitle: str
|
|
|
|
|
|
class FeedbackRecordOut(BaseModel):
|
|
id: int
|
|
content: str
|
|
# 比价反馈的问题场景(找错商品/优惠不对…);普通反馈为 None
|
|
scene: str | None = None
|
|
images: list[str] = Field(default_factory=list)
|
|
status: str
|
|
reject_reason: str | None = None
|
|
reward_coins: int | None = None
|
|
# 运营给用户的回复留言(用户端可见,采纳/未采纳都可能有)
|
|
admin_reply: str | None = None
|
|
created_at: datetime
|
|
|
|
|
|
class FeedbackRecordCountsOut(BaseModel):
|
|
all: int = 0
|
|
pending: int = 0
|
|
adopted: int = 0
|
|
rejected: int = 0
|
|
|
|
|
|
class FeedbackRecordsOut(BaseModel):
|
|
records: list[FeedbackRecordOut]
|
|
counts: FeedbackRecordCountsOut
|
|
|