• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

瑞吉外卖项目带资料——遇到的问题和解决方法,有用的知识点

武飞扬头像
坚强果
帮助1

目录

一、Pom依赖

二、 application.yml配置

三、filter过滤器实现强制登录

四、基于Mybatis-Plus的功能 

 五、文件的上传与下载

六、总结 

七、相关资源下载


一、Pom依赖

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.  
    <modelVersion>4.0.0</modelVersion>
  5.  
    <parent>
  6.  
    <groupId>org.springframework.boot</groupId>
  7.  
    <artifactId>spring-boot-starter-parent</artifactId>
  8.  
    <version>2.5.0</version>
  9.  
    <relativePath/> <!-- lookup parent from repository -->
  10.  
    </parent>
  11.  
    <groupId>com.example</groupId>
  12.  
    <artifactId>reggie</artifactId>
  13.  
    <version>0.0.1-SNAPSHOT</version>
  14.  
    <name>reggie</name>
  15.  
    <description>reggie</description>
  16.  
    <properties>
  17.  
    <java.version>8</java.version>
  18.  
    </properties>
  19.  
    <dependencies>
  20.  
    <dependency>
  21.  
    <groupId>org.springframework.boot</groupId>
  22.  
    <artifactId>spring-boot-starter-web</artifactId>
  23.  
    </dependency>
  24.  
    <dependency>
  25.  
    <groupId>org.mybatis.spring.boot</groupId>
  26.  
    <artifactId>mybatis-spring-boot-starter</artifactId>
  27.  
    <version>3.0.0</version>
  28.  
    </dependency>
  29.  
     
  30.  
    <dependency>
  31.  
    <groupId>mysql</groupId>
  32.  
    <artifactId>mysql-connector-java</artifactId>
  33.  
    <scope>runtime</scope>
  34.  
    </dependency>
  35.  
    <dependency>
  36.  
    <groupId>org.projectlombok</groupId>
  37.  
    <artifactId>lombok</artifactId>
  38.  
    <optional>true</optional>
  39.  
    </dependency>
  40.  
    <dependency>
  41.  
    <groupId>org.springframework.boot</groupId>
  42.  
    <artifactId>spring-boot-starter-test</artifactId>
  43.  
    <scope>test</scope>
  44.  
    </dependency>
  45.  
    <dependency>
  46.  
    <groupId>com.alibaba</groupId>
  47.  
    <artifactId>fastjson</artifactId>
  48.  
    <version>1.2.76</version>
  49.  
    </dependency>
  50.  
    <dependency>
  51.  
    <groupId>com.alibaba</groupId>
  52.  
    <artifactId>druid-spring-boot-starter</artifactId>
  53.  
    <version>1.1.23</version>
  54.  
    </dependency>
  55.  
    <dependency>
  56.  
    <groupId>com.baomidou</groupId>
  57.  
    <artifactId>mybatis-plus-boot-starter</artifactId>
  58.  
    <version>3.4.2</version>
  59.  
    </dependency>
  60.  
    <dependency>
  61.  
    <groupId>commons-lang</groupId>
  62.  
    <artifactId>commons-lang</artifactId>
  63.  
    <version>2.6</version>
  64.  
    </dependency>
  65.  
    </dependencies>
  66.  
     
  67.  
    <build>
  68.  
    <plugins>
  69.  
    <plugin>
  70.  
    <groupId>org.springframework.boot</groupId>
  71.  
    <artifactId>spring-boot-maven-plugin</artifactId>
  72.  
    <configuration>
  73.  
    <excludes>
  74.  
    <exclude>
  75.  
    <groupId>org.projectlombok</groupId>
  76.  
    <artifactId>lombok</artifactId>
  77.  
    </exclude>
  78.  
    </excludes>
  79.  
    </configuration>
  80.  
    </plugin>
  81.  
    </plugins>
  82.  
    </build>
  83.  
     
  84.  
    </project>

二、 application.yml配置

  1.  
    server:
  2.  
    port: 8080
  3.  
    spring:
  4.  
    application:
  5.  
    name: reggie
  6.  
    datasource:
  7.  
    druid:
  8.  
    driver-class-name: com.mysql.cj.jdbc.Driver
  9.  
    url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
  10.  
    username: root
  11.  
    password: 123456
  12.  
    mybatis-plus:
  13.  
    configuration:
  14.  
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
  15.  
    map-underscore-to-camel-case: true
  16.  
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  17.  
    global-config:
  18.  
    db-config:
  19.  
    id-type: ASSIGN_ID
  20.  
    reggie:
  21.  
    path: E:\pic\
  22.  
    #图片保存与下载位置

三、filter过滤器实现强制登录

  • 防止用户没有登录就能直接访问到其他页面
  • LoginCheckFilter类
  1.  
    @WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
  2.  
    @Slf4j
  3.  
    public class LoginCheckFilter implements Filter{
  4.  
    //路径匹配器,支持通配符
  5.  
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
  6.  
     
  7.  
    @Override
  8.  
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9.  
    HttpServletRequest request = (HttpServletRequest) servletRequest;
  10.  
    HttpServletResponse response = (HttpServletResponse) servletResponse;
  11.  
     
  12.  
    //1、获取本次请求的URI
  13.  
    String requestURI = request.getRequestURI();// /backend/index.html
  14.  
     
  15.  
    log.info("拦截到请求:{}",requestURI);
  16.  
     
  17.  
    //定义不需要处理的请求路径
  18.  
    String[] urls = new String[]{
  19.  
    "/employee/login",
  20.  
    "/employee/logout",
  21.  
    "/backend/**",
  22.  
    "/front/**",
  23.  
    "/common/**",
  24.  
    "/user/sendMsg",
  25.  
    "/user/login"
  26.  
    };
  27.  
     
  28.  
    //2、判断本次请求是否需要处理
  29.  
    boolean check = check(urls, requestURI);
  30.  
     
  31.  
    //3、如果不需要处理,则直接放行
  32.  
    if(check){
  33.  
    log.info("本次请求{}不需要处理",requestURI);
  34.  
    filterChain.doFilter(request,response);
  35.  
    return;
  36.  
    }
  37.  
     
  38.  
    //4-1、判断登录状态,如果已登录,则直接放行
  39.  
    if(request.getSession().getAttribute("employee") != null){
  40.  
    log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
  41.  
     
  42.  
    Long empId = (Long) request.getSession().getAttribute("employee");
  43.  
    BaseContext.setCurrentId(empId);
  44.  
     
  45.  
    filterChain.doFilter(request,response);
  46.  
    return;
  47.  
    }
  48.  
     
  49.  
    //4-2、判断登录状态,如果已登录,则直接放行
  50.  
    if(request.getSession().getAttribute("user") != null){
  51.  
    log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("user"));
  52.  
     
  53.  
    Long userId = (Long) request.getSession().getAttribute("user");
  54.  
    BaseContext.setCurrentId(userId);
  55.  
     
  56.  
    filterChain.doFilter(request,response);
  57.  
    return;
  58.  
    }
  59.  
     
  60.  
    log.info("用户未登录");
  61.  
    //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
  62.  
    response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
  63.  
    return;
  64.  
     
  65.  
    }
  66.  
     
  67.  
    /**
  68.  
    * 路径匹配,检查本次请求是否需要放行
  69.  
    * @param urls
  70.  
    * @param requestURI
  71.  
    * @return
  72.  
    */
  73.  
    public boolean check(String[] urls,String requestURI){
  74.  
    for (String url : urls) {
  75.  
    boolean match = PATH_MATCHER.match(url, requestURI);
  76.  
    if(match){
  77.  
    return true;
  78.  
    }
  79.  
    }
  80.  
    return false;
  81.  
    }
  82.  
    }
  • BaseContext类
  1.  
    /**
  2.  
    * 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
  3.  
    */
  4.  
    public class BaseContext {
  5.  
    private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
  6.  
     
  7.  
    /**
  8.  
    * 设置值
  9.  
    * @param id
  10.  
    */
  11.  
    public static void setCurrentId(Long id){
  12.  
    threadLocal.set(id);
  13.  
    }
  14.  
     
  15.  
    /**
  16.  
    * 获取值
  17.  
    * @return
  18.  
    */
  19.  
    public static Long getCurrentId(){
  20.  
    return threadLocal.get();
  21.  
    }
  22.  
    }
  • 注意要在SpringBootApplication上加
    @ServletComponentScan
  • 注解后可以直接通过  @WebFilter注解自动注册

学新通

四、基于Mybatis-Plus的功能 

  • 分页功能例子
  1.  
    /**
  2.  
    * 员工信息分页查询
  3.  
    * @param page
  4.  
    * @param pageSize
  5.  
    * @param name
  6.  
    * @return
  7.  
    */
  8.  
    @GetMapping("/page")
  9.  
    public R<Page> page(int page, int pageSize, String name){
  10.  
    log.info("page = {},pageSize = {},name = {}" ,page,pageSize,name);
  11.  
     
  12.  
    //构造分页构造器
  13.  
    Page pageInfo = new Page(page,pageSize);
  14.  
     
  15.  
    //构造条件构造器
  16.  
    LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
  17.  
    //添加过滤条件
  18.  
    queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
  19.  
    //添加排序条件
  20.  
    queryWrapper.orderByDesc(Employee::getUpdateTime);
  21.  
     
  22.  
    //执行查询
  23.  
    employeeService.page(pageInfo,queryWrapper);
  24.  
     
  25.  
    return R.success(pageInfo);
  26.  
    }
  •  Mybatis-Plus直接帮我们节省了写SQL语句的步骤,简单的增删改查直接service调用即可
  • 复杂的SQL语句通过LambdaQueryWrapper来完成

 五、文件的上传与下载

  1.  
    package com.xjj.controller;
  2.  
     
  3.  
    import com.xjj.common.R;
  4.  
    import lombok.extern.slf4j.Slf4j;
  5.  
    import org.springframework.beans.factory.annotation.Value;
  6.  
    import org.springframework.web.bind.annotation.*;
  7.  
    import org.springframework.web.multipart.MultipartFile;
  8.  
     
  9.  
    import javax.servlet.ServletOutputStream;
  10.  
    import javax.servlet.http.HttpServletResponse;
  11.  
    import java.io.File;
  12.  
    import java.io.FileInputStream;
  13.  
    import java.io.FileNotFoundException;
  14.  
    import java.io.IOException;
  15.  
    import java.util.UUID;
  16.  
     
  17.  
    /**
  18.  
    * 文件上传和下载
  19.  
    */
  20.  
    @RestController
  21.  
    @RequestMapping("/common")
  22.  
    @Slf4j
  23.  
    public class CommonController {
  24.  
     
  25.  
    @Value("${reggie.path}")
  26.  
    private String basePath;
  27.  
     
  28.  
    /**
  29.  
    * 文件上传
  30.  
    * @param file
  31.  
    * @return
  32.  
    */
  33.  
    @PostMapping("/upload")
  34.  
    public R<String> upload(MultipartFile file){
  35.  
    //file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
  36.  
    log.info(file.toString());
  37.  
     
  38.  
    //原始文件名
  39.  
    String originalFilename = file.getOriginalFilename();//abc.jpg
  40.  
    String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
  41.  
     
  42.  
    //使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
  43.  
    String fileName = UUID.randomUUID().toString() suffix;//dfsdfdfd.jpg
  44.  
     
  45.  
    //创建一个目录对象
  46.  
    File dir = new File(basePath);
  47.  
    //判断当前目录是否存在
  48.  
    if(!dir.exists()){
  49.  
    //目录不存在,需要创建
  50.  
    dir.mkdirs();
  51.  
    }
  52.  
     
  53.  
    try {
  54.  
    //将临时文件转存到指定位置
  55.  
    file.transferTo(new File(basePath fileName));
  56.  
    } catch (IOException e) {
  57.  
    e.printStackTrace();
  58.  
    }
  59.  
    return R.success(fileName);
  60.  
    }
  61.  
     
  62.  
    /**
  63.  
    * 文件下载
  64.  
    * @param name
  65.  
    * @param response
  66.  
    */
  67.  
    @GetMapping("/download")
  68.  
    public void download(String name, HttpServletResponse response){
  69.  
     
  70.  
    try {
  71.  
    //输入流,通过输入流读取文件内容
  72.  
    FileInputStream fileInputStream = new FileInputStream(new File(basePath name));
  73.  
     
  74.  
    //输出流,通过输出流将文件写回浏览器
  75.  
    ServletOutputStream outputStream = response.getOutputStream();
  76.  
     
  77.  
    response.setContentType("image/jpeg");
  78.  
     
  79.  
    int len = 0;
  80.  
    byte[] bytes = new byte[1024];
  81.  
    while ((len = fileInputStream.read(bytes)) != -1){
  82.  
    outputStream.write(bytes,0,len);
  83.  
    outputStream.flush();
  84.  
    }
  85.  
     
  86.  
    //关闭资源
  87.  
    outputStream.close();
  88.  
    fileInputStream.close();
  89.  
    } catch (Exception e) {
  90.  
    e.printStackTrace();
  91.  
    }
  92.  
     
  93.  
    }
  94.  
    }

六、总结 

  • 瑞吉项目总体来说难度不大,很适合入门的练手,巩固基础,更好的了解Spring框架 

七、相关资源下载

  • 我的代码

  •  黑马的资料

https://jianguo666.lanzoum.com/b02k437wj 密码:1234

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhfhff
系列文章
更多 icon
同类精品
更多 icon
继续加载