120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
package controllers
|
||
|
||
import (
|
||
"encoding/json"
|
||
"server/models"
|
||
"time"
|
||
|
||
"github.com/beego/beego/v2/client/orm"
|
||
beego "github.com/beego/beego/v2/server/web"
|
||
)
|
||
|
||
// 用于签名的密钥
|
||
var jwtSecret = []byte("yunzer_jwt_secret_key")
|
||
|
||
// AuthController 处理认证相关请求
|
||
type AuthController struct {
|
||
beego.Controller
|
||
}
|
||
|
||
// Login 处理登录请求
|
||
func (c *AuthController) Login() {
|
||
var username, password, tenantName string
|
||
|
||
// 优先尝试从URL参数获取
|
||
username = c.GetString("username")
|
||
password = c.GetString("password")
|
||
tenantName = c.GetString("tenant_name")
|
||
|
||
// 如果URL参数为空,尝试从JSON请求体获取
|
||
if username == "" || password == "" || tenantName == "" {
|
||
var loginData struct {
|
||
Username string `json:"username"`
|
||
Password string `json:"password"`
|
||
TenantName string `json:"tenant_name"`
|
||
}
|
||
|
||
err := json.Unmarshal(c.Ctx.Input.RequestBody, &loginData)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "请求参数格式错误",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
username = loginData.Username
|
||
password = loginData.Password
|
||
tenantName = loginData.TenantName
|
||
}
|
||
|
||
// 验证参数
|
||
if tenantName == "" {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "租户名称不能为空",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 验证用户(先验证租户,再验证租户下的用户)
|
||
user, err := models.ValidateUser(username, password, tenantName)
|
||
|
||
if err != nil {
|
||
// 登录失败
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": err.Error(),
|
||
}
|
||
} else {
|
||
// 使用models包中的GenerateToken函数生成token
|
||
tokenString, err := models.GenerateToken(user.Id, user.Username, user.TenantId)
|
||
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "生成token失败",
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
// 登录成功,写当前时间到last_login_time,并增加login_count
|
||
loginTime := time.Now()
|
||
o := orm.NewOrm()
|
||
_, _ = o.Raw("UPDATE yz_users SET last_login_time = ?, login_count = IFNULL(login_count,0)+1 WHERE id = ?", loginTime, user.Id).Exec()
|
||
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 0,
|
||
"message": "登录成功",
|
||
"data": map[string]interface{}{
|
||
"accessToken": tokenString,
|
||
"token": tokenString, // 兼容性
|
||
"user": map[string]interface{}{
|
||
"id": user.Id,
|
||
"username": user.Username,
|
||
"email": user.Email,
|
||
"avatar": user.Avatar,
|
||
"nickname": user.Nickname,
|
||
"tenant_id": user.TenantId,
|
||
},
|
||
},
|
||
}
|
||
}
|
||
}
|
||
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// Logout 处理登出请求
|
||
func (c *AuthController) Logout() {
|
||
// 在实际应用中,这里需要处理JWT或Session的清除
|
||
c.Data["json"] = map[string]interface{}{
|
||
"success": true,
|
||
"message": "登出成功",
|
||
}
|
||
c.ServeJSON()
|
||
}
|