100 lines
2.4 KiB
Go
100 lines
2.4 KiB
Go
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": "登出成功",
|
||
})
|
||
}
|