feat: Add base project structure with API and web components

This commit is contained in:
Ke Sun
2025-12-02 20:28:01 +08:00
parent f3de6d6cc9
commit c1adc62ec6
817 changed files with 111226 additions and 106 deletions

View File

@@ -0,0 +1,80 @@
from dataclasses import dataclass
from typing import List, Optional
from app.core.upload_enums import UploadContext
@dataclass
class UploadPolicy:
"""上传策略,定义文件大小限制、允许的文件类型等规则"""
max_file_size: int # 最大文件大小(字节)
allowed_extensions: List[str] # 允许的文件扩展名列表
allowed_mime_types: List[str] # 允许的 MIME 类型列表
require_authentication: bool = True # 是否需要认证
enable_virus_scan: bool = False # 是否启用病毒扫描
enable_compression: bool = False # 是否启用压缩
auto_delete_after_days: Optional[int] = None # 自动删除天数None 表示不自动删除)
# 各上下文的上传策略配置
UPLOAD_POLICIES = {
UploadContext.AVATAR: UploadPolicy(
max_file_size=5 * 1024 * 1024, # 5MB
allowed_extensions=[".jpg", ".jpeg", ".png", ".gif", ".webp"],
allowed_mime_types=["image/jpeg", "image/png", "image/gif", "image/webp"],
require_authentication=True,
enable_compression=True,
),
UploadContext.APP_ICON: UploadPolicy(
max_file_size=2 * 1024 * 1024, # 2MB
allowed_extensions=[".jpg", ".jpeg", ".png", ".svg"],
allowed_mime_types=["image/jpeg", "image/png", "image/svg+xml"],
require_authentication=True,
enable_compression=True,
),
UploadContext.KNOWLEDGE_BASE: UploadPolicy(
max_file_size=50 * 1024 * 1024, # 50MB
allowed_extensions=[".pdf", ".doc", ".docx", ".txt", ".md", ".xlsx", ".csv"],
allowed_mime_types=[
"application/pdf",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"text/plain",
"text/markdown",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"text/csv",
],
require_authentication=True,
enable_virus_scan=True,
),
UploadContext.TEMP: UploadPolicy(
max_file_size=10 * 1024 * 1024, # 10MB
allowed_extensions=[], # 允许所有类型
allowed_mime_types=[], # 允许所有类型
require_authentication=True,
auto_delete_after_days=7,
),
UploadContext.ATTACHMENT: UploadPolicy(
max_file_size=20 * 1024 * 1024, # 20MB
allowed_extensions=[], # 允许所有类型
allowed_mime_types=[], # 允许所有类型
require_authentication=True,
),
}
def get_upload_policy(context: UploadContext) -> UploadPolicy:
"""
根据上传上下文获取对应的上传策略
Args:
context: 上传上下文
Returns:
对应的上传策略
Raises:
ValueError: 如果上下文不存在对应的策略
"""
if context not in UPLOAD_POLICIES:
raise ValueError(f"未定义上传上下文 '{context}' 的策略")
return UPLOAD_POLICIES[context]