diff --git a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/AlbumFeignClient.java b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/AlbumFeignClient.java index 57a82f1..9586c27 100644 --- a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/AlbumFeignClient.java +++ b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/AlbumFeignClient.java @@ -3,11 +3,15 @@ package com.atguigu.tingshu.album; import com.atguigu.tingshu.album.impl.AlbumDegradeFeignClient; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.model.album.BaseCategory3; import com.atguigu.tingshu.model.album.BaseCategoryView; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import java.util.List; + /** *

* 专辑模块远程调用Feign接口 @@ -34,4 +38,13 @@ public interface AlbumFeignClient { @GetMapping("/category/getCategoryView/{category3Id}") public Result getCategoryView(@PathVariable Long category3Id); + @GetMapping("/category/findTopBaseCategory3/{category1Id}") + public Result> findTopBaseCategory3(@PathVariable Long category1Id); + + + @GetMapping("/albumInfo/getAlbumStatVo/{albumId}") + public ResultgetAlbumStatVo(@PathVariable Long albumId); + + + } diff --git a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java index 049275f..d8a1ebe 100644 --- a/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java +++ b/service-client/service-album-client/src/main/java/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.java @@ -4,10 +4,14 @@ package com.atguigu.tingshu.album.impl; import com.atguigu.tingshu.album.AlbumFeignClient; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.model.album.BaseCategory3; import com.atguigu.tingshu.model.album.BaseCategoryView; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.List; + @Component @Slf4j public class AlbumDegradeFeignClient implements AlbumFeignClient { @@ -24,4 +28,16 @@ public class AlbumDegradeFeignClient implements AlbumFeignClient { log.error("[专辑服务]提供远程调用方法getCategoryView执行服务降级"); return null; } + + @Override + public Result> findTopBaseCategory3(Long category1Id) { + log.error("[专辑服务]提供远程调用方法findTopBaseCategory3执行服务降级"); + return null; + } + + @Override + public Result getAlbumStatVo(Long albumId) { + log.error("[专辑服务]提供远程调用方法getAlbumStatVo执行服务降级"); + return null; + } } diff --git a/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class b/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class index aa3aa53..5022b35 100644 Binary files a/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class and b/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/AlbumFeignClient.class differ diff --git a/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.class b/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.class index 6957c97..173bdc2 100644 Binary files a/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.class and b/service-client/service-album-client/target/classes/com/atguigu/tingshu/album/impl/AlbumDegradeFeignClient.class differ diff --git a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java index 73e5705..7b8ec66 100644 --- a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java +++ b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/UserFeignClient.java @@ -6,6 +6,11 @@ import com.atguigu.tingshu.vo.user.UserInfoVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; /** *

@@ -24,4 +29,10 @@ public interface UserFeignClient { @GetMapping("/userInfo/getUserInfoVo/{userId}") public Result getUserInfoVo(@PathVariable Long userId); + @PostMapping("/userInfo/userIsPaidTrack/{albumId}") + public Result> userIsPaidTrack( + @PathVariable("albumId") Long albumId, + @RequestBody List needCheckPayStateTrackIdList + ); + } diff --git a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java index 0528a5a..aa4a96e 100644 --- a/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java +++ b/service-client/service-user-client/src/main/java/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.java @@ -6,6 +6,10 @@ import com.atguigu.tingshu.user.client.UserFeignClient; import com.atguigu.tingshu.vo.user.UserInfoVo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + @Slf4j @Component public class UserDegradeFeignClient implements UserFeignClient { @@ -15,4 +19,10 @@ public class UserDegradeFeignClient implements UserFeignClient { log.error("[用户服务]提供远程调用方法getUserInfoVo执行服务降级"); return null; } + + @Override + public Result> userIsPaidTrack(Long albumId, List needCheckPayStateTrackIdList) { + log.error("[用户服务]提供远程调用方法userIsPaidTrack执行服务降级"); + return null; + } } diff --git a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class index 027f8f2..8c65149 100644 Binary files a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class and b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/UserFeignClient.class differ diff --git a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class index e283733..37d703f 100644 Binary files a/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class and b/service-client/service-user-client/target/classes/com/atguigu/tingshu/user/client/impl/UserDegradeFeignClient.class differ diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java index 04cf88f..e915f84 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java @@ -8,6 +8,7 @@ import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumInfoVo; import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; @@ -17,6 +18,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; @Tag(name = "专辑管理") @RestController @@ -83,8 +85,6 @@ public class AlbumInfoApiController { * 查询当前用户专辑列表 * @return */ - - /*这个接口是为了在声音列表中获取当前用户的所有专辑 有一个下拉框 在那里能显示内容*/ @GuiGuLogin @Operation(summary = "查询当前用户专辑列表") @@ -98,6 +98,14 @@ public class AlbumInfoApiController { return Result.ok(list); } + @Operation(summary = "专辑状态统计") + @GetMapping("/albumInfo/getAlbumStatVo/{albumId}") + public ResultgetAlbumStatVo(@PathVariable Long albumId){ + AlbumStatVo albumStatVo=albumInfoService.getAlbumStatVo(albumId); + return Result.ok(albumStatVo); + + } + diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/BaseCategoryApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/BaseCategoryApiController.java index ceacb0d..6d8211e 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/BaseCategoryApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/BaseCategoryApiController.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.atguigu.tingshu.album.service.BaseCategoryService; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.album.BaseAttribute; +import com.atguigu.tingshu.model.album.BaseCategory3; import com.atguigu.tingshu.model.album.BaseCategoryView; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -47,6 +48,24 @@ public class BaseCategoryApiController { BaseCategoryView baseCategoryView = baseCategoryService.getCategoryView(category3Id); return Result.ok(baseCategoryView); } + @Operation(summary = "根据一级分类Id查询置顶7个三级分类列表") + @GetMapping("/category/findTopBaseCategory3/{category1Id}") + public Result> findTopBaseCategory3(@PathVariable Long category1Id){ + List list=baseCategoryService.findTopBaseCategory3(category1Id); + return Result.ok(list); + } + /** + * 查询1级分类下包含所有二级以及三级分类 + * @param category1Id + * @return + */ + @Operation(summary = "查询1级分类下包含所有二级以及三级分类") + @GetMapping("/category/getBaseCategoryList/{category1Id}") + public Result getBaseCategoryListByCategory1Id(@PathVariable Long category1Id) { + JSONObject jsonObject = baseCategoryService.getBaseCategoryListByCategory1Id(category1Id); + return Result.ok(jsonObject); + } + diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/FileUploadApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/FileUploadApiController.java index ffde64e..3ba322e 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/FileUploadApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/FileUploadApiController.java @@ -18,7 +18,7 @@ public class FileUploadApiController { @Autowired private FileUploadService fileUploadService; - //这个接口是将文件上传到minio上 + //这个接口是将文件上传到minio上 上传的时候用MultipartFile @Operation(summary = "上传文件") @PostMapping("/fileUpload") public Result fileUpload(@RequestParam("file") MultipartFile file) throws IOException { diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java index aa516f3..e765ff1 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/TrackInfoApiController.java @@ -7,6 +7,7 @@ import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.model.album.TrackInfo; import com.atguigu.tingshu.query.album.TrackInfoQuery; +import com.atguigu.tingshu.vo.album.AlbumTrackListVo; import com.atguigu.tingshu.vo.album.TrackInfoVo; import com.atguigu.tingshu.vo.album.TrackListVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -118,5 +119,31 @@ public class TrackInfoApiController { return Result.ok(); } + /** + * 分页查询专辑下包含声音列表(动态展示付费标识) + * + * @param albumId 专辑ID + * @param page 页码 + * @param limit 页大小 + * @return 分页对象 + */ + @GuiGuLogin(required = false) //无论用户是否登录都可以调用,只要登录了就可以获取到用户ID + @Operation(summary = "分页查询专辑下包含声音列表(动态展示付费标识)") + @GetMapping("/trackInfo/findAlbumTrackPage/{albumId}/{page}/{limit}") + public Result> findAlbumTrackPage( + @PathVariable Long albumId, + @PathVariable Long page, + @PathVariable Long limit + ) { + //1.尝试获取当前用户ID-可能有值,也可能没有值 + Long userId = AuthContextHolder.getUserId(); + //2.创建分页对象:封装页码、页大小 + Page pageInfo = new Page<>(page, limit); + //3.调用业务逻辑层(持久层)封装当前页记录,总页数等 + pageInfo = trackInfoService.findAlbumTrackPage(pageInfo, userId, albumId); + //4.响应结果 + return Result.ok(pageInfo); + } + } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java index adad2fa..1c32053 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java @@ -3,6 +3,7 @@ package com.atguigu.tingshu.album.mapper; import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; @@ -12,4 +13,6 @@ import org.apache.ibatis.annotations.Param; public interface AlbumInfoMapper extends BaseMapper { IPage findUserAlbumPage(IPage pageInfo, @Param("vo")AlbumInfoQuery albumInfoQuery); + + AlbumStatVo getAlbumStatVo(Long albumId); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/TrackInfoMapper.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/TrackInfoMapper.java index 8015506..3c869a2 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/TrackInfoMapper.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/TrackInfoMapper.java @@ -2,6 +2,7 @@ package com.atguigu.tingshu.album.mapper; import com.atguigu.tingshu.model.album.TrackInfo; import com.atguigu.tingshu.query.album.TrackInfoQuery; +import com.atguigu.tingshu.vo.album.AlbumTrackListVo; import com.atguigu.tingshu.vo.album.TrackListVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -13,4 +14,6 @@ public interface TrackInfoMapper extends BaseMapper { Page findUserTrackPage(Page pageInfo,@Param("vo")TrackInfoQuery trackInfoQuery); + + Page findAlbumTrackPage(Page pageInfo, Long albumId); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java index 7453c02..2e9d904 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java @@ -4,6 +4,7 @@ import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumInfoVo; import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -27,4 +28,6 @@ public interface AlbumInfoService extends IService { void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo); List findUserAllAlbumList(Long userId); + + AlbumStatVo getAlbumStatVo(Long albumId); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/BaseCategoryService.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/BaseCategoryService.java index d90c6ec..8c35ae9 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/BaseCategoryService.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/BaseCategoryService.java @@ -3,6 +3,7 @@ package com.atguigu.tingshu.album.service; import com.alibaba.fastjson.JSONObject; import com.atguigu.tingshu.model.album.BaseAttribute; import com.atguigu.tingshu.model.album.BaseCategory1; +import com.atguigu.tingshu.model.album.BaseCategory3; import com.atguigu.tingshu.model.album.BaseCategoryView; import com.baomidou.mybatisplus.extension.service.IService; @@ -16,4 +17,8 @@ public interface BaseCategoryService extends IService { List findAttribute(Long category1Id); BaseCategoryView getCategoryView(Long category3Id); + + List findTopBaseCategory3(Long category1Id); + + JSONObject getBaseCategoryListByCategory1Id(Long category1Id); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/TrackInfoService.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/TrackInfoService.java index ffbbf89..b9872db 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/TrackInfoService.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/TrackInfoService.java @@ -2,6 +2,7 @@ package com.atguigu.tingshu.album.service; import com.atguigu.tingshu.model.album.TrackInfo; import com.atguigu.tingshu.query.album.TrackInfoQuery; +import com.atguigu.tingshu.vo.album.AlbumTrackListVo; import com.atguigu.tingshu.vo.album.TrackInfoVo; import com.atguigu.tingshu.vo.album.TrackListVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -32,4 +33,7 @@ public interface TrackInfoService extends IService { void updateTrackInfo(Long id, TrackInfoVo trackInfoVo); void removeTrackInfo(Long id); + + Page findAlbumTrackPage(Page pageInfo, Long userId, Long albumId); + } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java index d33af6e..2de8053 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java @@ -20,6 +20,7 @@ import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo; import com.atguigu.tingshu.vo.album.AlbumInfoVo; import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.atguigu.tingshu.vo.album.AlbumStatVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -92,7 +93,7 @@ public class AlbumInfoServiceImpl extends ServiceImpl findTopBaseCategory3(Long category1Id) { + List baseCategory2List = baseCategory2Mapper.selectList( new LambdaQueryWrapper() + .eq(BaseCategory2::getCategory1Id, category1Id) + .select(BaseCategory2::getId)); + if (CollUtil.isNotEmpty(baseCategory2List)) { + List category2IdList = baseCategory2List.stream() + .map(BaseCategory2::getId).collect(Collectors.toList()); + //2.根据二级分类ID列表查询置顶前7个个三级分类列表 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(BaseCategory3::getCategory2Id, category2IdList); + queryWrapper.eq(BaseCategory3::getIsTop, 1); + queryWrapper.orderByAsc(BaseCategory3::getOrderNum); + queryWrapper.last("limit 7"); + return baseCategory3Mapper.selectList(queryWrapper); + } + return null; + } + + @Override + public JSONObject getBaseCategoryListByCategory1Id(Long category1Id) { + //1.处理1级分类 + //1.1 根据1级分类ID查询分类视图,得到"1级"分类列表,获取列表第一条记录即可 + List baseCategory1List = baseCategoryViewMapper.selectList( + new LambdaQueryWrapper() + .eq(BaseCategoryView::getCategory1Id, category1Id) + ); + //1.2 创建1级分类JSON对象 + JSONObject jsonObject1 = new JSONObject(); + //1.2.1 封装1级分类对象中分类ID + jsonObject1.put("categoryId", baseCategory1List.get(0).getCategory1Id()); + //1.2.2 封装1级分类对象中分类名称 + jsonObject1.put("categoryName", baseCategory1List.get(0).getCategory1Name()); + + //2.处理2级分类 + //2.1 创建2级分类JSON对象集合 + List jsonObject2List = new ArrayList<>(); + //2.2 对"1级分类"列表按照2级分类ID进行分组,得到"2级分类"Map + Map> map2 = baseCategory1List.stream() + .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id)); + //2.2 遍历"2级分类"Map + for (Map.Entry> entry2 : map2.entrySet()) { + //2.3 创建2级分类JSON对象 + JSONObject jsonObject2 = new JSONObject(); + //2.3.1 封装2级分类JSON对象分类ID + jsonObject2.put("categoryId", entry2.getKey()); + //2.3.2 封装2级分类JSON对象分类名称 + jsonObject2.put("categoryName", entry2.getValue().get(0).getCategory2Name()); + //2.4 将2级分类对象加入到2级分类集合中 + jsonObject2List.add(jsonObject2); + //3.处理3级分类 + //3.1 创建3级分类集合 + List jsonObject3List = new ArrayList<>(); + //3.2 遍历"2级分类"列表 + for (BaseCategoryView baseCategoryView : entry2.getValue()) { + //3.3 创建3级分类JSON对象 + JSONObject jsonObject3 = new JSONObject(); + //3.3.1 封装3级分类ID + jsonObject3.put("categoryId", baseCategoryView.getCategory3Id()); + //3.3.2 封装3级分类名称 + jsonObject3.put("categoryName", baseCategoryView.getCategory3Name()); + //3.4 将3级分类对象加入到3级分类集合中 + jsonObject3List.add(jsonObject3); + } + + //3.5 将3级分类集合加入2级分类对象"categoryChild"属性中 + jsonObject2.put("categoryChild", jsonObject3List); + } + //2.5 将2级分类集合加入到1级分类对象中"categoryChild"属性中 + jsonObject1.put("categoryChild", jsonObject2List); + + //4.响应1级分类对象 + return jsonObject1; + } } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.java index 2f2efd2..6229f32 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.java @@ -1,6 +1,7 @@ package com.atguigu.tingshu.album.service.impl; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; import com.atguigu.tingshu.album.mapper.AlbumInfoMapper; import com.atguigu.tingshu.album.mapper.TrackInfoMapper; import com.atguigu.tingshu.album.mapper.TrackStatMapper; @@ -12,9 +13,12 @@ import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.model.album.TrackInfo; import com.atguigu.tingshu.model.album.TrackStat; import com.atguigu.tingshu.query.album.TrackInfoQuery; +import com.atguigu.tingshu.user.client.UserFeignClient; +import com.atguigu.tingshu.vo.album.AlbumTrackListVo; import com.atguigu.tingshu.vo.album.TrackInfoVo; import com.atguigu.tingshu.vo.album.TrackListVo; import com.atguigu.tingshu.vo.album.TrackMediaInfoVo; +import com.atguigu.tingshu.vo.user.UserInfoVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -26,195 +30,272 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + +import static com.atguigu.tingshu.common.constant.SystemConstant.ALBUM_PAY_TYPE_REQUIRE; +import static com.atguigu.tingshu.common.constant.SystemConstant.ALBUM_PAY_TYPE_VIPFREE; @Slf4j @Service @SuppressWarnings({"all"}) public class TrackInfoServiceImpl extends ServiceImpl implements TrackInfoService { - @Autowired - private TrackInfoMapper trackInfoMapper; - @Autowired - private AlbumInfoMapper albumInfoMapper; - @Autowired - private VodService vodService; - @Autowired - private AuditService auditService; - @Autowired - private TrackStatMapper trackStatMapper; + @Autowired + private TrackInfoMapper trackInfoMapper; + @Autowired + private AlbumInfoMapper albumInfoMapper; + @Autowired + private VodService vodService; + @Autowired + private AuditService auditService; + @Autowired + private TrackStatMapper trackStatMapper; + @Autowired + private UserFeignClient userFeignClient; - @Override - @Transactional(rollbackFor = Exception.class) - public void saveTrackInfo(TrackInfoVo trackInfoVo, Long userId) { + @Override + @Transactional(rollbackFor = Exception.class) + public void saveTrackInfo(TrackInfoVo trackInfoVo, Long userId) { //1. 根据专辑id查询专辑信息 用于更新专辑声音数量 - AlbumInfo albumInfo = albumInfoMapper.selectById(trackInfoVo.getAlbumId()); - //2. 保存声音信息 - //2.1 将VO转为PO对象 - TrackInfo trackInfo = BeanUtil.copyProperties(trackInfoVo, TrackInfo.class); - //2.2 属性赋值 - //2.2.1 基本属性:用户ID,审核状态,封面图片,来源 - trackInfo.setUserId(userId); - trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); - trackInfo.setSource(SystemConstant.TRACK_SOURCE_USER); - if (StringUtils.isBlank(trackInfo.getCoverUrl())) { - //如果用户没有选择封面图片 则用户所属专辑的封面图片 - trackInfo.setCoverUrl(albumInfo.getCoverUrl()); - } - //2.2.2 计算声音序号 现有专辑包含声音数量+1 - trackInfo.setOrderNum(albumInfo.getIncludeTrackCount() + 1); - //2.2.3 查询点播平台获取音频详情:得到时长、大小、类型 - TrackMediaInfoVo mediaInfoVo = vodService.getMediaInfo(trackInfo.getMediaFileId()); - if (mediaInfoVo != null) { - trackInfo.setMediaDuration(BigDecimal.valueOf(mediaInfoVo.getDuration())); - trackInfo.setMediaSize(mediaInfoVo.getSize()); - trackInfo.setMediaType(mediaInfoVo.getType()); - } - albumInfoMapper.updateById(albumInfo); - //2.2.5 保存声音记录 - trackInfoMapper.insert(trackInfo); + AlbumInfo albumInfo = albumInfoMapper.selectById(trackInfoVo.getAlbumId()); + //2. 保存声音信息 + //2.1 将VO转为PO对象 + TrackInfo trackInfo = BeanUtil.copyProperties(trackInfoVo, TrackInfo.class); + //2.2 属性赋值 + //2.2.1 基本属性:用户ID,审核状态,封面图片,来源 + trackInfo.setUserId(userId); + trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); + trackInfo.setSource(SystemConstant.TRACK_SOURCE_USER); + if (StringUtils.isBlank(trackInfo.getCoverUrl())) { + //如果用户没有选择封面图片 则用户所属专辑的封面图片 + trackInfo.setCoverUrl(albumInfo.getCoverUrl()); + } + //2.2.2 计算声音序号 现有专辑包含声音数量+1 + trackInfo.setOrderNum(albumInfo.getIncludeTrackCount() + 1); + //2.2.3 查询点播平台获取音频详情:得到时长、大小、类型 + TrackMediaInfoVo mediaInfoVo = vodService.getMediaInfo(trackInfo.getMediaFileId()); + if (mediaInfoVo != null) { + trackInfo.setMediaDuration(BigDecimal.valueOf(mediaInfoVo.getDuration())); + trackInfo.setMediaSize(mediaInfoVo.getSize()); + trackInfo.setMediaType(mediaInfoVo.getType()); + } + albumInfoMapper.updateById(albumInfo); + //2.2.5 保存声音记录 + trackInfoMapper.insert(trackInfo); - //2.2.4 TODO 调用内容审核接口,发起内容审核,更新审核任务ID - //审核标题和简介 - String text = trackInfo.getTrackTitle() + trackInfo.getTrackIntro(); - //获得一个标识 pass或者block review等字符 这样可以分辨出来是不是通过 - //将trackInfo中的状态设置为已通过或其他 - String suggestion = auditService.auditText(text); - if ("pass".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); - //TODO 文本审核通过后,还需要进一步审核音频内容 - String reviewTaskId = auditService.startReviewTask(trackInfo.getMediaFileId()); - trackInfo.setStatus(SystemConstant.TRACK_STATUS_REVIEWING); - trackInfo.setReviewTaskId(reviewTaskId); - } else if ("block".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); - } else if ("review".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); - } - trackInfoMapper.updateById(trackInfo); + //2.2.4 TODO 调用内容审核接口,发起内容审核,更新审核任务ID + //审核标题和简介 + String text = trackInfo.getTrackTitle() + trackInfo.getTrackIntro(); + //获得一个标识 pass或者block review等字符 这样可以分辨出来是不是通过 + //将trackInfo中的状态设置为已通过或其他 + String suggestion = auditService.auditText(text); + if ("pass".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); + //TODO 文本审核通过后,还需要进一步审核音频内容 + String reviewTaskId = auditService.startReviewTask(trackInfo.getMediaFileId()); + trackInfo.setStatus(SystemConstant.TRACK_STATUS_REVIEWING); + trackInfo.setReviewTaskId(reviewTaskId); + } else if ("block".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); + } else if ("review".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); + } + trackInfoMapper.updateById(trackInfo); - //3. 更新专辑包含声音数量 - albumInfo.setIncludeTrackCount(albumInfo.getIncludeTrackCount() + 1); - albumInfoMapper.updateById(albumInfo); + //3. 更新专辑包含声音数量 + albumInfo.setIncludeTrackCount(albumInfo.getIncludeTrackCount() + 1); + albumInfoMapper.updateById(albumInfo); - //3.新增声音统计信息 - this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_PLAY, 0); - this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_COLLECT, 0); - this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_PRAISE, 0); - this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_COMMENT, 0); + //3.新增声音统计信息 + this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_PLAY, 0); + this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_COLLECT, 0); + this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_PRAISE, 0); + this.saveTrackStat(trackInfo.getId(), SystemConstant.TRACK_STAT_COMMENT, 0); - } - /** - * 保存声音统计信息 - * - * @param trackId 声音ID - * @param statType 统计类型:播放、点赞、收藏、评论 - * @param statNum 统计数值 - */ - @Override - public void saveTrackStat(Long trackId, String statType, int statNum) { - TrackStat trackStat = new TrackStat(); - trackStat.setTrackId(trackId); - trackStat.setStatType(statType); - trackStat.setStatNum(statNum); - trackStatMapper.insert(trackStat); - } - /** - * 分页条件查询当前用户声音列表 - * - * @param pageInfo 分页对象 - * @param trackInfoQuery 查询条件 - * @return 分页对象 - */ - @Override - public Page findUserTrackPage(Page pageInfo, TrackInfoQuery trackInfoQuery) { - return trackInfoMapper.findUserTrackPage(pageInfo, trackInfoQuery); - } + } - @Override - public void updateTrackInfo(Long id, TrackInfoVo trackInfoVo) { - //1. 根据id查询声音信息 得到"原有的"音频唯一标识 - TrackInfo trackInfo = trackInfoMapper.selectById(id); - String oldMediaFileId = trackInfo.getMediaFileId(); + /** + * 保存声音统计信息 + * + * @param trackId 声音ID + * @param statType 统计类型:播放、点赞、收藏、评论 + * @param statNum 统计数值 + */ + @Override + public void saveTrackStat(Long trackId, String statType, int statNum) { + TrackStat trackStat = new TrackStat(); + trackStat.setTrackId(trackId); + trackStat.setStatType(statType); + trackStat.setStatNum(statNum); + trackStatMapper.insert(trackStat); + } - //对文本进行审核 - String text = trackInfoVo.getTrackTitle() + trackInfoVo.getTrackIntro(); - String suggestion = auditService.auditText(text); - if ("pass".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); - } else if ("block".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); - } else if ("review".equals(suggestion)) { - trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); - } + /** + * 分页条件查询当前用户声音列表 + * + * @param pageInfo 分页对象 + * @param trackInfoQuery 查询条件 + * @return 分页对象 + */ + @Override + public Page findUserTrackPage(Page pageInfo, TrackInfoQuery trackInfoQuery) { + return trackInfoMapper.findUserTrackPage(pageInfo, trackInfoQuery); + } - //2. 判断音频文件是否发生更新,如果更新 - if (!trackInfoVo.getMediaFileId().equals(oldMediaFileId)) { - // 2.1 调用点播平台获取最新音频详情信息 - TrackMediaInfoVo mediaInfo = vodService.getMediaInfo(trackInfoVo.getMediaFileId()); - if (mediaInfo != null) { - trackInfo.setMediaFileId(trackInfoVo.getMediaFileId()); - trackInfo.setMediaUrl(trackInfoVo.getMediaUrl()); - trackInfo.setMediaDuration(BigDecimal.valueOf(mediaInfo.getDuration())); - trackInfo.setMediaType(mediaInfo.getType()); - trackInfo.setMediaSize(mediaInfo.getSize()); - // 2.2 TODO 再次对变更后音频文件进行内容审核 - String reviewTaskId = auditService.startReviewTask(trackInfo.getMediaFileId()); - trackInfo.setStatus(SystemConstant.TRACK_STATUS_REVIEWING); - trackInfo.setReviewTaskId(reviewTaskId); + @Override + public void updateTrackInfo(Long id, TrackInfoVo trackInfoVo) { + //1. 根据id查询声音信息 得到"原有的"音频唯一标识 + TrackInfo trackInfo = trackInfoMapper.selectById(id); + String oldMediaFileId = trackInfo.getMediaFileId(); - // 2.3原有音频从点播平台删除 - vodService.deleteMedia(oldMediaFileId); - } - } - trackInfo.setTrackTitle(trackInfoVo.getTrackTitle()); - trackInfo.setTrackIntro(trackInfoVo.getTrackIntro()); - trackInfo.setCoverUrl(trackInfoVo.getCoverUrl()); + //对文本进行审核 + String text = trackInfoVo.getTrackTitle() + trackInfoVo.getTrackIntro(); + String suggestion = auditService.auditText(text); + if ("pass".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_PASS); + } else if ("block".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_NO_PASS); + } else if ("review".equals(suggestion)) { + trackInfo.setStatus(SystemConstant.TRACK_STATUS_ARTIFICIAL); + } + + //2. 判断音频文件是否发生更新,如果更新 + if (!trackInfoVo.getMediaFileId().equals(oldMediaFileId)) { + // 2.1 调用点播平台获取最新音频详情信息 + TrackMediaInfoVo mediaInfo = vodService.getMediaInfo(trackInfoVo.getMediaFileId()); + if (mediaInfo != null) { + trackInfo.setMediaFileId(trackInfoVo.getMediaFileId()); + trackInfo.setMediaUrl(trackInfoVo.getMediaUrl()); + trackInfo.setMediaDuration(BigDecimal.valueOf(mediaInfo.getDuration())); + trackInfo.setMediaType(mediaInfo.getType()); + trackInfo.setMediaSize(mediaInfo.getSize()); + // 2.2 TODO 再次对变更后音频文件进行内容审核 + String reviewTaskId = auditService.startReviewTask(trackInfo.getMediaFileId()); + trackInfo.setStatus(SystemConstant.TRACK_STATUS_REVIEWING); + trackInfo.setReviewTaskId(reviewTaskId); + + // 2.3原有音频从点播平台删除 + vodService.deleteMedia(oldMediaFileId); + } + } + trackInfo.setTrackTitle(trackInfoVo.getTrackTitle()); + trackInfo.setTrackIntro(trackInfoVo.getTrackIntro()); + trackInfo.setCoverUrl(trackInfoVo.getCoverUrl()); - //3. 更新声音记录 - trackInfoMapper.updateById(trackInfo); + //3. 更新声音记录 + trackInfoMapper.updateById(trackInfo); - } + } - @Override - @Transactional(rollbackFor = Exception.class) - public void removeTrackInfo(Long id) { - //1.根据ID查询要被删除声音记录 得到专辑ID跟序号 - TrackInfo trackInfo = trackInfoMapper.selectById(id); - Long albumId = trackInfo.getAlbumId(); - Integer orderNum = trackInfo.getOrderNum(); + @Override + @Transactional(rollbackFor = Exception.class) + public void removeTrackInfo(Long id) { + //1.根据ID查询要被删除声音记录 得到专辑ID跟序号 + TrackInfo trackInfo = trackInfoMapper.selectById(id); + Long albumId = trackInfo.getAlbumId(); + Integer orderNum = trackInfo.getOrderNum(); - //2.更新序号确保声音表中序号连续 - trackInfoMapper.update( - null, - new LambdaUpdateWrapper() - .eq(TrackInfo::getAlbumId, albumId) - .gt(TrackInfo::getOrderNum, orderNum) - .setSql("order_num = order_num - 1") - ); + //2.更新序号确保声音表中序号连续 + trackInfoMapper.update( + null, + new LambdaUpdateWrapper() + .eq(TrackInfo::getAlbumId, albumId) + .gt(TrackInfo::getOrderNum, orderNum) + .setSql("order_num = order_num - 1") + ); - //3.删除声音 - trackInfoMapper.deleteById(id); + //3.删除声音 + trackInfoMapper.deleteById(id); - //4.删除统计信息 - trackStatMapper.delete( - new LambdaQueryWrapper() - .eq(TrackStat::getTrackId, id) - ); + //4.删除统计信息 + trackStatMapper.delete( + new LambdaQueryWrapper() + .eq(TrackStat::getTrackId, id) + ); - //5.更新专辑包含声音数量 - albumInfoMapper.update(null, - new LambdaUpdateWrapper().eq(AlbumInfo::getId, albumId) - .setSql("include_track_count = include_track_count - 1") - ); + //5.更新专辑包含声音数量 + albumInfoMapper.update(null, + new LambdaUpdateWrapper().eq(AlbumInfo::getId, albumId) + .setSql("include_track_count = include_track_count - 1") + ); - //6.删除点播平台音频文件 - vodService.deleteMedia(trackInfo.getMediaFileId()); + //6.删除点播平台音频文件 + vodService.deleteMedia(trackInfo.getMediaFileId()); + + } + + @Override + public Page findAlbumTrackPage(Page pageInfo, Long userId, Long albumId) { + //1.分页查询专辑下声音列表 默认:isShowPaidMark = false; + pageInfo = trackInfoMapper.findAlbumTrackPage(pageInfo, albumId); + //TODO 根据用户登录状态、身份、专辑付费类型、是否购买综合判断付费标识 + + //2.根据专辑ID查询专辑信息,得到专辑付费类型以及免费试听集数 + AlbumInfo albumInfo = albumInfoMapper.selectById(albumId); + + //付费类型: 0101-免费、0102-vip免费、0103-付费 + String payType = albumInfo.getPayType(); + Integer tracksForFree = albumInfo.getTracksForFree(); + + //3.处理未登录情况 + if (userId == null) { + if (ALBUM_PAY_TYPE_VIPFREE.equals(payType) || ALBUM_PAY_TYPE_REQUIRE.equals(payType)) { + //将试听以外其他声音付费标识改为:true + pageInfo.getRecords() + .stream() + .filter(track -> track.getOrderNum() > tracksForFree) + .forEach(track -> track.setIsShowPaidMark(true)); + } + } else { + //4.处理已登录情况 + //4.1 远程调用用户服务获取用户身份,是否为VIP + Boolean isVIP = false; + UserInfoVo userInfoVo = userFeignClient.getUserInfoVo(userId).getData(); + Assert.notNull(userInfoVo, "用户{}不存在", userId); + if (userInfoVo.getIsVip().intValue() == 1 + && userInfoVo.getVipExpireTime().after(new Date())) { + isVIP = true; + } + //先设定一个默认值 是否需要检查付费状态 + Boolean isNeedCheckPayState = false; + //4.2 如果普通用户查看付费类型是:VIP免费专辑,则需要进一步判断声音购买情况 + if (!isVIP && ALBUM_PAY_TYPE_VIPFREE.equals(payType)) { + isNeedCheckPayState = true; + } + + //4.3 如果付费类型是:付费。无论什么用户,都需要进一步判断声音购买情况 + if (ALBUM_PAY_TYPE_REQUIRE.equals(payType)) { + isNeedCheckPayState = true; + } + //4.4 如果需要判断声音购买情况,远程调用用户服务 + if (isNeedCheckPayState) { + //4.4.1 获取当前页中去掉试听部分声音ID列表 + List needCheckPayStateTrackIdList = pageInfo.getRecords() + .stream() + .filter(track -> track.getOrderNum() > tracksForFree) + .map(AlbumTrackListVo::getTrackId) + .collect(Collectors.toList()); + //4.4.2 远程调用用户服务获取每个声音的购买情况 + Map payStatusMap = userFeignClient.userIsPaidTrack(albumId, needCheckPayStateTrackIdList).getData(); + + //4.5 根据响应声音购买情况,(去除掉试听部分声音ID)将未购买声音付费标识设置为:true + pageInfo.getRecords() + .stream() + .filter(track -> track.getOrderNum() > tracksForFree) + .forEach(track-> track.setIsShowPaidMark(payStatusMap.get(track.getTrackId()) == 0)); + } + } + return pageInfo; + } + + + } - } -} diff --git a/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml b/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml index 37d1281..8ecbcc9 100644 --- a/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml +++ b/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml @@ -34,5 +34,15 @@ + + + diff --git a/service/service-album/src/main/resources/mapper/TrackInfoMapper.xml b/service/service-album/src/main/resources/mapper/TrackInfoMapper.xml index b573278..e026e08 100644 --- a/service/service-album/src/main/resources/mapper/TrackInfoMapper.xml +++ b/service/service-album/src/main/resources/mapper/TrackInfoMapper.xml @@ -32,5 +32,23 @@ order by ti.id desc + + diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class index 4738c4b..49be6a0 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/BaseCategoryApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/BaseCategoryApiController.class index f35c343..22d597f 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/BaseCategoryApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/BaseCategoryApiController.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/FileUploadApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/FileUploadApiController.class index d974a50..fe483b8 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/FileUploadApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/FileUploadApiController.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class index be54a1a..07e1890 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/api/TrackInfoApiController.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/config/VodConstantProperties.class b/service/service-album/target/classes/com/atguigu/tingshu/album/config/VodConstantProperties.class index d93fbd3..25147e7 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/config/VodConstantProperties.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/config/VodConstantProperties.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.class b/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.class index 8ae663e..8e98eb4 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/TrackInfoMapper.class b/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/TrackInfoMapper.class index 75cc3b1..6b2c1bc 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/TrackInfoMapper.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/mapper/TrackInfoMapper.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/AlbumInfoService.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/AlbumInfoService.class index 48a1130..52c8b37 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/AlbumInfoService.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/AlbumInfoService.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/BaseCategoryService.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/BaseCategoryService.class index 81051c8..f549e99 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/BaseCategoryService.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/BaseCategoryService.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class index f718d65..ab27e21 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/TrackInfoService.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.class index 06ebd04..8d5b3c7 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/BaseCategoryServiceImpl.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/BaseCategoryServiceImpl.class index 3bb7512..f7d87d5 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/BaseCategoryServiceImpl.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/BaseCategoryServiceImpl.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/FileUploadServiceImpl.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/FileUploadServiceImpl.class index 48cdc27..ee4cc81 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/FileUploadServiceImpl.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/FileUploadServiceImpl.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.class index cfd9d72..4b6e5c8 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/TrackInfoServiceImpl.class differ diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/VodServiceImpl.class b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/VodServiceImpl.class index 1e4bdaa..fc61bd2 100644 Binary files a/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/VodServiceImpl.class and b/service/service-album/target/classes/com/atguigu/tingshu/album/service/impl/VodServiceImpl.class differ diff --git a/service/service-album/target/classes/mapper/AlbumInfoMapper.xml b/service/service-album/target/classes/mapper/AlbumInfoMapper.xml index 37d1281..8ecbcc9 100644 --- a/service/service-album/target/classes/mapper/AlbumInfoMapper.xml +++ b/service/service-album/target/classes/mapper/AlbumInfoMapper.xml @@ -34,5 +34,15 @@ + + + diff --git a/service/service-album/target/classes/mapper/TrackInfoMapper.xml b/service/service-album/target/classes/mapper/TrackInfoMapper.xml index b573278..e026e08 100644 --- a/service/service-album/target/classes/mapper/TrackInfoMapper.xml +++ b/service/service-album/target/classes/mapper/TrackInfoMapper.xml @@ -32,5 +32,23 @@ order by ti.id desc + + diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java index f8652b3..3b67ae2 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/SearchApiController.java @@ -9,6 +9,9 @@ import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; + @Tag(name = "搜索专辑管理") @RestController @RequestMapping("api/search") @@ -54,6 +57,17 @@ public class SearchApiController { return Result.ok(albumSearchResponseVo); } + /** + * 查询1级分类下置顶3级分类热度TOP6专辑 + * @param category1Id + * @return [{"baseCategory3":{三级分类对象},list:[专辑列表]},,{其他6个置顶分类热门专辑Map}] + */ + @Operation(summary = "查询1级分类下置顶3级分类热度TOP6专辑") + @GetMapping("/albumInfo/channel/{category1Id}") + public Result>> channel(@PathVariable Long category1Id) { + List> list = searchService.channel(category1Id); + return Result.ok(list); + } } diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/itemApiController.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/itemApiController.java index c90aae9..465a9cb 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/api/itemApiController.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/api/itemApiController.java @@ -1,11 +1,17 @@ package com.atguigu.tingshu.search.api; +import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.search.service.ItemService; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.Map; + @Tag(name = "专辑详情管理") @RestController @RequestMapping("api/search") @@ -15,5 +21,19 @@ public class itemApiController { @Autowired private ItemService itemService; + /** + * 获取专辑详情页渲染所需参数 + * + * @param albumId + * @return + */ + + @Operation(summary = "获取专辑详情页渲染所需参数") + @GetMapping("/albumInfo/{albumId}") + public Result> getItem(@PathVariable Long albumId) { + Map map = itemService.getItem(albumId); + return Result.ok(map); + } + } diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/ItemService.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/ItemService.java index 2b15983..4d3e4bf 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/ItemService.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/ItemService.java @@ -1,7 +1,9 @@ package com.atguigu.tingshu.search.service; +import java.util.Map; + public interface ItemService { - + Map getItem(Long albumId); } diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java index 2548b5b..25ee879 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/SearchService.java @@ -3,6 +3,9 @@ package com.atguigu.tingshu.search.service; import com.atguigu.tingshu.query.search.AlbumIndexQuery; import com.atguigu.tingshu.vo.search.AlbumSearchResponseVo; +import java.util.List; +import java.util.Map; + public interface SearchService { @@ -11,4 +14,9 @@ public interface SearchService { void lowerAlbum(Long albumId); AlbumSearchResponseVo search(AlbumIndexQuery albumIndexQuery); + + List> channel(Long category1Id); + + + } diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.java index a12f933..6a1e5ec 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.java @@ -1,13 +1,79 @@ package com.atguigu.tingshu.search.service.impl; +import cn.hutool.core.lang.Assert; +import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.model.album.BaseCategoryView; import com.atguigu.tingshu.search.service.ItemService; +import com.atguigu.tingshu.user.client.UserFeignClient; +import com.atguigu.tingshu.vo.album.AlbumStatVo; +import com.atguigu.tingshu.vo.user.UserInfoVo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + @Slf4j @Service @SuppressWarnings({"all"}) public class ItemServiceImpl implements ItemService { + @Autowired + private UserFeignClient userFeignClient; + @Autowired + private AlbumFeignClient albumFeignClient; + @Autowired + private Executor threadPoolTaskExecutor; + @Override + public Map getItem(Long albumId) { + //1.创建封装详情页map对象,由于多线程 hashmap线程不安全,所以我们使用concurrentHashMap + Map map = new ConcurrentHashMap<>(); + + //2.异步远程调用专辑服务查询专辑信息,封装专辑信息 + CompletableFuture albumInfoCompletableFuture = CompletableFuture.supplyAsync(() -> { + AlbumInfo albumInfo = albumFeignClient.getAlbumInfo(albumId).getData(); + Assert.notNull(albumInfo, "专辑{}不存在", albumId); + map.put("albumInfo", albumInfo); + return albumInfo; + }, threadPoolTaskExecutor); + + //3.远程调用专辑服务查询分类信息,封装分类对象 + CompletableFuture categoryViewCompletableFuture = albumInfoCompletableFuture.thenAcceptAsync(albumInfo -> { + BaseCategoryView baseCategoryView = albumFeignClient.getCategoryView(albumInfo.getCategory3Id()).getData(); + Assert.notNull(baseCategoryView, "分类{}不存在", albumInfo.getCategory3Id()); + map.put("baseCategoryView", baseCategoryView); + + }, threadPoolTaskExecutor); + + //4.远程调用专辑服务查询统计数值,封装统计对象 + CompletableFuture albumStatCompletableFuture = CompletableFuture.runAsync(() -> { + AlbumStatVo albumStatVo = albumFeignClient.getAlbumStatVo(albumId).getData(); + Assert.notNull(albumStatVo, "专辑统计{}不存在", albumId); + map.put("albumStatVo", albumStatVo); + }, threadPoolTaskExecutor); + //5.远程调用用户服务查询主播信息,封装主播对象 + CompletableFuture announcerCompletableFuture = albumInfoCompletableFuture.thenAcceptAsync(albumInfo -> { + UserInfoVo userInfoVo = userFeignClient.getUserInfoVo(albumInfo.getUserId()).getData(); + Assert.notNull(userInfoVo, "用户{}不存在", albumInfo.getUserId()); + map.put("announcer", userInfoVo); + }, threadPoolTaskExecutor); + //6.采用异步编排对四项任务组合,所有异步任务都必须执行完成 + CompletableFuture.allOf( + albumInfoCompletableFuture, + categoryViewCompletableFuture, + albumStatCompletableFuture, + announcerCompletableFuture + ).orTimeout(1, TimeUnit.SECONDS) + .join(); + //7.响应map + return map; + + + } } diff --git a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.java b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.java index 59de3dc..960f129 100644 --- a/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.java +++ b/service/service-search/src/main/java/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.java @@ -2,17 +2,24 @@ package com.atguigu.tingshu.search.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.RandomUtil; import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.FieldValue; import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch._types.aggregations.Aggregate; +import co.elastic.clients.elasticsearch._types.aggregations.LongTermsBucket; import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; +import com.alibaba.fastjson.JSON; import com.atguigu.tingshu.album.AlbumFeignClient; +import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.model.album.AlbumAttributeValue; import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.model.album.BaseCategory3; import com.atguigu.tingshu.model.album.BaseCategoryView; import com.atguigu.tingshu.model.search.AlbumInfoIndex; import com.atguigu.tingshu.model.search.AttributeValueIndex; @@ -28,9 +35,11 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.io.IOException; import java.math.BigDecimal; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -162,7 +171,6 @@ public class SearchServiceImpl implements SearchService { } - private static final String INDEX_NAME = "albuminfo"; @@ -204,8 +212,8 @@ public class SearchServiceImpl implements SearchService { if (split != null && split.length == 2) { allConditionBoolQueryBuilder.filter(f -> f.nested( n -> n.path("attributeValueIndexList") - .query(q-> q.bool(b->b.must(m->m.term(t->t.field("attributeValueIndexList.attributeId").value(split[0]))) - .must(m->m.term(t->t.field("attributeValueIndexList.valueId").value(split[1]))))))); + .query(q -> q.bool(b -> b.must(m -> m.term(t -> t.field("attributeValueIndexList.attributeId").value(split[0]))) + .must(m -> m.term(t -> t.field("attributeValueIndexList.valueId").value(split[1]))))))); } } } @@ -262,6 +270,7 @@ public class SearchServiceImpl implements SearchService { //4.基于检索对象构建器对象返回实际检索请求对象 return builder.build(); } + private AlbumSearchResponseVo parseResult(SearchResponse searchResponse, AlbumIndexQuery albumIndexQuery) { //1.创建响应VO对象 AlbumSearchResponseVo vo = new AlbumSearchResponseVo(); @@ -280,7 +289,7 @@ public class SearchServiceImpl implements SearchService { //3.封装VO中检索到专辑列表集合属性 List> hits = searchResponse.hits().hits(); - if(CollUtil.isNotEmpty(hits)){ + if (CollUtil.isNotEmpty(hits)) { //采用Stream流将检索到文档类型从AlbumInfoIndex转为AlbumInfoIndexVo List list = hits.stream().map(hit -> { AlbumInfoIndex albumInfoIndex = hit.source(); @@ -297,4 +306,72 @@ public class SearchServiceImpl implements SearchService { //4.响应VO对象 return vo; } -} + + @Override + public List> channel(Long category1Id) { + try { + //1.远程调用专辑服务,获取1级分类下7个置顶分类列表 + //1.1 发起远程调用 + List baseCategory3List = albumFeignClient.findTopBaseCategory3(category1Id).getData(); + Assert.notNull(baseCategory3List, "没有查询到分类列表"); + //1.2 为了后续封装置顶分类热门专辑Map对象中 分类信息 ,将分类集合转为Map对象 key:分类ID value:分类对象 + Map category3Map = baseCategory3List + .stream() + .collect(Collectors.toMap(BaseCategory3::getId, c3 -> c3)); + + //1.3 基于3级分类集合转为FieldValue封装每个三级分类ID + List fieldValueList = + baseCategory3List.stream().map(c3 -> FieldValue.of(c3.getId())).collect(Collectors.toList()); + + //2.检索ES获取每个置顶分类及包含热度前六专辑列表 + SearchResponse searchResponse = elasticsearchClient.search( + s -> s.index(INDEX_NAME) + .query(q -> q.terms(t -> t.field("category3Id").terms(t1 -> t1.value(fieldValueList)))) + .aggregations( + "c3_agg", a -> a.terms(t -> t.field("category3Id").size(7)) + .aggregations( + "top6", a1 -> a1.topHits(t -> t.size(6).sort(s1 -> s1.field(f -> f.field("hotScore").order(SortOrder.Desc))).source(s1 -> s1.filter(f -> f.excludes("attributeValueIndexList", + "hotScore", + "commentStatNum", + "buyStatNum", + "subscribeStatNum", + "announcerName")))) + ) + ) + .size(0), + AlbumInfoIndex.class); + + //3.解析ES检索结果,封装数据并返回 + Map aggregations = searchResponse.aggregations(); + if (CollUtil.isNotEmpty(aggregations)) { + //3.1 将聚合结果转为LongTermsAggregate获取聚合buckets桶数组 + List buckets = aggregations.get("c3_agg").lterms().buckets().array(); + //3.2 遍历buckets桶数组,每遍历一次产出置顶分类热门专辑Map对象 + List> mapList = buckets.stream().map(bucket -> { + //3.2.1 创建置顶分类热门专辑Map对象 + Map map = new HashMap<>(); + //3.2.2 封装三级分类对象 + long category3Id = bucket.key(); + map.put("baseCategory3", category3Map.get(category3Id)); + //3.2.3 封装对应热度最高top6专辑列表 将子聚合类型转为TopHitsAggregate + List top6List = bucket.aggregations() + .get("top6") + .topHits() + .hits() + .hits() + .stream() + .map(hit -> { + //采用FastJson将专辑JSON转为索引库文档对象 + return JSON.parseObject(hit.source().toString(), AlbumInfoIndex.class); + }).collect(Collectors.toList()); + map.put("list", top6List); + return map; + }).collect(Collectors.toList()); + return mapList; + } + return null; + } catch (IOException e) { + log.error("ES检索异常:{}", e.getMessage()); + throw new RuntimeException(e); + } +}} diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/api/SearchApiController.class b/service/service-search/target/classes/com/atguigu/tingshu/search/api/SearchApiController.class index 3f95953..9831179 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/api/SearchApiController.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/api/SearchApiController.class differ diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/api/itemApiController.class b/service/service-search/target/classes/com/atguigu/tingshu/search/api/itemApiController.class index a35259a..abda2e2 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/api/itemApiController.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/api/itemApiController.class differ diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/service/ItemService.class b/service/service-search/target/classes/com/atguigu/tingshu/search/service/ItemService.class index d4e0dcf..f851cdf 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/service/ItemService.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/service/ItemService.class differ diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/service/SearchService.class b/service/service-search/target/classes/com/atguigu/tingshu/search/service/SearchService.class index 19e6645..d3d5a68 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/service/SearchService.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/service/SearchService.class differ diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.class b/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.class index c5341b2..4713d1c 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/ItemServiceImpl.class differ diff --git a/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.class b/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.class index 353ee7b..8c02d8b 100644 Binary files a/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.class and b/service/service-search/target/classes/com/atguigu/tingshu/search/service/impl/SearchServiceImpl.class differ diff --git a/service/service-search/target/test-classes/com/atguigu/tingshu/search/test01.class b/service/service-search/target/test-classes/com/atguigu/tingshu/search/test01.class index 5b1d922..703bf48 100644 Binary files a/service/service-search/target/test-classes/com/atguigu/tingshu/search/test01.class and b/service/service-search/target/test-classes/com/atguigu/tingshu/search/test01.class differ diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java index 7302d78..55f18b4 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/api/UserInfoApiController.java @@ -1,15 +1,17 @@ package com.atguigu.tingshu.user.api; +import com.atguigu.tingshu.common.login.GuiGuLogin; import com.atguigu.tingshu.common.result.Result; +import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.user.service.UserInfoService; import com.atguigu.tingshu.vo.user.UserInfoVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; @Tag(name = "用户管理接口") @RestController @@ -29,7 +31,26 @@ public class UserInfoApiController { public Result getUserInfoVo(@PathVariable Long userId){ UserInfoVo userInfoVo = userInfoService.getUserInfo(userId); return Result.ok(userInfoVo); - -} +} + + /** + * 获取每一页声音列表(提交声音ID集合)对应购买状态 + * + * @param userId 用户ID + * @param albumId 专辑ID + * @param needCheckPayStateTrackIdList 需要检查购买状态的声音ID集合 + * @return {声音ID:1(已购),声音ID:0(未购)} + */ + @GuiGuLogin //对内微服务访问接口,上游系统调用是否只要携带token 下游系统就可以获取用户ID + @Operation(summary = "获取每一页声音列表(提交声音ID集合)对应购买状态") + @PostMapping("/userInfo/userIsPaidTrack/{albumId}") + public Result> userIsPaidTrack( + @PathVariable("albumId") Long albumId, + @RequestBody List needCheckPayStateTrackIdList + ) { + Long userId = AuthContextHolder.getUserId(); + Map map = userInfoService.userIsPaidTrack(userId, albumId, needCheckPayStateTrackIdList); + return Result.ok(map); + } } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java index 93fdb4b..e8881e8 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/UserInfoService.java @@ -4,6 +4,7 @@ import com.atguigu.tingshu.model.user.UserInfo; import com.atguigu.tingshu.vo.user.UserInfoVo; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; import java.util.Map; public interface UserInfoService extends IService { @@ -13,4 +14,7 @@ public interface UserInfoService extends IService { UserInfoVo getUserInfo(Long userId); void updateUser(UserInfoVo userInfoVo, Long userId); + + Map userIsPaidTrack(Long userId, Long albumId, List needCheckPayStateTrackIdList); + } diff --git a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java index 4358772..203c074 100644 --- a/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java +++ b/service/service-user/src/main/java/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.java @@ -3,13 +3,18 @@ package com.atguigu.tingshu.user.service.impl; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.atguigu.tingshu.common.constant.RedisConstant; import com.atguigu.tingshu.common.rabbit.constant.MqConst; import com.atguigu.tingshu.common.rabbit.service.RabbitService; import com.atguigu.tingshu.model.user.UserInfo; +import com.atguigu.tingshu.model.user.UserPaidAlbum; +import com.atguigu.tingshu.model.user.UserPaidTrack; import com.atguigu.tingshu.user.mapper.UserInfoMapper; +import com.atguigu.tingshu.user.mapper.UserPaidAlbumMapper; +import com.atguigu.tingshu.user.mapper.UserPaidTrackMapper; import com.atguigu.tingshu.user.service.UserInfoService; import com.atguigu.tingshu.vo.user.UserInfoVo; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -22,8 +27,10 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; @Slf4j @Service @@ -38,8 +45,12 @@ public class UserInfoServiceImpl extends ServiceImpl i private RedisTemplate redisTemplate; @Autowired private RabbitService rabbitService; + @Autowired + private UserPaidAlbumMapper userPaidAlbumMapper; + @Autowired + private UserPaidTrackMapper userPaidTrackMapper; - @Override + @Override public Map wxLogin(String code) { try { //1.根据小程序提交的临时票据code调用微信接口服务,获取当前微信用户唯一标识openid @@ -101,4 +112,56 @@ public class UserInfoServiceImpl extends ServiceImpl i userInfoMapper.updateById(userInfo); } -} + + @Override + public Map userIsPaidTrack(Long userId, Long albumId, List needCheckPayStateTrackIdList) { + Map payStatusMap = new HashMap<>(); + //1.根据用户ID+专辑ID查询已购专辑记录,如果存在专辑购买记录,将提交声音ID购买状态全部设置为1,返回 + Long count = userPaidAlbumMapper.selectCount( + new LambdaQueryWrapper() + .eq(UserPaidAlbum::getUserId, userId) + .eq(UserPaidAlbum::getAlbumId, albumId) + ); + if (count > 0) { + for (Long trackId : needCheckPayStateTrackIdList) { + payStatusMap.put(trackId, 1); + } + return payStatusMap; + } + + //2.如果未购买专辑,根据用户ID+专辑ID查询已购声音记录 + List userPaidTrackList = userPaidTrackMapper.selectList( + new LambdaQueryWrapper() + .eq(UserPaidTrack::getUserId, userId) + .eq(UserPaidTrack::getAlbumId, albumId) + .select(UserPaidTrack::getTrackId) + ); + + //2.1 如果不存在购买声音记录,将提交声音ID购买状态全部设置为0,返回 + if (CollUtil.isEmpty(userPaidTrackList)) { + for (Long trackID : needCheckPayStateTrackIdList) { + payStatusMap.put(trackID, 0); + } + return payStatusMap; + } + + //2.2 如果存在购买声音记录,将提交声音ID已购设置1,未购买设置为0返回 + //2.2.1 获取已购声音ID集合 + List userPaidTrackIdList = + userPaidTrackList.stream().map(UserPaidTrack::getTrackId).collect(Collectors.toList()); + //2.2.2 判断哪些是已购设置为1,哪些是未购买设置为0 + for (Long trackId : needCheckPayStateTrackIdList) { + if(userPaidTrackIdList.contains(trackId)){ + //已购买 + payStatusMap.put(trackId, 1); + }else{ + //未购买 + payStatusMap.put(trackId, 0); + } + } + return payStatusMap; + } + + + } + diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class b/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class index 9fd7f23..88dd539 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/api/UserInfoApiController.class differ diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class b/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class index cfe09f4..b64a6aa 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/service/UserInfoService.class differ diff --git a/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class b/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class index 81b96c3..cfa39b8 100644 Binary files a/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class and b/service/service-user/target/classes/com/atguigu/tingshu/user/service/impl/UserInfoServiceImpl.class differ