移动端拍照上传、奥数区、学段约束解题与 AI 模型配置。

- 手机/平板响应式布局,支持拍照与相册上传

- 学生详情新增奥数区,按初/高中学段生成解法并禁止超纲

- 系统设置可配置 Ollama 或 OpenAI 兼容 API

- 更新 frontend/dist 与使用说明
This commit is contained in:
dekun
2026-06-28 13:39:54 +08:00
parent 4375ea491e
commit 43483bf56f
26 changed files with 1193 additions and 592 deletions
+28 -2
View File
@@ -13,6 +13,7 @@ from app.schemas import (
AdminUserCreate,
AdminUserOut,
AdminUserPasswordUpdate,
AIProviderEnum,
PublicSettingsOut,
SystemSettingsOut,
SystemSettingsUpdate,
@@ -21,6 +22,19 @@ from app.schemas import (
router = APIRouter(prefix="/admin", tags=["admin"])
def settings_to_out(row: SystemSettings) -> SystemSettingsOut:
return SystemSettingsOut(
registration_enabled=row.registration_enabled,
ai_provider=AIProviderEnum(row.ai_provider or "ollama"),
ollama_base_url=row.ollama_base_url,
ollama_model=row.ollama_model,
openai_base_url=row.openai_base_url,
openai_model=row.openai_model,
openai_api_key_set=bool(row.openai_api_key),
updated_at=row.updated_at,
)
def get_or_create_settings(db: Session) -> SystemSettings:
row = db.get(SystemSettings, 1)
if row is None:
@@ -36,7 +50,7 @@ def get_settings(
db: Session = Depends(get_db),
_: User = Depends(get_superuser),
):
return get_or_create_settings(db)
return settings_to_out(get_or_create_settings(db))
@router.patch("/settings", response_model=SystemSettingsOut)
@@ -48,10 +62,22 @@ def update_settings(
row = get_or_create_settings(db)
if data.registration_enabled is not None:
row.registration_enabled = data.registration_enabled
if data.ai_provider is not None:
row.ai_provider = data.ai_provider.value
if data.ollama_base_url is not None:
row.ollama_base_url = data.ollama_base_url or None
if data.ollama_model is not None:
row.ollama_model = data.ollama_model or None
if data.openai_base_url is not None:
row.openai_base_url = data.openai_base_url or None
if data.openai_model is not None:
row.openai_model = data.openai_model or None
if data.openai_api_key is not None and data.openai_api_key.strip():
row.openai_api_key = data.openai_api_key.strip()
row.updated_at = datetime.now(timezone.utc)
db.commit()
db.refresh(row)
return row
return settings_to_out(row)
@router.patch("/profile", response_model=AdminUserOut)