93cb283c1b
- get_feed 真实条不再按 user 去重:改「洗牌 + 去连簇」(相邻尽量不同用户、减少单人连刷), 同一用户可多条露出但被打散、尽量不连续。_shuffle_declustered 支持传入固定种子 rng。 - 新增 GET /admin/api/marquee-seeds/real-records:按**当前模式**分页浏览全部可展示记录(不去重), 供运营逐页审核——只真实=真实记录;只种子=各启用种子按生成逻辑各出一行;混播=真实+种子。 固定种子洗牌+去连簇 → 排列恒定、翻页稳定、能翻遍全部;含 OpsRealRecord* schema。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: zzhyyyyy <2685922758@qq.com> Reviewed-on: #123 Co-authored-by: zhuzihao <zhuzihao@wonderable.ai> Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
"""admin 首页轮播种子 schemas。金额单位:分(前端展示 ÷100 取元)。
|
|
|
|
种子 = 生成规则:masked_user 可空(空→feed 随机合成名)、金额是 [min_cents, max_cents] 区间。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class OpsMarqueeSeedOut(BaseModel):
|
|
id: int
|
|
masked_user: str | None = None
|
|
min_cents: int
|
|
max_cents: int
|
|
enabled: bool
|
|
sort_order: int
|
|
created_at: str | None = None
|
|
|
|
|
|
class OpsMarqueeSeedCreate(BaseModel):
|
|
masked_user: str | None = None # 空 / 不传 → feed 随机合成脱敏名
|
|
min_cents: int
|
|
max_cents: int
|
|
enabled: bool = True
|
|
sort_order: int = 0
|
|
|
|
|
|
class OpsMarqueeSeedUpdate(BaseModel):
|
|
# masked_user:不传=不改;传空串=清空(改回随机合成);传值=固定该名
|
|
masked_user: str | None = None
|
|
min_cents: int | None = None
|
|
max_cents: int | None = None
|
|
enabled: bool | None = None
|
|
sort_order: int | None = None
|
|
|
|
|
|
class OpsMarqueeSeedBulkCreate(BaseModel):
|
|
"""批量生成 count 条自动合成名种子(冷启动铺量)。"""
|
|
count: int
|
|
min_cents: int
|
|
max_cents: int
|
|
enabled: bool = True
|
|
|
|
|
|
class OpsMarqueeSeedBatchDelete(BaseModel):
|
|
"""批量删除选中的种子。"""
|
|
ids: list[int] = Field(..., max_length=500) # 上限防超大列表(审计行/IN 子句过大)
|
|
|
|
|
|
class OpsMarqueeSeedBatchEnable(BaseModel):
|
|
"""批量启用 / 停用选中的种子。"""
|
|
ids: list[int] = Field(..., max_length=500)
|
|
enabled: bool
|
|
|
|
|
|
class OpsSavingsFeedPreviewItem(BaseModel):
|
|
masked_user: str
|
|
saved_amount_cents: int
|
|
time: str
|
|
|
|
|
|
class OpsSavingsFeedPreviewOut(BaseModel):
|
|
"""运营预览:实际混播出来的 feed(真实记录会插队,与客户端一致)。"""
|
|
items: list[OpsSavingsFeedPreviewItem]
|
|
|
|
|
|
class OpsRealRecordItem(BaseModel):
|
|
masked_user: str # 脱敏后展示名(与 app 一致)
|
|
saved_amount_cents: int # 节省金额(分)
|
|
created_at: str # 比价记录时间(YYYY-MM-DD HH:MM)
|
|
user_id: int # 真实 user_id(供运营核对,不下发客户端)
|
|
|
|
|
|
class OpsRealRecordsOut(BaseModel):
|
|
"""分页浏览「全部可展示的真实记录」(success+省>0,不去重、稳定顺序)。"""
|
|
items: list[OpsRealRecordItem]
|
|
total: int # 满足条件的真实记录总数(算页数用)
|