瑞吉外卖-项目笔记

文章目录

  • 1.业务开发
    • day01
      • 1.软件开发整体介绍
      • 2.项目整体介绍:star:
      • 3.开发环境搭建
      • 4.登录功能:star
        • 4.1代码实现
      • 5.退出功能
      • 6.页面效果出现
    • day02
      • 1.完善登录功能
      • 2.新增员工功能

1.业务开发

day01

1.软件开发整体介绍

image-20230418160022895

2.项目整体介绍⭐️

  • 后端:管理菜品和员工信息
  • 前台:通过手机端,可以浏览菜品和添加客户端

开发项目流程:

  1. 实现基本需求,用户能在手机浏览器访问
  2. 对移动端应用改进,使用微信小程序实现
  3. 对系统进行优化升级,提高系统的使用性能

技术选型:

image-20230418161113532

功能架构:

image-20230418161313098

角色:

image-20230418161548324

3.开发环境搭建

  • 涉及数据库 + maven
  1. 数据库表介绍:

    image-20230418162508678

  2. Maven项目搭建

    • 第一步,先创建一个maven空项目,然后设置好pom.xml文件和application.yml文件
    • 第二步,配置springboot环境,启动测试
    • 第三部,导入前端静态资源,加入配置类来将浏览器路径和本地项目文件路径做匹配
    @Slf4j
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurationSupport {
        /**
         * 设置静态资源映射
         * @param registry
         */
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            log.info("开始进行静态资源映射...");
            registry.addResourceHandler("/backend/**").//浏览器地址栏
                    //映射到真实的路径(映射的真实路径末尾必须添加斜杠`/`)
                    addResourceLocations("classPath:/backend/");//这里不要加空格符,贴着放
            registry.addResourceHandler("/front/**")
                    .addResourceLocations("classpath:/front/");
        }
    }
    

    image-20230419150520685

    image-20230423173134325

4.登录功能:star

查看项目代码的一般逻辑:

​ 前端html界面,找到响应的元素,找到对应的js动态方法,分析发送(Ajax)请求到后端的过程,处理好后端代码,返回处理的R对象给前端来判断使用(判断运用是否正确),最后前端再决定跳转到哪一个界面

  1. 需求分析

    image-20230419150858041

    image-20230419150914903

    前端代码

    image-20230419152731239

  2. 功能结构

    image-20230419154734461

4.1代码实现

  1. 导入通用返回结果类R类

    ​ 前端代码与R类关系

    image-20230423162923815

    image-20230423172106131

    R类

    image-20230423163304568

  2. 梳理登录方法逻辑

    image-20230423163746913

  3. 代码实现

    image-20230423165934138

5.退出功能

  1. 功能逻辑

    image-20230423172351107

    image-20230423172709483

6.页面效果出现

  • index.html

    menuList属性值封装了不同页面的信息

    image-20230423175130747

    image-20230423175323900

    image-20230423175420479

    image-20230423175447538


day02

完成功能:

image-20230424112008865

1.完善登录功能

  1. 问题分析

    使用过滤器或者拦截器实现

    image-20230424112108845

  2. 代码实现步骤

    image-20230424112250325

    image-20230424113952813

  3. 具体实现

    • 1.拦截器用原生的Servlet拦截,因此主加载类要加上@ServletComponentScan注解拦截

      2.加上日志注解,能够使用日志输出

    image-20230424113338495

    image-20230424113552766

    • 2.具体逻辑

    前端处理部分

    image-20230424132741858

    前端处理响应拦截器:如果是这个状态那么自动跳转回登录页面

    image-20230424130031089

    后端部分:

    package com.itiheima.reggie.filter;
    
    import com.alibaba.fastjson.JSON;
    import com.itiheima.reggie.entity.R;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.util.AntPathMatcher;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author qin start
     * @create 2023-04-24-11:28
     */
    @WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")//拦截所有路径
    @Slf4j
    public class LoginCheckFilter implements Filter {
    
        //spring路径匹配器
        public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //转成http格式的Servlet
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
    
    
    //        1、获取本次请求的URI
            //定义不需要处理的请求路径
            String url = request.getRequestURI();
            String[] urls = new String[]{
                    "/employee/login",
                    "/employee/logout",
                    "/backend/**",//静态资源放行
                    "/front/**"
            };
    //        2、判断本次请求是否需要处理
            boolean check = check(url, urls);
    //        3、如果不需要处理,则直接放行
            if(check){
                log.info("拦截到的请求:{}",url);
                filterChain.doFilter(request,response);
                return;
            }
    //        4、判断登录状态,如果已登录,则直接放行
            //通过判断session存储的数据
            if(request.getSession().getAttribute("id") != null){
                log.info("登陆成功!用户id为:{}",request.getSession().getAttribute("id"));
                filterChain.doFilter(request,response);
                return;
            }
    //        5、如果未登录则返回未登录结果
    //
            //这里要用输出流,因为不是控制器自动返回json格式对象
            log.info("登陆失败!跳转回登录界面");
            response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));//不放行
            return;
        }
    
        /**
         * 判断请求路径是否在不需要处理的路径里
         * @param url
         * @param urls
         * @return
         */
        public boolean check(String url,String[] urls){
            for (String pattern : urls) {
                //这里顺序不能搞反,第一个参数为匹配模式
                if(PATH_MATCHER.match(pattern,url)){
                    return true;
                }
            }
            return false;
        }
    }
    
    

2.新增员工功能

  1. 功能
  • 数据模型中,employee字段要唯一

image-20230424190955264

image-20230424191103342

  1. 执行流程

    image-20230424191315458

  2. 代码实现

    @PostMapping
    public R<String> addEmployee(HttpServletRequest request,@RequestBody Employee employee){
    
        //        log.info(employee.toString());
    
        //设置初始密码
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes(StandardCharsets.UTF_8)));
    
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());
    
        employee.setCreateUser((long)request.getSession().getAttribute("id"));
        employee.setUpdateUser((long)request.getSession().getAttribute("id"));
    
        employeeService.save(employee);
    
        return R.success("新增员工成功");
    }
    
    1. 处理数据库插入重复名字异常

      image-20230424195410588

      全局异常处理器来处理异常

      关键点在@ControllerAdvice和@ExceptionHandler,一个用来拦截方法,一个用来处理异常

      @ControllerAdvice捕获方法后,有异常就处理

      @ControllerAdvice(annotations = {RestController.class, Controller.class})
      @ResponseBody//java对象转为json格式的数据
      @Slf4j
      public class GlobalExceptionHandler {
      
          //用来捕获插入重复数据异常
          @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
          public R<String> exceptionHandler (SQLIntegrityConstraintViolationException exception){
              log.error(exception.getMessage());
              return R.error("failed");
          }
      }
      
      //用来捕获插入重复数据异常
      @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
      public R<String> exceptionHandler (SQLIntegrityConstraintViolationException exception){
          if (exception.getMessage().contains("Duplicate entry")){
              String[] split = exception.getMessage().split(" ");//根据空格符分割数组
              String msg = split[2] + "已存在";
              return R.error(msg);
          }
          return R.error("unknown error");
      }
      
    2. 小结:

      image-20230424202223370

essage().contains(“Duplicate entry”)){
String[] split = exception.getMessage().split(" ");//根据空格符分割数组
String msg = split[2] + “已存在”;
return R.error(msg);
}
return R.error(“unknown error”);
}
```

  1. 小结:

    [外链图片转存中…(img-Qsbxgl5v-1682343238991)]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于web的病号康复训练系统asp.net+sqlserver+C#

本系统主要内容分为病号管理模块,康复师管理模块,管理员管理模块等三大模块 1,病号管理模块主要分为:用户管理,在线问答,在线预约,用户中心,信息查询. 2. 康复师管理模块主要有:康复师信息管理,病人信息管理&#xff0c;预约信息管理&#xff0c;留言信息管理&#xff0c;训练计…

< elementUi组件封装: 通过 el-tag、el-popover、vue动画等实现公告轮播 >

文章目录 &#x1f449; 前言&#x1f449; 一、效果演示&#x1f449; 二、实现思路&#x1f449; 三、实现案例往期内容 &#x1f4a8; &#x1f449; 前言 在 Vue elementUi 开发中&#xff0c;遇到这么一个需求&#xff0c;要实现公告轮播的效果。说实话&#xff0c;一开…

C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

C、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数 &#xff08;侯捷&#xff09; 迭代器iterator_category 算法accumulatefor_eachreplacecountfindsortbinary_search 仿函数 functors(六大部件中最简单的一种&#xff01;) 使用一个东西&#xff0c;却不明白它的道理&a…

Android类似微信首页的页面开发教程(Kotlin)二

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …

【Vue】学习笔记-Vue生命周期

引出生命周期 生命周期 a.又名生命周期回调函数、生命周期函数、生命周期钩子 b.是什么&#xff1a;vue 在关键时刻帮助我们调用一些特殊名称的函数 c.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的 d.生命周期函数中的this指向是vm或组件实…

拷贝构造与深浅拷贝

文章目录 一、拷贝构造函数二、拷贝初始化三、深浅拷贝 一、拷贝构造函数 如果一个构造函数的第一个参数是自身类型的引用&#xff0c;而且任何额外参数都有默认值&#xff0c;则此构造函数是拷贝构造函数。 class person { public: person(); //默认构造函数 pe…

米文动力 EVO Orin 刷机和克隆操作说明

刷机说明 博主在卸载 cuda 以及 python 后重启后黑屏无法显示&#xff0c;重刷系统才恢复正常。 下载 EVO Orin 用户手册&#xff08;官网没有&#xff0c;所以上传到 CSDN 供下载&#xff09;官网下载 EVO Orin 镜像文件 使用 tar -xvf 解压下载的 bootloader 和镜像包得到 …

计算机办公自动化——Python批量生成请假条

Python使用openpyxl、docx批量生成请假条 前言第三方库的安装示例代码运行效果 前言 加入你有一个下图所示的表格&#xff0c;需要批量生成他们的请假条&#xff0c;你会选择如何做呢&#xff1f;是一步一步的手打&#xff0c;还是呼唤请假人手打呢&#xff1f; 下面我们来看…

react中前端同学如何模拟使用后端接口操作数据?

为什么前端同学需要模拟后端数据 作为一个前端&#xff0c;在实现项目功能的时候&#xff0c;需要在前端写一个静态的json数据&#xff0c;进行测试。 项目中后端的接口往往是较晚才会出来&#xff0c;并且还要写接口文档&#xff0c;于是我们的前端的许多开发都要等到接口给…

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用&#xff0c;是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估&#xff08;Millennium ecosystem assessment&#xff0c;MA&#xff09;提出生态系统服务包括供给、调节、…

[pgrx开发postgresql数据库扩展]4.基本计算函数的编写与性能对比

前言 再次声明&#xff1a; 并不是所有场景都需要&#xff08;或者适合&#xff09;用rust来写的&#xff0c;绝大部分操作数据库的功能和计算&#xff0c;用SQL就已经足够了&#xff01; 本系列中&#xff0c;所有的案例&#xff0c;仅用于说明pgrx的能力&#xff0c;而并非…

Docker --- 简介、安装

一、什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署&#xff0c;环境不一定一致&#xff0c;会…

基于Java+SpringBoot+vue学生学习平台详细设计实现

基于JavaSpringBootvue学生学习平台详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…

用SQL语句操作Oracle数据库——数据更新

数据更新 数据库中的数据更新操作有3种&#xff1a;1)向表中添加若干行数据&#xff08;增&#xff09;&#xff1b;2&#xff09;删除表中的若干行数据&#xff08;删&#xff09;&#xff1b;3&#xff09;修改表中的数据&#xff08;改&#xff09;。对于这3种操作&#xf…

seleniumUI自动化登录失败案例重新尝试WhileTrue

一个用户每次登录失败&#xff0c;失败N次&#xff0c;无法进入下一url时&#xff0c;怎样会重新尝试N次重新登录呢 &#xff1f; 我们可以使用wihile true判断&#xff0c;并使用currenturl判断&#xff0c;下面就介绍以下个人的方法 currenturlEGTconfigFile.driver.curren…

学系统集成项目管理工程师(中项)系列11b_沟通管理(下)

1. 沟通过程的有效性 1.1. 效果 1.1.1. 在适当的时间、适当的方式、信息被准确的发送给适当的沟通参与方&#xff08;信息的接收方&#xff09;&#xff0c;并且能够被正确的理解&#xff0c;最终参与方能够正确的采取行动 1.2. 效率 1.2.1. 强调的是及时提供所需的信息 2…

深度学习 - 43.SeNET、Bilinear Interaction 实现特征交叉 By Keras

目录 一.引言 二.SENET Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Function 2.4 Test Main Function 2.5 完整代码 三.BiLinear Intercation Layer 1.简介 2.Keras 实现 2.1 Init Function 2.2 Build Function 2.3 Call Functi…

使用AI优化慢SQL,开发秒变DBA

“AI不会替代他们&#xff0c;但善用AI的人会” 慢 SQL 经常会让应用程序响应变慢&#xff0c;轻者影响用户体验&#xff0c;严重的时候可能会导致服务不可用。如果&#xff0c;每次遇到慢 SQL 都求助于 DBA&#xff0c;一方面效率很低&#xff0c;另一方面也会很没面子。所以…

聊聊如何通过APT+AST来实现AOP功能

前言 如果有使用过spring aop功能的小伙伴&#xff0c;应该都会知道spring aop主要是通过动态代理在运行时&#xff0c;对业务进行切面拦截操作。今天我们就来实现一下如何通过APTAST在编译期时实现AOP功能。不过在此之前先科普一下APT和AST相关内容 APT&#xff08;注解处理…

openEuler-linux下部署zabbix-超级详细

一、准备工作 下载&#xff1a;zabbix包 地址&#xff1a;下载Zabbix 准备2台openEuler-linux虚拟机&#xff1a; linux-1&#xff1a;当服务器端 IP地址&#xff1a;192.168.100.100 修改hosts文件 [rootzbx ~]# vim /etc/hosts 192.168.100.100 zbx.xx.cn linux-2&…
最新文章