目录

nginx:

nginx反向代理和负载均衡概念

nginx反向代理和负载均衡如何配置?

后端环境:maven管理

sky-common

sky-pojo

sky-server:

后端环境搭建--Git进行版本控制

后端数据库--Mysql

前后端联调

前后端运行:

前后端联调如何完成--断点调试跟踪代码

断点调试小tips:

.yml文件简介:

YAML 的常见应用场景

令牌生成

完善登录功能

TODO使用小tips

导入接口文档

Swagger技术

介绍

使用方式

在线接口测试:

Swagger常用注解


nginx:

nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全-CSDN博客

前端分为web端、小程序端

web端在nginx下面的html文件夹下面,nginx必须放在没有中文目录的环境运行

运行方法:双击nginx.exe,用浏览器打开访问localhost,访问端口号默认80

nginx反向代理和负载均衡概念

验证方法:在前端页面点击登录(打开F12开发者模式)可以看到前端请求地址

nginx反向代理:将前端发送的动态请求转发到后端服务器

nginx反向代理好处:

  1. 缓存提高访问速度,
  2. 进行负载均衡(把大量请求按照指定方式均衡的分配给集群中的每台服务器),
  3. 保证后端服务安全

nginx反向代理和负载均衡如何配置?

反向代理主要依靠proxy_pass来配置

负载均衡的底层也是基于反向代理实现的,多配置了一些服务器server,转发可能需要给多个后台服务器

在这个项目中,负载均衡的配置文件在

后端环境:maven管理

sky-common

  1. constant:常量类
  2. context:上下文相关
  3. enumaration:枚举类
  4. exception:自定义异常类
  5. json:处理json转换
  6. properties:Springboot中的配置属性类,把配置文件中的一些配置对象封装
  7. result:后端返回结果
  8. utils:工具类

sky-pojo

前三项都属于POJO(Plain Old Java Object ,简单老式java对象),一种遵循简单设计原则的普通 Java 类,主要用于封装数据。

POJO 的核心特点:

  1. 无继承要求:不需要继承特定的类(如 Serializable 等,不过实际中为了序列化可能会实现)
  2. 无接口强制:不需要实现特定的接口
  3. 字段私有化:成员变量通常用 private 修饰
  4. 提供访问方法:通过 public 的 getter 和 setter 方法操作字段
  5. 无业务逻辑:主要用于数据存储,不包含复杂的业务处理方法
  6. 可包含构造方法:通常会有默认构造方法和带参数的构造方法

sky-server:

配置文件、配置类、拦截器、controller、service、mapper、启动类等

后端环境搭建--Git进行版本控制

在IDEA中VCS(version control system版本控制系统)新建git仓库,上方就会出现Git相关操作按钮。

先对号commit到本地仓库,再箭头push到远程仓库

后端数据库--Mysql

前段时间做数据库作业好像破坏了什么Mysql配置,启动方式:

管理员身份运行cmd,net start mysql,再使用Navicat

前后端联调

前后端运行:

前端双击nginx

后端代码编译:点击compile(父工程sky-take-out整体编译)

sky-server中运行application,运行项目

尝试在登录页面前端登录,报错,原因没有修改数据库连接账号密码

修改之后成功登录:

前后端联调如何完成--断点调试跟踪代码

右上角绿框可以快速运行查看启动类,旁边的小虫子是debug断点调试,

在EmployeeController类里面有login方法,打一个断点

重新登陆

@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);

员工登录DTO中封装前端试图登录的账号密码

断点调试可以方便看到前端提供过来的数据

  1. Mapper中的sql语句,如果是简单的查询可以写注解,复杂/mybatis中动态标签通过xml配置
  2. 后面的异常处理,由全局捕获业务异常的GlobalExceptionHandeler捕获,类型是BaseException(父类),其他类型的异常继承它

断点调试小tips:

stepover单步调试(F8),resume program左侧--运行至下一个断点

ctrl + alt + b可以跳转到光标的函数位置

.yml文件简介:

.yml 是一种文件格式的扩展名,对应的文件类型是 YAML 文件(YAML 全称是 "YAML Ain't Markup Language",即 “YAML 不是标记语言”)。它是一种数据序列化格式,主要用于存储和传输结构化数据,语法简洁、易读

简洁直观
采用缩进(通常是空格,而非 Tab)来表示数据的层级关系,避免了 XML 或 JSON 中的大量标签(如 <tag>)或括号(如 {} []),可读性极强。
例如,一个简单的用户信息 YAML 配置:

user:name: Aliceage: 25hobbies:- reading- hikingcontact:email: alice@example.comphone: 123456789

YAML 的常见应用场景

  • 配置文件:很多框架(如 Spring Boot、Docker、Kubernetes、Ansible 等)默认使用 YAML 作为配置文件格式,例如 Spring Boot 的 application.yml 用于配置数据库连接、端口号等。
  • 数据存储:可用于存储简单的结构化数据(如测试数据、配置参数)。
  • API 交互:部分 API 会使用 YAML 格式传输数据(虽然 JSON 更常见)。
格式特点适用场景
YAML缩进表示层级,简洁易读,支持注释配置文件(如 Spring Boot 配置)、人工编辑的结构化数据
JSON用括号表示层级,语法严格(无注释),机器友好API 数据传输、前端与后端交互
XML标签嵌套,语法繁琐,支持复杂结构和命名空间传统配置文件(如早期 Java 框架)、文档标记

如图上中的两个是springboot的配置文件

令牌生成

JwtProperties是一个配置属性类,在common-properties中,如下所示

package com.sky.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
// 封装了SpringBoot里面的一些配置项
@ConfigurationProperties(prefix = "sky.jwt")
@Data
public class JwtProperties {/*** 管理端员工生成jwt令牌相关配置*/private String adminSecretKey;private long adminTtl;private String adminTokenName;/*** 用户端微信用户生成jwt令牌相关配置*/private String userSecretKey;private long userTtl;private String userTokenName;}

其中

@ConfigurationProperties(prefix = "sky.jwt") 

是 Spring Boot 中的一个注解,用于将配置文件(如 application.yml 或 application.properties)中指定前缀的配置项,自动绑定到当前类的属性上

  1. @ConfigurationProperties
    这是 Spring Boot 提供的核心注解,作用是 “配置属性绑定”。它会自动读取配置文件中的内容,并将符合规则的配置值赋值给类中的成员变量。

  2. prefix = "sky.jwt"
    prefix 表示 “配置前缀”,指定了要读取的配置项的共同前缀。
    这意味着:Spring 会去配置文件中寻找所有以 sky.jwt 开头的配置项,然后与当前类的属性进行匹配绑定。

所以在aplication.yml中找到下面这一段,会被绑定到JwtProperties类的属性上

sky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: token

可以看到和上面一一对应

生成jwt令牌在EmployeeController

package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;/*** 员工管理*/
@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;/*** 登录** @param employeeLoginDTO* @return*/@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);Employee employee = employeeService.login(employeeLoginDTO);//登录成功后,生成jwt令牌Map<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.EMP_ID, employee.getId());// jwt令牌String token = JwtUtil.createJWT(jwtProperties.getAdminSecretKey(),jwtProperties.getAdminTtl(),claims);// 需要传递给前端的信息,用VO进行封装EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder().id(employee.getId()).userName(employee.getUsername()).name(employee.getName()).token(token).build();return Result.success(employeeLoginVO);}/*** 退出** @return*/@PostMapping("/logout")public Result<String> logout() {return Result.success();}}

其中EmployeeLoginVO如下所示

package com.sky.vo;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@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;}

完善登录功能

问题:密码在数据库明文存储,安全性低 

TODO使用小tips

导入接口文档

教程使用Yapi,这个网站现在无法使用

尝试使用ApiPost失败,于是尝试apifox,导入类型选择Yapi,可以成功导入

Swagger技术

介绍

可以帮助后端生成接口文档,并进行在线调试

 

使用方式

Bean注解:使用Spring框架创建并管理对象

在server的config类下面

package com.sky.config;import com.sky.interceptor.JwtTokenAdminInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** 配置类,注册web层相关组件*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {@Autowiredprivate JwtTokenAdminInterceptor jwtTokenAdminInterceptor;/*** 注册自定义拦截器** @param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenAdminInterceptor).addPathPatterns("/admin/**").excludePathPatterns("/admin/employee/login");}/*** 通过knife4j生成接口文档* @return*/@Beanpublic Docket docket() {log.info("准备生成接口文档...");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) {log.info("开始设置静态资源映射...");registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}
}

由于上面配置的静态资源映射,将后端接口文档映射到localhost:8080/doc.html

  • 如果不设置静态资源映射,SpringMVC会以为在请求某一个controller,是动态请求
  • 如果扫描包的名字写错了,就无法正确扫描生成动态接口文档

访问即可查看该接口文档

knife4j为此动态生成接口文档

目前已经有的两个接口是解析下面的类生成的

/*** 员工管理*/
@RestController
@RequestMapping("/admin/employee")
@Slf4j
public class EmployeeController {@Autowiredprivate EmployeeService employeeService;@Autowiredprivate JwtProperties jwtProperties;/*** 登录** @param employeeLoginDTO* @return*/@PostMapping("/login")public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {log.info("员工登录:{}", employeeLoginDTO);Employee employee = employeeService.login(employeeLoginDTO);//登录成功后,生成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);}/*** 退出** @return*/@PostMapping("/logout")public Result<String> logout() {return Result.success();}}

在线接口测试:

Swagger常用注解

在EmployeeController里面加入相关注解之后

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

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

相关文章

论文阅读-ZeroDCE和ZeroDCE++

文章目录1 概述2 模块2.1 总体说明2.2 LE曲线&#xff08;Light Enhance Curve&#xff09;2.3 DCE-Net2.4 无监督损失2.4.1 空间一致性损失2.4.2 曝光控制损失2.4.3 颜色恒定损失2.4.4 照明平滑度损失2.5 ZeroDCE3 效果3.1 不同损失函数组合的效果3.2 参数设置影响3.3 训练数据…

Web自动化技术选择

我想学习自动化技术&#xff0c;我的诉求是&#xff1a; 1.我想做自动报社保功能&#xff0c;先从我们自己的系统里面下载Excel&#xff0c;然后自动登录到社保局的系统&#xff0c;自动填写Excel&#xff0c;自动上传Excel。 2.可以自动的到社保局的系统里面查下数据&#xff…

【celeba】-数据集的介绍

CelebA 数据集在 MTCNN 中的使用 1 数据集结构 CelebA_副本/ ├── Anno/ │ ├── list_bbox_celeba.txt # 边界框 │ ├── list_landmarks_celeba.txt # 5 关键点 │ ├── list_attr_celeba.txt # 40 属性 │ └── identity_CelebA.txt …

解读 GPT-5:从“博士级 AI 专家”能力到 OpenAI API Key 获取与实践(提示工程→性能调优全流程)

GPT-5深度解读&#xff1a;一位“博士级专家”的诞生与思考第一部分&#xff1a;新范式——化繁为简的统一智能体 OpenAI的GPT-5&#xff0c;远不止是一次常规的模型升级。它的发布&#xff0c;标志着一种颠覆性的架构思想变革&#xff1a;从过去那个让用户在各种“Turbo”、“…

8.3.1 注册服务中心Etcd

etcd是什么 etcd 是一个分布式键值对存储&#xff0c;设计用来可靠而快速的保存关键数据并提供访问。通过分布式锁&#xff0c; leader选举保障可靠的分布式协同。 etcd 特点 完全复制&#xff0c;集群中的每个节点均拥有全量数据 强一致性&#xff0c;etcd通过raft共识算法…

异或循环冗余

异或代码CRC8-ITU例程比较计算CRC16异或改进测试重点代码 def fun_crc(datas):crc 0xFF poly 0x07 for i in range(len(datas)):for j in range(7, -1, -1):if (crc & 0x80) 0x80: crc (crc << 1) ^ polyelse:crc (crc << 1)if (datas[i] & 2**j):#值…

一款轻量、免费、无广告,强大的演示工具,支持屏幕放大、涂鸦、截图、录屏

软件介绍 ZoomIt&#xff0c;是一款轻量、免费、无广告&#xff0c;强大的演示工具&#xff0c;支持屏幕放大、涂鸦、截图、录屏等。在系统托盘中不显示的运行&#xff0c;可自定义快捷键&#xff0c;使用方面。 软件基础功能 屏幕放大&#xff1a;按下快捷键“Ctrl1”可进入…

从街亭失守看管理

最近看了《三国演义》&#xff0c;重温了街亭失守事件&#xff0c;从马谡最耀眼的登场来看就是&#xff0c;火烧藤甲兵计策和诸葛亮不谋而合&#xff0c;说明马谡确实是有真材实料的&#xff0c;但在守街亭的任务上&#xff0c;诸葛亮也踌躇过又对先帝的遗言“马谡不可重用”记…

全面解析 URL 重定向原理:从协议、实现到安全实践

一、什么是 URL 重定向&#xff1f; URL 重定向&#xff08;URL Redirection&#xff09;是 Web 技术中一种将用户请求的 URL 自动转向另一个目标 URL 的机制。用户可能完全不会察觉跳转发生&#xff0c;因为浏览器在幕后完成了一切。 重定向通常用于以下场景&#xff1a; 网…

多任务 Transformer 模型的高效任务间注意力

抽象 在计算机视觉和更广泛的深度学习领域&#xff0c;Transformer 架构已被公认为许多应用程序的最先进技术。然而&#xff0c;对于多任务学习&#xff0c;与单任务模型相比&#xff0c;可能需要更多的查询&#xff0c;考虑到实际的硬件限制&#xff0c;它的多头注意力通常接近…

QT的常用控件说明

文章目录基本的代码的模板Label控件font字体相关Button 控件CheckBox 控件Radio控件ComboBox控件LineEdit 控件基本的代码的模板 class MainWindow(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs) # 调用父类初始化方法# 声明窗口实例# 代…

5Python异常处理与模块导入全指南

目录 什么是异常&#xff1f; 异常的捕获方法&#xff1a; 为什么要捕获异常&#xff1f; 捕获异常的语法&#xff1a; 异常的else和finally语法&#xff1a; 什么是异常&#xff1f; 异常就是程序运行过程中出现了错误&#xff0c;也就是我们常说的出bug了-。- 异常的捕…

区块链密码学简介

区块链密码学简介 一、对称密码算法 概述 对称密码算法的主要特点是使用相同的密钥进行加密和解密。这类算法根据其加密方式大致可以分为两类:流密码和分组密码。区块链技术主要采用分组密码。流密码以数据流的形式逐位或逐字节加密,而分组密码则将数据分成固定大小的块进行…

GridKernalGateway

GridKernalGateway 是 Apache Ignite 架构中一个关键的安全与状态管理组件&#xff0c;它的作用是 “在公共 API 和内部内核&#xff08;kernal&#xff09;之间建立安全、可控的访问通道”。 我们可以把它理解为一个 “门卫 状态哨兵”&#xff0c;确保外部调用不会在 Ignite…

MySQL索引、B+树相关知识总结

MySQL索引、B树相关知识汇总一、有一个查询需求&#xff0c;MySQL中有两个表&#xff0c;一个表1000W数据&#xff0c;另一个表只有几千数据&#xff0c;要做一个关联查询&#xff0c;如何优化&#xff1f;1、为关联字段建立索引2、小表驱动大表二、b树和b树的区别1、更高的查询…

Java学习进阶 -- 泛型的继承和通配符及综合练习

首先&#xff0c;泛型不具备继承性&#xff0c;但是数据具备继承性1.核心概念解析泛型不具备继承性即使类型A是类型B的子类&#xff0c;Generic<A>也不是Generic<B>的子类这是Java泛型的类型安全设计&#xff0c;防止不安全的类型转换数据具备继承性泛型容器中的元…

如何实现在多跳UDP传输场景,保证单文件和多文件完整传输的成功率?

如何实现在多跳UDP传输场景&#xff0c;保证单文件和多文件完整传输的成功率&#xff1f; 一、前言 UDP&#xff08;User Datagram Protocol&#xff09;是一个轻量、无连接的传输协议&#xff0c;广泛用于低延迟、高吞吐的应用中&#xff0c;如视频流、实时游戏等。然而&…

【Spring IoC 核心实现类详解:DefaultListableBeanFactory】

Spring IoC 核心实现类详解&#xff08;源码原理&#xff09;作为 Spring 的灵魂&#xff0c;IoC 容器&#xff08;Inversion of Control&#xff09;是整个框架的核心。 那么 IoC 的“心脏”到底是哪个类&#xff1f;它是怎么管理和装配 Bean 的&#xff1f;本文将从源码层面深…

为什么开启JWT全局认证后,CSRF失败会消失?

这是因为 JWT认证与CSRF校验的设计逻辑完全不同&#xff0c;当全局启用JWT认证后&#xff0c;Django的CSRF校验会被“绕过”或不再生效&#xff0c;具体原因如下&#xff1a; 核心原因&#xff1a;JWT认证不依赖Cookie&#xff0c;无需CSRF保护 1. CSRF的作用场景 CSRF攻击的前…

宝龙地产债务化解解决方案二:基于资产代币化与轻资产转型的战略重构

一、行业背景与代币化创新趋势1.1 房地产债务危机现状宝龙地产&#xff08;01238.HK&#xff09;截至2024年中债务总额达584亿元&#xff0c;其中50.7%为一年内到期债务&#xff0c;但现金储备仅89.47亿元&#xff0c;短期偿债覆盖率不足30%。2025年2月境外债务重组计划因债权人…