feat: 平台卡片「关联N个资产」点击跳转资产页并按平台筛选(后端/api/assets新增provider参数,资产页可清除筛选标签)

This commit is contained in:
gouki
2026-08-09 00:13:16 +00:00
parent 74f9688ba1
commit ee5a4c81cf
6 changed files with 43 additions and 6 deletions
+3 -2
View File
@@ -20,15 +20,16 @@ router = APIRouter(prefix="/api/assets", tags=["assets"])
@router.get("", response_model=List[AssetRead], summary="资产列表")
def list_assets(
asset_type: Optional[AssetType] = Query(default=None, description="按类型筛选"),
status: Optional[AssetStatus] = Query(default=None, description="按状态筛选"),
status_filter: Optional[AssetStatus] = Query(default=None, alias="status", description="按状态筛选"),
is_archived: Optional[bool] = Query(default=None, description="按归档标记筛选"),
q: Optional[str] = Query(default=None, description="搜索名称/服务商"),
provider: Optional[str] = Query(default=None, description="按平台筛选(slug 或平台 ID"),
sort: str = Query(default="expiry_date", description="排序字段"),
order: str = Query(default="asc", description="排序方向 asc/desc"),
session: Session = Depends(get_session),
):
return asset_service.list_assets(
session, asset_type, status, is_archived, q, sort, order
session, asset_type, status_filter, is_archived, q, provider, sort, order
)
+8
View File
@@ -7,6 +7,7 @@ from datetime import date, datetime, timedelta, timezone
from typing import List, Optional
from fastapi import HTTPException, status
from sqlalchemy import or_
from sqlmodel import Session, select
from app.core import crypto
@@ -358,6 +359,7 @@ def list_assets(
asset_status: Optional[AssetStatus] = None,
is_archived: Optional[bool] = None,
q: Optional[str] = None,
provider: Optional[str] = None,
sort: str = "expiry_date",
order: str = "asc",
) -> List[AssetRead]:
@@ -369,6 +371,12 @@ def list_assets(
stmt = stmt.where(Asset.status == asset_status)
if is_archived is not None:
stmt = stmt.where(Asset.is_archived == is_archived)
if provider:
# 兼容两种关联方式:provider slug 文本或 provider_id 外键
conds = [Asset.provider == provider]
if provider.isdigit():
conds.append(Asset.provider_id == int(provider))
stmt = stmt.where(or_(*conds))
if q:
pattern = f"%{q}%"
stmt = stmt.where(Asset.name.like(pattern) | Asset.provider.like(pattern))