|
|
@@ -0,0 +1,118 @@
|
|
|
+package com.artist.controller;
|
|
|
+
|
|
|
+import com.artist.config.SecurityUtil;
|
|
|
+import com.artist.domain.dto.AlbumNumDto;
|
|
|
+import com.artist.domain.dto.ArtistWithAlbumNumDto;
|
|
|
+import com.artist.domain.po.Artist;
|
|
|
+import com.artist.domain.po.UserFavoriteArtist;
|
|
|
+import com.artist.domain.po.WyUser;
|
|
|
+import com.artist.feignclient.AlbumServiceClient;
|
|
|
+import com.artist.service.IUserFavoriteArtistService;
|
|
|
+import com.base.common.RedisConstant;
|
|
|
+import com.base.utils.Result;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.security.access.prepost.PreAuthorize;
|
|
|
+import org.springframework.web.bind.annotation.GetMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestParam;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 我喜欢的歌手表 前端控制器
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author xiang
|
|
|
+ * @since 2025-12-24
|
|
|
+ */
|
|
|
+@RestController
|
|
|
+@RequestMapping("/user-favorite-artist")
|
|
|
+public class UserFavoriteArtistController {
|
|
|
+ @Autowired
|
|
|
+ private IUserFavoriteArtistService userFavoriteArtistService;
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
+ @Autowired
|
|
|
+ private AlbumServiceClient albumServiceClient;
|
|
|
+ @GetMapping("/queryByid")
|
|
|
+ @PreAuthorize("hasRole('ROLE_USER')")
|
|
|
+ public Result queryByid(@RequestParam Integer id) {
|
|
|
+ WyUser user = SecurityUtil.getUser();
|
|
|
+ String redisKey = RedisConstant.USER_FAVORITE_ARTIST_PREFIX + user.getId() + ":" + id;
|
|
|
+ Object cachedObj = redisTemplate.opsForValue().get(redisKey);
|
|
|
+ if (cachedObj != null) {
|
|
|
+ return Result.success(cachedObj);
|
|
|
+ }
|
|
|
+ // 查询数据库
|
|
|
+ UserFavoriteArtist one = userFavoriteArtistService.lambdaQuery()
|
|
|
+ .eq(UserFavoriteArtist::getArtistId, id)
|
|
|
+ .eq(UserFavoriteArtist::getUserId, user.getId())
|
|
|
+ .one();
|
|
|
+ // 存入Redis(设置较短过期时间)
|
|
|
+ if (one != null) {
|
|
|
+ redisTemplate.opsForValue().set(redisKey, one, 30, TimeUnit.HOURS);
|
|
|
+ } else {
|
|
|
+ redisTemplate.opsForValue().set(redisKey, false, 1, TimeUnit.HOURS);
|
|
|
+ }
|
|
|
+ return Result.success(one);
|
|
|
+ }
|
|
|
+
|
|
|
+ @GetMapping("/ChangeFavoriteArtist")
|
|
|
+ @PreAuthorize("hasRole('ROLE_USER')")
|
|
|
+ public Result ChangeFavoriteArtist(@RequestParam Integer id) {
|
|
|
+ WyUser user = SecurityUtil.getUser();
|
|
|
+ UserFavoriteArtist one = userFavoriteArtistService.lambdaQuery()
|
|
|
+ .eq(UserFavoriteArtist::getArtistId, id)
|
|
|
+ .eq(UserFavoriteArtist::getUserId, user.getId())
|
|
|
+ .one();
|
|
|
+ if (one != null) {
|
|
|
+ userFavoriteArtistService.removeById(one);
|
|
|
+ redisTemplate.delete(RedisConstant.USER_FAVORITE_ARTIST_PREFIX + user.getId() + ":" + id);
|
|
|
+ return Result.success(false);
|
|
|
+ }
|
|
|
+ UserFavoriteArtist userFavoriteArtist = new UserFavoriteArtist();
|
|
|
+ userFavoriteArtist.setUserId(user.getId());
|
|
|
+ userFavoriteArtist.setArtistId(id);
|
|
|
+ redisTemplate.delete(RedisConstant.USER_FAVORITE_ARTIST_PREFIX + user.getId() + ":" + id);
|
|
|
+ userFavoriteArtistService.save(userFavoriteArtist);
|
|
|
+ return Result.success(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ //通过id查询喜欢歌手
|
|
|
+ @GetMapping("/queryById")
|
|
|
+ @PreAuthorize("hasRole('ROLE_USER')")
|
|
|
+ public Result queryById(@RequestParam Integer id) {
|
|
|
+ // 查询喜欢的歌手列表
|
|
|
+ List<Artist> list = userFavoriteArtistService.queryById(id);
|
|
|
+ // 提取歌手ID列表
|
|
|
+ List<Integer> artistIds = list.stream()
|
|
|
+ .map(Artist::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ // 通过Feign客户端查询专辑数量信息
|
|
|
+ List<AlbumNumDto> albumNumList = albumServiceClient.getAlbum(artistIds);
|
|
|
+ System.out.println("albumNumList = " + albumNumList);
|
|
|
+ System.out.println("list = " + list);
|
|
|
+ List<ArtistWithAlbumNumDto> result = list.stream()
|
|
|
+ .map(artist -> {
|
|
|
+ ArtistWithAlbumNumDto dto = new ArtistWithAlbumNumDto();
|
|
|
+ BeanUtils.copyProperties(artist, dto);
|
|
|
+ // 查找对应的专辑数量
|
|
|
+ AlbumNumDto albumNumDto = albumNumList.stream()
|
|
|
+ .filter(item -> item.getId().equals(artist.getId()))
|
|
|
+ .findFirst()
|
|
|
+ .orElse(new AlbumNumDto());
|
|
|
+ dto.setNum(albumNumDto.getNum());
|
|
|
+ return dto;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ return Result.success(result);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|