{
  "type": "BlogWikiIndex",
  "version": 1,
  "site": "https://www.cati.cc.cd/",
  "generatedAt": "2026-10-18T01:33:19.346Z",
  "articles": [
    {
      "id": "others-blog-firefly-mod",
      "title": "Firefly魔改总结",
      "description": "记录 Firefly 博客主题的二次开发，涵盖 Astro 内容系统、Svelte 交互、首页动效、音乐可视化、标签图谱、留言板和 Cloudflare 集成。",
      "published": "2026-08-21T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/others-blog-firefly-mod/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/others-blog-firefly-mod.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/others-blog-firefly-mod.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "选型背景",
        "1、首页",
        "2、音乐",
        "3、分类标签",
        "4、留言",
        "4.1 接口列表",
        "4.2 登录流程",
        "5、关于",
        "6、日历",
        "6.1 接口列表",
        "7、归档",
        "8、其他",
        "二、用到的AI模型",
        "三、优点与UI复制"
      ],
      "excerpt": "记录 Firefly 博客主题的二次开发，涵盖 Astro 内容系统、Svelte 交互、首页动效、音乐可视化、标签图谱、留言板和 Cloudflare 集成。",
      "characterCount": 4521
    },
    {
      "id": "ai-blog-ai-zero-editing",
      "title": "这个博客《纯AI，零人工》",
      "description": "记录使用 AI 搭建和维护 Astro 博客的实践流程，涵盖视觉定位、HTML 原型、项目规范、功能开发、测试验证和持续迭代。",
      "published": "2026-06-14T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-blog-ai-zero-editing/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-blog-ai-zero-editing.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-blog-ai-zero-editing.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "一、问题与目标",
        "1、正确流程",
        "2、原型图",
        "2.1 原型图步骤",
        "2.2 重点速查表",
        "2.3 推荐资源",
        "2.4 提示词速查表",
        "3、设置规范",
        "3.1 正确流程",
        "3.2 TDD是神",
        "4、开发",
        "5、优化",
        "5.1 动效",
        "5.2 资源优化",
        "5.3 定期扫描",
        "二、AI 工具",
        "1、Skill",
        "2、模型选择",
        "1、博客设计原则"
      ],
      "excerpt": "记录使用 AI 搭建和维护 Astro 博客的实践流程，涵盖视觉定位、HTML 原型、项目规范、功能开发、测试验证和持续迭代。",
      "characterCount": 2139
    },
    {
      "id": "ai-blog-ai-search-vectorize",
      "title": "Cloudflare Vectorize实现AI搜索问答",
      "description": "基于 Cloudflare Vectorize 构建博客 AI 语义搜索，介绍 Markdown 分块、Embedding、RAG 检索、Worker 流式问答及向量索引配置。",
      "published": "2026-05-14T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-blog-ai-search-vectorize/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-blog-ai-search-vectorize.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-blog-ai-search-vectorize.md",
      "category": "AI实践",
      "tags": [
        "AI"
      ],
      "headings": [
        "一、问题与目标",
        "二、架构",
        "三、文档分块策略",
        "1、实现细节",
        "2、与 LangChain 递归分块的对比",
        "1、构建脚本",
        "2、Embedding 来源",
        "3、Cloudflare 凭证获取",
        "4、Worker Secret 配置",
        "5、向量索引上传",
        "五、Worker 端问答流程",
        "1、统一配置管理",
        "2、Embedding",
        "3、向量检索",
        "4、Prompt 拼接与 system 注入防护",
        "5、流式返回",
        "六、前端组件",
        "1.1 数据结构设计",
        "1.2 新建会话",
        "1.3 历史会话列表",
        "1.4 会话切换",
        "1.5 会话删除",
        "1.6 会话上限与自动清理",
        "1.7 自动保存时机",
        "1.8 初始化恢复",
        "七、敏感配置处理",
        "八、资源消耗",
        "九、文件清单",
        "十、踩坑记录"
      ],
      "excerpt": "基于 Cloudflare Vectorize 构建博客 AI 语义搜索，介绍 Markdown 分块、Embedding、RAG 检索、Worker 流式问答及向量索引配置。",
      "characterCount": 6269
    },
    {
      "id": "qwenragzhushou",
      "title": "从零到上线：RAG 知识库助手保姆级教程",
      "description": "本笔记包含：RAG 原理 → 保姆级安装部署（每步含预期输出）→ 完整源码 → 故障排查复盘",
      "published": "2026-10-12T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/qwenragzhushou/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/qwenragzhushou.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/qwenragzhushou.md",
      "category": "AI实践",
      "tags": [
        "AI",
        "RAG"
      ],
      "headings": [
        "目录",
        "一、项目是什么",
        "二、RAG 原理（人话版）",
        "三、项目结构",
        "A0. 准备清单（开始前备齐）",
        "A1. 购买并初始化服务器",
        "A2. 创建百炼 API Key",
        "A3. 把代码上传到服务器（二选一）",
        "A4. 在服务器上执行部署（逐条命令 + 预期结果）",
        "A5. 验收测试（4 步）",
        "A6. 常见报错速查表（全部真实踩过）",
        "A7. 保姆级经验：粘贴命令的纪律",
        "五、保姆级教程 Part B：本地 Ollama 私有化模式（Windows）",
        "B1. 安装 Ollama",
        "B2. 拉取模型",
        "B3. 验证（三连）",
        "B4. 把本项目切换成本地模式（Windows CMD）",
        "B5. 录\"私有化部署\"演示视频脚本（2 分钟）",
        "B6. 硬件参考（GTX 1650Ti 4G / 16G 内存实测）",
        "六、日常运维",
        "七、进阶：设备健康日报（数据分析 × 大模型）",
        "7.1 为什么做这个功能",
        "7.2 整体架构（五步链路）",
        "① 数据清洗 —— 工业数据的\"脏\"是常态",
        "② 双规则异常检测 —— 规则 + 统计，互相兜底",
        "③ 汇总 24 小时指标 —— 给模型\"喂\"结构化数据",
        "④ 检索手册处置建议 —— 让日报\"有出处\"",
        "⑤ 大模型生成日报 —— 提示词工程 + 防幻觉",
        "7.4 实测输出（本项目真实结果）",
        "7.5 怎么用（三种方式）",
        "7.6 本功能踩坑记录（真实排查）",
        "7.7 面试怎么讲（90 秒版本）",
        "8.1 backend/main.py",
        "8.2 backend/rag_store.py",
        "8.3 deploy.sh",
        "8.4 frontend/index.html（核心逻辑摘录，完整文件见仓库）",
        "8.5 backend/report.py（设备健康日报，完整源码）",
        "九、故障排查复盘（最值钱的部分）",
        "问题 A：文档里没有的内容被编造",
        "问题 B：文档里有的内容答错",
        "方法论",
        "十、可扩展方向",
        "附录 A：验收测试文档全文（CNC-8800 设备维护手册）",
        "附录 B：四题验收测试用例（回归验证标准）"
      ],
      "excerpt": "本笔记包含：RAG 原理 → 保姆级安装部署（每步含预期输出）→ 完整源码 → 故障排查复盘",
      "characterCount": 10794
    },
    {
      "id": "mysqlanzhuang",
      "title": "MySQL安装(8.4.4LTS : Windows + Linux)",
      "description": "MySQL安装8.4.4LTS版本Windows和Linux教程",
      "published": "2026-10-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/mysqlanzhuang/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/mysqlanzhuang.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/mysqlanzhuang.md",
      "category": "数据库",
      "tags": [
        "SQL",
        "Linux",
        "Windows"
      ],
      "headings": [
        "一、版本说明",
        "二、官网下载",
        "3.1 安装和配置",
        "3.21 使用自带命令行客户端",
        "3.22 添加环境变量",
        "3.33 安装图像化界面",
        "3.33.1 MySQL WorkBench",
        "3.33.2 Navicat",
        "4.1 安装",
        "4.2 远程连接",
        "4.3 安装默认示例数据库"
      ],
      "excerpt": "MySQL安装8.4.4LTS版本Windows和Linux教程",
      "characterCount": 8235
    },
    {
      "id": "javamodbustcp",
      "title": "Java实现ModbusTCP通信",
      "description": "用Java实现使用ModbusTCP和硬件设备通信",
      "published": "2026-09-22T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javamodbustcp/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javamodbustcp.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javamodbustcp.md",
      "category": "工业自动化",
      "tags": [
        "ModbusTCP",
        "SpringBoot"
      ],
      "headings": [
        "资料",
        "ModbusTCP协议",
        "仿真软件",
        "地址类型",
        "数据类型",
        "使用jlibmodbus",
        "maven依赖",
        "maven依赖",
        "Java实现modbus协议通讯",
        "Java通过modbus4j对数据的写入",
        "使用modbus-master-tcp",
        "maven依赖",
        "编写modbus tcp读取案例",
        "编写modbus tcp写入案例",
        "评价感受"
      ],
      "excerpt": "用Java实现使用ModbusTCP和硬件设备通信",
      "characterCount": 4422
    },
    {
      "id": "javascript-image-switcher",
      "title": "JS实现图片切换",
      "description": "添加所有页面，和上一页、具体页、下一页的按钮,设置div样式，默认第一页显示，其他页隐藏。",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-image-switcher/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-image-switcher.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-image-switcher.md",
      "category": "前端开发",
      "tags": [
        "HTML",
        "CSS"
      ],
      "headings": [
        "HTML+CSS部分",
        "js部分",
        "实现效果",
        "完整代码HTML"
      ],
      "excerpt": "添加所有页面，和上一页、具体页、下一页的按钮,设置div样式，默认第一页显示，其他页隐藏。",
      "characterCount": 99
    },
    {
      "id": "javascript-promise-notes",
      "title": "Promise",
      "description": "Promise",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-promise-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-promise-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-promise-notes.md",
      "category": "前端开发",
      "tags": [
        "Promise",
        "JavaScript"
      ],
      "headings": [
        "Promise 是什么?",
        "promise 的状态改变",
        "promise 的基本流程",
        "promise 的基本使用",
        "指定回调函数的方式更加灵活",
        "支持链式调用, 可以解决回调地狱问题\\*",
        "API",
        "promise 的几个关键问题"
      ],
      "excerpt": "Promise",
      "characterCount": 2653
    },
    {
      "id": "javascript-regex-match-chinese",
      "title": "JavaScript正则匹配汉字",
      "description": "在此之前，工作项目中使用匹配汉字的正则表达式都是 /[\\\\\\\\u4e00-\\\\\\\\u9fa5]/，该正则是 Google 而来，虽然常用，但是一直未深究其所以然。",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-regex-match-chinese/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-regex-match-chinese.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-regex-match-chinese.md",
      "category": "前端开发",
      "tags": [
        "JavaScript"
      ],
      "headings": [
        "汉文与汉字",
        "字符集和字符编码",
        "正则匹配汉字",
        "兼容性"
      ],
      "excerpt": "在此之前，工作项目中使用匹配汉字的正则表达式都是 /[\\\\\\\\u4e00-\\\\\\\\u9fa5]/，该正则是 Google 而来，虽然常用，但是一直未深究其所以然。",
      "characterCount": 2134
    },
    {
      "id": "linux-vmware-virtual-machine",
      "title": "虚拟机",
      "description": "所谓的虚拟机，就是在当前计算机系统中，又开启了一个虚拟系统这个虚拟系统，我们要安装Linux系统",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/linux-vmware-virtual-machine/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/linux-vmware-virtual-machine.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/linux-vmware-virtual-machine.md",
      "category": "运维部署",
      "tags": [
        "VMWare"
      ],
      "headings": [
        "什么是虚拟机",
        "Linux概述",
        "Windows和Linux系统的版本对比",
        "特点",
        "发行版本",
        "安装VMWare及加载环境",
        "安装BvSshClient",
        "Linux的目录结构"
      ],
      "excerpt": "所谓的虚拟机，就是在当前计算机系统中，又开启了一个虚拟系统这个虚拟系统，我们要安装Linux系统",
      "characterCount": 2314
    },
    {
      "id": "npm-image-host-setup",
      "title": "npm图床搭建",
      "description": "npm图床搭建npm使用方法",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/npm-image-host-setup/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/npm-image-host-setup.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/npm-image-host-setup.md",
      "category": "AI实践",
      "tags": [
        "NPM"
      ],
      "headings": [
        "npm 图床搭建",
        "1. 创建一个 GitHub 仓库存储图片",
        "2. npm 图床使用",
        "4. 使用 GitHub Action 自动发布 npm 包"
      ],
      "excerpt": "npm图床搭建npm使用方法",
      "characterCount": 1849
    },
    {
      "id": "springcloud-alibaba-intro",
      "title": "初识SpringCloudAlibaba",
      "description": "依托 Spring Cloud Alibaba，只需要添加一些注解和少量配置，就可以将 Spring Cloud 应用接入阿里分布式应用解决方案，通过阿里中间件来迅速搭建分布式应用系统。",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-alibaba-intro/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-alibaba-intro.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-alibaba-intro.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "简介",
        "说功能明",
        "开源的免费组件：",
        "基于阿里云的商用组件：",
        "使用 SpringCloudAlibaba 的优势 部分摘自书籍",
        "后续"
      ],
      "excerpt": "依托 Spring Cloud Alibaba，只需要添加一些注解和少量配置，就可以将 Spring Cloud 应用接入阿里分布式应用解决方案，通过阿里中间件来迅速搭建分布式应用系统。",
      "characterCount": 1405
    },
    {
      "id": "springcloud-application-yml-config",
      "title": "application.yml微服务配置",
      "description": "微服务Spring Cloud application.yml配置",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-application-yml-config/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-application-yml-config.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-application-yml-config.md",
      "category": "微服务与中间件",
      "tags": [
        "Application"
      ],
      "headings": [
        "application.yml配置",
        "XML依赖",
        "application-dev.yml配置",
        "XML依赖"
      ],
      "excerpt": "微服务Spring Cloud application.yml配置",
      "characterCount": 143
    },
    {
      "id": "textarea-newline-to-br-database",
      "title": "textarea标签换行符以br存入数据库 ，br转 textArea换行符",
      "description": "textarea标签换行符以br存入数据库 ，br转 textArea换行符",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/textarea-newline-to-br-database/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/textarea-newline-to-br-database.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/textarea-newline-to-br-database.md",
      "category": "前端开发",
      "tags": [
        "CSS",
        "textArea",
        "JavaScript"
      ],
      "headings": [
        "1.textArea换行符转 `<br/>`",
        "2.`<br/>` 转 textArea换行符"
      ],
      "excerpt": "textarea标签换行符以br存入数据库 ，br转 textArea换行符",
      "characterCount": 126
    },
    {
      "id": "vue-cli-project-setup",
      "title": "创建VueCLI工程",
      "description": "下载并安装Node.js，下载完成后，打开新的CMD/终端窗口，输入以下命令",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/vue-cli-project-setup/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/vue-cli-project-setup.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/vue-cli-project-setup.md",
      "category": "前端开发",
      "tags": [
        "CSS",
        "JavaScript",
        "Vue"
      ],
      "headings": [
        "创建Vue CLI工程",
        "启动Vue CLI工程",
        "停止已启动的项目",
        "关于Vue CLI工程结构",
        "关于路由的简单配置",
        "使用Element UI",
        "使用Axios",
        "Vue CLI中的嵌套路由",
        "Vue CLI的路由守卫",
        "练习：添加类别的页面"
      ],
      "excerpt": "下载并安装Node.js，下载完成后，打开新的CMD/终端窗口，输入以下命令",
      "characterCount": 4804
    },
    {
      "id": "vue2-notes",
      "title": "Vue2",
      "description": "Vue2学习过程中的笔记",
      "published": "2026-09-20T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/vue2-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/vue2-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/vue2-notes.md",
      "category": "前端开发",
      "tags": [
        "JavaScript",
        "Vue"
      ],
      "headings": [
        "Vue",
        "**初识 Vue**",
        "**模板语法**",
        "数据绑定",
        "el 与 data 的两种写法",
        "MVVM 模型",
        "Object.defineProperty 方法",
        "[vue 双向绑定原理及实现](https://www.cnblogs.com/canfoo/p/6891868.html)\\*",
        "数据代理",
        "事件的基本使用",
        "事件修饰符",
        "键盘事件",
        "计算属性与监视",
        "监视属性 watch",
        "深度监视",
        "computed 和 watch 之间的区别",
        "class 样式",
        "style 样式",
        "v-if",
        "v-show",
        "v-for 指令",
        "key 作用与原理",
        "监测数据",
        "收集表单数据",
        "内置指令",
        "自定义指令",
        "生命周期",
        "Vue 组件化编程",
        "非单文件组件",
        "VueComponent",
        "\\*内置关系",
        "单文件组件",
        "初始化脚手架",
        "脚手架文件结构",
        "关于不同版本的 Vue:",
        "vue.config.js 配置文件",
        "ref 属性",
        "配置项 props",
        "通过 props 实现通信",
        "props 静态传递",
        "props 动态传递",
        "通过$ref 实现通信",
        "props 和$ref 的对比",
        "$emit 实现通信",
        "三种方法区别",
        "混入 mixin",
        "Mixin 和 Vuex 的区别？",
        "插件",
        "scoped 样式",
        "TodoList 案例总结",
        "webStorage",
        "组件自定义事件",
        "全局事件总线",
        "消息订阅与发布（pubsub）",
        "nextTick（生命周期钩子）",
        "过渡与动画",
        "vue 脚手架配置代理(开发环境 Ajax 跨域问题)",
        "slot 插槽",
        "概念",
        "vuex 工作原理图",
        "搭建 vuex 环境(store)",
        "基本使用",
        "getters 的使用",
        "四个 map 方法的使用",
        "模块化+命名空间\\*",
        "vuex 核心概念和 API",
        "state",
        "actions",
        "mutations",
        "modules",
        "model\\*",
        "vue-router 的理解",
        "对 SPA 应用的理解",
        "路由的理解",
        "基本使用",
        "几个注意点",
        "嵌套路由(多级路由)",
        "路由的 query 参数",
        "命名路由",
        "路由的 params 参数",
        "路由的 props 配置",
        "路由传参相关面试题",
        "`<router-link>`的 replace 属性(无痕浏览 doge)",
        "编程式路由导航",
        "缓存路由组件",
        "两个新的生命周期钩子",
        "路由守卫",
        "全局守卫",
        "独享守卫",
        "组件内路由守卫",
        "路由器的两种工作模式 hash 与 history",
        "前端路由原理解析与实现",
        "移动端常用 UI 组件库",
        "PC 端常用 UI 组件库",
        "1.事件注意事项",
        "2.v-model",
        "3.sync 属性修饰符",
        "4. `$attrs` 与 `$listeners`",
        "5.`$children`与`$parent`",
        "6.混入 mixin",
        "7.插槽"
      ],
      "excerpt": "Vue2学习过程中的笔记",
      "characterCount": 19292
    },
    {
      "id": "anchor-tag-external-video-playback",
      "title": "a标签点击通过站外链接播放视频",
      "description": "添加所有页面，和上一页、具体页、下一页的按钮,设置div样式，默认第一页显示，其他页隐藏。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/anchor-tag-external-video-playback/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/anchor-tag-external-video-playback.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/anchor-tag-external-video-playback.md",
      "category": "前端开发",
      "tags": [
        "JavaScript",
        "CSS"
      ],
      "headings": [
        "JS实现站外链接视频播放"
      ],
      "excerpt": "添加所有页面，和上一页、具体页、下一页的按钮,设置div样式，默认第一页显示，其他页隐藏。",
      "characterCount": 211
    },
    {
      "id": "character-encoding-basics",
      "title": "字符编码小常识",
      "description": "众所周知，在计算机内部，所有信息最终都表示为一个二进制值，每个二进制位有 0 和 1 两种状态。八个二进制位（bit）组成一个字节（byte），一共可以表示 2^8 = 256 种状态。一个状态对应一种符号，即共有 256 种符号，从 00000000 到 11111111。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/character-encoding-basics/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/character-encoding-basics.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/character-encoding-basics.md",
      "category": "Java",
      "tags": [
        "JavaScript"
      ],
      "headings": [
        "编码",
        "ASCII 码",
        "Unicode",
        "UTF-8"
      ],
      "excerpt": "众所周知，在计算机内部，所有信息最终都表示为一个二进制值，每个二进制位有 0 和 1 两种状态。八个二进制位（bit）组成一个字节（byte），一共可以表示 2^8 = 256 种状态。一个状态对应一种符号，即共有 256 种符号，从 00000000 到 11111111。",
      "characterCount": 1164
    },
    {
      "id": "cloud-server-springboot-deploy",
      "title": "云服务器部署Springboot单体项目",
      "description": "参照我之前的笔记，安装docker 并且替换docker的镜像源",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/cloud-server-springboot-deploy/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/cloud-server-springboot-deploy.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/cloud-server-springboot-deploy.md",
      "category": "运维部署",
      "tags": [
        "SpringBoot"
      ],
      "headings": [
        "部署Springboot单体项目",
        "使用maven打包工具",
        "安装docker",
        "安装nginx",
        "安装prce",
        "安装openssl",
        "安装zlib",
        "安装nginx",
        "开放服务器端口",
        "nginx使用命令",
        "修改配置文件 -- 测试",
        "启动测试：",
        "配置nginx",
        "上传jar包",
        "编写Dockerfile",
        "配置hosts文件完成本地域名解析映射",
        "测试访问：",
        "补充说明："
      ],
      "excerpt": "参照我之前的笔记，安装docker 并且替换docker的镜像源",
      "characterCount": 1981
    },
    {
      "id": "cloud-server-vue-deploy",
      "title": "云服务器部署vue工程",
      "description": "参照我之前的笔记，安装docker 并且替换docker的镜像源",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/cloud-server-vue-deploy/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/cloud-server-vue-deploy.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/cloud-server-vue-deploy.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "云服务器部署vue"
      ],
      "excerpt": "参照我之前的笔记，安装docker 并且替换docker的镜像源",
      "characterCount": 226
    },
    {
      "id": "css-gradient-color-palette",
      "title": "纯CSS渐变⾊板配⾊代码",
      "description": "CSS渐变⾊板配⾊代码",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/css-gradient-color-palette/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/css-gradient-color-palette.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/css-gradient-color-palette.md",
      "category": "前端开发",
      "tags": [
        "Style",
        "CSS",
        "HTML"
      ],
      "headings": [
        "CSS渐变⾊板配⾊代码"
      ],
      "excerpt": "CSS渐变⾊板配⾊代码",
      "characterCount": 11
    },
    {
      "id": "java-arraylist-notes",
      "title": "JavaArrayList",
      "description": "ArrayList 类是一个可以动态修改的数组，与普通数组的区别就是它是没有固定大小的限制，我们可以添加或删除元素。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-arraylist-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-arraylist-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-arraylist-notes.md",
      "category": "Java",
      "tags": [
        "ArrayList",
        "List",
        "Collection"
      ],
      "headings": [
        "ArrayList",
        "添加元素",
        "访问元素",
        "修改元素",
        "删除元素",
        "计算大小",
        "迭代数组列表",
        "其他的引用类型",
        "ArrayList 排序",
        "Java ArrayList 方法"
      ],
      "excerpt": "ArrayList 类是一个可以动态修改的数组，与普通数组的区别就是它是没有固定大小的限制，我们可以添加或删除元素。",
      "characterCount": 2204
    },
    {
      "id": "java-collection-notes",
      "title": "Collection集合",
      "description": "集合: 英文译为 Collection，用来存放对象的容器，集合中可以存放不同类型的对象，并且集合的长度可变。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-collection-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-collection-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-collection-notes.md",
      "category": "Java",
      "tags": [
        "Collection",
        "API"
      ],
      "headings": [
        "Collection接口",
        "集合的继承结构",
        "常用方法",
        "实例1：CollectionDemo1",
        "实例2：CollectionDemo2",
        "实例4：CollectionDemo4",
        "集合的遍历",
        "增强型for循环",
        "List集合",
        "List方法测试",
        "ListDemo2",
        "ListDemo3",
        "集合和数组的转换",
        "集合的排序",
        "Map接口",
        "继承结构",
        "MapDemo",
        "变量分析"
      ],
      "excerpt": "集合: 英文译为 Collection，用来存放对象的容器，集合中可以存放不同类型的对象，并且集合的长度可变。",
      "characterCount": 3701
    },
    {
      "id": "java-collections-framework",
      "title": "Java集合",
      "description": "早在 Java 2 中之前，Java 就提供了特设类。比如：Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-collections-framework/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-collections-framework.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-collections-framework.md",
      "category": "Java",
      "tags": [
        "List",
        "Set",
        "Collection"
      ],
      "headings": [
        "JavaAPI",
        "集合框架体系如图所示",
        "集合接口",
        "Set和List的区别",
        "集合实现类（集合类）",
        "集合算法",
        "如何使用迭代器",
        "遍历 Map",
        "如何使用比较器",
        "总结"
      ],
      "excerpt": "早在 Java 2 中之前，Java 就提供了特设类。比如：Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。",
      "characterCount": 5176
    },
    {
      "id": "java-file-api-notes",
      "title": "File文件API",
      "description": "File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-file-api-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-file-api-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-file-api-notes.md",
      "category": "Java",
      "tags": [
        "API",
        "File"
      ],
      "headings": [
        "File",
        "创建文件",
        "删除文件",
        "创建目录",
        "删除目录",
        "获取目录中的子项",
        "递归遍历目录",
        "递归获取目录的子项",
        "递归删除目录",
        "获取一个目录中符合过滤条件的所有子项"
      ],
      "excerpt": "File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)",
      "characterCount": 1654
    },
    {
      "id": "java-hashmap-notes",
      "title": "JavaHashMap",
      "description": "链表（Linked list）是一种常见的基础数据结构，是一种线性表，但是并不会按线性的顺序存储数据，而是在每一个节点里存到下一个节点的地址。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-hashmap-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-hashmap-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-hashmap-notes.md",
      "category": "Java",
      "tags": [
        "HashMap",
        "Map",
        "Collection"
      ],
      "headings": [
        "HashMap",
        "添加元素",
        "访问元素",
        "删除元素",
        "计算大小",
        "迭代 HashMap",
        "Java HashMap 方法"
      ],
      "excerpt": "链表（Linked list）是一种常见的基础数据结构，是一种线性表，但是并不会按线性的顺序存储数据，而是在每一个节点里存到下一个节点的地址。",
      "characterCount": 2129
    },
    {
      "id": "java-hashset-notes",
      "title": "JavaHashSet",
      "description": "HashSet 基于 HashMap 来实现的，是一个不允许有重复元素的集合。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-hashset-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-hashset-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-hashset-notes.md",
      "category": "Java",
      "tags": [
        "HashSet",
        "Set",
        "Collection"
      ],
      "headings": [
        "HashSet",
        "添加元素",
        "判断元素是否存在",
        "删除元素",
        "计算大小",
        "迭代 HashSet"
      ],
      "excerpt": "HashSet 基于 HashMap 来实现的，是一个不允许有重复元素的集合。",
      "characterCount": 951
    },
    {
      "id": "java-http-protocol-notes",
      "title": "HTTP协议",
      "description": "HTTP协议 超文本传输协议 由万维网制定(w3c),TCP协议主要关注客户端和服务器建立链接,互相传递数据的协议",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-http-protocol-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-http-protocol-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-http-protocol-notes.md",
      "category": "Java",
      "tags": [
        "API",
        "HTTP"
      ],
      "headings": [
        "HTTP协议",
        "HTTP请求和响应",
        "请求Request",
        "响应Response"
      ],
      "excerpt": "HTTP协议 超文本传输协议 由万维网制定(w3c),TCP协议主要关注客户端和服务器建立链接,互相传递数据的协议",
      "characterCount": 1805
    },
    {
      "id": "java-io-stream-notes",
      "title": "IO流",
      "description": "In/Out: 相对于程序而言的输入(读取)和输出(写出)的过程。即: 通过java程序到磁盘读取数据的过程, 我们称为In的过程, 也就是读取(输入)",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-io-stream-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-io-stream-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-io-stream-notes.md",
      "category": "Java",
      "tags": [
        "API",
        "IO"
      ],
      "headings": [
        "IO简介",
        "流的概念",
        "节点流和处理流",
        "节点流",
        "处理流",
        "处理流特点",
        "OutputStream抽象类",
        "FileOutputStream文件输出流",
        "InputStream抽象类",
        "FileInputStream子类",
        "复制文件",
        "缓冲流",
        "对象流",
        "字节流和字符流",
        "字节流",
        "字符流",
        "OutputStreamWriter",
        "InputStreamReader",
        "PrintWriter"
      ],
      "excerpt": "In/Out: 相对于程序而言的输入(读取)和输出(写出)的过程。即: 通过java程序到磁盘读取数据的过程, 我们称为In的过程, 也就是读取(输入)",
      "characterCount": 1874
    },
    {
      "id": "java-lambda-expressions",
      "title": "Lambda表达式",
      "description": "lambda可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-lambda-expressions/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-lambda-expressions.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-lambda-expressions.md",
      "category": "Java",
      "tags": [
        "API",
        "Lambda"
      ],
      "headings": [
        "二、Lambda表达式"
      ],
      "excerpt": "lambda可以用更精简的代码创建匿名内部类.但是该匿名内部类实现的接口只能有一个抽象方法,否则无法使用!",
      "characterCount": 138
    },
    {
      "id": "java-linkedlist-notes",
      "title": "JavaLinkedList",
      "description": "链表（Linked list）是一种常见的基础数据结构，是一种线性表，但是并不会按线性的顺序存储数据，而是在每一个节点里存到下一个节点的地址。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-linkedlist-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-linkedlist-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-linkedlist-notes.md",
      "category": "Java",
      "tags": [
        "LinkedList",
        "List",
        "Collection"
      ],
      "headings": [
        "Java LinkedList",
        "以下情况使用 ArrayList :",
        "迭代元素",
        "常用方法"
      ],
      "excerpt": "链表（Linked list）是一种常见的基础数据结构，是一种线性表，但是并不会按线性的顺序存储数据，而是在每一个节点里存到下一个节点的地址。",
      "characterCount": 2646
    },
    {
      "id": "java-socket-programming",
      "title": "Socket网络编程",
      "description": "IP是根据TCP/IP协议划定,由32位二进制数组成,而且在因特网上是唯一的数值",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-socket-programming/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-socket-programming.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-socket-programming.md",
      "category": "Java",
      "tags": [
        "API",
        "Socket"
      ],
      "headings": [
        "IP和端口号",
        "Socket概述",
        "Socket常用方法",
        "聊天室"
      ],
      "excerpt": "IP是根据TCP/IP协议划定,由32位二进制数组成,而且在因特网上是唯一的数值",
      "characterCount": 841
    },
    {
      "id": "java-thread-basics",
      "title": "线程",
      "description": "线程是进程中的单个顺序执行流，是一条执行路径。一个进程如果只有一条执行路径，则成为单线程程序；而如果有多条执行路径，则成为多线程程序。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-thread-basics/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-thread-basics.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-thread-basics.md",
      "category": "Java",
      "tags": [
        "API",
        "线程"
      ],
      "headings": [
        "线程",
        "多线程的特性",
        "如何实现多线程",
        "实现多线程1: 继承Thread类",
        "实现多线程2: 实现Runnable接口",
        "Thread的常用方法和总结",
        "进程",
        "线程状态",
        "线程的同步和异步",
        "同步锁",
        "同步代码块",
        "静态同步方法",
        "互斥锁",
        "死锁"
      ],
      "excerpt": "线程是进程中的单个顺序执行流，是一条执行路径。一个进程如果只有一条执行路径，则成为单线程程序；而如果有多条执行路径，则成为多线程程序。",
      "characterCount": 4455
    },
    {
      "id": "java-throwable-exception",
      "title": "Throwable异常",
      "description": "异常: 就是指程序出现了不正常的情况,用来封装错误信息的对象。组成结构：类型，提示，行号。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/java-throwable-exception/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/java-throwable-exception.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/java-throwable-exception.md",
      "category": "Java",
      "tags": [
        "API",
        "异常"
      ],
      "headings": [
        "异常处理",
        "异常的继承结构",
        "虚拟机的默认处理方式",
        "异常处理之try...catch...处理",
        "finally块",
        "throw关键字",
        "代码案例",
        "异常处理之throws处理",
        "代码案例",
        "代码案例",
        "代码案例",
        "代码案例",
        "总结: 什么时候需要try...catch异常, 什么时候需要throws异常?",
        "Java.io.NullPointerException",
        "java.lang.NumberFormatException: For input string: \"xxxxx\"",
        "java.lang.StringIndexOutOfBoundsException",
        "java.io.InvalidClassException",
        "java.io.NotSerializableException",
        "java.io.UnsupportedEncodingException",
        "java.io.FileNotFoundException",
        "java.net.ConnectException: Connection refused: connect",
        "java.net.BindException: Address already in use",
        "java.net.SocketException: Connection reset",
        "java.lang.InterruptedException",
        "java.util.NoSuchElementException",
        "java.util.ConcurrentModificationException",
        "java.lang.UnsupportedOperationException"
      ],
      "excerpt": "异常: 就是指程序出现了不正常的情况,用来封装错误信息的对象。组成结构：类型，提示，行号。",
      "characterCount": 5614
    },
    {
      "id": "javascript-axios-notes",
      "title": "Axios",
      "description": "Axios学习过程中所记的笔记",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-axios-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-axios-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-axios-notes.md",
      "category": "前端开发",
      "tags": [
        "Axios",
        "JavaScript"
      ],
      "headings": [
        "Axios",
        "axios 是什么?",
        "axios 特点",
        "axios 常用语法",
        "axios.create(config)",
        "拦截器函数/ajax 请求/请求的回调函数的调用顺序",
        "取消请求"
      ],
      "excerpt": "Axios学习过程中所记的笔记",
      "characterCount": 1443
    },
    {
      "id": "javascript-basics-notes",
      "title": "JavaScript",
      "description": "Js复习笔记",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-basics-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-basics-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-basics-notes.md",
      "category": "前端开发",
      "tags": [
        "JavaScript"
      ],
      "headings": [
        "节点属性",
        "操作",
        "Document 节点",
        "Element 节点",
        "CSS 操作",
        "Object 对象",
        "**Array**对象",
        "Number 对象",
        "String 对象",
        "Math 对象",
        "JSON 对象",
        "console 对象"
      ],
      "excerpt": "Js复习笔记",
      "characterCount": 499
    },
    {
      "id": "javascript-es6-es11-features",
      "title": "ES6-11",
      "description": "ES6-11新特性-学习过程中记的笔记",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/javascript-es6-es11-features/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/javascript-es6-es11-features.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/javascript-es6-es11-features.md",
      "category": "前端开发",
      "tags": [
        "JavaScript",
        "ES6"
      ],
      "headings": [
        "let 关键字",
        "const 关键字",
        "变量的解构赋值",
        "模板字符串",
        "简化对象写法",
        "箭头函数",
        "rest 参数",
        "spread 扩展运算符",
        "Symbol 基本使用",
        "对象添加 Symbol 类型属性",
        "Symbol 内置值",
        "迭代器",
        "生成器",
        "Promise",
        "Promise 异步方案\\*",
        "Promise 静态方法",
        "Promise.all()",
        "Promise.race()",
        "手撕 Promise",
        "Set",
        "Map",
        "class 类",
        "数值扩展",
        "对象扩展",
        "模块化",
        "模块化的好处",
        "模块化规范产品",
        "ES6 模块化语法",
        "export 三种暴露方式",
        "import 引入方式",
        "Array.prototype.includes",
        "指数操作符",
        "async 和 await",
        "async 函数",
        "await 表达式",
        "Async/Await 语法糖",
        "Async / Await 语法糖",
        "Object.values 和 Object.entries",
        "Object.getOwnPropertyDescriptors0",
        "Rest/Spread 属性",
        "正则表达式命名捕获组",
        "正则表达式反向断言",
        "正则表达式",
        "ECMASript 10 新特性",
        "ECMASript 11 新特性"
      ],
      "excerpt": "ES6-11新特性-学习过程中记的笔记",
      "characterCount": 7426
    },
    {
      "id": "knife4j-online-api-docs",
      "title": "Knife在线API文档",
      "description": "Controller控制器Api注解配置",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/knife4j-online-api-docs/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/knife4j-online-api-docs.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/knife4j-online-api-docs.md",
      "category": "后端框架",
      "tags": [
        "Knife",
        "API"
      ],
      "headings": [
        "XML配置",
        "Controller控制器`Api`注解配置",
        "Knife4jConfiguration配置类"
      ],
      "excerpt": "Controller控制器Api注解配置",
      "characterCount": 140
    },
    {
      "id": "linux-commands-cloud-notes",
      "title": "Linux常用命令-Cloud",
      "description": "[root@rockylinux8 ~]# #表示超级权限，当前用户是管理员/root",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/linux-commands-cloud-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/linux-commands-cloud-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/linux-commands-cloud-notes.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "命令提示符",
        "命令格式",
        "目录相关的常见命令",
        "用户管理",
        "VIM",
        "vim模式",
        "命令模式(一般模式)",
        "编辑模式",
        "命令底行模式",
        "Docker",
        "image",
        "container",
        "repository",
        "docker使用",
        "验证docker是否启动",
        "镜像操作",
        "容器操作",
        "访问Docker服务",
        "酷鲨商城前台项目对虚拟机进行配置"
      ],
      "excerpt": "[root@rockylinux8 ~]# #表示超级权限，当前用户是管理员/root",
      "characterCount": 4804
    },
    {
      "id": "springcloud-gateway-notes",
      "title": "SpringCloudGateway(网关)",
      "description": "在微服务架构中，一个系统往往由多个微服务组成，而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下，客户端（例如浏览器、手机、软件工具等）想要直接请求这些服务，就需要知道它们具体的地址信息，例如 IP 地址、端口号等。",
      "published": "2026-09-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-gateway-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-gateway-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-gateway-notes.md",
      "category": "微服务与中间件",
      "tags": [
        "Gateway"
      ],
      "headings": [
        "Gateway：Spring Cloud API网关组件",
        "API 网关",
        "Spring Cloud Gateway",
        "Gateway 的工作流程",
        "Predicate 断言",
        "Spring Cloud Gateway 动态路由",
        "Filter 过滤器"
      ],
      "excerpt": "在微服务架构中，一个系统往往由多个微服务组成，而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下，客户端（例如浏览器、手机、软件工具等）想要直接请求这些服务，就需要知道它们具体的地址信息，例如 IP 地址、端口号等。",
      "characterCount": 7637
    },
    {
      "id": "linux-common-commands",
      "title": "Linux常用命令",
      "description": "我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制，当然，这也是很多人喜欢linux的原因，比较短小但却功能强大。我将我了解到的命令列举一下，仅供大家参考",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/linux-common-commands/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/linux-common-commands.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/linux-common-commands.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "Linux常用命令大全（非常全！！！）",
        "系统信息",
        "关机 (系统的关机、重启以及登出 )",
        "文件和目录",
        "文件搜索",
        "挂载一个文件系统",
        "磁盘空间",
        "用户和群组",
        "文件的权限 - 使用 \"+\" 设置权限，使用 \"-\" 用于取消",
        "文件的特殊属性 - 使用 \"+\" 设置权限，使用 \"-\" 用于取消",
        "打包和压缩文件",
        "RPM 包 - （Fedora, Redhat及类似系统）",
        "YUM 软件包升级器 - （Fedora, RedHat及类似系统）",
        "DEB 包 (Debian, Ubuntu 以及类似系统)",
        "APT 软件工具 (Debian, Ubuntu 以及类似系统)",
        "查看文件内容",
        "文本处理",
        "字符设置和文件格式转换",
        "文件系统分析",
        "初始化一个文件系统",
        "SWAP文件系统",
        "备份",
        "光盘",
        "网络 - （以太网和WIFI无线）",
        "JPS工具"
      ],
      "excerpt": "我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制，当然，这也是很多人喜欢linux的原因，比较短小但却功能强大。我将我了解到的命令列举一下，仅供大家参考",
      "characterCount": 14842
    },
    {
      "id": "linux-springboot-frontend-backend-deployment",
      "title": "部署教程springboot前后分离linux安装部署启动一条龙教程",
      "description": "视频非常详细，把下载软件安装过程都记录了，可以选择性快进观看",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/linux-springboot-frontend-backend-deployment/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/linux-springboot-frontend-backend-deployment.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/linux-springboot-frontend-backend-deployment.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "前后分离Linux安装部署",
        "系统环境需求",
        "新建目录",
        "JDK >= 1.8 (推荐1.8版本)",
        "Maven >= 3.0",
        "Git",
        "安装docker",
        "Mysql >= 5.7 (注意生产项目mysql都是独立部署)",
        "Redis",
        "Node.js",
        "Nginx 安装",
        "后端部署步骤",
        "前端部署步骤"
      ],
      "excerpt": "视频非常详细，把下载软件安装过程都记录了，可以选择性快进观看",
      "characterCount": 2295
    },
    {
      "id": "maven-pom-xml-config",
      "title": "Maven_pom.xml_常用配置",
      "description": "Maven pom.xml 常用配置",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/maven-pom-xml-config/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/maven-pom-xml-config.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/maven-pom-xml-config.md",
      "category": "后端框架",
      "tags": [
        "XML"
      ],
      "headings": [
        "Maven pom.xml 常用配置",
        "Spring Boot 相关",
        "Spring Cloud"
      ],
      "excerpt": "Maven pom.xml 常用配置",
      "characterCount": 977
    },
    {
      "id": "mq-kafka-cluster",
      "title": "Kafka集群MQ",
      "description": "Kafka是由Apache软件基金会开发的 一个开源流处理平台，由Scala语言编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。Kafka最初是由LinkedIn开发，2011年开源",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/mq-kafka-cluster/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/mq-kafka-cluster.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/mq-kafka-cluster.md",
      "category": "微服务与中间件",
      "tags": [
        "Kafka",
        "MQ"
      ],
      "headings": [
        "什么是kafka",
        "kafka集群结构",
        "kafka的特征和优势",
        "kafka的安装和配置",
        "启动kafka",
        "启动zookeeper",
        "启动kafka",
        "演示kafka"
      ],
      "excerpt": "Kafka是由Apache软件基金会开发的 一个开源流处理平台，由Scala语言编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。Kafka最初是由LinkedIn开发，2011年开源",
      "characterCount": 1159
    },
    {
      "id": "mq-message-queue-basics",
      "title": "消息队列MQ",
      "description": "消息队列是采用“异步(两个微服务并不需要同时完成请求)”的方式来传递数据完成业务操作流程的业务处理方式",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/mq-message-queue-basics/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/mq-message-queue-basics.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/mq-message-queue-basics.md",
      "category": "微服务与中间件",
      "tags": [
        "MQ"
      ],
      "headings": [
        "消息队列",
        "为什么要使用消息队列",
        "异步调用",
        "服务解耦",
        "流量削峰(削峰填谷)",
        "消息队列的特征(作用)",
        "消息队列异常处理",
        "常见消息队列软件"
      ],
      "excerpt": "消息队列是采用“异步(两个微服务并不需要同时完成请求)”的方式来传递数据完成业务操作流程的业务处理方式",
      "characterCount": 986
    },
    {
      "id": "mq-rabbitmq-notes",
      "title": "消息队列-RabbitMQ",
      "description": "双击运行otp_win64_24.3.4.6.exe，点击下一步下一步即可，可以更改安装位置，需要注意路径不要有中文或空格,他的作用类似JDK，因为rabbitMQ是erlang语言开发的，所以需要环境支持",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/mq-rabbitmq-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/mq-rabbitmq-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/mq-rabbitmq-notes.md",
      "category": "微服务与中间件",
      "tags": [
        "RabbitMQ"
      ],
      "headings": [
        "安装rabbitMQ",
        "rabbitMQ的基本概念",
        "Exchange",
        "Message Queue",
        "Binding Key",
        "Routing Key",
        "RabbitMQ六种工作模式",
        "简单模式",
        "生产者",
        "消费者",
        "工作队列模式",
        "生产者",
        "消费者",
        "合理分发",
        "持久化",
        "发布订阅模式",
        "生产者",
        "消费者",
        "路由模式",
        "生产者",
        "消费者",
        "主题模式",
        "生产者",
        "消费者",
        "RPC模式",
        "服务器",
        "客户端"
      ],
      "excerpt": "双击运行otp_win64_24.3.4.6.exe，点击下一步下一步即可，可以更改安装位置，需要注意路径不要有中文或空格,他的作用类似JDK，因为rabbitMQ是erlang语言开发的，所以需要环境支持",
      "characterCount": 2256
    },
    {
      "id": "mybatis-configuration-notes",
      "title": "Mybatis配置类",
      "description": "MybatisConfiguration配置类",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/mybatis-configuration-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/mybatis-configuration-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/mybatis-configuration-notes.md",
      "category": "后端框架",
      "tags": [
        "Mybatis"
      ],
      "headings": [
        "MybatisConfiguration配置类",
        "mapper包接口"
      ],
      "excerpt": "MybatisConfiguration配置类",
      "characterCount": 33
    },
    {
      "id": "nginx-common-operations",
      "title": "Nginx常用操作命令",
      "description": "本文介绍 Nginx 的常用操作命令：启动、停止、重载配置、查看状态等日常运维操作。",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/nginx-common-operations/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/nginx-common-operations.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/nginx-common-operations.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "Nginx超详细的常用操作命令",
        "服务启动命令",
        "默认启动方式",
        "指定配置文件",
        "查看服务是否启动成功",
        "停止服务命令",
        "信号量停止",
        "快速停止",
        "热加载命令"
      ],
      "excerpt": "本文介绍 Nginx 的常用操作命令：启动、停止、重载配置、查看状态等日常运维操作。",
      "characterCount": 1155
    },
    {
      "id": "nginx-install-config-tutorial",
      "title": "nginx安装及其配置详细教程",
      "description": "Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器。",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/nginx-install-config-tutorial/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/nginx-install-config-tutorial.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/nginx-install-config-tutorial.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "1 什么是nginx",
        "2 应用场景",
        "2 nginx安装",
        "2 安装要求的环境",
        "1.需要安装gcc环境",
        "1 PERE",
        "2 zlib",
        "3 openssl",
        "1 把nginx源码包上传到linux系统上",
        "2 解压到/usr/local下面",
        "执行下面的命令的时候，一定要进入到nginx-1.14.0目录里面去。",
        "注意：启动nginx之前，上边将临时文件目录指定为/var/temp/nginx，",
        "4 创建目录/var/temp/nginx/",
        "5 进入nginx-1.14.0里面执行make命令进行编译",
        "6 进入nginx-1.14.0里面执行make install 命令进行安装",
        "7 进入安装位置/usr/local/nginx查看目录结构",
        "3 启动nginx",
        "4 查看nginx是否启动",
        "5 关闭nginx",
        "6 重启nginx",
        "7 刷新配置文件",
        "8 关闭防火墙，开启远程访问",
        "方法一：永久开放80端口",
        "特殊：针对阿里云",
        "9 访问nginx",
        "10 配置虚拟主机",
        "11 通过端口区分不同的主机",
        "1 什么是域名",
        "2 nginx配置",
        "3 测试",
        "13 正向代理",
        "14 反向代理",
        "15 nginx实现反向代理",
        "16 负载均衡",
        "17 设置nginx开机自启动（centos6.5）",
        "第二步：在创建的nginx文件中加入下面的内容",
        "vim /etc/init.d/nginx",
        "第三步：设置nginx文件的权限",
        "第四步：管理脚本",
        "2 使用chkconfig管理",
        "第一步：将nginx服务加入chkconfig管理列表",
        "第二步：使用service管理服务",
        "第三步：设置终端模式开机启动",
        "第一步：进入到/lib/systemd/system/目录",
        "vim nginx.service",
        "第三步：加入开机自启动",
        "第四步：服务的启动/停止/刷新配置文件/查看状态",
        "Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.",
        "1 故障现场",
        "第一步：进入 cd /usr/local/nginx/conf/ 目录，编辑配置文件nginx.conf ；",
        "第二步：创建目录/var/run/nginx/",
        "第三步：启动nginx服务",
        "[emerg] open() \"/var/run/nginx/nginx.pid\" failed (2: No such file or directory)处理",
        "第一步：进入 cd /usr/local/nginx/conf/ 目录，编辑配置文件nginx.conf ；",
        "第二步：在/usr/local/nginx目录下建立logs文件夹",
        "第三步：把/var/run/nginx/目录下的nginx.pid这个文件拷贝到第二步创建的logs文件夹里面。",
        "第四步：把logs这个文件夹在conf下也拷贝一份",
        "第五步：修改权限/usr/local/nginx/logs/目录下面的nginx.pid文件的权限。",
        "第六步：重启reboot",
        "第六步：启动nginx",
        "简单解决方案",
        "第一步：进入 cd /usr/local/nginx/conf/ 目录，编辑配置文件nginx.conf ；",
        "第二步：保证肯定有这个路径，可以直接创建一下这个配置的目录",
        "第三步：刷新配置文件"
      ],
      "excerpt": "Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器。",
      "characterCount": 6159
    },
    {
      "id": "nginx-quick-start",
      "title": "Nginx快速入门",
      "description": "并发量小，用户使用的少，所以在低并发的情况下，一个jar包启动应用就够了，然后内部tomcat返回内容给用户。",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/nginx-quick-start/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/nginx-quick-start.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/nginx-quick-start.md",
      "category": "运维部署",
      "tags": [],
      "headings": [
        "公司产品出现瓶颈？",
        "什么是Nginx？",
        "Nginx作用？",
        "windows下安装",
        "linux下安装",
        "Nginx常用命令",
        "演示"
      ],
      "excerpt": "并发量小，用户使用的少，所以在低并发的情况下，一个jar包启动应用就够了，然后内部tomcat返回内容给用户。",
      "characterCount": 2430
    },
    {
      "id": "plc-siemens-scl-basics",
      "title": "西门子SCL基础语法",
      "description": "SCL是西门子PLC的结构化文本编程语言",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/plc-siemens-scl-basics/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/plc-siemens-scl-basics.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/plc-siemens-scl-basics.md",
      "category": "工业自动化",
      "tags": [
        "TIA"
      ],
      "headings": [
        "一、SCL 基础认知",
        "1. 变量声明（最基础也是最核心）",
        "2. 基本运算与逻辑判断",
        "3. 循环语句",
        "4. 数据块（DB）操作",
        "5. 函数 / 功能块调用",
        "三、完整实战示例（生产线计数 + 速度控制）",
        "四、SCL 编程注意事项"
      ],
      "excerpt": "SCL是西门子PLC的结构化文本编程语言",
      "characterCount": 2195
    },
    {
      "id": "rabbitmq-erlang-install-tutorial",
      "title": "安装Erlang和RabbitMQ详细教程",
      "description": "RabbitMQ是实现了高级消息队列协议（AMQP）的开源消息代理软件（亦称面向消息的中间件）。RabbitMQ服务器是用Erlang语言编写的，而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/rabbitmq-erlang-install-tutorial/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/rabbitmq-erlang-install-tutorial.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/rabbitmq-erlang-install-tutorial.md",
      "category": "微服务与中间件",
      "tags": [
        "RabbitMQ",
        "Erlang"
      ],
      "headings": [
        "[RabbitMQ](https://so.csdn.net/so/search?q=RabbitMQ&spm=1001.2101.3001.7020)简介",
        "2、基本概念",
        "2.1、RabbitMQ服务支持下列操作系统：",
        "2.2、RabbitMQ支持下列编程语言：",
        "2.3、主要特性",
        "2.4、友情提醒",
        "3、安装Erlang",
        "3、安装RabbitMQ",
        "4、配置插件（关键步骤）",
        "4.1、插件安装方式",
        "4.2、常见问题"
      ],
      "excerpt": "RabbitMQ是实现了高级消息队列协议（AMQP）的开源消息代理软件（亦称面向消息的中间件）。RabbitMQ服务器是用Erlang语言编写的，而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。",
      "characterCount": 2216
    },
    {
      "id": "redis-cache-breakdown",
      "title": "Redis缓存击穿",
      "description": "非关系数据库，基于内存存储，存储方式是k-v",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/redis-cache-breakdown/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/redis-cache-breakdown.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/redis-cache-breakdown.md",
      "category": "微服务与中间件",
      "tags": [
        "Redis"
      ],
      "headings": [
        "Redis",
        "缓存使用原则",
        "缓存淘汰策略",
        "缓存穿透",
        "缓存击穿",
        "缓存雪崩",
        "Redis持久化",
        "RDB",
        "AOF",
        "Redis存储原理",
        "Redis集群",
        "主从复制",
        "读写分离",
        "哨兵模式",
        "哨兵集群",
        "分片集群"
      ],
      "excerpt": "非关系数据库，基于内存存储，存储方式是k-v",
      "characterCount": 2829
    },
    {
      "id": "redis-flash-sale-design",
      "title": "秒杀",
      "description": "布隆过滤器能够实现使用较少的空间来判断一个指定的元素是否包含在一个集合中",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/redis-flash-sale-design/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/redis-flash-sale-design.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/redis-flash-sale-design.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "什么是布隆过滤器",
        "为什么使用布隆过滤器",
        "布隆过滤器原理",
        "设计布隆过滤器",
        "测试布隆过滤器",
        "完善秒杀功能",
        "布隆过滤器判断spuId是否存在",
        "什么是配置中心",
        "配置中心",
        "Nacos数据结构",
        "命名空间",
        "分组",
        "服务或配置",
        "从配置中心读取配置",
        "前端项目"
      ],
      "excerpt": "布隆过滤器能够实现使用较少的空间来判断一个指定的元素是否包含在一个集合中",
      "characterCount": 2980
    },
    {
      "id": "spring-container-cheatsheet",
      "title": "Spring容器学习小抄",
      "description": "在 Spring 应用中，所有组件都被 以 Bean 的方式管理，Spring 负责创建 Bean 实例，并管理他们的生命周期。Bean 在 Spring 容器中运行，无须感受 Spring 容器的存在，一样可以接受 Spring 的依赖注入。",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-container-cheatsheet/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-container-cheatsheet.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-container-cheatsheet.md",
      "category": "后端框架",
      "tags": [
        "Java"
      ],
      "headings": [
        "BeanFactory",
        "组件注册",
        "生命周期"
      ],
      "excerpt": "在 Spring 应用中，所有组件都被 以 Bean 的方式管理，Spring 负责创建 Bean 实例，并管理他们的生命周期。Bean 在 Spring 容器中运行，无须感受 Spring 容器的存在，一样可以接受 Spring 的依赖注入。",
      "characterCount": 4334
    },
    {
      "id": "spring-gateway-usage",
      "title": "SpringGateway",
      "description": "Spring Gateway不是一个软件，而是一个依赖，所以我们要使用它需要创建一个Spring Boot项目",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-gateway-usage/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-gateway-usage.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-gateway-usage.md",
      "category": "微服务与中间件",
      "tags": [
        "Gateway"
      ],
      "headings": [
        "简单网关演示",
        "创建gateway项目",
        "创建beijing项目",
        "创建shanghai项目",
        "通过gateway项目访问其他服务",
        "测试",
        "gateway内置断言",
        "时间相关的断言",
        "要求指定请求参数",
        "内置过滤器",
        "动态路由"
      ],
      "excerpt": "Spring Gateway不是一个软件，而是一个依赖，所以我们要使用它需要创建一个Spring Boot项目",
      "characterCount": 1561
    },
    {
      "id": "spring-mvc-design-pattern",
      "title": "MVC设计模式",
      "description": "把实现一个业务的代码划分为三部分 , 分别是 : 页面相关(V),业务逻辑相关(C),数据相关(M)",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-mvc-design-pattern/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-mvc-design-pattern.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-mvc-design-pattern.md",
      "category": "后端框架",
      "tags": [
        "SpringMVC",
        "SpringBoot"
      ],
      "headings": [
        "后端的MVC设计模式",
        "今天任务 :",
        "前后端分离",
        "商品管理添加商品步骤:",
        "index.html",
        "insert.html",
        "list.html",
        "ProductController",
        "Product",
        "ProductMapper",
        "JSON",
        "list.html中添加删除部分代码",
        "ProductController",
        "ProductMapper",
        "商品管理删除商品步骤:",
        "list.html",
        "update.html",
        "ProductController",
        "ProductMapper",
        "商品管理修改商品步骤:",
        "文件上传",
        "UploadController",
        "微博练习步骤",
        "注册功能 : reg.html",
        "UserController",
        "UserMapper",
        "登录功能 : login.html",
        "UserController",
        "登录成功后,除了页面显示不同外,还需要显示用户名 : index.html",
        "UserController",
        "如何通过Session对象记住登录状态",
        "会话管理",
        "insert.html (发布微博页面)",
        "WeiboController",
        "Weibo",
        "WeiboMapper",
        "index.html",
        "WeiboController",
        "WeiboMapper",
        "酷鲨商城项目步骤 :",
        "登录功能步骤:",
        "首页轮播图展示步骤：",
        "后台管理页面分类管理步骤",
        "添加分类步骤:",
        "管理页面轮播图展示",
        "删除轮播图",
        "网站图标favicon.ico",
        "删除轮播图同时删除文件"
      ],
      "excerpt": "把实现一个业务的代码划分为三部分 , 分别是 : 页面相关(V),业务逻辑相关(C),数据相关(M)",
      "characterCount": 5051
    },
    {
      "id": "spring-mvc-mybatis-notes",
      "title": "Mybatis框架",
      "description": "此框架是目前最流行的数据持久层框架 , 是对JDBC代码进行了封装 , 程序员只需要通过注解或配置文件的方式提供需要执行的SQL语句 , 框架会自动根据SQL语句生成出JDBC代码 , 从而提高执行效率",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-mvc-mybatis-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-mvc-mybatis-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-mvc-mybatis-notes.md",
      "category": "后端框架",
      "tags": [
        "Mybatis",
        "SSM"
      ],
      "headings": [
        "Mybatis",
        "创建index页面",
        "创建add页面",
        "创建delete页面",
        "HeroMapper",
        "创建update页面",
        "创建HeroController",
        "Mybatis框架添加英雄步骤:",
        "删除英雄步骤:",
        "修改英雄步骤:",
        "查询英雄步骤:",
        "商品表的增删改查",
        "同步请求和异步请求",
        "客户端发出请求的几种方式",
        "客户端如何发出异步请求",
        "AxiosController",
        "Get请求和Post请求",
        "注册登录步骤 :",
        "index.html",
        "reg.html",
        "login.html",
        "UserController",
        "User实体类",
        "UserMapper"
      ],
      "excerpt": "此框架是目前最流行的数据持久层框架 , 是对JDBC代码进行了封装 , 程序员只需要通过注解或配置文件的方式提供需要执行的SQL语句 , 框架会自动根据SQL语句生成出JDBC代码 , 从而提高执行效率",
      "characterCount": 3689
    },
    {
      "id": "spring-quartz-notes",
      "title": "Quartz",
      "description": "Quartz是java编写的，使用时直接导入依赖即可",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-quartz-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-quartz-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-quartz-notes.md",
      "category": "微服务与中间件",
      "tags": [
        "Quartz"
      ],
      "headings": [
        "Quartz",
        "为什么需要Quartz",
        "Quartz核心组件",
        "Cron表达式",
        "SpringBoot使用Quartz"
      ],
      "excerpt": "Quartz是java编写的，使用时直接导入依赖即可",
      "characterCount": 1483
    },
    {
      "id": "spring-security-xml-dependencies",
      "title": "SpringSecurity开发XML依赖",
      "description": "SpringSecurity依赖",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/spring-security-xml-dependencies/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/spring-security-xml-dependencies.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/spring-security-xml-dependencies.md",
      "category": "后端框架",
      "tags": [
        "SSM",
        "Validation",
        "XML"
      ],
      "headings": [
        "SpringSecurity依赖"
      ],
      "excerpt": "SpringSecurity依赖",
      "characterCount": 16
    },
    {
      "id": "springboot-quickstart-notes",
      "title": "SpringBoot",
      "description": "第一个页面中可以修改创建工程的网址",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springboot-quickstart-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springboot-quickstart-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springboot-quickstart-notes.md",
      "category": "后端框架",
      "tags": [
        "SpringBoot"
      ],
      "headings": [
        "如何创建SpringBoot工程",
        "Web服务软件做了那些事儿?",
        "SSM三大框架",
        "SpringBoot框架",
        "客户端发出请求的几种方式",
        "创建新项目boot2-1",
        "HelloController",
        "index.html",
        "HelloController",
        "index.html",
        "创建实体类Emp",
        "static目录下创建reg.html",
        "UserController",
        "创建实体类User",
        "工程中使用数据库需要做的几件事:",
        "UserController",
        "login.html"
      ],
      "excerpt": "第一个页面中可以修改创建工程的网址",
      "characterCount": 1487
    },
    {
      "id": "springboot-rabbitmq-integration",
      "title": "RabbitMQ整合SpringBoot项目",
      "description": "RabbitMQ整合Spring Boot项目",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springboot-rabbitmq-integration/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springboot-rabbitmq-integration.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springboot-rabbitmq-integration.md",
      "category": "微服务与中间件",
      "tags": [
        "RabbitMQ",
        "SpringBoot"
      ],
      "headings": [
        "RabbitMQ整合Spring Boot项目",
        "准备流控和降级的处理类",
        "开发业务层",
        "开发控制层",
        "开发持久层",
        "开发消息的接收功能"
      ],
      "excerpt": "RabbitMQ整合Spring Boot项目",
      "characterCount": 1158
    },
    {
      "id": "springcloud-dubbo-rpc",
      "title": "Dubbo服务之间进行调用",
      "description": "RPC是Remote Procedure Call的缩写，翻译为：远程过程调用",
      "published": "2026-09-18T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-dubbo-rpc/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-dubbo-rpc.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-dubbo-rpc.md",
      "category": "微服务与中间件",
      "tags": [
        "Dubbo"
      ],
      "headings": [
        "服务之间进行调用",
        "Dubbo",
        "dubbo对协议的支持",
        "Dubbo服务的注册与发现",
        "Dubbo实现微服务调用",
        "测试dubbo是否可以使用",
        "配置business",
        "Dubbo生产者消费者配置小结",
        "配置stock集群的高可用",
        "负载均衡",
        "Dubbo内置负载均衡策略",
        "权重平滑策略",
        "活跃度自动感知",
        "一致性hash算法"
      ],
      "excerpt": "RPC是Remote Procedure Call的缩写，翻译为：远程过程调用",
      "characterCount": 4525
    },
    {
      "id": "springcloud-elasticsearch-docs",
      "title": "ElasticSearch文档",
      "description": "PUT http://localhost:9200/questions",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-elasticsearch-docs/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-elasticsearch-docs.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-elasticsearch-docs.md",
      "category": "微服务与中间件",
      "tags": [
        "ElasticSearch"
      ],
      "headings": [
        "ES文档"
      ],
      "excerpt": "PUT http://localhost:9200/questions",
      "characterCount": 4
    },
    {
      "id": "springcloud-nacos-registry",
      "title": "Nacos注册中心",
      "description": "常用的注册中心有：nacos、eureka、zookeeper、consul",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-nacos-registry/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-nacos-registry.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-nacos-registry.md",
      "category": "微服务与中间件",
      "tags": [
        "Nacos"
      ],
      "headings": [
        "注册中心",
        "CAP理论",
        "Nacos",
        "idea中配置`nacos`",
        "配置nacos的客户端",
        "搭建高可用集群",
        "Nacos常见面试题",
        "Nacos的保护阈值"
      ],
      "excerpt": "常用的注册中心有：nacos、eureka、zookeeper、consul",
      "characterCount": 1915
    },
    {
      "id": "springcloud-seata-transactions",
      "title": "Seata事务",
      "description": "原子性、一致性、隔离性、永久性",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-seata-transactions/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-seata-transactions.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-seata-transactions.md",
      "category": "微服务与中间件",
      "tags": [
        "Seata"
      ],
      "headings": [
        "事务",
        "Seata",
        "Seata的运行原理(AT模式)",
        "AT模式的运行过程",
        "TCC模式",
        "SAGA模式",
        "XA模式",
        "使用Seata"
      ],
      "excerpt": "原子性、一致性、隔离性、永久性",
      "characterCount": 1665
    },
    {
      "id": "springcloud-sentinel-flow-control",
      "title": "Sentinel限制并发数",
      "description": "随着微服务的流行，服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点，从流量控制、熔断、降级、系统负载保护等多个维度保护服务的稳定性",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-sentinel-flow-control/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-sentinel-flow-control.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-sentinel-flow-control.md",
      "category": "微服务与中间件",
      "tags": [
        "Sentinel"
      ],
      "headings": [
        "Sentinel",
        "为什么需要Sentinel",
        "基本配置和限流效果",
        "启动sentinel",
        "QPS和并发线程数",
        "自定义限流方法和降级方法"
      ],
      "excerpt": "随着微服务的流行，服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点，从流量控制、熔断、降级、系统负载保护等多个维度保护服务的稳定性",
      "characterCount": 979
    },
    {
      "id": "springcloud-sentinel-idea-launch",
      "title": "在idea中启动Sentinel",
      "description": "其中-jar后后面为自己的sentinelde 的jar包路径自行修改及版本号",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-sentinel-idea-launch/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-sentinel-idea-launch.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-sentinel-idea-launch.md",
      "category": "微服务与中间件",
      "tags": [
        "Sentinel",
        "IDEA"
      ],
      "headings": [
        "如何在idea中启动[sentinel](https://so.csdn.net/so/search?q=sentinel&spm=1001.2101.3001.7020)",
        "一、找到Edit Configurations(两种方式)，并在里面的Shell Script中进行添加",
        "二、配置方法有两个(Scrip file,Script text) 可能会因idea版本的不同配置选择方式不一致",
        "三、启动并访问sentinel",
        "附加：以命令行的方式启动sentinel"
      ],
      "excerpt": "其中-jar后后面为自己的sentinelde 的jar包路径自行修改及版本号",
      "characterCount": 661
    },
    {
      "id": "springcloud-zookeeper-notes",
      "title": "Zookeeper",
      "description": "zookeeper是Yahoo开发的后来贡献给了Apache，是用于分布式管理和协调的框架。",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/springcloud-zookeeper-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-zookeeper-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/springcloud-zookeeper-notes.md",
      "category": "微服务与中间件",
      "tags": [
        "Zookeeper"
      ],
      "headings": [
        "概述",
        "单机模式",
        "伪分布式模式",
        "完全分布式模式",
        "单机",
        "ZK特点",
        "ZK命令",
        "ZK节点详情",
        "ZK节点类型",
        "ZK的API",
        "搭建ZK集群",
        "配置zoo.cfg",
        "配置myid",
        "启动集群",
        "kafka配置外置的zookeeper集群",
        "ZK集群选举",
        "过半存活的优点",
        "观察者"
      ],
      "excerpt": "zookeeper是Yahoo开发的后来贡献给了Apache，是用于分布式管理和协调的框架。",
      "characterCount": 2969
    },
    {
      "id": "sql-database-common-methods",
      "title": "数据库常用方法",
      "description": "从开始菜单中找到MySQL/MariaDB-->MySQL Client 打开客户端 , 输入自己的密码显示Welcome ..... 说明建立好了连接",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/sql-database-common-methods/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/sql-database-common-methods.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/sql-database-common-methods.md",
      "category": "数据库",
      "tags": [
        "JDBC",
        "MariaDB",
        "SQL"
      ],
      "headings": [
        "数据库MySQL",
        "数据库相关",
        "表相关",
        "添加表字段",
        "数据相关",
        "往表中插入数据",
        "批量插入格式",
        "主键约束",
        "数据类型",
        "聚合函数",
        "分组查询group by",
        "having关键字",
        "各个关键字的顺序",
        "子查询(嵌套查询)",
        "关联查询",
        "等值连接",
        "内连接",
        "外连接",
        "关联查询总结",
        "清除空格符"
      ],
      "excerpt": "从开始菜单中找到MySQL/MariaDB-->MySQL Client 打开客户端 , 输入自己的密码显示Welcome ..... 说明建立好了连接",
      "characterCount": 4226
    },
    {
      "id": "sql-jdbc-notes",
      "title": "JDBC",
      "description": "Java DataBase Connectivity: Java数据库连接",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/sql-jdbc-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/sql-jdbc-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/sql-jdbc-notes.md",
      "category": "数据库",
      "tags": [
        "MariaDB",
        "JDBC"
      ],
      "headings": [
        "JDBC",
        "添加cn.tedu.Demo01",
        "创建Demo02",
        "Statement执行SQL语句的对象",
        "创建Demo03",
        "创建DBUtils",
        "创建Demo04",
        "创建Demo05",
        "创建Demo06",
        "创建Demo07",
        "数据库连接池DBCP",
        "创建Demo08",
        "DBUtils优化1",
        "DBUtils优化2",
        "注册登录",
        "创建Demo09",
        "创建Demo10",
        "Demo10优化",
        "创建Demo11",
        "创建Demo12"
      ],
      "excerpt": "Java DataBase Connectivity: Java数据库连接",
      "characterCount": 1193
    },
    {
      "id": "sql-mybatis-plus-notes",
      "title": "MyBatisPlus",
      "description": "需要的基础：把我的MyBatis、Spring、SpringMVC就可以学习这个了！",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/sql-mybatis-plus-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/sql-mybatis-plus-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/sql-mybatis-plus-notes.md",
      "category": "数据库",
      "tags": [
        "MyBatisPlus",
        "SQL"
      ],
      "headings": [
        "MyBatisPlus概述",
        "特性",
        "快速入门",
        "配置日志",
        "插入操作",
        "主键生成策略",
        "更新操作",
        "自动填充",
        "乐观锁",
        "查询操作",
        "分页查询",
        "删除操作",
        "逻辑删除",
        "性能分析插件",
        "条件构造器",
        "代码自动生成器"
      ],
      "excerpt": "需要的基础：把我的MyBatis、Spring、SpringMVC就可以学习这个了！",
      "characterCount": 3435
    },
    {
      "id": "sql-mysql-install-service-denied",
      "title": "安装 MySQL 服务时提示 Install/Remove of the Service Denied",
      "description": "安装 MySQL 服务时提示 Install/Remove of the Service Denied",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/sql-mysql-install-service-denied/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/sql-mysql-install-service-denied.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/sql-mysql-install-service-denied.md",
      "category": "数据库",
      "tags": [
        "SQL"
      ],
      "headings": [
        "1.1 问题",
        "1.2 没有 MySQL 服务的时候",
        "2. 解决方法"
      ],
      "excerpt": "安装 MySQL 服务时提示 Install/Remove of the Service Denied",
      "characterCount": 407
    },
    {
      "id": "ssm-mybatis-framework",
      "title": "Mybatis框架",
      "description": "Mybatis框架解决了数据库编程相关的问题，主要是简化了数据库编程。",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-mybatis-framework/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-mybatis-framework.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-mybatis-framework.md",
      "category": "后端框架",
      "tags": [
        "Mybatis",
        "SSM"
      ],
      "headings": [
        "关于Mybatis框架",
        "使用Mybatis框架",
        "连接数据库的配置",
        "关于id",
        "关于编码",
        "关于字符串的字段类型",
        "使用Mybatis时定义的抽象方法",
        "关于@Mapper和@MapperScan",
        "使用Mybatis实现插入数据",
        "练习",
        "使用Mybatis实现删除数据",
        "练习",
        "使用Mybatis实现修改数据",
        "练习",
        "使用Mybatis实现批量删除数据",
        "使用Mybatis实现动态SQL的修改数据",
        "统计查询",
        "指定条件的单一结果查询",
        "查询列表",
        "关于`<sql>`与`<resultMap>`",
        "练习",
        "课后作业",
        "自动更新gmt_create和gmt_modified的Mybatis拦截器"
      ],
      "excerpt": "Mybatis框架解决了数据库编程相关的问题，主要是简化了数据库编程。",
      "characterCount": 7645
    },
    {
      "id": "ssm-redis-notes",
      "title": "Redis",
      "description": "Redis是一款基于内存存储的、使用类似于Map结构的NoSQL数据库。",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-redis-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-redis-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-redis-notes.md",
      "category": "微服务与中间件",
      "tags": [
        "SpringBoot",
        "SSM",
        "Redis"
      ],
      "headings": [
        "关于Redis",
        "Redis的简单操作",
        "Redis编程",
        "关于Key的使用",
        "关于Redis的应用场景",
        "关于ApplicationRunner",
        "计划任务"
      ],
      "excerpt": "Redis是一款基于内存存储的、使用类似于Map结构的NoSQL数据库。",
      "characterCount": 2083
    },
    {
      "id": "ssm-spring-framework",
      "title": "Spring框架",
      "description": "在使用Spring框架后，当需要某个对象时，直接通过Spring获取对象即可。",
      "published": "2026-09-17T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-spring-framework/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-framework.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-framework.md",
      "category": "后端框架",
      "tags": [
        "SSM",
        "Java"
      ],
      "headings": [
        "**Spring框架**",
        "练习",
        "自动装配",
        "练习",
        "Spring Bean的作用域",
        "Spring IoC与DI",
        "小结",
        "组件扫描",
        "Spring AOP",
        "定义切面的语法",
        "项目中使用AOP",
        "关于@Autowired注解与@Resource注解的区别",
        "自动装配的名称"
      ],
      "excerpt": "在使用Spring框架后，当需要某个对象时，直接通过Spring获取对象即可。",
      "characterCount": 5933
    },
    {
      "id": "ssm-lombok-slf4j-knife4j",
      "title": "Lombok&SLF4J&Knife4J",
      "description": "Lombok是一个可以在编译期生成Setters & Getters、hashCode() & equals()、toString()等代码的框架。",
      "published": "2026-09-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-lombok-slf4j-knife4j/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-lombok-slf4j-knife4j.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-lombok-slf4j-knife4j.md",
      "category": "后端框架",
      "tags": [
        "Lombok",
        "SLF4J",
        "Knife4J",
        "SSM"
      ],
      "headings": [
        "关于Lombok",
        "添加依赖",
        "简单的使用",
        "关于Lombok插件",
        "使用争议",
        "为什么要使用日志",
        "日志的基本使用",
        "日志的级别",
        "日志的优点",
        "关于SLF4j与其它日志框架",
        "基本介绍",
        "在项目中添加依赖",
        "在配置文件中开启增强模式",
        "自定义配置类，实现必要的配置",
        "使用",
        "详细配置"
      ],
      "excerpt": "Lombok是一个可以在编译期生成Setters & Getters、hashCode() & equals()、toString()等代码的框架。",
      "characterCount": 2427
    },
    {
      "id": "ssm-spring-mvc-notes",
      "title": "SpringMVC",
      "description": "Spring MVC是基于Spring框架基础之上的，主要解决了后端服务器接收客户端提交的请求，并给予响应的相关问题。",
      "published": "2026-09-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-spring-mvc-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-mvc-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-mvc-notes.md",
      "category": "后端框架",
      "tags": [
        "Spring",
        "SpringBoot",
        "Java",
        "SSM"
      ],
      "headings": [
        "关于Spring MVC",
        "简单的接收请求",
        "关于响应正文",
        "关于@RequestMapping",
        "练习",
        "接收请求参数",
        "关于POJO规范",
        "关于POJO类的命名",
        "小结",
        "练习",
        "RESTful"
      ],
      "excerpt": "Spring MVC是基于Spring框架基础之上的，主要解决了后端服务器接收客户端提交的请求，并给予响应的相关问题。",
      "characterCount": 4325
    },
    {
      "id": "ssm-spring-security-notes",
      "title": "Security",
      "description": "在使用Spring框架后，当需要某个对象时，直接通过Spring获取对象即可。",
      "published": "2026-09-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-spring-security-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-security-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-security-notes.md",
      "category": "后端框架",
      "tags": [
        "SpringBoot",
        "Security",
        "SSM"
      ],
      "headings": [
        "练习",
        "自动装配",
        "练习",
        "Spring Bean的作用域",
        "Spring IoC与DI",
        "小结",
        "组件扫描",
        "Spring AOP",
        "定义切面的语法",
        "项目中使用AOP",
        "关于@Autowired注解与@Resource注解的区别",
        "自动装配的名称"
      ],
      "excerpt": "在使用Spring框架后，当需要某个对象时，直接通过Spring获取对象即可。",
      "characterCount": 6437
    },
    {
      "id": "ssm-spring-validation",
      "title": "SpringValidation",
      "description": "Spring Validation的主要作用是检查请求参数的基本格式。",
      "published": "2026-09-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-spring-validation/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-validation.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-spring-validation.md",
      "category": "后端框架",
      "tags": [
        "Validation",
        "SpringBoot",
        "SSM"
      ],
      "headings": [
        "Spring Validation的作用",
        "关于检查请求参数",
        "添加依赖",
        "基本使用",
        "处理异常",
        "关于检查参数格式的注解"
      ],
      "excerpt": "Spring Validation的主要作用是检查请求参数的基本格式。",
      "characterCount": 1691
    },
    {
      "id": "ssm-xml-dependencies",
      "title": "SSM开发模式XML依赖",
      "description": "SSM开发XML依赖",
      "published": "2026-09-11T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ssm-xml-dependencies/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ssm-xml-dependencies.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ssm-xml-dependencies.md",
      "category": "后端框架",
      "tags": [
        "SpringBoot",
        "XML",
        "SSM"
      ],
      "headings": [
        "SSM开发XML依赖"
      ],
      "excerpt": "SSM开发XML依赖",
      "characterCount": 10
    },
    {
      "id": "vue3-notes",
      "title": "Vue3",
      "description": "Vue3学习过程中的笔记",
      "published": "2026-09-11T00:00:00.000Z",
      "updated": "2026-08-26T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/vue3-notes/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/vue3-notes.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/vue3-notes.md",
      "category": "前端开发",
      "tags": [
        "Vue",
        "JavaScript"
      ],
      "headings": [
        "Vue3",
        "1.Vue3简介",
        "1.性能的提升",
        "2.源码的升级",
        "3.拥抱TypeScript",
        "4.新的特性",
        "1.使用 vue-cli 创建",
        "2.使用 vite 创建",
        "二、常用 Composition API",
        "1.拉开序幕的setup",
        "2.ref函数",
        "3.reactive函数",
        "vue2.x的响应式",
        "Vue3.0的响应式",
        "5.reactive对比ref",
        "6.setup的两个注意点",
        "1.computed函数",
        "2.watch函数",
        "3.watchEffect函数",
        "8.生命周期",
        "9.自定义hook函数",
        "10.toRef",
        "1.shallowReactive 与 shallowRef",
        "2.readonly 与 shallowReadonly",
        "3.toRaw 与 markRaw",
        "4.customRef",
        "5.provide 与 inject",
        "6.响应式数据的判断",
        "1.Options API 存在的问题",
        "2.Composition API 的优势",
        "1.Fragment",
        "2.Teleport",
        "3.Suspense",
        "1.全局API的转移",
        "2.其他改变"
      ],
      "excerpt": "Vue3学习过程中的笔记",
      "characterCount": 5640
    },
    {
      "id": "ai-rag-ten-strategies",
      "title": "RAG 策略",
      "description": "按 RAG 两阶段流程整理 10 种检索增强生成策略：语义分块、命题分块、领域 Embedding、元数据索引、Graph RAG、查询改写、HyDE、混合检索、重排序与 Agentic RAG，并给出新项目默认选型、实现骨架与升级触发条件。",
      "published": "2026-08-27T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-rag-ten-strategies/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-rag-ten-strategies.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-rag-ten-strategies.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "一、引子：RAG 死了吗",
        "二、RAG 总体流程",
        "策略 1：语义分块（Semantic Chunking）",
        "分块增强：上下文增强（Contextual Retrieval）",
        "策略 2：命题分块（Proposition Chunking）",
        "策略 3：领域特化 Embedding",
        "策略 4：结构化索引与元数据过滤",
        "策略 5：Graph RAG（图结构检索）",
        "策略 6：查询改写（Query Transformation）",
        "策略 7：假设文档检索（HyDE）",
        "策略 8：混合检索（Hybrid Search）",
        "策略 9：重排序（Re-ranking）",
        "五、范式升级：策略 10 与组合策略",
        "策略 10：Agentic RAG",
        "组合策略：自适应路由（Adaptive Routing）",
        "六、十种策略速览与选型",
        "七、质量与工程考量",
        "八、结语",
        "九、参考资料"
      ],
      "excerpt": "按 RAG 两阶段流程整理 10 种检索增强生成策略：语义分块、命题分块、领域 Embedding、元数据索引、Graph RAG、查询改写、HyDE、混合检索、重排序与 Agentic RAG，并给出新项目默认选型、实现骨架与升级触发条件。",
      "characterCount": 12618
    },
    {
      "id": "projects-miside-3d-text",
      "title": "米塔3D字体网页端实现",
      "description": "使用 React Three Fiber、Three.js、SDF Text 和 Rapier 实现仿 Miside 3D 字体物理动画，涵盖字形分割、状态机、相机视差和移动端性能。",
      "published": "2026-08-01T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-miside-3d-text/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-miside-3d-text.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-miside-3d-text.md",
      "category": "前端开发",
      "tags": [
        "React"
      ],
      "headings": [
        "技术栈",
        "架构总览",
        "1. 字形分割 — Intl.Segmenter",
        "2. 确定性随机 — 种子哈希 + Fisher-Yates",
        "3. 排版 — 锚点居中 + 自动换行",
        "4. 时序状态机 — 四阶段生命周期",
        "5. 物理模拟 — Rapier 集成",
        "6. 相机朝向",
        "7. 响应式与可访问性",
        "8. 懒加载与错误边界",
        "core.ts — 纯函数层",
        "layer.tsx — 懒加载门面",
        "physics.tsx — 物理渲染层",
        "集成方式",
        "1. Intl.Segmenter 兼容性",
        "2. Rapier 物理性能",
        "3. 字体预热",
        "4. Camera 与布局",
        "5. 状态更新的竞态",
        "性能对比",
        "总结"
      ],
      "excerpt": "使用 React Three Fiber、Three.js、SDF Text 和 Rapier 实现仿 Miside 3D 字体物理动画，涵盖字形分割、状态机、相机视差和移动端性能。",
      "characterCount": 1944
    },
    {
      "id": "ai-prompt-collection",
      "title": "日常Prompt提示词收录",
      "description": "收录 AI 辅助前端开发的 Prompt 模板，覆盖目录结构、组件复用、命名规范、依赖约束、样式管理、测试和代码审查要求。",
      "published": "2026-06-19T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-prompt-collection/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-prompt-collection.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-prompt-collection.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "1、前端",
        "1、逆向",
        "2、角色设定图",
        "3、画风",
        "4、质量",
        "5、滤镜",
        "6、降噪",
        "7、反向提示词",
        "8、图生图，替换人物"
      ],
      "excerpt": "收录 AI 辅助前端开发的 Prompt 模板，覆盖目录结构、组件复用、命名规范、依赖约束、样式管理、测试和代码审查要求。",
      "characterCount": 175
    },
    {
      "id": "ai-openspec-superpowers-workflow",
      "title": "OpenSpec+Superpowers 实现流水线开发",
      "description": "介绍 OpenSpec 与 Superpowers 的职责边界、安装配置和协同流程，建立从需求规范、任务实现到测试审查的 AI 编程工作流。",
      "published": "2026-06-03T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-openspec-superpowers-workflow/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-openspec-superpowers-workflow.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-openspec-superpowers-workflow.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "一、介绍",
        "1、Superpowers",
        "2、OpenSpec",
        "1、Superpowers 的功能特性与应用场景",
        "2、OpenSpec 的功能特性与应用场景",
        "1、Superpowers 使用步骤",
        "2、OpenSpec 使用步骤",
        "1、Superpowers 子技能",
        "2、OpenSpec 命令与能力",
        "1、环境要求",
        "2、安装 Superpowers",
        "3、安装 OpenSpec",
        "1、卸载 Superpowers",
        "2、卸载 OpenSpec",
        "3、残留清理",
        "1、协同场景",
        "2、协同优势",
        "3、协同操作步骤",
        "4、实战示例：实现订单导出功能",
        "5、关键协同点",
        "1、Q1：OpenSpec 与 Superpowers 必须一起使用吗？",
        "2、Q2：Superpowers 安装后为什么不生效？",
        "3、Q3：OpenSpec 的 Spec 应该写到什么粒度？",
        "4、Q4：如何处理开发过程中的需求变更？",
        "5、Q5：团队如何协作使用 OpenSpec？",
        "九、总结",
        "十、参考资料"
      ],
      "excerpt": "介绍 OpenSpec 与 Superpowers 的职责边界、安装配置和协同流程，建立从需求规范、任务实现到测试审查的 AI 编程工作流。",
      "characterCount": 5032
    },
    {
      "id": "projects-redis-interaction-cache-design",
      "title": "交互数据Redis缓存实现",
      "description": "设计 Redis 交互数据异步写入方案，对比 Set + MQ、Set + 定时扫描、Bitmap + MQ 的适用条件，并说明一致性、降级和数据恢复策略。",
      "published": "2026-05-13T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-redis-interaction-cache-design/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-redis-interaction-cache-design.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-redis-interaction-cache-design.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "一、问题陈述",
        "二、数据结构选型",
        "三、方案设计与交互流程",
        "1、共享 Key 概念",
        "2.1 Key 设计",
        "2.2 交互流程",
        "2.3 入库方式：MQ 异步消费",
        "3.1 Key 设计",
        "3.2 交互流程",
        "3.3 入库方式：定时扫描",
        "4、方案三：Bitmap + MQ 异步入库",
        "4.1 Key 设计",
        "4.2 交互流程",
        "4.3 入库方式：MQ 异步消费",
        "5、四种交互场景的实现差异",
        "6、三种方案对比",
        "1、数据库表设计",
        "2、缓存预热",
        "1、Redis 不可用时的降级策略",
        "2、数据不一致的修复机制",
        "3、MQ 消息丢失的兜底",
        "4、缓存击穿防护",
        "1、SETBIT 首次写入的性能陷阱",
        "2、雪花 ID 与 Bitmap 的根本矛盾",
        "3、分布式场景下的阻塞与倾斜",
        "4、同步任务的幂等性",
        "5、数据丢失风险",
        "七、总结",
        "八、参考资料"
      ],
      "excerpt": "设计 Redis 交互数据异步写入方案，对比 Set + MQ、Set + 定时扫描、Bitmap + MQ 的适用条件，并说明一致性、降级和数据恢复策略。",
      "characterCount": 7757
    },
    {
      "id": "ai-napcat-astrbot-deployment",
      "title": "NapCat+AstrBot部署QQ机器人",
      "description": "使用 Docker Compose 部署 NapCat 与 AstrBot，介绍 OneBot 11 HTTP/WebSocket 对接、LLM 配置、人格提示词、插件和账号风控边界。",
      "published": "2026-05-12T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/ai-napcat-astrbot-deployment/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/ai-napcat-astrbot-deployment.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/ai-napcat-astrbot-deployment.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "组件职责",
        "一、部署环境要求",
        "二、目录结构",
        "三、docker-compose.yml",
        "1、启动",
        "四、本地 Docker Desktop 部署",
        "五、服务器部署",
        "1、建目录",
        "2、新建文件",
        "3、编排",
        "4、校验",
        "1、访问地址",
        "2.1 自动配置",
        "2.2 手动配置（登录发现没看到配置上，那么可以选择这里）",
        "3、NapCat 环境变量说明（部署忽略，这里只是补充说明）",
        "4、NapCat 配置文件位置（部署忽略，这里只是补充说明）",
        "1、访问 WebUI",
        "2、添加消息平台（连接 NapCat）",
        "3、配置 LLM 大模型（需要先准备 API Key）",
        "4、低成本模型渠道（Agnes 或魔搭社区）",
        "4.1 Agnes",
        "4.2 魔搭社区（推荐）",
        "5、普通设置",
        "6、平台设置",
        "7、扩展功能",
        "1、传统手搓",
        "2、使用女娲 Skill 蒸馏人格",
        "2.1 安装",
        "2.2 蒸馏一个人",
        "2.3 已蒸馏人物（可直接安装）",
        "2.4 用于 AstrBot 人格设定",
        "3、喵墩备份",
        "1、如图",
        "2、为什么我不用记忆呢",
        "1、AstrBot 连不上 NapCat",
        "2、QQ 号被风控 / 账号掉线",
        "3、消息延迟高",
        "4、如何更新版本",
        "十一、参考资料"
      ],
      "excerpt": "使用 Docker Compose 部署 NapCat 与 AstrBot，介绍 OneBot 11 HTTP/WebSocket 对接、LLM 配置、人格提示词、插件和账号风控边界。",
      "characterCount": 6809
    },
    {
      "id": "others-umami-vercel-neon-deployment",
      "title": "Umami通过Vercel+Neon部署方案",
      "description": "使用 Vercel 部署 Umami、Neon 托管 PostgreSQL 数据库，介绍 Prisma 7 适配、自定义域名和 Share API 展示博客 UV/PV 的配置方法。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/others-umami-vercel-neon-deployment/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/others-umami-vercel-neon-deployment.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/others-umami-vercel-neon-deployment.md",
      "category": "AI实践",
      "tags": [],
      "headings": [
        "一、架构",
        "二、第一步：创建 Neon 数据库",
        "三、第二步：Fork Umami 仓库",
        "四、第三步：确认 Prisma 7 适配",
        "五、第四步：部署到 Vercel",
        "六、第五步：首次登录和安全设置",
        "七、第六步：绑定自定义域名",
        "1、通用接入方式",
        "2、本项目接入方式",
        "九、第八步：开启 Share URL（用于公开访问 UV/PV）",
        "1、开启 Share URL",
        "2、本项目获取 UV/PV 的实现",
        "3、直接重定向到分享页",
        "十、第九步：数据容量管理",
        "十一、更新 Umami 版本",
        "十二、常见问题",
        "十三、保存清单"
      ],
      "excerpt": "使用 Vercel 部署 Umami、Neon 托管 PostgreSQL 数据库，介绍 Prisma 7 适配、自定义域名和 Share API 展示博客 UV/PV 的配置方法。",
      "characterCount": 4567
    },
    {
      "id": "projects-java-thread-pool-configuration",
      "title": "Java 线程池配置指南",
      "description": "Java ThreadPoolExecutor 配置指南，讲解核心参数、CPU/IO 线程数估算、有界队列、拒绝策略、监控告警和动态调优方法。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-java-thread-pool-configuration/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-java-thread-pool-configuration.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-java-thread-pool-configuration.md",
      "category": "Java",
      "tags": [],
      "headings": [
        "一、核心摘要",
        "二、为什么需要线程池",
        "三、ThreadPoolExecutor 核心参数",
        "1、corePoolSize 与 maximumPoolSize",
        "2、keepAliveTime 与 TimeUnit",
        "3、工作队列",
        "4、线程工厂",
        "5、拒绝策略",
        "四、任务提交与执行流程",
        "五、CPU 密集型与 IO 密集型任务",
        "1、CPU 密集型",
        "2、IO 密集型",
        "3、混合型任务",
        "1、Little's Law",
        "2、Brian Goetz 公式",
        "3、公式的局限",
        "4、估算流程",
        "5、常见场景参考值",
        "七、工作队列选型",
        "1、全局共用一个线程池",
        "2、不考虑下游限制盲目设大",
        "3、keepAliveTime 设置过短",
        "4、任务中嵌套提交任务",
        "5、容器环境不修正 CPU 核数",
        "6、线程未命名",
        "1、需求分析清单",
        "2、订单查询服务配置示例",
        "3、压测验证方案",
        "1、动态调整原理",
        "2、实现示例",
        "3、队列容量动态修改",
        "1、Prometheus 指标暴露",
        "2、AlertManager 告警规则",
        "3、告警阈值参考",
        "1、线程数调优",
        "2、队列深度调优",
        "3、GC 与内存调优",
        "4、上下文切换调优",
        "1、Q1：`corePoolSize` 和 `maximumPoolSize` 应该设成一样吗？",
        "2、Q2：为什么线程池达到了 `maximumPoolSize` 但 CPU 使用率仍然很低？",
        "3、Q3：任务被拒绝时应该选择哪种策略？",
        "4、Q4：使用 `CompletableFuture` 时如何指定自定义线程池？",
        "5、Q5：Spring 的 `@Async` 默认线程池有什么问题？",
        "6、Q6：如何优雅关闭线程池？",
        "7、Q7：`allowCoreThreadTimeOut(true)` 是否推荐？",
        "十四、决策速查表",
        "十五、总结",
        "十六、参考资料"
      ],
      "excerpt": "Java ThreadPoolExecutor 配置指南，讲解核心参数、CPU/IO 线程数估算、有界队列、拒绝策略、监控告警和动态调优方法。",
      "characterCount": 3372
    },
    {
      "id": "projects-java-virtual-thread-async-orchestration",
      "title": "虚拟线程与异步编排",
      "description": "以 Java 21 商品详情聚合为例，比较平台线程、线程池、CompletableFuture、响应式编程和虚拟线程的适用边界与编排方式。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-java-virtual-thread-async-orchestration/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-java-virtual-thread-async-orchestration.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-java-virtual-thread-async-orchestration.md",
      "category": "Java",
      "tags": [],
      "headings": [
        "1、一个真实的场景",
        "2、问题的本质",
        "二、Java 并发模型的演进史",
        "1、阶段 1：原始线程时代（Java 1.0，1996年）",
        "2、阶段 2：线程池时代（Java 5，2004年）",
        "3、阶段 3：异步回调时代（Java 8，2014年）",
        "4、阶段 4：响应式编程时代（Spring WebFlux，2017年）",
        "5、阶段 5：虚拟线程时代（JDK 21，2023年）",
        "1、传统线程的问题（图解）",
        "2、虚拟线程的解决思路",
        "3、关键概念：Continuation（续体）",
        "4、通俗类比",
        "四、虚拟线程 vs 平台线程：全面对比",
        "1、最简单的创建方式",
        "2、生产推荐：每任务一虚拟线程",
        "3、Spring Boot 3.2+ 集成（推荐）",
        "4、并行聚合多个 IO 任务（最常用场景）",
        "5、结合 ScopedValue 传递上下文（推荐替代 ThreadLocal）",
        "六、⚠️ 虚拟线程踩坑大全（12个坑）",
        "1、坑 1：给虚拟线程建线程池（最常见错误）",
        "2、坑 2：synchronized 块导致 Pinning（JDK 21/23）",
        "3、坑 3：ThreadLocal 在虚拟线程中导致内存泄漏",
        "4、坑 4：虚拟线程遇到 CPU 密集任务反而变慢",
        "5、坑 5：数据库连接池成为新瓶颈",
        "6、坑 6：在虚拟线程中调用 native 方法导致 Pinning",
        "7、坑 7：用 isVirtual() 做业务逻辑判断",
        "8、坑 8：虚拟线程数量无上限导致 OOM",
        "9、坑 9：忘记处理虚拟线程的中断",
        "10、坑 10：在虚拟线程中使用 BlockingQueue 不当",
        "11、坑 11：错误理解\"虚拟线程不需要关心并发问题\"",
        "12、坑 12：在旧版 JDBC 驱动中遇到兼容性问题",
        "七、CompletableFuture 异步编排从零讲起",
        "1、基本概念：什么是 CompletableFuture？",
        "2、核心方法速查",
        "3、实战：并行聚合商品详情",
        "4、超时与降级处理",
        "八、⚠️ CompletableFuture 踩坑大全（8个坑）",
        "1、坑 1：不指定 Executor，使用 ForkJoinPool 公共池",
        "2、坑 2：异常被静默吞掉",
        "3、坑 3：thenApply vs thenApplyAsync 混淆",
        "4、坑 4：allOf 没有返回值，需要额外 get()",
        "5、坑 5：链式调用中的线程切换导致 ThreadLocal 丢失",
        "6、坑 6：join() 和 get() 的异常包装差异",
        "7、坑 7：CompletableFuture 没有超时导致线程泄漏",
        "8、坑 8：在高并发下大量创建 CompletableFuture 链导致内存压力",
        "1、它解决了什么问题？",
        "2、基本用法",
        "3、带超时的结构化并发",
        "4、结构化并发的优势总结",
        "十、响应式编程（Reactor/WebFlux）概览",
        "1、核心概念：Mono 和 Flux",
        "2、背压（Backpressure）：响应式的核心优势",
        "3、什么时候应该用响应式？",
        "4、响应式的三大难点（让你望而却步的原因）",
        "十一、四种模型横向大对比",
        "1、决策树",
        "2、推荐的企业级组合（JDK 21+）",
        "3、完整实战：商品详情页聚合接口",
        "1、三句话总结",
        "2、学习路径建议"
      ],
      "excerpt": "以 Java 21 商品详情聚合为例，比较平台线程、线程池、CompletableFuture、响应式编程和虚拟线程的适用边界与编排方式。",
      "characterCount": 7017
    },
    {
      "id": "projects-redis-bitmap-snowflake-id",
      "title": "Redis中Bitmap、雪花ID、分布式的坑",
      "description": "分析 Redis Bitmap 直接承载雪花 ID 时的初始化开销、映射碰撞、单线程阻塞和数据倾斜问题，并给出 String + Set 的替代方案。",
      "published": "2026-05-06T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-redis-bitmap-snowflake-id/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-redis-bitmap-snowflake-id.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-redis-bitmap-snowflake-id.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "一、案发现场",
        "二、问题现象",
        "1、SETBIT 的时间复杂度陷阱",
        "2、内存分配量化",
        "3、为什么后续操作快？",
        "4、能否缩小 Offset 范围？",
        "1、雪花 ID 的结构决定了它不适合做 Bitmap offset",
        "2、哈希取模是\"治标不治本\"的妥协",
        "3、雪花 ID 的\"时间递增\"特性也无法利用",
        "4、如果不用哈希，直接用雪花 ID 做 offset 呢？",
        "5、从 ID 生成策略角度的替代方案",
        "6、雪花 ID 角度的本质",
        "1、Redis 单线程阻塞：一个慢操作拖垮整个节点",
        "2、Redis Cluster 数据倾斜",
        "3、KEYS 命令的集群隐患",
        "4、Bitmap 大 Key 的运维风险",
        "5、分布式角度的结论",
        "1、原理",
        "2.1 方式 A：RedisBloom 模块（RB.* 命令）",
        "2.2 方式 B：客户端序列化（Read-Modify-Write）",
        "2.3 方式 C：Lua 脚本",
        "3、RoaringBitmap 结论",
        "1、Key 设计",
        "2、为什么用用户维度而不是内容维度的 Set？",
        "3、操作流程",
        "4、缓存冷启动（Redis 无数据时）",
        "5、方案对比",
        "6、前端注意事项：雪花 ID 精度丢失",
        "1、三维问题全景",
        "2、问题-方案对照表",
        "3、最终选型",
        "4、什么时候 Bitmap 仍然适用？"
      ],
      "excerpt": "分析 Redis Bitmap 直接承载雪花 ID 时的初始化开销、映射碰撞、单线程阻塞和数据倾斜问题，并给出 String + Set 的替代方案。",
      "characterCount": 6851
    },
    {
      "id": "projects-token-storage-jwt-design",
      "title": "前后端登录Token存储方案",
      "description": "设计 ZSK-Cloud 的 Access Token + Refresh Token 认证体系，介绍 RS256 签名、HttpOnly Cookie、Redis 会话白名单、主动吊销和跨服务验签。",
      "published": "2026-05-04T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-token-storage-jwt-design/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-token-storage-jwt-design.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-token-storage-jwt-design.md",
      "category": "认证与登录",
      "tags": [
        "JWT"
      ],
      "headings": [
        "1、当前系统现状",
        "2、目标",
        "1、双 Token 分层存储",
        "2、RS256 非对称签名",
        "3、Redis 白名单",
        "1、Session vs JWT",
        "2、前端存储对比",
        "3、核心取舍",
        "1、服务端：Token 签发",
        "2、服务端：Token 刷新",
        "3.1 单设备退出",
        "3.2 密码修改 / 重置后全局吊销",
        "4、网关：Token 校验",
        "5、前端：Pinia 状态管理",
        "6、前端：Axios 拦截器",
        "7、Redis 存储结构",
        "1、Cookie 安全属性",
        "2、纵深防御体系",
        "3、多设备登录管理",
        "4、安全事件响应",
        "1、Gateway CORS 配置",
        "2、Nginx 反向代理",
        "3、Cookie 构建工具",
        "1、当前状态与目标状态",
        "2、迁移步骤",
        "1、Redis 性能",
        "2、网关性能",
        "3、前端体验",
        "1、Q1：HttpOnly Cookie 是否完全防御 XSS？",
        "2、Q2：Cookie 4 KB 限制是否足够？",
        "3、Q3：JWT Claims 为什么不存放角色和权限？",
        "4、Q4：Refresh Token 被窃取后如何应对？",
        "5、Q5：跨域场景下 Cookie 为何不生效？",
        "6、Q6：多标签页如何同步登录状态？",
        "7、Q7：移动端 / 原生 App 如何接入？",
        "十、总结",
        "十一、参考资料"
      ],
      "excerpt": "设计 ZSK-Cloud 的 Access Token + Refresh Token 认证体系，介绍 RS256 签名、HttpOnly Cookie、Redis 会话白名单、主动吊销和跨服务验签。",
      "characterCount": 8581
    },
    {
      "id": "projects-oauth2-third-party-login",
      "title": "OAuth2第三方登录",
      "description": "统一设计 GitHub、微信和 QQ 第三方登录的 OAuth 2.0 授权码流程，涵盖 state 校验、回调换令牌、用户映射、策略模式和多环境配置。",
      "published": "2026-05-03T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-oauth2-third-party-login/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-oauth2-third-party-login.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-oauth2-third-party-login.md",
      "category": "认证与登录",
      "tags": [
        "OAuth2"
      ],
      "headings": [
        "方案边界",
        "1、流程图",
        "2、核心代码结构",
        "3、关键技术点",
        "1、平台特性",
        "2、回调处理流程",
        "3、GitHub 后台配置",
        "4、Nacos 配置",
        "5、注意事项",
        "1、平台特性",
        "2、回调处理流程",
        "3、微信开放平台配置",
        "4、Nacos 配置",
        "5、开发环境绕过方案（无域名时）",
        "6、注意事项",
        "1、平台特性",
        "2、回调处理流程",
        "3、QQ 互联平台配置",
        "4、Nacos 配置",
        "5、注意事项",
        "1、需要配置的地方（完整清单）",
        "2.1 GitHub",
        "2.2 微信（网站应用）",
        "2.3 QQ",
        "3、完整 Nacos 配置模板",
        "4、完整 Gateway 白名单模板",
        "5、生产环境部署检查清单",
        "1、redirect_uri is not associated with this application",
        "2、微信开发环境无法使用 localhost",
        "3、回调后没有跳转到前端",
        "4、生产环境是否需要内网穿透",
        "5、不同平台用户的用户名会冲突吗",
        "1、前端发起登录",
        "2、前端接收回调",
        "3、后续请求携带 Token",
        "1、用户表第三方登录字段",
        "2、查询逻辑",
        "九、代码文件清单"
      ],
      "excerpt": "统一设计 GitHub、微信和 QQ 第三方登录的 OAuth 2.0 授权码流程，涵盖 state 校验、回调换令牌、用户映射、策略模式和多环境配置。",
      "characterCount": 6520
    },
    {
      "id": "projects-auth-flow-zsk-auth",
      "title": "滑块验证码、登录与注册完整流程",
      "description": "介绍 zsk-auth 登录注册认证链路，涵盖滑块验证码限流、RSA 密码传输、BCrypt 密码摘要、邮箱验证码和异常安全边界。",
      "published": "2026-05-02T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-auth-flow-zsk-auth/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-auth-flow-zsk-auth.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-auth-flow-zsk-auth.md",
      "category": "认证与登录",
      "tags": [
        "AI"
      ],
      "headings": [
        "方案范围",
        "一、流程图（不包含异常处理）",
        "二、流程图 (包含异常处理版)",
        "三、技术栈 (Tech Stack)",
        "四、核心类说明",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "九、安全加密机制 (Security & Encryption)",
        "1、传输层加密 (RSA)",
        "2、存储层加密 (BCrypt)",
        "十、限流机制 (Rate Limiting)",
        "1、策略概述",
        "2、部分核心代码"
      ],
      "excerpt": "介绍 zsk-auth 登录注册认证链路，涵盖滑块验证码限流、RSA 密码传输、BCrypt 密码摘要、邮箱验证码和异常安全边界。",
      "characterCount": 3949
    },
    {
      "id": "projects-magic-link-login-design",
      "title": "邮箱链接登录前后的实现方案",
      "description": "基于 Cloudflare Turnstile、Redis 一次性 Token 和邮件回调实现无密码登录，涵盖链接发送、校验消费、自动注册、Cookie 登录态和安全边界。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-magic-link-login-design/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-magic-link-login-design.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-magic-link-login-design.md",
      "category": "认证与登录",
      "tags": [
        "JWT"
      ],
      "headings": [
        "方案边界",
        "1、业务背景",
        "2、功能需求",
        "3、登录流程",
        "1.1 模块划分",
        "1.2 核心流程图",
        "2、目录结构",
        "3.1 Controller层",
        "3.2 Service层",
        "3.3 配置类",
        "4.1 Redis缓存键设计",
        "4.2 缓存数据结构",
        "5.1 发送魔法链接",
        "5.2 魔法链接回调",
        "1.1 方案 A：预校验（已废弃）",
        "1.2 方案 B：登录时校验（当前实现）",
        "2、方案对比表",
        "3、选型结论",
        "1、依赖与环境",
        "2.1 application.yml 新增配置",
        "1、注意事项",
        "2、解决方案",
        "3.1 发送魔法链接",
        "3.2 魔法链接回调处理",
        "3.3 通过Cookie获取UserInfo",
        "3.4 Cookie操作工具函数",
        "4、自动注册用户字段说明"
      ],
      "excerpt": "基于 Cloudflare Turnstile、Redis 一次性 Token 和邮件回调实现无密码登录，涵盖链接发送、校验消费、自动注册、Cookie 登录态和安全边界。",
      "characterCount": 7422
    },
    {
      "id": "projects-object-storage-presigned-url",
      "title": "MinIO文件存储签名有效期机制",
      "description": "解释 MinIO/S3 签名 URL 的参数和 7 天有效期限制，对比预签名上传与下载，说明私有对象访问、链接泄露和过期刷新策略。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-object-storage-presigned-url/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-object-storage-presigned-url.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-object-storage-presigned-url.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "一、背景",
        "二、什么是签名 URL",
        "1、签名 URL 的格式",
        "2、签名 URL 的工作原理",
        "1、各厂商的最大有效期",
        "2、为什么 S3 协议限制 7 天",
        "1、预签名 URL 模式（私有桶）",
        "2、直接 URL 模式（公开桶 + 自定义域名）",
        "3、对比总结",
        "1、方案一：前端自动续签（推荐）",
        "2、方案二：后端代理下载",
        "3、方案三：公开桶 + 自定义域名",
        "4、方案四：CDN 回源 + 鉴权",
        "1、根据场景选择模式",
        "2、有效期设置建议",
        "3、安全注意事项",
        "1、Q1：签名 URL 过期后，文件还在吗？",
        "2、Q2：能否生成永不过期的签名 URL？",
        "3、Q3：签名 URL 泄露了怎么办？",
        "4、Q4：去掉签名参数后还能访问吗？",
        "5、Q5：前端如何判断签名 URL 是否过期？"
      ],
      "excerpt": "解释 MinIO/S3 签名 URL 的参数和 7 天有效期限制，对比预签名上传与下载，说明私有对象访问、链接泄露和过期刷新策略。",
      "characterCount": 2976
    },
    {
      "id": "projects-qrcode-login-java-comparison",
      "title": "扫码登录前后的实现",
      "description": "对比短轮询、长轮询、WebSocket 和 SSE 扫码登录方案，介绍 WebSocket + Redis 状态机、超时降级、二维码重放和登录态安全防护。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-qrcode-login-java-comparison/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-qrcode-login-java-comparison.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-qrcode-login-java-comparison.md",
      "category": "认证与登录",
      "tags": [],
      "headings": [
        "一、背景",
        "1、完整时序",
        "2、二维码状态机",
        "三、方案对比：PC 端如何感知状态变更",
        "1、方案总览",
        "2、资源消耗对比",
        "3、方案选型结论",
        "1、Maven 依赖配置",
        "2、数据模型",
        "3、Redis 存储设计",
        "4、WebSocket 配置",
        "5、生成二维码",
        "6、手机扫码",
        "7、手机确认登录",
        "8、手机取消登录",
        "9、长轮询降级实现",
        "10、Controller 层",
        "11、Gateway 白名单",
        "1、PC 端：二维码展示 + WebSocket",
        "2、PC 端：Vue 组件",
        "3、手机端：扫码 + 确认流程",
        "4、手机端：确认页面组件",
        "1、威胁模型",
        "2、防御措施",
        "3、安全措施汇总",
        "1、WebSocket 连接断开后状态丢失",
        "2、二维码过期但手机端还在确认",
        "3、用户扫码后不确认也不取消",
        "4、PC 端刷新页面后丢失二维码",
        "5、WebSocket 被防火墙/代理拦截",
        "八、生产环境部署清单",
        "九、方案对比总结",
        "十、参考资料"
      ],
      "excerpt": "对比短轮询、长轮询、WebSocket 和 SSE 扫码登录方案，介绍 WebSocket + Redis 状态机、超时降级、二维码重放和登录态安全防护。",
      "characterCount": 5037
    },
    {
      "id": "projects-oracle-erp-performance-optimization",
      "title": "Oracle ERP性能优化",
      "description": "记录 Oracle ERP 因 SHRINK 导致聚簇因子恶化的排查过程，结合 AWR、执行计划、索引重建、在线表重定义和查询调优分析性能问题。",
      "published": "2025-12-02T00:00:00.000Z",
      "url": "https://www.cati.cc.cd/posts/projects-oracle-erp-performance-optimization/",
      "jsonUrl": "https://www.cati.cc.cd/wiki/articles/projects-oracle-erp-performance-optimization.json",
      "markdownUrl": "https://www.cati.cc.cd/wiki/articles/projects-oracle-erp-performance-optimization.md",
      "category": "微服务与中间件",
      "tags": [],
      "headings": [
        "一、背景",
        "1、什么是聚簇因子",
        "2、SHRINK 为什么会恶化 CF",
        "3、恶化后的等待事件",
        "4、聚簇因子检测",
        "1、工具链",
        "2、关键指标",
        "3、定位流程",
        "1、在线表重定义（降低聚簇因子）",
        "1.1 BOM_COMPONENTS_B — 优化等级：🔴 高",
        "1.2 BOM_STRUCTURES_B — 优化等级：🔴 高",
        "1.3 MRP_SCHEDULE_DATES — 优化等级：🟡 低",
        "1.4 MRP_SOURCING_HISTORY — 优化等级：🟡 低",
        "1.5 MRP_SYSTEM_ITEMS — 优化等级：🔴 高",
        "1.6 MTL_ITEM_REVISIONS_B — 优化等级：⚫ 非常低",
        "1.7 MTL_ITEM_REVISIONS_TL — 优化等级：🔴 高",
        "1.8 MTL_SYSTEM_ITEMS_B — 优化等级：🟡 低",
        "1.9 RCV_SHIPMENT_LINES — 优化等级：⚫ 非常低",
        "2.1 RCV_TRANSACTIONS 添加新索引",
        "3、修改存储参数（MRP_SOURCING_HISTORY）",
        "4、核心表缓存至 Keep Pool",
        "1、MRP_SCHEDULE_DATES 频繁增删导致聚簇持续退化",
        "2、SQL 高频执行累计消耗大",
        "3、自治事务频繁提交导致 log file sync 等待",
        "4、视图替代基表导致全表扫描",
        "六、优化效果汇总",
        "七、MRP 性能优化扩展框架",
        "1、数据库基础资源层",
        "2、缓存与共享池层",
        "3、索引与表设计层",
        "4、SQL 执行计划层",
        "5、并发与事务层",
        "6、应用配置层",
        "1、项目一句话定位",
        "2、逻辑链（这是整个项目的叙事骨架）",
        "3、几个值得强调的细节",
        "九、参考资料"
      ],
      "excerpt": "记录 Oracle ERP 因 SHRINK 导致聚簇因子恶化的排查过程，结合 AWR、执行计划、索引重建、在线表重定义和查询调优分析性能问题。",
      "characterCount": 9062
    }
  ]
}
