CursorPro 后台管理系统 v1.0
功能: - 激活码管理 (Pro/Auto 两种类型) - 账号池管理 - 设备绑定记录 - 使用日志 - 搜索/筛选功能 - 禁用/启用功能 (支持退款参考) - 全局设置 (换号间隔、额度消耗等) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
1
backend/app/schemas/__init__.py
Normal file
1
backend/app/schemas/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from app.schemas.schemas import *
|
||||
186
backend/app/schemas/schemas.py
Normal file
186
backend/app/schemas/schemas.py
Normal file
@@ -0,0 +1,186 @@
|
||||
from pydantic import BaseModel, EmailStr
|
||||
from typing import Optional, List
|
||||
from datetime import datetime
|
||||
from app.models.models import MembershipType, AccountStatus, KeyStatus
|
||||
|
||||
|
||||
# ========== 账号相关 ==========
|
||||
|
||||
class AccountBase(BaseModel):
|
||||
email: str
|
||||
access_token: str
|
||||
refresh_token: Optional[str] = None
|
||||
workos_session_token: Optional[str] = None
|
||||
membership_type: MembershipType = MembershipType.PRO
|
||||
remark: Optional[str] = None
|
||||
|
||||
class AccountCreate(AccountBase):
|
||||
pass
|
||||
|
||||
class AccountUpdate(BaseModel):
|
||||
email: Optional[str] = None
|
||||
access_token: Optional[str] = None
|
||||
refresh_token: Optional[str] = None
|
||||
workos_session_token: Optional[str] = None
|
||||
membership_type: Optional[MembershipType] = None
|
||||
status: Optional[AccountStatus] = None
|
||||
remark: Optional[str] = None
|
||||
|
||||
class AccountResponse(AccountBase):
|
||||
id: int
|
||||
status: AccountStatus
|
||||
usage_count: int
|
||||
last_used_at: Optional[datetime] = None
|
||||
current_key_id: Optional[int] = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
class AccountImport(BaseModel):
|
||||
"""批量导入账号"""
|
||||
accounts: List[AccountCreate]
|
||||
|
||||
|
||||
# ========== 激活码相关 ==========
|
||||
|
||||
class KeyBase(BaseModel):
|
||||
membership_type: MembershipType = MembershipType.PRO # pro=高级模型, free=无限auto
|
||||
quota: int = 500 # 总额度 (仅Pro有效)
|
||||
valid_days: int = 30 # 有效天数,0表示永久 (仅Auto有效)
|
||||
max_devices: int = 2 # 最大设备数
|
||||
remark: Optional[str] = None
|
||||
|
||||
class KeyCreate(KeyBase):
|
||||
key: Optional[str] = None # 不提供则自动生成
|
||||
count: int = 1 # 批量生成数量
|
||||
|
||||
class KeyUpdate(BaseModel):
|
||||
membership_type: Optional[MembershipType] = None
|
||||
quota: Optional[int] = None
|
||||
valid_days: Optional[int] = None
|
||||
max_devices: Optional[int] = None
|
||||
status: Optional[KeyStatus] = None
|
||||
remark: Optional[str] = None
|
||||
|
||||
class KeyAddQuota(BaseModel):
|
||||
"""叠加额度(只加额度不加时间)"""
|
||||
add_quota: int
|
||||
|
||||
class KeyResponse(BaseModel):
|
||||
id: int
|
||||
key: str
|
||||
status: KeyStatus
|
||||
membership_type: MembershipType
|
||||
quota: int
|
||||
quota_used: int
|
||||
quota_remaining: Optional[int] = None # 剩余额度(计算字段)
|
||||
valid_days: int
|
||||
first_activated_at: Optional[datetime] = None
|
||||
expire_at: Optional[datetime] = None
|
||||
max_devices: int
|
||||
switch_count: int
|
||||
last_switch_at: Optional[datetime] = None
|
||||
current_account_id: Optional[int] = None
|
||||
remark: Optional[str] = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
# ========== 客户端 API 相关 ==========
|
||||
|
||||
class VerifyKeyRequest(BaseModel):
|
||||
key: str
|
||||
device_id: Optional[str] = None # 设备标识
|
||||
|
||||
class VerifyKeyResponse(BaseModel):
|
||||
success: bool
|
||||
message: Optional[str] = None
|
||||
error: Optional[str] = None
|
||||
# 成功时返回
|
||||
email: Optional[str] = None
|
||||
accessToken: Optional[str] = None
|
||||
refreshToken: Optional[str] = None
|
||||
WorkosCursorSessionToken: Optional[str] = None
|
||||
membership_type: Optional[str] = None
|
||||
# 额度信息
|
||||
quota: Optional[int] = None # 总额度
|
||||
quotaUsed: Optional[int] = None # 已用额度
|
||||
quotaRemaining: Optional[int] = None # 剩余额度
|
||||
quotaCost: Optional[int] = None # 每次换号消耗
|
||||
expireDate: Optional[str] = None
|
||||
|
||||
class SwitchAccountRequest(BaseModel):
|
||||
key: str
|
||||
device_id: Optional[str] = None # 设备标识
|
||||
|
||||
class SwitchAccountResponse(BaseModel):
|
||||
success: bool
|
||||
message: Optional[str] = None
|
||||
error: Optional[str] = None
|
||||
email: Optional[str] = None
|
||||
accessToken: Optional[str] = None
|
||||
refreshToken: Optional[str] = None
|
||||
WorkosCursorSessionToken: Optional[str] = None
|
||||
membership_type: Optional[str] = None
|
||||
# 额度信息
|
||||
quotaUsed: Optional[int] = None
|
||||
quotaRemaining: Optional[int] = None
|
||||
|
||||
|
||||
# ========== 统计相关 ==========
|
||||
|
||||
class DashboardStats(BaseModel):
|
||||
total_accounts: int
|
||||
active_accounts: int
|
||||
pro_accounts: int
|
||||
total_keys: int
|
||||
active_keys: int
|
||||
today_usage: int
|
||||
|
||||
|
||||
# ========== 认证相关 ==========
|
||||
|
||||
class Token(BaseModel):
|
||||
access_token: str
|
||||
token_type: str = "bearer"
|
||||
|
||||
class LoginRequest(BaseModel):
|
||||
username: str
|
||||
password: str
|
||||
|
||||
|
||||
# ========== 全局设置相关 ==========
|
||||
|
||||
class GlobalSettingsResponse(BaseModel):
|
||||
"""全局设置响应"""
|
||||
# Auto密钥设置
|
||||
auto_switch_interval_minutes: int = 20 # 换号最小间隔(分钟)
|
||||
auto_max_switches_per_day: int = 50 # 每天最大换号次数
|
||||
# Pro密钥设置
|
||||
pro_quota_cost: int = 50 # 每次换号扣除额度
|
||||
|
||||
class GlobalSettingsUpdate(BaseModel):
|
||||
"""更新全局设置"""
|
||||
auto_switch_interval_minutes: Optional[int] = None
|
||||
auto_max_switches_per_day: Optional[int] = None
|
||||
pro_quota_cost: Optional[int] = None
|
||||
|
||||
|
||||
# ========== 批量操作相关 ==========
|
||||
|
||||
class BatchExtendRequest(BaseModel):
|
||||
"""批量延长请求"""
|
||||
key_ids: List[int] # 激活码ID列表
|
||||
extend_days: int = 0 # 延长天数(Auto和Pro都可用)
|
||||
add_quota: int = 0 # 增加额度(仅Pro有效)
|
||||
|
||||
class BatchExtendResponse(BaseModel):
|
||||
"""批量延长响应"""
|
||||
success: int
|
||||
failed: int
|
||||
errors: List[str] = []
|
||||
Reference in New Issue
Block a user