黑马瑞吉外卖练习笔记

news2024/11/24 14:01:59

day2 员工管理

image-20231010095056054

完善登录

问题:用户不登录,直接访问系统首页,照样可以正常访问。我们希望,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面

怎么实现? 用过滤器或拦截器,在过滤器或拦截器中判断用户是否已完成登录,如果没有则跳转到登录页面

image-20231010095518447

image-20231010095602670

package com.itheima.reggie.filter;


import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.ServletComponentScan;
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;

/**
 * 检查用户是否已经完成登录
 */

@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    //路径匹配器,支持通配符
    public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        /**
         * 1. 获取请求的uri
         * 2. 判断本次请求是否需要处理,处理指检查用户登录状态
         * 3. 若不需要处理,则直接放行
         * 4. 判断登录状态,若已登录,则直接放行
         * 5. 如果未登录,则返回未登录结果
         */

        1 获取请求的uri
        String requestURI = request.getRequestURI();

        log.info("拦截到请求:{}",requestURI);

        //2判断本次请求是否需要处理
        //定义不需要处理的请求路径
        String[] urls = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",  //** 为通配符,表示backend下面的所有文件
                "/front/**"

        };
        //检查本次请求是否需要放行
        boolean check = check(requestURI, urls);


        //3.如果不需要处理,则直接放行
        if (check){
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request, response);
            return;
        }

        //4.判断登录状态,若已登录,则直接放行
        if (request.getSession().getAttribute("employee") != null){
            log.info("用户已登录,用户id为{}",request.getSession().getAttribute("employee"));
            filterChain.doFilter(request, response);
            return;
        }

        //5.如果未登录,则返回未登录结果。通过输出流方式向客户端页面响应数据
        log.info("用户未登录");
        String notlogin = JSON.toJSONString(R.error("NOTLOGIN"));
        response.getWriter().write(notlogin);
        return;


    }


    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param requestURI
     * @param urls
     * @return
     */
    public boolean check(String requestURI,String[] urls){
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match){
                return true;
            }
        }
        return false;
    }
}

新增员工

![image-20231010110313372](https://gitee.com/zwx0203/cloudimage/raw/master/202310101103478.png

image-20231010110358545

![image-20231010111521959](https://gitee.com/zwx0203/cloudimage/raw/master/202310101115148.png

image-20231010111738416

全局异常捕获

image-20231010140542799

image-20231010143313534

员工信息分页查询

image-20231010143447390

image-20231010143512597

image-20231010144831410

启用/禁用员工账号

image-20231012143355185

需求分析

image-20231012143431533

image-20231012144452223

image-20231012144520496

代码开发

image-20231012152533676

对于后端,只需更改employee表的status属性

image-20231012152836049

image-20231012155028297

js对Long型数据处理丢失精度

解决方案:服务端给页面响应json数据时,将long型数据统一转为String字符串,如下

image-20231012155139465

怎么做?在配置类中扩展Spring mvc消息转换器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编辑员工信息

image-20231012163145950

image-20231012163317976

day3 分类管理

image-20231016201814098

公共字段自动填充

image-20231016201927863

在实体类的属性上加入@TableField注解

image-20231018181951954

image-20231018191924462

image-20231019154103240

image-20231019154537922

分类 分页查询

image-20231020140809695

删除分类

当分类关联了菜品或者套餐时,此分类不允许删除

image-20231020143239726

删除分类功能完善--------当分类关联了菜品或者套餐时,此分类不允许删除

image-20231020145347714

修改分类

image-20231020160112048

day4 菜品管理

image-20231020165139610

文件上传下载

image-20231020165255658

文件上传介绍

image-20231020165327774

image-20231020165603233

后端文件上传要求

image-20231020165638399

文件下载介绍

image-20231020165910631

文件上传与下载代码

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 文件上传和下载
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}")
    private String bashPath;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    //MultipartFile 参数名必须跟前端的Form Data中的name保存一致,而不能乱取名字
    public R<String> upload(MultipartFile file){
        //file是一个临时文件,需要转存到指定位置,因为本次请求完成后临时文件会自动删除
        //将临时文件转存到指定位置,
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //原始文件后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 直接用上传文件的原名,不建议这么做,因为可能有重名的,则重名的后面会覆盖前面的
        //file.transferTo(new File(bashPath+ originalFilename));

        // 为了防止覆盖问题,我们使用uuid来重新生成文件名, 但需要把原始文件名的后缀拿过来
        String filename = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg

        //创建一个目录对象
        File dir = new File(bashPath);
        //判断当前目录是否存在
        if (!dir.exists()){
            //目录不存在,需要创建
            dir.mkdirs();
        }
        try {
            file.transferTo(new File(bashPath + filename));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        log.info("上传的文件被命名为:{}",filename.toString());
        return R.success(filename);
    }

    /**
     * 文件下载
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        //为什么需要HttpServletResponse?
        //答:要将图片展示在前端页面上,输出流需通过response来获得,而不是自己new
 
        try {
            //输入流,通过输入流读取文件内容
            FileInputStream fileInputStream = new FileInputStream(new File(bashPath + name));

            //输出流,通过输出流将文件写回浏览器,在浏览器展示图片
            ServletOutputStream outputStream = response.getOutputStream();

            //设置响应回去的是图片类型的文件  "image/jpeg"表示图片类型
            response.setContentType("image/jpeg");

            int len = 0;
            byte[] bytes = new byte[1024];

            //fileInputStream.read(bytes) 表示 通过输入流来读,将读到的数据存放到bytes数组中
            //正常返回读了多少数据到bytes数组,返回-1表示输入流读完了,跳出循环
            while ( (len = fileInputStream.read(bytes)) != -1){
                //当fileInputStream.read(bytes)返回的值不为-1,说明还有数据,一直读

                outputStream.write(bytes,0,len);
                outputStream.flush();

            }

            //关闭资源
            outputStream.close();
            fileInputStream.close();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }
}

新增菜品

image-20231023102213499

需求分析

image-20231023102340492

image-20231023105459179

image-20231023110000295

导入DTO:Data Transfer Object,即数据传输对象

一般用于展示层(前端页面)与服务层(后端)之间的消息传输

image-20231023134322182

菜品信息分页查询

特殊点:页面发送请求,请求服务端下载图片,用于页面图片展示

image-20231023150413269

修改菜品

image-20231025101758561

image-20231025102548232

day5 套餐管理

一个套餐可能包含:主食,菜,饮品

image-20231026142824451

新增套餐

image-20231026143418141

setmeal_dish 套餐菜品关系表

假如一个套餐对应3个菜品,则在setmeal_dish表中就有三条记录

image-20231026151133032

day6 菜品展示、购物车、下单(移动端)

image-20231116095941323

用户地址相关代码

需求分析

image-20231116100549732

数据模型

image-20231116101035395

导入功能代码

image-20231116101150150

菜品展示

需求分析:用户登录成功后跳转到系统首页,在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息,需要展示“选择规格”按钮,否则显示“+”按钮

image-20231116111359814

购物车

image-20231116163734254

​ 同一用户购物车数据在表中有多条

购物车交互过程

image-20231116164231351

用户下单

数据模型:用户下单业务对应的数据表为orders 订单表和order_detail 订单明细表

image-20231124160546879

image-20231124160845614

day7 缓存优化

image-20231205134622762

当用户数量多,系统访问量大,频繁访问数据库,系统性能会下降,用户体验差

image-20231205134504817

缓存短信验证码

之前短信验证码是存在session中,而session中存放的有效期为30分钟,而一般的短信验证码有效期设置为5分钟

image-20231205144356691

缓存菜品数据

image-20231205151057699

当数据库表中更新菜品数据后,要将redis中相关的菜品数据删除,否则会导致缓存中的数据和数据库的数据不一致(脏数据)

Spring Cache

springcache 通过注解的方式实现缓存等功能,可以大大减少缓存操作的代码

image-20231205171343029

image-20231205171626041

SpringCache 常用注解

image-20231205174122773

@CachePut 一般用于更新缓存数据

@CacheEvict 清理指定缓存 适合放在删除新增上面,当数据库删除一条消息后,将对应的缓存也删除

@Cacheable 适合放在查询接口上面

使用Redis为SpringCache底层实现

        <!--spring data redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--spring data cache-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

image-20231206161734363

使用spring cache来缓存套餐数据

image-20231207084348596

6、返回类 要实现序列化接口

image-20231207091153280

image-20231207091222990

day 8 读写分离

读:查

写:增删改

image-20231207095940505

主从模式

写的是主库,读的是从库,通过Mysql主从复制实现主从之间数据同步

image-20231207100437187

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

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

相关文章

3d模型合并后一片漆黑是什么原因,怎么解决---模大狮模型网

当合并多个3D模型后&#xff0c;发现整个合并后的模型显示为一片漆黑通常是由以下几个可能的原因导致的&#xff1a; 材质设置问题&#xff1a;合并后的模型可能存在材质设置错误&#xff0c;导致模型无法正确显示。检查每个模型的材质属性&#xff0c;确保其正确设置&#xff…

仿生蝴蝶制作——前期材料准备

1.扑翼机控制板 PCB免费&#xff0c;元器件大概50元 2.舵机1906B两个GDW DS1906AB 3.2KG扭力金属齿滑翔机扑翼固定翼8g9g高速数字舵机 3.风筝布p31n追风者风筝544软伞布 仿生蝴蝶P31N DIY面料 210格子布 硅胶伞布 4.遥控器富斯i6X&#xff0c;接收机A8S。 5.碳…

【好书推荐-第七期】《RTC程序设计:实时音视频权威指南》(音视频开发必看!)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

新版微交易微盘系统/外汇期货贵金属虚拟币微盘源码

1.环境 nginx 1.16或者 apache2.4 php5.6 Mysql 5.6 2.上传数据库 3.设置伪静态thinkphp就行 4.修改 application/database.php 中 数据库名称&#xff0c;密码 5.后台 域名/admin 账号admin 密码123456 6.前台 域名 账号13999999999密码123456 新版微交易微盘系统/外汇期…

转载-七种Java常用序列化框架的选型与对比

七种Java常用序列化框架的选型与对比 本文章转自&#xff1a;乐字节 文章主要讲解&#xff1a;Java常用序列化框架 获取更多前端相关资料可以点击链接加入群聊【Java技术交流群】&#xff1a;正在跳转暗号&#xff1a;166 转载地址&#xff1a;七种Java常用序列化框架的选型…

Cyber RT 组件

场景 无人车上的传感器数据可能需要被融合&#xff0c;比如在车辆上安装了多颗雷达&#xff0c;不同雷达由于安装位置与自身参数差异&#xff0c;可探测的角度、范围、距离等都是不尽相同的&#xff0c;现在需要将不同雷达感知到的数据融合在一起以建立车辆所处的完整环境&…

SAP 设置后台JOB批量扩充MRP区域

SAP 升级了HANA以后,不良品仓位的控制都是由MRP区域来控制了,当我们创建物料的时候,希望系统能自动扩充物料到NMRP的区域。我们可以通过创建后台JOB,定时的让程序跑后台JOB的方式来扩充物料的MRP区域 1、执行程序—SE38—RMMDDIBE 2、Tcode:MMD1创建MRP参数文件 点击选…

搜索算法(DFS和BFS 蓝桥杯 C++)

目录 题目一&#xff08;N皇后问题&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;路径之谜&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;最大数字&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;长草&#xff09;&#…

极简技术 | 能够很方便地解决教学中的实际问题

如今&#xff0c;极简教育技术开始兴盛&#xff0c;作为一种能够很方便地解决教学中的实际问题技术体系&#xff0c;“极简主义”与“教育技术”又能碰撞出什么样的火花呢&#xff1f; 一、教育要“技术化”&#xff0c;也可以“极简化” “极简主义”是一种生活理念或哲学&a…

深入理解Docker

文章目录 1 Docker理论1.1 背景知识1.2 是什么1.3 Docker基本三要素1.4 镜像原理1.5 安装教程 2 Docker常用命令2.0 防火墙相关命令2.1 镜像命令2.2 容器命令2.3 进阶命令 3. 实战之Docker部署springboot项目步骤一&#xff1a;Springboot项目配置1.1 添加docker的maven依赖1.2…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 通过这种方式&#xff0c;SpringBoot致力于在蓬勃发展的快速应用开发…

“祖传代码“的是是非非

程序员眼中的“祖传代码”&#xff0c;就像一本古老而神秘的魔法书&#xff0c;藏着无穷的智慧和技巧&#xff0c;有些代码像家传宝贝&#xff0c;有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 祖传代码的历史与文化价值 祖传代码通常指的是经过长时间使用和传承的代…

Linux操作系统——进程信号

1.信号的概念 生活当中哪些场景算信号呢&#xff1f;比如说你晚上调了个闹钟&#xff0c;然后第二天早上你听到了闹钟响了你就知道该起床了&#xff0c;这种机制就叫做信号机制。在生活中我们的信号是非常非常多的&#xff0c;比如说有&#xff1a;红绿灯&#xff0c;下课铃声…

网络编程作业day3

项目作业1&#xff1a;TCP机械臂测试 客户端操作代码&#xff1a; /*机械臂客户端控制代码*/ #include <myhead.h>#define SER_IP "192.168.125.176" //机械臂服务器IP地址 #define SER_PORT 8888 //机械臂服务器端口号 #define CLI_IP "…

代码随想录算法训练营第35天 | 435. 无重叠区间 ,763.划分字母区间 , 56. 合并区间

贪心算法章节理论基础&#xff1a; https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 435. 无重叠区间 题目链接&#xff1a;https://leetcode.cn/problems/non-overlapping-intervals/ 思路&#xff1a; 相信…

理疗美容按摩小程序有哪些功能

医疗、美容和按摩等行业是一个快速发展的领域&#xff0c;很多美容院和理疗中心都希望通过小程序来提升服务质量和用户体验。下面我们来看看一个理疗美容小程序可以具备哪些功能&#xff0c;并介绍如何使用这些功能。 1. **在线预约服务**&#xff1a;用户可以通过小程序预约理…

第8章:Nginx与Web应用《Nginx实战:从入门到精通》

Nginx不仅仅是一个高效的静态内容服务器和反向代理服务器&#xff0c;它还能与各种流行的Web应用框架和语言环境无缝集成&#xff0c;从而提供强大的动态内容处理能力。在本章中&#xff0c;我们将深入探讨Nginx如何与PHP、Python、Ruby和Node.js等常见的Web应用和语言环境协同…

爬虫入门到精通_实战篇10(使用Redis+Flask维护动态代理池)

1 目标 为什么要用代理池 许多网站有专门的反爬虫措施&#xff0c;可能遇到封IP等问题。互联网上公开了大量免费代理&#xff0c;利用好资源。通过定时的检测维护同样可以得到多个可用代理。 代理池的要求 多站抓取&#xff0c;异步检测定时筛选&#xff0c;持续更新提供接…

【大厂AI课学习笔记NO.56】(9)模型评测

作者简介&#xff1a;giszz&#xff0c;腾讯云人工智能从业者TCA认证&#xff0c;信息系统项目管理师。 博客地址&#xff1a;https://giszz.blog.csdn.net 声明&#xff1a;本学习笔记来自腾讯云人工智能课程&#xff0c;叠加作者查阅的背景资料、延伸阅读信息&#xff0c;及学…

数字化转型导师坚鹏:BLM金融机构数字化转型战略工作坊

BLM金融机构数字化转型战略工作坊 ——以BLM模型为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不知道如何系统地制定金融机构数字化转型战略&#xff1f; 不清楚其它金融机构数字化转型战略是如何制定的&#xff1f; …