记录专辑标签查询、添加专辑、列表检索、删除与修改流程,重点整理关联数据的保存及接口分层。
本篇要点
按分类查询专辑属性与标签
保存专辑及关联信息
完成列表、删除和修改接口
内容回顾 1、搭建项目环境
docker start spzx_rabbitmq
2、专辑管理
添加专辑需求
查询所有分类接口(三级分类)
上传文件接口
– 在配置文件里面有数据 yaml 或者 properties
今天内容 1、添加专辑功能
根据一级分类Id获取专辑标签对应数据接口 效果
表关系 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # base_attribute:标签(属性)名称,有一级分类id select ba.attribute_name from base_attribute ba where ba.category1_id= 2 ;# base_attribute_value: 属性名称下面哪些值,attribute_id关联属性名称 # 获取属性名称和对应值,两张表关联查询 select ba.category1_id,ba.attribute_name,bav.value_name from base_attribute ba inner join base_attribute_value bav on ba.id = bav.attribute_idwhere ba.category1_id= 2
接口实现
实体类
有一个标签名称,一个标签名称里面有多个标签值(使用List类型属性封装)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Data @Schema(description = "BaseAttribute") @TableName("base_attribute") public class BaseAttribute extends BaseEntity { private static final long serialVersionUID = 1L ; @Schema(description = "一级分类id") @TableField("category1_id") private Long category1Id; @Schema(description = "属性显示名称") @TableField("attribute_name") private String attributeName; @TableField(exist = false) private List<BaseAttributeValue> attributeValueList; }
BaseCatetoryApiController 1 2 3 4 5 6 7 8 @GetMapping("findAttribute/{category1Id}") public Result findAttribute (@PathVariable("category1Id") Long category1Id) { List<BaseAttribute> list = baseCategoryService.findAttribute(category1Id); return Result.ok(list); }
servcie 1 2 3 4 5 6 @Override public List<BaseAttribute> findAttribute (Long category1Id) { return baseAttributeMapper.selectAttribute(category1Id); }
mapper 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="com.atguigu.tingshu.album.mapper.BaseAttributeMapper" > <resultMap id ="baseAttributeMap" type ="com.atguigu.tingshu.model.album.BaseAttribute" autoMapping ="true" > <id column ="id" property ="id" > </id > <collection property ="attributeValueList" ofType ="com.atguigu.tingshu.model.album.BaseAttributeValue" autoMapping ="true" > <id column ="attribute_value_id" property ="id" > </id > </collection > </resultMap > <select id ="selectAttribute" resultMap ="baseAttributeMap" > select ba.id, ba.attribute_name, ba.category1_id, bav.id attribute_value_id, bav.value_name, bav.attribute_id from base_attribute ba inner join base_attribute_value bav on ba.id = bav.attribute_id where ba.category1_id = #{category1Id} order by ba.id </select > </mapper >
添加专辑接口 分析 请求路径和提交方式:
请求体,前端传递数据:
添加专辑需要使用表
1 2 3 4 5 6 album_info:专辑基本信息 album_stat:每个专辑统计数据, 0401-播放量 0402-订阅量 0403-购买量 0403-评论数 album_attribute_value: 保存每个专辑标签名称和对应值数据
接口实现 AlbumInfoApiController 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Tag(name = "专辑管理") @RestController @RequestMapping("api/album/albumInfo") @SuppressWarnings({"all"}) public class AlbumInfoApiController { @Autowired private AlbumInfoService albumInfoService; @PostMapping("saveAlbumInfo") public Result saveAlbumInfo (@RequestBody @Validated AlbumInfoVo albumInfoVo) { albumInfoService.saveAlbumInfo(albumInfoVo); return Result.ok(); } }
service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 @Slf4j @Service @SuppressWarnings({"all"}) public class AlbumInfoServiceImpl extends ServiceImpl <AlbumInfoMapper, AlbumInfo> implements AlbumInfoService { @Autowired private AlbumInfoMapper albumInfoMapper; @Autowired private AlbumAttributeValueMapper albumAttributeValueMapper; @Autowired private AlbumStatMapper albumStatMapper; @Transactional @Override public void saveAlbumInfo (AlbumInfoVo albumInfoVo) { AlbumInfo albumInfo = new AlbumInfo (); BeanUtils.copyProperties(albumInfoVo,albumInfo); albumInfo.setUserId(1L ); albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS); String payType = albumInfo.getPayType(); if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)) { albumInfo.setTracksForFree(3 ); } albumInfoMapper.insert(albumInfo); List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) { albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> { AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue (); BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue); albumAttributeValue.setAlbumId(albumInfo.getId()); albumAttributeValueMapper.insert(albumAttributeValue); }); } this .saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY); this .saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE); this .saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE); this .saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT); } public void saveAlbumStat (Long albumId, String statType) { AlbumStat albumStat = new AlbumStat (); albumStat.setAlbumId(albumId); albumStat.setStatType(statType); albumStat.setStatNum(0 ); albumStatMapper.insert(albumStat); } }
完善代码-批量添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> { AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue (); BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue); albumAttributeValue.setAlbumId(albumInfo.getId()); return albumAttributeValue; }).collect(Collectors.toList()); albumAttributeValueService.saveBatch(albumAttributeValueList);
2、查询专辑列表接口 分析 效果
查询表和语句编写
行变列
实现思路:分组 + if + 聚合函数实现
分组之后,select后面出现:分组字段、聚合函数、重复数据
1 2 3 4 5 6 7 8 9 10 11 12 13 # album_info 关联 album_stat select ai.id, ai.album_title, max (if(ast.stat_type= '0401' ,ast.stat_num,0 )) playStatNum, MAX (IF(ast.stat_type= '0402' ,ast.stat_num,0 )) subscribeStatNum, max (if(ast.stat_type = '0403' , ast.stat_num, 0 )) buyStatNum, max (if(ast.stat_type = '0404' , ast.stat_num, 0 )) commentStatNum, ai.cover_url from album_info ai inner join album_stat aston ai.id = ast.album_idgroup by ai.id
接口实现 AlbumInfoApiController 1 2 3 4 5 6 7 8 9 10 11 12 13 @PostMapping("findUserAlbumPage/{page}/{limit}") public Result findUserAlbumPage (@PathVariable Long page, @PathVariable Long limit, @RequestBody AlbumInfoQuery albumInfoQuery) { albumInfoQuery.setUserId(1L ); Page<AlbumListVo> pageParam = new Page <>(page, limit); IPage<AlbumListVo> pageModel = albumInfoService.selectAlbumPage(pageParam,albumInfoQuery); return Result.ok(pageModel); }
service 1 2 3 4 5 @Override public IPage<AlbumListVo> selectAlbumPage (Page<AlbumListVo> pageParam, AlbumInfoQuery albumInfoQuery) { return albumInfoMapper.selectUserAlbumPage(pageParam,albumInfoQuery); }
mapper 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="com.atguigu.tingshu.album.mapper.AlbumInfoMapper" > <select id ="selectUserAlbumPage" resultType ="com.atguigu.tingshu.vo.album.AlbumListVo" > select album.id as albumId, album.album_title, album.cover_url, album.include_track_count, album.is_finished, max(if(stat.stat_type = '0401', stat_num, 0)) playStatNum, max(if(stat.stat_type = '0402', stat_num, 0)) subscribeStatNum, max(if(stat.stat_type = '0403', stat_num, 0)) buyStatNum, max(if(stat.stat_type = '0404', stat_num, 0)) commentStatNum from album_info album inner join album_stat stat on album.id = stat.album_id <where > <if test ="vo.userId!=null" > album.user_id = #{vo.userId} </if > <if test ="vo.status!=null and vo.status!=''" > and album.status = #{vo.status} </if > <if test ="vo.albumTitle!=null and vo.albumTitle !=''" > and album.album_title like concat('%',#{vo.albumTitle},'%') </if > and album.is_deleted = 0 </where > group by album.id order by album.id </select > </mapper >
3、根据id删除专辑接口 分析
album_info:基本信息 album_stat:统计数据 album_attribute_value:标签名称和标签值数据
接口实现 controller 1 2 3 4 5 @DeleteMapping("removeAlbumInfo/{albumId}") public Result removeAlbumInfo (@PathVariable("albumId") String albumId) { albumInfoService.removeAlbumInfo(albumId); return Result.ok(); }
service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Override public void removeAlbumInfo (String albumId) { LambdaQueryWrapper<TrackInfo> queryWrapper = new LambdaQueryWrapper <>(); queryWrapper.eq(TrackInfo::getAlbumId,albumId); Long count = trackInfoMapper.selectCount(queryWrapper); if (count > 0 ) { throw new GuiguException (400 , "该专辑下存在未删除声音!" ); } albumInfoMapper.deleteById(albumId); LambdaQueryWrapper<AlbumAttributeValue> queryWrapper1 = new LambdaQueryWrapper <>(); queryWrapper1.eq(AlbumAttributeValue::getAlbumId,albumId); albumAttributeValueMapper.delete(queryWrapper1); LambdaQueryWrapper<AlbumStat> queryWrapper2 = new LambdaQueryWrapper <>(); queryWrapper2.eq(AlbumStat::getAlbumId,albumId); albumStatMapper.delete(queryWrapper2); }
4、修改专辑接口 接口1:根据专辑id获取专辑数据 controller 1 2 3 4 5 6 @GetMapping("getAlbumInfo/{albumId}") public Result<AlbumInfo> getAlbumInfo (@PathVariable Long albumId) { AlbumInfo albumInfo = albumInfoService.getAlbumInfo(albumId); return Result.ok(albumInfo); }
service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Override public AlbumInfo getAlbumInfo (Long albumId) { AlbumInfo albumInfo = albumInfoMapper.selectById(albumId); LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper <>(); wrapper.eq(AlbumAttributeValue::getAlbumId,albumId); List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(wrapper); albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList); return albumInfo; }
接口2:修改专辑接口 controller 1 2 3 4 5 6 7 8 9 10 @PutMapping("updateAlbumInfo/{albumId}") public Result updateAlbumInfo (@PathVariable Long albumId, @RequestBody @Validated AlbumInfoVo albumInfoVo) { albumInfoService.updateAlbumInfo(albumId,albumInfoVo); return Result.ok(); }
service 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Override public void updateAlbumInfo (Long albumId, AlbumInfoVo albumInfoVo) { AlbumInfo albumInfo = albumInfoMapper.selectById(albumId); BeanUtils.copyProperties(albumInfoVo,albumInfo); albumInfoMapper.updateById(albumInfo); LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper <>(); wrapper.eq(AlbumAttributeValue::getAlbumId,albumId); albumAttributeValueMapper.delete(wrapper); List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) { albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> { AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue (); BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue); albumAttributeValue.setAlbumId(albumId); albumAttributeValueMapper.insert(albumAttributeValue); }); } }