feat(admin): add comprehensive admin management system

- Add admin handlers and services for users, posts, comments, groups, and dashboard
- Implement role permission management with ability to view and update permissions
- Add database seeding for roles and Casbin permission policies
- Upgrade Casbin from v2 to v3 with GORM adapter for persistent policy storage
- Add admin-specific repository methods with filtering and pagination
- Register new admin API routes under /api/v1/admin/*
This commit is contained in:
2026-03-14 18:01:55 +08:00
parent ae5b997924
commit d3065b30cc
28 changed files with 4018 additions and 107 deletions

View File

@@ -11,23 +11,28 @@ import (
// Router 路由配置
type Router struct {
engine *gin.Engine
userHandler *handler.UserHandler
postHandler *handler.PostHandler
commentHandler *handler.CommentHandler
messageHandler *handler.MessageHandler
notificationHandler *handler.NotificationHandler
uploadHandler *handler.UploadHandler
pushHandler *handler.PushHandler
systemMessageHandler *handler.SystemMessageHandler
groupHandler *handler.GroupHandler
stickerHandler *handler.StickerHandler
gorseHandler *handler.GorseHandler
voteHandler *handler.VoteHandler
scheduleHandler *handler.ScheduleHandler
roleHandler *handler.RoleHandler
jwtService *service.JWTService
casbinService service.CasbinService
engine *gin.Engine
userHandler *handler.UserHandler
postHandler *handler.PostHandler
commentHandler *handler.CommentHandler
messageHandler *handler.MessageHandler
notificationHandler *handler.NotificationHandler
uploadHandler *handler.UploadHandler
pushHandler *handler.PushHandler
systemMessageHandler *handler.SystemMessageHandler
groupHandler *handler.GroupHandler
stickerHandler *handler.StickerHandler
gorseHandler *handler.GorseHandler
voteHandler *handler.VoteHandler
scheduleHandler *handler.ScheduleHandler
roleHandler *handler.RoleHandler
adminUserHandler *handler.AdminUserHandler
adminPostHandler *handler.AdminPostHandler
adminCommentHandler *handler.AdminCommentHandler
adminGroupHandler *handler.AdminGroupHandler
adminDashboardHandler *handler.AdminDashboardHandler
jwtService *service.JWTService
casbinService service.CasbinService
}
// New 创建路由
@@ -47,6 +52,11 @@ func New(
voteHandler *handler.VoteHandler,
scheduleHandler *handler.ScheduleHandler,
roleHandler *handler.RoleHandler,
adminUserHandler *handler.AdminUserHandler,
adminPostHandler *handler.AdminPostHandler,
adminCommentHandler *handler.AdminCommentHandler,
adminGroupHandler *handler.AdminGroupHandler,
adminDashboardHandler *handler.AdminDashboardHandler,
activityService service.UserActivityService,
casbinService service.CasbinService,
) *Router {
@@ -56,23 +66,28 @@ func New(
userHandler.SetActivityService(activityService)
r := &Router{
engine: gin.Default(),
userHandler: userHandler,
postHandler: postHandler,
commentHandler: commentHandler,
messageHandler: messageHandler,
notificationHandler: notificationHandler,
uploadHandler: uploadHandler,
pushHandler: pushHandler,
systemMessageHandler: systemMessageHandler,
groupHandler: groupHandler,
stickerHandler: stickerHandler,
gorseHandler: gorseHandler,
voteHandler: voteHandler,
scheduleHandler: scheduleHandler,
roleHandler: roleHandler,
jwtService: jwtService,
casbinService: casbinService,
engine: gin.Default(),
userHandler: userHandler,
postHandler: postHandler,
commentHandler: commentHandler,
messageHandler: messageHandler,
notificationHandler: notificationHandler,
uploadHandler: uploadHandler,
pushHandler: pushHandler,
systemMessageHandler: systemMessageHandler,
groupHandler: groupHandler,
stickerHandler: stickerHandler,
gorseHandler: gorseHandler,
voteHandler: voteHandler,
scheduleHandler: scheduleHandler,
roleHandler: roleHandler,
adminUserHandler: adminUserHandler,
adminPostHandler: adminPostHandler,
adminCommentHandler: adminCommentHandler,
adminGroupHandler: adminGroupHandler,
adminDashboardHandler: adminDashboardHandler,
jwtService: jwtService,
casbinService: casbinService,
}
r.setupRoutes()
@@ -365,9 +380,61 @@ func (r *Router) setupRoutes() {
{
// 角色管理
admin.GET("/roles", r.roleHandler.GetAllRoles)
admin.GET("/roles/:name", r.roleHandler.GetRoleDetail)
admin.GET("/roles/:name/permissions", r.roleHandler.GetRolePermissions)
admin.PUT("/roles/:name/permissions", r.roleHandler.UpdateRolePermissions)
admin.GET("/permissions", r.roleHandler.GetAllPermissions)
admin.GET("/users/:id/roles", r.roleHandler.GetUserRoles)
admin.POST("/users/:id/roles", r.roleHandler.AssignRole)
admin.DELETE("/users/:id/roles/:role", r.roleHandler.RemoveRole)
// 用户管理
if r.adminUserHandler != nil {
admin.GET("/users", r.adminUserHandler.GetUserList)
admin.GET("/users/:id", r.adminUserHandler.GetUserDetail)
admin.PUT("/users/:id/status", r.adminUserHandler.UpdateUserStatus)
}
// 帖子管理
if r.adminPostHandler != nil {
admin.GET("/posts", r.adminPostHandler.GetPostList)
admin.GET("/posts/:id", r.adminPostHandler.GetPostDetail)
admin.DELETE("/posts/:id", r.adminPostHandler.DeletePost)
admin.PUT("/posts/:id/moderate", r.adminPostHandler.ModeratePost)
admin.POST("/posts/batch-delete", r.adminPostHandler.BatchDeletePosts)
admin.POST("/posts/batch-moderate", r.adminPostHandler.BatchModeratePosts)
admin.PUT("/posts/:id/pin", r.adminPostHandler.SetPostPin)
admin.PUT("/posts/:id/feature", r.adminPostHandler.SetPostFeature)
}
// 评论管理
if r.adminCommentHandler != nil {
admin.GET("/comments", r.adminCommentHandler.GetCommentList)
admin.GET("/comments/:id", r.adminCommentHandler.GetCommentDetail)
admin.DELETE("/comments/:id", r.adminCommentHandler.DeleteComment)
admin.POST("/comments/batch-delete", r.adminCommentHandler.BatchDeleteComments)
admin.GET("/comments/post/:postId", r.adminCommentHandler.GetPostComments)
}
// 群组管理
if r.adminGroupHandler != nil {
admin.GET("/groups", r.adminGroupHandler.GetGroupList)
admin.GET("/groups/:id", r.adminGroupHandler.GetGroupDetail)
admin.GET("/groups/:id/members", r.adminGroupHandler.GetGroupMembers)
admin.DELETE("/groups/:id", r.adminGroupHandler.DeleteGroup)
admin.PUT("/groups/:id/status", r.adminGroupHandler.UpdateGroupStatus)
admin.DELETE("/groups/:id/members/:userId", r.adminGroupHandler.RemoveMember)
admin.PUT("/groups/:id/transfer", r.adminGroupHandler.TransferOwner)
}
// 仪表盘
if r.adminDashboardHandler != nil {
admin.GET("/dashboard/stats", r.adminDashboardHandler.GetStats)
admin.GET("/dashboard/user-activity", r.adminDashboardHandler.GetUserActivityTrend)
admin.GET("/dashboard/content-stats", r.adminDashboardHandler.GetContentStats)
admin.GET("/dashboard/pending-content", r.adminDashboardHandler.GetPendingContent)
admin.GET("/dashboard/online-users", r.adminDashboardHandler.GetOnlineUsers)
}
}
}
}