from typing import Optional from pydantic_settings import BaseSettings import os from functools import lru_cache class Settings(BaseSettings): DEBUG: bool = True # 开发模式标志 API_V1_STR: str = "/api/v1" PROJECT_NAME: str = "FastAPI 项目" ENV_NAME: str = "开发环境" PLATFORM_USER_ID: int = 9 API_BASE_URL: str = "https://api-dev.beefast.co" # 企业微信机器人系统异常通知 URL_WECOMBOT_SYS_EXCEPTION : str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=edcc54c5-c352-42dd-b9be-0cc5b39cc0dc" # 企业微信机器人每日报告通知 URL_WECOMBOT_DAILY_REPORT : str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=6869b6e2-57fc-471a-bb62-028014e2b1c8" # 企业微信机器人提现申请 URL_WECOMBOT_WITHDRAWAL_APPLY : str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a559ed6c-0d75-4a42-b11d-7ab47c929ac5" POINT_RATIO: float = 10.0 # 积分兑换比例 # 订单价格配置 ORDER_BASE_PRICE: float = 3.0 # 基础费用 ORDER_EXTRA_PACKAGE_PRICE: float = 0.5 # 额外包裹费用 ORDER_EXTRA_PACKAGE_THRESHOLD: int = 5 # 额外收费阈值 # 邀请新人赠送积分 FIRST_ORDER_REFERRAL_POINT: int = 30 COMMON_ORDER_REFERRAL_POINT: int = 3 # JWT 配置 SECRET_KEY: str = "s10GmiRMmplfYWXYZLSsE3X36Ld4gVZxHgAcdqFGC20v3llv7UdOeWLBEEP3e40p" ACCESS_TOKEN_EXPIRE_MINUTES: Optional[int] = None # None 表示永不过期 REDIS_HOST: str = "101.36.120.145" REDIS_PORT: int = 6379 REDIS_DB: int = 0 REDIS_PASSWORD: str = "redis_rJRMHr" VERIFICATION_CODE_EXPIRE_SECONDS: int = 300 # 验证码5分钟后过期 VERIFICATION_CODE_LIMIT_SECONDS: int = 15 # 验证码发送频率限制15秒 MYSQL_HOST: str = "gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com" MYSQL_PORT: int = 27469 MYSQL_USER: str = "root" MYSQL_PASSWORD: str = "Aa#223388" MYSQL_DB: str = "beefast" @property def SQLALCHEMY_DATABASE_URL(self) -> str: return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}?charset=utf8mb4" # 腾讯云短信配置 TENCENT_SECRET_ID: str = "AKIDxnbGj281iHtKallqqzvlV5YxBCrPltnS" TENCENT_SECRET_KEY: str = "ta6PXTMBsX7dzA7IN6uYUFn8F9uTovoU" TENCENT_REGION: str = "ap-guangzhou" # 接口地域 SMS_SDK_APP_ID: str = "1400961527" SMS_SIGN_NAME: str = "成都爱嘉辰科技" SMS_TEMPLATE_ID: str = "2353143" # 验证码短信模板ID SMS_TEMPLATE_ID_ADDITIONAL_FEE: str = "2375181" # 加价短信模板ID SMS_TEMPLATE_ID_ORDER_COMPLETE: str = "2382882" # 订单完成短信模板ID # 腾讯云 COS 配置 COS_REGION: str = "ap-chengdu" COS_BUCKET: str = "dman-1311994147" COS_BASE_URL: str = "dman-1311994147.cos.ap-chengdu.myqcloud.com" # 注册赠券配置 REGISTER_COUPONS: list = [ {"coupon_id": 1, "count": 3, "expire_days": 15}, ] # 小程序 & 微信支付配置 WECHAT_APPID: str = "wx3cc5b7dcb28f2756" WECHAT_SECRET: str = "fdf03e0ff428097c2a264da50b7d804e" WECHAT_MCH_ID: str = "1705259837" WECHAT_PRIVATE_KEY_PATH: str = "app/cert/apiclient_key.pem" WECHAT_CERT_SERIAL_NO: str = "5958C6605B4651122EC364831A3011C047EE549C" WECHAT_API_V3_KEY: str = "OAhAqXqebeT4ZC9VTYFkSWU0CENEahx5" # API v3密钥 WECHAT_PLATFORM_CERT_PATH: str = "app/cert/platform_key.pem" # 平台证书路径 # 企业微信配置 WECHAT_CORP_ID: str = "ww0e3897ec32009e20" WECHAT_CORP_SECRET: str = "qh38-OlDnJPTENjOfZegVVv5ePhlhKhrzGPzNOixWQo" WECHAT_CORP_TOKEN: str = "5zEDkbGNPbBoh" WECHAT_CORP_ENCODING_AES_KEY: str = "VTFtnosOeX7cdnRDBBCE0JTC5s7W7iFP8o86Oowo2w8" #WECHAT_CORP_AGENT_SECRET: str = "66666666666666666666666666666666" # 公众号配置 MP_APPID: str = "wxa9db2cc7868dfefd" MP_SECRET: str = "3eed9a717654d6460ba9afda3b0f6be2" MP_TOKEN: str = "yORAT7RL9I3sux7uc4PbMEEHT1xowc6H" # 用于验证服务器配置 MP_AES_KEY: str = "XDc2mG1tWNikTithcSy66oD3fP5XXFasSeRk6ulicye" # 用于解密消息 # 微信模板消息ID #配送订单创建成功 DELIVERY_ORDER_CREATED_TEMPLATE_ID: str = "N8sMeoBG6biUjWO1PbxBol6akEI6O9isSvCiB1MlVuY" #配送订单接单 DELIVERY_ORDER_RECEIVED_TEMPLATE_ID: str = "djZ8sseKX70bAKtzIfp2MFaZG60_PHDjLRxokiw0TJQ" #配送订单完成 DELIVERY_ORDER_COMPLETED_TEMPLATE_ID: str = "eR7UlBRWRXEuQdVNNU6AB0MkkRwMKyUspBLyK7bFYyI" #配送订单取消 DELIVERY_ORDER_CANCELLED_TEMPLATE_ID: str = "iGR0rPtOFC_u8Xj5-R730zoDD_4Kbswkf_jSTnSSd6E" # 加价请求 ADDITIONAL_FEE_REQUEST_TEMPLATE_ID: str = "oGOuil8q1vSXiIyzJ14ExSOSptVgE4A-b7WSmmGqiRw" # 商家订单创建成功 MERCHANT_ORDER_CREATED_TEMPLATE_ID: str = "tyB7fncVCdEyNNCm-XUUWQgDmGnnGT_WORPbHsc_89k" # 商家订单接单 MERCHANT_ORDER_ACCEPTED_TEMPLATE_ID: str = "600F3pDnYqrMdjlfR-TPyzWtD3UBt0WHq-oHttnaBPs" # 商家订单完成 MERCHANT_ORDER_COMPLETED_TEMPLATE_ID: str = "TWcSEUAPInnctf4Jm-2JTHHMzvIWqkybkUS3drE8Jg4" # 反馈需求企业微信 FEEDBACK_NEED_WECOM_BOT_WEBHOOK_URL: str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ccd6e8d4-4c8a-45b4-9b6b-dd4cae563176" # 商家投诉企业微信 MERCHANT_COMPLAINT_WECOM_BOT_WEBHOOK_URL: str = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=3cd49671-0481-479b-84f0-ada09b8488df" # DeepSeek 相关配置 DEEPSEEK_API_KEY: str = "sk-9f6b56f08796435d988cf202e37f6ee3" DEEPSEEK_API_URL: str = "https://api.deepseek.com/v1/chat/completions" # 千问 API 配置 QWEN_API_KEY: str = "sk-caa199589f1c451aaac471fad2986e28" QWEN_API_URL: str = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" # UniSMS 配置 UNISMS_ACCESS_KEY_ID: str = "xxxxxx" # 替换为您的 UniSMS Access Key ID UNISMS_ACCESS_KEY_SECRET: str = "xxxxxx" # 替换为您的 UniSMS Access Key Secret UNISMS_SIGNATURE: str = "蜂快到家" # 短信签名 UNISMS_VERIFICATION_TEMPLATE_ID: str = "pub_verif_8dgk" # 验证码短信模板ID class Config: case_sensitive = True env_file = ".env" extra = "allow" # 允许额外的环境变量 class DevSettings(Settings): DEBUG: bool = True # 开发模式标志 API_V1_STR: str = "/api/v1" PROJECT_NAME: str = "FastAPI 项目 (测试环境)" ENV_NAME: str = "测试环境" PLATFORM_USER_ID: int = 9 API_BASE_URL: str = "https://api-dev.beefast.co" # 数据库配置 MYSQL_HOST: str = "gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com" MYSQL_PORT: int = 27469 MYSQL_USER: str = "root" MYSQL_PASSWORD: str = "Aa#223388" MYSQL_DB: str = "beefast" #Redis REDIS_HOST: str = "101.36.120.145" REDIS_PORT: int = 6379 REDIS_DB: int = 0 REDIS_PASSWORD: str = "redis_rJRMHr" VERIFICATION_CODE_EXPIRE_SECONDS: int = 300 # 验证码5分钟后过期 class Config: env_file = ".env.dev" class ProdSettings(Settings): DEBUG: bool = False # 生产模式标志 API_V1_STR: str = "/api/v1" PROJECT_NAME: str = "FastAPI 项目 (生产环境)" ENV_NAME: str = "生产环境" API_BASE_URL: str = "https://api.beefast.co" PLATFORM_USER_ID: int = 45 # 数据库配置 MYSQL_HOST: str = "cd-cynosdbmysql-grp-7kdd8qe4.sql.tencentcdb.com" MYSQL_PORT: int = 26558 MYSQL_USER: str = "root" MYSQL_PASSWORD: str = "gUjjmQpu6c7V0hMF" MYSQL_DB: str = "beefast" #Redis REDIS_HOST: str = "129.28.101.211" REDIS_PORT: int = 6379 REDIS_DB: int = 0 REDIS_PASSWORD: str = "redis_tjcZif" VERIFICATION_CODE_EXPIRE_SECONDS: int = 300 class Config: env_file = ".env.prod" @lru_cache() def get_settings() -> BaseSettings: """ 获取配置实例 使用环境变量 APP_ENV 来决定使用哪个配置 """ env = os.getenv("APP_ENV", "dev").lower() config_map = { "dev": DevSettings, "prod": ProdSettings } config_class = config_map.get(env, DevSettings) return config_class() # 导出配置实例 settings = get_settings()