2. 使用springboot做一个音乐播放器软件项目【框架搭建与配置文件】

上一章文章 我们做了 音乐播放器这个项目的 前期规划 项目需求, 环境安装 和 springboot框架的 搭建与配置。如果有小伙伴没看过 第一章文章 可以去看一下

https://blog.csdn.net/Drug_/article/details/144994317

今天这篇文章 我们来 主要分享一些 我们在开发中用到的一些工具类和 配置文件信息。

实际 我们不管开发什么需求的软件,这些前期的工作 都是 差不多的。

  1. 安装环境 比如 java maven
  2. 安装编辑器 比如 idea
  3. 安装开发中 所需要的软件 比如: redis mysql 等等。
  4. 搭建springboot 框架,编写配置信息,封装 项目中用到的一些 公共的方法。方便我们后续需求开发使用。

不管我们开发任何需求的项目,基本上都需要做上面的这些步骤,上面的步骤我只是简单的介绍了一些,实际还有很多细节,有些也要根据需求不同所作调整。

好了,别的就不多说了 直接就分享这章 我们需要 编写的代码。

先给大家 看一下 我创建 的项目目录结构

今天主要分享 一下 我定义好的 我们音乐播放器所需要的 配置文件信息。

就是写在 config 里的信息
第一个文件

CorsConfig.java

为了方便开发 配置了 允许跨域

bash 复制代码
package com.music.base.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/***
 * Json
 * 跨域
 * **/
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter createCorsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(source);
    }

}

第二个文件:

FilesConfig.java

这个配置文件 是 x-file-storage 这个依赖 所需要的 配置信息 因为后续我们会用到文件上传

对于 这个 x-file-storage 依赖 如果有小伙伴不熟悉 可以去看一下 我这篇博客

https://blog.csdn.net/Drug_/article/details/143402973

bash 复制代码
package com.music.base.config;

import org.dromara.x.file.storage.spring.SpringFileStorageProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import java.util.Collections;


/**
 * User:Json
 * Date: 2024/8/23
 **/
@Configuration
public class FilesConfig {


    @Bean
    public SpringFileStorageProperties fileStorageProperties(){

        SpringFileStorageProperties.SpringLocalPlusConfig springLocalPlusConfig = new SpringFileStorageProperties.SpringLocalPlusConfig();
        springLocalPlusConfig.setEnableStorage(true)
                .setEnableAccess(true).setPathPatterns(new String[]{"/file/**"})
                .setStoragePath("/home/temp/link-music/music-java-files/")
                .setDomain("http://127.0.0.1:18000/file/")
                .setPlatform("local-plus-1");
        return   new SpringFileStorageProperties().setDefaultPlatform("local-plus-1")
                .setLocalPlus(Collections.singletonList(springLocalPlusConfig));
    }
}

第三个文件:

InitConfig.java

这个配置文件主要是 项目中用到的一些初始化文件 。比如 拦截器的定义后的声明

对于 配置文件中 编写的 new LoginInterceptor() 拦截器 对象 后续文章中会分享

bash 复制代码
package com.music.base.config;

import com.music.base.webFilterIntercept.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * User:Json
 * Date: 2024/4/8
 **/
@Configuration
public class InitConfig  implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(new LoginInterceptor());
        registration.addPathPatterns("/**");        // 添加需要拦截的路径模式
//        registration.excludePathPatterns("/v2/api-docs")
//                .excludePathPatterns("/druid/**")
//                .excludePathPatterns("/error/**"); // 排除不需要拦截的路径模式

    }

}

第四个文件:

MybatisPlus.java

这个文件为 数据库的依赖 Mybatis-Plus的配置文件

bash 复制代码
package com.music.base.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * User:Json
 * Date: 2024/8/17
 **/
@Configuration
public class MybatisPlus {
    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

第五个文件:

MybatisPlusHandler.java

也是Mybatis-Plus的配置文件

对于这俩配置文件 我就不多解释了。

bash 复制代码
package com.music.base.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.music.base.webFilterIntercept.LoginUserInfo;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * User:Json
 * Date: 2024/8/17
 **/
@Component
public class MybatisPlusHandler  implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createdTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updatedTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "createdId", Integer.class, LoginUserInfo.getLoginUserId());
        this.strictInsertFill(metaObject, "updatedId", Integer.class, LoginUserInfo.getLoginUserId());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("updatedTime", LocalDateTime.now(), metaObject);
        setFieldValByName("updatedId",LoginUserInfo.getLoginUserId(), metaObject);
    }

}

第六个文件:

RedisConfig.java

这个配置文件主要是用于 redis 的配置文件

bash 复制代码
package com.music.base.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * User:Json
 * Date: 2024/8/17
 **/
@Configuration
public class RedisConfig {
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(
            RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        //Json序列化设置
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //通过ObjectMapper转义json
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        //String类型的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value的序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

对于配置文件 就分享到这里。 后续如果还需要别的配置文件,我们在一一添加 即可。

接下来分享 mysql 的 公共字段的 实体类定义。

什么是公共字段。 比如 我们在使用mysql 创建 表得时候 也许每个表都会存在 相同得字段。

比如 我在创建表得时候,都会默认每个表 会存在

创建时间

创建人id

更新时间

更新人id

逻辑删除

等字段 这些字段 基本上每个表都会存在 所以 我一般会写定义一个基类 然后 后续 的表字段 继承这个基类,这样 这些字段 就不需要 在子类里编写了。

以上这个 是利用了面向对象的 知识点设计的,如果是刚刚入行的兄弟们,对于面向对象的概念不是很理解 可以先照着写。写着写着就至到这样设计的便捷之处了。

代码如下:

bash 复制代码
package com.music.base.entities;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@Accessors(chain = true)
public class BaseEntity implements Serializable {


    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;



    @TableField(value = "created_time",fill = FieldFill.INSERT)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    protected LocalDateTime createdTime;//创建日期


    @TableField(value = "updated_time",fill = FieldFill.INSERT_UPDATE)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    protected LocalDateTime updatedTime;//修改日期

    /**
     * 逻辑删除状态
     */
    @TableLogic
    @TableField("is_deleted")
    protected Integer isDeleted;



    /**
     * 创建用户id
     */
    @TableField(value ="created_id",fill = FieldFill.INSERT)
    private Integer createdId;

    /**
     * 更新用户id
     */
    @TableField(value ="updated_id",fill = FieldFill.INSERT_UPDATE)
    private Integer updatedId;


}

同样 如果有 数据库的 公共字段的 基类 也会有 请求类的 基类。我们也可以把 前端经常 传入的参数 定义一个基类 后续 每个业务的 请求类 都继承这个基类 也是很方便的。

代码如下:

bash 复制代码
package com.music.base.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * User:Json
 * Date: 2024/3/22
 * 公共请求类
 **/
@Data
public class BaseRequest {

    private Long id;


    private String search;//搜索框模糊匹配


    private Integer page;  //页码


    private Integer pageSize;  //条数


    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    protected LocalDateTime startTime;//开始时间

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    protected LocalDateTime endTime;//结束时间

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    protected LocalDate startDate;//开始日期

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    protected LocalDate endDate;//结束日期

}

好了 。今天对于这个项目 我就分享到这里 。下一章 我们来定义一些 后续开发常用的工具类 。

对于源代码 和 前端的代码 我也在 第一篇文章里有过解释了。

以后我会在每篇文章底部在说明一下。
说明:

因核心分享 的是java编程。后续文章中 基本分享的都是java语言的代码。

对于前端的代码,在文章中就不分享了。只会分享一下页面效果。

当然项目完结后,我会把前后端项目源码打包好放到最后一篇文章中。

如果有小伙伴有兴趣可以订阅此专栏,后续会持续更新直到音乐播放器这个软件完成。

我会尽可能详细的以文字的形式分享出来 从0到1 写出来一个音乐播放器项目。

相关推荐
C++小厨神4 分钟前
SQL语言的函数实现
开发语言·后端·golang
等一场春雨23 分钟前
Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解
java·分布式·java-zookeeper
上海拔俗网络39 分钟前
“AI智能实训系统:让学习更高效、更轻松!
java·团队开发
胡耀超1 小时前
解读若依框架中的`@Excel` 和 `@Excels` 注解
java·excel·若依
DevOpsDojo1 小时前
Julia语言的软件工程
开发语言·后端·golang
编程|诗人1 小时前
Kotlin语言的数据结构
开发语言·后端·golang
拾忆,想起1 小时前
Spring拦截链揭秘:如何在复杂应用中保持控制力
java·数据库·spring
HelloZheQ1 小时前
Spring 中的 @RestController 注解详解
java·后端·spring
观棋不语的我1 小时前
maven下载依赖报错:on-resolvable parent POM xxx
java·maven
程序员老冯头1 小时前
第三十六章 C++ 多线程
java·c++·信号处理