user.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package handler
  2. import (
  3. "net/http"
  4. "web-training/internal/model"
  5. "web-training/internal/service"
  6. "web-training/pkg/auth"
  7. "web-training/internal/utils"
  8. "github.com/gin-gonic/gin"
  9. )
  10. // UserHandler 用户处理器
  11. type UserHandler struct {
  12. userService *service.UserService
  13. jwtService *auth.JWTService
  14. }
  15. // NewUserHandler 创建用户处理器
  16. func NewUserHandler(db interface{}, jwtService *auth.JWTService) *UserHandler {
  17. // 这里应该注入UserService,暂时简化处理
  18. userService := service.NewUserService(db)
  19. return &UserHandler{
  20. userService: userService,
  21. jwtService: jwtService,
  22. }
  23. }
  24. // Register 用户注册
  25. // @Summary 用户注册
  26. // @Tags 用户管理
  27. // @Accept json
  28. // @Produce json
  29. // @Param user body model.CreateUserRequest true "用户信息"
  30. // @Success 201 {object} utils.APIResponse{data=model.UserResponse}
  31. // @Failure 400 {object} utils.APIResponse
  32. // @Failure 500 {object} utils.APIResponse
  33. // @Router /api/v1/register [post]
  34. func (h *UserHandler) Register(c *gin.Context) {
  35. var req model.CreateUserRequest
  36. if err := c.ShouldBindJSON(&req); err != nil {
  37. utils.ErrorResponse(c, http.StatusBadRequest, "请求参数错误", err.Error())
  38. return
  39. }
  40. user, err := h.userService.CreateUser(req)
  41. if err != nil {
  42. utils.ErrorResponse(c, http.StatusInternalServerError, "注册失败", err.Error())
  43. return
  44. }
  45. utils.SuccessResponse(c, http.StatusCreated, "注册成功", user.ToResponse())
  46. }
  47. // Login 用户登录
  48. // @Summary 用户登录
  49. // @Tags 用户管理
  50. // @Accept json
  51. // @Produce json
  52. // @Param credentials body model.LoginRequest true "登录凭证"
  53. // @Success 200 {object} utils.APIResponse{data=model.LoginResponse}
  54. // @Failure 400 {object} utils.APIResponse
  55. // @Failure 401 {object} utils.APIResponse
  56. // @Failure 500 {object} utils.APIResponse
  57. // @Router /api/v1/login [post]
  58. func (h *UserHandler) Login(c *gin.Context) {
  59. var req model.LoginRequest
  60. if err := c.ShouldBindJSON(&req); err != nil {
  61. utils.ErrorResponse(c, http.StatusBadRequest, "请求参数错误", err.Error())
  62. return
  63. }
  64. user, err := h.userService.Authenticate(req.Username, req.Password)
  65. if err != nil {
  66. utils.ErrorResponse(c, http.StatusUnauthorized, "用户名或密码错误", err.Error())
  67. return
  68. }
  69. // 生成JWT令牌
  70. token, err := h.jwtService.GenerateToken(user.ID, []string{user.Role})
  71. if err != nil {
  72. utils.ErrorResponse(c, http.StatusInternalServerError, "生成令牌失败", err.Error())
  73. return
  74. }
  75. loginResp := model.LoginResponse{
  76. Token: token,
  77. User: user.ToResponse(),
  78. }
  79. utils.SuccessResponse(c, http.StatusOK, "登录成功", loginResp)
  80. }
  81. // ListUsers 获取用户列表
  82. // @Summary 获取用户列表
  83. // @Tags 用户管理
  84. // @Accept json
  85. // @Produce json
  86. // @Param page query int false "页码" default(1)
  87. // @Param page_size query int false "每页数量" default(10)
  88. // @Param search query string false "搜索关键词"
  89. // @Success 200 {object} utils.APIResponse{data=[]model.UserResponse,meta=utils.MetaInfo}
  90. // @Failure 401 {object} utils.APIResponse
  91. // @Failure 500 {object} utils.APIResponse
  92. // @Router /api/v1/users [get]
  93. func (h *UserHandler) ListUsers(c *gin.Context) {
  94. page, pageSize := utils.GetPaginationParams(c)
  95. search := c.Query("search")
  96. users, total, err := h.userService.ListUsers(page, pageSize, search)
  97. if err != nil {
  98. utils.ErrorResponse(c, http.StatusInternalServerError, "获取用户列表失败", err.Error())
  99. return
  100. }
  101. // 转换为响应格式
  102. userResponses := make([]model.UserResponse, len(users))
  103. for i, user := range users {
  104. userResponses[i] = user.ToResponse()
  105. }
  106. utils.PaginatedResponse(c, http.StatusOK, "获取成功", userResponses, page, pageSize, total)
  107. }
  108. // GetUser 获取用户详情
  109. // @Summary 获取用户详情
  110. // @Tags 用户管理
  111. // @Accept json
  112. // @Produce json
  113. // @Param id path int true "用户ID"
  114. // @Success 200 {object} utils.APIResponse{data=model.UserResponse}
  115. // @Failure 400 {object} utils.APIResponse
  116. // @Failure 404 {object} utils.APIResponse
  117. // @Failure 500 {object} utils.APIResponse
  118. // @Router /api/v1/users/{id} [get]
  119. func (h *UserHandler) GetUser(c *gin.Context) {
  120. id, err := utils.GetIDParam(c)
  121. if err != nil {
  122. utils.ErrorResponse(c, http.StatusBadRequest, "无效的用户ID", err.Error())
  123. return
  124. }
  125. user, err := h.userService.GetUserByID(id)
  126. if err != nil {
  127. utils.ErrorResponse(c, http.StatusNotFound, "用户不存在", err.Error())
  128. return
  129. }
  130. utils.SuccessResponse(c, http.StatusOK, "获取成功", user.ToResponse())
  131. }
  132. // UpdateUser 更新用户信息
  133. // @Summary 更新用户信息
  134. // @Tags 用户管理
  135. // @Accept json
  136. // @Produce json
  137. // @Param id path int true "用户ID"
  138. // @Param user body model.UpdateUserRequest true "用户信息"
  139. // @Success 200 {object} utils.APIResponse{data=model.UserResponse}
  140. // @Failure 400 {object} utils.APIResponse
  141. // @Failure 404 {object} utils.APIResponse
  142. // @Failure 500 {object} utils.APIResponse
  143. // @Router /api/v1/users/{id} [put]
  144. func (h *UserHandler) UpdateUser(c *gin.Context) {
  145. id, err := utils.GetIDParam(c)
  146. if err != nil {
  147. utils.ErrorResponse(c, http.StatusBadRequest, "无效的用户ID", err.Error())
  148. return
  149. }
  150. var req model.UpdateUserRequest
  151. if err := c.ShouldBindJSON(&req); err != nil {
  152. utils.ErrorResponse(c, http.StatusBadRequest, "请求参数错误", err.Error())
  153. return
  154. }
  155. user, err := h.userService.UpdateUser(id, req)
  156. if err != nil {
  157. utils.ErrorResponse(c, http.StatusInternalServerError, "更新用户失败", err.Error())
  158. return
  159. }
  160. utils.SuccessResponse(c, http.StatusOK, "更新成功", user.ToResponse())
  161. }
  162. // DeleteUser 删除用户
  163. // @Summary 删除用户
  164. // @Tags 用户管理
  165. // @Accept json
  166. // @Produce json
  167. // @Param id path int true "用户ID"
  168. // @Success 200 {object} utils.APIResponse
  169. // @Failure 400 {object} utils.APIResponse
  170. // @Failure 404 {object} utils.APIResponse
  171. // @Failure 500 {object} utils.APIResponse
  172. // @Router /api/v1/users/{id} [delete]
  173. func (h *UserHandler) DeleteUser(c *gin.Context) {
  174. id, err := utils.GetIDParam(c)
  175. if err != nil {
  176. utils.ErrorResponse(c, http.StatusBadRequest, "无效的用户ID", err.Error())
  177. return
  178. }
  179. err = h.userService.DeleteUser(id)
  180. if err != nil {
  181. utils.ErrorResponse(c, http.StatusInternalServerError, "删除用户失败", err.Error())
  182. return
  183. }
  184. utils.SuccessResponse(c, http.StatusOK, "删除成功", nil)
  185. }