黑马苍穹外卖项目笔记01_项目概述、环境搭建

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


1.软件开发整体介绍

一.软件开发流程

需求分析→设计→编码→测试→上线运维

二.角色分工

项目经理:对整个项目负责,任务分配、把控进度

产品经理:进行需求调研,输出需求调研文档、产品原型等

UI设计师:根据产品原型输出界面效果图

架构师:项目整体架构设计、技术选型等

开发工程师:代码实现

测试工程师:编写测试用例,输出测试报告

运维工程师:软件环境搭建、项目上线

三.软件环境

开发环境(development):开发人员在开发阶段使用的环境,一般外部用户无法访问

测试环境(testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问

生产环境(production):即线上环境,正式提供对外服务的环境

2.苍穹外卖项目介绍

项目功能架构如下图
功能架构
产品原型(需要学会查看以方便代码构建,只列举一个):添加员工
技术选型:
(1).用户层:VUE.js,ElementUI等等
(2).网关层:Nginx(关于Nginx,可以参考: https://blog.csdn.net/weixin_60274825/article/details/122101640)

拓展—Nginx

Nginx常用做静态内容服务和代理服务器,直接将外来请求,转发给后面的应用服务器,Nginx在静态的功能异常强大,主要直接把外来的请求做分发,不做后端处理,而Tomcat则是需要做后端处理.

下面是一些情况,其中只使用 Nginx 可能是合适的:

1.静态网站:如果你的网站仅包含静态页面、图像和文件,而没有动态内容或服务器端逻辑,那么只使用 Nginx 可以足够满足你的需求。

2.负载均衡和反向代理:Nginx 可以用作反向代理,将请求路由到多个后端服务器,以提高可用性和性能。在这种情况下,你可以使用 Nginx 来均衡负载,而不需要 Tomcat。

3.静态资源服务器:如果你需要提供大量静态资源,如图片、CSS 和 JavaScript 文件,Nginx 可以高效地提供这些资源,而不需要应用服务器。

4.SSL 终结:Nginx 可以用于终结 SSL/TLS 连接,减轻应用服务器的负担,提高安全性。
(3).应用层:SpringBoot,SpringMVC,Swagger等等
(4).数据层:Mysql,Redis,mybatis等等

3.开发环境搭建

一.前端环境搭建

前端工程基于nginx运行

启动nginx:双击 nginx.exe 即可启动 nginx 服务,访问端口号为 80

二.后端环境搭建

后端工程基于 maven 进行项目构建,使用Git进行版本控制,并且进行分模块开发,模块如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后端环境搭建 – 数据库环境搭建:通过数据库建表语句创建数据库表结构

拓展—JWT令牌

JWT (JSON Web Token) 是一种用于在网络上安全地传输信息的开放标准(RFC 7519)。JWT 令牌是一种紧凑的、自包含的方式,用于在各种实体之间传输信息,通常用于身份验证和授权机制。

我在刚刚学习JWT令牌的时候会犯的一个错误就是把他和MD5加密解析混淆,导致我浪费了很多时间,所以说书写和理解JWT令牌的时候需要注意到:JWT令牌只是一张通行证,边境检察官(过滤器)只检查你携带的有没有通行证以及通行证的编号的正确性,它不会将通行证和别人的通行证进行对比.什么意思呢?假设当你进行登录的时候,后端会生成一个JWT令牌返回给前端,前端拿到这个令牌就可以进行任意的操作(CRUD等),我所想的是前端每次对后端进行操作的时候,会将携带的令牌和上次返回给前端的令牌进行比对校验,解析出来一致则放行,因此翻阅了源代码很久.最主要的还是没有正确理解JWT令牌的作用,它所解决的是:例如一个用户登录后复制浏览器的地址,在一个新的窗口打开并粘贴地址,这样可以做到不用登录就访问页面的安全隐患问题.但又有一个新的问题:如果用户登录后复制浏览器地址,点击退出后在登录页面粘贴地址(JWT令牌还保存在前端页面中),此时会不会不用登录就直接进入登录后的页面呢?(虽然说日常使用并没有这样的人),可能随着不断的学习,我会逐渐理解.

JWT 令牌通常由三部分组成,它们用点号分隔开来:

一.Header(头部): 头部通常包含了两部分信息,即令牌的类型(“typ”)和所使用的签名算法(“alg”)。这部分通常是一个 JSON 对象,例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

二.Payload(载荷): 载荷包含了要传输的数据,例如用户的身份信息或其他声明。载荷通常包括一些预定义的声明(例如,“iss” 表示令牌的发行者,“sub” 表示主题,“exp” 表示过期时间),以及自定义的声明。这部分也是一个 JSON 对象,例如:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

三.Signature(签名): 签名用于验证令牌的完整性和真实性。它由头部、载荷、以及一个密钥(通常是一个密钥或共享密钥)进行加密而生成。签名是令牌的第三部分,它用于验证令牌是否被篡改。

三.完善登录功能

项目采用MD5算法对密码进行加密,再将数据库中的密码改成加密后的密码,最后修改java代码,接受并加密前端传输过来的密码并进行比对,一致则放行,具体实现方法如下:
1.修改数据库中明文密码,改为MD5加密后的密文
修改数据库中的admin用户的密码为MD5加密后的密码
2.修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对
采用了springframework.util.DigestUtils包提供的 md5DigestAsHex(传入一个字节数组) 后赋值给password进行比对,比对后一致则放行,不一致则抛出异常信息.

小技巧:在书写代码的时候可以加上TODO注释,方便快速定位:在这里插入图片描述

4.导入接口文档&Swagger

一.登录YApi导入接口文档(不进行说明,很简单)

二.Swagger

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

官网:https://swagger.io/

Knife4j

Knife4j 是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

使用方式(基本是固定写法):

1.导入 knife4j 的maven坐标(基本操作)

<dependency>
     <groupId>com.github.xiaoymin</groupId>
     <artifactId>knife4j-spring-boot-starter</artifactId>
     <version>3.0.2</version>
</dependency>

2.在配置类中加入 knife4j 相关配置

@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;
    }

其中需要注意的是:basePackage(“com.sky.controller”)黄色标注部分为扫描的包,必须书写正确的包路径才能生成接口文档,否则不能自动生成

3.设置静态资源映射,否则接口文档页面无法访问

protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

问题:通过 Swagger 就可以生成接口文档,那么我们就不需要 Yapi 了?

1、Yapi 是设计阶段使用的工具,管理和维护接口
2、Swagger 在开发阶段使用的框架,帮助后端开发人员做后端的接口测试

常用注解

通过注解可以控制生成的接口文档,使接口文档拥有更好的可读性,常用注解如下:
在这里插入图片描述
例如:在EmployeeController上加上 @Api(tags = “员工相关接口”) 注解可以表示对类的说明,在其类方法login和logout加上 @ApiOperation(“员工登录&员工退出”) 注解可以描述该方法的用途说明,在VO,DTO等类上加上 @ApiModelProperty(“XXX”) 注解可以描述该类的属性说明

这些注解并不是毫无用处的,它不能被注释所替代,因为它能够给接口文档生成对应的文字描述,使开发效率更加高效:

进入http://localhost:8080/doc.html时,对应的文字说明:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,我不能提供特定项目的代码或数据库。但是,我可以帮助您了解如何创建一个外卖项目的基本数据库结构,以供参考。 一个基本的外卖项目可能包括以下几个主要表格: 1. 用户表(users):存储用户的个人信息,如用户ID、用户名、密码、手机号码、地址等。 ```sql CREATE TABLE users ( user_id INT PRIMARY KEY, username VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, phone_number VARCHAR(20), address VARCHAR(255) ); ``` 2. 商家表(restaurants):存储商家的信息,如商家ID、商家名称、地址等。 ```sql CREATE TABLE restaurants ( restaurant_id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, address VARCHAR(255) ); ``` 3. 菜品表(dishes):存储不同菜品的信息,如菜品ID、菜品名称、价格等。 ```sql CREATE TABLE dishes ( dish_id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, price DECIMAL(10, 2) NOT NULL, restaurant_id INT, FOREIGN KEY (restaurant_id) REFERENCES restaurants (restaurant_id) ); ``` 4. 订单表(orders):存储用户下的订单信息,如订单ID、用户ID、商家ID、订单状态等。 ```sql CREATE TABLE orders ( order_id INT PRIMARY KEY, user_id INT, restaurant_id INT, status VARCHAR(50), FOREIGN KEY (user_id) REFERENCES users (user_id), FOREIGN KEY (restaurant_id) REFERENCES restaurants (restaurant_id) ); ``` 5. 订单详情表(order_details):存储每个订单中菜品的详细信息,如订单详情ID、订单ID、菜品ID、数量等。 ```sql CREATE TABLE order_details ( detail_id INT PRIMARY KEY, order_id INT, dish_id INT, quantity INT, FOREIGN KEY (order_id) REFERENCES orders (order_id), FOREIGN KEY (dish_id) REFERENCES dishes (dish_id) ); ``` 以上只是一个简单的外卖项目数据库结构示例,实际的项目可能会更加复杂。您可以根据您的具体需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值