168 lines
3.6 KiB
Markdown
168 lines
3.6 KiB
Markdown
# 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)
|
||
- ✅ 各种错误场景
|
||
|