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 写出来一个音乐播放器项目。

相关推荐
Lee川2 小时前
mini-cursor 揭秘:从 Tool 定义到 Agent 循环的完整实现
前端·人工智能·后端
一直不明飞行3 小时前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
REDcker3 小时前
有限状态机与状态模式详解 FSM建模Java状态模式与C++表驱动模板实践
java·c++·状态模式
你的保护色4 小时前
【无标题】
java·服务器·网络
basketball6164 小时前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
淘矿人4 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
星浩AI4 小时前
OpenHuman 对比 OpenClaw、Hermes Agent
人工智能·后端·agent
小江的记录本5 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
来恩10035 小时前
请求转发与响应重定向的使用
java
@杰克成5 小时前
Java学习30
java·开发语言·学习