初始化

This commit is contained in:
2026-09-03 14:31:25 +08:00
parent 30dd0bea14
commit 64a51f2567
23 changed files with 2091 additions and 144 deletions

179
core/config/settings.py Normal file
View File

@@ -0,0 +1,179 @@
from typing import List
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
from enum import Enum
class Environment(str, Enum):
"""环境枚举"""
LOCAL = "local"
DEVELOPMENT = "dev"
STAGING = "staging"
PRODUCTION = "prod"
class LogLevel(str, Enum):
"""日志级别枚举"""
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
CRITICAL = "CRITICAL"
class Settings(BaseSettings):
"""
应用配置类
自动从 .env 文件和环境变量中读取配置
"""
# ---------- 基础配置 ----------
APP_NAME: str = Field(
default="Lottery Server",
description="应用名称"
)
APP_DESCRIPTION: str = Field(
default="一个自己看的彩票信息服务",
description="应用描述"
)
ENVIRONMENT: Environment = Field(
default=Environment.LOCAL,
description="运行环境"
)
# ---------- 服务器配置 ----------
HOST: str = Field(
default="0.0.0.0",
description="服务监听地址"
)
PORT: int = Field(
default=8000,
ge=1,
le=65535,
description="服务监听端口"
)
# ---------- 数据库MYSQL配置 ----------
MYSQL_USER: str = Field(
default='root',
description="MySQL用户名"
)
MYSQL_PASSWORD: str = Field(
default='Azure1314',
description="MySQL密码"
)
MYSQL_HOST: str = Field(
default='127.0.0.1',
description="MySQL主机地址"
)
MYSQL_PORT: int = Field(
default=3306,
ge=1,
le=65535,
description="MySQL端口"
)
MYSQL_DB: str = Field(
default='lottery_server',
description="MySQL数据库名"
)
DATABASE_POOL_SIZE: int = Field(
default=10,
ge=1,
le=100,
description="数据库连接池大小"
)
DATABASE_MAX_OVERFLOW: int = Field(
default=20,
description="连接池最大溢出连接数"
)
DATABASE_ECHO: bool = Field(
default=False,
description="是否打印SQL语句"
)
# ---------- CORS配置 ----------
ALLOWED_ORIGINS: List[str] = Field(
default=["*"],
description="允许的CORS源"
)
ALLOWED_METHODS: List[str] = Field(
default=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
description="允许的HTTP方法"
)
ALLOWED_HEADERS: List[str] = Field(
default=["*"],
description="允许的HTTP头"
)
# ---------- 限流配置 ----------
RATE_LIMIT_PER_MINUTE: int = Field(
default=60,
ge=1,
description="每分钟请求限制"
)
RATE_LIMIT_PER_DAY: int = Field(
default=10000,
ge=1,
description="每天请求限制"
)
# ---------- 文件上传配置 ----------
MAX_UPLOAD_SIZE_MB: int = Field(
default=10,
ge=1,
le=100,
description="最大上传文件大小MB"
)
ALLOWED_UPLOAD_EXTENSIONS: List[str] = Field(
default=[".jpg", ".jpeg", ".png", ".pdf", ".docx"],
description="允许上传的文件扩展名"
)
UPLOAD_DIR: str = Field(
default="./uploads",
description="文件上传目录"
)
# ---------- 缓存配置 ----------
CACHE_TTL_SECONDS: int = Field(
default=300,
ge=1,
description="缓存过期时间(秒)"
)
# ---------- 计算属性 ----------
@property
def mysql_url(self) -> str:
"""MySQL连接URL"""
# 连接url格式mysql+pymysql://user:password@host:port/dbname
return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}?charset=utf8mb4"
@property
def is_production(self) -> bool:
"""是否为生产环境"""
return self.ENVIRONMENT == Environment.PRODUCTION
@property
def is_development(self) -> bool:
"""是否为开发环境"""
return self.ENVIRONMENT in [Environment.LOCAL, Environment.DEVELOPMENT]
# ---------- 配置加载设置 ----------
model_config = SettingsConfigDict(
env_file=".env.local", # .env文件路径
env_file_encoding="utf-8", # 文件编码
case_sensitive=True, # 环境变量名大小写敏感
extra="ignore", # 忽略未定义的额外字段
validate_default=True, # 验证默认值
# secrets_dir="/run/secrets", # Docker secrets支持可选
)
# 创建全局单例配置实例
settings = Settings()
# 导出配置实例
__all__ = ["settings", "Environment", "LogLevel"]