topfans/backend/services/userService/repository
..
fan_profile_repository_test.go
fan_profile_repository.go
README.md
star_repository_test.go
star_repository.go
user_repository_test.go
user_repository.go

Repository层

数据访问层,负责与数据库交互。

用户Repository

功能

  • 用户CRUD操作
  • 根据手机号查询用户
  • 更新用户Token
  • 验证用户密码bcrypt
  • 密码加密HashPassword辅助函数

使用方法

import (
    "github.com/topfans/backend/services/userService/repository"
    "github.com/topfans/backend/pkg/models"
)

// 创建Repository实例
userRepo := repository.NewUserRepository()

// 1. 创建用户
hashedPassword, _ := repository.HashPassword("password123")
user := &models.User{
    Mobile:       "13800000000",
    PasswordHash: hashedPassword,
    IsActive:     true,
}
err := userRepo.Create(user)

// 2. 根据ID查询
user, err := userRepo.GetByID(10000001)

// 3. 根据手机号查询
user, err := userRepo.GetByMobile("13800000000")

// 4. 更新用户
user.AvatarURL = &avatarURL
err := userRepo.Update(user)

// 5. 更新Token
err := userRepo.UpdateToken(userID, token, expiresAt)

// 6. 清除Token登出
err := userRepo.ClearToken(userID)

// 7. 验证密码
isValid := userRepo.VerifyPassword(user, "password123")

密码加密

使用bcrypt进行密码加密确保安全性

// 加密密码
hashedPassword, err := repository.HashPassword("password123")

// 验证密码
isValid := userRepo.VerifyPassword(user, "password123")

注意事项

  1. 密码加密:创建用户前必须先使用HashPassword加密密码
  2. 软删除GetByIDGetByMobile只会返回is_active=true的用户
  3. Token更新UpdateToken会同时更新access_tokentoken_expires_at
  4. 时间戳创建和更新操作会自动设置时间戳通过Model的BeforeCreate/BeforeUpdate钩子

错误处理

  • 所有方法都会返回error需要检查
  • 用户不存在时返回"user not found"错误
  • 无效参数时返回相应的错误信息

粉丝档案Repository

功能

  • 粉丝档案CRUD操作
  • 根据user_id + star_id查询
  • 查询用户的所有粉丝身份
  • 检查用户粉丝身份数量
  • 更新粉丝档案和昵称

使用方法

fanProfileRepo := repository.NewFanProfileRepository()

// 1. 创建粉丝档案
profile := &models.FanProfile{
    UserID:   10000001,
    StarID:   123,
    Nickname: "爱战战",
    Level:    1,
    Times:    3,
}
err := fanProfileRepo.Create(profile)

// 2. 根据user_id + star_id查询
profile, err := fanProfileRepo.GetByUserAndStar(10000001, 123)

// 3. 查询用户的所有粉丝身份
profiles, err := fanProfileRepo.GetByUserID(10000001)

// 4. 统计用户粉丝身份数量
count, err := fanProfileRepo.CountByUserID(10000001)

// 5. 更新昵称
err := fanProfileRepo.UpdateNickname(10000001, 123, "新昵称")

明星Repository

功能

  • 明星信息查询按ID和identity_id
  • 获取所有可用明星列表
  • 搜索明星(按名称,支持中文和英文)

使用方法

starRepo := repository.NewStarRepository()

// 1. 根据ID查询
star, err := starRepo.GetByID(123)

// 2. 根据identity_id查询
star, err := starRepo.GetByIdentityID("xiaozhan")

// 3. 获取所有可用明星列表
stars, err := starRepo.GetAllActive()

// 4. 搜索明星(支持中文和英文名)
stars, err := starRepo.Search("肖战")
stars, err := starRepo.Search("Xiao")

测试

运行测试:

cd services/userService
go test ./repository -v

测试覆盖:

  • 用户创建和查询
  • 密码加密和验证
  • Token更新和清除
  • 粉丝档案CRUD操作
  • 联合唯一索引验证
  • 明星查询和搜索
  • 软删除过滤is_active
  • 各种错误场景