146 lines
3.1 KiB
Go
146 lines
3.1 KiB
Go
|
|
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": "删除成功"})
|
||
|
|
}
|