Files
web_security/schemas.py

111 lines
2.6 KiB
Python
Raw Normal View History

from sqlalchemy.orm import Session
from pydantic import BaseModel, validator, EmailStr
from typing import Optional
from datetime import datetime
import re
class UserBase(BaseModel):
username: str
email: Optional[EmailStr] = None
full_name: Optional[str] = None
class UserCreate(UserBase):
password: str
is_admin: bool = False # 新增管理员字段默认为False
@validator('username')
def username_alphanumeric(cls, v):
if not v.replace('_', '').isalnum():
raise ValueError('用户名只能包含字母、数字和下划线')
if len(v) < 3 or len(v) > 20:
raise ValueError('用户名长度必须在3-20个字符之间')
return v
@validator('password')
def password_strength(cls, v):
if len(v) < 6:
raise ValueError('密码长度至少6位')
return v
class UserLogin(BaseModel):
username: str
password: str
class UserUpdate(BaseModel):
email: Optional[EmailStr] = None
full_name: Optional[str] = None
password: Optional[str] = None
@validator('password')
def password_strength(cls, v):
if v and len(v) < 6:
raise ValueError('密码长度至少6位')
return v
class UserResponse(UserBase):
id: int
is_admin: bool # 添加管理员标识
is_active: bool
created_at: datetime
updated_at: Optional[datetime] = None
class Config:
orm_mode = True
# 文档相关模式
class DocumentBase(BaseModel):
title: str
content: Optional[str] = None
description: Optional[str] = None
file_type: str = "txt"
file_size: int = 0
is_public: bool = False
class DocumentCreate(DocumentBase):
pass
class DocumentUpdate(BaseModel):
title: Optional[str] = None
content: Optional[str] = None
description: Optional[str] = None
file_type: Optional[str] = None
is_public: Optional[bool] = None
class DocumentResponse(DocumentBase):
id: int
owner_id: int
created_at: datetime
updated_at: Optional[datetime] = None
class Config:
orm_mode = True
# 操作日志相关模式
class UserOperationLogBase(BaseModel):
operation: str
details: Optional[str] = None
ip_address: Optional[str] = None
user_agent: Optional[str] = None
class UserOperationLogResponse(UserOperationLogBase):
id: int
user_id: int
created_at: datetime
class Config:
orm_mode = True
# Token响应模式
class Token(BaseModel):
access_token: str
token_type: str
class TokenData(BaseModel):
username: Optional[str] = None