diff --git a/luoo_music/src/main/java/com/luoo/music/dao/JournalSongDao.java b/luoo_music/src/main/java/com/luoo/music/dao/JournalSongDao.java index 62ce2bd..495104c 100644 --- a/luoo_music/src/main/java/com/luoo/music/dao/JournalSongDao.java +++ b/luoo_music/src/main/java/com/luoo/music/dao/JournalSongDao.java @@ -46,4 +46,6 @@ public interface JournalSongDao extends JpaRepository, JpaSp @Query(value = "select * from tb_journal_song where id in ?1 order by field(id,?1)", nativeQuery = true) public List orderByField(List idList); + + List findByJournalNoOrderBySongNo(String journalNo); } diff --git a/luoo_music/src/main/java/com/luoo/music/dao/SongInfoDao.java b/luoo_music/src/main/java/com/luoo/music/dao/SongInfoDao.java index d0d5ae1..7e79875 100644 --- a/luoo_music/src/main/java/com/luoo/music/dao/SongInfoDao.java +++ b/luoo_music/src/main/java/com/luoo/music/dao/SongInfoDao.java @@ -1,5 +1,6 @@ package com.luoo.music.dao; +import com.luoo.music.pojo.Journal; import com.luoo.music.pojo.SongInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; @@ -25,5 +26,13 @@ public interface SongInfoDao extends JpaRepository, JpaSpecific @Query("UPDATE SongInfo s SET s.lyric = :lyric WHERE s.id = :id") int updateSongLyric(@Param("id") String id, @Param("lyric") String lyric); + @Modifying + @Transactional + @Query("UPDATE SongInfo s SET s.lyric = :lyric,s.lyricUrl = :lyricUrl WHERE s.id = :id") + int updateSongLyricAndUrl(@Param("id") String id, @Param("lyric") String lyric,@Param("lyricUrl") String lyricUrl); + List findByIdIn(List ids); + + @Query(value = "select * from tb_song_info where id in ?1 order by field(id,?1)", nativeQuery = true) + List orderByField(List objectIds); } diff --git a/luoo_music/src/main/java/com/luoo/music/dto/mapper/SongMapper.java b/luoo_music/src/main/java/com/luoo/music/dto/mapper/SongMapper.java index 61a2c52..d93eb1d 100644 --- a/luoo_music/src/main/java/com/luoo/music/dto/mapper/SongMapper.java +++ b/luoo_music/src/main/java/com/luoo/music/dto/mapper/SongMapper.java @@ -16,9 +16,9 @@ public class SongMapper { songRespDTO.setArtist(song.getArtist()); songRespDTO.setId(song.getId()); songRespDTO.setTitle(song.getName()); - songRespDTO.setSrc(Constants.MUSIC_RESOURCE_PREFIX + song.getUrl()); - songRespDTO.setPic(Constants.MUSIC_RESOURCE_PREFIX + song.getUrl().replace(".mp3", ".jpg")); - songRespDTO.setLrc(Constants.MUSIC_RESOURCE_PREFIX + song.getUrl().replace(".mp3", ".lyric")); + songRespDTO.setSrc(Constants.RESOURCE_PREFIX + song.getUrl()); + songRespDTO.setPic(Constants.RESOURCE_PREFIX + song.getImage()); + songRespDTO.setLrc(Constants.RESOURCE_PREFIX + song.getLyricUrl()); songRespDTO.setSongNo(song.getSongNo()); songRespDTO.setHaveCollect(songCollectSet.contains(songRespDTO.getId())); return songRespDTO; diff --git a/luoo_music/src/main/java/com/luoo/music/pojo/JournalSong.java b/luoo_music/src/main/java/com/luoo/music/pojo/JournalSong.java index 2bf3522..82054c6 100644 --- a/luoo_music/src/main/java/com/luoo/music/pojo/JournalSong.java +++ b/luoo_music/src/main/java/com/luoo/music/pojo/JournalSong.java @@ -53,4 +53,8 @@ public class JournalSong implements Serializable{ * 歌曲ID */ private String songId; + /** + * 歌词路径 + */ + private String lyricUrl; } diff --git a/luoo_music/src/main/java/com/luoo/music/pojo/SongInfo.java b/luoo_music/src/main/java/com/luoo/music/pojo/SongInfo.java index a8b6770..f632428 100644 --- a/luoo_music/src/main/java/com/luoo/music/pojo/SongInfo.java +++ b/luoo_music/src/main/java/com/luoo/music/pojo/SongInfo.java @@ -88,4 +88,9 @@ public class SongInfo implements Serializable { * 歌词 */ private String lyric; + + /** + * 歌词路径 + */ + private String lyricUrl; } diff --git a/luoo_music/src/main/java/com/luoo/music/service/CMSJournalService.java b/luoo_music/src/main/java/com/luoo/music/service/CMSJournalService.java index d11d67c..cecdf5b 100644 --- a/luoo_music/src/main/java/com/luoo/music/service/CMSJournalService.java +++ b/luoo_music/src/main/java/com/luoo/music/service/CMSJournalService.java @@ -30,6 +30,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -38,449 +39,528 @@ import java.util.stream.Collectors; @Service public class CMSJournalService { - @Autowired - private S3Service s3Service; - @Autowired - private IdWorker idWorker; - @Autowired - private JournalTagDao journalTagDao; - @Autowired - private JournalDao journalDao; - @Autowired - private JournalSongDao journalSongDao; - @Autowired - private TagDao tagDao; - @Autowired - private SongInfoDao songDao; - @Autowired - private UserClient userClient; - @Autowired + @Autowired + private S3Service s3Service; + @Autowired + private IdWorker idWorker; + @Autowired + private JournalTagDao journalTagDao; + @Autowired + private JournalDao journalDao; + @Autowired + private JournalSongDao journalSongDao; + @Autowired + private TagDao tagDao; + @Autowired + private SongInfoDao songDao; + @Autowired + private UserClient userClient; + @Autowired private RedisTemplate redisTemplate; - - /** - * 分页 + 条件检索 - * @param param - * @param page - * @param size - * @return - */ - public Result> search(JournalQueryModel param, int page, int size) { - List result = new ArrayList<>(); + /** + * 分页 + 条件检索 + * + * @param param + * @param page + * @param size + * @return + */ + public Result> search(JournalQueryModel param, int page, int size) { + List result = new ArrayList<>(); // Sort sort = new Sort(Sort.Direction.DESC, "journalNo"); - PageRequest pageRequest = PageRequest.of(page - 1, size); - Page journalPage; - if (!Objects.isNull(param)) { - List journalIdsByTags = null; - if (!CollectionUtils.isEmpty(param.getTags())) { - journalIdsByTags = journalTagDao.findJournalIdsByTags(param.getTags()); - if (journalIdsByTags.size() == 0) { - return Result.success(new PageResult<>(0L, result)); - } - } - Specification journalSpecification = buildSearchSpecification(param, journalIdsByTags); - journalPage = journalDao.findAll(journalSpecification, pageRequest); - } else { - List journalIdsByTags = null; - Specification journalSpecification = buildSearchSpecification(param, journalIdsByTags); - journalPage = journalDao.findAll(journalSpecification,pageRequest); - } - long totalElements = journalPage.getTotalElements(); - List content = journalPage.getContent(); - if (!CollectionUtils.isEmpty(content)) { - List ids = content.stream().map(Journal::getId).collect(Collectors.toList()); - Map> journalTagMap = tagInfo(ids); - List journalNos = content.stream().map(Journal::getJournalNo).collect(Collectors.toList()); - Map songCountMap = songCountInfo(journalNos); - for (Journal item : content) { - JournalVO response = new JournalVO(); - response.setId(item.getId()); - response.setJournalNo(item.getJournalNo()); - response.setTitle(item.getTitle()); - response.setImage(Constants.MUSIC_RESOURCE_PREFIX + item.getImage()); - if (!Objects.isNull(item.getCreateTime())) { - response.setCreateTime(item.getCreateTime().format(Constants.formatter)); - } - response.setState(item.getState()); - response.setIsPublish(item.getIsPublish()); - if (!Objects.isNull(item.getPubTime())) { - response.setPubTime(item.getPubTime().format(Constants.formatter)); - } - response.setUserId(item.getUserId()); - response.setUserName(item.getUserName()); - response.setSongCount(songCountMap.get(item.getJournalNo())); - response.setTag(journalTagMap.get(item.getId())); - response.setVisits(item.getVisits()); - response.setComment(item.getComment()); - result.add(response); - } - } - return Result.success(new PageResult<>(totalElements, result)); - } + PageRequest pageRequest = PageRequest.of(page - 1, size); + Page journalPage; + if (!Objects.isNull(param)) { + List journalIdsByTags = null; + if (!CollectionUtils.isEmpty(param.getTags())) { + journalIdsByTags = journalTagDao.findJournalIdsByTags(param.getTags()); + if (journalIdsByTags.size() == 0) { + return Result.success(new PageResult<>(0L, result)); + } + } + Specification journalSpecification = buildSearchSpecification(param, journalIdsByTags); + journalPage = journalDao.findAll(journalSpecification, pageRequest); + } else { + List journalIdsByTags = null; + Specification journalSpecification = buildSearchSpecification(param, journalIdsByTags); + journalPage = journalDao.findAll(journalSpecification, pageRequest); + } + long totalElements = journalPage.getTotalElements(); + List content = journalPage.getContent(); + if (!CollectionUtils.isEmpty(content)) { + List ids = content.stream().map(Journal::getId).collect(Collectors.toList()); + Map> journalTagMap = tagInfo(ids); + List journalNos = content.stream().map(Journal::getJournalNo).collect(Collectors.toList()); + Map songCountMap = songCountInfo(journalNos); + for (Journal item : content) { + JournalVO response = new JournalVO(); + response.setId(item.getId()); + response.setJournalNo(item.getJournalNo()); + response.setTitle(item.getTitle()); + response.setImage(Constants.MUSIC_RESOURCE_PREFIX + item.getImage()); + if (!Objects.isNull(item.getCreateTime())) { + response.setCreateTime(item.getCreateTime().format(Constants.formatter)); + } + response.setState(item.getState()); + response.setIsPublish(item.getIsPublish()); + if (!Objects.isNull(item.getPubTime())) { + response.setPubTime(item.getPubTime().format(Constants.formatter)); + } + response.setUserId(item.getUserId()); + response.setUserName(item.getUserName()); + response.setSongCount(songCountMap.get(item.getJournalNo())); + response.setTag(journalTagMap.get(item.getId())); + response.setVisits(item.getVisits()); + response.setComment(item.getComment()); + result.add(response); + } + } + return Result.success(new PageResult<>(totalElements, result)); + } + + /** + * 检索条件 + * + * @param param + * @return + */ + private Specification buildSearchSpecification(JournalQueryModel param, List ids) { + return (Root root, CriteriaQuery query, CriteriaBuilder builder) -> { + List predicateList = new ArrayList(); + if ("1".equals(param.getTab())) { + predicateList.add(builder.equal(root.get("isPublish"), "1")); + } else if ("2".equals(param.getTab())) { + predicateList.add(builder.equal(root.get("state"), "0")); + } else { + Predicate state = builder.equal(root.get("state"), "1"); + Predicate isPublish = builder.equal(root.get("isPublish"), "0"); + predicateList.add(builder.and(state, isPublish)); + } + if (StringUtils.isNotBlank(param.getUserId())) { + predicateList.add(builder.equal(root.get("userId"), param.getUserId())); + } + if (StringUtils.isNotBlank(param.getStart()) && StringUtils.isNotBlank(param.getEnd())) { + LocalDateTime start = LocalDateTime.parse(param.getStart() + "T00:00:00"); + LocalDateTime end = LocalDateTime.parse(param.getEnd() + "T00:00:00"); + predicateList.add(builder.between(root.get("createTime"), start, end)); + } + if (!CollectionUtils.isEmpty(ids)) { + predicateList.add(root.get("journalNo").in(ids)); + } + if (StringUtils.isNotBlank(param.getKeyword())) { + String likeExpression = "%" + param.getKeyword() + "%"; + Predicate journalNo = builder.like(root.get("journalNo"), likeExpression); + Predicate title = builder.like(root.get("title"), likeExpression); + predicateList.add(builder.or(journalNo, title)); + } + query.orderBy(builder.desc(root.get("journalNo").as(Integer.class))); + return builder.and(predicateList.toArray(new Predicate[predicateList.size()])); + }; + } - /** - * 检索条件 - * @param param - * @return - */ - private Specification buildSearchSpecification(JournalQueryModel param, List ids) { - return (Root root, CriteriaQuery query, CriteriaBuilder builder) -> { - List predicateList = new ArrayList(); - if("1".equals(param.getTab())) { - predicateList.add(builder.equal(root.get("isPublish"), "1")); - } else if ("2".equals(param.getTab())) { - predicateList.add(builder.equal(root.get("state"), "0")); - } else { - Predicate state = builder.equal(root.get("state"), "1"); - Predicate isPublish = builder.equal(root.get("isPublish"), "0"); - predicateList.add(builder.and(state, isPublish)); - } - if(StringUtils.isNotBlank(param.getUserId())) { - predicateList.add(builder.equal(root.get("userId"), param.getUserId())); - } - if (StringUtils.isNotBlank(param.getStart()) && StringUtils.isNotBlank(param.getEnd())) { - LocalDateTime start = LocalDateTime.parse(param.getStart() + "T00:00:00"); - LocalDateTime end = LocalDateTime.parse(param.getEnd() + "T00:00:00"); - predicateList.add(builder.between(root.get("createTime"), start, end)); - } - if (!CollectionUtils.isEmpty(ids)) { - predicateList.add(root.get("journalNo").in(ids)); - } - if(StringUtils.isNotBlank(param.getKeyword())) { - String likeExpression = "%" + param.getKeyword() + "%"; - Predicate journalNo = builder.like(root.get("journalNo"), likeExpression); - Predicate title = builder.like(root.get("title"), likeExpression); - predicateList.add(builder.or(journalNo, title)); - } - query.orderBy(builder.desc(root.get("journalNo").as(Integer.class))); - return builder.and(predicateList.toArray(new Predicate[predicateList.size()])); - }; - } + /** + * 期刊的音乐数量 + * + * @param journalNos + * @return + */ + private Map songCountInfo(List journalNos) { + Map songCountMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(journalNos)) { + List> journalSongCountList = journalSongDao.findSongCountByJournalNos(journalNos); + songCountMap = journalSongCountList.stream() + .collect(Collectors.toMap(map -> String.valueOf(map.get("journalNo")), + map -> Long.valueOf(String.valueOf(map.get("songCount"))))); + } + return songCountMap; + } - /** - * 期刊的音乐数量 - * @param journalNos - * @return - */ - private Map songCountInfo(List journalNos) { - Map songCountMap = new HashMap<>(); - if (!CollectionUtils.isEmpty(journalNos)) { - List> journalSongCountList = journalSongDao.findSongCountByJournalNos(journalNos); - songCountMap = journalSongCountList.stream() - .collect(Collectors.toMap( - map -> String.valueOf(map.get("journalNo")), - map -> Long.valueOf(String.valueOf(map.get("songCount"))))); - } - return songCountMap; - } + /** + * 期刊的标签信息 + * + * @param ids + * @return + */ + private Map> tagInfo(List ids) { + Map> journalTagMap = new HashMap<>(); + List journalTagList = journalTagDao.findByJournalIds(ids); + Set tagIdSet = journalTagList.stream().map(JournalTag::getTagId).collect(Collectors.toSet()); + List tagList = tagDao.findByIdIn(tagIdSet); + Map idTagMap = tagList.stream().collect(Collectors.toMap(Tag::getId, obj -> obj)); + List list; + for (JournalTag item : journalTagList) { + String journalId = item.getJournalId(); + if (journalTagMap.containsKey(journalId)) { + list = journalTagMap.get(journalId); + } else { + list = new ArrayList<>(); + } + if (idTagMap.containsKey(item.getTagId())) { + Tag tag = idTagMap.get(item.getTagId()); + list.add(tag.getId()); + } + journalTagMap.put(journalId, list); + } + return journalTagMap; + } - /** - * 期刊的标签信息 - * @param ids - * @return - */ - private Map> tagInfo(List ids) { - Map> journalTagMap = new HashMap<>(); - List journalTagList = journalTagDao.findByJournalIds(ids); - Set tagIdSet = journalTagList.stream().map(JournalTag::getTagId).collect(Collectors.toSet()); - List tagList = tagDao.findByIdIn(tagIdSet); - Map idTagMap = tagList.stream().collect(Collectors.toMap(Tag::getId, obj -> obj)); - List list; - for (JournalTag item : journalTagList) { - String journalId = item.getJournalId(); - if (journalTagMap.containsKey(journalId)) { - list = journalTagMap.get(journalId); - } else { - list = new ArrayList<>(); - } - if (idTagMap.containsKey(item.getTagId())) { - Tag tag = idTagMap.get(item.getTagId()); - list.add(tag.getId()); - } - journalTagMap.put(journalId, list); - } - return journalTagMap; - } + /** + * 新增期刊 + * + * @param param + * @return + */ + public Result add(String token, JournalAddModel param) { + List byJournalNo = journalDao.findByJournalNo(param.getJournalNo()); + if (byJournalNo.size() > 0) { + return Result.failed("保存失败,期刊编号已存在"); + } + String srcKey = param.getImage().substring(param.getImage().indexOf(Constants.TEMP_KEY_PREFIX)); + String image = moveJournalImage(srcKey, param); + if (StringUtils.isNotBlank(image)) { + Journal journal = buildJournal(null, param, token); + String id = String.valueOf(idWorker.nextId()); + journal.setId(id); + journal.setImage(image); + journalDao.save(journal); + batchSaveJournalRelatesInfo(id, param); + return Result.success(); + } else { + return Result.failed("保存失败"); + } + } - /** - * 新增期刊 - * @param param - * @return - */ - public Result add(String token, JournalAddModel param) { - List byJournalNo = journalDao.findByJournalNo(param.getJournalNo()); - if (byJournalNo.size() > 0) { - return Result.failed("保存失败,期刊编号已存在"); - } - String srcKey = param.getImage().substring(param.getImage().indexOf(Constants.TEMP_KEY_PREFIX)); - String image = moveJournalImage(srcKey, param); - if (StringUtils.isNotBlank(image)) { - Journal journal = buildJournal(null, param, token); - String id = String.valueOf(idWorker.nextId()); - journal.setId(id); - journal.setImage(image); - journalDao.save(journal); - batchSaveJournalRelatesInfo(id, param); - return Result.success(); - } else { - return Result.failed("保存失败"); - } - } + /** + * 移动对象 + * + * @param param + * @return + */ + private String moveJournalImage(String srcKey, JournalAddModel param) { + String image = param.getImage(); + String suffix = image.substring(image.lastIndexOf(Constants.DOT)); + String destKeySuffix = String.format("%05d/00%s", Integer.parseInt(param.getJournalNo()), suffix); + String destKey = Constants.MUSIC_KEY_PREFIX + destKeySuffix; + int copy = s3Service.copy(Constants.BUCKET, srcKey, destKey); + if (copy > 0) { + return destKeySuffix; + } + return null; + } - /** - * 移动对象 - * @param param - * @return - */ - private String moveJournalImage(String srcKey, JournalAddModel param) { - String image = param.getImage(); - String suffix = image.substring(image.lastIndexOf(Constants.DOT)); - String destKeySuffix = String.format("%05d/00%s", Integer.parseInt(param.getJournalNo()), suffix); - String destKey = Constants.MUSIC_KEY_PREFIX + destKeySuffix; - int copy = s3Service.copy(Constants.BUCKET, srcKey, destKey); - if (copy > 0) { - return destKeySuffix; - } - return null; - } + /** + * 构建对象 + * + * @param id + * @param param + * @param token + * @return + */ + private Journal buildJournal(String id, JournalAddModel param, String token) { + Journal journal = new Journal(); + if (!StringUtils.isBlank(id)) { + journal.setId(id); + } + journal.setJournalNo(param.getJournalNo()); + journal.setTitle(param.getTitle()); + journal.setContent(param.getContent()); + UserInfo userInfo = userClient.queryUserInfoById(param.getUserId()); + if (!Objects.isNull(userInfo)) { + journal.setUserId(userInfo.getId()); + journal.setUserName(userInfo.getName()); + journal.setUserType(userInfo.getType()); + } + return journal; + } - /** - * 构建对象 - * @param id - * @param param - * @param token - * @return - */ - private Journal buildJournal(String id, JournalAddModel param, String token) { - Journal journal = new Journal(); - if (!StringUtils.isBlank(id)) { - journal.setId(id); - } - journal.setJournalNo(param.getJournalNo()); - journal.setTitle(param.getTitle()); - journal.setContent(param.getContent()); - UserInfo userInfo = userClient.queryUserInfoById(param.getUserId()); - if (!Objects.isNull(userInfo)) { - journal.setUserId(userInfo.getId()); - journal.setUserName(userInfo.getName()); - journal.setUserType(userInfo.getType()); - } - return journal; - } + /** + * 保存期刊的标签、音乐信息 + * + * @param journalId + * @param param + */ + private void batchSaveJournalRelatesInfo(String journalId, JournalAddModel param) { + // 标签信息 + if (!CollectionUtils.isEmpty(param.getTag())) { + List journalTagList = new ArrayList<>(); + for (String item : param.getTag()) { + JournalTag journalTag = new JournalTag(); + journalTag.setId(String.valueOf(idWorker.nextId())); + journalTag.setJournalId(journalId); + journalTag.setTagId(item); + journalTagList.add(journalTag); + } + journalTagDao.saveAll(journalTagList); + } + // 歌曲信息 + if (!CollectionUtils.isEmpty(param.getSongs())) { + List songList = songDao.findByIdIn(param.getSongs()); + Map idSongMap = songList.stream().collect(Collectors.toMap(SongInfo::getId, obj -> obj)); + List journalSongList = new ArrayList<>(); + int num = 0; + for (String item : param.getSongs()) { + if (idSongMap.containsKey(item)) { + num += 1; + SongInfo song = idSongMap.get(item); + JournalSong journalSong = new JournalSong(); + journalSong.setId(String.valueOf(idWorker.nextId())); + journalSong.setName(song.getName()); + journalSong.setAlbum(song.getAlbum()); + journalSong.setArtist(song.getArtist()); + journalSong.setUrl(song.getUrl()); + journalSong.setImage(song.getImage()); + journalSong.setSongId(item); + journalSong.setJournalNo(param.getJournalNo()); + journalSong.setSongNo(num); + journalSong.setSongId(song.getId()); + journalSongList.add(journalSong); + } + } + s3Service.fromSongToMusic(journalSongList); + journalSongDao.saveAll(journalSongList); + } + } - /** - * 保存期刊的标签、音乐信息 - * @param journalId - * @param param - */ - private void batchSaveJournalRelatesInfo(String journalId, JournalAddModel param) { - // 标签信息 - if (!CollectionUtils.isEmpty(param.getTag())) { - List journalTagList = new ArrayList<>(); - for (String item : param.getTag()) { - JournalTag journalTag = new JournalTag(); - journalTag.setId(String.valueOf(idWorker.nextId())); - journalTag.setJournalId(journalId); - journalTag.setTagId(item); - journalTagList.add(journalTag); - } - journalTagDao.saveAll(journalTagList); - } - // 歌曲信息 - if (!CollectionUtils.isEmpty(param.getSongs())) { - List songList = songDao.findByIdIn(param.getSongs()); - Map idSongMap = songList.stream().collect(Collectors.toMap(SongInfo::getId, obj -> obj)); - List journalSongList = new ArrayList<>(); - int num = 0; - for (String item : param.getSongs()) { - if (idSongMap.containsKey(item)) { - num += 1; - SongInfo song = idSongMap.get(item); - JournalSong journalSong = new JournalSong(); - journalSong.setId(String.valueOf(idWorker.nextId())); - journalSong.setName(song.getName()); - journalSong.setAlbum(song.getAlbum()); - journalSong.setArtist(song.getArtist()); - journalSong.setUrl(song.getUrl()); - journalSong.setImage(song.getImage()); - journalSong.setSongId(item); - journalSong.setJournalNo(param.getJournalNo()); - journalSong.setSongNo(num); - journalSong.setSongId(song.getId()); - journalSongList.add(journalSong); - } - } - s3Service.fromSongToMusic(journalSongList); - journalSongDao.saveAll(journalSongList); - } - } + /** + * 查询期刊详情 + * + * @param id + * @return + */ + public Result findOne(String id) { + Optional optional=journalDao.findById(id); + if(!optional.isPresent()) { + return Result.failed("无法找到期刊: "+id); + } + Journal journal = optional.get(); + JournalVO response = new JournalVO(); + response.setId(journal.getId()); + response.setJournalNo(journal.getJournalNo()); + response.setTitle(journal.getTitle()); + response.setTag(journalTagDao.findTagsByJournalId(id)); + response.setUserId(journal.getUserId()); + if (StringUtils.isNotBlank(journal.getImage())) { + response.setImage(Constants.MUSIC_RESOURCE_PREFIX + journal.getImage()); + } + response.setSongs(journalSongInfo(journal.getJournalNo())); + response.setContent(journal.getContent()); + return Result.success(response); + } - /** - * 查询期刊详情 - * @param id - * @return - */ - public Result findOne(String id) { - Journal journal = journalDao.findById(id).get(); - JournalVO response = new JournalVO(); - response.setId(journal.getId()); - response.setJournalNo(journal.getJournalNo()); - response.setTitle(journal.getTitle()); - response.setTag(journalTagDao.findTagsByJournalId(id)); - response.setUserId(journal.getUserId()); - if (StringUtils.isNotBlank(journal.getImage())) { - response.setImage(Constants.MUSIC_RESOURCE_PREFIX + journal.getImage()); - } - response.setSongs(journalSongInfo(journal.getJournalNo())); - response.setContent(journal.getContent()); - return Result.success(response); - } + /** + * 期刊的音乐信息 + * + * @param journalNo + * @return + */ + private List journalSongInfo(String journalNo) { + List list = new ArrayList<>(); + List journalSongList = journalSongDao.findByJournalNo(journalNo); + if (!CollectionUtils.isEmpty(journalSongList)) { + for (JournalSong item : journalSongList) { + SongVO songVO = new SongVO(); + songVO.setId(item.getSongId()); + songVO.setName(item.getName()); + songVO.setArtist(item.getArtist()); + songVO.setAlbum(item.getAlbum()); + if (StringUtils.isNotBlank(item.getUrl())) { + songVO.setUrl(Constants.RESOURCE_PREFIX + item.getUrl()); + } + if (StringUtils.isNotBlank(item.getImage())) { + songVO.setImage(Constants.RESOURCE_PREFIX + item.getImage()); + } + list.add(songVO); + } + } + return list; + } - /** - * 期刊的音乐信息 - * @param journalNo - * @return - */ - private List journalSongInfo(String journalNo) { - List list = new ArrayList<>(); - List journalSongList = journalSongDao.findByJournalNo(journalNo); - if (!CollectionUtils.isEmpty(journalSongList)) { - for (JournalSong item : journalSongList) { - SongVO songVO = new SongVO(); - songVO.setId(item.getSongId()); - songVO.setName(item.getName()); - songVO.setArtist(item.getArtist()); - songVO.setAlbum(item.getAlbum()); - if (StringUtils.isNotBlank(item.getUrl())) { - songVO.setUrl(Constants.MUSIC_RESOURCE_PREFIX + item.getUrl()); - } - if (StringUtils.isNotBlank(item.getImage())) { - songVO.setImage(Constants.MUSIC_RESOURCE_PREFIX + item.getImage()); - } - list.add(songVO); - } - } - return list; - } + /** + * 更新期刊 + * + * @param id + * @param token + * @param param + * @return + */ + public Result update(String id, String token, JournalAddModel param) { + Optional optional = journalDao.findById(id); + if (!optional.isPresent()) { + return Result.failed("找不到期刊: " + id); + } + Journal journal = optional.get(); + updateJournal(journal, param, token); + journalDao.save(journal); + redisTemplate.opsForValue().set("journal_" + id, journal); - /** - * 更新期刊 - * @param id - * @param token - * @param param - * @return - */ - public Result update(String id, String token, JournalAddModel param) { - Optional optional = journalDao.findById(id); - if(!optional.isPresent()) { - return Result.failed("找不到期刊: "+id); - } - Journal journal=optional.get(); - updateJournal(journal, param, token); - journalDao.save(journal); - redisTemplate.opsForValue().set("journal_"+id,journal); - if (!CollectionUtils.isEmpty(param.getTag())) { - journalTagDao.deleteByJournalId(id); - } - if (!CollectionUtils.isEmpty(param.getSongs())) { - journalSongDao.deleteByJournalNo(id); - } - batchSaveJournalRelatesInfo(id, param); - return Result.success(); - } - private void updateJournal(Journal journal, JournalAddModel param, String token) { - String title=param.getTitle(); - if(!StringTools.isEmpty(title)) { - journal.setTitle(title); - } - - String content=param.getContent(); - if(!StringTools.isEmpty(content)) { - journal.setContent(content); - } - - String userId=param.getUserId(); - if(!StringTools.isEmpty(userId)) { - UserInfo userInfo = userClient.queryUserInfoById(userId); - if (!Objects.isNull(userInfo)) { - journal.setUserId(userInfo.getId()); - journal.setUserName(userInfo.getName()); - journal.setUserType(userInfo.getType()); - } - } - - String tempImage=param.getImage(); - if(!StringTools.isEmpty(tempImage)&&tempImage.contains(Constants.TEMP_KEY_PREFIX)) { - String srcKey=param.getImage().substring(param.getImage().indexOf(Constants.TEMP_KEY_PREFIX)); - String image = copyJournalImage(srcKey, journal.getJournalNo()); - if (null!=image) { - journal.setImage(image); - } - } + batchUpdateJournalRelatesInfo(id, journal.getJournalNo(), param); + return Result.success(); } - private String copyJournalImage(String srcKey, String journalNo) { - String destKeySuffix = String.format("%05d/%s", Integer.parseInt(journalNo), srcKey.replace(Constants.TEMP_KEY_PREFIX, "")); - String destKey = Constants.MUSIC_KEY_PREFIX + destKeySuffix; - int copy = s3Service.copy(Constants.BUCKET, srcKey, destKey); - if (copy > 0) { - return destKeySuffix; - } - return null; - } - /** - * 删除期刊的标签、音乐信息 - * @param journalId - * @param journalNo - */ - private void batchDeleteJournalRelatesInfo(String journalId, String journalNo) { - journalTagDao.deleteByJournalId(journalId); - journalSongDao.deleteByJournalNo(journalNo); - } + private void batchUpdateJournalRelatesInfo(String journalId, String journalNo, JournalAddModel param) { + // 标签信息 + List updateTags = param.getTag(); + List currentTags = journalTagDao.findTagsByJournalId(journalId); + if (!CollectionUtils.isEmpty(updateTags) && !isCollectionEqual(currentTags, updateTags)) { + // 清理当前journalTag + journalTagDao.deleteByJournalId(journalId); + List updatedJournalTags = updateTags.stream().map(t -> createJournalTag(t, journalId)) + .collect(Collectors.toList()); + journalTagDao.saveAll(updatedJournalTags); + } - /** - * 发布期刊 - * @param id - * @param queryModel - * @return - */ - public Result publish(String id, JournalPublishReq queryModel) { - String scheduled = queryModel.getIsScheduled(); - String pubTimeStr = queryModel.getPubTime(); - LocalDateTime pubTime = LocalDateTime.now(); - if ("1".equals(scheduled)) { - if (StringUtils.isNotBlank(pubTimeStr)){ - pubTime = LocalDateTime.parse(pubTimeStr, Constants.formatter); - journalDao.updateScheduledPubById(id, pubTime); - } - } else { - journalDao.updatePubById(id, pubTime); - } - return Result.success(); - } + // 歌曲信息 + List updateSongs = param.getSongs(); + if (!CollectionUtils.isEmpty(updateSongs)) { + // 清理当前journalSong + journalSongDao.deleteByJournalNo(journalId); + List songList = songDao.orderByField(updateSongs); + List updatedJournalSong = new ArrayList<>(); + for (int i = 1; i < songList.size(); i++) { + SongInfo song = songList.get(i); + JournalSong journalSong = new JournalSong(); + journalSong.setId(String.valueOf(idWorker.nextId())); + journalSong.setName(song.getName()); + journalSong.setAlbum(song.getAlbum()); + journalSong.setArtist(song.getArtist()); + journalSong.setUrl(Constants.SONG_KEY_PREFIX+song.getUrl()); + journalSong.setImage(Constants.SONG_KEY_PREFIX+song.getImage()); + journalSong.setLyricUrl(Constants.SONG_KEY_PREFIX+song.getLyricUrl()); + journalSong.setSongId(song.getId()); + journalSong.setJournalNo(journalNo); + journalSong.setSongNo(i); - /** - * 更新期刊启停状态 - * @param id - * @param state - * @return - */ - public Result updateJournalState(String id, String state) { - journalDao.updateJournalState(id, state); - return Result.success(); - } + updatedJournalSong.add(journalSong); + } + journalSongDao.saveAll(updatedJournalSong); + } + } + + private JournalTag createJournalTag(String tagId, String journalId) { + JournalTag journalTag = new JournalTag(); + journalTag.setId(String.valueOf(idWorker.nextId())); + journalTag.setJournalId(journalId); + journalTag.setTagId(tagId); + return journalTag; + } - /** - * 删除期刊 - * @param id - * @return - */ - public Result deleteById(String id) { - Journal journal = journalDao.findById(id).get(); - if (!Objects.isNull(journal)) { - journalDao.deleteById(id); - batchDeleteJournalRelatesInfo(id, journal.getJournalNo()); - } - return Result.success(); - } + private boolean isCollectionEqual(List current, List update) { + if ((null == current && null == update) || (current.isEmpty() && update.isEmpty())) { + return true; + } + if (current.size() != update.size()) { + return false; + } + Collections.sort(current); + Collections.sort(update); + for (int i = 0; i < current.size(); i++) { + if (!current.get(i).equals(update.get(i))) { + return false; + } + } + return true; + } + + private void updateJournal(Journal journal, JournalAddModel param, String token) { + String title = param.getTitle(); + if (!StringTools.isEmpty(title)) { + journal.setTitle(title); + } + + String content = param.getContent(); + if (!StringTools.isEmpty(content)) { + journal.setContent(content); + } + + String userId = param.getUserId(); + if (!StringTools.isEmpty(userId)) { + UserInfo userInfo = userClient.queryUserInfoById(userId); + if (!Objects.isNull(userInfo)) { + journal.setUserId(userInfo.getId()); + journal.setUserName(userInfo.getName()); + journal.setUserType(userInfo.getType()); + } + } + + String tempImage = param.getImage(); + if (!StringTools.isEmpty(tempImage) && tempImage.contains(Constants.TEMP_KEY_PREFIX)) { + String srcKey = param.getImage().substring(param.getImage().indexOf(Constants.TEMP_KEY_PREFIX)); + String image = copyJournalImage(srcKey, journal.getJournalNo()); + if (null != image) { + journal.setImage(image); + } + } + } + + private String copyJournalImage(String srcKey, String journalNo) { + String destKeySuffix = String.format("%05d/%s", Integer.parseInt(journalNo), + srcKey.replace(Constants.TEMP_KEY_PREFIX, "")); + String destKey = Constants.MUSIC_KEY_PREFIX + destKeySuffix; + int copy = s3Service.copy(Constants.BUCKET, srcKey, destKey); + if (copy > 0) { + return destKeySuffix; + } + return null; + } + + /** + * 删除期刊的标签、音乐信息 + * + * @param journalId + * @param journalNo + */ + private void batchDeleteJournalRelatesInfo(String journalId, String journalNo) { + journalTagDao.deleteByJournalId(journalId); + journalSongDao.deleteByJournalNo(journalNo); + } + + /** + * 发布期刊 + * + * @param id + * @param queryModel + * @return + */ + public Result publish(String id, JournalPublishReq queryModel) { + String scheduled = queryModel.getIsScheduled(); + String pubTimeStr = queryModel.getPubTime(); + LocalDateTime pubTime = LocalDateTime.now(); + if ("1".equals(scheduled)) { + if (StringUtils.isNotBlank(pubTimeStr)) { + pubTime = LocalDateTime.parse(pubTimeStr, Constants.formatter); + journalDao.updateScheduledPubById(id, pubTime); + } + } else { + journalDao.updatePubById(id, pubTime); + } + return Result.success(); + } + + /** + * 更新期刊启停状态 + * + * @param id + * @param state + * @return + */ + public Result updateJournalState(String id, String state) { + journalDao.updateJournalState(id, state); + return Result.success(); + } + + /** + * 删除期刊 + * + * @param id + * @return + */ + public Result deleteById(String id) { + Journal journal = journalDao.findById(id).get(); + if (!Objects.isNull(journal)) { + journalDao.deleteById(id); + batchDeleteJournalRelatesInfo(id, journal.getJournalNo()); + } + return Result.success(); + } } diff --git a/luoo_music/src/main/java/com/luoo/music/service/CMSSongService.java b/luoo_music/src/main/java/com/luoo/music/service/CMSSongService.java index e5e12da..cc71f88 100644 --- a/luoo_music/src/main/java/com/luoo/music/service/CMSSongService.java +++ b/luoo_music/src/main/java/com/luoo/music/service/CMSSongService.java @@ -397,9 +397,9 @@ public class CMSSongService { result.setLyric(song.getLyric()); } else { if (StringUtils.isNotBlank(song.getUrl())) { - String url = song.getUrl(); - String lyricSuffix = url.substring(0, url.lastIndexOf(Constants.DOT)) + ".lyric"; - String lyricUrl = Constants.RESOURCE_PREFIX + Constants.SONG_KEY_PREFIX + lyricSuffix; + //String url = song.getUrl(); + //String lyricSuffix = url.substring(0, url.lastIndexOf(Constants.DOT)) + ".lyric"; + String lyricUrl = Constants.RESOURCE_PREFIX + Constants.SONG_KEY_PREFIX + song.getLyricUrl(); String lyric = readLyric(lyricUrl); result.setLyric(lyric); } @@ -414,17 +414,11 @@ public class CMSSongService { * @return */ public Result updateSongLyric(String id, String lyric) { - songDao.updateSongLyric(id, lyric); if (StringUtils.isNotBlank(lyric)) { - String key = Constants.SONG_KEY_PREFIX + id + "/00.lyric"; + String lyricUrl=id + "/"+idWorker.nextId()+".lyric"; + String key = Constants.SONG_KEY_PREFIX + lyricUrl; + songDao.updateSongLyricAndUrl(id, lyric, lyricUrl); s3Service.uploadText(Constants.BUCKET, key, lyric); - List bySongId = journalSongDao.findBySongId(id); - for (JournalSong item : bySongId) { - String format = String.format("%05d/%02d", Integer.parseInt(item.getJournalNo()), item.getSongNo()); - String destLyricSuffix = format + ".lyric"; - String destLyric = Constants.MUSIC_KEY_PREFIX + destLyricSuffix; - s3Service.copy(Constants.BUCKET, key, destLyric); - } } return Result.success(); }