dingdanquanliucheng/backend/app/core/config.py
2026-06-01 11:24:20 +08:00

104 lines
5.5 KiB
Python
Raw 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.

"""应用全局配置模块。
通过 pydantic-settings 从 .env 文件和环境变量加载配置,
使用 lru_cache 保证全局单例。所有配置项均可通过环境变量覆盖。
"""
from functools import lru_cache
from pathlib import Path
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
BASE_DIR = Path(__file__).resolve().parents[2]
ENV_FILE = BASE_DIR / ".env"
class Settings(BaseSettings):
"""应用配置类包含数据库、JWT、OSS、AI、微信等全部配置项。
属性:
app_env: 运行环境dev/test/prod
secret_key: JWT 签名密钥。
jwt_expire_minutes: JWT 有效期(分钟)。
mysql_*: MySQL 数据库连接配置。
aliyun_oss_*: 阿里云 OSS 文件存储配置。
ai_provider: AI 服务提供方mock/aliyun
wechat_*: 微信小程序通知配置。
llm_parse_*: 大模型解析订单配置。
"""
model_config = SettingsConfigDict(
env_file=str(ENV_FILE),
env_file_encoding="utf-8",
extra="ignore",
)
app_env: str = Field(default="dev", alias="APP_ENV")
app_name: str = Field(default="order-flow", alias="APP_NAME")
api_prefix: str = Field(default="/api", alias="API_PREFIX")
secret_key: str = Field(default="change-me", alias="SECRET_KEY")
jwt_expire_minutes: int = Field(default=1440, alias="JWT_EXPIRE_MINUTES")
auth_token_store_path: str = Field(default="D:/tmp/order-flow-auth/revoked_tokens.json", alias="AUTH_TOKEN_STORE_PATH")
cors_allow_origins: str = Field(default="http://localhost:5173", alias="CORS_ALLOW_ORIGINS")
mysql_host: str = Field(default="127.0.0.1", alias="MYSQL_HOST")
mysql_port: int = Field(default=3306, alias="MYSQL_PORT")
mysql_database: str = Field(default="order_flow", alias="MYSQL_DATABASE")
mysql_user: str = Field(default="order_user", alias="MYSQL_USER")
mysql_password: str = Field(default="password", alias="MYSQL_PASSWORD")
sql_echo: bool = Field(default=False, alias="SQL_ECHO")
redis_host: str = Field(default="127.0.0.1", alias="REDIS_HOST")
redis_port: int = Field(default=6379, alias="REDIS_PORT")
redis_db: int = Field(default=0, alias="REDIS_DB")
redis_password: str = Field(default="", alias="REDIS_PASSWORD")
aliyun_oss_bucket: str = Field(default="bucket-name", alias="ALIYUN_OSS_BUCKET")
aliyun_oss_endpoint: str = Field(default="oss-cn-hangzhou.aliyuncs.com", alias="ALIYUN_OSS_ENDPOINT")
aliyun_oss_public_base_url: str = Field(default="https://cdn.example.com", alias="ALIYUN_OSS_PUBLIC_BASE_URL")
aliyun_oss_access_key_id: str = Field(default="xxx", alias="ALIYUN_OSS_ACCESS_KEY_ID")
aliyun_oss_access_key_secret: str = Field(default="xxx", alias="ALIYUN_OSS_ACCESS_KEY_SECRET")
oss_signed_url_expire_seconds: int = Field(default=3600, alias="OSS_SIGNED_URL_EXPIRE_SECONDS")
oss_upload_max_image_mb: int = Field(default=10, alias="OSS_UPLOAD_MAX_IMAGE_MB")
oss_upload_max_video_mb: int = Field(default=200, alias="OSS_UPLOAD_MAX_VIDEO_MB")
ai_provider: str = Field(default="mock", alias="AI_PROVIDER")
aliyun_ai_region: str = Field(default="cn-hangzhou", alias="ALIYUN_AI_REGION")
aliyun_ai_access_key_id: str = Field(default="xxx", alias="ALIYUN_AI_ACCESS_KEY_ID")
aliyun_ai_access_key_secret: str = Field(default="xxx", alias="ALIYUN_AI_ACCESS_KEY_SECRET")
logistics_trace_provider: str = Field(default="internal", alias="LOGISTICS_TRACE_PROVIDER")
logistics_trace_endpoint: str = Field(default="", alias="LOGISTICS_TRACE_ENDPOINT")
logistics_trace_path: str = Field(default="", alias="LOGISTICS_TRACE_PATH")
logistics_trace_app_code: str = Field(default="", alias="LOGISTICS_TRACE_APPCODE")
kuaidi100_key: str = Field(default="", alias="KUAIDI100_KEY")
kuaidi100_customer: str = Field(default="", alias="KUAIDI100_CUSTOMER")
kuaidi100_secret: str = Field(default="", alias="KUAIDI100_SECRET")
kuaidi100_userid: str = Field(default="", alias="KUAIDI100_USERID")
wechat_app_id: str = Field(default="", alias="WECHAT_APP_ID")
wechat_app_secret: str = Field(default="", alias="WECHAT_APP_SECRET")
wechat_template_order_status: str = Field(default="", alias="WECHAT_TEMPLATE_ORDER_STATUS")
wechat_template_approval: str = Field(default="", alias="WECHAT_TEMPLATE_APPROVAL")
wechat_template_task_assigned: str = Field(default="", alias="WECHAT_TEMPLATE_TASK_ASSIGNED")
wechat_template_logistics_timeout: str = Field(default="", alias="WECHAT_TEMPLATE_LOGISTICS_TIMEOUT")
wechat_template_arrears: str = Field(default="", alias="WECHAT_TEMPLATE_ARREARS")
wechat_template_inactive_customer: str = Field(default="", alias="WECHAT_TEMPLATE_INACTIVE_CUSTOMER")
llm_parse_enabled: bool = Field(default=True, alias="LLM_PARSE_ENABLED")
llm_parse_model: str = Field(default="qwen-plus", alias="LLM_PARSE_MODEL")
llm_parse_api_key: str = Field(default="", alias="LLM_PARSE_API_KEY")
llm_parse_api_url: str = Field(
default="https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
alias="LLM_PARSE_API_URL",
)
@property
def cors_origins(self) -> list[str]:
"""将逗号分隔的 CORS 白名单字符串解析为列表。"""
return [item.strip() for item in self.cors_allow_origins.split(",") if item.strip()]
@lru_cache
def get_settings() -> Settings:
"""获取全局配置单例,首次调用时从 .env 加载,后续调用返回缓存。
Returns:
Settings: 应用配置实例。
"""
return Settings()