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

简介

技术选型

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

用户层: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 创建时间    datetimecreate_user 创建人id    bigint
insert/updateupdate_time 创建时间    datetimeupdate_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

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

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

相关文章

对齐了之后才舒服,matplotlib文字和字体设置

文章目录 text方法字体局部字体 matplotlib教程&#xff1a; 初步&#x1f4c8; 子图绘制&#x1f4c8; 坐标投影&#x1f4c8; 刻度设置&#x1f4c8; 共享坐标轴&#x1f4c8; 内容填充 text方法 【plt】提供了文字显示函数text&#xff0c;包含三个必不可少的参数&am…

【QT+QGIS跨平台编译】之五十八:【QGIS_CORE跨平台编译】—【qgsexpression_texts.cpp生成】

文章目录 一、Python二、生成来源三、构建过程3.1 构建qgsexpression_texts.cpp.temp3.2 构建qgsexpression_texts.cpp一、Python python.exe 是 Python 解释器的可执行文件,用于在命令行中运行 Python 脚本。它是 Python 编程语言的解释器程序,负责解析和执行 Python 代码。…

第十四届校模拟赛第一期(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为4小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习&#…

改进YOLO系列 | YOLOv5/v7 引入通用高效层聚合网络 GELAN | YOLOv9 新模块

今天的深度学习方法专注于如何设计最合适的目标函数,以使模型的预测结果最接近真实情况。同时,必须设计一个合适的架构,以便为预测提供足够的信息。现有方法忽视了一个事实,即当输入数据经过逐层特征提取和空间转换时,会丢失大量信息。本文将深入探讨数据通过深度网络传输…

[AutoSar]BSW_Com06 CAN报文应用层到Can总线的函数调用

目录 关键词平台说明一、背景二、PDU转换三、函数调用 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)autosar版本4.3.X >>>>>回到总目…

流水账-20240229

目录 git本地回滚到到120bc409ee3b8f63a23d0060e55118bcce557acf提交记录本地提交到已有代码分支 IDEA批量导入快捷键无效更换背景主题快捷键快捷键可以设置eclipse模式&#xff0c;但是有些不生效&#xff0c;可能是冲突了Ctrl单击&#xff0c;Eclipse里面是可以跳转到代码内部…

AI:139-基于深度学习的语音指令识别与执行

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

Vue3自定义文件列表页面(含上传、搜索、复制链接)

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"container"><h1>文件列表</h1><div class"header-actions"><a-input placeholder"输入关键词搜索" v-model:value"…

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

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

Python:练习:编写一个程序,写入一个美金数量,然后显示出如何用最少的20美元、10美元、5美元和1美元来付款

案例&#xff1a; python编写一个程序&#xff0c;写入一个美金数量&#xff0c;然后显示出如何用最少的20美元、10美元、5美元和1美元来付款&#xff1a; Enter a dollar amout:93 $20 bills: 4 $10 bills: 1 $5 bills:0 $1 bills:3 思考&#xff1a; 写入一个美金数量&…

【数据分享】2000~2023年MOD15A2H 061 叶面积指数LAI数据集

各位同学们好&#xff0c;今天和大伙儿交流的是2000~2013年MOD15A2H 061 LAI数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN Grid V061. 2021, d…

在原有项目进行业务逻辑开发:同一用户短时间不得提交多次申请,以及更新主表时数据刷新掉了角色权限以及密码重置的问题,详细思路及代码

开发背景&#xff1a; 用户提交表单后&#xff0c;插入到对应数据库表的字段中去&#xff0c;因需要保存是哪一个用户提交的&#xff0c;所以需要拿到主表的user_id&#xff0c;更新功能为记录提交时间&#xff0c;短时间不得再次提交 在对一个已有角色权限分配&#xff0c;登录…

layui中,父页面与子页面,函数方法的相互调用、传参

<%--父页面--%> <script type"text/javascript">var KaoHaoType 0; // 考号类型 自定义参数1// 选取考号类型function SelectKaoHaoType(callBack) {KaoHaoType 0; // 默认选择填涂考号layer.open({type: 2, title: 请选择 考号区类型, ar…

职场中被小人欺负了,应该一笑了之吗?还是怎么办?

在职场中遇到不公正的待遇或被欺负&#xff0c;确实是一个让人困扰的问题。处理这类问题&#xff0c;首先要保持冷静和理性&#xff0c;避免情绪化的反应&#xff0c;这样有助于找到最合适的解决方案。以下是一些建议&#xff0c;您可以根据具体情况考虑&#xff1a; 1. **保持…

网络编程作业day2

1.将TPC和UDP通信模型各敲两遍 &#xff08;1&#xff09;TPC通信模型&#xff1a; 服务器代码&#xff1a; #include <myhead.h> #define SERVER_IP "192.168.125.136" #define SERVER_PORT 1314 int main(int argc, const char *argv[]) {//1、创建用于监…

CLion 2023:专注于C和C++编程的智能IDE mac/win版

JetBrains CLion 2023是一款专为C和C开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了许多先进的功能&#xff0c;旨在提高开发效率和生产力。 CLion 2023软件获取 CLion 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#xff0c;使您能够更…

统计业务流量的毫秒级峰值 - 华为机试真题题解

考试平台&#xff1a; 时习知 分值&#xff1a; 200分&#xff08;第二题&#xff09; 考试时间&#xff1a; 两小时&#xff08;共3题&#xff09; 题目描述 业务模块往外发送报文时&#xff0c;有时会出现网卡队列满而丢包问题&#xff0c;但从常规的秒级流量统计结果看&…

Mybatis-Plus介绍

目录 一、Mybatis-Plus简介 1.1、介绍 1.2、特性 1.3、架构 1.4、Mybatis-Plus与Mybatis的区别 二、快速入门 2.1、首先创建数据库mybatis-plus 2.2、创建user表 2.3、插入数据 2.4、创建Spring-Boot项目 2.5、添加依赖 2.6、连接数据库 一、Mybatis-Plus简介 1.1、…

代码随想录第46天|139.单词拆分 多重背包理论基础 背包总结

文章目录 单词拆分思路&#xff1a;代码 多重背包≈0-1背包题目代码 背包总结 单词拆分 3 思路&#xff1a; 代码 class Solution {public boolean wordBreak(String s, List<String> wordDict) {HashSet<String> set new HashSet<>(wordDict);boolean[]…

sheng的学习笔记-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16

目录&#xff1a;目录 看本文章之前&#xff0c;需要学习卷积神经网络基础&#xff0c;可参考 sheng的学习笔记-卷积神经网络-CSDN博客 目录 LeNet-5 架构图 层级解析 1、输入层&#xff08;Input layer&#xff09; 2、卷积层C1&#xff08;Convolutional layer C1&…