package handler import ( "dd_fiber_api/internal/admin_auth" "dd_fiber_api/internal/admin_auth/service" "github.com/gofiber/fiber/v2" ) // AuthHandler 认证处理器 type AuthHandler struct { authService *service.AuthService } // NewAuthHandler 创建认证处理器 func NewAuthHandler(authService *service.AuthService) *AuthHandler { return &AuthHandler{ authService: authService, } } // Login 登录 func (h *AuthHandler) Login(c *fiber.Ctx) error { var req admin_auth.LoginRequest if err := c.BodyParser(&req); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "请求参数解析失败: " + err.Error(), }) } // 验证必填字段 if req.Username == "" && req.Phone == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "用户名或手机号不能为空", }) } if req.Password == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "success": false, "message": "密码不能为空", }) } // 获取客户端IP clientIP := c.IP() // 调用服务层 resp, err := h.authService.Login(&req, clientIP) if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "success": false, "message": "登录失败: " + err.Error(), }) } if !resp.Success { return c.Status(fiber.StatusUnauthorized).JSON(resp) } return c.Status(fiber.StatusOK).JSON(resp) } // GetMe 获取当前用户信息 func (h *AuthHandler) GetMe(c *fiber.Ctx) error { // 从中间件获取token(中间件会将claims存储到locals中) _, ok := c.Locals("claims").(*admin_auth.JWTClaims) if !ok { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ "success": false, "message": "未授权", }) } // 从数据库获取最新用户信息 userInfo, err := h.authService.GetUserInfo(c.Get("Authorization")) if err != nil { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ "success": false, "message": "获取用户信息失败: " + err.Error(), }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ "success": true, "message": "获取成功", "user": userInfo, }) } // Logout 登出(前端删除token即可,这里可以记录日志或清除缓存) func (h *AuthHandler) Logout(c *fiber.Ctx) error { // 可以在这里实现token黑名单、清除缓存等逻辑 return c.Status(fiber.StatusOK).JSON(fiber.Map{ "success": true, "message": "登出成功", }) }