用户模块——整合 Spring 缓存(Cacheable)-获取徽章列表

时间:2025-04-01 13:51:42

·        在开发中,我们需要展示所有的徽章列表,并告诉用户哪些已经获得,哪些还没有。这个功能我们可以通过一个简单的接口来实现。我们分为两个主要步骤:

1. 获取所有徽章数据

        首先,我们需要从数据库中获取所有的徽章。由于徽章数据通常是固定的,不会频繁变化,所以可以缓存这个数据,以便更高效地获取。

@Cacheable(value = "badges", key = "'all'")
public List<Badge> getAllBadges() {
    return badgeMapper.selectList(null);  // 查询所有徽章
}
  • @Cacheable:表示当查询徽章时,首先会检查缓存中是否有数据。如果有就直接从缓存获取,否则会去数据库查询,并将结果缓存起来。

  • value = "badges":缓存的名字是 badges

  • key = "'all'":缓存的键是 'all',表示缓存的是所有徽章。

这样,后续每次请求徽章数据时,都会直接从缓存中获取,避免了频繁的数据库查询,提高了性能。

2. 获取用户的徽章状态

        获取所有徽章后,我们还需要检查每个用户是否已经获得某些徽章,并返回他们的状态(已获得/未获得)。假设每个用户的徽章信息存在 user_badge 表中,我们可以查询出用户已经获得的徽章,并标记它们。

public List<UserBadgeVO> getUserBadges(Long userId) {
    List<Badge> allBadges = getAllBadges();  // 获取所有徽章
    List<Long> userBadgeIds = userBadgeMapper.getUserBadgeIds(userId);  // 查询用户已获得的徽章ID

    return allBadges.stream()
        .map(badge -> new UserBadgeVO(badge, userBadgeIds.contains(badge.getId())))
        .sorted(Comparator.comparing(UserBadgeVO::isOwned).reversed())  // 已获得的放前面
        .collect(Collectors.toList());
}
  • userBadgeMapper.getUserBadgeIds(userId):查询当前用户已获得的徽章ID列表。

  • UserBadgeVO:用于包装徽章信息和用户是否已获得该徽章的状态。

  • sorted():将已获得的徽章排在前面,未获得的放后面。

3. 返回徽章列表给前端

最后,定义一个接口方法,返回给前端所有徽章的状态:

@GetMapping("/user/badges")
public List<UserBadgeVO> getUserBadges(@RequestParam Long userId) {
    return badgeService.getUserBadges(userId);  // 获取用户的徽章列表
}

总结

通过以上步骤,我们实现了获取所有徽章并判断用户是否拥有这些徽章的功能。

  1. 缓存所有徽章数据,提高查询效率。

  2. 查询用户已获得的徽章,标记徽章状态。

  3. 返回徽章列表,供前端展示。

这样一来,用户就能看到自己拥有的徽章和未获得的徽章,并且能高效地加载这些数据!????