96 lines
2.6 KiB
Go
96 lines
2.6 KiB
Go
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,
|
||
})
|
||
}
|