【Sapphire开发日志 七】用户积分计算的实现和排行榜

介绍

为了对用户的工作进行衡量,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
}
代码分析:
  1. 获取用户信息:通过用户ID查询用户信息,如果用户不存在则返回错误。
  2. 获取用户创建的数据集:查询用户创建的数据集列表,并记录日志。
  3. 获取用户加入的数据集:查询用户加入的数据集列表,并记录日志。
  4. 获取用户标注数量:查询用户的标注记录,并记录日志。
  5. 构建用户结果:使用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
}
代码分析:
  1. 获取所有用户:从数据库中查询所有用户。
  2. 计算每个用户的积分:对于每个用户,计算其创建的数据集数量、加入的数据集数量和标注数量,并构建用户结果。
  3. 排序用户:根据积分对用户结果进行排序。
  4. 返回前10名用户:只返回积分最高的前10名用户,如果用户数量少于10则返回全部用户。

总结

综上,本文介绍了Sapphire系统中用户积分的计算和用户榜单的实现,从用户积分的计算逻辑入手,逐步讲解了获取用户信息、计算积分以及生成用户榜单的具体代码实现。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值