Files
nanocode/personal-blog/backend/routers/settings.py
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

156 lines
4.4 KiB
Python

"""
博客设置路由
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from database import get_db
from models import Setting, Page
from schemas import SettingUpdate, SettingResponse, PageCreate, PageUpdate, PageResponse
from routers.auth import get_current_admin
from typing import List
router = APIRouter(prefix="/api", tags=["设置"])
def get_or_create_settings(db: Session):
"""获取或创建设置"""
setting = db.query(Setting).first()
if not setting:
setting = Setting()
db.add(setting)
db.commit()
db.refresh(setting)
return setting
@router.get("/settings", response_model=SettingResponse)
def get_settings(db: Session = Depends(get_db)):
"""获取博客设置"""
setting = get_or_create_settings(db)
return setting
@router.get("/settings/public")
def get_settings_public(db: Session = Depends(get_db)):
"""公开获取博客设置(仅返回前端展示所需字段)"""
setting = get_or_create_settings(db)
import json
try:
colors = json.loads(setting.theme_colors) if setting.theme_colors else {}
except Exception:
colors = {}
return {
"blog_name": setting.blog_name,
"blog_description": setting.blog_description,
"welcome_message": setting.welcome_message,
"blog_logo": setting.blog_logo,
"banner_image": setting.banner_image,
"banner_type": setting.banner_type,
"banner_images": setting.banner_images,
"theme": setting.theme,
"layout": setting.layout,
"theme_colors": colors,
}
@router.put("/settings", response_model=SettingResponse)
def update_settings(
setting_data: SettingUpdate,
current_admin=Depends(get_current_admin),
db: Session = Depends(get_db)
):
"""更新博客设置"""
setting = get_or_create_settings(db)
update_data = setting_data.dict(exclude_unset=True)
for field, value in update_data.items():
setattr(setting, field, value)
db.commit()
db.refresh(setting)
return setting
# ==================== 自定义页面管理 ====================
@router.get("/pages", response_model=List[PageResponse])
def get_pages(db: Session = Depends(get_db)):
"""获取所有自定义页面"""
pages = db.query(Page).order_by(Page.nav_order.asc(), Page.created_at.desc()).all()
return pages
@router.get("/pages/{slug}", response_model=PageResponse)
def get_page_by_slug(slug: str, db: Session = Depends(get_db)):
"""通过slug获取页面"""
page = db.query(Page).filter(Page.slug == slug).first()
if not page:
raise HTTPException(status_code=404, detail="页面不存在")
return page
@router.post("/pages", response_model=PageResponse)
def create_page(
page_data: PageCreate,
current_admin=Depends(get_current_admin),
db: Session = Depends(get_db)
):
"""创建自定义页面"""
# 检查数量限制
count = db.query(Page).count()
if count >= 5:
raise HTTPException(status_code=400, detail="自定义页面数量已达上限(5个)")
# 检查slug重复
existing = db.query(Page).filter(Page.slug == page_data.slug).first()
if existing:
raise HTTPException(status_code=400, detail="页面标识已存在")
page = Page(**page_data.dict())
db.add(page)
db.commit()
db.refresh(page)
return page
@router.put("/pages/{page_id}", response_model=PageResponse)
def update_page(
page_id: int,
page_data: PageUpdate,
current_admin=Depends(get_current_admin),
db: Session = Depends(get_db)
):
"""更新自定义页面"""
page = db.query(Page).filter(Page.id == page_id).first()
if not page:
raise HTTPException(status_code=404, detail="页面不存在")
update_data = page_data.dict(exclude_unset=True)
for field, value in update_data.items():
setattr(page, field, value)
db.commit()
db.refresh(page)
return page
@router.delete("/pages/{page_id}")
def delete_page(
page_id: int,
current_admin=Depends(get_current_admin),
db: Session = Depends(get_db)
):
"""删除自定义页面"""
page = db.query(Page).filter(Page.id == page_id).first()
if not page:
raise HTTPException(status_code=404, detail="页面不存在")
db.delete(page)
db.commit()
return {"message": "页面已删除"}