瀏覽代碼

初始化

lichen 10 月之前
父節點
當前提交
4a216c165b
共有 100 個文件被更改,包括 4040 次插入0 次删除
  1. 145 0
      pom.xml
  2. 16 0
      src/main/java/org/example/music/MusicApplication.java
  3. 56 0
      src/main/java/org/example/music/common/R.java
  4. 31 0
      src/main/java/org/example/music/config/SwaggerConfig.java
  5. 16 0
      src/main/java/org/example/music/constant/Constants.java
  6. 26 0
      src/main/java/org/example/music/controller/AdminController.java
  7. 27 0
      src/main/java/org/example/music/controller/BannerController.java
  8. 46 0
      src/main/java/org/example/music/controller/CollectController.java
  9. 44 0
      src/main/java/org/example/music/controller/CommentController.java
  10. 152 0
      src/main/java/org/example/music/controller/ConsumerController.java
  11. 59 0
      src/main/java/org/example/music/controller/FileDownloadController.java
  12. 77 0
      src/main/java/org/example/music/controller/ListSongController.java
  13. 117 0
      src/main/java/org/example/music/controller/MinioController.java
  14. 146 0
      src/main/java/org/example/music/controller/MinioUploadController.java
  15. 36 0
      src/main/java/org/example/music/controller/RankListController.java
  16. 58 0
      src/main/java/org/example/music/controller/SingerController.java
  17. 97 0
      src/main/java/org/example/music/controller/SongController.java
  18. 61 0
      src/main/java/org/example/music/controller/SongListController.java
  19. 37 0
      src/main/java/org/example/music/controller/UserSupportController.java
  20. 41 0
      src/main/java/org/example/music/entity/Admin.java
  21. 10 0
      src/main/java/org/example/music/mapper/AdminMapper.java
  22. 15 0
      src/main/java/org/example/music/mapper/BannerMapper.java
  23. 10 0
      src/main/java/org/example/music/mapper/CollectMapper.java
  24. 10 0
      src/main/java/org/example/music/mapper/CommentMapper.java
  25. 10 0
      src/main/java/org/example/music/mapper/ConsumerMapper.java
  26. 10 0
      src/main/java/org/example/music/mapper/ListSongMapper.java
  27. 25 0
      src/main/java/org/example/music/mapper/RankListMapper.java
  28. 10 0
      src/main/java/org/example/music/mapper/SingerMapper.java
  29. 12 0
      src/main/java/org/example/music/mapper/SongListMapper.java
  30. 10 0
      src/main/java/org/example/music/mapper/SongMapper.java
  31. 14 0
      src/main/java/org/example/music/mapper/UserSupportMapper.java
  32. 23 0
      src/main/java/org/example/music/model/domain/Admin.java
  33. 62 0
      src/main/java/org/example/music/model/domain/Banner.java
  34. 32 0
      src/main/java/org/example/music/model/domain/Collect.java
  35. 35 0
      src/main/java/org/example/music/model/domain/Comment.java
  36. 43 0
      src/main/java/org/example/music/model/domain/Consumer.java
  37. 26 0
      src/main/java/org/example/music/model/domain/ListSong.java
  38. 14 0
      src/main/java/org/example/music/model/domain/Order.java
  39. 23 0
      src/main/java/org/example/music/model/domain/RankList.java
  40. 17 0
      src/main/java/org/example/music/model/domain/ResetPasswordRequest.java
  41. 34 0
      src/main/java/org/example/music/model/domain/Singer.java
  42. 38 0
      src/main/java/org/example/music/model/domain/Song.java
  43. 28 0
      src/main/java/org/example/music/model/domain/SongList.java
  44. 73 0
      src/main/java/org/example/music/model/domain/UserSupport.java
  45. 16 0
      src/main/java/org/example/music/model/request/AdminRequest.java
  46. 29 0
      src/main/java/org/example/music/model/request/CollectRequest.java
  47. 28 0
      src/main/java/org/example/music/model/request/CommentRequest.java
  48. 37 0
      src/main/java/org/example/music/model/request/ConsumerRequest.java
  49. 16 0
      src/main/java/org/example/music/model/request/ListSongRequest.java
  50. 18 0
      src/main/java/org/example/music/model/request/RankListRequest.java
  51. 26 0
      src/main/java/org/example/music/model/request/SingerRequest.java
  52. 20 0
      src/main/java/org/example/music/model/request/SongListRequest.java
  53. 31 0
      src/main/java/org/example/music/model/request/SongRequest.java
  54. 14 0
      src/main/java/org/example/music/model/request/UserSupportRequest.java
  55. 13 0
      src/main/java/org/example/music/service/AdminService.java
  56. 17 0
      src/main/java/org/example/music/service/BannerService.java
  57. 17 0
      src/main/java/org/example/music/service/CollectService.java
  58. 20 0
      src/main/java/org/example/music/service/CommentService.java
  59. 35 0
      src/main/java/org/example/music/service/ConsumerService.java
  60. 22 0
      src/main/java/org/example/music/service/ListSongService.java
  61. 8 0
      src/main/java/org/example/music/service/OrderManager.java
  62. 16 0
      src/main/java/org/example/music/service/RankListService.java
  63. 24 0
      src/main/java/org/example/music/service/SingerService.java
  64. 28 0
      src/main/java/org/example/music/service/SongListService.java
  65. 30 0
      src/main/java/org/example/music/service/SongService.java
  66. 20 0
      src/main/java/org/example/music/service/UserSupportService.java
  67. 33 0
      src/main/java/org/example/music/service/impl/AdminServiceImpl.java
  68. 31 0
      src/main/java/org/example/music/service/impl/BannerServiceImpl.java
  69. 61 0
      src/main/java/org/example/music/service/impl/CollectServiceImpl.java
  70. 65 0
      src/main/java/org/example/music/service/impl/CommentServiceImpl.java
  71. 214 0
      src/main/java/org/example/music/service/impl/ConsumerServiceImpl.java
  72. 67 0
      src/main/java/org/example/music/service/impl/ListSongServiceImpl.java
  73. 49 0
      src/main/java/org/example/music/service/impl/RankListServiceImpl.java
  74. 57 0
      src/main/java/org/example/music/service/impl/SimpleOrderManager.java
  75. 88 0
      src/main/java/org/example/music/service/impl/SingerServiceImpl.java
  76. 102 0
      src/main/java/org/example/music/service/impl/SongListServiceImpl.java
  77. 229 0
      src/main/java/org/example/music/service/impl/SongServiceImpl.java
  78. 58 0
      src/main/java/org/example/music/service/impl/UserSupportServiceImpl.java
  79. 23 0
      src/main/java/org/example/music/util/BeanMapperUtils.java
  80. 12 0
      src/main/java/org/example/music/util/IdObject.java
  81. 40 0
      src/main/java/org/example/music/util/MapUtils.java
  82. 23 0
      src/main/java/org/example/music/util/ModelAttrUtils.java
  83. 16 0
      src/main/java/org/example/music/util/ModelFieldAttr.java
  84. 31 0
      src/main/java/org/example/music/util/PageView.java
  85. 18 0
      src/main/java/org/example/music/util/RandomUtils.java
  86. 80 0
      src/main/java/org/example/music/util/ResponseCode.java
  87. 47 0
      src/main/java/org/example/music/util/ResponseResult.java
  88. 101 0
      src/main/java/org/example/music/util/SmartWrapper.java
  89. 77 0
      src/main/java/org/example/music/util/TestFileUtil.java
  90. 4 0
      src/main/resources/application-dev.properties
  91. 8 0
      src/main/resources/application.properties
  92. 14 0
      src/main/resources/log4j.properties
  93. 13 0
      src/main/resources/mapper/AdminMapper.xml
  94. 15 0
      src/main/resources/mapper/BannerMapper.xml
  95. 16 0
      src/main/resources/mapper/CollectMapper.xml
  96. 18 0
      src/main/resources/mapper/CommentMapper.xml
  97. 22 0
      src/main/resources/mapper/ConsumerMapper.xml
  98. 13 0
      src/main/resources/mapper/ListSongMapper.xml
  99. 21 0
      src/main/resources/mapper/RankListMapper.xml
  100. 17 0
      src/main/resources/mapper/SingerMapper.xml

+ 145 - 0
pom.xml

@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>music-server</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.6.RELEASE</version>
+    </parent>
+
+    <properties>
+        <swagger.version>2.7.0</swagger.version>
+    </properties>
+
+    <dependencies>
+        <!-- Spring Boot web依赖 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>logback-classic</artifactId>
+                    <groupId>ch.qos.logback</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <!--mysql-connector-java就是帮助java程序操作mysql的驱动程序。通过与mysql服务端建立连接,发送sql语句并且获取结果集-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.16</version>
+        </dependency>
+
+        <!--mybatis用来和数据库进行交互-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.version}</version>
+        </dependency>
+        <!-- Knife4j Dependency -->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+
+        <!-- Log4j -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j</artifactId>
+            <version>1.3.8.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-to-slf4j</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.16</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+
+        <!--这里面有点小工具啥的-->
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.8.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.1.3</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- 加上这段代码  打包插件 因为启动不起来 -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.22.1</version>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 16 - 0
src/main/java/org/example/music/MusicApplication.java

@@ -0,0 +1,16 @@
+package org.example.music;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("org.example.music.mapper")
+public class MusicApplication {
+    public static void main(String[] args) {
+
+        // 程序启动入口
+        // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
+        SpringApplication.run(MusicApplication.class, args);
+    }
+}

+ 56 - 0
src/main/java/org/example/music/common/R.java

@@ -0,0 +1,56 @@
+package org.example.music.common;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/4 19:04
+ **/
+@Data
+public class R {
+
+    private int code;
+
+    private String message;
+
+    private String type;
+
+    private Boolean success;
+
+    private Object data;
+
+    public static org.example.music.common.R success(String message) {
+        org.example.music.common.R r = new org.example.music.common.R();
+        r.setCode(200);
+        r.setMessage(message);
+        r.setSuccess(true);
+        r.setType("success");
+        r.setData(null);
+        return r;
+    }
+
+    public static org.example.music.common.R success(String message, Object data) {
+        org.example.music.common.R r = success(message);
+        r.setData(data);
+        return r;
+    }
+
+    public static org.example.music.common.R warning(String message) {
+        org.example.music.common.R r = error(message);
+        r.setType("warning");
+        return r;
+    }
+
+    public static org.example.music.common.R error(String message) {
+        org.example.music.common.R r = success(message);
+        r.setSuccess(false);
+        r.setType("error");
+        return r;
+    }
+
+    public static org.example.music.common.R fatal(String message) {
+        org.example.music.common.R r = error(message);
+        r.setCode(500);
+        return r;
+    }
+}

+ 31 - 0
src/main/java/org/example/music/config/SwaggerConfig.java

@@ -0,0 +1,31 @@
+package org.example.music.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
+                .apis(RequestHandlerSelectors.basePackage("org.example.music")) //扫描API的包路径
+                .paths(PathSelectors.any()).build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder().title("SpringBoot音乐网站") // 标题
+                .description("api接口的文档整理,支持在线测试") // 描述
+                .contact(new Contact("lichen", "https://yinyue.pipide.com", "lichen1986@aliyun.com"))
+                .version("1.0") // 版本号
+                .build();
+    }
+}

+ 16 - 0
src/main/java/org/example/music/constant/Constants.java

@@ -0,0 +1,16 @@
+package org.example.music.constant;
+
+public class Constants {
+    /* 歌曲图片,歌手图片,歌曲文件,歌单图片等文件的存放路径 */
+    public static String ASSETS_PATH = System.getProperty("user.dir");
+    
+    public static String AVATOR_IMAGES_PATH = "file:" + ASSETS_PATH + "/img/avatorImages/";
+    public static String SONGLIST_PIC_PATH = "file:" + ASSETS_PATH + "/img/songListPic/";
+    public static String SONG_PIC_PATH = "file:" + ASSETS_PATH + "/img/songPic/";
+    public static String SONG_PATH = "file:" + ASSETS_PATH + "/song/";
+    public static String SINGER_PIC_PATH = "file:" + ASSETS_PATH + "/img/singerPic/";
+    public static String BANNER_PIC_PATH = "file:" + ASSETS_PATH + "/img/swiper/";
+
+    /* 盐值加密 */
+    public static String SALT = "zyt";
+}

+ 26 - 0
src/main/java/org/example/music/controller/AdminController.java

@@ -0,0 +1,26 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.AdminRequest;
+import org.example.music.service.AdminService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpSession;
+
+/**
+ * 后台管理的相关事宜
+ */
+@RestController
+public class AdminController {
+    @Autowired
+    private AdminService adminService;
+
+    // 判断是否登录成功
+    @PostMapping("/admin/login/status")
+    public R loginStatus(@RequestBody AdminRequest adminRequest, HttpSession session) {
+        return adminService.verityPasswd(adminRequest, session);
+    }
+}

+ 27 - 0
src/main/java/org/example/music/controller/BannerController.java

@@ -0,0 +1,27 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.service.BannerService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/13 13:16
+ **/
+@RestController
+@Api(value = "BannerController", tags = {"轮播控制类"})
+@RequestMapping("/banner")
+public class BannerController {
+
+    @Autowired
+    private BannerService bannerService;
+
+    @GetMapping("/getAllBanner")
+    public R getAllBanner(){
+        return R.success("成功获取轮播图与",bannerService.getAllBanner());
+    }
+}

+ 46 - 0
src/main/java/org/example/music/controller/CollectController.java

@@ -0,0 +1,46 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.CollectRequest;
+import org.example.music.service.CollectService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(value = "BannerController", tags = {"轮播控制类"})
+@RestController
+public class CollectController {
+
+    @Autowired
+    private CollectService collectService;
+
+
+    // 添加收藏的歌曲
+    //前台界面逻辑
+    @ApiOperation(value = "添加收藏歌曲")
+    @PostMapping("/collection/add")
+    public R addCollection(@RequestBody CollectRequest addCollectRequest) {
+        return collectService.addCollection(addCollectRequest);
+    }
+
+    //TODO  这些其实有点偏简单的逻辑  所以就一点 所以放在外面  拿到里面
+    // 取消收藏的歌曲
+    @DeleteMapping("/collection/delete")
+    public R deleteCollection(@RequestParam Integer userId, @RequestParam Integer songId) {
+        return collectService.deleteCollect(userId, songId);
+    }
+
+    // 是否收藏歌曲
+    @PostMapping("/collection/status")
+    public R isCollection(@RequestBody CollectRequest isCollectRequest) {
+        return collectService.existSongId(isCollectRequest);
+
+    }
+
+    // 返回的指定用户 ID 收藏的列表
+    @GetMapping("/collection/detail")
+    public R collectionOfUser(@RequestParam Integer userId) {
+        return collectService.collectionOfUser(userId);
+    }
+}

+ 44 - 0
src/main/java/org/example/music/controller/CommentController.java

@@ -0,0 +1,44 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.CommentRequest;
+import org.example.music.service.CommentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+public class CommentController {
+    @Autowired
+    private CommentService commentService;
+
+
+    // 提交评论
+    @PostMapping("/comment/add")
+    public R addComment(@RequestBody CommentRequest addCommentRequest) {
+        return commentService.addComment(addCommentRequest);
+    }
+
+    // 删除评论
+    @GetMapping("/comment/delete")
+    public R deleteComment(@RequestParam Integer id) {
+        return commentService.deleteComment(id);
+    }
+
+    // 获得指定歌曲 ID 的评论列表
+    @GetMapping("/comment/song/detail")
+    public R commentOfSongId(@RequestParam Integer songId) {
+        return commentService.commentOfSongId(songId);
+    }
+
+    // 获得指定歌单 ID 的评论列表
+    @GetMapping("/comment/songList/detail")
+    public R commentOfSongListId(@RequestParam Integer songListId) {
+        return commentService.commentOfSongListId(songListId);
+    }
+
+    // 点赞
+    @PostMapping("/comment/like")
+    public R commentOfLike(@RequestBody CommentRequest upCommentRequest) {
+        return commentService.updateCommentMsg(upCommentRequest);
+    }
+}

+ 152 - 0
src/main/java/org/example/music/controller/ConsumerController.java

@@ -0,0 +1,152 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.domain.Consumer;
+import org.example.music.model.domain.ResetPasswordRequest;
+import org.example.music.model.request.ConsumerRequest;
+import org.example.music.service.ConsumerService;
+import org.example.music.service.impl.ConsumerServiceImpl;
+import org.example.music.service.impl.SimpleOrderManager;
+import org.example.music.util.RandomUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+import java.util.concurrent.TimeUnit;
+
+@RestController
+public class ConsumerController {
+
+    @Autowired
+    private ConsumerService consumerService;
+
+    @Autowired
+    ConsumerServiceImpl consumerServiceimpl;
+
+    @Autowired
+    private SimpleOrderManager simpleOrderManager;
+
+//    @Autowired
+//    StringRedisTemplate stringRedisTemplate;
+    /**
+     * TODO 前台页面调用 注册
+     * 用户注册
+     */
+    @PostMapping("/user/add")
+    public R addUser(@RequestBody ConsumerRequest registryRequest) {
+        return consumerService.addUser(registryRequest);
+    }
+
+    /**
+     * TODO 前台页面调用  登录
+     * 登录判断
+     */
+    @PostMapping("/user/login/status")
+    public R loginStatus(@RequestBody ConsumerRequest loginRequest, HttpSession session) {
+        return consumerService.loginStatus(loginRequest, session);
+    }
+    /**
+     * email登录
+     */
+    @PostMapping("/user/email/status")
+    public R loginEmailStatus(@RequestBody ConsumerRequest loginRequest, HttpSession session) {
+        return consumerService.loginEmailStatus(loginRequest, session);
+    }
+
+    /**
+     * 密码恢复(忘记密码)
+     */
+
+    @PostMapping("/user/resetPassword")
+    public R resetPassword(@RequestBody ResetPasswordRequest passwordRequest){
+        Consumer user = consumerService.findByEmail(passwordRequest.getEmail());
+//        String code = stringRedisTemplate.opsForValue().get("code");
+//        if (user==null){
+//            return R.fatal("用户不存在");
+//        }else if (!code.equals(passwordRequest.getCode())){
+//            return R.fatal("验证码不存在或失效");
+//        }
+        ConsumerRequest consumerRequest=new ConsumerRequest();
+        BeanUtils.copyProperties(user, consumerRequest);
+        System.out.println(user);
+        System.out.println(consumerRequest);
+        consumerRequest.setPassword(passwordRequest.getPassword());
+        consumerServiceimpl.updatePassword01(consumerRequest);
+
+        return R.success("密码修改成功");
+    }
+
+    /**
+     * 发送验证码功能
+     */
+    @GetMapping("/user/sendVerificationCode")
+    public R sendCode(@RequestParam String email){
+        Consumer user = consumerService.findByEmail(email);
+        if (user==null){
+            return R.fatal("用户不存在");
+        }
+        String code = RandomUtils.code();
+//        simpleOrderManager.sendCode(code,email);
+        //保存在redis中
+//        stringRedisTemplate.opsForValue().set("code",code,5, TimeUnit.MINUTES);
+        return R.success("发送成功");
+    }
+
+
+    /**
+     * TODO 管理界面调用
+     * 返回所有用户
+     */
+    @GetMapping("/user")
+    public R allUser() {
+        return consumerService.allUser();
+    }
+
+
+    /**
+     * TODO 用户界面调用
+     * 返回指定 ID 的用户
+     */
+    @GetMapping("/user/detail")
+    public R userOfId(@RequestParam int id) {
+        return consumerService.userOfId(id);
+    }
+
+    /**
+     * TODO 管理界面的调用
+     * 删除用户
+     */
+    @GetMapping("/user/delete")
+    public R deleteUser(@RequestParam int id) {
+        return consumerService.deleteUser(id);
+    }
+
+    /**
+     * TODO 前后台界面的调用
+     * 更新用户信息
+     */
+    @PostMapping("/user/update")
+    public R updateUserMsg(@RequestBody ConsumerRequest updateRequest) {
+        return consumerService.updateUserMsg(updateRequest);
+    }
+
+    /**
+     * TODO 前后台更新用户的密码
+     * 更新用户密码
+     */
+    @PostMapping("/user/updatePassword")
+    public R updatePassword(@RequestBody ConsumerRequest updatePasswordRequest) {
+        return consumerService.updatePassword(updatePasswordRequest);
+    }
+
+    /**
+     * 更新用户头像
+     */
+    @PostMapping("/user/avatar/update")
+    public R updateUserPic(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
+        return consumerService.updateUserAvator(avatorFile, id);
+    }
+
+}

+ 59 - 0
src/main/java/org/example/music/controller/FileDownloadController.java

@@ -0,0 +1,59 @@
+package org.example.music.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ByteArrayResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+@Controller
+@RequestMapping("/download")
+public class FileDownloadController {
+
+//    @Autowired
+//    private MinioClient minioClient;
+//    @Value("${minio.bucket-name}")
+//    private String bucketName;
+//
+//    @GetMapping("/{fileName}")
+//    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+//
+//        GetObjectArgs args = GetObjectArgs.builder()
+//                .bucket(bucketName)
+//                .object(fileName)
+//                .build();
+//        InputStream inputStream = minioClient.getObject(args);
+//
+//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+//        byte[] buffer = new byte[1024];
+//        int bytesRead;
+//        while ((bytesRead = inputStream.read(buffer)) != -1) {
+//            outputStream.write(buffer, 0, bytesRead);
+//        }
+//        byte[] musicBytes = outputStream.toByteArray();
+//        // 创建一个ByteArrayResource对象,用于包装字节数组
+//        ByteArrayResource resource = new ByteArrayResource(musicBytes);
+//        // 构建响应头
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
+//        // 返回一个 ResponseEntity 对象
+//        return ResponseEntity.ok()
+//                .headers(headers)
+//                .contentLength(musicBytes.length)
+//                .contentType(MediaType.APPLICATION_OCTET_STREAM)
+//                .body(resource);
+//    }
+ }

+ 77 - 0
src/main/java/org/example/music/controller/ListSongController.java

@@ -0,0 +1,77 @@
+package org.example.music.controller;
+
+import com.alibaba.excel.EasyExcel;
+import org.example.music.common.R;
+import org.example.music.model.domain.SongList;
+import org.example.music.model.request.ListSongRequest;
+import org.example.music.service.ListSongService;
+import org.example.music.service.SongListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.List;
+
+@RestController
+public class ListSongController {
+
+    @Autowired
+    private ListSongService listSongService;
+    @Autowired
+    private SongListService service;
+    // 给歌单添加歌曲
+    @PostMapping("/listSong/add")
+    public R addListSong(@RequestBody ListSongRequest addListSongRequest) {
+        return listSongService.addListSong(addListSongRequest);
+    }
+
+    // 删除歌单里的歌曲
+    @GetMapping("/listSong/delete")
+    public R deleteListSong(@RequestParam int songId) {
+        return listSongService.deleteListSong(songId);
+    }
+
+    // 返回歌单里指定歌单 ID 的歌曲
+    @GetMapping("/listSong/detail")
+    public R listSongOfSongId(@RequestParam int songListId) {
+        return listSongService.listSongOfSongId(songListId);
+    }
+
+    // 更新歌单里面的歌曲信息
+    @PostMapping("/listSong/update")
+    public R updateListSongMsg(@RequestBody ListSongRequest updateListSongRequest) {
+        return listSongService.updateListSongMsg(updateListSongRequest);
+    }
+    //导出歌单
+    @GetMapping("/excle")
+    public ResponseEntity<Resource> getExcle(HttpServletRequest request) throws IOException {
+        String fileName = "SongList" + System.currentTimeMillis() + ".xlsx";
+        EasyExcel.write(fileName, SongList.class).sheet("模板").doWrite(data());
+        File file = new File(fileName);
+        HttpHeaders headers = new HttpHeaders();
+        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName);
+
+        byte[] content = Files.readAllBytes(file.toPath());
+        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
+
+        return ResponseEntity.ok()
+                .headers(headers)
+                .contentLength(content.length)
+                .contentType(MediaType.APPLICATION_OCTET_STREAM)
+                .body(resource);
+    }
+    private List<SongList> data() {
+        List<SongList> allSong = service.findAllSong();
+        return allSong;
+    }
+
+}

+ 117 - 0
src/main/java/org/example/music/controller/MinioController.java

@@ -0,0 +1,117 @@
+package org.example.music.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+
+import java.io.InputStream;
+
+
+@Controller
+public class MinioController {
+//    @Value("${minio.bucket-name}")
+//    private String bucketName;
+//    @Autowired
+//    private MinioClient minioClient;
+//    //获取歌曲
+//    @GetMapping("/user01/{fileName:.+}")
+//    public ResponseEntity<byte[]> getMusic(@PathVariable String fileName) {
+//        try {
+//            GetObjectArgs args = GetObjectArgs.builder()
+//                    .bucket(bucketName)
+//                    .object(fileName)
+//                    .build();
+//            InputStream inputStream = minioClient.getObject(args);
+//
+//            // 将文件内容读取为字节数组
+//            byte[] bytes = IOUtils.toByteArray(inputStream);
+//
+//            // 设置响应头,指示浏览器如何处理响应内容
+//            HttpHeaders headers = new HttpHeaders();
+//            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
+//            headers.setContentDispositionFormData("attachment", fileName); // 如果需要下载文件,可以使用此头部
+//
+//            // 返回字节数组作为响应
+//            return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+//        }
+//    }
+//    //获取歌手图片
+//    @GetMapping("/user01/singer/img/{fileName:.+}")
+//    public ResponseEntity<byte[]> getImage(@PathVariable String fileName) throws Exception {
+//        InputStream stream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(bucketName)
+//                        .object("singer/img/"+fileName)
+//                        .build()
+//        );
+//
+//        byte[] bytes = IOUtils.toByteArray(stream);
+//
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.setContentType(MediaType.IMAGE_JPEG); // 设置响应内容类型为图片类型,根据实际情况修改
+//
+//        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+//    }
+//    //获取歌单图片
+//    @GetMapping("/user01/songlist/{fileName:.+}")
+//    public ResponseEntity<byte[]> getImage1(@PathVariable String fileName) throws Exception {
+//        InputStream stream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(bucketName)
+//                        .object("songlist/"+fileName)
+//                        .build()
+//        );
+//
+//        byte[] bytes = IOUtils.toByteArray(stream);
+//
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.setContentType(MediaType.IMAGE_JPEG); // 设置响应内容类型为图片类型,根据实际情况修改
+//
+//        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+//    }
+//    //获取歌的图片
+//    ///user01/singer/song/98329722.jfif
+//    @GetMapping("/user01/singer/song/{fileName:.+}")
+//    public ResponseEntity<byte[]> getImage2(@PathVariable String fileName) throws Exception {
+//        InputStream stream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(bucketName)
+//                        .object("singer/song/"+fileName)
+//                        .build()
+//        );
+//
+//        byte[] bytes = IOUtils.toByteArray(stream);
+//
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.setContentType(MediaType.IMAGE_JPEG); // 设置响应内容类型为图片类型,根据实际情况修改
+//
+//        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+//    }
+//    //获取头像
+//    ///img/avatorImages/
+//    @GetMapping("/img/avatorImages/{fileName:.+}")
+//    public ResponseEntity<byte[]> getImage3(@PathVariable String fileName) throws Exception {
+//        InputStream stream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(bucketName)
+//                        .object("img/avatorImages/"+fileName)
+//                        .build()
+//        );
+//
+//        byte[] bytes = IOUtils.toByteArray(stream);
+//
+//        HttpHeaders headers = new HttpHeaders();
+//        headers.setContentType(MediaType.IMAGE_JPEG); // 设置响应内容类型为图片类型,根据实际情况修改
+//
+//        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
+//    }
+}

+ 146 - 0
src/main/java/org/example/music/controller/MinioUploadController.java

@@ -0,0 +1,146 @@
+package org.example.music.controller;
+
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Properties;
+
+@Service
+public class MinioUploadController {
+
+//    private static MinioClient minioClient;
+//    private static String bucketName;
+//
+//    public static void init(){
+//        Properties properties = new Properties();
+//        try {
+//            // 使用类加载器获取资源文件的输入流
+//            InputStream inputStream = org.example.music.controller.MinioUploadController.class.getClassLoader().getResourceAsStream("application-dev.properties");
+//            if (inputStream != null) {
+//                properties.load(inputStream);
+//                String minioEndpoint = properties.getProperty("minio.endpoint");
+//                String minioAccessKey = properties.getProperty("minio.access-key");
+//                String minioSecretKey = properties.getProperty("minio.secret-key");
+//                String minioBucketName = properties.getProperty("minio.bucket-name");
+//                bucketName = minioBucketName;
+//                minioClient = MinioClient.builder()
+//                        .endpoint(minioEndpoint)
+//                        .credentials(minioAccessKey, minioSecretKey)
+//                        .build();
+//            }
+//        }catch (Exception e){
+//            System.out.println(e);
+//        }
+//    }
+//
+    public static String uploadFile(MultipartFile file) {
+//        try {
+//            init();
+//            InputStream inputStream = file.getInputStream();
+//            minioClient.putObject(
+//                    PutObjectArgs.builder()
+//                            .bucket(bucketName)
+//                            .object(file.getOriginalFilename())
+//                            .stream(inputStream, inputStream.available(), -1)
+//                            .contentType(file.getContentType())
+//                            .build()
+//            );
+//            return "File uploaded successfully!";
+//        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+//            e.printStackTrace();
+//            return "Error uploading file to MinIO: " + e.getMessage();
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        return "File uploaded successfully!";
+    }
+    public static String uploadImgFile(MultipartFile file) {
+//        try {
+//            init();
+//            InputStream inputStream = file.getInputStream();
+//            minioClient.putObject(
+//                    PutObjectArgs.builder()
+//                            .bucket(bucketName)
+//                            .object("/singer/img/"+file.getOriginalFilename())
+//                            .stream(inputStream, inputStream.available(), -1)
+//                            .contentType(file.getContentType())
+//                            .build()
+//            );
+//            return "File uploaded successfully!";
+//        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+//            e.printStackTrace();
+//            return "Error uploading file to MinIO: " + e.getMessage();
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        return "File uploaded successfully!";
+    }
+    public static String uploadSonglistImgFile(MultipartFile file) {
+//        try {
+//            init();
+//            InputStream inputStream = file.getInputStream();
+//            minioClient.putObject(
+//                    PutObjectArgs.builder()
+//                            .bucket(bucketName)
+//                            .object("/songlist/"+file.getOriginalFilename())
+//                            .stream(inputStream, inputStream.available(), -1)
+//                            .contentType(file.getContentType())
+//                            .build()
+//            );
+//            return "File uploaded successfully!";
+//        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+//            e.printStackTrace();
+//            return "Error uploading file to MinIO: " + e.getMessage();
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        return "File uploaded successfully!";
+    }
+    public static String uploadSongImgFile(MultipartFile file) {
+//        try {
+//            init();
+//            InputStream inputStream = file.getInputStream();
+//            minioClient.putObject(
+//                    PutObjectArgs.builder()
+//                            .bucket(bucketName)
+//                            .object("/singer/song/"+file.getOriginalFilename())
+//                            .stream(inputStream, inputStream.available(), -1)
+//                            .contentType(file.getContentType())
+//                            .build()
+//            );
+//            return "File uploaded successfully!";
+//        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+//            e.printStackTrace();
+//            return "Error uploading file to MinIO: " + e.getMessage();
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        return "File uploaded successfully!";
+    }
+//
+    public static String uploadAtorImgFile(MultipartFile file) {
+//        try {
+//            init();
+//            InputStream inputStream = file.getInputStream();
+//            minioClient.putObject(
+//                    PutObjectArgs.builder()
+//                            .bucket(bucketName)
+//                            .object("/img/avatorImages/"+file.getOriginalFilename())
+//                            .stream(inputStream, inputStream.available(), -1)
+//                            .contentType(file.getContentType())
+//                            .build()
+//            );
+//            return "File uploaded successfully!";
+//        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
+//            e.printStackTrace();
+//            return "Error uploading file to MinIO: " + e.getMessage();
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
+        return "File uploaded successfully!";
+    }
+}

+ 36 - 0
src/main/java/org/example/music/controller/RankListController.java

@@ -0,0 +1,36 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.RankListRequest;
+import org.example.music.service.RankListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+public class RankListController {
+
+    @Autowired
+    private RankListService rankListService;
+
+
+    // 提交评分
+    @PostMapping("/rankList/add")
+    public R addRank(@RequestBody RankListRequest rankListAddRequest) {
+        return rankListService.addRank(rankListAddRequest);
+    }
+
+    // 获取指定歌单的评分
+    @GetMapping("/rankList")
+    public R rankOfSongListId(@RequestParam Long songListId) {
+        return rankListService.rankOfSongListId(songListId);
+    }
+
+    // 获取指定用户的歌单评分
+    @GetMapping("/rankList/user")
+    public R getUserRank(@RequestParam(required = false) Long consumerId, @RequestParam Long songListId) {
+        R userRank = rankListService.getUserRank(consumerId, songListId);
+        return R.success("成功",userRank);
+    }
+
+
+}

+ 58 - 0
src/main/java/org/example/music/controller/SingerController.java

@@ -0,0 +1,58 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.SingerRequest;
+import org.example.music.service.SingerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+public class SingerController {
+
+    @Autowired
+    private SingerService singerService;
+
+
+    // 添加歌手
+    @PostMapping("/singer/add")
+    public R addSinger(@RequestBody SingerRequest addSingerRequest) {
+        return singerService.addSinger(addSingerRequest);
+    }
+
+    // 删除歌手
+    @DeleteMapping("/singer/delete")
+    public R deleteSinger(@RequestParam int id) {
+        return singerService.deleteSinger(id);
+    }
+
+    // 返回所有歌手
+    @GetMapping("/singer")
+    public R allSinger() {
+        return singerService.allSinger();
+    }
+
+    // 根据歌手名查找歌手
+    @GetMapping("/singer/name/detail")
+    public R singerOfName(@RequestParam String name) {
+        return singerService.singerOfName(name);
+    }
+
+    // 根据歌手性别查找歌手
+    @GetMapping("/singer/sex/detail")
+    public R singerOfSex(@RequestParam int sex) {
+        return singerService.singerOfSex(sex);
+    }
+
+    // 更新歌手信息
+    @PostMapping("/singer/update")
+    public R updateSingerMsg(@RequestBody SingerRequest updateSingerRequest) {
+        return singerService.updateSingerMsg(updateSingerRequest);
+    }
+
+    // 更新歌手头像
+    @PostMapping("/singer/avatar/update")
+    public R updateSingerPic(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
+        return singerService.updateSingerPic(avatorFile, id);
+    }
+}

+ 97 - 0
src/main/java/org/example/music/controller/SongController.java

@@ -0,0 +1,97 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.SongRequest;
+import org.example.music.service.SongService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.MultipartConfigFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.util.unit.DataSize;
+import org.springframework.util.unit.DataUnit;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.MultipartConfigElement;
+
+@RestController
+public class SongController {
+
+    @Autowired
+    private SongService songService;
+
+
+    @Bean
+    public MultipartConfigElement multipartConfigElement() {
+        MultipartConfigFactory factory = new MultipartConfigFactory();
+        // 文件最大10M,DataUnit提供5中类型B,KB,MB,GB,TB
+        factory.setMaxFileSize(DataSize.of(20, DataUnit.MEGABYTES));
+        // 设置总上传数据总大小10M
+        factory.setMaxRequestSize(DataSize.of(20, DataUnit.MEGABYTES));
+        return factory.createMultipartConfig();
+    }
+
+
+
+    // 添加歌曲
+    @PostMapping("/song/add")
+    public R addSong(SongRequest addSongRequest, @RequestParam("lrcfile") MultipartFile lrcfile, @RequestParam("file") MultipartFile mpfile) {
+        return songService.addSong(addSongRequest,lrcfile,mpfile);
+    }
+
+    // 删除歌曲
+    @DeleteMapping("/song/delete")
+    public R deleteSong(@RequestParam int id) {
+        return songService.deleteSong(id);
+    }
+
+    // 返回所有歌曲
+    @GetMapping("/song")
+    public R allSong() {
+        return songService.allSong();
+    }
+
+    //TODO ok
+    // 返回指定歌曲ID的歌曲
+    @GetMapping("/song/detail")
+    public R songOfId(@RequestParam int id) {
+        return songService.songOfId(id);
+    }
+
+    // 返回指定歌手ID的歌曲
+    @GetMapping("/song/singer/detail")
+    public R songOfSingerId(@RequestParam int singerId) {
+        return songService.songOfSingerId(singerId);
+    }
+
+
+    // 返回指定歌手名的歌曲
+    @GetMapping("/song/singerName/detail")
+    public R songOfSingerName(@RequestParam String name) {
+        return songService.songOfSingerName('%' + name + '%');
+    }
+
+    // 更新歌曲信息
+    @PostMapping("/song/update")
+    public R updateSongMsg(@RequestBody SongRequest updateSongRequest) {
+        return songService.updateSongMsg(updateSongRequest);
+    }
+
+    // 更新歌曲图片
+    @PostMapping("/song/img/update")
+    public R updateSongPic(@RequestParam("file") MultipartFile urlFile, @RequestParam("id") int id) {
+        return songService.updateSongPic(urlFile, id);
+    }
+
+    // 更新歌曲
+    @PostMapping("/song/url/update")
+    public R updateSongUrl(@RequestParam("file") MultipartFile urlFile, @RequestParam("id") int id) {
+        return songService.updateSongUrl(urlFile, id);
+    }
+    ///song/lrc/update
+    //更新歌词
+    @PostMapping("/song/lrc/update")
+    public R updateSongLrc(@RequestParam("file") MultipartFile lrcFile, @RequestParam("id") int id) {
+        return songService.updateSongLrc(lrcFile, id);
+    }
+
+}

+ 61 - 0
src/main/java/org/example/music/controller/SongListController.java

@@ -0,0 +1,61 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.SongListRequest;
+import org.example.music.service.SongListService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+@RestController
+public class SongListController {
+
+    @Autowired
+    private SongListService songListService;
+
+
+    // 添加歌单
+    @PostMapping("/songList/add")
+    public R addSongList(@RequestBody SongListRequest addSongListRequest) {
+        return songListService.addSongList(addSongListRequest);
+    }
+
+    // 删除歌单
+    @GetMapping("/songList/delete")
+    public R deleteSongList(@RequestParam int id) {
+        return songListService.deleteSongList(id);
+    }
+
+    //TODO 这块就是前端显现相应的歌单list
+    // 返回所有歌单
+    @GetMapping("/songList")
+    public R allSongList() {
+        return songListService.allSongList();
+    }
+
+    // 返回标题包含文字的歌单
+    @GetMapping("/songList/likeTitle/detail")
+    public R songListOfLikeTitle(@RequestParam String title) {
+        return songListService.likeTitle('%' + title + '%');
+    }
+
+    // 返回指定类型的歌单
+    @GetMapping("/songList/style/detail")
+    public R songListOfStyle(@RequestParam String style) {
+        return songListService.likeStyle('%' + style + '%');
+    }
+
+    // 更新歌单信息
+    @PostMapping("/songList/update")
+    public R updateSongListMsg(@RequestBody SongListRequest updateSongListRequest) {
+        return songListService.updateSongListMsg(updateSongListRequest);
+
+    }
+
+    // 更新歌单图片
+    @PostMapping("/songList/img/update")
+    public R updateSongListPic(@RequestParam("file") MultipartFile avatorFile, @RequestParam("id") int id) {
+
+        return songListService.updateSongListImg(avatorFile,id);
+    }
+}

+ 37 - 0
src/main/java/org/example/music/controller/UserSupportController.java

@@ -0,0 +1,37 @@
+package org.example.music.controller;
+
+import org.example.music.common.R;
+import org.example.music.model.request.UserSupportRequest;
+import org.example.music.service.UserSupportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/11 16:07
+ **/
+@RestController
+@RequestMapping("/userSupport")
+public class UserSupportController {
+
+    @Autowired
+    UserSupportService userSupportService;
+
+    @PostMapping("/test")
+    public R isUserSupportComment(@RequestBody UserSupportRequest userSupportRequest) {
+        return userSupportService.isUserSupportComment(userSupportRequest);
+    }
+
+    @PostMapping("/insert")
+    public R insertCommentSupport(@RequestBody UserSupportRequest userSupportRequest) {
+        return userSupportService.insertCommentSupport(userSupportRequest);
+    }
+
+    @PostMapping("/delete")
+    public R deleteCommentSupport(@RequestBody UserSupportRequest userSupportRequest) {
+        return userSupportService.deleteCommentSupport(userSupportRequest);
+    }
+}

+ 41 - 0
src/main/java/org/example/music/entity/Admin.java

@@ -0,0 +1,41 @@
+package org.example.music.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author lichen
+ * @since 2024-07-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("admin")
+@ApiModel(value="Admin", description="")
+public class Admin implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("name")
+    private String name;
+
+    @TableField("password")
+    private String password;
+
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/AdminMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Admin;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AdminMapper extends BaseMapper<Admin> {
+
+}

+ 15 - 0
src/main/java/org/example/music/mapper/BannerMapper.java

@@ -0,0 +1,15 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Banner;
+
+/**
+* @author asus
+* @description 针对表【banner】的数据库操作Mapper
+* @createDate 2022-06-13 13:13:42
+* @Entity generator.domain.Banner
+*/
+public interface BannerMapper extends BaseMapper<Banner> {
+
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/CollectMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Collect;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CollectMapper extends BaseMapper<Collect> {
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/CommentMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Comment;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CommentMapper extends BaseMapper<Comment> {
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/ConsumerMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Consumer;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ConsumerMapper extends BaseMapper<Consumer> {
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/ListSongMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.ListSong;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ListSongMapper extends BaseMapper<ListSong> {
+
+}

+ 25 - 0
src/main/java/org/example/music/mapper/RankListMapper.java

@@ -0,0 +1,25 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.RankList;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface RankListMapper extends BaseMapper<RankList> {
+
+    /**
+     * 查总分
+     * @param songListId
+     * @return
+     */
+    int selectScoreSum(Long songListId);
+
+    /**
+     * 查制定用户评分
+     * @param consumerId
+     * @param songListId
+     * @return
+     */
+    Integer selectUserRank(@Param("consumer_id") Long consumerId, @Param("song_list_id")  Long songListId);
+}

+ 10 - 0
src/main/java/org/example/music/mapper/SingerMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Singer;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SingerMapper extends BaseMapper<Singer> {
+
+}

+ 12 - 0
src/main/java/org/example/music/mapper/SongListMapper.java

@@ -0,0 +1,12 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.SongList;
+import org.springframework.stereotype.Repository;
+
+@Repository
+
+public interface SongListMapper extends BaseMapper<SongList> {
+
+
+}

+ 10 - 0
src/main/java/org/example/music/mapper/SongMapper.java

@@ -0,0 +1,10 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.Song;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SongMapper extends BaseMapper<Song> {
+
+}

+ 14 - 0
src/main/java/org/example/music/mapper/UserSupportMapper.java

@@ -0,0 +1,14 @@
+package org.example.music.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.example.music.model.domain.UserSupport;
+
+/**
+ * @author asus
+ * @description 针对表【user_support】的数据库操作Mapper
+ * @createDate 2022-06-11 16:06:28
+ * @Entity generator.domain.UserSupport
+ */
+public interface UserSupportMapper extends BaseMapper<UserSupport> {
+
+}

+ 23 - 0
src/main/java/org/example/music/model/domain/Admin.java

@@ -0,0 +1,23 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+@TableName(value = "admin")
+@Data
+public class Admin {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private String name;
+
+    private String password;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 62 - 0
src/main/java/org/example/music/model/domain/Banner.java

@@ -0,0 +1,62 @@
+package org.example.music.model.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @TableName banner
+ */
+@Data
+public class Banner implements Serializable {
+    /**
+     * 
+     */
+    private Integer id;
+
+    /**
+     * 
+     */
+    private String pic;
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        Banner other = (Banner) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getPic() == null ? other.getPic() == null : this.getPic().equals(other.getPic()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getPic() == null) ? 0 : getPic().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", pic=").append(pic);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 32 - 0
src/main/java/org/example/music/model/domain/Collect.java

@@ -0,0 +1,32 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+@TableName(value = "collect")
+@Data
+public class Collect {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer userId;
+
+    private Byte type;
+
+    private Integer songId;
+
+    private Integer songListId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+
+}

+ 35 - 0
src/main/java/org/example/music/model/domain/Comment.java

@@ -0,0 +1,35 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+@TableName(value = "comment")
+@Data
+public class Comment {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer userId;
+
+    private Integer songId;
+
+    private Integer songListId;
+
+    private String content;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    private Byte type;
+
+    private Integer up;
+
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 43 - 0
src/main/java/org/example/music/model/domain/Consumer.java

@@ -0,0 +1,43 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+@TableName(value = "consumer")
+@Data
+public class Consumer {
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private String username;
+
+    private String password;
+
+    private Byte sex;
+
+    private String phoneNum;
+    @TableField(value = "email")
+    private String email;
+
+    private Date birth;
+
+    private String introduction;
+
+    private String location;
+
+    private String avator;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 26 - 0
src/main/java/org/example/music/model/domain/ListSong.java

@@ -0,0 +1,26 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.io.Serializable;
+
+@TableName(value = "list_song")
+@Data
+public class ListSong implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer songId;
+
+    private Integer songListId;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 14 - 0
src/main/java/org/example/music/model/domain/Order.java

@@ -0,0 +1,14 @@
+package org.example.music.model.domain;
+ 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Order {
+    private int id;
+    private String name;
+    private String password;
+}

+ 23 - 0
src/main/java/org/example/music/model/domain/RankList.java

@@ -0,0 +1,23 @@
+package org.example.music.model.domain;
+
+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;
+
+@TableName(value = "rank_list")
+@Data
+public class RankList implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    private Long songListId;
+
+    private Long consumerId;
+
+    private Integer score;
+
+}

+ 17 - 0
src/main/java/org/example/music/model/domain/ResetPasswordRequest.java

@@ -0,0 +1,17 @@
+package org.example.music.model.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ToString
+public class ResetPasswordRequest {
+    private String email;
+    private String code;
+    private String password;
+    private String confirmPassword;
+}

+ 34 - 0
src/main/java/org/example/music/model/domain/Singer.java

@@ -0,0 +1,34 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+@TableName(value = "singer")
+@Data
+public class Singer {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private String name;
+
+    private Byte sex;
+
+    private String pic;
+
+    private Date birth;
+
+    private String location;
+
+    private String introduction;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 38 - 0
src/main/java/org/example/music/model/domain/Song.java

@@ -0,0 +1,38 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.Date;
+
+@TableName(value = "song")
+@Data
+public class Song {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private Integer singerId;
+
+    private String name;
+
+    private String introduction;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    private String pic;
+
+    private String lyric;
+
+    private String url;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 28 - 0
src/main/java/org/example/music/model/domain/SongList.java

@@ -0,0 +1,28 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+@TableName(value = "song_list")
+@Data
+public class SongList {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    private String title;
+
+    private String pic;
+
+    private String style;
+
+    private String introduction;
+
+    @Override
+    public String toString() {
+        return ToStringBuilder.reflectionToString(this);
+    }
+}

+ 73 - 0
src/main/java/org/example/music/model/domain/UserSupport.java

@@ -0,0 +1,73 @@
+package org.example.music.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * @TableName user_support
+ */
+@Data
+public class UserSupport implements Serializable {
+    /**
+     * 
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 
+     */
+    private Integer commentId;
+
+    /**
+     * 
+     */
+    private Integer userId;
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        UserSupport other = (UserSupport) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getCommentId() == null ? other.getCommentId() == null : this.getCommentId().equals(other.getCommentId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getCommentId() == null) ? 0 : getCommentId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", commentId=").append(commentId);
+        sb.append(", userId=").append(userId);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 16 - 0
src/main/java/org/example/music/model/request/AdminRequest.java

@@ -0,0 +1,16 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 18:44
+ **/
+@Data
+public class AdminRequest {
+    private Integer id;
+
+    private String username;
+
+    private String password;
+}

+ 29 - 0
src/main/java/org/example/music/model/request/CollectRequest.java

@@ -0,0 +1,29 @@
+package org.example.music.model.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 13:11
+ **/
+@Data
+@ApiModel(value = "CollectRequest", description = "新增收藏")
+public class CollectRequest {
+    private Integer id;
+
+    @ApiModelProperty(value = "用户id", example = "")
+    private Integer userId;
+
+    private Byte type;
+
+    @ApiModelProperty(value = "歌曲id", example = "")
+    private Integer songId;
+
+    private Integer songListId;
+
+    private Date createTime;
+}

+ 28 - 0
src/main/java/org/example/music/model/request/CommentRequest.java

@@ -0,0 +1,28 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 14:29
+ **/
+@Data
+public class CommentRequest {
+    private Integer id;
+
+    private Integer userId;
+
+    private Integer songId;
+
+    private Integer songListId;
+
+    private String content;
+
+    private Date createTime;
+
+    private Byte nowType;
+
+    private Integer up;//点赞
+}

+ 37 - 0
src/main/java/org/example/music/model/request/ConsumerRequest.java

@@ -0,0 +1,37 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/5 19:35
+ * 这块 现在尝试把所有有关用户的属性都放入
+ **/
+@Data
+public class ConsumerRequest {
+    private Integer id;
+
+    private String username;
+
+    private String oldPassword; //因为会用到用户旧密码 这无所谓的对应即可
+
+    private String password;
+
+    private Byte sex;
+
+    private String phoneNum;
+
+    private String email;
+
+    private Date birth;
+
+    private String introduction;
+
+    private String location;
+
+    private String avator;
+
+    private Date createTime;
+}

+ 16 - 0
src/main/java/org/example/music/model/request/ListSongRequest.java

@@ -0,0 +1,16 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 20:38
+ **/
+@Data
+public class ListSongRequest {
+    private Integer id;
+
+    private Integer songId;
+
+    private Integer songListId;
+}

+ 18 - 0
src/main/java/org/example/music/model/request/RankListRequest.java

@@ -0,0 +1,18 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 16:57
+ **/
+@Data
+public class RankListRequest {
+    private Long id;
+
+    private Long songListId;
+
+    private Long consumerId;
+
+    private Integer score;
+}

+ 26 - 0
src/main/java/org/example/music/model/request/SingerRequest.java

@@ -0,0 +1,26 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 20:14
+ **/
+@Data
+public class SingerRequest {
+    private Integer id;
+
+    private String name;
+
+    private Byte sex;
+
+    private String pic;
+
+    private Date birth;
+
+    private String location;
+
+    private String introduction;
+}

+ 20 - 0
src/main/java/org/example/music/model/request/SongListRequest.java

@@ -0,0 +1,20 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 20:38
+ **/
+@Data
+public class SongListRequest {
+    private Integer id;
+
+    private String title;
+
+    private String pic;
+
+    private String style;
+
+    private String introduction;
+}

+ 31 - 0
src/main/java/org/example/music/model/request/SongRequest.java

@@ -0,0 +1,31 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/6 19:11
+ **/
+@Data
+public class SongRequest {
+
+    private Integer id;
+
+    private Integer singerId;
+
+    private String name;
+
+    private String introduction;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private String pic;
+
+    private String lyric;
+
+    private String url;
+}

+ 14 - 0
src/main/java/org/example/music/model/request/UserSupportRequest.java

@@ -0,0 +1,14 @@
+package org.example.music.model.request;
+
+import lombok.Data;
+
+/**
+ * @Author 祝英台炸油条
+ * @Time : 2022/6/11 16:08
+ **/
+@Data
+public class UserSupportRequest {
+    Integer id;
+    Integer commentId;
+    Integer userId;
+}

+ 13 - 0
src/main/java/org/example/music/service/AdminService.java

@@ -0,0 +1,13 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Admin;
+import org.example.music.model.request.AdminRequest;
+
+import javax.servlet.http.HttpSession;
+
+public interface AdminService extends IService<Admin> {
+
+    R verityPasswd(AdminRequest adminRequest, HttpSession session);
+}

+ 17 - 0
src/main/java/org/example/music/service/BannerService.java

@@ -0,0 +1,17 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.model.domain.Banner;
+
+import java.util.List;
+
+/**
+* @author asus
+* @description 针对表【banner】的数据库操作Service
+* @createDate 2022-06-13 13:13:42
+*/
+public interface BannerService extends IService<Banner> {
+
+    List<Banner> getAllBanner();
+
+}

+ 17 - 0
src/main/java/org/example/music/service/CollectService.java

@@ -0,0 +1,17 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Collect;
+import org.example.music.model.request.CollectRequest;
+
+public interface CollectService extends IService<Collect> {
+
+    R addCollection(CollectRequest addCollectRequest);
+
+    R existSongId(CollectRequest isCollectRequest);
+
+    R deleteCollect(Integer userId,Integer songId);
+
+    R collectionOfUser(Integer userId);
+}

+ 20 - 0
src/main/java/org/example/music/service/CommentService.java

@@ -0,0 +1,20 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Comment;
+import org.example.music.model.request.CommentRequest;
+
+public interface CommentService extends IService<Comment> {
+
+    R addComment(CommentRequest addCommentRequest);
+
+    R updateCommentMsg(CommentRequest upCommentRequest);
+
+    R deleteComment(Integer id);
+
+    R commentOfSongId(Integer songId);
+
+    R commentOfSongListId(Integer songListId);
+
+}

+ 35 - 0
src/main/java/org/example/music/service/ConsumerService.java

@@ -0,0 +1,35 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Consumer;
+import org.example.music.model.request.ConsumerRequest;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+
+public interface ConsumerService extends IService<Consumer> {
+
+    R addUser(ConsumerRequest registryRequest);
+
+    R updateUserMsg(ConsumerRequest updateRequest);
+
+    R updateUserAvator(MultipartFile avatorFile, int id);
+
+    R updatePassword(ConsumerRequest updatePasswordRequest);
+
+    boolean existUser(String username);
+
+    boolean verityPasswd(String username, String password);
+
+    R deleteUser(Integer id);
+
+    R allUser();
+
+    R userOfId(Integer id);
+
+    R loginStatus(ConsumerRequest loginRequest, HttpSession session);
+    R loginEmailStatus(ConsumerRequest loginRequest, HttpSession session);
+    Consumer findByEmail (String email);
+    R updatePassword01(ConsumerRequest updatePasswordRequest);
+}

+ 22 - 0
src/main/java/org/example/music/service/ListSongService.java

@@ -0,0 +1,22 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.ListSong;
+import org.example.music.model.request.ListSongRequest;
+
+import java.util.List;
+
+public interface ListSongService extends IService<ListSong> {
+
+    R addListSong(ListSongRequest addListSongRequest);
+
+    R updateListSongMsg(ListSongRequest updateListSongRequest);
+
+    R deleteListSong(Integer songId);
+
+    //看看这啥
+    List<ListSong> allListSong();
+
+    R listSongOfSongId(Integer songListId);
+}

+ 8 - 0
src/main/java/org/example/music/service/OrderManager.java

@@ -0,0 +1,8 @@
+package org.example.music.service;
+
+import org.example.music.model.domain.Order;
+
+public interface OrderManager {
+//    void sendPassword(Order order,String reciveAddress);
+//    void sendCode(String code,String reciveAddress);
+}

+ 16 - 0
src/main/java/org/example/music/service/RankListService.java

@@ -0,0 +1,16 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.RankList;
+import org.example.music.model.request.RankListRequest;
+
+public interface RankListService extends IService<RankList> {
+
+    R addRank(RankListRequest rankListAddRequest);
+
+    R rankOfSongListId(Long songListId);
+
+    R getUserRank(Long consumerId, Long songListId);
+
+}

+ 24 - 0
src/main/java/org/example/music/service/SingerService.java

@@ -0,0 +1,24 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Singer;
+import org.example.music.model.request.SingerRequest;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface SingerService extends IService<Singer> {
+
+    R addSinger (SingerRequest addSingerRequest);
+
+    R updateSingerMsg(SingerRequest updateSingerRequest);
+
+    R updateSingerPic(MultipartFile avatorFile, int id);
+
+    R deleteSinger(Integer id);
+
+    R allSinger();
+
+    R singerOfName(String name);
+
+    R singerOfSex(Integer sex);
+}

+ 28 - 0
src/main/java/org/example/music/service/SongListService.java

@@ -0,0 +1,28 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.SongList;
+import org.example.music.model.request.SongListRequest;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+public interface SongListService extends IService<SongList> {
+
+    R addSongList(SongListRequest addSongListRequest);
+
+    R updateSongListMsg(SongListRequest updateSongListRequest);
+
+    R updateSongListImg(MultipartFile avatorFile, int id);
+
+    R deleteSongList(Integer id);
+
+    R allSongList();
+
+    List<SongList> findAllSong();
+
+    R likeTitle(String title);
+
+    R likeStyle(String style);
+}

+ 30 - 0
src/main/java/org/example/music/service/SongService.java

@@ -0,0 +1,30 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.Song;
+import org.example.music.model.request.SongRequest;
+import org.springframework.web.multipart.MultipartFile;
+
+public interface SongService extends IService<Song> {
+
+    R addSong (SongRequest addSongRequest, MultipartFile lrcfile, MultipartFile mpfile);
+
+    R updateSongMsg(SongRequest updateSongRequest);
+
+    R updateSongUrl(MultipartFile urlFile, int id);
+
+    R updateSongPic(MultipartFile urlFile, int id);
+
+    R deleteSong(Integer id);
+
+    R allSong();
+
+    R songOfSingerId(Integer singerId);
+
+    R songOfId(Integer id);
+
+    R songOfSingerName(String name);
+
+    R updateSongLrc(MultipartFile lrcFile, int id);
+}

+ 20 - 0
src/main/java/org/example/music/service/UserSupportService.java

@@ -0,0 +1,20 @@
+package org.example.music.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.example.music.common.R;
+import org.example.music.model.domain.UserSupport;
+import org.example.music.model.request.UserSupportRequest;
+
+/**
+ * @author asus
+ * @description 针对表【user_support】的数据库操作Service
+ * @createDate 2022-06-11 16:06:28
+ */
+public interface UserSupportService extends IService<UserSupport> {
+
+    R isUserSupportComment(UserSupportRequest userSupportRequest);
+
+    R insertCommentSupport(UserSupportRequest userSupportRequest);
+
+    R deleteCommentSupport(UserSupportRequest userSupportRequest);
+}

+ 33 - 0
src/main/java/org/example/music/service/impl/AdminServiceImpl.java

@@ -0,0 +1,33 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.AdminMapper;
+import org.example.music.model.domain.Admin;
+import org.example.music.model.request.AdminRequest;
+import org.example.music.service.AdminService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpSession;
+
+@Service
+public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements AdminService {
+
+    @Autowired
+    private AdminMapper adminMapper;
+
+    @Override
+    public R verityPasswd(AdminRequest adminRequest, HttpSession session) {
+        QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("name",adminRequest.getUsername());
+        queryWrapper.eq("password",adminRequest.getPassword());
+        if (adminMapper.selectCount(queryWrapper) > 0) {
+            session.setAttribute("name", adminRequest.getUsername());
+            return R.success("登录成功");
+        } else {
+            return R.error("用户名或密码错误");
+        }
+    }
+}

+ 31 - 0
src/main/java/org/example/music/service/impl/BannerServiceImpl.java

@@ -0,0 +1,31 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.mapper.BannerMapper;
+import org.example.music.model.domain.Banner;
+import org.example.music.service.BannerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author asus
+ * @description 针对表【banner】的数据库操作Service实现
+ * @createDate 2022-06-13 13:13:42
+ */
+@Service
+public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner>
+        implements BannerService {
+
+    @Autowired
+    private BannerMapper bannerMapper;
+
+    @Cacheable(value = "banner", key = "'list'")  //放在缓存中 redis 是以key-value进行存储的
+    @Override
+    public List<Banner> getAllBanner() {
+        System.out.println("没有走缓存");
+        return bannerMapper.selectList(null);
+    }
+}

+ 61 - 0
src/main/java/org/example/music/service/impl/CollectServiceImpl.java

@@ -0,0 +1,61 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.CollectMapper;
+import org.example.music.model.domain.Collect;
+import org.example.music.model.request.CollectRequest;
+import org.example.music.service.CollectService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CollectServiceImpl extends ServiceImpl<CollectMapper, Collect> implements CollectService {
+    @Autowired
+    private CollectMapper collectMapper;
+
+    @Override
+    public R addCollection(CollectRequest addCollectRequest) {
+        //作者用type来判断收藏的是歌还是歌单
+        Collect collect = new Collect();
+        BeanUtils.copyProperties(addCollectRequest, collect);
+        if (collectMapper.insert(collect) > 0) {
+            return R.success("收藏成功", true);
+        } else {
+            return R.error("收藏失败");
+        }
+    }
+
+    @Override
+    public R existSongId(CollectRequest isCollectRequest) {
+        QueryWrapper<Collect> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("user_id",isCollectRequest.getUserId());
+        queryWrapper.eq("song_id",isCollectRequest.getSongId());
+        if (collectMapper.selectCount(queryWrapper) > 0) {
+            return R.success("已收藏", true);
+        } else {
+            return R.success("未收藏", false);
+        }
+    }
+
+    @Override
+    public R deleteCollect(Integer userId, Integer songId) {
+        QueryWrapper<Collect> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("user_id",userId);
+        queryWrapper.eq("song_id",songId);
+        if (collectMapper.delete(queryWrapper) > 0) {
+            return R.success("取消收藏", false);
+        } else {
+            return R.error("取消收藏失败");
+        }
+    }
+
+    @Override
+    public R collectionOfUser(Integer userId) {
+        QueryWrapper<Collect> queryWrapper = new QueryWrapper();
+        queryWrapper.eq("user_id",userId);
+        return R.success("用户收藏", collectMapper.selectList(queryWrapper));
+    }
+}

+ 65 - 0
src/main/java/org/example/music/service/impl/CommentServiceImpl.java

@@ -0,0 +1,65 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.CommentMapper;
+import org.example.music.model.domain.Comment;
+import org.example.music.model.request.CommentRequest;
+import org.example.music.service.CommentService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService {
+    @Autowired
+    private CommentMapper commentMapper;
+
+    @Override
+    public R addComment(CommentRequest addCommentRequest) {
+        Comment comment = new Comment();
+        BeanUtils.copyProperties(addCommentRequest, comment);
+        comment.setType(addCommentRequest.getNowType());
+        if (commentMapper.insert(comment) > 0) {
+            return R.success("评论成功");
+        } else {
+            return R.error("评论失败");
+        }
+    }
+
+    @Override
+    public R updateCommentMsg(CommentRequest addCommentRequest) {
+        Comment comment = new Comment();
+        BeanUtils.copyProperties(addCommentRequest, comment);
+        if (commentMapper.updateById(comment) > 0) {
+            return R.success("点赞成功");
+        } else {
+            return R.error("点赞失败");
+        }
+    }
+
+    //    删除评论
+    @Override
+    public R deleteComment(Integer id) {
+        if (commentMapper.deleteById(id) > 0) {
+            return R.success("删除成功");
+        } else {
+            return R.error("删除失败");
+        }
+    }
+
+    @Override
+    public R commentOfSongId(Integer songId) {
+        QueryWrapper<Comment> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("song_id",songId);
+        return R.success(null, commentMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R commentOfSongListId(Integer songListId) {
+        QueryWrapper<Comment> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("song_list_id",songListId);
+        return R.success(null, commentMapper.selectList(queryWrapper));
+    }
+}

+ 214 - 0
src/main/java/org/example/music/service/impl/ConsumerServiceImpl.java

@@ -0,0 +1,214 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.controller.MinioUploadController;
+import org.example.music.mapper.ConsumerMapper;
+import org.example.music.model.domain.Consumer;
+import org.example.music.model.request.ConsumerRequest;
+import org.example.music.service.ConsumerService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpSession;
+import java.nio.charset.StandardCharsets;
+
+import static org.example.music.constant.Constants.SALT;
+
+@Service
+public class ConsumerServiceImpl extends ServiceImpl<ConsumerMapper, Consumer>
+        implements ConsumerService {
+
+    @Autowired
+    private ConsumerMapper consumerMapper;
+
+
+    /**
+     * 新增用户
+     */
+    @Override
+    public R addUser(ConsumerRequest registryRequest) {
+        if (this.existUser(registryRequest.getUsername())) {
+            return R.warning("用户名已注册");
+        }
+        Consumer consumer = new Consumer();
+        BeanUtils.copyProperties(registryRequest, consumer);
+        //MD5加密
+        String password = DigestUtils.md5DigestAsHex((SALT + registryRequest.getPassword()).getBytes(StandardCharsets.UTF_8));
+        consumer.setPassword(password);
+        //都用用
+        if (StringUtils.isBlank(consumer.getPhoneNum())) {
+            consumer.setPhoneNum(null);
+        }
+        if ("".equals(consumer.getEmail())) {
+            consumer.setEmail(null);
+        }
+        consumer.setAvator("img/avatorImages/user.jpg");
+        try {
+            QueryWrapper<Consumer> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("email",consumer.getEmail());
+            Consumer one = consumerMapper.selectOne(queryWrapper);
+            if (one!=null){
+                return R.fatal("邮箱不允许重复");
+            }
+            if (consumerMapper.insert(consumer) > 0) {
+                return R.success("注册成功");
+            } else {
+                return R.error("注册失败");
+            }
+        } catch (DuplicateKeyException e) {
+            return R.fatal(e.getMessage());
+        }
+    }
+
+    @Override
+    public R updateUserMsg(ConsumerRequest updateRequest) {
+        Consumer consumer = new Consumer();
+        BeanUtils.copyProperties(updateRequest, consumer);
+        if (consumerMapper.updateById(consumer) > 0) {
+            return R.success("修改成功");
+        } else {
+            return R.error("修改失败");
+        }
+    }
+
+    @Override
+    public R updatePassword(ConsumerRequest updatePasswordRequest) {
+
+       if (!this.verityPasswd(updatePasswordRequest.getUsername(),updatePasswordRequest.getOldPassword())) {
+            return R.error("密码输入错误");
+        }
+
+        Consumer consumer = new Consumer();
+        consumer.setId(updatePasswordRequest.getId());
+        String secretPassword = DigestUtils.md5DigestAsHex((SALT + updatePasswordRequest.getPassword()).getBytes(StandardCharsets.UTF_8));
+        consumer.setPassword(secretPassword);
+
+        if (consumerMapper.updateById(consumer) > 0) {
+            return R.success("密码修改成功");
+        } else {
+            return R.error("密码修改失败");
+        }
+    }
+
+    /**
+     * 缩减验证
+     * @param updatePasswordRequest
+     * @return
+     */
+    @Override
+    public R updatePassword01(ConsumerRequest updatePasswordRequest) {
+        Consumer consumer = new Consumer();
+        consumer.setId(updatePasswordRequest.getId());
+        String secretPassword = DigestUtils.md5DigestAsHex((SALT + updatePasswordRequest.getPassword()).getBytes(StandardCharsets.UTF_8));
+        consumer.setPassword(secretPassword);
+
+        if (consumerMapper.updateById(consumer) > 0) {
+            return R.success("密码修改成功");
+        } else {
+            return R.error("密码修改失败");
+        }
+    }
+
+
+    @Override
+    public R updateUserAvator(MultipartFile avatorFile, int id) {
+        String fileName = avatorFile.getOriginalFilename();
+        String imgPath = "/img/avatorImages/" + fileName;
+        Consumer consumer = new Consumer();
+        consumer.setId(id);
+        consumer.setAvator(imgPath);
+        String s = MinioUploadController.uploadAtorImgFile(avatorFile);
+        if (s.equals("File uploaded successfully!")&&consumerMapper.updateById(consumer) > 0) {
+            return R.success("上传成功", imgPath);
+        } else {
+            return R.error("上传失败");
+        }
+    }
+
+    @Override
+    public boolean existUser(String username) {
+        QueryWrapper<Consumer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("username",username);
+        return consumerMapper.selectCount(queryWrapper) > 0;
+    }
+
+    @Override
+    public boolean verityPasswd(String username, String password) {
+        QueryWrapper<Consumer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("username",username);
+        String secretPassword = DigestUtils.md5DigestAsHex((SALT + password).getBytes(StandardCharsets.UTF_8));
+
+        queryWrapper.eq("password",secretPassword);
+        return consumerMapper.selectCount(queryWrapper) > 0;
+    }
+
+
+    // 删除用户
+    @Override
+    public R deleteUser(Integer id) {
+        if (consumerMapper.deleteById(id) > 0) {
+            return R.success("删除成功");
+        } else {
+            return R.error("删除失败");
+        }
+    }
+
+    @Override
+    public R allUser() {
+        return R.success(null, consumerMapper.selectList(null));
+    }
+
+    @Override
+    public R userOfId(Integer id) {
+        QueryWrapper<Consumer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id",id);
+        return R.success(null, consumerMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R loginStatus(ConsumerRequest loginRequest, HttpSession session) {
+
+        String username = loginRequest.getUsername();
+        String password = loginRequest.getPassword();
+
+        if (this.verityPasswd(username, password)) {
+            session.setAttribute("username", username);
+            Consumer consumer = new Consumer();
+            consumer.setUsername(username);
+            return R.success("登录成功", consumerMapper.selectList(new QueryWrapper<>(consumer)));
+        } else {
+            return R.error("用户名或密码错误");
+        }
+    }
+
+    @Override
+    public R loginEmailStatus(ConsumerRequest loginRequest, HttpSession session) {
+        String email = loginRequest.getEmail();
+        String password = loginRequest.getPassword();
+        Consumer consumer1 = findByEmail(email);
+        if (this.verityPasswd(consumer1.getUsername(), password)) {
+            session.setAttribute("username", consumer1.getUsername());
+            Consumer consumer = new Consumer();
+            consumer.setUsername(consumer1.getUsername());
+            return R.success("登录成功", consumerMapper.selectList(new QueryWrapper<>(consumer)));
+        } else {
+            return R.error("用户名或密码错误");
+        }
+    }
+
+    @Override
+    public Consumer findByEmail(String email) {
+        QueryWrapper<Consumer> queryWrapper=new QueryWrapper<>();
+        queryWrapper.eq("email",email);
+        Consumer consumer = consumerMapper.selectOne(queryWrapper);
+        return consumer;
+    }
+
+}

+ 67 - 0
src/main/java/org/example/music/service/impl/ListSongServiceImpl.java

@@ -0,0 +1,67 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.ListSongMapper;
+import org.example.music.model.domain.ListSong;
+import org.example.music.model.request.ListSongRequest;
+import org.example.music.service.ListSongService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ListSongServiceImpl extends ServiceImpl<ListSongMapper, ListSong> implements ListSongService {
+
+    @Autowired
+    private ListSongMapper listSongMapper;
+
+    @Override
+    public List<ListSong> allListSong() {
+        return listSongMapper.selectList(null);
+    }
+
+    @Override
+    public R updateListSongMsg(ListSongRequest updateListSongRequest) {
+        ListSong listSong = new ListSong();
+        BeanUtils.copyProperties(updateListSongRequest, listSong);
+        if (listSongMapper.updateById(listSong) > 0) {
+            return R.success("修改成功");
+        } else {
+            return R.error("修改失败");
+        }
+    }
+
+    @Override
+    public R deleteListSong(Integer songId) {
+        QueryWrapper<ListSong> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("song_id",songId);
+        if (listSongMapper.delete(queryWrapper) > 0) {
+            return R.success("删除成功");
+        } else {
+            return R.error("删除失败");
+        }
+    }
+
+    @Override
+    public R addListSong(ListSongRequest addListSongRequest) {
+        ListSong listSong = new ListSong();
+        BeanUtils.copyProperties(addListSongRequest, listSong);
+        if (listSongMapper.insert(listSong) > 0) {
+            return R.success("添加成功");
+        } else {
+            return R.error("添加失败");
+        }
+    }
+
+    @Override
+    public R listSongOfSongId(Integer songListId) {
+        QueryWrapper<ListSong> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("song_list_id",songListId);
+        return R.success("查询成功", listSongMapper.selectList(queryWrapper));
+    }
+
+}

+ 49 - 0
src/main/java/org/example/music/service/impl/RankListServiceImpl.java

@@ -0,0 +1,49 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.RankListMapper;
+import org.example.music.model.domain.RankList;
+import org.example.music.model.request.RankListRequest;
+import org.example.music.service.RankListService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Administrator
+ */
+@Service
+public class RankListServiceImpl extends ServiceImpl<RankListMapper, RankList> implements RankListService {
+
+
+    @Autowired
+    private RankListMapper rankMapper;
+
+    @Override
+    public R addRank(RankListRequest rankListAddRequest) {
+        RankList rankList = new RankList();
+        BeanUtils.copyProperties(rankListAddRequest, rankList);
+        if (rankMapper.insert(rankList) > 0) {
+            return R.success("评价成功");
+        } else {
+            return R.error("评价失败");
+        }
+    }
+
+    @Override
+    public R rankOfSongListId(Long songListId) {
+        // 评分总人数如果为 0,则返回0;否则返回计算出的结果
+        QueryWrapper<RankList> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("song_list_id",songListId);
+        Long rankNum = rankMapper.selectCount(queryWrapper);
+        return R.success(null, (rankNum <= 0) ? 0 : rankMapper.selectScoreSum(songListId) / rankNum);
+    }
+
+    @Override
+    public R getUserRank(Long consumerId, Long songListId) {
+        Integer i = rankMapper.selectUserRank(consumerId, songListId);
+        return R.success(null, i);
+    }
+}

+ 57 - 0
src/main/java/org/example/music/service/impl/SimpleOrderManager.java

@@ -0,0 +1,57 @@
+package org.example.music.service.impl;
+
+import org.example.music.model.domain.Order;
+import org.example.music.service.OrderManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 邮箱信息的发送
+ */
+
+@Service
+public class SimpleOrderManager implements OrderManager {
+
+//    @Value("${mail.address}")
+//    private String sendAddress;
+
+//    @Autowired
+//    private JavaMailSender mailSender;
+//
+//    public void setMailSender(JavaMailSender mailSender) {
+//        this.mailSender = mailSender;
+//    }
+//
+//    public void sendPassword(Order order, String reciveAddress) {
+//        MimeMessagePreparator preparator = new MimeMessagePreparator() {
+//            public void prepare(@NotNull MimeMessage mimeMessage) throws Exception {
+//                mimeMessage.setRecipient(Message.RecipientType.TO,
+//                        new InternetAddress(reciveAddress));
+//                mimeMessage.setFrom(new InternetAddress(sendAddress));
+//                mimeMessage.setText("Dear " + order.getName() + "\n" +
+//                        "Your  password is :" + order.getPassword() + ".");
+//            }
+//        };
+//
+//        try {
+//            this.mailSender.send(preparator);
+//        } catch (MailException ex) {
+//
+//            System.err.println(ex.getMessage());
+//        }
+//    }
+//
+//    public void sendCode(String code, String reciveAddress) {
+//        MimeMessagePreparator preparator = new MimeMessagePreparator() {
+//            public void prepare(@NotNull MimeMessage mimeMessage) throws Exception {
+//                mimeMessage.setRecipient(Message.RecipientType.TO,
+//                        new InternetAddress(reciveAddress));
+//                mimeMessage.setFrom(new InternetAddress(sendAddress));
+//                mimeMessage.setText("Dear you code is " + code);
+//            }
+//        };
+//        this.mailSender.send(preparator);
+//    }
+}

+ 88 - 0
src/main/java/org/example/music/service/impl/SingerServiceImpl.java

@@ -0,0 +1,88 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.controller.MinioUploadController;
+import org.example.music.mapper.SingerMapper;
+import org.example.music.model.domain.Singer;
+import org.example.music.model.request.SingerRequest;
+import org.example.music.service.SingerService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+@Service
+public class SingerServiceImpl extends ServiceImpl<SingerMapper, Singer> implements SingerService {
+
+    @Autowired
+    private SingerMapper singerMapper;
+
+    @Override
+    public R updateSingerMsg(SingerRequest updateSingerRequest) {
+        Singer singer = new Singer();
+        BeanUtils.copyProperties(updateSingerRequest, singer);
+        if (singerMapper.updateById(singer) > 0) {
+            return R.success("修改成功");
+        } else {
+            return R.error("修改失败");
+        }
+    }
+
+    @Override
+    public R updateSingerPic(MultipartFile avatorFile, int id) {
+        String fileName =  avatorFile.getOriginalFilename();
+        MinioUploadController.uploadImgFile(avatorFile);
+        String imgPath = "/user01/singer/img/" + fileName;
+        Singer singer = new Singer();
+        singer.setId(id);
+        singer.setPic(imgPath);
+        if (singerMapper.updateById(singer) > 0) {
+            return R.success("上传成功", imgPath);
+        } else {
+            return R.error("上传失败");
+        }
+    }
+
+    @Override
+    public R deleteSinger(Integer id) {
+        if (singerMapper.deleteById(id) > 0) {
+            return R.success("删除成功");
+        } else {
+            return R.error("删除失败");
+        }
+    }
+
+    @Override
+    public R allSinger() {
+        return R.success(null, singerMapper.selectList(null));
+    }
+
+    @Override
+    public R addSinger(SingerRequest addSingerRequest) {
+        Singer singer = new Singer();
+        BeanUtils.copyProperties(addSingerRequest, singer);
+        String pic = "/img/avatorImages/user.jpg";
+        singer.setPic(pic);
+        if (singerMapper.insert(singer) > 0) {
+            return R.success("添加成功");
+        } else {
+            return R.error("添加失败");
+        }
+    }
+
+    @Override
+    public R singerOfName(String name) {
+        QueryWrapper<Singer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("name", name);
+        return R.success(null, singerMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R singerOfSex(Integer sex) {
+        QueryWrapper<Singer> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("sex", sex);
+        return R.success(null, singerMapper.selectList(queryWrapper));
+    }
+}

+ 102 - 0
src/main/java/org/example/music/service/impl/SongListServiceImpl.java

@@ -0,0 +1,102 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.controller.MinioUploadController;
+import org.example.music.mapper.SongListMapper;
+import org.example.music.model.domain.SongList;
+import org.example.music.model.request.SongListRequest;
+import org.example.music.service.SongListService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@Service
+public class SongListServiceImpl extends ServiceImpl<SongListMapper, SongList> implements SongListService {
+
+    @Autowired
+    private SongListMapper songListMapper;
+//    @Value("${minio.bucket-name}")
+    String bucketName = "temp";
+
+    @Override
+    public R updateSongListMsg(SongListRequest updateSongListRequest) {
+        SongList songList = new SongList();
+        BeanUtils.copyProperties(updateSongListRequest, songList);
+        if (songListMapper.updateById(songList) > 0) {
+            return R.success("修改成功");
+        } else {
+            return R.error("修改失败");
+        }
+    }
+
+    @Override
+    public R deleteSongList(Integer id) {
+        if (songListMapper.deleteById(id) > 0) {
+            return R.success("删除成功");
+        } else {
+            return R.error("删除失败");
+        }
+    }
+
+    @Override
+    public R allSongList() {
+        return R.success(null, songListMapper.selectList(null));
+    }
+
+    @Override
+    public List<SongList> findAllSong() {
+        List<SongList> songLists = songListMapper.selectList(null);
+        return songLists;
+    }
+
+
+    @Override
+    public R likeTitle(String title) {
+        QueryWrapper<SongList> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("title",title);
+        return R.success(null, songListMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R likeStyle(String style) {
+        QueryWrapper<SongList> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("style",style);
+        return R.success(null, songListMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R addSongList(SongListRequest addSongListRequest) {
+        SongList songList = new SongList();
+        BeanUtils.copyProperties(addSongListRequest, songList);
+        String pic = "/img/songListPic/123.jpg";
+        songList.setPic(pic);
+        if (songListMapper.insert(songList) > 0) {
+            return R.success("添加成功");
+        } else {
+            return R.error("添加失败");
+        }
+    }
+
+    @Override
+    public R updateSongListImg(MultipartFile avatorFile, @RequestParam("id") int id) {
+        String fileName =avatorFile.getOriginalFilename();
+        String path="/"+bucketName+"/"+"songlist/";
+        String imgPath = path + fileName;
+        MinioUploadController.uploadSonglistImgFile(avatorFile);
+        SongList songList = new SongList();
+        songList.setId(id);
+        songList.setPic(imgPath);
+        if (songListMapper.updateById(songList) > 0) {
+            return R.success("上传成功", imgPath);
+        } else {
+            return R.error("上传失败");
+        }
+    }
+}

+ 229 - 0
src/main/java/org/example/music/service/impl/SongServiceImpl.java

@@ -0,0 +1,229 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.controller.MinioUploadController;
+import org.example.music.mapper.SongMapper;
+import org.example.music.model.domain.Song;
+import org.example.music.model.request.SongRequest;
+import org.example.music.service.SongService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class SongServiceImpl extends ServiceImpl<SongMapper, Song> implements SongService {
+
+    @Autowired
+    private SongMapper songMapper;
+
+//    @Value("${minio.bucket-name}")
+    private String bucketName;
+
+//    @Autowired
+//    MinioClient minioClient;
+
+    @Override
+    public R allSong() {
+        return R.success(null, songMapper.selectList(null));
+    }
+
+    @Override
+    public R addSong(SongRequest addSongRequest, MultipartFile lrcfile, MultipartFile mpfile){
+//        Song song = new Song();
+//        BeanUtils.copyProperties(addSongRequest, song);
+//        String pic = "/img/songPic/tubiao.jpg";
+//        String fileName = mpfile.getOriginalFilename();
+//        String s = MinioUploadController.uploadFile(mpfile);
+//        String storeUrlPath = "/"+bucketName+"/" + fileName;
+//        song.setCreateTime(new Date());
+//        song.setUpdateTime(new Date());
+//        song.setPic(pic);
+//        song.setUrl(storeUrlPath);
+//
+//        if (lrcfile!=null&&(song.getLyric().equals("[00:00:00]暂无歌词"))){
+//            byte[] fileContent = new byte[0];
+//            try {
+//                fileContent = lrcfile.getBytes();
+//                String content = new String(fileContent, "GB2312");
+//                song.setLyric(content);
+//            } catch (IOException e) {
+//                throw new RuntimeException(e);
+//            }
+//        }
+//        if (s.equals("File uploaded successfully!")&&songMapper.insert(song) > 0) {
+//            return R.success("上传成功", storeUrlPath);
+//        } else {
+//            return R.error("上传失败");
+//        }
+        return R.error("上传失败");
+    }
+
+    @Override
+    public R updateSongMsg(SongRequest updateSongRequest) {
+        Song song = new Song();
+        BeanUtils.copyProperties(updateSongRequest, song);
+        if (songMapper.updateById(song) > 0) {
+            return R.success("修改成功");
+        } else {
+            return R.error("修改失败");
+        }
+    }
+
+    @Override
+    public R updateSongUrl(MultipartFile urlFile, int id) {
+//        Song song = songMapper.selectById(id);
+//        String path = song.getUrl();
+//        String[] parts = path.split("/");
+//        String fileName = parts[parts.length - 1];
+//
+//        RemoveObjectArgs removeObjectArgs=RemoveObjectArgs.builder()
+//                .bucket(bucketName)
+//                .object(fileName)
+//                .build();
+//        fileName = urlFile.getOriginalFilename();
+//        String s = MinioUploadController.uploadFile(urlFile);
+//        try {
+//            minioClient.removeObject(removeObjectArgs);
+//        } catch (ErrorResponseException e) {
+//            throw new RuntimeException(e);
+//        } catch (InsufficientDataException e) {
+//            throw new RuntimeException(e);
+//        } catch (InternalException e) {
+//            throw new RuntimeException(e);
+//        } catch (InvalidKeyException e) {
+//            throw new RuntimeException(e);
+//        } catch (InvalidResponseException e) {
+//            throw new RuntimeException(e);
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        } catch (NoSuchAlgorithmException e) {
+//            throw new RuntimeException(e);
+//        } catch (ServerException e) {
+//            throw new RuntimeException(e);
+//        } catch (XmlParserException e) {
+//            throw new RuntimeException(e);
+//        }
+//        String storeUrlPath = "/"+bucketName+"/" + fileName;
+//        song.setId(id);
+//        song.setUrl(storeUrlPath);
+//        song.setName(fileName);
+//        if (s.equals("File uploaded successfully!")&&songMapper.updateById(song) > 0) {
+//            return R.success("更新成功", storeUrlPath);
+//        } else {
+//            return R.error("更新失败");
+//        }
+        return R.error("更新失败");
+    }
+
+    @Override
+    public R updateSongPic(MultipartFile urlFile, int id) {
+//        String fileName =  urlFile.getOriginalFilename();
+//        String storeUrlPath = "/user01/singer/song/" + fileName;
+//        MinioUploadController.uploadSongImgFile(urlFile);
+//        Song song = new Song();
+//        song.setId(id);
+//        song.setPic(storeUrlPath);
+//        if (songMapper.updateById(song) > 0) {
+//            return R.success("上传成功", storeUrlPath);
+//        } else {
+//            return R.error("上传失败");
+//        }
+        return R.error("上传失败");
+    }
+
+    @Override
+    public R deleteSong(Integer id) {
+//        Song song = songMapper.selectById(id);
+//        String path = song.getUrl();
+//        String[] parts = path.split("/");
+//        String fileName = parts[parts.length - 1];
+//        System.out.println(fileName);
+//        RemoveObjectArgs removeObjectArgs=RemoveObjectArgs.builder()
+//                .bucket(bucketName)
+//                .object(fileName)
+//                .build();
+//        if (songMapper.deleteById(id) > 0) {
+//            try {
+//                minioClient.removeObject(removeObjectArgs);
+//            } catch (ErrorResponseException e) {
+//                throw new RuntimeException(e);
+//            } catch (InsufficientDataException e) {
+//                throw new RuntimeException(e);
+//            } catch (InternalException e) {
+//                throw new RuntimeException(e);
+//            } catch (InvalidKeyException e) {
+//                throw new RuntimeException(e);
+//            } catch (InvalidResponseException e) {
+//                throw new RuntimeException(e);
+//            } catch (IOException e) {
+//                throw new RuntimeException(e);
+//            } catch (NoSuchAlgorithmException e) {
+//                throw new RuntimeException(e);
+//            } catch (ServerException e) {
+//                throw new RuntimeException(e);
+//            } catch (XmlParserException e) {
+//                throw new RuntimeException(e);
+//            }
+//            return R.success("删除成功");
+//        } else {
+//            return R.error("删除失败");
+//        }
+        return R.success("删除成功");
+    }
+
+    @Override
+    public R songOfSingerId(Integer singerId) {
+        QueryWrapper<Song> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("singer_id",singerId);
+        return R.success(null, songMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R songOfId(Integer id) {
+        QueryWrapper<Song> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id",id);
+        return R.success(null, songMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R songOfSingerName(String name) {
+        QueryWrapper<Song> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like("name",name);
+        List<Song> songs = songMapper.selectList(queryWrapper);
+        if (songs.isEmpty()){
+            return R.error("添加失败,没有找到该歌,无法加入该歌单");
+        }
+
+        return R.success(null, songMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public R updateSongLrc(MultipartFile lrcFile, int id) {
+        Song song = songMapper.selectById(id);
+        if (lrcFile!=null&&!(song.getLyric().equals("[00:00:00]暂无歌词"))){
+            byte[] fileContent = new byte[0];
+            try {
+                fileContent = lrcFile.getBytes();
+                String content = new String(fileContent, "GB2312");
+                song.setLyric(content);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        if (songMapper.updateById(song) > 0) {
+            return R.success("更新成功");
+        } else {
+            return R.error("更新失败");
+        }
+    }
+}

+ 58 - 0
src/main/java/org/example/music/service/impl/UserSupportServiceImpl.java

@@ -0,0 +1,58 @@
+package org.example.music.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.example.music.common.R;
+import org.example.music.mapper.UserSupportMapper;
+import org.example.music.model.domain.UserSupport;
+import org.example.music.model.request.UserSupportRequest;
+import org.example.music.service.UserSupportService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author asus
+ * @description 针对表【user_support】的数据库操作Service实现
+ * @createDate 2022-06-11 16:06:28
+ */
+@Service
+public class UserSupportServiceImpl extends ServiceImpl<UserSupportMapper, UserSupport>
+        implements UserSupportService {
+
+    @Autowired
+    private UserSupportMapper userSupportMapper;
+
+    @Override
+    public R isUserSupportComment(UserSupportRequest userSupportRequest) {
+        QueryWrapper<UserSupport> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("comment_id", userSupportRequest.getCommentId());
+        queryWrapper.eq("user_id", userSupportRequest.getUserId());
+        if (userSupportMapper.selectCount(queryWrapper) > 0) {
+            return R.success("您已取消点赞", true);
+        } else {
+            return R.success("您已点赞", false);
+        }
+    }
+
+    @Override
+    public R insertCommentSupport(UserSupportRequest userSupportRequest) {
+        UserSupport userSupport = new UserSupport();
+        BeanUtils.copyProperties(userSupportRequest, userSupport);
+        if (userSupportMapper.insert(userSupport) > 0) {
+            return R.success("添加记录成功");
+        }
+        return R.error("添加时,发生异常");
+    }
+
+    @Override
+    public R deleteCommentSupport(UserSupportRequest userSupportRequest) {
+        QueryWrapper<UserSupport> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("comment_id", userSupportRequest.getCommentId());
+        queryWrapper.eq("user_id", userSupportRequest.getUserId());
+        if (userSupportMapper.delete(queryWrapper) > 0) {
+            return R.success("删除记录成功");
+        }
+        return R.error("删除记录发生异常");
+    }
+}

+ 23 - 0
src/main/java/org/example/music/util/BeanMapperUtils.java

@@ -0,0 +1,23 @@
+package org.example.music.util;
+
+
+import java.util.List;
+
+public abstract class BeanMapperUtils {
+
+
+    public static <S, D> D map(S source, Class<D> clazz) {
+        if (source == null) {
+            return null;
+        }
+
+        return null;
+    }
+
+
+    public static <S, D> List<D> mapAsList(List<S> source, Class<D> clazz) {
+        return null;
+    }
+
+
+}

+ 12 - 0
src/main/java/org/example/music/util/IdObject.java

@@ -0,0 +1,12 @@
+package org.example.music.util;
+
+import lombok.Data;
+
+/**
+ * @author wzt on 2020/2/14.
+ * @version 1.0
+ */
+@Data
+public class IdObject {
+    Integer id;
+}

+ 40 - 0
src/main/java/org/example/music/util/MapUtils.java

@@ -0,0 +1,40 @@
+package org.example.music.util;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * @author wzt on 2020/1/16.
+ * @version 1.0
+ */
+public class MapUtils {
+
+    /**
+     * 对每个分组求和
+     *
+     * @param sourceMap
+     * @param function
+     * @param <S>
+     * @param <R>
+     * @return
+     */
+    public static <S, R> Map<String, BigDecimal> sumEachGroupList(Map<String, List<S>> sourceMap, Function<S, R> function) {
+
+        Map<String, BigDecimal> resultMap = new HashMap<>(sourceMap.size());
+
+        sourceMap.forEach((key, list) -> {
+            BigDecimal sum = BigDecimal.ZERO;
+            for (S t : list) {
+                R result = function.apply(t);
+                sum = sum.add(new BigDecimal(result.toString()));
+            }
+            resultMap.put(key, sum);
+        });
+
+        return resultMap;
+    }
+
+}

+ 23 - 0
src/main/java/org/example/music/util/ModelAttrUtils.java

@@ -0,0 +1,23 @@
+package org.example.music.util;
+
+import java.util.Map;
+
+/**
+ * @author wzt on 2020/2/11.
+ * @version 1.0
+ */
+public class ModelAttrUtils {
+
+    /**
+     * 根据Class定义生成模型属性
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> Map<String, ModelFieldAttr> generateModelAttr(Class<T> clazz) {
+
+        return null;
+    }
+
+}

+ 16 - 0
src/main/java/org/example/music/util/ModelFieldAttr.java

@@ -0,0 +1,16 @@
+package org.example.music.util;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author wzt on 2020/2/12.
+ * @version 1.0
+ */
+@Data
+@AllArgsConstructor
+public class ModelFieldAttr {
+
+    private String tableFieldName;
+    private String modelFieldType;
+}

+ 31 - 0
src/main/java/org/example/music/util/PageView.java

@@ -0,0 +1,31 @@
+package org.example.music.util;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author wzt on 2019/11/22.
+ * @version 1.0
+ */
+@Data
+@Builder
+public class PageView<T> {
+
+    private int current;
+    private int size;
+    private long total;
+
+    private List<T> records;
+
+
+    public static <T>  PageView<T> newPageView() {
+        return PageView.<T>builder().build();
+    }
+
+    public static <T> PageView<T> newPageView(int current, int size, long total) {
+        return PageView.<T>builder().current(current).size(size).total(total).build();
+    }
+
+}

+ 18 - 0
src/main/java/org/example/music/util/RandomUtils.java

@@ -0,0 +1,18 @@
+package org.example.music.util;
+
+import java.util.Random;
+
+public class RandomUtils {
+    public static String code(){
+        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 可以包含的字符集合
+        int length = 5; // 生成的字符串长度为5个字符
+        StringBuilder randomString = new StringBuilder();
+        Random random = new Random();
+        for (int i = 0; i < length; i++) {
+            int randomIndex = random.nextInt(characters.length());
+            char randomChar = characters.charAt(randomIndex);
+            randomString.append(randomChar);
+        }
+        return randomString.toString();
+    }
+}

+ 80 - 0
src/main/java/org/example/music/util/ResponseCode.java

@@ -0,0 +1,80 @@
+package org.example.music.util;
+
+/**
+ * 响应码:0表示成功,其他表示错误或失败
+ *
+ */
+public enum ResponseCode {
+
+	Success("200", "base_success", "操作成功"), 
+	ERROR("500", "base_error", "系统内部异常"), 
+	Fail("400", "base_fail", "操作失败"), 
+	Param_Error("400", "base_param_error", "参数异常"), 
+	Format_Error("415","base_format_error", "格式错误"), 
+	METHOD_NO_SUPPORT("405","base_method_no_support", "不支持当前请求方法"), 
+	No_Exist("410", "base_record_no_exist", "记录不存在或已被删除"),
+	
+	Chinese_Cannot_Be_Null("403","chinese_cannot_be_null","中文不能为空"),
+	
+	Account_Permission_denied("403", "base_permission_denied", "没有操作权限"),
+	Account_No_Login("401", "base_account_no_login", "没有登录,或登录已过期"),
+	
+	DATABASE_LENGTH_ERROR("403","database_length_error","输入的参数长度超标"),
+	DATABASE_PARSE_ERROR("403","database_parse_error","输入的参数类型或格式有误"),
+	DATABASE_OPERATE_ERROR("403","database_operate_error","数据库操作异常"),
+	
+	
+	Account_Create_Fail("403","base_account_cre_fail","创建账号失败"),
+	Account_Expired("403", "base_account_expired", "帐号已过期"),
+	Account_Disabled("403", "base_account_disabled", "帐号已禁用"),
+	Account_Locked("403", "base_account_locked", "帐号已锁定"),
+	The_Same_Account("403","base_the_same_account","已经存在相同的登录账号"),
+	Accouont_Password_Expired("403", "base_password_expired", "密码过期"),
+	Account_Password_Worng("403", "base_account_password_worng", "用户名或密码错误"),
+	Account_Username_Not_Found("401", "base_account_username_not_found", "找不到该帐号"),
+	Account_Sessioin_Expired("403", "base_account_session_expired", "session会话异常"),
+	Account_Captcha_Not_Found("403","base_account_captcha_not_found","验证码异常"),
+	Account_Captcha_Worng("403","base_account_captcha_worng","验证码有误"),
+	User_Not_Found("403","user_not_found","找不到该用户,无法操作"),
+	Can_Not_Be_Null("403","base_canot_be_null","不能为空"),
+	Is_Exists("403","base_is_exists","已存在,不可重复"),
+	Admin_Not_Allow_Oper("403","admin_not_allow_oper","管理员,不允许操作"),
+	Id_Is_Blank("403","id_is_blank","id为空,操作失败"),
+	Unable_System("403","unable_system","无法匹配系统"),
+	Illegal_Opertion("400","base_illegal_opertion","不合法操作"),
+	Donot_Exists("403","do_not_exists","不存在,无法操作"),
+	Data_Error("403","base_data_error","数据异常"),
+	Unable_To_Parse("403","unable_to_parse","参数格式,无法解析"),
+	Query_Condition_Cannot_Be_Empty("403","query_condition_cannot_be_empty","查询条件不能为空"),
+	Parameter_Incomplete("403","parameter_incomplete","参数不完整"),
+	Must_Be_Unique("403","must_be_unique","必须唯一"),
+	Unrecognized("400","unrecognized","无法识别"),
+	IsNull("403","isNull","为空,无法操作"),
+	Has_Be_Confirm("403","has_be_confirm","已经确认,无法再修改"),
+	Already_In_Use("403","already_in_use","已被使用"),
+	Achieve_Fail("403","achieve_fail","获取失败");
+	
+	private String httpCode;
+	private String key;
+	private String msg;
+
+	private ResponseCode(String httpCode, String key, String msg) {
+		this.httpCode = httpCode;
+		this.key = key;
+		this.msg = msg;
+	}
+
+	
+	public String getCode() {
+		return httpCode;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+}

+ 47 - 0
src/main/java/org/example/music/util/ResponseResult.java

@@ -0,0 +1,47 @@
+package org.example.music.util;
+
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author wzt
+ */
+@Builder
+@Data
+public class ResponseResult<T> implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private String code;
+
+    private String msg;
+
+    private T data;
+
+    public static ResponseResult<String> success() {
+        return success(null);
+    }
+
+    public static <T> ResponseResult<T> success(T data) {
+        return ResponseResult.<T>builder()
+                .code(ResponseCode.Success.getCode())
+                .msg(ResponseCode.Success.getMsg())
+                .data(data)
+                .build();
+    }
+
+    public static ResponseResult<String> fail(String msg) {
+        return fail(ResponseCode.Fail, msg);
+    }
+
+    public static <T> ResponseResult<T> fail(ResponseCode responseCode, String msg) {
+        return ResponseResult.<T>builder()
+                .code(responseCode.getCode())
+                .msg(msg)
+                .build();
+    }
+
+}

+ 101 - 0
src/main/java/org/example/music/util/SmartWrapper.java

@@ -0,0 +1,101 @@
+package org.example.music.util;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Getter;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author wzt on 2020/2/11.
+ * @version 1.0
+ */
+@Getter
+public class SmartWrapper<T> {
+
+    private boolean isContainOrderByCommand = false;
+
+    private int current = 1;
+
+    private int size = 10;
+
+    private QueryWrapper<T> queryWrapper = new QueryWrapper<>();
+
+    private Map<String, ModelFieldAttr> modelFieldToTableField = null;
+
+    public static <T> SmartWrapper<T> newWrapper() {
+        return new SmartWrapper<>();
+    }
+
+    public IPage<T> generatePage() {
+        return new Page<>(this.current, this.size);
+    }
+
+    /**
+     * 解析JSON查询字符串, 构建QueryWrapper对象
+     *
+     * @param queryObject
+     * @param clazz
+     * @return
+     */
+    public void parse(JSONObject queryObject, Class<T> clazz) {
+        if (Objects.isNull(queryObject)) {
+            return;
+        }
+
+        // 获取模型字段元信息
+        modelFieldToTableField = ModelAttrUtils.generateModelAttr(clazz);
+
+        // 解析查询条件
+        this.parseQueryCondition(queryObject, clazz);
+
+        // 解析排序条件
+        this.parseOrderByCondition(queryObject);
+
+        // 解析分页信息
+        this.parsePage(queryObject);
+    }
+
+
+    private void parsePage(JSONObject queryObject) {
+        if (Objects.isNull(queryObject)) {
+            return;
+        }
+
+        Object current = queryObject.get("current");
+        Object size = queryObject.get("size");
+        if (current == null || size == null) {
+            return;
+        }
+
+        this.current = (int) current;
+        this.size = (int) size;
+    }
+
+    /**
+     * 解析排序条件
+     *
+     * @param queryObject
+     * @return
+     */
+    private void parseOrderByCondition(JSONObject queryObject) {
+
+
+    }
+
+    /**
+     * 根据自定义语法解析查询条件
+     *
+     * @param queryObject
+     * @param clazz
+     * @return
+     */
+    private void parseQueryCondition(JSONObject queryObject, Class<T> clazz) {
+
+    }
+
+}

+ 77 - 0
src/main/java/org/example/music/util/TestFileUtil.java

@@ -0,0 +1,77 @@
+package org.example.music.util;
+
+
+import org.springframework.util.CollectionUtils;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class TestFileUtil {
+
+    public static InputStream getResourcesFileInputStream(String fileName) {
+        return Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
+    }
+
+    public static String getPath() {
+        return TestFileUtil.class.getResource("/").getPath();
+    }
+
+    public static TestPathBuild pathBuild() {
+        return new TestPathBuild();
+    }
+
+    public static File createNewFile(String pathName) {
+        File file = new File(getPath() + pathName);
+        if (file.exists()) {
+            file.delete();
+        } else {
+            if (!file.getParentFile().exists()) {
+                file.getParentFile().mkdirs();
+            }
+        }
+        return file;
+    }
+
+    public static File readFile(String pathName) {
+        return new File(getPath() + pathName);
+    }
+
+    public static File readUserHomeFile(String pathName) {
+        return new File(System.getProperty("user.home") + File.separator + pathName);
+    }
+
+    /**
+     * build to test file path
+     **/
+    public static class TestPathBuild {
+        private TestPathBuild() {
+            subPath = new ArrayList<>();
+        }
+
+        private final List<String> subPath;
+
+        public TestPathBuild sub(String dirOrFile) {
+            subPath.add(dirOrFile);
+            return this;
+        }
+
+        public String getPath() {
+            if (CollectionUtils.isEmpty(subPath)) {
+                return TestFileUtil.class.getResource("/").getPath();
+            }
+            if (subPath.size() == 1) {
+                return TestFileUtil.class.getResource("/").getPath() + subPath.get(0);
+            }
+            StringBuilder path = new StringBuilder(TestFileUtil.class.getResource("/").getPath());
+            path.append(subPath.get(0));
+            for (int i = 1; i < subPath.size(); i++) {
+                path.append(File.separator).append(subPath.get(i));
+            }
+            return path.toString();
+        }
+
+    }
+
+}

+ 4 - 0
src/main/resources/application-dev.properties

@@ -0,0 +1,4 @@
+spring.datasource.url=jdbc:mysql://47.113.125.203:3306/music?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
+spring.datasource.username=music
+spring.datasource.password=music_1234
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

+ 8 - 0
src/main/resources/application.properties

@@ -0,0 +1,8 @@
+mybatis.typeAliasesPackage=org.example.music.domain
+mybatis.mapperLocations=classpath:mapper/*.xml
+
+server.port=8080
+
+#logging.level.org.springframework.boot.autoconfigure=ERROR
+
+spring.profiles.active=dev

+ 14 - 0
src/main/resources/log4j.properties

@@ -0,0 +1,14 @@
+# LOG4J
+log4j.rootCategory=INFO, stdout,file
+
+# print to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n
+
+# print to file
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.DatePattern='-'yyyy-MM-dd'.log'
+log4j.appender.file.File=./logs/musicWebsite
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p [%c]: %m%n

+ 13 - 0
src/main/resources/mapper/AdminMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.AdminMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.Admin">
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+    <result column="password" jdbcType="VARCHAR" property="password" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, name, password
+  </sql>
+
+</mapper>

+ 15 - 0
src/main/resources/mapper/BannerMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.BannerMapper">
+
+    <resultMap id="BaseResultMap" type="org.example.music.model.domain.Banner">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="pic" column="pic" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,pic
+    </sql>
+</mapper>

+ 16 - 0
src/main/resources/mapper/CollectMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.CollectMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.Collect">
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="user_id" property="userId" jdbcType="INTEGER" />
+    <result column="type" property="type" jdbcType="TINYINT" />
+    <result column="song_id" property="songId" jdbcType="INTEGER" />
+    <result column="song_list_id" property="songListId" jdbcType="INTEGER" />
+    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, user_id, type, song_id, song_list_id, create_time
+  </sql>
+
+</mapper>

+ 18 - 0
src/main/resources/mapper/CommentMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.CommentMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.Comment">
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="user_id" property="userId" jdbcType="INTEGER" />
+    <result column="song_id" property="songId" jdbcType="INTEGER" />
+    <result column="song_list_id" property="songListId" jdbcType="INTEGER" />
+    <result column="content" property="content" jdbcType="VARCHAR" />
+    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="type" property="type" jdbcType="TINYINT" />
+    <result column="up" property="up" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, user_id, song_id, song_list_id, content, create_time, type, up
+  </sql>
+
+</mapper>

+ 22 - 0
src/main/resources/mapper/ConsumerMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.ConsumerMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.Consumer">
+    <result column="id" property="id" jdbcType="INTEGER" />
+    <result column="username" property="username" jdbcType="VARCHAR" />
+    <result column="password" property="password" jdbcType="VARCHAR" />
+    <result column="sex" property="sex" jdbcType="TINYINT" />
+    <result column="phone_num" property="phoneNum" jdbcType="CHAR" />
+    <result column="email" property="email" jdbcType="CHAR" />
+    <result column="birth" property="birth" jdbcType="TIMESTAMP" />
+    <result column="introduction" property="introduction" jdbcType="VARCHAR" />
+    <result column="location" property="location" jdbcType="VARCHAR" />
+    <result column="avator" property="avator" jdbcType="VARCHAR" />
+    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, username, password, sex, phone_num, email, birth, introduction, location, avator, create_time, update_time
+  </sql>
+
+</mapper>

+ 13 - 0
src/main/resources/mapper/ListSongMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.ListSongMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.ListSong">
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="song_id" property="songId" jdbcType="INTEGER" />
+    <result column="song_list_id" property="songListId" jdbcType="INTEGER" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, song_id, song_list_id
+  </sql>
+
+</mapper>

+ 21 - 0
src/main/resources/mapper/RankListMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.RankListMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.RankList">
+    <result column="id" property="id" jdbcType="BIGINT" />
+    <result column="songListId" property="songListId" jdbcType="BIGINT" />
+    <result column="consumerId" property="consumerId" jdbcType="BIGINT" />
+    <result column="score" property="score" jdbcType="INTEGER" />
+  </resultMap>
+
+  <select id="selectScoreSum" resultType="java.lang.Integer">
+  SELECT COALESCE(sum(score), 0) as score from rank_list where song_list_id = #{0} ;
+  </select>
+
+  <select id="selectUserRank" resultType="java.lang.Integer" parameterType="org.example.music.model.domain.RankList">
+    select score
+    from rank_list
+    where consumer_id = #{consumer_id, jdbcType=BIGINT} and song_list_id = #{song_list_id, jdbcType=BIGINT}
+  </select>
+
+</mapper>

+ 17 - 0
src/main/resources/mapper/SingerMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.example.music.mapper.SingerMapper">
+  <resultMap id="BaseResultMap" type="org.example.music.model.domain.Singer">
+    <id column="id" property="id" jdbcType="INTEGER" />
+    <result column="name" property="name" jdbcType="VARCHAR" />
+    <result column="sex" property="sex" jdbcType="TINYINT" />
+    <result column="pic" property="pic" jdbcType="VARCHAR" />
+    <result column="birth" property="birth" jdbcType="TIMESTAMP" />
+    <result column="location" property="location" jdbcType="VARCHAR" />
+    <result column="introduction" property="introduction" jdbcType="VARCHAR" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    id, name, sex, pic, birth, location, introduction
+  </sql>
+
+</mapper>

部分文件因文件數量過多而無法顯示