新增群聊/私信与公共 WebSocket 总线,站长用户内容档案,并将通知与待审角标改为推送驱动;同步精简管理仪表盘并修复主题换肤 DOM 冲突。 Co-authored-by: Cursor <cursoragent@cursor.com>
53 lines
1.5 KiB
Go
53 lines
1.5 KiB
Go
package handler
|
||
|
||
import (
|
||
"errors"
|
||
"net/http"
|
||
"strings"
|
||
|
||
"github.com/freefire/jiang13-bbs/realtime"
|
||
"github.com/freefire/jiang13-bbs/service"
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// PublicSettings 公开站点设置(无需登录):前端 SSR 据此注入主题 CSS 变量
|
||
// GET /api/settings
|
||
func (h *Handlers) PublicSettings(c *gin.Context) {
|
||
accent, err := h.Setting.AccentColor()
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{"error": "获取站点设置失败"})
|
||
return
|
||
}
|
||
c.JSON(http.StatusOK, gin.H{"accent": accent})
|
||
}
|
||
|
||
type updateSettingsRequest struct {
|
||
// Accent 主题色 #RRGGBB;空串恢复默认
|
||
Accent string `json:"accent"`
|
||
}
|
||
|
||
// UpdateSettings 更新站点设置(管理员)
|
||
// PUT /api/admin/settings
|
||
func (h *Handlers) UpdateSettings(c *gin.Context) {
|
||
var req updateSettingsRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{"error": "请求参数无效"})
|
||
return
|
||
}
|
||
if err := h.Setting.SetAccent(req.Accent); err != nil {
|
||
if errors.Is(err, service.ErrInvalidAccent) {
|
||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||
return
|
||
}
|
||
c.JSON(http.StatusInternalServerError, gin.H{"error": "保存站点设置失败"})
|
||
return
|
||
}
|
||
// 归一化后的值实时广播:所有在线客户端立即热换肤,无需 F5 或等轮询
|
||
saved := strings.ToLower(strings.TrimSpace(req.Accent))
|
||
h.Hub.BroadcastAll(realtime.Envelope{
|
||
Type: realtime.EventSettingsChanged,
|
||
Data: map[string]string{"accent": saved},
|
||
})
|
||
c.JSON(http.StatusOK, gin.H{"ok": true, "accent": saved})
|
||
}
|