feat: Cloudflare多账号子资产管理(zone/worker/r2/tunnel/mail子资产模型+模态框)

This commit is contained in:
gouki
2026-08-02 23:41:49 +00:00
parent dd2638601a
commit af17294f24
5 changed files with 73 additions and 4 deletions
+9 -2
View File
@@ -15,6 +15,7 @@ from app.models.asset import (
Asset,
AssetStatus,
AssetType,
CloudflareDetail,
DomainDetail,
VPSDetail,
)
@@ -24,6 +25,7 @@ from app.schemas.asset import (
AssetCreate,
AssetRead,
AssetUpdate,
CloudflareDetailRead,
DomainDetailRead,
VPSDetailRead,
)
@@ -33,6 +35,7 @@ DETAIL_MAP = {
AssetType.VPS: ("vps_detail", VPSDetail),
AssetType.DOMAIN: ("domain_detail", DomainDetail),
AssetType.AI_AGENT: ("ai_detail", AIAccount),
AssetType.CLOUDFLARE: ("cloudflare_detail", CloudflareDetail),
}
# 允许排序的字段白名单
@@ -71,6 +74,8 @@ def _detail_to_read(detail):
read = AIAccountRead.model_validate(detail)
read.has_api_key = bool(detail.api_key_encrypted or detail.api_key)
return read
if isinstance(detail, CloudflareDetail):
return CloudflareDetailRead.model_validate(detail)
return None
@@ -94,6 +99,8 @@ def _to_read(session: Session, asset: Asset, detail) -> AssetRead:
read.domain_detail = _detail_to_read(detail)
elif isinstance(detail, AIAccount):
read.ai_detail = _detail_to_read(detail)
elif isinstance(detail, CloudflareDetail):
read.cloudflare_detail = _detail_to_read(detail)
return read
@@ -151,7 +158,7 @@ def create_asset(session: Session, data: AssetCreate) -> AssetRead:
)
asset_data = data.model_dump(
exclude={"vps_detail", "domain_detail", "ai_detail"}
exclude={"vps_detail", "domain_detail", "ai_detail", "cloudflare_detail"}
)
asset = Asset(**asset_data)
session.add(asset)
@@ -183,7 +190,7 @@ def update_asset(session: Session, asset_id: int, data: AssetUpdate) -> AssetRea
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="资产不存在")
main_fields = data.model_dump(
exclude_unset=True, exclude={"vps_detail", "domain_detail", "ai_detail"}
exclude_unset=True, exclude={"vps_detail", "domain_detail", "ai_detail", "cloudflare_detail"}
)
for key, value in main_fields.items():
setattr(asset, key, value)