Files
web_security/schemas.py
starsac bb9e208381 feat: 添加文档管理系统前后端基础功能
- 新增后端FastAPI应用,包含用户管理、文档管理和操作日志功能
- 实现JWT认证机制,支持用户注册、登录、登出操作
- 添加数据库模型定义,包括用户表、文档表和操作日志表
- 实现文档的增删改查功能及权限控制
- 添加管理员功能,支持用户管理和全局操作日志查看
- 新增前端界面,实现完整的用户交互体验
- 配置环境变量示例和Git忽略规则
- 编写详细的README文档,包含安装和使用说明
2026-01-11 15:56:55 +08:00

111 lines
2.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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