refactor(account): 一键查询不该重复展示账号字段 —— 改成刷新它们,只留账号表里没有的
用户反馈:「一键查询也太重复了,直接更新账号信息不行吗?为啥很多都要再展示一次?
那建立账号信息表有啥用」——**说得对,是我设计错了**。
## 问题
面板把鱼翅 / 积分 / 钱包余额 / 精英宝典 / 电竞手册又原样列了一遍,
而这些账号表(`accounts`)本来就有对应列,账号详情也在显示同一批值 ——
同一屏出现两份,既冗余又让人分不清哪份是准的。
## 改法:查询 = 刷新,不是另开副本
| 内容 | 处理 |
| --- | --- |
| 鱼翅 / 积分 / 交易余额 / 开通状态 | 写回**账号表**(`_refresh_*` 本来就在写),由账号详情已有界面展示 —— **面板不再重复** |
| **积分到期时间** | 有 `accounts.points_expire_at` 列,但**查询漏了没写、界面也没显示** → 现在写回,并加到账号信息区展示 |
| **高价值套装是否已获得** | 账号表没有 → **只有这个该单独展示** |
| **官方兑换记录** | 账号表没有 → 单独展示 |
面板因此瘦身成只含「🎯 高价值套装」+「兑换记录」(+ 错误提示 + 查询时间),
标题也改成「高价值套装与兑换记录(一键查询)」,不再叫"账号信息"。
## 修了一个连带 bug
积分到期时间一直没被查询写回账号(只在快照里躺着),界面也没展示 ——
现在 `_parse_expire_at` 后写入 `accounts.points_expire_at`,
且斗鱼返回 `0` 时写 `None` 而不是 `0`(否则又显示 1970/1/1)。
## 测试(+3,共 41)
`TestOverviewRefreshesAccountFields`:资产/开通状态确实写回账号列、
**积分到期时间写回**、`willExpireTime="0"` 时清成 None 而非 0。
## 验证
`TZ=Asia/Shanghai` **593 passed / 6 skipped**;ruff 全绿;前端 build 通过、lint 0 errors。
This commit is contained in:
@@ -575,3 +575,109 @@ class TestSnapshotExposedOnDetailOnly:
|
||||
assert "overview_snapshot" not in item, (
|
||||
"列表接口不该返回完整快照(每个账号一份 JSON,体积爆炸)"
|
||||
)
|
||||
|
||||
|
||||
class TestOverviewRefreshesAccountFields:
|
||||
"""查询的职责是**刷新账号字段**,不是另开一份副本。
|
||||
|
||||
用户反馈很直接:「一键查询这也太重复了,直接更新账号信息不行吗?
|
||||
那建立账号信息表有啥用」。
|
||||
|
||||
对 —— 鱼翅 / 积分 / 交易余额 / 开通状态账号表本来就有对应列,
|
||||
查询把新值写进去、由已有界面展示即可。这里钉住写回行为,
|
||||
尤其是**积分到期时间**:它有 `accounts.points_expire_at` 列,
|
||||
但之前忘了写(也没在界面上显示)。
|
||||
"""
|
||||
|
||||
def setup_method(self):
|
||||
self.engine = get_test_engine()
|
||||
self.session = make_test_session(self.engine)
|
||||
self.user = User(username="rf-admin", password_hash="h", role="super_admin")
|
||||
self.session.add(self.user)
|
||||
self.session.flush()
|
||||
self.account = Account(
|
||||
username="rf-acc", password="p", email="r@e.com", email_password="ep"
|
||||
)
|
||||
self.session.add(self.account)
|
||||
self.session.commit()
|
||||
|
||||
def teardown_method(self):
|
||||
self.session.close()
|
||||
|
||||
def _run(self, *, expire_at: str = "1795967999"):
|
||||
from web.backend.services.douyu_runner_overview import OverviewMixin
|
||||
|
||||
class _H(OverviewMixin):
|
||||
def _client(self, cookie):
|
||||
return _FakeClient()
|
||||
|
||||
def _mark_task(self, *a, **k):
|
||||
pass
|
||||
|
||||
def _push_log(self, *a, **k):
|
||||
pass
|
||||
|
||||
def _refresh_account_gold_balance(self, c, a):
|
||||
a.gold_balance = 88
|
||||
a.exchange_balance = 9
|
||||
return {"gold_balance": 88, "exchange_balance": 9}
|
||||
|
||||
def _refresh_account_points(self, c, a, cookie, *, ctn=None):
|
||||
a.points = 777
|
||||
return {
|
||||
"points": 777,
|
||||
"points_query": {"raw": {"data": {"willExpireTime": expire_at}}},
|
||||
}
|
||||
|
||||
def _refresh_elite_handbook(self, c, a, *, manual_id, rid=""):
|
||||
a.elite_opened = True
|
||||
return {
|
||||
"elite_opened": True,
|
||||
"elite_expire_time": 0,
|
||||
"elite_manual_score": 5,
|
||||
}
|
||||
|
||||
def _refresh_esports_handbook(self, c, a, *, manual_id):
|
||||
a.esports_opened = True
|
||||
return {"esports_manual_type": 1, "esports_manual_score": 3}
|
||||
|
||||
task = DouyuTask(
|
||||
batch_id="rf",
|
||||
account_id=self.account.id,
|
||||
task_type="query_account_overview",
|
||||
handbook_scope="elite",
|
||||
status="running",
|
||||
message="",
|
||||
created_by=self.user.id,
|
||||
)
|
||||
self.session.add(task)
|
||||
self.session.commit()
|
||||
_H()._execute_query_account_overview(
|
||||
self.session,
|
||||
task,
|
||||
self.account,
|
||||
"c",
|
||||
{"manual_id": "M", "esports_manual_id": "E", "rid": "R"},
|
||||
)
|
||||
self.session.commit()
|
||||
self.session.refresh(self.account)
|
||||
|
||||
def test_assets_are_written_to_account_columns(self):
|
||||
self._run()
|
||||
assert self.account.points == 777
|
||||
assert self.account.gold_balance == 88
|
||||
assert self.account.exchange_balance == 9
|
||||
assert self.account.elite_opened is True
|
||||
assert self.account.esports_opened is True
|
||||
|
||||
def test_points_expire_at_is_written(self):
|
||||
"""积分到期时间有专门的列,查询必须写它(之前漏了)。"""
|
||||
self._run(expire_at="1795967999")
|
||||
assert self.account.points_expire_at is not None
|
||||
assert self.account.points_expire_at.year != 1970
|
||||
|
||||
def test_no_expiry_clears_the_column_not_zero(self):
|
||||
"""斗鱼用 0 表示没有到期时间 —— 不能存成 0(会显示 1970/1/1)。"""
|
||||
self._run(expire_at="0")
|
||||
assert self.account.points_expire_at is None
|
||||
assert self.account.overview_snapshot["assets"]["points_expire_at"] is None
|
||||
|
||||
Reference in New Issue
Block a user