- 博客(113)
- 收藏
- 关注
原创 校园招聘系统
以上为整个系统的基本,使用的技术为springboot+mybatisplus+jwt+vue2。校内管理员主要是发布相关的招聘活动,以及公告文章的编撰发布,企业的认证以及所有的账号管理。企业包含企业联系人的功能,但是主要企业用户的作用为参加双选会。超级管理员主要为查看日志,添加校内管理员以及账号管理。企业联系人主要是企业的代理人,帮助企业招聘。用户可以通过验证码、账号密码进行登录。学生主要为查看招聘信息以及投递等。感兴趣的话可以加一下我的联系方式。学生端主要为这些等等,不全展示。
2023-11-05 10:01:44
335
原创 Springboot中使用mail邮件
对于复杂消息,我们可以编辑html消息模板,以及实现动态解析的功能。另外还能够携带多附件。对于以上的内容,我们需要来把它整合成一个工具来使用。这里使用的是QQ邮箱,进入设置-账户,开启下服务。开启后获取授权码,保存自己客户端授权码。以上配置好了,我们可以写一些demo。
2023-05-26 11:53:21
3276
原创 23种设计模式
抽象工厂模式是基于工厂方法模式,他将所有的产品分类为各种产品族,每个产品族中的具体对象由一个抽象工厂来创建,产品族的抽象工厂继承顶级工厂。里氏替换原则指程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的。工厂方法模式将有一个抽象工厂类,各类的产品都有各自的工厂类来实现创建,使用者通常不需要知道创建过程,只需要调用具体实现工厂来进行创建,不用直接创建具体产品。建造者模式是主要用于复杂对象的创建,使用者不必知道如何去创建这个具体对象,只需要通过建造者进行创建,通常采用链式调用来创建具体对象。
2023-03-16 14:22:43
755
1
原创 解释器模式(设计模式详解)
解释器模式是一种设计模式,它可以用于解释一种语言或表达式。该模式定义了一个语言的文法,并使用解释器来解释该语言中的表达式。解释器模式适用于解释一些复杂的语法或规则,或者将一种特定的语言转换为另一种语言。
2023-03-15 17:57:25
291
原创 中介者模式(设计模式详解)
中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,使得这些对象不需要显式地相互引用,从而降低了它们之间的耦合度。在中介者模式中,中介者对象负责协调一组相关对象的交互。每个对象都只需要与中介者对象通信,而不需要知道其他对象的存在。这种模式可以减少对象之间的依赖关系,使系统更易于维护和扩展。
2023-03-15 17:28:47
278
原创 访问者模式(设计模式详解)
在访问者模式中,我们定义了一个访问者(Visitor)类,它封装了一些操作,在具体元素(Concrete Element)类中提供一个接受访问者的方法(accept),该方法接受一个访问者对象作为参数,将自身传递给访问者对象进行操作。访问者模式将新的操作或算法与对象结构分离,使得你可以轻松地添加、删除或修改操作或算法,而无需修改现有的对象结构。对象结构包含多个类型的对象,并且需要对每种类型的对象执行不同的操作或算法的场景。访问者模式可以在遍历对象结构的同时执行操作或算法,而不需要修改对象结构本身。
2023-03-15 17:02:23
218
原创 状态模式(设计模式详解)
状态模式的核心思想是将对象的行为与状态分离开来,将每个状态封装为一个类,并将请求委托给当前状态对象来处理。对象有多个状态且每个状态需要特定的行为:当一个对象具有多种状态且每个状态都需要特定的行为时,可以使用状态模式来处理这种情况。避免使用大量的条件语句:当需要在对象的状态发生变化时根据不同的状态执行不同的操作时,使用状态模式可以避免使用大量的条件语句。对象的行为随着内部状态的变化而变化:当对象的行为与内部状态有关时,可以使用状态模式来处理状态变化的行为。
2023-03-15 11:10:21
155
原创 备忘录模式(设计模式详解)
备忘录模式(Memento Pattern)是一种行为设计模式,它允许将对象的状态保存到备忘录对象中,以便稍后可以将其恢复到先前的状态。备忘录模式通常用于需要撤销或回滚操作的场景。
2023-03-15 10:32:44
261
原创 命令模式(设计模式详解)
命令模式是一种行为设计模式,其目的是将请求封装为一个对象,从而允许您将请求参数化、将请求队列化或记录请求日志,以及支持可撤销操作。在命令模式中,请求者和接收者之间的关系被剥离,这使得命令对象成为一个独立的组件,可在需要时轻松添加、删除或替换。命令模式提供了一种解耦的方式,使得请求者和接收者之间的耦合度降低,从而使代码更加灵活和可维护。
2023-03-14 16:02:34
452
原创 责任链模式(设计模式详解)
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理链进行传递,直到其中一个处理器处理请求为止。在责任链模式中,有一个处理器链,每个处理器都尝试处理请求,如果自己不能处理,它会将请求传递给链中的下一个处理器,直到请求被处理为止。
2023-03-14 15:35:30
217
原创 迭代子模式(设计模式详解)
迭代子模式(Iterator Pattern)是一种行为设计模式,它可以提供一种顺序访问聚合对象元素的方法,而又不需要暴露聚合对象的内部结构。在迭代子模式中,聚合对象将遍历操作委托给迭代子对象,迭代子对象负责维护迭代的状态。
2023-03-14 14:59:45
237
原创 观察者模式(设计模式详解)
观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。
2023-03-14 14:24:34
154
原创 模板方法模式(设计模式详解)
模板方法模式是一种软件设计模式,它定义了一个算法的骨架,而将一些步骤的具体实现延迟到子类中。该模式基于“开闭原则”,即对修改关闭,对扩展开放。
2023-03-14 13:52:17
152
原创 策略模式(设计模式详解)
策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时动态地改变算法或行为,而无需更改它们的代码。该模式将算法和行为封装在独立的类中,以便在需要时可以轻松切换它们,同时使得它们易于测试、理解和维护。
2023-03-14 11:24:07
285
原创 享元模式(设计模式详解)
享元模式是一种设计模式,它旨在减少程序中创建对象的数量,以提高程序的性能和效率。在享元模式中,对象被分为两种类型:内部状态和外部状态。内部状态是对象的共享部分,外部状态是对象的可变部分。享元模式的主要思想是共享对象,即多个对象可以共享同一个对象实例,从而减少对象的创建和销毁次数。这种共享对象的方式可以通过对象池来实现,即将对象存储在池中,需要使用时从池中获取,使用完后放回池中。使用享元模式可以大大减少程序的内存使用和创建对象的开销,特别是当需要创建大量对象时。
2023-03-14 11:04:43
313
原创 组合模式(设计模式详解)
组合模式是一种设计模式,它允许将对象组合成树状结构,以表示“部分-整体”的层次关系。组合模式中,每个对象都可以是单独的叶子节点,或者是拥有子节点的复合节点。这种结构可以递归地组合,形成一个树形结构,从而可以方便地处理具有层次结构的对象。在组合模式中,通常会定义一个抽象的 Component 类,它定义了组合中所有对象共有的操作。叶子节点和复合节点都是 Component 类的子类,但是它们对于操作的实现是不同的。叶子节点只有一个操作,而复合节点则需要实现递归操作,以便将请求传递到它的子节点。
2023-03-14 10:42:29
192
原创 桥接模式(设计模式详解)
桥接模式是一种结构型设计模式,它将一个大类或一组紧密相关的类拆分成抽象和实现两个独立的层次结构,从而使它们可以独立地变化。通过这种方式,桥接模式可以使抽象和实现的变化彼此独立,从而实现更加灵活的设计。
2023-03-13 16:57:27
195
原创 外观模式(设计模式详解)
外观模式是一种设计模式,它为复杂的子系统提供了一个简单的接口,从而隐藏了其内部的复杂性。该模式提供了一个高层次的接口,使得客户端可以更容易地使用子系统,同时使得子系统的实现细节对客户端不可见。
2023-03-13 14:57:48
95
原创 代理模式(设计模式详解)
代理模式是一种设计模式,它允许在不改变原始对象的情况下,为其提供一个代理对象。代理对象可以控制对原始对象的访问,并在必要时对其进行修改或增强。代理模式的目的是为了保护原始对象,并提供额外的功能或增强其性能。
2023-03-13 14:33:45
241
原创 装饰器模式(设计模式详解)
装饰器模式是一种结构型设计模式,它允许向现有对象动态添加功能,而不需要修改其源代码。这种模式的核心思想是使用装饰器类来包装原始类,并提供额外的功能。在装饰器模式中,通常有一个基本组件或对象,我们称之为“组件”,这个组件具有一些基本的功能。我们可以通过创建装饰器类来扩展这个组件的功能。每个装饰器都包装了原始组件,并添加了新的功能。这些装饰器可以被嵌套,以实现更多的功能组合。使用装饰器模式的好处之一是可以在运行时动态添加或删除功能,而不会对原始组件的代码产生影响。
2023-03-13 14:01:16
263
原创 适配器模式(设计模式详解)
适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一种接口,使得原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式的作用是将一个类的接口转换成另一种接口,以满足客户端的需求。适配器模式通常有两种实现方式:类适配器模式和对象适配器模式。类适配器模式是通过继承来实现接口转化,本例采用对象适配器模式。在类适配器模式中,适配器继承自需要适配的类,并实现客户端所期望的接口。在对象适配器模式中,适配器持有需要适配的类的实例,并实现客户端所期望的接口。
2023-03-13 11:37:28
214
原创 原型模式(设计模式详解)
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需从头开始编写代码。在原型模式中,一个原型对象作为模板,新的对象通过克隆这个原型对象而创建。这样可以避免使用相同的代码来创建相似的对象,同时也可以提高创建对象的效率。通常情况下,原型模式会使用一个原型管理器来存储和管理原型对象,以便在需要的时候进行复制。原型模式适用于需要创建大量相似对象的场景,如图形编辑器中的图形对象、数据库中的数据对象、网络传输中的数据包等。
2023-03-10 17:34:43
919
原创 建造者模式(设计模式详解)
建造者模式是一种创建型设计模式,它允许您创建复杂的对象,而无需直接指定它们的具体类型。它通过将对象的构造过程分解为多个简单的步骤,并允许您在每个步骤中使用不同的实现来创建不同类型的对象。在建造者模式中,通常有一个指导者(Instructor)类,它负责协调不同的建造者(Builder)类来构建复杂对象。每个建造者类都实现了一些构建步骤,并将它们组合在一起以创建最终的对象。使用建造者模式可以更容易地添加或更改构建步骤,从而允许您轻松地构建不同类型的对象。
2023-03-10 16:44:33
221
原创 工厂方法模式(设计模式详解)
简单工厂模式(Simple Factory Pattern)是一种常见的软件设计模式,它定义了一个用于创建特定类的对象的类,又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以根据外界给定的信息,决定创建出何种具体的实例,而不必关心其内部细节。
2023-03-10 11:57:10
193
原创 抽象工厂模式(设计模式详解)
工厂方法模式是一种创建型设计模式,它可以实现将对象的创建和使用分离。它定义了一个用于创建对象的接口,但是由子类决定要实例化的类是哪一个。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式由一个抽象工厂类和具体工厂子类组成,抽象工厂类定义了创建产品的抽象方法,而具体工厂子类实现了创建具体产品的方法。
2023-03-10 11:23:55
284
原创 单例模式(设计模式详解)
懒汉模式最粗暴的方法是在让实例的创造方法变为同步方法,这样能保证实例的唯一性。所有的线程都会被阻塞。在不受其他干扰的情况,这两种模式都能实现单例,但是如果我们通过反射去破坏,那么单例还能实现吗?实例未创建或者创建都会被阻塞中,那么有没有一种方法,在对象创建成功后不需要阻塞呢?我们可以在构造方法中对实例进行判断,如果实例已经被创建,我们只需要返回那个实例。懒汉模式在实例创建之前,使用反射进行破坏可以创建多个实例,无法防止反射破坏。这种情况下,在外界拿到实例对象,可能是一个未初始化完成的半成品。
2023-03-09 17:43:37
441
原创 全面解析若依框架(springboot-vue前后分离--后端部分)
自定义隐藏列通过excludeFields数组来进行控制,在List getFields获取字段信息的时候将通过excludeFields来进行字段排除,使用hideColumn(“userId”)方法来隐藏,使用方法如下。
2022-12-16 11:19:34
24270
原创 虚拟机文件存储空间不够用(docker空间不足)?CentOS7磁盘扩容
docker 启动容器kibana失败,发现连接不上es,最后查明原因是空间大小不足。挂载点根目录已经使用了97%的空间大小,需要进行扩容。创建逻辑卷,卷名lv01,容量100G,使用卷组,-L指定容量,-l指定PE数量。格式化lv逻辑卷,格式化为xfs系统。/dev/sdb1为物理卷的名称。
2022-11-07 11:24:28
2005
4
原创 IO模型概述
IO模型分为同步阻塞、同步非阻塞、多路复用、异步阻塞(没有此情况,说法错误 )、异步非阻塞。每当调用一次channel.read或者stream.read,会切换至内核态来完成数据读取,读取又分为等待数据阶段和复制数据阶段。
2022-11-05 16:01:32
391
原创 nginx的使用配置
对于一些视频播放,用于点击到视频的某个位置,浏览器会发起range请求,请求到对应位置在加载。每秒生成N个令牌,每进来一个请求可以拿走n个或一个令牌,享受不同的带宽。qps为每秒6800。qps为每秒7600。
2022-11-03 15:14:20
1140
原创 JAVA NIO详解
传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客戌端请求建立一个线程,由该线程单独负责处理一个客户请求。这种模式带来的一个问题就是线程数量的剧增,大量的线程会增大服务器的开销。大多数的实现为了避免这个问题,都采用了线程池模型,并设置线程池线程的最大数量,这由带来了新的问题,如果线程池中有100个线程,而有100个用户都在进行大文件下载,会导致第101个用户的请求无法及时处理,即便第101个用户只想请求一个几KB大小的页面。分散(Scatter)
2022-10-22 17:23:29
1066
原创 HTTP/HTTPS/TCP原理
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。Unused右边:报文的标示,什么类型的报文(ACK为响应的报文,SYN为请求的报文,FIN为关闭连接的报文)应用层的HTTP不再和TCP进行交互,而是SSL安全套接层(TLS),安全套接层主要是对数据进行加密和解密。Urgent data pointer:紧急数据指针(有的话,应用程序会优先处理)网络一共经历的大概以下几个分层,不同的网络介质消息需要通过转换。
2022-10-17 15:04:40
1515
原创 redis底层数据结构
redis的string类型是使用simple dynamic string(SDS)来实现的,C语言字符串使用char数组表示,以\0结尾,会使得字符串出现安全问题。rehashidx为上一次rehash的索引,dictEntry 有两个dict字典,需要完成渐进式rehash。rehash时,访问数据会先访问老的,后访问新的,新增则直接访问新的hashtable。encoding为val的编码类型,refcount为引用数,ptr为数据地址。
2022-10-13 17:37:31
80
原创 Minio分布式存储入门(使用新版本)
MinlO使用纠删码机制来保证高可靠性,使用highwayhash来处理数据损坏( Bit Rot Protection )。关于纠删码简单来说就是可以通过数学计算,把丢失的数据进行还原,它可以将n份原始数据,增加m份数据,并能通过n+m份中的任意n份数据还原为原始数据。即如果有任意小于等于m份的数据失效,仍然能通过剩下的数据还原出来。8个文件存在于八个driver,4个为存放校验码,4个存放数据,可以通过纠错码进行恢复。集群部署完成可以通过nginx负载均衡,让集群有一个统一的入口。
2022-09-05 09:29:33
2833
原创 RabbitMq(集群搭建)
是一种主从集群,在普通集群的基础上,添加了主从备份,提高了数据可用性。(镜像集群虽然支持主从,但不是强一致,有可能产生丢失数据的风险。集群里面单个节点只有交换机和自己里面声明的队列以及其他节点的队列的元信息,当一个消费者访问当前节点,这个节点不存在该队列,这个节点将会通过队列的元信息找到这个队列所在节点,并返回数据。控制台端口分别是8081、8082、8083。添加队列发现三个节点都有该队列,如果声明队列的节点挂了,队列就不存在了。是一种分布式集群,将队列分散到各个节点上,提高整个集群的并发能力。
2022-09-03 17:08:11
1430
原创 rabbitMQ(消息堆积问题)
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限。最早接收到的消息,可能就会成为死信,会被丢弃,这就是消息堆积问题。
2022-09-03 15:01:54
1904
原创 MQ高级特性(消息的可靠性)
将error.queue绑定给error.direct,当routingkey是error,发送给error.queue。当重现重试耗尽,RepublishMessageRevocerer重新投递到指定的交换机error.direct,根据。消费者消费完消息后可以向MQ发送ack回执,MQ收到ack回执才会删除该消息。在spring开启本地重试后,当重试次数耗尽,由MessageRecover接口来处理,它包含三种不同的实现。消费者失败会进行requeue重新入队,然后再次异常,再次入队,重复循环。
2022-09-03 11:09:00
662
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人