瑞吉外卖实战-笔记

news2024/11/14 5:46:57

软件开发的流程
在这里插入图片描述

角色分工
在这里插入图片描述

软件环境
在这里插入图片描述

开发环境的搭建

数据库环境

maven环境
1.创建完成后,需要检查一下编码、maven仓库、jdk等

<parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.7.12</version>
</parent>
//注意:3.0版本以下使用的java版本是11,

2.导入pom

 <dependencies>
<!--sb的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
<!--sb的测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--springboot的web使用依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>
<!--mybatisplus的起步依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
<!--json数据包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
<!--数据库的驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.33</version>
        </dependency>
<!--数据源的依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>
<!--阿里云的短信服务-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.4.5</version>
</plugin>
</plugins>
</build>

1.Filter-过滤器

作用:用于登录校验,未登录禁止访问

@WebFilter(filterName = "EmployeeLoginFilter",urlPatterns = "/*"),申明过滤器,名称自取,拦截路径为所有路径
想要使用过滤器,需要在启动类添加 @ServletComponentScan 注解

实现逻辑

  1. 创建一个类,实现Filter
  2. 重写doFilter方法
  3. 定义放行的路径数组
String[] url=new String[]
{ "/employee/login","/employee/logout","/common/**","/user/sendMsg","/user/login","/backend/**","/front/**"
};
//"/employee/login","/employee/logout"这是controller中的路径
//"/backend/**""/common/**",静态资源路径,即前端页面代码,路径从resources第一个包开始

4.获取前端请求路径,与以上的放行路径进行对比

HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse= (HttpServletResponse) servletResponse;
String requestURI = httpServletRequest.getRequestURI();//获取前端请求路径

5.遍历对比信息

public static final AntPathMatcher antPathMatcher=new AntPathMatcher();//路径对比器
public boolean pathmatch(String[] url,String requesturl)//自定义对比方法
    {
        for (String path:url
             ) {
            boolean match = antPathMatcher.match(path, requesturl);
            if(match)
            {
                return true;
            }
        }
        return false;
    }

6.调用自定义的方法,boolean pathmatch = this.pathmatch(url, requestURI);如果为true,则匹配成功,放行, filterChain.doFilter(httpServletRequest,httpServletResponse);这两个参数为doFilter的参数
7.如果没有进行前后端分离的话,在跳转到登录命令的controller后,需要设置一个session属性,用于判断是否登录

//Longincontroller,方法中需要自定义一个HttpServletRequest对象
request.getSession().setAttribute("employee",one.getId());

8.判断session是否存在,不存在则表示未登录
Object employee = httpServletRequest.getSession().getAttribute(“employee”);

2.MybatisPlus的分页查询-Pageconfig

作用:自定义分页,无需手动构造分页内容

@Configuration
public class PageConfig {

    @Bean
   public MybatisPlusInterceptor mybatisPlusInterceptor()
   {
       MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
       mybatisPlusInterceptor.addInnerInterceptor( new PaginationInnerInterceptor());
       return mybatisPlusInterceptor;
   }
}
//通过Page<Object> page=new Page<>(起始页,每页条数)可直接使用

3.公共字段填充-MetaObjectHander

作用:数据表发生变化时,自动添加某些字段

实现逻辑
1.自定义类实现MetaObjectHandler类
2.重写insertFill方法/updateFill方法
3.添加公共参数

metaObject.setValue("updateTime", LocalDateTime.now())//第一个参数为数据表字段名称;

4.MybatisPlus

作用:mybatis的升级,不用手动编写sql

注意:使用mybatisplus,数据层与业务层有所不同

`
//数据层
@Mapper
public interface Mapper extends BaseMapper<实体类名>
//业务层接口
public interface Service extends IService<实体类名> {}
//业务层实现类
@Service
public class ServiceImpl extends ServiceImpl<Mapper,实体类名> implements Service {}`

想要使用mybatisplus自带的命令
1.构造一个条件对象
LambdaQueryWrapper<实体类> queryWrapper=new LambdaQueryWrapper<>();查找条件
LambdaUpdateWrapper<实体类> updateWrapper=new LambdaUpdateWrapper<>();条件更新
2.通过条件对象进行sql操作

5.数据传输对象-Dto

作用:将多个表单对象封装到一起,用于前端展示
步骤
1.创建表单类A、B
2.自定义一个类,继承A类
3.在自定义类中定义其他属性(集合/字符串/整形等)
4.集合中的参数为表单类B

@Data
public class DishDto extends Dish {

    private List<DishFlavor> flavors = new ArrayList<>();

    private String categoryName;

    private Integer copies;
}

6.后端响应结果集

将后端的发送的数据进行封装,在前端页面展示

//结果类包含的内容
private Integer code;//用于表示后端处理成功或失败
private String msg;//用于对后端处理结果的描述
private T data;//定义一个泛型,用于将后端处理后的数据传到前端

自定义泛型类
public class R<T> {
    // 类成员和方法的定义
}

泛型类的构造方法,返回值是一个泛型
public static <T>R<T>success(T obj)
    {
        R<T> r=new R<T>();
        r.data=obj;
        r.code=1;
        return r;
    }
    public static <T>R<T>error(String msg)
    {
        R r=new R();
        r.msg=msg;
        r.code=0;
        return r;
    }

7.自定义异常类

作用:捕获后端异常,当后端发生异常时,能够及时通知到前端

1.自定义异常类
//根据需要,继承想要展示的异常
public class CustomException extends RuntimeException{
public CustomException(String msg)
{
super(msg);		//调用父类的构造方法
}
}

2.定义异常处理类-ExceptionHandler
//@RestControllerAdvice通常与ExceptionHandler注解连用
@RestControllerAdvice(annotations = RestController.class)//=@Responsebody+@ControllerAdvice,参数为被拦截的错误来源
@Slf4j
public class ExceptionHandler {
    @org.springframework.web.bind.annotation.ExceptionHandler(CustomException.class)//处理异常类
    //SQLIntegrityConstraintViolationException e
    public R<String> ex(SQLIntegrityConstraintViolationException e)
    {
    log.info("异常处理");
    if(e.getMessage().contains("Duplicate entry"))//e.getmessage,就能获取到自定义错误的信息
    {
        System.out.println(e.getMessage());
        String[] errstr= e.getMessage().split(" ");
        for (String s:errstr
             ) {
            System.out.println(s);
        }
        String msg=errstr[2]+"已存在";
        log.info(msg);
        return R.error(msg);
    }
    return R.error("失败了");
    }

8.多线程-ThreadLocal

作用
1.跟踪请求处理过程中的数据:如将用户的标识(比如用户ID)存储在 threadLocal 中,这样在整个请求处理过程中都可以方便地获取和使用它
2.线程隔离的数据存储:一些数据在多线程环境中是线程私有的,并且不同线程之间的数据不应该相互干扰,可以使用 ThreadLocal 来实现数据的线程隔离。

//一般在校验登录的时候就为其赋值,将初始化的session赋给threadLocal,对象.方法调用即可
public class BaseContext {
    private static ThreadLocal<Long> threadLocal=new ThreadLocal<>();//通过这个方法就能随时获取sessionid,不用构建HttpServletRequest参数对象
    public static void setThreadLocal(Long integer)
    {
        threadLocal.set(integer);
    }
    public static Long getThreadLocal()
    {
        return threadLocal.get();
    }
}

10.文件上传下载-文件存储与本地,数据库只存储文件名

文件上传
1.获取上传的文件后缀名称
2.生成唯一的文件名称
3.校验存储位置的文件夹是否存在
4.转存到对应的文件夹

@Value("${reggie.path}")//配置文件自定义文件夹路径
    private String path;
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException //上传的文件对象参数名,必须与前端的input框的name名字一致,且文件对象必须是MultipartFile
    {
        //上传的file文件是一个临时文件,需要转存,不然本次操作后,该文件就会销毁消失
        String originalFilename = file.getOriginalFilename(); //获取文件上传时的名称
        log.info(originalFilename);
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//获取上传文件的后缀
        log.info(file+"这是前端的对象信息");
        String filename = UUID.randomUUID().toString()+suffix;//UUID生成一个唯一的名字
        log.info(filename);
        /**
         * 判断配置文件 @Value("${reggie.path}")的目录是否存在,没有就创建
         */

        File dir=new File(path);
        log.info("dir"+dir);
        if(!dir.exists())
        {
            log.info("创建文件");
            dir.mkdirs();//创建@Value("${reggie.path}")的文件夹
        }

        file.transferTo(new File(path+"/"+filename));   //将临时文件转存到该路径
        return R.success(filename);
    }

文件下载

@GetMapping("/download")
    public void download(String name, HttpServletResponse response)//name为图片存储地址
    {
        //下载文件需要经过两个步骤,读数据流,写数据流
        try {
            FileInputStream fileInputStream=new FileInputStream(new File(path+"/"+name));//输入流,将文件地址写入
            ServletOutputStream outputStream = response.getOutputStream();//输出流,因为这里需要将数据流显示到前端,所以用HttpServletResponse
            response.setContentType("image/jpeg");//设置传输到前端的数据格式
            int len=0;
            byte[] bytes=new byte[1024];
            while((len=fileInputStream.read(bytes))!=-1)//len是每次读取的字节数,bytes是存储读出字节的内容,fileInputStream.read是读取输入流,当读取完最后一个数时,len=-1
            {
                outputStream.write(bytes,0,len);//输出流,outputStream = response.getOutputStream(),写入bytes数组中的内容,从0开始写入,长度是len
                outputStream.flush();//刷新数据流
            }
            outputStream.close();//关闭输出流
            fileInputStream.close();//关闭输入流
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/833580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 监听Mysql binlog

使用 mysql-binlog-connector-java 1. mysql-binlog-connector-java 官网 2. Java代码中&#xff0c;如何监控Mysql的binlog&#xff1f; 前置条件 1. mysql服务器表结构 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 C…

meedu二次开发:企业内部使用 必须登录之后才能查看里面内容

meedu二次开发&#xff1a;修改成企业内部培训系统功能 用户必须登录之后才能查看里面课程内容

20天学rust(一)和rust say hi

关注我&#xff0c;学习Rust不迷路 工欲善其事&#xff0c;必先利其器。第一节我们先来配置rust需要的环境和安装趁手的工具&#xff0c;然后写一个简单的小程序。 安装 Rust环境 Rust 官方有提供一个叫做 rustup 的工具&#xff0c;专门用于 rust 版本的管理&#xff0c;网…

安全学习DAY14_JS信息打点

信息打点——前端JS框架 文章目录 信息打点——前端JS框架小节概述-思维导图JS安全概述什么是JS渗透测试&#xff1f;前后端差异JS安全问题流行的Js框架如何判定JS开发应用&#xff1f; 测试方法&#xff08;JS文件的获取以及分析方法1、手工搜索分析2、半自动Burp分析插件介绍…

实数信号的傅里叶级数研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

临床球囊扩张术中的压力精密控制解决方案

摘要&#xff1a;目前临床用气管导管套囊压力管理中缺乏操作简便和技术成熟的套囊压力自动控制仪器&#xff0c;现有压力测量和控制装置操作繁琐&#xff0c;存在充气增压和放气减压过程不及时和压力不稳定等问题。针对这些问题本文提出了套囊压力自动控制解决方案&#xff0c;…

ad+硬件每日学习十个知识点(20)23.7.31 (芯片和天线间的巴伦电路)

文章目录 1.什么是前端电路&#xff1f;2.什么是巴伦电路&#xff1f;3.巴伦电路的性能参数4.LC巴伦电路5.ADS是干什么的&#xff1f;6.HFSS是干什么的&#xff1f;7.ANSYS有限元软件8.常用的电路仿真软件都有什么&#xff1f;9.巴伦电路的复端阻抗LC10.微带巴伦&#xff08;不…

RuntimeException:Duplicate class xxx found in modules xxx and xxx依赖冲突

在开发的过程中因为多个项目混杂&#xff0c;依赖冲突 在Terminal 中运行gradlew -q app:dependencies查看依赖树。 然后根据依赖树中的版本进行依赖排除&#xff0c;排除低版本的依赖或者冲突的依赖包 implementation (org.web3j:core:4.8.7-android){exclude group:org.bou…

LED光源均匀通用积分球

积分球又称光通球&#xff0c;是一个中空的完整球壳。内壁涂白色漫反射涂料&#xff0c;并且球内壁不同点漫射均衡。采用积分球测量光通量时&#xff0c;能够确保测量结果的可靠性&#xff0c;其可降低并过滤因光线形状、发散角度以及检测部件中不同位置相应度差异引起的测量误…

企业既要用u盘又要防止u盘泄密怎么办?

企业在日常生产生活过程中&#xff0c;使用u盘交换数据是最企业最常用也是最便携的方式&#xff0c;但是在使用u盘的同时&#xff0c;也给企业的数据保密工作带来了很大的挑战&#xff0c;往往很多情况下企业的是通过u盘进行数据泄漏的。很多企业采用一刀切的方式&#xff0c;直…

idea数据库快速上手-库操作与表结构和数据操作

引言 对数据库的操作无非就是执行SQL语句&#xff0c;要想熟练操作数据库&#xff0c;就要熟练运用SQL语句。 一&#xff0c;数据库操作 展示当前服务器内的数据库 -- 展示服务器内的数据库 show databases; show schemas; 执行结果&#xff1a; 创建数据库&#xff1a; --…

Matlab对TMS320F28335编程-新建工程闪烁led灯

前言 工具&#xff1a;Matlab2022b Matlab对接C2000插件&#xff0c;下载连接如下 Embedded Coder Support Package for Texas Instruments C2000 Processors - File Exchange - MATLAB Central 在Matlab中加载此插件后&#xff0c;按照要求一步一步的进行就可以&#xff0c…

JVM 学习—— 类加载机制

前言 在上一篇文章中&#xff0c;荔枝梳理了有关Java中JVM体系架构的相关知识&#xff0c;其中涉及到的有关Java类加载机制的相关知识并没有过多描述。那么在这篇文章中&#xff0c;荔枝会详细梳理一下有关JVM的类加载机制和双亲委派模型的知识&#xff0c;希望能够帮助到有需要…

负数的二进制转换成十进制

对于一个k位的二进制正数&#xff0c;其表示成十进制的结果是&#xff1a; pos[i]表示&#xff1a;这个正数的二进制形式的第i位是1。 i从最低位&#xff08;第0位&#xff09;开始&#xff0c;一直到k-1位。有符号数中&#xff0c;正数的第k-1为0&#xff0c;负数的第k-1位为…

ASP.NET Core学习路线图

说明 1. 先决条件 - [C#](https://www.pluralsight.com/paths/csharp) - [Entity Framework](https://www.pluralsight.com/search?qentity%20framework%20core) - [ASP.NET Core](https://www.pluralsight.com/search?qasp.net%20core) - SQL基础知识 2. 通用开发技能 -…

UG\NX二次开发 属性值连接到表达式

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 利用表达式参数驱动模型形状实现参数化建模,同时将表达式关联到部件属性中,实现自动更新属性值。这将为建模过程带来更大的灵活性和可扩展性。通过将属性值连接到表达式,可以动态地…

数据规约策略

有很多概念平时一直在说&#xff0c;但是具体的应用场景却一直不明确&#xff0c;这会导致我们在实际应用过程中对应该使用的方法不够明确&#xff0c;在此对常用的几种数据挖掘方法使用场景进行分类和整合。 数据降维 为什么要降维 数据稀疏&#xff0c;维度高高维数据采用…

资讯|巴西ANATEL扩展智能电视盒认证要求,ANTATEL认证

2023年7月13日,巴西国家电信局(ANATEL)发布了2023年7月5日的第9281号法案,规定了智能电视盒符合性评估的新技术要求。 国家电信局承认有必要扩大对该设备的现有认证要求,包括在合格评定程序中对可能侵犯音像版权的功能进行审查。这一调整是为了应对越来越多地利用电视盒非法获…

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验二 LED闪烁

目录 前言 一、原理图及知识点介绍 二、代码分析 知识点四&#xff1a;delay(u16 i)这个函数为什么i1时&#xff0c;大约延时10us&#xff1f; 前言 已经是第二个实验了&#xff0c;上一个实验是点亮第一个LED灯&#xff0c;这个实验是LED的闪烁。 一、原理图及知识点介绍…

最细致讲解yolov8模型推理完整代码--(前处理,后处理)

研究yolov8时&#xff0c;一直苦寻不到Yolov8完整的模型推理代码演示&#xff0c;大部分人都是基于Yolo已经封装好的函数调用&#xff0c;这个网上教程很多&#xff0c;本文就不赘述这方面的内容了&#xff0c;接下来将细致全面的讲解yolov8模型推理代码&#xff0c;也就是yolo…