介绍
为了对用户的工作进行衡量,Sapphire设计了积分系统来计算用户的贡献。本文将详细介绍这一部分的实现,包括用户积分的计算和用户榜单的生成。
具体实现
用户积分
用户积分的计算是通过获取用户创建的数据集、加入的数据集以及用户的标注数量来实现的。以下是具体的实现代码:
func (u *User) GetUserDetail(userId uint) (*UserResult, error) {
var err error
user, err := dao.FindOne[User](userId)
if err != nil {
return nil, err
}
if user == nil {
return nil, errors.New("user not found")
}
createdDatasets, err := datasetDomain.ListUserCreatedDatasets(userId)
if err != nil {
slog.Error("ListUserCreatedDatasets", err)
return nil, err
}
slog.Info("createdDatasets", createdDatasets)
joinedDatasets, err := datasetDomain.ListUserJoinedDatasetList(userId)
if err != nil {
slog.Error("ListUserJoinedDatasetList", err)
return nil, err
}
slog.Info("joinedDatasets", joinedDatasets)
annotations, err := annotationDomain.ListAnnotationsByUserID(userId)
if err != nil {
slog.Error("ListAnnotationsByUserID", err)
return nil, err
}
slog.Info("annotations", annotations)
res := buildUserResult(user, len(joinedDatasets), len(createdDatasets), len(annotations))
return res, nil
}
代码分析:
- 获取用户信息:通过用户ID查询用户信息,如果用户不存在则返回错误。
- 获取用户创建的数据集:查询用户创建的数据集列表,并记录日志。
- 获取用户加入的数据集:查询用户加入的数据集列表,并记录日志。
- 获取用户标注数量:查询用户的标注记录,并记录日志。
- 构建用户结果:使用
buildUserResult
方法计算用户的积分,并返回结果。
榜单
主页提供了获取用户榜单的功能,通过积分排名列出前10名用户。以下是具体实现代码:
// ListUsersByRank 根据积分排名列出用户
func (u *User) ListUsersByRank() ([]UserResult, error) {
var err error
var users []User
users, err = dao.FindAll[User]("")
if err != nil {
return nil, err
}
var userResults []UserResult
for _, user := range users {
createdDatasets, err := datasetDomain.ListUserCreatedDatasets(user.ID)
if err != nil {
slog.Error("ListUserCreatedDatasets", err)
return nil, err
}
slog.Info("createdDatasets", createdDatasets)
joinedDatasets, err := datasetDomain.ListUserJoinedDatasetList(user.ID)
if err != nil {
slog.Error("ListUserJoinedDatasetList", err)
return nil, err
}
slog.Info("joinedDatasets", joinedDatasets)
annotations, err := annotationDomain.ListAnnotationsByUserID(user.ID)
if err != nil {
slog.Error("ListAnnotationsByUserID", err)
return nil, err
}
slog.Debug("annotations", annotations)
res := buildUserResult(&user, len(joinedDatasets), len(createdDatasets), len(annotations))
userResults = append(userResults, *res)
}
// 根据score排序
for i := 0; i < len(userResults); i++ {
for j := i + 1; j < len(userResults); j++ {
if userResults[i].Score < userResults[j].Score {
userResults[i], userResults[j] = userResults[j], userResults[i]
}
}
}
slog.Debug("userResults", userResults)
// 只返回前 10 个用户
if len(userResults) > 10 {
userResults = userResults[:10]
} else {
slog.Info("User count less than 10")
slog.Debug("userResults", userResults)
}
return userResults, nil
}
代码分析:
- 获取所有用户:从数据库中查询所有用户。
- 计算每个用户的积分:对于每个用户,计算其创建的数据集数量、加入的数据集数量和标注数量,并构建用户结果。
- 排序用户:根据积分对用户结果进行排序。
- 返回前10名用户:只返回积分最高的前10名用户,如果用户数量少于10则返回全部用户。
总结
综上,本文介绍了Sapphire系统中用户积分的计算和用户榜单的实现,从用户积分的计算逻辑入手,逐步讲解了获取用户信息、计算积分以及生成用户榜单的具体代码实现。