Ver Fonte

专辑 is ok

xiang há 2 semanas atrás
pai
commit
5a39ef18a9

+ 1 - 1
artist/artist.sql

@@ -14,7 +14,7 @@ CREATE TABLE `artist` (
                           `header_image` VARCHAR(255) COMMENT '艺人页头图(网页端顶部背景图)',
                           `gender` TINYINT COMMENT '性别:1-男,2-女,3-团体',
                           `birthday` DATE COMMENT '生日',
-                          `region` VARCHAR(50) COMMENT '艺人所属地区(如中国内地、韩国)',
+                          `region` TINYINT COMMENT '艺人所属地区(如中国内地、韩国)',
                           `genre` VARCHAR(100) COMMENT '流派风格(多个用逗号分隔,如流行,摇滚,电子)',
                           `company` VARCHAR(100) COMMENT '所属公司/厂牌(如华谊兄弟、SM娱乐)',
                           `introduction` TEXT COMMENT '艺人介绍(10-1000字,用于艺人详情页)',

+ 4 - 1
artist/pom.xml

@@ -74,7 +74,10 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-oauth2</artifactId>

+ 57 - 3
artist/src/main/java/com/artist/controller/ArtistController.java

@@ -3,6 +3,8 @@ package com.artist.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.artist.domain.dto.MusicianApplicationDTO;
+import com.artist.domain.dto.SingerInfoDTO;
+import com.artist.domain.dto.fetchSingerDto;
 import com.artist.domain.po.Artist;
 import com.artist.domain.po.ArtistAuditRecord;
 import com.artist.domain.po.WyUser;
@@ -11,6 +13,7 @@ import com.artist.service.IArtistService;
 import com.base.exception.WyMusicException;
 import com.base.utils.Result;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
@@ -18,6 +21,8 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.stereotype.Controller;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -36,6 +41,8 @@ public class ArtistController {
     private IArtistAuditRecordService iArtistAuditRecordService;
     @Autowired
     private IArtistService artistService;
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
     @PostMapping("/apply")
     @PreAuthorize("hasRole('ROLE_USER')")
     public Result apply(@RequestBody MusicianApplicationDTO musicianApplicationDTO) {
@@ -49,6 +56,7 @@ public class ArtistController {
     @GetMapping("/status")
     @PreAuthorize("hasRole('ROLE_USER')")
     public Result applyStatus(@RequestParam(required = false) Integer id) {
+        // 处理用户ID逻辑
         if (id == null) {
             Object principalObj = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
             if (principalObj instanceof String) {
@@ -57,10 +65,27 @@ public class ArtistController {
                 id = user.getId();
             }
         }
-        Artist i = iArtistApplyService.applyStatus(id);
-        return Result.success(i);
+
+        // 构建Redis key
+        String redisKey = "artist:status:user:" + id;
+
+        // 尝试从Redis获取数据
+        String cachedData = stringRedisTemplate.opsForValue().get(redisKey);
+        if (cachedData != null && !cachedData.isEmpty()) {
+            Artist artist = JSON.parseObject(cachedData, Artist.class);
+            return Result.success(artist);
+        }
+        // Redis中没有数据,从数据库查询
+        Artist artist = iArtistApplyService.applyStatus(id);
+
+        // 将数据存入Redis,设置较长过期时间(例如2小时)
+        String jsonString = JSON.toJSONString(artist);
+        stringRedisTemplate.opsForValue().set(redisKey, jsonString, 2, TimeUnit.HOURS);
+
+        return Result.success(artist);
     }
 
+
     @GetMapping("/allApply")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     public Result allApply() {
@@ -70,7 +95,12 @@ public class ArtistController {
     @GetMapping("/updateArtistStatus")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     public Result updateArtistStatus(@RequestParam Integer id, @RequestParam Integer status, @RequestParam(required = false, defaultValue = "") String reason) {
-        iArtistApplyService.updateArtistApply(id, status,reason);
+        iArtistApplyService.updateArtistApply(id, status, reason);
+
+        // 清除该用户的艺人状态缓存
+        String redisKey = "artist:status:user:" + id;
+        stringRedisTemplate.delete(redisKey);
+
         return Result.success("更新成功");
     }
     @GetMapping("/application-info")
@@ -78,4 +108,28 @@ public class ArtistController {
         MusicianApplicationDTO musicianApplicationInfo = artistService.getMusicianApplicationInfo(userId);
         return Result.success(musicianApplicationInfo);
     }
+    @PostMapping("querySinger")
+    @PreAuthorize("hasRole('ROLE_USER')")
+    public Result querySinger(@RequestBody fetchSingerDto dto) {
+        List<SingerInfoDTO> list = artistService.lambdaQuery()
+                .select(Artist::getId, Artist::getArtistName, Artist::getAvatar)
+                .eq(Artist::getGender, dto.getGender())
+                .eq(Artist::getRegion, dto.getRegion())
+                .list()
+                .stream()
+                .map(artist -> new SingerInfoDTO(artist.getId(), artist.getArtistName(), artist.getAvatar()))
+                .collect(Collectors.toList());
+        return Result.success(list);
+    }
+    @GetMapping("querySingerById")
+    @PreAuthorize("hasRole('ROLE_USER')")
+    public Result querySingerById(@RequestParam Integer id) {
+        String s = stringRedisTemplate.opsForValue().get("artist:querySingerById:" + id);
+        if (s != null) {
+            return Result.success(JSON.parseObject(s, Artist.class));
+        }
+        Artist artist = artistService.getById(id);
+        stringRedisTemplate.opsForValue().set("artist:querySingerById:" + id, JSON.toJSONString(artist), 24, TimeUnit.HOURS);
+        return Result.success(artist);
+    }
 }

+ 14 - 6
artist/src/main/java/com/artist/controller/ArtistRealAuthController.java

@@ -1,12 +1,11 @@
 package com.artist.controller;
-
-
 import com.artist.domain.po.ArtistExternalInfo;
 import com.artist.domain.po.ArtistRealAuth;
 import com.artist.service.IArtistExternalInfoService;
 import com.artist.service.IArtistRealAuthService;
 import com.base.utils.Result;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -16,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
-
 /**
  * <p>
  * 艺人实名认证信息表 前端控制器
@@ -32,7 +30,8 @@ public class ArtistRealAuthController {
     private IArtistRealAuthService artistRealAuthService;
     @Autowired
     private IArtistExternalInfoService artistExternalInfoService;
-
+    @Autowired
+    private StringRedisTemplate stringRedisTemplate;
     @GetMapping("/ArtistAuth")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     public Result<HashMap<String, Object>> ArtistAuth(@RequestParam Integer id){
@@ -45,10 +44,19 @@ public class ArtistRealAuthController {
     }
     @GetMapping("/ArtistAuthStatusUpdate")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
-    public Result ArtistAuthStatus(@RequestParam Integer id,@RequestParam Integer status){
-        artistRealAuthService.lambdaUpdate().eq(ArtistRealAuth::getId,id).set(ArtistRealAuth::getAuthStatus,status).update();
+    public Result ArtistAuthStatus(@RequestParam Integer id, @RequestParam Integer status) {
+        artistRealAuthService.lambdaUpdate()
+                .eq(ArtistRealAuth::getId, id)
+                .set(ArtistRealAuth::getAuthStatus, status)
+                .update();
+        ArtistRealAuth artistRealAuth = artistRealAuthService.getById(id);
+        if (artistRealAuth != null) {
+            String redisKey = "artist:status:user:" + artistRealAuth.getArtistId();
+            stringRedisTemplate.delete(redisKey);
+        }
         return Result.success("审核完毕");
     }
+
     @GetMapping("/ArtistAuthStatus")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     public Result ArtistAuthStatus(@RequestParam Integer id){

+ 3 - 135
artist/src/main/java/com/artist/domain/po/Artist.java

@@ -3,6 +3,7 @@ package com.artist.domain.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.time.LocalDate;
@@ -16,6 +17,7 @@ import java.time.LocalDateTime;
  * @author xiang
  * @since 2025-11-18
  */
+@Data
 @TableName("artist")
 public class Artist implements Serializable {
 
@@ -57,7 +59,7 @@ public class Artist implements Serializable {
     /**
      * 艺人所属地区
      */
-    private String region;
+    private Integer region;
 
     /**
      * 流派风格(多个用逗号分隔,如流行,摇滚)
@@ -99,138 +101,4 @@ public class Artist implements Serializable {
      */
     private LocalDateTime updateTime;
 
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-    public Integer getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Integer userId) {
-        this.userId = userId;
-    }
-    public String getArtistName() {
-        return artistName;
-    }
-
-    public void setArtistName(String artistName) {
-        this.artistName = artistName;
-    }
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-    public String getHeaderImage() {
-        return headerImage;
-    }
-
-    public void setHeaderImage(String headerImage) {
-        this.headerImage = headerImage;
-    }
-    public Integer getGender() {
-        return gender;
-    }
-
-    public void setGender(Integer gender) {
-        this.gender = gender;
-    }
-    public LocalDate getBirthday() {
-        return birthday;
-    }
-
-    public void setBirthday(LocalDate birthday) {
-        this.birthday = birthday;
-    }
-    public String getRegion() {
-        return region;
-    }
-
-    public void setRegion(String region) {
-        this.region = region;
-    }
-    public String getGenre() {
-        return genre;
-    }
-
-    public void setGenre(String genre) {
-        this.genre = genre;
-    }
-    public String getCompany() {
-        return company;
-    }
-
-    public void setCompany(String company) {
-        this.company = company;
-    }
-    public String getIntroduction() {
-        return introduction;
-    }
-
-    public void setIntroduction(String introduction) {
-        this.introduction = introduction;
-    }
-    public String getInvitationCode() {
-        return invitationCode;
-    }
-
-    public void setInvitationCode(String invitationCode) {
-        this.invitationCode = invitationCode;
-    }
-    public String getWechat() {
-        return wechat;
-    }
-
-    public void setWechat(String wechat) {
-        this.wechat = wechat;
-    }
-    public Integer getStatus() {
-        return status;
-    }
-
-    public void setStatus(Integer status) {
-        this.status = status;
-    }
-    public LocalDateTime getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(LocalDateTime createTime) {
-        this.createTime = createTime;
-    }
-    public LocalDateTime getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(LocalDateTime updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    @Override
-    public String toString() {
-        return "Artist{" +
-            "id=" + id +
-            ", userId=" + userId +
-            ", artistName=" + artistName +
-            ", avatar=" + avatar +
-            ", headerImage=" + headerImage +
-            ", gender=" + gender +
-            ", birthday=" + birthday +
-            ", region=" + region +
-            ", genre=" + genre +
-            ", company=" + company +
-            ", introduction=" + introduction +
-            ", invitationCode=" + invitationCode +
-            ", wechat=" + wechat +
-            ", status=" + status +
-            ", createTime=" + createTime +
-            ", updateTime=" + updateTime +
-        "}";
-    }
 }

+ 1 - 0
content/content.sql

@@ -35,6 +35,7 @@ CREATE TABLE `song` (
                         `song_name` VARCHAR(100) NOT NULL COMMENT '歌曲名称',
                         `artist_id` INT NOT NULL COMMENT '关联artist服务的artist.id',
                         `album_id` INT COMMENT '关联本服务的album.id(可为空,单曲不关联专辑)',
+                        `album_name` VARCHAR(100) NOT NULL COMMENT '专辑名称',
                         `duration` INT COMMENT '时长(秒,如300秒=5分钟)',
                         `file_url` VARCHAR(255) NOT NULL COMMENT '歌曲音频文件URL',
                         `cover_url` VARCHAR(255) COMMENT '歌曲封面URL(优先使用专辑封面,无专辑时用此封面)',

+ 4 - 1
content/pom.xml

@@ -74,7 +74,10 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-oauth2</artifactId>

+ 11 - 0
content/src/main/java/com/content/controller/AlbumController.java

@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.List;
 @RestController
 @RequestMapping("/album")
@@ -93,4 +94,14 @@ public class AlbumController {
                 .set(Album::getAuditReason, applyDto.getValue()).update();
         return Result.success("审核成功");
     }
+    @GetMapping("/selSongByALbumId")
+    @PreAuthorize("hasRole('ROLE_USER')")
+    public Result selSOngByALbumId(@RequestParam Integer id) {
+        Album one = albumService.lambdaQuery().eq(Album::getId, id).eq(Album::getDeleteFlag, 0).one();
+        List<Song> songs = iSongService.lambdaQuery().eq(Song::getAlbumId, id).eq(Song::getDeleteFlag, 0).list();
+        HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
+        objectObjectHashMap.put("playlist", one);
+        objectObjectHashMap.put("songs", songs);
+        return Result.success(objectObjectHashMap);
+    }
 }

+ 34 - 1
content/src/main/java/com/content/controller/PlaylistController.java

@@ -1,5 +1,6 @@
 package com.content.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.base.utils.Result;
 import com.content.config.SecurityUtil;
 import com.content.domain.po.Playlist;
@@ -7,30 +8,62 @@ import com.content.domain.po.WyUser;
 import com.content.service.IPlaylistService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+
 @Slf4j
 @RestController
 @RequestMapping("/playlist")
 public class PlaylistController {
     @Autowired
     private IPlaylistService playlistService;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
     @GetMapping("/list")
     @PreAuthorize("hasRole('ROLE_USER')")
     public Result list() {
         WyUser user = SecurityUtil.getUser();
-        List<Playlist> list = playlistService.lambdaQuery().eq(Playlist::getUserId, user.getId()).list();
+        Integer userId = user.getId();
+
+        // 构建Redis key
+        String redisKey = "playlist:user:" + userId;
+
+        // 尝试从Redis获取数据
+        String cachedData = (String) redisTemplate.opsForValue().get(redisKey);
+        if (cachedData != null) {
+            List<Playlist> list = JSON.parseArray(cachedData, Playlist.class);
+            return Result.success(list);
+        }
+
+        // Redis中没有数据,从数据库查询
+        List<Playlist> list = playlistService.lambdaQuery().eq(Playlist::getUserId, userId).list();
+
+        // 将数据存入Redis,设置过期时间(例如30分钟)
+        String jsonString = JSON.toJSONString(list);
+        redisTemplate.opsForValue().set(redisKey, jsonString, 30, TimeUnit.MINUTES);
+
         return Result.success(list);
     }
+
     @PostMapping("/add")
     @PreAuthorize("hasRole('ROLE_USER')")
     public Result add(@RequestBody Playlist playlist) {
         playlist.setUserId(SecurityUtil.getUser().getId());
         playlistService.save(playlist);
+
+        // 清除该用户的歌单缓存
+        String redisKey = "playlist:user:" + playlist.getUserId();
+        redisTemplate.delete(redisKey);
+
         return Result.success("添加成功");
     }
+
     @GetMapping("/payListDetail")
     @PreAuthorize("hasRole('ROLE_USER')")
     public Result payListDetail(@RequestParam Integer id) {

+ 7 - 0
content/src/main/java/com/content/controller/SongController.java

@@ -47,6 +47,13 @@ public class SongController {
         iSongService.lambdaUpdate().eq(Song::getId, id).set(Song::getDeleteFlag, 1).update();
         return Result.success("删除成功");
     }
+    //根据歌手获取单曲
+    @GetMapping("/songs")
+    @PreAuthorize("hasRole('ROLE_USER')")
+    public Result songs(@RequestParam Integer id) {
+        List<Song> list = iSongService.lambdaQuery().eq(Song::getArtistId, id).isNull(Song::getAlbumId).list();
+        return Result.success(list);
+    }
     @GetMapping("/list")
     @PreAuthorize("hasRole('ROLE_ADMIN')")
     public Result list(@RequestParam Integer status) {

+ 23 - 7
content/src/main/java/com/content/controller/SwipperController.java

@@ -1,15 +1,18 @@
 package com.content.controller;
+import com.alibaba.fastjson.JSON;
 import com.base.exception.WyMusicException;
 import com.base.utils.Result;
 import com.content.domain.po.Swipper;
 import com.content.service.ISwipperService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+
 /**
  * <p>
  *  前端控制器
@@ -24,15 +27,27 @@ import java.util.List;
 public class SwipperController {
     @Autowired
     private ISwipperService swipperService;
+    @Autowired
+    private RedisTemplate redisTemplate;
     @GetMapping("/swipper")
-    @PreAuthorize("hasRole('ROLE_USER')")
     public Result<List<Swipper>> findRecommend(){
-        List<Swipper> list = swipperService.list();
-        // 添加调试信息
-        System.out.println("List size: " + list.size());
-        for(Swipper swipper : list) {
-            System.out.println("Swipper object: " + swipper.toString());
+        // 先从Redis中获取
+        String redisKey = "swipper:list";
+        String cachedData = (String) redisTemplate.opsForValue().get(redisKey);
+
+        if (cachedData != null) {
+            // 如果Redis中有数据,直接返回
+            List<Swipper> cachedList = JSON.parseArray(cachedData, Swipper.class);
+            return Result.success(cachedList);
         }
+
+        // 如果Redis中没有数据,从数据库查询
+        List<Swipper> list = swipperService.list();
+
+        // 将数据存入Redis,设置过期时间(例如30分钟)
+        String jsonString = JSON.toJSONString(list);
+        redisTemplate.opsForValue().set(redisKey, jsonString, 24, TimeUnit.HOURS);
+
         return Result.success(list);
     }
 
@@ -41,6 +56,7 @@ public class SwipperController {
         WyMusicException.cast("账号或密码错误");
         return null;
     }
+
     @GetMapping("/test1")
     public String test1() {
         Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

+ 5 - 0
content/src/main/java/com/content/domain/dto/AddSongDTO.java

@@ -33,6 +33,11 @@ public class AddSongDTO {
      */
     private Integer albumId;
 
+    /**
+     * 专辑名称
+     */
+    private String albumName;
+
     /**
      * 时长(秒)
      */

+ 4 - 0
content/src/main/java/com/content/domain/po/Song.java

@@ -44,6 +44,10 @@ public class Song implements Serializable {
      * 关联本服务的album.id(可为空,单曲不关联专辑)
      */
     private Integer albumId;
+    /**
+     * 专辑名称
+     */
+    private String albumName;
 
     /**
      * 时长(秒,如300秒=5分钟)

+ 3 - 3
parent/pom.xml

@@ -41,7 +41,7 @@
         <mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version>
         <druid-spring-boot-starter.version>1.2.8</druid-spring-boot-starter.version>
         <mysql-connector-java.version>8.0.30</mysql-connector-java.version>
-
+        <spring-redis.version>1.2.18</spring-redis.version>
         <!-- 搜索引擎 -->
         <elasticsearch.version>7.12.1</elasticsearch.version>
 
@@ -116,7 +116,7 @@
             <dependency>
                 <groupId>com.alibaba</groupId>
                 <artifactId>druid-spring-boot-starter</artifactId>
-                <version>${druid-spring-boot-starter.version}</version>
+                <version>${spring-redis.version}</version>
             </dependency>
 
             <!-- MinIO 对象存储 -->
@@ -179,7 +179,7 @@
                 <configuration>
                     <source>${java.version}</source>
                     <target>${java.version}</target>
-<!--                    <mainClass>com.wy.music.ParentApplication</mainClass>-->
+                    <!--                    <mainClass>com.wy.music.ParentApplication</mainClass>-->
                     <skip>true</skip>
                 </configuration>
             </plugin>