"""首页平台级展示数据 schemas(客户端首页门面数字)。""" from __future__ import annotations from pydantic import BaseModel, Field class PlatformStatsOut(BaseModel): """首页三统计。total_saved 为分,客户端 ÷100 显示「元」。""" help_users: int # 帮助用户(人) total_compares: int # 完成比价(次) total_saved_cents: int # 累计节省(分) class SavingsFeedItem(BaseModel): """首页轮播一条。time 为北京时间 HH:MM:SS。""" masked_user: str # 脱敏用户名,手机尾号(138****5678)或中文昵称(省钱**)混合风格 saved_amount_cents: int # 节省(分),客户端 ÷100 显示「x.xx 元」 time: str class SavingsFeedOut(BaseModel): items: list[SavingsFeedItem] class AppFlagsOut(BaseModel): """客户端拉取的运营 feature flag(不鉴权,登录前也能拉)。客户端缓存后按需读。""" comparing_ad_enabled: bool # 比价/领券期是否展示信息流广告(远程 kill-switch) class AdConfigPublicOut(BaseModel): """下发给客户端的穿山甲广告配置(不鉴权,客户端缓存后用)。 ⚠️ 不含 reward_mkey(GroMore 验签密钥,机密,只后端验签用,绝不下发)。 """ app_id: str # 穿山甲应用ID(改了客户端需冷启才生效,SDK init 一次性读) reward_code_id: str # 福利页激励视频位 compare_draw_code_id: str # 比价 Draw 代码位 coupon_draw_code_id: str # 领券 Draw 代码位(比价/领券共用同一位,靠 feed_scene 区分收益) reward_enabled: bool # 福利激励视频开关 compare_ad_enabled: bool # 比价广告开关 coupon_ad_enabled: bool # 领券广告开关 withdrawal_ad_enabled: bool # 提现激励视频开关(关=客户端直接放行提现) class AppVersionOut(BaseModel): """最新 App 版本信息(OTA 检查更新,不鉴权)。 客户端用 latest_version_code(整数,单调递增)与本机 versionCode 比较,**不要**用 version_name 字符串比。 latest_version_code=0 表示后台尚未配置任何版本 → 客户端一律视为"已是最新"。 """ latest_version_code: int = 0 # 最新版 versionCode;0=未配置(无更新) latest_version_name: str = "" # 展示用,如 "0.1.4" apk_url: str = "" # 下载链接(发车产出的永久版本化链接) update_note: str = "" # 更新说明,弹窗展示 min_supported_version_code: int = 0 # 本机低于此版本=强制更新;0=不强更(全可选) apk_size_bytes: int = 0 # 包大小(字节),展示"约 xMB" apk_sha256: str = "" # APK 完整性校验(客户端下载后比对,防损坏/劫持) class AppVersionWriteIn(BaseModel): """内部写入最新版本(发布流程/应急,X-Internal-Secret 校验)。整组原子覆盖。""" latest_version_code: int = Field(gt=0) latest_version_name: str = Field(min_length=1) apk_url: str = Field(min_length=1) update_note: str = "" min_supported_version_code: int = 0 apk_size_bytes: int = 0 apk_sha256: str = ""