Files
PerToolBoxServer/backend/schemas.py
2026-03-31 16:03:55 +08:00

131 lines
3.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
PerToolBox Server - Pydantic 模型
Copyright (C) 2024 Sea Network Technology Studio
Author: Canglan <admin@sea-studio.top>
License: AGPL v3
"""
from pydantic import BaseModel, Field, validator
from datetime import datetime
from typing import Optional, List, Dict, Any
# ========== 用户相关 ==========
class SendCodeRequest(BaseModel):
account: str # 手机号或邮箱
type: str # phone / email
class RegisterRequest(BaseModel):
account: str
code: str
password: str = Field(..., min_length=6, max_length=20)
class LoginRequest(BaseModel):
account: str
password: Optional[str] = None
code: Optional[str] = None
class UserResponse(BaseModel):
id: int
username: Optional[str]
phone: Optional[str]
email: Optional[str]
avatar: Optional[str]
created_at: datetime
class Config:
from_attributes = True
class UserUpdateRequest(BaseModel):
username: Optional[str] = None
avatar: Optional[str] = None
# ========== 待办事项 ==========
class TodoBase(BaseModel):
title: str = Field(..., min_length=1, max_length=200)
description: Optional[str] = None
completed: bool = False
priority: int = Field(1, ge=1, le=3)
category: str = Field("学习", max_length=50)
due_date: Optional[datetime] = None
class TodoCreate(TodoBase):
pass
class TodoUpdate(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
completed: Optional[bool] = None
priority: Optional[int] = None
category: Optional[str] = None
due_date: Optional[datetime] = None
class TodoResponse(TodoBase):
id: int
created_at: datetime
updated_at: Optional[datetime]
class Config:
from_attributes = True
# ========== 便签 ==========
class NoteBase(BaseModel):
title: str = Field(..., min_length=1, max_length=200)
content: Optional[str] = None
tags: List[str] = []
is_archived: bool = False
class NoteCreate(NoteBase):
pass
class NoteUpdate(BaseModel):
title: Optional[str] = None
content: Optional[str] = None
tags: Optional[List[str]] = None
is_archived: Optional[bool] = None
class NoteResponse(NoteBase):
id: int
created_at: datetime
updated_at: Optional[datetime]
class Config:
from_attributes = True
# ========== 加密工具 ==========
class HashRequest(BaseModel):
algorithm: str # md5, sha1, sha256, sha512
text: str
class Base64Request(BaseModel):
action: str # encode / decode
text: str
class URLRequest(BaseModel):
action: str # encode / decode
text: str
class AESRequest(BaseModel):
mode: str = "ECB" # ECB, CBC, GCM
action: str # encrypt / decrypt
key: str
iv: Optional[str] = None
text: str
# ========== JSON 校验 ==========
class JSONValidateRequest(BaseModel):
json_string: str
class JSONValidateResponse(BaseModel):
valid: bool
formatted: Optional[str] = None
error: Optional[Dict[str, Any]] = None
# ========== 热度统计 ==========
class ToolStatsResponse(BaseModel):
today: int
total: int
class ToolUsageRequest(BaseModel):
tool_name: str