<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ZERO开发</title>
  
  <subtitle>一个探索副业的独立开发人博客</subtitle>
  <link href="https://www.zerofc.cn/atom.xml" rel="self"/>
  
  <link href="https://www.zerofc.cn/"/>
  <updated>2026-05-10T14:34:16.258Z</updated>
  <id>https://www.zerofc.cn/</id>
  
  <author>
    <name>北桥苏</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>natapp映射本地vue项目报错</title>
    <link href="https://www.zerofc.cn/2026/05/02/natapp%E6%98%A0%E5%B0%84%E6%9C%AC%E5%9C%B0vue%E9%A1%B9%E7%9B%AE%E6%8A%A5%E9%94%99/"/>
    <id>https://www.zerofc.cn/2026/05/02/natapp%E6%98%A0%E5%B0%84%E6%9C%AC%E5%9C%B0vue%E9%A1%B9%E7%9B%AE%E6%8A%A5%E9%94%99/</id>
    <published>2026-05-02T15:13:50.000Z</published>
    <updated>2026-05-10T14:34:16.258Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、Natapp介绍"><a href="#一、Natapp介绍" class="headerlink" title="一、Natapp介绍"></a>一、Natapp介绍</h2><p> 内网穿透（NATAPP）简单来说，就是利用类似 <code>natapp</code> 这样的工具，在内网与外网之间建立一个安全的通信隧道。它能让位于防火墙或路由器后面的内网服务，被外网用户访问到。 </p><h2 id="二、需求"><a href="#二、需求" class="headerlink" title="二、需求"></a>二、需求</h2><p>本地启动vue的前端服务，natapp绑定前端端口，供在外地或客户进行外网访问。</p><h2 id="三、报错描述"><a href="#三、报错描述" class="headerlink" title="三、报错描述"></a>三、报错描述</h2><p>本地前端服务启动，natapp也启动成功，通过生成的域名在浏览器中打开，报错： Invalid Host header </p><h2 id="四、报错分析"><a href="#四、报错分析" class="headerlink" title="四、报错分析"></a>四、报错分析</h2><p> **本地开发服务器（如 webpack-dev-server）出于安全校验，拒绝了 natapp 转发过来的 Host 头（公网域名），只信任 <a href="https://localhost/127.0.0.1">localhost&#x2F;127.0.0.1</a>**。 </p><h4 id="原因："><a href="#原因：" class="headerlink" title="原因："></a>原因：</h4><p>1.本地服务（Vue&#x2F;React 等）用的是 webpack-dev-server。</p><p>2.它默认开启 <strong>Host 检查</strong>：请求的 Host 必须和 <code>localhost:port</code> 一致。</p><p>3.natapp 访问时，Host 是 <code>xxx.natappfree.cc</code>，和 <code>localhost</code> 不匹配，直接拦截并返回 <strong>Invalid Host header</strong>。</p><h2 id="五、解决方法"><a href="#五、解决方法" class="headerlink" title="五、解决方法"></a>五、解决方法</h2><h4 id="1-允许所有-Host（开发环境最简单）"><a href="#1-允许所有-Host（开发环境最简单）" class="headerlink" title="1.允许所有 Host（开发环境最简单）"></a>1.允许所有 Host（开发环境最简单）</h4><p>适用于：Vue CLI 4 及以下 &#x2F; 旧版 webpack-dev-server</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  devServer: &#123;</span><br><span class="line">    disableHostCheck: true // 关闭 Host 校验</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-只允许-natapp-域名（更安全）"><a href="#2-只允许-natapp-域名（更安全）" class="headerlink" title="2.只允许 natapp 域名（更安全）"></a>2.只允许 natapp 域名（更安全）</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">// vue.config.js</span><br><span class="line">module.exports = &#123;</span><br><span class="line">  devServer: &#123;</span><br><span class="line">    allowedHosts: [&quot;.natappfree.cc&quot;] // 仅允许 natapp 二级域名</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="3-启动时指定-host（配合上面配置）"><a href="#3-启动时指定-host（配合上面配置）" class="headerlink" title="3.启动时指定 host（配合上面配置）"></a>3.启动时指定 host（配合上面配置）</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm run serve -- --host 0.0.0.0</span><br></pre></td></tr></table></figure><p> 让服务监听所有网卡，避免仅监听 127.0.0.1 导致转发失败。 </p><h4 id="4-临时方案：natapp-命令行覆盖-Host-头"><a href="#4-临时方案：natapp-命令行覆盖-Host-头" class="headerlink" title="4.临时方案：natapp 命令行覆盖 Host 头"></a>4.临时方案：natapp 命令行覆盖 Host 头</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">natapp -authtoken=xxx -local=http://127.0.0.1:8080 -host=localhost</span><br></pre></td></tr></table></figure><h2 id="六、验证步骤"><a href="#六、验证步骤" class="headerlink" title="六、验证步骤"></a>六、验证步骤</h2><p>1.修改配置后<strong>重启本地 dev 服务</strong>（必须）。</p><p>2.重启 natapp 隧道。</p><p>3.访问 <code>http://xxx.natappfree.cc</code>，错误消失。</p><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、Natapp介绍&quot;&gt;&lt;a href=&quot;#一、Natapp介绍&quot; class=&quot;headerlink&quot; title=&quot;一、Natapp介绍&quot;&gt;&lt;/a&gt;一、Natapp介绍&lt;/h2&gt;&lt;p&gt; 内网穿透（NATAPP）简单来说，就是利用类似 &lt;code&gt;natapp&lt;</summary>
      
    
    
    
    <category term="前端开发" scheme="https://www.zerofc.cn/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="vue" scheme="https://www.zerofc.cn/tags/vue/"/>
    
  </entry>
  
  <entry>
    <title>用nvm无法安装node解决方案</title>
    <link href="https://www.zerofc.cn/2026/04/02/%E7%94%A8nvm%E6%97%A0%E6%B3%95%E5%AE%89%E8%A3%85node%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
    <id>https://www.zerofc.cn/2026/04/02/%E7%94%A8nvm%E6%97%A0%E6%B3%95%E5%AE%89%E8%A3%85node%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/</id>
    <published>2026-04-02T15:13:50.000Z</published>
    <updated>2026-04-27T13:33:34.393Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、nvm基本指令"><a href="#一、nvm基本指令" class="headerlink" title="一、nvm基本指令"></a>一、nvm基本指令</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">1. 查看已安装列表</span><br><span class="line">nvm ls</span><br><span class="line"></span><br><span class="line">2. 查看当前使用版本</span><br><span class="line">nvm current</span><br><span class="line"></span><br><span class="line">3. 安装指定版本</span><br><span class="line">nvm install 18.8.0</span><br><span class="line"></span><br><span class="line">4. 切换到指定的使用版本</span><br><span class="line">nvm use 18.8.0</span><br><span class="line"></span><br><span class="line">5. 设置node镜像</span><br><span class="line">nvm node_mirror http://ali.org/defheuifehfieih</span><br><span class="line"></span><br><span class="line">6. 设置npm镜像</span><br><span class="line">nvm npm_mirror [url]</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="二、问题点"><a href="#二、问题点" class="headerlink" title="二、问题点"></a>二、问题点</h2><p>1.使用nvm install指令安装后，一直无法use该版本，提示 “activation error: Version not installed. Run “nvm ls” to see available versions.”</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\19745&gt;nvm install 18.8.0</span><br><span class="line">Downloading node.js version 18.8.0 (64-bit)...</span><br><span class="line">Extracting node and npm...</span><br><span class="line">Complete</span><br><span class="line"></span><br><span class="line">Installation complete.</span><br><span class="line">If you want to use this version, type:</span><br><span class="line"></span><br><span class="line">nvm use 18.8.0</span><br><span class="line"></span><br><span class="line">C:\Users\19745&gt;nvm use 18.8.0</span><br><span class="line">activation error: Version not installed. Run &quot;nvm ls&quot; to see available versions.</span><br><span class="line"></span><br><span class="line">C:\Users\19745&gt;nvm ls</span><br><span class="line"></span><br><span class="line">  * 16.20.2 (Currently using 64-bit executable)</span><br></pre></td></tr></table></figure><p>咨询AI，一直说是cmd权限不足，但是切换power shell还是不行。</p><h2 id="三、解决方法"><a href="#三、解决方法" class="headerlink" title="三、解决方法"></a>三、解决方法</h2><p>重新下载一个版本，放到nvm的根目录下，然后运行nvm ls可以查看已安装的几个版本了。</p><h4 id="npm基本设置"><a href="#npm基本设置" class="headerlink" title="npm基本设置"></a>npm基本设置</h4><p>安装多个node版本后，可以查看npm默认缓存位置是什么？防止安装到系统盘符，以下是对应指令。</p><h4 id="VScode中如何使用终端和Git拉取"><a href="#VScode中如何使用终端和Git拉取" class="headerlink" title="VScode中如何使用终端和Git拉取"></a>VScode中如何使用终端和Git拉取</h4><p>当打开vscode的终端一直提示 “ vscode打开终端提示终端进程启动失败 ”，并且Git拉取也一直没反应时，解决方法是重新设置cwd。</p><p>1.打开“文件” -&gt; “首选项”-&gt;“设置”。</p><p>2.搜索 “ terminal.integrated.cwd ”。</p><p>3.将Integrated:Cwd的目录设置为在资源管理下找的到的目录。</p><p>4.保存后重新新建终端或重新拉取代码就可以了。</p><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、nvm基本指令&quot;&gt;&lt;a href=&quot;#一、nvm基本指令&quot; class=&quot;headerlink&quot; title=&quot;一、nvm基本指令&quot;&gt;&lt;/a&gt;一、nvm基本指令&lt;/h2&gt;&lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;t</summary>
      
    
    
    
    <category term="前端开发" scheme="https://www.zerofc.cn/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="nvm" scheme="https://www.zerofc.cn/tags/nvm/"/>
    
  </entry>
  
  <entry>
    <title>如何在Eclipse创建SpringBoot项目</title>
    <link href="https://www.zerofc.cn/2026/03/31/%E5%A6%82%E4%BD%95%E5%9C%A8Eclipse%E5%88%9B%E5%BB%BASpringBoot%E9%A1%B9%E7%9B%AE/"/>
    <id>https://www.zerofc.cn/2026/03/31/%E5%A6%82%E4%BD%95%E5%9C%A8Eclipse%E5%88%9B%E5%BB%BASpringBoot%E9%A1%B9%E7%9B%AE/</id>
    <published>2026-03-31T15:13:50.000Z</published>
    <updated>2026-04-01T16:19:25.705Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>虽然可以直接在Eclipse中，通过Maven提供的 <strong>Archetype</strong> （模板）创建SpringBoot项目。但是后面配置起来太麻烦，又没法安装Spring插件的情况下，就是在 Spring Initializr 在线网站上生成一个SpringBoot项目，然后再以Maven的形式导入Eclipse中。</p><h2 id="二、生成项目"><a href="#二、生成项目" class="headerlink" title="二、生成项目"></a>二、生成项目</h2><ol><li>访问 <strong><a href="https://start.spring.io/">start.spring.io</a></strong> </li><li>自行配置后下载</li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Eclipse%E5%88%9B%E5%BB%BASpringBoot%E9%A1%B9%E7%9B%AE/1775057178085.png" alt="1775057178085"></p><h2 id="三、导入项目"><a href="#三、导入项目" class="headerlink" title="三、导入项目"></a>三、导入项目</h2><ol><li>开始导入</li></ol><p>点击 File-&gt;Import，找到Maven下的Existing Maven Projects，然后Next，Browse找到前面下载项目的位置。</p><ol start="2"><li>等待Maven自动下载依赖</li><li>设置启动类</li></ol><p>右键项目名称，选择Run As，找到 Java Application，右键New Configuration，Project选择项目名称，Main class选择SpringBoot项目里的启动类。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Eclipse%E5%88%9B%E5%BB%BASpringBoot%E9%A1%B9%E7%9B%AE/1775057967445.png" alt="1775057967445"></p><h2 id="四、项目修改"><a href="#四、项目修改" class="headerlink" title="四、项目修改"></a>四、项目修改</h2><ol><li>配置启动端口</li></ol><p>SpringBoot项目默认启动端口是8080，自行修改在src&#x2F;main&#x2F;resources下的application.properties中配置，文件配置可改成yml格式，这里图快就就一个演示端口。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">spring.application.name=demo</span><br><span class="line">server.port=8081</span><br></pre></td></tr></table></figure><ol start="2"><li>添加依赖</li></ol><p>为了演示通过访问路由显示hello world，需要在pom.xml添加web相关依赖，添加后等待maven自动下载成功。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependency&gt;</span><br><span class="line">        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span><br><span class="line">        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;</span><br><span class="line">    &lt;/dependency&gt;</span><br></pre></td></tr></table></figure><ol start="3"><li>添加控制器</li></ol><p>在与项目启动类的目录下新建一个Package，然后再创建Class，命名为HomeController，代码添加如下。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.demo.controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HomeController</span> &#123;</span><br><span class="line"></span><br><span class="line"><span class="meta">@GetMapping(&quot;/hello&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">hello</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;Hello World&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="4"><li>访问</li></ol><p>可以直接在eclipse菜单栏下的带三角形的绿色图标编译运行，启动后，打开浏览器，输入127.0.0.1:8081&#x2F;hello，最后在浏览器中就可以看到hello world了。</p><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、前言&quot;&gt;&lt;a href=&quot;#一、前言&quot; class=&quot;headerlink&quot; title=&quot;一、前言&quot;&gt;&lt;/a&gt;一、前言&lt;/h2&gt;&lt;p&gt;虽然可以直接在Eclipse中，通过Maven提供的 &lt;strong&gt;Archetype&lt;/strong&gt; （模板）创建Sp</summary>
      
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>如何用Eclipse运行SpringBoot项目</title>
    <link href="https://www.zerofc.cn/2026/03/30/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/"/>
    <id>https://www.zerofc.cn/2026/03/30/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/</id>
    <published>2026-03-30T15:13:50.000Z</published>
    <updated>2026-03-30T15:12:21.150Z</updated>
    
    <content type="html"><![CDATA[<h4 id="Eclipse下载"><a href="#Eclipse下载" class="headerlink" title="Eclipse下载"></a>Eclipse下载</h4><ol><li><p>官网：<a href="https://www.eclipse.org/">https://www.eclipse.org/</a></p></li><li><p>选择更多版本 “ <a href="https://www.eclipse.org/downloads/packages/">Download Packages</a> ”</p></li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774857988424.png" alt="1774857988424"></p><ol start="3"><li>选择Java EE类的 “<a href="https://www.eclipse.org/downloads/packages/release/2026-03/r/eclipse-ide-enterprise-java-and-web-developers">Eclipse IDE for Enterprise Java and Web Developers</a>”。</li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774858094288.png" alt="1774858094288"></p><ol start="4"><li>选择自己操作系统的版本，以我为例，点击Download Links下x86_64</li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774858531402.png" alt="1774858531402"></p><ol start="5"><li>切换镜像下载，点击 “Select Another Mirror”，可以找到Asia(亚洲)下的China，点击链接就可以快速下载到本地了。</li></ol><h4 id="Eclipse安装"><a href="#Eclipse安装" class="headerlink" title="Eclipse安装"></a>Eclipse安装</h4><ol><li><p>下载完毕后解压，然后点击 “eclipse.exe”就可以打开</p></li><li><p>指定工作空间，选择电脑上的一个文件夹</p></li></ol><h4 id="STS插件-安装"><a href="#STS插件-安装" class="headerlink" title="STS插件 安装"></a>STS插件 安装</h4><ol><li>点击 “help”-&gt;”Eclipse Marketplace”。</li><li>搜索 “Spring Tools”，后安装。</li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774860806932.png" alt="1774860806932"></p><ol start="3"><li>查看是否有spring模板</li></ol><p>点击 “File”-&gt;“New”-&gt;”Project”-&gt;”Spring Tool”</p><h4 id="修改Maven位置"><a href="#修改Maven位置" class="headerlink" title="修改Maven位置"></a>修改Maven位置</h4><p>Eclipse中，不设置自己的maven会默认将依赖放到系统盘中，所以需要手动指定一下。</p><ol><li><h5 id="修改maven位置"><a href="#修改maven位置" class="headerlink" title="修改maven位置"></a>修改maven位置</h5></li></ol><p>打开windows-&gt;Preferences-&gt;Maven-&gt;Installations，add添加自己下载在本地的maven根目录。</p><ol start="2"><li><h5 id="修改maven设置"><a href="#修改maven设置" class="headerlink" title="修改maven设置"></a>修改maven设置</h5></li></ol><p>还是在maven下，打开User Settins，分别修改User Settins、User Toolchains、Local Repository为自己maven目录下对应的settings.xml文件等。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774877367807.png" alt="1774877367807"></p><h4 id="导入SpringBoot项目"><a href="#导入SpringBoot项目" class="headerlink" title="导入SpringBoot项目"></a>导入SpringBoot项目</h4><ol><li><h5 id="开始导入"><a href="#开始导入" class="headerlink" title="开始导入"></a>开始导入</h5></li></ol><p>点击File-&gt;Import-&gt;Maven-&gt;Maven-&gt;Existing Maven Projects</p><ol start="2"><li><h5 id="选择项目勾选pom"><a href="#选择项目勾选pom" class="headerlink" title="选择项目勾选pom"></a>选择项目勾选pom</h5></li></ol><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774878467873.png" alt="1774878467873"></p><ol start="3"><li><h5 id="等待maven将依赖下载完毕"><a href="#等待maven将依赖下载完毕" class="headerlink" title="等待maven将依赖下载完毕"></a>等待maven将依赖下载完毕</h5></li></ol><h4 id="项目运行"><a href="#项目运行" class="headerlink" title="项目运行"></a>项目运行</h4><ol><li><h5 id="build配置"><a href="#build配置" class="headerlink" title="build配置"></a>build配置</h5></li></ol><p>右键项目，选择build path-&gt;Configure Build Path，找到Libaries。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774879119231.png" alt="1774879119231"></p><ol start="2"><li><h5 id="Java编译设置"><a href="#Java编译设置" class="headerlink" title="Java编译设置"></a>Java编译设置</h5></li></ol><p>Java Build Path中System library选择Alternate JRE，选择自己项目需要的JDK，然后找到Java Compiler，compliance level下拉一个版本。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E7%94%A8Eclipse%E8%BF%90%E8%A1%8CSpringBoot%E9%A1%B9%E7%9B%AE/1774879393099.png" alt="1774879393099"></p><h5 id="3-开始运行"><a href="#3-开始运行" class="headerlink" title="3.开始运行"></a>3.开始运行</h5><p>打开项目的启动类，比如SchoolApplication.java，然后右键Run As，最后就可以看到启动成功了。</p><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h4 id=&quot;Eclipse下载&quot;&gt;&lt;a href=&quot;#Eclipse下载&quot; class=&quot;headerlink&quot; title=&quot;Eclipse下载&quot;&gt;&lt;/a&gt;Eclipse下载&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;官网：&lt;a href=&quot;https://www.eclipse.o</summary>
      
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>【附带小龙虾】VMware 17安装精简CentOS</title>
    <link href="https://www.zerofc.cn/2026/03/30/%E3%80%90%E9%99%84%E5%B8%A6%E5%B0%8F%E9%BE%99%E8%99%BE%E3%80%91VMware%2017%E5%AE%89%E8%A3%85%E7%B2%BE%E7%AE%80CentOS/"/>
    <id>https://www.zerofc.cn/2026/03/30/%E3%80%90%E9%99%84%E5%B8%A6%E5%B0%8F%E9%BE%99%E8%99%BE%E3%80%91VMware%2017%E5%AE%89%E8%A3%85%E7%B2%BE%E7%AE%80CentOS/</id>
    <published>2026-03-30T12:13:50.000Z</published>
    <updated>2026-03-28T07:37:42.888Z</updated>
    
    <content type="html"><![CDATA[<h2 id="VMware-17安装"><a href="#VMware-17安装" class="headerlink" title="VMware 17安装"></a>VMware 17安装</h2><ol><li>创建新虚拟机。</li><li>选择经典后点击稍后安装操作系统。</li><li>选择对应型号的系统，比如CentOS 7。</li><li>设置系统安装目录后，一直下一步到看到自定义硬件。</li><li>设置内存和CPU后，选择CD使用ISO镜像后找到下载好的系统镜像包。</li></ol><h2 id="CentOS7安装"><a href="#CentOS7安装" class="headerlink" title="CentOS7安装"></a>CentOS7安装</h2><ol><li>进入虚拟机开始安装系统出现黑屏安装界面。</li><li>选择 “Install CentOS 7”，等待安装后跳出UI设置界面。</li><li>找到 “NETWORK &amp; HOST NAME”，点击 “Ethernet(ens33)” 开启。</li><li>开启后会出现 IP Address、DNS、Mask等信息。</li><li>然后点击按钮 “Begin Installation”，开始进入账户设置。</li><li>点击 “ROOT PASSWORD”，只需输入两遍密码</li><li>等待在UI界面里进行系统安装，最后自动重启进入黑屏界面。</li><li>等待执行完毕后输入前面设置的root密码就可以登陆进入了。</li></ol><h2 id="宝塔安装"><a href="#宝塔安装" class="headerlink" title="宝塔安装"></a>宝塔安装</h2><ol><li>输入命令 ip addr查看内网地址，可以通过xshell连接了。</li><li>连接后安装宝塔，宝塔命令（宝塔面板11.6.0正式版 + OpenClaw小龙虾）</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/btClaw.sh;else wget -O btClaw.sh https://download.bt.cn/install/btClaw.sh;fi;bash btClaw.sh op260309</span><br></pre></td></tr></table></figure><h2 id="VMware-17-永久激活密钥"><a href="#VMware-17-永久激活密钥" class="headerlink" title="VMware 17 永久激活密钥"></a>VMware 17 永久激活密钥</h2><p>MC60H-DWHD5-H80U9-6V85M-8280D（亲测有效） </p><p><strong>JU090-6039P-08409-8J0QH-2YR7F</strong></p><p><strong>MC60H-DWHD5-H80U9-6V85M-8280D</strong></p><p>JUO9O-6039P-08409-8J0QH-2YR7F</p><p>4A4RR-813DK-M81A9-4U35H-06KND</p><p>NZ4RR-FTK5H-H81C1-Q30QH-1V2LA</p><p>JU090-6039P-08409-8J0QH-2YR7F</p><p>4Y09U-AJK97-089Z0-A3054-83KLA</p><p>4C21U-2KK9Q-M8130-4V2QH-CF810</p><p>MC60H-DWHD5-H80U9-6V85M-8280D</p><p>ZA30U-DXF84-4850Q-UMMXZ-W6K8F</p><p>AC590-2XW97-48EFZ-TZPQE-MYHEA</p><p>YF39K-DLFE5-H856Z-6NWZE-XQ2XD</p><p>AC15R-FNZ16-H8DWQ-WFPNV-M28E2</p><p>CZ1J8-A0D82-489LZ-ZMZQT-P3KX6</p><p>YA11K-6YE8H-H89ZZ-EXM59-Y6AR0</p><p>pro 17密钥：4A4RR-813DK-M81A9-4U35H-06KND（备用）</p><p>pro 17密钥：NZ4RR-FTK5H-H81C1-Q30QH-1V2LA（备用）</p><p>pro 17密钥：JU090-6039P-08409-8J0QH-2YR7F（备用）</p><p>pro 17密钥：4Y09U-AJK97-089Z0-A3054-83KLA（备用）</p><p>pro 17密钥：4C21U-2KK9Q-M8130-4V2QH-CF810（备用）</p><p>pro 17密钥：MC60H-DWHD5-H80U9-6V85M-8280D（备用）</p><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;VMware-17安装&quot;&gt;&lt;a href=&quot;#VMware-17安装&quot; class=&quot;headerlink&quot; title=&quot;VMware 17安装&quot;&gt;&lt;/a&gt;VMware 17安装&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;创建新虚拟机。&lt;/li&gt;
&lt;li&gt;选择经典后点击稍后安装</summary>
      
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Redis键空间通知监听</title>
    <link href="https://www.zerofc.cn/2026/03/15/Redis%E9%94%AE%E7%A9%BA%E9%97%B4%E9%80%9A%E7%9F%A5%E7%9B%91%E5%90%AC/"/>
    <id>https://www.zerofc.cn/2026/03/15/Redis%E9%94%AE%E7%A9%BA%E9%97%B4%E9%80%9A%E7%9F%A5%E7%9B%91%E5%90%AC/</id>
    <published>2026-03-15T08:13:50.000Z</published>
    <updated>2026-03-19T15:42:25.998Z</updated>
    
    <content type="html"><![CDATA[<h2 id=""><a href="#" class="headerlink" title=""></a></h2><h4 id="查看是否开启键空间监听"><a href="#查看是否开启键空间监听" class="headerlink" title="查看是否开启键空间监听"></a>查看是否开启键空间监听</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG GET notify-keyspace-events</span><br></pre></td></tr></table></figure><h4 id="设置键空间监听"><a href="#设置键空间监听" class="headerlink" title="设置键空间监听"></a>设置键空间监听</h4><p>只要设置了会立即生效，无需重启，在windows中，奇怪的是设置redis.conf不生效。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG SET notify-keyspace-events Ex</span><br></pre></td></tr></table></figure><h4 id="测试添加带有效期的键"><a href="#测试添加带有效期的键" class="headerlink" title="测试添加带有效期的键"></a>测试添加带有效期的键</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SET testkey &quot;hello&quot; EX 5</span><br></pre></td></tr></table></figure><h4 id="监听键失效事件"><a href="#监听键失效事件" class="headerlink" title="监听键失效事件"></a>监听键失效事件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">psubscribe __keyevent@?__:expired</span><br></pre></td></tr></table></figure><h4 id="ThinkPHP6-0失效监听"><a href="#ThinkPHP6-0失效监听" class="headerlink" title="ThinkPHP6.0失效监听"></a>ThinkPHP6.0失效监听</h4><p>以下操作不会占用大内存，因为监听事件取出的数据，处理完毕后会立即释放，一定要避免下面这种方式。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$data = [];  // 全局变量</span><br><span class="line">$redis-&gt;psubscribe(..., function(...) use (&amp;$data) &#123;</span><br><span class="line">    $data[] = $msg;  // 无限累积！</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>主要业务是取出集合中数据，拿到数据进行工单创建。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title class_">app</span>\<span class="title class_">common</span>\<span class="title class_">command</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">think</span>\<span class="title">console</span>\<span class="title">Command</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">think</span>\<span class="title">console</span>\<span class="title">Input</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">think</span>\<span class="title">console</span>\<span class="title">Output</span></span><br><span class="line"></span><br><span class="line"><span class="title">class</span> <span class="title">WatchRedisExpired</span> <span class="title">extends</span> <span class="title">Command</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="title">protected</span> <span class="keyword">function</span> <span class="title">configure</span>()</span><br><span class="line">    &#123;</span><br><span class="line">        $<span class="title">this</span>-&gt;<span class="title">setName</span>(&#x27;<span class="title">watch</span>:<span class="title">redis_expired</span>&#x27;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">protected</span> <span class="function"><span class="keyword">function</span> <span class="title">execute</span>(<span class="params">Input <span class="variable">$input</span>, Output <span class="variable">$output</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line"><span class="comment">//        $output-&gt;info(&quot;===========BEGIN-2026===========&quot;);</span></span><br><span class="line"></span><br><span class="line">        <span class="variable">$redis</span> = <span class="keyword">new</span> <span class="title class_">\Redis</span>();</span><br><span class="line">        <span class="variable">$redis</span>-&gt;<span class="title function_ invoke__">connect</span>(<span class="string">&#x27;127.0.0.1&#x27;</span>, <span class="number">6379</span>);</span><br><span class="line">        <span class="comment">// 设置永不超时</span></span><br><span class="line">        <span class="variable">$redis</span>-&gt;<span class="title function_ invoke__">setOption</span>(<span class="title class_">\Redis</span>::<span class="variable constant_">OPT_READ_TIMEOUT</span>, -<span class="number">1</span>);</span><br><span class="line">        <span class="title function_ invoke__">set_time_limit</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="variable">$redis</span>-&gt;<span class="title function_ invoke__">psubscribe</span>([<span class="string">&#x27;__keyevent@0__:expired&#x27;</span>], function (<span class="variable">$redis</span>, <span class="variable">$pattern</span>, <span class="variable">$chan</span>, <span class="variable">$msg</span>) &#123;</span><br><span class="line">                    <span class="keyword">echo</span> <span class="string">&quot;键过期事件: <span class="subst">$chan</span> -&gt; <span class="subst">$msg</span>\n&quot;</span>;</span><br><span class="line">                    <span class="comment">// 处理业务逻辑...</span></span><br><span class="line">                &#125;);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (<span class="built_in">Exception</span> <span class="variable">$e</span>) &#123;</span><br><span class="line">                <span class="comment">// 记录错误日志</span></span><br><span class="line">                <span class="title function_ invoke__">error_log</span>(<span class="string">&#x27;Redis subscription error: &#x27;</span> . <span class="variable">$e</span>-&gt;<span class="title function_ invoke__">getMessage</span>());</span><br><span class="line">                <span class="comment">// 等待一段时间后重连</span></span><br><span class="line">                <span class="title function_ invoke__">sleep</span>(<span class="number">5</span>);</span><br><span class="line">                <span class="comment">// 重新连接 Redis</span></span><br><span class="line">                <span class="variable">$redis</span> = <span class="keyword">new</span> <span class="title class_">\Redis</span>();</span><br><span class="line">                <span class="variable">$redis</span>-&gt;<span class="title function_ invoke__">connect</span>(<span class="string">&#x27;127.0.0.1&#x27;</span>, <span class="number">6379</span>);</span><br><span class="line">                <span class="variable">$redis</span>-&gt;<span class="title function_ invoke__">setOption</span>(<span class="title class_">\Redis</span>::<span class="variable constant_">OPT_READ_TIMEOUT</span>, -<span class="number">1</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="失效键无法获取值解决方法"><a href="#失效键无法获取值解决方法" class="headerlink" title="失效键无法获取值解决方法"></a>失效键无法获取值解决方法</h4><p>1.集合不设置有效期</p><p>2.在扫单时，只需判断集合是否存在</p><p>3.不存在则创建一个触发键，设置有效时间</p><p>4.当时间过期时，订阅监听之际，取出集合中所有数据</p><p>5.删除该集合</p><p>6.拿到数据，就开始读取tms运单数据、创建工单，并将扫单表标记与已同步</p><h4 id="远程redis连接"><a href="#远程redis连接" class="headerlink" title="远程redis连接"></a>远程redis连接</h4><p>redis-cli.exe -h 47.112.7.182 -p 6379</p><p>redis-cli -h 127.0.0.1 -p 6379 -a password</p><h4 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h4><ol><li>Redis 6.*版本以上，订阅有expire事件，也就是某个键在失效前可以在回调中取到，以下的版本只能使用expired。</li><li>在回调中，整个线程是封闭阻塞的，无论是读取哪个库号，都无法获取其他键的键值，必须在里面重新创建一个redis，但是还要解决连接中断的问题。</li></ol>]]></content>
    
    
    <summary type="html">Redis键空间通知监听实战</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="redis" scheme="https://www.zerofc.cn/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>我的2025年终总结，回归过程</title>
    <link href="https://www.zerofc.cn/2026/02/15/%E6%88%91%E7%9A%842025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93%EF%BC%8C%E5%9B%9E%E5%BD%92%E8%BF%87%E7%A8%8B/"/>
    <id>https://www.zerofc.cn/2026/02/15/%E6%88%91%E7%9A%842025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93%EF%BC%8C%E5%9B%9E%E5%BD%92%E8%BF%87%E7%A8%8B/</id>
    <published>2026-02-15T08:13:50.000Z</published>
    <updated>2026-02-25T11:26:30.554Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>和往年一样，又到了年底复盘的时候啦，但有点不同的是：我今年选择是农历的辞旧迎新之际写年终总结。</p><p>原因有几个，一个是回归我们传统的节日性跨年，另一个是整个2025年我其实有点茫然。</p><p>要赶在2026年元旦前更新文章，我还真有点来不及，因为我发现我有点 内容枯竭，不光其他平台断更，公众号上面也就写了8篇文章，创历史最低位。</p><p>影响这个的，我觉得和AI有很大关系，这个我后面再慢慢细讲，虽然断更这么久，但好歹是一年时间，做过的事情，收获的东西，遇到的问题也还是有，所以下面就开始罗列了。</p><h2 id="二、事件"><a href="#二、事件" class="headerlink" title="二、事件"></a>二、事件</h2><p>2025年的完成表和2024年年终文的计划还是有出入的，计划八大纲，完成度只能是算一半一半吧，除了弹幕小玩法没上架和小型单机游戏没做外，其他基本也都实现了。</p><p>1.小丑先生IP衍生的表情包上架，下载789个，转发2178次，打赏2个。</p><p>2.公众号《ZERO开发》发文8篇，视频号《北桥苏》视频更新4个，AI应用相关文章2篇。</p><p>3.小丑先生IP衍生的微信红包封面发布，累计拆红包数20307个，曝光数138196。</p><p>4.微信问一问《ZERO开发》创作分成开通，总发布数116条，曝光量16w，收获关注数410个。</p><p>5.个人资源（源码、资料、教程）整理完毕，免费分享，已完成频道建立。</p><p>6.个人微信服务号《51轻创》完成注册，发布小绿书9篇，暂停重新定位中。</p><h2 id="三、收获"><a href="#三、收获" class="headerlink" title="三、收获"></a>三、收获</h2><p>事情看上去好像并不多，而且数据也不好看，但是真实，也正应我今年的主题 “回归过程”，结果虽然重要，但是AI正在让过程变得更稀缺。</p><p>因为AI本质是一个黑盒的计算函数，没有人能理解他整个的计算过程，但却能在非常短的时间内给出计算结果。他让我们以前写解答式的技术文章变得毫无意义，这也是让我茫然并断更的主要原因。</p><p>我开通公众号到现在已经有十年了，早期的目的就是用于记录我平时在写代码时踩过的坑，既方便自己以后重新查找，也能让其他网友避免踩坑。</p><p>大家都知道计算机这一行有一个非常大的问题，就是迭代太快，必须要保持时刻学习并终生学习的态度。</p><p>为什么会这样呢？计算机科学是建立在确定物理学之上的假设，就是人为编造的，编程根本没有无法修改的东西，信息能记录和模拟万物，谁制定了规则，抢占了市场，那他就是要重新学习的东西。</p><p>而这种基于规则的东西，在AI看来就是洒洒水的事，你写再多再好的代码，写再多的技术性文章都没用。</p><p>同样也是断更的那段时间，偶然我发现微信问一问改版了，以前那种很AI味的回答完全没有流量了，更多的是大家生活中记录的真实感受和照片占据首页。</p><p>AI是“掌管信息的神”，他能取代我们，但我们也不一定非得自己写代码，我们就不能指挥他写吗？我们再把怎么指挥他的整个过程记录下来不是也挺好，今年主打收获一个心态！</p><h2 id="四、计划"><a href="#四、计划" class="headerlink" title="四、计划"></a>四、计划</h2><p>今年的收获和计划不是工业式的List，全是铺屏的文字，这样才有温度嘛，但是要提取成关键点就要拆分咯！</p><p>其实我一点也不怕AI能彻底结算我们这行，因为我们是人，世界那么大，需求也不是一成不变的，就像我们的爱好一样，也是随着时间一直在变。</p><p>就算强大的AI没有出现，我也会对基础物理感兴趣，就像知道了前后端，就会好奇Web的整个运行原理，知道了整个软件又会好奇硬件，后面又会涉及到电子信息和材料相关的学科。</p><p>有时候我也会抽空去逛华强北，了解什么叫实际需求的消费电子，也对整个PCB工艺有初步的概念，于是对PCB设计有了很大兴趣，可能后面会折腾一下电子DIY，当然画板，焊盘，写程序也在更进中。</p><p>当然关于信息类的程序，比如纯Web应用、游戏、编曲等也会支线进行，也会把折腾过程记录并分享出来。</p><h2 id="五、结语"><a href="#五、结语" class="headerlink" title="五、结语"></a>五、结语</h2><p>只能说一年的时间过得真快，世界变得很快，不管上一年计划要做的事完成的怎么样，我们还是要往前看。</p><p>停更的日子里，也非常感谢有小伙伴催更，说实话小伙伴越多，写文章和更视频都有点不好意思做得太水，以前就当个笔记自己看看，现在还是要多考虑内容到底对大家有没有帮助，不说要有多深刻，提供点情绪价值也可以。</p><p>最后要说得就是：AI真的很强，他是人类史上资金投入最多的一个重大工程了，未来我们不必和AI直接竞争，保持身体健康，回归过程，多记录多思考新时代的新机会，一起迎接AI革命后的科技果实。</p>]]></content>
    
    
    <summary type="html">我的2025年终总结，回归过程</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>【运维】守护进程创建</title>
    <link href="https://www.zerofc.cn/2026/01/05/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2026/01/05/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA/</id>
    <published>2026-01-05T15:13:50.000Z</published>
    <updated>2026-04-08T14:11:24.914Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、指令创建"><a href="#一、指令创建" class="headerlink" title="一、指令创建"></a>一、指令创建</h2><h5 id="1-进入配置目录"><a href="#1-进入配置目录" class="headerlink" title="1.进入配置目录"></a>1.进入配置目录</h5><p>Supervisor 的自定义进程配置统一放在这里</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd /etc/supervisord.d/</span><br></pre></td></tr></table></figure><h5 id="2-进入配置目录"><a href="#2-进入配置目录" class="headerlink" title="2.进入配置目录"></a>2.进入配置目录</h5><p>文件名随便起，比如你要守护订单监听workorder.ini</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi workorder.ini</span><br></pre></td></tr></table></figure><h5 id="3-守护进程示例"><a href="#3-守护进程示例" class="headerlink" title="3.守护进程示例"></a>3.守护进程示例</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[program:tms]</span><br><span class="line">command=/usr/local/php74/bin/php  /webroot/cms_admin/backend/think WorkOrderReplyMonitor</span><br><span class="line">user=nginx</span><br><span class="line">stdout_logfile=/var/log/supervisor/ord_reply_monitor.log</span><br><span class="line">stdout_logfile_maxbytes=20MB</span><br><span class="line">stdout_logfile_backups=3</span><br><span class="line">autostart=true</span><br><span class="line">autorestart=true</span><br><span class="line">startsecs=5</span><br><span class="line">stopasgroup=true</span><br><span class="line">killasgroup=true</span><br><span class="line">startretries=9999</span><br><span class="line">redirect_stderr=true</span><br><span class="line">environment=PHP_TIME_LIMIT=0</span><br></pre></td></tr></table></figure><h5 id="4-平滑启动"><a href="#4-平滑启动" class="headerlink" title="4.平滑启动"></a>4.平滑启动</h5><p>执行以下命令不会影响其他几个守护进程</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"># 重新读取配置</span><br><span class="line">supervisorctl reread</span><br><span class="line"></span><br><span class="line"># 加载新进程</span><br><span class="line">supervisorctl update</span><br><span class="line"></span><br><span class="line"># 查看状态</span><br><span class="line">supervisorctl status</span><br></pre></td></tr></table></figure><h2 id="二、守护进程维护"><a href="#二、守护进程维护" class="headerlink" title="二、守护进程维护"></a>二、守护进程维护</h2><p>1.<strong>查看指令列表状态</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">supervisorctl status</span><br></pre></td></tr></table></figure><p>2.<strong>修改命令脚本后重启指令</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">supervisorctl stop tms</span><br><span class="line"></span><br><span class="line">supervisorctl start tms</span><br></pre></td></tr></table></figure><p>3.<strong>查看指令输出日志</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd /var/log/supervisor</span><br><span class="line"></span><br><span class="line">tail -f tms.log</span><br></pre></td></tr></table></figure><p>4.<strong>重启指令</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">supervisorctl restart tms</span><br></pre></td></tr></table></figure><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、指令创建&quot;&gt;&lt;a href=&quot;#一、指令创建&quot; class=&quot;headerlink&quot; title=&quot;一、指令创建&quot;&gt;&lt;/a&gt;一、指令创建&lt;/h2&gt;&lt;h5 id=&quot;1-进入配置目录&quot;&gt;&lt;a href=&quot;#1-进入配置目录&quot; class=&quot;headerlink&quot; </summary>
      
    
    
    
    <category term="运维相关" scheme="https://www.zerofc.cn/categories/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="supervisorctl" scheme="https://www.zerofc.cn/tags/supervisorctl/"/>
    
  </entry>
  
  <entry>
    <title>【运维】定时任务创建</title>
    <link href="https://www.zerofc.cn/2026/01/05/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%88%9B%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2026/01/05/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E5%88%9B%E5%BB%BA/</id>
    <published>2026-01-05T15:13:50.000Z</published>
    <updated>2026-04-08T14:17:57.695Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、任务创建"><a href="#一、任务创建" class="headerlink" title="一、任务创建"></a>一、任务创建</h2><p>查看系统用户下的所有定时任务**</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -l</span><br></pre></td></tr></table></figure><p><strong>添加定时任务</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -e</span><br></pre></td></tr></table></figure><p> <strong>按 <code>i</code> 进入编辑，添加一行</strong> </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * * cd /www/wwwroot/你的项目目录 &amp;&amp; php think 你的命令 &gt;&gt; /tmp/tp_task.log 2&gt;&amp;1</span><br></pre></td></tr></table></figure><p> <strong>示例（每分钟执行一次）：</strong> </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">* * * * * cd /www/wwwroot/myproject &amp;&amp; php think task:sync &gt;&gt; /tmp/tp_task.log 2&gt;&amp;1</span><br></pre></td></tr></table></figure><p> <strong>你只需要改 2 个地方：</strong> </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/www/wwwroot/你的项目目录</span><br><span class="line">task:sync 换成你自己的命令</span><br><span class="line">按 ESC，输入 :wq 保存退出。</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">*/5 * * * *</span><br><span class="line"> ┬  ┬ ┬ ┬ ┬</span><br><span class="line"> │  │ │ │ │</span><br><span class="line"> │  │ │ │ └──── 星期 (0-7)</span><br><span class="line"> │  │ │ └────── 月份 (1-12)</span><br><span class="line"> │  │ └──────── 日期 (1-31)</span><br><span class="line"> │  └────────── 小时 (0-23)</span><br><span class="line"> └───────────── 分钟 (*/5 表示每5分钟)</span><br><span class="line"> </span><br><span class="line"> 2&gt;&amp;1 表示错误和正确一起输出到日志，每个都添加即可</span><br></pre></td></tr></table></figure><h2 id="二、定时任务维护"><a href="#二、定时任务维护" class="headerlink" title="二、定时任务维护"></a>二、定时任务维护</h2><h5 id="1-查看定时任务"><a href="#1-查看定时任务" class="headerlink" title="1.查看定时任务"></a>1.查看定时任务</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -l</span><br></pre></td></tr></table></figure><h5 id="2-查看定时任务日志"><a href="#2-查看定时任务日志" class="headerlink" title="2.查看定时任务日志"></a>2.查看定时任务日志</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -f /var/log/cron</span><br></pre></td></tr></table></figure><h5 id="3-查看你命令的输出日志"><a href="#3-查看你命令的输出日志" class="headerlink" title="3.查看你命令的输出日志"></a>3.查看你命令的输出日志</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tail -f /tmp/tp_task.log</span><br></pre></td></tr></table></figure><h5 id="4-查看执行用户，以下为www用户"><a href="#4-查看执行用户，以下为www用户" class="headerlink" title="4.查看执行用户，以下为www用户"></a>4.查看执行用户，以下为www用户</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">crontab -u www -l</span><br></pre></td></tr></table></figure><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、任务创建&quot;&gt;&lt;a href=&quot;#一、任务创建&quot; class=&quot;headerlink&quot; title=&quot;一、任务创建&quot;&gt;&lt;/a&gt;一、任务创建&lt;/h2&gt;&lt;p&gt;查看系统用户下的所有定时任务**&lt;/p&gt;
&lt;figure class=&quot;highlight plaintex</summary>
      
    
    
    
    <category term="运维相关" scheme="https://www.zerofc.cn/categories/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="crontab" scheme="https://www.zerofc.cn/tags/crontab/"/>
    
  </entry>
  
  <entry>
    <title>【运维】Xshell基本使用</title>
    <link href="https://www.zerofc.cn/2026/01/02/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91Xshell%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/"/>
    <id>https://www.zerofc.cn/2026/01/02/%E3%80%90%E8%BF%90%E7%BB%B4%E3%80%91Xshell%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</id>
    <published>2026-01-02T15:13:50.000Z</published>
    <updated>2026-04-08T14:32:48.761Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、Xshell连接"><a href="#一、Xshell连接" class="headerlink" title="一、Xshell连接"></a>一、Xshell连接</h2><h5 id="1-查看ip地址"><a href="#1-查看ip地址" class="headerlink" title="1.查看ip地址"></a>1.查看ip地址</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ip addr</span><br></pre></td></tr></table></figure><h5 id="2-如果没有192开头的局域网地址"><a href="#2-如果没有192开头的局域网地址" class="headerlink" title="2.如果没有192开头的局域网地址"></a>2.如果没有192开头的局域网地址</h5><ol><li>先确认 VMware 网络适配器是 <strong>NAT 模式</strong> </li><li>编辑网卡配置文件：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/sysconfig/network-scripts/ifcfg-ens33</span><br></pre></td></tr></table></figure><h5 id="3-把内容替换为（DHCP-自动获取）"><a href="#3-把内容替换为（DHCP-自动获取）" class="headerlink" title="3.把内容替换为（DHCP 自动获取）"></a>3.把内容替换为（DHCP 自动获取）</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">TYPE=Ethernet</span><br><span class="line">BOOTPROTO=dhcp</span><br><span class="line">ONBOOT=yes</span><br><span class="line">NAME=ens33</span><br><span class="line">DEVICE=ens33</span><br><span class="line">NM_CONTROLLED=no</span><br></pre></td></tr></table></figure><h5 id="4-按esc后，输入“：wq”-保存退出后重启网络"><a href="#4-按esc后，输入“：wq”-保存退出后重启网络" class="headerlink" title="4.按esc后，输入“：wq” 保存退出后重启网络"></a>4.按esc后，输入“：wq” 保存退出后重启网络</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart network</span><br></pre></td></tr></table></figure><p>最后再执行 “ip addr”，自动获取是给出一个局域网范围，以列出的开头作为xshell连接ip就可以。</p><h5 id="5-以我为例"><a href="#5-以我为例" class="headerlink" title="5.以我为例"></a>5.以我为例</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Xshell主机：192.168.20.128</span><br><span class="line">账号：root</span><br><span class="line">密码：roo</span><br></pre></td></tr></table></figure><h2 id="二、安装宝塔Bt"><a href="#二、安装宝塔Bt" class="headerlink" title="二、安装宝塔Bt"></a>二、安装宝塔Bt</h2><h5 id="带龙虾版"><a href="#带龙虾版" class="headerlink" title="带龙虾版"></a>带龙虾版</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/btClaw.sh;else wget -O btClaw.sh https://download.bt.cn/install/btClaw.sh;fi;bash btClaw.sh op260309</span><br></pre></td></tr></table></figure><h5 id="访问地址-账号密码"><a href="#访问地址-账号密码" class="headerlink" title="访问地址&#x2F;账号密码"></a>访问地址&#x2F;账号密码</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">外网ipv4面板地址: https://58.60.152.203:29665/72c0e415</span><br><span class="line">内网面板地址:     https://192.168.132.128:29665/72c0e415</span><br><span class="line">username: jgdxrm0g</span><br><span class="line">password: 6614c52c</span><br></pre></td></tr></table></figure><h2 id="三、Redis的配置持久化"><a href="#三、Redis的配置持久化" class="headerlink" title="三、Redis的配置持久化"></a>三、Redis的配置持久化</h2><p>下面设置键失效通知的配置只是在内存中生效，一旦redis重启就会出现前面配置无效，需要执行config rewrite指令。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG GET notify-keyspace-events</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG SET notify-keyspace-events Ex</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG REWRITE</span><br></pre></td></tr></table></figure><h2 id="四、PHP指令运行"><a href="#四、PHP指令运行" class="headerlink" title="四、PHP指令运行"></a>四、PHP指令运行</h2><h5 id="查看php的环境变量"><a href="#查看php的环境变量" class="headerlink" title="查看php的环境变量"></a>查看php的环境变量</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">which php</span><br><span class="line">比如： /usr/bin/php</span><br></pre></td></tr></table></figure><h5 id="自定义指令执行"><a href="#自定义指令执行" class="headerlink" title="自定义指令执行"></a>自定义指令执行</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd /webroot/cms_admin/backend</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/php74/bin/php think WorkOrderMsgPublisher</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/php74/bin/php think EmailCheck</span><br></pre></td></tr></table></figure><h2 id="个人游戏开发"><a href="#个人游戏开发" class="headerlink" title="个人游戏开发"></a>个人游戏开发</h2><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"> </p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、Xshell连接&quot;&gt;&lt;a href=&quot;#一、Xshell连接&quot; class=&quot;headerlink&quot; title=&quot;一、Xshell连接&quot;&gt;&lt;/a&gt;一、Xshell连接&lt;/h2&gt;&lt;h5 id=&quot;1-查看ip地址&quot;&gt;&lt;a href=&quot;#1-查看ip地址&quot; cla</summary>
      
    
    
    
    <category term="运维相关" scheme="https://www.zerofc.cn/categories/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Windows下进程、线程指令合集</title>
    <link href="https://www.zerofc.cn/2025/11/10/Windows%E4%B8%8B%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8C%87%E4%BB%A4%E5%90%88%E9%9B%86/"/>
    <id>https://www.zerofc.cn/2025/11/10/Windows%E4%B8%8B%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8C%87%E4%BB%A4%E5%90%88%E9%9B%86/</id>
    <published>2025-11-10T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.563Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>为了在本地查看java程序运行后的线程，除了使用cmd命令、还可用到wmic、PowerShell，同时也为了怕被忘记，我就记录一下了。</p><h2 id="二、命令介绍"><a href="#二、命令介绍" class="headerlink" title="二、命令介绍"></a>二、命令介绍</h2><h3 id="1-cmd"><a href="#1-cmd" class="headerlink" title="1.cmd"></a>1.cmd</h3><p>命令提示符是Windows早期版本中的命令行界面，用于执行基本的系统管理任务和文件操作，对于老旧版本的Windows系统，cmd仍然是主要的命令行工具。</p><h3 id="2-wmic"><a href="#2-wmic" class="headerlink" title="2.wmic"></a>2.wmic</h3><p>wmic 是一个用于管理和查询系统资源的命令行工具，基于WMI（Windows Management Instrumentation），可以获取和设置系统硬件、软件、操作系统等的详细信息。</p><p>常用命令包括 wmic process list brief（列出进程）、wmic cpu get loadpercentage（获取CPU负载）、wmic logicaldisk get size,freespace（获取磁盘空间信息）等。</p><p>使用方法是直接在cmd框中输入wmic指令即可。</p><h3 id="3-PowerShell"><a href="#3-PowerShell" class="headerlink" title="3.PowerShell"></a>3.PowerShell</h3><p>PowerShell 是一个功能强大的脚本语言环境，用于管理和自动化系统任务；支持脚本编写、对象操作和高级的系统管理功能；内置了丰富的命令和模块，可以执行几乎所有的系统管理任务。</p><p>功能非常强大，支持复杂的脚本编写和高级的对象操作，提供了大量的内置命令和模块，可以执行几乎所有的系统管理任务。内置在所有较新的Windows版本中（Windows 7 及更高版本），并且在Windows 10和Windows 11中得到了进一步的增强。</p><p>通过win+X，或者右击win图标，选择Windows PowerShell，弹出一个蓝色的框。</p><h2 id="三、命令使用"><a href="#三、命令使用" class="headerlink" title="三、命令使用"></a>三、命令使用</h2><p>下面以程序名开头，获取进程ID，再根据进程ID查询详情（包括状态、线程数等），最后再根据进程ID，查询下面的所有线程并列出线程信息。</p><h3 id="1-根据程序名获取进程"><a href="#1-根据程序名获取进程" class="headerlink" title="1.根据程序名获取进程"></a>1.根据程序名获取进程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tasklist | findstr &quot;java&quot;</span><br></pre></td></tr></table></figure><h3 id="2-根据进程ID查看进程信息"><a href="#2-根据进程ID查看进程信息" class="headerlink" title="2.根据进程ID查看进程信息"></a>2.根据进程ID查看进程信息</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tasklist /FI &quot;PID eq 1234&quot; /V</span><br></pre></td></tr></table></figure><h3 id="3-根据进程ID获取详细信息，线程总数"><a href="#3-根据进程ID获取详细信息，线程总数" class="headerlink" title="3.根据进程ID获取详细信息，线程总数"></a>3.根据进程ID获取详细信息，线程总数</h3><p>这里有有一个需要注意的点是，像Java程序运行后，JVM除了主线程外，还会开启多个子线程用于垃圾回收等操作。所以就算在程序中只开启了一个线程，加上自带的都会有十几个子线程。</p><p>而通过任务管理器，在详细信息中找到的进程，然后右键 “分析等待链”，列出的线程也就展示前两个的线程ID，而通过PowerShell可列出所有线程。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wmic process where processid=1234 get processid,threadcount</span><br></pre></td></tr></table></figure><h3 id="4-根据进程ID列出所有线程"><a href="#4-根据进程ID列出所有线程" class="headerlink" title="4.根据进程ID列出所有线程"></a>4.根据进程ID列出所有线程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Get-Process -Id 1234 | Select-Object -ExpandProperty Threads</span><br></pre></td></tr></table></figure><h3 id="5-直接根据程序名列出所有线程"><a href="#5-直接根据程序名列出所有线程" class="headerlink" title="5.直接根据程序名列出所有线程"></a>5.直接根据程序名列出所有线程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Get-Process -Name notepad | Select-Object -ExpandProperty Threads</span><br></pre></td></tr></table></figure><h2 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h2><p>在计算机科学中，进程、线程和协程是用于管理和调度任务的基本概念。而进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己的独立地址空间，包括代码、数据和堆栈；进程可以包含一个或多个线程，并且每个进程由操作系统独立管理。</p><p>线程是进程中的执行单元，是操作系统进行调度的基本单位，线程共享进程的资源，如内存空间、文件句柄等，但每个线程有自己的堆栈、程序计数器和局部变量。</p><p>协程是一种用户态轻量级线程，可以暂停和恢复执行，而不像线程那样需要操作系统支持。协程可以理解为在单个线程中交叉执行的函数，作用还是提升单线程的利用率，减少资源占用。</p><p>而且他虽然不是由操作系统调度，但是也不是自己的业务程序分配哪个先哪个后，而是由支持协程的扩展或编程语言的运行时，里面封装调度器进行管理，比如执行到业务中定义的一个有IO操作的协程就会马上切到下一个协程，等上一个IO接触就返回给回调函数。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Windows下进程、线程指令合集</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Audition入门教程：音频降速</title>
    <link href="https://www.zerofc.cn/2025/08/30/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/"/>
    <id>https://www.zerofc.cn/2025/08/30/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/</id>
    <published>2025-08-30T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>游戏被称为人类史上第九大艺术，它融合了文学、雕塑、电影、音乐等前八者造诣之和。所以在游戏创作中，如果是独立开发，在解决了编码、美术外，音乐音效也是一个亟需处理的一环。</p><p>而个人要对音效进行处理就不得不用到Audition了，比如你自己采集的声音，要进行降噪，音量增益等等操作。</p><p>由于我自己用过Adobe的其他产品，对Auditon就是拿来直接上手，折腾过后，为了防止忘记，就整理了一些常用而又比较难找的功能设置方法，那第一个就从音频降速开始。</p><h1 id="二、操作流程"><a href="#二、操作流程" class="headerlink" title="二、操作流程"></a>二、操作流程</h1><h3 id="1-创建多轨"><a href="#1-创建多轨" class="headerlink" title="1.创建多轨"></a>1.创建多轨</h3><p>打开Audition CC后，默认情况下，点击左侧栏中的 “多轨”，填写工程名，模板，采样率，位深度就可以创建多轨项目了。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910134508870.png" alt="image-20250910134508870"></p><h3 id="2-导入资源"><a href="#2-导入资源" class="headerlink" title="2.导入资源"></a>2.导入资源</h3><p>点击文件栏目中的“文件夹图标”，也可以直接双击，弹出选择资源的框，选中音频文件就能作为资源，然后拖动音频文件到 “多轨编辑器”中就完成导入了。</p><h3 id="3-操作音频"><a href="#3-操作音频" class="headerlink" title="3.操作音频"></a>3.操作音频</h3><p>在编辑器中选中导入的音频文件，可以用菜单里的工具进行简单操作，比如切割，滑动，圈选等，最常用的就是切割，像剪辑视频一样操作。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910135252472.png" alt="image-20250910135252472"></p><h3 id="4-拉伸模式"><a href="#4-拉伸模式" class="headerlink" title="4.拉伸模式"></a>4.拉伸模式</h3><p>为了好看效果，我切割了一小段移到了第二个轨道，鼠标悬浮到音频片段的边缘一个“小三角形”，淡出淡出按钮旁边，放上去出现一个 “计时表图标”和“伸缩”文字。</p><p>如果没有这些图标，可以点击音频片段右键，找到“伸缩”-&gt;“伸缩模式”，选择 “实时”，最后再重复前面操作。</p><h3 id="5-降速操作"><a href="#5-降速操作" class="headerlink" title="5.降速操作"></a>5.降速操作</h3><p>鼠标悬浮出现“伸缩”时，鼠标向右拖动（大于100%），音频片段就会降速，将相当于对音频片段进行慢放，反之向左（小于100%），音频就会升速，播放时就相当于快进了。</p><p>这个操作常用于对音频的速度对齐，比如唱歌的干音快了几个拍子，就可以通过这种方式能匹配伴奏了，当然音效处理也可以。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910140441150.png" alt="image-20250910140441150"></p><h1 id="三、写在后面"><a href="#三、写在后面" class="headerlink" title="三、写在后面"></a>三、写在后面</h1><p>虽然标题是对音频的降速操作，但是这篇文章把基本的项目创建到基本操作也简单介绍了一遍，伸缩操作比较隐蔽所以就单独整理了一篇文章，如果要对音频添加效果，比如降噪、电音效果和混音，我后面再单独更新，要等待一下。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">在Audition CC中如何对音频放慢速度</summary>
    
    
    
    <category term="音频相关" scheme="https://www.zerofc.cn/categories/%E9%9F%B3%E9%A2%91%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="Audition" scheme="https://www.zerofc.cn/tags/Audition/"/>
    
  </entry>
  
  <entry>
    <title>如何在Unity3D中实现无缝滚动动画？</title>
    <link href="https://www.zerofc.cn/2025/08/29/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/"/>
    <id>https://www.zerofc.cn/2025/08/29/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/</id>
    <published>2025-08-29T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:32.103Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>对于游戏开发的动画，可能大部分是采用第三方的制作工具单独完成，然后导入Unity3D 2020.3中。但是有些组件动画，比如像进度条这种，因为要完成色块移动控制，所以在Unity3D中实现更好。</p><h1 id="二、操作流程"><a href="#二、操作流程" class="headerlink" title="二、操作流程"></a>二、操作流程</h1><h3 id="1-搭建基本结构"><a href="#1-搭建基本结构" class="headerlink" title="1.搭建基本结构"></a>1.搭建基本结构</h3><p>结构主要是先一个空对象，对象下添加Image对象作为进度条背景，与背景同级创建一个带Animation组件的对象，最后在带Animation组件对象下添加两个Image对象。</p><h3 id="2-添加需要组件"><a href="#2-添加需要组件" class="headerlink" title="2.添加需要组件"></a>2.添加需要组件</h3><p>Background添加Image组件；ObjAnima添加Rect Mask 2D组件和Animation组件；Animation01和Animation02添加Image组件。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906191712611.png" alt="image-20250906191712611"></p><h3 id="3-创建Animation文件"><a href="#3-创建Animation文件" class="headerlink" title="3.创建Animation文件"></a>3.创建Animation文件</h3><p>在Assets资源管理中右键-&gt;Create-&gt;Animation，然后双击该文件打开Animation编辑器，点击Create保存到指定位置，文件后缀.anim。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906171304257.png" alt="image-20250906171304257"></p><h3 id="4-Animation编辑"><a href="#4-Animation编辑" class="headerlink" title="4.Animation编辑"></a>4.Animation编辑</h3><p>进入编辑框内，点击“Add Property”，出现弹出小框，会出现当前有Animation下的子级，点击下拉会显示子级的属性，像上下移动就选择Anchored Position就可以。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906174348718.png" alt="image-20250906174348718"></p><h3 id="5-添加关键帧"><a href="#5-添加关键帧" class="headerlink" title="5.添加关键帧"></a>5.添加关键帧</h3><p>为了实现无缝滚动，原理就是遮罩上一个图形往下移动，在视图中的图形往遮罩下面移动。也就只需对图形的Y轴进行操作。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906175000535.png" alt="image-20250906175000535"></p><h3 id="6-匀速动画设置"><a href="#6-匀速动画设置" class="headerlink" title="6.匀速动画设置"></a>6.匀速动画设置</h3><p>设置时间轴默认情况是有缓入缓出的效果，播放的时候就没有无缝滚动的效果，这时候就需要在Curves下设置匀速。<br>按 “shift”选中两个关键帧，右键的时候不要离开关键帧的点，然后选择“Both Tangents‘，再点击 ”Linear“，看到线条变成直线就表示匀速播放了。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906175434470.png" alt="image-20250906175434470"></p><h1 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h1><p>通过上面操作就完成了一个简单的无缝上下滚动的进度条动画效果，并且没有通过脚本控制。还有一个容易忘记的点是，在打开anim文件时，一定要点击挂在该动画的对象上，不然是无法预览动画。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何在Unity3D中实现无缝滚动动画？</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Unity3D" scheme="https://www.zerofc.cn/tags/Unity3D/"/>
    
  </entry>
  
  <entry>
    <title>如何在Unity3D中实现圆角效果？</title>
    <link href="https://www.zerofc.cn/2025/08/28/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/"/>
    <id>https://www.zerofc.cn/2025/08/28/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/</id>
    <published>2025-08-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:32.103Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>有时候在Unity3D中，要实现一些组件的圆角效果，比如进度条，不像普通按钮是静态不动的，可以直接将图片做成圆角。但是进度条是有那种色块流动的效果，如果不做处理，里面的色块会溢出四个角落。</p><h1 id="二、实现前提"><a href="#二、实现前提" class="headerlink" title="二、实现前提"></a>二、实现前提</h1><p>1.须使用Image的UI元素。</p><p>2.父层Image元素须遮罩组件。</p><p>3.父层Image元素图片须有圆角png图。</p><h1 id="三、操作过程"><a href="#三、操作过程" class="headerlink" title="三、操作过程"></a>三、操作过程</h1><p>1.在场景中创建一个Image的UI元素，图片是黑色有圆角的png图片。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/1.jpg" alt="img"></p><p>2.在该Image中添加Mask组件（遮罩）。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/2.jpg" alt="img"></p><p>3.在该Image下添加一个新的Image元素，Source Image选择一个其他颜色图。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/3.jpg" alt="img"></p><p>4.对子级Image的Transform进行上下拖动，填充住父的遮罩就可以看到子级的元素也有圆角。</p><h1 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h1><p>以上的操作都是在Unity3D 2020.3中实现，除了用遮罩的方式实现圆角效果外，还可以用Shader，在效果上还没有锯齿，弧度更丝滑。后面有时间我再更新，以及如何在Unity3D中实现无缝循环的帧动画效果。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何在Unity3D中实现圆角效果？</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Unity3D" scheme="https://www.zerofc.cn/tags/Unity3D/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SpringBoot项目搭建</title>
    <link href="https://www.zerofc.cn/2025/07/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/07/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-07-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>上次在本地简单部署了一个SSM框架的项目，由于非常繁琐的配置，我这次就试一下现在市面上非常火的SpringBoot。该框架基于Spring框架，由于在很多配置上采用了默认方式，所以在java应用程序构建上非常快速敏捷。</p><p>并且它还内嵌了tomcat、Jetty等服务器，使得它能作为一个独立的Jar文件运行，在生产环境上只需要用Nginx用反向代理指向该程序进度。</p><h2 id="二、项目配置"><a href="#二、项目配置" class="headerlink" title="二、项目配置"></a>二、项目配置</h2><p>通过前文关于maven的介绍，这里就跳过了，只按运行流程运行和部署项目。</p><h4 id="1-导入项目"><a href="#1-导入项目" class="headerlink" title="1.导入项目"></a>1.导入项目</h4><p>通过Open导入项目后，IDEA会立刻下载依赖，这时候你也可以去修改pom.xml然后再在Maven中，点击刷新按钮重新下载。</p><p>还有一个要注意的是可以给项目指定JDK版本，点击File-&gt;Project Structure-&gt;Project Settings-&gt;Project，找到Project SDK，然后可以根据框架版本切换JDK版本。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105174408450.png" alt="image-20251105174408450"></p><h4 id="2-Artifacts设置"><a href="#2-Artifacts设置" class="headerlink" title="2.Artifacts设置"></a>2.Artifacts设置</h4><p>还是上面的Project Structure中，Artifacts中添加一个Web Application: Archive，主要用于项目打包输出。</p><h4 id="3-直接运行"><a href="#3-直接运行" class="headerlink" title="3.直接运行"></a>3.直接运行</h4><p>SpringBoot有内置的服务，所以一般打开项目后，在启动下拉里会自动有一个 “MainApplication”，如果没有出现，点击 “Edit Configurations”然后添加一个 “Spring Boot”,最后在Configuration进行设置即可。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105180037489.png" alt="image-20251105180037489"></p><h4 id="4-运行访问"><a href="#4-运行访问" class="headerlink" title="4.运行访问"></a>4.运行访问</h4><p>点击运行按钮 “run MainApplication”，就可以启动自身的web服务，然后浏览器通过启动面板里输出的地址进行访问了，URL在源码的controller里对应的控制器名&#x2F;方法名。</p><h2 id="三、打包部署"><a href="#三、打包部署" class="headerlink" title="三、打包部署"></a>三、打包部署</h2><h4 id="1-打包操作"><a href="#1-打包操作" class="headerlink" title="1.打包操作"></a>1.打包操作</h4><p>打开IDEA的Maven，先点击 “Lifecycle” 的 “clean”，然后点击 “package”。等待执行完毕后，项目根目录就会新增 “target”，最外层也会新增一个jar包，这个就是项目的包了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105190531081.png" alt="image-20251105190531081"></p><h4 id="2-运行部署"><a href="#2-运行部署" class="headerlink" title="2.运行部署"></a>2.运行部署</h4><p>SpringBoot 默认打包方式jar，如果需要在tomcat容器中，可以在pom.xml的packaging修改为war，以及添加对应的依赖包。而对于生产环境部署，执行指令和Nginx可以参考下面配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar jesper_seckill.jar</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span></span><br><span class="line">    listen <span class="number">80</span>;</span><br><span class="line">    server_name yourdomain.com;</span><br><span class="line"></span><br><span class="line">    location / <span class="punctuation">&#123;</span></span><br><span class="line">        proxy_pass http<span class="punctuation">:</span><span class="comment">//127.0.0.1:8080;  </span></span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="四、Tomcat虚拟主机多项目部署"><a href="#四、Tomcat虚拟主机多项目部署" class="headerlink" title="四、Tomcat虚拟主机多项目部署"></a>四、Tomcat虚拟主机多项目部署</h2><p>这里以SSM项目为例，那么先打开Tomcat下conf的server.xml，然后添加一个Host。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Host</span> <span class="attr">name</span>=<span class="string">&quot;www.ssmts.com&quot;</span> <span class="attr">appBase</span>=<span class="string">&quot;webapps&quot;</span> <span class="attr">unpackWARs</span>=<span class="string">&quot;true&quot;</span> <span class="attr">autoDeploy</span>=<span class="string">&quot;true&quot;</span> <span class="attr">xmlValidation</span>=<span class="string">&quot;false&quot;</span> <span class="attr">xmlNamespaceAware</span>=<span class="string">&quot;false&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Context</span> <span class="attr">docBase</span>=<span class="string">&quot;SSM&quot;</span> <span class="attr">path</span>=<span class="string">&quot;&quot;</span> <span class="attr">reloadable</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Host</span>&gt;</span></span><br></pre></td></tr></table></figure><p>前提有三个，在host中创建了上面name的域名，docBase中的项目名，在webapps中一定有这个项目，第三个是要注意端口号，也就是Connector里指定的port。</p><p>最后在浏览器中直接输入”http:&#x2F;&#x2F;域名:端口&#x2F;“, 就能直接访问项目了，如果是80端口可以不用指定，还一个是如果把打包的war直接放入webapps中，启动tomcat会直接解压到当前目录中。</p><h2 id="五、其他问题"><a href="#五、其他问题" class="headerlink" title="五、其他问题"></a>五、其他问题</h2><h4 id="1-Tomcat输出中文乱码"><a href="#1-Tomcat输出中文乱码" class="headerlink" title="1.Tomcat输出中文乱码"></a>1.Tomcat输出中文乱码</h4><p>找到Tomcat的conf下logging.properties，将java.util.logging.ConsoleHandler.encoding修改为GBK</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java.util.logging.ConsoleHandler.encoding = GBK</span><br></pre></td></tr></table></figure><h4 id="2-IDEA编辑窗口关闭快捷键"><a href="#2-IDEA编辑窗口关闭快捷键" class="headerlink" title="2.IDEA编辑窗口关闭快捷键"></a>2.IDEA编辑窗口关闭快捷键</h4><p>打开settings-&gt;Keymap，直接搜索 “close”，选择Editor Tabs下的Close，然后右键清理快捷键，新增快捷键，我习惯 “Ctrl+W”，只需要按这两个键就可以，最后OK完成。</p><h4 id="3-Tomcat项目访问"><a href="#3-Tomcat项目访问" class="headerlink" title="3.Tomcat项目访问"></a>3.Tomcat项目访问</h4><p>将编译后的项目复制到webapps中，启动tomcat，通过localhost:端口&#x2F;项目名，可以直接访问对应项目。</p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>如果要让SpringBoot打包后的war在tomcat中使用，不光要移除自带的tomcat和添加依赖外，启动文件也需要做部分修改，不然放入tomcat容器内也无法启动。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SpringBoot项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>AI应用开发（二）：Blender建模助手</title>
    <link href="https://www.zerofc.cn/2025/06/28/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/"/>
    <id>https://www.zerofc.cn/2025/06/28/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/</id>
    <published>2025-06-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>上次简单介绍了一下 MCP，以及如何在 TRAR 中通过 MCP 实现一些 AI 功能，同时我也说过，以后的那些大型工具软件一定会加上自然语言驱动创作模块。</p><p>比如各种 Adobe、Autodask 等等系列软件，但是今天我要讲的一个开源轻量的 3D 建模软件 ——Blender，关于实现一个智能体，完成通过自然语言来控制 Blender 建模、贴图等基本操作。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-89e738656142a7a129cfda063481b855e94.png" alt="img"></p><h1 id="二、环境清单"><a href="#二、环境清单" class="headerlink" title="二、环境清单"></a>二、环境清单</h1><p>TRAE 0.5.7</p><p>Blender 4.0</p><p>Blender MCP</p><p>Python 3.10</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-377f6418d745741b13035134206b42d942f.png" alt="img"></p><h1 id="三、BlenderMCP-介绍"><a href="#三、BlenderMCP-介绍" class="headerlink" title="三、BlenderMCP 介绍"></a>三、BlenderMCP 介绍</h1><p>要想用自然对话的方式在 Blender 中建模，就不得不提到 BlenderMCP 了，全称为 Blender Model Context Protocol，是一个旨在将 Blender 与 AI 模型无缝集成的工具。</p><p>它通过模型上下文协议（MCP）实现 Blender 与 AI 之间的双向通信，让用户能够利用自然语言指令来控制 Blender，从而极大地简化了 3D 建模和场景操作的流程，它主要由两个部分组成：Blender 插件和 MCP 服务器。</p><ol><li><strong>Blender 插件（addon.py）</strong>：该插件运行在 Blender 内部，负责创建 socket 服务器。它接收来自外部的命令，并在 Blender 中执行这些命令。例如，创建对象、修改材质等。插件还会将 Blender 的场景信息或操作结果反馈给外部服务器，实现双向通信。</li><li><strong>MCP 服务器（server.py）</strong>：这是一个独立的 Python 服务器，实现了模型上下文协议（MCP）。它与 Blender 插件基于 TCP sockets 进行通信，接收用户通过 Claude AI 发出的指令，并将这些指令转换为 Blender 能够理解的命令。服务器还会处理 Blender 返回的结果，将其反馈给 Claude AI，形成一个完整的指令处理流程。</li></ol><p><strong>提示：</strong>下载整个项目后，只需要复制根目录下 addon.py (Blender 插件)，用于在 Blender 中插件安装，另一个 Server.py 也可以下载单独部署（最好直接用 TRAE 中 MCP 插件市场的）。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-825b3e3678efce63f6def456d6fb0a9494f.png" alt="img"></p><h1 id="四、工具的交互流程"><a href="#四、工具的交互流程" class="headerlink" title="四、工具的交互流程"></a>四、工具的交互流程</h1><h3 id="1-启动-Blender-TCP-服务"><a href="#1-启动-Blender-TCP-服务" class="headerlink" title="1. 启动 Blender TCP 服务"></a><strong>1. 启动 Blender TCP 服务</strong></h3><p>用户在 Blender 中启用 MCP 插件，插件自动创建基于 TCP Socket 的本地服务器（默认端口 5000），用于接收外部指令。</p><h3 id="2-智能体连接-TCP-服务"><a href="#2-智能体连接-TCP-服务" class="headerlink" title="2. 智能体连接 TCP 服务"></a><strong>2. 智能体连接 TCP 服务</strong></h3><p>第三方智能体（如 Claude、自定义 Agent）通过 TCP&#x2F;IP 协议 连接到 Blender 的 MCP 服务器，建立双向通信通道。</p><h3 id="3-自然语言指令输入与解析"><a href="#3-自然语言指令输入与解析" class="headerlink" title="3. 自然语言指令输入与解析"></a><strong>3. 自然语言指令输入与解析</strong></h3><p>用户向智能体输入自然语言指令（如 “创建一把椅子模型并导入 Blender”），智能体通过 NLP 模型解析意图，判断是否需要调用 Hyper3D Rodin。</p><h3 id="4-MCP-协议转换与指令分发"><a href="#4-MCP-协议转换与指令分发" class="headerlink" title="4. MCP 协议转换与指令分发"></a><strong>4. MCP 协议转换与指令分发</strong></h3><p>智能体将自然语言转换为 JSON 的 MCP 指令，包含操作类型（如 generate_model）、参数（如 text_prompt: “一把椅子”）和目标工具。</p><h3 id="5-调用-Hyper3D-Rodin-API"><a href="#5-调用-Hyper3D-Rodin-API" class="headerlink" title="5. 调用 Hyper3D Rodin API"></a><strong>5. 调用 Hyper3D Rodin API</strong></h3><p>Blender MCP 接收到指令后，通过 HTTP&#x2F;RPC 接口 调用 Hyper3D Rodin 的模型生成服务，传递文本描述或参考图像参数。</p><h3 id="6-模型生成与数据返回"><a href="#6-模型生成与数据返回" class="headerlink" title="6. 模型生成与数据返回"></a><strong>6. 模型生成与数据返回</strong></h3><p>Rodin 的 AI 模型生成带 PBR 材质的 3D 资产，将结果以 .glb 或 .obj 格式 返回至 Blender MCP 的临时存储路径。</p><h3 id="7-模型导入-Blender-场景"><a href="#7-模型导入-Blender-场景" class="headerlink" title="7. 模型导入 Blender 场景"></a><strong>7. 模型导入 Blender 场景</strong></h3><p>Blender MCP 自动执行 bpy.ops.import_scene 等 Python API 命令，将生成的模型导入当前场景，并调整材质、灯光等参数。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-1f829e4f997c16d38d01b60efad0d9fa291.jpg" alt="img"></p><h1 id="五、开始操作"><a href="#五、开始操作" class="headerlink" title="五、开始操作"></a>五、开始操作</h1><h3 id="1-安装-Blender-插件"><a href="#1-安装-Blender-插件" class="headerlink" title="1. 安装 Blender 插件"></a><strong>1. 安装 Blender 插件</strong></h3><p>打开 Blender，点击插件安装，找到前面 BlenderMCP 里复制出来的 addon.py，安装后并启用。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-d6a3861dd8550160567c5bcf5086c6d72ba.png" alt="img"></p><h3 id="2-添加-BlenderMCP-服务"><a href="#2-添加-BlenderMCP-服务" class="headerlink" title="2. 添加 BlenderMCP 服务"></a><strong>2. 添加 BlenderMCP 服务</strong></h3><p>打开 TRAE 编辑器，在 MCP 市场搜索后直接添加，也可以用前面下载的项目里 server.py 本地添加。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-e877c6d356db8d2be4746b374b040a95404.png" alt="img"></p><h3 id="3-TCP-服务启动"><a href="#3-TCP-服务启动" class="headerlink" title="3. TCP 服务启动"></a><strong>3. TCP 服务启动</strong></h3><p>打开 Blender，找到或按快捷键 “N” 找到 BlenderMCP 插件面板，端口 9876 可以自定，勾选 “Use Hyper3D Rodin 3D model generation”，Rodin 选 “hyper3d.ai”，API Key 使用免费测试的，点击 “Set Free Trial API Key”。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-273b61c72cbc931116fe1eeaa8cec147a7a.png" alt="img"></p><h3 id="4-创建-“Blender-助手”-智能体"><a href="#4-创建-“Blender-助手”-智能体" class="headerlink" title="4. 创建 “Blender 助手” 智能体"></a><strong>4. 创建 “Blender 助手” 智能体</strong></h3><p>打开 TRAE 的智能体，自定义名字，工具勾选 “blender”，提示词可以参考我下面的。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">## 角色：</span><br><span class="line">你是一名Blender智能建模助手，擅长将自然语言指令转化为精准的Blender操作（建模/材质/动画）</span><br><span class="line"></span><br><span class="line">## 交互协议：</span><br><span class="line">- 用户输入自然语言描述（如：“创建一个带纹理的科幻飞船”）</span><br><span class="line">- 系统自动解析为Blender操作队列并执行</span><br><span class="line">- 支持多轮迭代修改（例：“将船翼延长50%并添加推进器”）</span><br><span class="line"></span><br><span class="line">## 技能</span><br><span class="line">### 技能 1：建模能力</span><br><span class="line">- 基础几何体：创建立方体/球体/柱体及参数化变形。</span><br><span class="line">- 高级建模：布尔运算、表面细分、挤压、倒角、曲线建模</span><br><span class="line">- 场景构建：排列物体、生成地形、建筑结构生成</span><br><span class="line"></span><br><span class="line">### 技能 2：材质与渲染</span><br><span class="line">- 自动分配基础材质（金属/玻璃/塑料）</span><br><span class="line">- 支持UV映射指令（“为飞船添加锈迹贴图”）</span><br><span class="line">- 基础光照设置（HDR环境光/点光源定位）</span><br><span class="line"></span><br><span class="line">### 技能 3：动画基础</span><br><span class="line">- 关键帧动画（“让立方体在5秒内旋转360度”）</span><br><span class="line">- 路径动画（“沿曲线轨迹移动相机”）</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## 注意事项：</span><br><span class="line">### 指令精度要求</span><br><span class="line">- 明确参数：“创建半径2m的球体”</span><br><span class="line">- 模糊描述：“做个大一点的球”</span><br><span class="line"></span><br><span class="line">### 能力边界声明：</span><br><span class="line">- 不支持：角色骨骼绑定/流体模拟/复杂粒子系统</span><br><span class="line">- 有限支持：有机生物模型（需分步指令）</span><br><span class="line"></span><br><span class="line">### 容错机制：</span><br><span class="line">- 当指令歧义时主动询问（“请指定圆柱体的细分段数”）</span><br><span class="line">- 复杂操作分步确认（“即将执行20个操作，是否继续？”）</span><br></pre></td></tr></table></figure><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-186fd399fb2382a163b916d751f293d3965.png" alt="img"></p><h3 id="5-连接-TCP-服务"><a href="#5-连接-TCP-服务" class="headerlink" title="5. 连接 TCP 服务"></a><strong>5. 连接 TCP 服务</strong></h3><p>在 Blender 开启服务后，我们可以用 windows 指令监听端口。</p><p>还有查看 TRAE 中 MCP 的 blender 是否可使用，如果是绿勾，表示已经连接上了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">// 查看端口</span><br><span class="line">netstat -ano | findstr &quot;9876&quot;</span><br><span class="line"></span><br><span class="line">// 查看进程</span><br><span class="line">tasklist | findstr &quot;3780&quot;</span><br></pre></td></tr></table></figure><h3 id="6-开始建模"><a href="#6-开始建模" class="headerlink" title="6. 开始建模"></a><strong>6. 开始建模</strong></h3><p>打开 TRAE，开始用 前面创建 “Blender 小助手” 智能体对话，直接输入 “创建一把椅子”，随后就会在 Blender 创建了椅子的 3D 模型。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-459c31942a10170bf4c89838cc11b84d3c9.png" alt="img"></p><h1 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h1><p>更多的如材质与颜色添加、动画调整、游戏引擎导入、TCP 交互的 Json 串，以后我再更新。</p><p>其实目前看，不管是 AI 通过文本或图片生成的 3D 模型都存在布线不规整的问题，就像上面这把椅子，顶点和面都上万，而且还是三角面，如果用来做动画或导入游戏，二次修改和性能都是很大问题。</p><p>既然有痛点，自然也就有方案，市场上不光有很多降低面数、三角面转四角面教程，还有很多重拓扑的插件，都能提升现阶段让 AI 建模的可行性。</p><p>但是，随着 AI 的意图理解和生成精度不断提高，BlenderMCP 的未来发展前景还是非常广阔，一定能在游戏创作、建筑设计、工业设计上实现更高级的建模操作。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">AI应用开发（二）：Blender建模助手</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="AI应用开发" scheme="https://www.zerofc.cn/tags/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SSM项目搭建</title>
    <link href="https://www.zerofc.cn/2025/06/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/06/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-06-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>SSM是一个Java EE框架，也是一个Java企业级开发解决方案，它集成了Spring、Spring MVC和MyBatis三个核心框架。</p><p>下面我主要在IDEA中，怎么配置Maven，Tomcat，修改设置运行一套现有的SSM源代码。</p><h2 id="二、Maven配置"><a href="#二、Maven配置" class="headerlink" title="二、Maven配置"></a>二、Maven配置</h2><p>这里的配置，是将前面单独安装和设置好了的Maven放入到IDEA中，让其在编辑器里构建项目时不会走默认的设置。</p><p>就比如之前将Jar包更换了默认下载位置，如果不在IDEA中指定还会下载到系统盘中，甚至还会又下载一个新的Maven。</p><h4 id="1-导入项目"><a href="#1-导入项目" class="headerlink" title="1.导入项目"></a>1.导入项目</h4><p>因为我是已经把源码下载到了本地，所以直接点击Open，然后找到项目地址，点击OK就导入进来了。</p><h4 id="2-IDEA设置"><a href="#2-IDEA设置" class="headerlink" title="2.IDEA设置"></a>2.IDEA设置</h4><p>找到File-&gt;Settins-&gt;Build,Execution,Deployment-&gt;Build Tools-&gt;Maven，打开后，主要对Maven Home Directory、User Settins file、Local repository这三个进行修改。</p><p>第一个指定maven安装位置的bin目录，第二个就是自己maven的配置文件，第三个是指定jar的下载位置。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104111346970.png" alt="image-20251104111346970"></p><h4 id="3-验证设置结果"><a href="#3-验证设置结果" class="headerlink" title="3.验证设置结果"></a>3.验证设置结果</h4><p>设置完毕后，找到IDEA的Terminal，输入mvn -version，查看版本号是否和之前安装的一致就可以了。</p><h4 id="4-下载依赖"><a href="#4-下载依赖" class="headerlink" title="4.下载依赖"></a>4.下载依赖</h4><p>找到IDEA的最右侧，有一个折叠的Database、Maven、Ant栏目，点击Maven就会展开，再点击一个循环的图标，就会对项目的pom.xml文件里需要的依赖jar全部下载到本地仓库。</p><p>然后可以看项目的External Libraries和Maven栏目下的Dependencies，是否有加载到依赖，也可以进入本地依赖库查看是否多了那些jar包。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104112808569.png" alt="image-20251104112808569"></p><h2 id="三、Tomcat配置"><a href="#三、Tomcat配置" class="headerlink" title="三、Tomcat配置"></a>三、Tomcat配置</h2><h4 id="1-下载地址"><a href="#1-下载地址" class="headerlink" title="1.下载地址"></a>1.下载地址</h4><p>浏览器t直接搜索Tomcat官方网站，但需要注意一下版本，也就是jdk的版本和tomcat的版本是有对应关系的。</p><h4 id="2-jdk和Tomcat版本关系"><a href="#2-jdk和Tomcat版本关系" class="headerlink" title="2.jdk和Tomcat版本关系"></a>2.jdk和Tomcat版本关系</h4><table><thead><tr><th>Tomcat 版本</th><th>支持的 JDK 版本</th></tr></thead><tbody><tr><td>Tomcat 10</td><td>JDK 11 及以上</td></tr><tr><td>Tomcat 9</td><td>JDK 8 及以上</td></tr><tr><td>Tomcat 8.5</td><td>JDK 7 及以上</td></tr><tr><td>Tomcat 8</td><td>JDK 7 及以上</td></tr><tr><td>Tomcat 7</td><td>JDK 6 及以上</td></tr><tr><td>Tomcat 6</td><td>JDK 5 及以上</td></tr></tbody></table><h4 id="3-Tomcat安装"><a href="#3-Tomcat安装" class="headerlink" title="3.Tomcat安装"></a>3.Tomcat安装</h4><p>下载后点击安装，然后找到安装后的文件夹，复制其绝对路径，打开电脑的环境变量，添加一个变量名CATALINA_HOME，值为tomcat的路径。</p><p>然后找到path，新增一个，将 %CATALINA_HOME%\bin 复制在里面。</p><h4 id="4-启动测试"><a href="#4-启动测试" class="headerlink" title="4.启动测试"></a>4.启动测试</h4><p>找到tomcat的bin目录下的startup.bat，点击启动，然后再在浏览器输入localhost:8080访问，出现tomcat的LOGO表示成功安装。</p><h4 id="5-IDEA配置Tomcat"><a href="#5-IDEA配置Tomcat" class="headerlink" title="5.IDEA配置Tomcat"></a>5.IDEA配置Tomcat</h4><p>找到IDEA上面有一个锤子图标的右边，有个下拉，点击Edit Configurations，进入后点击+号，添加一个Tomcat Server。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104114839858.png" alt="image-20251104114839858"></p><p>点击Tomcat 7详情进行编辑，找到Application server，选择Tomcat的安装位置，下面的默认浏览器启动，端口号设置，地址等等就看自己了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104115137565.png" alt="image-20251104115137565"></p><h2 id="四、项目运行"><a href="#四、项目运行" class="headerlink" title="四、项目运行"></a>四、项目运行</h2><p>依赖包已经下载好了，tomcat也配置了，接下来就是运行项目了。</p><h4 id="1-修改配置"><a href="#1-修改配置" class="headerlink" title="1.修改配置"></a>1.修改配置</h4><p>数据库导入还原就跳过了，在项目中主要是修改数据库的连接配置，找到src-&gt;main下的resources中jdbc.properties，对参数进行修改即可。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104115704418.png" alt="image-20251104115704418"></p><h4 id="2-项目编译"><a href="#2-项目编译" class="headerlink" title="2.项目编译"></a>2.项目编译</h4><p>在IDEA中，找到那个锤子图标，然后点击Build Project，也可以在命令窗口输入，mvn clean，然后mvn compile，这样就会把源码编译成class了。</p><p>编译成功后在项目根目录会出现一个target，里面就是编译后的class文件了。</p><h4 id="3-项目运行"><a href="#3-项目运行" class="headerlink" title="3.项目运行"></a>3.项目运行</h4><p>项目运行，点击锤子图标的右边的一排图标，其中有一个三角形播放状的图标，点击后就可以在IDEA中通过Tomcat运行了。</p><h4 id="4-访问项目地址"><a href="#4-访问项目地址" class="headerlink" title="4.访问项目地址"></a>4.访问项目地址</h4><p>有些项目入口文件没有页面指向，这时我们可以找到SpringMVC的配置文件，在resources的spring-web.xml中，可以看到相关开放的访问地址。</p><p>第二个可以在controller文件中，找到@RequestMapping(“&#x2F;backend”)，控制器外层的是控制器名，里面的方法是方法名，然后在URL里输入localhost:8080&#x2F;控制器名&#x2F;方法名，就可以进入指定地址了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104131410388.png" alt="image-20251104131410388"></p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>除了SSM框架外，还有更早期的SSH（Spring+Struts2+Hibernate），以及现在非常流行的SpringBoot，后面我也会再更新~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SSM项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Blender快捷键合集（一）</title>
    <link href="https://www.zerofc.cn/2025/06/20/Blender%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%90%88%E9%9B%86%EF%BC%88%E4%B8%80%EF%BC%89/"/>
    <id>https://www.zerofc.cn/2025/06/20/Blender%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%90%88%E9%9B%86%EF%BC%88%E4%B8%80%EF%BC%89/</id>
    <published>2025-06-20T02:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h4 id="这里只是我个人平时练习总结的，佛系更新"><a href="#这里只是我个人平时练习总结的，佛系更新" class="headerlink" title="这里只是我个人平时练习总结的，佛系更新~"></a>这里只是我个人平时练习总结的，佛系更新~</h4><h2 id="关于合并"><a href="#关于合并" class="headerlink" title="关于合并"></a>关于合并</h2><p>如果shift选中两个模型，最后点击的是激活状态，那就是前一个合并到后一个，合并后的物体原点在最后一个物体上。</p><h2 id="父级设置和骨骼绑定"><a href="#父级设置和骨骼绑定" class="headerlink" title="父级设置和骨骼绑定"></a>父级设置和骨骼绑定</h2><p>如果shift选中两个模型，最后点击的是激活状态，那就是最后一个是父级，前一个会在最后一个模型下面作为子级，在大纲视图里可以通过shift拖动查看。</p><h2 id="快捷键列表"><a href="#快捷键列表" class="headerlink" title="快捷键列表"></a>快捷键列表</h2><table><thead><tr><th>快捷键</th><th align="left">说明</th></tr></thead><tbody><tr><td>ctrl+p</td><td align="left">给模型设置父级，绑定自动权重的骨骼</td></tr><tr><td>alt+p</td><td align="left">给骨骼拆除链接，可以随意拖动</td></tr><tr><td>shift+d</td><td align="left">快捷复制模型</td></tr><tr><td>~</td><td align="left">视角选择</td></tr><tr><td>ctrl+7</td><td align="left">输入对应数字切换对应视角</td></tr><tr><td>ctrl+j</td><td align="left">选中多个模型合并成一个</td></tr><tr><td>E</td><td align="left">选中一个骨骼后，在此上挤出一个子级骨骼</td></tr></tbody></table><h2 id="常用插件"><a href="#常用插件" class="headerlink" title="常用插件"></a>常用插件</h2><table><thead><tr><th>DragonFF</th><th>侠盗猎车.dff模型导入导出插件</th></tr></thead><tbody><tr><td>VRM_Addon_for_Blender</td><td>VRM格式模型导入导出插件</td></tr><tr><td>cats-blender-plugin</td><td>骨骼快捷绑定插件</td></tr><tr><td>speedRetopo</td><td>模型重拓扑插件</td></tr></tbody></table><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Blender快捷键合集。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SSH项目搭建</title>
    <link href="https://www.zerofc.cn/2025/05/29/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/05/29/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-05-29T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>在 Java 企业级开发中，SSH 通常指的是 <strong>Struts2 + Spring + Hibernate</strong> 的组合。这个组合是一套常用的框架，用于构建 Web 应用程序。</p><p>其中Struts2用于处理 Web 请求和响应，实现 MVC（Model-View-Controller）模式；Spring用于实现依赖注入（Dependency Injection）和面向切面编程（Aspect-Oriented Programming）；Hibernate用于实现对象关系映射（Object-Relational Mapping, ORM），简化数据库操作。</p><p>早期这三个框架整合需要单独下载jar包的，现在使用Maven的话，只需要在pom中配置好依赖版本，编译的时候就可以自动构建了，下面就以一个简单的maven版SSH项目演示运行一下。</p><h2 id="二、项目配置"><a href="#二、项目配置" class="headerlink" title="二、项目配置"></a>二、项目配置</h2><p>导入这个项目后发现使用了jetty-maven-plugin，pom中也已经添加了struts、spring、hibernate的依赖，点击刷新依赖按钮就等待下载。</p><h4 id="1-配置-Struts2"><a href="#1-配置-Struts2" class="headerlink" title="1.配置 Struts2"></a>1.配置 Struts2</h4><p>在src的项目包下，找到webapp&#x2F;WEB-INF下面，没有就新建web.xml，配置 Struts2 过滤器；在resources中创建struts.xml，配置 Struts2 的动作映射和其他相关配置，页面怎么跳转就看那里了。</p><h4 id="2-配置-Spring"><a href="#2-配置-Spring" class="headerlink" title="2.配置 Spring"></a>2.配置 Spring</h4><p>在 src&#x2F;main&#x2F;resources 目录下创建 Spring 的配置文件，如 applicationContext.xml，配置 Spring 的 bean。</p><p>在 web.xml 中配置 Spring 的监听器来初始化 Spring 容器。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251106203608987.png" alt="image-20251106203608987"></p><h4 id="3-配置-Hibernate"><a href="#3-配置-Hibernate" class="headerlink" title="3.配置 Hibernate"></a>3.配置 Hibernate</h4><p>在 src&#x2F;main&#x2F;resources 目录下创建 Hibernate 的配置文件，如 hibernate.cfg.xml 或使用 Java 注解，配置数据库连接信息。</p><h2 id="三、项目构建"><a href="#三、项目构建" class="headerlink" title="三、项目构建"></a>三、项目构建</h2><p>在Java的SSH（Struts2 + Spring + Hibernate）项目中，通常会按照MVC（Model-View-Controller）架构和分层设计原则来组织代码，这有助于项目的维护和扩展。</p><h4 id="1-创建Action目录"><a href="#1-创建Action目录" class="headerlink" title="1.创建Action目录"></a>1.创建Action目录</h4><p>Action是Struts2框架中的组件，它作为MVC架构中的控制器（Controller）。Action负责接收用户请求，处理用户输入，调用相应的服务逻辑，并决定返回哪个视图（页面）给用户。</p><p>具体功能：通常会处理表单提交、页面导航等用户交互操作，是前端请求和后端处理之间的桥梁。</p><h4 id="2-创建Bean目录"><a href="#2-创建Bean目录" class="headerlink" title="2.创建Bean目录"></a>2.创建Bean目录</h4><p>Bean一般指的是Java中的实体类（也称为POJO，Plain Old Java Object），在SSH项目中，它们通常用于表示数据库中的表记录或者业务中的数据对象。</p><p>具体功能：Bean负责数据的封装，提供getter和setter方法来访问和修改数据属性。它们可以是模型（Model）的一部分，也可以是表单数据的载体。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251107095157060.png" alt="image-20251107095157060"></p><h4 id="3-创建Core目录"><a href="#3-创建Core目录" class="headerlink" title="3.创建Core目录"></a>3.创建Core目录</h4><p>Core层通常指的是项目的核心模块，包含了核心业务逻辑和基础的功能实现。</p><p>具体功能：这个层可能包含一些通用的工具类、配置类等，是项目的核心逻辑所在，确保项目的稳定性和可维护性。</p><h4 id="4-创建DAO目录"><a href="#4-创建DAO目录" class="headerlink" title="4.创建DAO目录"></a>4.创建DAO目录</h4><p>DAO（Data Access Object），DAO层是数据访问层，负责与数据库进行交互，封装了底层的数据访问逻辑。</p><p>具体功能：DAO层通常实现对数据库的CRUD（创建、读取、更新、删除）操作。通过使用Hibernate等ORM（对象关系映射）工具，可以简化数据访问的代码，提高开发效率。</p><h4 id="5-创建Service目录"><a href="#5-创建Service目录" class="headerlink" title="5.创建Service目录"></a>5.创建Service目录</h4><p>Service层是业务逻辑层，负责实现具体的业务逻辑处理。</p><p>具体功能：Service层会调用DAO层来获取数据，然后根据业务需求对数据进行处理和操作，最后可能还需要将处理后的数据返回给Action层。Service层的一个重要作用是封装业务逻辑，并提供给其他层调用。</p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>通过这种分层的设计，SSH项目可以更好地组织代码，使得每一层的职责更加明确，便于开发和维护。每一层都相对独立，降低了模块间的耦合度，提高了项目的可扩展性和灵活性。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SSH项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：项目构建</title>
    <link href="https://www.zerofc.cn/2025/05/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/05/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA/</id>
    <published>2025-05-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>上次简单记录了一下Java的单个文件的练习例子，从Hello World的打印到变量声明、数据类型、流程控制等简单的示例。</p><p>但是项目往往都是由多个文件组合强关联的，所以基于构建器来创建项目就很有必要了，下面我还是新手视角，用Maven创建Java项目做一个详细的入门总结。</p><h2 id="二、Maven安装"><a href="#二、Maven安装" class="headerlink" title="二、Maven安装"></a>二、Maven安装</h2><h4 id="1-下载"><a href="#1-下载" class="headerlink" title="1.下载"></a>1.下载</h4><p><a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a></p><h4 id="2-maven版本指南"><a href="#2-maven版本指南" class="headerlink" title="2.maven版本指南"></a>2.maven版本指南</h4><p>因为Java版本和maven版本有关系，比如maven4.x以上的版本必须java 17及以上的，所以我罗列一下这些常用的版本对应关系。</p><table><thead><tr><th>maven版本</th><th>Java版本</th></tr></thead><tbody><tr><td>Maven 3.8.6</td><td>Java 8以上</td></tr><tr><td>Maven 3.5.4</td><td>Java 7以上</td></tr><tr><td>Maven 3.0.5</td><td>Java 1.6或以上</td></tr><tr><td>Maven 4.x</td><td>Java 17或以上</td></tr></tbody></table><h4 id="3-安装"><a href="#3-安装" class="headerlink" title="3.安装"></a>3.安装</h4><p>解压到电脑下的指定位置，然后找到Maven根目录下的conf文件夹下settings.xml，打开编辑，找到mirrors，添加国内的淘宝镜像，这样可以更快速构建项目。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">mirrors</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">mirror</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">id</span>&gt;</span>aliyun<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">name</span>&gt;</span>Aliyun Maven<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">       <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://maven.aliyun.com/repository/public<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">mirrorOf</span>&gt;</span>central<span class="tag">&lt;/<span class="name">mirrorOf</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">mirror</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">mirrors</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="4-添加环境变量"><a href="#4-添加环境变量" class="headerlink" title="4.添加环境变量"></a>4.添加环境变量</h4><p>还是在Maven根目录找到bin，然后复制那个文件夹的绝对路径，在电脑的环境变量中的path添加maven的bin路径，比如我的 “D:\1setsoft\1dev\apache-maven-3.8.9\bin”。</p><h4 id="5-验证"><a href="#5-验证" class="headerlink" title="5.验证"></a>5.验证</h4><p>cmd输入mvn -v查看版本号，表示成功。</p><h2 id="三、项目创建"><a href="#三、项目创建" class="headerlink" title="三、项目创建"></a>三、项目创建</h2><h4 id="1-maven构建项目"><a href="#1-maven构建项目" class="headerlink" title="1.maven构建项目"></a>1.maven构建项目</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn archetype:generate -DgroupId=com.example -DartifactId=02_mysql_example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">mvn archetype:generate: 这是Maven的命令，用于生成新的项目。</span><br><span class="line"></span><br><span class="line">archetype:generate是Maven的原型插件的一个目标，表示要生成一个项目。</span><br><span class="line"></span><br><span class="line">-DgroupId=com.example: 这是指定项目的groupId。</span><br><span class="line"></span><br><span class="line">groupId通常是项目的组织或团队名称，使用反向域名的格式。在这个例子中，com.example是项目的groupId。 </span><br><span class="line"></span><br><span class="line">-DartifactId=02_mysql_example: 这是指定项目的artifactId。</span><br><span class="line"></span><br><span class="line">artifactId是项目的唯一标识符，通常是项目的名称。在这个例子中，02_mysql_example是项目的artifactId。 </span><br><span class="line"></span><br><span class="line">-DarchetypeArtifactId=maven-archetype-quickstart: 这是指定要使用的原型的artifactId。</span><br><span class="line"></span><br><span class="line">Maven原型是一个模板项目，用于快速生成符合Maven规范的项目结构。在这个例子中，maven-archetype-quickstart是一个基本的Java项目原型。</span><br><span class="line"></span><br><span class="line">-DinteractiveMode=false: 这个参数用于指定Maven在生成项目时是否采用交互模式。false表示非交互模式，即Maven会直接使用命令行中提供的参数来生成项目，而不会提示用户输入。</span><br><span class="line"></span><br><span class="line">如果设置为true，Maven会提示用户输入所需的参数。在这个例子中，Maven将不会进行交互式提示，而是直接使用已经提供的参数来生成项目。</span><br></pre></td></tr></table></figure><h4 id="2-项目配置"><a href="#2-项目配置" class="headerlink" title="2.项目配置"></a>2.项目配置</h4><p>在项目编译前，对模板项目的pom.xml进行修改，指定项目运行的主类。打开项目的pom.xml，只需要找到文件的根节点，然后添加下面代码。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.codehaus.mojo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>exec-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.6.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">executions</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">execution</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">goals</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">goal</span>&gt;</span>java<span class="tag">&lt;/<span class="name">goal</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">goals</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">execution</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">executions</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">mainClass</span>&gt;</span>com.example.App<span class="tag">&lt;/<span class="name">mainClass</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>节点说明</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;groupid&gt;（插件级别）：插件的唯一标识符。</span><br><span class="line">&lt;artifactid&gt;（插件级别）：插件的基本名称。</span><br><span class="line">&lt;version&gt;（插件级别）：插件的版本号。</span><br><span class="line">&lt;executions&gt;：定义插件的执行配置。</span><br><span class="line">&lt;execution&gt;：定义单个插件执行的详细信息。</span><br><span class="line">&lt;goals&gt;：定义插件执行的目标列表。</span><br><span class="line">&lt;goal&gt;：定义单个插件执行的目标。</span><br><span class="line">&lt;configuration&gt;：定义插件的配置参数。</span><br><span class="line">&lt;mainclass&gt;：定义项目的主类。</span><br><span class="line">通过这些标签，您可以详细配置项目的构建过程，包括使用的插件及其行为。</span><br></pre></td></tr></table></figure><h4 id="3-编译运行"><a href="#3-编译运行" class="headerlink" title="3.编译运行"></a>3.编译运行</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn compile</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn exec:java</span><br></pre></td></tr></table></figure><h2 id="四、如何修改Maven本地仓库位置"><a href="#四、如何修改Maven本地仓库位置" class="headerlink" title="四、如何修改Maven本地仓库位置"></a>四、如何修改Maven本地仓库位置</h2><p>默认情况下，maven会自动将项目的依赖下载到系统盘的.m2下，如果C盘空间告急的情况，可以通过对maven的配置将本地仓库位置放到指定位置。</p><p>找到maven下conf的settins.xml，在settings标签下添加：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">localRepository</span>&gt;</span>D:\1setsoft\1dev\apache-maven-3.8.9\Repository<span class="tag">&lt;/<span class="name">localRepository</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其实在那个文件里有被注释掉的关于本地仓库的配置和说明，然后再次mvn compile编译时就会把依赖下载到新的位置了。</p><h2 id="五、MySQL增删改查案例"><a href="#五、MySQL增删改查案例" class="headerlink" title="五、MySQL增删改查案例"></a>五、MySQL增删改查案例</h2><h4 id="1-pom配置"><a href="#1-pom配置" class="headerlink" title="1.pom配置"></a>1.pom配置</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0&quot;</span> <span class="attr">xmlns:xsi</span>=<span class="string">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">modelVersion</span>&gt;</span>4.0.0<span class="tag">&lt;/<span class="name">modelVersion</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>02_mysql_example<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">packaging</span>&gt;</span>jar<span class="tag">&lt;/<span class="name">packaging</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">name</span>&gt;</span>02_mysql_example<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">url</span>&gt;</span>http://maven.apache.org<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.8.1<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">scope</span>&gt;</span>test<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!-- MySQL Connector/J --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>mysql<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>mysql-connector-java<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">version</span>&gt;</span>8.0.26<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- JUnit for testing --&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">version</span>&gt;</span>4.12<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">scope</span>&gt;</span>test<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">    </span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.codehaus.mojo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>exec-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.6.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">executions</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">execution</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">goals</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">goal</span>&gt;</span>java<span class="tag">&lt;/<span class="name">goal</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">goals</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">execution</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">executions</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">mainClass</span>&gt;</span>com.example.App<span class="tag">&lt;/<span class="name">mainClass</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.maven.plugins<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>maven-compiler-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.8.1<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">source</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">target</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">target</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">encoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">encoding</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">project</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-表格创建"><a href="#2-表格创建" class="headerlink" title="2.表格创建"></a>2.表格创建</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> DATABASE testdb;</span><br><span class="line"></span><br><span class="line">USE testdb;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> users (</span><br><span class="line">    id <span class="type">INT</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY,</span><br><span class="line">    name <span class="type">VARCHAR</span>(<span class="number">100</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">    email <span class="type">VARCHAR</span>(<span class="number">100</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h4 id="3-业务逻辑"><a href="#3-业务逻辑" class="headerlink" title="3.业务逻辑"></a>3.业务逻辑</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example;</span><br><span class="line"><span class="keyword">import</span> java.sql.Connection;</span><br><span class="line"><span class="keyword">import</span> java.sql.DriverManager;</span><br><span class="line"><span class="keyword">import</span> java.sql.PreparedStatement;</span><br><span class="line"><span class="keyword">import</span> java.sql.ResultSet;</span><br><span class="line"><span class="keyword">import</span> java.sql.SQLException;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 数据库连接</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">App</span> </span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 数据库连接信息</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_URL</span> <span class="operator">=</span> <span class="string">&quot;jdbc:mysql://localhost:3306/game&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_USER</span> <span class="operator">=</span> <span class="string">&quot;root&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_PASSWORD</span> <span class="operator">=</span> <span class="string">&quot;root&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">( String[] args )</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 连接数据库</span></span><br><span class="line">        <span class="keyword">try</span> (<span class="type">Connection</span> <span class="variable">connection</span> <span class="operator">=</span> DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) &#123;</span><br><span class="line">            <span class="comment">// 插入数据</span></span><br><span class="line">            insertUser(connection, <span class="string">&quot;Alice&quot;</span>, <span class="string">&quot;alice@example.com&quot;</span>);</span><br><span class="line">            insertUser(connection, <span class="string">&quot;Bob&quot;</span>, <span class="string">&quot;bob@example.com&quot;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据</span></span><br><span class="line">            List&lt;User&gt; users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;查询到的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 更新数据</span></span><br><span class="line">            updateUser(connection, <span class="number">1</span>, <span class="string">&quot;Alice Smith&quot;</span>, <span class="string">&quot;alice.smith@example.com&quot;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据（更新后）</span></span><br><span class="line">            users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;更新后的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 删除数据</span></span><br><span class="line">            deleteUser(connection, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据（删除后）</span></span><br><span class="line">            users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;删除后的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (SQLException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 插入用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">insertUser</span><span class="params">(Connection connection, String name, String email)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;INSERT INTO users (name, email) VALUES (?, ?)&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setString(<span class="number">1</span>, name);</span><br><span class="line">            pstmt.setString(<span class="number">2</span>, email);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查询用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> List&lt;User&gt; <span class="title function_">selectUsers</span><span class="params">(Connection connection)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        List&lt;User&gt; users = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;SELECT id, name, email FROM users&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql);</span><br><span class="line">             <span class="type">ResultSet</span> <span class="variable">rs</span> <span class="operator">=</span> pstmt.executeQuery()) &#123;</span><br><span class="line">            <span class="keyword">while</span> (rs.next()) &#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">id</span> <span class="operator">=</span> rs.getInt(<span class="string">&quot;id&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> rs.getString(<span class="string">&quot;name&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">email</span> <span class="operator">=</span> rs.getString(<span class="string">&quot;email&quot;</span>);</span><br><span class="line">                users.add(<span class="keyword">new</span> <span class="title class_">User</span>(id, name, email));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> users;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 更新用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">updateUser</span><span class="params">(Connection connection, <span class="type">int</span> id, String name, String email)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;UPDATE users SET name = ?, email = ? WHERE id = ?&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setString(<span class="number">1</span>, name);</span><br><span class="line">            pstmt.setString(<span class="number">2</span>, email);</span><br><span class="line">            pstmt.setInt(<span class="number">3</span>, id);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 删除用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">deleteUser</span><span class="params">(Connection connection, <span class="type">int</span> id)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;DELETE FROM users WHERE id = ?&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setInt(<span class="number">1</span>, id);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">User</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> id;</span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line">    <span class="keyword">private</span> String email;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">User</span><span class="params">(<span class="type">int</span> id, String name, String email)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.id = id;</span><br><span class="line">        <span class="built_in">this</span>.name = name;</span><br><span class="line">        <span class="built_in">this</span>.email = email;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;User&#123;&quot;</span> +</span><br><span class="line">                <span class="string">&quot;id=&quot;</span> + id +</span><br><span class="line">                <span class="string">&quot;, name=&#x27;&quot;</span> + name + <span class="string">&#x27;\&#x27;&#x27;</span> +</span><br><span class="line">                <span class="string">&quot;, email=&#x27;&quot;</span> + email + <span class="string">&#x27;\&#x27;&#x27;</span> +</span><br><span class="line">                <span class="string">&#x27;&#125;&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h2><p>以上就完成了一个简答的Java项目构建，但是对于真正的项目多数还是会使用市面上成熟的框架，所以下次就是基于框架进行简单实战了，待更新~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：项目构建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
</feed>
