fix(account): 支持跨平台同名账号——(platform,name)联合唯一+Asset.account_id外键重构

This commit is contained in:
gouki
2026-08-11 07:27:01 +00:00
parent bc1b804931
commit b4705331c0
9 changed files with 209 additions and 66 deletions
+11 -5
View File
@@ -5,14 +5,14 @@
- VPSDetail: VPS 资产详情(与 Asset 一对一关联)
- DomainDetail: 域名资产详情(与 Asset 一对一关联)
- AIAccount: AI Agent 账号详情(与 Asset 一对一关联)
- Account: 平台账号字典(Asset.account 按名称引用)
- Account: 平台账号字典(Asset.account_id 外键引用)
"""
from datetime import date, datetime
from enum import Enum
from typing import Optional
from sqlalchemy import Index
from sqlalchemy import Index, UniqueConstraint
from sqlmodel import Field, SQLModel
from app.core.timeutils import utcnow
@@ -65,7 +65,10 @@ class Asset(SQLModel, table=True):
default=None, description="取消订阅网址(去哪取消)"
)
account: Optional[str] = Field(
default=None, description="所属账号标识(如 Cloudflare 账号邮箱"
default=None, description="所属账号标识(历史字段,迁移后由 account_id 取代,仅作迁移数据源"
)
account_id: Optional[int] = Field(
default=None, foreign_key="accounts.id", index=True, description="所属账号 ID(外键关联 accounts"
)
expiry_date: Optional[date] = Field(
default=None, index=True, description="到期/续费日期,用于续费提醒"
@@ -201,15 +204,18 @@ class CloudflareDetail(SQLModel, table=True):
class Account(SQLModel, table=True):
"""平台账号字典:统一管理各平台下的账号(多账号场景区分归属)
资产的 Asset.account 字段按名称引用本表,重命名时由服务层同步更新引用
资产的 Asset.account_id 字段外键引用本表,重命名账号不影响资产归属
唯一性:(platform, name) 联合唯一——同一邮箱/用户名可跨平台复用。
凭证层:登录用户名/密码(网站登录)+ API 配置 JSON(SDK 同步用),
平台本身不再持有凭证(Provider.api_config_encrypted 已弃用,仅留历史值)。
"""
__tablename__ = "accounts"
# (platform, name) 联合唯一:同一邮箱/用户名可跨平台复用,同平台内不允许重名
__table_args__ = (UniqueConstraint("platform", "name", name="uq_accounts_platform_name"),)
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(unique=True, index=True, description="账号标识(如邮箱/用户名)")
name: str = Field(index=True, description="账号标识(如邮箱/用户名)")
platform: Optional[str] = Field(
default=None, index=True, description="所属平台(slug 或名称)"
)