Files
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

185 lines
5.8 KiB
Python

# app/routers/home_modules.py
import json
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from sqlalchemy.orm import Session
from app.database import get_db
from app.models.home_module import HomeModule
from app.models.admin import Admin
from app.auth import get_current_admin
router = APIRouter()
# Schemas
class ModuleContent(BaseModel):
pass
class ModuleStyleConfig(BaseModel):
pass
class ModuleUpdate(BaseModel):
title: Optional[str] = None
subtitle: Optional[str] = None
content: Optional[dict] = None
style_config: Optional[dict] = None
is_enabled: Optional[bool] = None
sort_order: Optional[int] = None
class ModuleSortItem(BaseModel):
id: int
sort_order: int
class ModuleSortRequest(BaseModel):
orders: List[ModuleSortItem]
class ModuleResponse(BaseModel):
code: int = 200
data: dict | list = None
# Helper functions
def module_to_dict(module: HomeModule) -> dict:
return {
"id": module.id,
"name": module.name,
"code": module.code,
"type": module.type,
"sort_order": module.sort_order,
"is_enabled": module.is_enabled,
"is_fixed": module.is_fixed,
"title": module.title,
"subtitle": module.subtitle,
"content": json.loads(module.content) if module.content else {},
"style_config": json.loads(module.style_config) if module.style_config else {}
}
# Public routes
@router.get("/home/modules", response_model=ModuleResponse)
def get_public_modules(db: Session = Depends(get_db)):
"""Get all enabled home modules for public display"""
modules = db.query(HomeModule).filter(
HomeModule.is_enabled == True
).order_by(HomeModule.sort_order.asc()).all()
return ModuleResponse(data=[module_to_dict(m) for m in modules])
# Admin routes
@router.get("/admin/home/modules", response_model=ModuleResponse)
def get_admin_modules(
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""Get all home modules for admin management"""
modules = db.query(HomeModule).order_by(HomeModule.sort_order.asc()).all()
# Auto-create missing default modules
existing_types = {m.type for m in modules}
if 'experts' not in existing_types:
expert_module = HomeModule(
name="专家团队",
code="experts",
type="experts",
sort_order=7,
is_enabled=True,
is_fixed=False,
title="专家团队",
content=json.dumps({"view_more_link": ""}),
style_config=json.dumps({"backgroundColor": "#ffffff"})
)
db.add(expert_module)
db.commit()
db.refresh(expert_module)
modules = db.query(HomeModule).order_by(HomeModule.sort_order.asc()).all()
return ModuleResponse(data=[module_to_dict(m) for m in modules])
@router.get("/admin/home/modules/{module_id}", response_model=ModuleResponse)
def get_module_detail(
module_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""Get single module detail"""
module = db.query(HomeModule).filter(HomeModule.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Module not found")
return ModuleResponse(data=module_to_dict(module))
@router.put("/admin/home/modules/{module_id}", response_model=ModuleResponse)
def update_module(
module_id: int,
request: ModuleUpdate,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""Update module content and settings"""
module = db.query(HomeModule).filter(HomeModule.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Module not found")
if request.title is not None:
module.title = request.title
if request.subtitle is not None:
module.subtitle = request.subtitle
if request.content is not None:
module.content = json.dumps(request.content, ensure_ascii=False)
if request.style_config is not None:
module.style_config = json.dumps(request.style_config, ensure_ascii=False)
if request.is_enabled is not None:
module.is_enabled = request.is_enabled
if request.sort_order is not None:
module.sort_order = request.sort_order
db.commit()
db.refresh(module)
return ModuleResponse(message="更新成功", data=module_to_dict(module))
@router.put("/admin/home/modules/sort", response_model=ModuleResponse)
def update_module_sort(
request: ModuleSortRequest,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""Batch update module sort order"""
for item in request.orders:
module = db.query(HomeModule).filter(HomeModule.id == item.id).first()
if module:
module.sort_order = item.sort_order
db.commit()
return ModuleResponse(message="排序更新成功")
@router.put("/admin/home/modules/{module_id}/toggle", response_model=ModuleResponse)
def toggle_module(
module_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""Toggle module enabled status"""
module = db.query(HomeModule).filter(HomeModule.id == module_id).first()
if not module:
raise HTTPException(status_code=404, detail="Module not found")
module.is_enabled = not module.is_enabled
db.commit()
return ModuleResponse(
message="状态更新成功",
data={"id": module.id, "is_enabled": module.is_enabled}
)