Hexo-Butterfly主题修改分享
前言首先\themes\butterfly\source\css路径下创建一个css文件,比如ahzoo.css
然后在butterfly主题的配置文件(_config.yml)中引入css
123inject: head: - <link rel="stylesheet" href="/css/ahzoo.css">
顶部菜单美化打开创建的css文件(ahzoo.css),添加下面的代码
12345678910111213141516171819202122232425262728293031323334353637/* 页头 */i.fas.fa-chevron-down { display: none;}#nav .menus_items .menus_item { display: inline; padding: 0 0 0 .7rem; margin: 3px 15px; padding: .2rem .6rem .5rem .6rem !importa ...
Async/EnableAsync注解异步方法的使用
前言@Async注解为spring提供的一个公共线程池,需要配合@EnableAsync注解开启。使用@Async注解的方法称之为异步方法,相当于为该方法开了一个新的线程,使其在不影响主线程的前提下运行。
简单使用使用@EnableAsync配置异步功能
123456789import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableAsync;@Configuration@EnableAsyncpublic class AsyncConfig {}
服务层:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.schedul ...
必应搜索不建立索引的解决记录
前言站点建立两年多了,几个常用的搜索引擎都搜录了我的站点,唯独必应迟迟不收录。如果真的是我站点有问题的话,我改一改能符合收录要求也行。但是每次使用必应站长工具检查的时候都显示我的站点没有问题,可以被建立索引(那你倒是建立索引啊!(╯▔皿▔)╯)。
尝试解决最终实在受不了,上个月尝试给必应网站管理员写了一封信(传送门)。
信的大概内容就是:我遇到了哪些问题(网站检查没有问题,但是无法建立索引),需要哪些帮助(希望尽快帮我解决索引无法建立的问题,若是我的站点有问题的话,麻烦告知我详情)
信件发送后,必应给了我一封回信,说10天内给我回信结果。
最终结果信件发送后过了10个工作日,总算是收到了进一步的回信。
emmm,说已经在给我审查了。好吧,继续等。。。。
然后我又等了一个星期,终于开始建立索引了。
在必应搜索中也逐渐能搜索到结果了。
最终历时将近一个月总算是解决了,看来给必应反馈还是很有用的(●’◡’●)。
VO、DTO、BO、PO、DO区别
前言
VO:(View Object)视图对象,一般位于Controller层,用于展示视图。
DTO:(Data Transfer Object)数据传输对象, 即RPC 接口请求或传输出去的对象,用于展示层与服务层之间的数据传输对象。
BO:(Business Object)业务层对象,一般位于Service层,它与 DO 会有一定的属性差别。
PO:(Persistent Object)持久化对象,对象属性与数据库字段形成映射关系。
DO:(Domain Object)领域对象,就是从现实世界中抽象出来的有形或无形的业务实体,可以当成BO;(Data Object)数据层对象,对象属性与数据库字段形成映射关系,可以当成PO
VO与DTOVO:展示层需要展示的数据。DTO:业务逻辑层需要接收的数据和返回的数据。VO与DTO的属性值基本相同,但是VO是DTO的最终解释,可以对DTO的字段进行适当删减。举个例子:
例子1:
DTO中返回的字段为:
123{ "sex": "女",}
对于大部分需求来说中返回的字段为 ...
MyBatis多表联查
前言创建数据库表(user和message),并插入数据:
123456789101112131415161718CREATE TABLE `user` (`id` varchar(64) NOT NULL ,`name` varchar(64) NULL ,PRIMARY KEY (`id`));CREATE TABLE `info` (`id` varchar(64) NOT NULL ,`uid` varchar(64) NULL ,`msg` varchar(255) NULL ,PRIMARY KEY (`id`));INSERT INTO `user` (`id`, `name`) VALUES ('1001', 'ahzoo');INSERT INTO `user` (`id`, `name`) VALUES ('1002', 'ouo');INSERT INTO `info` (`id`, `uid`, `msg`) VALUES ('2001', ' ...
关于轻量云服务器端口的踩坑记录
先说结论:(腾讯云)轻量云服务器的端口放行必须要在(腾讯云)服务器控制台放行,在其它地方使用命令放行是无法生效的!
由于我之前一直的在控制台放行的,所以没注意到这个问题,最近使用命令放行时才注意到这个问题。
下面直接看我的实际测试吧:
查看防火墙开放端口,可以看到15672是开放的:
然后我们访问15672端口,发现是不能访问的:
进一步测试,直接关闭防火墙:
然后去腾讯云控制台开放端口:
再次访问,可以成功访问:
淘宝(原) npm 域名即将停止服务!
正如在《淘宝 NPM 镜像站喊你切换新域名啦》 中预告的那样:
http://npm.taobao.org 和 http://registry.npm.taobao.org 将在 2022.05.31号停止服务。
域名切换规则:
http://npm.taobao.org => http://npmmirror.com
http://registry.npm.taobao.org => http://registry.npmmirror.com
因此,有强依赖老域名的各位开发者请尽快更新到新域名,可能受到的影响和处理方式:
企业用户需要联系 网管/IT/SRE 更新防火墙白名单。
存量应用的 lock 文件,开发者需要自行执行 sed 等指令去替换或重新生成。
本地 npmrc 里面的 registry 地址(如果有,则)需要开发者自行更新。
开发者自己的 CL 工具 或 平台应用 里面写死的地址,需开发者自己更新并部署。
cnpm cli / nrm 等工具,对应的社区同学已经提 PR 更新,大家重新安装最新版本即可。(如发现遗漏麻烦知会下我们)
BTW:我们新的 ...
轮询、长轮询、长连接、WebSocket
前言实现即时通讯常见的有四种方式,分别是:轮询、长轮询(comet)、长连接(SSE)、WebSocket。
轮询很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由客户端浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
优点:后端编码比较简单缺点:这种传统的模式带来很明显的缺点,即客户端的浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
长轮询客户端向发起一个到服务端的请求,然后服务端一直保持连接打开,直到数据发送到客户端为止。
优点:避免了服务端在没有信息更新时的频繁请求,节省流量
缺点:服务器一直保持连接会消耗资源,需要同时维护多个线程,而服务器所能承载的 TCP 连接是有上限的,所以这种轮询很容易导致连接上限。
长连接客户端和服务端建立连接后不进行断开,之后客户端再次访问这个服务端上的内容时,继续使用这一条连接通道
优点:消息即时到达,不发无用请求
缺点:与长轮询一样,服务器一直保持连接是会消耗资源的,如果有大量的长连接 ...
WebSocket
前言名词解释HTTP:HTTP是应用层协议(在传输层使用 TCP,在网络层使用 IP 协议),是一种无状态(即每个请求都是一个新的请求)、无连接(每次连接只处理一个请求)协议,但是HTTP仍然可以借助Cookie(客户端数据储存)和Session(服务端数据储存)实现长连接(HTTP的长连接需要在请求头中加入Connection:keep-alive )。整个通信过程,客户端(浏览器)向服务端发送请求,服务端接收请求并返回响应信息。
Socket:与HTTP不一样,Socket不是一种协议,而是传输层的一种接口((应用程序与网络协议栈进行交互的接口),它是对 TCP/IP 协议的封装。
WebSocket:WebSocket和HTTP一样是应用层的协议。但是WebSocket是一种双向通信协议,是一种有状态协议。在WebSocket中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
长连接:
建立连接后不管是否使用,都保持TCP连接。但是长连接并不是永久连接。如果一段时间(可以在请求头中设置)内未发送请求,连接仍会断开。
过程:建立连接– ...
MyBatis拦截器
前言Mybatis拦截器注解的基本写法格式为:
123@Intercepts({ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
说明:@Intercepts:标识该类是一个拦截器@Signature:拦截器相关属性设置
type拦截器的类型,总共有4种,按照执行的先后顺序为:
Executor:拦截执行器的方法。
ParameterHandler:拦截参数的处理。
ResultHandler:拦截结果集的处理。
StatementHandler:拦截Sql语法构建的处理,绝大部分我们是在这里设置我们的拦截器。
method可被拦截的方法,按照拦截器的不同类型,总共有下面这些方法:
拦截的类型
拦截的方法
Executor
update, query, flushStatements, commit, rollback,getTransaction ...