跳至主要內容
雷家豪的个人博客

雷家豪的个人博客

项目名称
项目详细描述
链接名称
链接详细描述
书籍名称
书籍详细描述
文章名称
文章详细描述
伙伴名称
伙伴详细介绍
自定义项目
自定义项目
自定义详细介绍
Docker笔记

Docker笔记

1.快速入门

要想让 Docker 帮我们安装和部署软件,肯定要保证你的机器上有 Docker. 由于大家的操作系统各不相同,安装方式也不同。为了便于大家学习,我们统一在 CentOS 的虚拟机中安装 Docker,统一学习环境。

1.1.部署 MySQL

首先,我们利用 Docker 来安装一个 MySQL 软件,大家可以对比一下之前传统的安装方式,看看哪个效率更高一些。

如果是利用传统方式部署 MySQL,大概的步骤有:

  • 搜索并下载 MySQL 安装包
  • 上传至 Linux 环境
  • 编译和配置环境
  • 安装

狸猫不会跑大约 26 分钟Docker
免费申请SSL证书

免费申请SSL证书

Certbot 简介

Github 地址:https://github.com/certbot/certbot 本质上来说,certbot 就是一个 ACME client,这也是 Let’s Encrypt 官网推荐的签发证书的方式,适用于对自己的 domain 具有 shell 访问能力的情况,使用所谓的 ACME 协议来自动化的签发证书,很大程度上简化了证书签发的步骤


狸猫不会跑大约 2 分钟SSLSSLhttps建站
在Jetbrains全家桶中使用ideavim

在Jetbrains全家桶中使用ideavim

1.安装必备的一些插件

AceJump

IdeaVim-EasyMotion、IdeaVim-Quickscope、IdeaVim-Sneak、IdeaVimExtension、Which-Key

2.ideavim配置文件 .ideavimrc

":actionlist 可以查询所有的命令
let mapleader=','
Plug 'easymotion/vim-easymotion'
set file encodings=utf-8,gb2312,gbk,gb18030
set term encoding=utf-8
" Plugins
set ignorecase
set smartcase
set easymotion
set sneak
set quickscope

set encoding=prc
inoremap <c-e> <c-o>$
inoremap <c-a> <c-o>^
nmap <Space>jn i<CR><Esc>
nmap <Space>jo i<CR><Esc>k$
nmap <Space>sv :vsp<CR>
nmap <Space>sg :sp<CR>
nmap <Space>sq :q<CR>
nmap <Space>sQ :qa<CR>
nmap <Space>sa ggVG
nmap <Leader><Space> :nohl<CR>
nmap <Space><CR> o<Esc>
nmap <c-h> <c-w>h
nmap <c-j> <c-w>j
nmap <c-k> <c-w>k
nmap <c-l> <c-w>l
set clipboard=unnamed
map Y y$
map D d$
"vmap p "_dp



"set nu
"set rnu
set ideajoin
set surround
set matchit
" 突出显示当前行
set cursorline
" 在状态栏显示正在输入的命令
set showcmd
"set multiple-cursors
set commentary
set ReplaceWithRegister
set exchange
set argtextobj
set highlightedyank
set which-key
" -- which key --
set notimeout
"let g:WhichKey_ShowVimActions = "true"
set timeoutlen = 5000
" 相对当前行行数显示
" set relativenumber
set scrolloff=3
set history=100000
set relativenumber
set hlsearch
set incsearch
" 去掉搜索高亮
nnoremap <leader>/ :nohls<CR>
" clear the highlighted search result
nnoremap <Leader>sc :nohlsearch<CR>
"set vim-paragraph-motion
set NERDTree

nmap <Leader>ed <Action>(ShowErrorDescription)
nmap <Leader>me <Action>(ShowPopupMenu)
    " 选择模式扩大选择范围
vmap v <Action>(EditorSelectWord)
" 选择模式缩小选择范围
vmap V <Action>(EditorUnSelectWord)
    " 多光标选中单词
nmap <Leader>va <Action>(SelectAllOccurrences)
vmap <Leader>va <Action>(SelectAllOccurrences)

set showmode
"set vim-textobj-entire
set clipboard+=ideaputset ideajoinset clipboard+=ideaput


nmap H :action PreviousTab<CR>
nmap L :action NextTab<CR>

"nmap <C-m> :action SelectNextOccurrence<cr>
"xmap <C-m> :action SelectNextOccurrence<cr>
nmap <C-s> :action FindNext<cr>
xmap <C-s> :action FindNext<cr>
"FindPrevious
nmap <C-o> :action UnselectPreviousOccurrence<cr>
xmap <C-o> :action UnselectPreviousOccurrence<cr>
nmap <S-C-m> :action SelectAllOccurrences<cr>
xmap <S-C-m> :action SelectAllOccurrences<cr>

" Do incremental searching.
nnoremap [[ :action MethodUp<CR>
nnoremap ]] :action MethodDown<CR>

" 清除当前行,撤销重写
“ 输入模式下,dd映射两个命令,返回普通模式,光标移动到最开始,C命令
"inoremap dd <ESC>:normal ddO<CR>i
"inoremap dw <esc>diw<CR>i
"输入模式下左右移动字符
inoremap <C-h> <Left>
inoremap <C-l> <Right>

"Move code up and down
inoremap <c-j> <Esc>:action MoveStatementDown<CR>i
inoremap <c-k> <Esc>:action MoveStatementUp<CR>i
inoremap <c-q> <Esc>:action QuickJavaDocL<CR>i
vnoremap J :action MoveStatementDown<CR>
vnoremap K :action MoveStatementUp<CR>
nnoremap <C-w> viw

inoremap <c-l> <Esc>:action EditorCompleteStatement<CR>
nnoremap <Space>t :action Refactorings.QuickListPopupAction<CR>
vnoremap <Space>t :action Refactorings.QuickListPopupAction<CR>
nnoremap <leader>t :action ActivateTerminalToolWindow<CR>
"nnoremap <leader>t :action TerminalOpenInTerminal<CR>
nnoremap <Space>q :action HideActiveWindow<CR>
"nnoremap <leader>e :e ~/.ideavimrc<CR>
"nnoremap <leader>kr :action IdeaVim.ReloadVimRc.reload<CR>
nnoremap <leader>n :action ContextRun<CR>
nnoremap <leader>b :action ShowNavBar<CR>
nnoremap <leader>p :action Back<CR>
nnoremap <leader>c :action ChooseRunConfiguration<CR>
nnoremap <leader>d :action ChooseDebugConfiguration<CR>
nnoremap <leader>s :action FileStructurePopup<CR>
nnoremap <Space>kr :action RunAnything<CR>
nnoremap <Space>kn :action ContextRun<CR>
nnoremap <Space>kl :action Git.Pull<CR>
nnoremap <Space>kc :action RunClass<CR>
nnoremap <Space>f :action GotoFile<CR>
nnoremap <leader>a :action GotoAction<CR>
nnoremap <leader>h :action HideAllWindows<CR>
nnoremap <Space>kf :action RerunFailedTests<CR>
nnoremap <Space>w :action GotoNextError<CR>
nnoremap <c-f> :action GotoNextError<CR>
nnoremap <Space>b :action GotoPreviousError<CR>
nnoremap <c-b> :action GotoPreviousError<CR>
nnoremap <Space>u :action FindUsages<CR>
nnoremap <c-z> :action ToggleDistractionFreeMode<CR>
" 搜索文件相关
nnoremap <leader>zc :action GotoClass<CR>
nnoremap <leader>za :action GotoAction<CR>
nnoremap <leader>zh :action RecentChangedFiles<CR>
nnoremap <leader>zf :action GotoFile<CR>
nnoremap <leader>zd :action ActivateDebugToolWindow<CR>
nnoremap <leader>zr :action ActivateRunToolWindow<CR>
nnoremap <leader>zs :action ShelvedChangesToolbar<CR>
nnoremap <leader>zt :action ActivateTODOToolWindow<CR>
nnoremap <leader>zv :action ActivateVersionControlToolWindow<CR>
nnoremap <leader>zb :action ShowBookmarks<CR>
nnoremap <leader>zp :action ActivateProjectToolWindow<CR>
noremap  <leader>zm <ESC>:action GotoSymbol<CR>

" 关闭当前标签页
nnoremap <leader>qq :q<CR>
nnoremap <leader>qa :action CloseAllEditors<CR>
nnoremap <leader>qu :action CloseAllUnmodifiedEditors<CR>
nnoremap <leader>qo :action CloseAllEditorsButActive<CR>

" 代码跳转相关
" 不用leader的话g没有任何意义,所以必须要加leader
nnoremap <leader>gd :action GotoDeclaration<CR>
nnoremap <leader>gi :action GotoImplementation<CR>
nnoremap <leader>gf :action FileStructurePopup<CR>
nnoremap <leader>gc :action EditorContextInfo<CR>
nnoremap <leader>gh :action TypeHierarchy<CR>
nnoremap <leader>gl :action Forward<CR>
nnoremap <leader>ge :action RecentFiles<CR>
nnoremap <leader>go :action RecentProjectListGroup<CR>
nnoremap <leader>gs :action GotoSuperMethod<CR>
nnoremap <leader>gt :action GotoTest<CR>
noremap <leader>gj <ESC>:action SliceBackward<CR>
noremap <leader>gk <ESC>:action SliceForward<CR>
noremap <leader>gg <ESC>:action Generate<CR>
noremap <leader>gq <ESC>:action CloseEditor<CR>
nnoremap <leader>gn g*
nnoremap <leader>gp g#


    " 窗口管理相关
nnoremap <leader>wf :action HideAllWindows<CR>
nnoremap <leader>wF :action ToggleFullScreen<CR>
nnoremap <leader>wm :action VimWindowOnly<CR>
nnoremap <leader>w- :action VimWindowSplitHorizontal<CR>
nnoremap <leader>w/ :action VimWindowSplitVertical<CR>
nnoremap <leader>wd :q<CR>
nnoremap <leader>wq :q<CR>
nnoremap <leader>wj :action VimWindowDown<CR>
nnoremap <leader>wk :action VimWindowUp<CR>
nnoremap <leader>wl :action VimWindowRight<CR>
nnoremap <leader>wh :action VimWindowLeft<CR>
nnoremap <leader>wn :action VimWindowNext<CR>
nnoremap <leader>wp :action VimWindowPrev<CR>

" 运行相关
nnoremap <leader>eb :action ChooseRunConfiguration<CR>
nnoremap <leader>ec :action CompileDirty<CR>
nnoremap <leader>ed :action Debug<CR>
nnoremap <leader>eD :action DebugClass<CR>
nnoremap <leader>er :action Run<CR>
nnoremap <leader>eR :action RunClass<CR>

" AceJump集成
nnoremap <leader>sj :action AceAction<CR>
nnoremap <leader>sJ :action AceTargetAction<CR>
nnoremap <leader>sg :action AceLineAction<CR>

" code代码修改相关
nnoremap <leader>js :action SurroundWith<CR>
nnoremap <leader>jp :action SmartSplit<CR>
nnoremap <leader>jt :action SurroundWithLiveTemplate<CR>
nnoremap <leader>j= :action FormatElement<CR>
nnoremap <leader>j+ :action ReformatCode<CR>
    " 视野左右移动
nnoremap zh 50zh
nnoremap zl 50zl
" 剪贴板
" 删除不剪切
nnoremp d "_d
nnoremap dd "_dd
nnoremap D "_D
" nnoremap <leader>d ""d
" nnoremap <leader>dd ""dd
" nnoremap <leader>D ""D
nnoremap c "_c
nnoremap cc "_cc
nnoremap C "_C
" nnoremap <leader>c ""c
" nnoremap <leader>cc ""cc
" nnoremap <leader>C ""C
vnoremap d "_d

vnoremap D "_D
" vnoremap <leader>d ""d
" vnoremap <leader>dd ""dd
" vnoremap <leader>D ""D
vnoremap c "_c
vnoremap cc "_cc
vnoremap C "_C
" vnoremap <leader>c ""c
" vnoremap <leader>cc ""cc
" vnoremap <leader>C ""C
vnoremap p "_dp
vnoremap P "_dP
" 删除不剪切
" 组合命令删除不剪切
nnoremap diw "_diw
nnoremap di" "_di"
nnoremap di' "_di'
nnoremap di( "_di(
nnoremap di[ "_di[
nnoremap di{ "_di{
nnoremap di< "_di<

nnoremap daw "_daw
nnoremap da" "_da"
nnoremap da' "_da'
nnoremap da( "_da(
nnoremap da[ "_da[
nnoremap da{ "_da{
nnoremap da< "_da<

nnoremap ciw "_ciw
nnoremap ci" "_ci"
nnoremap ci' "_ci'
nnoremap ci( "_ci(
nnoremap ci[ "_ci[
nnoremap ci{ "_ci{
nnoremap ci< "_ci<

nnoremap caw "_caw
nnoremap ca" "_ca"
nnoremap ca' "_ca'
nnoremap ca( "_ca(
nnoremap ca[ "_ca[
nnoremap ca{ "_ca{
nnoremap ca< "_ca<

" 快速跳转行首与行尾
nnoremap <C-l> $
nnoremap <C-h> ^
vnoremap <C-l> $
vnoremap <C-h> ^
" 快速跳转行首与行尾
" 移动多行
noremap <C-j> 5j
noremap <C-k> 5k

" 保存行(不含换行符)
nnoremap yir ^v$y
nnoremap yar ^v$y
" 保存行(不含换行符)
" 删除行(不含换行符)
nnoremap dir ^v$"_d
nnoremap dar ^v$"_d
" 删除行(不含换行符)
" 删除行(不含换行符)
nnoremap cir ^v"_C
nnoremap car ^v"_C
" 删除行(不含换行符)
" 删除&复制行(不含换行符)
nnoremap yxr ^v$x
" 删除&复制行(不含换行符)
" 选中行(不含换行符)
nnoremap vir ^v$
nnoremap var ^v$
" 选中行(不含换行符)
" 框选指定符号结束的多行
nnoremap vs( ^V/(<CR>%
nnoremap vs{ ^V/{<CR>%
nnoremap vs[ ^V/[<CR>%
nnoremap vs) ^V%
nnoremap vs} ^V%
nnoremap vs] ^V%
nnoremap vs; ^V/;<CR>

inoremap jk <Esc>
inoremap kj <Esc>
"inoremap <Space><Space> <Esc>
"nnoremap <Space>u :action ShowUsages<CR>
"gD可以替代这个

"Refactor
nnoremap <Space>n :action Inline<CR>
vnoremap <Space>n :action Inline<CR>

"Extract Method
nnoremap <Space>m :action ExtractMethod<CR>
nnoremap <c-m> :action ExtractMethod<CR>
vnoremap <Space>m :action ExtractMethod<CR>
vnoremap <c-m> :action ExtractMethod<CR>

nnoremap <Space>v :action IntroduceVariable<CR>
vnoremap <Space>v :action IntroduceVariable<CR>
nnoremap <Space>i :action ShowIntentionActions<CR>
nnoremap <c-i> :action ShowIntentionActions<CR>
nnoremap <Space>e :action ReformatCode<CR>
nnoremap <Space>l :action ReformatCode<CR>
nnoremap <Space>o :action Move<CR>
noremap \r <ESC>:source ~/.ideavimrc<CR>
"Rename
nnoremap <Space>r :action RenameElement<CR>
nnoremap <c-r> :action RenameElement<CR>
" g
nmap U :action $Redo<CR>
nnoremap <Space>p :action IntroduceParameter<CR>
nnoremap <Space>c :action ExtractClass<CR>

nnoremap <leader>v :action Vcs.QuickListPopupAction<CR>
nnoremap <Space>kh :action TypeHierarchy<CR>



" l
"noremap gl <ESC>:action <CR>
"打断点
nnoremap <Leader>bb :action ToggleLineBreakpoint<CR>

"查看所有断点
nnoremap <Leader>br :action ViewBreakpoints<CR>
" z
"noremap gz <ESC>:action <CR>
" close all but this

" compile
nnoremap <leader>r :action Maven.Reimport<CR>
" v
"noremap gv <ESC>:action <CR>
" b

nnoremap <leader>f :action FindInPath<CR>

狸猫不会跑大约 6 分钟Java开发工具VimJetbrains IDEA
在win10上使用dockerdesktop部署xiaoyaalist

在win10上使用dockerdesktop部署xiaoyaalist

小雅alist的官网:https://xiaoyaliu.notion.site/xiaoya-docker-69404af849504fa5bcf9f2dd5ecaa75f

Alist官网:https://alist.nn.ci/zh/

因为本电脑使用curl命令拉取脚本无效,所以使用docker逐步构建

1.拉取xiaoya镜像

docker pull xiaoyaliu/alist

狸猫不会跑大约 1 分钟Win10DockerNASAlist影视工具
数据脱敏-通过mybatis拦截器

数据脱敏-通过mybatis拦截器

1. 添加脱敏拦截器

package cn.cmcc.common.datasource.config;

import cn.cmcc.common.utils.bean.ObjectUtils;
import cn.hutool.crypto.digest.DigestUtil;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import javax.annotation.PostConstruct;
import java.util.*;

/**
 * @author leijiahao
 * @date 2023-11-07
 */
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),})
public class DataMasInterceptor implements Interceptor {


    private List<String> encryptionList;
    private Set<String> targetMappers; // 存储目标 Mapper 的集合
    public DataMasInterceptor(Set<String> targetMappers) {
        this.targetMappers = targetMappers;
    }

    public static String maskChineseString(String input) {
        if (input == null || input.length() <= 2 || "null".equals(input)) {
            return input;
        }
        // 查找倒数两个汉字的索引
        int lastIndex = -1;
        int count = 0;
        for (int i = input.length() - 1; i >= 0; i--) {
            char c = input.charAt(i);
            if (isChineseCharacter(c)) {
                count++;
                if (count == 2) {
                    lastIndex = i;
                    break;
                }
            }
        }
        // 使用 * 号替换前面的部分
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < lastIndex; i++) {

            sb.append("*");
        }
        // 保留倒数两个汉字及后面的部分
        sb.append(input.substring(lastIndex));
        return sb.toString();
    }

    public static boolean isChineseCharacter(char c) {
        Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
        return block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || block == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
    }

    public static double maskLonLat(double value) {
        if (ObjectUtils.isEmpty(value)) {
            return value;
        }
        Random random = new Random();
        double offset = random.nextDouble() * 0.0001 + 0.0001;
        return value + offset;
    }

    @PostConstruct
    public void init() {
        encryptionList = new ArrayList<>();
        // TODO: 2023-11-08 设置加密字段
//        encryptionList.add("cgi");
//        encryptionList.add("enb_id");
//        encryptionList.add("enb_name");
//        encryptionList.add("enodeb_name");
//        encryptionList.add("cell_name");
//        encryptionList.add("cell_id");
//        encryptionList.add("project_name");
//        encryptionList.add("project_id");
//        encryptionList.add("user_name");
    }

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object arg1 = invocation.getArgs()[0];
        // 拦截通用查询,加密字段
        if ((arg1 instanceof MappedStatement)
//                && targetMappers.contains(((MappedStatement) arg1).getId())
                && !encryptionList.isEmpty()
        ) {
            Object result = invocation.proceed();
            if (result instanceof ArrayList) {
                ArrayList resultList = (ArrayList) result;
                for (Object o : resultList) {
                    if (o instanceof Map) {
                        Map<String, Object> resultMap = (Map<String, Object>) o;
                        for (String key : encryptionList) {
                            if (resultMap.containsKey(key)) {
                                if (key.endsWith("name")) {
                                    resultMap.put(key, maskChineseString(String.valueOf(resultMap.get(key))));
                                } else if (key.endsWith("lon") || key.endsWith("lat")) {
                                    resultMap.put(key, maskLonLat(Double.parseDouble(String.valueOf(resultMap.get(key)))));
                                } else {
                                    //MD5加密
                                    resultMap.put(key, DigestUtil.md5Hex(String.valueOf(resultMap.get(key))
                                                                               .getBytes()));
                                }
                            }
                        }
                    }
                }
            }
            return result;
        } else {
            return invocation.proceed();
        }
    }
}

狸猫不会跑大约 2 分钟JavaMybatisSpring安全
flask服务注册到nacos

flask服务注册到nacos

Java调用

1.添加pom依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

狸猫不会跑小于 1 分钟pythonnacos