| .. | ||
| 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")
注意事项
- 密码加密:创建用户前必须先使用
HashPassword加密密码 - 软删除:
GetByID和GetByMobile只会返回is_active=true的用户 - Token更新:
UpdateToken会同时更新access_token和token_expires_at - 时间戳:创建和更新操作会自动设置时间戳(通过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)
- ✅ 各种错误场景