Files
huangjin fe3ad20fe2 'init'
2026-06-29 17:34:59 +08:00

96 lines
2.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package admin
import (
"crypto/sha256"
"fmt"
"com.sclktx/m/v2/internal/common/model"
"com.sclktx/m/v2/internal/common/response"
"com.sclktx/m/v2/internal/common/utils"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type AdminAuthHandler struct {
db *gorm.DB
jwtSecret string
expireHours int
}
func NewAdminAuthHandler(db *gorm.DB, jwtSecret string, expireHours int) *AdminAuthHandler {
return &AdminAuthHandler{db: db, jwtSecret: jwtSecret, expireHours: expireHours}
}
type AdminLoginRequest struct {
Account string `json:"account" binding:"required"`
Password string `json:"password" binding:"required"`
}
// @Summary 管理员登录
// @Description 管理员账号密码登录返回JWT token
// @Tags 管理员
// @Accept json
// @Produce json
// @Param body body AdminLoginRequest true "管理员登录信息"
// @Success 200 {object} response.Response{data=object{token=string,admin_id=uint,account=string,name=string,is_super=bool}} "成功"
// @Router /admin/login [post]
func (h *AdminAuthHandler) Login(c *gin.Context) {
var req AdminLoginRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误")
return
}
var admin model.AdminUser
if err := h.db.Where("account = ? AND status = 1", req.Account).First(&admin).Error; err != nil {
response.Unauthorized(c, "账号或密码错误")
return
}
hashed := fmt.Sprintf("%x", sha256.Sum256([]byte(req.Password)))
if admin.Password != hashed {
response.Unauthorized(c, "账号或密码错误")
return
}
token, err := utils.GenerateAdminToken(admin.ID, admin.Account, h.jwtSecret, h.expireHours)
if err != nil {
response.InternalError(c, "生成令牌失败")
return
}
response.Success(c, gin.H{
"token": token,
"admin_id": admin.ID,
"account": admin.Account,
"name": admin.Name,
"is_super": admin.IsSuper,
})
}
// @Summary 获取管理员信息
// @Description 获取当前登录管理员的个人信息
// @Tags 管理员
// @Accept json
// @Produce json
// @Security BearerAuth
// @Success 200 {object} response.Response{data=object{id=uint,account=string,name=string,is_super=bool}} "成功"
// @Router /admin/profile [get]
func (h *AdminAuthHandler) GetProfile(c *gin.Context) {
adminID, _ := c.Get("admin_id")
var admin model.AdminUser
if err := h.db.First(&admin, adminID).Error; err != nil {
response.NotFound(c, "管理员不存在")
return
}
response.Success(c, gin.H{
"id": admin.ID,
"account": admin.Account,
"name": admin.Name,
"is_super": admin.IsSuper,
})
}