外卖点餐系统01

学习苍穹外卖项目的第一天,涉及内容包括项目整体介绍,前端Nginx环境搭建,后端IDEA和Maven以及MySQL搭建,本人使用的平台是Mac M3芯片

外卖点餐系统01

苍穹外卖项目介绍

项目介绍

管理端和用户端:外卖商家使用和点餐用户使用
功能构架:体现项目中的业务功能模块

0

产品原型

用于展示项目业务,一般由产品经理完成只有充分了解技术原型,通过产品原型理解业务,在最终开发才不会有偏差,在开发设计的过程才能更好符合实际应用

技术选型-结构师

展示项目中使用到的技术框架和中间件等

0

开发环境搭建

前端环境搭建

前端工程基于nginx运行
nginx在MAC上的安装、启动、重启和关闭: https://www.kancloud.cn/sxlcjqq/interviews/890653

执行如下命令
brew search nginx
brew install nginx
安装完以后,可以在终端输出的信息里看到一些配置路径:
/usr/local/etc/nginx/nginx.conf(配置文件路径)
/usr/local/var/www (服务器默认路径)
/usr/local/Cellar/nginx/1.8.0 (安装路径)
如果是macOS 1.12以上的系统,在安装过程中可能会出现"warning",说是不支持该版本的操作系统,可以暂时先忽略它。

苍穹外卖-Mac配置前端开发环境:https://blog.csdn.net/weixin_45786868/article/details/133845979
将我们下载的nginx的目录(/opt/homebrew/etc/nginx/)里的nginx.conf替换为老师给的nginx.conf,并将(/opt/homebrew/Cellar/nginx/1.27.0)中的html文件夹替换成老师给的资料中的html文件夹

windows启动nginx:双击nginx.exe即可启动nginx服务,访问端口号为80
MAC启动nginx:命令行执行

brew services start nginx  // 启动nginx服务
ps -ef|grep nginx        //检查nginx是否正在运行

下面页面正常显示 代表前端部署成功

0

后端环境搭建

后端工程基于maven进行项目构建,并且分模块开发

0

sky-take-out:maven父工程,统一管理依赖版本,聚合其他子模块

sky- common子模块中存放的是一些公共类,可以供其他模块使用

sky-pojo子模块中存放的是一些entity、DTO、VO

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

sky-server子模块中存放的是配置文件、配置类、拦截器、controller、启动类等

具体搭建环境步骤:

IDEA打开sky_take_out工程
  • 用IDEA打开初始工程sky_take_out,如下图
0
  • 在命令行检查电脑是否有maven,然后判断是否需要安装maven
brew info maven    // 检查电脑maven信息
brew install maven    //通过homebrew安装maven,通过homebrew安装,不需要配置环境变量classpath!
  • 安装完maven后我们还需要配置IDEA中的maven

打开IDEA->setting,将maven home path换成本地路径,不知道可以通过brew info maven查看,然后通过cd命令进入maven本地文件夹,依次通过cd conf和ls命令,找到settings.xml文件,并将settings.xml文件路径复制到IDEA中User settings file,然后Apply,OK,IDEA中maven配置完成,具体演示步骤看下面的图片

0
0
0
使用Git进行项目代码的版本控制
  • 创建Git本地仓库
  • 创建Git远程仓库
  • 将本地文件推送到Git远程仓库

使用IDEA自带Database可视化并连接MySQL

首先在命令行安装并启动MySQL,在安装完MySQL后需要初始化MySQL,设置root密码。

# homebrew安装MySQL
brew install MySQL
brew info MySQL
# 启动MySQL
brew services start MySQL
# 进入/退出MySQL环境
MySQL -u root -p    // 进入    
quit;    // 退出

然后进入MySQL环境运行sky.sql文件,sky.sql会创建数据库sky_take_out,并在这个数据库中创建11个table。

如何命令行运行sky.sql文件:

  • 首先命令行进入mysql运行环境
  • 拖动sky.sql文件到命令行,回车
  • mac m1芯片 要一层层cd 然后source sky.sql
0

然后在IDEA中建立与MySQL的连接

0
0

上图是填写MySQL的登陆用户和密码以及数据库名称,下图中需要给数据库连接安装对应驱动(Drivers),点击‘+’号,安装对应MySQL版本驱动即可,然后Apply,并test connection能否成功。

0

IDEA前后端联调注意事项

  • application-dev.yml 中数据库密码是root,需要修改成本地数据库密码,有数字需要加双引号。
  • 前端登陆账户密码,可以查看sky_take_out数据库中的employee表,会默认增加初始一项。
  • Mac使用IDEA进入某一方法源码 快捷键:option+command+单击;进入方法对应接口:shift+command+单击;
JwtProperties
0

JwtProperties是一个配置属性类,存放在common模块->properties,这个类是用来封装springboot配置文件中的配置项,也就是.yml配置文件

Nginx反向代理和负载均衡概念

前端发送的请求,是如何请求到后端服务的?

Nginx反向代理:前端发送请求给nginx服务器,然后由nginx服务器动态分陪给后端。为什么不直接通过前端请求后端,反而中间要添加一个nginx服务器,有以下好处:

  • 提高访问速度,nginx服务器可以提供缓存,如果请求在缓存中存在可以直接传递数据
  • 进行负载均衡:如果前端直接发送请求给后端,前端只能绑定一台后端,而在实际应用中,由于前端请求服务的增加,往往需要部署多台后端组成集群,nginx服务器可以将前端大量请求按照指定方式均衡的分配给集群中每台后端服务器,使得后端服务负载均衡。
  • 保证后端服务安全:防止前端直接访问后端

Nginx反向代理和负载均衡的配置方式-nginx.conf

0

将api/前路径替换,然后剩余的拼接上

0

负载均衡就是将发送给后端请求,指定服务器ip地址,可以有不同的分配策略

nginx负载均衡策略

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

完善登录功能

Employee table中密码是明文存储,如何解决?

  1. 将密码加密后存储

使用MD5加密方式MD5信息摘要算法,一种密码散列函数,将原本明文密码生产为一个128位的散列值(16字节),且该过程是单向的。所以进行密码核对是核对加密后的128位密文。

  • 修改数据库中的明文密码,改为MD5加密后的密文
  • 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中的密码进行对比
  • DigestUtils工具类,可以对数据进行DM5加密

Swagger

帮助后端生成接口文档,并进行接口测试使用Swagger只需要按照他的规范去定义接口及接口相关信息,就可以做到生成接口文档,以及在线接口调试页面。Knife4j 是为Java MVC框架集成Swagger生成Api文档的增强解决方案。<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>

Swagger使用方式
  • 导入 knife4j的maven坐标
  • 在配置类中加入knife4j相关配置
  • 设置静态资源映射,否则接口文档页面无法访问
Swagger常用注解
注解
说明
@Api
用在类上,例如Controller,表示对类的说明
@ApiModel
用在类上,例如entity、DTO、VO
@ApiModelProperty
用在属性上,描述属性信息
@ApiOperation
用在方法上,例如Controller的方法,说明方法的用途、作用

Read more

如何设计秒杀系统

什么是秒杀设计 秒杀设计 是一种针对高并发、大流量场景的系统设计,通常应用于电商活动中(如限时抢购、促销等),用户在非常短的时间内大量涌入系统,抢购有限的商品或优惠。这种场景下,系统需要能够承受巨大的瞬时并发请求,同时保证数据的一致性和业务的正确性。 秒杀技术分析 秒杀系统贯穿活动、商品和下单三个领域,涵盖了页面静态化、接口限流、Redis预减库存、异步下单和接口动态化等技术。 需要迎接的挑战有: 1. 高并发和压力测试:秒杀活动会带来巨大的流量,服务器和数据库的并发处理能力是关键。 2. 保证数据一致性:抢购涉及到商品库存的实时减少,需要保证在高并发场景下库存数据的准确性和一致性 3. 防止超卖和重复购买:确保同一商品不会被重复购买,同时避免超卖,即使是在极端的高并发情况下 4. 分布式锁和限流:使用分布式锁来保护关键资源,限制用户访问频率以免系统崩溃 5. 性能优化:包括代码层面的优化、数据库的优化、缓存的使用等,以提高系统性能和响应速度。 页面静态化 秒杀页面静态化是将动态生成的秒杀页面转换为静态HTML页面,从而提高页面响应速度和系统性能

By Yucan Huang

分布式系统下雪花算法生成全局唯一ID

雪花算法 在分布式系统中,为了避免多个节点生成相同的唯一标识符id,我们通常使用一种全局唯一ID生成策略,而Snowflake Algorithm就是广泛使用的解决方案之一。 雪花算法简介 雪花算法生成的 ID 是一个 64 位的二进制整数,具有以下组成部分: 部分 字节长度 描述 符号位 1bit 固定为0,因为生成的ID是整数 时间戳 41bits 表示时间戳,单位是毫秒,可以存储大约68年的时间 机器ID 10bits 用于标识不同的机器(节点)。10位可以将其分数据中心ID(5位)和机器ID(5位),共支持1024台机器同时生成ID 序列号 12bits 同一毫秒内的序列号,用来区分在同一台机器、同一时间戳下生成的多个ID,最大支持同一毫秒生成4096个唯一ID 代码实现 package com.can.springbootmessage; public class SnowflakeIdGenerator { // 起始时间戳,Long是64位,

By Yucan Huang

责任链设计模式

什么是责任链模式 项目有个请求,需要有对应的服务来处理,然后这个请求可能需要被很多个层级权限的服务来处理。我们将这些处理该请求的服务放在一条链上,链从前往后,是层级更高的服务,第一个服务处理不了,传递到链上的下一个服务,直到这个请求被处理成功。 责任链模式(Chain of Responsibility)是一种处理请求的模式,它让多个处理器都有机会处理该请求,直到其中某个处理器成功处理该请求,责任链模式把多个处理器串成链,然后让请求在链上传递。 1. 如何把多个处理器串成链,然后让请求在链上传递 客户端发送请求,处理类去处理它的请求,所以有个处理方法(handleRequest),处理类要连接在一起,所以**处理类要有一个方法(成员变量nextHandler)**指向下一个处理类。 我们抽象出一个公共的父类,然后去定义不同的处理类,这些处理类通过nextHandler连接起来。 2. 代码演示 package interview.pattern; public class ChainRespPattern { Handl

By Yucan Huang