Files
TaskPool/internal/controllers/auth_controller.go
T
2025-12-20 13:30:08 +08:00

101 lines
2.4 KiB
Go

package controllers
import (
"strconv"
"baihu/internal/constant"
"baihu/internal/middleware"
"baihu/internal/services"
"baihu/internal/utils"
"github.com/gin-gonic/gin"
)
type AuthController struct {
userService *services.UserService
settingsService *services.SettingsService
}
func NewAuthController(userService *services.UserService, settingsService *services.SettingsService) *AuthController {
return &AuthController{userService: userService, settingsService: settingsService}
}
func (ac *AuthController) Login(c *gin.Context) {
var req struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, err.Error())
return
}
user := ac.userService.GetUserByUsername(req.Username)
if user == nil || !ac.userService.ValidatePassword(user, req.Password) {
utils.Unauthorized(c, "用户名或密码错误")
return
}
// 获取 cookie 过期天数
expireDays := 7
if days := ac.settingsService.Get(constant.SectionSite, constant.KeyCookieDays); days != "" {
if d, err := strconv.Atoi(days); err == nil && d > 0 {
expireDays = d
}
}
// 获取 JWT Secret
jwtSecret := ac.settingsService.Get(constant.SectionSystem, constant.KeyJWTSecret)
if jwtSecret == "" {
utils.ServerError(c, "系统配置错误")
return
}
// 生成 token
token, err := utils.GenerateToken(user.ID, user.Username, expireDays, jwtSecret)
if err != nil {
utils.ServerError(c, "登录失败")
return
}
// 设置 Cookie
middleware.SetAuthCookie(c, token, expireDays)
utils.Success(c, gin.H{
"user": user.Username,
})
}
func (ac *AuthController) Logout(c *gin.Context) {
middleware.ClearAuthCookie(c)
utils.SuccessMsg(c, "退出成功")
}
func (ac *AuthController) GetCurrentUser(c *gin.Context) {
username, exists := c.Get("username")
if !exists {
utils.Unauthorized(c, "未登录")
return
}
utils.Success(c, gin.H{
"username": username,
})
}
func (ac *AuthController) Register(c *gin.Context) {
var req struct {
Username string `json:"username" binding:"required"`
Email string `json:"email" binding:"required"`
Password string `json:"password" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, err.Error())
return
}
user := ac.userService.CreateUser(req.Username, req.Email, req.Password, "user")
utils.Success(c, user)
}