389 lines
9.3 KiB
Go
389 lines
9.3 KiB
Go
package controllers
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"server/models"
|
||
|
||
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 string
|
||
|
||
// 优先尝试从URL参数获取(Apifox测试方式)
|
||
username = c.GetString("username")
|
||
password = c.GetString("password")
|
||
|
||
// 如果URL参数为空,尝试从JSON请求体获取(前端方式)
|
||
if username == "" || password == "" {
|
||
var loginData struct {
|
||
Username string `json:"username"`
|
||
Password string `json:"password"`
|
||
}
|
||
|
||
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
|
||
}
|
||
|
||
// 添加日志调试
|
||
fmt.Println("接收到的登录请求:")
|
||
fmt.Println("用户名:", username)
|
||
fmt.Println("密码:", password)
|
||
|
||
// 验证用户
|
||
fmt.Println("开始验证用户:", username)
|
||
user, err := models.ValidateUser(username, password)
|
||
fmt.Println("验证结果:", err)
|
||
if user != nil {
|
||
fmt.Println("用户信息:ID=", user.Id, "Username=", user.Username, "Salt=", user.Salt)
|
||
}
|
||
|
||
if err != nil {
|
||
// 登录失败
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户名或密码错误",
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
// 使用models包中的GenerateToken函数生成token
|
||
tokenString, err := models.GenerateToken(user.Id, user.Username)
|
||
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "生成token失败",
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
// 登录成功
|
||
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,
|
||
},
|
||
},
|
||
}
|
||
}
|
||
}
|
||
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// ResetPassword 重置用户密码
|
||
func (c *AuthController) ResetPassword() {
|
||
// 获取请求参数
|
||
username := c.GetString("username")
|
||
superPassword := c.GetString("superPassword")
|
||
|
||
// 调用模型方法
|
||
err := models.ResetPassword(username, superPassword)
|
||
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{"success": false, "message": err.Error()}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{"success": true, "message": "密码重置成功"}
|
||
}
|
||
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// ChangePassword 修改用户密码
|
||
func (c *AuthController) ChangePassword() {
|
||
// 获取请求参数
|
||
username := c.GetString("username")
|
||
oldPassword := c.GetString("oldPassword")
|
||
newPassword := c.GetString("newPassword")
|
||
|
||
// 调用模型方法
|
||
err := models.ChangePassword(username, oldPassword, newPassword)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{"success": false, "message": err.Error()}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{"success": true, "message": "密码修改成功"}
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// Logout 处理登出请求
|
||
func (c *AuthController) Logout() {
|
||
// 在实际应用中,这里需要处理JWT或Session的清除
|
||
c.Data["json"] = map[string]interface{}{
|
||
"success": true,
|
||
"message": "登出成功",
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// FindAllUsers 获取所有用户
|
||
func (c *AuthController) FindAllUsers() {
|
||
users := models.FindAllUsers()
|
||
c.Data["json"] = map[string]interface{}{
|
||
"success": true,
|
||
"message": "获取用户列表成功",
|
||
"data": users,
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// GetUserByUsername 通过用户名查询用户信息
|
||
func (c *AuthController) GetUserByUsername() {
|
||
// 获取请求参数中的用户名
|
||
username := c.GetString("username")
|
||
if username == "" {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户名不能为空",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 调用模型层方法查询用户
|
||
user, err := models.GetUserByUsername(username) // 假设models层有这个方法
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "查询用户失败: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
} else if user == nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户不存在",
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 0,
|
||
"message": "查询成功",
|
||
"data": map[string]interface{}{
|
||
"id": user.Id,
|
||
"username": user.Username,
|
||
"email": user.Email,
|
||
"avatar": user.Avatar,
|
||
"nickname": user.Nickname,
|
||
// 其他需要返回的用户字段
|
||
},
|
||
}
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// AddUser 添加新用户
|
||
func (c *AuthController) AddUser() {
|
||
// 定义接收用户数据的结构体(与JSON请求体对应)
|
||
var userData struct {
|
||
Username string `json:"username"`
|
||
Password string `json:"password"`
|
||
Email string `json:"email"`
|
||
Nickname string `json:"nickname"`
|
||
Avatar string `json:"avatar"`
|
||
}
|
||
|
||
// 解析请求体JSON数据
|
||
err := json.Unmarshal(c.Ctx.Input.RequestBody, &userData)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "请求参数格式错误: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 校验必要参数
|
||
if userData.Username == "" {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户名不能为空",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
if userData.Password == "" {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "密码不能为空",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 调用模型层方法添加用户(传递参数,接收新用户对象)
|
||
newUser, err := models.AddUser(
|
||
userData.Username,
|
||
userData.Password,
|
||
userData.Email,
|
||
userData.Nickname,
|
||
userData.Avatar,
|
||
)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "添加用户失败: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 0,
|
||
"message": "用户添加成功",
|
||
"data": map[string]interface{}{
|
||
"id": newUser.Id,
|
||
"username": newUser.Username,
|
||
"email": newUser.Email,
|
||
"nickname": newUser.Nickname,
|
||
"avatar": newUser.Avatar,
|
||
},
|
||
}
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// UpdateUser 更新用户信息
|
||
func (c *AuthController) UpdateUser() {
|
||
// 定义接收更新数据的结构体
|
||
var updateData struct {
|
||
Id int `json:"id"` // 必须包含用户ID,用于定位要更新的用户
|
||
Username string `json:"username"` // 可选更新字段
|
||
Email string `json:"email"` // 可选更新字段
|
||
Nickname string `json:"nickname"` // 可选更新字段
|
||
Avatar string `json:"avatar"` // 可选更新字段
|
||
}
|
||
|
||
// 解析请求体JSON
|
||
err := json.Unmarshal(c.Ctx.Input.RequestBody, &updateData)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "请求参数格式错误: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 校验必要参数(用户ID不能为空)
|
||
if updateData.Id == 0 {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户ID不能为空",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 调用模型层方法更新用户
|
||
updatedUser, err := models.UpdateUser(
|
||
updateData.Id,
|
||
updateData.Username,
|
||
updateData.Email,
|
||
updateData.Nickname,
|
||
updateData.Avatar,
|
||
)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "更新用户失败: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 0,
|
||
"message": "用户更新成功",
|
||
"data": map[string]interface{}{
|
||
"id": updatedUser.Id,
|
||
"username": updatedUser.Username,
|
||
"email": updatedUser.Email,
|
||
"nickname": updatedUser.Nickname,
|
||
"avatar": updatedUser.Avatar,
|
||
},
|
||
}
|
||
}
|
||
c.ServeJSON()
|
||
}
|
||
|
||
// DeleteUser 删除用户
|
||
func (c *AuthController) DeleteUser() {
|
||
// 获取要删除的用户ID(从URL参数或请求体中获取)
|
||
userId, err := c.GetInt("id") // 从URL参数获取,如 /user?id=1
|
||
if err != nil {
|
||
// 若URL参数获取失败,尝试从JSON请求体获取
|
||
var deleteData struct {
|
||
Id int `json:"id"`
|
||
}
|
||
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &deleteData); err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "用户ID获取失败: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
userId = deleteData.Id
|
||
}
|
||
|
||
// 校验用户ID
|
||
if userId <= 0 {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "无效的用户ID",
|
||
"data": nil,
|
||
}
|
||
c.ServeJSON()
|
||
return
|
||
}
|
||
|
||
// 调用模型层方法删除用户
|
||
err = models.DeleteUser(userId)
|
||
if err != nil {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 1,
|
||
"message": "删除用户失败: " + err.Error(),
|
||
"data": nil,
|
||
}
|
||
} else {
|
||
c.Data["json"] = map[string]interface{}{
|
||
"code": 0,
|
||
"message": "用户删除成功",
|
||
"data": nil,
|
||
}
|
||
}
|
||
c.ServeJSON()
|
||
}
|