-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
367 lines (193 loc) · 146 KB
/
Copy pathatom.xml
File metadata and controls
367 lines (193 loc) · 146 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Lathezero's Blog</title>
<subtitle>记录学习与生活</subtitle>
<link href="https://lathezero.github.io/atom.xml" rel="self"/>
<link href="https://lathezero.github.io/"/>
<updated>2025-04-03T01:24:58.726Z</updated>
<id>https://lathezero.github.io/</id>
<author>
<name>雷德基洛</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>UI-TARS 本地部署</title>
<link href="https://lathezero.github.io/2025/04/03/OpenModel/UI-TARS/"/>
<id>https://lathezero.github.io/2025/04/03/OpenModel/UI-TARS/</id>
<published>2025-04-03T01:10:34.000Z</published>
<updated>2025-04-03T01:24:58.726Z</updated>
<content type="html"><![CDATA[<h2 id><a href="#" class="headerlink" title></a></h2><h3 id="先决条件"><a href="#先决条件" class="headerlink" title="先决条件"></a>先决条件</h3><ul><li><a href="https://nodejs.org/en/download/">Node.js</a> >= 20</li><li><a href="https://pnpm.io/installation">pnpm</a> >= 9</li></ul><h4 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h4><p>这是一个<a href="https://pnpm.io/workspaces">单存储库</a>项目,包含以下技术:</p><ul><li>跨平台框架:<a href="https://www.electronjs.org/">Electron</a></li><li>界面:<ul><li><a href="https://react.dev/">React</a></li><li><a href="https://vitejs.dev/">Vite</a></li><li><a href="https://v2.chakra-ui.com/">Chakra UI V2</a></li></ul></li><li>状态管理和通信:<ul><li><a href="https://zustand.docs.pmnd.rs/">Zustand</a></li><li><a href="https://github.com/bytedance/UI-TARS-desktop/tree/main/packages/ui-tars/electron-ipc">@ui-tars/electron-ipc</a></li></ul></li><li>自动化框架/工具:<ul><li><a href="https://nutjs.dev/">nut.js</a></li></ul></li><li>测试框架<ul><li><a href="https://vitest.dev/">Vitest</a></li><li><a href="https://playwright.dev/">Playwright</a></li></ul></li></ul><h3 id="项目结构"><a href="#项目结构" class="headerlink" title="项目结构"></a>项目结构</h3><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── README.md</span><br><span class="line">├── apps</span><br><span class="line">│ ├── agent-tars</span><br><span class="line">│ │ ├── src</span><br><span class="line">│ │ │ ├── main</span><br><span class="line">│ │ │ ├── preload</span><br><span class="line">│ │ │ ├── renderer</span><br><span class="line">│ │ │ └── vendor</span><br><span class="line">│ └── ui-tars</span><br><span class="line">│ └── src</span><br><span class="line">│ ├── main</span><br><span class="line">│ ├── preload</span><br><span class="line">│ └── renderer</span><br><span class="line">│ </span><br><span class="line"></span><br><span class="line">├── packages</span><br><span class="line">│ ├── agent-infra</span><br><span class="line">│ │ ├── browser</span><br><span class="line">│ │ ├── browser-use</span><br><span class="line">│ │ ├── logger</span><br><span class="line">│ │ ├── mcp-client</span><br><span class="line">│ │ ├── mcp-servers</span><br><span class="line">│ │ ├── search</span><br><span class="line">│ │ └── shared</span><br><span class="line">│ ├── common</span><br><span class="line">│ │ ├── configs</span><br><span class="line">│ │ └── electron-build</span><br><span class="line">│ └── ui-tars</span><br><span class="line">│ ├── action-parser</span><br><span class="line">│ ├── cli</span><br><span class="line">│ ├── electron-ipc</span><br><span class="line">│ ├── operators</span><br><span class="line">│ ├── sdk</span><br><span class="line">│ ├── shared</span><br><span class="line">│ ├── tsconfig.node.json</span><br><span class="line">│ ├── utio</span><br><span class="line">│ └── visualizer</span><br><span class="line">└── vitest.*.mts <span class="comment"># 单元测试配置</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>:由于 Electron Forge 之前不支持 Pnpm 的提升机制(<a href="https://github.com/electron/forge/issues/2633">electron/forge#2633</a>),要求将 <code>src</code> 目录放在顶级目录中,因此 <code>src</code> 目录位于顶级目录而不是 <code>apps/{main,preload,renderer}</code> 目录中。</p></blockquote><h4 id="克隆存储库"><a href="#克隆存储库" class="headerlink" title="克隆存储库"></a>克隆存储库</h4><figure class="highlight bash"><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">$ git <span class="built_in">clone</span> https://github.com/bytedance/ui-tars-desktop.git</span><br><span class="line">$ <span class="built_in">cd</span> ui-tars-desktop</span><br></pre></td></tr></table></figure><h3 id="开发"><a href="#开发" class="headerlink" title="开发"></a>开发</h3><h4 id="安装依赖项"><a href="#安装依赖项" class="headerlink" title="安装依赖项"></a>安装依赖项</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pnpm install</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>:若安装依赖过程中出现报错,请尝试使用以下镜像重新安装,并且使用git bash;将以下内容添加到.npmrc文件后面</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></pre></td><td class="code"><pre><span class="line">registry=https://registry.npmmirror.com/</span><br><span class="line">electron_mirror=https://npmmirror.com/mirrors/electron/</span><br><span class="line">electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/</span><br><span class="line">sqlite3_binary_host_mirror=https://npmmirror.com/mirrors/sqlite3/</span><br><span class="line"># sass_binary_site=https://npmmirror.com/mirrors/node-sass/pnpm </span><br><span class="line">chromedriver_cdnurl=https://npmmirror.com/mirrors/chromedriver/</span><br><span class="line">operadriver_cdnurl=https://npmmirror.com/mirrors/operadriver/</span><br><span class="line">puppeteer_download_base_url=https://npmmirror.com/mirrors/</span><br><span class="line">fse_binary_host_mirror=https://npmmirror.com/mirrors/fsevents</span><br></pre></td></tr></table></figure></blockquote><h4 id="运行应用程序"><a href="#运行应用程序" class="headerlink" title="运行应用程序"></a>运行应用程序</h4><figure class="highlight bash"><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">$ pnpm run dev:ui-tars <span class="comment"># 启动 UI-TARS Desktop</span></span><br><span class="line">$ pnpm run dev:agent-tars <span class="comment"># 启动 Agent-TARS Desktop</span></span><br></pre></td></tr></table></figure><p>应用程序启动后,您可以在应用程序内看到 UI-TARS 界面。</p><blockquote><p><strong>注意</strong>:在 MacOS 上,您需要授予运行命令所使用的应用(例如 iTerm2、Terminal)权限。</p></blockquote><h4 id="主进程重载"><a href="#主进程重载" class="headerlink" title="主进程重载"></a>主进程重载</h4><p>默认情况下,<code>pnpm run dev</code> 只有前端热模块替换(HMR)热更新。如果您需要在调试期间同时重载主进程,可以执行 <code>pnpm run dev:w</code>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ pnpm run dev:w</span><br></pre></td></tr></table></figure><h4 id="构建"><a href="#构建" class="headerlink" title="构建"></a>构建</h4><p>在当前系统中运行 <code>pnpm run build</code>,它将输出到 <code>out/*</code> 目录中。</p><p>要构建其他系统的产品,请运行:</p><ul><li>Mac x64:<code>pnpm run publish:mac-x64</code></li><li>Mac ARM:<code>pnpm run publish:mac-arm64</code></li><li>Windows x64:<code>pnpm run publish:win32</code></li><li>Windows ARM:<code>pnpm run publish:win32-arm64</code></li></ul>]]></content>
<summary type="html">UI-TARS 本地部署</summary>
<category term="Agent" scheme="https://lathezero.github.io/categories/Agent/"/>
<category term="UI-TARS" scheme="https://lathezero.github.io/categories/Agent/UI-TARS/"/>
<category term="Agent" scheme="https://lathezero.github.io/tags/Agent/"/>
<category term="UI-TARS" scheme="https://lathezero.github.io/tags/UI-TARS/"/>
</entry>
<entry>
<title>OpenManus本地部署</title>
<link href="https://lathezero.github.io/2025/03/12/OpenModel/OpenManus/"/>
<id>https://lathezero.github.io/2025/03/12/OpenModel/OpenManus/</id>
<published>2025-03-12T07:24:31.000Z</published>
<updated>2025-03-13T07:44:56.488Z</updated>
<content type="html"><![CDATA[<h1 id="OpenManus-安装与配置指南"><a href="#OpenManus-安装与配置指南" class="headerlink" title="OpenManus 安装与配置指南"></a>OpenManus 安装与配置指南</h1><h2 id="一、前置软件下载"><a href="#一、前置软件下载" class="headerlink" title="一、前置软件下载"></a>一、前置软件下载</h2><ol><li><strong>Miniconda 下载与安装</strong> :打开浏览器,访问链接<a href="https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe">https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe</a> 进行下载。下载完成后,双击文件开始安装,推荐安装在除 C 盘以外的位置。安装步骤依次为:双击下载的文件,点击 “Next”->“I Agree”->“Next”->“Next”,注意勾选第二项,然后点击 “Install”,<br> <img src="/images/OpenManus/miniconda3.png" alt="miniconda3"><br> 安装完成后继续点击 “Next”,若弹出网页可直接关闭。</li><li><strong>验证 Miniconda 安装</strong> :回到桌面,按 “Win+R”,输入 “cmd” 回车,在弹出的界面中输入以下命令,若看到类似 “conda 25.1.1” 的输出则表示安装成功。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda --version</span><br></pre></td></tr></table></figure><h2 id="二、OpenManus-文件获取与环境搭建"><a href="#二、OpenManus-文件获取与环境搭建" class="headerlink" title="二、OpenManus 文件获取与环境搭建"></a>二、OpenManus 文件获取与环境搭建</h2><ol><li><strong>获取 OpenManus 文件</strong> :打开链接<a href="https://github.com/mannaandpoem/OpenManus/archive/refs/heads/front-end.zip">https://github.com/mannaandpoem/OpenManus/archive/refs/heads/front-end.zip</a> 下载,下载完后解压,解压后打开文件,此时界面应为项目文件所在目录。</li><li><strong>创建 Conda 环境</strong> :在项目文件所在目录空白处右键,选择 “Git Bash Here”(或类似方式打开命令行工具),输入以下命令,若出现提示信息,输入 “y” 加回车即可。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda create -n open_manus python=3.12</span><br></pre></td></tr></table></figure><ol start="3"><li><strong>激活 Conda 环境</strong> :继续输入以下命令。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda activate open_manus</span><br></pre></td></tr></table></figure><ol start="4"><li><strong>安装依赖项</strong> :输入以下命令,此过程可能需要较长时间,请耐心等待。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/</span><br></pre></td></tr></table></figure><h2 id="三、API-配置"><a href="#三、API-配置" class="headerlink" title="三、API 配置"></a>三、API 配置</h2><ol><li><strong>获取 API 密钥</strong> :打开链接<a href="https://cloud.siliconflow.cn/i/y19ZZCMm">https://cloud.siliconflow.cn/i/y19ZZCMm</a> 登录,点击右上角 “新建 API 密钥”,复制生成的 API 密钥。</li><li><strong>配置项目 config 文件</strong> :找到项目中的 config 文件,将其重命名为 “config.toml”,右键选择用记事本打开,将刚刚复制的 API 密钥、模型和路径粘贴到对应的位置,其中路径为 “<a href="https://api.siliconflow.cn/v1">https://api.siliconflow.cn/v1</a>”,模型为 “Qwen/Qwen2.5-7B-Instruct”。<br> <img src="/images/OpenManus/config.png" alt="config"></li><li><strong>保存并运行项目</strong> :按 “Ctrl+S” 保存文件并关闭,回到命令行窗口,输入以下命令,即可开始使用 OpenManus。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python app.py</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">OpenManus 本地部署</summary>
<category term="Agent" scheme="https://lathezero.github.io/categories/Agent/"/>
<category term="manus" scheme="https://lathezero.github.io/categories/Agent/manus/"/>
<category term="Agent" scheme="https://lathezero.github.io/tags/Agent/"/>
<category term="manus" scheme="https://lathezero.github.io/tags/manus/"/>
</entry>
<entry>
<title>sprintboot notes</title>
<link href="https://lathezero.github.io/2025/01/12/2025/spbNotes/"/>
<id>https://lathezero.github.io/2025/01/12/2025/spbNotes/</id>
<published>2025-01-12T14:07:27.000Z</published>
<updated>2025-01-13T08:54:23.316Z</updated>
<content type="html"><![CDATA[<h3 id="框架"><a href="#框架" class="headerlink" title="框架"></a>框架</h3><ol><li>创建空项目,sprintboot模块</li><li>使用三层架构设计</li><li>创建控制层、逻辑层接口、逻辑实现类、持久层</li><li>准备封装的对象和返回对象</li></ol><h3 id="手动封装"><a href="#手动封装" class="headerlink" title="手动封装"></a>手动封装</h3><ol><li><p>使用Results和Result</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></pre></td><td class="code"><pre><span class="line">@Results({</span><br><span class="line">@Result(column = "create_time", property = "createTime"),</span><br><span class="line">@Result(column = "update_time", property = "updataTime"),</span><br><span class="line">})</span><br><span class="line">@select("select id, name, create_time, update_time, from tlias order by update_time desc")</span><br><span class="line">public List<Dept> findAll();</span><br></pre></td></tr></table></figure></li><li><p>起别名</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">@select("select id, name, create_time createTime, update_time updateTime, from tlias order by update_time desc")</span><br><span class="line">public List<Dept> findAll();</span><br></pre></td></tr></table></figure></li><li><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">mybatis:</span><br><span class="line"> configuration:</span><br><span class="line"> log-impl: org.apache.ibatis.logging.stdout.StdOutImpl</span><br><span class="line"> map-underscore-to-camel-case: true</span><br></pre></td></tr></table></figure></li></ol><h3 id="使用nginx部署前端"><a href="#使用nginx部署前端" class="headerlink" title="使用nginx部署前端"></a>使用nginx部署前端</h3><ol><li><p>通过HttpServletRequest对象获取</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></pre></td><td class="code"><pre><span class="line">@DeleteMapping("/depts")</span><br><span class="line">public Result delete(HttpServletRequest request) {</span><br><span class="line">String idstr = request.getParameter("id");</span><br><span class="line">int id = Integer.parseInt(idstr);</span><br><span class="line">deptService.deleteByid(id);</span><br><span class="line">System.out.println("根据ID删除部门:"+id);</span><br></pre></td></tr></table></figure></li><li><p>后端使用@RequestParam接收参数</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></pre></td><td class="code"><pre><span class="line">@DeleteMapping("depts")</span><br><span class="line">public Result deleteByid(@RequestParam("id") Integer deptId) {</span><br><span class="line"> deptService.deleteByid(deptId);</span><br><span class="line"> System.out.println("删除部门数据:" + deptId);</span><br><span class="line"> return Result.success();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>使用@RequestParam默认会绑定参数,且不能为空,可以设置<code>required</code>属性为<code>false</code>代表参数可选</p></blockquote></li><li><p>当前端请求的参数名与服务端方法形参一样时,可省略@RequestParam注解 *</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></pre></td><td class="code"><pre><span class="line">@DeleteMapping("depts")</span><br><span class="line">public Result deleteByid(Integer id) {</span><br><span class="line"> deptService.deleteByid(id);</span><br><span class="line"> System.out.println("删除部门数据:" + id);</span><br><span class="line"> return Result.success();</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol><h3 id="接收前端的-JSON-数据"><a href="#接收前端的-JSON-数据" class="headerlink" title="接收前端的 JSON 数据"></a>接收前端的 JSON 数据</h3><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">@PostMapping("depts")</span><br><span class="line">public Result insert(@RequestBody Dept dept) {</span><br><span class="line"> deptService.insert(dept);</span><br><span class="line"> System.out.println("新增部门数据:" + dept.getName());</span><br><span class="line"> return Result.success();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p> @RequestBody注解 接收JSON格式数据并封装到一个对象当中(注:该对象中必须有一个与形参相同的属性)</p></blockquote><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">public class Dept {</span><br><span class="line"> private Integer id;</span><br><span class="line"> private String name;</span><br><span class="line"> private LocalDateTime createTime;</span><br><span class="line"> private LocalDateTime updateTime;</span><br></pre></td></tr></table></figure><h3 id="接收路径参数"><a href="#接收路径参数" class="headerlink" title="接收路径参数"></a>接收路径参数</h3><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">@GetMapping("depts/{id}")</span><br><span class="line">public Result getById(@PathVariable("id") Integer id) {</span><br><span class="line"> Dept dept = deptService.getById(id);</span><br><span class="line"> System.out.println("查询部门数据:" + dept.getName());</span><br><span class="line"> return Result.success(dept);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>@PathVariable注解 将路径参数赋值给形参</p></blockquote><blockquote><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></pre></td><td class="code"><pre><span class="line">@GetMapping("depts/{id}")</span><br><span class="line">public Result getById(@PathVariable Integer id) {</span><br><span class="line"> Dept dept = deptService.getById(id);</span><br><span class="line"> System.out.println("查询部门数据:" + dept.getName());</span><br><span class="line"> return Result.success(dept);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></blockquote>]]></content>
<summary type="html">SpringBoot框架</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/Java/"/>
<category term="开发工具" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
<category term="框架" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E6%A1%86%E6%9E%B6/"/>
<category term="SpringBoot" scheme="https://lathezero.github.io/tags/SpringBoot/"/>
<category term="Java" scheme="https://lathezero.github.io/tags/Java/"/>
</entry>
<entry>
<title>MyBatis</title>
<link href="https://lathezero.github.io/2025/01/06/2025/MyBatis/"/>
<id>https://lathezero.github.io/2025/01/06/2025/MyBatis/</id>
<published>2025-01-06T13:38:56.000Z</published>
<updated>2025-01-06T13:54:13.111Z</updated>
<content type="html"><![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><h3 id="1-创建Springboot模块,引入Mybatis相关依赖"><a href="#1-创建Springboot模块,引入Mybatis相关依赖" class="headerlink" title="1. 创建Springboot模块,引入Mybatis相关依赖"></a>1. 创建Springboot模块,引入Mybatis相关依赖</h3><pre><code>1. Lombok2. MyBatis Framework3. MySQL Driver</code></pre><h3 id="2-准备数据库表和实体类"><a href="#2-准备数据库表和实体类" class="headerlink" title="2. 准备数据库表和实体类"></a>2. 准备数据库表和实体类</h3><h3 id="3-配置Mybatis"><a href="#3-配置Mybatis" class="headerlink" title="3. 配置Mybatis"></a>3. 配置Mybatis</h3><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">spring.datasource.url=jdbc:mysql://localhost:3306/db01</span><br><span class="line">spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver</span><br><span class="line">spring.datasource.username=root</span><br><span class="line">spring.datasource.password=1234</span><br></pre></td></tr></table></figure><h2 id="编写Mybatis程序:编写Mybatis的持久层接口,定义SQL-注解-XML"><a href="#编写Mybatis程序:编写Mybatis的持久层接口,定义SQL-注解-XML" class="headerlink" title="编写Mybatis程序:编写Mybatis的持久层接口,定义SQL(注解/XML)"></a>编写Mybatis程序:编写Mybatis的持久层接口,定义SQL(注解/XML)</h2><h3 id="1-定义Mapper接口-Mapper-,编写SQL"><a href="#1-定义Mapper接口-Mapper-,编写SQL" class="headerlink" title="1. 定义Mapper接口(@Mapper),编写SQL"></a>1. 定义Mapper接口(@Mapper),编写SQL</h3><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">@Mapper // 应用程序在运行时,会自动的为该接口创建一个实现类对象(代理对象),并且会自动将该实现类对象存入IOC容器</span><br><span class="line">public interface UserMapper {</span><br><span class="line"></span><br><span class="line"> @Select("select * from user")</span><br><span class="line"> public List<User> findAll();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="2-编写测试类"><a href="#2-编写测试类" class="headerlink" title="2. 编写测试类"></a>2. 编写测试类</h3><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></pre></td><td class="code"><pre><span class="line">// springboot单元测试的注解--当前测试类中的测试方法运行时,会启动springboot项目</span><br><span class="line">@SpringBootTest //就是说会加载IOC容器中的对象</span><br><span class="line">class SpringbootMybatisQuickstartApplicationTests {</span><br><span class="line"> @Autowired</span><br><span class="line"> private UserMapper userMapper;</span><br><span class="line"></span><br><span class="line"> @Test</span><br><span class="line"> public void testFindAll() {</span><br><span class="line"> List<User> users = userMapper.findAll();</span><br><span class="line"> users.forEach(System.out::println);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>@SpringBootTest: 会在单元测试运行时,加载springBoot的环境</p><p>注意: 测试类所在包需要与引导类包名相同(或放在引导类所在包的子包下)</p><h2 id="辅助配置"><a href="#辅助配置" class="headerlink" title="辅助配置"></a>辅助配置</h2><h3 id="SQL语句提示"><a href="#SQL语句提示" class="headerlink" title="SQL语句提示"></a>SQL语句提示</h3><p>IDEA中连接数据库即可</p><h3 id="配置MyBatis的日志输出"><a href="#配置MyBatis的日志输出" class="headerlink" title="配置MyBatis的日志输出"></a>配置MyBatis的日志输出</h3><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">mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl</span><br></pre></td></tr></table></figure><p><img src="/images/MyBatis/mybatislog.png" alt="mybatislog"></p><p><img src="/images/MyBatis/mybatislog-stdoutimpl.png" alt="mybatislog-stdoutimpl"></p><p><img src="/images/MyBatis/log.png" alt="log"></p><h2 id="数据库连接池"><a href="#数据库连接池" class="headerlink" title="数据库连接池"></a>数据库连接池</h2><ol><li><p>数据库连接池是个容器,负责分配、管理数据库连接(Connection)</p></li><li><p>它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。</p></li><li><p>释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏</p></li></ol><p>标准接口:DataSource</p><ol><li>官方(sun)提供的数据库连接池接口,由第三方组织实现此接口。<ol start="2"><li>功能:获取连接<code>Connection getConnection()throws SQLException;</code></li></ol></li></ol><p>常见产品:</p><p>C3P0、DBCP、Druid、Hikari(springboot默认)</p><p>Druid(德鲁伊)<br>Druid连接池是阿里巴巴开源的数据库连接池项目功能强大,性能优秀,是Java语言最好的数据库连接池之一</p><h3 id="切换数据库连接池"><a href="#切换数据库连接池" class="headerlink" title="切换数据库连接池"></a>切换数据库连接池</h3><ol><li><p>springboot配置文件中配置德鲁伊依赖</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"><dependency></span><br><span class="line"> <groupId>com.alibaba</groupId></span><br><span class="line"> <artifactId>druid-spring-boot-starter</artifactId></span><br><span class="line"> <version>1.2.19</version></span><br><span class="line"></dependency></span><br></pre></td></tr></table></figure></li><li><p>mybatis配置文件中添加德鲁伊依赖</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">spring.datasource.type=com.alibaba.druid.pool.DruidDataSource</span><br></pre></td></tr></table></figure></li></ol><h2 id="增删改查"><a href="#增删改查" class="headerlink" title="增删改查"></a>增删改查</h2><h3 id="删除操作"><a href="#删除操作" class="headerlink" title="删除操作"></a>删除操作</h3><p>Mapper</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">@Mapper // 应用程序在运行时,会自动的为该接口创建一个实现类对象(代理对象),并且会自动将该实现类对象存入IOC容器</span><br><span class="line">public interface UserMapper {</span><br><span class="line"></span><br><span class="line"> @Select("select id from user")</span><br><span class="line"> public List<User> findAll();</span><br><span class="line"></span><br><span class="line"> @Delete("delete from user where id=#{id} ")</span><br><span class="line"> // public void delete(Integer id);</span><br><span class="line"> public Integer deleteById(Integer id);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><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><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></pre></td><td class="code"><pre><span class="line">@SpringBootTest // springboot单元测试的注解--当前测试类中的测试方法运行时,会启动springboot项目</span><br><span class="line">class SpringbootMybatisQuickstartApplicationTests {</span><br><span class="line"> @Autowired</span><br><span class="line"> private UserMapper userMapper;</span><br><span class="line"></span><br><span class="line"> @Test</span><br><span class="line"> public void testFindAll() {</span><br><span class="line"> List<User> users = userMapper.findAll();</span><br><span class="line"> users.forEach(System.out::println);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Test</span><br><span class="line"> public void testDelete() {</span><br><span class="line"> Integer i = userMapper.deleteById(10);</span><br><span class="line"> System.out.println("执行删除语句成功,影响的条数为:" + i);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="Mybatis中-与-的区别是什么-面试题"><a href="#Mybatis中-与-的区别是什么-面试题" class="headerlink" title="Mybatis中#与$的区别是什么?(面试题)"></a>Mybatis中#与$的区别是什么?(面试题)</h4><p>#是占位符,会替换为?生成预编译SQL(推荐)</p><p>$ 是字符串拼接符号,将参数值直接拼接在SQL中</p><h3 id="新增操作"><a href="#新增操作" class="headerlink" title="新增操作"></a>新增操作</h3><p>Mapper</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">@Insert("insert into user(id, username, password, name, age) values(#{id}, #{username}, #{password}, #{name}, #{age})")</span><br><span class="line">public void insert(User user);</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">@Test</span><br><span class="line">public void testInsert() {</span><br><span class="line"> User user = new User(null, "admin", "admin", "管理员", 18);</span><br><span class="line"> userMapper.insert(user);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="修改操作"><a href="#修改操作" class="headerlink" title="修改操作"></a>修改操作</h3><p>Mapper</p><p>在MyBatis中,当使用<code>#{字段名}</code>占位符时,MyBatis会自动查找传递的对象中的相应属性,并将其值绑定到SQL语句中。</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">@Update("update user set username=#{username}, password=#{password}, name=#{name}, age=#{age} where id=#{id}")</span><br><span class="line">public void update(User user);</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">@Test</span><br><span class="line">public void testUpdate() {</span><br><span class="line"> User user = new User(10, "user10", "123456", "牛逼逼", 28);</span><br><span class="line"> userMapper.update(user);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="查询操作"><a href="#查询操作" class="headerlink" title="查询操作"></a>查询操作</h3><p>Mapper</p><p><code>@Param</code>注解用于在接口方法中给传递的形参起名字</p><p>说明:基于官方骨架创建的springboot项目中,接口编译时会保留方法形参名,@Param注解可以省略(#{形参名})。</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">@Select("select * from user where username=#{username} and password=#{password}")</span><br><span class="line">public User findUser(@Param("username")String username, @Param("password")String password);</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">@Test</span><br><span class="line">public void testFindUser() {</span><br><span class="line"> User user = userMapper.findUser("user10", "123456");</span><br><span class="line"> System.out.println(user);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="XML映射配置"><a href="#XML映射配置" class="headerlink" title="XML映射配置"></a>XML映射配置</h2><h3 id="执行复杂SQL语句"><a href="#执行复杂SQL语句" class="headerlink" title="执行复杂SQL语句"></a>执行复杂SQL语句</h3><p>在Mybatis中,既可以通过注解配置 SQL 语句,也可以通过 XML 配置文件配置 SQL 语句。<br>默认规则:</p><ol><li><p>XML映射文件的名称与Mapper接口名称一致,并且将 XML 映射文件和Mapper接口放置在相同包下(同包同名)</p></li><li><p>XML映射文件的namespace属性为Mapper接口全限定名一致</p></li><li><p>XML映射文件中 sql 语句的 id 与 Mapper 接口中的方法名一致,并保持返回类型一致</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"><?xml version="1.0" encoding="UTF-8" ?></span><br><span class="line"><!DOCTYPE mapper</span><br><span class="line"> PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</span><br><span class="line"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd"></span><br><span class="line"><mapper namespace="com.lathezero.mapper.UserMapper"></span><br><span class="line"> <!--resultType: 查询返回的单条记录所封装的类型--></span><br><span class="line"> <select id="findAll" resultType="com.lathezero.pojo.User"></span><br><span class="line"> select id, username, password, name, age from user</span><br><span class="line"> </select></span><br><span class="line"></mapper></span><br></pre></td></tr></table></figure><blockquote><p>使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。</p></blockquote><blockquote><p>选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。</p></blockquote></li></ol><h3 id="辅助配置-1"><a href="#辅助配置-1" class="headerlink" title="辅助配置"></a>辅助配置</h3><h4 id="配置XML映射文件的位置:"><a href="#配置XML映射文件的位置:" class="headerlink" title="配置XML映射文件的位置:"></a>配置XML映射文件的位置:</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">mybatis.mapper-locations=classpath:mapper/*.xml</span><br></pre></td></tr></table></figure><h4 id="mybatis插件"><a href="#mybatis插件" class="headerlink" title="mybatis插件:"></a>mybatis插件:</h4><ul><li>MyBatisX</li><li>提高开发效率</li></ul>]]></content>
<summary type="html">MyBatis笔记</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/Java/"/>
<category term="开发工具" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
<category term="框架" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E6%A1%86%E6%9E%B6/"/>
<category term="Java" scheme="https://lathezero.github.io/tags/Java/"/>
<category term="后端开发" scheme="https://lathezero.github.io/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="框架" scheme="https://lathezero.github.io/tags/%E6%A1%86%E6%9E%B6/"/>
<category term="MyBatis" scheme="https://lathezero.github.io/tags/MyBatis/"/>
</entry>
<entry>
<title>CosyVoiceDeploy</title>
<link href="https://lathezero.github.io/2025/01/05/2025/CosyVoiceDeploy/"/>
<id>https://lathezero.github.io/2025/01/05/2025/CosyVoiceDeploy/</id>
<published>2025-01-05T13:30:13.000Z</published>
<updated>2025-02-28T14:02:13.799Z</updated>
<content type="html"><![CDATA[<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">pip install cython -i https://pypi.tuna.tsinghua.edu.cn/simple</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">conda install -y -c conda-forge pynini==2.1.5</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">pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com</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">python -c"import torch;print(torch.__version_)</span><br></pre></td></tr></table></figure><p>CosyVoice 是阿里通义实验室开源的多语言语音合成模型,支持音色克隆、情感控制和跨语种语音合成等功能。以下是一个详细的本地部署教程,帮助你在本地部署并使用 CosyVoice 模型。</p><hr><h2 id="本地部署-CosyVoice-的步骤"><a href="#本地部署-CosyVoice-的步骤" class="headerlink" title="本地部署 CosyVoice 的步骤"></a><strong>本地部署 CosyVoice 的步骤</strong></h2><h3 id="1-环境准备-无需理会"><a href="#1-环境准备-无需理会" class="headerlink" title="1. 环境准备(无需理会)"></a><strong>1. 环境准备</strong>(无需理会)</h3><ul><li><strong>硬件要求</strong>:<ul><li>NVIDIA 显卡,建议显存 6GB 以上。</li><li>确保系统路径和文件名不含中文或空格。</li></ul></li><li><strong>软件依赖</strong>:<ul><li><strong>CUDA 和 cuDNN</strong>:用于 GPU 加速。检查并安装与显卡兼容的 CUDA 版本(建议 CUDA 12.x)和对应的 cuDNN 版本。</li><li><strong>Git</strong>:用于克隆代码仓库。</li><li><strong>Miniconda</strong>:用于创建 Python 虚拟环境。</li></ul></li></ul><hr><h3 id="2-克隆代码仓库"><a href="#2-克隆代码仓库" class="headerlink" title="2. 克隆代码仓库"></a><strong>2. 克隆代码仓库</strong></h3><ol><li><p>打开命令行窗口,执行以下命令克隆 CosyVoice 仓库:</p><figure class="highlight bash"><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">git <span class="built_in">clone</span> --recursive https://github.com/FunAudioLLM/CosyVoice.git</span><br><span class="line"><span class="built_in">cd</span> CosyVoice</span><br><span class="line">git submodule update --init --recursive</span><br></pre></td></tr></table></figure><ul><li>如果克隆失败,可以尝试多次或使用代理。</li></ul></li></ol><hr><h3 id="3-创建虚拟环境"><a href="#3-创建虚拟环境" class="headerlink" title="3. 创建虚拟环境"></a><strong>3. 创建虚拟环境</strong></h3><ol><li><p>使用 Miniconda 创建虚拟环境:</p><figure class="highlight bash"><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">conda create -n cosyvoice python=3.8</span><br><span class="line">conda activate cosyvoice</span><br></pre></td></tr></table></figure></li><li><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">pip install cython -i https://pypi.tuna.tsinghua.edu.cn/simple</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">conda install -y -c conda-forge pynini==2.1.5</span><br></pre></td></tr></table></figure></li><li><p>安装依赖库:</p><ul><li><p>修改 <code>requirements.txt</code> 文件,删除<code>onnxruntime</code>这一行,并将 <code>onnxruntime-gpu</code> 后面的条件判断<code>;</code>后面一整段删除</p></li><li><p>使用国内镜像加速安装:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com</span><br></pre></td></tr></table></figure></li><li><p>如果 <code>torch</code> 安装过慢,可以手动下载并安装:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install torch-2.0.1+cu118-cp38-cp38-win_amd64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure></li><li><p>查看<code>torch</code>是否正确安装:</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">python -c"import torch;print(torch.__version_)</span><br></pre></td></tr></table></figure></li></ul></li></ol><hr><h3 id="4-下载模型"><a href="#4-下载模型" class="headerlink" title="4. 下载模型"></a><strong>4. 下载模型</strong></h3><ol><li><p>使用 ModelScope 下载预训练模型:</p><ul><li><p>创建一个 Python 脚本 <code>download_models.py</code>,内容如下:</p><figure class="highlight python"><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 class="keyword">from</span> modelscope <span class="keyword">import</span> snapshot_download</span><br><span class="line">snapshot_download(<span class="string">'iic/CosyVoice-300M'</span>, local_dir=<span class="string">'pretrained_models/CosyVoice-300M'</span>)</span><br><span class="line">snapshot_download(<span class="string">'iic/CosyVoice-300M-SFT'</span>, local_dir=<span class="string">'pretrained_models/CosyVoice-300M-SFT'</span>)</span><br><span class="line">snapshot_download(<span class="string">'iic/CosyVoice-300M-Instruct'</span>, local_dir=<span class="string">'pretrained_models/CosyVoice-300M-Instruct'</span>)</span><br><span class="line">snapshot_download(<span class="string">'iic/CosyVoice-ttsfrd'</span>, local_dir=<span class="string">'pretrained_models/CosyVoice-ttsfrd'</span>)</span><br></pre></td></tr></table></figure></li><li><p>运行脚本:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python download_models.py</span><br></pre></td></tr></table></figure></li><li><p>如果下载速度慢,可以从百度网盘或夸克网盘下载模型并解压到 <code>pretrained_models</code> 目录。</p></li></ul></li></ol><hr><h3 id="5-启动模型"><a href="#5-启动模型" class="headerlink" title="5. 启动模型"></a><strong>5. 启动模型</strong></h3><p>对于零样本/跨语言推理,请使用 <code>CosyVoice-300M</code> 模型。对于 sft 推理,请使用 <code>CosyVoice-300M-SFT</code> 模型。对于指令推理,请使用 <code>CosyVoice-300M-Instruct</code> 模型。</p><ol><li><p><strong>内置音色生成</strong>:</p><ul><li><p>在命令行中运行:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python webui.py --port 50000 --model_dir pretrained_models/CosyVoice-300M-SFT</span><br></pre></td></tr></table></figure></li><li><p>打开浏览器访问 <code>http://127.0.0.1:50000</code> 使用 Web 界面。</p></li></ul></li><li><p><strong>音色克隆</strong>:</p><ul><li><p>准备一段 3~10 秒的音频作为音色样本。</p></li><li><p>运行以下命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python webui.py --port 50001 --model_dir pretrained_models/CosyVoice-300M</span><br></pre></td></tr></table></figure></li></ul></li><li><p><strong>语气微调</strong>:</p><ul><li><p>使用 <code>CosyVoice-300M-Instruct</code> 模型,支持富文本输入(如 <code><strong></code> 强调语气):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python webui.py --port 50002 --model_dir pretrained_models/CosyVoice-300M-Instruct</span><br></pre></td></tr></table></figure></li></ul></li></ol><hr><h3 id="6-常见问题"><a href="#6-常见问题" class="headerlink" title="6. 常见问题"></a><strong>6. 常见问题</strong></h3><ul><li><p><strong>SSLError 或 HTTPSConnectionError</strong>:设置代理端口:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> http_proxy=http://127.0.0.1:你的代理端口地址 & <span class="built_in">set</span> https_proxy=http://127.0.0.1:你的代理端口地址</span><br></pre></td></tr></table></figure></li><li><p><strong>模型下载失败</strong>:更新 <code>modelscope</code> 到最新版本:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install modelscope==1.17.0 -i https://pypi.tuna.tsinghua.edu.cn/simple</span><br></pre></td></tr></table></figure></li></ul><hr><h3 id="7-进阶功能"><a href="#7-进阶功能" class="headerlink" title="7. 进阶功能"></a><strong>7. 进阶功能</strong></h3><ul><li><strong>跨语种语音合成</strong>:输入中文语音,输出其他语言的语音。</li><li><strong>情感控制</strong>:通过富文本标签(如 <code><laughter></code>)控制语音情感。</li></ul><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a><strong>总结</strong></h2><p>通过以上步骤,你可以在本地成功部署并使用 CosyVoice 模型。如果需要更详细的教程或遇到问题,可以参考相关文档或视频教程。</p><p>根据搜索结果,以下是 <strong>CosyVoice</strong> 系列模型的详细解释和适用场景:</p><hr><h2 id="1-CosyVoice-300M"><a href="#1-CosyVoice-300M" class="headerlink" title="1. CosyVoice-300M"></a><strong>1. CosyVoice-300M</strong></h2><ul><li><strong>功能</strong>:这是 CosyVoice 的基座模型,支持 <strong>零样本音色克隆</strong> 和 <strong>跨语言语音合成</strong>。</li><li><strong>特点</strong>:<ul><li>仅需 3~10 秒的音频样本,即可生成与目标音色高度相似的语音,包括韵律、情感等细节。</li><li>支持多语言(如中文、英文、日语、粤语、韩语)的语音合成。</li></ul></li><li><strong>适用场景</strong>:<ul><li>音色克隆:适用于需要快速复刻特定音色的场景,如虚拟助手、有声读物等。</li><li>跨语言语音合成:输入一种语言的语音,输出另一种语言的语音,同时保留原始音色。</li></ul></li></ul><hr><h2 id="2-CosyVoice-300M-SFT"><a href="#2-CosyVoice-300M-SFT" class="headerlink" title="2. CosyVoice-300M-SFT"></a><strong>2. CosyVoice-300M-SFT</strong></h2><ul><li><strong>功能</strong>:这是经过 <strong>SFT(Supervised Fine-Tuning)微调</strong> 的模型,内置了多个预训练音色。</li><li><strong>特点</strong>:<ul><li>支持多种预定义音色(如中文女声、中文男声、日语男声、粤语女声等)。</li><li>在特定任务或领域的语音生成质量上表现更优。</li></ul></li><li><strong>适用场景</strong>:<ul><li>内置音色生成:适用于需要快速生成高质量语音的场景,如语音客服、语音播报等。</li><li>多语言支持:支持多种语言的语音合成,适合国际化应用。</li></ul></li></ul><hr><h2 id="3-CosyVoice-300M-Instruct"><a href="#3-CosyVoice-300M-Instruct" class="headerlink" title="3. CosyVoice-300M-Instruct"></a><strong>3. CosyVoice-300M-Instruct</strong></h2><ul><li><strong>功能</strong>:这是支持 <strong>细粒度控制</strong> 的模型,允许通过自然语言指令或富文本标签控制语音生成。</li><li><strong>特点</strong>:<ul><li>支持情感、口音、角色风格等细粒度控制。</li><li>内置丰富的指令集,如 <code><laughter></code>(笑声)、<code><strong></code>(强调)、<code>[breath]</code>(呼吸声)等。</li><li>支持多语言和方言控制(如四川话)。</li></ul></li><li><strong>适用场景</strong>:<ul><li>情感语音生成:适用于需要表达特定情感的语音合成,如影视配音、游戏角色语音等。</li><li>指令控制:适合需要动态调整语音风格和情感的场景,如虚拟助手、互动播客等。</li></ul></li></ul><hr><h2 id="4-CosyVoice-ttsfrd"><a href="#4-CosyVoice-ttsfrd" class="headerlink" title="4. CosyVoice-ttsfrd"></a><strong>4. CosyVoice-ttsfrd</strong></h2><ul><li><strong>功能</strong>:这是 CosyVoice 的 <strong>文本规范化工具</strong>,用于优化文本到语音的转换效果。</li><li><strong>特点</strong>:<ul><li>提供更好的文本归一化性能,支持多语言文本处理。</li><li>可选的安装包,默认使用 WeTextProcessing 作为替代。</li></ul></li><li><strong>适用场景</strong>:<ul><li>文本预处理:适用于需要高质量文本到语音转换的场景,如语音合成系统的前端处理。</li></ul></li></ul><hr><h2 id="5-CosyVoice2-0-5B"><a href="#5-CosyVoice2-0-5B" class="headerlink" title="5. CosyVoice2-0.5B"></a><strong>5. CosyVoice2-0.5B</strong></h2><ul><li><strong>功能</strong>:这是 CosyVoice 的升级版本,支持 <strong>流式语音合成</strong> 和 <strong>更高质量的语音生成</strong>。</li><li><strong>特点</strong>:<ul><li>超低延迟:首包合成延迟可低至 150ms,适合实时应用。</li><li>高准确度:在发音错误率上比 CosyVoice 1.0 下降 30%~50%。</li><li>支持双向流式语音合成,适用于实时语音交互场景。</li></ul></li><li><strong>适用场景</strong>:<ul><li>实时语音合成:适用于需要低延迟语音生成的场景,如语音聊天、实时翻译等。</li><li>高质量语音生成:适合对语音质量要求较高的应用,如影视配音、广告语音等。</li></ul></li></ul><hr><h2 id="总结-1"><a href="#总结-1" class="headerlink" title="总结"></a><strong>总结</strong></h2><ul><li><strong>CosyVoice-300M</strong>:适合音色克隆和跨语言语音合成。</li><li><strong>CosyVoice-300M-SFT</strong>:适合内置音色生成和多语言语音合成。</li><li><strong>CosyVoice-300M-Instruct</strong>:适合细粒度控制和情感语音生成。</li><li><strong>CosyVoice-ttsfrd</strong>:适合文本规范化处理。</li><li><strong>CosyVoice2-0.5B</strong>:适合实时语音合成和高质量语音生成。</li></ul>]]></content>
<summary type="html">CosyVoice 本地部署教程</summary>
<category term="模型部署" scheme="https://lathezero.github.io/categories/%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/"/>
<category term="语音合成" scheme="https://lathezero.github.io/categories/%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90/"/>
<category term="模型部署" scheme="https://lathezero.github.io/tags/%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/"/>
<category term="语音合成" scheme="https://lathezero.github.io/tags/%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90/"/>
</entry>
<entry>
<title>web开发中的分层解耦</title>
<link href="https://lathezero.github.io/2025/01/02/2025/ThreeTierSchema/"/>
<id>https://lathezero.github.io/2025/01/02/2025/ThreeTierSchema/</id>
<published>2025-01-02T10:54:04.000Z</published>
<updated>2025-01-06T13:56:02.598Z</updated>
<content type="html"><![CDATA[<h2 id="三层架构与解耦"><a href="#三层架构与解耦" class="headerlink" title="三层架构与解耦"></a>三层架构与解耦</h2><h3 id="三层架构"><a href="#三层架构" class="headerlink" title="三层架构"></a>三层架构</h3><ol><li>接收请求、响应数据Controller</li><li>逻辑处理 Server</li><li>数据访问 Dao</li></ol><p>耦合: 衡量软件中各个层/各个模块的依赖关联程度。</p><p>内聚: 软件中各个功能模块内部的功能联系。</p><p>软件设计原则: 高内聚低耦合。</p><table><thead><tr><th align="center">耦合</th><th align="center">解耦</th></tr></thead><tbody><tr><td align="center"><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/%E8%80%A6%E5%90%88.png" alt="耦合"></td><td align="center"><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/%E8%A7%A3%E8%80%A6.png" alt="解耦"></td></tr></tbody></table><h3 id="对三层架构实现解耦"><a href="#对三层架构实现解耦" class="headerlink" title="对三层架构实现解耦"></a>对三层架构实现解耦</h3><ol><li>控制反转:Inversion 0fControl,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。</li><li>依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。</li><li>Bean对象:IOC容器中创建、管理的对象,称之为Bean。</li></ol><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><ol><li><p>控制反转(DI):</p><p>将Dao 及 Service层的实现类,交给IOC容器管理</p><p>为对象加上 @Component 注解:将这个类产生的 Bean 对象交给 IOC 容器管理</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></pre></td><td class="code"><pre><span class="line">@RestController</span><br><span class="line">public class EmpController {</span><br><span class="line"> @Qualifier("empDaoServiceA") // 默认按类型注入 </span><br><span class="line">// @Resource(name = "empDaoServiceB") // 按照名称注入</span><br><span class="line"> @Autowired // 依赖注入</span><br><span class="line"> private EmpService empService;</span><br><span class="line"> @RequestMapping("/listEmp")</span><br><span class="line"> public Result list() {</span><br><span class="line"> List<Emp> empList = empService.listEmp();</span><br><span class="line"> return Result.success(empList);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>依赖注入(IOC):</p><p>为Controller 及 Service注入运行时所依赖的对象。</p><p>为对象运行时所依赖的成员变量资源加上 @Autowired 注解:应用程序运行时,会自动的查询该类型的Bean对象,并赋值给该成员变量</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></pre></td><td class="code"><pre><span class="line">@Component</span><br><span class="line">public class EmpDaoServiceA implements EmpService{</span><br><span class="line"> @Autowired</span><br><span class="line"> private EmpDao empDao;</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public List<Emp> listEmp() {</span><br><span class="line"> List<Emp> empList = empDao.listEmp();</span><br><span class="line"> // 2.对数据进行转化 gender job</span><br><span class="line"> empList.stream().forEach(emp -> {</span><br><span class="line"> emp.setGender(emp.getGender().equals("1") ? "男" : "女");</span><br><span class="line"></span><br><span class="line"> switch (emp.getJob()) {</span><br><span class="line"> case "1":</span><br><span class="line"> emp.setJob("讲师");</span><br><span class="line"> break;</span><br><span class="line"> case "2":</span><br><span class="line"> emp.setJob("班主任");</span><br><span class="line"> break;</span><br><span class="line"> case "3":</span><br><span class="line"> emp.setJob("就业指导");</span><br><span class="line"> break;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> return empList;</span><br><span class="line"> }</span><br><span class="line">}</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">@Repository("DaoA")</span><br><span class="line">public class EmpDaoA implements EmpDao {</span><br><span class="line"> @Override</span><br><span class="line"> public List<Emp> listEmp() {</span><br><span class="line"> // 1. 加载、解析emp.xml文件</span><br><span class="line"> String filePath = this.getClass().getClassLoader().getResource("emp.xml").getFile();</span><br><span class="line"> List<Emp> empList = XmlParserUtils.parse(filePath, Emp.class);</span><br><span class="line"> return empList;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol><p>总结:</p><ol><li>Controller 接收请求后向 Service 发起请求,Service 接收请求后向 Dao 请求数据</li><li>Dao 解析数据后,返回给 Service,Service 接收数据后对数据进行处理并返回给 Controller </li><li>所以要对 Dao 和 Service <code>控制反转</code>,要对 Controller 和 Service <code>依赖注入</code></li></ol><h2 id="规范化"><a href="#规范化" class="headerlink" title="规范化"></a>规范化</h2><h3 id="Bean依赖注入的衍生注解"><a href="#Bean依赖注入的衍生注解" class="headerlink" title="Bean依赖注入的衍生注解"></a>Bean依赖注入的衍生注解</h3><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/Bean%E6%B3%A8%E8%A7%A3.png" alt="Bean注解"></p><p>从上到下分别为:</p><p>其他 Bean、Controller Bean、 Service Bean、 Dao Bean</p><p>开发中除了声明控制器只能用@Cotroller,其他的并不强制要求对应的Bean写对应的注释,不过为了规范,还是有必要的。</p><p>@Repository 中实际上已经继承了 @Component 注解</p><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/Repository.png" alt="Repository"></p><p>其他同理</p><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/Service.png" alt="Service"></p><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/RestController.png" alt="RestController"></p><p>前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。</p><p>该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 </p><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/SpringBootApplication.png" alt="SpringBootApplication"></p><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/SpringBootApplication.png" alt="SpringBootApplication"></p><p>@SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包</p><h3 id="Autowired依赖注入"><a href="#Autowired依赖注入" class="headerlink" title="Autowired依赖注入"></a>Autowired依赖注入</h3><p>基于@Autowired进行依赖注入的常见方式有如下三种:</p><ol><li><p>属性注入</p><p>优点:代码简洁、方便快速开发。</p><p>缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性</p></li></ol><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/%E5%B1%9E%E6%80%A7%E6%B3%A8%E5%85%A5.png" alt="属性注入"></p><ol start="2"><li><p>构造器注入</p><p>可以不写无参构造器。如果当前类中只存在一个构造函数,还可以省略@Autowired 注解</p><p>优点:能清晰地看到类的依赖关系、提高了代码的安全性。</p><p>缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。</p><p>注意:如果只有一个构造函数,@Autowired注解可以省略。</p></li></ol><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/%E6%9E%84%E9%80%A0%E5%99%A8%E6%B3%A8%E5%85%A5.png" alt="构造器注入"></p><ol start="3"><li><p>setter注入</p><p>优点:保持了类的封装性,依赖关系更清晰。<br>缺点:需要额外编写setter方法,增加了代码量。</p></li></ol><p><img src="/images/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/setter%E6%B3%A8%E5%85%A5.png" alt="setter注入"></p><h3 id="Autowired-衍生"><a href="#Autowired-衍生" class="headerlink" title="@Autowired 衍生"></a>@Autowired 衍生</h3><p>@Autowired注解,默认是按照类型进行注入的<br>如果存在多个相同类型的bean,将会报错</p><p>解决方法:</p><ol><li>使用@Primary</li></ol><ul><li>这个注解用于指定当有多个相同类型的bean时,哪一个bean应该被优先考虑。当你通过类型来自动装配(autowire)一个bean时,如果有多个候选者,Spring容器会根据@Primary注解来决定使用哪一个。如果没有指定@Primary,Spring容器可能会抛出异常,因为它不知道应该选择哪一个。</li><li>例如,如果你有两个实现了相同接口的bean,你可以在一个bean上使用@Primary,这样当通过接口类型注入时,就会使用这个被标记为@Primary的bean。</li></ul><ol start="2"><li>搭配@Qualifier使用 @Autowired + @Qualifier</li></ol><ul><li>当你想要精确控制Spring容器应该注入哪一个bean时,可以使用@Qualifier注解。它通常与@Autowired注解一起使用,用于消除歧义,当你有多个相同类型的bean时,@Qualifier注解允许你指定注入哪一个具体的bean。</li><li>例如,如果你有两个名为”dataSource”的bean,你可以在注入时使用@Qualifier(“dataSource1”)来指定注入哪一个。</li></ul><ol start="3"><li>使用@Resource</li></ol><ul><li>@Resource注解是由Java EE提供的,它也可以用来注入bean,但与@Autowired不同,@Resource注解既可以根据类型注入,也可以根据名称注入。当没有指定name属性时,它会尝试根据字段名或setter方法的参数名来匹配bean。</li><li>@Resource注解有一个name属性,你可以指定一个bean的名称来注入特定的bean。如果没有指定name属性,它会根据字段名或setter方法的参数名来注入匹配的bean。</li><li>例如,如果你有一个名为”dataSource”的bean,你可以在需要注入的地方使用@Resource(name=”dataSource”)来指定注入这个bean。</li></ul><p>@Resource 与 @Autowired 的区别:</p><ol><li>@Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的</li><li>@Autowired默认是按照类型注入,而Resource默认是按照名称注入</li></ol>]]></content>
<summary type="html">SpringBoot中对三层架构进行分层与解耦</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/Java/"/>
<category term="开发工具" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
<category term="框架" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E6%A1%86%E6%9E%B6/"/>
<category term="SpringBoot" scheme="https://lathezero.github.io/tags/SpringBoot/"/>
<category term="Java" scheme="https://lathezero.github.io/tags/Java/"/>
<category term="后端开发" scheme="https://lathezero.github.io/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="分层解耦" scheme="https://lathezero.github.io/tags/%E5%88%86%E5%B1%82%E8%A7%A3%E8%80%A6/"/>
<category term="框架" scheme="https://lathezero.github.io/tags/%E6%A1%86%E6%9E%B6/"/>
</entry>
<entry>
<title>Markdown 写作指南</title>
<link href="https://lathezero.github.io/2024/12/28/reference/markdown-guide/"/>
<id>https://lathezero.github.io/2024/12/28/reference/markdown-guide/</id>
<published>2024-12-28T00:00:00.000Z</published>
<updated>2025-01-06T13:57:03.746Z</updated>
<content type="html"><![CDATA[<h2 id="文章头部格式-Frontmatter"><a href="#文章头部格式-Frontmatter" class="headerlink" title="文章头部格式 (Frontmatter)"></a>文章头部格式 (Frontmatter)</h2><p>每篇文章都需要包含以下头部信息:</p><figure class="highlight markdown"><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">title: 文章标题</span><br><span class="line">date: '2024-12-28' # 日期格式:YYYY-MM-DD</span><br><span class="line">author: 作者名</span><br><span class="line">excerpt: 文章摘要,会显示在列表页...</span><br><span class="line">tags: ['标签1', '标签2', '标签3']</span><br><span class="line"><span class="section">readTime: 5 # 预计阅读时间(分钟)</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><h2 id="代码块语法高亮"><a href="#代码块语法高亮" class="headerlink" title="代码块语法高亮"></a>代码块语法高亮</h2><h3 id="常用编程语言"><a href="#常用编程语言" class="headerlink" title="常用编程语言"></a>常用编程语言</h3><figure class="highlight javascript"><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="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">const</span> hello = <span class="string">"world"</span>;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(hello);</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// Java</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Hello</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"> System.out.println(<span class="string">"Hello World"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight python"><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="comment"># Python</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">hello</span>():</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"Hello World"</span>)</span><br></pre></td></tr></table></figure><figure class="highlight typescript"><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 class="comment">// TypeScript</span></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">User</span> {</span><br><span class="line"> <span class="attr">name</span>: <span class="built_in">string</span>;</span><br><span class="line"> <span class="attr">age</span>: <span class="built_in">number</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="标记语言"><a href="#标记语言" class="headerlink" title="标记语言"></a>标记语言</h3><figure class="highlight html"><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"><span class="comment"><!-- HTML --></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>Hello World<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- XML --></span></span><br><span class="line"><span class="tag"><<span class="name">root</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">child</span>></span>Content<span class="tag"></<span class="name">child</span>></span></span><br><span class="line"><span class="tag"></<span class="name">root</span>></span></span><br></pre></td></tr></table></figure><figure class="highlight css"><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 class="comment">/* CSS */</span></span><br><span class="line"><span class="selector-class">.container</span> {</span><br><span class="line"> <span class="attribute">display</span>: flex;</span><br><span class="line"> <span class="attribute">justify-content</span>: center;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><figure class="highlight yaml"><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 class="comment"># YAML</span></span><br><span class="line"><span class="attr">version:</span> <span class="string">'3'</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"> <span class="attr">web:</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">nginx</span></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></pre></td><td class="code"><pre><span class="line"><span class="comment">// JSON</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"project"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"version"</span><span class="punctuation">:</span> <span class="string">"1.0.0"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><h3 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h3><figure class="highlight sql"><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"><span class="comment">-- SQL</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> users <span class="keyword">WHERE</span> age <span class="operator">></span> <span class="number">18</span>;</span><br></pre></td></tr></table></figure><h3 id="命令行"><a href="#命令行" class="headerlink" title="命令行"></a>命令行</h3><figure class="highlight bash"><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="comment"># Bash</span></span><br><span class="line">npm install react</span><br><span class="line">git commit -m <span class="string">"message"</span></span><br></pre></td></tr></table></figure><figure class="highlight powershell"><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"><span class="comment"># PowerShell</span></span><br><span class="line"><span class="built_in">Set-Location</span> C:\Projects</span><br></pre></td></tr></table></figure><h3 id="其他格式"><a href="#其他格式" class="headerlink" title="其他格式"></a>其他格式</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">纯文本内容,不需要语法高亮</span><br></pre></td></tr></table></figure><figure class="highlight diff"><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"><span class="deletion">- 这行会显示为红色(删除)</span></span><br><span class="line"><span class="addition">+ 这行会显示为绿色(添加)</span></span><br></pre></td></tr></table></figure><h2 id="文本格式化"><a href="#文本格式化" class="headerlink" title="文本格式化"></a>文本格式化</h2><h3 id="标题"><a href="#标题" class="headerlink" title="标题"></a>标题</h3><h1 id="一级标题"><a href="#一级标题" class="headerlink" title="一级标题"></a>一级标题</h1><h2 id="二级标题"><a href="#二级标题" class="headerlink" title="二级标题"></a>二级标题</h2><h3 id="三级标题"><a href="#三级标题" class="headerlink" title="三级标题"></a>三级标题</h3><h4 id="四级标题"><a href="#四级标题" class="headerlink" title="四级标题"></a>四级标题</h4><h3 id="文本样式"><a href="#文本样式" class="headerlink" title="文本样式"></a>文本样式</h3><p><strong>粗体文本</strong><br><em>斜体文本</em><br><del>删除线文本</del><br><code>行内代码</code></p><h3 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h3><p>无序列表:</p><ul><li>项目 1</li><li>项目 2<ul><li>子项目 2.1</li><li>子项目 2.2</li></ul></li></ul><p>有序列表:</p><ol><li>第一步</li><li>第二步<ol><li>子步骤 2.1</li><li>子步骤 2.2</li></ol></li></ol><h3 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h3><blockquote><p>这是一段引用文本<br>可以有多行</p></blockquote><h3 id="表格"><a href="#表格" class="headerlink" title="表格"></a>表格</h3><table><thead><tr><th>列1</th><th>列2</th><th>列3</th></tr></thead><tbody><tr><td>内容1</td><td>内容2</td><td>内容3</td></tr><tr><td>内容4</td><td>内容5</td><td>内容6</td></tr></tbody></table><h3 id="链接和图片"><a href="#链接和图片" class="headerlink" title="链接和图片"></a>链接和图片</h3><p><a href="https://example.com/">链接文本</a></p><p><img src="/images/markdown-guide/example.gif" alt="图片描述"></p><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><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">src/</span><br><span class="line"> └── posts/</span><br><span class="line"> ├── 2024/</span><br><span class="line"> │ ├── article1.md</span><br><span class="line"> │ └── article2.md</span><br><span class="line"> ├── 2025/</span><br><span class="line"> │ └── article3.md</span><br><span class="line"> └── reference/</span><br><span class="line"> └── markdown-guide.md</span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ol><li>确保每个代码块都指定了正确的语言</li><li>图片路径使用相对路径,从当前文件位置开始</li><li>保持文件名全小写,使用连字符分隔</li><li>标签使用有意义的关键词</li><li>合理估计阅读时间</li></ol><h2 id="常见问题解决"><a href="#常见问题解决" class="headerlink" title="常见问题解决"></a>常见问题解决</h2><ol><li><p>图片不显示</p><ul><li>检查图片路径是否正确</li><li>确保图片文件存在</li><li>使用正斜杠(/)而不是反斜杠()</li></ul></li><li><p>代码高亮失效</p><ul><li>检查语言标识是否正确</li><li>确保代码块使用三个反引号</li><li>语言标识要小写</li></ul></li><li><p>格式混乱</p><ul><li>检查 frontmatter 格式</li><li>确保使用正确的缩进</li><li>保持一致的换行风格</li></ul></li></ol>]]></content>
<summary type="html">这是一个完整的 Markdown 写作指南,包含代码高亮、格式化等常用功能的示例...</summary>
<category term="Markdown" scheme="https://lathezero.github.io/tags/Markdown/"/>
<category term="写作指南" scheme="https://lathezero.github.io/tags/%E5%86%99%E4%BD%9C%E6%8C%87%E5%8D%97/"/>
<category term="参考文档" scheme="https://lathezero.github.io/tags/%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/"/>
</entry>
<entry>
<title>MySQL 基础教程</title>
<link href="https://lathezero.github.io/2024/12/23/2024/MySQL/"/>
<id>https://lathezero.github.io/2024/12/23/2024/MySQL/</id>
<published>2024-12-23T00:00:00.000Z</published>
<updated>2024-12-29T08:47:46.907Z</updated>
<content type="html"><![CDATA[<h1 id="DDL数据库定义语言"><a href="#DDL数据库定义语言" class="headerlink" title="DDL数据库定义语言"></a>DDL数据库定义语言</h1><h2 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h2><h4 id="操作语法"><a href="#操作语法" class="headerlink" title="操作语法"></a>操作语法</h4><ol><li><p>查询所有数据库</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> databases;</span><br></pre></td></tr></table></figure></li><li><p>查询当前数据库</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> database();</span><br></pre></td></tr></table></figure></li><li><p>使用/切换数据库</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">use 数据库名;</span><br></pre></td></tr></table></figure></li><li><p>创建数据库</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">create</span> database [if <span class="keyword">not</span> <span class="keyword">exists</span>] 数据库名 [<span class="keyword">default</span> charset utf8mb4];</span><br></pre></td></tr></table></figure><p>MySQL8.0 版本及以上字符集默认为 utf8mb4</p></li><li><p>删除数据库</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">drop</span> database [if existe] 数据库名;</span><br></pre></td></tr></table></figure></li></ol><h4 id="以上的-database-均可替换成-plaintext-schema-如-sql-creat-schema-database-db01"><a href="#以上的-database-均可替换成-plaintext-schema-如-sql-creat-schema-database-db01" class="headerlink" title="以上的 database 均可替换成 plaintext schema 如: sql creat schema database db01;"></a>以上的 database 均可替换成 <code>plaintext schema</code> 如: <code>sql creat schema database db01;</code></h4><p>注:在 show 语句中把 databases 替换成 schemas 需要加 s 作为复数形式</p><h2 id="表结构"><a href="#表结构" class="headerlink" title="表结构"></a>表结构</h2><h4 id="创建"><a href="#创建" class="headerlink" title="创建"></a>创建</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></pre></td><td class="code"><pre><span class="line">creat <span class="keyword">table</span> tablename (</span><br><span class="line">字段<span class="number">1</span> 字段类型 [约束] [comment 字段<span class="number">1</span>注释],</span><br><span class="line">字段<span class="number">2</span> 字段类型 [约束] [comment 字段<span class="number">2</span>注释]</span><br><span class="line">)[comment 表注释];</span><br></pre></td></tr></table></figure><p>约束:非空约束<code>plaintext not null</code></p><p>唯一约束<code>plaintext unique</code></p><p>主键约束<code>plaintext primary key</code></p><p>默认约束<code>plaintext default</code></p><p>外健约束<code>plaintext foreign key</code></p><h4 id="查询、修改、删除"><a href="#查询、修改、删除" class="headerlink" title="查询、修改、删除"></a>查询、修改、删除</h4><ol><li><p>查询当前数据库所有表</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> tables</span><br></pre></td></tr></table></figure></li><li><p>查看表结构</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>查询建表语句</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> <span class="keyword">create table</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>添加字段</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter table</span> 表名 <span class="keyword">add</span> 字段名 类型 [约束] [注释];</span><br></pre></td></tr></table></figure></li><li><p>修改字段类型</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter table</span> 表名 modify 字段名 类型 [注释];</span><br></pre></td></tr></table></figure></li><li><p>修改字段名</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter table</span> 表名 change 字段名 新字段名 类型 [注释];</span><br></pre></td></tr></table></figure></li><li><p>删除字段</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter table</span> 表名 <span class="keyword">drop</span> <span class="keyword">column</span> 字段名;</span><br></pre></td></tr></table></figure></li><li><p>修改表名</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alter table</span> 表名 rename <span class="keyword">to</span> 新表名;</span><br></pre></td></tr></table></figure></li><li><p>删除表</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> 表名;</span><br></pre></td></tr></table></figure></li></ol><h1 id="DML-数据库操作语言-增删改"><a href="#DML-数据库操作语言-增删改" class="headerlink" title="DML 数据库操作语言 增删改"></a>DML 数据库操作语言 增删改</h1><h3 id="insert"><a href="#insert" class="headerlink" title="insert"></a>insert</h3><ol><li><p>指定字段添加数据 *</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert into</span> 表名 (字段<span class="number">1</span>,字段<span class="number">2.</span>..) <span class="keyword">values</span> (值<span class="number">1</span>,值<span class="number">2</span>);</span><br></pre></td></tr></table></figure></li><li><p>全部字段添加数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert into</span> 表名 <span class="keyword">values</span> (值<span class="number">1</span>,值<span class="number">2</span>);</span><br></pre></td></tr></table></figure></li><li><p>指定字段批量添加数据 *</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert into</span> 表名 (字段<span class="number">1</span>,字段<span class="number">2.</span>..) <span class="keyword">values</span> (值<span class="number">1</span>,值<span class="number">2</span>), (值<span class="number">1</span>,值<span class="number">2</span>);</span><br></pre></td></tr></table></figure></li><li><p>全部字段批量添加数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">insert into</span> 表名 <span class="keyword">values</span> (值<span class="number">1</span>,值<span class="number">2</span>), (值<span class="number">1</span>,值<span class="number">2</span>);</span><br></pre></td></tr></table></figure></li></ol><h3 id="updata"><a href="#updata" class="headerlink" title="updata"></a>updata</h3><ol><li><p>修改单个数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">updata 表名 <span class="keyword">set</span> 字段 <span class="operator">=</span> <span class="string">'值'</span>, 字段 <span class="operator">=</span> <span class="string">'值'</span> [<span class="keyword">where</span> id <span class="operator">=</span> <span class="string">'值'</span>];</span><br></pre></td></tr></table></figure></li><li><p>修改全部数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">updata 表名 <span class="keyword">set</span> 字段 <span class="operator">=</span> <span class="string">'值'</span>, 字段 <span class="operator">=</span> <span class="string">'值'</span>;</span><br></pre></td></tr></table></figure></li></ol><h3 id="dalete"><a href="#dalete" class="headerlink" title="dalete"></a>dalete</h3><ol><li><p>删除单条数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">delete</span> <span class="keyword">from</span> 表名 <span class="keyword">where</span> id <span class="operator">=</span> <span class="string">'值'</span>;</span><br></pre></td></tr></table></figure></li><li><p>删除全部数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">delete</span> <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li></ol><h1 id="DQl"><a href="#DQl" class="headerlink" title="DQl"></a>DQl</h1><h4 id="基本查询"><a href="#基本查询" class="headerlink" title="基本查询"></a>基本查询</h4><ol><li><p>查询多个字段</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> 字段<span class="number">1</span>,字段<span class="number">2</span>,字段<span class="number">3</span> <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>查询所有字段</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>为查询字段设置别名,as 关键字可以省略</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> 字段<span class="number">1</span> [<span class="keyword">as</span> 别名<span class="number">1</span>],字段<span class="number">2</span>[<span class="keyword">as</span> 别名<span class="number">2</span>] <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>去除重复记录</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> 字段列表 <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li></ol><h4 id="条件查询"><a href="#条件查询" class="headerlink" title="条件查询"></a>条件查询</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> 字段列表 <span class="keyword">from</span> 表名 <span class="keyword">where</span> 条件列表;</span><br></pre></td></tr></table></figure><h4 id="聚合函数"><a href="#聚合函数" class="headerlink" title="聚合函数"></a>聚合函数</h4><ol><li><p>count</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(id) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="number">1</span>) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li><li><p>其他</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">max</span>(字段) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">min</span>(字段) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(字段) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">sum</span>(字段) <span class="keyword">from</span> 表名;</span><br></pre></td></tr></table></figure></li></ol><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><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">select</span></span><br><span class="line">字段列表</span><br><span class="line"><span class="keyword">from</span></span><br><span class="line">表名列表</span><br><span class="line"><span class="keyword">where</span></span><br><span class="line">条件列表</span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span></span><br><span class="line">分组字段列表</span><br><span class="line"><span class="keyword">having</span></span><br><span class="line">分组后条件列表</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span></span><br><span class="line">排序字段列表</span><br><span class="line">limit</span><br><span class="line">分页参数</span><br></pre></td></tr></table></figure><h4 id="分组查询"><a href="#分组查询" class="headerlink" title="分组查询"></a>分组查询</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> 字段列表 <span class="keyword">from</span> 表名 [<span class="keyword">where</span> 条件列表] <span class="keyword">group</span> <span class="keyword">by</span> 分组字段名 [<span class="keyword">having</span> 分组后过滤条件];</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> job, <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp <span class="keyword">where</span> data <span class="operator"><=</span> <span class="string">'2015-01-01'</span> <span class="keyword">group</span> <span class="keyword">by</span> job havin <span class="built_in">count</span>(<span class="operator">*</span>) <span class="operator">>=</span> <span class="number">2</span>;</span><br></pre></td></tr></table></figure><p>where 和 havin 的区别:</p><ol><li>执行时机不同 (where -> group by -> having)</li><li>判断条件不同 (having 后可以用聚合函数,where 不可以)</li></ol><h4 id="排序查询"><a href="#排序查询" class="headerlink" title="排序查询"></a>排序查询</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> 字段列表 <span class="keyword">from</span> 表名 [<span class="keyword">where</span> 条件列表] [<span class="keyword">group</span> <span class="keyword">by</span> 分组字段名 <span class="keyword">having</span> 分组后过滤条件] <span class="keyword">order</span> <span class="keyword">by</span> 排序字段 排序方式</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> entry_date <span class="keyword">asc</span>, update_time <span class="keyword">desc</span>;</span><br></pre></td></tr></table></figure><p>升序:asc (默认) 降序:desc</p><h4 id="分页查询"><a href="#分页查询" class="headerlink" title="分页查询"></a>分页查询</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">selece 字段列表 <span class="keyword">from</span> 表名 [<span class="keyword">where</span> 条件] [<span class="keyword">group</span> <span class="keyword">by</span> 分组字段 <span class="keyword">having</span> 过滤条件] [<span class="keyword">order</span> <span class="keyword">by</span> 排序字段] limit 起始索引, 查询记录数;</span><br></pre></td></tr></table></figure><p>起始索引为 0 时可以省略</p>]]></content>
<summary type="html">MySQL 是最流行的关系型数据库之一,本文将介绍其基本概念和常用命令...</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="数据库" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
<category term="MySQL" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/"/>
<category term="教程指南" scheme="https://lathezero.github.io/categories/%E6%95%99%E7%A8%8B%E6%8C%87%E5%8D%97/"/>
<category term="入门教程" scheme="https://lathezero.github.io/categories/%E6%95%99%E7%A8%8B%E6%8C%87%E5%8D%97/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/"/>
<category term="后端开发" scheme="https://lathezero.github.io/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="MySQL" scheme="https://lathezero.github.io/tags/MySQL/"/>
<category term="数据库" scheme="https://lathezero.github.io/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
</entry>
<entry>
<title>解决 phpstudy 和本地 mysql 不兼容问题</title>
<link href="https://lathezero.github.io/2024/12/23/2024/mysql_and_phpstudy/"/>
<id>https://lathezero.github.io/2024/12/23/2024/mysql_and_phpstudy/</id>
<published>2024-12-23T00:00:00.000Z</published>
<updated>2025-01-06T13:56:33.230Z</updated>
<content type="html"><![CDATA[<h2 id="首先正常安装并且初始化-mysql"><a href="#首先正常安装并且初始化-mysql" class="headerlink" title="首先正常安装并且初始化 mysql"></a>首先正常安装并且初始化 mysql</h2><ol><li><h3 id="先删除-mysql-的服务,使用-cmd-管理员模式输入以下指令"><a href="#先删除-mysql-的服务,使用-cmd-管理员模式输入以下指令" class="headerlink" title="先删除 mysql 的服务,使用 cmd 管理员模式输入以下指令"></a>先删除 mysql 的服务,使用 cmd 管理员模式输入以下指令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sc delete mysql</span><br></pre></td></tr></table></figure><p>成功后弹出 “[SC] DeleteService SUCCESS”</p><p>注:若安装 mysql 后没有运行 <code>bash mysqld -install</code>命令,则跳过第一步</p></li><li><h3 id="注册新的-mysql-服务"><a href="#注册新的-mysql-服务" class="headerlink" title="注册新的 mysql 服务"></a>注册新的 mysql 服务</h3><ol><li><p>打开 cmd 管理员模式,导航到 mysql 的 bin 文件目录,例:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> D:\mysql-9.1.0-winx64\bin</span><br></pre></td></tr></table></figure><p>或者直接打开 bin 文件,然后在上面文件路径中输入 cmd 然后进入到 cmd 界面</p></li><li><p>注册 mysql 服务,并且为服务起一个新名字,例:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysqld -install mysql9</span><br></pre></td></tr></table></figure><p>成功后弹出 “Service successfully installed”</p></li></ol></li><li><h3 id="试运行-mysql"><a href="#试运行-mysql" class="headerlink" title="试运行 mysql"></a>试运行 mysql</h3><p>输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">net start mysql9</span><br></pre></td></tr></table></figure></li></ol>]]></content>
<summary type="html">解决 phpstudy 和本地 mysql 不兼容问题</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="数据库" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
<category term="MySQL" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/"/>
<category term="问题解决" scheme="https://lathezero.github.io/categories/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/"/>
<category term="环境配置" scheme="https://lathezero.github.io/categories/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE/"/>
<category term="后端开发" scheme="https://lathezero.github.io/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="MySQL" scheme="https://lathezero.github.io/tags/MySQL/"/>
<category term="phpstudy" scheme="https://lathezero.github.io/tags/phpstudy/"/>
</entry>
<entry>
<title>微信小程序开发iPhone底部因为横杠适配有问题</title>
<link href="https://lathezero.github.io/2024/12/22/2024/wechat-miniapp/"/>
<id>https://lathezero.github.io/2024/12/22/2024/wechat-miniapp/</id>
<published>2024-12-22T00:00:00.000Z</published>
<updated>2025-01-06T13:56:54.189Z</updated>
<content type="html"><![CDATA[<p>在做一个商城小程序开发的时候遇到的一个问题,有些 iphone 手机最下边有一个横条,就像这样:</p><p><img src="/images/wechat-miniapp/wechatminiapp.png" alt="wechatminiapp"></p><p>当我们正常开发的时候就会变成:</p><p><img src="/images/wechat-miniapp/wechatminiapp2.png" alt="wechatminiapp2"></p><p>如果加一条 margin-bottom 适配就变得没问题了,但是如果在没有这条横杠的手机上就会变得很奇怪:</p><p><img src="/images/wechat-miniapp/wechatminiapp3.png" alt="wechatminiapp3"></p><p>解决办法:</p><p>增加一条 css 样式 <code>padding-bottom: env(safe-area-inset-bottom);</code></p><p>这用于设置元素的底部内边距。这里的<code>env()</code>函数是一个CSS环境变量函数,它允许你根据设备的特定环境特性来设置样式值。</p><p><code>safe-area-inset-bottom</code>是一个特定的环境变量,它返回的是设备屏幕底部安全区域的内边距值。安全区域是指在屏幕边缘(如刘海、圆角、传感器等)不会遮挡内容的区域。在一些设备上,尤其是带有刘海或圆角的手机屏幕上,内容可能会被这些屏幕特征遮挡,因此开发者需要避免在这些区域放置重要内容。</p><p>使用<code>env(safe-area-inset-bottom)</code>的好处是,它能够自动适应不同设备的屏幕形状和尺寸,确保内容不会被遮挡。这样,开发者就不需要硬编码一个固定的值,而是可以动态地根据设备的安全区域来调整布局。</p><p>简而言之,<code>padding-bottom: env(safe-area-inset-bottom);</code> 意味着元素的底部内边距将等于设备底部安全区域的内边距,从而确保内容不会被屏幕底部的任何遮挡物(如刘海)遮挡。</p>]]></content>
<summary type="html">微信小程序开发iPhone底部因为横杠适配问题解决</summary>
<category term="前端开发" scheme="https://lathezero.github.io/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="微信小程序" scheme="https://lathezero.github.io/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
<category term="问题解决" scheme="https://lathezero.github.io/categories/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/"/>
<category term="UI适配" scheme="https://lathezero.github.io/categories/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/UI%E9%80%82%E9%85%8D/"/>
<category term="微信小程序" scheme="https://lathezero.github.io/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/"/>
<category term="前端开发" scheme="https://lathezero.github.io/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>Maven 配置与创建</title>
<link href="https://lathezero.github.io/2024/12/16/2024/maven/"/>
<id>https://lathezero.github.io/2024/12/16/2024/maven/</id>
<published>2024-12-16T00:00:00.000Z</published>
<updated>2025-01-06T13:56:28.081Z</updated>
<content type="html"><![CDATA[<h2 id="配置Maven文件:"><a href="#配置Maven文件:" class="headerlink" title="配置Maven文件:"></a>配置Maven文件:</h2><p>下载maven bin-zip文件,解压。</p><h3 id="官网:"><a href="#官网:" class="headerlink" title="官网:"></a>官网:</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">http://maven.apache.org/</span><br></pre></td></tr></table></figure><ol><li>修改conf/settings.xml 中的 <localRepository>(大概第53行) 标签内容为maven包路径位置,例:</localRepository></li></ol><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"><<span class="name">localRepository</span>></span>D:\apache-maven-3.9.9\<span class="tag"></<span class="name">localRepository</span>></span></span><br></pre></td></tr></table></figure><ol start="2"><li>配置阿里云私服:修改conf/settings.xml 中的 <mirrors> 标签内容,添加如下内容:</mirrors></li></ol><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>alimaven<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>aliyun maven<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/groups/public<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mirror</span>></span></span><br></pre></td></tr></table></figure><ol start="3"><li>配置环境变量:复制maven包下的bin地址,添加到path环境变量</li></ol><h2 id="在idea中配置maven:"><a href="#在idea中配置maven:" class="headerlink" title="在idea中配置maven:"></a>在idea中配置maven:</h2><ol><li><p>打开 idea => File | Settings | Build, Execution, Deployment | Build Tools | Maven</p></li><li><p>Maven home path: 选择 maven 包路径,例:</p></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">D:\apache-maven-3.9.9\</span><br></pre></td></tr></table></figure><ol start="3"><li>User settings file: 选择 maven 包中的conf/settings.xml,例:</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">D:\apache-maven-3.9.9\conf\settings.xml</span><br></pre></td></tr></table></figure><ol start="4"><li>把User settings file 和 Local repository 勾选上,点击 Apply 和 OK</li></ol><h2 id="创建maven项目:"><a href="#创建maven项目:" class="headerlink" title="创建maven项目:"></a>创建maven项目:</h2><ol><li>创建一个空项目</li><li>点击右上角齿轮 => Projext Structure</li><li>SDK:选择你的 jdk</li></ol><h2 id="创建maven模块:"><a href="#创建maven模块:" class="headerlink" title="创建maven模块:"></a>创建maven模块:</h2><p>同上</p><ol><li>新建项目,选择Maven Archetype,Name、Location随意</li><li>Archetype 选择 quickstart</li><li>下面Advanced Settings:<ol><li>Groupld:组织名称</li><li>Artifactld:模块名称</li></ol></li></ol><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p><img src="/images/maven/mavenuse.png" alt="mavenuse"></p>]]></content>
<summary type="html">Maven 基础配置与创建</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/Java/"/>
<category term="开发工具" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
<category term="构建工具" scheme="https://lathezero.github.io/categories/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/%E6%9E%84%E5%BB%BA%E5%B7%A5%E5%85%B7/"/>
<category term="Java" scheme="https://lathezero.github.io/tags/Java/"/>
<category term="后端开发" scheme="https://lathezero.github.io/tags/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="Maven" scheme="https://lathezero.github.io/tags/Maven/"/>
<category term="项目管理" scheme="https://lathezero.github.io/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>Java 实现各排序算法</title>
<link href="https://lathezero.github.io/2024/09/28/2024/sortAlgorithm/"/>
<id>https://lathezero.github.io/2024/09/28/2024/sortAlgorithm/</id>
<published>2024-09-27T16:00:00.000Z</published>
<updated>2024-12-31T00:37:07.801Z</updated>
<content type="html"><![CDATA[<h1 id="冒泡排序"><a href="#冒泡排序" class="headerlink" title="冒泡排序"></a>冒泡排序</h1><p> 当有一次循环没有进行交换时,则已经有序,直接打破。</p><h1 id="冒泡排序-1"><a href="#冒泡排序-1" class="headerlink" title="冒泡排序"></a>冒泡排序</h1><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">public static void maopao(int[] arr) {</span><br><span class="line"> for (int i = 0; i < arr.length - 1; i++) {</span><br><span class="line"> boolean flag = true;</span><br><span class="line"> for (int j = 0; j < arr.length - 1 - i; j++) {</span><br><span class="line"> if (arr[j] > arr[j + 1]) {</span><br><span class="line"> flag = false;</span><br><span class="line"> int temp = arr[j];</span><br><span class="line"> arr[j] = arr[j + 1];</span><br><span class="line"> arr[j + 1] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> if (flag) {</span><br><span class="line"> break;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="选择排序"><a href="#选择排序" class="headerlink" title="选择排序"></a>选择排序</h1><p> 每次找出最小值和最大值进行左右交换,当最小值和最大值索引相同时,应更新最大值索引(先交换最小值时)</p><h1 id="选择排序-1"><a href="#选择排序-1" class="headerlink" title="选择排序"></a>选择排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void xuanze(int[] arr) {</span><br><span class="line"> for (int i = 0; i < arr.length / 2; i++) {</span><br><span class="line"> int min = arr[i];</span><br><span class="line"> int minIndex = i;</span><br><span class="line"> int max = arr[i];</span><br><span class="line"> int maxIndex = i;</span><br><span class="line"> int len = arr.length - 1 - i;</span><br><span class="line"></span><br><span class="line"> for (int j = i + 1; j <= len; j++) {</span><br><span class="line"> if (min > arr[j]) {</span><br><span class="line"> min = arr[j];</span><br><span class="line"> minIndex = j;</span><br><span class="line"> }</span><br><span class="line"> if (max < arr[j]) {</span><br><span class="line"> max = arr[j];</span><br><span class="line"> maxIndex = j;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> if (minIndex != i) {</span><br><span class="line"> arr[minIndex] = arr[i];</span><br><span class="line"> arr[i] = min;</span><br><span class="line"> if (maxIndex == i) {</span><br><span class="line"> maxIndex = minIndex; //如果最大值和最小值互换,则最大值下标也要互换</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> if (maxIndex != len) {</span><br><span class="line"> arr[maxIndex] = arr[len];</span><br><span class="line"> arr[len] = max;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="插入排序"><a href="#插入排序" class="headerlink" title="插入排序"></a>插入排序</h1><p> 从1开始,到len - 1。</p><h1 id="插入排序-1"><a href="#插入排序-1" class="headerlink" title="插入排序"></a>插入排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void charu(int[] arr) {</span><br><span class="line"> for (int i = 1; i < arr.length; i++) {</span><br><span class="line"> int insertIndex = i;</span><br><span class="line"> int insertValue = arr[i];</span><br><span class="line"> while (insertIndex > 0 && insertValue < arr[insertIndex - 1]) {</span><br><span class="line"> arr[insertIndex] = arr[insertIndex - 1];</span><br><span class="line"> insertIndex--;</span><br><span class="line"> }</span><br><span class="line"> arr[insertIndex] = insertValue;</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="希尔排序"><a href="#希尔排序" class="headerlink" title="希尔排序"></a>希尔排序</h1><p> 插入式间隔为gap的插入式排序 gap一般为数组元素个数的二分之一</p><ol><li>创建一个gap循环体,每循环一次gap /= 2。</li><li>在gap循环体内创建一个步长为gap的循环体,循环gap到arr.length的元素。</li><li>与insertIndex - gap比较,选择是否插入。</li></ol><h1 id="希尔排序-1"><a href="#希尔排序-1" class="headerlink" title="希尔排序"></a>希尔排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void xier(int[] arr) {</span><br><span class="line"> for (int gap = arr.length / 2; gap > 0; gap /= 2) {</span><br><span class="line"> for (int i = gap; i < arr.length; i++) {</span><br><span class="line"> int insertIndex = i;</span><br><span class="line"> int insertValue = arr[i];</span><br><span class="line"> while (insertIndex - gap >= 0 && insertValue < arr[insertIndex - gap]) {</span><br><span class="line"> arr[insertIndex] = arr[insertIndex - gap];</span><br><span class="line"> insertIndex -= gap;</span><br><span class="line"> }</span><br><span class="line"> arr[insertIndex] = insertValue;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="快速排序"><a href="#快速排序" class="headerlink" title="快速排序"></a>快速排序</h1><p> 定义一个基准值和左右指针,把小于基准值的放左边,大于基准值的放右边</p><h1 id="快速排序-1"><a href="#快速排序-1" class="headerlink" title="快速排序"></a>快速排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void quickSort(int[] arr, int left, int right) {</span><br><span class="line"> int l = left, r = right;</span><br><span class="line"> if (left >= right) {return;}</span><br><span class="line"> while (l < r) {</span><br><span class="line"> while (l < r && arr[r] >= arr[left]) r--;</span><br><span class="line"> while (l < r && arr[l] <= arr[left]) l++;</span><br><span class="line"> if (l < r) {</span><br><span class="line"> swap(arr, l, r);</span><br><span class="line"> }</span><br><span class="line"> }swap(arr, left, l);</span><br><span class="line"> quickSort(arr, left, l -1);</span><br><span class="line"> quickSort(arr, r + 1, right);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="归并排序"><a href="#归并排序" class="headerlink" title="归并排序"></a>归并排序</h1><h1 id="归并排序-1"><a href="#归并排序-1" class="headerlink" title="归并排序"></a>归并排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void mergeSort(int[] arr, int left, int right , int[] temp) {</span><br><span class="line"> if (left < right) {</span><br><span class="line"> int mid = ((left + right) / 2);</span><br><span class="line"> mergeSort(arr, left, mid, temp);</span><br><span class="line"> mergeSort(arr, mid + 1, right, temp);</span><br><span class="line"> merge(arr, left, mid, right, temp);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> public static void merge(int[] arr, int left, int mid, int right, int[] temp) {</span><br><span class="line"> int i = left, j = mid + 1, t = 0;</span><br><span class="line"> while (i <= mid && j <= right) {</span><br><span class="line"> if (arr[i] < arr[j]) {</span><br><span class="line"> temp[t] = arr[i];</span><br><span class="line"> t++; i++;</span><br><span class="line"> }else {</span><br><span class="line"> temp[t] = arr[j];</span><br><span class="line"> t++; j++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> while (i <= mid) {</span><br><span class="line"> temp[t] = arr[i];</span><br><span class="line"> t++; i++;</span><br><span class="line"> }</span><br><span class="line"> while (j <= right) {</span><br><span class="line"> temp[t] = arr[j];</span><br><span class="line"> t++; j++;</span><br><span class="line"> }</span><br><span class="line"> int leftIndex = left;</span><br><span class="line"> t = 0;</span><br><span class="line"> while (leftIndex <= right) {</span><br><span class="line"> arr[leftIndex] = temp[t];</span><br><span class="line"> leftIndex++; t++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="基数排序"><a href="#基数排序" class="headerlink" title="基数排序"></a>基数排序</h1><ol><li>创建一个二维数组(桶),存储桶的个数和每个桶可存储的元素的个数。</li><li>创建一个数组用来记录每个桶存储的元素的个数。</li><li>遍历数组,找出最大的数,计算出它的位数有几位。</li><li>写一个循环次数为‘位数’的循环体,然后遍历数组,把元素放进对应的桶里。</li><li>把桶里的元素放回原数组,并清空该桶的元素。</li></ol><h1 id="基数排序-1"><a href="#基数排序-1" class="headerlink" title="基数排序"></a>基数排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void radixSort(int[] arr) {</span><br><span class="line"> int[][] bucket = new int[10][arr.length];</span><br><span class="line"> int[] bucketElementcounts = new int[10];</span><br><span class="line"> int max = arr[0];</span><br><span class="line"> for (int i = 0; i < arr.length; i++) {</span><br><span class="line"> if (max < arr[i]) {</span><br><span class="line"> max = arr[i];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> int maxLength = (max + "").length();</span><br><span class="line"> for (int i = 0; i < maxLength; i++) {</span><br><span class="line"> for (int j = 0; j < arr.length; j++) {</span><br><span class="line"> int value = arr[j] / (int) Math.pow(10, i) % 10;</span><br><span class="line"> bucket[value][bucketElementcounts[value]] = arr[j];</span><br><span class="line"> bucketElementcounts[value]++;</span><br><span class="line"> }</span><br><span class="line"> int index = 0;</span><br><span class="line"> for (int k = 0; k < bucket.length; k++) {</span><br><span class="line"> if (bucketElementcounts[k] != 0) {</span><br><span class="line"> for (int j = 0; j < bucketElementcounts[k]; j++) {</span><br><span class="line"> arr[index++] = bucket[k][j];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bucketElementcounts[k] = 0;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h1 id="堆排序"><a href="#堆排序" class="headerlink" title="堆排序"></a>堆排序</h1><p> 完全二叉树,最大堆</p><ol><li>heapSort:从最后一个父节点开始,向根节点进行元素下沉(heapify)<ol><li>从根目录开始循环,每次heapify都把第一个元素和最后一个元素交换,并且长度减一(每次隔离最大值元素)</li></ol></li><li>heapify:判断是否存在两个子节点,若存在两个子节点则判断左子节点是否大于右子节点。<ol><li>从传入的父节点开始,依次元素下沉,</li></ol></li></ol><h1 id="堆排序-1"><a href="#堆排序-1" class="headerlink" title="堆排序"></a>堆排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void heapSort(int[] arr, int len) {</span><br><span class="line"> for (int i = (len - 2) / 2; i >= 0; i--) heapify(arr, i, len - 1);</span><br><span class="line"> for (int i = len - 1; i > 0; i--) {</span><br><span class="line"> swap(arr, 0, i);</span><br><span class="line"> heapify(arr, 0, i - 1);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">public static void heapify(int[] arr, int start, int end) {</span><br><span class="line"> int dad = start, son = dad * 2 + 1;</span><br><span class="line"> if (son > end) return;</span><br><span class="line"> if (son + 1 <= end && arr[son] < arr[son + 1]) son++;</span><br><span class="line"> if (arr[dad] > arr[son]) return;</span><br><span class="line"> swap(arr, dad, son);</span><br><span class="line"> heapify(arr, son, end);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="计数排序"><a href="#计数排序" class="headerlink" title="计数排序"></a>计数排序</h1><h1 id="计数排序-1"><a href="#计数排序-1" class="headerlink" title="计数排序"></a>计数排序</h1><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></pre></td><td class="code"><pre><span class="line">public static void countSort(int[] arr) {</span><br><span class="line"> int max = arr[0], min = arr[0];</span><br><span class="line"></span><br><span class="line"> //找出最大值和最小值</span><br><span class="line"> for (int i = 0; i< arr.length; i++) {</span><br><span class="line"> if (max < arr[i]) max = arr[i];</span><br><span class="line"> if (min > arr[i]) min = arr[i];</span><br><span class="line"> }</span><br><span class="line"> //初始化计数数组</span><br><span class="line"> int[] temparr = new int[max - min + 1];</span><br><span class="line"> for (int i = 0; i < temparr.length; i++) {</span><br><span class="line"> temparr[i] = 0;</span><br><span class="line"> }</span><br><span class="line"> //开始计数</span><br><span class="line"> for (int i = 0 ; i < arr.length; i++) {</span><br><span class="line"> temparr[arr[i] - min]++;</span><br><span class="line"> }</span><br><span class="line"> int t = 0;</span><br><span class="line"> for (int i = 0; i < temparr.length; i++) {</span><br><span class="line"> for (int j = 0; j < temparr[i]; j++) {</span><br><span class="line"> arr[t++] = i + min;</span><br><span class="line"> }</span><br><span class="line"> }count = 1;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">排序算法</summary>
<category term="后端开发" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
<category term="算法" scheme="https://lathezero.github.io/categories/%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91/%E7%AE%97%E6%B3%95/"/>
<category term="算法" scheme="https://lathezero.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="排序" scheme="https://lathezero.github.io/tags/%E6%8E%92%E5%BA%8F/"/>
</entry>
</feed>