bce8cd9923
一、RBAC 权限管理(角色 → 可见页面) - 新增 admin_role 表 + 权限目录 permissions.py:角色持有一组页面 key,登录后左侧只展示这些页 - 内建角色 管理员(super_admin 全权锁定)/运营/财务/技术,页集对齐原型;key 承重(require_role 用),另加中文 label 展示 - 角色 CRUD 端点(仅 super_admin)+ 目录端点;登录/me 下发当前角色有效可见页 - admins 加删除、角色存在性校验;可复看已确定登录密码:UI 建的账号留存明文 plain_password,脚本建的超管不留存 二、系统配置下发修复 - 首页数据「保存即生效」:显式保存(apply_now)对 real/manual 直接落配置目标值、绕过只增不减护栏(修「改了 app 端不变」),护栏仍管自动 tick - 首页轮播新增数据源三选一:mixed(真实优先+种子)/real(只真实)/seed(只种子),get_feed 分支 + /marquee-seeds/mode 端点 - 福利页 Tab 隐藏 任务/里程碑,及看广告的单次金币/每轮次数/信息流开关:CONFIG_DEFS 加 hidden + list_config 过滤,业务读取默认值不受影响 三、比价记录店/商品搜索 - comparison_record 加 product_names 派生列(从下单 items 拼商品名),迁移建列并回填历史行 - admin 比价记录列表店/商品分列可搜:走 product_names 普通列 LIKE,规避 SQLite JSON 中文 ensure_ascii 转义搜不到的坑 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
74 lines
3.0 KiB
Python
74 lines
3.0 KiB
Python
"""admin 比价记录 debug 页 schema(独立于 C 端 app/schemas/compare_record:admin 看任意用户、
|
|
无 debug_trace 权限闸、展示全量 debug 字段)。phone/nickname 由 queries 瞬态挂在 ORM 实例上。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class AdminComparisonListItem(BaseModel):
|
|
"""列表项:概要 + debug 维度概览(不含大字段 raw_payload/llm_calls/明细数组)。"""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: int
|
|
user_id: int
|
|
phone: str | None = None # join User 瞬态(非 DB 列)
|
|
nickname: str | None = None # join User 瞬态
|
|
business_type: str
|
|
trace_id: str
|
|
# admin 是 debug 工具,无条件下发 trace_url(不看 user.debug_trace_enabled)
|
|
trace_url: str | None = None
|
|
status: str
|
|
information: str | None = None
|
|
store_name: str | None = None
|
|
product_names: str | None = None # 下单商品名派生串(顿号分隔;「商品」列展示 + 商品搜索)
|
|
source_platform_name: str | None = None
|
|
best_platform_name: str | None = None
|
|
source_price_cents: int | None = None
|
|
best_price_cents: int | None = None
|
|
saved_amount_cents: int | None = None
|
|
# debug 概览
|
|
total_ms: int | None = None
|
|
step_count: int | None = None
|
|
llm_call_count: int | None = None
|
|
retry_count: int | None = None
|
|
input_tokens: int | None = None # Σ usage.prompt_tokens(server 派生)
|
|
output_tokens: int | None = None # Σ usage.completion_tokens(server 派生)
|
|
device_model: str | None = None
|
|
rom_vendor: str | None = None
|
|
rom_name: str | None = None
|
|
android_version: str | None = None
|
|
app_version: str | None = None
|
|
created_at: datetime
|
|
|
|
|
|
class AdminComparisonDetail(AdminComparisonListItem):
|
|
"""详情:概要 + 全量明细(逐平台对比 / LLM 每次调用 / 原始 payload)。"""
|
|
|
|
source_platform_id: str | None = None
|
|
source_package: str | None = None
|
|
best_platform_id: str | None = None
|
|
best_deeplink: str | None = None
|
|
is_source_best: bool | None = None
|
|
total_dish_count: int | None = None
|
|
skipped_dish_count: int | None = None
|
|
device_id: str | None = None
|
|
items: list = []
|
|
comparison_results: list = [] # 逐平台对比(价格/rank/coupon/打烊...)
|
|
skipped_dish_names: list = []
|
|
# 全量环境
|
|
device_manufacturer: str | None = None
|
|
rom_version: int | None = None
|
|
android_sdk: int | None = None
|
|
app_version_code: int | None = None
|
|
source_app_version: str | None = None
|
|
longitude: float | None = None
|
|
latitude: float | None = None
|
|
# 每次 LLM 调用明细 [{scene,model,input_messages,output,usage,latency_ms,error}]
|
|
llm_calls: list | None = None
|
|
# 原始上报全量;「卡在哪一步」从 raw_payload.platform_results[*].status 读
|
|
# (store_not_found/items_not_found/below_minimum/unsupported = 卡在 找店/加菜/起送/读价)。
|
|
raw_payload: dict | None = None
|