搭建自己的前后台学习平台一 后端实现

49 阅读4分钟

一.技术架构

  1. JAVA作为开发语言,版本为JDK17;
  2. Tomcat作为服务器容器,版本为10.1.7;
  3. 使用Spring6+SpringMvc快速搭建项目架构,配置返回实体为json对象,并对返回结果通义定义,并实现前后端分离;
  4. MD5做密码校验;
  5. MySql8用于存储项目数据;
  6. JDBC用于实现数据的CURD
  7. Druid用于提供数据源的连接池
  8. Jackson用于转换JSON
  9. Lombok用于处理实体类
  10. Filter用于用户登录校验和跨域处理,日志过滤器并配套slg4j对请求做记录和优化;
  11. 单元测试对每个接口进行测试,确保接口正常运行,减少bug问题。

二 .业务概述

1.功能描述

本系统是一个简易的课程管理系统,主要有用户添加、注册以及实现对用户课程的操作,包括以下几个方面:实现用户对课程的查询、添加、修改、删除

2.接口描述

1.用户相关

  1. 注册
  2. 登录
  3. 检查用户名是否已存在

2.课程相关

  1. 查询
  2. 添加
  3. 修改
  4. 删除

三.项目介绍

1.项目配置

1.1 依赖配置

包括spring、springMvc、springJdbc、Druid、Spring-test、sl4j、loombok、JackSon等

<dependencies>

    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.2</version>
    </dependency>
    <!-- SpringMVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>6.0.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>6.0.2</version>
    </dependency>
    <!-- Servlet -->
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>


    <!--spring jdbc  Spring 持久化层支持jar包-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>6.0.2</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
    <!-- 数据源 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.15</version>
    </dependency>
    <!--spring对junit的支持相关依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>6.0.2</version>
    </dependency>

    <!--junit5测试-->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.3</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.3</version>
    </dependency>

    <!--log4j2的依赖-->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.19.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j2-impl</artifactId>
        <version>2.19.0</version>
    </dependency>

    <!--        lombok配置-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>

    <!--        jackson配置-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.2</version>
    </dependency>
</dependencies>

1.2 springMvc配置

我们采用全注解方式配置(单元测试有个注意点)

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    private Logger logger = LoggerFactory.getLogger(WebInit.class);


    @Override
    protected Class<?>[] getRootConfigClasses() {
        logger.info("加载spring配置类");
        return new Class[]{
            SpringConfig.class};
    }


    // 指定springmvc配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        logger.info("加载springmvc配置类");
        return new Class[]{SpringMvcConfig.class};
    }

    // 配置前端控制器映射
    @Override
    protected String[] getServletMappings() {
        logger.info("配置前端控制器映射");
        return new String[]{"/"};
    }

    //这里配置过滤器,springMVC其实有过滤器注解了,所以就没必要了
    //    @Override
    //    protected Filter[] getServletFilters() {
    //        return new Filter[]{new CorsFilter()};
    //    }

    @Override
    protected Filter[] getServletFilters() {
        logger.info("加载过滤器");
        return new Filter[]{ characterEncodingFilter()};
    }

    /**
     * Spring MVC使用的是ISO-8859-1编码,这可能导致在处理非英文字符时出现问题。
     * 为了解决这个问题,你需要确保在Spring MVC中正确配置请求和响应的编码格式。
     * @return
     */
    public CharacterEncodingFilter characterEncodingFilter() {
        logger.info("添加字符编码过滤器");
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        return filter;
    }
}
@Configuration
//扫描组件
@ComponentScan("com.seven.schedule")
//开启MVC注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {

    private Logger logger = LoggerFactory.getLogger(SpringMvcConfig.class);
    @Autowired
    private LoggerInterceptor loggerInterceptor;

    //    //配置文件上传解析器
    //    @Bean
    //    public CommonsMultipartResolver multipartResolver(){
    //        return new CommonsMultipartResolver();
    //    }
    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        logger.info("添加拦截器");
        registry.addInterceptor(loggerInterceptor)
        .addPathPatterns("/**");
    }

    //配置日志拦截器
    @Bean
    public LoggerInterceptor loggerInterceptor() {
        logger.info("添加日志拦截器");
        return new LoggerInterceptor();
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        logger.info("添加跨域映射");
        registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedHeaders("Content-Type", "Authorization")
        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
        .maxAge(3600);
    }

}
@Configuration //表明它是一个配置
@ComponentScan("com.seven.schedule") //扫描
@EnableTransactionManagement  //开启事务
public class SpringConfig {
    @Bean
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/schedule");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public JdbcTemplate getJdbcTemplate(DataSource dataSource){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

    @Bean
    public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
}
//根据全注解配置类的测试
@SpringJUnitConfig(classes = SpringConfig.class)
@WebAppConfiguration //测试web环境,如果不加,默认为非web环境,这个属性会默认为非web环境,因为我们配置了SpringMvcConfig的环境,所以需要加上这个属性
public class SpringConfigTest {

    @Autowired
    JdbcTemplate jdbcTemplate;
    @Test
    public void testJunit5() {

        System.out.println("测试Junit5Test:"+jdbcTemplate);
    }
}

1.3 日志配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <loggers>
    <!--
    level指定日志级别,从低到高的优先级:
    TRACE < DEBUG < INFO < WARN < ERROR < FATAL
    trace:追踪,是最低的日志级别,相当于追踪程序的执行
    debug:调试,一般在开发中,都将其设置为最低的日志级别
    info:信息,输出重要的信息,使用较多
    warn:警告,输出警告的信息
    error:错误,输出错误信息
    fatal:严重错误
    -->
    <root level="DEBUG">
      <appender-ref ref="spring6log"/>
      <appender-ref ref="RollingFile"/>
      <appender-ref ref="log"/>
    </root>
  </loggers>

  <appenders>
    <!--输出日志信息到控制台-->
    <console name="spring6log" target="SYSTEM_OUT">
      <!--控制日志输出的格式-->
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>
    </console>

    <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
    <File name="log" fileName="d:/springmvc_log/test.log" append="false">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
    </File>

    <!-- 这个会打印出所有的信息,
    每次大小超过size,
    则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,
    作为存档-->
    <RollingFile name="RollingFile" fileName="d:/springmvc_log/app.log"
      filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
      <SizeBasedTriggeringPolicy size="50MB"/>
      <!-- DefaultRolloverStrategy属性如不设置,
      则默认为最多同一文件夹下7个文件,这里设置了20 -->
      <DefaultRolloverStrategy max="20"/>
    </RollingFile>
  </appenders>
</configuration>

2.架构

四.项目总结

本课程管理后台系统,也就提供了简单的7个接口,主要实现了用户登录、注册、用户名是否存在,课程的增删改查功能,运用了Spring6+SpringMVC架构,使用SpringJDBC+SQL8数据操作,并统一返回会json数据格式,增加了单元测试强化了代码稳定性,也使用了日志系统,便于排查问题,并且使用了第三方依赖loombok简化代码编写等等一系列操作来巩固一些基础知识。