Browse Source

add:老师端曲目添加,列表;学生端曲目列表,专辑列表,详情

liujunchi 3 years ago
parent
commit
76c1d14a14
30 changed files with 928 additions and 87 deletions
  1. 10 4
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
  2. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java
  3. 30 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  4. 0 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetDto.java
  5. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java
  6. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java
  7. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java
  8. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicAlbumSearch.java
  9. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java
  10. 5 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java
  11. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AudioTypeEnum.java
  12. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AlbumFavoriteService.java
  13. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java
  14. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicFavoriteService.java
  15. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  16. 42 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  17. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AlbumFavoriteServiceImpl.java
  18. 40 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java
  19. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicFavoriteServiceImpl.java
  20. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  21. 74 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  22. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java
  23. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java
  24. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  25. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java
  26. 35 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml
  27. 133 26
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  28. 107 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java
  29. 134 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java
  30. 10 4
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

+ 10 - 4
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java

@@ -3,17 +3,19 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
-import com.yonge.cooleshow.biz.dal.vo.MusicTagVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
@@ -52,8 +54,12 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入musicTag")
-    public HttpResponseResult<MusicSheetVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
-        return succeed(musicSheetService.detail(id));
+    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(musicSheetService.detail(id, sysUser, SysUserType.SYSTEM));
     }
 
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -74,7 +80,7 @@ public class MusicSheetController extends BaseController {
 
         musicSheetDto.setUserId(0L);
         List<MusicSheetAccompaniment> list;
-        if (!musicSheetDto.getAudioType().equalsIgnoreCase("midi")){
+        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())){
             list = musicSheetDto.getBackground();
             if (CollectionUtils.isEmpty(list)){
                 return failed("mp3音频文件对应的主音或者伴奏文件没有提供");

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
@@ -26,4 +27,14 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return page
      */
     List<MusicAlbumVo> selectPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query);
+
+    /**
+     * 收藏专辑列表
+     *
+     * @param page   分页
+     * @param search 查询条件
+     * @return
+     */
+    List<MusicAlbumVo> selectFavoritePage(@Param("page") IPage<MusicAlbumVo> page, @Param(
+            "query") StudentMusicAlbumSearch search);
 }

+ 30 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -32,8 +34,7 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @param query 查询条件
      * @return
      */
-    List<MusicSheet> selectAlbumDetailPage(@Param("page") IPage<MusicSheet> page,
-                                           @Param("param") MusicAlbumDetailSearch query);
+    List<MusicSheet> selectAlbumDetailPage(@Param("page") IPage<MusicSheet> page, @Param("param") MusicAlbumDetailSearch query);
 
     /**
      * 获取曲目详情
@@ -41,5 +42,31 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @param id 曲目id
      * @return 曲目信息
      */
-    MusicSheetVo detail(Long id);
+    MusicSheetDetailVo detail(Long id);
+
+    /**
+     * 分页查询
+     */
+    List<MusicSheetVo> selectStudentMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
+            "param") StudentMusicSheetSearch query);
+
+    /**
+     * 我的单曲
+     *
+     * @param page  分页信息
+     * @param query 查询条件
+     * @return list
+     */
+    List<MusicSheetVo> selectMyMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
+            "param") StudentMusicSheetSearch query);
+
+    /**
+     * 收藏单曲
+     *
+     * @param page  分页信息
+     * @param query 查询条件
+     * @return list
+     */
+    List<MusicSheetVo> selectFavoriteMusicPage(@Param("page") IPage<MusicSheetVo> page, @Param(
+            "param") StudentMusicSheetSearch query);
 }

+ 0 - 33
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/MusicSheetDto.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.biz.dal.dto;
 
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
 
@@ -13,42 +12,10 @@ import java.util.List;
  * @version v1.0
  **/
 public class MusicSheetDto extends MusicSheet {
-    @JsonIgnore
-    private Integer pageNo;
 
-    @JsonIgnore
-    private Integer pageSize;
 
-    @JsonIgnore
-    private String search;
-
-    @JsonIgnore
     private List<MusicSheetAccompaniment> background;
 
-    public Integer getPageNo() {
-        return pageNo;
-    }
-
-    public void setPageNo(Integer pageNo) {
-        this.pageNo = pageNo;
-    }
-
-    public Integer getPageSize() {
-        return pageSize;
-    }
-
-    public void setPageSize(Integer pageSize) {
-        this.pageSize = pageSize;
-    }
-
-    public String getSearch() {
-        return search;
-    }
-
-    public void setSearch(String search) {
-        this.search = search;
-    }
-
     public List<MusicSheetAccompaniment> getBackground() {
         return background;
     }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumDetailSearch.java

@@ -21,9 +21,10 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     /**
      * 1:新增曲目,2:已有曲目
      */
-    @ApiModelProperty(hidden = true,value = "1:新增曲目,2:已有曲目1:新增曲目,2:已有曲目")
+    @ApiModelProperty(hidden = true,value = "1:新增曲目,2:已有曲目")
     private Integer type;
 
+
     public Long getId() {
         return id;
     }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicAlbumSearch.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.support.Query;
 import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.ApiModel;
@@ -26,6 +27,9 @@ public class MusicAlbumSearch extends Query {
     @ApiModelProperty(hidden = true)
     private List<Long> albumTagIdList;
 
+    @ApiModelProperty("专辑状态0:停用,1:启用")
+    private StateEnum albumStatus;
+
     public String getIdAndName() {
         return idAndName;
     }
@@ -52,4 +56,12 @@ public class MusicAlbumSearch extends Query {
     public void setAlbumTagIdList(List<Long> albumTagIdList) {
         this.albumTagIdList = albumTagIdList;
     }
+
+    public StateEnum getAlbumStatus() {
+        return albumStatus;
+    }
+
+    public void setAlbumStatus(StateEnum albumStatus) {
+        this.albumStatus = albumStatus;
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/MusicSheetSearch.java

@@ -40,7 +40,7 @@ public class MusicSheetSearch  extends Query {
     @ApiModelProperty("曲目审核状态(0:待审核;1:通过;2:未通过)")
     private AuditEnum auditStatus;
 
-    @ApiModelProperty(value = "创建人id",hidden = true)
+    @ApiModelProperty(value = "创建人id (老师id)")
     private Long createBy;
 
     public String getIdAndName() {

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicAlbumSearch.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 学生查询乐谱
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+public class StudentMusicAlbumSearch extends MusicAlbumSearch{
+
+
+    @ApiModelProperty(value = "登录学生id",hidden = true)
+    private Long studentId;
+
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+}

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentMusicSheetSearch.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.dto.search;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description 学生查询乐谱
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+public class StudentMusicSheetSearch  extends MusicSheetSearch{
+
+
+    @ApiModelProperty(value = "登录学生id",hidden = true)
+    private Long studentId;
+
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+}

+ 5 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheet.java

@@ -3,10 +3,7 @@ package com.yonge.cooleshow.biz.dal.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
-import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.StateEnum;
-import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -52,8 +49,8 @@ public class MusicSheet implements Serializable {
 
     @NotBlank(message = "曲谱音频文件类型不能为空!")
     @TableField("audio_type_")
-    @ApiModelProperty(value = "曲谱音频文件类型(midi;mp3)")
-    private String audioType;  //曲谱音频文件类型(midi;mp3)
+    @ApiModelProperty(value = "曲目音频类型 1:mp3, 2:midi, 3:mp3_metronome")
+    private AudioTypeEnum audioType;  //曲谱音频文件类型(midi;mp3)
 
     @NotBlank(message = "曲谱标签不能为空!")
     @TableField("music_tag_")
@@ -176,11 +173,11 @@ public class MusicSheet implements Serializable {
 		this.musicSubject = musicSubject;
 	}
 
-	public String getAudioType() {
+	public AudioTypeEnum getAudioType() {
 		return audioType;
 	}
 
-	public void setAudioType(String audioType) {
+	public void setAudioType(AudioTypeEnum audioType) {
 		this.audioType = audioType;
 	}
 

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/AudioTypeEnum.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.cooleshow.common.enums.BaseEnum;
+
+/**
+ * Description 曲目音频类型 1:mp3,2:midi,3:mp3_metronome
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+public enum AudioTypeEnum implements BaseEnum<Integer,AudioTypeEnum> {
+
+
+    MP3(1,"mp3"),
+    MIDI(2,"midi"),
+    MP3_METRONOME(3,"mp3_metronome");
+    @EnumValue
+    private Integer code;
+    private String msg;
+
+    AudioTypeEnum(Integer code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public Integer getCode() {
+        return this.code;
+    }
+}

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/AlbumFavoriteService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * AlbumFavoriteService服务类
  * @author yzp
@@ -11,4 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  **/
 public interface AlbumFavoriteService extends IService<AlbumFavorite> {
 
+    /**
+     * 获取收藏信息
+     *
+     * @param studentId 学生id
+     * @param albumId 专辑id
+     * @return list
+     */
+    List<AlbumFavorite> getFavorite(Long studentId, Long albumId);
 }

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicAlbumService.java

@@ -3,9 +3,11 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
 
@@ -75,4 +77,31 @@ public interface MusicAlbumService extends IService<MusicAlbum> {
      * @param musicAlbum 专辑对象
      */
     void updateMusicAlbum(MusicAlbum musicAlbum);
+
+    /**
+     * 判断是否已收藏
+     *
+     * @param studentId 学生id
+     * @param albumId 专辑id
+     * @return YesOrNoEnum
+     */
+    YesOrNoEnum checkFavorite(Long studentId, Long albumId);
+
+    /**
+     * 设置学生收藏/取消收藏 专辑
+     *
+     * @param studentId 学生id
+     * @param albumId 专辑id
+     * @return boolean
+     */
+    Boolean setFavorite(Long studentId, Long albumId);
+
+    /**
+     * 收藏专辑列表
+     *
+     * @param page 分页
+     * @param search 查询条件
+     * @return list
+     */
+    IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search);
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicFavoriteService.java

@@ -3,6 +3,8 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * MusicFavoriteService服务类
  * @author yzp
@@ -11,4 +13,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  **/
 public interface MusicFavoriteService extends IService<MusicFavorite> {
 
+    /**
+     * 获取收藏信息
+     *
+     * @param userId 学生id
+     * @param musicSheetId 专辑id
+     * @return list
+     */
+    List<MusicFavorite> getFavorite(Long userId, Long musicSheetId);
 }

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java

@@ -11,4 +11,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  **/
 public interface MusicSheetPurchaseRecordService extends IService<MusicSheetPurchaseRecord> {
 
-}
+    /**
+     * 检查是否购买乐谱
+     *
+     * @param userId 用户id
+     * @param musicSheetId 曲目id
+     * @return boolean
+     */
+    boolean checkPurchase(Long userId, Long musicSheetId);
+}

+ 42 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -2,11 +2,14 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 
@@ -63,7 +66,45 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * 查询详情
      *
      * @param id 曲谱id
+     * @param sysUser 登录用户
      * @return 曲谱信息
      */
-    MusicSheetVo detail(Long id);
+    MusicSheetDetailVo detail(Long id, SysUser sysUser, SysUserType userType);
+
+    /**
+     * 学生端 曲目分页查询
+     *
+     * @param page 分页
+     * @param query 查询条件
+     * @return iPage 分页信息
+     */
+    IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
+
+    /**
+     * 收藏/取消收藏 曲目
+     *
+     * @param userId 用户id , 学生id
+     * @param musicSheetId 曲目id
+     * @return boolean
+     */
+    boolean setFavorite(Long userId, Long musicSheetId);
+
+    /**
+     * 我的单曲
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return
+     */
+    IPage<MusicSheetVo> myMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
+
+
+    /**
+     * 收藏单曲
+     *
+     * @param page 分页信息
+     * @param query 查询条件
+     * @return
+     */
+    IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query);
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/AlbumFavoriteServiceImpl.java

@@ -9,6 +9,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.List;
+
 /**
  * AlbumFavoriteService服务实现类
  * @author yzp
@@ -26,4 +28,13 @@ public class AlbumFavoriteServiceImpl extends ServiceImpl<AlbumFavoriteDao,Album
     public AlbumFavoriteDao getDao() {
         return albumFavoriteDao;
     }
+
+    @Override
+    public List<AlbumFavorite> getFavorite(Long studentId, Long albumId) {
+
+        return this.lambdaQuery()
+                    .eq(AlbumFavorite::getAlbumId, albumId)
+                    .eq(AlbumFavorite::getUserId, studentId)
+                    .list();
+    }
 }

+ 40 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicAlbumServiceImpl.java

@@ -4,12 +4,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
-import com.yonge.cooleshow.biz.dal.entity.MusicTag;
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.AlbumFavoriteService;
 import com.yonge.cooleshow.biz.dal.service.AlbumMusicRelateService;
 import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
@@ -24,8 +26,11 @@ import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * MusicAlbumService服务实现类
@@ -47,6 +52,9 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
     @Autowired
     private MusicSheetService musicSheetService;
 
+    @Autowired
+    private AlbumFavoriteService albumFavoriteService;
+
     public MusicAlbumDao getDao() {
         return musicAlbumDao;
     }
@@ -80,6 +88,7 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         AlbumDetailVo albumDetailVo = new AlbumDetailVo();
         albumDetailVo.setId(musicAlbum.getId());
         albumDetailVo.setAlbumName(musicAlbum.getAlbumName());
+        albumDetailVo.setAlbumDesc(musicAlbum.getAlbumDesc());
 
         IPage<MusicSheet> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);
         albumDetailVo.setMusicSheetList(Condition.pageInfo(musicSheetVoIPage));
@@ -126,6 +135,36 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         this.updateById(musicAlbum);
     }
 
+    @Override
+    public YesOrNoEnum checkFavorite(Long studentId, Long albumId) {
+        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId);
+
+        return CollectionUtils.isEmpty(albumFavorites)?YesOrNoEnum.NO:YesOrNoEnum.YES;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean setFavorite(Long studentId, Long albumId) {
+        List<AlbumFavorite> albumFavorites = albumFavoriteService.getFavorite(studentId,albumId);
+        if (CollectionUtils.isEmpty(albumFavorites)) {
+            AlbumFavorite albumFavorite = new AlbumFavorite();
+            albumFavorite.setAlbumId(albumId);
+            albumFavorite.setUserId(studentId);
+            albumFavorite.setFavoriteTime(new Date());
+            return albumFavoriteService.save(albumFavorite);
+        } else {
+            List<Long> ids = albumFavorites.stream().map(AlbumFavorite::getId).collect(Collectors.toList());
+            return albumFavoriteService.removeByIds(ids);
+        }
+    }
+
+    @Override
+    public IPage<MusicAlbumVo> favoriteAlbum(IPage<MusicAlbumVo> page, StudentMusicAlbumSearch search) {
+
+        return page.setRecords(baseMapper.selectFavoritePage(page,search));
+
+    }
+
     private boolean checkNameRepeat(String albumName, Long id) {
         LambdaQueryChainWrapper<MusicAlbum> eq = this.lambdaQuery()
                                                    .eq(MusicAlbum::getAlbumName, albumName);

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicFavoriteServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.yonge.cooleshow.biz.dal.entity.AlbumFavorite;
 import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
 import com.yonge.cooleshow.biz.dal.dao.MusicFavoriteDao;
 import com.yonge.cooleshow.biz.dal.service.MusicFavoriteService;
@@ -9,6 +10,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import java.util.List;
+
 /**
  * MusicFavoriteService服务实现类
  * @author yzp
@@ -26,4 +29,13 @@ public class MusicFavoriteServiceImpl extends ServiceImpl<MusicFavoriteDao,Music
     public MusicFavoriteDao getDao() {
         return musicFavoriteDao;
     }
+
+    @Override
+    public List<MusicFavorite> getFavorite(Long userId, Long musicSheetId) {
+        return this.lambdaQuery()
+                   .eq(MusicFavorite::getMusicSheetId, musicSheetId)
+                   .eq(MusicFavorite::getUserId, userId)
+                   .list();
+
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,4 +27,14 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
     public MusicSheetPurchaseRecordDao getDao() {
         return musicSheetPurchaseRecordDao;
     }
+
+    @Override
+    public boolean checkPurchase(Long userId, Long musicSheetId) {
+        Integer count = this.lambdaQuery()
+                            .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
+                            .eq(MusicSheetPurchaseRecord::getStudentId, userId)
+                            .eq(MusicSheetPurchaseRecord::getOrderStatus, YesOrNoEnum.YES.getCode())
+                            .count();
+        return count > 0 ;
+    }
 }

+ 74 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -3,17 +3,23 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicFavorite;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetAccompanimentService;
-import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.common.exception.BizException;
@@ -23,9 +29,11 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * MusicSheetService服务实现类
@@ -44,6 +52,15 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     @Autowired
     private MusicSheetAccompanimentService musicSheetAccompanimentService;
 
+    @Autowired
+    private MusicFavoriteService musicFavoriteService;
+
+    @Autowired
+    private MusicSheetPurchaseRecordService musicSheetPurchaseRecordService;
+
+    @Autowired
+    private StudentService studentService;
+
     public MusicSheetDao getDao() {
         return musicSheetDao;
     }
@@ -115,7 +132,60 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
     }
 
     @Override
-    public MusicSheetVo detail(Long id) {
-        return baseMapper.detail(id);
+    public MusicSheetDetailVo detail(Long id, SysUser sysUser,SysUserType userType) {
+        MusicSheetDetailVo detail = baseMapper.detail(id);
+        if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
+            detail.setPlay(YesOrNoEnum.YES);
+        }  else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
+            detail.setPlay(YesOrNoEnum.NO);
+            // 学生须判断是否能播放曲目
+            // 单曲购买 判断购买记录,有记录课播放
+            if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
+                boolean b = musicSheetPurchaseRecordService.checkPurchase(sysUser.getId(),detail.getId());
+                if (b) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
+            } else if  (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
+                // 会员 判断是否为会员, 会员可播放
+                Student student = studentService.getById(sysUser.getId());
+                if (new Date().compareTo(student.getMembershipEndTime()) < 0) {
+                    detail.setPlay(YesOrNoEnum.YES);
+                }
+            }
+        } else {
+            detail.setPlay(YesOrNoEnum.YES);
+        }
+        return detail;
+    }
+
+    @Override
+    public IPage<MusicSheetVo> selectStudentPage(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
+        return page.setRecords(baseMapper.selectStudentMusicPage(page, query));
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean setFavorite(Long userId, Long musicSheetId) {
+        List<MusicFavorite> musicFavorites = musicFavoriteService.getFavorite(userId, musicSheetId);
+        if (CollectionUtils.isEmpty(musicFavorites)) {
+            MusicFavorite musicFavorite = new MusicFavorite();
+            musicFavorite.setMusicSheetId(musicSheetId);
+            musicFavorite.setUserId(userId);
+            musicFavorite.setFavoriteTime(new Date());
+            return musicFavoriteService.save(musicFavorite);
+        } else {
+            List<Long> ids = musicFavorites.stream().map(MusicFavorite::getId).collect(Collectors.toList());
+            return musicFavoriteService.removeByIds(ids);
+        }
+    }
+
+    @Override
+    public IPage<MusicSheetVo> myMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
+        return page.setRecords(baseMapper.selectMyMusicPage(page,query));
+    }
+
+    @Override
+    public IPage<MusicSheetVo> favoriteMusic(IPage<MusicSheetVo> page, StudentMusicSheetSearch query) {
+        return page.setRecords(baseMapper.selectFavoriteMusicPage(page,query));
     }
 }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.common.page.PageInfo;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -18,6 +19,15 @@ public class AlbumDetailVo {
     @ApiModelProperty(value = "专辑名称")
     private String albumName;
 
+    @ApiModelProperty("专辑封面图片URL")
+    private String albumCoverUrl;
+
+    @ApiModelProperty("专辑简介")
+    private String albumDesc;
+
+    @ApiModelProperty("收藏0:否,1:是")
+    private YesOrNoEnum favorite;
+
     @ApiModelProperty("专辑详情曲目")
     private PageInfo<MusicSheet> musicSheetList;
 
@@ -45,4 +55,28 @@ public class AlbumDetailVo {
     public void setMusicSheetList(PageInfo<MusicSheet> musicSheetList) {
         this.musicSheetList = musicSheetList;
     }
+
+    public String getAlbumDesc() {
+        return albumDesc;
+    }
+
+    public void setAlbumDesc(String albumDesc) {
+        this.albumDesc = albumDesc;
+    }
+
+    public String getAlbumCoverUrl() {
+        return albumCoverUrl;
+    }
+
+    public void setAlbumCoverUrl(String albumCoverUrl) {
+        this.albumCoverUrl = albumCoverUrl;
+    }
+
+    public YesOrNoEnum getFavorite() {
+        return favorite;
+    }
+
+    public void setFavorite(YesOrNoEnum favorite) {
+        this.favorite = favorite;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicAlbumVo.java

@@ -17,6 +17,9 @@ public class MusicAlbumVo extends MusicAlbum {
     @ApiModelProperty("曲目数量")
     private Integer musicSheetCount;
 
+    @ApiModelProperty("收藏数量")
+    private Integer albumFavoriteCount;
+
 
     public String getMusicTagNames() {
         return musicTagNames;
@@ -33,4 +36,12 @@ public class MusicAlbumVo extends MusicAlbum {
     public void setMusicSheetCount(Integer musicSheetCount) {
         this.musicSheetCount = musicSheetCount;
     }
+
+    public Integer getAlbumFavoriteCount() {
+        return albumFavoriteCount;
+    }
+
+    public void setAlbumFavoriteCount(Integer albumFavoriteCount) {
+        this.albumFavoriteCount = albumFavoriteCount;
+    }
 }

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-01
+ */
+public class MusicSheetDetailVo extends MusicSheet {
+
+    @ApiModelProperty("曲谱伴奏")
+    private List<MusicSheetAccompaniment> background;
+
+    @ApiModelProperty("是否能播放(0:否,1:是)")
+    private YesOrNoEnum play;
+
+    public List<MusicSheetAccompaniment> getBackground() {
+        return background;
+    }
+
+    public void setBackground(List<MusicSheetAccompaniment> background) {
+        this.background = background;
+    }
+
+    public YesOrNoEnum getPlay() {
+        return play;
+    }
+
+    public void setPlay(YesOrNoEnum play) {
+        this.play = play;
+    }
+}
+

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetVo.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -25,6 +26,9 @@ public class MusicSheetVo extends MusicSheet {
     @ApiModelProperty("声部名")
     private String subjectNames;
 
+    @ApiModelProperty("收藏 0:否,1:是")
+    private YesOrNoEnum favorite;
+
     public String getAddName() {
         return addName;
     }
@@ -56,4 +60,12 @@ public class MusicSheetVo extends MusicSheet {
     public void setAddUserAvatar(String addUserAvatar) {
         this.addUserAvatar = addUserAvatar;
     }
+
+    public YesOrNoEnum getFavorite() {
+        return favorite;
+    }
+
+    public void setFavorite(YesOrNoEnum favorite) {
+        this.favorite = favorite;
+    }
 }

+ 35 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -39,8 +39,10 @@
         ,(select group_concat(mt.name_) from music_tag mt
             where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0) as musicTagNames
         , t1.num as musicSheetCount
+        ,t2.num as albumFavoriteCount
         from music_album t
         left join (select count(1) as num,amr.album_id_ from album_music_relate amr group by amr.album_id_) t1 on t1.album_id_ = t.id_
+        left join (select count(1) as num,af.album_id_ from album_favorite af group by af.album_id_) t2 on t2.album_id_ = t.id_
         <where>
             <if test="query.idAndName != null and query.idAndName != ''">
                 and (t.id_ like concat('%',#{query.idAndName},'%') or
@@ -52,6 +54,39 @@
                     find_in_set(#{item},t.album_tag_)
                 </foreach>
             </if>
+            <if test="query.albumStatus != null">
+                and t.album_status_ = #{query.albumStatus}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectFavoritePage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo">
+        select <include refid="Base_Column_List"/>
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.album_tag_) and mt.del_flag_ = 0) as musicTagNames
+        , t1.num as musicSheetCount
+        ,t2.num as albumFavoriteCount
+        from music_album t
+        left join album_favorite af2 on af2.album_id_ = t.id_
+        left join (select count(1) as num,amr.album_id_ from album_music_relate amr group by amr.album_id_) t1 on t1.album_id_ = t.id_
+        left join (select count(1) as num,af.album_id_ from album_favorite af group by af.album_id_) t2 on t2.album_id_ = t.id_
+        <where>
+            <if test="query.studentId != null">
+                and af2.user_id_ = #{query.studentId}
+            </if>
+            <if test="query.idAndName != null and query.idAndName != ''">
+                and (t.id_ like concat('%',#{query.idAndName},'%') or
+                t.album_name_ like concat('%',#{query.idAndName},'%'))
+            </if>
+            <if test="query.albumTagIdList != null and query.albumTagIdList != ''">
+                and
+                <foreach collection="query.albumTagIdList" separator="and" item="item">
+                    find_in_set(#{item},t.album_tag_)
+                </foreach>
+            </if>
+            <if test="query.albumStatus != null">
+                and t.album_status_ = #{query.albumStatus}
+            </if>
         </where>
     </select>
 </mapper>

+ 133 - 26
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -67,34 +67,38 @@
         from music_sheet t
         left join sys_user su on t.create_by_ = su.id_
         <where>
-            <if test="param.idAndName != null and param.idAndName != ''">
-                and (t.id_ like concat('%',#{param.idAndName},'%') or
-                t.music_sheet_name_ like concat('%',#{param.idAndName},'%'))
-            </if>
-            <if test="param.musicTagIds != null and param.musicTagIds != ''">
-                and
-                <foreach collection="param.musicTagIdList" separator="and" item="item">
-                    find_in_set(#{item},t.music_tag_)
-                </foreach>
-            </if>
-            <if test="param.subjectIds != null and param.subjectIds != ''">
-                and
-                <foreach collection="param.subjectIdList" separator="and" item="item">
-                    find_in_set(#{item},t.music_subject_)
-                </foreach>
-            </if>
-            <if test="param.state != null">
-                and t.state_ = #{param.state}
-            </if>
-            <if test="param.auditStatus != null">
-                and t.audit_status_ = #{param.auditStatus}
-            </if>
-            <if test="param.createBy != null">
-                and t.create_by_ = #{param.createBy}
-            </if>
+            <include refid="QueryInfo"/>
         </where>
     </select>
 
+    <sql id="QueryInfo">
+        <if test="param.idAndName != null and param.idAndName != ''">
+            and (t.id_ like concat('%',#{param.idAndName},'%') or
+            t.music_sheet_name_ like concat('%',#{param.idAndName},'%'))
+        </if>
+        <if test="param.musicTagIds != null and param.musicTagIds != ''">
+            and
+            <foreach collection="param.musicTagIdList" separator="and" item="item">
+                find_in_set(#{item},t.music_tag_)
+            </foreach>
+        </if>
+        <if test="param.subjectIds != null and param.subjectIds != ''">
+            and
+            <foreach collection="param.subjectIdList" separator="and" item="item">
+                find_in_set(#{item},t.music_subject_)
+            </foreach>
+        </if>
+        <if test="param.state != null">
+            and t.state_ = #{param.state}
+        </if>
+        <if test="param.auditStatus != null">
+            and t.audit_status_ = #{param.auditStatus}
+        </if>
+        <if test="param.createBy != null">
+            and t.create_by_ = #{param.createBy}
+        </if>
+    </sql>
+
     <select id="selectAlbumDetailPage" resultType="com.yonge.cooleshow.biz.dal.entity.MusicSheet">
         select <include refid="Base_Column_List"/>
         from music_sheet t
@@ -131,10 +135,113 @@
         </where>
     </select>
 
-    <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+    <select id="detail" resultMap="DetailResultMap">
         SELECT
         <include refid="Base_Column_List"/>
+        ,msa.id_ as accompanimentId
+        ,msa.music_sheet_id_ as accompanimentMusicSheetId
+        ,msa.music_subject_ as accompanimentMusicSubject
+        ,msa.audio_file_url_ as accompanimentAudioFileUrl
+        ,msa.sort_number_ as accompanimentSortNumber
+        ,msa.create_time_ as accompanimentCreateTime
+
         FROM music_sheet t
+        left join music_sheet_accompaniment msa on msa.music_sheet_id_ = t.id_
         where t.id_ = #{id}
+         order by  msa.sort_number_
+    </select>
+
+
+    <resultMap id="DetailResultMap" type="com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="musicSheetName" jdbcType="VARCHAR" property="musicSheetName"/>
+        <result column="userId" jdbcType="BIGINT" property="userId"/>
+        <result column="composer" jdbcType="VARCHAR" property="composer"/>
+        <result column="musicSubject" jdbcType="VARCHAR" property="musicSubject"/>
+        <result column="audioType" jdbcType="VARCHAR" property="audioType"/>
+        <result column="musicTag" jdbcType="VARCHAR" property="musicTag"/>
+        <result column="playSpeed" jdbcType="INTEGER" property="playSpeed"/>
+        <result column="canEvaluate" jdbcType="TINYINT" property="canEvaluate"/>
+        <result column="showFingering" jdbcType="TINYINT" property="showFingering"/>
+        <result column="chargeType" jdbcType="TINYINT" property="chargeType"/>
+        <result column="auditStatus" jdbcType="TINYINT" property="auditStatus"/>
+        <result column="sortNumber" jdbcType="INTEGER" property="sortNumber"/>
+        <result column="topFlag" jdbcType="TINYINT" property="topFlag"/>
+        <result column="hotFlag" jdbcType="TINYINT" property="hotFlag"/>
+        <result column="musicPrice" jdbcType="DECIMAL" property="musicPrice"/>
+        <result column="audioFileUrl" jdbcType="VARCHAR" property="audioFileUrl"/>
+        <result column="xmlFileUrl" jdbcType="VARCHAR" property="xmlFileUrl"/>
+        <result column="hasBeat" jdbcType="TINYINT" property="hasBeat"/>
+        <result column="createTime" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="createBy" jdbcType="BIGINT" property="createBy"/>
+        <result column="updateTime" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="updateBy" jdbcType="BIGINT" property="updateBy"/>
+        <result column="remark" jdbcType="VARCHAR" property="remark"/>
+        <collection property="background" ofType="com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment">
+            <id column="accompanimentId" jdbcType="BIGINT" property="id"/>
+            <result column="accompanimentMusicSheetId" jdbcType="BIGINT" property="musicSheetId"/>
+            <result column="accompanimentMusicSubject" jdbcType="VARCHAR" property="musicSubject"/>
+            <result column="accompanimentAudioFileUrl" jdbcType="VARCHAR" property="audioFileUrl"/>
+            <result column="accompanimentSortNumber" jdbcType="TINYINT" property="sortNumber"/>
+            <result column="accompanimentCreateTime" jdbcType="TIMESTAMP" property="createTime"/>
+        </collection>
+    </resultMap>
+
+    <select id="selectStudentMusicPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+        select <include refid="Base_Column_List"/>
+        ,su.username_ as addName
+        ,su.avatar_ as addUserAvatar
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
+        ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
+        <if test="param.studentId != null">
+            ,if(mf.id_ is not null,1,0) as favorite
+        </if>
+        from music_sheet t
+        left join sys_user su on t.create_by_ = su.id_
+        <if test="param.studentId != null">
+            left join music_favorite mf on t.id_ = mf.music_sheet_id_ and mf.user_id_ = #{param.studentId}
+        </if>
+        <where>
+            <include refid="QueryInfo"/>
+        </where>
+    </select>
+
+    <select id="selectMyMusicPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+        select <include refid="Base_Column_List"/>
+        ,su.username_ as addName
+        ,su.avatar_ as addUserAvatar
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
+        ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
+        from music_sheet t
+        left join sys_user su on t.create_by_ = su.id_
+        left join music_sheet_purchase_record mspr on mspr.music_sheet_id_ = t.id_
+        <where>
+            <include refid="QueryInfo"/>
+            <if test="param.studentId != null">
+                and mspr.student_id_ = #{param.studentId}
+                and mspr.order_status_ = 1
+            </if>
+        </where>
+    </select>
+
+    <select id="selectFavoriteMusicPage" resultType="com.yonge.cooleshow.biz.dal.vo.MusicSheetVo">
+        select <include refid="Base_Column_List"/>
+        ,su.username_ as addName
+        ,su.avatar_ as addUserAvatar
+        ,(select group_concat(mt.name_) from music_tag mt
+        where find_in_set(mt.id_,t.music_tag_) and mt.del_flag_ = 0) as musicTagNames
+        ,(select group_concat(s.name_) from subject s where find_in_set(s.id_,t.music_subject_) ) as subjectNames
+        ,if(mf.id_ is not null,1,0) as favorite
+        from music_sheet t
+        left join sys_user su on t.create_by_ = su.id_
+        left join music_favorite mf on t.id_ = mf.music_sheet_id_
+        <where>
+            <include refid="QueryInfo"/>
+            <if test="param.studentId != null">
+                and mf.user_id_ = #{param.studentId}
+            </if>
+        </where>
     </select>
 </mapper>

+ 107 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicAlbumController.java

@@ -0,0 +1,107 @@
+package com.yonge.cooleshow.student.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumDetailSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicAlbumService;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.support.Query;
+import com.yonge.cooleshow.biz.dal.vo.AlbumDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
+import io.swagger.annotations.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 专辑表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("/music/album")
+@Api(tags = "专辑表 API接口")
+public class MusicAlbumController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private MusicAlbumService musicAlbumService;
+
+
+    @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/list", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> list(@RequestBody MusicAlbumSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        query.setAlbumStatus(StateEnum.ENABLE);
+        IPage<MusicAlbumVo> iPage = musicAlbumService.selectPage(Condition.getPage(query),query);
+        return succeed(Condition.pageInfo(iPage));
+    }
+
+
+    /**
+     * 专辑详情
+     */
+    @PostMapping("/detail")
+    @ApiOperation(value = "专辑详情", consumes="application/json", produces="application/json")
+    public HttpResponseResult<AlbumDetailVo> detail(@Valid @RequestBody MusicAlbumDetailSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        query.setType(2);
+        query.setState(StateEnum.ENABLE);
+        YesOrNoEnum yesOrNoEnum = musicAlbumService.checkFavorite(sysUser.getId(),query.getId() );
+        AlbumDetailVo albumDetailVo = musicAlbumService.detail(Condition.getPage(query),query);
+        albumDetailVo.setFavorite(yesOrNoEnum);
+        return succeed(albumDetailVo);
+    }
+
+    /**
+     * 专辑收藏
+     */
+    @PostMapping("/favorite/{id}")
+    @ApiOperation(value = "专辑收藏/取消收藏")
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "专辑编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+
+        return succeed(musicAlbumService.setFavorite(sysUser.getId(),id));
+    }
+
+
+    /**
+     * 专辑收藏
+     */
+    @GetMapping("/favorite")
+    @ApiOperation(value = "收藏专辑列表")
+    public HttpResponseResult<PageInfo<MusicAlbumVo>> favoriteAlbum(Query query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicAlbumSearch search = new StudentMusicAlbumSearch();
+        search.setStudentId(sysUser.getId());
+        search.setAlbumStatus(StateEnum.ENABLE);
+        IPage<MusicAlbumVo> albumVoIPage = musicAlbumService.favoriteAlbum(Condition.getPage(query), search);
+        return succeed(Condition.pageInfo(albumVoIPage));
+    }
+}

+ 134 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/MusicSheetController.java

@@ -0,0 +1,134 @@
+package com.yonge.cooleshow.student.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
+import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
+import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.StateEnum;
+import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.support.Query;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.page.PageInfo;
+import com.yonge.toolset.utils.string.StringUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 曲谱表 web 控制层
+ * @author yzp
+ * @date 2022-03-26 00:21:46
+ * @version v1.0
+ **/
+@RestController
+@RequestMapping("/music/sheet")
+@Api(tags = "曲谱表 API接口")
+public class MusicSheetController extends BaseController {
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+	@Autowired
+	private MusicSheetService musicSheetService;
+
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入musicTag")
+    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(musicSheetService.detail(id, sysUser, SysUserType.STUDENT));
+    }
+
+    @ApiOperation(value = "分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
+    @PostMapping(value="/list", consumes="application/json", produces="application/json")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody StudentMusicSheetSearch query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+
+        // 学生 只能看通过审核 并且 启用的 曲目
+        query.setState(StateEnum.ENABLE);
+        query.setAuditStatus(AuditEnum.OPEN);
+        query.setStudentId(sysUser.getId());
+        IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectStudentPage(Condition.getPage(query), query);
+        return succeed(Condition.pageInfo(musicSheetVoIPage));
+    }
+
+    /**
+     * 曲目收藏
+     */
+    @PostMapping("/favorite/{id}")
+    @ApiOperation(value = "曲目收藏/取消收藏")
+    public HttpResponseResult<Boolean> favorite(@ApiParam(value = "曲目编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(musicSheetService.setFavorite(sysUser.getId(),id));
+    }
+
+
+
+    /**
+     * 我的单曲,收藏单曲
+     */
+    @GetMapping("/my")
+    @ApiOperation(value = "我的单曲")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> myMusic(Query query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+        search.setStudentId(sysUser.getId());
+        search.setState(StateEnum.ENABLE);
+        search.setAuditStatus(AuditEnum.OPEN);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.myMusic(Condition.getPage(query),search);
+        return succeed(Condition.pageInfo(sheetVoIPage));
+    }
+
+
+    /**
+     * 我的单曲,收藏单曲
+     */
+    @GetMapping("/favorite")
+    @ApiOperation(value = "收藏单曲")
+    public HttpResponseResult<PageInfo<MusicSheetVo>> favoriteMusic(Query query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+        search.setStudentId(sysUser.getId());
+        search.setState(StateEnum.ENABLE);
+        search.setAuditStatus(AuditEnum.OPEN);
+        IPage<MusicSheetVo> sheetVoIPage = musicSheetService.favoriteMusic(Condition.getPage(query),search);
+        return succeed(Condition.pageInfo(sheetVoIPage));
+    }
+}

+ 10 - 4
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -3,21 +3,23 @@ package com.yonge.cooleshow.teacher.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.api.enums.SysUserType;
 import com.yonge.cooleshow.biz.dal.dto.MusicSheetDto;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheet;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAccompaniment;
+import com.yonge.cooleshow.biz.dal.enums.AudioTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.AuditEnum;
 import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.StateEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
 import com.yonge.cooleshow.biz.dal.support.Condition;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetDetailVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetShareVo;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.page.PageInfo;
-import com.yonge.toolset.utils.string.StringUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -52,8 +54,12 @@ public class MusicSheetController extends BaseController {
      */
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "详情", notes = "传入musicTag")
-    public HttpResponseResult<MusicSheetVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
-        return succeed(musicSheetService.detail(id));
+    public HttpResponseResult<MusicSheetDetailVo> detail(@ApiParam(value = "曲谱编号", required = true) @PathVariable("id") Long id) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        return succeed(musicSheetService.detail(id, sysUser, SysUserType.TEACHER));
     }
 
 	@ApiOperation(value = "新增", httpMethod="POST", consumes="application/json", produces="application/json")
@@ -71,7 +77,7 @@ public class MusicSheetController extends BaseController {
 
         musicSheetDto.setUserId(sysUser.getId());
         List<MusicSheetAccompaniment> list;
-        if (!musicSheetDto.getAudioType().equalsIgnoreCase("midi")){
+        if (!AudioTypeEnum.MIDI.getCode().equals(musicSheetDto.getAudioType().getCode())){
             list = musicSheetDto.getBackground();
             if (CollectionUtils.isEmpty(list)){
                 return failed("mp3音频文件对应的主音或者伴奏文件没有提供");