feat(banner): 首页常驻滚动通知与管理配置及类型样式支持

This commit is contained in:
✨await
2026-09-17 23:17:09 +08:00
parent 772c551989
commit a3b6761ba9
34 changed files with 3345 additions and 10 deletions

View File

@@ -10,6 +10,14 @@ import (
)
func RegisterAnnouncementRoutes(r *gin.RouterGroup, svc *service.Service) {
r.GET("/banner-announcements", func(c *gin.Context) {
banners, err := svc.ActiveBannerAnnouncements()
if err != nil {
failService(c, err)
return
}
ok(c, gin.H{"banners": banners})
})
r.GET("/announcements", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
@@ -177,4 +185,79 @@ func RegisterAnnouncementRoutes(r *gin.RouterGroup, svc *service.Service) {
}
ok(c, gin.H{"announcement": announcement})
})
r.GET("/admin/banner-announcements", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
page, limit, err := parsePaginationQuery(c, 20)
if err != nil {
fail(c, http.StatusBadRequest, err)
return
}
banners, err := svc.AdminBannerAnnouncementPage(user, service.AdminListQuery{
Keyword: c.Query("keyword"),
Status: c.Query("status"),
Page: page,
Limit: limit,
})
if err != nil {
failService(c, err)
return
}
ok(c, banners)
})
r.POST("/admin/banner-announcements", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
var req service.CreateBannerAnnouncementRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
banner, err := svc.CreateBannerAnnouncement(user, req)
if err != nil {
failService(c, err)
return
}
ok(c, gin.H{"banner": banner})
})
r.PUT("/admin/banner-announcements/:id", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
var req service.UpdateBannerAnnouncementRequest
if err := c.ShouldBindJSON(&req); err != nil {
fail(c, http.StatusBadRequest, err)
return
}
banner, err := svc.UpdateBannerAnnouncement(user, c.Param("id"), req)
if err != nil {
failService(c, err)
return
}
ok(c, gin.H{"banner": banner})
})
r.DELETE("/admin/banner-announcements/:id", func(c *gin.Context) {
user, err := currentUser(c, svc)
if err != nil {
failService(c, err)
return
}
if err := svc.DeleteBannerAnnouncement(user, c.Param("id")); err != nil {
failService(c, err)
return
}
ok(c, gin.H{"ok": true})
})
}

View File

@@ -884,7 +884,7 @@ func shortSystemProxyPath(rawPath string) (string, string, bool) {
// as a channel request when a business route returns 404.
func isReservedAPIPathPrefix(value string) bool {
switch strings.ToLower(strings.TrimSpace(value)) {
case "admin", "agent", "ai", "announcements", "assets", "auth", "canvas-projects", "channels", "diagnostics", "features", "files", "model-catalog", "models", "oauth", "plugins", "projects", "public", "resources", "sessions", "settings", "skills", "style-profiles", "tasks", "timeline", "user-data", "voice-profiles", "wallet":
case "admin", "agent", "ai", "announcements", "banner-announcements", "assets", "auth", "canvas-projects", "channels", "diagnostics", "features", "files", "model-catalog", "models", "oauth", "plugins", "projects", "public", "resources", "sessions", "settings", "skills", "style-profiles", "tasks", "timeline", "user-data", "voice-profiles", "wallet":
return true
default:
return false