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": "删除成功"}) }