This commit is contained in:
sjk
2026-01-06 19:36:42 +08:00
parent 15b579d64a
commit 19942144fb
261 changed files with 24034 additions and 5477 deletions

View File

@@ -6,6 +6,7 @@ import (
"ai_xhs/models"
"ai_xhs/utils"
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
@@ -188,9 +189,9 @@ func (s *AuthService) WechatLogin(code string, phone string, phoneCode string) (
return fmt.Errorf("保存微信绑定信息失败: %v", err)
}
// 2. 检查是否已存在作者记录(通过手机号和企业ID
// 2. 检查是否已存在作者记录(通过 created_user_id 和企业ID
var existingAuthor models.Author
result := tx.Where("phone = ? AND enterprise_id = ?", employee.Phone, employee.EnterpriseID).First(&existingAuthor)
result := tx.Where("created_user_id = ? AND enterprise_id = ?", employee.ID, employee.EnterpriseID).First(&existingAuthor)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
// 作者记录不存在,创建新记录
@@ -201,7 +202,7 @@ func (s *AuthService) WechatLogin(code string, phone string, phoneCode string) (
AuthorName: employee.RealName,
Department: employee.Department,
Status: "active",
Channel: 3, // 3=weixin (微信小程序
Channel: 1, // 1=小红书(默认渠道
}
// 如果真实姓名为空,使用用户名
@@ -213,7 +214,7 @@ func (s *AuthService) WechatLogin(code string, phone string, phoneCode string) (
return fmt.Errorf("创建作者记录失败: %v", err)
}
log.Printf("[微信登录] 创建作者记录成功: ID=%d, Name=%s", author.ID, author.AuthorName)
log.Printf("[微信登录] 创建作者记录成功: ID=%d, Name=%s, Channel=1(小红书)", author.ID, author.AuthorName)
} else if result.Error != nil {
// 其他数据库错误
return fmt.Errorf("检查作者记录失败: %v", result.Error)
@@ -237,6 +238,15 @@ func (s *AuthService) WechatLogin(code string, phone string, phoneCode string) (
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 5. 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[微信登录] 存储token到Redis失败: %v", err)
// 不阻断登录流程,但记录错误
} else {
log.Printf("[微信登录] 用户%d token已存入Redis", employee.ID)
}
return token, &employee, nil
}
@@ -256,6 +266,12 @@ func (s *AuthService) PhoneLogin(phone string) (string, *models.User, error) {
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[手机号登录] 存储token到Redis失败: %v", err)
}
return token, &employee, nil
}
@@ -274,5 +290,154 @@ func (s *AuthService) loginByEmployeeID(employeeID int) (string, *models.User, e
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[ID登录] 存储token到Redis失败: %v", err)
}
return token, &employee, nil
}
// PhonePasswordLogin 手机号密码登录
func (s *AuthService) PhonePasswordLogin(phone string, password string) (string, *models.User, error) {
if phone == "" || password == "" {
return "", nil, errors.New("手机号和密码不能为空")
}
var employee models.User
// 查找员工
result := database.DB.Where("phone = ? AND status = ?", phone, "active").First(&employee)
if result.Error != nil {
return "", nil, errors.New("手机号或密码错误")
}
// 验证密码
if !utils.VerifyPassword(password, employee.Password) {
return "", nil, errors.New("手机号或密码错误")
}
// 生成token
token, err := utils.GenerateToken(employee.ID)
if err != nil {
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[密码登录] 存储token到Redis失败: %v", err)
}
return token, &employee, nil
}
// CheckPhoneExists 检查手机号是否存在于user表中
func (s *AuthService) CheckPhoneExists(phone string) error {
var count int64
result := database.DB.Model(&models.User{}).Where("phone = ? AND status = ?", phone, "active").Count(&count)
if result.Error != nil {
return fmt.Errorf("查询用户信息失败: %v", result.Error)
}
if count == 0 {
return errors.New("手机号未注册,请联系管理员添加")
}
return nil
}
// XHSPhoneCodeLogin 小红书手机号验证码登录
func (s *AuthService) XHSPhoneCodeLogin(phone string, code string) (string, *models.User, error) {
if phone == "" || code == "" {
return "", nil, errors.New("手机号和验证码不能为空")
}
// 调用短信服务验证验证码
smsService := GetSmsService()
if err := smsService.VerifyCode(phone, code); err != nil {
return "", nil, err
}
var employee models.User
// 查找员工
result := database.DB.Where("phone = ? AND status = ?", phone, "active").First(&employee)
if result.Error != nil {
// 用户不存在,不允许登录
return "", nil, errors.New("手机号未注册,请联系管理员添加")
}
// 生成token
token, err := utils.GenerateToken(employee.ID)
if err != nil {
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[验证码登录] 存储token到Redis失败: %v", err)
}
return token, &employee, nil
}
// createNewUserFromPhone 从手机号创建新用户
func (s *AuthService) createNewUserFromPhone(phone string) (string, *models.User, error) {
// 使用事务创建用户和作者记录
var employee models.User
err := database.DB.Transaction(func(tx *gorm.DB) error {
// 1. 创建用户记录
employee = models.User{
Phone: phone,
Username: phone, // 默认用户名为手机号
Role: "user",
Status: "active",
EnterpriseID: 1, // 默认企业ID可根据实际调整
EnterpriseName: "默认企业", // 默认企业名称
}
if err := tx.Create(&employee).Error; err != nil {
return fmt.Errorf("创建用户失败: %v", err)
}
// 2. 创建作者记录
author := models.Author{
EnterpriseID: employee.EnterpriseID,
CreatedUserID: employee.ID,
Phone: employee.Phone,
AuthorName: employee.Username,
Department: "",
Status: "active",
Channel: 1, // 1=小红书
}
if err := tx.Create(&author).Error; err != nil {
return fmt.Errorf("创建作者记录失败: %v", err)
}
log.Printf("[手机号登录] 创建新用户成功: Phone=%s, UserID=%d, AuthorID=%d", phone, employee.ID, author.ID)
return nil
})
if err != nil {
return "", nil, err
}
// 生成token
token, err := utils.GenerateToken(employee.ID)
if err != nil {
return "", nil, fmt.Errorf("生成token失败: %v", err)
}
// 将token存入Redis
ctx := context.Background()
if err := utils.StoreTokenInRedis(ctx, employee.ID, token); err != nil {
log.Printf("[新用户登录] 存储token到Redis失败: %v", err)
}
return token, &employee, nil
}