feat: 平台卡片「关联N个资产」点击跳转资产页并按平台筛选(后端/api/assets新增provider参数,资产页可清除筛选标签)
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user