🍇 最终效果演示

在这里插入图片描述

🌽 技术选型:

  • 🍅  SpringBoot

  • 🥒  MySQL

  • 🍑  MyBatis-Plus

  • 🍋  Redis

  • 🍊  Swagger

  • 🍆  阿里云Oss存储对象实现文件上传

  • 🍉  Vue

  • 🦞  Axios

  • 🍰  Vue Router

  • 🍨  Vue AntDesign

🥝 项目需求分析

用户通过该平台可以搜索自己想要查询到的资源,同时也可以把自己拥有以及保存的学习资料进行无偿的开源给使用平台的用户。用户上传的资源是需要后台管理员审核后选择某资源是否上线以及可以对自己感兴趣的资源进行点赞收藏到自己的个人中心以防后续难以查询。

在这里插入图片描述

🌾 搭建项目

1. 导入部分Maven依赖

<!--Redis-->

<dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<!--commons-pools2 对象池依赖-->

<dependency>

  <groupId>org.apache.commons</groupId>

  <artifactId>commons-pool2</artifactId>

</dependency>

<!--ES-->

<!--        <dependency>-->

<!--            <groupId>org.elasticsearch.client</groupId>-->

<!--            <artifactId>elasticsearch-rest-high-level-client</artifactId>-->

<!--            <version>7.13.2</version>-->

<!--        </dependency>-->

<dependency>

  <groupId>com.baomidou</groupId>

  <artifactId>mybatis-plus-boot-starter</artifactId>

  <version>3.4.0</version>

</dependency>



<!--阿里云oss依赖-->

<dependency>

  <groupId>com.aliyun.oss</groupId>

  <artifactId>aliyun-sdk-oss</artifactId>

  <version>3.4.2</version>

</dependency>

<!--日期工具栏依赖-->

<dependency>

  <groupId>joda-time</groupId>

  <artifactId>joda-time</artifactId>

  <version>2.10.5</version>

</dependency>

......



2. 配置文件编写

在这里插入图片描述

3. 项目初期基本配置
① SwaggerAPI文档的使用与配置

对于典型的前后端项目来说,文档的编写是必不可少的,因为对于这种项目的架构在公司中一般是由两班人马联合开发:前端组和后端组。这种模式的开发有什么好处呢?简单来说可以并行开发,大大减少了项目的开发周期,前端不需要等后端的接口,而后端也不需要等待前端页面才能测试响应接口是否正确,如果没有前端页面的配合那么后端组又该如何测试接口是否正确呢,解决方案也就是现在介绍的SwaggerAPI文档,可以帮助后端人员大大减少等待时间,而且可以完美的符合我们的要求。


@Configuration

@EnableSwagger2

public class SwaggerConfig {



    private Boolean enable = true;



    @Bean

    public Docket docket(){

        return new Docket(DocumentationType.SWAGGER_2)

                .apiInfo(apiInfo())

                .select()

                .apis(RequestHandlerSelectors.basePackage("com.pdx.controller"))

                .paths(PathSelectors.any())

                .build()

                .enable(enable);

    }

    private ApiInfo apiInfo(){

        return new ApiInfoBuilder()

                .title("派大星在线图书室")

                .description("派大星在线图书室")

                .termsOfServiceUrl("")

                .version("1.0")

                .build();

    }

}



② 配置异常处理类以及响应码

对于一个项目来说,不管是使用Thymeleaf模板渲染还是JSP搭建的项目,配置异常处理类都是不可忽略的存在,它可以对我们的操作出现异常的业务进行精准的捕获以及反馈出来,以至于我们可以对特定的异常做出特定的处理,而避免使用户看到一些不友好的页面或场景比如:404、403等等。而响应码的配置更是前后端分离开发的一大特点,我们在前端请求数据时可以根据后端提示的响应码来向用户显示一些友好的提示,但是响应码的设定是需要在项目启动前就要进行统一的,不能存在一个接口前端使用某个自定义响应码进行判断,而后端使用另一响应码进行判别和处理,最终会造成一些不必要的问题。

异常处理类:


@RestControllerAdvice

@Slf4j

public class RestExceptionHandler {



    @ExceptionHandler(value = Exception.class)

    public DataResult exception(Exception e){

        log.error("Exception====>{}",e.getLocalizedMessage(),e);

        return DataResult.getResult(BaseResponseCode.SYSTEM_ERROR);

    }



    @ExceptionHandler(value = BusinessException.class)

    public DataResult businessException(BusinessException e){

        log.error("businessException ====>{}",e.getLocalizedMessage(),e);

        return DataResult.getResult(e.getCode(),e.getMsg());

    }



    /**

     * 框架异常

     * @param e

     * @param <T>

     * @return

     */

    @ExceptionHandler(MethodArgumentNotValidException.class)

    <T> DataResult<T> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {



        log.error("methodArgumentNotValidExceptionHandler bindingResult.allErrors():{},exception:{}", e.getBindingResult().getAllErrors(), e);

        List<ObjectError> errors = e.getBindingResult().getAllErrors();

        return createValidExceptionResp(errors);

    }

    private <T> DataResult<T> createValidExceptionResp(List<ObjectError> errors) {

        String[] msgs = new String[errors.size()];

        int i = 0;

        for (ObjectError error : errors) {

            msgs[i] = error.getDefaultMessage();

            log.info("msg={}",msgs[i]);

            i++;

        }

        return DataResult.getResult(BaseResponseCode.METHOD_IDENTITY_ERROR.getCode(), msgs[0]);

    }

}



系统响应码:(推荐使用枚举类型)


public enum BaseResponseCode implements ResponseCodeInterface{

    /*

    * code=0: 服务器已成功处理了请求。通常,这表示服务器提供了请求的

    * code=20x: 系统主动抛出的业务异常

    * code=301: 系统异常

    * */

    SUCCESS(0,"操作成功"),

    SYSTEM_ERROR(301,"系统异常,请稍后再试.."),

    METHOD_IDENTITY_ERROR(201,"数据校验异常"),

    ACCOUNT_LOCKED(202,"用户已被锁定"),

    ACCOUNT_PASSWORD_ERROR(203,"用户密码错误"),

    CAPTCHA_EXPIRED(204,"验证码已过期"),

    CAPTCHA_IS_ERROR(205,"验证码错误"),

    PASSWORD_IS_EMPTY(206,"密码不能为空"),

    OPERATION_ERROR(207,"操作异常"),

    PARAM_CAN_NOT_NULL(212,"参数不能为空"),

    LIKE_BOOK_IS_EXISTS(213,"重复点赞"),

    ;

    

    /*

    * 响应码

    * */

    private int code;



    /*

    * 提示

    * */

    private String msg;



    BaseResponseCode(int code,String msg){

        this.code = code;

        this.msg = msg;

    }



    @Override

    public int getCode() {

        return code;

    }



    @Override

    public String getMsg() {

        return msg;

    }

}





③ 点赞业务逻辑实现

对于点赞功能,其实是一个很有意思的功能,基本的实现思路有两种:一种是直接对数据库进行操作,另一种则是利用点赞的业务特点将其放到Redis中,然后再将缓存的数据同步到MySQL数据库中即可!

简单介绍二者的利弊:

  • 直接写入MySQL

直接写入MySQL是最简单的做法。只需要设计两张表A表:用于记录资源被点赞次数,B表:记录用户赞过哪些资源项

缺点:

  1. 数据库读写压力大,当一个资源特别受欢迎,那么点赞的用户就会特别多,甚至是短时间内被大量点赞,直接操作数据库并不是很理想的方案。
  • 使用Redis存储定时同步到数据库

首先Redis主要的特点就是快!毕竟是单线程而且存储在内存中,而且Redis还支持多种数据类型,比如:Hash、set、zset等等。

优点:

  1. 性能高

  2. 缓解数据库读写压力

缺点:

  1. 开发复杂,逻辑比较绕脑子

  2. 不能保证数据的安全性,如果Redis某段时间挂掉了可能会丢失数据以及同步数据库不及时,可能会导致数据被淘汰。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

[外链图片转存中…(img-IWVHi7Gt-1712050951330)]
[外链图片转存中…(img-56710MXt-1712050951331)]
[外链图片转存中…(img-yX6UZ1Gx-1712050951331)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5gHIsz4P-1712050951332)]

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

[外链图片转存中…(img-cHMUUagJ-1712050951332)]

[外链图片转存中…(img-VDM0REac-1712050951332)]

更多推荐