当前位置: 首页 > news >正文

苍穹外卖[Day 1]记录

Nginx打不开的问题:输入nginx -t检查问题

将文件夹放在英文路径下,新增一个temp文件夹-->成功启动


打开nginx后一直无反应,本人尝试了换端口,管理员开启等方法,使用Microsoft edge仍然无法打开网站,检查了任务管理器后发现了nginx已经在运行了-->更换了浏览器后成功打开了

login:请求前端-->nginx转发反向代理-->后端服务器(负载均衡,提高访问速度,保证后端服务安全)


nginx反向代理(Reverse Proxy)配置方式:

管理端请求 (/api/):
  • 行 68:location /api/ {

    • 这个块定义了所有以/api/开头的请求都将由这个配置处理。(可以从第一张图看到请求中有/api/)

  • 行 69:proxy_pass http://localhost:8080/admin/;

    • 这是核心的反向代理指令。它告诉 Nginx:

      • 当接收到http://yourdomain.com/api/的请求时(假设您的域名是yourdomain.com),

      • 将请求转发到http://localhost:8080/admin/这个地址。(后端接口地址)

      • 注意路径重写:客户端请求的/api/部分被替换成了目标服务器上的/admin/。例如:

        • 客户端请求:/api/users

        • 实际转发给后端:http://localhost:8080/admin/users


nginx负载均衡的配置方式:(还是上一张图)

负载均衡是通过upstream模块和proxy_pass指令配合实现的

# 75 行 proxy_pass http://webservers/user/;

# 通常在 http { ... } 块内部定义 upstream webservers { # 负载均衡策略默认是“轮询”(Round Robin) # 后端服务器 1 server 192.168.1.10:8080; # 后端服务器 2 (可以设置权重) server 192.168.1.11:8080 weight=3; # 后端服务器 3 (可以设置为备用) server 192.168.1.12:8080 backup; } # ----------------- # 匹配 /user/ location 块 server { listen 80; server_name yourdomain.com; location /user/ { # 将请求转发给上面定义的服务器组 proxy_pass http://webservers/user/; # ... 其他反向代理配置 ... } }

导入接口文档

前端要调用接口,后端得告诉它每个接口的请求方式(GET, POST等)、路径、需要的参数和返回的结果。文档清晰了,前端才能正确地调用后端的接口。

常见的接口文档格式:
  • JSON格式:很常见,基本每个接口文档都会以JSON格式描述请求、响应和数据模型。

  • YAML格式:很多时候OpenAPI和Swagger文档会用YAML来写,这样的格式更简洁,比较适合大规模项目。


Swagger介绍:

Swagger是一种API文档生成工具,也是一个开放的API文档标准(Swagger Specification),用于描述RESTful APIs。它可以帮助你将后端接口以结构化的方式展现出来,清晰定义接口请求、返回值、参数等内容,方便前后端对接。

它的主要目标是让你能够快速编写和生成接口文档,还可以自动化文档的更新和维护,完美地解决了前后端接口协作中的很多问题。

Swagger的组成

  1. Swagger UI
    这是Swagger的前端展示界面,基本上就是一个美观的、交互式的网页,能够展示API文档并让开发者通过图形化界面调用接口进行测试。

  2. Swagger Editor
    这个是一个在线编辑器,你可以用它来编写和编辑Swagger文档。它也有本地版本,支持YAML和JSON格式,你可以直接生成API文档。

  3. Swagger Codegen
    通过这个工具,开发者可以根据API文档生成客户端代码,甚至是服务端代码。

Swagger是如何工作的

  1. 后端使用Swagger注解
    后端开发者在代码中使用Swagger的注解(如@ApiOperation,@ApiResponse等),为每个接口定义它的功能、请求参数、返回值等。这样,你就能通过这些注解自动生成接口文档。

    比如,你在Spring Boot项目中可以这么写:

    @ApiOperation(value = "获取用户信息", notes = "根据用户ID获取用户的详细信息") @GetMapping("/user/{id}") public ResponseEntity<User> getUser(@PathVariable Long id) { // 代码逻辑 }

    这行代码就能帮助Swagger理解这个接口是获取用户信息,自动生成对应的文档内容。

  2. 生成API文档
    然后你就能通过Swagger UI或Swagger Editor来生成这些接口的完整文档,展现出请求URL、请求方法、参数、返回值、错误码等等信息。

  3. 前端通过Swagger UI来查看和调用接口
    前端开发者可以直接通过Swagger UI查看接口文档。Swagger UI会展示接口的请求格式,参数的类型,返回的JSON格式等。

这段代码定义了一个名为docket()Spring Bean,它的目的是配置并生成项目的RESTful API 接口文档

这个配置告诉文档生成工具:

  1. 文档的基本信息:文档的标题、版本号和描述。

  2. 需要扫描的接口范围:明确指定哪些包下的 Controller(控制器)需要被解析并生成文档。

涉及的关键技术与概念:

1.Knife4j / Swagger (Springfox)
  • Knife4j:一个基于 Swagger 的增强解决方案,它优化了 Swagger UI 的界面和功能,使其更符合中文用户的习惯,通常用于 Spring Boot 项目。

  • Swagger/OpenAPI 规范:一套用于描述 RESTful API 的标准,这段代码就是用来根据这个标准生成文档的配置。

  • Docket类:这是 Swagger/Springfox 库中的核心配置类,用于构建 API 文档的配置实例。

2.Spring Bean (@Bean)
  • @Bean注解:标记在一个方法上,告诉 Spring 框架这个方法会返回一个对象,这个对象应该作为Spring 容器中的一个组件(Bean)来管理。

  • 作用:Spring 在应用启动时会执行这个方法,创建并初始化Docket对象,这样文档工具就能获取到这个配置信息。

3.API 文档配置链 (Builder 模式)

代码使用了流畅的Builder 模式来构建配置对象,使其易于阅读和配置:

  • ApiInfoBuilder用于构建 API 文档的元信息(Metadata),包括标题、版本等。

  • Docket构建链:用于配置文档工具的行为,包括选择要扫描的接口、路径等。


Swagger/Knife4j 注解核心注解分类与作用

注解名称作用范围核心用途常用属性
@Api类(Controller)描述整个 API 模块(Controller)。用于对一组相关的接口进行描述和归类。tags(分组名称,通常是中文)
@ApiOperation方法(接口)描述一个具体的 API 操作(Controller 中的一个方法)。它是接口文档中最核心的描述信息。value(接口名称/功能描述)
@ApiModel类(DTO/VO 实体)描述一个数据模型(用于请求或响应的 Java 类)。通常加在请求参数类或返回结果类上。value(模型的名称)
@ApiModelProperty字段(DTO/VO 实体属性)描述数据模型中的单个属性(字段)。是描述参数细节的关键。value(字段说明)、required(是否必填)、example(示例值)
@ApiParam方法参数描述方法的单个参数。当参数不是一个完整的对象(如路径参数或查询参数)时使用。value(参数说明)、required(是否必填)

常用注解详细说明与示例

1. 模块级别:@Api

用于 Controller 类上,定义这个类包含的接口集合。

@RestController @RequestMapping("/admin/employee") @Api(tags = "员工管理相关接口") // 标记这个 Controller 的分组名称 public class EmployeeController { // ... 方法 ... }
2. 接口级别:@ApiOperation

用于 Controller 中的具体方法上,描述接口的功能。

@PostMapping("/login") @ApiOperation("员工登录接口") // 描述这个方法是做什么的 public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) { // ... 登录逻辑 ... } @PostMapping("/logout") @ApiOperation(value = "员工退出接口", notes = "退出时客户端删除本地Token即可") public Result<String> logout() { return Result.success(); }
3. 参数/模型级别:@ApiModel&@ApiModelProperty

用于描述作为请求体(@RequestBody)或响应体 (Result<T>) 的 Java Bean。

示例:定义登录请求参数 DTO

@Data // Lombok 注解 @ApiModel(description = "员工登录时提交的数据模型") // 描述这个类的作用 public class EmployeeLoginDTO implements Serializable { @ApiModelProperty("用户名") // 描述这个字段 private String username; @ApiModelProperty(value = "密码", required = true) // 描述这个字段,并标记为必填 private String password; }

EmployeeController类:

这个EmployeeController类是一个典型的Spring Boot/Spring Cloud项目中的后端控制器,负责处理与员工管理相关的HTTP 请求,特别是管理员端的请求。

EmployeeController是项目中的Web 层(或称为Controller 层),它承担了以下职责:

  1. 接收请求:接收来自客户端(通常是前端管理系统)发送的 HTTP 请求。

  2. 参数校验与封装:将请求体中的数据(如登录信息)封装成 Java 对象(DTO)。

  3. 调用服务:调用Service 层EmployeeService)的方法来处理业务逻辑。

  4. 返回响应:将业务处理结果封装成统一的响应格式(Result),返回给客户端

  5. 这个类大量使用了 Spring 框架和 Lombok 提供的注解:

    注解/类作用解释
    @RestController控制器标识它是@Controller@ResponseBody的组合。表明这是一个处理 HTTP 请求的控制器,并且方法的返回值会直接作为 HTTP 响应体(通常是 JSON 格式)返回。
    @RequestMapping("/admin/employee")路径映射定义了所有该类中的接口的基础路径。例如,登录接口的完整路径是/admin/employee/login
    @Slf4j日志记录这是一个Lombok注解,会在编译时自动生成一个log对象,用于方便地记录运行时信息。
    @Autowired依赖注入Spring 核心机制。自动将EmployeeServiceJwtProperties类的实例注入到Controller中,以便使用它们提供的服务和配置。
    @PostMapping("/login")HTTP 方法映射login()方法映射到 HTTPPOST请求,路径是/admin/employee/login
    @RequestBody请求体解析告诉 Spring 将 HTTP 请求体中的 JSON 数据自动反序列化并绑定到EmployeeLoginDTO对象上。


login()方法是该类的核心,它实现了一个完整的员工登录与鉴权流程:

  1. 业务处理:调用employeeService.login(employeeLoginDTO),由 Service 层负责进行用户名和密码的验证,以及查询员工信息。

  2. 生成 JWT 令牌(鉴权):

    • 登录成功后,从返回的Employee对象中获取员工 ID。

    • 创建一个claimsMap,将员工 ID (employee.getId()) 作为 Payload(载荷)放入其中。

    • 调用JwtUtil.createJWT工具类,结合配置文件中的密钥 (jwtProperties.getAdminSecretKey()) 和有效期 (jwtProperties.getAdminTtl()),生成一个JWT(JSON Web Token)令牌

  3. 构建响应数据:

    • 使用Lombok 的 Builder 模式(EmployeeLoginVO.builder()...build()) 创建一个EmployeeLoginVO(View Object),包含员工 ID、用户名、姓名和生成的Token

  4. 返回结果:将包含EmployeeLoginVO的成功结果 (Result.success()) 返回给客户端。客户端后续访问其他接口时需要携带这个Token

http://www.cnnetsun.cn/news/1563360.html

相关文章:

  • [具身智能-159]:当初的手机刷机与当下的机器狗重新编程,看似小米使用了相似的商业模式进行机器狗的推广,但一个核心的差别是前者是有使用价值,也有学习价值,后者只有学习价值,使用价值比较小。
  • 【2026游戏报错修复,加速】DirectX修复工具下载安装全攻略:一键解决游戏报错问题
  • boxing裁剪功能深度优化:UCrop集成与自定义裁剪方案
  • ONNX-TensorRT 核心解析器深度解析:NvOnnxParser 架构与实现原理
  • 终极内存故障排查方案:Memtest86+完整应用指南
  • OpCore-Simplify:5步实现AMD平台黑苹果EFI自动构建,效率提升90%
  • handong1587.github.io社区建设指南:如何通过开源项目吸引贡献者
  • 163MusicLyrics:智能歌词管家让音乐体验升维的开源解决方案
  • Pages CMS与Jekyll、Hugo集成:传统静态站点的现代化管理终极指南
  • Redmine API实战指南:从数据同步到工作流自动化
  • vLLM部署实战:如何用一条CLI命令,为你的Qwen3-8B模型开启OpenAI兼容的API服务?
  • 气象大数据可视化:从传统图表到三维交互的演进之路
  • 香橙派Zero 2保姆级教程:USB摄像头从安装到视频流直播全流程(含常见问题解决)
  • 利用Hydra实现多协议自动化认证测试:从Telnet到SSH的实战指南
  • 鸿蒙系统(HarmonyOS)的分布式架构解析:如何实现多设备无缝协作
  • 最强翻译模型Hunyuan-MT-7B一键部署:5分钟搞定33种语言互译
  • 这次终于选对了!2026年性价比拉满的专业AI论文网站
  • 从素材到成片:AI 一站式极速输出——影视创作的新时代革命
  • 深度学习项目训练环境GPU算力弹性:自动适配单卡/双卡/四卡不同配置
  • Vue3下拉刷新组件实战:从零封装到全局注册(附完整代码)
  • 公开信息整理|2026年3月29日:强对流预警、育儿补贴、医用级同位素量产与民生规则新变化
  • redis 部署方式(分布式)
  • 开源模拟器测试方法论:mGBA的准确性与稳定性保障实践
  • CVAT标注工具:5分钟搭建专业级计算机视觉数据标注平台
  • OpenClaw模型微调:提升Qwen3.5-4B-Claude特定任务准确率
  • 基于灰狼优化算法优化随机森林算法(GWO - RF)的数据分类预测
  • 3步让模糊视频变高清:AI超分工具实战指南
  • 807-本地账号密码管理工具
  • 从PID调参到系统建模:一个嵌入式工程师的自动控制原理实战复盘
  • 三步掌握HiGHS线性优化求解器:从入门到实战