实战黑马苍穹外卖项目8.1-10.1

news2024/12/25 10:27:54

文章目录

    • 软件开发的基本流程
      • 用户层
      • 网关层
      • 应用层
      • 数据层
      • 工具
    • 数据库设计
    • 导入准备好的前端和后端工程
    • 基础工程代码分析
    • 完成员工功能
    • 完成菜品功能
    • 入门Redis+实现店铺营业
    • HttpClient+微信小程序开发
    • 缓存+Spring Cache
    • 实现地址功能+用户下单
    • 实现订单推送状态
    • apache对应的工具使用
    • 项目用到的技术进行分析
      • JWT

软件开发的基本流程

二刷该项目主要是需要看接口文档去设计对应的代码,不跟着视频去敲
软件开发的基本流程
需求分析->设计->编码->测试->上线运维

IT公司对应职位,产品经理,UI设计师,架构师,开发工程师,测试工程师,运维工程师。

管理端 和用户端对应的功能在这里插入图片描述

主要使用到的技术
基于springboot,使用Redis,swagger,JWT,webSocket,POI,mysql等技术。

用户层

本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序。

网关层

使用Nginx作为http服务器,部署静态资源,访问性能较高。在Nginx中有两个比较重要的作用,反向代理和负载均衡,在项目部署的时候,需要实现Tomact的负载均衡,可以通过nginx来实现

应用层

springboot 快速构建spring项目,采用约定优于配置思想,简化开发
springMVC 实现拦截等功能的
springTask 实现定时任务的发送
SpringCache 实现数据缓存功能
JWT 实现用户登录的验证功能
阿里云OSS 对象存储服务,在项目中主要存储对应的文件,如图片等
Swagger:可以自动的帮助开发人员生成接口文档,并对接口进行测试
POI 封装了Excel的常用操作
WebScoket 一种通信网络的协议,是客户端和服务器之间的数据交换更加简单,用于项目的来单和催单功能实现

数据层

Mysql 关系型数据库,本项目的核心业务都会采用msql进行存储
Redis,基于key-value格式内存的数据库,访问速度快,经常用来做缓存
Mybatis 本项目持久层将会采用Mybatis开发
pagehelper:分页插件
spring data redis 简化Java代码操作Redis的API

工具

git 进行版本的控制工具,在团队协作中,使用改工具对项目进行代码管理
maven 项目构建工具
junit 单元测试工具,开发人员功能实现完毕后,需要进行测试
postman:接口测试工具,模拟用户发送各类的HTTP请求,获取对应的结果。

后端分模块开发
sky-common 存放一些公共类
sky-pojo 模块存放一些entity、DTO、VO
sky-server 存放Controller、service、mapper和启动类等
在这里插入图片描述

数据库设计

本项目的数据库设计很有技巧,到底如何设计对应的数据库呢?
1需要一个员工表
2 分类表
3 菜品表4菜品需要有对应的口味,菜品口味表
5 套餐表6套餐有对应的内容,需要一个套餐菜品表
7下单用户需要有用户表
8配送 需要地址表 9用户购物车表
10 下单需要存储订单表,还需要11订单明细表

导入准备好的前端和后端工程

基础工程代码分析

完成员工功能

完成菜品功能

入门Redis+实现店铺营业

HttpClient+微信小程序开发

缓存+Spring Cache

实现地址功能+用户下单

实现订单推送状态

apache对应的工具使用

项目用到的技术进行分析

JWT

全称 JSON Web Token ,用于在通信双方以json数据格式安全的传输信息,用于数字签名的存在。

简单来讲,jwt就是将原始的json数据格式进行了安全的封装,这样就可以直接基于jwt在通信双方安全的进行信息传输了。

JWT由三部分组成:
第一部分 头,记录令牌的类型、签名算法等,例如:{“alg”:“HS256”,“type”:“JWT”}
第二部分 PayLoad 有效载荷,携带一些自定义的信息,默认信息等。列入:{" id":“1”,“username”:“Tom”}
第三部分 Signature(签名),防止Token被篡改,确保安全性。并加入指定秘钥,通过指定签名算法计算而来。

签名的目的就是为了防jwt令牌被篡改,而正是因为jwt令牌最后一个部分数字签名的存在,所以整个jwt 令牌是非常安全可靠的。一旦jwt令牌当中任何一个部分、任何一个字符被篡改了,整个令牌在校验的时候都会失败,所以它是非常安全可靠的

JWT是如何将原始的JSON格式数据,转变为字符串的呢?

其实在生成JWT令牌时,会对JSON格式的数据进行一次编码:进行base64编码

Base64:是一种基于64个可打印的字符来表示二进制数据的编码方式。既然能编码,那也就意味着也能解码。所使用的64个字符分别是A到Z、a到z、 0- 9,一个加号,一个斜杠,加起来就是64个字符。任何数据经过base64编码之后,最终就会通过这64个字符来表示。当然还有一个符号,那就是等号。等号它是一个补位的符号

需要注意的是Base64是编码方式,而不是加密方式。

JWT令牌最典型的应用场景就是登录认证:

  1. 在浏览器发起请求来执行登录操作,此时会访问登录的接口,如果登录成功之后,我们需要生成一个jwt令牌,将生成的 jwt令牌返回给前端。
  2. 前端拿到jwt令牌之后,会将jwt令牌存储起来。在后续的每一次请求中都会将jwt令牌携带到服务端。
  3. 服务端统一拦截请求之后,先来判断一下这次请求有没有把令牌带过来,如果没有带过来,直接拒绝访问,如果带过来了,还要校验一下令牌是否是有效。如果有效,就直接放行进行请求的处理。

导入JTW依赖

io.jsonwebtoken
jjwt
0.9.1

JWT工具类

package com.sky.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
//JWT 工具类
public class JwtUtil {
    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     *
     * @param secretKey jwt秘钥
     * @param ttlMillis jwt过期时间(毫秒)
     * @param claims    设置的信息
     * @return
     */
     //三个参数 一个是对应的密钥 然后就是对应的时间
     //接着是对应的集合
    public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
        // 指定签名的时候使用的签名算法,也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成JWT的时间
        long expMillis = System.currentTimeMillis() + ttlMillis;
        Date exp = new Date(expMillis);

        // 设置jwt的body 
        JwtBuilder builder = Jwts.builder()
                // 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                .setClaims(claims)
                // 设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置过期时间
                .setExpiration(exp); //设置时间的格式是对应的Date

        return builder.compact();
    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        // 得到DefaultJwtParser
        Claims claims = Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置需要解析的jwt
                .parseClaimsJws(token).getBody();
        return claims;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python连接SQLite数据库基础教程

SQLite是一种轻量级的嵌入式数据库&#xff0c;常用于小型项目和移动应用程序。Python提供了内置的sqlite3模块&#xff0c;可以方便地连接和操作SQLite数据库。本文将介绍如何使用Python连接SQLite数据库&#xff0c;并进行基本的数据操作。 安装SQLite和sqlite3模块 首先&a…

技术实践|Hive数据迁移干货分享

导语 Hive是基于Hadoop构建的一套数据仓库分析系统&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供完整的SQL查询功能。它的优点是可以通过类SQL语句快速实现简单的MapReduce统计&#xff0c;不用再开发专门的MapReduce应用程序&#xff0c;从而降低…

如何使用CRM系统进行精细化管理客户?

客户是企业的生命线&#xff0c;对客户进行精细化管理&#xff0c;是提高企业收益的关键。那么&#xff0c;如何进行客户管理&#xff1f;CRM系统可以实现精细化管理客户&#xff0c;提升客户的价值。下面我们就来详细说一说。 1、获取客户信息 Zoho CRM系统可以通过web表单、…

二叉树题目:二叉树的右视图

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的右视图 出处&#xff1a;199. 二叉树的右视图 难度 4 级 题目描述 要求 给定二叉树的根结点 root \t…

Git Bash 和 Git GUI中文汉化

目录 为什么要中文汉化&#xff1f;Git Bash的汉化Git GUI的汉化 为什么要中文汉化&#xff1f; 看到中文大概能猜出是什么意思&#xff0c;便于使用&#xff0c;特别是Git GUI&#xff0c;中文版的菜单很容易理解是要做什么&#xff0c;如下图&#xff1a; Git Bash的汉化 …

纽扣电池PSE认证检测标准是什么?纽扣电池PSE认证办理机构

中国制造商要申请PSE认证&#xff0c;首先要确定其申请的产品是否在中国质量认证中心(CQC)获得授权受理的认证CE范围内。由于目前CQC获得的授权是基于技术基准2&#xff0c;制造商须选择技术基准2申请PSE认证。确认后制造商可向CQC提出书面申请&#xff0c;并将样品与技术资料提…

Spring源码分析(九)Bean实例化的后置处理

目录 1.1 后置处理1.1.1 调用父类方法1.1.2 获取元数据1.1.3 注解元信息检查1.1.4 Member、InjectedElement、InjectionMetadata 官网&#xff1a;Home参考书籍&#xff1a;Spring源码深度解析-郝佳编著-微信读书 上一节我们详细的解释了Bean的创建过程&#xff0c;工厂&#…

OpenCV(二):认识Mat容器

目录 1.什么是Mat类 2.Mat类能存储的数据 整数类型&#xff08;有符号和无符号&#xff09;&#xff1a; 浮点数类型&#xff1a; 布尔类型&#xff1a; 3.Mat类的创建 1.利用矩阵宽、高和类型参数创建Mat类 2.利用矩陈Size(结构和数据类型参数创建Mat类 3.利用已有Mat…

三十七个常见Vue面试题,背就完事了四

二十八、Vue.use是干什么的&#xff1f;Vue.use是用来使用插件的。我们可以在插件中扩展全局组件、指令、原型方法等。 会调用install方法将Vue的构建函数默认传入&#xff0c;在插件中可以使用vue&#xff0c;无需依赖vue库 二十九、组件写name有啥好处&#xff1f; 增加name…

恒运资本:什么叫融资通俗的讲是什么意思?

融资浅显的讲是什么意思&#xff1f; 近年来&#xff0c;伴随着互联网金融的鼓起&#xff0c;融资这个词越来越为人们所熟知。但是&#xff0c;关于融资这个词的意思&#xff0c;很多人也许只是有一个含糊的概念&#xff0c;无法做到准确而深入的了解。本文将从多个角度剖析&a…

VB:百元买百鸡问题

VB&#xff1a;百元买百鸡问题 Private Sub Command1_Click()ClsRem 百元买百鸡问题Print "公鸡", "母鸡", "小鸡"For x 0 To 20For y 0 To 33z 100 - x - yIf z Mod 3 0 ThenIf 5 * x 3 * y z / 3 100 ThenPrint x, y, zEnd IfEnd IfNe…

亚运会即将召开,数字孪生体育场能够发挥什么作用?

亚运会&#xff0c;作为亚洲地区最重要的综合性运动盛会之一&#xff0c;将吸引数以千计的运动员、教练员和观众汇聚一堂&#xff0c;共同见证运动的魅力。在如此大规模的体育盛会中&#xff0c;数字孪生技术能够为运动场馆的规划、运营和观众带来前所未有的体验。 数字孪生技术…

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序 一、简介1. 内置 jtag 介绍2. OpenOCD3. 准备工作 二、操作步骤1. 接线2. 在VSCode设置端口等信息3. 测试编译烧录 三、调试程序 一、简介 1. 内置 jtag 介绍 在ESP32中&#xff0c;内置了一个用于JTAG调试的特殊程序&#xff…

【实验八】555定时器的应用

【实验内容】 【实验报告】 【实验截图】 1 2 3 【得分】

(c++)类和对象 上篇

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中&#xff0c;监视器扮演着关键角色&#xff0c;它们能够捕获异常情况、错误响应、资源利用等&#xff0c;为测试人员提供有价值的信息&#xff0c;有助于发现潜在漏洞和问…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

LeetCode——栈的压入、弹出序列

这里我用下面的例子子来讲解一下模拟栈的实现。 例子1&#xff1a;pushed [1,2,3,4,5] popped [4,5,3,2,1] 思路&#xff1a;第一步&#xff1a;我们先创建一个栈&#xff0c;然后将pushed的数据压进去 第二步&#xff1a;判断&#xff01; 当压入栈的数据和popped第一个数据…

【实验六】组合逻辑电路的设计

【实验内容】 【实验报告】