【苍穹外卖 | 项目日记】第一天
前言:
我打算用16天的时间写完黑马程序员的苍穹外卖项目,为了督促自己每天坚持写以及记录项目知识点,所以用这种项目日记的方式鞭策自己
目录
前言:
今日完结任务:
今日收获:
1.阅读代码框架:
2.新增员工接口:
3.分页查询接口:
4.员工状态修改接口:
杂项知识点:
总结:
今日完结任务:
- 阅读了整个项目框架代码
- 实现了新增员工接口
- 实现了分页查询员工接口
- 实现了员工状态修改接口
- 实现了编辑员工接口
- 实现了根据id查询员工接口
今日收获:
1.阅读代码框架:
1.了解了YApi这项统一管理接口文档网站

2.学会使用了基于Swagger的Knife4j依赖来统一测试接口

3.熟练使用集成在IDEA中的git提交代码

2.新增员工接口:
1.学习了 ThreadLocal 这一局部变量
ThreadLocal为每一线程提供了一个单独的存储空间,它具有线程隔离的作用,只有在同一个线程内才可以获取到他的值。
在多线程编程中,使用ThreadLocal可以解决线程安全问题。常见的应用场景是保持数据的一致性。例如,在一个线程池中运行的多个线程需要共享一个全局变量,但是每个线程需要对这个变量进行不同的更新操作,这时就可以使用ThreadLocal来为每个线程提供独立的变量副本,从而避免线程之间的干扰和竞争条件的产生。
使用ThreadLocal可以通过调用其静态方法ThreadLocal.set()和ThreadLocal.get()来设置和获取线程的局部变量。需要注意的是,由于每个线程都有自己的变量副本,所以在使用完毕后需要及时清理ThreadLocal中的数据,以免造成内存泄漏。
而本接口对ThreadLocal的应用场景是 实现empservice层中的方法对empController层中变量的调用。
当我们在新增员工的时候,需要表明是谁对新增员工进行了创建和修改,那么我们就需要拿到当前登录用户的Token,并对其解析,就可以得到这两个值
使用ThreadLocal进行存储

调用这个变量:

3.分页查询接口:
1.了解了PageHelper的用法
@Overridepublic PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) {//开始分页查询(基于pagehelper)PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize());Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO);long total = page.getTotal();List<Employee> result = page.getResult();return new PageResult(total, result);}
并且阅读了PageHelper的源码,了解到他的底层还是在建立线程变量,然后在SQL语句执行的时候进行拦截,然后替换变量,实现分页的功能。

2.了解了对于时间格式化的两种方式
1. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
采用这个注解,但是缺点是他只能对一个属性起作用,也就是说有几个需要进行时间处理的变量,我们就要添加几个注解
2.自定义消息转换器,可以对全局的变量有效,因为这是我们自己定义的配置类,会在全局生效
@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器");//创建一个消息转换器对象MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();//需要为消息转换器指定对象转换器 对象转换器课可以将java对象序列化为Json对象converter.setObjectMapper(new JacksonObjectMapper());//将自定义的消息转换器加入到容器中converters.add(0, converter);}
4.员工状态修改接口:
1.了解了基于@builder注解的快速构造方法:
Category category = Category.builder().id(id).status(status).updateTime(LocalDateTime.now()).updateUser(BaseContext.getCurrentId()).build();
杂项知识点:
1.什么是正向代理和反向代理:
简洁的说:正向代理就是隐藏客户端,而反向代理是隐藏服务器
正向代理是客户端发送请求后通过代理服务器访问目标服务器,代理服务器代表客户端发送请求并将响应返回给客户端。正向代理隐藏了客户端的真实身份和位置信息,为客户端提供代理访问互联网的功能。
反向代理是位于目标服务器和客户端之间的代理服务器,它代表服务器接收客户端的请求并将请求转发到真正的目标服务器上,并将得到的响应返回给客户端。反向代理隐藏了服务器的真实身份和位置信息,客户端只知道与反向代理进行通信,而不知道真正的服务器。
我们本次使用的Nginx服务器就具有反向代理的作用

反向代理使得前端的URL资源路径指向Nginx,而不是直接与后端沟通。
2.什么是负载均衡:
负载均衡(Load Balancing)是一种分配工作负载(即请求或数据)到多个计算资源的技术,目的是在不过载任何单个资源的情况下提高整体系统性能、增强可靠性和可扩展性。
其实就是多个服务器轮转接收客户端请求,减轻单台服务器压力。

后面的wegiht可以理解为优先让哪一个服务器接收客户端请求,因为我们这里只有一台服务器,就是我自己的电脑主机,所以无法完成负载均衡操作,因此第二个地址用了#注释。
3.pathparm,pathvariable,requestparm这三个的使用场景;
-
Path Parameter(路径参数):
Path Parameter 是通过路径的一部分来传递参数,通常用于 RESTful 风格的 API 中。例如,对于/users/{id}的路径,其中{id}就是一个 Path Parameter,用于表示用户的唯一标识符。使用 Path Parameter,可以根据不同的路径参数值来执行相应的操作。路径参数通过@PathVariable注解来绑定到方法的参数上。 -
Path Variable(路径变量):
Path Variable 是指将路径中的一部分作为变量来传递,类似于 Path Parameter。它也常用于 RESTful 风格的 API 中。在 Spring MVC 框架中,可以使用@PathVariable注解将路径变量绑定到方法的参数上。与 Path Parameter 不同的是,路径变量通常在路径的任意位置定义,而不是通过占位符的形式。 -
Request Parameter(请求参数):
Request Parameter 是通过 URL 的查询字符串(query string)来传递参数的,参数以键值对的形式出现。例如,/users?id=123中的id就是一个 Request Parameter。使用 Request Parameter,可以直接在 URL 中提供参数,用于传递用户请求的信息。在 Spring MVC 中,可以使用@RequestParam注解将请求参数绑定到方法的参数上。Request Parameter 是最常见的传递参数的方式,常用于 GET 请求和表单提交。
4.什么是消息转换器和对象转换器:
消息转换器是在客户端和服务器之间传递消息时用于实现数据格式的转换,将消息的原始格式转换为具有特定数据结构的对象或从对象转换为消息的原始格式。消息转换器常用于处理 HTTP 请求和响应的数据格式转换,例如将 JSON 转换为 Java 对象或将 Java 对象转换为 JSON。
常见的消息转换器包括处理 JSON、XML、Protobuf、Properties 等格式的转换。Spring MVC 中提供了多个内置的消息转换器,并且也支持自定义消息转换器。
对象转换器是将一个对象转换为另一个对象的组件,通常在业务逻辑中使用。对象转换器用于将一个类型的对象转换到另一个类型的对象,可以处理属性的映射、类型转换、数据格式转换等操作。对象转换器通常用于模型对象与视图对象之间的转换,或者是实体对象和DTO(Data Transfer Object)之间的转换。
在实际应用中,消息转换器和对象转换器往往会结合使用。例如,首先通过消息转换器将 HTTP 请求中的 JSON 数据转换为 Java 对象,然后再通过对象转换器将这个 Java 对象转换为业务需要的对象类型。
总结一下:
- 消息转换器用于在客户端和服务器之间进行消息格式的转换,常用于处理 HTTP 请求和响应的数据格式转换。
- 对象转换器用于将一个类型的对象转换为另一个类型的对象,通常在业务逻辑中使用,用于处理对象之间的转换。
@Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {log.info("扩展消息转换器");//创建一个消息转换器对象MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();//需要为消息转换器指定对象转换器 对象转换器课可以将java对象序列化为Json对象converter.setObjectMapper(new JacksonObjectMapper());//将自定义的消息转换器加入到容器中converters.add(0, converter);}
}
5.什么是序列化和反序列化:
序列化(Serialization)是将对象转换为字节流的过程,以便将其存储到文件、内存中传输或在网络上进行传输。序列化可以将对象的状态保存到永久存储或传输到其他计算机,以便在需要时能够重新创建对象。序列化过程将对象的属性和数据结构转换为字节序列,使其能够在不同的环境中传输和存储。
反序列化(Deserialization)是将字节流转换回对象的过程,即从序列化的字节流中恢复对象的过程。反序列化将字节流重建为对象,并将其状态和属性恢复到先前序列化的状态。
总结:
今天开始写项目,感觉收获很大,首先就是感觉爽,这是我写的第一个大型项目,这种代码之间联系,分层式的架构是我以前看网课跟练的那些碎片化的代码是完全不同的,我感觉很通畅。其次是感觉时间紧迫,因为我有太多的东西想学了,要抓紧赶进度
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

相关文章:
【苍穹外卖 | 项目日记】第一天
前言: 我打算用16天的时间写完黑马程序员的苍穹外卖项目,为了督促自己每天坚持写以及记录项目知识点,所以用这种项目日记的方式鞭策自己 目录 前言: 今日完结任务: 今日收获: 1.阅读代码框架…...
WuThreat身份安全云-TVD每日漏洞情报-2023-10-07
漏洞名称:迪普科技DPtech SSL VPN任意文件读取漏洞 漏洞级别:高危 漏洞编号:CNVD-2023-69478 相关涉及:杭州迪普科技股份有限公司 DPtech SSL VPN 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-24924 漏洞名称:DTS监控SSL证书操作系统命令注…...
SpringBoot整合Druid配置yml文件
springboot中引入依赖注意,否则yml中配置不生效 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><group…...
如何保证 RabbitMQ 的消息可靠性?
项目开发中经常会使用消息队列来完成异步处理、应用解耦、流量控制等功能。虽然消息队列的出现解决了一些场景下的问题,但是同时也引出了一些问题,其中使用消息队列时如何保证消息的可靠性就是一个常见的问题。如果在项目中遇到需要保证消息一定被消费的…...
图像分类数据集划分(创建ImageNet格式的数据集)
原始数据文件夹如下: ├──data├── 0 类别1├── 1 类别2制作数据集格式如下所示: ├──datasets├── meta│ ├── test.txt # 测试数据集的标注文件│ ├── train.txt # 训练数据集的标注文件│ └── val.txt # 验证…...
ArcGIS Engine:报错无法嵌入互操作类型“ESRI.ArcGIS.Geometry.EnvelopeClass”。请改用适用的接口。
此错误是由于尝试直接实例化ArcGIS COM组件的某些互操作类引起的。这在.NET Framework 4及更高版本中是不被推荐的。 为了解决此问题,你需要确保在工程的引用中将ArcGIS的互操作类型设置为“不嵌入”。 按照以下步骤操作: 在解决方案资源管理器中找到…...
核货宝:服装店收银系统如何选择?收银系统选购指南!
对于各行各业而言,收银系统都是必备的工具。特别是对于像服装店这样的零售门店来说,选择一套适合的收银系统尤为重要。在选择收银系统时,有一些关键的技巧需要注意,以达到软硬件合理搭配、节省开支的目的。下面将分享四个选购服装…...
GB/T 7134-2008 浇筑型工业有机玻璃板材检测
非改性浇筑PMMA板材是指甲基丙烯酸甲酯均聚物板材,或者甲基丙烯酸甲酯与丙烯酸酯类或甲基丙烯酸酯类单体的共聚物板材,通过适当的引发剂本体聚合生产。 GB/T 7134-2008浇筑型工业有机玻璃板材测试项目: 测试项目 测试方法 拉伸强度 GB/T …...
数据采集平台(二)
5. 安装Kafka 5.1 基础架构 为方便扩展,并提高吞吐量,一个topic分为多个partition配合分区的设计,提出消费者组的概念,组内每个消费者并行消费为提高可用性,为每个partition增加若干副本,类似NameNode HA…...
Nginx + PHP 异常排查,open_basedir 异常处理
新上一个网站,通过域名访问失败,排查方法如下: 开启异常日志 开启域名下,nginx的异常日志,并查看日志 tail -f /var/log/nginx/nginx.localhost.error.log开启php的异常日志,该配置位于php.ini文件下 …...
Linux免密登录
目标: 192.168.233.31 ton-pc-003 192.168.233.32 ton-pc-004 在ton-pc-004(以下简称004)免密登录ton-pc-003(以下简称003) 具体流程和说明: 1、在004(客户机)中生成秘钥对 ssh…...
迷宫 蓝桥杯
问题描述 这天, 小明在玩迷宫游戏。 迷宫为一个 nn 的网格图, 小明可以在格子中移动, 左上角为 (1,1), 右下角 (n, n)为终点。迷宫中除了可以向上下左右四个方向移动一格以外, 还有 m 个双向传送门可以使用, 传送门可以连接两个任意格子。 假如小明处在格子(x1,y1), 同时有…...
25 mysql like 是否使用索引
前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…...
Android---Class 对象在执行引擎中的初始化过程
一个 class 文件被加载到内存中的步骤如下图所示: 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。 1. ClassLoader 通过一个类的全限定名(包名类名)来查找 .class 文件…...
Altium Designer实用系列(二)----PCB绘图小技巧
一、技巧总结 1.1 丝印大小 在导入PCB之后,元器件的丝印一般都是strock font,个人感觉比较大,也不美观,但是一个个修改成true type又比较麻烦。简便方法是使用相似查找全部修改: 此时会选中所有stroke 类型的丝印ÿ…...
threejs-开发入门与调试设置
近年来web得到了快速的发展。随着HTML5的普及,网页的表现能力越来越强大。网页上已经可以做出很多复杂的动画,精美的效果。还能通过WebGL在网页中绘制高性能的3D图形。 学习资料来源:https://www.three3d.cn/threejs/01-%E5%BC%80%E5%8F%91%E…...
win11安装双系统Ubuntu的坎坷记录
之前一直装的都是在一个硬盘中,这是是两块盘。 我的电脑是惠普暗影精灵8Pro 一 安装前的准备工作 1.1 记得先关闭,Bitlocker 输入wins,搜索框输入:设备加密设置 1.2 BIOS设置 (惠普这电脑是开机时按 F10࿰…...
关于docker的xuexi
概念了解 1.镜像: 类似于类与实例关系中的类,也类似于系统镜像的概念,对于前端而言,镜像就是包含了代码运行所需要的一切产物、依赖、配置等。这样的话,可以保证每次程序运行的环境一致。构建镜像,一般都…...
Python接口自动化测试实战详解,你想要的全都有
前言 接口自动化测试是当前软件开发中最重要的环节之一,可以提高代码质量、加速开发周期、减少手工测试成本等优点。Python语言在接口自动化测试方面应用广泛,因为它具有简单易学、开发效率高、库丰富等特点。 一、接口自动化测试概述 接口自动化测试…...
SparkSQL 外部数据源
1.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景。 - CSV - JSON - Parquet - ORC - JDBC/ODBC connections - Plain-text files 1.2 读数据格式 所有读取 API 遵循以下调用格式: // …...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
