78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
package system
|
||
|
||
import (
|
||
"kra/pkg/jwt"
|
||
"kra/pkg/response"
|
||
"kra/pkg/utils"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
type BaseApi struct{}
|
||
|
||
// LoginRequest 登录请求
|
||
type LoginRequest struct {
|
||
Username string `json:"username" binding:"required"`
|
||
Password string `json:"password" binding:"required"`
|
||
Captcha string `json:"captcha"`
|
||
CaptchaId string `json:"captchaId"`
|
||
}
|
||
|
||
// LoginResponse 登录响应
|
||
type LoginResponse struct {
|
||
User interface{} `json:"user"`
|
||
Token string `json:"token"`
|
||
ExpiresAt int64 `json:"expiresAt"`
|
||
}
|
||
|
||
// JWT实例(需要在初始化时设置)
|
||
var jwtInstance *jwt.JWT
|
||
|
||
// SetJWTInstance 设置JWT实例
|
||
func SetJWTInstance(j *jwt.JWT) {
|
||
jwtInstance = j
|
||
}
|
||
|
||
// Login 用户登录
|
||
func (b *BaseApi) Login(c *gin.Context) {
|
||
var req LoginRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
response.FailWithMessage(err.Error(), c)
|
||
return
|
||
}
|
||
|
||
user, err := userUsecase.Login(c, req.Username, req.Password)
|
||
if err != nil {
|
||
response.FailWithMessage("用户名不存在或者密码错误", c)
|
||
return
|
||
}
|
||
|
||
if user.Enable != 1 {
|
||
response.FailWithMessage("用户被禁止登录", c)
|
||
return
|
||
}
|
||
|
||
// 生成token
|
||
claims := jwtInstance.CreateClaims(jwt.BaseClaims{
|
||
UUID: user.UUID.String(),
|
||
ID: user.ID,
|
||
Username: user.Username,
|
||
NickName: user.NickName,
|
||
AuthorityID: user.AuthorityId,
|
||
})
|
||
|
||
token, err := jwtInstance.CreateToken(claims.BaseClaims)
|
||
if err != nil {
|
||
response.FailWithMessage("获取token失败", c)
|
||
return
|
||
}
|
||
|
||
utils.SetToken(c, token, int(jwtInstance.ExpiresAt.Seconds()))
|
||
|
||
response.OkWithDetailed(LoginResponse{
|
||
User: toUserResponse(user),
|
||
Token: token,
|
||
ExpiresAt: claims.ExpiresAt.UnixMilli(),
|
||
}, "登录成功", c)
|
||
}
|