第二次课程提交 (2)

This commit is contained in:
Y1NanPing 2025-07-19 17:23:25 +08:00
parent c282d5ff1f
commit 6b0d3c13e8
8 changed files with 237 additions and 58 deletions

View File

@ -3,15 +3,19 @@ package com.atguigu.tingshu.album.api;
import com.atguigu.tingshu.album.service.AlbumInfoService; import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder; import com.atguigu.tingshu.common.util.AuthContextHolder;
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.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import java.util.List;
import org.springframework.web.bind.annotation.RestController;
@Tag(name = "专辑管理") @Tag(name = "专辑管理")
@RestController @RestController
@ -32,6 +36,48 @@ public class AlbumInfoApiController {
} }
//这个是在登录到专辑页面的时候会调用这个接口获取当前登录用户的专辑信息
@Operation(summary = "分页条件查询当前登录用户发布专辑")
@PostMapping("/albumInfo/findUserAlbumPage/{page}/{limit}")
public Result<IPage<AlbumListVo>> findUserAlbumPage(@PathVariable Long page,
@PathVariable Long limit,
@RequestBody AlbumInfoQuery albumInfoQuery){
//先从线程中取出来用户id
Long userId = AuthContextHolder.getUserId();
//将用户id放进到查询条件中
albumInfoQuery.setUserId(userId);
//new一个新的pageInfo对象 用来封装数据
IPage<AlbumListVo> pageInfo = new Page<>(page, limit);
pageInfo =albumInfoService.findUserAlbumPage(pageInfo, albumInfoQuery);
return Result.ok(pageInfo);
}
@Operation(summary = "根据专辑ID删除专辑")
@DeleteMapping("/albumInfo/removeAlbumInfo/{id}")
public Result removeAlbumInfo(@PathVariable Long id) {
albumInfoService.removeAlbumInfo(id);
return Result.ok();
}
/**
* 查询专辑信息包含专辑标签列表
*
* @param id
* @return
*/
@Operation(summary = "查询专辑信息,包含专辑标签列表")
@GetMapping("/albumInfo/getAlbumInfo/{id}")
public Result<AlbumInfo> getAlbumInfo(@PathVariable Long id) {
AlbumInfo albumInfo = albumInfoService.getAlbumInfo(id);
return Result.ok(albumInfo);
}
@Operation(summary = "更新专辑信息")
@PutMapping("/albumInfo/updateAlbumInfo/{id}")
public Result updateAlbumInfo(@PathVariable Long id, @Validated @RequestBody AlbumInfoVo albumInfoVo) {
albumInfoService.updateAlbumInfo(id, albumInfoVo);
return Result.ok();
}
} }

View File

@ -1,10 +1,15 @@
package com.atguigu.tingshu.album.mapper; package com.atguigu.tingshu.album.mapper;
import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper @Mapper
public interface AlbumInfoMapper extends BaseMapper<AlbumInfo> { public interface AlbumInfoMapper extends BaseMapper<AlbumInfo> {
IPage<AlbumListVo> findUserAlbumPage(IPage<AlbumListVo> pageInfo, @Param("vo")AlbumInfoQuery albumInfoQuery);
} }

View File

@ -1,7 +1,10 @@
package com.atguigu.tingshu.album.service; package com.atguigu.tingshu.album.service;
import com.atguigu.tingshu.model.album.AlbumInfo; 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.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
public interface AlbumInfoService extends IService<AlbumInfo> { public interface AlbumInfoService extends IService<AlbumInfo> {
@ -11,4 +14,13 @@ public interface AlbumInfoService extends IService<AlbumInfo> {
void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId); void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId);
//保存专辑的状态 //保存专辑的状态
void saveAlbumInfoStat(Long albumId, String statType, int statNum); void saveAlbumInfoStat(Long albumId, String statType, int statNum);
IPage<AlbumListVo> findUserAlbumPage(IPage<AlbumListVo> pageInfo, AlbumInfoQuery albumInfoQuery);
void removeAlbumInfo(Long id);
AlbumInfo getAlbumInfo(Long id);
void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo);
} }

View File

@ -4,14 +4,22 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper; import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper; import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.TrackInfoMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService; import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.album.service.AlbumInfoService; import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant; import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue; import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat; import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo; import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo; import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -26,63 +34,143 @@ import java.util.stream.Collectors;
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService { public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {
@Autowired @Autowired
private AlbumInfoMapper albumInfoMapper; private AlbumInfoMapper albumInfoMapper;
@Autowired @Autowired
private AlbumAttributeValueService albumAttributeValueService; private AlbumAttributeValueService albumAttributeValueService;
@Autowired @Autowired
private AlbumStatMapper albumStatMapper; private AlbumStatMapper albumStatMapper;
@Autowired
private TrackInfoMapper trackInfoMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) { public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
//1.保存专辑信息 //1.保存专辑信息
//1.1 将专辑VO视图对象对象转为专辑PO持久化对象对象 //1.1 将专辑VO视图对象对象转为专辑PO持久化对象对象
//将我们上传专辑的那个表中的数据转换成为albumInfo这个持久化对象数据里 //将我们上传专辑的那个表中的数据转换成为albumInfo这个持久化对象数据里
//相当于把传上来的表变成一个你存大数据的表 albumInfo这表中有大量的数据 比如说专辑的状态 属性等 //相当于把传上来的表变成一个你存大数据的表 albumInfo这表中有大量的数据 比如说专辑的状态 属性等
//不是这一个albumInfoVo表能装下的 //不是这一个albumInfoVo表能装下的
//用这个工具要保证两个字段是相同的 //用这个工具要保证两个字段是相同的
AlbumInfo albumInfo= BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class); AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
//1.2 封装PO对象中用户ID免费试听集数专辑状态 //1.2 封装PO对象中用户ID免费试听集数专辑状态
//这两张表只有这三个状态是不一样的 //这两张表只有这三个状态是不一样的
albumInfo.setUserId(userId); albumInfo.setUserId(userId);
albumInfo.setTracksForFree(5); albumInfo.setTracksForFree(5);
albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS); albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS);
//1.3 保存专辑得到专辑ID //1.3 保存专辑得到专辑ID
albumInfoMapper.insert(albumInfo); albumInfoMapper.insert(albumInfo);
Long albumId = albumInfo.getId(); Long albumId = albumInfo.getId();
//2.保存专辑标签信息 //2.保存专辑标签信息
List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
if (CollUtil.isNotEmpty(albumAttributeValueVoList)) { if (CollUtil.isNotEmpty(albumAttributeValueVoList)) {
//2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue //2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue
//最一开始是vo类型 你通过stream将泛型 //最一开始是vo类型 你通过stream将泛型
List<AlbumAttributeValue> attributeValueList = albumAttributeValueVoList List<AlbumAttributeValue> attributeValueList = albumAttributeValueVoList
.stream() .stream()
.map(vo -> { .map(vo -> {
AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class); AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class);
//2.2 为每个专辑标签关系 关联 专辑ID //2.2 为每个专辑标签关系 关联 专辑ID
albumAttributeValue.setAlbumId(albumId); albumAttributeValue.setAlbumId(albumId);
return albumAttributeValue; return albumAttributeValue;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
//2.3 批量保存 //2.3 批量保存
albumAttributeValueService.saveBatch(attributeValueList); albumAttributeValueService.saveBatch(attributeValueList);
} }
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0); this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0); this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0); this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0);
this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0); this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0);
} }
@Override @Override
public void saveAlbumInfoStat(Long albumId, String statType, int statNum) { public void saveAlbumInfoStat(Long albumId, String statType, int statNum) {
AlbumStat albumStat = new AlbumStat(); AlbumStat albumStat = new AlbumStat();
albumStat.setAlbumId(albumId); albumStat.setAlbumId(albumId);
albumStat.setStatType(statType); albumStat.setStatType(statType);
albumStat.setStatNum(statNum); albumStat.setStatNum(statNum);
albumStatMapper.insert(albumStat); albumStatMapper.insert(albumStat);
} }
@Override
public IPage<AlbumListVo> findUserAlbumPage(IPage<AlbumListVo> pageInfo, AlbumInfoQuery albumInfoQuery) {
return albumInfoMapper.findUserAlbumPage(pageInfo, albumInfoQuery);
}
@Override
public void removeAlbumInfo(Long id) {
Long count = trackInfoMapper.selectCount(new LambdaQueryWrapper<TrackInfo>()
.eq(TrackInfo::getAlbumId, id));
if (count>0){
throw new GuiguException(500,"专辑下有声音,请先删除专辑下的声音");
}
//2.删除专辑
albumInfoMapper.deleteById(id);
//3.删除专辑统计
albumStatMapper.delete(
new LambdaQueryWrapper<AlbumStat>()
.eq(AlbumStat::getAlbumId, id)
);
//4.删除专辑标签关系
albumAttributeValueService.remove(
new LambdaQueryWrapper<AlbumAttributeValue>()
.eq(AlbumAttributeValue::getAlbumId, id)
);
}
@Override
public AlbumInfo getAlbumInfo(Long id) {
//1.根据专辑ID查询专辑信息
AlbumInfo albumInfo = albumInfoMapper.selectById(id);
//2.根据专辑ID查询专辑标签列表
List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueService.list(
new LambdaQueryWrapper<AlbumAttributeValue>()
.eq(AlbumAttributeValue::getAlbumId, id)
);
albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
return albumInfo;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) { //1.更新专辑信息
AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
albumInfo.setId(id);
albumInfoMapper.updateById(albumInfo);
//2.更新专辑标签关系
//2.1 根据专辑ID删除原有专辑标签关系
albumAttributeValueService.remove(
new LambdaQueryWrapper<AlbumAttributeValue>()
.eq(AlbumAttributeValue::getAlbumId, id)
);
//2.2 如果有新提交专辑标签关系再次进行新增即可
List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
if (CollUtil.isNotEmpty(albumAttributeValueVoList)) {
//2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue
List<AlbumAttributeValue> attributeValueList = albumAttributeValueVoList
.stream()
.map(vo -> {
AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class);
//2.2 为每个专辑标签关系 关联 专辑ID
albumAttributeValue.setAlbumId(id);
return albumAttributeValue;
}).collect(Collectors.toList());
//2.3 批量保存
albumAttributeValueService.saveBatch(attributeValueList);
}
}
} }

View File

@ -3,7 +3,35 @@
<mapper namespace="com.atguigu.tingshu.album.mapper.AlbumInfoMapper"> <mapper namespace="com.atguigu.tingshu.album.mapper.AlbumInfoMapper">
<select id="findUserAlbumPage" resultType="com.atguigu.tingshu.vo.album.AlbumListVo">
select
ai.id album_id,
ai.album_title,
ai.cover_url,
ai.include_track_count,
ai.is_finished,
ai.status,
sum(if(stat_type = '0401', stat_num, 0)) playStatNum,
max(if(stat_type = '0402', stat_num, 0)) subscribeSta,
max(if(stat_type = '0403', stat_num, 0)) buyStatNum,
max(if(stat_type = '0404', stat_num, 0)) commentStatNum
from album_info ai
inner join album_stat stat on stat.album_id = ai.id and stat.is_deleted = 0
<where>
<if test="vo.userId != null">
and ai.user_id = #{vo.userId}
</if>
<if test="vo.status != null and vo.status != ''">
and ai.status = #{vo.status}
</if>
<if test="vo.albumTitle != null and vo.albumTitle != ''">
and ai.album_title like concat('%', #{vo.albumTitle}, '%')
</if>
and ai.is_deleted = 0
</where>
group by ai.id
order by ai.id desc
</select>
</mapper> </mapper>