文章编辑
文章编辑方式
文章书写格式:
参数
作用
title
页面的标题
date
页面创建日期,一般自动生成。
updated
[可选] 页面更新日期
sticky
[可选]文章置顶 可选值: 任意数字(数值越大,置顶的优先级越大) \ false
tags
[可选] 文章的标签,设置了标签后会在标签页面自动更新
categories
[可选] 文章的分类,设置了分类后会在分类页面自动更新
keywords
[可选] 关键字
description
[可选] 页面描述
cover
[可选] 网站主页显示文章的缩略图,如果没设置top_img,文章顶部则显示此图片。 可设置为 图片地址 、 false 、留空 (不设置则显示默认图片)
top_img
[可选] 页面顶部图片(不设置则显示默认图片) 可设置为 图片地址 或 颜色
comments
[可选]页面评论(需要配置评论系统), 可选值:true \ false
toc
[可选] 文章目录 可选值:true \ false
toc_number
[可选] 目录每个标题生成 ...
高级功能
相册编辑方式相册
123<div class="gallery-group-main">{% galleryGroup [name] [description] [link] [img-url] %}</div>
参数
作用
name
图库名字
description
图库描述文字
link
图库链接
img-url
封面图片链接,可以是网址,也可以是本地文件链接
可以同时嵌套多个galleryGroup,例:
12345PLAINTEXT<div class="gallery-group-main">{% galleryGroup "壁纸" "收藏的一些壁纸" "/Gallery/wallpaper" "/Gallery/01/5.jpg" %}{% galleryG ...
博客项目--点赞功能
此文记录了redis实现点赞功能
本文会随着作者日常学习进行补充及内容修正
思路:
1.用户查询当前用户点赞状态用于初始化
2.用户对某个博客进行点赞/取消点赞
3.如果点赞,则将该用户添加到redis set中的用户集
4.如果取消点赞,则删除用户集中的用户
5.提供当前点赞数查询的接口
1.Controller层123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051package com.lin.controller;import com.lin.service.LikeService;import com.lin.vo.Result;import com.lin.vo.params.LikeParam;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;im ...
二叉树的递归和非递归算法
此文介绍了二叉树的使用递归和非递归算法遍历先序、中序、后序
本文会随着作者日常学习进行补充及内容修正
树的结构定义123456789101112131415161718192021222324252627282930public class BinTree{ private char data; private BinTree left; private BinTree right; public static BinTree(char c){ data=c; } public static void main(String[] args){ BinTree b1 = new BinTree('a'); BinTree b2 = new BinTree('b'); BinTree b3 = new BinTree('c'); BinTree b4 = new BinTr ...
单点登录
此文介绍了单点登录流程、JWT、token
本文会随着作者日常学习进行补充及内容修正
单点登录流程
根据用户名查找
如果为null,就是用户不存在
密码匹配,如果不匹配,就是密码不正确
Jwt生成token
将token存入redis中,access token过期时间短,refresh_token过期时间长。
JWT组成第一部分我们称它为头部(header)
第二部分我们称其为载荷(payload)。载荷就是存放有效信息的地方。
第三部分是签证(signature)
JWT生成的token是这样的
1XXXXXX.XXXXXXX.XXXXXXX
生成的token,是3段,用.连接。
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。 例如:
1234{ "typ": "JWT", "alg": "HS256"}
载荷其实就是自定义的数据,一般存储用户Id,过期时间等信息。也就是JWT的核心所在,因为这些数据就是 ...
二分查找法
此文介绍了二分查找法
本文会随着作者日常学习进行补充及内容修正
N*2 =》N<<1
N*4 =》N<<2
N/2 =》N>>1
N*2+1 =》(N<<1)|1
+和-比>>和<<运算符优先级高
优先级
描述
运算符
1
括号
()、[]
2
正负号
+、-
3
自增自减,非
++、—、!
4
乘除,取余
*、/、%
5
加减
+、-
6
移位运算
<<、>>、>>>
7
大小关系
>、>=、<、<=
8
相等关系
==、!=
9
按位与
&
10
按位异或
^
11
按位或
\
12
逻辑与
&&
13
逻辑或
\
\
14
条件运算
?:
15
赋值运算
=、+=、-=、*=、/=、%=
16
位赋值运算
&=、\
=、<<=、>>=、>>>=
1.找某个数是否存在1 ...
排序算法
此文介绍了冒泡排序、选择排序、插入排序
排序可视化网站 https://visualgo.net/zh/sorting 可以更快速理解!
本文会随着作者日常学习进行补充及内容修正
1.冒泡排序通过多次遍历,判断相邻两个之间大小,每次都能取到最大值
第一次遍历0~N-1 最大值为N-1位
第二次遍历0~N-2 第二大值为N-2位
。。。。
123456789101112131415161718public static void bubbleSort(int[] arr){ if(arr == null || arr.length < 2){ return; } for(int e = arr.length - 1;e > 0;e--){ //最后一次是e=1,下面的遍历为0~1 for(int i = 0;i < e;i++){ //0~e if(arr[i] > arr[i+1]){ ...
RabbitMQ工作模型
此文介绍了RabbitMQ工作模型
本文会随着作者日常学习进行补充及内容修正
1.什么是RabbitMQ MQ是Message Queue,也就是消息队列,是一个消息中间件,使用Erlang语言写的。
2.工作模型
(1)Broker:中介。提供一种传输服务,维护一条从生产者到消费者的传输线路,保证消息数据能按照指定的方式传输。
(2)Exchange:消息交换机。指定消息按照什么规则路由到哪个队列Queue。生产者不能直接和Queue建立连接,而是通过交换机进行消息分发。
(3)Queue:消息队列。消息的载体,每条消息都会被投送到一个或多个队列中。
(4)Binding:绑定。作用就是将Exchange和Queue按照某种路由规则绑定起来。
(5)RoutingKey:路由关键字。消息所携带的标志,Exchange根据RoutingKey进行消息投递。
(6)VHost:虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有一组Exchange、Queue和Binding。
(7)Producer:消息生产者。主要将消息投递到对应的E ...
Redis基本概念
此文介绍了Redis的持久化、发布订阅、哨兵模式
本文会随着作者日常学习进行补充及内容修正
Redis持久化持久化包括了RDB和AOF
RDB(Redis DataBase)
什么是RDB
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。
rdb保存的文件是dump.rdb
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个配置!
优点:
适合大规模的数据恢复!
对数据的完整性要不高!
缺点:
需要一定的时间间隔进程操作!如果redis意外宕机了,这个最后一次修改数据就没有的了!
fork进程的时候,会占用一定的内容空间!
AOF(Append ...
基于 TCP 、UDP协议的 Socket 程序函数调用过程
此文介绍了基于 TCP 、UDP协议的 Socket 程序函数调用过程
本文会随着作者日常学习进行补充及内容修正
前言TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 协议是基于数据报的,因而设置为 SOCK_DGRAM。
基于 TCP 协议的 Socket 程序函数调用过程调用过程TCP 的服务端要先监听一个端口,一般是先调用 bind 函数,给这个 Socket 赋予一个 IP 地址和端口。当服务端有了 IP 和端口号,就可以调用 listen 函数监听,服务端就进入了 listen 状态,这个时候客户端就可以发起连接。 在内核中,为每个 Socket维护两个队列。一个是已经建立了连接的队列,这时候连接三次握手已经完毕,处于 established 状态;一个是还没有完全建立连接的队列,这个时候三次握手还没完成,处于syn_rcvd 的状态。 接下来,服务端调用 accept 函数,拿出一个已经完成的连接进行处理。如果还没有完成,就要等着。 在服务端等待的时候,客户端可以通过connect 函数发起连接。先在参数中指明要连接的 IP 地址和端口号,然 ...