Files
go_typecho/handlers/page.go

146 lines
3.1 KiB
Go
Raw Normal View History

2026-02-13 10:53:54 +08:00
package handlers
import (
"net/http"
"strconv"
"goblog/database"
"goblog/models"
"github.com/gin-gonic/gin"
)
// 获取页面列表
func GetPages(c *gin.Context) {
var pages []models.Page
database.DB.Where("status = ?", "published").Order("`order` ASC").Find(&pages)
c.JSON(http.StatusOK, gin.H{"data": pages})
}
// 获取单个页面
func GetPage(c *gin.Context) {
id := c.Param("id")
var page models.Page
query := database.DB
if _, err := strconv.Atoi(id); err == nil {
query = query.Where("id = ?", id)
} else {
query = query.Where("slug = ?", id)
}
// 非管理员只能查看已发布页面
if !isAdmin(c) {
query = query.Where("status = ?", "published")
}
if err := query.First(&page).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "页面不存在"})
return
}
c.JSON(http.StatusOK, gin.H{"data": page})
}
// 创建页面
func CreatePage(c *gin.Context) {
var req struct {
Title string `json:"title" binding:"required"`
Slug string `json:"slug"`
Content string `json:"content" binding:"required"`
Status string `json:"status"`
Order int `json:"order"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
userID, _ := c.Get("userID")
slug := req.Slug
if slug == "" {
slug = generateSlug(req.Title)
}
page := models.Page{
Title: req.Title,
Slug: slug,
Content: req.Content,
AuthorID: userID.(uint),
Status: req.Status,
Order: req.Order,
}
if err := database.DB.Create(&page).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "创建页面失败"})
return
}
c.JSON(http.StatusCreated, gin.H{"data": page})
}
// 更新页面
func UpdatePage(c *gin.Context) {
id := c.Param("id")
var page models.Page
if err := database.DB.First(&page, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "页面不存在"})
return
}
var req struct {
Title string `json:"title"`
Slug string `json:"slug"`
Content string `json:"content"`
Status string `json:"status"`
Order int `json:"order"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
updates := map[string]interface{}{}
if req.Title != "" {
updates["title"] = req.Title
}
if req.Slug != "" {
updates["slug"] = req.Slug
}
if req.Content != "" {
updates["content"] = req.Content
}
if req.Status != "" {
updates["status"] = req.Status
}
updates["order"] = req.Order
if err := database.DB.Model(&page).Updates(updates).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "更新页面失败"})
return
}
c.JSON(http.StatusOK, gin.H{"data": page})
}
// 删除页面
func DeletePage(c *gin.Context) {
id := c.Param("id")
var page models.Page
if err := database.DB.First(&page, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "页面不存在"})
return
}
if err := database.DB.Delete(&page).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "删除页面失败"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}