黑马程序员苍穹外卖笔记(DAY1)

Day1

1、项目基本介绍

本课程采用理论与实践并重的方式,讲练结合,适合具有一定java基础、了解java web、spring、mybatis、mysql、maven的初学者,可以帮助学员更牢固地对所学知识进行掌握。

​ 项目分为管理端和移动端:管理端提供给商家使用,移动端提供给客户使用。

在这里插入图片描述

1)软件开发整体介绍

软件开发流程
角色分工
软件环境

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

2)苍穹外卖项目介绍

  • 基本介绍
  • 项目架构
  • 技术选型
基本介绍

​ 定位:专门为餐饮企业定制的一款软件产品

项目架构

-

技术选型

2、开发环境的搭建

  • 前端环境搭建
  • 后端环境搭建
  • 登录功能的完善

1)前端环境搭建

​ 前端的环境基于 nginx 运行,nginx 负责反向代理和负载均衡,即将前端的请求发送到后端,并且如果有多个后端服务器还可以合理的分配使用。

​ 直接使用资料中的前端环境即可,双击启动 Nginx 即可,其他前端的资源已经自动配置好。

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/;  #负载均衡
	}
}

代码解析
webservers 即是提供访问的后端服务器,这个名称是可以自定义的,下面调用的是 8080 端口,即是 tomcat 的默认端口号,定义了两个后端服务器,会使用的时候会自动进行负载均衡。
server 即是提供服务,下面定义了端口 80 和请求服务的 localhost,会将请求反向代理到下面的端口中,转换为我们在 RequestMapping 中定义的请求 url。

在这里插入图片描述

​ 所以我们只需要双击打开 nginx 引用即可,在浏览器中输入 localhost,会自动访问 80 端口来进入默认的登录界面。

2)后端环境的搭建-熟悉项目结构

​ 后端环境基于 maven 搭建且采用分模块开发。

简要叙述一下分模块开发:

  • 先来看一个应用场景,如果有一个电商平台的项目,有订单和商品两个模块,订单中需要包含商品的详细信息,所以需要商品的模型类,商品模块也会用到商品的模型类,这个时候如果两个模块中都写模型类,就会出现重复代码,所以考虑将这两个模块中的重复部分单独抽取出来,构建一个新的模块。

  • 或者当一个项目有多个功能需要实现的时候,将这些功能放在一起,会导致功能之间的耦合过高,有一个功能出错的时候就会导致严重的后果,所以可以将各个功能放置在不同的模块中。

  • 来看看该项目中具体的实现

    	<parent>
            <artifactId>sky-take-out</artifactId>
            <groupId>com.sky</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    
        <dependency>
            <groupId>com.sky</groupId>
            <artifactId>sky-pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    

    通过上述的代码段可以很清晰的看到,这个项目的父项目是整个项目,且下面的各个模块是相互依赖的,在其他两个模块的配置文件中也可以找到该语句。

​ 后端的基础代码也在资料中被提供,可以直接用 idea 中通过 pom.xml 来打开这个项目,来看看这个项目的基础结构

​

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

可以看出来该工程是通过功能来进行分模块的

关于 pojo 中存放的类

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

3)后端项目搭建-通过 git 实现版本控制

  • 创建Git本地仓库

    通过选项栏的 ACS 中的创建 git 仓库选项

  • 创建Git远程仓库

    通过 gitee 创建,并得到 url

  • 将本地文件推送到Git远程仓库

    在推送界面输入得到的 url

4)后端项目搭建-数据库环境搭建

​ 通过提供给的资料中的数据库文件来直接搭建项目sky-sql

5)后端项目搭建-前后端联调

已经在前面前端部分 nginx 介绍了,这里补充一下 nginx 的负载均衡策略

名称说明
轮询默认方式
weight权重方式,默认为1,权重越高,被分配的客户端请求就越多
ip_hash依据ip分配方式,这样每个访客可以固定访问一个后端服务
least_conn依据最少连接方式,把请求优先分配给连接数少的后端服务
url_hash依据url分配方式,这样相同的url会被分配到同一个后端服务
fair依据响应时间方式,响应时间短的服务将会被优先分配

6)登录功能的完善

解决密码明文显示的问题

​ 因为这时候还没有注册功能来将密码写入数据库,所以我们目前仅需要优化登录的方法即可,使用 MD5 的方法进行加密。
例如 123456 加密后为 e10adc3949ba59abbe56e057f20f883e,但需要注意的是,该逆转是不可逆的,所以我们无法再次将数据库中的密码转回普通密码去验证登录,所以我们只能将传进来的密码加密后再与数据库中的密码比对。

    password = DigestUtils.md5DigestAsHex(password.getBytes());
    if (!password.equals(employee.getPassword())) {
        //密码错误
        throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
    }

​ 利用 spring 提供给我们的工具类中的 md5DigestAsHex方法来实现加密,并且与数据库中已加密的密码比对。

3.导入接口文档

  • 前后端分离的流程
  • 操作步骤
前后端分离的操作流程

操作步骤

​ 将课程资料中提供的项目接口导入YApi,。
​ YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

​

​ 使用添加项目将上述的文件导入该管理平台。

4.Swagger

  • 介绍
  • 使用方式
  • 常用注解
介绍

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

官网:https://swagger.io/

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

使用方式
<!--Knife4j-->
<dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.2</version>
</dependency>

创建Swagger配置依赖,或者直接将下面的方法导入已存在的配置类中

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
    
    @Bean(value = "dockerBean")
    public Docket dockerBean() {
        //指定使用Swagger2规范
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                //描述字段支持Markdown语法
                .description("# Knife4j RESTful APIs")
                .termsOfServiceUrl("https://doc.xiaominfo.com/")
                .contact("xiaoymin@foxmail.com")
                .version("1.0")
                .build())
                //分组名称
                .groupName("用户服务")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.github.xiaoymin.knife4j.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}

设置静态资源映射

/**
     * 设置静态资源映射
     * @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/");
    }

这样后端服务器就会将静态资源映射到上述的地址中,当客户端发送 /doc.html 的时候,就可以访问到,都是固定的写法,记住即可。

​ 在 Spring Boot 中,我们可以通过 ResourceHttpRequestHandler 类来处理 Web 应用程序的静态资源请求。ResourceHttpRequestHandler 类会将静态资源文件的请求映射到 Spring Boot 应用程序的 JAR 文件中,然后由 Spring Boot 应用程序返回这些资源文件的内容。 在 Spring Boot 中,我们可以使用 registry.addResourceHandler() 方法来配置 ResourceHttpRequestHandler 类,指定要处理的资源文件的路径和请求方法。

addResourceHandler("/doc.html") 方法表示要处理的资源文件的路径是 /doc.htmladdResourceLocations(“classpath:/META-INF/resources/”)方法表示这些资源文件位于classpath:/META-INF/resources/目录下。 通过配置ResourceHttpRequestHandler类,我们可以将/doc.html资源文件的请求映射到classpath:/META-INF/resources/doc.html资源文件,然后由 Spring Boot 应用程序返回这个资源文件的内容。这样,我们就可以通过访问/doc.html` URL 来访问这个资源文件,而不需要提供具体的文件路径。

常用注解
注解说明
@Api用在类上,例如Controller,表示对类的说明
@ApiModel用在类上,例如entity、DTO、VO
@ApiModelProperty用在属性上,描述属性信息
@ApiOperation用在方法上,例如Controller的方法,说明方法的用途、作用

​ 这些我们通过注解输入的信息最后都会呈现在在线接口调试页面上。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*Soo_Young*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值