<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://xiaomaohuifaguang.github.io/blog/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <atom:link href="https://xiaomaohuifaguang.github.io/blog/rss.xml" rel="self" type="application/rss+xml"/>
    <title>小猫会发光</title>
    <link>https://xiaomaohuifaguang.github.io/blog/</link>
    <description>太阳照常升起</description>
    <language>zh-CN</language>
    <pubDate>Tue, 07 Jul 2026 11:11:35 GMT</pubDate>
    <lastBuildDate>Tue, 07 Jul 2026 11:11:35 GMT</lastBuildDate>
    <generator>@vuepress/plugin-feed</generator>
    <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
    <category>React</category>
    <category>Frontend</category>
    <category>DevOps</category>
    <category>Meta</category>
    <category>Java</category>
    <category>学习记录</category>
    <category>项目</category>
    <category>使用指南</category>
    <item>
      <title>下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">下载安装</source>
      <description>React 下载安装 环境准备 Node.js 安装 React 开发需要 Node.js 环境，建议安装 LTS 版本。 访问 Node.js 官网 下载 LTS 版本 或使用包管理器安装： 验证安装 创建 React 项目 使用 Vite（推荐） 使用 Create React App 使用 Next.js（全栈框架） 项目结构 常用依赖安装 路由...</description>
      <category>React</category>
      <pubDate>Tue, 07 Jul 2026 11:10:37 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>环境准备</h2>
<h3>Node.js 安装</h3>
<p>React 开发需要 Node.js 环境，建议安装 LTS 版本。</p>
<ol>
<li>访问 <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">Node.js 官网</a> 下载 LTS 版本</li>
<li>或使用包管理器安装：</li>
</ol>

<h3>验证安装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">node</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   # v18.x 或更高</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    # 9.x 或更高</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>创建 React 项目</h2>
<h3>使用 Vite（推荐）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建项目</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> vite@latest</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-react-app</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --template</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> react</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入目录</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-react-app</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装依赖</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动开发服务器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> dev</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>使用 Create React App</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建项目</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> create-react-app</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-react-app</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入目录</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-react-app</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动开发服务器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>使用 Next.js（全栈框架）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> create-next-app@latest</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-next-app</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>项目结构</h2>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span>my-react-app/</span></span>
<span class="line"><span>├── node_modules/      # 依赖包</span></span>
<span class="line"><span>├── public/            # 静态资源</span></span>
<span class="line"><span>│   └── vite.svg</span></span>
<span class="line"><span>├── src/               # 源代码</span></span>
<span class="line"><span>│   ├── assets/        # 资源文件</span></span>
<span class="line"><span>│   ├── App.css        # 组件样式</span></span>
<span class="line"><span>│   ├── App.jsx        # 根组件</span></span>
<span class="line"><span>│   └── main.jsx       # 入口文件</span></span>
<span class="line"><span>├── index.html         # HTML 模板</span></span>
<span class="line"><span>├── package.json       # 项目配置</span></span>
<span class="line"><span>├── vite.config.js     # Vite 配置</span></span>
<span class="line"><span>└── README.md</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>常用依赖安装</h2>
<h3>路由</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> react-router-dom</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>状态管理</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Redux Toolkit</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> @reduxjs/toolkit</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> react-redux</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Zustand（轻量）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zustand</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>UI 组件库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Ant Design</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> antd</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Material UI</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> @mui/material</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> @emotion/react</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> @emotion/styled</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>其他常用</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># HTTP 请求</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> axios</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 表单处理</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> react-hook-form</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 日期处理</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> dayjs</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>VS Code 插件推荐</h2>
<ul>
<li><strong>ES7+ React/Redux/React-Native snippets</strong> - 代码片段</li>
<li><strong>ESLint</strong> - 代码检查</li>
<li><strong>Prettier</strong> - 代码格式化</li>
<li><strong>Auto Rename Tag</strong> - 自动重命名标签</li>
<li><strong>Tailwind CSS IntelliSense</strong> - Tailwind 智能提示</li>
</ul>
<h2>常见问题</h2>
<h3>端口被占用</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 指定其他端口</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> dev</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --port</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 3001</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>安装依赖失败</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 清除缓存后重试</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cache</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> clean</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --force</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -rf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> node_modules</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> package-lock.json</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>权限问题（Linux/Mac）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改 npm 全局目录权限</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ~/.npm-global</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> '~/.npm-global'</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'export PATH=~/.npm-global/bin:$PATH'</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> &gt;&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ~/.bashrc</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">source</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ~/.bashrc</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">使用记录</source>
      <description>React 使用记录 项目实战经验 自定义 Hook 封装 请求封装 Hook 踩坑记录 闭包陷阱 依赖数组遗漏 事件监听器清理 无限循环 路由配置 React Router v6 路由参数获取 状态管理实践 Zustand 使用 样式方案 CSS Modules Tailwind CSS 部署相关 构建生产版本 环境变量 调试技巧 React Dev...</description>
      <category>React</category>
      <pubDate>Tue, 07 Jul 2026 11:10:37 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>项目实战经验</h2>
<h3>自定义 Hook 封装</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// useLocalStorage.js</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useLocalStorage</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">key</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">initialValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">storedValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setStoredValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> item</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> window</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">localStorage</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getItem</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">key</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> item</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> ?</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> JSON</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">parse</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">item</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> initialValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">      console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> initialValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  });</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setValue</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> valueToStore</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> Function</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> ?</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">storedValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">      setStoredValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">valueToStore</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">      window</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">localStorage</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setItem</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">key</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">JSON</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">stringify</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">valueToStore</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">      console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">storedValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">setValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> App</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">theme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useLocalStorage</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'theme'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'light'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'dark'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Switch Theme&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>请求封装 Hook</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// useFetch.js</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useFetch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">url</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">data</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">loading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setError</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> fetchData</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> async</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">      try</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">url</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">ok</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'Network error'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> json</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">json</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        setData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">json</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">catch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">err</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        setError</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">err</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">message</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">finally</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    fetchData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">url</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">loading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">error</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">refetch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">fetchData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> };</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>踩坑记录</h2>
<h3>闭包陷阱</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ❌ 错误：获取的是旧的 count 值</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Counter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> timer</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setInterval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">      console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">); </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 永远是 0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">      setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">); </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 永远变成 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }, </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1000</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> clearInterval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">timer</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, []); </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 空依赖，闭包陷阱</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ✅ 正确：使用函数式更新</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Counter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> timer</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setInterval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">      setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">c</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> c</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">); </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 获取最新值</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }, </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1000</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> clearInterval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">timer</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, []);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>依赖数组遗漏</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ❌ 错误：未包含所有依赖</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    fetchUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">then</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, []); </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 缺少 userId</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">?.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ✅ 正确：包含所有依赖</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    fetchUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">then</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">?.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>事件监听器清理</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ❌ 错误：未清理事件监听</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">  window</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">addEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'resize'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleResize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}, []);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ✅ 正确：清理事件监听</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">  window</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">addEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'resize'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleResize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> window</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">removeEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'resize'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleResize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}, []);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>无限循环</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ❌ 错误：setState 导致重新渲染，形成循环</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  setState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">newState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">});</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// ✅ 正确：添加依赖或空数组</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  setState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">newState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}, [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">someValue</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>路由配置</h2>
<h3>React Router v6</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">BrowserRouter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">Routes</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">Route</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">Navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react-router-dom'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> App</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">BrowserRouter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Routes</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Layout</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">          &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> index</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Home</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">          &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"about"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">About</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">          &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"users/:id"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">UserDetail</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">          &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"*"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">NotFound</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">        {</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/* 受保护路由 */</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Route</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">          path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/dashboard"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">          element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">RequireAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">              &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Dashboard</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">RequireAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">          }</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Routes</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">BrowserRouter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 受保护路由组件</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> RequireAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">children</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">isLoggedIn</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> isLoggedIn</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> ?</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> children</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> :</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Navigate</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> to</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/login"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> replace</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>路由参数获取</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useParams</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useNavigate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useLocation</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react-router-dom'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserDetail</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useParams</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();        </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// URL 参数</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> navigate</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useNavigate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();       </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 编程式导航</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> location</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useLocation</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();     </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 当前位置信息</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> goBack</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> goHome</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> navigate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;User ID: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">goBack</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Back&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>状态管理实践</h2>
<h3>Zustand 使用</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// store.js</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">create</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'zustand'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> useStore</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">((</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">set</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">get</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">  count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">  user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 简单更新</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  increment</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">state</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({ </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">state</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> })),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  decrement</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> set</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">state</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({ </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">state</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> })),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 异步操作</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  fetchUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">async</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">`/api/users/</span><span style="--shiki-light:#032F62;--shiki-dark:#C678DD">${</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#032F62;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">`</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">json</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    set</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> });</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 使用 get 访问当前状态</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  doubleCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> get</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 2</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}));</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 组件中使用</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Counter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useStore</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">state</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> state</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> increment</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useStore</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">state</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> state</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">increment</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">increment</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;+1&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>样式方案</h2>
<h3>CSS Modules</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Button.module.css</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">primary</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#E06C75">  background</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: #007</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">bff</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#E06C75">  color</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">white</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#E06C75">  padding</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: 8</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> 16</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#E06C75">  border</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">none</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">  border</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E06C75">radius</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: 4</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// Button.jsx</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> styles</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> './Button.module.css'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">children</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">styles</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">primary</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">children</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Tailwind CSS</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Card</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">title</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">content</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition-shadow"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"text-xl font-bold mb-2 text-gray-800"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"text-gray-600"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">content</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>部署相关</h2>
<h3>构建生产版本</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Vite 项目</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> build</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 预览生产构建</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> preview</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>环境变量</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># .env.development</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">VITE_API_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">http://localhost:3000</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># .env.production</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">VITE_API_URL</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">https://api.example.com</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 在代码中使用</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> apiUrl</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#E06C75">VITE_API_URL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>调试技巧</h2>
<h3>React DevTools</h3>
<ol>
<li>安装浏览器扩展 <a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi" target="_blank" rel="noopener noreferrer">React Developer Tools</a></li>
<li>查看组件树结构</li>
<li>检查 Props 和 State</li>
<li>使用 Profiler 分析性能</li>
</ol>
<h3>常见错误排查</h3>
<p>| 错误信息 | 原因 | 解决 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>基础学习</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/React/%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">基础学习</source>
      <description>React 基础学习 核心概念 JSX 语法 JSX 是 JavaScript 的语法扩展，允许在 JS 中编写类似 HTML 的结构。 组件 函数组件（推荐） 类组件 Props 属性 State 状态 useState Hook 对象状态更新 生命周期与副作用 useEffect 事件处理 表单处理 受控组件 组件通信 父子通信 Context 跨...</description>
      <category>React</category>
      <pubDate>Tue, 07 Jul 2026 11:10:37 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>核心概念</h2>
<h3>JSX 语法</h3>
<p>JSX 是 JavaScript 的语法扩展，允许在 JS 中编写类似 HTML 的结构。</p>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 基本用法</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Hello, React!&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 嵌入表达式</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'React'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Hello, </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">!&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 条件渲染</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> element</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> isLoggedIn</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> ?</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">UserGreeting</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt; </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">:</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">GuestGreeting</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 列表渲染</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> listItems</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> items</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">map</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">item</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">item</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">item</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;);</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>组件</h3>
<h4>函数组件（推荐）</h4>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Welcome</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Hello, </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Welcome</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"React"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>类组件</h4>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> Welcome</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  render</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Hello, </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">this</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">props</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Props 属性</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 父组件传递</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> App</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">User</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Alice"</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> age</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">25</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 子组件接收</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">age</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Name: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Age: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">age</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 默认 Props</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">text</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'Click'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">text</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>State 状态</h3>
<h4>useState Hook</h4>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Counter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Count: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;+1&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">prev</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> prev</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;-1&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>对象状态更新</h4>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserForm</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">email</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> });</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> updateField</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">field</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">prev</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({ </span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">prev</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">field</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]: </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        value</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        onChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> updateField</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'name'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        value</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">email</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        onChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> updateField</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'email'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>生命周期与副作用</h2>
<h3>useEffect</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserProfile</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">loading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 组件挂载 + userId 变化时执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    fetchUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, [</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">userId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 仅组件挂载时执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'Component mounted'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'Component will unmount'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }, []);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 每次渲染后执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    document</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">?.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> ||</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'Loading...'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  });</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  async</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> fetchUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">`/api/users/</span><span style="--shiki-light:#032F62;--shiki-dark:#C678DD">${</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#032F62;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">`</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">json</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    setUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    setLoading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">loading</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Loading...&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>事件处理</h2>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Form</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">text</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setText</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 事件对象</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handleChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    setText</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 阻止默认行为</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handleSubmit</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">preventDefault</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'Submitted:'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">text</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 传递参数</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handleClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'Clicked:'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onSubmit</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleSubmit</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">text</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleChange</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handleClick</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Click&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>表单处理</h2>
<h3>受控组件</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> LoginForm</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">formData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setFormData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    username</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    password</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">''</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  });</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handleSubmit</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">preventDefault</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">log</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">formData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  };</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onSubmit</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">handleSubmit</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">input</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"username"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        value</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">formData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">username</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        onChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setFormData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">prev</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">          ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">prev</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">          username</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }))</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">input</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        type</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"password"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        name</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"password"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        value</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">formData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">password</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">        onChange</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setFormData</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">prev</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ({</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">          ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">prev</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">          password</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">e</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">value</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }))</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> type</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"submit"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Login&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>组件通信</h2>
<h3>父子通信</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 父 -&gt; 子：通过 Props</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 子 -&gt; 父：通过回调函数</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Parent</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Count: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">Child</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> count</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onIncrement</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setCount</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">c</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> c</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Child</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">count</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">onIncrement</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">onIncrement</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;Count: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">count</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Context 跨层级通信</h3>
<div class="language-jsx line-numbers-mode" data-highlighter="shiki" data-ext="jsx" data-title="jsx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">createContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'react'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B"> ThemeContext</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> createContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> ThemeProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">({ </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">children</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> }) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">theme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">setTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'light'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> toggleTheme</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">=&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> setTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> =&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> t</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> ===</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'light'</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> ?</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'dark'</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> :</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'light'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">ThemeContext.Provider</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit">={{ theme, toggleTheme }}&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">      {</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">children</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit">    &lt;/ThemeContext.Provider&gt;</span></span>
<span class="line"><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit">  );</span></span>
<span class="line"><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">function</span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit"> ThemedButton()</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">theme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">toggleTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> useContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">ThemeContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> onClick</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">toggleTheme</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      Current theme: </span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">theme</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 使用</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">function</span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FFFFFF;--shiki-dark-font-style:inherit"> App()</span><span style="--shiki-light:#24292E;--shiki-dark:#C678DD"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">ThemeProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      &lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">ThemedButton</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">ThemeProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  );</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#C678DD">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>常用 Hooks</h2>
<p>| Hook | 用途 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>基于Kubernetes的Elasticsearch部署与IK分词器配置指南</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/ElasticSearch/%20%E5%9F%BA%E4%BA%8EKubernetes%E7%9A%84Elasticsearch%E9%83%A8%E7%BD%B2%E4%B8%8EIK%E5%88%86%E8%AF%8D%E5%99%A8%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/ElasticSearch/%20%E5%9F%BA%E4%BA%8EKubernetes%E7%9A%84Elasticsearch%E9%83%A8%E7%BD%B2%E4%B8%8EIK%E5%88%86%E8%AF%8D%E5%99%A8%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">基于Kubernetes的Elasticsearch部署与IK分词器配置指南</source>
      <description>基于Kubernetes的Elasticsearch部署与IK分词器配置指南 文档概述 本文档详细记录了在Kubernetes环境中部署Elasticsearch并配置IK中文分词器的完整过程，包括镜像构建、权限处理、配置验证等关键步骤。 1. 环境准备 1.1 基础环境要求 Kubernetes集群（Docker Desktop、Minikube或K...</description>
      <pubDate>Sat, 23 May 2026 10:25:26 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>文档概述</h2>
<p>本文档详细记录了在Kubernetes环境中部署Elasticsearch并配置IK中文分词器的完整过程，包括镜像构建、权限处理、配置验证等关键步骤。</p>
<h2>1. 环境准备</h2>
<h3>1.1 基础环境要求</h3>
<ul>
<li>Kubernetes集群（Docker Desktop、Minikube或K3s）</li>
<li>Docker环境</li>
<li>Elasticsearch版本：9.4.1</li>
<li>IK分词器版本：9.4.1</li>
</ul>
<h3>1.2 文件结构</h3>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span>es-ik-docker/</span></span>
<span class="line"><span>├── Dockerfile</span></span>
<span class="line"><span>└── elasticsearch-analysis-ik-9.4.1.zip</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>2. Docker镜像构建</h2>
<h3>2.1 Dockerfile配置</h3>
<div class="language-dockerfile line-numbers-mode" data-highlighter="shiki" data-ext="dockerfile" data-title="dockerfile" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> docker.elastic.co/elasticsearch/elasticsearch:9.4.1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 拷贝IK分词器插件</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> elasticsearch-analysis-ik-9.4.1.zip /tmp/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 临时切换到root用户处理权限问题</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">USER</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> root</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改文件属主并安装插件</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">RUN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> chown 1000:1000 /tmp/elasticsearch-analysis-ik-9.4.1.zip &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    /usr/share/elasticsearch/bin/elasticsearch-plugin install \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    file:///tmp/elasticsearch-analysis-ik-9.4.1.zip \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    --batch &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    rm /tmp/elasticsearch-analysis-ik-9.4.1.zip</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 切回安全的elasticsearch用户</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">USER</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> elasticsearch</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2.2 构建命令</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> my-elasticsearch-ik:9.4.1</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> .</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>3. Kubernetes部署配置</h2>
<h3>3.1 Deployment配置</h3>
<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">apiVersion</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">apps/v1</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">kind</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Deployment</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">elasticsearch-ik</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">spec</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  selector</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    matchLabels</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">      app</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">elasticsearch-ik</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  replicas</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  strategy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    type</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">Recreate</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  template</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    metadata</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">      labels</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        app</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">elasticsearch-ik</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    spec</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">      securityContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        fsGroup</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">      containers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">elasticsearch</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        image</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">my-elasticsearch-ik:9.4.1</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        ports</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">containerPort</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">9200</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">containerPort</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">9300</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        env</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">discovery.type</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"single-node"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ELASTIC_PASSWORD</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"your_secure_password"</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  # 示例密码</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">xpack.security.enabled</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"true"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ES_JAVA_OPTS</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"-Xms512m -Xmx512m"</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        volumeMounts</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">es-data</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          mountPath</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/usr/share/elasticsearch/data</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          subPath</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">elasticsearch-data</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">      volumes</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">es-data</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">        persistentVolumeClaim</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">          claimName</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">es-pvc</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>bpmn.js 流程引擎集成指南</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/bpmn-js-workflow.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/bpmn-js-workflow.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">bpmn.js 流程引擎集成指南</source>
      <description>基于 bpmn-js 18.x 版本的前端流程引擎集成与使用记录</description>
      <category>Frontend</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>📦 技术选型</h2>
<p>| 组件 | 版本 | 说明 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Dockerfile JDK 21 镜像制作记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/docker-dockerfile-jdk.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/docker-dockerfile-jdk.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Dockerfile JDK 21 镜像制作记录</source>
      <description>自定义 JDK 21 镜像，基于 tar.gz 包打包 Docker 镜像</description>
      <category>DevOps</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>🎯 场景说明</h2>
<p>需要将自建的 JDK 21 安装包打包成 Docker 镜像，用于容器化部署。</p>
<h2>📦 准备资源</h2>
<h3>下载 JDK 21</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 从 Oracle 官网下载</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># jdk-21_linux-x64_bin.tar.gz</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>目录结构</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">jdk-image/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> Dockerfile</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jdk-21_linux-x64_bin.tar.gz</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>📝 Dockerfile 编写</h2>
<div class="language-dockerfile line-numbers-mode" data-highlighter="shiki" data-ext="dockerfile" data-title="dockerfile" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> centos:7</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">MAINTAINER</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> Your Name &lt;your@email.com&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置环境变量</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">ENV</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> JAVA_HOME=/opt/java/jdk-21 \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    JRE_HOME=$JAVA_HOME/jre \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    LANG=en_US.UTF-8 \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    LC_ALL=en_US.UTF-8</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 复制 JDK 包到容器</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> jdk-21_linux-x64_bin.tar.gz /tmp/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 解压并清理</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">RUN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> cd /opt/java &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    tar -xzf /tmp/jdk-21_linux-x64_bin.tar.gz &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    rm -f /tmp/jdk-21_linux-x64_bin.tar.gz &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    chown -R root:root /opt/java &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    ln -sfn jdk-21 /opt/java/latest &amp;&amp; \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    echo $JAVA_HOME &gt;&gt; /etc/environment</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 暴露端口（可选）</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">EXPOSE</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> 8080</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 默认命令</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">CMD</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"java"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 健康检查</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">HEALTHCHECK</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> --interval=30s --timeout=3s \</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">    CMD</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> java -version || exit 1</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>🔨 构建镜像</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入项目目录</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jdk-image/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 构建镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> myjdk:21</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> .</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证构建</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> images</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> grep</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> myjdk</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 运行测试</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --rm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> myjdk:21</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> java</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>🚀 推送镜像仓库</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 登录 Docker Hub</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> login</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 标记镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> tag</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> myjdk:21</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> username/myjdk:21</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 推送</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> push</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> username/myjdk:21</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>💡 优化技巧</h2>
<h3>1. 使用多阶段构建减小体积</h3>
<div class="language-dockerfile line-numbers-mode" data-highlighter="shiki" data-ext="dockerfile" data-title="dockerfile" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> maven:3.9-eclipse-temurin-21 </span><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">as</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> build</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">WORKDIR</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /app</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> pom.xml .</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> src ./src</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">RUN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> mvn clean package -DskipTests</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> openjdk:21-jre-slim</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">COPY</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> --from=build /app/target/app.jar /app.jar</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">CMD</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"java"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"-jar"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/app.jar"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2. 添加镜像标签信息</h3>
<div class="language-dockerfile line-numbers-mode" data-highlighter="shiki" data-ext="dockerfile" data-title="dockerfile" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">LABEL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> maintainer=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Your Name"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">LABEL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> version=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"1.0"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#61AFEF">LABEL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> description=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Custom JDK 21 Image"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>⚠️ 注意事项</h2>
<ol>
<li><strong>文件大小</strong>：JDK 包约 300MB+，构建时间较长</li>
<li><strong>版本管理</strong>：建议打具体版本号，避免使用 <code>latest</code></li>
<li><strong>安全性</strong>：定期更新基础镜像和 JDK 版本</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Docker 安装与使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/docker-installation.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/docker-installation.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Docker 安装与使用记录</source>
      <description>CentOS/Ubuntu 环境下的 Docker 安装步骤及使用记录</description>
      <category>DevOps</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>🐳 CentOS/RHEL 安装步骤</h2>
<h3>1. 卸载旧版本</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-client</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-client-latest</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-common</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-latest</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-latest-logrotate</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-logrotate</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                 docker-engine</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2. 安装所需软件包</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum-utils</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                    device-mapper-persistent-data</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                    lvm2</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>3. 设置国内源（阿里云）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum-config-manager</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">    --add-repo</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>4. 安装最新版</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd.io</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-compose-plugin</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>5. 启动并开机自启</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> enable</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>6. 验证安装</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> version</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> info</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>🐧 Ubuntu/Debian 安装步骤</h2>
<h3>1. 卸载旧版本</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-engine</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker.io</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> runc</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>2. 更新包索引并安装依赖</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    apt-transport-https</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    ca-certificates</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    gnupg-agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    software-properties-common</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>3. 添加官方 GPG 密钥</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-key</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> -</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 指纹验证：9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>4. 添加稳定版仓库</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add-apt-repository</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">   "deb [arch=amd64] https://download.docker.com/linux/ubuntu </span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">   $(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">lsb_release</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -cs</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">) </span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">   stable"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>5. 安装 Docker Engine</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd.io</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>6. 测试运行 hello-world</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hello-world</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>⚡ 常用命令速查</h2>
<p>| 命令 | 说明 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>关于技术博客</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/intro.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/intro.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">关于技术博客</source>
      <description>📚 关于本博客 这是个人技术学习记录的博客，专注于分享： 后端开发: Java、Spring Boot、微服务架构 DevOps: Docker、Kubernetes、持续集成 前端工程: bpmn.js、流程引擎、现代化 Web 开发 系统设计: 分布式系统、高可用架构 🎯 写作目的 知识沉淀 - 将碎片化的学习经验系统化 技术交流 - 与社区同...</description>
      <category>Meta</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这是个人技术学习记录的博客，专注于分享：</p>
<ul>
<li><strong>后端开发</strong>: Java、Spring Boot、微服务架构</li>
<li><strong>DevOps</strong>: Docker、Kubernetes、持续集成</li>
<li><strong>前端工程</strong>: bpmn.js、流程引擎、现代化 Web 开发</li>
<li><strong>系统设计</strong>: 分布式系统、高可用架构</li>
</ul>
<h2>🎯 写作目的</h2>
<ol>
<li><strong>知识沉淀</strong> - 将碎片化的学习经验系统化</li>
<li><strong>技术交流</strong> - 与社区同行互相学习</li>
<li><strong>成长记录</strong> - 见证自己的技术进阶之路</li>
</ol>
<h2>📖 内容规划</h2>
<p>当前主要覆盖以下技术领域：</p>
<p>| 分类 | 主题 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Java 日志框架实践指南</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/java-logging-framework.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/java-logging-framework.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Java 日志框架实践指南</source>
      <description>对比 Logback、Log4j2 等日志框架，搭建企业级日志系统</description>
      <category>Java</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>📚 主流日志框架对比</h2>
<p>| 框架 | 实现 | 特点 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Spring Security 集成实践</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/java-security-integration.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/java-security-integration.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Spring Security 集成实践</source>
      <description>在 Spring Boot 项目中集成 Spring Security，实现用户认证与权限控制</description>
      <category>Java</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>🎯 快速集成</h2>
<h3>Maven 依赖</h3>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-security&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;3.2.6&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">&lt;!-- 与项目版本一致 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>⚙️ 基础配置示例</h2>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Configuration</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">EnableWebSecurity</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> SecurityConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Bean</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> SecurityFilterChain</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> filterChain</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpSecurity</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> http</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        http</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authorizeHttpRequests</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(auth </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> auth</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">requestMatchers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/public/**"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">anyRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authenticated</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">formLogin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(form </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> form</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">loginPage</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/login"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">logout</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(logout </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> logout</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> http</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Bean</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> PasswordEncoder</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> passwordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> BCryptPasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>🔐 用户详情实现</h2>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Service</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> UserDetailsServiceImpl</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> UserDetailsService</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Autowired</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> UserService</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> userService</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">    </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> UserDetails</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> loadUserByUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">String</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> username</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#61AFEF"> </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> UsernameNotFoundException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        User</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> userService</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">findByUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(username);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (user </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            throw</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UsernameNotFoundException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"用户不存在"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">withUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">password</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">passwordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">encode</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getPassword</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authorities</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">user</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getRoles</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">accountExpired</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">accountLocked</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">credentialsExpired</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">disabled</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                  .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>💡 安全建议</h2>
<ol>
<li><strong>密码加密</strong>：使用 BCrypt 强加密算法</li>
<li><strong>CSRF 保护</strong>：默认开启，REST API 可禁用</li>
<li><strong>CORS 配置</strong>：跨域场景需显式配置</li>
<li><strong>会话管理</strong>：生产环境建议使用无状态 JWT</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>SpringBoot 项目构建指南</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/java-springboot-build.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/java-springboot-build.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">SpringBoot 项目构建指南</source>
      <description>如何选择合适版本，配置 pom.xml，快速构建 Spring Boot 项目</description>
      <category>Java</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>📋 选择合适版本</h2>
<h3>Spring Boot 官网</h3>
<ul>
<li>下载地址：https://spring.io/projects/spring-boot</li>
<li>版本发布说明：https://github.com/spring-projects/spring-boot/releases</li>
</ul>
<h3>Maven 仓库</h3>
<ul>
<li>查询坐标：https://mvnrepository.com/</li>
<li>搜索 <code>org.springframework.boot:spring-boot-starter-parent</code></li>
</ul>
<h2>🛠️ 配置 pom.xml</h2>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">parent</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-parent&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;3.2.6&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">&lt;!-- 根据需求选择版本 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">parent</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependencies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-web&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 其他 starter --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependencies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>⚙️ application.yml 基础配置</h2>
<div class="language-yaml line-numbers-mode" data-highlighter="shiki" data-ext="yaml" data-title="yaml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">server</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  port</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">8080</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">spring</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  application</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">my-application</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">  profiles</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">    active</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">dev</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>📝 启动类示例</h2>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">SpringBootApplication</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> Application</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> static</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">String</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">[] </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">args</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        SpringApplication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">run</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">Application</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, args);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>💡 注意事项</h2>
<ol>
<li><strong>JDK 版本要求</strong>：Spring Boot 3.x 需要 JDK 17+</li>
<li><strong>Maven 版本</strong>：建议使用 Maven 3.8+</li>
<li><strong>版本号对齐</strong>：确保各依赖版本兼容</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes 基础概念与实践</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/kubernetes-basics.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/kubernetes-basics.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Kubernetes 基础概念与实践</source>
      <description>Kubernetes 入门：Pod、Service、Deployment 基本概念与实践</description>
      <category>DevOps</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>📚 核心概念速览</h2>
<p>| 概念 | 说明 |
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Nginx RTMP 模块搭建直播流服务</title>
      <link>https://xiaomaohuifaguang.github.io/blog/posts/nginx-rtmp-streaming.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/posts/nginx-rtmp-streaming.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Nginx RTMP 模块搭建直播流服务</source>
      <description>使用 nginx-rtmp-module 搭建直播流服务，支持 HLS/FLV 播放</description>
      <category>DevOps</category>
      <pubDate>Sat, 21 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>🎯 功能概述</h2>
<p><code>nginx-rtmp-module</code> 是一个 Nginx 的第三方模块，用于实现实时媒体流协议（RTMP、HLS、HTTP-FLV）的支持。</p>
<h2>📦 安装方式</h2>
<h3>方式一：使用编译好的 Nginx（推荐）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># CentOS/RHEL</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> epel-release</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> nginx-rtmp-module</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Ubuntu/Debian</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> nginx-extras</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>方式二：从源码编译</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 克隆 Nginx RTMP 模块</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://github.com/arut/nginx-rtmp-module.git</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编译 Nginx</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">./configure</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --add-module=/path/to/nginx-rtmp-module</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> make</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>⚙️ 配置文件示例</h2>
<div class="language-nginx line-numbers-mode" data-highlighter="shiki" data-ext="nginx" data-title="nginx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># /etc/nginx/conf.d/rtmp.conf</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">worker_processes </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">events</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    worker_connections </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1024</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">rtmp</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    server</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        listen </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">1935</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        chunk_size</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 4096</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # 推流地址：rtmp://your-ip/live/stream</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        application</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> live {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            live</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            record</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> off</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # HLS 配置</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> on;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            hls_path</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /var/www/hls;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            hls_fragment </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">2s</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            hls_playlist_length</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 60s</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # HTTP-FLV 配置</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            push</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> http://your-ip:8080/stream.flv;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # 点播应用</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        application</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> vod {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            play</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /var/www/flv;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">http</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    server</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        listen </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">80</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # 静态文件服务</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        location</span><span style="--shiki-light:#6F42C1;--shiki-dark:#ABB2BF"> /hls </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            types</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">                application/vnd.apple.mpegurl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> m3u8;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">                video/mp2t</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ts;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            root </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/var/www;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            add_header </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">Cache-Control no-cache;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # FLV 流访问</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        location</span><span style="--shiki-light:#6F42C1;--shiki-dark:#ABB2BF"> /stream.flv </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            proxy_pass </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">http://localhost:1935;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">            proxy_buffering </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>▶️ 推流客户端</h2>
<h3>OBS Studio 配置</h3>
<ol>
<li><strong>推流地址</strong>: <code>rtmp://your-server-ip/live</code></li>
<li><strong>流名称</strong>: <code>stream_key</code> (完整的流地址：<code>rtmp://ip/live/stream_key</code>)</li>
<li><strong>视频编码</strong>: H.264</li>
<li><strong>音频编码</strong>: AAC</li>
</ol>
<h3>FFmpeg 推流</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" data-title="bash" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 录制本地视频推流</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ffmpeg</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -re</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> input.mp4</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -c:v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> libx264</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -preset</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> veryfast</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -b:v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 2000k</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -maxrate</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 2000k</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">       -bufsize</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 4000k</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 50</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -c:a</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> aac</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -b:a</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 128k</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> flv</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rtmp://server/live/stream</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 推流屏幕内容</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ffmpeg</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> gdigrab</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -framerate</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 30</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> desktop</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -c:v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> libx264</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -preset</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ultrafast</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">       -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> flv</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rtmp://server/live/screen</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>🎬 播放器集成</h2>
<h3>HTML5 播放 HLS</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" data-title="html" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">&lt;!-- 需要引入 hls.js --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> src</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"https://cdn.jsdelivr.net/npm/hls.js@latest"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  var</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> video</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> document</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getElementById</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'video'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  var</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> hlsUrl</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'http://your-ip/hls/stream.m3u8'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">Hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">isSupported</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    var</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> hls</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> Hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">loadSource</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">hlsUrl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">attachMedia</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">video</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  } </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">video</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">canPlayType</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">'application/vnd.apple.mpegurl'</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">    video</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">src</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> hlsUrl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">video</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"video"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> controls</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> autoplay</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">video</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Flash 播放器（已淘汰，仅参考）</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" data-title="html" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">object</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"application/x-shockwave-flash"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66">        data</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"http://your-ip/stream.flv"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66">        width</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"640"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> height</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"480"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">object</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>📊 监控与日志</h2>
<div class="language-nginx line-numbers-mode" data-highlighter="shiki" data-ext="nginx" data-title="nginx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启用访问日志</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">access_log </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/var/log/nginx/rtmp_access.log combined;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 错误日志</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">error_log </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/var/log/nginx/rtmp_error.log </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">warn</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 状态页面</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">location</span><span style="--shiki-light:#6F42C1;--shiki-dark:#ABB2BF"> /status </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    stub_status</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> on;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">location</span><span style="--shiki-light:#6F42C1;--shiki-dark:#ABB2BF"> /stats </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    xml</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>💡 常见问题</h2>
<h3>Q1: 为什么推流失败？</h3>
<ul>
<li>检查防火墙是否开放 1935 端口</li>
<li>确认推流客户端配置正确</li>
</ul>
<h3>Q2: HLS 延迟过高？</h3>
<ul>
<li>调整 <code>hls_fragment</code> 为更小的值（如 1-2 秒）</li>
<li>但会增大带宽消耗</li>
</ul>
<h3>Q3: 如何防盗链？</h3>
<div class="language-nginx line-numbers-mode" data-highlighter="shiki" data-ext="nginx" data-title="nginx" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">location</span><span style="--shiki-light:#6F42C1;--shiki-dark:#ABB2BF"> /hls </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    valid_referers </span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">none blocked your-domain.com;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ($</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">invalid_referer</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 403</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>设计器-BPMN-JS</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E/BPMB-JS.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%B5%81%E7%A8%8B%E5%BC%95%E6%93%8E/BPMB-JS.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">设计器-BPMN-JS</source>
      <description>设计器-BPMN-JS 学习环境 网址 https://bpmn.io/toolkit/bpmn-js/ https://github.com/miyuesc/bpmn-process-designer https://www.bpmport.com/products https://github.com/moon-studio/vite-vue-bp...</description>
      <category>学习记录</category>
      <pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>学习环境</h2>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span>"vue": "^3.4.29",</span></span>
<span class="line"><span>"bpmn-js": "^18.1.2",</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>网址</h2>
<p><a href="https://bpmn.io/toolkit/bpmn-js/" target="_blank" rel="noopener noreferrer">https://bpmn.io/toolkit/bpmn-js/</a><br>
<a href="https://github.com/miyuesc/bpmn-process-designer" target="_blank" rel="noopener noreferrer">https://github.com/miyuesc/bpmn-process-designer</a><br>
<a href="https://www.bpmport.com/products" target="_blank" rel="noopener noreferrer">https://www.bpmport.com/products</a><br>
<a href="https://github.com/moon-studio/vite-vue-bpmn-process" target="_blank" rel="noopener noreferrer">https://github.com/moon-studio/vite-vue-bpmn-process</a><br>
<a href="https://gitee.com/lwj/eagle-flow" target="_blank" rel="noopener noreferrer">https://gitee.com/lwj/eagle-flow</a></p>
<h2>适配flowable</h2>
]]></content:encoded>
    </item>
    <item>
      <title>Nginx插件</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Nginx/%E6%8F%92%E4%BB%B6.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Nginx/%E6%8F%92%E4%BB%B6.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Nginx插件</source>
      <description>Nginx插件 nginx-rtmp-module 直播流插件 配置监听 配置 ngx-fancyindex 配置nginx.conf</description>
      <category>学习记录</category>
      <pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>nginx-rtmp-module</h2>
<blockquote>
<p>直播流插件</p>
</blockquote>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 插件源码 https://github.com/arut/nginx-rtmp-module.git</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 找一个路径执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://github.com/arut/nginx-rtmp-module.git</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># cd 到nginx源码安装目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">./configure</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --prefix=/root/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --add-module=/刚才克隆的路径绝对路径/nginx-rtmp-module</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## nginx 的源码目录会多一个 objs文件夹 文件夹下会有nginx 可执行文件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## 替换到nginx安装目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>配置监听</p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">rtmp</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    server</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        listen</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1935</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        chunk_size</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 4096</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        application</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> live</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            live</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            record</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> off</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # 添加 HLS 支持</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            hls</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            hls_path</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /root/nginx/html/hls</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            hls_fragment</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 1s</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;  </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 将 HLS 切片大小设置为 1 秒</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            hls_playlist_length</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 10s</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;  </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 将播放列表长度设置为 3 秒</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            hls_cleanup</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>配置</p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">    server</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        listen</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 8080</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        server_name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> localhost</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">       </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        location</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /hls</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            types</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">                application/vnd.apple.mpegurl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> m3u8</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">                video/mp2t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ts</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            root</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /root/nginx/html</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            add_header</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> Cache-Control</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> no-cache</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>ngx-fancyindex</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 插件源码 https://github.com/aperezdc/ngx-fancyindex</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 找一个路径执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> clone</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://github.com/aperezdc/ngx-fancyindex</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># cd 到nginx源码安装目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">./configure</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --prefix=/root/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --add-module=/刚才克隆的路径绝对路径/ngx-fancyindex</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## nginx 的源码目录会多一个 objs文件夹 文件夹下会有nginx 可执行文件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## 替换到nginx安装目录</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>配置nginx.conf</p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">        location</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /mirror</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">            alias</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /root/mirror</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex_exact_size</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> off</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex_localtime</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # fancyindex_header "/mirror/custom_style/header.html";</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # fancyindex_footer "/mirror/custom_style/footer.html";</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex_header</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "/mirror/custom_style/Nginx-Fancyindex/header.html"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex_footer</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "/mirror/custom_style/Nginx-Fancyindex/footer.html"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            fancyindex_ignore</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "custom_style"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            autoindex</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            autoindex_exact_size</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> off</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            autoindex_localtime</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">            charset</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> utf-8</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    	}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Joker-Box</title>
      <link>https://xiaomaohuifaguang.github.io/blog/projects/Joker-Box.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/projects/Joker-Box.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Joker-Box</source>
      <description>Joker-Box jdk 21.0.3 springboot 3.2.6 AUTH-SERVER鉴权服务</description>
      <category>项目</category>
      <pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<blockquote>
<p>jdk 21.0.3
springboot 3.2.6</p>
</blockquote>
<h2>AUTH-SERVER鉴权服务</h2>
]]></content:encoded>
    </item>
    <item>
      <title>Dockerfile使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Docker/Dockerfile%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Docker/Dockerfile%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Dockerfile使用记录</source>
      <description>Dockerfile使用记录 jdk镜像 准备jdk-21_linux-x64_bin.tar.gz 制作镜像 保存镜像 加载镜像</description>
      <category>学习记录</category>
      <pubDate>Sat, 29 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>jdk镜像</h2>
<ul>
<li>准备jdk-21_linux-x64_bin.tar.gz</li>
</ul>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> centos:centos7.9.2009</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#时区设置及中文字符集配置</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">RUN</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &amp;&amp; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ln</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -sf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/zoneinfo/Asia/Shanghai</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/localtime</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &amp;&amp; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kde-l10n-Chinese</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &amp;&amp; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">localedef</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> UTF-8</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zh_CN</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zh_CN.utf8</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &amp;&amp; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> clean</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> all</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#复制jdk</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ADD</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jdk-21_linux-x64_bin.tar.gz</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#设置中文字符集</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ENV</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> LC_ALL</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zh_CN.utf8</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#配置Java环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ENV</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> JAVA_HOME="/usr/local/jdk-21.0.3"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ENV</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> PATH="${</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">}:${</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">JAVA_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">}/bin"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>制作镜像</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --no-cache</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> catjdk:21.0.3</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> .</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>保存镜像</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> save</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> catjdk-21.0.3.tar</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> catjdk:21.0.3</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>加载镜像</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> load</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> catjdk-21.0.3.tar</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Spring Security</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/Security.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/Security.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Spring Security</source>
      <description>Spring Security 集成Security maven 配置 SecurityConfig 实现UserDetails 自定义过滤器 自定义授权管理器AuthorizationManager 自定义鉴权失败异常处理器AuthenticationEntryPoint 自定义权限不通过异常处理器AccessDeniedHandler</description>
      <category>学习记录</category>
      <pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>集成Security</h2>
<h3>maven</h3>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-security&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;版本&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>配置</h2>
<h3>SecurityConfig</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> com.cat.common.entity.LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.annotation.Resource</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.context.annotation.Bean</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.context.annotation.Configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.config.annotation.web.builders.HttpSecurity</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.config.annotation.web.configuration.EnableWebSecurity</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.config.http.SessionCreationPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.userdetails.User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.userdetails.UserDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.userdetails.UserDetailsService</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.crypto.password.PasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.provisioning.InMemoryUserDetailsManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.web.SecurityFilterChain</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * SpringSecurity配置</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title SecurityConfig</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description SpringSecurity配置</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2024/6/19 23:14</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Configuration</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">EnableWebSecurity</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> SecurityConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     * 认证过滤器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Resource</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> AuthFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> authFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     * 授权处理器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Resource</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> AuthorizationManagerImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> authorizationManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     * 认证失败 异常处理</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Resource</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> AuthenticationEntryPointImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> authenticationEntryPoint</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     * 授权失败 异常处理</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Resource</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> AccessDeniedHandlerImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> accessDeniedHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Bean</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> SecurityFilterChain</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> filterChain</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpSecurity</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> http</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> Exception</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        http</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">addFilterBefore</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(authFilter, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UsernamePasswordAuthenticationFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">csrf</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(AbstractHttpConfigurer</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">disable)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                // 禁用session</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sessionManagement</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(sessionManagement</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                    sessionManagement</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sessionCreationPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">SessionCreationPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">STATELESS</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authorizeHttpRequests</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(authorize </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                            // 白名单</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                            authorize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">requestMatchers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/doc.html"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                            authorize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">requestMatchers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/webjars/**"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                            authorize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">requestMatchers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/favicon.ico"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                            authorize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">requestMatchers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"/v3/api-docs/**"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">permitAll</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                            authorize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">anyRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authenticated</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">//                            authorize.anyRequest().access(authorizationManager);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">exceptionHandling</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(exceptionHandling </span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">-&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                    // 认证失败</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                    exceptionHandling</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">authenticationEntryPoint</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(authenticationEntryPoint);</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                    // 授权失败</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">                    exceptionHandling</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">accessDeniedHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(accessDeniedHandler);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">httpBasic</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(AbstractHttpConfigurer</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">disable)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                // 屏蔽原有登录</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">formLogin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(AbstractHttpConfigurer</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">disable)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                // 屏蔽原有登出</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">logout</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(AbstractHttpConfigurer</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">::</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">disable);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> http</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Bean</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> UserDetailsService</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> userDetailsService</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> loginUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setUserId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">randomUUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">toString</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">randomUUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">toString</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setNickname</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">randomUUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">toString</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        UserDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> userDetails</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">withUserDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserDetailsImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(loginUser)).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> InMemoryUserDetailsManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(userDetails);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Bean</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> PasswordEncoder</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> passwordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> BCryptPasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>实现UserDetails</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> com.cat.common.entity.LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.GrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.authority.SimpleGrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.userdetails.UserDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.Collection</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.List</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title UserDetailsImpl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2024/6/20 0:36</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> UserDetailsImpl</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> UserDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    private</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> final</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserDetailsImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">LoginUser</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">        this</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">loginUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> loginUser;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> Collection</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">?</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> extends</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B"> GrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> getAuthorities</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> List</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">of</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> SimpleGrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"USER"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">));</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> getPassword</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> BCryptPasswordEncoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">encode</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">randomUUID</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">toString</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> String</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> getUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getNickname</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> boolean</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> isAccountNonExpired</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> boolean</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> isAccountNonLocked</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> boolean</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> isCredentialsNonExpired</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> boolean</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> isEnabled</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>自定义过滤器</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> com.cat.common.entity.LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.</span><span style="--shiki-light:#005CC5;--shiki-dark:#E5C07B">*</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletResponse</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.authentication.UsernamePasswordAuthenticationToken</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.context.SecurityContextHolder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.stereotype.Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.web.filter.OncePerRequestFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.io.IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * 登录过滤器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title AuthFilter</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2024/6/20 0:48</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AuthFilter</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> OncePerRequestFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    protected</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> doFilterInternal</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletRequest</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> request</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletResponse</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">FilterChain</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> filterChain</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> ServletException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 这里实际应该从request 中取得 请求的参数（包括请求头等） 去完成鉴权保存用户信息 到SecurityContextHolder</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> loginUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> LoginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setUserId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"admin"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setUsername</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"admin"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        loginUser</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setNickname</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"超级管理员"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        UserDetailsImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> userDetails</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UserDetailsImpl</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(loginUser);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 保存用户信息 到SecurityContextHolder</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        UsernamePasswordAuthenticationToken</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> authenticationToken</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> UsernamePasswordAuthenticationToken</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(userDetails, </span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">null</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">userDetails</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getAuthorities</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        SecurityContextHolder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setAuthentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(authenticationToken);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        filterChain</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">doFilter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(request, response);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>自定义授权管理器AuthorizationManager</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.authorization.AuthorizationDecision</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.authorization.AuthorizationManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.Authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.GrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.web.access.intercept.RequestAuthorizationContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.stereotype.Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.Collection</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.util.function.Supplier</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * 授权处理器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title AuthorizationManagerImpl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2024/6/20 1:31</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AuthorizationManagerImpl</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AuthorizationManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">RequestAuthorizationContext</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> verify</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">Supplier</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">RequestAuthorizationContext</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> object</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        AuthorizationManager</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">super</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">verify</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(authentication, object);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> AuthorizationDecision</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> check</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">Supplier</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">RequestAuthorizationContext</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> object</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        HttpServletRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> request</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> object</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        String</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> path</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> request</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getServletPath</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        Collection</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">?</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> extends</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B"> GrantedAuthority</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">authorities</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> authentication</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getAuthorities</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 这里要对 path 和当前用户的角色做匹配 true 通过 false 不通过</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> AuthorizationDecision</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>自定义鉴权失败异常处理器AuthenticationEntryPoint</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletResponse</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.http.HttpStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.core.AuthenticationException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.web.AuthenticationEntryPoint</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.stereotype.Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.io.IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.io.PrintWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * 认证失败处理器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title AuthenticationEntryPointImpl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2023/8/8 21:23</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AuthenticationEntryPointImpl</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AuthenticationEntryPoint</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> commence</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletRequest</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> request</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletResponse</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">AuthenticationException</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> authException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">UNAUTHORIZED</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setContentType</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"application/json;utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        PrintWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> printWriter</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">write</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"{}"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">flush</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">close</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>自定义权限不通过异常处理器AccessDeniedHandler</h3>
<div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" data-title="java" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletRequest</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> jakarta.servlet.http.HttpServletResponse</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.http.HttpStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.access.AccessDeniedException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.security.web.access.AccessDeniedHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> org.springframework.stereotype.Component</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.io.IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> java.io.PrintWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">/***</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * 授权失败处理器</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @title AccessDeniedHandlerImpl</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @description &lt;TODO description class purpose&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * </span><span style="--shiki-light:#D73A49;--shiki-light-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">@author</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> xiaomaohuifaguang</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> * @create 2023/8/8 21:26</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> **/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">@</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Component</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AccessDeniedHandlerImpl</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> implements</span><span style="--shiki-light:#6F42C1;--shiki-dark:#E5C07B"> AccessDeniedHandler</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    @</span><span style="--shiki-light:#D73A49;--shiki-dark:#E5C07B">Override</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">    public</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> handle</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletRequest</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> request</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpServletResponse</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">AccessDeniedException</span><span style="--shiki-light:#E36209;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> accessDeniedException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD"> throws</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> IOException</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">HttpStatus</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">FORBIDDEN</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">());</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">setContentType</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"application/json;utf-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        PrintWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> printWriter</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B"> response</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">getWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">write</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"{}"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">flush</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E5C07B">        printWriter</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">close</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>SpringBoot</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/SpringBoot.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/SpringBoot.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">SpringBoot</source>
      <description>SpringBoot 构建项目 选择合适版本引入到pom文件 spring 官网 mvn仓库 热部署 常见 pom.xml 配置 打包指定主启动类 ！该问题常出现在打包后，启动jar包找不到启动类 接口文档doc Knife4j https://doc.xiaominfo.com/</description>
      <category>学习记录</category>
      <pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>构建项目</h2>
<p>选择合适版本引入到pom文件</p>
<blockquote>
<p><a href="https://spring.io/" target="_blank" rel="noopener noreferrer">spring 官网</a><br>
<a href="https://mvnrepository.com/" target="_blank" rel="noopener noreferrer">mvn仓库</a></p>
</blockquote>
<h2>热部署</h2>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-devtools&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;版本&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>常见 pom.xml 配置</h2>
<h3>打包指定主启动类</h3>
<blockquote>
<p>！该问题常出现在打包后，启动jar包找不到启动类</p>
</blockquote>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">plugins</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-maven-plugin&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                // &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">mainClass</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;主启动类型路径（包.启动类）&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">mainClass</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                // 样例</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">mainClass</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;com.cat.auth.AuthServerApplication&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">mainClass</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">executions</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">execution</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">goals</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">goal</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;repackage&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">goal</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">goals</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">execution</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">executions</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">plugins</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">build</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>接口文档doc</h2>
<h3>Knife4j</h3>
<blockquote>
<p><a href="https://doc.xiaominfo.com/" target="_blank" rel="noopener noreferrer">https://doc.xiaominfo.com/</a></p>
</blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>日志框架</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">日志框架</source>
      <description>日志框架 Log4j2 官网 https://logging.apache.org/log4j/2.x/ 配置 引入依赖 resources下新建文件log4j2.xml Logging 使用springboot 自带日志框架 spring-boot-starter-logging 使用方式 resources下新建文件logback.xml</description>
      <category>学习记录</category>
      <pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>Log4j2</h2>
<h3>官网</h3>
<blockquote>
<p><a href="https://logging.apache.org/log4j/2.x/" target="_blank" rel="noopener noreferrer">https://logging.apache.org/log4j/2.x/</a></p>
</blockquote>
<h3>配置</h3>
<p>引入依赖</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-web&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!--此处移除默认日志框架 避免冲突--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">exclusions</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">exclusion</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-logging&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">exclusion</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">exclusions</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt; </span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">&lt;!-- 引入log4j2依赖 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;org.springframework.boot&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">groupId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;spring-boot-starter-log4j2&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">artifactId</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">dependency</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>resources下新建文件log4j2.xml</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Configuration</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> status</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"WARN"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> monitorInterval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"1800"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!--变量配置--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Properties</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--应用名称 自己项目名（随意自定义最好是 规范性的 方便管理日志 ）--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"APP_NAME"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;auth&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--日志存放路径 这里路径也是自定义--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"LOG_PATH"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;/home/user1/${APP_NAME}&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--日志备份路径--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"LOG_BACKUP_PATH"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;${LOG_PATH}/backup&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--日志输出格式-控制台--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"PATTERN_CONSOLE"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} | %blue{%traceId} | %highlight{%-5p} | %magenta{${sys:PID}} | %yellow{%t} | %cyan{%l} : %msg%n&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--日志输出格式-文件--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"PATTERN_FILE"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;%d{yyyy-MM-dd HH:mm:ss.SSS} | %traceId | %-5p | ${sys:PID} | %t | %l : %msg%n&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Properties</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!--定义日志输出目的地，内容和格式等--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Appenders</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Console</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Console"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> target</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"SYSTEM_OUT"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">PatternLayout</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${PATTERN_CONSOLE}"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Console</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--可归档文件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            1. fileName: 日志存储路径</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            2. filePattern: 历史日志封存路径。其中%d{yyyy-MM-dd}表示了日志的时间单位是天,log4j2自动识别zip等后缀，表示历史日志需要压缩</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">RollingFile</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFile"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> fileName</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${LOG_PATH}/server.log"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> filePattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.zip"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!--输出日志的格式, 不设置默认为:%m%n--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">PatternLayout</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${PATTERN_FILE}"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!--只输出level及以上级别的信息（onMatch），其他的直接拒绝（onMismatch）--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">ThresholdFilter</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> level</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"DEBUG"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> onMatch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ACCEPT"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> onMismatch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"DENY"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!--归档设置--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Policies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                &lt;!--按时间间隔归档:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                    1. interval=时间间隔, 单位由filePattern的%d日期格式指定, 此处配置代表每一天归档一次</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                    2. modulate="true" 是否对interval取模，决定了下一次触发的时间点</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">TimeBasedTriggeringPolicy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> interval</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"1"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> modulate</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"true"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> /&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                &lt;!-- 按照日志文件的大小: size表示当前日志文件的最大size，支持单位：KB/MB/GB--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">SizeBasedTriggeringPolicy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> size</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"50MB"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Policies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!-- 历史日志配置: 该属性如不设置，则默认为最多同一文件夹下7个文件开始覆盖--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">DefaultRolloverStrategy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> max</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"30"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">RollingFile</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--错误信息单独归档--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">RollingFile</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFileError"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> fileName</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${LOG_PATH}/error.log"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> filePattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}_%i.log.zip"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">PatternLayout</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"${PATTERN_FILE}"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">ThresholdFilter</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> level</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ERROR"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> onMatch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ACCEPT"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> onMismatch</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"DENY"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Policies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">TimeBasedTriggeringPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">SizeBasedTriggeringPolicy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> size</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"50MB"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Policies</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">RollingFile</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Appenders</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!--Loggers配置--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Loggers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!--</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        注意点:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        1. logger节点用来单独指定日志的形式，比如要为指定包下的class指定不同的日志级别等:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           (1). name: 用来指定该logger所适用的类或者类所在的包全路径,继承自Root节点.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           (2). AppenderRef：关联的Appender, 只有定义了logger并引入的appender，appender才会生效</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           (3). additivity: logEvent的传递性。true LogEvent处理后传递给父Logger打印。false LogEvent处理后不再向上传递给父Logger(解决日志重复输出问题)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           (4). logger配置的level必须高于或等于Appenders中ThresholdFilter配置的过滤level, 否则会造成信息丢失</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        2. root配置日志的根节点</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        --&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!-- 同步日志配置--&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">logger</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"com.cat.wg.mapper"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> level</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"debug"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> additivity</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"false"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Console"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFile"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFileError"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">logger</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">root</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> level</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"info"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"Console"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFile"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">AppenderRef</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"RollingFileError"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">root</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Loggers</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">Configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Logging</h2>
<p>使用springboot 自带日志框架 spring-boot-starter-logging</p>
<h3>使用方式</h3>
<p>resources下新建文件logback.xml</p>
<div class="language-xml line-numbers-mode" data-highlighter="shiki" data-ext="xml" data-title="xml" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;?</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">xml</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> version</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"1.0"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> encoding</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"UTF-8"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">?&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 定义日志文件的存储路径 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"LOG_FILE_PATH"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"./logs"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 定义日志文件的文件名 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"LOG_FILE"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"app.log"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 定义日志的模式（支持变量） --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">property</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"LOG_PATTERN"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 控制台输出 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"CONSOLE"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ch.qos.logback.core.ConsoleAppender"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">encoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;${LOG_PATTERN}&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">encoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 文件输出 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"FILE"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ch.qos.logback.core.rolling.RollingFileAppender"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        &lt;!-- 定义日志文件的路径和文件名 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">file</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;${LOG_FILE_PATH}/${LOG_FILE}&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">file</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">encoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;${LOG_PATTERN}&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">pattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">encoder</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">rollingPolicy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!-- 日志文件名格式 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">fileNamePattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;${LOG_FILE_PATH}/app-%d{yyyy-MM-dd}.%i.log&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">fileNamePattern</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!-- 保留天数 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">maxHistory</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;30&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">maxHistory</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            &lt;!-- 日志文件最大大小 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">timeBasedFileNamingAndTriggeringPolicy</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">                &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">maxFileSize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;10MB&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">maxFileSize</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">            &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">timeBasedFileNamingAndTriggeringPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">rollingPolicy</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    &lt;!-- 日志级别 --&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">root</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> level</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"INFO"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender-ref</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"CONSOLE"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">appender-ref</span><span style="--shiki-light:#6F42C1;--shiki-dark:#D19A66"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"FILE"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">/&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    &lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">root</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/</span><span style="--shiki-light:#22863A;--shiki-dark:#E06C75">configuration</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>K8s基础学习</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/K8s/%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/K8s/%E5%9F%BA%E7%A1%80%E5%AD%A6%E4%B9%A0.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">K8s基础学习</source>
      <description>K8s基础学习 基础模块 基础知识 基础模型图基础模型图</description>
      <category>学习记录</category>
      <pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>基础模块</h2>
<blockquote>
<p><a href="https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/" target="_blank" rel="noopener noreferrer">基础知识</a></p>
</blockquote>
<figure><img src="/assets/学习记录/K8s/基础模型图.png" alt="基础模型图" tabindex="0" loading="lazy"><figcaption>基础模型图</figcaption></figure>
]]></content:encoded>
      <enclosure url="https://xiaomaohuifaguang.github.io/blog/assets/学习记录/K8s/基础模型图.png" type="image/png"/>
    </item>
    <item>
      <title>K8s使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/K8s/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/K8s/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">K8s使用记录</source>
      <description>K8s使用记录 网址 Kubernetes 官网 Kubernetes 中文网 下载安装 windows kubectl安装 minikube 安装 使用minikube</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>网址</h2>
<blockquote>
<p><a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer">Kubernetes 官网</a><br>
<a href="https://kubernetes.p2hp.com/" target="_blank" rel="noopener noreferrer">Kubernetes 中文网</a></p>
</blockquote>
<h2>下载安装</h2>
<h3>windows</h3>
<h4>kubectl安装</h4>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 官网教程 https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建目录 例如： D:\\k8s</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载kubectl.exe 到该目录</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 最新稳定版本查询</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">https://dl.k8s.io/release/stable.txt</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 方式一 如果你已安装了 curl，也可以使用此命令</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">https://cdn.dl.k8s.io/release/v1.30.0/bin/windows/amd64/kubectl.exe</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 方式二</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">curl.exe</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -LO</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "https://dl.k8s.io/release/v1.30.0/bin/windows/amd64/kubectl.exe"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 当前目录下执行 验证版本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> version</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --client</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> version</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --client</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --output=yaml</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加环境变量 Path 追加一个 D:\\k8s</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>minikube 安装</h4>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 官网教程 https://minikube.sigs.k8s.io/docs/start/?arch=%2Fwindows%2Fx86-64%2Fstable%2F.exe+download#Service</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载可执行安装包地址https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看所有相关指令</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -h</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>使用minikube</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用docker作为驱动程序启动</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --driver=docker</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置 docker作为默认驱动程序 （可选）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> driver</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 删除</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> delete</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 面板</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> dashboard</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动一个新的终端，并保持此命令运行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> dashboard</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --url</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看节点情况</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> nodes</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 访问集群通过kubectl</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> po</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -A</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建示例部署并将其公开在端口 8080 上</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> deployment</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hello-minikube</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --image=kicbase/echo-server:1.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> expose</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> deployment</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hello-minikube</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --type=NodePort</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --port=8080</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看部署应用</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> deployments</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看Pod</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pods</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看集群事件</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> events</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看 Pod 中容器的应用程序日志</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> logs</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [pod]</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看 kubectl 配置</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> view</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看信息</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> services</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hello-minikube</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 访问此服务</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 方式一  让 minikube 为您启动一个 Web 浏览器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> service</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> hello-minikube</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 方式二 使用 kubectl 转发端口</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">kubectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> port-forward</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> service/hello-minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 7080:8080</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 暂停 Kubernetes 而不影响已部署的应用程序</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pause</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 取消暂停的实例</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> unpause</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 停止集群</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> stop</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 更改默认内存限制（需要重新启动）</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> memory</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 9001</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 浏览易于安装的 Kubernetes 服务目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> addons</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> list</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建运行旧 Kubernetes 版本的第二个集群</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> aged</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --kubernetes-version=v1.16.1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 删除所有 minikube 集群</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> delete</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --all</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 导入镜像到minikube中</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">minikube</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> image</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> load</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [image.tar]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>ElasticSearch使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/ElasticSearch/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/ElasticSearch/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">ElasticSearch使用记录</source>
      <description>ElasticSearch使用记录 网址 官网 https://www.elastic.co/cn/ 分词器ik https://github.com/medcl/elasticsearch-analysis-ik/releases 安装 centos docker</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>网址</h2>
<ul>
<li>官网 <a href="https://www.elastic.co/cn/" target="_blank" rel="noopener noreferrer">https://www.elastic.co/cn/</a></li>
<li>分词器ik <a href="https://github.com/medcl/elasticsearch-analysis-ik/releases" target="_blank" rel="noopener noreferrer">https://github.com/medcl/elasticsearch-analysis-ik/releases</a></li>
</ul>
<h2>安装</h2>
<h3>centos docker</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># docker hub 查看 镜像 </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch:8.7.0</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 选择的版本 最好和分词器版本对一下 es 版本迭代很快 </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> es8.7.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">-e </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ES_JAVA_OPTS="-Xms512m -Xmx512m"</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "discovery.type=single-node"</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 9200:9200</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch:8.7.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 浏览器访问 ip+9200 当前版本默认 https 即 https://ip:port 此时需要登录 即启动成功</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改密码</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> es8.7.0</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /bin/bash</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/bin</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">elasticsearch-reset-password</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --username</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elastic</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 根据提示修改密码即可</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 退出容器 exit</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">exit</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 浏览器访问 ip+9200 当前版本默认 https 即 https://ip:port  账号密码 elastic/修改的密码</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 中文分词器ik</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载 wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.7.0/elasticsearch-analysis-ik-8.7.0.zip</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 复制到容器根目录下</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-8.7.0.zip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> es8.7.0:/usr/share/elasticsearch/plugins</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> es8.7.0</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /bin/bash</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建插件位置目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/ik</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 移动到上面的文件夹中</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mv</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-8.7.0.zip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/ik</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ik</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">unzip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-8.7.0.zip</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -rf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-8.7.0.zip</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 退出容器并重启容器</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">exit</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> es8.7.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装kibana 配置遇到问题 停滞</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载 对应版本 </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana:8.7.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 运行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -itd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana8.7.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 5601:5601</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana:8.7.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在es 镜像中 生成链接 将链接填入kibana页面中 进行登录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">bin/elasticsearch-create-enrollment-token</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --scope</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 生成填写验证码 进入 kibana容器中</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">bin/kibana-verification-code</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 登录账号密码 为 es 创建是设置的</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置中文 将容器内配置文件复制到本机</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana8.7.0:/usr/share/kibana/config/kibana.yml</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ./</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编辑 vim kibana.yml 增加配置</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">i18n.locale:</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "zh-CN"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 复制回容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana.yml</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana8.7.0:/usr/share/kibana/config</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 重启容器</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana8.7.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Git使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Git/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Git/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Git使用记录</source>
      <description>Git使用记录 Windows配置 Linux 安装配置</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>Windows配置</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#配置用户名：</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> user.name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "s1x6"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#配置邮箱</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> user.email</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "xiaomaohuifaguang@163.com"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#查看配置是否成功</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --list</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#成成ssh</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ssh-keygen</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rsa</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># id_rsa.pub 公钥 去远程仓库配置</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Linux 安装配置</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 先查看卸载 原有的git -&gt; linux 卸载软件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载编译工具</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> groupinstall</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "Development Tools"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zlib-devel</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> perl-ExtUtils-MakeMaker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> asciidoc</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> xmlto</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> openssl-devel</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载源码</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 地址 https://mirrors.edge.kernel.org/pub/software/scm/git/ 或 https://github.com/git/git/tags</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.40.1.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -zxvf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> v2.40.1.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -C</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ../git</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置git安装文件夹，prefix的文件可自定义指定位置但要记住位置，后面会用到</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">./configure</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --prefix=/soft/git</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编译git</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装git，-j 2可选择不要，此代表使用2个核心去安装，速度会比较快</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -j</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vi</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/profile</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">PATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/soft/git/bin:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$PATH</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">source</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/profile</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --version</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查询代理</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> http.proxy</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https.proxy</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置socks5代理</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> http.proxy</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> socks5</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 127.0.0.1:10808</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https.proxy</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> socks5</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 127.0.0.1:10808</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置http代理</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> http.proxy</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 127.0.0.1:10809</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https.proxy</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 127.0.0.1:10809</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 取消代理命令</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --unset</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> http.proxy</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --global</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --unset</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https.proxy</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Docker使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Docker/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Docker/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Docker使用记录</source>
      <description>Docker使用记录 安装 使用记录 https://hub.docker.com/ windows docker wsl 配置存储位置 Dockerfile Dockerfile样例 打包 容器/镜像</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>安装</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 参考 https://www.runoob.com/docker/centos-docker-install.html  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 卸载旧版本  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-client</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-client-latest</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-common</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-latest</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-latest-logrotate</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-logrotate</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">                  docker-engine</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装所需的软件包  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum-utils</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  device-mapper-persistent-data</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  lvm2</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置国内源地址 阿里云  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum-config-manager</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">    --add-repo</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装最新版  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd.io</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-compose-plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">  </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 卸载  </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -rf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /var/lib/docker</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## deepin/ubuntu 安装</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 卸载</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> remove</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-engine</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker.io</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> runc</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 更新 apt 包索引</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装 apt 依赖包，用于通过HTTPS来获取仓库:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    apt-transport-https</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    ca-certificates</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    gnupg-agent</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    software-properties-common</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加 Docker 的官方 GPG 密钥：</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-key</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> -</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符，验证您现在是否拥有带有指纹的密钥</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-key</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> fingerprint</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 0EBFCD88</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 使用以下指令设置稳定版仓库</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> add-apt-repository</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ </span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  $(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">lsb_release</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -cs</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">) </span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  stable"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 上一步如果报错执行下面两步 没报错忽略</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/apt/sources.list</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">deb</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [arch=amd64] https://download.docker.com/linux/debian stretch stable</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 更新 apt 包索引。</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> update</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装最新版本的 Docker Engine-Community 和 containerd ，或者转到下一步安装特定版本：</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt-get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-ce-cli</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> containerd.io</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看版本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>使用记录</h2>
<p><a href="https://hub.docker.com/" target="_blank" rel="noopener noreferrer">https://hub.docker.com/</a></p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建网络</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> create</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># mysql</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6101:3306</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> mysql8.0.23</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> MYSQL_ROOT_PASSWORD=six6</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> mysql:8.0.23</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --character-set-server=utf8mb4</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --collation-server=utf8mb4_unicode_ci</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># redis</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6201:6379</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -it</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> redis7.0.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> redis:7.0.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --requirepass</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> six6</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># rabbitmq</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rabbitmq3.9.28</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6301:15672</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6302:5672</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> RABBITMQ_DEFAULT_USER=rabbitmq</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> RABBITMQ_DEFAULT_PASS=rabbitmq</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rabbitmq:3.9.28-management</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># elasticsearch</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch7.17.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ES_JAVA_OPTS="-Xms512m -Xmx512m"</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "discovery.type=single-node"</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6401:9200</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 9300:9300</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch:7.17.0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加 ik 分词器 下载压缩包</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># https://github.com/medcl/elasticsearch-analysis-ik/tags</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 上传到 docker 容器中</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cp</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-7.17.0.zip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch7.17.0:/usr/share/elasticsearch/plugins</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> exec</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -it</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch7.17.0</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /bin/bash</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/ik</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mv</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.17.0.zip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/ik</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/share/elasticsearch/plugins/ik</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">unzip</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-7.17.0.zip</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -rf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch-analysis-ik-7.17.0.zip</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">exit</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> restart</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch7.17.0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># kibana</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana7.17.0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ELASTICSEARCH_HOSTS=http://192.168.0.123:6401</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 6501:5601</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana:7.17.0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动脚本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> mysql8.0.23</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> redis7.0.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> rabbitmq3.9.28</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> elasticsearch7.17.0</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> kibana7.17.0</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># jenkins</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pull</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jenkins/jenkins:2.402</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 加权访问容器卷映射到的宿主机文件</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chown</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -R</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 1000:1000</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chown</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -R</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 1000:1000</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/maven</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> run</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -d</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --network</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat-net</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jenkins</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home:/var/jenkins_home</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">  -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  /usr/local/maven:/usr/local/maven</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /soft/git/bin/git:/usr/local/git</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  /etc/localtime:/etc/localtime</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66">  -p</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 8080:8080</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">   jenkins/jenkins:2.402</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> logs</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jenkins</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#查看密钥</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cat_server-1.0.jar</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "准备停止cat_server.jar"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">pid</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">`</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ps</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -ef</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> grep</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cat_server.jar </span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">|</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> grep</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> grep </span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">|</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> awk</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> '{print $2}'`</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">-n</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$pid</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">then</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">   kill</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -9</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> $pid</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">fi</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "停止cat_server.jar完毕"</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">clean</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> package</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -P</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> prod</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -Dmaven.test.skip=true</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># pre</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">BUILD_ID</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">DONTKILLME</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "移动jar包到/var/jenkins_home/cat/cat_server,并去掉版本号名称"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "/var/jenkins_home/cat/cat_server"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ];</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">then</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /var/jenkins_home/cat/cat_server</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  else</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">  echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "文件夹已经存在"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">fi</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> [ </span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "/var/jenkins_home/cat/cat_server/cat_server.jar"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> ];</span><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">then</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">  echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "文件不存在"</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">  else</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  rm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /var/jenkins_home/cat/cat_server/cat_server.jar</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">fi</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># post</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mv</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /var/jenkins_home/workspace/cat_server/target/cat_server-1.0.jar</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /var/jenkins_home/cat/cat_server/cat_server.jar</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "移动jar包完成"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "启动cat_server服务"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">nohup</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> java</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -jar</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home/cat/cat_server/cat_server.jar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --server.port=</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">7777&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home/cat/cat_server/server.log</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> 2&gt;&amp;1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &amp;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "启动cat_server服务完成"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">nohup</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jdk/jdk-17.0.7/bin/java</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -jar</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home/cat/cat_server/cat_server.jar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --server.port=</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">7777&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/jenkins/jenkins_home/cat/cat_server/server.log</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> 2&gt;&amp;1</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> &amp;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 日志持续输出</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> logs</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> mysql</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>windows docker wsl 配置存储位置</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看信息</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -l</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --all</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 退出windows docker 再次查看 状态为stopped 开始下一步</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 到处当前存储信息 d:\docker 自己创建</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --export</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> d:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop.tar</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --export</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop-data</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> d:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop-data.tar</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 注销当前存储</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --unregister</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --unregister</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop-data</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 新建两个文件夹 docker-desktop 和 docker-desktop-data  重新导入</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --import</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop.tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --version</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wsl</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --import</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> docker-desktop-data</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop-data</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker-desktop-data.tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --version</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证 查看是否存在 wsl -l -v --all</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 再次启动docker即可</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Dockerfile</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建一个文件夹 当前文件夹 为工作空间 创建文件名称为 Dockerfile 注意： Dockerfile 无后缀</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">touch</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> Dockerfile</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 内容写完后执行</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 当前工作文件夹下 image_name 自己要生成的镜像名称 tag 版本信息 注意 末尾的.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> build</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> image_name:tag</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> .</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Dockerfile样例</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">FROM</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> centos:centos7.9.2009</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 工作目录 类似于cd</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">WORKDIR</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 创建时执行 即 docker build 同一空间内 尽量用一个 RUN 执行 多个命令 可用 &amp;&amp; 连接 如 RUN mkdir test1.txt &amp;&amp; mkdir /home/test2.txt</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">RUN</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> mkdir</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test.txt</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">WORKDIR</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 运行时执行 即 docker run</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">CMD</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ping</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> baidu.com</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>打包 容器/镜像</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 打包最终的仍是镜像 所以 容器打包需要先生成镜像</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 容器生成镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> commit</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test:v2</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 打包镜像并输出位置</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">docker</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> save</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> test:v2</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\d</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ocker</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\D</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ockerfile</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">est</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\t</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">est-v2.tar</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Gradle使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Gradle/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Gradle/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Gradle使用记录</source>
      <description>Gradle使用记录 下载地址 https://gradle.org/releases/</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>下载地址</h2>
<p><a href="https://gradle.org/releases/" target="_blank" rel="noopener noreferrer">https://gradle.org/releases/</a></p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">GRADLE_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">			D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">radle</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">radle-8.0.2</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">GRADLE_USER_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">	D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">radle</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\r</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">epo</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">				D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">radle</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">radle-8.0.2</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\b</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">in</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置镜像源</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在gradle的init.d目录下新建init.gradle文件，加入如下配置</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">allprojects</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">	repositories</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">		mavenLocal</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">		maven</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "Alibaba"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "https://maven.aliyun.com/repository/public"</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">		maven</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "Bstek"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "https://nexus.bsdn.org/content/groups/public/"</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">		mavenCentral</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">	}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">	buildscript</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">		repositories</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">			maven</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "Alibaba"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'https://maven.aliyun.com/repository/public'</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">			maven</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "Bstek"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'https://nexus.bsdn.org/content/groups/public/'</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">			maven</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> {</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "M2"</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 'https://plugins.gradle.org/m2/'</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">		}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">	}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">gradle</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Java下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Java/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Java下载安装</source>
      <description>Java下载安装 下载地址 https://www.oracle.com/java/technologies/downloads/ windows 配置环境变量 Linux 安装配置环境变量</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>下载地址</h2>
<p>https://www.oracle.com/java/technologies/downloads/</p>
<h2>windows 配置环境变量</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">JAVA_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">	D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\J</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">DK</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\j</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">dk-17.0.7</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">		%JAVA_HOME%</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\b</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">in</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">%JAVA_HOME%\jre\bin</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">CLASSPATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">	.</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">%JAVA_HOME%\lib</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">%JAVA_HOME%\lib\dt.jar</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">%JAVA_HOME%\lib\tools.jar</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证 cmd</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">java</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Linux 安装配置环境变量</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 解压</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -zxvf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> jdk-17_linux-x64_bin.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -C</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ../jdk</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 卸载原有jdk 查看linux 卸载已安装软件</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/profile</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 结尾添加</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">JAVA_HOME</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/home/root/jdk/jdk-17.0.7</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">CLASSPATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">.:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$JAVA_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/jre/lib/ext:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$JAVA_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/lib/tools.jar</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">PATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$JAVA_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/bin:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$PATH</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> PATH</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> JAVA_HOME</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75"> CLASSPATH</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置生效</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">source</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/profile</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">java</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Jenkins使用记录</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Jenkins/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Jenkins/%E4%BD%BF%E7%94%A8%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Jenkins使用记录</source>
      <description>Jenkins使用记录</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
]]></content:encoded>
    </item>
    <item>
      <title>Maven下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Maven/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Maven/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Maven下载安装</source>
      <description>Maven下载安装 Windows下载地址 （https://maven.apache.org/download.cgi)[https://maven.apache.org/download.cgi] Linux 安装配置</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>Windows下载地址</h2>
<p>（https://maven.apache.org/download.cgi)[https://maven.apache.org/download.cgi]</p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#添加环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">MAVEN_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">	D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\m</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">aven</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\a</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">pache-maven-3.9.1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">		%MAVEN_HOME%</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\b</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">in</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改conf/setting.xml</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查找 &lt;localRepository&gt;/path/to/local/repo&lt;/localRepository&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置 仓库地址 注释打开 替换为&lt;localRepository&gt;D:\maven\repo&lt;/localRepository&gt;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置远程仓库</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查找 mirrors</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加 </span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> 	&lt;!</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">--</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 阿里云镜像-</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">-</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mirror</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">id</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">alimaven</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/id&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">name</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">aliyun</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> maven</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">&lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/nam</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">e</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">url</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">http://maven.aliyun.com/nexus/content/groups/public/</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/url&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">        &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mirrorOf</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">central</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&lt;/mirrorOf&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">    &lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">/mirror</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">    &lt;!</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">--</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 阿里云镜像-</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">-</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF">&gt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">    </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> help:system</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看本地仓库是否有包</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Linux 安装配置</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载 https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.1/binaries/</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.1/binaries/apache-maven-3.9.1-bin.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 解压</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">tar</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -zxvf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/tar/apache-maven-3.9.1-bin.tar.gz</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -C</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> maven/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 环境变量</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">MAVEN_HOME</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/usr/local/maven/apache-maven-3.9.1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">PATH</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$MAVEN_HOME</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">/bin:</span><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">$PATH</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> help:system</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>Nginx下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Nginx/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/Nginx/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">Nginx下载安装</source>
      <description>Nginx下载安装 下载地址 http://nginx.org/en/download.html Linux</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>下载地址</h2>
<p><a href="http://nginx.org/en/download.html" target="_blank" rel="noopener noreferrer">http://nginx.org/en/download.html</a></p>
<h2>Linux</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装依赖</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">yum</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> gcc</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> gcc-c++</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> make</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> libtool</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zlib</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> zlib-devel</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> openssl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> openssl-devel</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pcre</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> pcre-devel</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#下载</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> http://nginx.org/download/nginx-1.24.0.tar.gz</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置安装路径</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">./configure</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --prefix=/usr/local/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --with-http_stub_status_module</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --with-http_ssl_module</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编译安装</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证 编译</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">/usr/local/nginx/sbin/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -t</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 启动</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">/usr/local/nginx/sbin/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/nginx/conf/nginx.conf</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 停止</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">/usr/local/nginx/sbin/nginx</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> stop</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>NodeJs下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/NodeJs/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/NodeJs/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">NodeJs下载安装</source>
      <description>NodeJs下载安装 下载地址 https://nodejs.org/en windows Linux</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>下载地址</h2>
<p><a href="https://nodejs.org/en" target="_blank" rel="noopener noreferrer">https://nodejs.org/en</a></p>
<h2>windows</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">node</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#显示node.js的版本说明已经安装成功</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#显示自带的npm的版本</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装目录新建文件夹 node_cache 和 node_global</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置 </span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "D:\nodejs\node_global"</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cache</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> "D:\nodejs\node_cache"</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加环境变量</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">NODE_PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">	D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">odejs</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ode_modules</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">PATH</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">		D:</span><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">odejs</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;	</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">D:\nodejs\node_global</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> express</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -g</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装文件夹 添加权限</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 更换 淘宝镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> registry</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">       //查看初始npm源</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> registry</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://registry.npm.taobao.org/</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">				//更换镜像为淘宝镜像</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> registry</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  					//检查配置是否成功</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF"> </span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#全局安装cnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --registry=https://registry.npm.taobao.org</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证 重新打开cmd</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Linux</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 下载</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># https://nodejs.org/en</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.xz</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 解压</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">tar</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> xvf</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> node-v18.16.0-linux-x64.tar.xz</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -C</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ../nodejs</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 配置软连接</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ln</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/nodejs/node-v16.20.0-linux-x64/bin/node</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/bin/node</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">node</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ln</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/nodejs/node-v16.20.0-linux-x64/bin/npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/bin/npm</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 安装cnpm</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> cnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --registry=https://registry.npm.taobao.org</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ln</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -s</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /home/root/nodejs/node-v16.20.0-linux-x64/bin/cnpm</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /usr/local/bin/cnpm</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cnpm</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>操作系统下载安装</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">操作系统下载安装</source>
      <description>操作系统下载安装 镜像下载 centos 下载 清华开源centos7.0 x86_64 其他版本也有 推荐使用CentOS-7-x86_64-DVD-2207-02.iso 标准安装镜像 ubuntu 官网 https://ubuntu.com/ windows 三个第三方微软系统原版镜像下载站，系统版本和下载方式都比较丰富， 如果微软官网满足不了你...</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>镜像下载</h2>
<ol>
<li>centos</li>
</ol>
<ul>
<li>下载 <a href="https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/" target="_blank" rel="noopener noreferrer">清华开源centos7.0 x86_64</a> 其他版本也有</li>
<li>推荐使用CentOS-7-x86_64-DVD-2207-02.iso 标准安装镜像</li>
</ul>
<ol start="2">
<li>ubuntu</li>
</ol>
<ul>
<li>官网 <a href="https://ubuntu.com/" target="_blank" rel="noopener noreferrer">https://ubuntu.com/</a></li>
</ul>
<ol start="3">
<li>windows
三个第三方微软系统原版镜像下载站，系统版本和下载方式都比较丰富，
如果微软官网满足不了你，可以收藏这三个站点备用。</li>
</ol>
<ul>
<li>HelloWindows：<a href="https://www.hellowindows.cn/" target="_blank" rel="noopener noreferrer">https://www.hellowindows.cn/</a></li>
<li>MSDN 山己几子木 <a href="https://msdn.sjjzm.com/" target="_blank" rel="noopener noreferrer">https://msdn.sjjzm.com/</a></li>
<li>MSDN 系统库 <a href="https://www.xitongku.com/" target="_blank" rel="noopener noreferrer">https://www.xitongku.com/</a></li>
<li>备选 <a href="https://next.itellyou.cn/" target="_blank" rel="noopener noreferrer">https://next.itellyou.cn/</a></li>
</ul>
<h2>U启制作</h2>
<ol>
<li>准备工具UltraISO</li>
</ol>
<ul>
<li>官网 <a href="https://www.ultraiso.com/" target="_blank" rel="noopener noreferrer">https://www.ultraiso.com/</a></li>
<li>安装 傻瓜式</li>
</ul>
<ol start="2">
<li>安装完成后管理员打开</li>
</ol>
<ul>
<li>文件 -&gt; 打开文件 -&gt; 选择下载好的镜像iso</li>
<li>启动 -&gt; 写入硬盘映像
<ul>
<li>选择U盘(默认选择U盘)</li>
<li>写入方式 USB-HDD+ (默认应该就是)</li>
<li>写入</li>
</ul>
</li>
</ul>
<h2>U启安装</h2>
<ol>
<li>准备</li>
</ol>
<ul>
<li>制作好的U启</li>
</ul>
<ol start="2">
<li>插入需要安装的电脑</li>
<li>电脑开启或重启 进入bios 不同的电脑可能不同(自行查) F2/F10/F12 连续按</li>
<li>进入bios 选择U盘启动优先 我的是U盘是优先的 所以没调整</li>
<li>按Esc 会进入系统安装指导 如果没有进入可能是上一步没有设置优先 按电脑型号百度一下</li>
<li>根据引导安装完成后重启 并拔出U盘</li>
</ol>
<h2>单U盘多启动系统方案</h2>
<ol>
<li>准备</li>
</ol>
<ul>
<li>下载软件 Ventoy <a href="https://www.ventoy.net/cn/download.html" target="_blank" rel="noopener noreferrer">https://www.ventoy.net/cn/download.html</a></li>
<li>下载完解压即可</li>
<li>双击打开Ventoy2Disk.exe</li>
<li>设备选择你的U盘</li>
<li>点击安装 验证 查看磁盘分区</li>
<li>把下载的镜像直接放到U盘根目录下即可</li>
</ul>
<ol start="2">
<li>插入制作好的U盘 启动选择U盘启动 选择你要的系统</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>操作系统指令大全</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%8C%87%E4%BB%A4%E5%A4%A7%E5%85%A8.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%8C%87%E4%BB%A4%E5%A4%A7%E5%85%A8.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">操作系统指令大全</source>
      <description>操作系统指令大全 文件/文件夹操作 基本操作 网络 系统 SSH服务 用户 系统信息 SWAP SWAP就是LINUX下的虚拟内存分区，它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用 内存 防火墙 设置hosts 开机启动脚本配置 ** command not found centos中绝大部分该问题都可以用 yum ...</description>
      <category>学习记录</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>文件/文件夹操作</h2>
<h3>基本操作</h3>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入指定目录</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 路径</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 进入当前用户目录</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ~</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>网络</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看网络信息</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ifconfig</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">## 虚拟机修改ip 注：使用的手动ip 文件也坑是其他的 以生成的网络配置为准</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/sysconfig/network-scripts/ifcfg-eth0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>系统</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改主机名称</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">hostnamectl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> set-hostname</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  zhu-ji-ming-cheng</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>SSH服务</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开启ssh</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/init.d/ssh</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 或</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> service</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ssh</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看是否开启</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ps</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -e</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF"> grep</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> ssh</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 如果没有ssh 需安装</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># debian/ubuntu</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> openssh-server</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>用户</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查询所有用户</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">compgen</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -u</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/passwd</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加用户 并指定生成目录</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">useradd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -m</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> user1</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 设置密码</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">passwd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> user1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加管理员权限 start</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 将sudoers文件的权限修改成可编辑</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> u+w</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/sudoers</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编辑 添加用户权限</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/sudoers</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">找到</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> root</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    ALL=</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ALL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)       </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ALL</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">然后添加</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> user1</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">    ALL=</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">ALL</span><span style="--shiki-light:#24292E;--shiki-dark:#ABB2BF">)       </span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">ALL</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 将sudoers文件的权限修改成不可编辑</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -v</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> u-w</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/sudoers</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加管理员权限 end</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 修改 用户 密码 使用有管理权限的账户去修改</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> passwd</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 用户名</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 切换指定用户</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">su</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> 用户名</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>系统信息</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看系统信息</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/os-release</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看源配置文件</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/apt/sources.list</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>SWAP</h2>
<p>SWAP就是LINUX下的虚拟内存分区，它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区)虚拟成内存来使用</p>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 关闭swap</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">swapoff</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -a</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> #临时关闭</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 永久关闭</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/fstab</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># deepin debian 系统 在类似如下 修改后面为defaults,noauto 0 0 </span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E06C75">UUID</span><span style="--shiki-light:#D73A49;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">f96e71e3-a4b7-4dbb-9576-9ef9ae498717</span><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">  none</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  swap</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379">  defaults,noauto</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 验证 永久关闭验证需重启再执行</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">free</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> -m</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>内存</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">free</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # -m 或 -h</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 清除缓存buff/cache 需切换root账户</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /proc/sys/vm/drop_caches</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 释放页缓存</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 2</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /proc/sys/vm/drop_caches</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 释放dentries和inodes</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> 3</span><span style="--shiki-light:#D73A49;--shiki-dark:#ABB2BF"> &gt;</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /proc/sys/vm/drop_caches</span><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 释放所有缓存</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>防火墙</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看防火墙状态</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --state</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开启(关闭)防火墙</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> firewalld</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> stop</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> firewalld</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看防火墙已经开放的端口号</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --list-ports</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 查看指定端口是否开放</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --query-port=7777/tcp</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开启指定端口</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --zone=public</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --add-port=7777/tcp</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --permanent</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 关闭指定端口</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --remove-port=7777/tcp</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --permanent</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 重启防火墙</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">firewall-cmd</span><span style="--shiki-light:#005CC5;--shiki-dark:#D19A66"> --reload</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>设置hosts</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">cat</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/hosts</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/hosts</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 添加  www.baidu.com为自己想起的别名</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">127.0.0.1</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> www.baidu.com</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>开机启动脚本配置</h2>
<div class="language-shell line-numbers-mode" data-highlighter="shiki" data-ext="shell" data-title="shell" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 准备脚本.sh 并赋予脚本可执行权限</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> +x</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /??/??/??.sh</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 打开 /etc/rc.d/rc.local</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">vim</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/rc.d/rc.local</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 末尾添加/??/??/??.sh</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 在centos7中，/etc/rc.d/rc.local的权限被降低了，所以需要执行如下命令赋予其可执行权限</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> +x</span><span style="--shiki-light:#032F62;--shiki-dark:#98C379"> /etc/rc.d/rc.local</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>** command not found</h2>
<ul>
<li>centos中绝大部分该问题都可以用 yum install **</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>MD模板</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E6%A8%A1%E6%9D%BF.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E6%A8%A1%E6%9D%BF.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">MD模板</source>
      <description>模板 一 简要设置 二 图标库 vuepress 默认图标库 https://fontawesome.com/search?o=r&amp;m=free</description>
      <category>使用指南</category>
      <pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<h2>一 简要设置</h2>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext="" data-title="" style="--shiki-light:#24292e;--shiki-dark:#abb2bf;--shiki-light-bg:#fff;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes github-light one-dark-pro vp-code"><code><span class="line"><span></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content:encoded>
    </item>
    <item>
      <title>个人介绍</title>
      <link>https://xiaomaohuifaguang.github.io/blog/%E4%B8%AA%E4%BA%BA%E4%BB%8B%E7%BB%8D.html</link>
      <guid>https://xiaomaohuifaguang.github.io/blog/%E4%B8%AA%E4%BA%BA%E4%BB%8B%E7%BB%8D.html</guid>
      <source url="https://xiaomaohuifaguang.github.io/blog/rss.xml">个人介绍</source>
      <description>个人介绍 OK了老铁 都多余了</description>
      <pubDate>Mon, 10 Jun 2024 16:21:14 GMT</pubDate>
      <content:encoded><![CDATA[
<p>OK了老铁<br>
都多余了</p>
]]></content:encoded>
    </item>
  </channel>
</rss>