fix(accounts): 修复鱼翅筛选参数类型为浮点数并优化错误提示

1. 后端将 min_gold 与 max_gold 参数及 Schema 类型从 int 改为 float | None,支持小数鱼翅(如 >0 快捷筛选的 0.01);
2. 修复前端 axios 拦截器在遇到 FastAPI 422 验证错误时未展开 detail 导致弹出 [object Object] 的问题;
3. 单元测试补充验证浮点数鱼翅过滤场景。
This commit is contained in:
yml2213
2026-10-05 11:36:46 +08:00
parent 512ea3db06
commit 27e9107e38
4 changed files with 22 additions and 9 deletions
+5
View File
@@ -1766,6 +1766,11 @@ class TestHighValueAccountFilters:
names = [it.username for it in items]
assert names == ["acc_crown"]
# 浮点数鱼翅过滤(如前端「有鱼翅」快捷筛选传 0.01)
items_float = self._query(min_gold=0.01)
names_float = [it.username for it in items_float]
assert "acc_crown" in names_float
# 宝典已开通
items = self._query(elite_opened=True)
names = [it.username for it in items]
+6 -6
View File
@@ -105,8 +105,8 @@ def _filter_accounts_query(
high_value_filter: str = "",
min_points: int | None = None,
max_points: int | None = None,
min_gold: int | None = None,
max_gold: int | None = None,
min_gold: float | None = None,
max_gold: float | None = None,
elite_opened: bool | None = None,
esports_opened: bool | None = None,
role_bind_status: str = "",
@@ -192,9 +192,9 @@ def _filter_accounts_query(
query = query.filter(Account.points >= min_points)
if isinstance(max_points, int):
query = query.filter(Account.points <= max_points)
if isinstance(min_gold, int):
if isinstance(min_gold, (int, float)):
query = query.filter(Account.gold_balance >= min_gold)
if isinstance(max_gold, int):
if isinstance(max_gold, (int, float)):
query = query.filter(Account.gold_balance <= max_gold)
# 开通状态过滤
@@ -295,8 +295,8 @@ def list_accounts(
),
min_points: int | None = Query(None, description="最低积分"),
max_points: int | None = Query(None, description="最高积分"),
min_gold: int | None = Query(None, description="最低鱼翅"),
max_gold: int | None = Query(None, description="最高鱼翅"),
min_gold: float | None = Query(None, description="最低鱼翅"),
max_gold: float | None = Query(None, description="最高鱼翅"),
elite_opened: bool | None = Query(None, description="是否开通精英宝典"),
esports_opened: bool | None = Query(None, description="是否开通电竞手册"),
role_bind_status: str = Query(
+2 -2
View File
@@ -143,8 +143,8 @@ class AccountBulkSelection(BaseModel):
high_value_filter: str = ""
min_points: int | None = None
max_points: int | None = None
min_gold: int | None = None
max_gold: int | None = None
min_gold: float | None = None
max_gold: float | None = None
elite_opened: bool | None = None
esports_opened: bool | None = None
role_bind_status: str = ""
+9 -1
View File
@@ -16,7 +16,15 @@ api.interceptors.response.use(
localStorage.removeItem('user');
window.location.href = '/login';
}
const msg = error.response?.data?.detail || error.message || '请求失败';
const detail = error.response?.data?.detail;
let msg = error.message || '请求失败';
if (typeof detail === 'string') {
msg = detail;
} else if (Array.isArray(detail) && detail.length > 0) {
msg = detail.map((d: any) => d?.msg || (typeof d === 'string' ? d : JSON.stringify(d))).join('; ');
} else if (detail && typeof detail === 'object') {
msg = JSON.stringify(detail);
}
return Promise.reject(new Error(msg));
}
);