1. 课程学习进度追踪
- 新增 UserCourseProgress 和 UserMaterialProgress 模型
- 新增 /api/v1/progress/* 进度追踪 API
- 更新 admin.py 使用真实课程完成率数据
2. 路由权限检查完善
- 新增前端 permissionChecker.ts 权限检查工具
- 更新 router/guard.ts 实现团队和课程权限验证
- 新增后端 permission_service.py
3. AI 陪练音频转文本
- 新增 speech_recognition.py 语音识别服务
- 新增 /api/v1/speech/* API
- 更新 ai-practice-coze.vue 支持语音输入
4. 双人对练报告生成
- 更新 practice_room_service.py 添加报告生成功能
- 新增 /rooms/{room_code}/report API
- 更新 duo-practice-report.vue 调用真实 API
5. 学习提醒推送
- 新增 notification_service.py 通知服务
- 新增 scheduler_service.py 定时任务服务
- 支持钉钉、企微、站内消息推送
6. 智能学习推荐
- 新增 recommendation_service.py 推荐服务
- 新增 /api/v1/recommendations/* API
- 支持错题、能力、进度、热门多维度推荐
7. 安全问题修复
- DEBUG 默认值改为 False
- 添加 SECRET_KEY 安全警告
- 新增 check_security_settings() 检查函数
8. 证书 PDF 生成
- 更新 certificate_service.py 添加 PDF 生成
- 添加 weasyprint、Pillow、qrcode 依赖
- 更新下载 API 支持 PDF 和 PNG 格式
This commit is contained in:
@@ -23,7 +23,9 @@ class Settings(BaseSettings):
|
||||
# 应用基础配置
|
||||
APP_NAME: str = "KaoPeiLian"
|
||||
APP_VERSION: str = "1.0.0"
|
||||
DEBUG: bool = Field(default=True)
|
||||
# DEBUG 模式:生产环境必须设置为 False
|
||||
# 通过环境变量 DEBUG=false 或在 .env 文件中设置
|
||||
DEBUG: bool = Field(default=False, description="调试模式,生产环境必须设置为 False")
|
||||
|
||||
# 租户配置(用于多租户部署)
|
||||
TENANT_CODE: str = Field(default="demo", description="租户编码,如 hua, yy, hl")
|
||||
@@ -56,7 +58,12 @@ class Settings(BaseSettings):
|
||||
REDIS_URL: str = Field(default="redis://localhost:6379/0")
|
||||
|
||||
# JWT配置
|
||||
SECRET_KEY: str = Field(default="your-secret-key-here")
|
||||
# 安全警告:必须在生产环境设置 SECRET_KEY 环境变量
|
||||
# 可以使用命令生成:python -c "import secrets; print(secrets.token_urlsafe(32))"
|
||||
SECRET_KEY: str = Field(
|
||||
default="INSECURE-DEFAULT-KEY-CHANGE-IN-PRODUCTION",
|
||||
description="JWT 密钥,生产环境必须通过环境变量设置安全的随机密钥"
|
||||
)
|
||||
ALGORITHM: str = Field(default="HS256")
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES: int = Field(default=30)
|
||||
REFRESH_TOKEN_EXPIRE_DAYS: int = Field(default=7)
|
||||
@@ -165,6 +172,57 @@ def get_settings() -> Settings:
|
||||
settings = get_settings()
|
||||
|
||||
|
||||
def check_security_settings() -> list[str]:
|
||||
"""
|
||||
检查安全配置
|
||||
|
||||
返回安全警告列表,生产环境应确保列表为空
|
||||
"""
|
||||
warnings = []
|
||||
|
||||
# 检查 DEBUG 模式
|
||||
if settings.DEBUG:
|
||||
warnings.append(
|
||||
"⚠️ DEBUG 模式已开启。生产环境请设置 DEBUG=false"
|
||||
)
|
||||
|
||||
# 检查 SECRET_KEY
|
||||
if settings.SECRET_KEY == "INSECURE-DEFAULT-KEY-CHANGE-IN-PRODUCTION":
|
||||
warnings.append(
|
||||
"⚠️ 使用默认 SECRET_KEY 不安全。生产环境请设置安全的 SECRET_KEY 环境变量。"
|
||||
"生成命令:python -c \"import secrets; print(secrets.token_urlsafe(32))\""
|
||||
)
|
||||
elif len(settings.SECRET_KEY) < 32:
|
||||
warnings.append(
|
||||
"⚠️ SECRET_KEY 长度不足 32 字符,安全性较弱"
|
||||
)
|
||||
|
||||
# 检查数据库密码
|
||||
if settings.MYSQL_PASSWORD in ["password", "123456", "root", ""]:
|
||||
warnings.append(
|
||||
"⚠️ 数据库密码不安全,请使用强密码"
|
||||
)
|
||||
|
||||
return warnings
|
||||
|
||||
|
||||
def print_security_warnings():
|
||||
"""打印安全警告(应用启动时调用)"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
warnings = check_security_settings()
|
||||
|
||||
if warnings:
|
||||
logger.warning("=" * 60)
|
||||
logger.warning("安全配置警告:")
|
||||
for warning in warnings:
|
||||
logger.warning(warning)
|
||||
logger.warning("=" * 60)
|
||||
else:
|
||||
logger.info("✅ 安全配置检查通过")
|
||||
|
||||
|
||||
# ============================================
|
||||
# 动态配置获取(支持从数据库读取)
|
||||
# ============================================
|
||||
|
||||
Reference in New Issue
Block a user