@@ -17,11 +17,14 @@ func NewControllerUser(g *gin.RouterGroup, serviceManager *service.ServiceManage
1717 ctl := & ControllerUser {serviceManager : serviceManager }
1818 g .GET ("" , security .GuardMiddleware (security .RoleDefault ), gggin .ToGinHandler (ctl .HandleListProfiles ))
1919 g .POST ("" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleRegister ))
20+ g .POST ("/batch" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleBatchRegister ))
2021 g .GET ("/:uid" , security .GuardMiddleware (security .RoleRestricted ), gggin .ToGinHandler (ctl .HandleGetProfile ))
2122 g .DELETE ("/:uid" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleUnregister ))
2223 g .PUT ("/:uid/password" , security .GuardMiddleware (security .RoleRestricted ), gggin .ToGinHandler (ctl .HandleChangePassword ))
2324 g .PUT ("/:uid/category" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleModifyCategory ))
2425 g .PUT ("/:uid/role" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleModifyRole ))
26+ g .PATCH ("/category" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleBatchModifyCategory ))
27+ g .PATCH ("/role" , security .GuardMiddleware (security .RoleAdmin ), gggin .ToGinHandler (ctl .HandleBatchModifyRole ))
2528
2629 // Deprecated
2730 g .GET ("/:uid/category" , security .GuardMiddleware (security .RoleRestricted ), gggin .ToGinHandler (ctl .HandleGetCategory ))
@@ -372,3 +375,215 @@ func (ctl *ControllerUser) HandleGetCategory(c *gin.Context) (*gggin.Response[se
372375
373376 return gggin .NewResponse (category ), nil
374377}
378+
379+ // ======== 批量操作相关类型定义 ========
380+
381+ // RequestBatchRegister 批量注册请求体
382+ type RequestBatchRegister struct {
383+ Users []BatchRegisterUser `json:"users" binding:"required,dive"`
384+ }
385+
386+ // BatchRegisterUser 单个用户注册信息
387+ type BatchRegisterUser struct {
388+ Username string `json:"username" binding:"required"`
389+ Email string `json:"email" binding:"required,email"`
390+ Category string `json:"category" binding:"required"`
391+ Role string `json:"role" binding:"required"`
392+ }
393+
394+ // BatchRegisterResult 批量注册结果
395+ type BatchRegisterResult struct {
396+ Success int `json:"success"`
397+ Failed int `json:"failed"`
398+ Total int `json:"total"`
399+ Failures []BatchFailureInfo `json:"failures"`
400+ }
401+
402+ // BatchFailureInfo 批量操作失败信息
403+ type BatchFailureInfo struct {
404+ Row int `json:"row"`
405+ Username string `json:"username"`
406+ Error string `json:"error"`
407+ }
408+
409+ // RequestBatchModifyCategory 批量修改类别请求体
410+ type RequestBatchModifyCategory struct {
411+ UserIds []string `json:"userIds" binding:"required"`
412+ Category string `json:"category" binding:"required"`
413+ }
414+
415+ // RequestBatchModifyRole 批量修改角色请求体
416+ type RequestBatchModifyRole struct {
417+ UserIds []string `json:"userIds" binding:"required"`
418+ Role string `json:"role" binding:"required"`
419+ }
420+
421+ // BatchModifyResult 批量修改结果
422+ type BatchModifyResult struct {
423+ Success int `json:"success"`
424+ Failed int `json:"failed"`
425+ Total int `json:"total"`
426+ Failures []BatchModifyFailure `json:"failures"`
427+ }
428+
429+ // BatchModifyFailure 批量修改失败信息
430+ type BatchModifyFailure struct {
431+ UserId string `json:"userId"`
432+ Error string `json:"error"`
433+ }
434+
435+ // ======== 批量操作功能实现 ========
436+
437+ // @Summary 批量注册用户
438+ // @Description 通过CSV数据批量注册多个用户。需要 ADMIN 角色权限。
439+ // @Tags users
440+ // @Accept json
441+ // @Produce json
442+ // @Param body body RequestBatchRegister true "批量注册请求"
443+ // @Success 200 {object} object{data=BatchRegisterResult} "全部成功:批量注册结果"
444+ // @Success 207 {object} object{data=BatchRegisterResult} "部分失败:批量注册结果"
445+ // @Failure 400 {object} object{data=string} "请求参数错误"
446+ // @Failure 401 {object} object{data=string} "未授权访问"
447+ // @Failure 403 {object} object{data=string} "权限不足"
448+ // @Failure 500 {object} object{data=string} "服务器内部错误"
449+ // @Router /users/batch [post]
450+ // @Security BearerAuth
451+ func (ctl * ControllerUser ) HandleBatchRegister (c * gin.Context ) (* gggin.Response [BatchRegisterResult ], * gggin.HttpError ) {
452+ _ , ok := gggin .Get [* security.GuardResult ](c , "guard" )
453+ if ! ok {
454+ return nil , ErrHttpGuardFail
455+ }
456+
457+ req , err := gggin.ShouldBindJSON [RequestBatchRegister ](c )
458+ if err != nil {
459+ return nil , gggin .NewHttpError (http .StatusBadRequest , err .Error ())
460+ }
461+
462+ var result BatchRegisterResult
463+ result .Total = len (req .Users )
464+
465+ for idx , user := range req .Users {
466+ err := ctl .serviceManager .Register (user .Username , "" , "" , user .Email , user .Category , user .Role )
467+ if err != nil {
468+ result .Failed ++
469+ result .Failures = append (result .Failures , BatchFailureInfo {
470+ Row : idx + 1 ,
471+ Username : user .Username ,
472+ Error : err .Error (),
473+ })
474+ } else {
475+ result .Success ++
476+ }
477+ }
478+
479+ // 根据结果决定返回方式:全部成功返回200,部分失败返回207
480+ if result .Failed > 0 && result .Success > 0 {
481+ // 部分失败:使用207 Multi-Status
482+ return nil , NewMultiStatusResponse (result )
483+ }
484+
485+ // 全部成功或全部失败:使用200
486+ return gggin .NewResponse (result ), nil
487+ }
488+
489+ // @Summary 批量修改账号类型
490+ // @Description 批量修改指定用户的账号类型。需要 ADMIN 角色权限。
491+ // @Tags users
492+ // @Accept json
493+ // @Produce json
494+ // @Param body body RequestBatchModifyCategory true "批量修改账号类型请求"
495+ // @Success 200 {object} object{data=BatchModifyResult} "全部成功:批量修改结果"
496+ // @Success 207 {object} object{data=BatchModifyResult} "部分失败:批量修改结果"
497+ // @Failure 400 {object} object{data=string} "请求参数错误"
498+ // @Failure 401 {object} object{data=string} "未授权访问"
499+ // @Failure 403 {object} object{data=string} "权限不足"
500+ // @Failure 500 {object} object{data=string} "服务器内部错误"
501+ // @Router /users/category [patch]
502+ // @Security BearerAuth
503+ func (ctl * ControllerUser ) HandleBatchModifyCategory (c * gin.Context ) (* gggin.Response [BatchModifyResult ], * gggin.HttpError ) {
504+ _ , ok := gggin .Get [* security.GuardResult ](c , "guard" )
505+ if ! ok {
506+ return nil , ErrHttpGuardFail
507+ }
508+
509+ req , err := gggin.ShouldBindJSON [RequestBatchModifyCategory ](c )
510+ if err != nil {
511+ return nil , gggin .NewHttpError (http .StatusBadRequest , err .Error ())
512+ }
513+
514+ var result BatchModifyResult
515+ result .Total = len (req .UserIds )
516+
517+ for _ , uid := range req .UserIds {
518+ err := ctl .serviceManager .ModifyCategory (uid , req .Category )
519+ if err != nil {
520+ result .Failed ++
521+ result .Failures = append (result .Failures , BatchModifyFailure {
522+ UserId : uid ,
523+ Error : err .Error (),
524+ })
525+ } else {
526+ result .Success ++
527+ }
528+ }
529+
530+ // 根据结果决定返回方式:全部成功返回200,部分失败返回207
531+ if result .Failed > 0 && result .Success > 0 {
532+ // 部分失败:使用207 Multi-Status
533+ return nil , NewMultiStatusResponse (result )
534+ }
535+
536+ // 全部成功或全部失败:使用200
537+ return gggin .NewResponse (result ), nil
538+ }
539+
540+ // @Summary 批量修改角色权限
541+ // @Description 批量修改指定用户的角色权限。需要 ADMIN 角色权限。
542+ // @Tags users
543+ // @Accept json
544+ // @Produce json
545+ // @Param body body RequestBatchModifyRole true "批量修改角色权限请求"
546+ // @Success 200 {object} object{data=BatchModifyResult} "全部成功:批量修改结果"
547+ // @Success 207 {object} object{data=BatchModifyResult} "部分失败:批量修改结果"
548+ // @Failure 400 {object} object{data=string} "请求参数错误"
549+ // @Failure 401 {object} object{data=string} "未授权访问"
550+ // @Failure 403 {object} object{data=string} "权限不足"
551+ // @Failure 500 {object} object{data=string} "服务器内部错误"
552+ // @Router /users/role [patch]
553+ // @Security BearerAuth
554+ func (ctl * ControllerUser ) HandleBatchModifyRole (c * gin.Context ) (* gggin.Response [BatchModifyResult ], * gggin.HttpError ) {
555+ _ , ok := gggin .Get [* security.GuardResult ](c , "guard" )
556+ if ! ok {
557+ return nil , ErrHttpGuardFail
558+ }
559+
560+ req , err := gggin.ShouldBindJSON [RequestBatchModifyRole ](c )
561+ if err != nil {
562+ return nil , gggin .NewHttpError (http .StatusBadRequest , err .Error ())
563+ }
564+
565+ var result BatchModifyResult
566+ result .Total = len (req .UserIds )
567+
568+ for _ , uid := range req .UserIds {
569+ err := ctl .serviceManager .GrantRoleByUidAndRoleName (uid , req .Role )
570+ if err != nil {
571+ result .Failed ++
572+ result .Failures = append (result .Failures , BatchModifyFailure {
573+ UserId : uid ,
574+ Error : err .Error (),
575+ })
576+ } else {
577+ result .Success ++
578+ }
579+ }
580+
581+ // 根据结果决定返回方式:全部成功返回200,部分失败返回207
582+ if result .Failed > 0 && result .Success > 0 {
583+ // 部分失败:使用207 Multi-Status
584+ return nil , NewMultiStatusResponse (result )
585+ }
586+
587+ // 全部成功或全部失败:使用200
588+ return gggin .NewResponse (result ), nil
589+ }
0 commit comments