苍穹外卖知识点总结(一)

简介

技术选型

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

用户层:node.js        Vue.js        ElementUI        微信小程序        apache echarts

网关层:nginx

应用层:Spring Boot        Spring MVC        Spring Task        httpclient        Spring Cache        JWT        阿里云OSS        Swagger        POI        WebSocket

数据库:MySQL        Redis        mybatis        pagehelper        spring data redis

工具:Git        maven        junit        postman

后端环境搭建

熟悉项目的整体结构

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

sky-common        子模块,存放公共类,例如:工具类,常量类,异常类等

sky-pojo        子模块,存放实体类,VO,DTO等

sky-server        子模块,后端服务,存放配置文件,controller、service、mapper

关于什么是DTO、VO、entity?

entity        实体,通常与数据库中的表对应

DTO        数据传输对象,通常用于程序中各层之间传递数据

VO        视图对象,为前端展示数据提供对象

POJO        普通java对象,只有属性和对应的getter和setter

如何实用git进行版本管理?

Git对待数据的方式并非差异比较,而是采用快照的方式。Git把数据看作是对小型文件系统的一组快照。每次提交更新或者在Git中保存状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,二十保留一个人链接指向之前存储的文件。Git对待数据更现实一个快照流。

Git的三种状态
  1. 已提交(committed):数据已经安全的保存在本地数据库中。
  2. 已修改(modified):已经修改了文件,但是还没有保存在数据库中。
  3. 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入Git项目的三个工作区域的概念:Git仓库、工作目录、和暂存区。

Git常用命令
获取git仓库
从现在目录中初始化仓库
git init
从服务器中克隆一个现有的git仓库
git clone [url]
提交更新
git commit -m "代码提交信息"
推送到远程仓库:
git remote add origin <server>
将改动提交到远程仓库(可以将master换成你想要推送的任何分支)
git push origin master
撤销操作
git commit --amend
Git分支

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master是默认分支。在其他分支上进行开发。完成后再将他们合并到主分支上。

创建一个名字叫做test的分支
git branch test
切换当前分支到test(当你切换分支的时候,Git会重置你的工作目录,使其看起来像回到了你在分支上最后一次提交的样子。Git会自动添加、修改、删除文件以确保此时你的工作目录和这个分支最后一次提交时的样子一摸一样)
git checkout test
你可以直接这样创建分支并切换过去
git checkout -b feature_x
切换到主分支
git checkout master
合并分支
git merge test
把新建的分支删除掉
git push origin

数据库环境搭建

employee        员工表;        category        分类表;

dish        菜品表;        dish_flavor        菜品口味表;

setmeal        套餐表;        setmeal_dish        套餐菜品关系表

user        用户表;        adress_book        地址表;

shopping_cart        购物车表;        orders        订单表;

order_detail        订单明细表;

Nginx反向代理和负载均衡

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

        nginx反向代理就是将前端发送的请求由nginx动态转发到后端服务器。

        nginx反向代理好处

  1. 提高访问速度
  2. 进行负载均衡
  3. 保证后端服务安全

Day1

完善登录功能

password = DigestUtils.md5DigestAsHex(password.getBytes());

Swagger介绍和使用

后端生成接口文档并且进行测试

介绍

生成接口文档以及在线调试。

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

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

使用方式
  • 导入knife4j的maven坐标
  • 在配置类中加入knife4j相关配置
  • 设置静态资源映射,否则接口文档页面无法显示
  • 访问接口文档界面localhost:8080/doc.html
常用注解

@Api 用在类上,例如controller表示对类的说明

@ApiModel 用在类上,例如entity,DTO,VO

@ApiModelProperty 用在属性上,描述属性信息

@ApiOPeration 用在方法上,例如controller的方法,说明方法的用途、作用

Day2

员工管理

新增员工
  1. 如果传入的数据是json需要添加 @RequestBody 注解
  2. 对象属性拷贝由A拷贝到B,前提是A,B的属性名一致
    BeanUtils.copyProperties(employeeDTO,employee);

代码完善:

录入的用户名已存在,抛出异常后没有处理;

        处理过程首先捕捉出现的异常,然后分析相关错误;

新增员工时,创建人id和修改人id设置为了固定值;

  1. 熟悉关于基于JWT令牌认证的过程。
  2. 截取JWT令牌,并且分析令牌里面出现的ID
  3. 那么如何将ID传给服务?

ThreadLocal并不是一个Thread,而是Thread的局部变量。

ThreadLocal为每一个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到。

ThreadLocal常用方法

  • public void set(T value) 设置当前线程的线程局部变量的值
  • public T get() 返回当前线程所对应的线程局部变量
  • public void remove()移除当前线程的线程局部变量

员工分页查询
  • Pagehelper插件,分页查询是基于SQL的limit关键字计算,其返回类型也要为Page
    PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize());
    
  • 分页查询XML书写:
启用禁用员工账号
  • @PathVariable是Spring框架中的一个注解,用于将URL中的路径变量绑定到方法参数上。
编辑员工
  • 注意书写SQL的语法错误
导入分类模块功能代码

菜品管理

公共字段自动填充
实现思路
insert    create_time 创建时间    datetime
          create_user 创建人id    bigint
insert/update
          update_time 创建时间    datetime
          update_user 修改时间    bigint
  1. 自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法。
  2. 自定义切面AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公共字段赋值。
  3. 在Mapper加入AutoFill注解。

        //获取到当前被拦截的方法上的数据库操作类型
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();//方法签名对象
        AutoFill autoFill = signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解
        OperationType operationType = autoFill.value();//获得数据库操作类型

        //获取到当前被拦截的方法的参数--实体对象
        Object[] args = joinPoint.getArgs();
        if(args == null || args.length == 0){
            return;
        }

        Object entity = args[0];
        //准备赋值的数据

        LocalDateTime now = LocalDateTime.now();
        Long currentId = BaseContext.getCurrentId();

        //根据当前不同的操作类型,为对应的属性通过反射来赋值
        if(operationType == OperationType.INSERT){
            //为四个字段赋值
            try{
                Method setCreateTime = entity.getClass().getDeclaredMethod("setCreateTime", LocalDateTime.class);
                Method setCreateUser = entity.getClass().getDeclaredMethod("setCreateUser",Long.class);
                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser",Long.class);

                //通过反射赋值

                setCreateTime.invoke(entity,now);
                setCreateUser.invoke(entity,currentId);
                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            }catch (Exception e){
                e.printStackTrace();
            }
        }else if (operationType == OperationType.UPDATE){
            try{
                Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", LocalDateTime.class);
                Method setUpdateUser = entity.getClass().getDeclaredMethod("setUpdateUser",Long.class);

                //通过反射赋值

                setUpdateTime.invoke(entity,now);
                setUpdateUser.invoke(entity,currentId);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

通过在Mapper里面加入注解

@AutoFill(value = OperationType.INSERT)
/@AutoFill(value = OperationType.UPDATE)

使用阿里OSS

  1. 在阿里云官网创建一个bucket
  2. 完善配置项
  3. 创建config文件

Day5

Redis基础知识

Redis是基于内存的key-value结构数据库。

  • 基于内存存储,读写性能高
  • 适合存储热点数据,热点商品、资讯、新闻
  •  企业应用广泛

如何打开Redis在程序所在的文件目录打开cmd

redis-server.exe redis.windows.conf
结束进程
ctrl + c

如何连接redis

redis-cli.exe

Redis中的数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型。

  1. 字符串string
  2. 哈希hash
  3. 列表list
  4. 集合set
  5. 有序集合sorted set / zset

字符串String

SET key value 设置指定key的值;

GET key 获取指定key的值;

SETEX key  seconds value 设置指定key的值,并将key的过期时间设为seconds(获取验证码)

SETNX key value 只有在key不存在时设置key的值

哈希操作命令

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

HSET key field value        将哈希表key中的字段field的值设为value

HGET key field        获取存储在哈希表中指定字段的值

HDEL key field        删除存储在哈希表中的指定字段

HKEYS key        获取哈希表中所有字段

HVALS key        获取哈希表中所有值

其中,key、field1、value均为字符串。

列表操作命令

Redis列表是最简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2]        将一个或多个值插入到列表头部
  • LRANGE key start stop        获取列表最后一个元素 lrange key 0 -1输出全部元素
  • LPOP key       移除并获取列表最后一个元素
  • LLEN key       获取列表长度
  • R类似
 集合操作命令

Redis set 是string 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据,常见命令:

  • SADD key member1 [member2]        向集合中添加一个或多个成员
  • SMEMBERS key                 返回集合中的所有成员
  • SCARD key                    获取集合的成员数
  • SINTER key1 [key2]         返回给定所有集合的交集
  • SUNION key1 [key2]          返回所有给定集合的并集
  • SREM key member1 [member2]          删除集合中一个或多个成员

有序集合操作命令

Redis有序集合是string类型元素的集合,且不允许有重复成员。每个元素都会关联一个double类型的分数。常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员

  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间的成员

  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment

  • ZREM key member [member ...] 移除有序集合中的一个或多个成员 

Redis通用命令

不分数据类型,都可以使用的命令

  • KEYS pattern 查找所有符合给定模型的key
  • EXISTS key 检查给定key是否存在
  • TYPE key 返回key所存储的值的类型
  • DEL key 该命令用于在key存在时删除key

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图 Qt实现TCP连接 服务器端&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer>//服务器端类 #include<QTcpSocket>//客户端类 #include<QMessageBox>//消息对话框类 #include<QList>//链…

fordeal测评养号环境搭建:解决硬件、IP、浏览器等关键问题

Fordeal电商平台销售网点覆盖中东、欧美等多个国家和地区&#xff0c;其中中东市场是最重要的市场。 Fordeal主要为用户提供男女装、箱包及配饰、护肤彩妆、电子数码、运动用品等品类。 fordeal 支持多种语言、货币和支付方式。 1.点击Sign in进入登录界面。 2. 选择Register注…

第七篇:微信小程序的跳转页面

前提&#xff1a;建议还没学HTML、CSS、JavaScript、JSON、vue、Ajax的兄弟姐妹们&#xff0c;先去把这些基础补好过一遍&#xff0c;不然不好理解微信小程序 前面这一篇已经讲过一次<navigator>跳转页面的用法了&#xff0c;今天详细讲解一下 回顾&#xff1a; 小程序…

<网络安全>《60 概念讲解<第七课 网络模型OSI对应协议>》

1 OSI模型 OSI模型&#xff08;Open Systems Interconnection Model&#xff09;是一个由国际标准化组织&#xff08;ISO&#xff09;提出的概念模型&#xff0c;用于描述和标准化电信或计算系统的通信功能&#xff0c;以实现不同通信系统之间的互操作性。该模型将通信系统划分…

【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环

这里是 simpleInfoList 集合&#xff0c;记为集合A&#xff08;传值对象&#xff09; List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…

Ubuntu上Jenkins自动化部署Gitee上VUE项目

文章目录 1.安装NodeJS插件2.配置全局工具配置-NodeJS环境变量3.新建自由风格的软件项目任务4.配置General配置丢弃旧的构建配置参数化构建过程 5.配置源码管理6.构建触发器7.设置构建环境8.配置构建步骤9.配置构建后操作10测试构建 前文链接&#xff1a; Ubuntu上Jenkins自动…

使用 OpenCV 通过 SIFT 算法进行对象跟踪

本文介绍如何使用 SIFT 算法跟踪对象 在当今世界&#xff0c;当涉及到对象检测和跟踪时&#xff0c;深度学习模型是最常用的&#xff0c;但有时传统的计算机视觉技术也可能有效。在本文中&#xff0c;我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计…

深入Linux内核(进程篇)—进程切换之ARM体系架构 简单总结

context_switch函数完成Arm架构Linux进程切换&#xff0c;调用两个函数&#xff1a; 调用switch_mm() 完成用户空间切换&#xff0c;刷新I-CACHE&#xff0c;处理ASID和TLB&#xff0c;页表转换基址切换&#xff08;即把TTBR0寄存器的值设置为新进程的PGD&#xff09;&#xf…

应用多元统计分析--多元数据的直观表示(R语言)

例1.2 为了研究全国31个省、市、自治区2018年城镇居民生活消费的分布规律&#xff0c;根据调查资料做区域消费类型划分。 指标&#xff1a; 食品x1&#xff1a;人均食品支出(元/人) 衣着x2&#xff1a;人均衣着商品支出(元/人) 居住x3&#xff1a;人均居住支出(元/人) 生活x4…

智能驾驶规划控制理论学习-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

来,和同频的人一起学习论文#理解技术趋势

学习新技术&#xff0c;慢慢也有了施展拳脚的地方。今天我们给ComfyUI中文爱好者社区成员提供了一个工作机会&#xff0c;有需要可以联系我们的小助手&#xff1a; 相信这几天大家都看到了我们更新了些论文笔记出来&#xff0c;阅读1篇英文论文我们需要花几个小时&#xff0c;如…

STM32串口DMA发送接收(1.5Mbps波特率)机制

数据拷贝过程中不需要CPU干预&#xff0c;数据拷贝结束则通知CPU处理。 以115200bps波特率&#xff0c;1s传输11520字节&#xff0c;大约69us需响应一次中断&#xff0c;如波特率再提高&#xff0c;将消耗更多CPU资源 高波特率场景下&#xff0c;串口非常有必要使用DMA。 关…

C#使用iText7将多个PDF文档合并为单个文档

使用HtmlAgilityPack抓取并分析网页内容&#xff0c;然后再调用PuppeteerSharp将网页生成PDF文件&#xff0c;最终的成果如下图所示&#xff0c;得到将近120个pdf文档。能看&#xff0c;但是不方便&#xff0c;需要逐个打开文档才能看到所需的内容&#xff0c;最好能将这些文档…

Ps:绘画对称功能

Photoshop 中的绘画对称 Paint Symmetry功能允许用户在画布上创建对称的绘画和设计&#xff0c;极大地提高了创作的效率和准确性&#xff0c;尤其适合于制作复杂的对称图形和图案。 可在使用画笔工具、铅笔工具或橡皮擦工具时启用“绘画对称"功能。 提示&#xff1a; 绘画…

【IO流系列】ObjectStream 序列化流与反序列化流

序列化流与反序列化流 1. 概述2. 作用3. 序列化流&#xff08;对象操作字节输出流&#xff09;3.1 构造方法3.2 成员方法3.3 代码示例 4. 反序列化流&#xff08;对象操作字节输入流&#xff09;4.1 构造方法4.2 成员方法4.3 代码示例 5. 细节6. 练习6.1 练习1&#xff1a;用对…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

【git】入门

当我们设计文档时&#xff0c;我们会不断的修改文档&#xff0c;而设计的文档通过第一次修改&#xff0c;第二次修改&#xff0c;很难讲每次修改的版本维护起来&#xff0c;每个版本可以分为v1,v2 ,v3,v4如果需要哪个版本&#xff0c;我们可以直接查看。 随着版本的不断增多&am…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

群晖NAS配置WebDav结合内网穿透实现公网访问本地影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…