第二章 苍穹外卖
开发环境搭建_后端环境搭建_熟悉项目结构
constant:存储的是定义好的常量类
context:存储与上下文相关的
enumeration:存储枚举类
exception:存储一些异常
json:处理一些json转换的类
properties:存储一些配置类
result:存储一些后端的返回结果
utils:存储一些工具类
开发环境搭建_后端环境搭建_使用Git进行版本控制
首先,用gitignore忽略掉不需要上传的文件内容:
在本地创建本地仓库:
在菜单栏选择创建你本地git仓库,选定根目录的地址。再将本地代码提交给本地仓库。
创建远程仓库:
复制仓库地址url,并创建新的远程,建立新的远程分支
直接选择推送,代码就推送成功了。
后端环境搭建_数据库环境搭建
有专门的数据库建表文档可以查看
后端环境搭建_前后端联调
在这里主要是启动了nginx,前后端联调测试了以下员工登录功能是否成功
(这一段代码我将解析的十分详细,因为使用了很多的常量类枚举类自定义异常,我需要快速熟悉并适应这样成熟化的书写格式)
/*** 登录** @param employeeLoginDTO* @return*/@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);Employee employee = employeeService.login(employeeLoginDTO);
代码解析:定义了一个login方法用于实现登录功能,使用@Requestbody注解将前端传输到的json转换为对应的可接收的dto对象。
在以前我们没有具体明确Result类返回的到底是什么类型的返回值,现在有了各种VO的明确建立,我们则需要在Result的泛型当中具体明确我们所需要的具体的VO对象
然后创建了一个employee对象用于接收employeeService调用login方法得到的结果
login方法的具体实现如下:
/*** 员工登录** @param employeeLoginDTO* @return*/public Employee login(EmployeeLoginDTO employeeLoginDTO) {String username = employeeLoginDTO.getUsername();String password = employeeLoginDTO.getPassword();//1、根据用户名查询数据库中的数据Employee employee = employeeMapper.getByUsername(username);//2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)if (employee == null) {//账号不存在throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);}//密码比对// TODO 后期需要进行md5加密,然后再进行比对if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}//3、返回实体对象return employee;}}
先是创建了两个string类型的对象用于存储获取到的用户名和密码,然后用获取到的用户名调用employeeMapper中的getByUsername方法获取到具体数据,并用employee将数据保存。接下来进行的是数据判断:
如果用户不存在,抛出一个我们定义好的异常类AccountFoundException,被使用super关键字传给这个异常类的父类的msg内容是我们定义好的常量类中的一个常量 ACCOUNT_NOT_FOUND
这个常量的具体内容如下:
public static final String ACCOUNT_NOT_FOUND = "账号不存在";
然后判断密码是否存在,该账号是否被锁定,如果一切ok,将我们存储好信息的employee对象返回给controller执行后续代码。
//登录成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);
登录成功后,借助我们获取到的employee对象,我们借助jwtUtil工具类生成了用于登录校验的token,并将需要返回的对象内容借助employeeLoginVo来存储。以标准的VO来进行返回。
可以看到我们这里对于数据的存储方式不在是new一个对象来挨个调用getset方法存储了,而是直接选择用.builder()来实现。借助 .+参数名(获取到信息的对象.方法)的格式来快速实现数据存储。
这样的方法有两个需要注意的点:
在存储完所有信息只有要加上.build();来结尾。
在存储对象employeeLoginVo中,需要有@Builder注解才可以调用这个build方法。
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "员工登录返回的数据格式")
public class EmployeeLoginVO implements Serializable {@ApiModelProperty("主键值")private Long id;@ApiModelProperty("用户名")private String userName;@ApiModelProperty("姓名")private String name;@ApiModelProperty("jwt令牌")private String token;}
至此,登陆方法结束。
后端环境搭建_前后端联调_Nginx反向代理和负载均衡
我们需要思考一个问题:
前端发送的请求是如何到达后端的呢?
我们会发现,我们前端和后端的请求路径url并不是相同的,二者并没有匹配到
实际上呢,是nginx反向代理在发力:
Nginx反向代理和负载均衡的具体实现步骤:
在这个配置后,请求路径会被替换然后传输给tomcat服务器
location的意思是需要处理的特殊请求。下图中是表示对包含有api的请求进行特殊处理。
这负载均衡跟反向代理的区别是什么呢?
主要是在上文中的webservers字段,这个字段一个在upstream后,一个在路径当中。这个字段是不固定的,但要保证这两个位置的字段要完全相同
这样接收到的请求就会以某种策略来传输给这两个服务器中了。
开发环境搭建_完善登录功能
代码实现如下:
//密码比对//进行md5加密,然后再进行比对password = DigestUtils.md5DigestAsHex(password.getBytes());if (!password.equals(employee.getPassword())) {//密码错误throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);}if (employee.getStatus() == StatusConstant.DISABLE) {//账号被锁定throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);}
导入接口文档
项目当中使用Yapi来进行对接口文档的保存和使用。但是2025年发现yapi已经无法使用了。本人使用的是Apifox
里面的接口也都可以直接使用
Swagger_介绍和使用方式
maven坐标如下
<!--对swagger封装--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>${knife4j}</version></dependency>
在配置类中配置knife4j的配置内容如下:
/*** 通过knife4j生成接口文档* @return*/@Beanpublic Docket docket() {ApiInfo apiInfo = new ApiInfoBuilder().title("苍穹外卖项目接口文档").version("2.0").description("苍穹外卖项目接口文档").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select().apis(RequestHandlerSelectors.basePackage("com.sky.controller")).paths(PathSelectors.any()).build();return docket;}
在配置类中设置资源映射如下:
/*** 设置静态资源映射* @param registry*/protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}
在这里,如果我们访问到/doc.html结尾的路径,就可以到我们的接口文档控制台中去了
我们发现,在swagger当中也可以实现接口文档的测试功能,那么:
Swagger_常用注解
没什么好讲的,当一个开发规范用就行,在对应的地方上写对应的注解,你的swagger上就可以生成出规范的接口文档。
相关文章:
第二章 苍穹外卖
开发环境搭建_后端环境搭建_熟悉项目结构 constant:存储的是定义好的常量类 context:存储与上下文相关的 enumeration:存储枚举类 exception:存储一些异常 json:处理一些json转换的类 properties:存储一些配置类 …...
【上位机——WPF】命名空间
概述 XAML命名空间实际上是XML命名空间概念的扩展。指定XAML命名空间的技术依赖于XML命名空间语法、使用URL作为命名空间标识符的约定,使用前缀提供从同一标记源中引用多个命名空间的方法,诸如此类,XML命名空间的XAML定义中增加的主要概念是…...
当AI自我纠错:一个简单的“Wait“提示如何让模型思考更深、推理更强
原论文:s1: Simple test-time scaling 作者:Niklas Muennighoff, Zitong Yang, Weijia Shi等(斯坦福大学、华盛顿大学、Allen AI研究所、Contextual AI) 论文链接:arXiv:2501.19393 代码仓库:GitHub - simp…...
【聚类】 K-means
K-means 文章目录 K-means1. 算法介绍2. 公式及原理3. 伪代码1. 算法介绍 背景与目标 K-means 是最经典、最常用的原型聚类(prototype-based clustering)算法之一,由 Stuart Lloyd 于1957年提出,1982年被广泛推广。其核心目标是: 将给定的 n n n 个数据点划分为 K K K 个…...
matlab分段函数
在 MATLAB 中,定义分段函数可以使用 piecewise 函数或者条件语句(如 if、else)来实现。以下是两种常见方法的示例: 1. 使用 piecewise 函数(适用于符号函数) syms x f piecewise(x < 0, x^2, x > …...
《Vite 报错》ReferenceError: module is not defined in ES module scope
trip): [ReferenceError] module is not defined in ES module scope 解决方案 postcss.config.js 要改为 postcss.config.cjs,也就是 .cjs 后缀。 原因解析 原因解析 下图提示,packages.json 中的属性 type 设置为 module。所有*.js文件现在都被解释…...
基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
一、引言概述。 锂电池是目前在各个能源密集型行业中用途广泛,例如新能源汽车、电力微网、航空航天等。电池模型的建立对研究电池的特性、SOC(state-of-charge)估计、SOH(state-of-health)估计、BMS算法开发以及电池系统的快速实时仿真有重要的意义。 等效电路建模…...
10.8 LangChain三大模块深度实战:从模型交互到企业级Agent工具链全解析
LangChain Community 项目:Model I/O, Retrieval, Agent Tooling 关键词:LangChain Model I/O, 检索增强生成, Agent 工具链, 多路召回策略, 工具调用协议 1. Model I/O 模块:大模型交互标准化接口 Model I/O 是 LangChain 生态中连接大模型的核心模块,定义了统一的输入输…...
408考研逐题详解:2009年第16题
2009年第16题 某机器字长为 16 位,主存按字节编址,转移指令采用相对寻址,由两个字节组成,第一个字节为操作码字段,第二个字节为相对位移量字段。假定取指令时,每取一个字节 PC 自动加 1。若某转移指令所在…...
python打卡day29@浙大疏锦行
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
双紫擒龙紫紫红指标源码学习,2025升级版紫紫红指标公式-重点技术
VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 双紫擒龙:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…...
Redis学习打卡-Day3-分布式ID生成策略、分布式锁
分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时,就需要进行分库分表(推荐 Sharding-JDBC)。在分库之后, 数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…...
在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件
ASP.NET 中 HttpHandler 的用法详解 在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件。根据你的配置文件,我将详细解释 <handlers> 节点的各种用法和配置选项。 1. HttpHandler 概述 HttpHandler 是…...
Word文档图片和图表自动添加序号
0 Preface/Foreword Word文档是办公常用的文档,里面经常会插入图片或者表格,当表格和图片数量过多时,如果有些图片需要删除或者添加,那么大概率需要修改大量图片的序号或者引用记录,如果通过手工一个一个修改…...
Android开发-列表类视图
在Android应用开发中,列表类视图(List View) 是展示数据集的重要UI组件之一。无论是显示联系人列表、新闻文章还是产品目录,列表类视图都能提供一个高效且用户友好的方式来呈现信息。本文将详细介绍如何使用 ListView 和更现代的 …...
如何使用 Apple 提供的 benchmark 工具
目录 🧭 Apple 提供的 benchmark 工具有哪些? ✅ 方式一:使用 Core ML Benchmark Tool(推理性能测试) 🔧 安装方式(推荐用 Python 工具) ✅ 方式二:使用 Instruments…...
第11章 JDBC与MySQL数据库
11.1 MySQL数据库管理系统 11.2 启动MySQL数据库服务器 在MySQL安装目录的bin子目录下键入mysqld或mysqld -nt 启动MySQL数据库服务器。 11.3 MySQL客户端管理工具 11.4 JDBC 对于JDK8版本,可以数据库连接器到JDK的扩展目录中(即JAVA_HOME环境变量指…...
Python 向量化操作如何实现多条件筛选
在处理大量数据时,高效的数据筛选是数据分析和科学计算中的关键环节。Python 的 numpy 库以其强大的向量化操作功能,能够帮助我们快速、高效地实现多条件筛选,避免使用低效的循环结构。 NumPy 向量化操作与布尔筛选基础 NumPy 是 Python 中用…...
内容社区系统开发文档(下)
目录 4 系统测试 4.1 数据库测试设计 测试流程图 测试策略矩阵 4.2 数据库测试内容 测试点 1:数据项增删改查(CRUD)操作 和 数据一致性测试 一、基础数据初始化 二、用户表测试(users) 1. 新增用户 2. 更新…...
什么是迁移学习(Transfer Learning)?
什么是迁移学习(Transfer Learning)? 一句话概括 迁移学习研究如何把一个源领域(source domain)/源任务(source task)中获得的知识迁移到目标领域(target domain)/目标任…...
CMake调试与详细输出选项解析
在使用 CMake 进行项目构建和编译时,--debug-output 和 --verbose 的作用如下: 1. --debug-output 适用阶段:CMake 配置阶段(运行 cmake 命令生成构建系统时)。作用: 启用 CMake 内部的调试输出࿰…...
Elasticsearch进阶篇-DSL
目录 DSL查询 1 快速入门 2 DSL 查询分类 2.1 叶子查询 2.1.1 全文检索查询 语法 举例 2.1.2 精准查询 term 语法 term 示例 range 语法 range 示例 2.2 复合查询 2.2.1 bool查询 举例 2.3 排序 语法 示例 2.4 分页 2.4.1 基础分页 示例 2.4.2 深度分页 …...
2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案)
2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 一、单项选择题(每题 5 分) C++ 程序流程控制的基本结构不包括以下哪项? A. 分支结构 B. 数据结构 C. 循环结构 D. 顺序结构 以下哪段代码能将数组 int a[4] = {2, 4, 6, 8}; 的所有元素变…...
C++ 二分查找:解锁高效搜索的密码
一、引言 在 C 编程的广阔领域中,数据处理和查找是日常开发中极为常见的操作。想象一下,你有一个包含数百万个数据的有序数组,需要从中快速找到特定的元素,如果采用逐个遍历的方式,效率之低可想而知,而二分…...
YOLO12改进-模块-引入Channel Reduction Attention (CRA)模块 降低模型复杂度,提升复杂场景下的目标定位与分类精度
在语义分割任务中,基于 Transformer 的解码器需要捕获全局上下文信息,但传统自注意力机制(如 SRA)因高分辨率特征图导致计算成本高昂。现有方法多通过降低空间分辨率减少计算量,但未充分优化通道维度。为平衡全局上下文…...
sparkSQL读入csv文件写入mysql
思路 示例 (年龄>18改成>20) mysql的字符集问题 把user改成person “让字符集认识中文”...
如何确定自己的职业发展方向?
引言 确定职业发展方向是一个需要深度自我探索和外部信息结合的过程。以下是系统化的思考框架和行动步骤,帮助你逐步清晰方向: 一、核心问题:职业方向的本质是什么? 职业方向的核心是找到 “你能做什么”(能力&…...
【LLIE专题】基于Retinex理论的transformer暗光增强
Retinexformer: One-stage Retinex-based Transformer for Low-light Image Enhancement(2023,ICCV) 专题介绍一、研究背景二、Retinexformer方法1. 通用Retinex理论2. 作者建立的Retinex理论3. ORF(one stage Retinex-based Framework)4. 网…...
C++多态与虚函数详解——从入门到精通
C多态与虚函数详解——从入门到精通 引言 在C面向对象编程中,多态是一个核心概念,它赋予了程序极大的灵活性和扩展性。本文将通过六个精心设计的实例,深入浅出地讲解C中的多态、虚函数、继承和抽象类等概念,帮助初学者快速理解这…...
自适应Prompt技术:让LLM精准理解用户意图的进阶策略
开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流 来自全栈程序员 nine 的探索与实践,持续迭代中。 欢迎关注评论私信交流~ 一、核心挑战:传统Prompt的局限性 传统静态Prompt&…...
Java文件读写程序
1.引言 在日常的软件开发中,文件操作是常见的功能之一。不仅要了解如何读写文件,更要知道如何安全地操作文件以避免程序崩溃或数据丢失。这篇文章将深入分析一个简单的 Java 文件读写程序 Top.java,包括其基本实现、潜在问题以及改进建议&am…...
数字电子技术基础(六十)——使用Digital软件绘制脉冲触发的触发器
目录 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发器 1.2 使用Digitial软件绘制脉冲触发的JK触发器 1.3 使用Digital软件绘制脉冲触发D触发器 1 使用Digital软件来绘制脉冲触发的触发器 1.1 使用Digital软件来绘制脉冲触发的SR触发…...
C++学习:六个月从基础到就业——C++20:范围(Ranges)基础
C学习:六个月从基础到就业——C20:范围(Ranges)基础 本文是我C学习之旅系列的第五十一篇技术文章,也是第三阶段"现代C特性"的第十三篇,介绍C20引入的范围(Ranges)库的基础知识。查看完整系列目录了解更多内容。 引言 S…...
【AGI】模型性能评估框架EvalScope
【AGI】模型性能评估框架EvalScope 项目地址:https://github.com/modelscope/evalscope EvalScope 是由阿里巴巴魔搭社区(ModelScope)推出的一款开源模型评估框架,旨在为大语言模型(LLM)和多模态模型提供…...
【老马】离线版金融敏感信息加解密组件开源项目 encryption-local
前言 你是否存在这样的苦恼,数据需要安全存储,但是每个系统大家自己写,很浪费时间。。 每一个子项目各自为政,加解密搞得也无法统一。也许下面这个开源项目可以帮助你。 encryption-local 一个离线版本的金融敏感信息加解密工具…...
利用systemd启动部署在服务器上的web应用
0.背景 系统环境: Ubuntu 22.04 web应用情况: 前后端分类,前端采用react,后端采用fastapi 1.具体配置 1.1 前端配置 开发态运行(启动命令是npm run dev),创建systemd服务文件 sudo nano /etc/systemd/…...
YOLOv5目标构建与损失计算
YOLOv5目标构建与损失计算 YOLOv5目标构建与损失计算构建目标关键步骤解析: 计算损失关键实现细节解析各损失分量说明 YOLOv5目标构建与损失计算 YOLOv5作为单阶段目标检测的经典算法,其高效的检测性能离不开精心设计的训练目标构建和损失计算策略。本文…...
【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?
目录 一、什么是库? 1. C标准库(libc) 2. C标准库(libstdc) 二、静态库 1. 静态库的生成 2. 静态库的使用 三、动态库 1. 动态库的生成 2. 动态库的使用 3. 库运行的搜索路径。 (1)原因…...
【图书管理系统】用户注册系统实现详解
引言 本系统允许用户输入用户名和密码,前端通过AJAX请求将数据发送到后端,后端验证并存储用户信息,同时为每个用户创建一个专属图书表。尽管这是一个基础实现,但它展示了前后端分离开发的核心思想。博客还将讨论潜在的优化点&…...
FastDFS分布式文件系统架构学习(一)
FastDFS分布式文件系统架构学习 1. FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统,由淘宝资深架构师余庆设计并开发。它专为互联网应用量身定制,特别适合以中小文件(如图片、文档、音视频等)为载体的在线服务。FastDFS不…...
Oracle 内存优化
Oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global area or private global area)。对于 SGA 区域内的内存来说,是共享的全局的。在 UNIX 上,必须为 Oracle 设置共享内存段(可以是一个或者多…...
算法题(149):矩阵消除游戏
审题: 本题需要我们找到消除矩阵行与列后可以获得的最大权值 思路: 方法一:贪心二进制枚举 这里的矩阵消除时,行与列的消除会互相影响,所以如果我们先统计所有行和列的总和,然后选择消除最大的那一行/列&am…...
AI:NLP 情感分析
💬 从零开始掌握情感分析:NLP 初学者实战指南 本文适合自然语言处理(NLP)入门者,聚焦于最热门应用之一——情感分析(Sentiment Analysis)。无论你是学生、工程师,还是数据爱好者,都可以通过本文了解情感分析的原理、方法和实现技巧。 🧠 一、什么是情感分析? 情感…...
LearnOpenGL---着色器
着色器的例子 文章目录 着色器的例子1.颜色变化的三角形2.构造三个顶点颜色不同的一个三角形 1.颜色变化的三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callback(GLFWwindow* …...
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 13.几何着色器(一)修改顶点
几何着色器 以下是OpenGL图像管线的主要阶段: 几何着色器(Geometry Shader) 几何着色器是OpenGL管线中的一个可选阶段,位于顶点着色器和片段着色器之间。它能够动态地生成或修改图元(primitives)。 主…...
如何利用 Java 爬虫获得某书笔记详情:实战指南
在知识分享和学习的领域,许多平台提供了丰富的书籍笔记和学习资源。通过 Java 爬虫技术,我们可以高效地获取这些笔记的详细信息,以便进行进一步的分析和整理。本文将详细介绍如何利用 Java 爬虫获取某书笔记详情,并提供完整的代码…...
【关联git本地仓库,上传项目到github】
目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀!!! 1.下载git git下载地址:https://git-scm.com/downloads 下载安装后创建快捷地址:(此处比较…...
计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
NMR(N-Modular Redundancy,N 模冗余)是一种通用的容错设计架构,通过引入 N 个冗余模块(N ≥ 3 且为奇数),并采用多数投票机制,来提升系统的容错能力与可靠性。单个模块如果可靠性小于…...
配置代理服务器访问github、google
配置代理服务器访问github、google 背景与原理配置环境配置步骤云主机配置Windows客户端创建SSH隧道安装 Windows 内置 OpenSSHssh config 配置文件创建动态代理隧道 浏览器代理设置 验证浏览器访问google、githubssh 访问github 背景与原理 由于网络政策限制,中国…...
Java API学习笔记
一.类 1. String 类 不可变性:String对象创建后不可修改,每次操作返回新对象 String str "Hello"; str.length(); str.charAt(0); str.substring(1, 4); str.indexOf("l"); str.equals("hel…...