topfans/backend/services/userService/repository/README.md
2026-04-07 22:29:48 +08:00

168 lines
3.6 KiB
Markdown
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.

# Repository层
数据访问层,负责与数据库交互。
## 用户Repository
### 功能
- ✅ 用户CRUD操作
- ✅ 根据手机号查询用户
- ✅ 更新用户Token
- ✅ 验证用户密码bcrypt
- ✅ 密码加密HashPassword辅助函数
### 使用方法
```go
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进行密码加密确保安全性
```go
// 加密密码
hashedPassword, err := repository.HashPassword("password123")
// 验证密码
isValid := userRepo.VerifyPassword(user, "password123")
```
### 注意事项
1. **密码加密**:创建用户前必须先使用`HashPassword`加密密码
2. **软删除**`GetByID`和`GetByMobile`只会返回`is_active=true`的用户
3. **Token更新**`UpdateToken`会同时更新`access_token`和`token_expires_at`
4. **时间戳**创建和更新操作会自动设置时间戳通过Model的BeforeCreate/BeforeUpdate钩子
### 错误处理
- 所有方法都会返回error需要检查
- 用户不存在时返回`"user not found"`错误
- 无效参数时返回相应的错误信息
## 粉丝档案Repository
### 功能
- ✅ 粉丝档案CRUD操作
- ✅ 根据user_id + star_id查询
- ✅ 查询用户的所有粉丝身份
- ✅ 检查用户粉丝身份数量
- ✅ 更新粉丝档案和昵称
### 使用方法
```go
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
- ✅ 获取所有可用明星列表
- ✅ 搜索明星(按名称,支持中文和英文)
### 使用方法
```go
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")
```
---
## 测试
运行测试:
```bash
cd services/userService
go test ./repository -v
```
测试覆盖:
- ✅ 用户创建和查询
- ✅ 密码加密和验证
- ✅ Token更新和清除
- ✅ 粉丝档案CRUD操作
- ✅ 联合唯一索引验证
- ✅ 明星查询和搜索
- ✅ 软删除过滤is_active
- ✅ 各种错误场景