feat: 用户徽章与等级体系,积分经济管理重构
- 新增徽章系统:badge 服务与 handler、管理端配置页、BadgeChip/LevelBadge 展示组件 - 新增等级模型:model/level 及前端 levels 元数据 - 管理端经济模块拆分为 points/badges/levels 独立页面,EconomySettings 迁入设置 - 积分、签到、评论等服务适配等级与徽章逻辑
This commit is contained in:
@@ -58,14 +58,16 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
authSvc := service.NewAuthService(model.DB, cfg.JWTSecret)
|
||||
boardSvc := service.NewBoardService(model.DB)
|
||||
settingSvc := service.NewSettingService(model.DB)
|
||||
// 等级体系快照随进程启动加载(后台保存时经 SetLevels 刷新,无需重启)
|
||||
model.ApplyLevelDefs(settingSvc.Levels())
|
||||
ops := service.NewOperations(model.DB, cfg)
|
||||
go ops.Run(context.Background())
|
||||
postSvc := service.NewPostService(model.DB).WithSetting(settingSvc).WithBoard(boardSvc).WithDevMode(cfg.DevMode)
|
||||
commentSvc := service.NewCommentService(model.DB)
|
||||
commentSvc := service.NewCommentService(model.DB).WithSetting(settingSvc)
|
||||
likeSvc := service.NewLikeService(model.DB)
|
||||
notifSvc := service.NewNotificationService(model.DB)
|
||||
overviewSvc := service.NewOverviewService(model.DB)
|
||||
checkinSvc := service.NewCheckinService(model.DB)
|
||||
checkinSvc := service.NewCheckinService(model.DB).WithSetting(settingSvc)
|
||||
announcementSvc := service.NewAnnouncementService(model.DB)
|
||||
sitePageSvc := service.NewSitePageService(model.DB)
|
||||
uploadSvc := service.NewUploadService(model.DB, filepath.Join(cfg.DataDir, "uploads")).WithSetting(settingSvc)
|
||||
@@ -77,6 +79,7 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
legacyImportSvc := service.NewLegacyImportService(model.DB, filepath.Join(cfg.DataDir, "uploads"))
|
||||
moderationSvc := service.NewModerationService(model.DB, notifSvc)
|
||||
chatSvc := service.NewChatService(model.DB, notifSvc)
|
||||
badgeSvc := service.NewBadgeService(model.DB).WithNotification(notifSvc)
|
||||
visitSvc := service.NewVisitStatsService(model.DB, settingSvc)
|
||||
analyticsSvc := service.NewAnalyticsService(model.DB)
|
||||
adSvc := service.NewAdService(model.DB, service.NewCaptchaStore())
|
||||
@@ -122,6 +125,7 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
HidePwd: service.NewHidePasswordCookie(cfg.JWTSecret, !cfg.DevMode),
|
||||
Ads: adSvc,
|
||||
Sidebar: service.NewSidebarService(model.DB),
|
||||
Badge: badgeSvc,
|
||||
}
|
||||
// 通知落库后统一推 WS 红点(点赞/评论/审核/@ 等共用)
|
||||
notifSvc.OnNotifyNew = func(userID uint) {
|
||||
@@ -340,6 +344,18 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
staffAPI.GET("/sidebar", authMW.RequirePerm(service.PermSettings), h.AdminGetSidebar)
|
||||
staffAPI.PUT("/sidebar/config", authMW.RequirePerm(service.PermSettings), h.AdminSaveSidebarConfig)
|
||||
staffAPI.POST("/sidebar/widgets", authMW.RequirePerm(service.PermSettings), h.AdminCreateSidebarWidget)
|
||||
|
||||
// 徽章管理(超级管理员/站长):定义 CRUD + 授予/撤销
|
||||
badgeAPI := staffAPI.Group("/badges", authMW.RequirePerm(service.PermSettings))
|
||||
{
|
||||
badgeAPI.GET("", h.AdminListBadges)
|
||||
badgeAPI.POST("", h.AdminCreateBadge)
|
||||
badgeAPI.PUT("/:id", h.AdminUpdateBadge)
|
||||
badgeAPI.DELETE("/:id", h.AdminDeleteBadge)
|
||||
badgeAPI.GET("/:id/holders", h.AdminBadgeHolders)
|
||||
badgeAPI.POST("/:id/grant", h.AdminGrantBadge)
|
||||
badgeAPI.DELETE("/:id/grant/:userId", h.AdminRevokeBadge)
|
||||
}
|
||||
staffAPI.PUT("/sidebar/widgets/:id", authMW.RequirePerm(service.PermSettings), h.AdminUpdateSidebarWidget)
|
||||
staffAPI.DELETE("/sidebar/widgets/:id", authMW.RequirePerm(service.PermSettings), h.AdminDeleteSidebarWidget)
|
||||
|
||||
@@ -368,6 +384,9 @@ func Setup(cfg *config.Config) (*gin.Engine, error) {
|
||||
usersAPI.PUT("/users/:id/messages", h.AdminSetUserMessages)
|
||||
usersAPI.PUT("/users/:id/ban", h.AdminSetUserBan)
|
||||
usersAPI.GET("/users/:id/login-logs", h.AdminUserLoginLogs)
|
||||
// 积分管理:手动调整(加分计累计/扣分仅扣余额)与积分流水分页
|
||||
usersAPI.PUT("/users/:id/points", h.AdminAdjustUserPoints)
|
||||
usersAPI.GET("/users/:id/points/ledger", h.AdminUserPointLedger)
|
||||
// 站长内容档案(handler 内再校验 owner)
|
||||
usersAPI.GET("/users/:id", h.AdminGetUserAudit)
|
||||
usersAPI.GET("/users/:id/posts", h.AdminUserAuditPosts)
|
||||
|
||||
Reference in New Issue
Block a user