赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
需求分析→设计→编码→测试→上线运维
项目经理:对整个项目负责,任务分配、把控进度
产品经理:进行需求调研,输出需求调研文档、产品原型等
UI设计师:根据产品原型输出界面效果图
架构师:项目整体架构设计、技术选型等
开发工程师:代码实现
测试工程师:编写测试用例,输出测试报告
运维工程师:软件环境搭建、项目上线
开发环境(development):开发人员在开发阶段使用的环境,一般外部用户无法访问
测试环境(testing):专门给测试人员使用的环境,用于测试项目,一般外部用户无法访问
生产环境(production):即线上环境,正式提供对外服务的环境
项目功能架构如下图
产品原型(需要学会查看以方便代码构建,只列举一个):
技术选型:
(1).用户层:VUE.js,ElementUI等等
(2).网关层:Nginx(关于Nginx,可以参考: https://blog.csdn.net/weixin_60274825/article/details/122101640)
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等等
前端工程基于nginx运行
启动nginx:双击 nginx.exe 即可启动 nginx 服务,访问端口号为 80
后端工程基于 maven 进行项目构建,使用Git进行版本控制,并且进行分模块开发,模块如下图:
后端环境搭建 – 数据库环境搭建:通过数据库建表语句创建数据库表结构
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注释,方便快速定位:
使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。
官网:https://swagger.io/
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时,对应的文字说明:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。