项目来源:

黑马程序员 Java项目实战《苍穹外卖》】

[https://www.bilibili.com/video/BV1TP411v7v6]

@ZZHow(ZZHow1024)

软件开发整体介绍

  • 软件开发流程
    • 需求分析:需求规格说明书、产品原型。
    • 设计:UI 设计、数据库设计、接口设计。
    • 编码:项目代码、单元测试。
    • 测试:测试用例、测试报告。
    • 上线运维:软件环境安装、配置。
  • 角色分工
    • 项目经理:对整个项目负责,任务分配、把控进度。
    • 产品经理:进行需求调研,输出需求调研文档、产品原型等。
    • UI 设计师:根据产品原型输出界面效果图。
    • 架构师:项目整体架构设计、技术选型等。
    • 开发工程师:代码实现。
    • 测试工程师:编写测试用例,输出测试报告。
    • 运维工程师:软件环境搭建、项目上线。
  • 软件环境
    • 开发环境(development):开发人员在开发阶段使用的环境,一般外部用户无法访问。
    • 测试环境(testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问。
    • 生产环境(production):又称线上环境,正式提供对外服务的环境。

开发环境搭建

  • 整体结构:
    • 前端:管理端(Web)、用户端(小程序)
    • 后端:后端服务(Java)
  • 前端工程基于 Nginx 运行
  • 后端工程:
    • 基于 Maven 进行项目构建,并进行分模块开发。

    • 目录结构:

      序号名称说明
      1sky-take-outMaven 父工程,统一管理依赖版本,聚合其他子模块
      2sky-common子模块,存放公共类,例如:工具类、常量类、异常类等
      3sky-pojo子模块,存放实体类、VO、DTO 等
      4sky-server子模块,后端服务,存放配置文件、Controller、Service、Mapper 等
    • pojo 模块详细说明

      名称说明
      Entity实体,通常和数据库中的表对应
      DTO数据传输对象,通常用于程序中各层之间传递数据
      VO视图对象,为前端展示数据提供的对象
      POJO普通 Java 对象,只有属性和对应的 getter 和 setter
    • 使用 Git 进行版本控制

    • 数据库环境搭建

      序号表名中文名
      1employee员工表
      2category分类表
      3dish菜品表
      4dish_flavor菜品口味表
      5setmeal套餐表
      6setmeal_dish套餐菜品关系表
      7user用户表
      8address_book地址表
      9shopping_cart购物车表
      10orders订单表
      11order_detail订单明细表
  • 前后端联调
    • 后端初始工程中已实现的登录功能:

      • Browser
      • Controller
        1. 接收并封装参数。
        2. 调用 service 方法查询数据库。
        3. 封装结果并响应。
      • Service
        1. 调用 mapper 查询数据库。
        2. 密码比对。
        3. 返回结果。
      • Mapper
        1. select * from employeewhereusername=?
      • Database
    • Nginx 反向代理:将前端发送的动态请求由 Nginx 转发到后端服务器。

      • 好处:
        • 提高访问速度。
        • 进行负载均衡。
        • 保证后端服务安全。
      • 负载均衡:把大量的请求按照指定的方式均衡的分配给集群中的每台服务器。
      • 配置方式:
        • 在 nginx.conf 配置文件中配置

          • 反向代理
          server {listen 80;server_name localhost;location /api/ {proxy_pass http://localhost:8080/admin/; #反向代理}
          }
          
          • 负载均衡(基于反向代理)
          upstream webservers {server 192.168.100.128:8080;server 192.168.100.129:8080;
          }server {listen 80;server_name localhost;location /api/ {proxy_pass http://webservers/admin/; #负载均衡}
          }
          
    • Nginx 负载均衡策略:

      名称说明
      轮询默认方式
      weight权重方式,默认为 1,权重越高,被分配的客户端请求就越多
      ip_hash依据 IP 分配方式,这样每个访客可以固定访问一个后端服务
      least_conn依据最少连接方式,把请求优先分配给连接数少的后端服务
      url_hash依据 URL 分配方式,这样相同的ur\会被分配到同一个后端服务
      fair依据响应时间方式,响应时间短的服务将会被优先分配
  • 完善登录功能
    • 当前问题:员工表中的密码是明文存储,安全性太低。
    • 步骤:
      1. 修改数据库中明文密码,改为 MD5 加密后的密文。

      2. 修改 Java 代码,前端提交的密码进行MD5加密后再跟数据库中密码比对(使用 Spring 提供的工具类 DigestUtils)。

        //对前端传来的明文密码进行 MD5 加密处理
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        

导入接口文档

  • 前后端分离开发流程

    前后端分离开发流程

    前后端分离开发流程

  • 导入 Yapi 平台

Swagger

  • 介绍:使用 Swagger 只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。
    官网:

    API Documentation & Design Tools for Teams | Swagger

  • 使用:Knife4j 是为 Java MVC 框架集成 Swagger 生成 API 文档的增强解决方案。

    1. 在 pom.xml 中添加 Maven 坐标。
    <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version>
    </dependency>
    
    1. 在 WebMvcConfiguration 配置类中加入 knife4j 相关配置。
    /*** 通过knife4j生成接口文档* @return*/
    @Bean
    public 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;
    }
    
    1. 在 WebMvcConfiguration 配置类中设置静态资源映射,否则接口文档页面无法访问。
    /*** 设置静态资源映射* @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/");
    }
    
  • Yapi 对比 Swagger

    • Yapi 是设计阶段使用的工具,管理和维护接口。
    • Swagger 在开发阶段使用的框架,帮助后端开发人员做后端的接口测试。
  • 常用注解:

    • 通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性。
    注解说明
    @Api用在类上,例如 Controller,表示对类的说明
    @ApiModel用在类上,例如 entity、DTO、VO
    @ApiModelProperty用在属性上,描述属性信息
    @ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用

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

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

相关文章

面试可能问到的问题思考-MySQL

MySQL 1. 数据库与缓存的一致性 引入缓存&#xff0c;因为缓存只是数据库数据的副本&#xff0c;那么就可能存在副本和原数据不一致的情况 一致性 ACID里面的C&#xff0c;和CAP中的C不是一个概念&#xff0c;虽然都叫一致性。CAP中的C&#xff0c;指的是多个副本之间逻辑上…

【Java】 Spring Security 赋能 OAuth 2.0:构建安全高效的现代认证体系

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在当今数字化时代,认证与授权已成为应用系统安全的核心。OAuth 2.0 作为一种开放标准协议,广泛应用于第三方授权场景中,而 Spring Security 则提供了强大的框架支持来实现这一协议。本文深…

实际工作几月后常用相关命令笔记记录

目前&#xff0c;我这只工程师幼崽经历几个月的工作&#xff0c;不能说是收获很多&#xff0c;也算是成长经验1吧。主要工作后才知道好多东西都是自己不会的不了解的&#xff0c;但是工作需要不一定自己完全吃透&#xff0c;在合适的地方正确的使用一般情况就ok了&#xff0c;所…

突破传统文本切片的瓶颈:AntSK-FileChunk语义切片技术详解前言:为什么我们需要重新思考文本切片?

在当今大语言模型&#xff08;LLM&#xff09;应用蓬勃发展的时代&#xff0c;我们面临着一个看似简单却至关重要的问题&#xff1a;如何有效地处理长文本&#xff1f;无论是构建知识库、实现RAG&#xff08;检索增强生成&#xff09;系统&#xff0c;还是进行文档智能分析&…

LeetCode-542. 01 矩阵

1、题目描述给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1&#xff1a;输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;[[…

Elasticsearch如何确保数据一致性?

Elasticsearch 通过多种机制确保数据在分布式环境中的一致性&#xff0c;但由于其分布式和近实时&#xff08;Near Real-Time, NRT&#xff09;的特性&#xff0c;它提供的是最终一致性&#xff08;Eventual Consistency&#xff09;&#xff0c;而非强一致性。以下是核心机制和…

2026毕设选题-大数据-基于 Spring Boot的化妆品推荐系统的设计与实现

技术范围&#xff1a;大数据、物联网、SpringBoot、Vue、SSM、HLMT、小程序、PHP、Nodejs、Python、爬虫、数据可视化、安卓App、机器学习等设计与开发。 主要内容&#xff1a;功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长…

数据结构算法:顺序表

数据结构&#xff1a;顺序表一.寄包柜1.题目如何创建数组&#xff1f;1. 需求本质2. 传统静态数组的缺陷3. 动态方案&#xff1a;向量的数组4. 核心逻辑5. 关键优势总结2.解题思路2.1题目分析2.2具体解题逻辑拆解步骤2.3总结2.4参考代码二.移动零1.题目2.解题思路2.1**解题核心…

IIS 安装了.netcore运行时 还是报错 HTTP 错误 500.19

IIS 安装了.netcore运行时 还是报错 HTTP 错误 500.19 - Internal Server Error 错误代码 0x8007000d 我甚至是先安装的SDK&#xff0c;再安装的运行时runtime的安装包&#xff0c;都不行。 而且在IIS的模块中&#xff0c;找不到 AspNetCoreModuleV2。 最后在微软官网n…

Flink 滑动窗口实战:从 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程

一、业务背景 我们要在 Flink 实时流上统计 每个用户-品牌组合最近 1 小时的最晚行为时间&#xff0c;并且每 5 分钟更新一次结果。 数据来自 Kafka&#xff0c;事件类型为 CartEvent&#xff1a; public class CartEvent {public String userId;public String brandId;public …

Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市

导读&#xff1a; 如果把你的Kubernetes集群想象成一座拔地而起的现代化大都市&#xff0c;那么你&#xff0c;平台工程师&#xff0c;就是这座城市的首席规划师。然而&#xff0c;为何我们精心打造的许多“云原生都市”正迅速陷入交通拥堵、资源闲置和预算超支的困境&#xff…

2.4 Flink运行时架构:Task、SubTask、ExecutionGraph的关系

在理解Flink运行时架构之前&#xff0c;我们先用一个生活化的比喻来建立直观认识&#xff1a; 想象你是一家大型工厂的总经理&#xff0c;需要生产一批复杂的产品。你会怎么做&#xff1f; 制定生产计划&#xff1a;首先画出生产流程图&#xff0c;明确每个环节的工作内容分解任…

`mysql_query()` 数据库查询函数

1) 函数的概念与用途 mysql_query() 是 MySQL C API 中的核心函数&#xff0c;用于向 MySQL 服务器发送 SQL 查询语句。这个函数充当了 C/C 应用程序与 MySQL 数据库之间的桥梁&#xff0c;允许程序执行各种数据库操作。 可以将 mysql_query() 想象成一个"数据库信使"…

[系统架构设计师]通信系统架构设计理论与实践(十七)

[系统架构设计师]通信系统架构设计理论与实践&#xff08;十七&#xff09; 一.通信系统网络架构 形式: 局域网&#xff0c;广域网&#xff0c;移动通信网 1.局域网网络架构 单一机构专用计算机的网络 组成&#xff1a;计算机&#xff0c;交换机&#xff0c;路由器 特点&#x…

【赵渝强老师】Docker的私有镜像仓库:Harbor

Harbor是由VMware公司开发并开源的企业级的Docker镜像仓库的管理项目&#xff0c;它包括镜像的权限管理&#xff08;RBAC&#xff09;、目录访问&#xff08;LDAP&#xff09;、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 视频讲解如下 【赵渝强老师】Docker的…

【QT/C++】实例理解类间的六大关系之泛化关系(Generalization)

【QT/C】实例理解类间的六大关系之泛化关系&#xff08;Generalization&#xff09; 在前面章节一文完美概括UML类图及其符号&#xff08;超详细介绍&#xff09;中已经对泛化关系的概念进行了总结&#xff0c;本文我将用实际案例来进一步理解泛化关系&#xff0c;以便应对未来…

【微服务的数据一致性分发问题】究极解决方案

文章目录一、微服务数据分发1、简介2、典型场景&#xff08;1&#xff09;跨服务业务流程协同&#xff08;2&#xff09;数据副本同步&#xff08;读写分离&#xff09;&#xff08;3&#xff09;实时状态通知&#xff08;4&#xff09;数据聚合与统计分析&#xff08;5&#x…

挖币与区块链技术有怎样的联系?

挖币&#xff08;通常指加密货币挖矿&#xff09;与区块链技术有着紧密的联系&#xff0c;挖矿是区块链网络维持运行和安全的重要机制之一&#xff0c;具体联系如下&#xff1a;1. 挖矿是区块链共识机制的核心环节区块链通过“共识机制”确保全网节点对交易记录达成一致&#x…

C数据结构:二叉树(下)

C数据结构&#xff1a;二叉树&#xff08;下&#xff09; 1.二叉树递归结构遍历 2.例题 3.二叉树的性质 1.二叉树递归结构遍历 我们先创建一个如下图所示的二叉树。typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struc…

Linux系统的网络管理(一)

一、网络参数配置&#xff1a;搭建稳定网络基础网络参数配置是 Linux 网络管理的起点&#xff0c;根据操作方式可分为图形化配置、命令行配置和配置文件配置&#xff0c;不同方式适用于不同场景&#xff08;临时调试 / 永久生效&#xff09;。1. 图形化配置&#xff1a;依赖 Ne…