黑马瑞吉外卖练习笔记

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();@Overridepublic 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 获取请求的uriString 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来获得,而不是自己newtry {//输入流,通过输入流读取文件内容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.mzph.cn/news/710226.shtml

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

相关文章

[数据结构 C++] AVL树的模拟实现

文章目录 1、AVL树1.1 AVL树的概念 2、AVL树节点的定义3、AVL树的插入和旋转3.1 左单旋左旋代码实现 3.2 右单旋右旋代码实现 3.3 右左双旋右左双旋的代码实现 3.4 左右双旋左右双旋的代码实现 3.5 insert接口实现 4、判断是否为AVL树判断AVL树的代码实现 5、AVL树的性能 问题引…

刷题第3天(简单题):LeetCode203--移除链表元素--虚拟头结点

LeetCode203:给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a;输入…

面试数据库篇(mysql)- 07索引创建原则与失效及优化

索引创建原则 1). 针对于数据量较大,且查询比较频繁的表建立索引。 2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。 3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。 4). 如果是字符…

flink下载安装部署说明

下载 下载地址 flink-1.16.2下载安装包&#xff0c;flink-1.16.2-bin-scala-2.12.zip资源-CSDN文库 安装 解压目录 启动集群 ./start-cluster.sh 提交作业 ./bin/flink run examples/streaming/WordCount.jar 查看日志 停止集群 ./bin/stop-cluster.sh 开启webui vim c…

数据结构与算法 - 数组与二分查找 + Leetcode典型题

1. 什么是数组 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 C中二维数组在地址空间上也是连续的。 需注意&#xff1a; 数组的下标从0开始。数组内存空间的地址是连续的。数组的元素是不能删的&#xff0c…

【HDFS】Decommision(退役) EC数据节点剩最后几个块卡住的问题

一、背景 近期操作退役EC集群的节点。在退役的过程中,遇到了一些问题。特此总结一下。 本文描述的问题现象是: 每一批次退役10个节点,完全退役成功后开始操作下一批。 但是,中间有一批次有2台节点的Under Replicated Blocks一直是1,不往下降。 处于Decommissioning状态卡…

鸿蒙OpenHarmony多线程能力场景化示例实践

简介 在OpenHarmony应用中&#xff0c;每个 进程 都会有一个主线程&#xff0c;主线程主要承担执行UI绘制操作、管理ArkTS引擎实例的创建和销毁、分发和处理事件、管理Ability生命周期等职责&#xff0c;具体可参见 线程模型概述 。因此&#xff0c;开发应用时应当尽量避免将耗…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频&#xff0c;涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述&#xff0c;使得视频创作变得前所未有的简单和高效。 Sora的一些能力&#xff1a; Text-to-video…

windows server mysql 数据库停止 备份 恢复全流程操作方法

一,mysql备份 mysql最好是原工程文件备份.不需要sql查询的方式备份.安全高效. 比如,安装php与mysql组合后,我的mysql文件保存在: D:\phpstudy_pro\Extensions\MySQL5.7.26\data\dux 我只需要复制一份,保存起来就行. 二,mysql恢复 怎么恢复呢.我们一般是只恢复其中一个表,则找…

一个具有强大PDF处理能力的.Net开源项目

PDF具有跨平台、可读性强、不可修改性、无需特定阅读软件、内容安全等好处&#xff0c;在工作中经常都会用到。 所以&#xff0c;我们在项目开发中&#xff0c;经常需要生成PDF的文件&#xff0c;或者把Html、Xml等文件转化为PDF格式。 今天给大家推荐一个具有PDF处理能力的.…

优思学院|质量工程师需要学习什么软件?

初入职质量工程师的朋友常常会问&#xff1a;质量工程师需要学习什么软件&#xff1f;在质量控制和管理的世界里&#xff0c;拥有强大的数据分析工具是走向成功的关键&#xff0c;因此&#xff0c;对于质量工程师来说&#xff0c;掌握正确的软件不仅能提升工作效率&#xff0c;…

lv20 QT对话框3

1 内置对话框 标准对话框样式 内置对话框基类 QColorDialog, QErrorMessage QFileDialog QFontDialog QInputDialog QMessageBox QProgressDialogQDialog Class帮助文档 示例&#xff1a;各按钮激发对话框实现基类提供的各效果 第一步&#xff1a;实现组件布局&…

Pyhton的组合数据类型

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命对某些人来说是美丽的&#xff0c…

尝鲜18倍速大模型Groq和世界第二AI Mistral(Le Chat)

01 尝鲜 中午,一边吃饭,一边尝试一下最新的AI:Groq,它使用了重新设计的LPU,据说比英伟达的GPU快了18倍。 运行了开源的Mixtral-8x7b模型,屏幕上的文字回复几乎是瞬间的,那种速度感,让人心跳加速。 接着,我尝试了来自欧洲的新贵——Mistral AI的Le Chat。 这个三天前…

python学习笔记-内置异常

概述 Python 中的异常&#xff08;Exception&#xff09;是指在程序执行过程中遇到的错误或异常情况。当程序出现异常时&#xff0c;解释器会停止当前代码的执行&#xff0c;并试图找到匹配的异常处理器来处理异常。如果没有找到合适的异常处理器&#xff0c;程序就会终止并打…

go并发模式之----阻塞/屏障模式

常见模式之一&#xff1a;阻塞/屏障模式 定义 顾名思义&#xff0c;就是阻塞等待所有goroutine&#xff0c;直到所有goroutine完成&#xff0c;聚合所有结果 使用场景 多个网络请求&#xff0c;聚合结果 大任务拆分成多个子任务&#xff0c;聚合结果 示例 package main ​…

配电房轨道式巡检机器人方案

一、应用背景 在变电站、配电房、开关站等各种室内变配电场所内&#xff0c;由于变配电设备的数量众多、可能存在各类安全隐患&#xff0c;为了保证用电的安全可靠&#xff0c;都要进行日常巡检。 但目前配电房人工巡检方式有以下主要问题&#xff1a; 巡检工作量大、成本高 …

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求&#xff0c;对此小编整理了一些相关问题~ 一、本地部署相关条件 对于想要本地部署的小伙伴要了解&#xff0c;相对于使用StartAI试用引擎本地部署更加考验电脑硬件配置备噢~ 流畅使用要nvidia显卡&#xff0c;6g以上显存&#xff08;最…

图解知识蒸馏

soft labels与soft predictions越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做distillation loss&#xff0c;也叫soft loss。 hard label y与hard prediction越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做student loss&#xff0c…

什么是VR虚拟现实元宇宙|VR设备购买|VR设备零售店

VR&#xff08;Virtual Reality&#xff0c;虚拟现实&#xff09;元宇宙是指基于虚拟现实技术构建的一个虚拟世界&#xff0c;这个世界可以模拟现实世界或者超出现实世界的一切事物和活动。在这个虚拟世界里&#xff0c;用户可以通过虚拟现实设备&#xff08;如头戴式显示器、手…