499 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			499 lines
		
	
	
		
			13 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, tenantName string
 | ||
| 
 | ||
| 	// 优先尝试从URL参数获取(Apifox测试方式)
 | ||
| 	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
 | ||
| 	}
 | ||
| 
 | ||
| 	// 添加日志调试
 | ||
| 	fmt.Println("接收到的登录请求:")
 | ||
| 	fmt.Println("用户名:", username)
 | ||
| 	fmt.Println("租户名称:", tenantName)
 | ||
| 
 | ||
| 	// 验证用户(先验证租户,再验证租户下的用户)
 | ||
| 	fmt.Println("开始验证用户:", username, "租户:", tenantName)
 | ||
| 	user, err := models.ValidateUser(username, password, tenantName)
 | ||
| 	fmt.Println("验证结果:", err)
 | ||
| 	if user != nil {
 | ||
| 		fmt.Println("用户信息:ID=", user.Id, "Username=", user.Username, "TenantId=", user.TenantId)
 | ||
| 	}
 | ||
| 
 | ||
| 	if err != nil {
 | ||
| 		// 登录失败
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": err.Error(),
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 	} else {
 | ||
| 		// 使用models包中的GenerateToken函数生成token(包含租户ID)
 | ||
| 		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 {
 | ||
| 			// 登录成功
 | ||
| 			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()
 | ||
| }
 | ||
| 
 | ||
| // ResetPassword 重置用户密码(支持租户模式)
 | ||
| func (c *AuthController) ResetPassword() {
 | ||
| 	// 获取请求参数
 | ||
| 	username := c.GetString("username")
 | ||
| 	superPassword := c.GetString("superPassword")
 | ||
| 	tenantId, _ := c.GetInt("tenant_id", 0)
 | ||
| 
 | ||
| 	// 如果URL参数中没有租户ID,尝试从JSON请求体获取
 | ||
| 	if tenantId == 0 {
 | ||
| 		var resetData struct {
 | ||
| 			Username      string `json:"username"`
 | ||
| 			SuperPassword string `json:"superPassword"`
 | ||
| 			TenantId      int    `json:"tenant_id"`
 | ||
| 		}
 | ||
| 		if err := json.Unmarshal(c.Ctx.Input.RequestBody, &resetData); err == nil {
 | ||
| 			username = resetData.Username
 | ||
| 			superPassword = resetData.SuperPassword
 | ||
| 			tenantId = resetData.TenantId
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	if tenantId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{"success": false, "message": "租户ID不能为空"}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	// 调用模型方法
 | ||
| 	err := models.ResetPassword(username, superPassword, tenantId)
 | ||
| 
 | ||
| 	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")
 | ||
| 	tenantId, _ := c.GetInt("tenant_id", 0)
 | ||
| 
 | ||
| 	// 如果URL参数中没有租户ID,尝试从JSON请求体获取
 | ||
| 	if tenantId == 0 {
 | ||
| 		var changeData struct {
 | ||
| 			Username    string `json:"username"`
 | ||
| 			OldPassword string `json:"oldPassword"`
 | ||
| 			NewPassword string `json:"newPassword"`
 | ||
| 			TenantId    int    `json:"tenant_id"`
 | ||
| 		}
 | ||
| 		if err := json.Unmarshal(c.Ctx.Input.RequestBody, &changeData); err == nil {
 | ||
| 			username = changeData.Username
 | ||
| 			oldPassword = changeData.OldPassword
 | ||
| 			newPassword = changeData.NewPassword
 | ||
| 			tenantId = changeData.TenantId
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	if tenantId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{"success": false, "message": "租户ID不能为空"}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	// 调用模型方法
 | ||
| 	err := models.ChangePassword(username, oldPassword, newPassword, tenantId)
 | ||
| 	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() {
 | ||
| 	// 从查询参数获取租户ID(可选)
 | ||
| 	tenantId, _ := c.GetInt("tenant_id", 0)
 | ||
| 	users := models.FindAllUsers(tenantId)
 | ||
| 	c.Data["json"] = map[string]interface{}{
 | ||
| 		"success": true,
 | ||
| 		"message": "获取用户列表成功",
 | ||
| 		"data":    users,
 | ||
| 	}
 | ||
| 	c.ServeJSON()
 | ||
| }
 | ||
| 
 | ||
| // GetUserByUsername 通过用户名查询用户信息(支持租户模式)
 | ||
| func (c *AuthController) GetUserByUsername() {
 | ||
| 	// 获取请求参数中的用户名和租户ID
 | ||
| 	username := c.GetString("username")
 | ||
| 	tenantId, _ := c.GetInt("tenant_id", 0)
 | ||
| 
 | ||
| 	if username == "" {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "用户名不能为空",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	if tenantId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "租户ID不能为空",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	// 调用模型层方法查询用户
 | ||
| 	user, err := models.GetUserByUsername(username, tenantId)
 | ||
| 	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,
 | ||
| 				"tenant_id": user.TenantId,
 | ||
| 			},
 | ||
| 		}
 | ||
| 	}
 | ||
| 	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"`
 | ||
| 		TenantId int    `json:"tenant_id"`
 | ||
| 	}
 | ||
| 
 | ||
| 	// 解析请求体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
 | ||
| 	}
 | ||
| 	if userData.TenantId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "租户ID不能为空",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	// 调用模型层方法添加用户(传递参数,接收新用户对象)
 | ||
| 	newUser, err := models.AddUser(
 | ||
| 		userData.Username,
 | ||
| 		userData.Password,
 | ||
| 		userData.Email,
 | ||
| 		userData.Nickname,
 | ||
| 		userData.Avatar,
 | ||
| 		userData.TenantId,
 | ||
| 	)
 | ||
| 	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,
 | ||
| 				"tenant_id": newUser.TenantId,
 | ||
| 			},
 | ||
| 		}
 | ||
| 	}
 | ||
| 	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"`    // 可选更新字段
 | ||
| 		TenantId int    `json:"tenant_id"` // 必须包含租户ID,用于验证用户归属
 | ||
| 	}
 | ||
| 
 | ||
| 	// 解析请求体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和租户ID不能为空)
 | ||
| 	if updateData.Id == 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "用户ID不能为空",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 	if updateData.TenantId <= 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,
 | ||
| 		updateData.TenantId,
 | ||
| 	)
 | ||
| 	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,
 | ||
| 				"tenant_id": updatedUser.TenantId,
 | ||
| 			},
 | ||
| 		}
 | ||
| 	}
 | ||
| 	c.ServeJSON()
 | ||
| }
 | ||
| 
 | ||
| // DeleteUser 删除用户(支持租户模式)
 | ||
| func (c *AuthController) DeleteUser() {
 | ||
| 	// 获取要删除的用户ID和租户ID(从URL参数或请求体中获取)
 | ||
| 	userId, err := c.GetInt("id") // 从URL参数获取,如 /user?id=1
 | ||
| 	tenantId, _ := c.GetInt("tenant_id", 0)
 | ||
| 
 | ||
| 	if err != nil || tenantId == 0 {
 | ||
| 		// 若URL参数获取失败,尝试从JSON请求体获取
 | ||
| 		var deleteData struct {
 | ||
| 			Id       int `json:"id"`
 | ||
| 			TenantId int `json:"tenant_id"`
 | ||
| 		}
 | ||
| 		if err := json.Unmarshal(c.Ctx.Input.RequestBody, &deleteData); err != nil {
 | ||
| 			c.Data["json"] = map[string]interface{}{
 | ||
| 				"code":    1,
 | ||
| 				"message": "用户ID或租户ID获取失败: " + err.Error(),
 | ||
| 				"data":    nil,
 | ||
| 			}
 | ||
| 			c.ServeJSON()
 | ||
| 			return
 | ||
| 		}
 | ||
| 		userId = deleteData.Id
 | ||
| 		tenantId = deleteData.TenantId
 | ||
| 	}
 | ||
| 
 | ||
| 	// 校验用户ID和租户ID
 | ||
| 	if userId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "无效的用户ID",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 	if tenantId <= 0 {
 | ||
| 		c.Data["json"] = map[string]interface{}{
 | ||
| 			"code":    1,
 | ||
| 			"message": "租户ID不能为空",
 | ||
| 			"data":    nil,
 | ||
| 		}
 | ||
| 		c.ServeJSON()
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	// 调用模型层方法删除用户
 | ||
| 	err = models.DeleteUser(userId, tenantId)
 | ||
| 	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()
 | ||
| }
 |