feat: 资产 CRUD API + 统计接口 + Vue3 管理前端(可选 API Key 鉴权)
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""API 路由"""
|
||||
@@ -0,0 +1,70 @@
|
||||
"""资产 CRUD 路由
|
||||
|
||||
统一入口 /api/assets,写操作(POST/PUT/DELETE)受 API Key 保护。
|
||||
"""
|
||||
|
||||
from typing import List, Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlmodel import Session
|
||||
|
||||
from app.core.security import require_api_key
|
||||
from app.database import get_session
|
||||
from app.models.asset import AssetStatus, AssetType
|
||||
from app.schemas.asset import AssetCreate, AssetRead, AssetUpdate
|
||||
from app.services import asset_service
|
||||
|
||||
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="按状态筛选"),
|
||||
is_archived: Optional[bool] = Query(default=None, description="按归档标记筛选"),
|
||||
q: Optional[str] = Query(default=None, description="搜索名称/服务商"),
|
||||
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
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{asset_id}", response_model=AssetRead, summary="资产详情")
|
||||
def get_asset(asset_id: int, session: Session = Depends(get_session)):
|
||||
return asset_service.get_asset(session, asset_id)
|
||||
|
||||
|
||||
@router.post(
|
||||
"",
|
||||
response_model=AssetRead,
|
||||
status_code=201,
|
||||
summary="创建资产",
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
def create_asset(data: AssetCreate, session: Session = Depends(get_session)):
|
||||
return asset_service.create_asset(session, data)
|
||||
|
||||
|
||||
@router.put(
|
||||
"/{asset_id}",
|
||||
response_model=AssetRead,
|
||||
summary="更新资产",
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
def update_asset(
|
||||
asset_id: int, data: AssetUpdate, session: Session = Depends(get_session)
|
||||
):
|
||||
return asset_service.update_asset(session, asset_id, data)
|
||||
|
||||
|
||||
@router.delete(
|
||||
"/{asset_id}",
|
||||
status_code=204,
|
||||
summary="删除资产",
|
||||
dependencies=[Depends(require_api_key)],
|
||||
)
|
||||
def delete_asset(asset_id: int, session: Session = Depends(get_session)):
|
||||
asset_service.delete_asset(session, asset_id)
|
||||
@@ -0,0 +1,25 @@
|
||||
"""统计路由:资产总览与续费倒计时"""
|
||||
|
||||
from typing import List
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlmodel import Session
|
||||
|
||||
from app.database import get_session
|
||||
from app.schemas.asset import AssetRead
|
||||
from app.services import asset_service
|
||||
|
||||
router = APIRouter(prefix="/api/stats", tags=["stats"])
|
||||
|
||||
|
||||
@router.get("/overview", summary="资产总览")
|
||||
def overview(session: Session = Depends(get_session)) -> dict:
|
||||
return asset_service.get_overview(session)
|
||||
|
||||
|
||||
@router.get("/expiring", response_model=List[AssetRead], summary="续费倒计时")
|
||||
def expiring(
|
||||
days: int = Query(default=30, ge=1, le=365, description="统计未来 N 天内到期"),
|
||||
session: Session = Depends(get_session),
|
||||
):
|
||||
return asset_service.get_expiring(session, days)
|
||||
Reference in New Issue
Block a user