commit
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user