- 博客(65)
- 收藏
- 关注
原创 css子元素在父元素中居中
1、子元素相对于父元素绝对定位:子元素的top、left设置为50%并且子元素margin-top和margin-left减去各自宽高的一半。5、子元素相对父元素绝对定位,子元素top,left值为50%,transform:translate(-50%,-50%)。4、子元素相对定位,子元素top,left值为50%,transform:translate(-50%,-50%)。2、子元素相对于父元素绝对定位:子元素上下左右全为0,然后设置子元素margin:auto。1、设置子元素和父元素的行高一样。
2022-09-26 12:26:03
1609
原创 sleep和wait区别详解
sleep和wait异同共同点:wait和sleep都是让当前线程暂时放弃cpu的使用权,进入阻塞状态。不同点:方法归属不同我sleep(long) 是 Thread 的静态方法而 wait(),wait(long) 都是 Object 的成员方法,每个对象都有醒来时机不同执行 sleep(long) 和 wait(long) 的线程都会在等待相应毫秒后醒来wait(long) 和 wait() 还可以被 notify 唤醒,wait() 如果不唤醒就一直等下去它们都可以
2022-05-29 12:35:32
505
原创 前后端分离开发
什么是前后端分离开发?前后端分离开发,就是在项目开发过程中,对于前端的代码专门由前端的开发人员开发,后端代码由后端人员负责,这样可以做到分工明确、各司其职,进而提高开发效率,前后端代码并行开发,加快项目的开发进度。目前前后端分离被各大公司使用,成为项目开发的主流开发方式。前后端分离开发后,工程结构也会发生变化,即前后端代码不会混在同一个maven工程中,而是分为前端工程和后端工程。后端:负责处理、存储数据。前端:负责显示数据。后端工程——>打包部署到tomcat。前端工程——>打包
2022-05-29 08:43:19
4235
原创 MySql主从复制和读写分离详细版
什么是MySql主从复制和读写分离?mysql的主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能,就是一台或多台mysql数据库(slave,从库)从另一台mysql数据库(master,主库)进行日志的复制再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySql数据库的主从复制是mysql自带功能,无需借助第三方工具。主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能
2022-05-28 17:04:46
124
原创 基于SpringCache缓存套餐数据
缓存套餐数据实现思路前面实现了移动端套餐查看功能,对应的服务端方法为SetmealController的list方法,此方法会根据前端提供的查询条件进行数据库的查询操作。在高并发的情况下会影响系统性能,所以使用SpringCache和redis进行缓存优化,提高系统的性能。导入相关坐标。在配置文件中配置缓存数据的过期时间。在启动类加入@EnableCaching注解,开启缓存注解功能。在list方法上加上@Cacheable注解。在save、delete方法上加上@CacheEvict注解。
2022-05-26 10:33:55
203
原创 SpringCache
为什么使用缓存?使用缓存是一个很“高性价比”的性能优化方式,尤其是对于有大量重复查询的程序来说。通常来说,在WEB后端应用程序来说,耗时比较大的往往有两个地方:一个是查数据库,一个是调用其它服务的API(因为其它服务最终也要去做查数据库等耗时操作)。重复查询也有两种。一种是我们在应用程序中代码写得不好,写的for循环,可能每次循环都用重复的参数去查询了。这种情况,比较聪明一点的程序员都会对这段代码进行重构,用Map来把查出来的东西暂时放在内存里,后续去查询之前先看看Map里面有没有,没有再去查数据库,其
2022-05-24 10:15:11
105
原创 瑞吉外卖(优化)——缓存菜品数据
实现思路前面已经实现了移动端菜品查看功能,对应的服务端方法为DishController中的list方法,此方法会根据前端提供的查询条件进行数据库的查询操作。在高并发的情况下频繁的查询数据库会造成系统性能的下降,服务器响应时间增长,客户体验差。现在要对此方法进行缓存优化,提高系统的性能。具体思路:改造list方法,先从redis中读取数据,如果有则直接返回;如果redis中没有数据,则进行数据库的查询,并将查询到的菜品数据放入redis。改造DishController中的save和update方
2022-05-20 12:17:48
520
1
原创 面试题——HashMap
问题:底层数据结构,jdk1.7与1.8有什么不同?jdk1.7:数组+链表。jdk1.8:数组+(链表|红黑树)。为何要用红黑树,为何不一开始就树化呢,树化阈值为何是8,何时会树化,何时会退化为链表呢?在1.7中,当多个元素的hash值一样时,就会形成一个很长的链表,查找的时间复杂度会降为O(n),会影响hash表性能,所以jdk1.8要使用链表+红黑树,转化红黑树必须满足两个条件:链表的长度大于8。数组的扩容后长度大于64。红黑树用来避免 DoS 攻击,防止链表超长时性能下降,树化
2022-05-18 15:40:58
167
原创 java线程的六种状态
六种状态NEW-新建:只是创建了一个线程,没有调用start()方法,没有获得CPU的执行权,并不是真正的线程。RUNNABLE-可运行态:Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。。。。参考很详细,这里
2022-05-17 08:49:36
1210
原创 面试题——单例模式
单例模式的五种实现方式。了解JDK中哪些地方体现了单例模式。Runtime类(饿汉式)、System类(双检锁-懒汉式)、Collections工具类。可到idea中查看源码。饿汉式package com.jie.singleton;import java.io.Serializable;/** * @Author 小杰 * @Date 2022/5/16 15:10 * @Version 1.0 * 饿汉式 */public class Singleton1 impl.
2022-05-16 16:49:31
262
原创 Redis
什么是Redis?Redis(Remote Dictionary Server ),即远程字典服务 !是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库!简而言之:Redis是一种基于内存存储数据的Key-value结构
2022-05-16 13:35:54
255
原创 Linux命令使用技巧和格式
格式Linux命令通常由三部分组成:command [- options] [parameter]命令名(command)选项(options)参数(arguments)注:依次从左到右排列并以空格隔开,[]代表可选。命令名:命令的表示,表示命令的基本功能。事实上Linux的命令都是一个个程序,命令名是程序所在的脚本名,这些程序保存在系统的/bin目录下。用户输入命令后,shell会根据命令名到相应的位置搜索并执行。选项是命令执行的方式,参数是命令作用的对象。选项:选项是可选的,通常情况下
2022-05-11 08:41:47
126
原创 瑞吉外卖——用户下单
需求分析移动端用户将菜品或套餐加入购物车后,点击去结算按钮,页面跳转到订单确认页面,点击去支付按钮则完成下单操作。数据模型orders:订单表。order_detail:订单明细表。代码开发梳理交互过程在代码开发前,让我们先梳理下前端页面和服务端的交互过程:在购物车页面中点击去结算按钮,页面跳转到订单确认页面。在订单确认页面发送ajax请求,请求服务端获取当前登录用户的默认地址。在订单确认页面发送ajax请求,请求服务端获取当前登录用户的购物车数据。在订单确认页面,点击去支付按钮,请
2022-05-09 18:27:46
1413
原创 瑞吉外卖——个人中心退出功能(移动端)
需求分析用户点击退出登录按钮,发送ajax请求,用户退出移动端登录。数据模型需要操作user表。代码开发 /** * 退出登录 * @param session * @return */ @PostMapping("/loginout") public R<String> loginout(HttpSession session){ //清除session中的id。 session.removeAttribute("user");
2022-05-09 16:08:21
840
原创 瑞吉外卖——购物车(移动端)
需求分析移动端用户可以将菜品或套餐加入购物车。对于菜品来说,如果添加了菜品口味信息,则需要选择规格后才能加入购物车;对于套餐来说,可以直接点击加号将当前套餐加入购物车。在购物车中可以修改套餐或菜品的数量,也可以清空购物车。数据模型需要操作shopping_cart表。代码开发前后端交互过程:点击加入购物车或者加号按钮,页面发送ajax请求,将菜品或套餐加入购物车。点击购物车按钮,页面发送ajax请求,查询购物车中的菜品或套餐信息。点击清空发购物车按钮,页面发送ajax请求,请求服务端清空购
2022-05-09 14:49:11
1210
原创 JSON数据传输参数
概述前面我们说过,现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收?对于JSON数据类型,我们常见的有三种:json普通数组([“value1”,“value2”,“value3”,…])json对象({key1:value1,key2:value2,…})json对象数组([{key1:value1,…},{key2:value2,…}])对于上述数据,前端如何发送,后端如何接收?JSON普通数组步
2022-05-08 21:01:11
7687
原创 五种类型参数传递
概述前面我们已经能够使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,我们来研究一些比较复杂的参数传递,常见的参数种类有:普通参数POJO类型参数嵌套POJO类型参数数组类型参数集合类型参数这些参数如何发送,后台改如何接收?我们一个个来学习。普通参数普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。如果形参与地址参数名不一致该如何解决?发送请求与参数:http://localhost/commonParamD
2022-05-08 20:38:18
1172
原创 JUC——ThreadPool线程池
什么是线程池线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。例子: 10 年前单核 CPU 电脑,假的多线程,像马戏团小丑玩多个球,CPU 需要来回切换。 现在是多核电脑,多个线程各自跑在独立的 CPU 上,不用切换效率高。线程池的优势: 线程池做的工作只要是控制运行的线程数量
2022-05-08 16:54:58
136
原创 JUC——阻塞队列
什么是阻塞队列Concurrent 包中,BlockingQueue 很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了 BlockingQueue 家庭中的所有成员,包括他们各自的功能以及常见使用场景。阻塞队列,顾名思义,首先它是一个队列, 通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;当队列是空的,从队列中获取元素的操作将会被阻塞当队列是满的,从队列中添加元素的操作将会被阻塞
2022-05-08 15:16:32
360
原创 瑞吉外卖——菜品展示功能(移动端)
需求分析用户登录成功后跳转到系统首页,在首页需要根据菜品和套餐分类展示对应的菜品信息,如果菜品有对应的口味,用户可以通过选择规格按钮来选择读音的口味和规格。代码开发页面和服务端交互过程:页面发送ajax请求,获取分类数据(菜品分类和套餐分类)。页面发送ajax请求,获取第一个分类或套餐下的菜品。注意:首次加载完成后还发送了一次请求用于加载购物车数据,此处将请求地址暂时修改,从静态json文件获取,后续再返回修改。功能测试祝你:吉时吉日喜如风,丰年丰月如风增,争富争财争长
2022-05-08 11:58:45
1323
原创 JUC——读写锁
什么是读写锁现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,JAVA 的并发包提供了读写锁 ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁。线程进入读锁的前提条件:没有其他线程的写锁没有写请求, 或者
2022-05-07 21:17:30
423
原创 瑞吉外卖项目——导入相关地址簿(移动端开发)
需求分析地址薄指的是,移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息,同一个用户可以有多个地址信心,但是只能有一个默认地址。数据模型涉及表address_book表。代码开发搭建基本的结构功能测试祝你:吉时吉日喜如风,丰年丰月如风增,争富争财争长寿,寿山寿海寿长生,生富生才生贵子,子孝孙贤代代荣,荣华富贵年年有,有钱有势有前程!祝你:吃不愁穿不愁,不住平方住高楼,天天潇洒,夜夜温柔,买卖如同长江水,生活如同井上花,大财小财天天进,一顺百顺发发发!点点关注不迷路,感谢老铁
2022-05-07 17:17:05
944
原创 面试题——ArrayList与LinedList比较
ArrayList与LinedList比较要求:能够说清楚 LinkedList 对比 ArrayList 的区别,并重视纠正部分错误的认知。LinkedList基于双向链表,无需连续内存随机访问慢(要沿着链表遍历)头尾插入删除性能高占用内存多ArrayList基于数组,需要连续内存随机访问快(指根据下标访问)尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低可以利用 cpu 缓存,局部性原理...
2022-05-07 11:36:01
320
原创 JUC三大辅助类
介绍JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作。这三种辅助类为:CountDownLatch: 减少计数CyclicBarrier: 循环栅栏Semaphore: 信号灯减少计数CountDownLatchCountDownLatch 类可以设置一个计数器,然后通过 countDown 方法来进行减 1 的操作,使用 await 方法等待计数器不大于 0,然后继续执行 await 方法之后的语句。CountDownLatch 主要
2022-05-07 09:21:51
105
原创 spring——事务管理
事务的ACID特性事务的相关问题1、什么是事务?2、事务的特点(ACID)3、什么时候想到使用事务?4、通常使用JDBC访问数据库,还是mybatis访问数据库,怎么处理事务?5、4问题中事务处理的方式有什么不足?6、怎么解决不足?7、处理事务,需要怎么做,做什么?(1)事务内部提交、回滚事务使用的是事务管理器对象,代替手动commit、rollback。事务管理器是一个接口和其众多的实现类。(2)业务方法需要什么样的事务?说明需要事务的类型。事务的隔离级别事务的超时时间事务的传播
2022-05-06 21:15:41
1272
原创 iterator——fail_fast和fail_salf机制
主要思想快速失败机制是java集合的一种错误检测机制,当迭代集合时集合的结构发生改变,就会产生fail-fast机制。一旦发现遍历的同时,其他人来修改,就立刻抛出异常。单线程情况public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); for(int i = 0; i < 10; i
2022-05-06 20:54:20
161
原创 JUC高并发编程——callable接口
Callable接口简介目前我们学习了有两种创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口。callable接口特点如下:为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于Callable,需要实现在完成时返回结果的 call()方法。call()方法可以引发异常
2022-05-06 16:35:20
96
原创 瑞吉外卖项目——手机验证码登录
需求分析为了方便用户,移动端通常会提供通过手机验证码登录。手机验证码登录的优点:方便、快捷,无需注册,直接登录。使用短信验证码登录,无需记忆密码。安全。登录流程:用户输入手机号->获取验证码->输入验证码->点击登录->登录成功。注意:通过手机验证码登录,手机号是区分不同用户的标识。代码开发数据模型涉及到user表。功能测试...
2022-05-06 13:09:25
2136
2
原创 集合——ArrayList的扩容机制
扩容机制ArrayList无参构造会使用长度为0的数组。ArrayList带参构造会使用指定长度的数组。 /** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; /** *默认构造函数,使用初始容量10构造一个空列
2022-05-05 16:34:24
124
原创 瑞吉外卖项目——订单明细分页查询
需求分析当用户点击订单明细时会显示客户的订单信息,包括订单所对应的菜品信息。代码开发搭建基本环境:mapper、entity、service、controller。controller层 /** * 订单分页查询 * * @param page * @param pageSize * @param number * @return */ @GetMapping("/page") public R<Page<Orders>&g
2022-05-05 14:50:31
4783
7
原创 算法——快速排序
算法思想如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。快排是一种原地、不稳定的排序算法。单边循环快排(lomuto洛
2022-05-05 09:52:40
189
原创 瑞吉外卖项目——修改套餐功能
需求分析用户点击修改按钮,跳转到修改界面(和新增界面相仿),当用户填入相应信息后,点击保存按钮,会把这条套餐信息进行更改。代码开发后端主要处理两个请求:当点击修改按钮时,前端发送ajax请求,请求服务端以进行套餐数据的回显。controller层 /** * 根据id查询套餐信息 *(套餐信息的回显) * @param id * @return */ @GetMapping("/{id}") public R<SetmealDto> g
2022-05-04 18:20:29
2842
5
原创 瑞吉外卖项目——修改套餐状态功能
代码开发// 修改setmeal表,id在ids中的status,为前端url传来的status。update setmeal set status where id in ()controller层 /** * 修改套餐状态。 * * @param status * @param ids * @return */ @PostMapping("/status/{status}") public R<String> updateStatus
2022-05-04 16:14:23
1148
1
原创 瑞吉外卖项目——删除和批量删除菜品功能
需求分析(同套餐删除)观察删除的交互过程(单个删除和批量删除),可以发现两次请求的请求方式和请求地址都是相同的,不同的则是传递的id个数,所以可以在服务提供一个方法来做统一处理。代码开发controller层 /** * 根据id删除一个或批量删除菜品。 * * @param ids 待删除的菜品id。 * @return */ @DeleteMapping public R<String> delete(@RequestParam Lis
2022-05-04 11:09:16
2735
3
原创 瑞吉外卖项目——删除和批量删除套餐功能
代码开发前后端发交互前端携带id发送请求,请求服务端。服务端接收id,根据id删除对应的套餐。controller层 /** * 根据id删除套餐信息。(删除一个或者批量删除) * * @param ids * @return */ @DeleteMapping public R<String> delete(Long[] ids) { // 接收的id成功。 log.info("根据id删除套餐信息{}", ids);
2022-05-04 08:45:52
1914
原创 瑞吉外卖项目——起售、停售和批量起售、停售菜品功能
需求分析当点击停售按钮时菜品无法售卖。选中多个菜品时点击批量停售,这些选择的菜品停止售卖。祝你:吉时吉日喜如风,丰年丰月如风增,争富争财争长寿,寿山寿海寿长生,生富生才生贵子,子孝孙贤代代荣,荣华富贵年年有,有钱有势有前程!祝你:吃不愁穿不愁,不住平方住高楼,天天潇洒,夜夜温柔,买卖如同长江水,生活如同井上花,大财小财天天进,一顺百顺发发发!点点关注不迷路,感谢老铁的关注。...
2022-05-03 17:07:03
9573
11
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人