美化排版前端管理后台
This commit is contained in:
@@ -22,6 +22,36 @@ func NewAdminHandler(store *storage.ProductStore, cfg *config.Config, siteStore
|
||||
return &AdminHandler{store: store, cfg: cfg, siteStore: siteStore, orderStore: orderStore, chatStore: chatStore}
|
||||
}
|
||||
|
||||
// GetAnnouncement 公开获取公告内容。
|
||||
func (h *AdminHandler) GetAnnouncement(c *gin.Context) {
|
||||
ann, err := h.siteStore.GetAnnouncement()
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
c.JSON(http.StatusOK, gin.H{"data": ann})
|
||||
}
|
||||
|
||||
// SetAnnouncement 管理员更新公告内容。
|
||||
func (h *AdminHandler) SetAnnouncement(c *gin.Context) {
|
||||
if !h.requireAdmin(c) {
|
||||
return
|
||||
}
|
||||
var payload struct {
|
||||
Content string `json:"content"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&payload); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid body"})
|
||||
return
|
||||
}
|
||||
if err := h.siteStore.SetAnnouncement(payload.Content); err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
ann, _ := h.siteStore.GetAnnouncement()
|
||||
c.JSON(http.StatusOK, gin.H{"data": ann})
|
||||
}
|
||||
|
||||
// requireAdmin 校验管理员令牌。
|
||||
// 优先级:X-Admin-Token 请求头 > Authorization 请求头 > ?token 查询参数(旧版兼容)。
|
||||
func (h *AdminHandler) requireAdmin(c *gin.Context) bool {
|
||||
|
||||
@@ -2,6 +2,7 @@ package storage
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
@@ -9,6 +10,28 @@ import (
|
||||
"mengyastore-backend/internal/database"
|
||||
)
|
||||
|
||||
type Announcement struct {
|
||||
Content string `json:"content"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
func (s *SiteStore) GetAnnouncement() (Announcement, error) {
|
||||
content, err := s.get("announcementContent")
|
||||
if err != nil {
|
||||
return Announcement{}, err
|
||||
}
|
||||
version, _ := s.get("announcementVersion")
|
||||
return Announcement{Content: content, Version: version}, nil
|
||||
}
|
||||
|
||||
func (s *SiteStore) SetAnnouncement(content string) error {
|
||||
version := strconv.FormatInt(time.Now().UnixMilli(), 10)
|
||||
if err := s.set("announcementContent", content); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.set("announcementVersion", version)
|
||||
}
|
||||
|
||||
type SiteStore struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
@@ -241,6 +241,7 @@ func main() {
|
||||
statusHandler := handlers.NewSystemStatusHandler(cfg, db, mqClient, startedAt)
|
||||
|
||||
// 公开路由
|
||||
r.GET("/api/announcement", adminHandler.GetAnnouncement)
|
||||
r.GET("/api/products", publicHandler.ListProducts)
|
||||
r.POST("/api/checkout", orderHandler.CreateOrder)
|
||||
r.GET("/api/orders/:id/payment-status", orderHandler.GetOrderPaymentStatus)
|
||||
@@ -260,6 +261,7 @@ func main() {
|
||||
r.PUT("/api/admin/products/:id", adminHandler.UpdateProduct)
|
||||
r.PATCH("/api/admin/products/:id/status", adminHandler.ToggleProduct)
|
||||
r.DELETE("/api/admin/products/:id", adminHandler.DeleteProduct)
|
||||
r.PUT("/api/admin/announcement", adminHandler.SetAnnouncement)
|
||||
r.POST("/api/admin/site/maintenance", adminHandler.SetMaintenance)
|
||||
r.GET("/api/admin/site/smtp", adminHandler.GetSMTPConfig)
|
||||
r.POST("/api/admin/site/smtp", adminHandler.SetSMTPConfig)
|
||||
|
||||
Reference in New Issue
Block a user