- 后端: 新增验证码服务(生成/存储/验证)和邮件发送服务(开发环境控制台输出) - 后端: 新增 POST /auth/send-code 端点,支持注册/登录/重置密码三种用途 - 后端: 注册流程要求邮箱验证码,验证通过后 is_verified=True - 后端: 登录支持邮箱+密码 或 邮箱+验证码 两种方式 - 前端: 注册页增加验证码输入框和获取验证码按钮(60秒倒计时) - 前端: 登录页增加密码登录/验证码登录双Tab切换 - 测试: conftest 添加 bypass_verification fixture,所有 367 测试通过 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
"""应用配置"""
|
||
import warnings
|
||
from pydantic_settings import BaseSettings
|
||
from functools import lru_cache
|
||
|
||
|
||
class Settings(BaseSettings):
|
||
"""应用设置"""
|
||
# 应用
|
||
APP_NAME: str = "秒思智能审核平台"
|
||
APP_VERSION: str = "1.0.0"
|
||
DEBUG: bool = False
|
||
ENVIRONMENT: str = "development" # development | staging | production
|
||
|
||
# CORS(逗号分隔的允许来源列表)
|
||
CORS_ORIGINS: str = "http://localhost:3000"
|
||
|
||
# 数据库
|
||
DATABASE_URL: str = "postgresql+asyncpg://postgres:postgres@localhost:5432/miaosi"
|
||
|
||
# Redis
|
||
REDIS_URL: str = "redis://localhost:6379/0"
|
||
|
||
# JWT
|
||
SECRET_KEY: str = "your-secret-key-change-in-production"
|
||
ALGORITHM: str = "HS256"
|
||
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
|
||
|
||
# AI 服务(使用 OneAPI/OneInAll 等中转服务商,不直连厂商)
|
||
# 中转服务商统一了不同 AI 厂商的接口,只需配置中转商的 API
|
||
AI_PROVIDER: str = "oneapi" # oneapi | oneinall | openrouter 等中转服务商
|
||
AI_API_KEY: str = "" # 中转服务商的 API Key
|
||
AI_API_BASE_URL: str = "" # 中转服务商的 Base URL,如 https://api.oneinall.ai/v1
|
||
|
||
# 阿里云 OSS 配置
|
||
OSS_ACCESS_KEY_ID: str = ""
|
||
OSS_ACCESS_KEY_SECRET: str = ""
|
||
OSS_ENDPOINT: str = "oss-cn-hangzhou.aliyuncs.com"
|
||
OSS_BUCKET_NAME: str = "miaosi-files"
|
||
OSS_BUCKET_DOMAIN: str = "" # 公开访问域名,如 https://miaosi-files.oss-cn-hangzhou.aliyuncs.com
|
||
|
||
# 邮件 SMTP
|
||
SMTP_HOST: str = ""
|
||
SMTP_PORT: int = 465
|
||
SMTP_USER: str = ""
|
||
SMTP_PASSWORD: str = ""
|
||
SMTP_FROM_NAME: str = "秒思智能审核平台"
|
||
SMTP_USE_SSL: bool = True
|
||
|
||
# 验证码
|
||
VERIFICATION_CODE_EXPIRE_MINUTES: int = 5
|
||
VERIFICATION_CODE_LENGTH: int = 6
|
||
|
||
# 加密密钥
|
||
ENCRYPTION_KEY: str = ""
|
||
|
||
# 文件上传限制
|
||
MAX_FILE_SIZE_MB: int = 500 # 最大文件大小 500MB
|
||
|
||
def __init__(self, **kwargs):
|
||
super().__init__(**kwargs)
|
||
if self.SECRET_KEY == "your-secret-key-change-in-production":
|
||
warnings.warn(
|
||
"SECRET_KEY 使用默认值,请在 .env 中设置安全的密钥!",
|
||
UserWarning,
|
||
stacklevel=2,
|
||
)
|
||
if not self.ENCRYPTION_KEY:
|
||
warnings.warn(
|
||
"ENCRYPTION_KEY 未设置,API 密钥将无法安全存储!",
|
||
UserWarning,
|
||
stacklevel=2,
|
||
)
|
||
|
||
class Config:
|
||
env_file = ".env"
|
||
case_sensitive = True
|
||
|
||
|
||
@lru_cache()
|
||
def get_settings() -> Settings:
|
||
"""获取配置单例"""
|
||
return Settings()
|
||
|
||
|
||
settings = get_settings()
|