自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 Vite项目配置resolve.alias后提示『找不到模块』的解决办法

vite.config.ts可以配置resolve.alias别名,这样在项目中import时就不用写一长串相对路径了,但有时会遇到编辑器提示『找不到模块』,虽然不影响编译与运行,但看着很碍眼。原因就是缺少了相应的配置,导致VSCode识别不了模块。

2022-11-27 10:59:58 4984 2

原创 重写Promise源码的渐进式总结,以及对JS异步的感悟

闭包、原型及异步被号称是JS基础知识的三座大山,其中,异步算是让初学者最迷惑的一坐巍峨雄峰了,异步在计算机知识中并不是很复杂的概念,但由于JS语言的独特差异,导致JS中的异步理解及操作稍显费劲。本文原本是记录Promise源码的渐进式实现过程的手记,后来我补充了很多自己关于JS异步的理解,最终形成了一篇内容还算饱满的文章,描述可能并不准确,仅作参考。

2022-05-17 18:37:06 469

原创 使用SpringBoot集成的JavaMailSender进行异步邮件发送

一、背景邮件发送功能是各种系统不可或缺的功能,例如办公系统会在出现特定状况时向人事部门或技术部门发送告警信息。Spring框架提供了JavaMailSender接口可以进行简单的邮件推送,我们可以很轻易的使用。此外,邮件推送还需要考虑是否采用异步的方式,如果邮件推送功能是在用户触发某个操作后发生的,使用同步的方式串行执行发邮任务势必会导致业务的阻塞,我们可以使用Spring提供的ThreadPool来实现异步多线程。二、配置异步任务首先在SpringBootApplication主类下增加注解@

2022-02-03 18:30:20 1504

原创 Vue.js知识点大复盘(Vue2对照Vue3新特性)

这篇文章是个人学习时记录的要点汇总,因为文字风格比较随意,而且省略了代码示例,更没有覆盖完整知识面,所以仅用作学习过后的复习材料,若需系统学习应参考Vue.js官方文档(本文的几个引用段落均摘自该文档)本文知识点以Vue2为基准,补充了一些Vue3的内容(现有特性变更会用荧光笔标注,新加特性会在标题上注明“Vue3新”),另外,个人认为的易错点以及涉及思想的内容会在标题上注明“重点”。

2021-12-18 17:40:44 858 1

原创 BFC规范及其作用

1. BFC的概念BFC称作块级格式化上下文,它是页面上的局部稳态容器,内部元素的一切情况都不会影响外部的元素,同理,外部情况也不会影响内部结构。块格式化上下文(Block Formatting Context,BFC) 是Web页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。2. 从一个现象引出BFC现有一个父元素嵌套两个子元素,如下:<div class="box"> <div class="d1"></div

2021-12-18 17:12:51 346

原创 开发必备的JVM知识极致梳理 (附典型面试题)

目录典型面试题平台无关性是如何实现的?JVM为何不直接解析源码,而要引入中间字节码?JVM是如何加载class文件的?典型面试题平台无关性是如何实现的?Java源码首先被编译成中间字节码,再由不同平台的JVM进行解析,不同平台的JVM会将字节码转换为具体平台中的机器指令,如此就可以实现一份Java代码能够在多个平台运行。JVM为何不直接解析源码,而要引入中间字节码?如果直接解析源码,每次执行时还需要重新检查语法,浪费时间和性能。引入中间字节码只需在编译阶段做一次检查。其它能够转换为字节码的语

2021-11-21 16:36:33 708 1

原创 SpringBoot项目精简返回给客户端的异常信息

1. 前言Java Web项目在处理请求时,如果遇到异常,会直接将执行栈的详细信息返回给客户端,这种交互不仅极不友好,而且随意将服务器细节对外展示也是非常危险的。通常我们会

2021-11-17 08:11:50 516

原创 Java Web项目抵御跨站脚本攻击(前后端共御)

目录XSS攻击原理抵御方法针对前端代码实现XSS攻击原理XSS攻击指攻击者利用服务器漏洞,将恶意代码以文本的形式混杂进请求数据中发送给服务器存储,服务器在未来渲染视图的时候会将该恶意代码也携带进去,客户端执行恶意脚本后会造成重要信息泄露。XSS攻击的恶意代码通常是HTML标签包裹JavaScript脚本,形如<script>alert("恶意脚本")</script>,当页面中出现这种结构的文本时,浏览器会误认为是正常的标签而进行渲染。举一个简易的例子,假设攻击者的服务器为x

2021-11-12 10:25:23 2293 1

原创 开发必备的网络知识极简版 (用于快速梳理)

目录一、前置知识TCP/IP四层模型TCP协议特点网络套接字二、套接字实现服务端客户端三、面向TCP的服务端TCPServer类一、前置知识TCP/IP四层模型应用层:主要包括HTTP、FTP协议,它解决数据与应用程序对接的问题传输层:主要包括TCP、UDP协议,它解决数据在端到端传输的可靠性问题网络层:主要包括IP协议,它解决数据包在单一网络中传输的问题网络接口层:主要包括物理设备、以太网等,它解决数据包从一个设备的网络层到另一个设备的网络层的问题TCP协议特点面向连接:双方需要经过

2021-11-07 13:28:35 1928 1

原创 [汇总] CentOS 7安装Java Web技术栈环境

目录一、MySQL二、MongoDB三、Redis四、JDK五、Tomcat一、MySQL通过yum下载RPM软件包若要安装MySQL8.0,请执行:yum localinstall https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm若要安装MySQL5.7,请执行:yum localinstall https://repo.mysql.com/mysql57-community-release-el7-11.

2021-11-05 14:22:38 806 2

原创 移动端页面适配方案

适配原理:1rem = font-sizefont-size = 视口宽 / 系数init-scale = 1 / 设备像素比根据(function () { // 使用严格模式 "use strict"; // 获取HTML元素、meta标签、设备像素比,设置缩放阈值 var docEl = document.documentElement, viewportEl = document.querySelector('meta[name="viewport"]'),

2021-03-25 09:42:33 238

原创 使用ES6封装Ajax类

1. 设置常量可以根据需要设置一些常量// 常量export const HTTP_GET = 'GET';export const CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded';export const CONTENT_TYPE_JSON = 'application/json';2. 封装工具类主要用于数据的转换及URL处理// 将数组序列化成URLEncoded格式的字符串const seria

2021-02-20 16:29:33 343

原创 使用ES6封装JS的Cookie

1. 设置Cookie的函数:因为名值对可能出现非英文字符,所以使用encodeURIComponent函数进行编码const set = (name, value, { maxAge, domain, path, secure } = {}) => { let cookieText = `${encodeURIComponent(name)} = ${encodeURIComponent(value)}`; if (typeof maxAge === 'number') {

2021-02-19 09:06:39 272

原创 测试环境与用例设计的概述

一、环境搭建原则功能测试:轻数据,重覆盖,数据要真实性能测试:大量的数据,实际的硬件二、基本架构研发环境:用于研发自测、集成测试测试环境:用于日常单系统或两两微服务间的测试联测环境:完备环境,用于大型联测外联环境:稳定版本环境,用于外部商户联调灰度/沙箱环境:用于生产数据测试,仿真测试...

2020-09-18 20:40:23 1046

原创 软件工程概要与测试的概念

一、软件的十大特性无形的复杂的智力产品尚未自动化不存在完全没有缺陷的产品软件复制简单,但成本有限软件的管理更加独特对计算机系统环境高度依赖软件的维护在于升级、优化和功能更新,甚至重构...

2020-09-17 15:05:02 295

原创 开启SpringMVC编码过滤器后,HTML反而出现乱码的解决方案

现象:HTML等静态资源本身的编码是没有问题的,但在开启SpringMVC的编码过滤器后,页面反而出现了莫名其妙的乱码。原先的web.xml配置如下:<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class&

2020-09-03 23:02:50 1137

原创 JS获取URL中的参数

思路:通过正则表达式获取URL中name=xxx的部分,然后将其中的十六进制转义序列转换成正常的字符function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) { return decodeUR

2020-08-29 11:17:52 180

原创 Java Web编码过滤器的实现

可以使用Filter过滤器将所有的请求与相应设置为相应的编码。Filter类:public class EncodingFilter implements Filter { private String encoding = "UTF-8"; // 默认编码UTF-8 @Override public void init(FilterConfig filterConfig) throws ServletException { // 如果用户配置了编码,则将en

2020-05-09 14:55:06 705

原创 MyBatis简介与基本操作

一、Mybatis简介MyBatis是支持定制化SQL、存储过程以及高级映射的持久层ORM框架,它通过XML配置文件的方式进行数据交互,避免了传统JDBC硬编码的种种缺陷。二、...

2020-01-15 14:12:14 271

原创 Spring MVC

一、MVC设计模式二、Spring MVC组件组件名作用DispatcherServlet前置控制器Handler完成具体业务逻辑的处理器HandlerMapping将请求映射到HandlerHandlerInterceptor处理器拦截器HandlerExecutionChain处理器执行链HandlerAdapter处理器适...

2020-01-14 15:50:03 210

原创 Spring事务管理

一、事务的概念事务(Transaction)是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。事务拥有四个特性:原子性: 一组事务不可分割,要么全部发生,要么都不发生一致性: 一组事务发生前后的数据量应保持一致隔离性: 多个并发事务之间应相互隔离、互不干扰持久性: 一组事务一旦执行成功,它带来的改变是永久性的二、安全问题脏读:...

2020-01-13 10:24:05 260

原创 Spring AOP以及AspectJ

一、

2020-01-11 19:14:46 423

原创 Spring IoC以及DI

一、IoC(Inverse of Control)IoC即控制反转,它是指将对象的创建权交给Spring容器管理在传统的开发中,若类A用到了类B,那么往往需要在类A中显式的new一个对象B,这样类A与类B就产生了代码层面的耦合。使用Spring框架后,在A类中只需要定义一个B类的引用,再通过配置的方式让Spring容器自动将类B注入到引用中。...

2020-01-09 17:15:52 187

原创 Java高级基础——反射(Reflect)

一、Class类在Java中,所有的类都是java.lang.Class的实例对象,而java.lang.Class只能由JVM进行实例。当每一个类被装入JVM时,它将自动创建与之相关联的Class类对象。下列代码演示了三种获取Class类对象(Class Type)的方式,以及两种获取Person类对象的方法:try { // 利用Person类,实例化一个Person类对象p1 Pe...

2019-12-18 16:46:33 157

原创 O(n²)排序算法——冒泡、选择、插入

一、冒泡排序(Bubble Sort)动图转载自Github作者hustcc● 基础版本/** * 静态方法:冒泡排序算法 */public static void sort(Comparable[] arr) { // 外层循环控制每趟排序 for (int i = 0; i < arr.length - 1; i++) { // 内层循环控制元素交换 for (...

2019-12-06 23:17:04 218

原创 空间换时间的经典结构——哈希表(Hash Table)

设计背景在数组中,我们可以根据索引快速取出某个位置元素的值(时间复杂度为O(1)级别),但是数组中每一个元素的索引是依据添加顺序决定的,该索引与元素本身也没有任何关联,当我们想再次查找某个元素的时候,只能将数组遍历一次才能找到我们需要的元素,相当的耗时(时间复杂度为O(n)级别)树结构的诞生在很大程度上加快了搜索速度(例如二分搜索树在理想状态下的时间复杂度为O(logn)级别),但单从速度上讲...

2019-12-05 21:40:53 1066

原创 著名的黑平衡BST——红黑树(Red Black Tree)

设计背景AVL树通过严格的平衡因子制度来触发自平衡操作,它是一种高度平衡的BST,在数据的查询上有着显著的优势,但在某些场景下,过于频繁的自平衡操作可能会带来多余的时间消耗。在树领域中还有一种著名的自平衡BST——红黑树(Red Black Tree),它通过特殊的机制来降低自平衡触发的次数,以牺牲平衡性来节省开销,其属于弱平衡的BST。红黑树是一种综合性能折中的选择,适合增删改查等多重操作频...

2019-12-05 17:06:31 814

原创 最早的自平衡BST——AVL树(AVL Tree)

设计背景二分搜索树(Binary Search Tree)拥有相对高效的查找能力,但是依然存在很大的缺陷。当添加的所有元素都比现有的元素大或者小时,二分搜索树将会退化成一个链表(LinkedList)。即使只有部分元素发生这种状况,也会使二分搜索树变得极不平衡,大大降低树结构的效率。这种问题产生的根源在于二分搜索树没有一套自平衡的机制,只有添加的元素拥有足够的随机性时它才能趋向于平衡。...

2019-11-29 22:16:22 250

原创 优先级高者先出的队列——优先队列(Priority Queue)

设计背景普通队列是先入队的元素先出队,它的权重衡量是入队的先后,我们希望设计一种按照特定衡量标准进行优先级排序的队列,这种队列就叫做优先队列(Priority Queue)结构分析【底层实现】Heap等【核心方法】同队列代码实现利用最大堆(MaxHeap)实现优先队列:public class PriorityQueue<E extends Comparable<E&gt...

2019-11-26 15:31:24 797

原创 一颗完全二叉树——堆(Heap)

设计背景二叉树有满二叉树(Full binary Tree)和完全二叉树(Complete Binary Tree)等特殊情况,满二叉树指“除了叶子节点外,所有节点都有左子树和右子树”,它的叶子节点只会出现在最后一层;而完全二叉树因为有的节点可能缺失子树,所以它的叶子节点可能出现在最后的两层中。而堆(Heap)可以看作一颗完全二叉树的数组,堆有最大堆(MaxHeap)和最小堆(MinHeap...

2019-11-25 21:56:29 1207

原创 值与值相对应的结构——映射(Map)

设计背景在信息存储的场景中,我们经常遇到“一个值对应着另一个值”的情况,这种关系在数学中被称作函数(function)或者映射(mapping)。在数据结构中也有这样一种设计类型,每一个节点存储着一个key键和一个value值,两者合称“键值队”(key-value),用户可以通过key键定位到value值,这种结构类型被称为映射(Map)。映射中key的值不能重复,而value得值可以重复,...

2019-11-24 17:23:22 656

原创 独一且无序的结构——集合(Set)

设计背景传统的数组可以存放重复的元素,且其存放有序,而有时我们不希望数据结构存储重复的元素,且我们不关注它的排序,例如IP访问量统计、文本字数统计等。这种存储无序且不重复元素的结构类型就被称之为集合(Set)。结构分析【底层实现】二分搜索树(BST)/链表(LinkedList)【核心方法】public void add(E e); //向集合添加元素public void re...

2019-11-22 10:39:55 312

原创 左小右大的树形结构——二分搜索树(Binary Search Tree)

设计背景在链表(LinkedList)中,每一个节点都存储着一个元素,还有一个指向下一个节点的指针。与这种特性类似,我们把“每一个节点都拥有两个指向不同节点的指针”的结构称之为二叉树(Binary Tree);从形状上来看,这两个指针所指向的节点分别叫做“左子树”(left subtree)和“右子树”(right subtree),而这个节点就是左右子树(亦可称作左右孩子)的父亲节点(fath...

2019-11-20 23:31:01 2220

原创 一颗串一颗的链状结构——链表(LinkedList)

设计背景动态数组(ArrayList)拥有良好的随机访问能力,虽然从用户的层面讲其为动态的,但其仍然没有摆脱容量的约束,它内部依旧面临着扩容/缩容等繁琐操作。我们希望设计一种存储风格类似于数组,却完全不需要涉及到容量的纯动态线性结构。在这个结构中,每一个元素通过指针引用的形式指向下一个元素,直至NULL值,以串成一条数据链,这种结构就被称之为链表(LinkedList)。结构分析【结构类...

2019-11-20 22:39:32 663

原创 先进先出的排队结构——队列(Queue)

设计背景与栈“后进先出”(LIFO)的特性相对应,应当还有一种“先进先出”(FIFO)特性的数据结构,这种数据结构被称之为队列(Queue)。该结构的实现过程与栈几乎类似,区别在于每次存入元素和获取元素的位置不同。结构分析【结构类型】线性结构【底层实现】动态数组(ArrayList)【核心方法】public void enqueue(E e); //入队public E deq...

2019-11-19 23:28:56 3435

原创 后进先出的桶状结构——栈(Stack)

设计背景计算机中很多场景会遇到“后存入的元素先被调用”(LIFO)的情况,例如编辑器的撤销操作、系统的递归调用操作。数组(Array)作为一种线性表,它可以在任意位置插入元素和取出元素,如果将数组限制为只能在尾部插入和取出元素,那么就实现了这种需求。这种数据结构被称之为栈(Stack)。结构分析【结构类型】线性结构【底层实现】动态数组(ArrayList)/链表(LinkedList)...

2019-11-18 13:42:29 763

原创 自动管理容量的线性表——动态数组(ArrayList)

设计背景传统的数组在声明时必须确定大小,一旦创建便不能再改变容量。如果需要增大/缩小容量的话,则需要手动创建一个新数组,然后再将旧数组的内容拷贝至新数组,从而完成扩容/缩容。动态数组(ArrayList)的数据结构将这一系列操作进行了封装,只向用户提供的相应的方法(增删改查),提高了数组的利用效率。结构分析【结构类型】线性结构【底层实现】数组(Array)【核心方法】public v...

2019-11-18 11:07:37 240

原创 CSS全屏布局的解决方案

全屏布局指所有元素布满整个窗口,当浏览器窗口大小改变时自动进行伸缩,不会产生页面滚动条。HTML模板如下:<header></header><div class="content"> <div class="left"></div> <div class="right"></div></div&...

2019-11-17 21:33:29 361

原创 CSS多列布局的解决方案

一、两列布局HTML模板如下:<div class="left"></div><div class="right"></div>1. 单float + margin 组合.left { width: 300px; height: 300px; float: left;}.right { height: 300px; mar...

2019-11-17 16:15:25 557

原创 CSS居中布局的解决方案

一、水平居中布局1.text-align属性.parent { text-align: center;}.child { display: inline-block;}text-align仅对文本内容有效,此处因为将div.child设置为了行内块级元素,所以该盒子能够被居中。优点:IE浏览器兼容较好缺点:子元素的所有文本都会被居中(解决方法:在子元素中重新定义text-a...

2019-11-14 15:22:41 204

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除