feat: 公告系统 — Phase 2 完成
- Model/Repo/Service/Controller 全栈实现 - CRUD + ListActive(生效时间范围过滤) - 管理后台独立页面 /admin/announcements(列表+弹窗CRUD) - 前台首页 Hero 下方公告栏(info/success/warning/error 四色) - Moderator+ 权限可管理公告
This commit is contained in:
@ -32,6 +32,7 @@ func setupAdminRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
adminPages.GET("/energy/logs", d.adminEnergyCtrl.EnergyLogPage)
|
||||
adminPages.GET("/energy/fund-logs", d.adminEnergyCtrl.FundLogPage)
|
||||
adminPages.GET("/comments", d.adminCommentCtrl.CommentsPage)
|
||||
adminPages.GET("/announcements", d.announcementCtrl.Page)
|
||||
}
|
||||
|
||||
// --- 管理后台 API ---
|
||||
@ -99,4 +100,17 @@ func setupAdminRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
adminCommentAPI.GET("", d.adminCommentCtrl.ListComments)
|
||||
adminCommentAPI.DELETE("/:id", d.adminCommentCtrl.Delete)
|
||||
}
|
||||
|
||||
// --- 公告管理 API(moderator+) ---
|
||||
announcementAPI := r.Group("/api/admin/announcements")
|
||||
announcementAPI.Use(d.authMdw.Required())
|
||||
announcementAPI.Use(middleware.RequireMinRole(model.RoleModerator))
|
||||
announcementAPI.Use(d.authMdw.BannedWriteGuard())
|
||||
announcementAPI.Use(middleware.CSRF(cfg))
|
||||
{
|
||||
announcementAPI.GET("", d.announcementCtrl.List)
|
||||
announcementAPI.POST("", d.announcementCtrl.Create)
|
||||
announcementAPI.PUT("/:id", d.announcementCtrl.Update)
|
||||
announcementAPI.DELETE("/:id", d.announcementCtrl.Delete)
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,8 +43,10 @@ type dependencies struct {
|
||||
followCtrl *controller.FollowController
|
||||
favoriteCtrl *controller.FavoriteController
|
||||
favoriteService *service.FavoriteService
|
||||
trendsService *service.TrendsService
|
||||
homeCache *cache.HomePageCache
|
||||
trendsService *service.TrendsService
|
||||
homeCache *cache.HomePageCache
|
||||
announcementService *service.AnnouncementService
|
||||
announcementCtrl *adminCtrl.AnnouncementController
|
||||
}
|
||||
|
||||
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) (
|
||||
|
||||
@ -103,6 +103,11 @@ func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSetting
|
||||
|
||||
maintenanceMdw := middleware.NewMaintenanceMiddleware(cfg, siteSettings, sessionMgr)
|
||||
|
||||
// 公告系统
|
||||
announcementRepo := repository.NewAnnouncementRepo(db)
|
||||
announcementService := service.NewAnnouncementService(announcementRepo)
|
||||
announcementCtrl := adminCtrl.NewAnnouncementController(announcementService)
|
||||
|
||||
// 首页内存缓存(30s TTL),文章变更时失效
|
||||
homeCache := cache.NewHomePageCache(30 * time.Second)
|
||||
postService.WithHomePageInvalidator(func() { homeCache.Invalidate() })
|
||||
@ -126,7 +131,9 @@ func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSetting
|
||||
followCtrl: followCtrl,
|
||||
favoriteCtrl: favoriteCtrl,
|
||||
favoriteService: favoriteService,
|
||||
trendsService: trendsService,
|
||||
homeCache: homeCache,
|
||||
trendsService: trendsService,
|
||||
homeCache: homeCache,
|
||||
announcementService: announcementService,
|
||||
announcementCtrl: announcementCtrl,
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,11 +33,13 @@ func setupFrontendRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
d.homeCache.Set(posts, total)
|
||||
}
|
||||
}
|
||||
announcements, _ := d.announcementService.ListActive()
|
||||
c.HTML(http.StatusOK, "home/index.html", common.BuildPageData(c, gin.H{
|
||||
"Title": "首页",
|
||||
"ExtraCSS": "/static/css/home.css",
|
||||
"Posts": posts,
|
||||
"PostCount": total,
|
||||
"Title": "首页",
|
||||
"ExtraCSS": "/static/css/home.css",
|
||||
"Posts": posts,
|
||||
"PostCount": total,
|
||||
"Announcements": announcements,
|
||||
}))
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user