feat(cpa): 支持多cpa服务

This commit is contained in:
cnlimiter committed 2026-03-18 14:01:44 +08:00
1 parent 7ce403ece3
commit 931ea798cc
14 files changed
+778 -51

No files matched your search

+71 -2
View File
@@ -7,7 +7,7 @@ from datetime import datetime, timedelta
from sqlalchemy.orm import Session
from sqlalchemy import and_, or_, desc, asc, func
from .models import Account, EmailService, RegistrationTask, Setting, Proxy
from .models import Account, EmailService, RegistrationTask, Setting, Proxy, CpaService
# ============================================================================
@@ -497,4 +497,73 @@ def get_proxies_count(db: Session, enabled: Optional[bool] = None) -> int:
query = db.query(func.count(Proxy.id))
if enabled is not None:
query = query.filter(Proxy.enabled == enabled)
return query.scalar()
return query.scalar()
# ============================================================================
# CPA 服务 CRUD
# ============================================================================
def create_cpa_service(
db: Session,
name: str,
api_url: str,
api_token: str,
enabled: bool = True,
priority: int = 0
) -> CpaService:
"""创建 CPA 服务配置"""
db_service = CpaService(
name=name,
api_url=api_url,
api_token=api_token,
enabled=enabled,
priority=priority
)
db.add(db_service)
db.commit()
db.refresh(db_service)
return db_service
def get_cpa_service_by_id(db: Session, service_id: int) -> Optional[CpaService]:
"""根据 ID 获取 CPA 服务"""
return db.query(CpaService).filter(CpaService.id == service_id).first()
def get_cpa_services(
db: Session,
enabled: Optional[bool] = None
) -> List[CpaService]:
"""获取 CPA 服务列表"""
query = db.query(CpaService)
if enabled is not None:
query = query.filter(CpaService.enabled == enabled)
return query.order_by(asc(CpaService.priority), asc(CpaService.id)).all()
def update_cpa_service(
db: Session,
service_id: int,
**kwargs
) -> Optional[CpaService]:
"""更新 CPA 服务配置"""
db_service = get_cpa_service_by_id(db, service_id)
if not db_service:
return None
for key, value in kwargs.items():
if hasattr(db_service, key):
setattr(db_service, key, value)
db.commit()
db.refresh(db_service)
return db_service
def delete_cpa_service(db: Session, service_id: int) -> bool:
"""删除 CPA 服务配置"""
db_service = get_cpa_service_by_id(db, service_id)
if not db_service:
return False
db.delete(db_service)
db.commit()
return True
+14
View File
@@ -130,6 +130,20 @@ class Setting(Base):
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class CpaService(Base):
"""CPA 服务配置表"""
__tablename__ = 'cpa_services'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False) # 服务名称
api_url = Column(String(500), nullable=False) # API URL
api_token = Column(Text, nullable=False) # API Token
enabled = Column(Boolean, default=True)
priority = Column(Integer, default=0) # 优先级
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
class Proxy(Base):
"""代理列表表"""
__tablename__ = 'proxies'
+3
View File
@@ -112,6 +112,9 @@ class DatabaseSessionManager:
("accounts", "cookies", "TEXT"),
]
# 确保新表存在(create_tables 已处理,此处兜底)
Base.metadata.create_all(bind=self.engine)
with self.engine.connect() as conn:
for table_name, column_name, column_type in migrations:
try: