Files
ai_wht_wechat/go_backend/controller/auth_controller.go
2026-01-06 19:36:42 +08:00

238 lines
6.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"ai_xhs/common"
"ai_xhs/config"
"ai_xhs/service"
"ai_xhs/utils"
"context"
"github.com/gin-gonic/gin"
)
type AuthController struct {
authService *service.AuthService
}
func NewAuthController() *AuthController {
return &AuthController{
authService: service.NewAuthService(),
}
}
// WechatLogin 微信小程序登录
func (ctrl *AuthController) WechatLogin(c *gin.Context) {
var req struct {
Code string `json:"code" binding:"required"`
Phone string `json:"phone"` // 可选,员工手机号(直接传明文)
PhoneCode string `json:"phone_code"` // 可选微信手机号加密code
}
if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, common.CodeInvalidParams, "参数错误: "+err.Error())
return
}
// 调用登录服务
token, employee, err := ctrl.authService.WechatLogin(req.Code, req.Phone, req.PhoneCode)
if err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 获取用户显示名称(优先使用真实姓名,其次用户名)
displayName := employee.RealName
if displayName == "" {
displayName = employee.Username
}
common.SuccessWithMessage(c, "登录成功", gin.H{
"token": token,
"employee": gin.H{
"id": employee.ID,
"name": displayName,
"username": employee.Username,
"real_name": employee.RealName,
"phone": employee.Phone,
"role": employee.Role,
"enterprise_id": employee.EnterpriseID,
"enterprise_name": employee.EnterpriseName,
"is_bound_xhs": employee.IsBoundXHS,
},
})
}
// PhoneLogin 手机号登录(用于测试)
func (ctrl *AuthController) PhoneLogin(c *gin.Context) {
var req struct {
Phone string `json:"phone" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, common.CodeInvalidParams, "参数错误: "+err.Error())
return
}
// 调用手机号登录服务
token, employee, err := ctrl.authService.PhoneLogin(req.Phone)
if err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 获取用户显示名称(优先使用真实姓名,其次用户名)
displayName := employee.RealName
if displayName == "" {
displayName = employee.Username
}
common.SuccessWithMessage(c, "登录成功", gin.H{
"token": token,
"employee": gin.H{
"id": employee.ID,
"name": displayName,
"username": employee.Username,
"real_name": employee.RealName,
"phone": employee.Phone,
"role": employee.Role,
"enterprise_id": employee.EnterpriseID,
"enterprise_name": employee.EnterpriseName,
"is_bound_xhs": employee.IsBoundXHS,
},
})
}
// PhonePasswordLogin 手机号密码登录
func (ctrl *AuthController) PhonePasswordLogin(c *gin.Context) {
var req struct {
Phone string `json:"phone" binding:"required"`
Password string `json:"password" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, common.CodeInvalidParams, "参数错误: "+err.Error())
return
}
// 调用手机号密码登录服务
token, employee, err := ctrl.authService.PhonePasswordLogin(req.Phone, req.Password)
if err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 获取用户显示名称(优先使用真实姓名,其次用户名)
displayName := employee.RealName
if displayName == "" {
displayName = employee.Username
}
common.SuccessWithMessage(c, "登录成功", gin.H{
"token": token,
"employee": gin.H{
"id": employee.ID,
"name": displayName,
"username": employee.Username,
"real_name": employee.RealName,
"phone": employee.Phone,
"role": employee.Role,
"enterprise_id": employee.EnterpriseID,
"enterprise_name": employee.EnterpriseName,
"is_bound_xhs": employee.IsBoundXHS,
},
})
}
// XHSPhoneCodeLogin 小红书手机号验证码登录
func (ctrl *AuthController) XHSPhoneCodeLogin(c *gin.Context) {
var req struct {
Phone string `json:"phone" binding:"required"`
Code string `json:"code" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, common.CodeInvalidParams, "参数错误: "+err.Error())
return
}
// 调用手机号验证码登录服务
token, employee, err := ctrl.authService.XHSPhoneCodeLogin(req.Phone, req.Code)
if err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 获取用户显示名称(优先使用真实姓名,其次用户名)
displayName := employee.RealName
if displayName == "" {
displayName = employee.Username
}
common.SuccessWithMessage(c, "登录成功", gin.H{
"token": token,
"employee": gin.H{
"id": employee.ID,
"name": displayName,
"username": employee.Username,
"real_name": employee.RealName,
"phone": employee.Phone,
"role": employee.Role,
"enterprise_id": employee.EnterpriseID,
"enterprise_name": employee.EnterpriseName,
"is_bound_xhs": employee.IsBoundXHS,
},
})
}
// SendXHSVerificationCode 发送小红书手机号验证码
func (ctrl *AuthController) SendXHSVerificationCode(c *gin.Context) {
var req struct {
Phone string `json:"phone" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
common.Error(c, common.CodeInvalidParams, "参数错误: "+err.Error())
return
}
// 预检查验证手机号是否存在于user表中
if err := ctrl.authService.CheckPhoneExists(req.Phone); err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 调用短信服务发送验证码
smsService := service.GetSmsService()
code, err := smsService.SendVerificationCode(req.Phone)
if err != nil {
common.Error(c, common.CodeServerError, err.Error())
return
}
// 开发环境返回验证码,生产环境不返回
response := gin.H{
"message": "验证码已发送5分钟内有效",
}
if config.AppConfig.Server.Mode == "debug" {
response["code"] = code // 仅开发环境返回
}
common.SuccessWithMessage(c, "验证码已发送", response)
}
// Logout 退出登录删除Redis中的Token
func (ctrl *AuthController) Logout(c *gin.Context) {
employeeID := c.GetInt("employee_id")
// 从Redis删除token
ctx := context.Background()
if err := utils.RevokeToken(ctx, employeeID); err != nil {
// 即使删除失败也返回成功因为token有过期时间
common.SuccessWithMessage(c, "退出成功", nil)
return
}
common.SuccessWithMessage(c, "退出成功", nil)
}