84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
# ===========================================
|
|
# 班级操行分管理系统 - 配置管理
|
|
#
|
|
# 开发者: Canglan
|
|
# 联系方式: admin@sea-studio.top
|
|
# 版权归属: Sea Network Technology Studio
|
|
# 许可证: MIT License
|
|
#
|
|
# 版权所有 © Sea Network Technology Studio
|
|
# ===========================================
|
|
|
|
import os
|
|
from dotenv import load_dotenv
|
|
from typing import List
|
|
|
|
load_dotenv()
|
|
|
|
class Settings:
|
|
APP_NAME: str = os.getenv("APP_NAME", "班级操行分管理系统")
|
|
APP_ENV: str = os.getenv("APP_ENV", "production")
|
|
DEBUG: bool = os.getenv("DEBUG", "False").lower() == "true"
|
|
SECRET_KEY: str = os.getenv("SECRET_KEY", "")
|
|
API_VERSION: str = os.getenv("API_VERSION", "v1")
|
|
|
|
DB_HOST: str = os.getenv("DB_HOST", "127.0.0.1")
|
|
DB_PORT: int = int(os.getenv("DB_PORT", "3306"))
|
|
DB_USER: str = os.getenv("DB_USER", "root")
|
|
DB_PASSWORD: str = os.getenv("DB_PASSWORD", "")
|
|
DB_NAME: str = os.getenv("DB_NAME", "classmanagerdb")
|
|
DB_POOL_SIZE: int = int(os.getenv("DB_POOL_SIZE", "10"))
|
|
DB_MAX_OVERFLOW: int = int(os.getenv("DB_MAX_OVERFLOW", "20"))
|
|
|
|
REDIS_HOST: str = os.getenv("REDIS_HOST", "127.0.0.1")
|
|
REDIS_PORT: int = int(os.getenv("REDIS_PORT", "6379"))
|
|
REDIS_PASSWORD: str = os.getenv("REDIS_PASSWORD", "")
|
|
REDIS_DB: int = int(os.getenv("REDIS_DB", "0"))
|
|
REDIS_MAX_CONNECTIONS: int = int(os.getenv("REDIS_MAX_CONNECTIONS", "50"))
|
|
|
|
@property
|
|
def REDIS_URL(self) -> str:
|
|
if self.REDIS_PASSWORD:
|
|
return f"redis://:{self.REDIS_PASSWORD}@{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}"
|
|
return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}"
|
|
|
|
JWT_SECRET_KEY: str = os.getenv("JWT_SECRET_KEY", "")
|
|
JWT_ALGORITHM: str = os.getenv("JWT_ALGORITHM", "HS256")
|
|
JWT_EXPIRE_MINUTES: int = int(os.getenv("JWT_EXPIRE_MINUTES", "30"))
|
|
|
|
PASSWORD_SALT: str = os.getenv("PASSWORD_SALT", "")
|
|
DEBUG_PATH: str = os.getenv("DEBUG_PATH", "/debug_add_admin")
|
|
|
|
DEDUCTION_HOMEWORK_NOT_SUBMIT: int = int(os.getenv("DEDUCTION_HOMEWORK_NOT_SUBMIT", "2"))
|
|
DEDUCTION_HOMEWORK_LATE: int = int(os.getenv("DEDUCTION_HOMEWORK_LATE", "1"))
|
|
DEDUCTION_ATTENDANCE_ABSENT: int = int(os.getenv("DEDUCTION_ATTENDANCE_ABSENT", "5"))
|
|
DEDUCTION_ATTENDANCE_LATE: int = int(os.getenv("DEDUCTION_ATTENDANCE_LATE", "2"))
|
|
DEDUCTION_ATTENDANCE_LEAVE: int = int(os.getenv("DEDUCTION_ATTENDANCE_LEAVE", "1"))
|
|
|
|
LABOR_POINTS_ADD: int = int(os.getenv("LABOR_POINTS_ADD", "1"))
|
|
LABOR_POINTS_SUBTRACT: int = int(os.getenv("LABOR_POINTS_SUBTRACT", "-1"))
|
|
|
|
MONITOR_MAX_ADD: int = int(os.getenv("MONITOR_MAX_ADD", "5"))
|
|
MONITOR_MAX_SUBTRACT: int = int(os.getenv("MONITOR_MAX_SUBTRACT", "-5"))
|
|
|
|
LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")
|
|
LOG_MAX_BYTES: int = int(os.getenv("LOG_MAX_BYTES", "104857600"))
|
|
LOG_BACKUP_COUNT: int = int(os.getenv("LOG_BACKUP_COUNT", "30"))
|
|
LOG_RETENTION_DAYS: int = int(os.getenv("LOG_RETENTION_DAYS", "365"))
|
|
|
|
@property
|
|
def CORS_ORIGINS(self) -> List[str]:
|
|
origins = os.getenv("CORS_ORIGINS", "")
|
|
return [origin.strip() for origin in origins.split(",") if origin.strip()]
|
|
|
|
MAX_UPLOAD_SIZE: int = int(os.getenv("MAX_UPLOAD_SIZE", "5242880"))
|
|
ALLOWED_EXTENSIONS: set = set(os.getenv("ALLOWED_EXTENSIONS", "json").split(","))
|
|
STUDENT_INITIAL_POINTS: int = int(os.getenv("STUDENT_INITIAL_POINTS", "60"))
|
|
|
|
def validate(self) -> None:
|
|
required = ["SECRET_KEY", "JWT_SECRET_KEY", "PASSWORD_SALT"]
|
|
for name in required:
|
|
if not getattr(self, name):
|
|
raise ValueError(f"配置 {name} 不能为空")
|
|
|
|
settings = Settings() |