feat: 收藏夹系统 + Studio 趋势图 + 通知偏好设置
- 新增收藏夹系统 (Folder/FolderItem 模型、CRUD API、前端管理页) - 新增文章详情页收藏按钮 (书签图标、ToggleFavorite 一键收藏) - 新增 Studio 趋势图 (赋能值/评论/点赞/收藏 4 线图, 7d/30d/90d) - 新增通知偏好设置页 (评论/回复/点赞/关注 4 类开关) - 后端通知列表支持按偏好过滤 (排除已关闭的通知类型) - 下载 Chart.js 到本地静态资源 (static/js/chart.umd.min.js) - 补充收藏夹卡片、开关滑块、趋势图网格等 CSS 样式
This commit is contained in:
@ -25,6 +25,9 @@ func setupAPIRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
settingsAPI.DELETE("/sessions/:sid", d.settingsCtrl.DestroySession)
|
||||
settingsAPI.POST("/sessions/destroy-others", d.settingsCtrl.DestroyOtherSessions)
|
||||
settingsAPI.PUT("/sessions/:sid/remark", d.settingsCtrl.UpdateSessionRemark)
|
||||
// 通知偏好
|
||||
settingsAPI.GET("/notify-prefs", d.settingsCtrl.GetNotifyPrefs)
|
||||
settingsAPI.PUT("/notify-prefs", d.settingsCtrl.UpdateNotifyPref)
|
||||
}
|
||||
|
||||
// --- 消息中心 API(需登录) ---
|
||||
@ -145,4 +148,38 @@ func setupAPIRoutes(r *gin.Engine, cfg *config.Config, d *dependencies) {
|
||||
{
|
||||
followAPI.POST("/follow", d.followCtrl.Toggle)
|
||||
}
|
||||
|
||||
// --- 收藏夹 API ---
|
||||
// 公开:文章收藏状态(未登录返回 false)
|
||||
r.GET("/api/posts/:id/folder-status", d.favoriteCtrl.GetPostStatus)
|
||||
// 公开:查看公开收藏夹内容
|
||||
r.GET("/api/folders/:id/posts", d.favoriteCtrl.ListFolderItems)
|
||||
// 需登录:收藏操作
|
||||
folderAPI := r.Group("/api/folders")
|
||||
folderAPI.Use(d.authMdw.Required())
|
||||
folderAPI.Use(d.authMdw.BannedWriteGuard())
|
||||
folderAPI.Use(middleware.CSRF(cfg))
|
||||
{
|
||||
folderAPI.GET("", d.favoriteCtrl.ListFolders)
|
||||
folderAPI.POST("", d.favoriteCtrl.CreateFolder)
|
||||
folderAPI.PUT("/:id", d.favoriteCtrl.UpdateFolder)
|
||||
folderAPI.DELETE("/:id", d.favoriteCtrl.DeleteFolder)
|
||||
folderAPI.POST("/:id/posts", d.favoriteCtrl.AddToFolder)
|
||||
folderAPI.DELETE("/:id/posts/:postId", d.favoriteCtrl.RemoveFromFolder)
|
||||
}
|
||||
// 需登录:切换收藏(Toggle)
|
||||
favToggleAPI := r.Group("/api/posts/:id")
|
||||
favToggleAPI.Use(d.authMdw.Required())
|
||||
favToggleAPI.Use(d.authMdw.BannedWriteGuard())
|
||||
favToggleAPI.Use(middleware.CSRF(cfg))
|
||||
{
|
||||
favToggleAPI.POST("/favorite", d.favoriteCtrl.ToggleFavorite)
|
||||
}
|
||||
|
||||
// --- Studio 趋势 API(需登录) ---
|
||||
trendsAPI := r.Group("/api/studio")
|
||||
trendsAPI.Use(d.authMdw.Required())
|
||||
{
|
||||
trendsAPI.GET("/trends", d.studioCtrl.TrendsAPI)
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,6 +40,9 @@ type dependencies struct {
|
||||
reactionCtrl *controller.ReactionController
|
||||
followCtrl *controller.FollowController
|
||||
followPageCtrl *controller.FollowPageController
|
||||
favoriteCtrl *controller.FavoriteController
|
||||
favoriteService *service.FavoriteService
|
||||
trendsService *service.TrendsService
|
||||
}
|
||||
|
||||
func buildDepsCore(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSettings, redisClient *redis.Client) (
|
||||
|
||||
@ -40,6 +40,7 @@ func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSetting
|
||||
|
||||
settingsCtrl := controller.NewSettingsController(authService, avatarSvc, auditService, sessionMgr, cfg, levelSvc)
|
||||
settingsCtrl.WithEnergyService(energyService)
|
||||
settingsCtrl.SetNotifyPrefReader(authService)
|
||||
siteSettingController := adminCtrl.NewSiteSettingController(
|
||||
service.NewSiteSettingService(siteSettings),
|
||||
&service.AuditDefaults{
|
||||
@ -85,6 +86,15 @@ func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSetting
|
||||
spaceService := service.NewSpaceService(userRepo, postRepo)
|
||||
spaceCtrl := controller.NewSpaceController(spaceService)
|
||||
|
||||
// 收藏夹系统
|
||||
favoriteRepo := repository.NewFavoriteRepo(db)
|
||||
favoriteService := service.NewFavoriteService(db, favoriteRepo)
|
||||
favoriteCtrl := controller.NewFavoriteController(favoriteService)
|
||||
|
||||
// Studio 趋势图
|
||||
trendsService := service.NewTrendsService(energyRepo, commentRepo, reactionRepo, favoriteRepo)
|
||||
studioCtrl.WithTrendsService(trendsService)
|
||||
|
||||
maintenanceMdw := middleware.NewMaintenanceMiddleware(cfg, siteSettings, sessionMgr)
|
||||
|
||||
return &dependencies{
|
||||
@ -105,5 +115,8 @@ func buildDeps(db *gorm.DB, cfg *config.Config, siteSettings *config.SiteSetting
|
||||
reactionCtrl: reactionCtrl,
|
||||
followCtrl: followCtrl,
|
||||
followPageCtrl: followPageCtrl,
|
||||
favoriteCtrl: favoriteCtrl,
|
||||
favoriteService: favoriteService,
|
||||
trendsService: trendsService,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user