<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="zh-CN">
	<title>猿导航</title>
	<subtitle>欢迎来到猿导航，一个便捷、简约、极致的导航网站。我们收录了大量优质的互联网网站资源，致力于为用户提供高效的网站导航工具。猿导航是一个完全开放、免费、非营利性的网站，让您快速找到所需网站资源</subtitle>
	<link href="https://www.dtking.cn/feed/feed.xml" rel="self"/>
	<link href="https://www.dtking.cn/"/>
	<updated>2026-04-17T08:49:12Z</updated>
	<id>https://www.dtking.cn/</id>
	<author>
		<name>Mr.Fang</name>
		<email>robots_user@qq.com</email>
	</author>
	
	<entry>
		<title>Windows 系统 Java 进程查看与项目启停脚本实战</title>
		<link href="https://www.dtking.cn/blog/java/command/"/>
		<updated>2026-04-17T08:49:12Z</updated>
		<id>https://www.dtking.cn/blog/java/command/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;查找已经在运行 java 项目 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;一、jps &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;二、tasklist &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;三、wmic &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;查找项目启动时的参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;启动批处理脚本 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;停止批处理脚本 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;cha2-zhao3-yi3-jing1-zai4-yun4-xing2-java-xiang4-mu4&quot; tabindex=&quot;-1&quot;&gt;查找已经在运行 java 项目 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;yi1-jps&quot; tabindex=&quot;-1&quot;&gt;一、jps &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;jps &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;14464&lt;/span&gt; sun.tools.jps.Jps
&lt;span class=&quot;token number&quot;&gt;21952&lt;/span&gt; com.intellij.idea.Main
&lt;span class=&quot;token number&quot;&gt;6232&lt;/span&gt; org.jetbrains.idea.maven.server.RemoteMavenServer36
&lt;span class=&quot;token number&quot;&gt;22396&lt;/span&gt; xxxxx-admin-api.jar&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;er4-tasklist&quot; tabindex=&quot;-1&quot;&gt;二、tasklist &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tasklist &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;findstr &lt;span class=&quot;token string&quot;&gt;&quot;java&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;java.exe                      &lt;span class=&quot;token number&quot;&gt;6232&lt;/span&gt; Console                    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;238,964&lt;/span&gt; K
javaw.exe                    &lt;span class=&quot;token number&quot;&gt;22396&lt;/span&gt; Console                    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;643,396&lt;/span&gt; K&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;san1-wmic&quot; tabindex=&quot;-1&quot;&gt;三、wmic &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;wmic process where &lt;span class=&quot;token string&quot;&gt;&quot;name like &#39;%java%&#39;&quot;&lt;/span&gt; get ProcessId,CommandLine&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;rocessId
D:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;dev&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Java&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;java64&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;bin&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;java.exe &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.省略 org.jetbrains.idea.maven.server.RemoteMavenServer36  &lt;span class=&quot;token number&quot;&gt;6232&lt;/span&gt;
javaw  &lt;span class=&quot;token parameter variable&quot;&gt;-Xms256m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xmx512m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Dloader.path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;/release/api/libs &lt;span class=&quot;token parameter variable&quot;&gt;-jar&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xxxxx-admin-api.jar&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--spring.profiles.active&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dev &lt;span class=&quot;token number&quot;&gt;22396&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cha2-zhao3-xiang4-mu4-qi3-dong4-shi2-de-can1-shu4&quot; tabindex=&quot;-1&quot;&gt;查找项目启动时的参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ProcessId&lt;/code&gt; 进程 ID&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;wmic process where &lt;span class=&quot;token string&quot;&gt;&quot;ProcessId=22396&quot;&lt;/span&gt; get CommandLine&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行结果：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;CommandLine
javaw  &lt;span class=&quot;token parameter variable&quot;&gt;-Xms256m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Xmx512m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Dloader.path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;/&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;/release/api/libs &lt;span class=&quot;token parameter variable&quot;&gt;-jar&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;xxxx-admin-api.jar&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--spring.profiles.active&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dev&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;qi3-dong4-pi1-chu3-li3-jiao3-ben3&quot; tabindex=&quot;-1&quot;&gt;启动批处理脚本 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;javaw&lt;/code&gt;： 启动项目是可以隐藏 cmd 控制台窗口，类似 Linux nohup，后台运行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;@echo off
chcp &lt;span class=&quot;token number&quot;&gt;65001&lt;/span&gt;
title Java项目启动

:: &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; 配置区 &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JAR_PATH=xxxx-admin-api.jar&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JAVA_OPTS=-Xms256m -Xmx512m&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JAVA_ACTIVE=dev&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JAVA_LIBS=../../release/api/libs&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;LOG_PATH=app.log&quot;&lt;/span&gt;
:: &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; 正在启动 Java 项目&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; JAR路径: %JAR_PATH%

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; not exist &lt;span class=&quot;token string&quot;&gt;&quot;%JAR_PATH%&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; 错误：未找到 jar 文件！
    pause
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; /b &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

start &lt;span class=&quot;token string&quot;&gt;&quot;JavaApp&quot;&lt;/span&gt; javaw %JAVA_OPTS% &lt;span class=&quot;token parameter variable&quot;&gt;-Dloader.path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%JAVA_LIBS% &lt;span class=&quot;token parameter variable&quot;&gt;-jar&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;%JAR_PATH%&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--spring.profiles.active&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%JAVA_ACTIVE%&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;%LOG_PATH%&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; 启动成功！
pause&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ting2-zhi3-pi1-chu3-li3-jiao3-ben3&quot; tabindex=&quot;-1&quot;&gt;停止批处理脚本 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;@echo off
chcp &lt;span class=&quot;token number&quot;&gt;65001&lt;/span&gt;
title Java 停止

:: &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; 配置区 &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;JAR_PATH=xxxx-admin-api.jar&quot;&lt;/span&gt;
:: &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; 正在停止进程：%JAR_NAME%

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; /f &lt;span class=&quot;token string&quot;&gt;&quot;tokens=1,*&quot;&lt;/span&gt; %%i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;jps -l&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; %%j &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; /I &lt;span class=&quot;token string&quot;&gt;&quot;%JAR_NAME%&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;nul
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; not errorlevel &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; Killing PID %%i
        taskkill /PID %%i /F &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;nul &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; 停止成功！
pause

&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>YOLOv8-Pose 自定义关键点检测全流程：LabelMe 标注→模型训练→ONNX/RKNN 转换 RK3588 部署</title>
		<link href="https://www.dtking.cn/blog/ml/yolov8-pose-train/"/>
		<updated>2026-01-27T07:02:37Z</updated>
		<id>https://www.dtking.cn/blog/ml/yolov8-pose-train/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;一、准备工作 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;安装 labelme &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;标注数据 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;LabelMe 数据格式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;格式转换 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;YOLO-Pose 标签格式 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;二、训练数据 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;dataset.yaml &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;字段解释（重点） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;目录结构 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;三、安装环境&amp;训练&amp;验证 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;Ultralytics &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;训练 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;验证 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;四、转 ONNX 模型&amp;验证 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;导出 ONNX &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;ONNX 模型推理 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;五、转 RKNN 模型&amp;验证 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;导出 RKNN &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;RKNN 模型推理 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;六、总结 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;code&gt;YOLOv8-Pose&lt;/code&gt; 模型检测人体&lt;a href=&quot;https://docs.ultralytics.com/zh/tasks/pose/&quot;&gt;17个关键点&lt;/a&gt;，想检测其他物体的关键点只能通过训练自己的模型来实现，文章记录训练自定义模型识别指定图形全过程。&lt;/p&gt;
&lt;h2 id=&quot;yi1-zhun3-bei4-gong1-zuo4&quot; tabindex=&quot;-1&quot;&gt;一、准备工作 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://github.com/wkentaro/labelme&quot;&gt;labelme&lt;/a&gt; 标注工具可以标注点和一些自定义形状图形。&lt;code&gt;labelme&lt;/code&gt; 默认输出的格式是 &lt;code&gt;json&lt;/code&gt; 不能直接用来训练 &lt;code&gt;YOLO&lt;/code&gt; ，所以数据标注完之后还需写python代码进行一次格式转换。&lt;/p&gt;
&lt;h3 id=&quot;an1-zhuang1-labelme&quot; tabindex=&quot;-1&quot;&gt;安装 &lt;code&gt;labelme&lt;/code&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; labelme&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;biao1-zhu4-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;标注数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如何有多个矩形框需要进行分组，标注时需要填写 &lt;code&gt;groupId&lt;/code&gt; 方便后面进行数据格式转换，没有 &lt;code&gt;groupId&lt;/code&gt; 数据格式转完犊子了。&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;em&gt;除非你是按顺序标注，每四个点标完再画一个矩形框，那么后面可以通过代码按顺序 &lt;code&gt;4+1 item&lt;/code&gt; 进行添加 &lt;code&gt;groupId&lt;/code&gt;。第一次没经验我就是这么干的 🤣&lt;/em&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/INsDgypLrB-1918.avif 1918w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/INsDgypLrB-1918.webp 1918w&quot;&gt;&lt;img alt=&quot;labelme 界面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/INsDgypLrB-1918.jpeg&quot; width=&quot;1918&quot; height=&quot;975&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;&lt;code&gt;yolov8-pose&lt;/code&gt; 训练关键点检测必须要有矩形框，再在框里面标注点。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;labelme-shu4-ju4-ge2-shi4&quot; tabindex=&quot;-1&quot;&gt;LabelMe 数据格式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;shapes&lt;/code&gt; 是一个数组包含了你标注的框啊，点啊之类的正常情况是按顺序的。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;如果通过代码批量更新或覆盖 &lt;code&gt;JSON&lt;/code&gt; 文件要包含 &lt;code&gt;imageData&lt;/code&gt; &lt;code&gt;base64&lt;/code&gt; 图片数据否则 &lt;code&gt;labelme&lt;/code&gt; 打开不对应图片&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;001.json &lt;/b&gt;标注结果&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;imageData&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/9j/4AAQSkZJRgABAQAAA…………省略&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;imageHeight&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1440&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;imagePath&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;001.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;imageWidth&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2560&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;shapes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1745.3333333333333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1114.4444444444446&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1813.3333333333333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1104.6666666666667&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1698.6936936936936&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1052.8828828828828&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1762.4324324324323&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1042.5225225225224&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;box&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1689.9099099099099&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1039.8198198198197&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1820.09009009009&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1118.198198198198&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rectangle&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1606.310043668122&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;934.410480349345&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1666.5720524017465&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;926.5502183406112&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1571.593886462882&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;890.3056768558951&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1629.0174672489081&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;883.1004366812226&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;flags&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;box&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;mask&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1566.5720524017465&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;880.2620087336244&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;1673.1222707423578&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
           &lt;span class=&quot;token number&quot;&gt;937.6855895196505&lt;/span&gt;
         &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
       &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
       &lt;span class=&quot;token property&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rectangle&quot;&lt;/span&gt;
     &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
   &lt;span class=&quot;token property&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5.10.1&quot;&lt;/span&gt;
 &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ge2-shi4-zhuan3-huan4&quot; tabindex=&quot;-1&quot;&gt;格式转换 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;labelme_to_yolo_pose.py &lt;/b&gt;json 转 txt&lt;/div&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; json
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; collections &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; defaultdict

KEYPOINT_ORDER &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;lb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
NUM_KPTS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;KEYPOINT_ORDER&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;labelme_to_yolo_pose&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img_w&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2560&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img_h&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1440&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; class_id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; encoding&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    groups &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; defaultdict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    boxes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 1按 group_id 收集数据&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; shape &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shapes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        gid &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;group_id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        label &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;label&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        pts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;points&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;point&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            groups&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;gid&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;label&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;shape_type&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rectangle&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;gid&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pts

    yolo_lines &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 2逐个目标生成一行&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; gid&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; box_pts &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;items&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; box_pts

        &lt;span class=&quot;token comment&quot;&gt;# bbox&lt;/span&gt;
        cx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; x2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_w
        cy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y1 &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; y2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_h
        w  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x2 &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; x1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_w
        h  &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;abs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y2 &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; y1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_h

        line &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;class_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cy&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; w&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; h&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 3关键点&lt;/span&gt;
        kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; groups&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gid&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; name &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; KEYPOINT_ORDER&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; name &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; kpts&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; kpts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_w&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; img_h&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                line&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;extend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        yolo_lines&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;.6f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; v &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; line&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; yolo_lines

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;03d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.json&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    result &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; labelme_to_yolo_pose&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;D:&#92;&#92;xxxxx&#92;&#92;yoga-pose&#92;&#92;&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2560&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1440&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    label_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;D:&#92;&#92;xxxxx&#92;&#92;yoga-pose&#92;&#92;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;03d&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.txt&quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;label_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; encoding&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;yolopose-biao1-qian1-ge2-shi4&quot; tabindex=&quot;-1&quot;&gt;YOLO-Pose 标签格式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;YOLOv8-Pose 每一行：分类 x坐标 y坐标 宽度 高度 是否可见 关键点1x 关键点1y 是否可见&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;class cx cy w h &lt;span class=&quot;token function&quot;&gt;v&lt;/span&gt; kpt1_x kpt1_y v1 kpt2_x kpt2_y v2 &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. &lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;坐标 &lt;strong&gt;全部归一化&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; = 不可见 / 不存在&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; = 存在但不可见&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; = 可见&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;class cx cy w h 
lt_x lt_y &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
rt_x rt_y &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
lb_x lb_y &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
rb_x rb_y &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;001.txt &lt;/b&gt;txt&lt;/div&gt;
&lt;p&gt;源数据：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.501427&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.715411&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.038011&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.080128&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.484976&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.710069&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.508413&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.678819&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.495793&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.751202&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.518179&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.714076&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.470853&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.600294&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031851&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.071047&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.464543&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.633146&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.485276&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.604033&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.456280&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.600294&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.472356&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.568510&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;格式化展示：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.501427&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.715411&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.038011&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.080128&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.484976&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.710069&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.508413&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.678819&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.495793&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.751202&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.518179&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.714076&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.470853&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.600294&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031851&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.071047&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.464543&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.633146&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.485276&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.604033&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.456280&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.600294&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; 
&lt;span class=&quot;token number&quot;&gt;0.472356&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.568510&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;er4-xun4-lian4-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;二、训练数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;dataset-yaml&quot; tabindex=&quot;-1&quot;&gt;dataset.yaml &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /your/dataset/root        &lt;span class=&quot;token comment&quot;&gt;# 数据集根目录（绝对路径 or 相对路径）&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; images/train
&lt;span class=&quot;token key atrule&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; images/val

&lt;span class=&quot;token key atrule&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; box

&lt;span class=&quot;token comment&quot;&gt;# -------- pose 关键点配置 --------&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;kpt_shape&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;# 4 个关键点，每个 (x, y, v)&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;flip_idx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# lt &amp;lt;--&gt; rt ，lb &amp;lt;--&gt; rb，左右翻转，否则增强会把点搞乱&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zi4-duan4-jie3-shi4-zhong4-dian3&quot; tabindex=&quot;-1&quot;&gt;字段解释（重点） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kpt_shape: [4, 3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;必须&lt;/strong&gt;，否则模型不知道你是 4 点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flip_idx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;左右翻转时关键点对换关系&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;names&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;类别名，pose 也必须有&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;mu4-lu4-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;目录结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;train：训练&lt;/li&gt;
&lt;li&gt;val：验证&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;我这里验证数据占比 10% 训练数据 90%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dataset/
├── images/
│   ├── train/
│   │   ├── 001.jpg
│   │   └── 002.jpg
│   └── val/
│       └── &lt;span class=&quot;token number&quot;&gt;101&lt;/span&gt;.jpg
│
├── labels/
│   ├── train/
│   │   ├── 001.txt
│   │   └── 002.txt
│   └── val/
│       └── &lt;span class=&quot;token number&quot;&gt;101&lt;/span&gt;.txt
│
└── dataset.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;san1-an1-zhuang1-huan2-jing4-xun4-lian4-yan4-zheng4&quot; tabindex=&quot;-1&quot;&gt;三、安装环境&amp;amp;训练&amp;amp;验证 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ultralytics&quot; tabindex=&quot;-1&quot;&gt;Ultralytics &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最低版本：Python 3.8&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; ultralytics&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;xun4-lian4&quot; tabindex=&quot;-1&quot;&gt;训练 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;dataset&lt;/code&gt; 目录打开 &lt;code&gt;cmd&lt;/code&gt; 执行命令（最小可用）:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;yolo pose train &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yolov8n-pose.pt &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dataset.yaml &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;imgsz&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;epochs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整训练命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;yolo &lt;span class=&quot;token assign-left variable&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pose ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;train ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;yolov8n-pose.pt ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dataset.yaml ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;epochs&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;imgsz&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;batch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;lr0&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.002&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;lrf&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;cos_lr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;True ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;degrees&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;45&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;translate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;scale&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.6&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;fliplr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;mosaic&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;mixup&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt; ^
     &lt;span class=&quot;token assign-left variable&quot;&gt;patience&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://docs.ultralytics.com/zh/modes/train/#resuming-interrupted-trainings&quot;&gt;使用 Ultralytics YOLO 进行模型训练#训练设置&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;yan4-zheng4&quot; tabindex=&quot;-1&quot;&gt;验证 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;some_test_images&lt;/code&gt;：需要验证的图片目录（多个图片）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runs/pose/predict&lt;/code&gt;：生成验证结果目录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;yolo &lt;span class=&quot;token assign-left variable&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pose &lt;span class=&quot;token assign-left variable&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;predict ^
      &lt;span class=&quot;token assign-left variable&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;runs/pose/train3/weights/best.pt ^
      &lt;span class=&quot;token assign-left variable&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;./some_test_images ^
      &lt;span class=&quot;token assign-left variable&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;True ^
      &lt;span class=&quot;token assign-left variable&quot;&gt;conf&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;si4-zhuan3-onnx-mo2-xing2-yan4-zheng4&quot; tabindex=&quot;-1&quot;&gt;四、转 ONNX 模型&amp;amp;验证 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;dao3-chu1-onnx&quot; tabindex=&quot;-1&quot;&gt;导出 ONNX &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;很简单一条命令搞定&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;yolo &lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;runs/pose/train/weights/best.pt &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;onnx &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;opset&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  simplify &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token assign-left variable&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;False&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opset=12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RKNN 最稳（别用 13/17）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;simplify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;减少 ONNX 节点，RKNN 更容易过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dynamic=False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RKNN &lt;strong&gt;不支持动态 shape&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注：导出模型在 &lt;code&gt;runs/pose/train/weights/best.onnx&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;onnx-mo2-xing2-tui1-li3&quot; tabindex=&quot;-1&quot;&gt;ONNX 模型推理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ultralytics &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; YOLO

IMG_PATH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./001.jpg&#39;&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; YOLO&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;best.onnx&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; task&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;pose&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 进行推理&lt;/span&gt;
results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;IMG_PATH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 打印结果&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; r &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    boxes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;boxes
    keypoints &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keypoints
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--- Ultralytics on RK3588 Result ---&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Number of objects detected: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boxes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boxes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Boxes (xyxy):&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boxes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xyxy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nKeypoints (xy):&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;keypoints&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;xy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;-------------------------------------&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 保存结果图片&lt;/span&gt;
    res_img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;plot&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; cv2 &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; imwrite
    imwrite&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;result_ultra.jpg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; res_img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Ultralytics result saved to result_ultra.jpg&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推理结果：&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/KFnmoyk4vu-750.avif 750w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/KFnmoyk4vu-750.webp 750w&quot;&gt;&lt;img alt=&quot;自定模型推理结果&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/KFnmoyk4vu-750.jpeg&quot; width=&quot;750&quot; height=&quot;550&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;wu3-zhuan3-rknn-mo2-xing2-yan4-zheng4&quot; tabindex=&quot;-1&quot;&gt;五、转 RKNN 模型&amp;amp;验证 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在导出模型时遇到几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果开启量化就检测不到结果了，只能使用未量化的模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Failed to config layer: &#39;Conv:/model.22/dfl/conv/Conv&#39; using 3Core fallback to single core mode&lt;/code&gt;：指定卷积层无法使用 3 核并行计算，降级为单核运行，可能导致模型推理速度下降，推理时确实有点慢。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;dao3-chu1-rknn&quot; tabindex=&quot;-1&quot;&gt;导出 RKNN &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;参考瑞芯微 &lt;code&gt;yolov8_pose&lt;/code&gt; 导出模型代码修改：&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;quant_dataset.txt &lt;/b&gt;量化数据&lt;/div&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;./images/001.jpg
./images/002.jpg
./images/003.jpg
./images/004.jpg
./images/005.jpg
./images/006.jpg
./images/007.jpg
./images/008.jpg
./images/009.jpg
./images/010.jpg
./images/011.jpg
./images/012.jpg
./images/013.jpg
./images/014.jpg
./images/015.jpg
./images/016.jpg
./images/017.jpg
./images/018.jpg
./images/019.jpg
./images/020.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;convert_yolov8_pose_to_rknn.py &lt;/b&gt;onnx 转 rknn&lt;/div&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;api &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; RKNN

&lt;span class=&quot;token comment&quot;&gt;# ================== 配置区 ==================&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 量化数据集（txt，每行一个图片路径）&lt;/span&gt;
DATASET_PATH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./quant_dataset.txt&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 默认输出&lt;/span&gt;
DEFAULT_RKNN_PATH &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./yoga_pose.rknn&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 默认是否量化&lt;/span&gt;
DEFAULT_QUANT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;


&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;parse_arg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Usage: python3 {} onnx_model_path platform [dtype(optional)] [output_rknn_path(optional)]&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;platform: rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dtype: i8 | fp&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    model_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    platform &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    do_quant &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DEFAULT_QUANT

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        dtype &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; dtype &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;i8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;fp&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ERROR: dtype must be &#39;i8&#39; or &#39;fp&#39;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        do_quant &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dtype &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;i8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        output_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        output_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DEFAULT_RKNN_PATH

    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; model_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; platform&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; do_quant&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output_path


&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;__main__&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    model_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; platform&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; do_quant&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parse_arg&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Create RKNN object&lt;/span&gt;
    rknn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RKNN&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;verbose&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# ================== 1. Config ==================&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--&gt; Config RKNN&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        mean_values&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        std_values&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        target_platform&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;platform&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        optimization_level&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;done&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# ================== 2. Load ONNX ==================&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--&gt; Loading ONNX model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_onnx&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;model_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Load model failed!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;done&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# ================== 3. Build ==================&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--&gt; Building RKNN model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; do_quant&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Quantization: ENABLED&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Quant dataset:&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DATASET_PATH&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;build&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            do_quantization&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            dataset&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;DATASET_PATH
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Quantization: DISABLED (FP mode)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;build&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            do_quantization&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Build model failed!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;done&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# ================== 4. Export ==================&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--&gt; Export RKNN model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;export_rknn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Export rknn failed!&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RKNN saved to:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Release&lt;/span&gt;
    rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导出命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python convert_yolov8_pose_to_rknn.py yoga_pose.onnx rk3588 fp&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;rknn-mo2-xing2-tui1-li3&quot; tabindex=&quot;-1&quot;&gt;RKNN 模型推理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;yoga_rknn_demo.py &lt;/b&gt;onnx 转 rknn&lt;/div&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cv2
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; numpy &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; np
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; argparse
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; time

&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;api &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; RKNN

&lt;span class=&quot;token comment&quot;&gt;# 配置模型参数&lt;/span&gt;
CLASSES &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;yoga_mat&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 类别名称&lt;/span&gt;
NUM_KEYPOINTS &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;# 关键点数量&lt;/span&gt;
CONF_THRES &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;# 置信度阈值&lt;/span&gt;
NMS_THRES &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.45&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;# NMS 阈值&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;YOLOv8PoseRKNN&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;rk3588&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# 1. 初始化 RKNN 对象&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rknn &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RKNN&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;verbose&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 2. 加载模型&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;--&gt; Loading RKNN model: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;model_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_rknn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Load RKNN model &#92;&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;model_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#92;&quot; failed!&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 3. 初始化运行时环境&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# rknn.api 的 init_runtime 需要指定 target (如 rk3588) 和 device_id (如果连接了多个设备)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;--&gt; Init runtime environment (Target: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;, Device ID: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;device_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        ret &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_runtime&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;device_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Init runtime environment failed!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ret&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;--&gt; Runtime initialized&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;letterbox&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; im&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_shape&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;114&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;114&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;114&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;
        图片缩放与填充，保持长宽比
        &quot;&quot;&quot;&lt;/span&gt;
        shape &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; im&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# current shape [height, width]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new_shape&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            new_shape &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new_shape&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_shape&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        r &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;min&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;new_shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# Compute padding&lt;/span&gt;
        ratio &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; r  &lt;span class=&quot;token comment&quot;&gt;# width, height ratios&lt;/span&gt;
        new_unpad &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; r&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        dw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dh &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; new_shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; new_unpad&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; new_unpad&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# wh padding&lt;/span&gt;

        dw &lt;span class=&quot;token operator&quot;&gt;/=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# divide padding into 2 sides&lt;/span&gt;
        dh &lt;span class=&quot;token operator&quot;&gt;/=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; new_unpad&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# resize&lt;/span&gt;
            im &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;im&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; new_unpad&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; interpolation&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;INTER_LINEAR&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        top&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottom &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dh &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dh &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        left&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; right &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dw &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dw &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        im &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;copyMakeBorder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;im&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; top&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bottom&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; left&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; right&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;BORDER_CONSTANT&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# add border&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; im&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dh&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process_keypoints&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kpts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dh&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;
        将关键点坐标映射回原图
        &quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# kpts shape: [N, 4, 3] or [N, 4*3] -&gt; [x, y, conf]&lt;/span&gt;
        kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;array&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kpts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kpts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; kpts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reshape&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Reshape to [4, 3]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 减去 padding&lt;/span&gt;
        kpts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; dw
        kpts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-=&lt;/span&gt; dh

        &lt;span class=&quot;token comment&quot;&gt;# 除以缩放比例&lt;/span&gt;
        kpts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/=&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        kpts&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/=&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; kpts

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;post_process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dwdh&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;
        针对 YOLOv8 标准输出的后处理
        假设输出 Shape 为 (1, channels, 8400)
        Channels = 4(box) + 1(cls_score) + 4*3(kpts) = 17 (针对你的单类+4点模型)
        &quot;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# rknn.inference 返回的是列表&lt;/span&gt;
        output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; outputs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 检查是否需要 Transpose&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# YOLOv8 默认导出通常是 [1, 17, 8400]，需要转置为 [1, 8400, 17] 以便处理&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transpose&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        prediction &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# [8400, 17]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 1. Box 处理 (cx, cy, w, h) -&gt; (x1, y1, x2, y2)&lt;/span&gt;
        boxes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; prediction&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 2. Score 处理&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# 第4列开始是类别分数&lt;/span&gt;
        scores &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; prediction&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CLASSES&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        max_scores &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scores&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; axis&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        class_ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argmax&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;scores&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; axis&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 3. 过滤低置信度&lt;/span&gt;
        mask &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; max_scores &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; CONF_THRES
        prediction &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; prediction&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mask&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        boxes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mask&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        max_scores &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; max_scores&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mask&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        class_ids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; class_ids&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mask&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prediction&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 4. 坐标转换 cxcywh -&gt; xyxy&lt;/span&gt;
        cx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        cy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        w &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        h &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        x1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cx &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        y1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cy &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        x2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cx &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; w &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
        y2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cy &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; h &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

        boxes_xyxy &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stack&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; axis&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 5. NMS (非极大值抑制)&lt;/span&gt;
        indices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dnn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;NMSBoxes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;boxes_xyxy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tolist&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_scores&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tolist&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; CONF_THRES&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; NMS_THRES&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        dw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dh &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dwdh

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;indices&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            indices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; indices&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;flatten&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; indices&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 获取 Box&lt;/span&gt;
                box &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; boxes_xyxy&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 还原到原图尺寸&lt;/span&gt;
                box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; dw&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; dh&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; dw&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;box&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; dh&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

                &lt;span class=&quot;token comment&quot;&gt;# 获取 Keypoints&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 关键点数据起始位置 = 4(box) + len(CLASSES)&lt;/span&gt;
                kpt_start_idx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;CLASSES&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                raw_kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; prediction&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kpt_start_idx&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

                &lt;span class=&quot;token comment&quot;&gt;# 处理关键点坐标&lt;/span&gt;
                kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;process_keypoints&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;raw_kpts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dw&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dh&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

                results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;class_id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; class_ids&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;score&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; max_scores&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;box&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; box&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# [x1, y1, x2, y2]&lt;/span&gt;
                    &lt;span class=&quot;token string&quot;&gt;&quot;keypoints&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; kpts &lt;span class=&quot;token comment&quot;&gt;# [[x,y,conf], ...]&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; results

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;imread&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; img &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Image not found: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;img_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 1. 预处理&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# YOLOv8 默认输入 640x640，请根据你训练时的 imgsz 修改&lt;/span&gt;
        input_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        input_img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dwdh &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;letterbox&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; input_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 转换为 RGB (OpenCV 是 BGR)&lt;/span&gt;
        input_img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cvtColor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input_img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;COLOR_BGR2RGB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 增加 batch 维度 [1, 640, 640, 3]&lt;/span&gt;
        input_tensor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; np&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;expand_dims&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input_img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; axis&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 2. 推理&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--&gt; Running model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        start_time &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# rknn.inference 接口&lt;/span&gt;
        outputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;inference&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;inputs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;input_tensor&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Inference time: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; start_time&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;.2f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; ms&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 调试：查看输出形状，确保与 post_process 预期一致&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# for i, out in enumerate(outputs):&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;#    print(f&quot;Output[{i}] shape: {out.shape}&quot;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 3. 后处理&lt;/span&gt;
        detections &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post_process&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dwdh&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 4. 绘图&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; det &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; detections&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            x1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; det&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;box&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            score &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; det&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;score&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            cls_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; det&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;class_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
            kpts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; det&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;keypoints&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# 画框&lt;/span&gt;
            cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rectangle&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            label &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;CLASSES&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;cls_id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;score&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token format-spec&quot;&gt;.2f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
            cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;putText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; label&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y1 &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FONT_HERSHEY_SIMPLEX&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# 画关键点 (4个点)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kp &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;kpts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; conf &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; kp
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; conf &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 只画置信度高的点&lt;/span&gt;
                    cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;circle&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;token comment&quot;&gt;# 可选：给点标号&lt;/span&gt;
                    &lt;span class=&quot;token comment&quot;&gt;# cv2.putText(img, str(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)&lt;/span&gt;

        save_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;result_rknn_api.jpg&quot;&lt;/span&gt;
        cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;imwrite&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;save_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Result saved to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;save_path&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;release&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rknn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;__main__&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    parser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; argparse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ArgumentParser&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;description&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;YOLOv8 Pose RKNN Inference (Full API)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_argument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; required&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Path to .rknn model&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_argument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--img&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; required&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Path to image&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_argument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--target&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;rk3588&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Target platform (e.g., rk3588, rk3566)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_argument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--device_id&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;Device ID (for ADB connection)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse_args&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; YOLOv8PoseRKNN&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_id&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python yoga_rknn_demo.py &lt;span class=&quot;token parameter variable&quot;&gt;--model&lt;/span&gt; ./yoga_pose.rknn &lt;span class=&quot;token parameter variable&quot;&gt;--img&lt;/span&gt; ./001.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;RK3588 推理结果：&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/7wanriChHv-699.avif 699w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/7wanriChHv-699.webp 699w&quot;&gt;&lt;img alt=&quot;自定模型RKNN推理结果&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/7wanriChHv-699.jpeg&quot; width=&quot;699&quot; height=&quot;550&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;liu4-zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;六、总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在训练自定义模型并运行在 &lt;code&gt;RK3588&lt;/code&gt; 盒子上过程中耗时还是比较长的，最开始标注数据，格式没搞清楚来回修改数据格式（JSON）浪费一些时间。还有比较耗时间的是在转 &lt;code&gt;RKNN&lt;/code&gt; 模型成功后，验证模型成了最大问题，解析推理数据始终拿不到正确的框和点，这期间用了很多 AI（ChatGPT、GLM、Doubao、Gemini） 工具进行代码生成测试问题特别多，耗时特别长。&lt;/p&gt;
&lt;p&gt;最终测试 &lt;code&gt;Google Gemini&lt;/code&gt; 完胜，碾压一众AI大模型，基本一次就能给到对的结果，大部分推理验证代码都是 Gemini 生成。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>轻量级跨平台 Hosts 管理工具（支持 Ping/TCP 测速 + 自定义命令扩展）</title>
		<link href="https://www.dtking.cn/blog/golang/go-hosts/"/>
		<updated>2026-01-19T01:41:20Z</updated>
		<id>https://www.dtking.cn/blog/golang/go-hosts/</id>
		<content type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/systemmin/go-hosts/&quot;&gt;开源项目地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Go Hosts 是一款基于 Go+fyne 开发的轻量级 Hosts 文件管理工具，适配 Windows 和 macOS 系统，作为 SwitchHosts（Electron）的轻量化替代方案；核心功能包含图形化 Hosts 规则管理、IP / 域名多绑定、Ping 测试（获取域名所有可访问 IP）、TCP 测速（筛选最快 IP），还支持自定义 CMD 命令按钮扩展，体积小巧且支持跨平台编译打包&lt;/p&gt;
&lt;h2 id=&quot;wei4-shen2-me-hui4-chong2-fu4-zao4-lun2-zi3-ne&quot; tabindex=&quot;-1&quot;&gt;为什么会重复造轮子呢？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SwitchHosts 太大了（Electron），不太灵活。我对小工具的执念挺大，小工具就应该足够小（虽然还是不够小😊）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;PING 测试，快速找到目标网站&lt;strong&gt;所有IP地址&lt;/strong&gt;，例如 github.com。&lt;/li&gt;
&lt;li&gt;TCP 测试，快速找到当前网络环境连接最快的那个IP，配置 hosts 加速访问。&lt;/li&gt;
&lt;li&gt;支持扩展 cmd 命令菜单，把系统一些常用工具給串起来&lt;/li&gt;
&lt;li&gt;我就是玩！哈哈哈~&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ping2-mu4-jie2-tu2&quot; tabindex=&quot;-1&quot;&gt;屏幕截图 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/HIqapiZ1zR-802.avif 802w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/HIqapiZ1zR-802.webp 802w&quot;&gt;&lt;img alt=&quot;go-hosts 首页&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/HIqapiZ1zR-802.png&quot; width=&quot;802&quot; height=&quot;632&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/ZY8nvnQYBM-802.avif 802w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/ZY8nvnQYBM-802.webp 802w&quot;&gt;&lt;img alt=&quot;hosts 管理页面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/ZY8nvnQYBM-802.png&quot; width=&quot;802&quot; height=&quot;632&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/ZAElmk3PU3-802.avif 802w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/ZAElmk3PU3-802.webp 802w&quot;&gt;&lt;img alt=&quot;PING&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/ZAElmk3PU3-802.png&quot; width=&quot;802&quot; height=&quot;632&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/0AdpdMkINj-802.avif 802w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/0AdpdMkINj-802.webp 802w&quot;&gt;&lt;img alt=&quot;TCP&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/0AdpdMkINj-802.png&quot; width=&quot;802&quot; height=&quot;632&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;gong1-neng2&quot; tabindex=&quot;-1&quot;&gt;功能 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ji1-chu3-gong1-neng2&quot; tabindex=&quot;-1&quot;&gt;基础功能 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;图形化管理 hosts 规则（增、删、改、刷新）&lt;/li&gt;
&lt;li&gt;支持一个 IP 绑定多个域名&lt;/li&gt;
&lt;li&gt;支持一个域名绑定多个 IP，并可快速切换&lt;/li&gt;
&lt;li&gt;支持 Ping 测试、TCP 测试、主题切换、系统托盘&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shu4-ju4-lei4-xing2-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;数据类型说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP 类型&lt;/strong&gt;：一个 IP 对应多个域名，可同时启用多个规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain 类型&lt;/strong&gt;：一个域名对应多个 IP，同一时间只启用一个&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jin4-jie1-gong1-neng2&quot; tabindex=&quot;-1&quot;&gt;进阶功能 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ping-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;Ping 测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过域名获取当前网络下可访问的所有 IP&lt;/li&gt;
&lt;li&gt;用于排查解析慢或访问不稳定的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;tcp-ce4-su4&quot; tabindex=&quot;-1&quot;&gt;TCP 测速 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对多个 IP 进行并发 TCP 测试&lt;/li&gt;
&lt;li&gt;自动选出当前网络最快的 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;zi4-ding4-yi4-an4-niu3-gao1-ji2&quot; tabindex=&quot;-1&quot;&gt;自定义按钮（高级） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;支持通过 YAML 配置自定义操作按钮，用于执行系统或第三方命令。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按钮可显示在界面或系统托盘&lt;/li&gt;
&lt;li&gt;支持参数注入，参数注入使用 &lt;code&gt;%s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;命令中涉及路径要写反斜杠 &amp;quot;/&amp;quot;&lt;/li&gt;
&lt;li&gt;本质是 cmd 扩展，适用于任何可命令行操作的软件&lt;/li&gt;
&lt;li&gt;查看支持的 &lt;a href=&quot;https://docs.fyne.io/explore/icons/&quot;&gt;fyne icon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;配置文件 &lt;/b&gt;config.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;cus_buttons&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;刷新 DNS&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ViewRefreshIcon&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ipconfig /flushdns&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;打开配置&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd /c start %USERPROFILE%/.GoHosts&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;打开 hosts 文件&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;notepad C:/Windows/System32/drivers/etc/hosts&quot;&lt;/span&gt;

  &lt;span class=&quot;token comment&quot;&gt;# 若需要输入框注入参数使用 %s 可以注入输入的参数&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;端口扫描&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fscan -h %s&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;注册表&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ListIcon&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd /c regedit&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;控制面板&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;control&quot;&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;网络连接&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd /c ncpa.cpl&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;kai1-fa1-da3-bao1&quot; tabindex=&quot;-1&quot;&gt;开发 &amp;amp; 打包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;Mac 应该是有限支持，为了支持 &lt;code&gt;Mac 10.15.x&lt;/code&gt;，&lt;code&gt;fyne@v2.5.3&lt;/code&gt;+&lt;code&gt;go 1.20&lt;/code&gt;。&lt;br&gt;
软件数据目录 window： &lt;code&gt;%USERPROFILE%/.GoHosts&lt;/code&gt;，mac: &lt;code&gt;~/.GoHosts&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;安装 go 并配置环境变量&lt;/li&gt;
&lt;li&gt;安装 &lt;a href=&quot;https://jmeubank.github.io/tdm-gcc/download/&quot;&gt;tdm-gcc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安装 fyne&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;go &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; fyne.io/fyne/v2/cmd/fyne@latest&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;执行以下命令打包：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;go mod tidy
&lt;span class=&quot;token comment&quot;&gt;# 打包 Window&lt;/span&gt;
fyne package &lt;span class=&quot;token parameter variable&quot;&gt;-os&lt;/span&gt; windows
&lt;span class=&quot;token comment&quot;&gt;# 打包 Mac &lt;/span&gt;
fyne package &lt;span class=&quot;token parameter variable&quot;&gt;-os&lt;/span&gt; darwin&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;macos-quan2-xian4-wen4-ti2&quot; tabindex=&quot;-1&quot;&gt;MacOS 权限问题 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;MacOS 需修改 hosts 权限否则无法写入&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;执行以下命令修改权限&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chown&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; /etc/hosts
&lt;span class=&quot;token comment&quot;&gt;# 或&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; u+w /etc/hosts&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cause-apiunavailable-wgl-the-driver-does-not-appear-to-support-opengl&quot; tabindex=&quot;-1&quot;&gt;Cause: APIUnavailable: WGL: The driver does not appear to support OpenGL &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pal1000/mesa-dist-win/releases&quot;&gt;mesa3d 发布页面&lt;/a&gt; 下载 &lt;a href=&quot;https://github.com/pal1000/mesa-dist-win/releases/download/25.3.3/mesa3d-25.3.3-release-msvc.7z&quot;&gt;mesa3d&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;解压 &lt;code&gt;mesa3d-25.3.3-release-msvc.7z&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;perappdeploy.cmd&lt;/code&gt; 后，全部按回车键。&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;systemwidedeploy.cmd&lt;/code&gt; 后，输入【1】然后按回车键。（在 &lt;code&gt;cmd&lt;/code&gt; 执行，不要直接双击）&lt;/li&gt;
&lt;/ol&gt;
</content>
	</entry>
	
	<entry>
		<title>RK3588 nmcli 创建热点 DHCP 失败解决：hostapd+DNSmasq 搭建 AP 热点完整教程</title>
		<link href="https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/"/>
		<updated>2025-12-30T01:58:41Z</updated>
		<id>https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;问题描述 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;创建热点 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;解决办法 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;一、安装&amp;配置 hostapd &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;二、wlan0 添加静态 IP &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;三、设置 dnsmasq 分配 IP &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;四、验证 hostapd &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;五、查看已连接的设备 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;恢复 NM 管理 wlan0 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;nmcli 创建 ztl-wifi 热点出现手机 DHCP 连接失败、静态 IP 无法 PING 通的问题，提供hostapd+DNSmasq 替代搭建 AP 模式热点的完整解决方案；包含 NetworkManager 解除 wlan0 管理、hostapd 配置、wlan0 静态 IP 设置、DHCP 地址池分配、服务自启配置，以及恢复 NM 管理的回滚步骤，解决热点 IP 分配异常与局域网连通性问题&lt;/p&gt;
&lt;h2 id=&quot;wen4-ti2-miao2-shu4&quot; tabindex=&quot;-1&quot;&gt;问题描述 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&quot;http://wikicn.gzdcsmt.com/wendang_id_47.html#son25&quot; title=&quot;官方示例&quot;&gt;ncmil&lt;/a&gt; 设置热点，手机端连接 &lt;code&gt;ztl-wifi&lt;/code&gt; 网络无法连接成功（DHCP）。连接时将 IP 改成静态 IP（手动设置）就可以连接成功，但无法 &lt;code&gt;PING&lt;/code&gt; 通。&lt;/p&gt;
&lt;h3 id=&quot;chuang4-jian4-re4-dian3&quot; tabindex=&quot;-1&quot;&gt;创建热点 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli device wifi hotspot ifname wlan0 con-name ztl-wifi ssid ztl-wifi password &lt;span class=&quot;token number&quot;&gt;12345678&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;jie3-jue2-ban4-fa3&quot; tabindex=&quot;-1&quot;&gt;解决办法 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;a href=&quot;https://baike.baidu.com/item/hostapd/7985255&quot;&gt;hostapd&lt;/a&gt; + &lt;a href=&quot;https://baike.baidu.com/item/DNSmasq&quot;&gt;DNSmasq&lt;/a&gt; 来创建 AP 模式。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;非常重要，关掉 &lt;code&gt;NM&lt;/code&gt;（NetworkManager）对 &lt;code&gt;wlan0&lt;/code&gt; 的管理，默认 wlan0 是由 NM 管理端的，并重启 &lt;code&gt;NetworkManager&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli device &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; wlan0 managed no

&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart NetworkManager
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h3 id=&quot;yi1-an1-zhuang1-pei4-zhi4-hostapd&quot; tabindex=&quot;-1&quot;&gt;一、安装&amp;amp;配置 hostapd &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果没有安装 hostapd，执行以下命令安装：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; hostapd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建配置文件：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; /etc/hostapd/hostapd.conf&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token key attr-name&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;wlan0&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;driver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;nl80211&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;ssid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;ztl-wifi&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;hw_mode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;g&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;6&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;wpa&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;wpa_passphrase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;12345678&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;wpa_key_mgmt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;WPA-PSK&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;rsn_pairwise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;CCMP&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;er4-wlan0-tian1-jia1-jing4-tai4-ip&quot; tabindex=&quot;-1&quot;&gt;二、wlan0 添加静态 IP &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; addr &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.1/24 dev wlan0
&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;link&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; wlan0 up&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;san1-she4-zhi4-dnsmasq-fen1-pei4-ip&quot; tabindex=&quot;-1&quot;&gt;三、设置 dnsmasq 分配 IP &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dnsmasq &lt;span class=&quot;token parameter variable&quot;&gt;--interface&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;wlan0 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --dhcp-range&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.100,192.168.1.200,12h&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;si4-yan4-zheng4-hostapd&quot; tabindex=&quot;-1&quot;&gt;四、验证 hostapd &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;手动启动（推荐你先用这个验证）&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; hostapd &lt;span class=&quot;token parameter variable&quot;&gt;-dd&lt;/span&gt; /etc/hostapd/hostapd.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到类似下面内容才是 成功状态：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;wlan0: AP-ENABLED&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证没问题，使用系统服务命令启动 hostapd，先解除被 &lt;code&gt;systemd&lt;/code&gt; 禁止启动，直接启动可能会出现：&lt;em&gt;Failed to start hostapd.service: Unit hostapd.service is masked&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl unmask hostapd&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 启动&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start hostapd
&lt;span class=&quot;token comment&quot;&gt;# 开机自启&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; hostapd&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成以上操作就可以实现连接热点自动分配 IP 了，局域网内也可以使用 &lt;code&gt;PING&lt;/code&gt; 测试。&lt;/p&gt;
&lt;h3 id=&quot;wu3-cha2-kan4-yi3-lian2-jie1-de-she4-bei4&quot; tabindex=&quot;-1&quot;&gt;五、查看已连接的设备 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;ARP 表：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; neigh show dev wlan0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.101 lladdr &lt;span class=&quot;token number&quot;&gt;34&lt;/span&gt;:ab:cd:ef:12:34 REACHABLE&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;hui1-fu4-nm-guan3-li3-wlan0&quot; tabindex=&quot;-1&quot;&gt;恢复 NM 管理 wlan0 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;停止 &lt;code&gt;hostapd&lt;/code&gt; 和 &lt;code&gt;dnsmasq&lt;/code&gt; 服务，关闭开机启动，&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl stop hostapd
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl disable hostapd&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;设置 NM 管理 &lt;code&gt;wlan0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli device &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; wlan0 managed &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;重启 NetworkManager&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart NetworkManager&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;用 &lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;nmcli&lt;/a&gt; 创建热点&lt;/li&gt;
&lt;/ol&gt;
</content>
	</entry>
	
	<entry>
		<title>RK3576 Ubuntu aic8800 芯片 WiFi 与蓝牙冲突解决：边缘盒子网络配置与蓝牙操作指南</title>
		<link href="https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/"/>
		<updated>2025-12-26T01:14:34Z</updated>
		<id>https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;问题描述 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;官方解决方法: &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;网上解决方法: &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;网卡配置 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;无线网卡操作命令 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;有线网卡操作命令 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;删除已有网卡信息 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;蓝牙配置 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;扩展 Window &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;aic8800 芯片边缘盒子播放音频导致 WiFi 断开的问题，提供官方及实测有效的冲突解决方法（如 rfkill 重置无线设备），同时详细整理了无线 / 有线网卡配置（WiFi 连接、静态 IP 设置、多网段配置）、蓝牙配对连接操作的完整命令，涵盖网络管理与蓝牙配置的全流程解决方案。&lt;/p&gt;
&lt;h2 id=&quot;wen4-ti2-miao2-shu4&quot; tabindex=&quot;-1&quot;&gt;问题描述 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;边缘盒子连接 &lt;code&gt;WiFi&lt;/code&gt; 并连接蓝牙，通过 &lt;code&gt;gst-play-1.0 tips.mp3&lt;/code&gt; 播放音频导致 WiFi 断开，并且无法扫描到任何 WiFi 问题，盒子使用的是 &lt;code&gt;aic8800&lt;/code&gt; 芯片&lt;/p&gt;
&lt;h3 id=&quot;guan1-fang1-jie3-jue2-fang1-fa3&quot; tabindex=&quot;-1&quot;&gt;官方解决方法: &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;修改配置文件，增加 &lt;code&gt;Enable=Media,Socket&lt;/code&gt;，但是测试问题并没有解决&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;/etc/bluetooth/main.conf &lt;/b&gt;蓝牙配置文件&lt;/div&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;General&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Enable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;Media,Socket&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; /etc/bluetooth/main.conf
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart bluetooth&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;wang3-shang4-jie3-jue2-fang1-fa3&quot; tabindex=&quot;-1&quot;&gt;网上解决方法: &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;设备上电后重置所有无线设备，解决了冲突问题。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; rfkill block all
&lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; rfkill unblock all&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wang3-ka3-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;网卡配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;网络连接配置文件目录: &lt;code&gt;/etc/NetworkManager/system-connections&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;wu2-xian4-wang3-ka3-cao1-zuo4-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;无线网卡操作命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;查看WIFI列表&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;nmcli device wifi list

IN-USE  BSSID              SSID                           MODE   CHAN  RATE        SIGNAL  BARS  SECURITY  
        C0:B8:E6:55:4E:B9  RossWare703                    Infra  &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;     ▂▄▆█  WPA2      
        7A:B8:E6:55:4E:BB  RossWare703_Wi-Fi5             Infra  &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;     ▂▄▆█  WPA2      
        &lt;span class=&quot;token number&quot;&gt;84&lt;/span&gt;:F5:EB:F9:93:05  finchinasoft                   Infra  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;99&lt;/span&gt;      ▂▄▆█  WPA1 WPA2 
        &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:6B:9C:F5:6D:29  DIRECT-67-Pantum M6200 Series  Infra  &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;65&lt;/span&gt; Mbit/s   &lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;      ▂▄▆█  WPA1 WPA2 
        FC:F2:9F:C3:6A:26  CMCC-JeUb                      Infra  &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;94&lt;/span&gt;      ▂▄▆█  WPA1 WPA2 
        &lt;span class=&quot;token number&quot;&gt;44&lt;/span&gt;:32:62:74:56:EC  SKYWORTH                       Infra  &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;    &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;90&lt;/span&gt;      ▂▄▆█  WPA2      
        A0:21:AA:97:D0:D4  CMCC-79ke                      Infra  &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;130&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;89&lt;/span&gt;      ▂▄▆█  WPA1 WPA2 
        F4:2A:7D:A7:13:68  TP-LINK_1234                   Infra  &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;405&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;87&lt;/span&gt;      ▂▄▆█  WPA1 WPA2 
        D0:C7:C0:7C:69:5A  TP-LINK_695A                   Infra  &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;     &lt;span class=&quot;token number&quot;&gt;270&lt;/span&gt; Mbit/s  &lt;span class=&quot;token number&quot;&gt;82&lt;/span&gt;      ▂▄▆█  --        &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;连接 WIFI&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 有密码连接&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli device wifi connect &lt;span class=&quot;token string&quot;&gt;&quot;TP-LINK_1234&quot;&lt;/span&gt; password &lt;span class=&quot;token string&quot;&gt;&quot;12345678&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 无密码连接&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli device wifi connect &lt;span class=&quot;token string&quot;&gt;&quot;TP-LINK_1234&quot;&lt;/span&gt;

设备 &lt;span class=&quot;token string&quot;&gt;&quot;wlan0&quot;&lt;/span&gt; 成功以 &lt;span class=&quot;token string&quot;&gt;&quot;a753c8ad-4692-412a-ae78-84e0449dc485&quot;&lt;/span&gt; 激活。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;查看连接列表&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection show

NAME          UUID                                  TYPE      DEVICE 
有线连接 &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;    78e34636-8257-4d08-8123-93c2f2cbf96e  ethernet  eth0   
TP-LINK_1234  a753c8ad-4692-412a-ae78-84e0449dc485  wifi      wlan0  
TP-LINK_4568  0c343ac3-3523-4ecb-ae8a-ccfda27f3ec9  wifi      --     
unicom        d5ab144e-e7e9-4f6e-ad23-327120b0609c  gsm       --     
ztl-wifi      7db2de53-7b64-495a-ac23-0e9b21e08cd3  wifi      --  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;停用连接&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection down TP-LINK_1234

成功停用连接 &lt;span class=&quot;token string&quot;&gt;&quot;TP-LINK_1234&quot;&lt;/span&gt;（D-Bus 活动路径：/org/freedesktop/NetworkManager/ActiveConnection/2）&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;启用连接&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection up TP-LINK_1234

连接已成功激活（D-Bus 活动路径：/org/freedesktop/NetworkManager/ActiveConnection/3）&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除连接&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection delete TP-LINK_1234

成功删除连接 &lt;span class=&quot;token string&quot;&gt;&quot;TP-LINK_1234&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;a753c8ad-4692-412a-ae78-84e0449dc485&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;。
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection show

NAME        UUID                                  TYPE      DEVICE 
有线连接 &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  78e34636-8257-4d08-8123-93c2f2cbf96e  ethernet  eth0   
TP-LINK_4568    0c343ac3-3523-4ecb-ae8a-ccfda27f3ec9  wifi      --     
unicom      d5ab144e-e7e9-4f6e-ad23-327120b0609c  gsm       --     
ztl-wifi    7db2de53-7b64-495a-ac23-0e9b21e08cd3  wifi      --     &lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;you3-xian4-wang3-ka3-cao1-zuo4-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;有线网卡操作命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;查看连接列表&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection show

NAME        UUID                                  TYPE      DEVICE 
有线连接 &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  78e34636-8257-4d08-8123-93c2f2cbf96e  ethernet  eth0   
TP-LINK_4568    0c343ac3-3523-4ecb-ae8a-ccfda27f3ec9  wifi      --     
unicom      d5ab144e-e7e9-4f6e-ad23-327120b0609c  gsm       --     
ztl-wifi    7db2de53-7b64-495a-ac23-0e9b21e08cd3  wifi      --     &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;设置静态 IP&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection modify &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; ipv4.method manual &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
ipv4.addresses &lt;span class=&quot;token string&quot;&gt;&quot;192.168.0.240/24&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
ipv4.gateway &lt;span class=&quot;token string&quot;&gt;&quot;192.168.0.1&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
ipv4.dns &lt;span class=&quot;token string&quot;&gt;&quot;211.136.192.6,120.192.165.24&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;添加第二网段&lt;/strong&gt;（可选）业务需要&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection modify &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; +ipv4.addresses &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.9.205/24
或
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; addr &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.9.205/24 dev eth0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;激活配置&lt;/strong&gt;，先停用再启用&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection down &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection up &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;shan1-chu2-yi3-you3-wang3-ka3-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;删除已有网卡信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;清空网卡信息&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 清空所有手动设置的 IPv4 地址（包括IP和第二网段）&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection modify &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; ipv4.method auto &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  ipv4.addresses &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  ipv4.gateway &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  ipv4.dns &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 激活网卡配置&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection down &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection up &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除网卡&lt;/strong&gt;重新创建名为 “有线连接 1” 的以太网连接 con-name &amp;quot;有线连接 1&amp;quot;：指定新连接的名称，与删除的名称保持一致；ifname eth0：绑定到目标有线网卡接口；type ethernet：连接类型为以太网。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;con-name：&lt;code&gt;有线连接 1&lt;/code&gt;：指定新连接的名称，与删除的名称保持一致；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ifname ：&lt;code&gt;eth0&lt;/code&gt; 绑定到目标有线网卡接口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;type ：&lt;code&gt;ethernet&lt;/code&gt; 连接类型为以太网。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection delete &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 创建新网卡&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; con-name &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt; ifname eth0 &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; ethernet
&lt;span class=&quot;token comment&quot;&gt;# 启用新建的连接&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; nmcli connection up &lt;span class=&quot;token string&quot;&gt;&quot;有线连接 1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lan2-ya2-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;蓝牙配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;查看已配对列表&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;bluetoothctl devices&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入蓝牙交互界面，&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;D&lt;/kbd&gt; 退出交互页面&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 打开扫描&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bluetooth&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# scan on&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 关闭扫描&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bluetooth&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# scan off&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 配对蓝牙&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;bluetooth&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# pair 08:EB:ED:48:7B:6A&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 连接蓝牙&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;BS100&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# connect 08:EB:ED:48:7B:6A&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 信任连接（开机自动连接）&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;BS100&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# trust 08:EB:ED:48:7B:6A&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 连接详细信息&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;BS100&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# info 08:EB:ED:48:7B:6A&lt;/span&gt;
Device 08:EB:ED:48:7B:6A &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;public&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        Name: BS100
        Alias: BS100
        Class: 0x00240404
        Icon: audio-headset
        Paired: &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt;
        Trusted: &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt;
        Blocked: no
        Connected: &lt;span class=&quot;token function&quot;&gt;yes&lt;/span&gt;
        LegacyPairing: no
        UUID: Audio Sink                &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0000110b-0000-1000-8000-00805f9b34fb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        UUID: A/V Remote Control Target &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0000110c-0000-1000-8000-00805f9b34fb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        UUID: A/V Remote Control        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0000110e-0000-1000-8000-00805f9b34fb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        UUID: Handsfree                 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0000111e-0000-1000-8000-00805f9b34fb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
quit00&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;断开连接&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;disconnect 08:EB:ED:48:7B:6A&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除连接&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;remove 08:EB:ED:48:7B:6A&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;kuo4-zhan3-window&quot; tabindex=&quot;-1&quot;&gt;扩展 Window &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;查看网卡名称&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;netsh interface ipv4 show interfaces&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;添加第二网段 IP&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;netsh interface ipv4 &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; address &lt;span class=&quot;token assign-left variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;以太网&quot;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.9.254 &lt;span class=&quot;token number&quot;&gt;255.255&lt;/span&gt;.255.0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;删除第二网段 IP&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;netsh interface ipv4 delete address &lt;span class=&quot;token assign-left variable&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;以太网&quot;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.9.254&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Nginx 备忘录</title>
		<link href="https://www.dtking.cn/blog/memo/nginx/"/>
		<updated>2025-12-04T02:38:07Z</updated>
		<id>https://www.dtking.cn/blog/memo/nginx/</id>
		<content type="html">&lt;h3 id=&quot;dai4-li3-websocket&quot; tabindex=&quot;-1&quot;&gt;代理 WebSocket &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/memo/nginx/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;WebSocket 和 HTTP 使用相同端口&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt; &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /api&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;# WebSocket 后端地址（替换为你的真实 WebSocket 地址）&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 注意：WebSocket 地址无需加 /（根据后端配置调整）&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# WebSocket 必须使用 HTTP/1.1&lt;/span&gt;

		&lt;span class=&quot;token comment&quot;&gt;# 关键：转发 WebSocket 握手升级头&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Upgrade &lt;span class=&quot;token variable&quot;&gt;$http_upgrade&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&quot;token string&quot;&gt;&quot;upgrade&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 固定为 &quot;upgrade&quot;&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Host &lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Real-IP &lt;span class=&quot;token variable&quot;&gt;$remote_addr&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Forwarded-For &lt;span class=&quot;token variable&quot;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		&lt;span class=&quot;token comment&quot;&gt;# WebSocket 心跳保活（防止连接被断开）&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_read_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600s&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 长连接超时（1 小时，根据需求调整）&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_send_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600s&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Origin &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 解决部分后端 Origin 校验问题（可选）&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;qian2-duan1-ye4-mian4-da3-bao1-shi3-yong4-gzip&quot; tabindex=&quot;-1&quot;&gt;前端页面打包使用 Gzip &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/memo/nginx/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;前端页面如果使用 Gzip 压缩文件，代理不配置 Gzip 无法正常访问网页&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;http&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;				&lt;span class=&quot;token comment&quot;&gt;# 开启 Gzip 压缩功能	&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_min_length&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# 触发压缩的最小文件 / 响应大小（单位：字节）	&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_comp_level&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  	&lt;span class=&quot;token comment&quot;&gt;# Gzip 压缩级别（1-9）	&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_buffers&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4k&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 	&lt;span class=&quot;token comment&quot;&gt;# 压缩时使用的缓冲区大小&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt;       &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /www/example.com/web&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;index&lt;/span&gt; index.html index.htm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_static&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 启用 “预压缩文件优先” 功能	&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;qing3-qiu2-ti3-xian4-zhi4-huan3-chong1-qu1-gao1-xiao4-wen2-jian4-chuan2-shu1&quot; tabindex=&quot;-1&quot;&gt;请求体限制、缓冲区、高效文件传输 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/memo/nginx/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Nginx &lt;code&gt;413&lt;/code&gt; 错误 ,&lt;code&gt;client_max_body_size&lt;/code&gt; 允许上传大小限制问题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;http&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;client_max_body_size&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100m&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 	&lt;span class=&quot;token comment&quot;&gt;# 限制客户端请求体的最大大小（即上传文件 / POST 数据的最大体积）&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_buffer_size&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4k&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    	&lt;span class=&quot;token comment&quot;&gt;# Nginx 接收客户端请求体时的内存缓冲区大小&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_buffers&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32k&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  		&lt;span class=&quot;token comment&quot;&gt;# 代理请求时，Nginx 接收后端响应头的缓冲区大小&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;sendfile&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 				&lt;span class=&quot;token comment&quot;&gt;# 代理请求时，Nginx 接收后端响应体的缓冲区配置	&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;tcp_nopush&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;				&lt;span class=&quot;token comment&quot;&gt;# 启用 sendfile 系统调用，优化静态文件传输性能	&lt;/span&gt;
								&lt;span class=&quot;token comment&quot;&gt;# 配合 sendfile 使用，优化 TCP 数据包发送策略	&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;root&lt;/span&gt; /www/example.com/web&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;index&lt;/span&gt; index.html index.htm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;gzip_static&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>RK3576 设备 FFmpeg 与 OpenCV 集成指南：基于 rkmpp 硬解的编译安装与测试步骤</title>
		<link href="https://www.dtking.cn/blog/edge-box/RK3576/"/>
		<updated>2025-11-24T09:55:36Z</updated>
		<id>https://www.dtking.cn/blog/edge-box/RK3576/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;一、重装 MPP &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;二、安装 rkmpp &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;三、安装 rkrga &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;四、安装 ffmpeg &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;五、安装 OpenCV &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;六、测试验证 rkmpp &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;假设所有必要的库和工具链都已安装，例如&lt;code&gt;git&lt;/code&gt;,&lt;code&gt;meson&lt;/code&gt;,&lt;code&gt;cmake&lt;/code&gt;,&lt;code&gt;pkg-config&lt;/code&gt;,&lt;code&gt;gcc&lt;/code&gt;,&lt;code&gt;libdrm-dev&lt;/code&gt;等等……&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;预计全部编译完成需要 &lt;code&gt;2-3&lt;/code&gt; 个小时。官方提供了一个&lt;a href=&quot;http://wikicn.gzdcsmt.com/wendang_id_47.html#son68&quot;&gt;新的固件&lt;/a&gt;据说已经支持了 &lt;code&gt;ffmpeg&lt;/code&gt;，没试过不知道行不行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nyanmisaka/ffmpeg-rockchip/wiki/Compilation&quot;&gt;ffmpeg-rockchip 安装文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nyanmisaka/ffmpeg-rockchip/&quot;&gt;ffmpeg-rockchip 源码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rockchip-linux/mpp/blob/develop/doc/Rockchip_Developer_Guide_MPP_CN.md#522-unixlinux%E5%B9%B3%E5%8F%B0%E7%BC%96%E8%AF%91&quot;&gt;官方 MPP 编译说明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;yi1-zhong4-zhuang1-mpp&quot; tabindex=&quot;-1&quot;&gt;&lt;strong&gt;一、重装 MPP&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;依赖工具&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; build-essential cmake pkg-config &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    libdrm-dev libssl-dev libopencv-dev &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    aarch64-linux-gnu-gcc aarch64-linux-gnu-g++  &lt;span class=&quot;token comment&quot;&gt;# 若交叉编译需安装&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;获取 MPP 源码&lt;/strong&gt;：瑞芯微官方 MPP 仓库：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/rockchip-linux/mpp.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; mpp&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;脚本&lt;/strong&gt;所在目录：make-Makefiles.bash&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; mpp/build/linux/aarch64/ &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行脚本&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x make-Makefiles.bash  &lt;span class=&quot;token comment&quot;&gt;# 赋予执行权限&lt;/span&gt;
./make-Makefiles.bash&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; -j&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;nproc&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 多线程编译，加速过程&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 默认安装到 /usr/local/lib 和 /usr/local/include&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新动态链接库缓存&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ldconfig&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 测试 H.264 裸流解码（需准备一个 Annex-B 格式的 H.264 测试文件 test.h264）&lt;/span&gt;
mpi_dec_test &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; test.h264 &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# -t 7 表示 H.264 解码&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果测试工具能正常输出解码日志（如 decode frame 相关信息），则说明 MPP 库功能正常，可继续集成到你的 rknn_rtsp_grab_demo 程序中使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;er4-an1-zhuang1-rkmpp&quot; tabindex=&quot;-1&quot;&gt;二、安装 rkmpp &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; ~/dev &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/dev
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; jellyfin-mpp &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/nyanmisaka/mpp.git rkmpp
&lt;span class=&quot;token function&quot;&gt;pushd&lt;/span&gt; rkmpp
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; rkmpp_build
&lt;span class=&quot;token function&quot;&gt;pushd&lt;/span&gt; rkmpp_build
cmake &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-DCMAKE_INSTALL_PREFIX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Release &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-DBUILD_SHARED_LIBS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ON &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-DBUILD_TEST&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;OFF &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;nproc&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;san1-an1-zhuang1-rkrga&quot; tabindex=&quot;-1&quot;&gt;三、安装 rkrga &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; ~/dev &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/dev
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; jellyfin-rga &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/nyanmisaka/rk-mirrors.git rkrga
meson setup rkrga rkrga_build &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--libdir&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;lib &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;--buildtype&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;release &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    --default-library&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;shared &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-Dcpp_args&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;-fpermissive &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-Dlibdrm&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;false &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
    &lt;span class=&quot;token parameter variable&quot;&gt;-Dlibrga_demo&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;false
meson configure rkrga_build
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ninja &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; rkrga_build &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;si4-an1-zhuang1-ffmpeg&quot; tabindex=&quot;-1&quot;&gt;四、安装 ffmpeg &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;安装 &lt;code&gt;ffmpeg&lt;/code&gt; 切记要删除旧版本的一些 lib，否则后面编译安装后会出现两个版，导致 &lt;code&gt;opencv&lt;/code&gt; 编译连接 &lt;code&gt;ffmpeg&lt;/code&gt; 有问题无法使用 &lt;code&gt;rkmpp&lt;/code&gt; 硬解。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;卸载系统预装的 FFmpeg 库&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 卸载系统预装的 libavcodec 及相关库&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; remove &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; libavcodec58 libavcodec-dev libavformat58 libavformat-dev libavutil56 libavutil-dev libswscale5 libswscale-dev

&lt;span class=&quot;token comment&quot;&gt;# 清理残留文件&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; autoremove &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; autoclean&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;删除旧版本的残留文件和符号链接&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/lib/aarch64-linux-gnu/libavcodec.so*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/lib/aarch64-linux-gnu/libavformat.so*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/lib/aarch64-linux-gnu/libavutil.so*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/lib/aarch64-linux-gnu/libswscale.so*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /usr/lib/aarch64-linux-gnu/pkgconfig/libavcodec.pc&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;原编译命令：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; ~/dev &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/dev
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/nyanmisaka/ffmpeg-rockchip.git ffmpeg
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ffmpeg
./configure &lt;span class=&quot;token parameter variable&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr --enable-gpl --enable-version3 --enable-libdrm --enable-rkmpp --enable-rkrga
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;nproc&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Try the compiled FFmpeg without installation&lt;/span&gt;
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-decoders&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkmpp
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-encoders&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkmpp
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-filters&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkrga

&lt;span class=&quot;token comment&quot;&gt;# Install FFmpeg to the prefix path&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修改编译配置：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;--enable-pic&lt;/strong&gt;：生成位置无关代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--enable-shared&lt;/strong&gt;：生成动态库（.so）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--disable-static&lt;/strong&gt;：禁用静态库（避免冲突）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;./configure &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-gpl &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-version3 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-libdrm &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-rkmpp &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-rkrga &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-pic &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --enable-shared &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  --disable-static
  
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;nproc&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Try the compiled FFmpeg without installation&lt;/span&gt;
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-decoders&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkmpp
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-encoders&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkmpp
./ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-filters&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; rkrga

&lt;span class=&quot;token comment&quot;&gt;# Install FFmpeg to the prefix path&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;不修改会出现的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;/usr/bin/ld: /usr/lib/libavutil.a(tx_float_neon.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `ff_tx_tab_32_float&#39; which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/lib/libavutil.a(tx_float_neon.o): in function `ff_tx_fft32_float_neon&#39;:
/home/ztl/dev/ffmpeg/libavutil/aarch64/tx_float_neon.S:923:(.text+0x61c): 危险的重寻址: unsupported relocation
/usr/bin/ld: /usr/lib/libavutil.a(tx_float_neon.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `ff_tx_tab_32_float&#39; which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/lib/libavutil.a(tx_float_neon.o): in function `ff_tx_fft32_ns_float_neon&#39;:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么会出现这个问题&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;这个错误是由于 &lt;strong&gt;FFmpeg&lt;/strong&gt; 编译时未启用 &lt;code&gt;-fPIC&lt;/code&gt; 选项 导致的。&lt;code&gt;-fPIC&lt;/code&gt; 是生成 “位置无关代码（Position-Independent Code）” 的编译选项，用于动态链接库（&lt;code&gt;.so&lt;/code&gt;）的生成。OpenCV 编译时需要链接 FFmpeg 的动态库，但你的 FFmpeg 库是静态编译的（&lt;code&gt;.a&lt;/code&gt; 文件）且未带 &lt;code&gt;-fPIC&lt;/code&gt;，导致链接失败。&lt;/p&gt;
&lt;h2 id=&quot;wu3-an1-zhuang1-opencv&quot; tabindex=&quot;-1&quot;&gt;五、安装 OpenCV &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; ~/opencv_build &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/opencv_build

&lt;span class=&quot;token comment&quot;&gt;# 下载OpenCV主库 (版本4.8.0，与您当前版本一致)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;--depth&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; https://github.com/opencv/opencv.git opencv
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; opencv
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout &lt;span class=&quot;token number&quot;&gt;4.8&lt;/span&gt;.0

&lt;span class=&quot;token comment&quot;&gt;# 下载opencv_contrib&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/opencv/opencv_contrib.git opencv_contrib
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; opencv_contrib
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout &lt;span class=&quot;token number&quot;&gt;4.8&lt;/span&gt;.0

&lt;span class=&quot;token comment&quot;&gt;# 回到工作目录&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;


&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; build &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; build
&lt;span class=&quot;token comment&quot;&gt;# cmake 编译&lt;/span&gt;
cmake &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;RELEASE &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CMAKE_INSTALL_PREFIX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;OPENCV_EXTRA_MODULES_PATH&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/home/ztl/opencv_build/opencv_contrib/modules &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;WITH_GSTREAMER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ON &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;WITH_FFMPEG&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ON &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;FFMPEG_LIBAVCODEC&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/lib/libavcodec.so &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;FFMPEG_LIBAVFORMAT&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/lib/libavformat.so &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;FFMPEG_LIBAVUTIL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/lib/libavutil.so &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;FFMPEG_LIBSWSCALE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/lib/libswscale.so &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PYTHON3_EXECUTABLE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; python3&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PYTHON3_INCLUDE_DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;python3 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &quot;import sysconfig&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; print&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysconfig.get_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;include&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PYTHON3_PACKAGES_PATH&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;python3 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &quot;import sysconfig&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; print&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sysconfig.get_path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;purelib&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; -j&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;nproc&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;liu4-ce4-shi4-yan4-zheng4-rkmpp&quot; tabindex=&quot;-1&quot;&gt;六、测试验证 rkmpp &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cv2

&lt;span class=&quot;token comment&quot;&gt;# 启用 FFmpeg 详细日志，打印解码器信息&lt;/span&gt;
os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FFMPEG_DEBUG&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;verbose&quot;&lt;/span&gt;
os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;OPENCV_FFMPEG_CAPTURE_OPTIONS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;video_codec;h264_rkmpp&quot;&lt;/span&gt;

cap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VideoCapture&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;rtsp://admin:123456@192.168.0.111:554/stream1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CAP_FFMPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isOpened&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;流打开成功，硬解大概率生效！&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 读取10帧，触发解码日志&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        ret&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; frame &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; ret&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;成功读取第 &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;_&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; 帧，分辨率：&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;frame&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;shape&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
    cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出一下日志说明，opencv 和 ffmpeg 没有关联上。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ERROR:0@5.788&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; global cap_ffmpeg_impl.hpp:1246 &lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; Could not &lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; decoder &lt;span class=&quot;token string&quot;&gt;&#39;h264_rkmpp&#39;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;ERROR:0@5.788&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; global cap_ffmpeg_impl.hpp:1286 &lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; VIDEOIO/FFMPEG: Failed to initialize VideoCapture
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; WARN:0@5.788&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; global cap.cpp:204 &lt;span class=&quot;token function&quot;&gt;open&lt;/span&gt; VIDEOIO&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FFMPEG&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: backend is generally available but can&#39;t be used to capture by nam&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>NVIDIA Jetson TX2 边缘盒子运行姿态检测模型记录</title>
		<link href="https://www.dtking.cn/blog/ml/Jetson%20tx2/"/>
		<updated>2025-10-17T01:37:29Z</updated>
		<id>https://www.dtking.cn/blog/ml/Jetson%20tx2/</id>
		<content type="html">&lt;p&gt;在 Jetson TX2（JetPack 4.6.1 系统）上通过 Docker 部署 MediaPipe 的完整流程，包含环境配置、镜像拉取与容器启动参数说明，提供基于 RTSP 视频流的姿态检测测试代码及开合跳动作计数实现，解决 ARM 架构下 MediaPipe 运行的适配问题，适用于边缘设备视频流处理与人体动作分析场景。&lt;/p&gt;
&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;背景介绍 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;设置 docker &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;拉镜像 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;启动容器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;显示支持 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;启动命令： &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;参数说明 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;1️⃣ 基本选项 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;2️⃣ GPU/NVIDIA 相关 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;3️⃣ 网络 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;4️⃣ 挂载卷（Volume） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;5️⃣ 显示相关环境变量 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;6️⃣ 镜像和命令 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;✅ 总结 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;测试代码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;开合跳代码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;注意事项 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;一、目录挂载问题 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;二、Can&#39;t find file: mediapipe/modules/pose_detection/pose_detection.tflite &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;三、eglChooseConfig() returned no matching EGL configuration for RGBA8888 D16 ES2 request &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;参考资料 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;扩展信息 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统版本&lt;/strong&gt;：JetPack 4.6.1 (对应 L4T R32.6.1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;架构&lt;/strong&gt;：aarch64（ARM 64）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CUDA 版本&lt;/strong&gt;：10.2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;python 3.6&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bei4-jing3-jie4-shao4&quot; tabindex=&quot;-1&quot;&gt;背景介绍 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;​	最近在做关于视频流处理方面项目，接触到&lt;code&gt;NVIDIA&lt;/code&gt; 的边缘盒子，就尝试着看在边缘盒子上能不能运行 yolov8 或 Google 的 mediapipe 。&lt;/p&gt;
&lt;p&gt;yolov8 是无法在这个版本的盒子运行（无法使用 cuda，CPU 推理卡的厉害），而且 Jetpack 4.6.1 版本的盒子无法升级 5.xx 版本，yolov8 最低需要 Python 3.8 版本，所以就选择 mediapipe 。&lt;/p&gt;
&lt;p&gt;使用 mediapipe 最好就是使用 docker 来处理，自己在系统安装环境非常麻烦（CUDA10.2 + aarch64 问题），而且坑特别多根本跳不完的坑。&lt;/p&gt;
&lt;h2 id=&quot;she4-zhi4-docker&quot; tabindex=&quot;-1&quot;&gt;设置 docker &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jetson-docs.com/getting-started/docker&quot;&gt;参考资料&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装nano（或任何其他文本编辑器）：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开放时间&lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; /etc/docker/daemon.json&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑自：&lt;/p&gt;
&lt;p&gt;json&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;runtimes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;nvidia&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvidia-container-runtime&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;runtimeArgs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到：&lt;/p&gt;
&lt;p&gt;json&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;runtimes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;nvidia&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvidia-container-runtime&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;runtimeArgs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 

    &lt;span class=&quot;token property&quot;&gt;&quot;default-runtime&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nvidia&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启docker：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl restart &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现在需要将 docker 添加用户到组：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;usermod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-aG&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$USER&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;la1-jing4-xiang4&quot; tabindex=&quot;-1&quot;&gt;拉镜像 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;Python&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;OpenCV&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;mediapipe&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;镜像标签&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;镜像文件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;3.6.9&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;4.8.0&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;0.8.5&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/lanzani/jetson-libraries/pkgs/container/mediapipe/159638212?tag=l4t32.7.1-py3.6.9-ocv4.8.0-mp0.8.5&quot;&gt;l4t32.7.1-py3.6.9-ocv4.8.0-mp0.8.5&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://github.com/lanzani/jetson-libraries/blob/main/libraries/opencv/l4t32.7.1/py3.6.9/ocv4.8.0/Dockerfile&quot;&gt;Dockerfile&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; pull ghcr.io/lanzani/mediapipe:l4t32.7.1-py3.6.9-ocv4.8.0-mp0.8.5&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;qi3-dong4-rong2-qi4&quot; tabindex=&quot;-1&quot;&gt;启动容器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://jetson-docs.com/getting-started/docker#run-docker-containers&quot;&gt;参考资料&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;xian3-shi4-zhi1-chi2&quot; tabindex=&quot;-1&quot;&gt;显示支持 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;运行容器之前：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;:0&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;xhost +&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后运行你的容器。&lt;/p&gt;
&lt;h3 id=&quot;qi3-dong4-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;启动命令： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rm&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--runtime&lt;/span&gt; nvidia &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--network&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/argus_socket:/tmp/argus_socket &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /etc/enctune.conf:/etc/enctune.conf &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /etc/nv_tegra_release:/etc/nv_tegra_release &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/nv_jetson_model:/tmp/nv_jetson_model &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/.X11-unix/:/tmp/.X11-unix &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/.docker.xauth:/tmp/.docker.xauth &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /home/ubuntu/google-media/data:/opt &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--device&lt;/span&gt; /dev/snd &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--device&lt;/span&gt; /dev/bus/usb &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;:0 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;XAUTHORITY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/tmp/.docker.xauth &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
ghcr.io/lanzani/mediapipe:l4t32.7.1-py3.6.9-ocv4.8.0-mp0.8.5 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
python3.6 /opt/pcv3.py&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;can1-shu4-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;参数说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;1-ji1-ben3-xuan3-xiang4&quot; tabindex=&quot;-1&quot;&gt;1️⃣ 基本选项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sudo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提权执行 docker&lt;/td&gt;
&lt;td&gt;因为 Docker 默认需要 root 权限，或者用户在 docker 组中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;启动容器&lt;/td&gt;
&lt;td&gt;核心命令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-it&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;交互式终端&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt; 保持 STDIN 打开，&lt;code&gt;-t&lt;/code&gt; 分配伪终端，&lt;code&gt;-t&lt;/code&gt; 换成 &lt;code&gt;-d&lt;/code&gt; 可后台运行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;容器退出后自动删除&lt;/td&gt;
&lt;td&gt;避免堆积临时容器，测试使用，没问题后可删除这个选择&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;2-gpunvidia-xiang1-guan1&quot; tabindex=&quot;-1&quot;&gt;2️⃣ GPU/NVIDIA 相关 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--runtime nvidia&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用 NVIDIA Docker runtime&lt;/td&gt;
&lt;td&gt;让容器访问 GPU。Jetson 的 L4T 环境通常也需要这个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--device /dev/snd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;音频设备&lt;/td&gt;
&lt;td&gt;允许容器访问宿主机的音频设备，方便 TTS 或播放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--device /dev/bus/usb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;USB 设备&lt;/td&gt;
&lt;td&gt;允许访问 USB 摄像头或其他设备&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;3-wang3-luo4&quot; tabindex=&quot;-1&quot;&gt;3️⃣ 网络 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--network host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;容器共享宿主机网络&lt;/td&gt;
&lt;td&gt;对于访问本地摄像头、USB 或 V4L2 流媒体方便&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;4-gua4-zai3-juan4-volume&quot; tabindex=&quot;-1&quot;&gt;4️⃣ 挂载卷（Volume） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Volume 主要是让容器访问宿主机文件或设备。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /tmp/argus_socket:/tmp/argus_socket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Argus 摄像头 socket&lt;/td&gt;
&lt;td&gt;Jetson 的摄像头 API（Argus）需要这个 socket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /etc/enctune.conf:/etc/enctune.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GPU/编码配置&lt;/td&gt;
&lt;td&gt;Jetson 的编码器调优文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /etc/nv_tegra_release:/etc/nv_tegra_release&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;系统版本信息&lt;/td&gt;
&lt;td&gt;让容器识别 Jetson 系统版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /tmp/nv_jetson_model:/tmp/nv_jetson_model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jetson 硬件信息&lt;/td&gt;
&lt;td&gt;某些 SDK 需要读取型号信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /tmp/.X11-unix/:/tmp/.X11-unix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X11 socket&lt;/td&gt;
&lt;td&gt;允许 GUI 程序在宿主机显示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /tmp/.docker.xauth:/tmp/.docker.xauth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X11 认证&lt;/td&gt;
&lt;td&gt;避免权限问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-v /home/ubuntu/google-media/data:/opt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据文件&lt;/td&gt;
&lt;td&gt;容器内 &lt;code&gt;/opt&lt;/code&gt; 可访问宿主机数据（你写的 &lt;code&gt;pcv3.py&lt;/code&gt; 就在这里）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;5-xian3-shi4-xiang1-guan1-huan2-jing4-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;5️⃣ 显示相关环境变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e DISPLAY=:0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X11 显示&lt;/td&gt;
&lt;td&gt;指定 GUI 输出到宿主机显示器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-e XAUTHORITY=/tmp/.docker.xauth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;X11 认证&lt;/td&gt;
&lt;td&gt;配合挂载 &lt;code&gt;.docker.xauth&lt;/code&gt; 文件使用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;6-jing4-xiang4-he2-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;6️⃣ 镜像和命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ghcr.io/lanzani/mediapipe:l4t32.7.1-py3.6.9-ocv4.8.0-mp0.8.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docker 镜像&lt;/td&gt;
&lt;td&gt;这个镜像包含 MediaPipe、OpenCV 4.8、Python3.6.9，适配 Jetson L4T 32.7.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;python3.6 /opt/pcv3.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;容器启动后执行&lt;/td&gt;
&lt;td&gt;执行你挂载在 &lt;code&gt;/opt&lt;/code&gt; 的 Python 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;✅ 总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;这个命令做了几件事情：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;启动一个基于 Jetson 的 MediaPipe 镜像。&lt;/li&gt;
&lt;li&gt;容器可以访问 GPU、音频和 USB 设备。&lt;/li&gt;
&lt;li&gt;容器共享宿主机网络和 X11 显示，可以直接用 GUI。&lt;/li&gt;
&lt;li&gt;容器自动挂载宿主机文件和配置，运行 Python 脚本 &lt;code&gt;/opt/pcv3.py&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ce4-shi4-dai4-ma3&quot; tabindex=&quot;-1&quot;&gt;测试代码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;pcv3.py&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cv2
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; mediapipe &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; mp

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pwd:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mediapipe pwd:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# === RTSP 地址（请改成你的摄像头地址） ===&lt;/span&gt;
RTSP_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rtsp://admin:123456@192.168.0.1:554/stream1&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# === 初始化 MediaPipe Pose ===&lt;/span&gt;
mp_drawing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;solutions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;drawing_utils
mp_pose &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;solutions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose

&lt;span class=&quot;token comment&quot;&gt;# 启动 RTSP 视频流&lt;/span&gt;
cap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VideoCapture&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RTSP_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isOpened&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;xxxx stop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 初始化 Pose 模型（static_image_mode=False 表示视频流）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; mp_pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Pose&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    static_image_mode&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    model_complexity&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    min_detection_confidence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    min_tracking_confidence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pose&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        success&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; frame &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; success&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;dddiu&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 转换为 RGB（MediaPipe 要求输入 RGB）&lt;/span&gt;
        image_rgb &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cvtColor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;COLOR_BGR2RGB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 推理&lt;/span&gt;
        results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_rgb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 可视化骨架&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;draw_landmarks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
                mp_pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POSE_CONNECTIONS&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                landmark_drawing_spec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DrawingSpec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; thickness&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; circle_radius&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                connection_drawing_spec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DrawingSpec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; thickness&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 显示画面&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;#cv2.imshow(&#39;Pose Detection (RTSP)&#39;, frame)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# 按 q 退出&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;waitKey&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0xFF&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;ord&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;q&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;release&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;destroyAllWindows&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;kai1-he2-tiao4-dai4-ma3&quot; tabindex=&quot;-1&quot;&gt;开合跳代码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;通过关键点，计算开合跳数量&lt;/p&gt;
&lt;pre class=&quot;language-python&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cv2
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; threading
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; queue
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; math
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; time
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; mediapipe &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; mp

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 配置&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
RTSP_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rtsp://admin:123456@127.0.0.1:554/stream1?transport=tcp&quot;&lt;/span&gt;
SERVER_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://127.0.0.1:8080/upload&quot;&lt;/span&gt;
JPEG_QUALITY &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# JPEG 编码质量&lt;/span&gt;
QUEUE_MAXSIZE &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# 队列长度 1，保持最新帧&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 队列&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
frame_queue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Queue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;maxsize&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;QUEUE_MAXSIZE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
upload_queue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Queue&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;maxsize&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;QUEUE_MAXSIZE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;



&lt;span class=&quot;token comment&quot;&gt;# 计算两点之间的欧式距离（用于判断双脚分开的程度）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;calc_distance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; p2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sqrt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; p2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; p2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 上传函数&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;upload_jpeg_bytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_bytes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; server_url&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        files &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;image&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;uploaded_image.jpg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; image_bytes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;image/jpeg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;server_url&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; files&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;raise_for_status&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;上传失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 抓帧线程&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;frame_grabber&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    cap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;VideoCapture&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RTSP_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isOpened&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;无法打开 RTSP 流&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        success&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; frame &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cap&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; success&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# 丢弃旧帧&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; frame_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                frame_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_nowait&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Empty&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;pass&lt;/span&gt;
        frame_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;put&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frame&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 上传线程&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;uploader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            frame_bytes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; upload_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            upload_jpeg_bytes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frame_bytes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; SERVER_URL&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;上传线程异常:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 主线程处理&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main_loop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    mp_drawing &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;solutions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;drawing_utils
    mp_pose &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;solutions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose
    jumping_jacks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# 开合跳次数计数器&lt;/span&gt;
    stage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;down&quot;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;# 动作阶段：down=手脚收拢，up=手脚张开&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; mp_pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Pose&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            static_image_mode&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            model_complexity&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            min_detection_confidence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            min_tracking_confidence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pose&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; frame_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;empty&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

            frame &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; frame_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# 转 RGB&lt;/span&gt;
            image_rgb &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cvtColor&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;COLOR_BGR2RGB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# Mediapipe 推理&lt;/span&gt;
            results &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;process&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_rgb&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# 绘制骨架&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;draw_landmarks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                    frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    mp_pose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;POSE_CONNECTIONS&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    landmark_drawing_spec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DrawingSpec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; thickness&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; circle_radius&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    connection_drawing_spec&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;mp_drawing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DrawingSpec&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; thickness&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 如果检测到人体关键点&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                landmarks &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; results&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pose_landmarks&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;landmark

                &lt;span class=&quot;token comment&quot;&gt;# 取出关键点（左右手腕、鼻子、左右脚踝）&lt;/span&gt;
                left_wrist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; landmarks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                right_wrist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; landmarks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                nose &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; landmarks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;# 头顶附近点&lt;/span&gt;
                left_ankle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; landmarks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;27&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                right_ankle &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; landmarks&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

                &lt;span class=&quot;token comment&quot;&gt;# ===== 手部逻辑 =====&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 当手腕的 y 坐标小于鼻子时，说明手举过头顶&lt;/span&gt;
                hands_up &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; left_wrist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; nose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; right_wrist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; nose&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;y

                &lt;span class=&quot;token comment&quot;&gt;# ===== 脚部逻辑 =====&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 计算左右脚踝之间的距离&lt;/span&gt;
                ankle_dist &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; calc_distance&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;left_ankle&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; right_ankle&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;r&quot;ankle_dis&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;ankle_dist&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 如果距离大于阈值，说明双脚分开&lt;/span&gt;
                legs_open &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ankle_dist &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.10&lt;/span&gt;

                &lt;span class=&quot;token comment&quot;&gt;# ===== 动作阶段判断 =====&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 如果手举起且脚分开，认为处于 &quot;up&quot; 状态&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; hands_up &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; legs_open&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    stage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;up&quot;&lt;/span&gt;
                &lt;span class=&quot;token comment&quot;&gt;# 如果手放下且脚收拢，并且之前是 &quot;up&quot;，说明完成一次开合跳&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; hands_up &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; legs_open &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; stage &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;up&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    stage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;down&quot;&lt;/span&gt;
                    jumping_jacks &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 次数 +1&lt;/span&gt;



                &lt;span class=&quot;token comment&quot;&gt;# 在左上角显示开合跳次数&lt;/span&gt;
                cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;putText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
                    frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&#39;Jumping Jacks: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;jumping_jacks&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 显示文本&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                          &lt;span class=&quot;token comment&quot;&gt;# 位置 (x,y)&lt;/span&gt;
                    cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FONT_HERSHEY_SIMPLEX&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;# 字体&lt;/span&gt;
                    &lt;span class=&quot;token number&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                               &lt;span class=&quot;token comment&quot;&gt;# 字号&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;                       &lt;span class=&quot;token comment&quot;&gt;# 颜色 (绿色)&lt;/span&gt;
                    &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;                                  &lt;span class=&quot;token comment&quot;&gt;# 粗细&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token comment&quot;&gt;# 编码 JPEG 并放入上传队列&lt;/span&gt;
            _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;buffer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;imencode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;.jpg&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; frame&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cv2&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IMWRITE_JPEG_QUALITY&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; JPEG_QUALITY&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            frame_bytes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;buffer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tobytes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; upload_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;full&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    upload_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_nowait&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Empty&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;pass&lt;/span&gt;
            upload_queue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;put&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;frame_bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 启动线程&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ======================&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    threading&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Thread&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;frame_grabber&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; daemon&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    threading&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Thread&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;uploader&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; daemon&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    main_loop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;yi1-mu4-lu4-gua4-zai3-wen4-ti2&quot; tabindex=&quot;-1&quot;&gt;一、目录挂载问题 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;-v /home/ubuntu/google-media/data:/opt &#92;&lt;/code&gt; 将宿主机的测试 &lt;code&gt;python&lt;/code&gt; 代码挂载到容器 &lt;code&gt;opt&lt;/code&gt; 目录下，所以&lt;code&gt;/home/ubuntu/google-media/data&lt;/code&gt;这个目录是自己创建的。&lt;/p&gt;
&lt;h3 id=&quot;er4-cant-find-file-mediapipemodulesposedetectionposedetectiontflite&quot; tabindex=&quot;-1&quot;&gt;二、Can&#39;t find file: mediapipe/modules/pose_detection/pose_detection.tflite &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Mediapipe 模型加载问题，没有找到这个文件，&lt;code&gt;python3.6 /opt/pcv3.py&lt;/code&gt; 是在容器的 &lt;code&gt;opt&lt;/code&gt; 目录下执行的，在当前工作目录下默认是没有这个 &lt;code&gt;mediapipe/modules/pose_detection/pose_detection.tflite&lt;/code&gt; 文件，简单粗暴解决办法：&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;docker exec 容器ID&lt;/code&gt; &lt;code&gt;/bin/bash&lt;/code&gt;，进入容器创建 &lt;code&gt;/opt/mediapipe/modules/pose_detection/&lt;/code&gt; 从 &lt;code&gt;dist-packages&lt;/code&gt; 拷贝一个份&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /opt/mediapipe/modules/pose_detection/
&lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; /usr/local/lib/python3.6/dist-packages/mediapipe/modules/pose_detection/pose_detection.tflite /opt/mediapipe/modules/pose_detection/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动日志：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;WARNING: Logging before InitGoogleLogging&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; is written to STDERR
I20251016 06:39:17.998665    &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; gl_context_egl.cc:163&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Successfully initialized EGL. Major &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Minor: &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
I20251016 06:39:18.044948    &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt; gl_context.cc:331&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; GL version: &lt;span class=&quot;token number&quot;&gt;3.2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;OpenGL ES &lt;span class=&quot;token number&quot;&gt;3.2&lt;/span&gt; NVIDIA &lt;span class=&quot;token number&quot;&gt;32.6&lt;/span&gt;.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
I20251016 06:39:18.045231    &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; gl_context_egl.cc:163&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Successfully initialized EGL. Major &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; Minor: &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
I20251016 06:39:18.072178    &lt;span class=&quot;token number&quot;&gt;43&lt;/span&gt; gl_context.cc:331&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; GL version: &lt;span class=&quot;token number&quot;&gt;3.2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;OpenGL ES &lt;span class=&quot;token number&quot;&gt;3.2&lt;/span&gt; NVIDIA &lt;span class=&quot;token number&quot;&gt;32.6&lt;/span&gt;.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
W20251016 06:39:18.075790    &lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt; tflite_model_loader.cc:32&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Trying to resolve path manually as GetResourceContents failed: &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; Can&#39;t &lt;span class=&quot;token function&quot;&gt;find&lt;/span&gt; file: mediapipe/modules/pose_detection/pose_detection.tflite
INFO: Created TensorFlow Lite delegate &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; GPU.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;san1-eglchooseconfig-returned-no-matching-egl-configuration-for-rgba8888-d16-es2-request&quot; tabindex=&quot;-1&quot;&gt;三、eglChooseConfig() returned no matching EGL configuration for RGBA8888 D16 ES2 request &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AI 回答：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MediaPipe 默认会尝试用 &lt;strong&gt;GPU (OpenGL ES)&lt;/strong&gt; 模式运行 Pose 模型。&lt;br&gt;
但 Jetson TX2 某些驱动 / EGL 库 版本（尤其 JetPack 4.6.x）下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EGL 配置不匹配&lt;/li&gt;
&lt;li&gt;X server 或 DISPLAY 环境未正确设置&lt;/li&gt;
&lt;li&gt;无法创建 GLES3 / GLES2 上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终 GPU 初始化失败，导致 MediaPipe Pose 图计算图无法启动。&lt;/p&gt;
&lt;p&gt;实际情况是在启动 docker 容器时缺少了一些必要参数：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/argus_socket:/tmp/argus_socket &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /etc/enctune.conf:/etc/enctune.conf &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /etc/nv_tegra_release:/etc/nv_tegra_release &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/nv_jetson_model:/tmp/nv_jetson_model &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/.X11-unix/:/tmp/.X11-unix &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; /tmp/.docker.xauth:/tmp/.docker.xauth &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--device&lt;/span&gt; /dev/snd &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;--device&lt;/span&gt; /dev/bus/usb &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;DISPLAY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;:0 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
&lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;XAUTHORITY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/tmp/.docker.xauth &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;can1-kao3-zi1-liao4&quot; tabindex=&quot;-1&quot;&gt;参考资料 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.nvidia.com/embedded/downloads#?search=torch&quot;&gt;Jetson torch 下载中心&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jetson-docs.com/&quot;&gt;Jetson 开发文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anion0278/mediapipe-jetson/tree/main&quot;&gt;手动安装 Google MediaPipe Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/google-ai-edge/mediapipe&quot;&gt;Google MediaPipe&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;kuo4-zhan3-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;扩展信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;查看版本信息&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; /etc/nv_tegra_release&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看系统架构&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 cuda 信息&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;nvcc &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 CPU、GPU、内存使用情况&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; tegrastats&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;诊断系统 OpenCV 是否支持 cuda，也可以自容器执行&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python3.6 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;import cv2; print(&#39;--- System OpenCV Info ---&#39;); print(cv2.getBuildInformation())&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看 mediapipe  版本信息&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python3.6 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;import mediapipe as mp; print(mp.__version__)&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PyTorch（适用于 JetPack 4.6.1）&lt;/strong&gt;：是一个针对使用 GPU 和 CPU 进行深度学习而优化的张量库&lt;br&gt;
&lt;strong&gt;NVIDIA JetPack™&lt;/strong&gt; ：是 NVIDIA Jetson™ 平台的官方软件堆栈，为您提供构建 AI 驱动的边缘应用程序所需的一整套工具和库。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Go 语言学习路线图</title>
		<link href="https://www.dtking.cn/blog/golang/roadmap-golang/"/>
		<updated>2025-10-17T01:37:29Z</updated>
		<id>https://www.dtking.cn/blog/golang/roadmap-golang/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;介绍 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;为什么要使用 Go？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Go 的历史 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;设置环境 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Go 中的 Hello World &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Go 命令 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;基础 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;变量和常量 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;var 与 := &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;零值 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;const 和 iota &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;作用域和遮蔽 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;数据类型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;数值类型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;整数（有符号、无符号） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;浮点数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;复数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;布尔值 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;字符 Runes &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;字符类型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;原始字符串文字 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;解释字符串文字 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;类型转换 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;命令和文档 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;复合类型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;数组 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;切片 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;产能与增长 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;make() &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;切片到数组的转换 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;数组到切片的转换 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;字符串 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;字典 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Ok 表达式 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;结构体 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;结构标签和 JSON &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;嵌入结构 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;条件 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;if &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;if-else &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;switch &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;循环 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;for 循环 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;for-range &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;迭代 Map &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;迭代字符串 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;break &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;continue &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;goto（不鼓励） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;函数 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;函数基础 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;可变参数函数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;多个返回值 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;匿名函数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;闭包 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;命名返回值 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;按值调用 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;指针 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;基础知识 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;结构体指针 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;带有 Map 和 Slice 的指针 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;简短的概述 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;内存管理&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;垃圾收集&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;方法和接口 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;方法与函数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;指针接收器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;值接收器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;接口 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;基础知识 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;空接口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;嵌入接口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;类型断言 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;类型切换 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;泛型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;泛型函数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;泛型类型/接口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;类型约束 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;类型推断 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;错误处理 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;基础知识 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;错误接口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;error.New &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;fmt.Errorf &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;包装/解包错误 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;哨兵错误 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;panic 并 recover &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;堆栈跟踪和调试 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;代码组织 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;模块和依赖项 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go mod init &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go mod tidy &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go mod vendor &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;包 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;包导入规则 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;使用第三方软件包 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;发布模块 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;并发 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Goroutines 协程 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Channles 通道 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Select 语句 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;缓冲与非缓冲 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;工作池 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;sync 包 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Mutexes 互斥锁 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;WaitGroups 等待组 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;contnxt 包 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;常见用例 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;截止日期和取消 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;并发模式 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;fan-in &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;fan-out &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;pipeline &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;竞争检查 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;标准库 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;I/O 和文件处理 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;flag &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Time &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Encoding/JSON &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;OS &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Bufio &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;slog &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;regexp &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go:embed 用于嵌入 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;测试和基准测试 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;测试包基础知识 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;表格驱动测试（Table-driven Tests） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;模拟对象（Mocks）与存根（Stubs） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;httptest 用于 HTTP 测试 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;基准测试 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;覆盖范围 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;生态系统与热门库 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;构建 CLI &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Cobra &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;urfave/cli &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Bubble Tea &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Web 开发 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;net/http 标准 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;框架（选项） &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Gin&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;echo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Fiber&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Beego&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;gRPC 和协议缓冲区 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;ORM 和数据库访问 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;PGX &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;GROM &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Loggin &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Zerolog &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Zap &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;实时通信 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Melody &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Centrifugo &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Go 工具链和工具 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;核心 Go 命令 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go run &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go build &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go install &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go fmt &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go mod &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go test &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go clean &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go doc &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go version &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;代码质量分析 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go vet &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;goimports &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;代码检查工具 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;revive &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;staticcheck &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;govulncheck &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;代码生成/构建标签 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;go generate &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Build Tags &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;性能和调试 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;pprof &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Trace &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;竞争检测（Race Detector) &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;部署和工具 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;构建可执行文件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;交叉编译 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;高级主题 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;深入内存管理 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;逃逸分析（Escape Analysis） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;反射 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;不安全的包裹 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;构建约束和标签 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;CGO 基础知识 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;编译器和链接器标志 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;插件和动态加载 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;本文档翻译已获得 &lt;a href=&quot;https://github.com/kamranahmedse&quot;&gt;&lt;strong&gt;Kamran&lt;/strong&gt;&lt;/a&gt; 授权，原文链接为：&lt;a href=&quot;https://roadmap.sh/golang&quot;&gt;Step by step guide to becoming a Go developer in 2025&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h2 id=&quot;jie4-shao4&quot; tabindex=&quot;-1&quot;&gt;介绍 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Google 开发的静态类型编译型编程语言。专为简洁、并发和高性能而设计。具有垃圾回收、强类型、高效编译以及内置 goroutine 和 channel 并发功能。非常适合后端服务、CLI 工具和分布式系统。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/&quot;&gt;官方的去&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/&quot;&gt;官方的Go 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/getting-started&quot;&gt;官方的Go 入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/markmunyaka/getting-started-with-go-and-the-web-hello-world-nal&quot;&gt;文章Go 和 Web 入门&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wei4-shen2-me-yao4-shi3-yong4-go&quot; tabindex=&quot;-1&quot;&gt;为什么要使用 Go？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 凭借其单一二进制部署、内置并发、快速编译和全面的标准库，提供卓越的性能。Go 语言简洁易学，易于维护。在 Web 服务、微服务、命令行工具和系统软件方面表现出色。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/solutions/&quot;&gt;官方的为什么选择 Go - Go 编程语言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@julienetienne/why-go-the-benefits-of-golang-6c39ea6cff7e&quot;&gt;文章为什么选择 Go：Golang 的优势&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trio.dev/what-is-golang-used-for/&quot;&gt;文章Golang 的用途是什么？7 个 Go 应用程序示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;go-de-li4-shi3&quot; tabindex=&quot;-1&quot;&gt;Go 的历史 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;由 Griesemer、Pike 和 Thompson 于 2007 年在 Google 创建。2009 年公开发布，2012 年发布 1.0 版本。关键里程碑包括模块（Go 1.11）和泛型（Go 1.18）。专为兼具效率和简便性的大规模软件开发而设计。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/&quot;&gt;官方的Go 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/geekculture/learn-go-part-1-the-beginning-723746f2e8b0&quot;&gt;文章Go 语言的起源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learn-golang.org/en/Hello%2C_World!&quot;&gt;文章理解 Golang：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;she4-zhi4-huan2-jing4&quot; tabindex=&quot;-1&quot;&gt;设置环境 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;从官网安装 Go，配置 PATH 并设置工作区。配置支持 Go 的编辑器（VS Code、GoLand、Vim/Emacs）。使用模块进行依赖管理。使用&lt;code&gt;go version&lt;/code&gt;简单程序验证安装并进行测试。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/&quot;&gt;官方的Golang&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/install&quot;&gt;官方的设置环境&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/codex/how-to-set-up-a-go-development-environment-67b4b002182e&quot;&gt;文章如何设置 Go 开发环境？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;go-zhong1-de-hello-world&quot; tabindex=&quot;-1&quot;&gt;Go 中的 Hello World &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;传统的第一个程序演示了基本结构：&lt;code&gt;package main&lt;/code&gt;、导入&lt;code&gt;fmt&lt;/code&gt;以及&lt;code&gt;main()&lt;/code&gt;使用 的功能&lt;code&gt;fmt.Println()&lt;/code&gt;。教授 Go 语法、编译、执行，并验证开发环境的设置。这是学习 Go 的入门点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/&quot;&gt;官方的Go 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/getting-started&quot;&gt;官方的Go 入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/markmunyaka/getting-started-with-go-and-the-web-hello-world-nal&quot;&gt;文章Go 和 Web 入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learn-golang.org/en/Hello%2C_World!&quot;&gt;文章理解 Golang：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;go-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;Go 命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于管理 Go 源代码的主要工具，具有统一的编译、测试、格式化和管理依赖项的界面。包含诸如&lt;code&gt;build&lt;/code&gt;、&lt;code&gt;run&lt;/code&gt;、&lt;code&gt;test&lt;/code&gt;、&lt;code&gt;fmt&lt;/code&gt;、等子命令&lt;code&gt;mod&lt;/code&gt;。自动处理整个开发工作流程。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/cmd&quot;&gt;官方的命令文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/cmd/go&quot;&gt;官方的Go 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/add-a-test&quot;&gt;官方的进行测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/compile-install&quot;&gt;官方的编译并安装应用程序&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ji1-chu3&quot; tabindex=&quot;-1&quot;&gt;基础 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;bian4-liang4-he2-chang2-liang2&quot; tabindex=&quot;-1&quot;&gt;变量和常量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;var&lt;/code&gt;变量存储使用或&lt;code&gt;:=&lt;/code&gt;（短声明）声明的可变值。常量存储使用 声明的不可更改值&lt;code&gt;const&lt;/code&gt;。变量可以显式指定类型或使用类型推断。常量必须在编译时可确定。两者都支持块声明和包/函数作用域。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/10&quot;&gt;官方的短变量声明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/8&quot;&gt;官方的Var 赋值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-variables-and-constants-in-go&quot;&gt;文章如何在 Go 中使用变量和常量&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;var-yu3&quot; tabindex=&quot;-1&quot;&gt;var 与 := &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 提供了两种主要的声明变量的方式：使用&lt;code&gt;var&lt;/code&gt;和使用短声明运算符&lt;code&gt;:=&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;关键字&lt;code&gt;var&lt;/code&gt;用于显式声明变量。您可以使用它来定义变量，无论是否赋值。如果没有提供值，Go 会根据变量类型分配一个默认的&lt;em&gt;零值&lt;/em&gt;&lt;code&gt;var&lt;/code&gt;。它可以在函数内部和外部使用。&lt;/p&gt;
&lt;p&gt;该&lt;code&gt;:=&lt;/code&gt;语法是声明和初始化变量的简写。它根据值推断变量类型，并且只能&lt;strong&gt;在函数内部&lt;/strong&gt;使用。这是一种快速便捷的创建变量的方法，无需明确指定其类型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/10&quot;&gt;方的Go 之旅：简短的变量声明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/spec#Short_variable_declarations&quot;&gt;官方的Go 规范：短变量声明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ling2-zhi2&quot; tabindex=&quot;-1&quot;&gt;零值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;未初始化变量的默认值：&lt;code&gt;0&lt;/code&gt;数字、&lt;code&gt;false&lt;/code&gt;布尔值、&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;字符串、&lt;code&gt;nil&lt;/code&gt;指针/切片/映射。确保可预测的初始状态并减少初始化错误。这是 Go 代码可靠性的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/12&quot;&gt;官方的零值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangprojectstructure.com/default-zero-values-in-go-code/&quot;&gt;文章Golang 零值（0 及以上）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scaler.com/topics/golang/golang-zero-values/&quot;&gt;文章Golang 中的零值&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;const-he2-iota&quot; tabindex=&quot;-1&quot;&gt;const 和 iota &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用 声明的常量表示&lt;code&gt;const&lt;/code&gt;不变的编译时值。&lt;code&gt;iota&lt;/code&gt;创建从零开始的连续整数常量，每个&lt;code&gt;const&lt;/code&gt;块重置一次。适用于枚举、位标志和无需手动赋值的常量序列。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/Iota&quot;&gt;官方的 iota&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webreference.com/go/basics/constants/&quot;&gt;文章常量&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zuo4-yong4-yu4-he2-zhe1-bi4&quot; tabindex=&quot;-1&quot;&gt;作用域和遮蔽 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;作用域决定了变量从全局到块级的可访问性。当内部作用域变量覆盖外部同名变量时，就会发生遮蔽。Go 语言有包作用域、函数作用域和块作用域。理解这些作用域可以防止意外创建新变量而导致的错误。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/imzihad21/go-010-variable-scope-and-shadowing-footguns-explained-3djp&quot;&gt;文章Go #010 - 变量作用域和阴影&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@shahpershahin/variable-shadowing-in-go-best-practices-to-avoid-confusions-and-bugs-61e03022b54d&quot;&gt;文章Go 中的变量遮蔽：最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shu4-ju4-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;数据类型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;丰富的内置类型：整数 (int8-64)、无符号整数 (uint8-64)、浮点数 (float32/64)、复数、布尔值、字符串、rune。静态类型 - 编译时确定类型，用于早期错误检测和性能提升。这对于高效、可靠的程序至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/11&quot;&gt;官方的Go 基础知识&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbot.com/types/&quot;&gt;文章Go 中的基本数据类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/understanding-data-types-in-go&quot;&gt;文章理解 Go 中的数据类型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shu4-zhi2-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;数值类型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;zheng3-shu4-you3-fu2-hao4-wu2-fu2-hao4&quot; tabindex=&quot;-1&quot;&gt;整数（有符号、无符号） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;int&lt;/code&gt;有符号整数（int8、int16、int32、int64）可处理正数/负数。无符号整数（uint8、uint16、uint32、uint64）仅处理非负数，但正数范围较大。/&lt;code&gt;uint&lt;/code&gt;取决于平台。请根据范围和内存需求进行选择。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/integers-in-golang&quot;&gt;章整数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@LukePetersonAU/understanding-integer-types-in-go-a55453f5ae00&quot;&gt;文章理解 Go 中的整数类型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fu2-dian3-shu4&quot; tabindex=&quot;-1&quot;&gt;浮点数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;两种类型：&lt;code&gt;float32&lt;/code&gt;单精度（单精度）和&lt;code&gt;float64&lt;/code&gt;双精度（默认）。使用 IEEE 754 标准表示实数。可能引入精度误差，不适用于精确的财务计算。对于科学计算和图形学至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/floating-point-numbers-in-golang&quot;&gt;官方的浮点数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-perform-float-point-calculations-419745&quot;&gt;文章如何执行浮点计算&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fu4-shu4&quot; tabindex=&quot;-1&quot;&gt;复数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;内置支持&lt;code&gt;complex64&lt;/code&gt;和&lt;code&gt;complex128&lt;/code&gt;类型。使用&lt;code&gt;complex()&lt;/code&gt;函数或类似 的字面量创建&lt;code&gt;3+4i&lt;/code&gt;。提供&lt;code&gt;real()&lt;/code&gt;、&lt;code&gt;imag()&lt;/code&gt;、&lt;code&gt;abs()&lt;/code&gt;函数。适用于数学计算、信号处理和科学应用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/spec&quot;&gt;官方的复数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/complex-numbers-in-golang&quot;&gt;文章Golang 中的复数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/diwakarkashyap/complex-data-types-in-golang-go-328l&quot;&gt;文章Golang 中的复杂数据类型&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;bu4-er3-zhi2&quot; tabindex=&quot;-1&quot;&gt;布尔值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;该&lt;code&gt;bool&lt;/code&gt;类型表示 的&lt;code&gt;true&lt;/code&gt;或&lt;code&gt;false&lt;/code&gt;值，默认零值为&lt;code&gt;false&lt;/code&gt;。对于条件逻辑、控制流和二进制状态至关重要。结果来自比较（&lt;code&gt;==&lt;/code&gt;，&lt;code&gt;!=&lt;/code&gt;）和逻辑运算（&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;，&lt;code&gt;||&lt;/code&gt;，&lt;code&gt;!&lt;/code&gt;）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/booleans-in-golang&quot;&gt;文章Golang 中的布尔值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/understanding-boolean-logic-in-go&quot;&gt;文章理解 Go 中的布尔逻辑&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;zi4-fu2-runes&quot; tabindex=&quot;-1&quot;&gt;字符 &lt;code&gt;Runes&lt;/code&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;将 Unicode 码位表示为&lt;code&gt;int32&lt;/code&gt;类型。启用对国际字符和表情符号的正确处理。使用单引号（例如&lt;code&gt;&#39;A&#39;&lt;/code&gt;或&lt;code&gt;&#39;中&#39;&lt;/code&gt;）。这对于国际化应用程序和正确处理 ASCII 以外的全球文本内容至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/strings&quot;&gt;Go 中的字符&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jeseekuya/understanding-runes-in-go-4ie5&quot;&gt;文章理解 Go 中的 Runes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/golang-rune/&quot;&gt;文章揭秘符文：Go 中使用符文的完整指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zi4-fu2-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;字符类型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;yuan2-shi3-zi4-fu2-chuan4-wen2-zi4&quot; tabindex=&quot;-1&quot;&gt;原始字符串文字 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用反引号 (`) 括起来，并按字面意思解释字符，无需转义序列。保留格式，包括换行符。非常适合正则表达式、文件路径、SQL 查询、JSON 模板以及需要大量转义的多行文本。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/strings#what-is-a-string&quot;&gt;官方的Go 中的字符串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@golangda/golang-quick-reference-strings-0d68bb036c29&quot;&gt;文章Golang 快速参考：字符串。简介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jie3-shi4-zi4-fu2-chuan4-wen2-zi4&quot; tabindex=&quot;-1&quot;&gt;解释字符串文字 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用双引号 ( ) 括起来&lt;code&gt;&amp;quot;&lt;/code&gt;，并处理转义序列，例如&lt;code&gt;&#92;n&lt;/code&gt;, &lt;code&gt;&#92;t&lt;/code&gt;, &lt;code&gt;&#92;&amp;quot;&lt;/code&gt;。支持 Unicode 字符和格式。最常见的字符串类型，非常适合需要控制字符但需要转义特殊字符的文本&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/an-introduction-to-working-with-strings-in-go&quot;&gt;文章如何处理字符串文字语法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://boldlygo.tech/archive/2023-01-30-lexical-elements-interpreted-string-literals/&quot;&gt;文章词汇元素：解释的字符串文字&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;lei4-xing2-zhuan3-huan4&quot; tabindex=&quot;-1&quot;&gt;类型转换 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用语法在不同类型之间转换值。Go 要求即使在和 等&lt;code&gt;Type(value)&lt;/code&gt;相关类型之间也进行显式转换。这对于处理不同数据类型并确保程序中的类型兼容性至关重要。&lt;code&gt;int&lt;/code&gt;  &lt;code&gt;int64&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/13&quot;&gt;官方的类型转换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/zakariachahboun/a-comprehensive-guide-to-type-casting-and-conversions-in-go-26di&quot;&gt;文章Go 语言类型转换综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/lyonas/go-type-casting-starter-guide-a9c1811670c5&quot;&gt;文章Safe Go 类型转换：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ming4-ling4-he2-wen2-dang4&quot; tabindex=&quot;-1&quot;&gt;命令和文档 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Go 提供了内置的文档工具，包括&lt;code&gt;go doc&lt;/code&gt;终端文档和&lt;code&gt;godoc&lt;/code&gt;Web 界面文档。文档使用特殊注释。&lt;code&gt;go help&lt;/code&gt;提供命令信息。这对于探索标准库和编写文档齐全的代码至关重要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/godoc&quot;&gt;官方 Go Doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nirdoshgautam.medium.com/a-guide-to-effective-go-documentation-952f346d073f&quot;&gt;文章有效 Go 文档指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fu4-he2-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;复合类型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;shu4-zu3&quot; tabindex=&quot;-1&quot;&gt;数组 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;相同类型元素的固定大小序列。大小是类型的一部分，因此不同大小代表不同类型。声明时指定长度，初始化为零值。值类型（赋值/传递时复制）。切片因其灵活性而更常用。理解 Go 类型系统的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/6&quot;&gt;官方的数组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kelche.co/blog/go/golang-arrays/&quot;&gt;文章Golang 数组完整指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qie1-pian4&quot; tabindex=&quot;-1&quot;&gt;切片 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;动态数组构建于数组之上。具有长度和容量的引用类型。可以使用&lt;code&gt;make()&lt;/code&gt;字面量创建或切片。支持追加和复制操作。比数组更灵活 - Go 中最常用的序列类型。&lt;/p&gt;
&lt;h4 id=&quot;chan3-neng2-yu3-zeng1-zhang3&quot; tabindex=&quot;-1&quot;&gt;产能与增长 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;切片容量决定了在附加操作期间何时进行重新分配。Go 通常会将较小切片的容量加倍。预分配&lt;code&gt;make([]T, length, capacity)&lt;/code&gt;可以优化内存使用，并最大限度地减少性能关键代码中的分配。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@arjun.devb25/understanding-gos-slice-data-structure-and-its-growth-pattern-48fe6dd914b4&quot;&gt;文章理解 Go 的切片数据结构及其增长模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thekoreanguy.medium.com/how-does-the-capacity-change-when-you-append-to-a-slice-in-go-46289dad4730&quot;&gt;文章如何增加 Go 中的切片容量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-manage-slice-length-and-capacity-418932&quot;&gt;文章如何管理切片长度和容量&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;make&quot; tabindex=&quot;-1&quot;&gt;make() &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;创建并初始化切片、映射和通道。与 不同&lt;code&gt;new()&lt;/code&gt;，返回可用值。示例：&lt;code&gt;make([]int, 5, 10)&lt;/code&gt;切片、&lt;code&gt;make(map[string]int)&lt;/code&gt;映射、&lt;code&gt;make(chan int)&lt;/code&gt;通道。初始化引用类型时必不可少。&lt;/p&gt;
&lt;p&gt;请访问以下资源以了解更多信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/13&quot;&gt;官方的制作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/new-vs-make-functions-in-go/&quot;&gt;文章Go 中的 new() 与 make() 函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zetcode.com/golang/builtins-make/&quot;&gt;文章理解 Golang 中的 make 函数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;qie1-pian4-dao4-shu4-zu3-de-zhuan3-huan4&quot; tabindex=&quot;-1&quot;&gt;切片到数组的转换 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用 (Go 1.17+) 将切片转换为数组&lt;code&gt;[N]T(slice)&lt;/code&gt;。将数据从切片复制到固定大小的数组。如果切片元素少于 N 个，则引发 panic。当需要数组语义或特定大小保证时很有用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-slice-arrays-correctly-418936&quot;&gt;文章正确切片数组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tutorialkart.com/golang-tutorial/golang-create-slice-from-array/&quot;&gt;文章Go - 从数组创建切片 - 3 个示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;shu4-zu3-dao4-qie1-pian4-de-zhuan3-huan4&quot; tabindex=&quot;-1&quot;&gt;数组到切片的转换 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;array[:]&lt;/code&gt;使用类似或 的表达式将数组转换为切片&lt;code&gt;array[start:end]&lt;/code&gt;。创建指向数组内存的切片头，无需复制数据。通过切片进行的修改会影响原始数组。这是一种使用基于切片的 API 高效处理数组的方法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-slice-arrays-correctly-418936&quot;&gt;文章正确切片数组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tutorialkart.com/golang-tutorial/golang-create-slice-from-array/&quot;&gt;文章Go - 从数组创建切片 - 3 个示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zi4-fu2-chuan4&quot; tabindex=&quot;-1&quot;&gt;字符串 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;表示 UTF-8 编码文本的不可变字节序列。字符串操作会创建新字符串，而不是修改现有字符串。可以按字节（索引）或符文（范围）进行迭代。可以在字符串和字节切片之间转换。理解字符串有助于文本操作和性能提升。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/strings&quot;&gt;String&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/spec&quot;&gt;Go Speculation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@golangda/golang-quick-reference-strings-0d68bb036c29&quot;&gt;文章Golang 快速参考：字符串。简介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zi4-dian3&quot; tabindex=&quot;-1&quot;&gt;字典 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;内置关联数据类型，将键映射到值。使用&lt;code&gt;make(map[KeyType]ValueType)&lt;/code&gt;或 映射字面量创建的引用类型。键必须是可比较的类型。支持插入、删除和查找操作。使用逗号 ok 语法检查是否存在&lt;code&gt;value, ok := map[key]&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/maps&quot;&gt;Maps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stackademic.com/golang-use-maps-like-pro-the-proper-way-to-use-maps-in-golang-7a20c805540c&quot;&gt;文章掌握 Go Map：最佳实践和专业技巧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@nikhil.cse16/understanding-hashmaps-in-dsa-5450c6ec2e75&quot;&gt;文章了解 DSA 中的 HashMap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;ok-biao3-da2-shi4&quot; tabindex=&quot;-1&quot;&gt;Ok 表达式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;value, ok := map[key]&lt;/code&gt;使用 ok 安全地测试映射键是否存在或类型断言成功的模式&lt;code&gt;value, ok := interface.(Type)&lt;/code&gt;。返回值和布尔状态，防止 panic 并区分零值和缺失的键。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/10&quot;&gt;官方的逗号确定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/saurabh975/comma-ok-in-go-l4f&quot;&gt;文章逗号 Ok 语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/how-the-comma-ok-idiom-and-package-system-work-in-go/&quot;&gt;文章Go 中的逗号 Ok 语句和包系统是如何工作的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@nateogbonna/statement-idioms-in-go-writing-clean-idiomatic-go-code-6fe92e6e8ab4&quot;&gt;文章Go 语言中的语句惯用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jie2-gou4-ti3&quot; tabindex=&quot;-1&quot;&gt;结构体 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自定义数据类型将相关字段归类为单一名称。类似于类，但方法单独定义。创建复杂的数据模型，组织信息，定义应用程序数据结构。使用点符号访问字段，并传递给函数。面向对象设计的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/Well-known-struct-tags&quot;&gt;官方的结构体&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@sanyamdubey28/working-with-json-and-struct-tags-in-go-0e6a7c4fc6b0&quot;&gt;文章使用 JSON 和 Struct 标签&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://towardsdev.com/understanding-struct-tags-and-json-encoding-in-go-9e51d551c0ce&quot;&gt;文章理解 Go 中的结构标签和 JSON 编码&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jie2-gou4-biao1-qian1-he2-json&quot; tabindex=&quot;-1&quot;&gt;结构标签和 JSON &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;结构体标签使用反引号和键值对来提供字段的元数据。JSON 标签控制字段名称、省略空字段或跳过字段。示例：&lt;code&gt;json:&amp;quot;name,omitempty&amp;quot;&lt;/code&gt;。这对于 API 和数据序列化格式至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/Well-known-struct-tags&quot;&gt;官方的结构体&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@sanyamdubey28/working-with-json-and-struct-tags-in-go-0e6a7c4fc6b0&quot;&gt;文章使用 JSON 和 Struct 标签&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;qian4-ru4-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;嵌入结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;结构体嵌入是指将一个结构体嵌入另一个结构体中，而无需字段名称，从而可以直接访问嵌入的字段。它遵循 Go 的“组合优于继承”的哲学，提供基于组合的设计。它支持灵活、可复用的组件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/struct-embedding&quot;&gt;文章结构嵌入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/diwakarkashyap/interfaces-and-embedding-in-golang-go-2em4&quot;&gt;文章Golang 中的接口和嵌入（Go）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;结构体、标签、JSON &lt;code&gt;Structs Tags &amp;amp; JSON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;嵌入结构体 &lt;code&gt;Embedding Structs&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;tiao2-jian4&quot; tabindex=&quot;-1&quot;&gt;条件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;根据条件控制程序流程。&lt;code&gt;if&lt;/code&gt;适用于基本逻辑、&lt;code&gt;if-else&lt;/code&gt;二元决策、&lt;code&gt;switch&lt;/code&gt;多重条件。&lt;code&gt;if&lt;/code&gt;支持可选初始化，无需括号但需要大括号。&lt;code&gt;switch&lt;/code&gt;支持表达式、类型切换、fallthrough。业务逻辑的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/flowcontrol/6&quot;&gt;官方的流量控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-write-conditional-statements-in-go&quot;&gt;文章如何在 Go 中编写条件语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-handle-conditional-logic-in-go-418319&quot;&gt;文章如何在 Go 中处理条件逻辑&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;if&quot; tabindex=&quot;-1&quot;&gt;if &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;基于布尔条件执行代码的基本条件语句。支持在条件检查前添加可选的初始化语句。条件语句无需使用圆括号，但必须使用大括号。可以与 else if 语句串联，用于处理多个条件。控制流的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/flowcontrol/7&quot;&gt;官方 if&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/if-else&quot;&gt;文章If-else：Gobyexample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zetcode.com/golang/if-else-keywords/&quot;&gt;文章理解 Golang 中的 If 语句&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;if-else&quot; tabindex=&quot;-1&quot;&gt;if-else &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于二元决策的基本条件语句。&lt;code&gt;if&lt;/code&gt;测试条件，&lt;code&gt;else&lt;/code&gt;处理备选路径。可以包含可选的初始化语句。条件语句不需要括号，但需要大括号。程序控制流的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/flowcontrol/7&quot;&gt;官方 if-else&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/if-else&quot;&gt;文章If-else：Gobyexample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;switch&quot; tabindex=&quot;-1&quot;&gt;switch &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;简洁地比较变量与多个值并执行相应代码块。无需 break 语句（默认情况下不会出现 fallthrough 语句）。适用于任何可比较类型，支持每个 case 的多个值，以及表达式/类型切换。比 if-else 链更具可读性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/Switch&quot;&gt;官方 switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/switch&quot;&gt;文章以身作则：Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbot.com/switch/&quot;&gt;文章通过示例学习 Go（Golang）中的 Switch 语句&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;xun2-huan2&quot; tabindex=&quot;-1&quot;&gt;循环 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;for-xun2-huan2&quot; tabindex=&quot;-1&quot;&gt;for 循环 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 唯一的循环结构，极其灵活，可满足所有迭代需求。经典形式：初始化、条件、后置语句。省略不同行为（无限循环、类似 while 循环）的组件。使用&lt;code&gt;break&lt;/code&gt;、&lt;code&gt;continue&lt;/code&gt;、 标签进行嵌套循环，&lt;code&gt;for range&lt;/code&gt;方便进行集合迭代。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/flowcontrol/1&quot;&gt;for&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbot.com/loops/&quot;&gt;文章通过示例学习 Go 中的 for 循环&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;for-range&quot; tabindex=&quot;-1&quot;&gt;for-range &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于迭代数组、切片、映射、字符串和通道的特殊 for 循环形式。返回索引/键和值。对于字符串，返回符文索引和符文值。对于通道，仅返回值。使用空白标识符&lt;code&gt;_&lt;/code&gt;可忽略不需要的返回值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/Range&quot;&gt;官方 Ramge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/flowcontrol/1&quot;&gt;官方 for &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/select-and-for-range-channel-i-bet&quot;&gt;文章Go 中的选择和范围通道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;die2-dai4-map&quot; tabindex=&quot;-1&quot;&gt;迭代 Map &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于&lt;code&gt;for range&lt;/code&gt;迭代映射，返回键值对。出于安全考虑，迭代顺序是随机的。使用空白标识符&lt;code&gt;_&lt;/code&gt;可忽略键或值。迭代过程中无法修改映射，除非创建新映射。迭代过程中可以安全地删除映射。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/aaravjoshi/building-high-performance-file-processing-pipelines-in-go-a-complete-guide-3opm&quot;&gt;文章使用 Go 构建高性能文件处理管道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/golang-os-open/&quot;&gt;文章掌握 Go 中的文件 I/O：完整指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@nagarjun_nagesh/golang-fundamentals-file-handling-and-i-o-502d50b96795&quot;&gt;文章Golang 基础知识：文件处理和 I/O&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;die2-dai4-zi4-fu2-chuan4&quot; tabindex=&quot;-1&quot;&gt;迭代字符串 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;遍历字符串以&lt;code&gt;for range&lt;/code&gt;获取符文（Unicode 码点）而非字节。返回索引和符文值。直接索引&lt;code&gt;str[i]&lt;/code&gt;返回字节。用于&lt;code&gt;[]rune(str)&lt;/code&gt;转换为符文切片以实现随机访问。这对于 Unicode 处理非常重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.alexoglou.com/posts/iterators-golang/&quot;&gt;文章GoLang 中的迭代器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-iterate-string-in-go-446115&quot;&gt;文章如何在 Go 中迭代字符串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learngolanguage.com/mastering-golang-string-manipulation-essential-functions-and-techniques-for-2024/&quot;&gt;文章掌握 Golang 字符串操作：函数和示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;break&quot; tabindex=&quot;-1&quot;&gt;break &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;立即退出最内层循环或 switch 语句。在嵌套循环中，除非使用标签中断外层循环，否则仅退出立即循环。对于满足条件时提前终止循环至关重要。有助于编写高效的循环，避免不必要的循环。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/using-break-and-continue-statements-when-working-with-loops-in-go&quot;&gt;文章使用循环时使用 Break 和 Continue 语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@kiruu1238/break-continue-bc35e9f3802d&quot;&gt;文章揭秘 Golang 中的 Break 和 Continue 语句&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;continue&quot; tabindex=&quot;-1&quot;&gt;continue &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;跳过当前迭代的剩余部分并跳转到下一个循环迭代。除非与标签一起使用，否则仅影响最内层循环。可用于过滤元素、尽早处理特殊情况、避免嵌套条件。使循环更简洁、更高效。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/using-break-and-continue-statements-when-working-with-loops-in-go&quot;&gt;文章使用循环时使用 Break 和 Continue 语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@kiruu1238/break-continue-bc35e9f3802d&quot;&gt;文章揭秘 Golang 中的 Break 和 Continue 语句&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;goto-bu4-gu3-li4&quot; tabindex=&quot;-1&quot;&gt;goto（不鼓励） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 包含&lt;code&gt;goto&lt;/code&gt;语句，但不鼓励使用。语句只能跳转到同一函数内的标签。它会导致代码流结构混乱，难以阅读、调试和维护。建议使用结构化控制流（循环、函数、条件语句）。在现代 Go 编程中很少需要用到。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-goto-statement-usage-149074&quot;&gt;文章Goto 语句用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@rajasoni1995/golang-jumping-in-the-code-using-goto-a36116831396&quot;&gt;文章GoLang — 使用 goto 跳转代码&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://programmingpercy.tech/blog/goto-hell-with-labels-in-golang/&quot;&gt;文章Golang 中的标签之谜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;han2-shu4&quot; tabindex=&quot;-1&quot;&gt;函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 中的“一等公民”。使用&lt;code&gt;func&lt;/code&gt;关键字声明，支持参数和返回值。可以赋值给变量，作为参数传递，也可以从其他函数返回。支持多个返回值、命名返回值和可变参数。模块化代码的构建块。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/4&quot;&gt;Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/backend-forge/functions-in-golang-complete-guide-with-examples-2025-e07db0f98fd3&quot;&gt;文章Golang 中的函数：完整指南及示例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learn-golang.org/en/Functions&quot;&gt;文章学习 Go 函数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;han2-shu4-ji1-chu3&quot; tabindex=&quot;-1&quot;&gt;函数基础 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;可复用代码块，使用&lt;code&gt;func&lt;/code&gt;关键字声明。支持参数、返回值和多个返回值。“一等公民”——可以赋值给变量，或作为参数传递。组织代码逻辑的基本构建块。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/4&quot;&gt;函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/backend-forge/functions-in-golang-complete-guide-with-examples-2025-e07db0f98fd3&quot;&gt;文章Golang 中的函数：完整指南及示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;ke3-bian4-can1-shu4-han2-shu4&quot; tabindex=&quot;-1&quot;&gt;可变参数函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;接受可变数量相同类型参数的函数。语法：&lt;code&gt;func name(args ...Type)&lt;/code&gt;。参数在函数内部被视为切片。使用多个参数调用或使用&lt;code&gt;...&lt;/code&gt;运算符切片。常见于&lt;code&gt;fmt.Printf()&lt;/code&gt;和等函数&lt;code&gt;append()&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/shrsv/unpacking-go-variadic-functions-clever-ways-to-use-them-4p25&quot;&gt;文章解读 Go 可变参数函数：巧妙使用它们的方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-variadic-functions-in-go&quot;&gt;文章如何在 Go 中使用可变参数函数 -&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;duo1-ge4-fan3-hui2-zhi2&quot; tabindex=&quot;-1&quot;&gt;多个返回值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 函数可以返回多个值，通常用于返回结果和错误。语法：&lt;code&gt;func name() (Type1, Type2)&lt;/code&gt;。调用者接收所有返回值，或使用空白标识符&lt;code&gt;_&lt;/code&gt;忽略不需要的值。这是错误处理模式的惯用做法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://engineerpalsu.medium.com/multiple-return-values-in-go-7aa5511d3050&quot;&gt;文章Go 中的多个返回值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-manage-go-function-multiple-returns-419825&quot;&gt;文章如何管理 Go 函数的多次返回&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;ni4-ming2-han2-shu4&quot; tabindex=&quot;-1&quot;&gt;匿名函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;未使用名称声明的函数，也称为函数字面量或 lambda。可以赋值给变量、作为参数传递或立即执行。适用于短操作、回调、goroutine 和闭包。访问封闭作用域变量。常用于事件处理程序和函数式模式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/anonymous-functions-in-golang&quot;&gt;文章匿名函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/abstractmusa/understanding-anonymous-functions-in-go-a-practical-guide-57hd&quot;&gt;文章理解 Go 中的匿名函数：实用指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;bi4-bao1&quot; tabindex=&quot;-1&quot;&gt;闭包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;函数从周围作用域捕获变量，即使在外部函数返回后仍可访问。“封闭”外部变量，用于特殊函数、回调和状态维护。适用于事件处理、迭代器和函数式编程。对于灵活、可复用的代码至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/25&quot;&gt;官方的Golang 中的闭包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code101.medium.com/understanding-closures-in-go-encapsulating-state-and-behaviour-558ac3617671&quot;&gt;文章理解 Go 中的闭包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;ming4-ming2-fan3-hui2-zhi2&quot; tabindex=&quot;-1&quot;&gt;命名返回值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;函数返回参数可以命名，并在函数内部视为变量。初始化为零值。&lt;code&gt;return&lt;/code&gt;不带参数的语句返回命名参数的当前值。这可以提高代码可读性，并简化重构，但请谨慎使用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://yourbasic.org/golang/named-return-values-parameters/&quot;&gt;文章命名返回值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.ntxm.org/docs/functions-in-go/named-return-values/&quot;&gt;文章Go 中的命名返回值&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@adamszpilewicz/named-parameters-in-go-use-cases-and-cautions-e0e462cafdaa&quot;&gt;文章Go 中的命名参数：用例和注意事项&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;an4-zhi2-diao4-yong4&quot; tabindex=&quot;-1&quot;&gt;按值调用 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 在传递给函数时会创建值的副本，而不是原始值的引用。适用于所有类型，包括结构体和数组。虽然安全性较高，但对于大数据量来说开销较大。请使用指针、切片和映射作为引用。这对于性能优化至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/go/build&quot;&gt;官方的构建包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/compile-install&quot;&gt;官方的编译并安装应用程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jacktt/go-build-in-advance-4o8n&quot;&gt;文章高级 Go 构建技术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/customizing-go-binaries-with-build-tags&quot;&gt;文章使用构建标签自定义 Go 二进制文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-build-and-install-go-programs&quot;&gt;文章如何构建和安装 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhi3-zhen1&quot; tabindex=&quot;-1&quot;&gt;指针 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;变量存储其他变量的内存地址。它能够高效利用内存，并允许函数修改变量值。使用 声明&lt;code&gt;*Type&lt;/code&gt;，使用 获得地址&lt;code&gt;&amp;amp;&lt;/code&gt;。为了安全起见，不使用指针运算。这对于性能和构建数据结构至关重要。&lt;/p&gt;
&lt;h4 id=&quot;ji1-chu3-zhi1-shi&quot; tabindex=&quot;-1&quot;&gt;基础知识 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/1&quot;&gt;官方的指针&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/the-bug-shots/understanding-value-and-pointer-receivers-in-golang-82dd73a3eef9&quot;&gt;文章理解 Golang 中的值接收器和指针接收器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.willworth.dev/Go-Pointers&quot;&gt;文章Go 指针完整指南：从基础到最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jie2-gou4-ti3-zhi3-zhen1&quot; tabindex=&quot;-1&quot;&gt;结构体指针 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;指向结构体的指针可以高效地传递大型结构体，并允许修改结构体字段。使用&lt;code&gt;(*ptr).field&lt;/code&gt;或 简写访问字段&lt;code&gt;ptr.field&lt;/code&gt;。常用于方法接收者以及需要通过函数修改结构体的情况。这对于内存效率至关重要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/4&quot;&gt;官方的指向结构的指针&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@wasiualhasib/working-with-structs-and-pointers-in-go-32a00a460cea&quot;&gt;文章在 golang 中什么时候应该使用指针和结构体？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;dai4-you3-map-he2-slice-de-zhi3-zhen1&quot; tabindex=&quot;-1&quot;&gt;带有 Map 和 Slice 的指针 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Map 和切片是引用类型——将它们传递给函数不会复制底层数据。函数内部的修改会影响原始数据。无需显式指针。但是，除非使用指针，否则重新分配切片/Map 变量本身不会影响调用者。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/maps&quot;&gt;官方的 Map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/1&quot;&gt;官方的指针&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-slice-arrays-correctly-418936&quot;&gt;文章正确切片数组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.willworth.dev/Go-Pointers&quot;&gt;文章Go 指针完整指南：从基础到最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Pointers basics&lt;/code&gt;：指针基础&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Pointers with Structs&lt;/code&gt; ：带结构体的指针&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;With Maps &amp;amp; Slices&lt;/code&gt; ：字典和切片&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;jian3-duan3-de-gai4-shu4&quot; tabindex=&quot;-1&quot;&gt;简短的概述 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;h5&gt;内存管理&lt;/h5&gt;
&lt;p&gt;通过垃圾收集实现高度自动化。运行时通过逃逸分析来决定是使用栈（速度快，自动清理）还是堆（速度慢，需要 GC）进行分配。了解分配模式并避免内存泄漏有助于编写高效、可扩展的 Go 程序。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/mem&quot;&gt;官方的Go 内存模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/safetycultureengineering/an-overview-of-memory-management-in-go-9a72ec7c76a8&quot;&gt;文章Go 内存管理概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@siddharthnarayan/how-go-manages-memory-and-why-its-so-efficient-68c13133ba1c&quot;&gt;文章Go 如何管理内存以及它为何如此高效&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;垃圾收集&lt;/h5&gt;
&lt;p&gt;Go 的 GC 使用并发的三色标记-清除收集器自动回收无法访问的内存，旨在最大程度地减少暂停时间。它与您的程序并发运行。了解 GC 有助于编写能够与自动内存管理良好配合的高效程序。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tip.golang.org/doc/gc-guide&quot;&gt;官方的垃圾回收&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html&quot;&gt;文章Go 中的垃圾收集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bwoff.medium.com/understanding-gos-garbage-collection-415a19cc485c&quot;&gt;文章理解 Go 的垃圾回收&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fang1-fa3-he2-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;方法和接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;fang1-fa3-yu3-han2-shu4&quot; tabindex=&quot;-1&quot;&gt;方法与函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;方法是带有接收者参数的函数，在类型声明之外定义。在类型上启用类似对象的行为。函数是独立的，方法属于特定类型。方法可以具有值或指针接收者。两者都可以接受参数并返回值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/1&quot;&gt;官方的方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.golinuxcloud.com/golang-methods/&quot;&gt;文章Golang 方法教程&lt;/a&gt; &lt;a href=&quot;https://www.golinuxcloud.com/golang-methods/&quot;&gt;实际示例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@yuseferi/golang-functions-vs-methods-why-and-when-to-use-them-5b63fa1dc7f3&quot;&gt;文章Golang 函数与方法，为什么以及何时使用它们&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhi3-zhen1-jie1-shou1-qi4&quot; tabindex=&quot;-1&quot;&gt;指针接收器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;方法接收指向结构体的指针，而不是使用&lt;code&gt;func (p *Type) methodName()&lt;/code&gt;复制语法。当方法修改接收者状态或结构体较大时，此方法必不可少。Go 在调用方法时会自动处理值/指针的转换。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/4&quot;&gt;官方的指针接收器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/the-bug-shots/understanding-value-and-pointer-receivers-in-golang-82dd73a3eef9&quot;&gt;文章理解 Golang 中的值接收器和指针接收器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-define-methods-with-pointer-receivers-437937&quot;&gt;文章如何定义带有指针接收器的方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhi2-jie1-shou1-qi4&quot; tabindex=&quot;-1&quot;&gt;值接收器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;方法接收结构体的副本，而不是指针。使用&lt;code&gt;func (v Type) methodName()&lt;/code&gt;语法。适用于方法不修改接收者或结构体较小的情况下。Go 会自动解引用，因此可以在值和指针上调用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/8&quot;&gt;官方的值接收者&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://afdz.medium.com/understanding-value-and-pointer-receivers-in-go-interfaces-e97a824fdded&quot;&gt;文章理解 Go 接口中的值和指针接收器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stackademic.com/go-method-receivers-understanding-value-vs-pointer-and-when-to-use-each-74ef82d66a5c&quot;&gt;文章Go 方法接收器：理解值与指针以及何时使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;定义指定方法签名但不包含实现的契约。类型通过实现所需方法隐式满足接口。支持多态性和松耦合。空接口&lt;code&gt;interface{}&lt;/code&gt;接受任何类型。Go 类型系统和组合模式的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/interfaces&quot;&gt;文章接口 - 通过示例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://abubakardev0.medium.com/mastering-go-interfaces-from-basics-to-best-practices-36912b65aa3d&quot;&gt;文章掌握 Go 接口：从基础到最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;ji1-chu3-zhi1-shi-1&quot; tabindex=&quot;-1&quot;&gt;基础知识 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过方法签名定义契约。类型通过实现所需方法自动满足接口要求。使用&lt;code&gt;type InterfaceName interface{}&lt;/code&gt;语法声明。基于行为而非具体类型，实现多态性，并实现灵活、可测试的代码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.ntxm.org/docs/structs-and-interfaces/understanding-interfaces-in-go/&quot;&gt;文章理解 Go 中的接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/interfaces&quot;&gt;文章接口 - 通过示例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://abubakardev0.medium.com/mastering-go-interfaces-from-basics-to-best-practices-36912b65aa3d&quot;&gt;文章掌握 Go 接口：从基础到最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;kong1-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;空接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;空接口&lt;code&gt;interface{}&lt;/code&gt;可以保存任何类型的值，因为每个类型至少实现零个方法。在 Go 1.18 泛型版本之前，它用于泛型编程。需要类型断言或类型切换才能访问底层值。在处理未知数据类型的 API 中很常见。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/14&quot;&gt;文章空接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/flrnd/understanding-the-empty-interface-in-go-4652&quot;&gt;文章理解 Go 中的空接口&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;qian4-ru4-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;嵌入接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过组合现有接口来创建新接口，从而提升组合性和可重用性。内嵌接口方法自动包含在内。支持从更简单、更集中的接口构建接口层次结构。支持模块化、可扩展系统的组合优于继承。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gobyexample.com/struct-embedding&quot;&gt;文章结构嵌入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/diwakarkashyap/interfaces-and-embedding-in-golang-go-2em4&quot;&gt;文章Golang 中的接口和嵌入（Go）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;lei4-xing2-duan4-yan2&quot; tabindex=&quot;-1&quot;&gt;类型断言 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;从接口中提取底层具体值。语法：&lt;code&gt;value.(Type)&lt;/code&gt;or&lt;code&gt;value, ok := value.(Type)&lt;/code&gt;用于安全断言。如果类型断言失败且没有 ok 格式，则会导致恐慌。这对于处理接口和空接口至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/15&quot;&gt;官方的类型断言&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.educative.io/answers/type-assertions-and-type-switches-in-golang&quot;&gt;文章Golang 中的类型断言和类型切换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/mastering-type-assertion-in-go-a-comprehensive-guide-216864b4ea4d&quot;&gt;文章掌握 Go 中的类型断言&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;lei4-xing2-qie4-huan4&quot; tabindex=&quot;-1&quot;&gt;类型切换 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;一种特殊形式的 switch 语句，操作类型而非值。语法：&lt;code&gt;switch v := i.(type)&lt;/code&gt;。用于接口判断底层具体类型。每个 case 指定要匹配的类型。对于处理 interface{} 和多态代码至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/16&quot;&gt;官方的类型切换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/golang-type-switch-examples/&quot;&gt;文章Go 类型切换综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@omidahn/chapter-4-interface-and-type-systems-in-go-75b52392cc38&quot;&gt;文章第 4 章：Go 中的接口和类型系统&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fan4-xing2&quot; tabindex=&quot;-1&quot;&gt;泛型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 1.18 引入了类型安全机制，允许函数和类型处理不同的数据类型。在不牺牲性能的情况下实现代码复用。使用类型参数（方括号）和约束。在保留强类型特性的同时减少代码重复。&lt;/p&gt;
&lt;p&gt;为什么是泛型？&lt;/p&gt;
&lt;p&gt;Go 1.18 引入了此特性，用于解决处理多种类型时的代码重复问题。在泛型出现之前，每个类型都有单独的函数、空接口（失去类型安全性）或代码生成。启用类型安全、可重用的代码，并保留编译时检查。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/generics&quot;&gt;官方的泛型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://simonklee.dk/type-constraints&quot;&gt;文章Go 中类型约束的演练&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/mastering-type-assertion-in-go-a-comprehensive-guide-216864b4ea4d&quot;&gt;文章掌握 Go 中的类型断言&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fan4-xing2-han2-shu4&quot; tabindex=&quot;-1&quot;&gt;泛型函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用方括号中的类型参数（例如 ）编写可处理多种类型的函数&lt;code&gt;func FunctionName[T any](param T) T&lt;/code&gt;。启用可重用的算法并保持类型安全。这对于不依赖于特定类型的实用函数和数据处理尤其有用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/generics&quot;&gt;官方的泛型函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html&quot;&gt;文章通用函数综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fan4-xing2-lei4-xing2-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;泛型类型/接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;创建可复用的数据结构和接口定义，并支持多种类型。使用类型参数进行定义，例如&lt;code&gt;type Container[T any] struct { value T }&lt;/code&gt;。在保持 Go 强类型特性的同时，支持类型安全的容器、泛型切片、映射和自定义结构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/generics&quot;&gt;官方的泛型函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/interfaces-in-golang&quot;&gt;文章接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/understanding-the-power-of-go-interfaces-a-comprehensive-guide-835954101b7e&quot;&gt;文章理解 Go 接口的强大功能&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;lei4-xing2-yue1-shu4&quot; tabindex=&quot;-1&quot;&gt;类型约束 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;指定哪些类型可用作泛型的类型参数。使用带有方法签名或类型集的接口进行定义。常见约束包括&lt;code&gt;any&lt;/code&gt;、&lt;code&gt;comparable&lt;/code&gt;和自定义约束。支持编写能够安全操作类型参数的泛型代码。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/generics&quot;&gt;官方的泛型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://simonklee.dk/type-constraints&quot;&gt;文章Go 中类型约束的演练&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/mastering-type-assertion-in-go-a-comprehensive-guide-216864b4ea4d&quot;&gt;文章掌握 Go 中的类型断言&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;lei4-xing2-tui1-duan4&quot; tabindex=&quot;-1&quot;&gt;类型推断 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;允许编译器根据函数参数或上下文自动确定泛型参数的类型。在保持类型安全的同时，减少了显式指定类型的需要。通过消除冗余的类型指定，使泛型函数更加简洁易读。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/type-inference&quot;&gt;官方的类型推断&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hackernoon.com/what-is-type-inference-what-it-is-and-how-it-works&quot;&gt;文章什么是类型推断？它是什么以及它是如何工作的&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@omidahn/chapter-4-interface-and-type-systems-in-go-75b52392cc38&quot;&gt;文章第 4 章：Go 中的接口和类型系统&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cuo4-wu4-chu3-li3&quot; tabindex=&quot;-1&quot;&gt;错误处理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ji1-chu3-zhi1-shi-2&quot; tabindex=&quot;-1&quot;&gt;基础知识 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 使用显式错误处理并返回错误值。函数将错误作为最后一个值返回。检查模式。使用或 来&lt;code&gt;if err != nil&lt;/code&gt;创建错误。没有异常 - 错误是需要显式处理的值。&lt;code&gt;errors.New()``fmt.Errorf()&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/error-handling-and-go&quot;&gt;官方的错误处理和 Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/hprog99/mastering-error-handling-in-go-a-comprehensive-guide-fac34079833f&quot;&gt;文章掌握 Go 中的错误处理：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/errors-exception-handling-in-golang&quot;&gt;文章Golang 中的错误和异常处理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cuo4-wu4-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;错误接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;内置单一方法接口&lt;code&gt;Error() string&lt;/code&gt;。任何实现此方法的类型都可以表示错误。Go 错误处理理念的核心，为所有 Go 代码提供一致的错误表示。有效错误处理的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/error-handling-and-go&quot;&gt;官方的错误处理和 Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.ntxm.org/docs/error-handling-in-go/the-error-interface/&quot;&gt;文章错误接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/hprog99/mastering-error-handling-in-go-a-comprehensive-guide-fac34079833f&quot;&gt;文章掌握 Go 中的错误处理：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/errors-exception-handling-in-golang&quot;&gt;文章Golang 中的错误和异常处理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;error-new&quot; tabindex=&quot;-1&quot;&gt;error.New &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;创建错误值的最简单方法是接收字符串消息并返回实现错误接口的错误。适用于简单的静态错误消息。通常与错误包装结合使用或用于预定义的错误常量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/error-handling-and-go&quot;&gt;官方的错误处理和 Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.ntxm.org/docs/error-handling-in-go/the-error-interface/&quot;&gt;文章错误接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/hprog99/mastering-error-handling-in-go-a-comprehensive-guide-fac34079833f&quot;&gt;文章掌握 Go 中的错误处理：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/creating-custom-errors-in-go&quot;&gt;文章在 Go 中创建自定义错误&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fmt-errorf&quot; tabindex=&quot;-1&quot;&gt;fmt.Errorf &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 printf 风格的动词创建格式化的错误消息。支持&lt;code&gt;%w&lt;/code&gt;错误包装动词（Go 1.13+），以创建在保留原始错误信息的同时添加上下文的错误链。对于包含动态值和调试信息的描述性错误至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/fmt&quot;&gt;fmt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/error-handling-and-go&quot;&gt;错误处理和 Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/mastering-error-handling-in-golang-the-power-of-fmt-errorf/&quot;&gt;文章掌握 Golang 中的错误处理：fmt.Errorf() 的强大功能&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zetcode.com/golang/fmt-errorf/&quot;&gt;文章理解 Golang 中的 fmt.Errorf 函数&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bao1-zhuang1-jie3-bao1-cuo4-wu4&quot; tabindex=&quot;-1&quot;&gt;包装/解包错误 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;fmt.Errorf()&lt;/code&gt;使用with动词创建错误链，在保留原始错误信息的同时添加上下文&lt;code&gt;%w&lt;/code&gt;。使用&lt;code&gt;errors.Unwrap()&lt;/code&gt;、&lt;code&gt;errors.Is()&lt;/code&gt;和&lt;code&gt;errors.As()&lt;/code&gt;来处理包装的错误。启用丰富的错误上下文，以便于调试。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@vajahatkareem/golang-error-wrapping-multierror-759d04bdbfaf&quot;&gt;文章Golang：错误包装/解包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-cookbook.com/snippets/error-handling/error-wrapping&quot;&gt;文章Go 中的错误包装 - Go 错误处理示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shao4-bing1-cuo4-wu4&quot; tabindex=&quot;-1&quot;&gt;哨兵错误 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;预定义错误值代表特定条件，定义为包级变量。检查使用&lt;code&gt;errors.Is()&lt;/code&gt;或直接比较。示例：&lt;code&gt;io.EOF&lt;/code&gt;启用可预测的 API，调用者可以以不同的方式处理特定错误。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/concurrency/5&quot;&gt;官方的 Select 语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tiredsg.dev/blog/golang-sentinel-error/&quot;&gt;文章Golang Sentinel 错误&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/gopher-time/writing-clean-code-in-go-sentinel-errors-5ad93a30bc8e&quot;&gt;文章用 Go 编写干净的代码：Sentinel 错误&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;panic-bing4-recover&quot; tabindex=&quot;-1&quot;&gt;panic 并 recover &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;panic()&lt;/code&gt;停止执行并展开堆栈，&lt;code&gt;recover()&lt;/code&gt;捕获延迟函数中的恐慌。对于不可恢复的错误，请谨慎使用。虽然 Go 强调显式错误，但恐慌/恢复可作为异常情况的安全网。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/defer-panic-and-recover&quot;&gt;官方的 defer、panic和recover&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/handling-panics-in-go&quot;&gt;文章Go 中的 panic 处理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dui1-zhan4-gen1-zong1-he2-tiao2-shi4&quot; tabindex=&quot;-1&quot;&gt;堆栈跟踪和调试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 会在崩溃时自动打印堆栈跟踪，显示调用链。工具包括 Delve 调试器、pprof 分析和竞争检测。堆栈跟踪显示函数调用、文件位置和行号，以便有效地进行故障排除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/diagnostics&quot;&gt;官方的诊断&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/adityabhuyan/a-comprehensive-guide-to-debugging-go-code-for-developers-h9d&quot;&gt;文章面向开发人员的 Go 代码调试综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-cookbook.com/snippets/debugging/reading-go-stack-traces&quot;&gt;文章读取 Go 堆栈跟踪 - Go 调试示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;dai4-ma3-zu3-zhi1&quot; tabindex=&quot;-1&quot;&gt;代码组织 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;mo2-kuai4-he2-yi1-lai4-xiang4&quot; tabindex=&quot;-1&quot;&gt;模块和依赖项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 模块是 Go 1.11 中引入的依赖管理系统。使用&lt;code&gt;go.mod&lt;/code&gt;包含模块路径和依赖项的文件定义模块。用于&lt;code&gt;go get&lt;/code&gt;添加依赖项和&lt;code&gt;go mod tidy&lt;/code&gt;清理依赖项。支持语义版本控制和替换指令。是现代 Go 开发必不可少的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/create-module&quot;&gt;go mod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/mod&quot;&gt;go mod 参考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/go-get-go-mod-tidy-commands&quot;&gt;文章go mod 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbyexamples.com/go-mod-tidy/&quot;&gt;文章go mod tidy 做什么？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-mod-init&quot; tabindex=&quot;-1&quot;&gt;go mod init &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过创建&lt;code&gt;go.mod&lt;/code&gt;指定模块路径（通常是仓库 URL）的文件来初始化新的 Go 模块。将目录标记为模块根目录并启用基于模块的依赖管理。这是任何新 Go 项目的第一步。&lt;/p&gt;
&lt;h4 id=&quot;go-mod-tidy&quot; tabindex=&quot;-1&quot;&gt;go mod tidy &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过添加缺失的依赖项并移除未使用的依赖项来确保&lt;code&gt;go.mod&lt;/code&gt;源代码匹配。&lt;code&gt;go.sum&lt;/code&gt;使用校验和进行更新。这对于维护清晰的依赖项管理并确保在生产部署之前进行可重复的构建至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/create-module&quot;&gt;gp mod 创建&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/mod&quot;&gt;go mod 参考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/go-get-go-mod-tidy-commands&quot;&gt;文章go mod 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbyexamples.com/go-mod-tidy/&quot;&gt;文章go mod tidy 做什么？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-mod-vendor&quot; tabindex=&quot;-1&quot;&gt;go mod vendor &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;创建&lt;code&gt;vendor&lt;/code&gt;包含依赖项副本的目录，用于与源代码打包。确保构建工作无需网络连接即可进行。适用于部署、隔离环境以及对依赖项可用性的完全控制。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://victoriametrics.com/blog/vendoring-go-mod-vendor/&quot;&gt;文章Vendoring，或者 go mod vendor：它是什么？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/go-get-go-mod-tidy-commands&quot;&gt;文章go mod 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mahmoudaljadan.medium.com/go-modules-and-vendors-simplify-dependency-management-in-your-golang-project-a29689eb26b1&quot;&gt;文章Go 模块和供应商：简化依赖管理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bao1&quot; tabindex=&quot;-1&quot;&gt;包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 中代码组织的基本单位。将相关的函数、类型和变量分组。通过文件顶部的包声明进行定义。导出的名称以大写字母开头。使用 import&lt;code&gt;import&lt;/code&gt;语句导入。支持模块化、可重用性和命名空间管理。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/os&quot;&gt;官方的os 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/importing-packages-in-go&quot;&gt;文章在 Go 中导入包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learnscripting.org/a-comprehensive-guide-to-importing-and-using-packages-in-go/&quot;&gt;文章导入和使用包的综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bao1-dao3-ru4-gui1-ze2&quot; tabindex=&quot;-1&quot;&gt;包导入规则 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;关键规则：禁止循环导入，可执行文件使用 main 包，包名小写，导出标识符以大写字母开头。导入路径是唯一标识符。理解这些规则可确保结构正确并遵循 Go 的约定。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/os&quot;&gt;官方的os 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/importing-packages-in-go&quot;&gt;文章在 Go 中导入包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learnscripting.org/a-comprehensive-guide-to-importing-and-using-packages-in-go/&quot;&gt;文章导入和使用包的综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi3-yong4-di4-san1-fang1-ruan3-jian4-bao1&quot; tabindex=&quot;-1&quot;&gt;使用第三方软件包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;go get package-url&lt;/code&gt;使用which updates导入外部库&lt;code&gt;go.mod&lt;/code&gt;。选择软件包时，请考虑维护状态、文档、许可证和安全性。Go 模块负责版本管理并确保可重复的构建。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://thenewstack.io/import-and-use-a-third-party-package-in-golang/&quot;&gt;文章在 Golang 中导入和使用第三方包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@bramahendramahendra1/using-third-party-packages-and-libraries-in-golang-efbf0046f574&quot;&gt;文章在 Golang 中使用第三方包和库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fa1-bu4-mo2-kuai4&quot; tabindex=&quot;-1&quot;&gt;发布模块 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用语义版本标签，通过版本控制系统共享 Go 代码。Go 代理系统自动发现并提供模块服务。遵循 Go 规范，维护文档，并确保向后兼容，为生态系统做出贡献。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/modules/publishing&quot;&gt;官方的发布模块&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/the-godev-corner/how-to-create-publish-a-go-public-package-9034e6bfe4a9&quot;&gt;文章如何创建和发布 Go Public 软件包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bing4-fa1&quot; tabindex=&quot;-1&quot;&gt;并发 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;goroutines-xie2-cheng2&quot; tabindex=&quot;-1&quot;&gt;Goroutines 协程 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 运行时管理的轻量级线程，支持并发函数执行。使用&lt;code&gt;go&lt;/code&gt;关键字前缀创建。内存开销极小，可并发运行数千/数百万个线程。运行时负责跨 CPU 核心的调度。通过通道进行通信，这是 Go 并发性的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/concurrency/1&quot;&gt;官方的Goroutines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbot.com/goroutines/&quot;&gt;文章Goroutines - Golang 中的并发&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/goroutines-in-golang-understanding-and-implementing-concurrent-programming-in-go-600187bcfaa2&quot;&gt;文章Golang 中的 Goroutines：理解和实现&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;channles-tong1-dao4&quot; tabindex=&quot;-1&quot;&gt;Channles 通道 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;遵循“通过通信共享内存”原则的 goroutine 通信的主要机制。使用 创建的管道类型&lt;code&gt;make()&lt;/code&gt;。有缓冲和非缓冲两种类型。用于同步、数据传递和协调并发操作。并发编程的必备工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golangdocs.com/channels-in-golang&quot;&gt;官方的Golang 中的 Channels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/goturkiye/concurrency-in-go-channels-and-waitgroups-25dd43064d1&quot;&gt;文章Go 中的并发：Channels 和 WaitGroups&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/go-channels-explained-more-than-just&quot;&gt;文章Go Channels 详解：不仅仅是初学者指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;select-yu3-ju4&quot; tabindex=&quot;-1&quot;&gt;Select 语句 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于通道操作的多路复用器。同时等待多个通道操作，执行第一个就绪的操作。支持发送/接收操作，默认情况为非阻塞行为。对于协调多个 goroutine 和实现超时至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/concurrency/5&quot;&gt;官方的选择语句&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbyexamples.com/select-statement-golang/&quot;&gt;文章Go 中的 Select 语句（Golang）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbot.com/select/&quot;&gt;文章Go（Golang）选择教程及实例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;huan3-chong1-yu3-fei1-huan3-chong1&quot; tabindex=&quot;-1&quot;&gt;缓冲与非缓冲 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;无缓冲 Channel 提供同步通信 - 发送方阻塞直到接收方准备就绪。缓冲 Channel 允许异步通信，直至达到最大容量。无缓冲 Channel 主要用于协调/排序，缓冲 Channel 主要用于性能/解耦。这是并发系统设计的关键区别。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@aditimishra_541/advanced-insights-into-go-channels-unbuffered-and-buffered-channels-d76d705bcc24&quot;&gt;文章深入了解 Go Channels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/akshitzatakia/buffered-vs-unbuffered-channels-in-golang-a-developers-guide-to-concurrency-3m75&quot;&gt;文章Golang 中的缓冲通道与非缓冲通道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;gong1-zuo4-chi2&quot; tabindex=&quot;-1&quot;&gt;工作池 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用固定数量的 Goroutine 来处理共享队列中的任务的并发模式。在保持并行性的同时控制资源使用。通常使用缓冲通道进行任务分配，并使用 WaitGroup 进行同步。非常适合 CPU 密集型任务和速率限制。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/justlorain/go-how-to-write-a-worker-pool-1h3b&quot;&gt;文章GO：如何编写工作池&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rksurwase.medium.com/efficient-concurrency-in-go-a-deep-dive-into-the-worker-pool-pattern-for-batch-processing-73cac5a5bdca&quot;&gt;文章Go 中的高效并发：深入探究工作池&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sync-bao1&quot; tabindex=&quot;-1&quot;&gt;sync 包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;提供用于协调 Goroutine 和安全并发访问的同步原语。包括 Mutex（互斥锁）、RWMutex（读写锁）、WaitGroup（等待 Goroutine）和 Once（一次性初始化）。对于避免竞争条件至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/sync&quot;&gt;官方的同步包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@asgrr/golang-sync-4787b18fee41&quot;&gt;文章Golang 同步包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lebum.medium.com/use-of-synchronization-techniques-in-golang-53d75bc0a646&quot;&gt;文章Golang中同步技术的使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;mutexes-hu4-chi4-suo3&quot; tabindex=&quot;-1&quot;&gt;Mutexes 互斥锁 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;sync 包中的互斥锁，确保每次只有一个 goroutine 访问共享资源。在临界区&lt;code&gt;Lock()&lt;/code&gt;之前和&lt;code&gt;Unlock()&lt;/code&gt;之后使用。RWMutex 允许多个读取者或单个写入者。对于保护共享数据免受竞争条件影响至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/lincemathew/what-is-mutex-and-how-to-use-it-in-golang-1m1i&quot;&gt;文章什么是 Mutex 以及如何在 Golang 中使用它？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kamnagarg-10157.medium.com/understanding-mutex-in-go-5f41199085b9&quot;&gt;文章理解 Go 中的 Mutex 简介&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;waitgroups-deng3-dai4-zu3&quot; tabindex=&quot;-1&quot;&gt;WaitGroups 等待组 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;sync 包中的同步原语，用于等待多个 Goroutine 完成。用于在 Goroutine 完成时&lt;code&gt;Add()&lt;/code&gt;增加计数器，并阻塞直到计数器归零。这对于协调并发程序中的 Goroutine 完成至关重要。&lt;code&gt;Done()``Wait()&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@dmytro.misik/waitgroup-in-go-df8f068e646f&quot;&gt;文章Go 中的 WaitGroup - 如何以及何时使用 WaitGroup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/mastering-concurrency-in-golang-a-deep-dive-into-the-waitgroup/&quot;&gt;文章掌握 Golang 中的并发&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;contnxt-bao1&quot; tabindex=&quot;-1&quot;&gt;&lt;code&gt;contnxt&lt;/code&gt; 包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;跨 API 边界传递截止时间、取消信号和请求范围的值。对于稳健的并发应用程序（尤其是 Web 服务）至关重要。支持取消长时间运行的操作、设置超时、传递请求数据。通常作为第一个参数向下传递调用堆栈。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/context&quot;&gt;官方的Go 并发模式：上下文&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jamal.kaksouri/the-complete-guide-to-context-in-golang-efficient-concurrency-management-43d722f6eaea&quot;&gt;文章Golang 上下文完整指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;chang2-jian4-yong4-li4&quot; tabindex=&quot;-1&quot;&gt;常见用例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Context 包的常见用途：HTTP 超时、数据库截止期限、goroutine 取消协调以及请求范围的值。对于 Web 服务器、微服务、断路器以及构建能够优雅处理取消操作的响应式 API 至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/solutions/use-cases&quot;&gt;官方的用例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/adityabhuyan/the-versatility-of-go-ideal-use-cases-for-the-golang-programming-language-7co&quot;&gt;文章Go 的多功能性：Golang 编程的理想用例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jie2-zhi3-ri4-qi1-he2-qu3-xiao1&quot; tabindex=&quot;-1&quot;&gt;截止日期和取消 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;上下文包机制用于控制操作的生命周期和传递取消信号。支持截止期限（绝对时间）或超时（持续时间）。函数应&lt;code&gt;ctx.Done()&lt;/code&gt;在取消时进行检查并尽早返回。这对于健壮的并发应用程序至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/database/cancel-operations&quot;&gt;官方的取消正在进行的操作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webdevstation.com/posts/understanding-golang-context/&quot;&gt;文章理解 Golang 上下文：取消、超时&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/better-programming/understanding-context-in-golang-7f574d9d94e0&quot;&gt;文章理解 Golang 中的上下文&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/mcaci/how-to-use-the-context-done-method-in-go-22me&quot;&gt;文章如何在 Go 中使用 context.Done() 方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bing4-fa1-mo2-shi4&quot; tabindex=&quot;-1&quot;&gt;并发模式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;已建立使用 goroutine 和通道构建并发程序的设计方法。关键模式：&lt;code&gt;fan-in&lt;/code&gt;（合并输入）、&lt;code&gt;fan-out&lt;/code&gt;（分配工作）、&lt;code&gt;pipeline&lt;/code&gt;（流水线）、工作池、发布-订阅通信。帮助构建高效、可扩展的应用程序，同时避免竞争条件和死锁。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fan-in&lt;/code&gt;：将多个并行 goroutine 的结果汇总到一个输出流中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fan-out&lt;/code&gt;：将一个任务分发到多个并行的 goroutine 中处理（扩展并发）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipeline&lt;/code&gt;（流水线）模型：将复杂任务分解为一系列有序的阶段，每个阶段处理数据后传递给下一个阶段，类似工厂流水线。每个阶段通过 channel 连接，前一阶段的输出作为后一阶段的输入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;了解更多信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/pipelines&quot;&gt;官方的Go 并发模式：管道和取消&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@gopinathr143/go-concurrency-patterns-a-deep-dive-a2750f98a102&quot;&gt;文章Go 并发模式：深入探究&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/santoshanand/mastering-concurrency-in-go-a-comprehensive-guide-5chi&quot;&gt;文章掌握 Go 中的并发&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fan-in&quot; tabindex=&quot;-1&quot;&gt;fan-in &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;将多个输入通道合并为单个输出通道的并发模式。允许从多个 Goroutine 收集结果。通常使用 select 语句或为每个输入分配单独的 Goroutine 来实现。适用于聚合并行处理结果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.golinuxcloud.com/go-fan-out-fan-in/&quot;&gt;文章扇出扇入并发模式解释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/geekculture/golang-concurrency-patterns-fan-in-fan-out-1ee43c6830c4&quot;&gt;文章Golang 并发模式：扇入、扇出&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fan-out&quot; tabindex=&quot;-1&quot;&gt;fan-out &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;将工作从单一来源分发给多个工作器的并发模式。通常使用一个输入通道来为多个 goroutine 提供数据。每个工作器独立处理数据项。适用于并行化 CPU 密集型任务并通过并行处理提高吞吐量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.golinuxcloud.com/go-fan-out-fan-in/&quot;&gt;文章扇出扇入并发模式解释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/geekculture/golang-concurrency-patterns-fan-in-fan-out-1ee43c6830c4&quot;&gt;文章Golang 并发模式：扇入、扇出&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;pipeline&quot; tabindex=&quot;-1&quot;&gt;pipeline &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;并发模式将处理阶段链接起来，其中一个阶段的输出成为下一个阶段的输入。每个阶段使用 goroutine 和 channel 并发运行。支持并行处理和关注点分离。常见于数据处理、转换工作流和流式传输应用程序。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/pipelines&quot;&gt;官方的并发管道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/leapcell/pipeline-pattern-in-go-a-practical-guide-5dmm&quot;&gt;文章Go 中的管道模式：实用指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/amboss/applying-modern-go-concurrency-patterns-to-data-pipelines-b3b5327908d4&quot;&gt;文章将现代 Go 并发模式应用于数据管道&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jing4-zheng1-jian3-cha2&quot; tabindex=&quot;-1&quot;&gt;竞争检查 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于检测并发程序中竞争条件的内置工具。&lt;code&gt;-race&lt;/code&gt;在构建/测试/运行期间通过标志启用。检测多个 goroutine 对共享变量的非同步访问。竞争模式下的性能开销。对于调试并发代码安全性至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/articles/race_detector&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a-journey-with-go/go-race-detector-with-threadsanitizer-8e497f9e42db&quot;&gt;Go：使用 ThreadSanitizer 进行竞争检测器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sobyte.net/post/2022-06/go-data-race/&quot;&gt;Golang中的数据竞争检测和数据竞争模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;biao1-zhun3-ku4&quot; tabindex=&quot;-1&quot;&gt;标准库 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;提供核心功能的综合软件包集合。涵盖 I/O、网络、文本处理、加密、测试、JSON 处理、HTTP 客户端/服务器。丰富的生态系统减少了对外部依赖的需求。这些软件包文档齐全、经过测试且性能优化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/stds&quot;&gt;官方的标准包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/aaravjoshi/building-robust-apis-with-gos-standard-library-a-comprehensive-guide-3036&quot;&gt;文章使用 Go 标准库构建强大的 API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-use-standard-library-packages-in-golang-446140&quot;&gt;文章如何在 Golang 中使用标准库包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;io-he2-wen2-jian4-chu3-li3&quot; tabindex=&quot;-1&quot;&gt;I/O 和文件处理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 的 I/O 系统通过&lt;code&gt;io&lt;/code&gt;包接口（Reader、Writer、Closer）和&lt;code&gt;os&lt;/code&gt;包文件操作提供了全面的文件和流处理功能。基于接口的设计允许使用一致的模式处理文件、网络连接和缓冲区。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/aaravjoshi/building-high-performance-file-processing-pipelines-in-go-a-complete-guide-3opm&quot;&gt;文章使用 Go 构建高性能文件处理管道&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/golang-os-open/&quot;&gt;文章掌握 Go 中的文件 I/O：完整指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@nagarjun_nagesh/golang-fundamentals-file-handling-and-i-o-502d50b96795&quot;&gt;文章Golang 基础知识：文件处理和 I/O&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;flag&quot; tabindex=&quot;-1&quot;&gt;flag &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于解析命令行标志的标准库包。支持字符串、整数、布尔值和持续时间标志，并带有默认值和说明。自动生成帮助文本。在使用 Cobra 等框架之前，提供用于基本 CLI 参数解析的简单 API。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go-language.org/go-docs/flag/&quot;&gt;官方的flag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-the-flag-package-in-go&quot;&gt;文章如何使用 Flag 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.golinuxcloud.com/golang-flags-examples/&quot;&gt;文章高级 Golang Flag 技术&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;time&quot; tabindex=&quot;-1&quot;&gt;Time &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于时间和日期操作的标准库包。处理解析、格式化、算术运算、计时器、代码器和时区操作。主要类型：时间、持续时间、位置。支持 RFC3339 格式、自定义布局和时区。对于调度、超时和时间戳至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/time&quot;&gt;官方的时间包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-dates-and-times-in-go&quot;&gt;文章如何在 Go 中使用日期和时间&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@rakeshmirji/time-in-go-overview-with-examples-ebb9e30cdb45&quot;&gt;文章Go 中的时间：概述与示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;encoding-json&quot; tabindex=&quot;-1&quot;&gt;Encoding/JSON &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;此包提供了强大而高效的功能，用于将 Go 数据结构编组（编码）为 JSON，以及将 JSON 解组（解码）为 Go 数据结构。此过程主要通过 json.Marshal 和 json.Unmarshal 函数处理。为了正确编码或解码 Go 结构体，其字段必须导出（以大写字母开头）。开发人员可以使用类似 json:&amp;quot;fieldName,omitempty 的结构体标签来控制 JSON 字段名称并省略空字段。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/methods/14&quot;&gt;官方的空接口&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/flrnd/understanding-the-empty-interface-in-go-4652&quot;&gt;文章理解 Go 中的空接口&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;os&quot; tabindex=&quot;-1&quot;&gt;OS &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;提供操作系统接口的标准库包。处理文件操作、环境变量、进程管理和系统信息。包含文件 I/O、目录操作、进程控制和跨平台操作系统交互的函数。系统编程必备。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/os&quot;&gt;官方的os 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://reintech.io/blog/an-overview-of-gos-os-and-io-packages&quot;&gt;文章Go 的 os 和 io 包概述&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bufio&quot; tabindex=&quot;-1&quot;&gt;Bufio &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;提供包装 io.Reader/Writer 接口的缓冲 I/O 操作，以获得更佳性能。通过读取/写入更大的数据块来减少系统调用。包含用于行读取的 Scanner、用于缓冲读取的 Reader 和用于缓冲写入的 Writer。对于高效的大文件/网络操作至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/src/bufio/bufio.go&quot;&gt;官方的bufio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/bufio&quot;&gt;官方的Bufio 套餐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@emusbeny/mastering-bufio-in-go-the-art-of-buffered-i-o-17cae584ee4b&quot;&gt;文章使用 bufio 快速运行：释放缓冲 I/O 的强大功能&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;slog&quot; tabindex=&quot;-1&quot;&gt;slog &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 1.21 中引入的结构化日志包。提供分级、结构化的日志记录，并支持 JSON 输出。在生产环境中，它比基础日志包更胜一筹。支持自定义处理程序、上下文集成和性能优化。它是传统日志记录的现代替代品。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/slog&quot;&gt;官方的使用 slog 进行结构化日志记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/logging-in-go/&quot;&gt;文章使用 Slog 登录 Go：终极指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/fazal_mansuri_/effective-logging-in-go-best-practices-and-implementation-guide-23hp&quot;&gt;文章Go 中的高效日志记录：最佳实践与实现&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;regexp&quot; tabindex=&quot;-1&quot;&gt;regexp &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;正则表达式功能的标准库包。实现了 RE2 语法，以实现安全高效的模式匹配。提供用于匹配、查找和替换文本模式的函数。支持编译表达式以提高性能。是文本处理、验证和解析的必备工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/regexp&quot;&gt;官方的regexp 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-golang-regular-expression-tutorial-15502&quot;&gt;文章掌握 Golang 中的正则表达式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/deep-dive-regular-expressions-golang/&quot;&gt;文章深入研究 Golang 的正则表达式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;goembed-yong4-yu2-qian4-ru4&quot; tabindex=&quot;-1&quot;&gt;go:embed 用于嵌入 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;该&lt;code&gt;go:embed&lt;/code&gt;指令在编译时使用&lt;code&gt;//go:embed&lt;/code&gt;注释将文件和目录嵌入到 Go 二进制文件中。它适用于将静态资源、配置和模板直接包含在可执行文件中，从而创建无需外部文件的独立二进制文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/embed&quot;&gt;官方的嵌入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iamyadav.com/blogs/a-guide-to-embedding-static-files-in-go&quot;&gt;文章Go 中嵌入静态文件的指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scaler.com/topics/golang/golang-embed/&quot;&gt;文章如何在 Go 中使用 go:embed？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ce4-shi4-he2-ji1-zhun3-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;测试和基准测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ce4-shi4-bao1-ji1-chu3-zhi1-shi&quot; tabindex=&quot;-1&quot;&gt;测试包基础知识 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用于编写测试的标准库包。测试函数以&lt;code&gt;Test&lt;/code&gt;开头，且接受&lt;code&gt;*testing.T&lt;/code&gt;类型的参数。若测试失败，可使用&lt;code&gt;t.Error()&lt;/code&gt;、&lt;code&gt;t.Fatal()&lt;/code&gt;方法。测试文件以&lt;code&gt;_test.go&lt;/code&gt;结尾。通过&lt;code&gt;go test&lt;/code&gt;命令运行测试。该包支持基准测试（benchmarks）和示例代码（examples）功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/testing&quot;&gt;官方的测试包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://labex.io/tutorials/go-how-to-manage-testing-package-setup-451557&quot;&gt;文章如何管理测试包设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ceos3c.com/golang/go-unit-testing-a-practical-guide-for-writing-reliable-tests/&quot;&gt;文章Go 单元测试：编写可靠测试的实用指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;biao3-ge2-qu1-dong4-ce4-shi4-tabledriven-tests&quot; tabindex=&quot;-1&quot;&gt;表格驱动测试（Table-driven Tests） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;表格驱动测试通过测试用例切片（slices of test cases），使用相同逻辑测试多个场景。每个测试用例包含输入（inputs）和预期输出（expected outputs）。这种方式不仅让添加测试用例变得简单，还能以极少的代码重复实现全面的测试覆盖。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/TableDrivenTests&quot;&gt;官方的表驱动测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/boncheff/table-driven-unit-tests-in-go-407b&quot;&gt;文章Go 中的表驱动单元测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/zpeters/testing-in-go-with-table-drive-tests-and-testify-kd4&quot;&gt;文章使用表驱动测试和 Testify 在 Go 中进行测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;mo2-ni3-dui4-xiang4-mocks-yu3-cun2-gen1-stubs&quot; tabindex=&quot;-1&quot;&gt;模拟对象（Mocks）与存根（Stubs） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为实现隔离测试，模拟对象与存根会用可控制的实现替代（被测试代码的）依赖项。其中，存根（Stubs）提供预定义的响应，而模拟对象（Mocks）则用于验证方法调用。Go 语言的接口特性让模拟（行为）的实现变得自然。在不依赖外部资源的测试场景中，二者是必不可少的工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@septio/effective-testing-in-go-mocks-and-stubs-ce22593e7b60&quot;&gt;文章Go 中的有效测试：Mocks 和 Stubs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://laiyuanyuan-sg.medium.com/mock-solutions-for-golang-unit-test-a2b60bd3e157&quot;&gt;文章Golang 单元测试的 Mock 解决方案&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/nerd-for-tech/writing-unit-tests-in-golang-part-2-mocking-d4fa1701a3ae&quot;&gt;文章使用 Golang 编写单元测试（第二部分：Mocking）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Ir7dl7XX9r4&quot;&gt;视频软件测试中的模拟（Mocking）、存根（Stubs）和伪造（Fakes）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;httptest-yong4-yu2-http-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;httptest 用于 HTTP 测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;该&lt;code&gt;httptest&lt;/code&gt;软件包提供了用于测试无需网络连接的 HTTP 服务器和客户端的实用程序。包括&lt;code&gt;httptest.Server&lt;/code&gt;、&lt;code&gt;ResponseRecorder&lt;/code&gt;和用于创建测试请求的辅助程序。对于测试处理程序、中间件和 HTTP 服务至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/net/http/httptest&quot;&gt;官方的httptest 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@ullauri.byron/using-httptest-server-in-go-to-mock-and-test-external-api-calls-68ce444cf934&quot;&gt;文章在 Go 中使用 httptest.Server 来模拟和测试外部 API 调用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.cafe/blog/golang-httptest-example.html&quot;&gt;文章Httptest 示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ji1-zhun3-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;基准测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;基准测试通过对重复执行进行计时来衡量代码性能。函数以 开头&lt;code&gt;Benchmark&lt;/code&gt;并使用&lt;code&gt;*testing.B&lt;/code&gt;参数。使用 运行&lt;code&gt;go test -bench=.&lt;/code&gt;可以识别瓶颈、比较实现并跟踪性能随时间的变化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/add-a-test&quot;&gt;官方的添加测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/scaling-go/golang-benchmarking/&quot;&gt;文章Go 中的基准测试：综合手册&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/benchmarking-golang-improve-function-performance/&quot;&gt;文章Golang 中的基准测试：提高函数性能&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fu4-gai4-fan4-wei2&quot; tabindex=&quot;-1&quot;&gt;覆盖范围 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;测试覆盖率使用&lt;code&gt;go test -cover&lt;/code&gt;和 来衡量测试期间的代码执行情况&lt;code&gt;-coverprofile&lt;/code&gt;。使用 进行可视化，&lt;code&gt;go tool cover -html&lt;/code&gt;以识别未经测试的代码路径。有助于维护质量标准并指导测试工作，从而提高应用程序的可靠性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/build-cover&quot;&gt;官方的覆盖率分析&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@keployio/understanding-go-coverage-a-guide-to-test-coverage-in-go-0c6e5ac8ba81&quot;&gt;文章理解 Go 覆盖率：Go 测试覆盖率指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sheng1-tai4-xi4-tong3-yu3-re4-men2-ku4&quot; tabindex=&quot;-1&quot;&gt;生态系统与热门库 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;gou4-jian4-cli&quot; tabindex=&quot;-1&quot;&gt;构建 CLI &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 凭借其快速编译、单一二进制分发和丰富的生态系统，在 CLI 开发方面表现出色。您可以使用标准&lt;code&gt;flag&lt;/code&gt;软件包或框架，例如 Cobra、urfave/cli、Bubble Tea。此外，它还支持跨平台交叉编译。非常适合在学习 Go 的同时构建实用工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/solutions/clis&quot;&gt;官方的命令行界面（CLI）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@mgm06bm/building-a-command-line-interface-cli-tool-in-golang-a-step-by-step-guide-44a7aad488e4&quot;&gt;文章使用 Golang 构建命令行界面 (CLI) 工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.stackademic.com/building-a-feature-rich-command-line-interface-cli-in-go-42a127b090c8&quot;&gt;文章使用 GO 构建功能丰富的命令行界面 (CLI)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;cobra&quot; tabindex=&quot;-1&quot;&gt;Cobra &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;适用于现代 CLI 应用程序的强大库。kubectl、Hugo 和 GitHub CLI 均使用它。提供嵌套子命令、标志、智能建议、自动帮助生成和 Shell 补全功能。遵循 POSIX 标准，API 简洁。包含命令生成器，可快速启动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cobra.dev/&quot;&gt;Cobra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-use-the-cobra-package-in-go&quot;&gt;文章如何在 Go 中使用 Cobra 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/frasnym/getting-started-with-cobra-creating-multi-level-command-line-interfaces-in-golang-2j3k&quot;&gt;文章Cobra 入门&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;urfave-cli&quot; tabindex=&quot;-1&quot;&gt;urfave/cli &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;urfave/cli 是一个用于构建命令行应用程序的简单软件包，它具有直观的命令、标志和参数 API。它具有自动生成帮助、bash 补全、嵌套子命令以及集成环境变量等功能，可用于轻量级 CLI 工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cli.urfave.org/&quot;&gt;官方的urfave/cli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zetcode.com/golang/urfave-cli/&quot;&gt;文章使用 urfave/cli 在 Go 中构建命令行工具&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;bubble-tea&quot; tabindex=&quot;-1&quot;&gt;Bubble Tea &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Bubble Tea 是一个基于 Elm 架构构建终端 UI 的框架。它使用模型-更新-视图模式，用于支持键盘输入、样式和组件组合的交互式 CLI 应用。非常适合构建复杂的终端工具和仪表板。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;charmbracelet/bubbletea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@originalrad50/building-ui-of-golang-cli-app-with-bubble-tea-68b61e25445e&quot;&gt;文章使用 Bubble Tea 构建 Golang CLI 应用程序的 UI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/andyhaskell/intro-to-bubble-tea-in-go-21lg&quot;&gt;Intro to Bubble Tea in Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;web-kai1-fa1&quot; tabindex=&quot;-1&quot;&gt;Web 开发 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;非常适合 Web 开发，内置 HTTP 服务器支持，并发效率高，生态系统丰富。标准&lt;code&gt;net/http&lt;/code&gt;包提供了强大的服务器、请求/响应和 RESTful API 工具。其性能、简单的部署（单个二进制文件）和并发能力使其成为可扩展 Web 应用的理想选择。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/net/http&quot;&gt;官方的http 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@emonemrulhasan35/net-http-package-in-go-e178c67d87f1&quot;&gt;文章Go 中的 net/http 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thelinuxcode.com/mastering-concurrency-in-golang-a-deep-dive-into-the-waitgroup/&quot;&gt;文章掌握 Golang 中的并发&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;nethttp-biao1-zhun3&quot; tabindex=&quot;-1&quot;&gt;net/http 标准 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;HTTP 客户端/服务器功能的标准库包。提供 HTTP 服务器路由、中间件支持以及用于发起请求的客户端。支持 TLS、HTTP/2、Cookie 和多部分表单。无需外部框架即可进行 Web 开发的基础。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/net/http&quot;&gt;官方的http 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@emonemrulhasan35/net-http-package-in-go-e178c67d87f1&quot;&gt;文章Go 中的 net/http 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-make-an-http-server-in-go&quot;&gt;文章如何用 Go 语言创建 HTTP 服务器&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;kuang4-jia4-xuan3-xiang4&quot; tabindex=&quot;-1&quot;&gt;框架（选项） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;h5&gt;Gin&lt;/h5&gt;
&lt;p&gt;流行的 HTTP Web 框架，注重性能和生产力。轻量级的 API/Web 服务基础，仅需极少的样板代码。快速路由、中间件、JSON 验证、错误管理、内置渲染功能。简洁的 RESTful 服务 API。包含参数绑定、上传和静态文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gin-gonic.com/&quot;&gt;官方的Gin Web 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@godusan/building-a-restful-api-in-go-using-the-gin-framework-a-step-by-step-tutorial-part-1-2-70372ebfa988&quot;&gt;文章使用 Gin 框架在 Go 中构建 RESTful API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/web-service-gin&quot;&gt;文章使用 Go 和 Gin 开发 RESTful API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;echo&lt;/h5&gt;
&lt;p&gt;高性能、极简的 Web 框架，专注于便捷性和速度。提供路由、中间件、数据绑定、验证和渲染功能。支持自动 TLS、HTTP/2 和 WebSocket。内置 CORS、JWT、日志记录和压缩中间件。适用于 RESTful API 和微服务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://echo.labstack.com/&quot;&gt;官方的高性能、可扩展、极简的 Go Web 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://echo.labstack.com/docs&quot;&gt;官方的Echo 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@OTS415/structuring-golang-echo-apis-8d657de5dc7c&quot;&gt;文章使用 Echo 构建可扩展 Golang API 的最佳实践&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Fiber&lt;/h5&gt;
&lt;p&gt;Fiber 是一个基于 Fasthttp 构建的、受 Express 启发的 Web 框架，性能卓越。它提供熟悉的 API，并支持中间件、路由、模板和 WebSocket。它广泛应用于高性能 REST API 和追求速度和简洁性的微服务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gofiber.io/&quot;&gt;Fiber &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.gofiber.io/&quot;&gt;Fiber 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/gofiber/fiber&quot;&gt;开源Fiber &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@uzairahmed01/fiber-framework-in-golang-b5158499c9ad&quot;&gt;文章Golang 中的 Fiber 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/percoguru/getting-started-with-apis-in-golang-feat-fiber-and-gorm-2n34&quot;&gt;文章Go Fiber：开始在 Golang 上构建 RESTful API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Beego&lt;/h5&gt;
&lt;p&gt;Beego 是一个全栈 Web 框架，提供 MVC 架构、ORM、会话管理、缓存和管理界面生成。遵循约定优于配置的原则，并拥有丰富的工具，可快速开发需要全面功能的企业级应用程序。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/moretypes/6&quot;&gt;官方的数组&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/beego/beego&quot;&gt;官方的beego套餐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/beego/beego&quot;&gt;开源beego/beego&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@vijeshomen/exploring-golang-and-beego-a-beginners-guide-with-examples-part-1-79619f0db1ac&quot;&gt;文章探索 Golang 和 Beego：初学者指南及示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;grpc-he2-xie2-yi4-huan3-chong1-qu1&quot; tabindex=&quot;-1&quot;&gt;gRPC 和协议缓冲区 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;gRPC 是一个使用协议缓冲区进行序列化的高性能 RPC 框架。它提供流式传输、身份验证、负载均衡以及从&lt;code&gt;.proto&lt;/code&gt;文件生成代码的功能。它具有类型安全、高效的二进制格式和跨语言兼容性，非常适合微服务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/google.golang.org/grpc&quot;&gt;官方的gRPC 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@leodahal4/building-a-grpc-micro-service-in-go-a-comprehensive-guide-82b6812ed253&quot;&gt;文章使用 Go 构建 GRPC 微服务：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/madhusgowda/understanding-grpc-in-golang-a-comprehensive-guide-with-examples-84c&quot;&gt;文章理解 Golang 中的 gRPC：综合指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;orm-he2-shu4-ju4-ku4-fang3-wen4&quot; tabindex=&quot;-1&quot;&gt;ORM 和数据库访问 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 提供了多种数据库访问方式：使用 database/sql 的原始 SQL、类似 GORM/Ent 的 ORM 以及查询构建器。请根据复杂度需求进行选择——原始 SQL 性能更高、ORM 快速开发、查询构建器平衡性能。此外，还需要考虑连接池和迁移功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/encore/go-orms-compared-2c8g&quot;&gt;文章Go ORM 比较&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@romulo.gatto/master-data-management-in-go-orm-libraries-guide-cd30cd65cba0&quot;&gt;文章Go 中的主数据管理：ORM 和库指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;pgx&quot; tabindex=&quot;-1&quot;&gt;PGX &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;pgx 是一个纯 Go 编写的 PostgreSQL 驱动程序，提供数据库/SQL 兼容性和原生 PostgreSQL 功能。它比 lib/pq 性能更佳，包含数组、JSON 支持、连接池以及 LISTEN/NOTIFY 等 PostgreSQL 特有的功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/jackc/pgx&quot;&gt;官方的pgx 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/scaling-go/postgresql-pgx-golang/&quot;&gt;文章使用 PGX 在 Go 中开始使用 PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;grom&quot; tabindex=&quot;-1&quot;&gt;GROM &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;流行的 Go 对象关系映射库。提供基于结构体的模型、自动迁移、关联和查询构建的数据库抽象。支持多种数据库（MySQL、PostgreSQL、SQLite、SQL Server）。具有钩子、事务和连接池等功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://gorm.io/&quot;&gt;官方的GORM - Golang 的出色 ORM 库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/gorm.io/gorm&quot;&gt;官方的gorm 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@itskenzylimon/getting-started-on-golang-gorm-af49381caf3f&quot;&gt;文章Golang Gorm 入门&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;loggin&quot; tabindex=&quot;-1&quot;&gt;Loggin &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对于监控、调试和维护生产应用程序至关重要。标准&lt;code&gt;log&lt;/code&gt;包和&lt;code&gt;slog&lt;/code&gt;（Go 1.21+）用于结构化日志记录。常用库：Zap（高性能）、Zerolog（零分配）、Logrus（功能丰富）。请使用适当的日志级别和结构化消息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/slog&quot;&gt;官方的使用 slog 进行结构化日志记录&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/logging-in-go/&quot;&gt;文章使用 Slog 登录 Go：终极指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/fazal_mansuri_/effective-logging-in-go-best-practices-and-implementation-guide-23hp&quot;&gt;文章Go 中的高效日志记录：最佳实践与实现&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;zerolog&quot; tabindex=&quot;-1&quot;&gt;Zerolog &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Zerolog 是一款零分配 JSON 日志记录器，专注于性能和简洁性。它提供结构化日志记录，具有流畅的 API、多种日志级别，并且在操作期间无需分配内存，非常适合高吞吐量生产应用程序。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/rs/zerolog&quot;&gt;官方的zerolog 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/zerolog/&quot;&gt;文章使用 Zerolog 登录 Go 的完整指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://signoz.io/guides/zerolog-golang/&quot;&gt;文章Zerolog Golang - 日志记录完整指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;zap&quot; tabindex=&quot;-1&quot;&gt;Zap &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Zap 是 Uber 开发的高性能结构化日志库，提供结构化和 printf 风格的 API。其功能包括 JSON/控制台格式、可配置级别、采样以及通过精心的内存管理实现的生产级性能优化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/go.uber.org/zap&quot;&gt;官方的zap 包 - go.uber.org/zap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://betterstack.com/community/guides/logging/go/zap/&quot;&gt;文章Go 中 Zap Logging 的综合指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://codewithmukesh.com/blog/structured-logging-in-golang-with-zap/&quot;&gt;文章使用 Zap 在 Golang 中进行结构化日志记录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi2-shi2-tong1-xin4&quot; tabindex=&quot;-1&quot;&gt;实时通信 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Go 中的实时通信支持使用 WebSocket、服务器发送事件和消息传递模式进行即时双向更新。Go 的并发性使其成为处理多个连接的理想选择。对于需要即时同步的聊天应用、实时仪表板和交互式应用程序而言，Go 至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/net/http&quot;&gt;官方的http 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/wisemonks/implementing-websockets-in-golang-d3e8e219733b&quot;&gt;文章使用 Golang 实现 WebSocket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;melody&quot; tabindex=&quot;-1&quot;&gt;Melody &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Melody 是一个极简的 Go 语言 WebSocket 框架，提供简单的会话管理、消息广播和连接处理功能。其功能包括聊天室、自动 ping/pong、消息限制以及与现有 Web 框架的无缝集成，适用于实时应用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/github.com/olahol/melody&quot;&gt;Melody Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/olahol/melody&quot;&gt;开源olahol/melody：极简主义的 websocket 框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gabrieltanner.org/blog/realtime-chat-go-websockets/&quot;&gt;文章使用 Go 和 WebSockets 构建实时聊天服务器&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;centrifugo&quot; tabindex=&quot;-1&quot;&gt;Centrifugo &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Centrifugo 是一个实时消息服务器，为 Go 应用程序提供 WebSocket 服务。它提供通道、状态信息、消息历史记录和 Redis 可扩展性。支持 WebSocket、服务器发送事件和 HTTP 流，同时能够处理复杂的实时模式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://centrifugal.dev/&quot;&gt;Centrifugo &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://centrifugal.dev/docs/getting-started/introduction&quot;&gt;官方的Centrifugo 入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/centrifugal/centrifuge&quot;&gt;开源离心机&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;go-gong1-ju4-lian4-he2-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;Go 工具链和工具 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;he2-xin1-go-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;核心 Go 命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;go-run&quot; tabindex=&quot;-1&quot;&gt;go run &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;一步编译并执行 Go 程序，无需创建可执行文件。适用于测试、开发和运行脚本。接受 Go 源文件作为参数。方便在开发过程中快速执行，无需构建任何构件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/getting-started&quot;&gt;go run&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-tutorial.com/build-and-run&quot;&gt;文章如何构建和运行 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-build-and-install-go-programs&quot;&gt;文章如何构建和安装 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-build&quot; tabindex=&quot;-1&quot;&gt;go build &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;将 Go 软件包及其依赖项编译为可执行二进制文件。支持通过 GOOS/GOARCH 跨平台编译不同的操作系统/架构。包含构建约束、自定义标志和优化级别。默认生成静态链接的二进制文件。部署和分发必备&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/compile-install&quot;&gt;官方的编译并安装应用程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-tutorial.com/build-and-run&quot;&gt;文章如何构建和运行 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-build-and-install-go-programs&quot;&gt;文章如何构建和安装 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-install&quot; tabindex=&quot;-1&quot;&gt;go install &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;$GOPATH/bin&lt;/code&gt;编译并安装软件包及依赖项。为主软件包创建可执行文件。用于&lt;code&gt;go install package@version&lt;/code&gt;安装特定版本的工具。通常用于在系统范围内安装 CLI 工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/install&quot;&gt;官方的 go install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/manage-install&quot;&gt;官方的管理 Go 安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thenewstack.io/golang-how-to-use-the-go-install-command/&quot;&gt;文章Golang：如何使用 Go Install 命令&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-fmt&quot; tabindex=&quot;-1&quot;&gt;go fmt &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;根据官方代码规范自动格式化 Go 源代码。标准化缩进、空格和对齐，以保持一致的代码风格。规范且不可配置，消除了格式争议。对于简洁、易读、符合社区标准的代码至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/gofmt&quot;&gt;官方的 go fmt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/fmt&quot;&gt;官方的 fmt 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thegeekdiary.com/go-fmt-command-examples/&quot;&gt;文章go fmt 命令示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-mod&quot; tabindex=&quot;-1&quot;&gt;go mod &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于模块管理的命令行工具。&lt;code&gt;go mod init&lt;/code&gt;创建模块、&lt;code&gt;go mod tidy&lt;/code&gt;清理依赖项、&lt;code&gt;go mod download&lt;/code&gt;获取模块。管理 go.mod 和 go.sum 文件。依赖管理和版本控制的基本命令。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/create-module&quot;&gt;官方的 go mod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.devtrovert.com/p/go-get-go-mod-tidy-commands&quot;&gt;文章go mod 命令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://golangbyexamples.com/go-mod-tidy/&quot;&gt;文章go mod tidy 做什么？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-test&quot; tabindex=&quot;-1&quot;&gt;go test &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于在 Go 包中运行测试的命令。自动查找并执行以 开头的函数&lt;code&gt;Test&lt;/code&gt;。支持基准测试 ( &lt;code&gt;Benchmark&lt;/code&gt;)、示例 ( &lt;code&gt;Example&lt;/code&gt;) 和子测试。包含覆盖率分析、并行执行和多种输出格式。TDD 和质量保证必备工具&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/add-a-test&quot;&gt;官方的 go Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-write-unit-tests-in-go-using-go-test-and-the-testing-package&quot;&gt;文章如何用 Go 编写单元测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/hyperskill/testing-and-benchmarking-in-go-e33a54b413e&quot;&gt;文章Go 中的测试和基准测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-clean&quot; tabindex=&quot;-1&quot;&gt;go clean &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;从构建过程中移除目标文件和缓存文件。选项包括&lt;code&gt;-cache&lt;/code&gt;构建缓存和&lt;code&gt;-modcache&lt;/code&gt;模块下载。有助于排查构建问题、释放磁盘空间并确保构建干净。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://golang.google.cn/cmd/go/internal/clean/&quot;&gt;官方的 go clean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.adityathebe.com/how-to-clean-go-build-cache/&quot;&gt;文章确保清理你的 Go 构建缓存&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=F5KLmp6aB5Q&quot;&gt;视频Golang 清洁架构&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-doc&quot; tabindex=&quot;-1&quot;&gt;go doc &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;打印从特殊格式的注释中提取的 Go 包、类型、函数和方法的文档。使用&lt;code&gt;go doc package&lt;/code&gt;或&lt;code&gt;go doc package.Function&lt;/code&gt;查看特定文档。这对于探索 API 和验证文档格式至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tip.golang.org/doc/comment&quot;&gt;官方的 go doc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/cmd/go&quot;&gt;官方的go 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-cookbook.com/snippets/tools/go-doc&quot;&gt;使用 go doc 记录你的 Go 代码&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;go-version&quot; tabindex=&quot;-1&quot;&gt;go version &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;显示当前安装的 Go 版本、目标操作系统和架构。这对于验证安装、排除环境问题以及确保跨不同开发环境和团队的兼容性至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/dl/&quot;&gt;官方的Go 版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.golang101.com/questions/how-to-update-golang-version/&quot;&gt;文章更新 Go 版本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.finxter.com/how-to-check-my-golang-version-win-macos-linux/&quot;&gt;文章如何检查我的 Golang 版本（Win、MacOS、Linux）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dai4-ma3-zhi4-liang4-fen1-xi1&quot; tabindex=&quot;-1&quot;&gt;代码质量分析 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;go-vet&quot; tabindex=&quot;-1&quot;&gt;go vet &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 语言的内置工具，可分析 Go 源代码中可能存在 bug（漏洞 / 缺陷）的可疑结构。它会检查无法访问的代码（不可达代码）、错误的 printf 格式、结构体标签（struct tag）错误以及潜在的空指针解引用（nil pointer dereference）问题。该工具会由 &lt;code&gt;go test&lt;/code&gt; 命令自动运行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/cmd/vet&quot;&gt;官方的 go vet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a-journey-with-go/go-vet-command-is-more-powerful-than-you-think-563e9fdec2f5&quot;&gt;文章Go：Vet Command 比你想象的更强大&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a-journey-with-go/go-vet-command-is-more-powerful-than-you-think-563e9fdec2f5&quot;&gt;文章使用 go vet 进行代码分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;goimports&quot; tabindex=&quot;-1&quot;&gt;goimports &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;一款用于自动管理 Go 导入语句（import statements）的工具：它能添加缺失的导入，移除未使用的导入，同时对代码进行格式化。相比手动管理导入，该工具更为便捷，且可与编辑器集成，实现 “保存时自动执行”（即保存代码时自动完成导入管理与代码格式化）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/tour/basics/2&quot;&gt;go import&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alexedwards.net/blog/an-introduction-to-packages-imports-and-modules&quot;&gt;文章Go 中的包、导入和模块简介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/hprog99/unraveling-packages-and-imports-in-golang-a-comprehensive-guide-8f0ea320562a&quot;&gt;文章解开 Golang 中的包和导入&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dai4-ma3-jian3-cha2-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;代码检查工具 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;revive&quot; tabindex=&quot;-1&quot;&gt;revive &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;快速、可配置的 Go 代码检查器，提供丰富的格式和丰富的代码分析规则。作为 golint 的直接替代品，性能更佳，规则可配置，并支持多种输出格式。有助于在不同项目之间保持一致的代码质量。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://revive.run/docs&quot;&gt;官方的revive - 快速且可配置的 Go 语言 linter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mgechev/revive&quot;&gt;开源mgechev/复兴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@caring_smitten_gerbil_914/%EF%B8%8F-level-up-your-go-style-with-revive-the-fast-configurable-community-friendly-linter-78dacbe74191&quot;&gt;文章通过 revive 提升您的 Go 风格&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;staticcheck&quot; tabindex=&quot;-1&quot;&gt;staticcheck &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;最先进的 Go linter，通过静态分析捕获 bug、性能问题和代码风格问题。比 go vet 提供更全面的检查，且误报率极低。它可以检测未使用的代码、错误的 API 使用以及细微的 bug。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://staticcheck.dev/docs/&quot;&gt;官方的静态检查&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dominikh/go-tools&quot;&gt;开源dominikh/go-tools：静态检查&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;govulncheck&quot; tabindex=&quot;-1&quot;&gt;govulncheck &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 的官方漏洞扫描程序，用于检查代码和依赖项中是否存在已知的安全漏洞。它会从 Go 数据库中报告存在漏洞的软件包，并提供漏洞严重程度信息和修复建议。这对于维护应用程序安全至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/govulncheck&quot;&gt;官方的govulncheck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@caring_smitten_gerbil_914/%EF%B8%8F-using-govulncheck-to-detect-vulnerable-dependencies-in-go-627a634f1edd&quot;&gt;文章使用 govulncheck 检测 Go 中的易受攻击的依赖项&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dai4-ma3-sheng1-cheng2-gou4-jian4-biao1-qian1&quot; tabindex=&quot;-1&quot;&gt;代码生成/构建标签 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;go-generate&quot; tabindex=&quot;-1&quot;&gt;go generate &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;该&lt;code&gt;go generate&lt;/code&gt;命令执行&lt;code&gt;//go:generate&lt;/code&gt;指令中指定的命令来生成 Go 源代码。用于从模板、字符串方法、嵌入式资源生成代码，以及运行 protobuf 编译器等工具进行构建自动化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/generate&quot;&gt;官方的去生成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.carlana.net/post/2016-11-27-how-to-use-go-generate/&quot;&gt;文章如何使用 //go:generate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/hlubek/metaprogramming-with-go-or-how-to-build-code-generators-that-parse-go-code-2k3j&quot;&gt;文章使用 Go 进行元编程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;build-tags&quot; tabindex=&quot;-1&quot;&gt;Build Tags &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;构建标签使用&lt;code&gt;//go:build&lt;/code&gt;基于操作系统、架构或自定义标签等条件的指令来控制文件包含。启用针对特定平台代码、功能标志和特定环境构建的条件编译，无需任何运行时开销。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/go/build&quot;&gt;官方的构建包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jacktt/go-build-in-advance-4o8n&quot;&gt;文章高级 Go 构建技术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/customizing-go-binaries-with-build-tags&quot;&gt;文章使用构建标签自定义 Go 二进制文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;xing4-neng2-he2-tiao2-shi4&quot; tabindex=&quot;-1&quot;&gt;性能和调试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;pprof&quot; tabindex=&quot;-1&quot;&gt;pprof &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;用于分析程序性能的内置性能分析工具。可分析 CPU 使用率、内存分配、goroutine 和阻塞操作。可导入&lt;code&gt;net/http/pprof&lt;/code&gt;到 Web 界面或用于&lt;code&gt;go tool pprof&lt;/code&gt;分析。是性能优化和瓶颈识别的必备工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/runtime/pprof&quot;&gt;官方的pprof 包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@jhathnagoda/go-profiling-with-pprof-a-step-by-step-guide-a62323915cb0&quot;&gt;文章使用 pprof 进行 Go 性能分析：分步指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;trace&quot; tabindex=&quot;-1&quot;&gt;Trace &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 跟踪工具可捕获执行跟踪信息，显示 goroutine 执行、系统调用、GC 和调度。使用&lt;code&gt;runtime/trace&lt;/code&gt;package 生成跟踪信息，使用 进行分析&lt;code&gt;go tool trace&lt;/code&gt;。提供 Web 界面用于诊断并发问题和性能瓶颈。&lt;/p&gt;
&lt;h4 id=&quot;jing4-zheng1-jian3-ce4-race-detector&quot; tabindex=&quot;-1&quot;&gt;竞争检测（Race Detector) &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;使用该标志检测并发程序中数据竞争的运行时工具&lt;code&gt;-race&lt;/code&gt;。跟踪内存访问并报告冲突，并提供包括堆栈跟踪在内的详细信息。对于在开发和测试过程中查找并发错误至关重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/articles/race_detector&quot;&gt;官方的竞争检测&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a-journey-with-go/go-race-detector-with-threadsanitizer-8e497f9e42db&quot;&gt;文章Go：使用 ThreadSanitizer 进行竞争检测器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sobyte.net/post/2022-06/go-data-race/&quot;&gt;文章Golang 中的数据竞争检测和数据竞争模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bu4-shu3-he2-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;部署和工具 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;gou4-jian4-ke3-zhi2-xing2-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;构建可执行文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;该&lt;code&gt;go build&lt;/code&gt;命令将源代码编译为独立的本机可执行文件，并带有静态链接。创建包含所有依赖项的独立二进制文件，无需在目标系统上安装 Go。使用各种优化标志控制构建。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/go/build&quot;&gt;官方的构建包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/doc/tutorial/compile-install&quot;&gt;官方的编译并安装应用程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jacktt/go-build-in-advance-4o8n&quot;&gt;文章高级 Go 构建技术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/customizing-go-binaries-with-build-tags&quot;&gt;文章使用构建标签自定义 Go 二进制文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/how-to-build-and-install-go-programs&quot;&gt;文章如何构建和安装 Go 程序&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jiao1-cha1-bian1-yi4&quot; tabindex=&quot;-1&quot;&gt;交叉编译 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;GOOS&lt;/code&gt;使用环境变量为不同的操作系统和架构构建可执行文件&lt;code&gt;GOARCH&lt;/code&gt;。例如：&lt;code&gt;GOOS=linux GOARCH=amd64 go build&lt;/code&gt;创建 Linux 二进制文件。无需单独的构建环境即可实现多平台开发。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/GccgoCrossCompilation&quot;&gt;官方的Gccgo交叉编译&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@keployio/understanding-go-coverage-a-guide-to-test-coverage-in-go-0c6e5ac8ba81&quot;&gt;文章使用 Golang 轻松进行交叉编译&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;gao1-ji2-zhu3-ti2&quot; tabindex=&quot;-1&quot;&gt;高级主题 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;shen1-ru4-nei4-cun2-guan3-li3&quot; tabindex=&quot;-1&quot;&gt;深入内存管理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;深度内存管理涉及理解垃圾回收、逃逸分析、分配模式和优化技术。涵盖栈与堆分配、内存池、减少分配以及高性能应用程序的 GC 交互。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/ref/mem&quot;&gt;官方的Go 内存模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mtardy.com/posts/memory-golang/&quot;&gt;文章深入探究 Golang 内存&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@siddharthnarayan/how-go-manages-memory-and-why-its-so-efficient-68c13133ba1c&quot;&gt;文章Go 如何管理内存以及它为何如此高效&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;tao2-yi4-fen1-xi1-escape-analysis&quot; tabindex=&quot;-1&quot;&gt;逃逸分析（Escape Analysis） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;一种编译时优化技术，用于判断变量应分配在栈（stack，速度快）还是堆（heap，需垃圾回收 / GC）上。“逃逸” 出其作用域的变量需要在堆上分配内存。可使用命令 &lt;code&gt;go build -gcflags=&amp;quot;-m&amp;quot;&lt;/code&gt; 查看变量分配的判定结果。理解逃逸分析有助于减少堆内存分配，从而降低垃圾回收（GC）压力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/abstractmusa/escape-analysis-in-go-stack-vs-heap-allocation-explained-506a&quot;&gt;文章Go 中的逃逸分析：栈与堆分配详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@trinad536/escape-analysis-in-golang-fc81b78f3550&quot;&gt;文章Golang中的逃逸分析&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;fan3-she4&quot; tabindex=&quot;-1&quot;&gt;反射 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;反射允许使用包在运行时检查和操作类型和值&lt;code&gt;reflect&lt;/code&gt;。它支持动态方法调用和类型检查，但会带来性能开销。常用于 JSON 封送处理、ORM 和框架。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/reflect&quot;&gt;官方的反射包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/blog/laws-of-reflection&quot;&gt;官方的反射定律&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logrocket.com/reflection-go-use-cases-tutorial/&quot;&gt;文章Go 中的反射：用例和教程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;bu4-an1-quan2-de-bao1-guo3&quot; tabindex=&quot;-1&quot;&gt;不安全的包裹 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;该&lt;code&gt;unsafe&lt;/code&gt;软件包绕过 Go 的类型和内存安全机制，可进行直接内存操作和指针运算。功能强大但危险，可能导致崩溃和漏洞。主要用于系统编程和性能关键型代码。请谨慎使用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/unsafe&quot;&gt;官方的不安全的包裹&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a-journey-with-go/go-what-is-the-unsafe-package-d2443da36350&quot;&gt;文章Go：什么是不安全包？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://go-cookbook.com/snippets/standard-library-packages/unsafe-package&quot;&gt;文章Go 中不安全的包使用&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;gou4-jian4-yue1-shu4-he2-biao1-qian1&quot; tabindex=&quot;-1&quot;&gt;构建约束和标签 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;特殊注释控制构建时包含哪些文件。用于&lt;code&gt;//go:build&lt;/code&gt;特定平台的代码、环境构建或功能切换。适用于不同的操作系统/架构，或调试与生产构建。对于可移植的 Go 应用程序至关重要&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/go/build&quot;&gt;官方的构建包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jacktt/go-build-in-advance-4o8n&quot;&gt;文章高级 Go 构建技术&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/customizing-go-binaries-with-build-tags&quot;&gt;文章使用构建标签自定义 Go 二进制文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;cgo-ji1-chu3-zhi1-shi&quot; tabindex=&quot;-1&quot;&gt;CGO 基础知识 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;CGO 允许 Go 程序使用特殊注释调用 C 代码，反之亦然。它支持 C 库集成，但会禁用交叉编译，降低性能，并使部署复杂化。对于旧版集成很有用，但纯 Go 更佳。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://go.dev/wiki/cgo&quot;&gt;官方的 CGO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/metal3d/understand-how-to-use-c-libraries-in-go-with-cgo-3dbn&quot;&gt;文章了解如何通过 CGO 在 Go 中使用 C 库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.codingexplorations.com/blog/calling-c-functions-from-go-a-quick-guide&quot;&gt;文章从 Go 调用 C 函数：快速指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;bian1-yi4-qi4-he2-lian4-jie1-qi4-biao1-zhi4&quot; tabindex=&quot;-1&quot;&gt;编译器和链接器标志 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;构建标志控制编译和链接。常用标志包括&lt;code&gt;-ldflags&lt;/code&gt;链接器选项、&lt;code&gt;-gcflags&lt;/code&gt;编译器设置、&lt;code&gt;-tags&lt;/code&gt;构建标签以及&lt;code&gt;-race&lt;/code&gt;竞争检测。这些标志有助于优化构建、缩减二进制文件大小并嵌入构建信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/flag&quot;&gt;官方的标志包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://goperf.dev/01-common-patterns/comp-flags/o&quot;&gt;文章利用编译器优化标志&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://diginode.in/go/compiler-optimization-flags/&quot;&gt;文章编译器优化标志&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;cha1-jian4-he2-dong4-tai4-jia1-zai4&quot; tabindex=&quot;-1&quot;&gt;插件和动态加载 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Go 的插件系统允许使用包在运行时加载共享库（.so 文件）&lt;code&gt;plugin&lt;/code&gt;。使用 构建&lt;code&gt;go build -buildmode=plugin&lt;/code&gt;。支持模块化架构，但存在局限性：仅适用于 Unix、版本兼容性问题以及复杂性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pkg.go.dev/plugin&quot;&gt;官方的插件包&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/profusion-engineering/plugins-with-go-7ea1e7a280d3&quot;&gt;文章Go 插件 如何使用 Go 的标准&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.to/jacktt/plugin-in-golang-4m67&quot;&gt;文章Golang 中的插件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>隐私协议</title>
		<link href="https://www.dtking.cn/privacy/"/>
		<updated>2025-09-23T09:40:21Z</updated>
		<id>https://www.dtking.cn/privacy/</id>
		<content type="html">&lt;p&gt;欢迎使用我们的网站，这是一个收录互联网优质网站的导航工具站点。在使用本网站前，请您仔细阅读并理解本隐私说明。若您继续使用本网站，即视为您已阅读、理解并同意本隐私说明的所有内容。&lt;/p&gt;
&lt;h2 id=&quot;xin4-xi1-lai2-yuan2&quot; tabindex=&quot;-1&quot;&gt;信息来源 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/privacy/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本网站收录的所有信息均来自互联网，我们不对其中的内容进行修改或验证。因此，我们无法保证所有信息的安全性、可靠性或准确性。&lt;/li&gt;
&lt;li&gt;我们不会主动收集或保存用户的个人隐私信息，包括但不限于姓名、电子邮件地址、联系方式等。&lt;/li&gt;
&lt;li&gt;为了提供更好的服务和优化用户体验，我们可能会使用网站分析工具收集匿名化的统计数据，用于了解用户使用趋势和行为习惯，但这些信息不包含任何个人身份识别信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;mian3-ze2-sheng1-ming2&quot; tabindex=&quot;-1&quot;&gt;免责声明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/privacy/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本网站所收录的网站链接和内容由第三方提供，并不代表我们对其背书或保证其安全性和可靠性。用户在使用这些链接和内容时需要自行甄别，谨慎判断，对可能产生的风险和后果自行承担责任。&lt;/li&gt;
&lt;li&gt;本网站作为一个完全开放、免费、非营利性网站，不对用户因使用本站而产生的纠纷、经济损失或其他任何问题负责。&lt;/li&gt;
&lt;li&gt;本网站可能包含指向其他网站的链接，这些链接并不受本隐私说明的约束。对于用户在其他网站上的行为和信息处理，我们不负任何责任。建议用户在离开本网站后查阅所访问网站的隐私政策。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shi4-yong4-fa3-l4&quot; tabindex=&quot;-1&quot;&gt;适用法律 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/privacy/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本私隐说明受中华人民共和国法律管辖，用户在使用本站服务时，视为同意接受本私隐说明的约束。如有任何争议，适用中华人民共和国法律解决。感谢您信任本网站，我们会持续优化我们的服务，为用户提供更好的体验。如有任何疑问，请随时联系我们。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;yin3-si1-shuo1-ming2-de-bian4-geng1&quot; tabindex=&quot;-1&quot;&gt;隐私说明的变更 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/privacy/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本网站可能根据需要不时更新本隐私说明。我们将在网站上发布更新后的版本，并在适当情况下通过其他途径通知用户。请您定期查阅最新的隐私说明，以确保您对我们的信息处理方式始终保持了解。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果您对本隐私说明或我们的网站有任何疑问或意见，请通过网站上提供的联系方式与我们取得联系。&lt;/p&gt;
&lt;p&gt;最后更新日期：2023年7月24日&lt;/p&gt;
&lt;p&gt;联系邮箱：&lt;a href=&quot;mailto:robots_user@qq.com&quot;&gt;robots_user@qq.com&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Go 语言中 context 包（AI）</title>
		<link href="https://www.dtking.cn/blog/golang/context-package/"/>
		<updated>2025-09-23T09:37:37Z</updated>
		<id>https://www.dtking.cn/blog/golang/context-package/</id>
		<content type="html">&lt;p&gt;Go 语言的 &lt;code&gt;context&lt;/code&gt; 包提供了一种在多个 goroutine 之间传递&amp;quot;上下文&amp;quot;的机制，主要用于&lt;strong&gt;控制并发任务的生命周期&lt;/strong&gt;，包括设置超时时间、取消操作以及传递请求范围的元数据。&lt;/p&gt;
&lt;h3 id=&quot;he2-xin1-gong1-neng2-deadlines-jie2-zhi3-shi2-jian1-yu3-cancellations-qu3-xiao1&quot; tabindex=&quot;-1&quot;&gt;核心功能：Deadlines（截止时间）与 Cancellations（取消） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;context&lt;/code&gt; 包的核心是 &lt;code&gt;Context&lt;/code&gt; 接口，它定义了以下关键方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Deadline()&lt;/code&gt;：返回上下文的截止时间（若设置）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Done()&lt;/code&gt;：返回一个 channel，当上下文被取消或超时会关闭&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Err()&lt;/code&gt;：返回上下文被取消的原因&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Value(key interface{}) interface{}&lt;/code&gt;：获取上下文携带的值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用的 &lt;code&gt;Context&lt;/code&gt; 实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;context.Background()&lt;/code&gt;：根上下文，通常作为所有上下文的起点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context.TODO()&lt;/code&gt;：临时上下文，用于不确定使用哪种上下文的场景&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context.WithCancel(parent)&lt;/code&gt;：创建可取消的上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context.WithDeadline(parent, time)&lt;/code&gt;：创建带截止时间的上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context.WithTimeout(parent, duration)&lt;/code&gt;：创建带超时的上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context.WithValue(parent, key, value)&lt;/code&gt;：创建携带键值对的上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chang2-jian4-shi3-yong4-chang3-jing3-common-usecases&quot; tabindex=&quot;-1&quot;&gt;常见使用场景（Common Usecases） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;1-chao1-shi2-kong4-zhi4-timeout&quot; tabindex=&quot;-1&quot;&gt;1. 超时控制（Timeout） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;限制操作的执行时间，避免长时间阻塞。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;context timeout &lt;/b&gt;context_cancel.go&lt;/div&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;context&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;time&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 模拟一个可能耗时的操作&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;longRunningTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Second&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 模拟任务耗时3秒&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;任务完成&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 监听上下文取消信号&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Errorf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;任务被取消: %v&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 创建一个2秒后超时的上下文&lt;/span&gt;
	ctx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cancel &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;WithTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Second&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cancel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 确保资源释放&lt;/span&gt;

	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;开始执行任务，超时时间2秒&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;longRunningTask&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;错误:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;程序正常结束&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果会显示任务因超时而被取消，因为任务需要3秒而超时设置为2秒。&lt;/p&gt;
&lt;h4 id=&quot;2-qu3-xiao1-cao1-zuo4-cancellation&quot; tabindex=&quot;-1&quot;&gt;2. 取消操作（Cancellation） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;手动取消一组相关的 goroutine，例如用户终止请求时。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;context cancel &lt;/b&gt;context_cancel.go&lt;/div&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;context&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;time&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 工作函数，监听上下文取消信号&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Context&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
			fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;工作者 %d 收到取消信号: %v&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Err&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
			fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;工作者 %d 正在工作...&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Millisecond&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 创建可取消的上下文&lt;/span&gt;
	ctx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cancel &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;WithCancel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cancel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 确保程序退出时取消&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 启动3个工作者&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;worker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 运行2秒后手动取消&lt;/span&gt;
	time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Second&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;主程序：开始取消所有工作者&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;cancel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 等待所有工作者退出&lt;/span&gt;
	time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Second&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;主程序：所有工作者已退出&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行后会看到所有工作者在收到取消信号后停止工作。&lt;/p&gt;
&lt;h4 id=&quot;3-chuan2-di4-qing3-qiu2-fan4-wei2-de-yuan2-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;3. 传递请求范围的元数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;在处理请求的整个调用链中传递数据（如请求ID、用户认证信息等）。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;context value &lt;/b&gt;context_value.go&lt;/div&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;context&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 定义类型化的key，避免键冲突&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; contextKey &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; RequestIDKey contextKey &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;requestID&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 模拟处理链中的函数&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handleRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;process1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;process2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Context&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 从上下文中获取请求ID&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; reqID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ok &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; ctx&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RequestIDKey&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; ok &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;处理请求，ID: %s&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reqID&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;未找到请求ID&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 创建携带请求ID的上下文&lt;/span&gt;
	ctx &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;WithValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;context&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Background&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; RequestIDKey&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;REQ-12345&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 处理请求&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;handleRequest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ctx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zui4-jia1-shi2-jian4&quot; tabindex=&quot;-1&quot;&gt;最佳实践 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;不要将 &lt;code&gt;Context&lt;/code&gt; 存储在结构体中，应作为函数参数传递&lt;/li&gt;
&lt;li&gt;优先使用 &lt;code&gt;context.Background()&lt;/code&gt; 作为根上下文&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Context&lt;/code&gt; 是线程安全的，可以被多个 goroutine 同时使用&lt;/li&gt;
&lt;li&gt;避免使用 &lt;code&gt;WithValue&lt;/code&gt; 传递大量数据，它主要用于请求范围的元数据&lt;/li&gt;
&lt;li&gt;及时调用 &lt;code&gt;cancel&lt;/code&gt; 函数释放资源，通常使用 &lt;code&gt;defer&lt;/code&gt; 确保&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;context&lt;/code&gt; 包是 Go 并发编程中控制 goroutine 生命周期的重要工具，尤其在分布式系统、服务端编程中广泛用于处理超时、取消和请求跟踪。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Go 语言中，Fan-out/Fan-in 和 Pipeline 是两种强大的并发模式（AI）</title>
		<link href="https://www.dtking.cn/blog/golang/concurrency_patterns/"/>
		<updated>2025-09-23T09:37:37Z</updated>
		<id>https://www.dtking.cn/blog/golang/concurrency_patterns/</id>
		<content type="html">&lt;p&gt;已建立使用 goroutine 和通道构建并发程序的设计方法。关键模式：&lt;code&gt;fan-in&lt;/code&gt;（合并输入）、&lt;code&gt;fan-out&lt;/code&gt;（分配工作）、&lt;code&gt;pipeline&lt;/code&gt;（流水线）、工作池、发布-订阅通信。帮助构建高效、可扩展的应用程序，同时避免竞争条件和死锁。&lt;/p&gt;
&lt;h2 id=&quot;1-pipeline-liu2-shui3-xian4-mo2-shi4&quot; tabindex=&quot;-1&quot;&gt;1. Pipeline（流水线）模式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/concurrency_patterns/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将复杂任务分解为一系列有序的阶段，每个阶段处理数据后传递给下一个阶段，类似工厂流水线。每个阶段通过 channel 连接，前一阶段的输出作为后一阶段的输入。&lt;/p&gt;
&lt;h2 id=&quot;2-fanoutfanin-mo2-shi4&quot; tabindex=&quot;-1&quot;&gt;2. Fan-out/Fan-in 模式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/concurrency_patterns/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fan-out&lt;/strong&gt;：将一个任务分发到多个并行的 goroutine 中处理（扩展并发）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fan-in&lt;/strong&gt;：将多个并行 goroutine 的结果汇总到一个输出流中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下是结合这两种模式的示例，实现对一系列数字的并行处理：&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;math/rand&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;time&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 生成数字序列（流水线第一阶段）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generateNumbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; count &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	out &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; count&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			out &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; i
			time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Millisecond&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 模拟生成耗时&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; out
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 平方计算（可并行处理的阶段 - Fan-out）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;square&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;num &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Millisecond&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 模拟计算耗时&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; num &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; num
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 并行处理数字（Fan-out）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;squareWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	out &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; in &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			out &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;square&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; out
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 过滤偶数（流水线最后阶段）&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;filterEvens&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;in &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	out &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; in &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; n&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				out &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; n
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Millisecond&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; out
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// Fan-in：合并多个channel的输出&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cs &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	out &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; wg sync&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;WaitGroup

	wg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; cs &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ch &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; wg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Done&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; ch &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				out &lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; n
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 等待所有输入channel关闭后再关闭输出channel&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		wg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Wait&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; out
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	rand&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Seed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Now&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;UnixNano&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 1. 生成10个数字（1-10）&lt;/span&gt;
	numbers &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generateNumbers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 2. Fan-out：启动3个worker并行处理平方计算&lt;/span&gt;
	worker1 &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;squareWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numbers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	worker2 &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;squareWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numbers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	worker3 &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;squareWorker&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;numbers&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 3. Fan-in：合并3个worker的结果&lt;/span&gt;
	merged &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;merge&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;worker1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; worker2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; worker3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 4. 过滤出偶数结果（流水线最后阶段）&lt;/span&gt;
	evens &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;filterEvens&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;merged&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 收集并打印结果&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; evens &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Printf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;最终结果: %d&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dai4-ma3-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;代码说明： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/concurrency_patterns/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pipeline 阶段&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;generateNumbers&lt;/code&gt;：生成初始数据序列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;squareWorker&lt;/code&gt;：处理数据（计算平方）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filterEvens&lt;/code&gt;：处理前一阶段结果（过滤偶数）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fan-out&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启动 3 个 &lt;code&gt;squareWorker&lt;/code&gt; 并行处理 &lt;code&gt;generateNumbers&lt;/code&gt; 产生的数据&lt;/li&gt;
&lt;li&gt;每个 worker 从同一个输入 channel 读取数据，实现任务分发&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fan-in&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;merge&lt;/code&gt; 函数将 3 个 worker 的输出汇总到一个 channel&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;sync.WaitGroup&lt;/code&gt; 等待所有 worker 完成后关闭输出 channel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种模式的优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;并行效率&lt;/strong&gt;：充分利用多核 CPU 处理能力，提高整体吞吐量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可扩展性&lt;/strong&gt;：可根据任务负载动态调整 worker 数量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块化&lt;/strong&gt;：每个阶段独立，便于测试和维护&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;背压机制&lt;/strong&gt;：channel 天然支持的阻塞特性可平衡各阶段速度差异&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用于数据处理流水线、ETL 任务、分布式计算等场景。&lt;/p&gt;
&lt;h2 id=&quot;bing4-fa1-bing4-xing2&quot; tabindex=&quot;-1&quot;&gt;并发&amp;amp;并行 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/concurrency_patterns/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 Go 语言的并发模型中，首先需要明确&lt;strong&gt;并行（Parallelism）&lt;/strong&gt; 和&lt;strong&gt;并发（Concurrency）&lt;/strong&gt; 的核心区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;并发（Concurrency）&lt;/strong&gt;：指多个任务在逻辑上&amp;quot;同时&amp;quot;推进，这些任务可能交替使用同一 CPU 核心（通过时间分片），强调&amp;quot;任务调度的交错性&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行（Parallelism）&lt;/strong&gt;：指多个任务在物理上&amp;quot;同时&amp;quot;执行，需要多个 CPU 核心支持，强调&amp;quot;实际执行的同时性&amp;quot;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单说：并发是&amp;quot;看起来同时&amp;quot;，并行是&amp;quot;真正同时&amp;quot;；并发是逻辑设计，并行是物理实现。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>YOLOv5 模型训练记录</title>
		<link href="https://www.dtking.cn/blog/ml/yolov5/"/>
		<updated>2025-09-19T03:04:16Z</updated>
		<id>https://www.dtking.cn/blog/ml/yolov5/</id>
		<content type="html">&lt;p&gt;Ultralytics YOLOv5 🚀 是由 Ultralytics 开发的尖端、达到业界顶尖水平（SOTA）的计算机视觉模型。基于 PyTorch 框架，YOLOv5 以其易用性、速度和准确性而闻名。它融合了广泛研究和开发的见解与最佳实践，使其成为各种视觉 AI 任务的热门选择，包括目标检测，图像分割和图像分类&lt;/p&gt;
&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;一、准备数据 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;二、标注工具 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;三、创建数据集 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;四、下载安装 YOLOv5 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;五、开始训练 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;训练命令 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;扩展 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;六、开始测试 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;推理测试 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;扩展 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;📚 参考 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
	&lt;summary&gt;预训练模型和数据格式要求&lt;/summary&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据格式要求：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;YOLOv5 使用的标准数据格式是 &lt;strong&gt;YOLO 格式&lt;/strong&gt;。对于每张图像，需要创建一个与之对应的标签文件，标签文件使用 &lt;code&gt;.txt&lt;/code&gt; 格式，其中包含该图像中所有物体的位置信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图像格式&lt;/strong&gt;：YOLOv5 支持 JPEG、PNG、BMP 等常见图像格式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标签格式&lt;/strong&gt;：每个图像有一个对应的 &lt;code&gt;.txt&lt;/code&gt; 标签文件，文件的名称与图像文件的名称相同。例如：&lt;code&gt;image1.jpg&lt;/code&gt; 对应 &lt;code&gt;image1.txt&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;标签文件的每一行描述一个物体的边界框（bounding box）。每一行的格式为：&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;class_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;x_center&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;y_center&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;width&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;height&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;class_id&amp;gt;&lt;/code&gt;：物体类别的编号，从 &lt;code&gt;0&lt;/code&gt; 开始。例如：第一个类别是 &lt;code&gt;0&lt;/code&gt;，第二个是 &lt;code&gt;1&lt;/code&gt;，以此类推。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;x_center&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;y_center&amp;gt;&lt;/code&gt;：边界框中心点的坐标，归一化到 [0, 1] 范围，即 &lt;code&gt;(x_center / image_width)&lt;/code&gt; 和 &lt;code&gt;(y_center / image_height)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;width&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;height&amp;gt;&lt;/code&gt;：边界框的宽度和高度，归一化到 [0, 1] 范围，即 &lt;code&gt;(box_width / image_width)&lt;/code&gt; 和 &lt;code&gt;(box_height / image_height)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;br&gt;
对于一张图像，假设图像的分辨率是 640x480，图中有一个物体（例如，线束圈），该物体的边界框为 &lt;code&gt;(x1, y1, x2, y2)&lt;/code&gt; = (100, 150, 200, 250)。那么对应的标签文件内容应该是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0 0.25 0.5 0.15 0.21
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，&lt;code&gt;0&lt;/code&gt; 是类别编号，&lt;code&gt;x_center=0.25&lt;/code&gt;、&lt;code&gt;y_center=0.5&lt;/code&gt;，&lt;code&gt;width=0.15&lt;/code&gt;、&lt;code&gt;height=0.21&lt;/code&gt; 分别是归一化后的宽度和高度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如何标注图片：&lt;/strong&gt;&lt;br&gt;
标注图像是为训练模型提供必要数据的过程。以下是常见的标注工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LabelImg&lt;/strong&gt;：一个开源的图像标注工具，支持 YOLO 格式的标注。你可以手动绘制矩形框并标注物体类别，软件会生成对应的 &lt;code&gt;.txt&lt;/code&gt; 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;图像分辨率要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推荐分辨率&lt;/strong&gt;：YOLOv5 在训练时对输入图像的分辨率没有严格要求，通常推荐将图像调整到 640x640 或 416x416。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在训练过程中，YOLOv5 会自动将图像缩放到指定的大小。通常，较大的图像分辨率会带来更高的精度，但也需要更多的计算资源和内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最大尺寸&lt;/strong&gt;：YOLOv5 可以处理较大的图像，但需要注意计算资源，过大的图像会增加内存和计算负担。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自适应输入&lt;/strong&gt;：YOLOv5 支持自适应输入尺寸，如果图像不是标准大小，它会进行自动填充或裁剪以适配训练模型。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;训练数据准备&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据集划分&lt;/strong&gt;：通常，数据集分为训练集、验证集和测试集。一般情况下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;训练集&lt;/strong&gt;：80% 的数据用于训练。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证集&lt;/strong&gt;：10% 的数据用于验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试集&lt;/strong&gt;：10% 的数据用于最终测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件结构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/dataset
    /images
        /train
        /val
        /test
    /labels
        /train
        /val
        /test&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YOLOv5 数据集的组织：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;labels 文件夹&lt;/strong&gt;：与 &lt;code&gt;images&lt;/code&gt; 文件夹对应，里面存放每张图像的 &lt;code&gt;.txt&lt;/code&gt; 标签文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置文件&lt;/strong&gt;：YOLOv5 使用 &lt;code&gt;.yaml&lt;/code&gt; 配置文件来定义数据集的信息，包括类别名称、数据集路径等。&lt;br&gt;
示例：&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /path/to/train/images
&lt;span class=&quot;token key atrule&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /path/to/val/images

&lt;span class=&quot;token key atrule&quot;&gt;nc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 类别数&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;line_bundle&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;other_object&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 类别名称&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/details&gt;
&lt;h2 id=&quot;yi1-zhun3-bei4-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;一、准备数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;收集图片数据，进行图片标注，图片格式要求，尽量使用大小一致的图片&lt;/p&gt;
&lt;h2 id=&quot;er4-biao1-zhu4-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;二、标注工具 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;labelImg&lt;/strong&gt; 需要 python 3.0 以上版本安装：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip3 &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; labelImg&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/kAguPQbOoU-1228.avif 1228w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/kAguPQbOoU-1228.webp 1228w&quot;&gt;&lt;img alt=&quot;labelImg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/kAguPQbOoU-1228.jpeg&quot; width=&quot;1228&quot; height=&quot;665&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用快捷键：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;‌&lt;kbd&gt;W&lt;/kbd&gt;‌：启动矩形框标注工具。‌‌&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;‌A&lt;/kbd&gt;‌：切换到上一张图片。‌‌&lt;/li&gt;
&lt;li&gt;‌&lt;kbd&gt;D‌&lt;/kbd&gt;：切换到下一张图片。‌‌&lt;/li&gt;
&lt;li&gt;‌&lt;kbd&gt;Del&lt;/kbd&gt;‌：删除当前选中标注框。‌‌&lt;/li&gt;
&lt;li&gt;‌&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;D&lt;/kbd&gt;‌：复制当前标签和矩形框。‌‌&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;D&lt;/kbd&gt;‌：删除当前图片。‌‌&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;san1-chuang4-jian4-shu4-ju4-ji2&quot; tabindex=&quot;-1&quot;&gt;三、创建数据集 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;目录结构：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;wiring
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;images&lt;/strong&gt;：图片
&lt;ul&gt;
&lt;li&gt;train：训练图片&lt;/li&gt;
&lt;li&gt;val：  验证图片&lt;/li&gt;
&lt;li&gt;test：测试图片&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;labels&lt;/strong&gt;：边界框
&lt;ul&gt;
&lt;li&gt;train：训练数据&lt;/li&gt;
&lt;li&gt;val：验证数据&lt;/li&gt;
&lt;li&gt;test：测试数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wiring.yaml&lt;/strong&gt; yolo 配置文件&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;数据集 &lt;/b&gt;datasets&lt;/div&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;datasets
├── wiring
│   ├── images
│   │   ├── train
│   │   │   ├── 00000001.jpg (63959B)
│   │   │   ├── 00000002.jpg (68349B)
│   │   │   ├── 00000003.jpg (67362B)
│   │   │   ├── 00000004.jpg (67151B)
│   │   │   └── ...
│   │   └── val
│   │       ├── 00000005.jpg (63959B)
│   │       ├── 00000006.jpg (68349B)
│   │       ├── 00000007.jpg (67362B)
│   │       ├── 00000008.jpg (67151B)
│   │       └── ...
│   └── labels
│       ├── train
│       │   ├── 00000001.txt (38B)
│       │   ├── 00000002.txt (38B)
│       │   ├── 00000003.txt (38B)
│       │   ├── 00000004.txt (38B)
│       │   └── ...
│       ├── val
│       │   ├── 00000005.txt (114B)
│       │   ├── 00000006.txt (114B)
│       │   ├── 00000007.txt (76B)
│       │   ├── 00000008.txt (38B)
│       │   └── ...
├── wiring.yaml (193B)&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;配置文件 &lt;/b&gt;wiring.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./datasets/wiring/images/train
&lt;span class=&quot;token key atrule&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ./datasets/wiring/images/val

&lt;span class=&quot;token key atrule&quot;&gt;nc&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 类别数&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;L&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;T&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;si4-xia4-zai4-an1-zhuang1-yolov5&quot; tabindex=&quot;-1&quot;&gt;四、下载安装 YOLOv5 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 克隆 YOLOv5 仓库&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/ultralytics/yolov5

&lt;span class=&quot;token comment&quot;&gt;# 导航到克隆的目录&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; yolov5

&lt;span class=&quot;token comment&quot;&gt;# 安装所需的包&lt;/span&gt;
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将第三步的 &lt;code&gt;datasets&lt;/code&gt; 所有数据拷贝到 &lt;code&gt;yolov5&lt;/code&gt; 根目录&lt;/p&gt;
&lt;h2 id=&quot;wu3-kai1-shi3-xun4-lian4&quot; tabindex=&quot;-1&quot;&gt;五、开始训练 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;最好使用显卡推理，默认有显卡会使用显卡推理，没有使用 CPU 推理，显卡推理需安装的软件和 &lt;code&gt;cuda&lt;/code&gt;版本对应。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;nvidia-smi&lt;/code&gt; 查询版本信息：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;nvidia-smi
---------------------------------------------------------------------------------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; NVIDIA-SMI &lt;span class=&quot;token number&quot;&gt;539.28&lt;/span&gt;                 Driver Version: &lt;span class=&quot;token number&quot;&gt;539.28&lt;/span&gt;       CUDA Version: &lt;span class=&quot;token number&quot;&gt;12.2&lt;/span&gt;     &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;-----------------------------------------+----------------------+----------------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; GPU  Name                     TCC/WDDM  &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Bus-Id        Disp.A &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Volatile Uncorr. ECC &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Fan  Temp   Perf          Pwr:Usage/Cap &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;         Memory-Usage &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; GPU-Util  Compute M. &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                                         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                      &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;               MIG M. &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;   &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;  Tesla P40                    TCC   &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; 00000000:0B:00.0 Off &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                  Off &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; N/A   33C    P8               9W / 250W &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      8MiB / 24576MiB &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;      &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;%      Default &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                                         &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                      &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;                  N/A &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Processes:                                                                            &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  GPU   GI   CI        PID   Type   Process name                            GPU Memory &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;        ID   ID                                                             Usage      &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;  No running processes found                                                           &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
+---------------------------------------------------------------------------------------+&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装兼容 CUDA Version: 12.2 相应的软件：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip3 &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;xun4-lian4-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;训练命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;Window 环境下，yolov5 根目录 cmd 执行 &lt;/b&gt;bash&lt;/div&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python train.py &lt;span class=&quot;token parameter variable&quot;&gt;--img&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--batch&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--epochs&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;150&lt;/span&gt; ^
&lt;span class=&quot;token parameter variable&quot;&gt;--data&lt;/span&gt; datasets/wiring.yaml ^
&lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt ^
&lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; wiring ^
&lt;span class=&quot;token parameter variable&quot;&gt;--cache&lt;/span&gt; ^
&lt;span class=&quot;token parameter variable&quot;&gt;--device&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;kuo4-zhan3&quot; tabindex=&quot;-1&quot;&gt;扩展 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;开始 &lt;a href=&quot;https://docs.ultralytics.com/zh/modes/train/#train-settings&quot;&gt;模型训练&lt;/a&gt; 使用 &lt;code&gt;train.py&lt;/code&gt; 脚本。必要的参数包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--img&lt;/code&gt;: 定义输入 &lt;a href=&quot;https://docs.ultralytics.com/zh/usage/cfg/#image-size&quot;&gt;图像大小&lt;/a&gt; （例如，&lt;code&gt;--img 640&lt;/code&gt;)。较大的尺寸通常会产生更好的精度，但需要更多的 GPU 内存。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--batch&lt;/code&gt;: 确定 &lt;a href=&quot;https://www.ultralytics.com/glossary/batch-size&quot;&gt;批次大小&lt;/a&gt; （例如，&lt;code&gt;--batch 16&lt;/code&gt;)。选择您的 GPU 可以处理的最大尺寸。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--epochs&lt;/code&gt;: 指定训练的总轮数 &lt;a href=&quot;https://www.ultralytics.com/glossary/epoch&quot;&gt;个 epoch&lt;/a&gt; （例如，&lt;code&gt;--epochs 100&lt;/code&gt;)。一个 epoch 代表对整个训练数据集的完整传递。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--data&lt;/code&gt;: 您的路径 &lt;code&gt;dataset.yaml&lt;/code&gt; 文件（例如， &lt;code&gt;--data coco128.yaml&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--weights&lt;/code&gt;: 初始权重文件的路径。使用预训练权重（例如， &lt;code&gt;--weights yolov5s.pt&lt;/code&gt;）强烈建议使用，以获得更快的收敛速度和更好的结果。要从头开始训练（除非您有非常大的数据集和特定需求，否则不建议这样做），请使用 &lt;code&gt;--weights &#39;&#39; --cfg yolov5s.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;liu4-kai1-shi3-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;六、开始测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模型保存在 &lt;code&gt;runs/train/wiring_exp/weights/best.pt&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;tui1-li3-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;推理测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;推理结果保存在： &lt;code&gt;runs/detect/exp&lt;/code&gt; 中&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; runs/train/wiring_exp/weights/best.pt &lt;span class=&quot;token parameter variable&quot;&gt;--img&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;640&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; test.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;kuo4-zhan3-1&quot; tabindex=&quot;-1&quot;&gt;扩展 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 使用网络摄像头运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 对本地图像文件运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; img.jpg

&lt;span class=&quot;token comment&quot;&gt;# 对本地视频文件运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; vid.mp4

&lt;span class=&quot;token comment&quot;&gt;# 对屏幕截图运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;screen&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 对图像目录运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; path/to/images/

&lt;span class=&quot;token comment&quot;&gt;# 对列出图像路径的文本文件运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; list.txt

&lt;span class=&quot;token comment&quot;&gt;# 对列出流 URL 的文本文件运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; list.streams

&lt;span class=&quot;token comment&quot;&gt;# 使用 glob 模式对图像运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;path/to/*.jpg&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 对 YouTube 视频 URL 运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;https://youtu.be/LNwODJXcvt4&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 对 RTSP、RTMP 或 HTTP 流运行推理&lt;/span&gt;
python detect.py &lt;span class=&quot;token parameter variable&quot;&gt;--weights&lt;/span&gt; yolov5s.pt &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;rtsp://example.com/media.mp4&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;can1-kao3&quot; tabindex=&quot;-1&quot;&gt;📚 参考 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ultralytics/yolov5&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.ultralytics.com/zh/yolov5/&quot;&gt;YOLOv5 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ultralytics/yolov5/blob/master/README.zh-CN.md&quot;&gt;Github README.zh-CN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>FFmpeg 常用命令</title>
		<link href="https://www.dtking.cn/blog/FFmpeg/"/>
		<updated>2025-09-19T03:04:16Z</updated>
		<id>https://www.dtking.cn/blog/FFmpeg/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;关键帧 IPB &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;I &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;P &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;B &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;均匀抽帧 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;所有帧 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;每秒抽帧 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;提取音频 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;视频处理 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;视频推流 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;mediamtx &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;a href=&quot;https://ffmpeg.org/&quot;&gt;FFmpeg&lt;/a&gt; 是领先的多媒体框架，能够解码、编码、 转码、复用、解复用、流式传输、过滤和播放几乎所有人类和机器创建的内容。它支持从最古老到最前沿的各种格式，无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的可移植性：FFmpeg 可以在 Linux、Mac OS X、Microsoft Windows、BSD、Solaris 等各种构建环境、机器架构和配置下编译、运行并通过我们的测试基础架构 FATE的测试。&lt;/p&gt;
&lt;h2 id=&quot;guan1-jian4-zhen1-ipb&quot; tabindex=&quot;-1&quot;&gt;关键帧 IPB &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;帧率 每秒画面数量 0-30 一搬25帧&lt;/p&gt;
&lt;h3 id=&quot;i&quot; tabindex=&quot;-1&quot;&gt;I &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;表示关键帧，是最完整的帧画面，一般视频封面都选择I帧；&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;select=eq(pict_type&#92;,I)&quot;&lt;/span&gt;  &lt;span class=&quot;token parameter variable&quot;&gt;-vsync&lt;/span&gt; vfr &lt;span class=&quot;token parameter variable&quot;&gt;-qscale:v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; image2 ./%08d.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;p&quot; tabindex=&quot;-1&quot;&gt;P &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;单预测帧，利用之前的I帧或P帧，采用运动预测的方式进行帧间预测编码；&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;select=eq(pict_type&#92;,P)&quot;&lt;/span&gt;  &lt;span class=&quot;token parameter variable&quot;&gt;-vsync&lt;/span&gt; vfr &lt;span class=&quot;token parameter variable&quot;&gt;-qscale:v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; image2 ./%08d.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;b&quot; tabindex=&quot;-1&quot;&gt;B &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;双向预测帧，利用双向帧进行预测编码；&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vf&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;select=eq(pict_type&#92;,B)&quot;&lt;/span&gt;  &lt;span class=&quot;token parameter variable&quot;&gt;-vsync&lt;/span&gt; vfr &lt;span class=&quot;token parameter variable&quot;&gt;-qscale:v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; image2 ./%08d.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;jun1-yun2-chou1-zhen1&quot; tabindex=&quot;-1&quot;&gt;均匀抽帧 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; 指定抽取的帧率，即从视频中每秒钟抽取图片的数量。1代表每秒抽取一帧。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q:v&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; image2 %08d.000000.png&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;suo3-you3-zhen1&quot; tabindex=&quot;-1&quot;&gt;所有帧 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4  %08d.000000.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;mei3-miao3-chou1-zhen1&quot; tabindex=&quot;-1&quot;&gt;每秒抽帧 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-r&lt;/code&gt;: 10/秒&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; %08d.000000.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ti2-qu3-yin1-pin2&quot; tabindex=&quot;-1&quot;&gt;提取音频 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vn&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-codec&lt;/span&gt; copy out.m4a&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;shi4-pin2-chu3-li3&quot; tabindex=&quot;-1&quot;&gt;视频处理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;视频取一张封面&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; 0501000013700000000.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vframes&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; first_frame.jpg&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指定时间抽帧图片&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-ss&lt;/span&gt; 00:00:30 &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-vframes&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;.png&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频截取&lt;br&gt;
&lt;code&gt;-ss&lt;/code&gt; 5指定从输入视频第1:05秒开始截取，-t 10指明最多截取10秒;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-ss&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;:05 &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; output.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频截取&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c:v&lt;/code&gt; 和 &lt;code&gt;-c:a&lt;/code&gt;分别指定视频和音频的编码格式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c:v copy&lt;/code&gt; &lt;code&gt;-c:a copy&lt;/code&gt;标示视频与音频的编码不发生改变，而是直接复制，这样会大大提升速度。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-ss&lt;/code&gt; 1:05放到-i前面，与原来的区别是，这样会先跳转到第1:05秒在开始解码输入视频，而原来的会从开始解码，只是丢弃掉前1:05秒的结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-ss&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;:05 &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666051400&lt;/span&gt;.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c:v&lt;/span&gt; copy &lt;span class=&quot;token parameter variable&quot;&gt;-c:a&lt;/span&gt; copy output.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;图片合并视频&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-framerate&lt;/code&gt; 指定帧率&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; image2 &lt;span class=&quot;token parameter variable&quot;&gt;-framerate&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; %08d.000000.jpg test.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频拼接（字符串）&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;concat:input1.mp4|input2.mp4|input3.mp4&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; copy output.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频拼接（文件）&lt;br&gt;
list.txt&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;file &lt;span class=&quot;token string&quot;&gt;&#39;001.mp4&#39;&lt;/span&gt;
file &lt;span class=&quot;token string&quot;&gt;&#39;002.mp4&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; concat &lt;span class=&quot;token parameter variable&quot;&gt;-safe&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; list.txt &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; copy output.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;禁用音频&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-an&lt;/code&gt; 表示禁用音频流，只复制视频流，避免处理损坏的音频。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; 00000116000000000_v2.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-an&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c:v&lt;/span&gt; copy output_video_only.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;截取视频指定区域&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从指定区域截图视频，宽高，x起始位置，y起始位置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; 0501000013700000000.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-filter:v&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;crop=2110:890:450:550&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c:a&lt;/span&gt; copy area.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shi4-pin2-tui1-liu2&quot; tabindex=&quot;-1&quot;&gt;视频推流 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;搭配 &lt;a href=&quot;https://github.com/bluenviron/mediamtx&quot;&gt;mediamtx&lt;/a&gt; 实时媒体服务器&lt;/p&gt;
&lt;p&gt;&lt;code&gt;rtsp&lt;/code&gt; 协议推流&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-re&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; output.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; copy &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; rtsp rtsp://localhost:8554/mystream&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;rtsp&lt;/code&gt; 协议循环推流，添加 &lt;code&gt;-stream_loop&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ffmpeg &lt;span class=&quot;token parameter variable&quot;&gt;-stream_loop&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-re&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; output.mp4 &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; copy &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; rtsp rtsp://localhost:8554/mystream&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;mediamtx&quot; tabindex=&quot;-1&quot;&gt;mediamtx &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://github.com/bluenviron/mediamtx/releases&quot;&gt;mediamtx releases&lt;/a&gt;，双击 exe 直接启动就好。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF MediaMTX v1.14.0
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF configuration loaded from d:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Downloads&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;mediamtx_v1.14.0_windows_amd64&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;mediamtx.yml
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RTSP&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; listener opened on :8554 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;TCP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, :8000 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;UDP/RTP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, :8001 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;UDP/RTCP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RTMP&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; listener opened on :1935
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;HLS&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; listener opened on :8888
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;WebRTC&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; listener opened on :8889 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HTTP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;, :8189 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ICE/UDP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;/08/20 &lt;span class=&quot;token number&quot;&gt;14&lt;/span&gt;:44:31 INF &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;SRT&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; listener opened on :8890 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;UDP&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>mediamtx 配置文件英文转中文</title>
		<link href="https://www.dtking.cn/blog/mediamtx/"/>
		<updated>2025-09-17T07:14:31Z</updated>
		<id>https://www.dtking.cn/blog/mediamtx/</id>
		<content type="html">&lt;h2 id=&quot;quan2-bu4-pei4-zhi4-wen2-jian4-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;全部配置文件说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/mediamtx/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 常用参数&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 设置日志基本；取值为“error”、“warn”、“info”、“debug”。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;logLevel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; info
&lt;span class=&quot;token comment&quot;&gt;# 日志输出方式 stdout file syslog&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;logDestinations&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; stdout &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 日志输出文件名&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;logFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mediamtx.log

&lt;span class=&quot;token comment&quot;&gt;# 读操作超时。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;readTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s
&lt;span class=&quot;token comment&quot;&gt;# 写操作超时。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;writeTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s
&lt;span class=&quot;token comment&quot;&gt;# 读缓冲区的数目。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 较高的值允许更宽的吞吐量，较低的值允许节省RAM.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;readBufferCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# UDP报文出方向最大负载大小。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这可以减少，以避免在具有低UDP MTU的网络上出现碎片。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;udpMaxPayloadSize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1472&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 执行外部认证的HTTP URL。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 每当用户想要进行身份验证时，服务器就调用这个URL&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# POST方法和一个包含：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;ip&quot;: &quot;ip&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;user&quot;: &quot;user&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;password&quot;: &quot;password&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;path&quot;: &quot;path&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;protocol&quot;: &quot;rtsp|rtmp|hls|webrtc&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;id&quot;: &quot;id&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;action&quot;: &quot;read|publish&quot;,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;#   &quot;query&quot;: &quot;query&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# }&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果响应码为20x，则接受身份验证，否则&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 它被丢弃。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;externalAuthenticationURL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 启用HTTP API。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# API 侦听器的地址。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;apiAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 127.0.0.1&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9997&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 启用普罗米修斯兼容的度量。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# 度量侦听器的地址。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;metricsAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 127.0.0.1&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9998&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 启用与 pprof 兼容的端点来监视性能。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;pprof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# pprof 侦听器的地址。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;pprofAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 127.0.0.1&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9999&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 命令，在客户端连接到服务器时运行。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 预先考虑。/在当前文件夹中运行可执行文件（例如：./ffmpeg ）&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 当客户端与服务器断开连接时，使用SIGINT终止此连接。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 可用的环境变量如下：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# * RTSP_PORT: RTSP server port&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;runOnConnect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果命令退出，则重新启动命令。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;runOnConnectRestart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no

&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# RTSP parameters&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 关闭 RTSP 协议支持。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtspDisable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# 已启用的 RTSP 传输协议列表。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# UDP 是性能最好的，但是当有 NAT/防火墙的时候就不工作了&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 服务器和客户端，不支持加密。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# udp 组播允许在客户端都在同一局域网时节省带宽。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# TCP 是最通用的，并且支持加密。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 握手总是通过 TCP 进行的。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;protocols&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; udp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; multicast&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tcp &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 对握手和 TCP 流进行 TLS 加密（RTSPS）。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 取值为 &quot;no&quot;, &quot;strict&quot;, &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;encryption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;no&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# TCP/RTSP 侦听器地址。只有当加密为 ；no ；或 optional ；时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtspAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8554&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Address of the TCP/TLS/RTSPS listener. This is needed only when encryption is &quot;strict&quot; or &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# TCP/TLS/RTSPS侦听器地址。只有当加密为 “encryption” 或 “strict” 时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtspsAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8322&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Address of the UDP/RTP listener. This is needed only when &quot;udp&quot; is in protocols.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# UDP/RTP 监听地址。只有在协议中使用“udp”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtpAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8000&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Address of the UDP/RTCP listener. This is needed only when &quot;udp&quot; is in protocols.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# UDP/RTCP 侦听器地址。只有在协议中使用“udp”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtcpAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8001&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# IP range of all UDP-multicast listeners. This is needed only when &quot;multicast&quot; is in protocols.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 所有 udp 组播侦听器的 IP 范围。只有在协议中使用“multicast”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;multicastIPRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 224.1.0.0/16
&lt;span class=&quot;token comment&quot;&gt;# Port of all UDP-multicast/RTP listeners. This is needed only when &quot;multicast&quot; is in protocols.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 所有 udp 组播/RTP侦听器的端口。只有在协议中使用“组播”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;multicastRTPPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8002&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Port of all UDP-multicast/RTCP listeners. This is needed only when &quot;multicast&quot; is in protocols.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 所有udp组播/RTCP侦听器的端口。只有在协议中使用“组播”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;multicastRTCPPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8003&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 服务器密钥的路径。只有当加密为“strict”或“optional”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 可以使用以下命令生成：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl genrsa -out server.key 2048&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;serverKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.key
&lt;span class=&quot;token comment&quot;&gt;# 服务器证书的路径。只有当加密为“strict”或“optional”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;serverCert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.crt
&lt;span class=&quot;token comment&quot;&gt;# Authentication methods. Available are &quot;basic&quot; and &quot;digest&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 身份验证方法。可用的有“basic”和“digest”。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# “digest”不提供任何额外的安全性，仅出于兼容性原因而可用。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;authMethods&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; basic &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# RTMP parameters&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 关闭 RTMP协议支持。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpDisable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# Address of the RTMP listener. This is needed only when encryption is &quot;no&quot; or &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# RTMP监听器的地址。只有当加密为 no 或 optional ；时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1935&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 使用TLS （RTMPS）加密连接。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 取值 &quot;no&quot;, &quot;strict&quot;, &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpEncryption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;no&quot;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Address of the RTMPS listener. This is needed only when encryption is &quot;strict&quot; or &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# RTMPS监听器的地址。只有当加密为“strict”或“optional”时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpsAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1936&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Path to the server key. This is needed only when encryption is &quot;strict&quot; or &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# This can be generated with:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl genrsa -out server.key 2048&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpServerKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.key
&lt;span class=&quot;token comment&quot;&gt;# Path to the server certificate. This is needed only when encryption is &quot;strict&quot; or &quot;optional&quot;.&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;rtmpServerCert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.crt

&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# HLS 参数&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 关闭 HLS 协议支持。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsDisable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# HLS 监听器的地址。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8888&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在 HLS 服务器上启用 TLS/HTTPS&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这是低延迟 HLS所需要的。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsEncryption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# 服务器密钥的路径。只有当加密为yes时才需要这样做。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 可以使用:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl genrsa -out server.key 2048&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsServerKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.key
&lt;span class=&quot;token comment&quot;&gt;# 服务器证书的路径。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsServerCert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.crt
&lt;span class=&quot;token comment&quot;&gt;# 默认情况下，HLS仅在用户请求时生成。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 此选项允许始终生成它，避免了请求和生成之间的延迟。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsAlwaysRemux&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# 使用的HLS协议的变体。可用的选项有：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# * mpegts - 使用MPEG-TS段，以获得最大的兼容性。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# * fmp4 - 采用碎片化MP4段，效率更高。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# * lowLatency - 使用低延迟HLS。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsVariant&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; lowLatency
&lt;span class=&quot;token comment&quot;&gt;# 要在服务器上保留的HLS段的数量。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 分段允许在流中查找。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 它们的数量不会影响延迟。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsSegmentCount&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 每个段的最小持续时间。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在播放流之前，播放器通常会在缓冲区中放入3个片段。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 最后的片段持续时间也受到IDR帧之间的间隔的影响。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 因为服务器为了包含至少一个IDR帧而更改持续时间&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在每个片段中。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsSegmentDuration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1s
&lt;span class=&quot;token comment&quot;&gt;# 每个部件的最小持续时间。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在播放流之前，播放器通常会在缓冲区中放入3个部分。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在低延迟HLS中使用部件来代替段。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 部分持续时间受视频/音频样本之间距离的影响&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 并进行调整，以产生具有相似持续时间的片段。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsPartDuration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200ms
&lt;span class=&quot;token comment&quot;&gt;# 每个段的最大大小。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这可以防止RAM耗尽。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsSegmentMaxSize&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50M
&lt;span class=&quot;token comment&quot;&gt;# 每个HTTP响应中提供的Access-Control-Allow-Origin头的值。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这允许从外部网站播放HLS流。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsAllowOrigin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;*&#39;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 放置在HLS服务器前的代理ip或cidr列表。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果服务器接收到来自其中一个条目的请求，则记录在日志中的IP&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 将从x - forward - for标头中获取。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsTrustedProxies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 存放段的目录，而不是将它们保存在RAM中。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这会降低性能，因为从磁盘读取的性能低于&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 从RAM读取，但允许节省RAM。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;hlsDirectory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# WebRTC 参数&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 关闭对WebRTC协议的支持。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcDisable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# WebRTC监听器地址。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8889&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 在WebRTC服务器上启用TLS/HTTPS。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcEncryption&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
&lt;span class=&quot;token comment&quot;&gt;# 服务器密钥的路径。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 可以使用以下命令生成：&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl genrsa -out server.key 2048&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcServerKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.key
&lt;span class=&quot;token comment&quot;&gt;# 服务器证书的路径。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcServerCert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; server.crt
&lt;span class=&quot;token comment&quot;&gt;# 每个HTTP响应中提供的Access-Control-Allow-Origin头的值。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这允许从外部网站播放WebRTC流。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcAllowOrigin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;*&#39;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 放置在WebRTC服务器前的代理ip地址或cidr列表。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果服务器接收到来自其中一个条目的请求，则记录在日志中的IP&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 将从x-forward-for标头中获取。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcTrustedProxies&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ICE服务器列表。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcICEServers2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# URL可以指向STUN、TURN或TURNS服务器。&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# STUN服务器用于获取服务器和客户端的公网IP地址。他们是&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# 当服务器和客户端位于不同的局域网时需要。&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# 当服务器与服务器之间有直接连接时，需要使用TURN/TURNS服务器&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;# 客户是不可能的。所有的流量都要经过它们。&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; stun&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;stun.l.google.com&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;19302&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 如果user是“auth_secret”，那么身份验证是基于秘密的。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 密码字段中必须插入密码。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 用作主机的公网IP地址列表。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这通常用于1:1 D-NAT后的服务器。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcICEHostNAT1To1IPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ICE UDP侦听器地址，格式为host:port。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果填充，ICE流量将通过单个UDP端口，&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 允许在容器内或NAT后部署服务器。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcICEUDPMuxAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ICE TCP监听器地址，格式为host:port。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 如果填充，ICE流量将通过单个TCP端口，&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 允许在容器内或NAT后部署服务器。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 设置此参数强制使用TCP协议，而不是TCP协议&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 这是WebRTC的最佳选择。&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;webrtcICETCPMuxAddress&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Path 参数&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 这些设置依赖于路径，映射键是路径的名称。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 可以通过使用波浪作为前缀来使用正则表达式。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# For example, &quot;~^(test1|test2)$&quot; will match both &quot;test1&quot; and &quot;test2&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 例如，~^(test1|test2)$ 将匹配所有以 test1 和 test2 结尾的路径。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# For example, &quot;~^prefix&quot; will match all paths that start with &quot;prefix&quot;.&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 例如，~^prefix 将匹配所有以 prefix 开头的路径。&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 路径 “all” 下的设置应用于与其他条目不匹配的所有路径&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 流的源头。这可以是：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * publisher -&gt; 流由RTSP或RTMP客户端发布&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * rtsp://existing-url -&gt; 流是从另一个RTSP服务器/摄像机拉出来的&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * rtsps://existing-url -&gt; 流是从另一个带有RTSP的RTSP服务器/摄像机拉出来的&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * rtmp://existing-url -&gt; 流是从另一个RTMP服务器/摄像机拉出来的&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * rtmps://existing-url -&gt; 流通过RTMP从另一个RTMP服务器/摄像机拉出&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * http://existing-url/stream.m3u8 -&gt; 流是从另一个HLS服务器拉出的&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * https://existing-url/stream.m3u8 -&gt; 流通过HTTPS从另一个HLS服务器拉出&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * udp://ip:port -&gt; 流是从UDP提取的，通过监听指定的IP和端口&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * redirect -&gt; 流由另一个路径或服务器提供&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * rpiCamera -&gt; 该流由树莓派相机提供&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; publisher

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 一般路径参数&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 如果源是 URL，并且源证书是自签名的&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 或者无效，您可以提供指纹证书以便&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 无论如何都要验证它。可以通过运行：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# openssl s_client -connect source_ip:source_port &amp;lt;/dev/null 2&gt;/dev/null | sed -n &#39;/BEGIN/,/END/p&#39; &gt; server.crt&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d &quot;=&quot; -f2 | tr -d &#39;:&#39;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceFingerprint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 按需拉流（无人观看时断开连接）yes&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceOnDemand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
    &lt;span class=&quot;token comment&quot;&gt;# 如果 sourceOnDemand 为 “yes”，等待 10 秒后开始拉流&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceOnDemandStartTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s
    &lt;span class=&quot;token comment&quot;&gt;# 如果 sourceOnDemand 为“ yes ；无人观看 10 秒后关闭连接&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceOnDemandCloseAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 认证路径参数&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 发布时需要用户名。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# sha256 哈希值可以插入 ；sha256: 前缀。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;publishUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 发布时需要密码。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# sha256哈希值可以插入 sha256 前缀。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;publishPass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 允许发布的ip或网络（x.x.x.x/24）。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;publishIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 需要用户名才能读取&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# sha256 哈希值可以插入 sha256 前缀。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;readUser&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 需要密码才能读取。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# sha256 哈希值可以插入 sha256 前缀。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;readPass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 允许读取的ip或网络（x.x.x.x/24）。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;readIPs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 发布者路径参数（当源为发布者时）&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 不要允许其他客户端断开当前发布者的连接并在其位置上发布。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;disablePublisherOverride&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
    &lt;span class=&quot;token comment&quot;&gt;# 如果没有人发布，将读者重定向到此路径。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 它可以是一个相对路径（例如/otherstream）或一个绝对的RTSP URL。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;fallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# RTSP路径参数（当源为RTSP或RTSP URL时）&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 用于拉取流的协议。取值为“自动”、“udp”、“multicast”、“tcp”。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceProtocol&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; automatic
    &lt;span class=&quot;token comment&quot;&gt;# 支持不提供服务器端口或使用随机服务器端口的源。这是一个安全问题&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 并且必须仅在与需要它的源交互时使用。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceAnyPortEnable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
    &lt;span class=&quot;token comment&quot;&gt;# 要发送到源的范围标头，以便从指定的偏移量开始流。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用值:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * clock: 可用值:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * npt: Normal Play Time 正常播放时间&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * smpte: 相对于记录开始的 SMPTE 时间戳&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rtspRangeType&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用值:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * clock: UTC ISO 8601组合日期和时间字符串，例如20230812T120000Z&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * npt: duration such as &quot;300ms&quot;, &quot;1.5m&quot; or &quot;2h45m&quot;, valid time units are &quot;ns&quot;, &quot;us&quot; (or &quot;µs&quot;), &quot;ms&quot;, &quot;s&quot;, &quot;m&quot;, &quot;h&quot;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * smpte: duration such as &quot;300ms&quot;, &quot;1.5m&quot; or &quot;2h45m&quot;, valid time units are &quot;ns&quot;, &quot;us&quot; (or &quot;µs&quot;), &quot;ms&quot;, &quot;s&quot;, &quot;m&quot;, &quot;h&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rtspRangeStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 重定向路径参数（当源为  redire 时）&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 客户端将被重定向到的RTSP URL。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;sourceRedirect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 相机路径参数（当源为“rpiCamera ”时）&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 相机ID&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraCamID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 框架宽度&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraWidth&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1920&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 框架高度&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraHeight&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1080&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 水平翻转&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraHFlip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 垂直翻转&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraVFlip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 亮度[- 1,1]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraBrightness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 对比[0,16]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraContrast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 饱和度[0,16]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraSaturation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 锐度[0,16]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraSharpness&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 曝光模式.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: normal, short, long, custom&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraExposure&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal
    &lt;span class=&quot;token comment&quot;&gt;# 自动白平衡模式。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy, custom&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraAWB&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto
    &lt;span class=&quot;token comment&quot;&gt;# 降噪工作模式。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: off, cdn_off, cdn_fast, cdn_hq&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraDenoise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;off&quot;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 固定快门速度，以微秒为单位。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraShutter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# AEC/AGC算法的计量模式。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: centre, spot, matrix, custom&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraMetering&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; centre
    &lt;span class=&quot;token comment&quot;&gt;# 固定增益&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraGain&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 图像的EV补偿[- 10,10]&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraEV&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 感兴趣的区域，格式为x，y，宽度，高度&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraROI&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 调整文件&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraTuningFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 传感器模式，格式为[width]:[height]:[bit-depth]:[packing]&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 位深度和填充是可选的。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 每秒帧数&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraFPS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# IDR帧之间的间隔&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraIDRPeriod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 比特率&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraBitrate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000000&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# H264概要&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; main
    &lt;span class=&quot;token comment&quot;&gt;# H264水平&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraLevel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;4.1&#39;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 自动对焦模式&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: auto, manual, continuous&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 取值范围：自动、手动、连续&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraAfMode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto
    &lt;span class=&quot;token comment&quot;&gt;# 自动对焦范围&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: normal, macro, full&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraAfRange&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal
    &lt;span class=&quot;token comment&quot;&gt;# 自动对焦速度&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# values: normal, fast&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraAfSpeed&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; normal
    &lt;span class=&quot;token comment&quot;&gt;# 镜头位置（仅适用于手动自动对焦），将设置对焦到特定距离&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# calculated by the following formula: d = 1 / value&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Examples: 0 moves the lens to infinity.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#           0.5 moves the lens to focus on objects 2m away.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#           2 moves the lens to focus on objects 50cm away.&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraLensPosition&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 指定自动对焦窗口，以x、y、宽度、高度的坐标形式表示&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 以占整个图像的比例给出。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraAfWindow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 启用在每一帧上打印文本。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraTextOverlayEnable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 印在每一帧上的文字。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Format是strftime（）函数之一。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;rpiCameraTextOverlay&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;%Y-%m-%d %H:%M:%S - MediaMTX&#39;&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;###############################################&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 外部命令路径参数&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 初始化此路径时运行的命令。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 这可以用于发布流并使其始终打开。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 预先考虑。/在当前文件夹中运行可执行文件（例如：./ffmpeg）&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 当程序关闭时，它以SIGINT终止。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用的环境变量如下：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * MTX_PATH: 路径名&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * RTSP_PORT: RTSP服务器端口&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * G1, G2, ...: 正则表达式组，如果路径名是&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#   正则表达式。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnInit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 如果命令退出，则重新启动命令。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnInitRestart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no

    &lt;span class=&quot;token comment&quot;&gt;# 命令，在请求此路径时运行。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 这可以用于按需发布流。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 预先考虑。/在当前文件夹中运行可执行文件（例如：./ffmpeg）&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 当路径不再被请求时，它以SIGINT终止。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用的环境变量如下：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * MTX_PATH: path name&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * RTSP_PORT: RTSP server port&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * G1, G2, ...: regular expression groups, if path name is&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#   a regular expression.&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnDemand&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 如果命令退出，则重新启动命令。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnDemandRestart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no
    &lt;span class=&quot;token comment&quot;&gt;# reader 将被搁置，直到 runOnDemand命令开始发布&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 或者等到这段时间过去了。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnDemandStartTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s
    &lt;span class=&quot;token comment&quot;&gt;# 当不存在时，命令将关闭&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 读者连接，这段时间已经过去了。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnDemandCloseAfter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10s

    &lt;span class=&quot;token comment&quot;&gt;# 命令，在流准备好读取时运行&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 由客户端发布或从服务器/摄像机提取。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 预先考虑。/在当前文件夹中运行可执行文件（例如：./ffmpeg）&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 当流不再准备好时，它以SIGINT终止。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用的环境变量如下：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * MTX_PATH: path name&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * RTSP_PORT: RTSP server port&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * G1, G2, ...: regular expression groups, if path name is&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#   a regular expression.&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnReady&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Restart the command if it exits.&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnReadyRestart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no

    &lt;span class=&quot;token comment&quot;&gt;# 命令，当客户端开始读取时运行。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 预先考虑。/在当前文件夹中运行可执行文件（例如：./ffmpeg）&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 当客户端停止读取时，此操作以SIGINT终止。&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 可用的环境变量如下：&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * MTX_PATH: path name&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * RTSP_PORT: RTSP server port&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# * G1, G2, ...: regular expression groups, if path name is&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;#   a regular expression.&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnRead&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 如果命令退出，则重新启动命令。&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;runOnReadRestart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; no&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Javascript CommonJS，AMD，ESM 模型分别是什么（AI）</title>
		<link href="https://www.dtking.cn/blog/JavaScript-module/"/>
		<updated>2025-08-05T03:45:46Z</updated>
		<id>https://www.dtking.cn/blog/JavaScript-module/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;1. CommonJS 模块 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;2. AMD 模块 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;3. ES 模块（ESM） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;三者主要区别对比 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;总结 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;在 JavaScript 中，模块系统是管理代码依赖和组织大型应用的重要方式。目前主要有三种主流的模块规范：CommonJS、AMD 和 ES 模块（ESM）。它们各有特点，适用于不同的场景。&lt;/p&gt;
&lt;h3 id=&quot;1-commonjs-mo2-kuai4&quot; tabindex=&quot;-1&quot;&gt;1. CommonJS 模块 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：CommonJS 是 Node.js 采用的模块规范，主要用于服务器端。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同步加载模块&lt;/li&gt;
&lt;li&gt;运行时加载&lt;/li&gt;
&lt;li&gt;模块在首次加载时执行，之后会缓存结果&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;require()&lt;/code&gt; 导入，&lt;code&gt;module.exports&lt;/code&gt; 或 &lt;code&gt;exports&lt;/code&gt; 导出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语法简单直观&lt;/li&gt;
&lt;li&gt;适合服务器端开发，模块加载不会造成性能问题&lt;/li&gt;
&lt;li&gt;缓存机制提高性能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同步加载不适合浏览器环境（会阻塞页面渲染）&lt;/li&gt;
&lt;li&gt;无法在编译时做静态分析&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// math.js - 导出模块&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exports &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  add&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  multiply
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 或者使用 exports&lt;/span&gt;
exports&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;divide&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// app.js - 导入模块&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; math &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;./math.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-amd-mo2-kuai4&quot; tabindex=&quot;-1&quot;&gt;2. AMD 模块 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：AMD（Asynchronous Module Definition，异步模块定义）是为浏览器环境设计的模块规范。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;异步加载模块&lt;/li&gt;
&lt;li&gt;支持依赖前置声明&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;define()&lt;/code&gt; 定义模块，&lt;code&gt;require()&lt;/code&gt; 加载模块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适合浏览器环境，不会阻塞页面渲染&lt;/li&gt;
&lt;li&gt;可以并行加载多个模块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语法相对复杂&lt;/li&gt;
&lt;li&gt;现在使用较少，逐渐被 ES 模块替代&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// math.js - 定义模块&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 有依赖的模块&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;define&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;./math&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function-variable function&quot;&gt;calculateTotal&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quantity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;price&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; quantity&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 加载模块&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;./math&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;math&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-es-mo2-kuai4-esm&quot; tabindex=&quot;-1&quot;&gt;3. ES 模块（ESM） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：ES 模块是 ECMAScript 标准定义的模块系统，现在浏览器和 Node.js 都支持。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;静态加载（编译时确定依赖）&lt;/li&gt;
&lt;li&gt;支持异步和同步加载&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;import&lt;/code&gt; 导入，&lt;code&gt;export&lt;/code&gt; 导出&lt;/li&gt;
&lt;li&gt;自动采用严格模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准规范，浏览器原生支持&lt;/li&gt;
&lt;li&gt;静态分析支持，有利于 tree-shaking 优化&lt;/li&gt;
&lt;li&gt;支持命名导出和默认导出&lt;/li&gt;
&lt;li&gt;同时适用于浏览器和服务器环境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器中使用需要设置 &lt;code&gt;type=&amp;quot;module&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;与 CommonJS 存在一些互操作复杂性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// math.js - 导出模块&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;multiply&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 默认导出&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;divide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; b&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// app.js - 导入模块&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; divide&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; add&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; multiply &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./math.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;divide&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 导入整个模块&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; math &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./math.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 HTML 中使用：&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;app.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;san1-zhe3-zhu3-yao4-qu1-bie2-dui4-bi3&quot; tabindex=&quot;-1&quot;&gt;三者主要区别对比 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;CommonJS&lt;/th&gt;
&lt;th&gt;AMD&lt;/th&gt;
&lt;th&gt;ES 模块&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;加载方式&lt;/td&gt;
&lt;td&gt;同步&lt;/td&gt;
&lt;td&gt;异步&lt;/td&gt;
&lt;td&gt;静态（编译时）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用环境&lt;/td&gt;
&lt;td&gt;服务器端（Node.js）&lt;/td&gt;
&lt;td&gt;浏览器端&lt;/td&gt;
&lt;td&gt;浏览器和服务器端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导入语法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;require()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;require()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导出语法&lt;/td&gt;
&lt;td&gt;&lt;code&gt;module.exports&lt;/code&gt;/&lt;code&gt;exports&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;define()&lt;/code&gt; 返回对象&lt;/td&gt;
&lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加载时机&lt;/td&gt;
&lt;td&gt;运行时&lt;/td&gt;
&lt;td&gt;运行时&lt;/td&gt;
&lt;td&gt;编译时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;动态加载&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;通过 &lt;code&gt;import()&lt;/code&gt; 函数支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;循环依赖&lt;/td&gt;
&lt;td&gt;支持（通过缓存）&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;td&gt;支持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CommonJS 是 Node.js 的标准，适合服务器端开发&lt;/li&gt;
&lt;li&gt;AMD 主要用于浏览器端，支持异步加载&lt;/li&gt;
&lt;li&gt;ES 模块是官方标准，同时支持浏览器和服务器端，是未来的趋势&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在大多数新项目都倾向于使用 ES 模块，特别是在前端开发中，配合 Webpack、Rollup 等构建工具可以获得更好的性能优化。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Github 代码贡献（AI）</title>
		<link href="https://www.dtking.cn/blog/github-code-contribution/"/>
		<updated>2025-08-04T05:49:53Z</updated>
		<id>https://www.dtking.cn/blog/github-code-contribution/</id>
		<content type="html">&lt;p&gt;&lt;strong&gt;Github 代码贡献流程，具体操作步骤说明。首先需要将代码 Fork（派生）到你自己的 GitHub 账号下&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;wei4-shen2-me-xu1-yao4-fork&quot; tabindex=&quot;-1&quot;&gt;&lt;strong&gt;为什么需要 Fork？&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/github-code-contribution/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;GitHub 的核心安全机制是权限管理。你没有权限直接向别人的仓库提交代码，因为这可能会引入不安全的更改。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fork&lt;/strong&gt; 的作用就是为你创建一个原仓库的&lt;strong&gt;个人副本&lt;/strong&gt;。这个副本与原仓库是独立的，你拥有完整的管理权限。你可以在这个副本里自由地创建分支、修改代码、进行测试，而不会影响到原始项目。&lt;/p&gt;
&lt;p&gt;当你完成修改后，再通过 &lt;strong&gt;Pull Request (PR)&lt;/strong&gt; 的方式，向原仓库的维护者提出请求，请他们审核并合并你的代码。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;biao1-zhun3-de-gong4-xian4-liu2-cheng2&quot; tabindex=&quot;-1&quot;&gt;&lt;strong&gt;标准的贡献流程&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/github-code-contribution/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下面是一个典型的，最常见的代码贡献流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fork 仓库&lt;/strong&gt;：在 GitHub 上找到你想要贡献的仓库，点击右上角的 &lt;strong&gt;&amp;quot;Fork&amp;quot;&lt;/strong&gt; 按钮，这会在你的个人账号下创建一个完全一样的仓库副本。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone 到本地&lt;/strong&gt;：将你 Fork 后的个人仓库克隆（&lt;code&gt;git clone&lt;/code&gt;）到你的本地电脑上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建新分支&lt;/strong&gt;：为了保持代码整洁，你应该为你的每一项更改（比如修复一个 Bug 或添加一个新功能）创建一个新的分支。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; your-feature-branch&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;进行更改&lt;/strong&gt;：在你创建的分支上进行代码修改和提交。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fix: a bug in the login function&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推送到你的 Fork&lt;/strong&gt;：将本地的更改推送到你个人仓库的同名分支上。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push origin your-feature-branch&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提交 Pull Request&lt;/strong&gt;：回到你的 GitHub 个人仓库页面，GitHub 会自动提示你“有一个新分支，是否要发起 Pull Request”。点击它，并填写 PR 的标题和描述，然后提交即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样，原仓库的维护者就能看到你的贡献请求，并进行审核、评论或合并。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>微信 H5 支付开发实战记录（含 Vue 和 Nginx 配置）</title>
		<link href="https://www.dtking.cn/blog/vue/vue-h5-wxpay/"/>
		<updated>2025-07-30T07:37:45Z</updated>
		<id>https://www.dtking.cn/blog/vue/vue-h5-wxpay/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;微信支付方式对比 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;方式一：微信官方 H5 支付（H5 场景支付） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;方式二：JSAPI 支付（公众号支付） &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;JSAPI 接入配置步骤 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;1. 配置支付授权目录（JSAPI） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;2. 配置网页授权域名（用于获取 openid） &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;Vue 项目接入中的坑点 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;解决方案：改为 History 路由模式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;新问题：Nginx 显示页面空白 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;Vue Router 配置： &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;Nginx 配置示例 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;总结建议 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;微信支付在 H5 页面中有一定的接入门槛和限制，本文记录了我在开发微信 H5 支付过程中的一些关键点与踩坑经验，适合使用 Vue 框架开发的项目参考&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;wei1-xin4-zhi1-fu4-fang1-shi4-dui4-bi3&quot; tabindex=&quot;-1&quot;&gt;微信支付方式对比 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;微信支付主要有两种 H5 接入方式：&lt;/p&gt;
&lt;h3 id=&quot;fang1-shi4-yi1-wei1-xin4-guan1-fang1-h5-zhi1-fu4-h5-chang3-jing3-zhi1-fu4&quot; tabindex=&quot;-1&quot;&gt;方式一：微信官方 H5 支付（H5 场景支付） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不需要服务号，也不需要获取 &lt;code&gt;openid&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;可以直接在移动端浏览器中唤起微信支付。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;需要平台审核，流程较复杂&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;商户需通过微信支付的 H5 支付产品审核。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fang1-shi4-er4-jsapi-zhi1-fu4-gong1-zhong4-hao4-zhi1-fu4&quot; tabindex=&quot;-1&quot;&gt;方式二：JSAPI 支付（公众号支付） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注册微信支付商户平台后默认可用。&lt;/li&gt;
&lt;li&gt;配合公众号能力更强。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;必须绑定一个认证的服务号（300 元/年）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;需要用户授权获取 &lt;code&gt;openid&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;jsapi-jie1-ru4-pei4-zhi4-bu4-zhou4&quot; tabindex=&quot;-1&quot;&gt;JSAPI 接入配置步骤 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://pay.weixin.qq.com/doc/v2/merchant/4011935208&quot;&gt;接入前准备&lt;/a&gt;，未测试是否支持 hash（&lt;code&gt;http://example.com/h5/#/case&lt;/code&gt;） 地址匹配。&lt;/p&gt;
&lt;p&gt;如果选择使用第二种方式（JSAPI 支付），需要以下几个配置步骤：&lt;/p&gt;
&lt;h3 id=&quot;1-pei4-zhi4-zhi1-fu4-shou4-quan2-mu4-lu4-jsapi&quot; tabindex=&quot;-1&quot;&gt;1. 配置支付授权目录（JSAPI） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;路径：微信支付商户平台 &lt;code&gt;--&amp;gt;&lt;/code&gt; 产品中心 &lt;code&gt;--&amp;gt;&lt;/code&gt; 开发配置 &lt;code&gt;--&amp;gt;&lt;/code&gt; JSAPI 支付授权目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;必须填写精确目录，如：&lt;/p&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;http://example.com/h5/&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置后一般5分钟内生效&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-pei4-zhi4-wang3-ye4-shou4-quan2-yu4-ming2-yong4-yu2-huo4-qu3-openid&quot; tabindex=&quot;-1&quot;&gt;2. 配置网页授权域名（用于获取 openid） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;路径有两种入口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设置与开发 &lt;code&gt;-&amp;gt;&lt;/code&gt; 开发接口管理 &lt;code&gt;-&amp;gt;&lt;/code&gt; 网页服务 &lt;code&gt;-&amp;gt;&lt;/code&gt; 网页授权&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置与开发 &lt;code&gt;-&amp;gt;&lt;/code&gt; 账号设置 &lt;code&gt;-&amp;gt;&lt;/code&gt; 功能设置 &lt;code&gt;-&amp;gt;&lt;/code&gt; 网页授权域名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网页授权域名&lt;/strong&gt;：用于获取 &lt;code&gt;openid&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JS接口安全域名&lt;/strong&gt;：用于使用如分享、扫码、上传图片等 &lt;code&gt;jssdk&lt;/code&gt; 能力&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;vue-xiang4-mu4-jie1-ru4-zhong1-de-keng1-dian3&quot; tabindex=&quot;-1&quot;&gt;Vue 项目接入中的坑点 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 Vue 构建的 H5 页面默认采用 hash 模式路由，例如：&lt;/p&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;http://example.com/h5/#/case?no=202501010101&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种地址格式将无法通过微信支付授权校验，会提示：&lt;strong&gt;“该域名未配置授权”&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;jie3-jue2-fang1-an4-gai3-wei2-history-lu4-you2-mo2-shi4&quot; tabindex=&quot;-1&quot;&gt;解决方案：改为 History 路由模式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;微信的授权目录匹配的是实际 URL 路径，不能包含 &lt;code&gt;#&lt;/code&gt;。所以需将 Vue 路由改为 &lt;code&gt;history&lt;/code&gt; 模式：&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; router &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;VueRouter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;history&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  routes
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;xin1-wen4-ti2-nginx-xian3-shi4-ye4-mian4-kong4-bai2&quot; tabindex=&quot;-1&quot;&gt;新问题：Nginx 显示页面空白 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当使用 &lt;code&gt;history&lt;/code&gt; 模式时，刷新页面会导致页面找不到资源。此时需要修改 Vue Router 加上 &lt;code&gt;base&lt;/code&gt; 路径，并配合 Nginx 配置重写路由：&lt;/p&gt;
&lt;h4 id=&quot;vue-router-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;Vue Router 配置： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; router &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;VueRouter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;history&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token literal-property property&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/h5/&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  routes
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;nginx-pei4-zhi4-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;Nginx 配置示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;确保代理 &lt;code&gt;/h5/&lt;/code&gt; 路径时，能正确处理静态资源和前端路由：&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /h5&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 静态资源根目录&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;alias&lt;/span&gt; /www/h5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Windows 路径使用正斜杠或双反斜杠&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 处理静态资源&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; ~* &#92;.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;expires&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30d&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;access_log&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;off&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# 前端路由支持 - 所有非静态资源的请求都返回 index.html&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;try_files&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$uri&lt;/span&gt;/ /h5/index.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;zong3-jie2-jian4-yi4&quot; tabindex=&quot;-1&quot;&gt;总结建议 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题点&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;th&gt;解决方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;微信支付提示未授权域名&lt;/td&gt;
&lt;td&gt;hash 模式 URL 无法匹配授权目录&lt;/td&gt;
&lt;td&gt;修改为 history 模式路由&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue history 模式页面空白&lt;/td&gt;
&lt;td&gt;刷新路径找不到资源&lt;/td&gt;
&lt;td&gt;配置 &lt;code&gt;base&lt;/code&gt; 和 Nginx 路由重写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;无法获取 openid&lt;/td&gt;
&lt;td&gt;未配置网页授权域名&lt;/td&gt;
&lt;td&gt;在公众号设置中补全网页授权域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;支付调不起来&lt;/td&gt;
&lt;td&gt;授权目录配置不精确&lt;/td&gt;
&lt;td&gt;精确匹配路径目录，结尾需 &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</content>
	</entry>
	
	<entry>
		<title>CentOS 生成 SSH 秘钥文件</title>
		<link href="https://www.dtking.cn/blog/ssh/"/>
		<updated>2025-07-24T07:13:17Z</updated>
		<id>https://www.dtking.cn/blog/ssh/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;一、CentOS 生成 SSH 密钥 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;1. 生成 RSA 密钥对（最常用） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;2. 自定义密钥保存路径（可选） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;3. 设置密码保护（可选） &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;二、将公钥添加到目标服务器（或本机）上 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;三、将私钥拷贝到 Windows 本地 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;四、Windows 通过 SCP 使用私钥上传文件到 CentOS &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;五、注意事项 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id=&quot;yi1-centos-sheng1-cheng2-ssh-mi4-yao4&quot; tabindex=&quot;-1&quot;&gt;一、CentOS 生成 SSH 密钥 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;1-sheng1-cheng2-rsa-mi4-yao4-dui4-zui4-chang2-yong4&quot; tabindex=&quot;-1&quot;&gt;1. 生成 RSA 密钥对（最常用） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ssh-keygen &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; rsa &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; ~/.ssh/id_rsa &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;your_email@example.com&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t rsa&lt;/code&gt;：指定密钥类型为 RSA。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-b 4096&lt;/code&gt;：指定密钥长度为 4096 位（安全性更高）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-f ~/.ssh/id_rsa&lt;/code&gt;：指定保存路径（可自定义，默认 ）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-C &amp;quot;your_email@example.com&amp;quot;&lt;/code&gt;：添加注释（可选，便于识别密钥）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-zi4-ding4-yi4-mi4-yao4-bao3-cun2-lu4-jing4-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;2. 自定义密钥保存路径（可选） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;执行命令后，系统会提示你选择保存路径，默认是 &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt; ：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Enter &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; to save the key &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;/root/.ssh/id_rsa&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: &lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;3-she4-zhi4-mi4-ma3-bao3-hu4-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;3. 设置密码保护（可选） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;接下来，系统会提示你设置私钥的密码（passphrase）：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;Enter passphrase &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;empty &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; no passphrase&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;设置私钥密码就不能免密登录了&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：即使私钥文件被泄露，没有密码也无法使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用提示&lt;/strong&gt;：输入密码时终端不会显示字符，输入完成后直接按回车键。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生成后会出现两个文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;（私钥）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt;（公钥）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;er4-jiang1-gong1-yao4-tian1-jia1-dao4-mu4-biao1-fu2-wu4-qi4-huo4-ben3-ji1-shang4&quot; tabindex=&quot;-1&quot;&gt;二、将公钥添加到目标服务器（或本机）上 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;将公钥拷贝到目标机器的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; ~/.ssh/authorized_keys
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;700&lt;/span&gt; ~/.ssh&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：信任该 SSH 公钥，从而允许用对应私钥进行免密码登录&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;san1-jiang1-si1-yao4-kao3-bei4-dao4-windows-ben3-di4&quot; tabindex=&quot;-1&quot;&gt;三、将私钥拷贝到 Windows 本地 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;假设你使用的是 Windows 的 &lt;code&gt;scp&lt;/code&gt; 工具或者 &lt;code&gt;WinSCP&lt;/code&gt; / &lt;code&gt;PowerShell&lt;/code&gt; / &lt;code&gt;Git Bash&lt;/code&gt;，将私钥下载到 Windows（例如放在 &lt;code&gt;C:&#92;Users&#92;Tom&#92;.ssh&#92;id_rsa&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;从 CentOS 拷贝：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 在 Windows 上执行，假设你用的是 Git Bash 或 PowerShell 且 CentOS IP 是 192.168.1.10&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;scp&lt;/span&gt; user@192.168.1.10:~/.ssh/id_rsa C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Users&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Tom&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;.ssh&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;id_rsa&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;si4-windows-tong1-guo4-scp-shi3-yong4-si1-yao4-shang4-chuan2-wen2-jian4-dao4-centos&quot; tabindex=&quot;-1&quot;&gt;四、Windows 通过 SCP 使用私钥上传文件到 CentOS &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 Git Bash / PowerShell：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;scp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Users&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Tom&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;.ssh&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;id_rsa C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;local&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;file.txt user@192.168.1.10:/home/user/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用 &lt;code&gt;pscp.exe&lt;/code&gt;（来自 PuTTY 工具包）：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pscp &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;private_key.ppk C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;file.txt user@192.168.1.10:/home/user/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：PuTTY 的私钥是 &lt;code&gt;.ppk&lt;/code&gt; 格式，需用 PuTTYgen 将 &lt;code&gt;id_rsa&lt;/code&gt; 转换为 &lt;code&gt;.ppk&lt;/code&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;wu3-zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;五、注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;私钥文件权限要严格，在 Windows 上设置只允许你自己访问。&lt;/li&gt;
&lt;li&gt;如果提示 &lt;code&gt;Permissions are too open&lt;/code&gt;，说明私钥文件权限太宽，需限制（可尝试用 Git Bash 改权限：&lt;code&gt;chmod 600 id_rsa&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;如果 SCP 报错可以尝试 &lt;code&gt;-v&lt;/code&gt; 参数查看详细信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</content>
	</entry>
	
	<entry>
		<title>Vue2 笔记</title>
		<link href="https://www.dtking.cn/blog/vue/vue2/"/>
		<updated>2025-07-15T04:04:54Z</updated>
		<id>https://www.dtking.cn/blog/vue/vue2/</id>
		<content type="html">&lt;h2 id=&quot;watch-jian1-ting1-zu3-jian4-prop-can1-shu4-bian4-hua4&quot; tabindex=&quot;-1&quot;&gt;watch 监听组件 prop 参数变化 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;newVal&lt;/code&gt;：新的新值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;oldVal&lt;/code&gt;：旧的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ji1-chu3-ban3-ben3&quot; tabindex=&quot;-1&quot;&gt;基础版本 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;组件创建时，不会触发 &lt;code&gt;watch&lt;/code&gt; 中的监听函数，下次 &lt;code&gt;props&lt;/code&gt; 参数变化会触发 &lt;code&gt;watch&lt;/code&gt; 中函数。&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 用户 id&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// API Key&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;apiKey newVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;apiKey oldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;usern ewVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user oldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;jin4-jie1-ban3&quot; tabindex=&quot;-1&quot;&gt;进阶版 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;马上会调用 &lt;code&gt;watch&lt;/code&gt; 中的函数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;immediate&lt;/code&gt;：true 立即执行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handler&lt;/code&gt;：该回调将会在侦听开始之后被立即调用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 用户 id&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// API Key&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;apiKey newVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;apiKey oldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;immediate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; 
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user newVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;user oldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;immediate&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;gao1-ji2-ban3&quot; tabindex=&quot;-1&quot;&gt;高级版 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;马上会调用 &lt;code&gt;watch&lt;/code&gt; 中的函数&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deep&lt;/code&gt;：true 深度监听&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handler&lt;/code&gt;：该回调会在任何被侦听的对象的 property 改变时被调用，不论其被嵌套多深&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 用户 id&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// API Key&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;apiKey&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;usernewVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;useroldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;deep&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; 
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;usernewVal&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newVal&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;useroldVal:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; oldVal&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token literal-property property&quot;&gt;deep&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; 
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;注意，不应该使用箭头函数来定义 &lt;code&gt;watcher&lt;/code&gt; 函数 (例如 searchQuery: &lt;code&gt;newValue =&amp;gt; this.updateAutocomplete(newValue)&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;理由是箭头函数绑定了父级作用域的上下文，所以 &lt;code&gt;this&lt;/code&gt; 将不会按照期望指向 Vue 实例，&lt;code&gt;this.updateAutocomplete&lt;/code&gt; 将是 undefined。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h2 id=&quot;eventbus-shi4-jian4-zong3-xian4&quot; tabindex=&quot;-1&quot;&gt;EventBus 事件总线 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在Vue中，EventBus是一种用于组件间通信的机制，特别适用于没有父子关系的组件之间的数据传递。EventBus基于发布/订阅模式，可以简化组件间的通信，解耦组件，避免复杂的依赖和生命周期问题&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;事件文件 &lt;/b&gt;utils/event-bus.js&lt;/div&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Vue &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;vue&#39;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; EventBus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Vue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;登录页面 &lt;/b&gt;login.vue&lt;/div&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	EventBus
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@/utils/event-bus&#39;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;省略

&lt;span class=&quot;token function&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;form&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;success&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			app&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			token
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		EventBus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user-logged-in&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; app&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 发布登录订阅&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$router&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;msg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;header组件 &lt;/b&gt;layout/header.vue&lt;/div&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;created&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 绑定事件&lt;/span&gt;
	EventBus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user-logged-in&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;userInfo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;beforeDestroy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 销毁时关闭&lt;/span&gt;
	EventBus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$off&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;user-logged-in&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>IntelliJ IDEA 开发工具使用 Maven 多环境配置</title>
		<link href="https://www.dtking.cn/blog/java/maven-profiles/"/>
		<updated>2025-07-15T04:04:53Z</updated>
		<id>https://www.dtking.cn/blog/java/maven-profiles/</id>
		<content type="html">&lt;h2 id=&quot;application-yaml&quot; tabindex=&quot;-1&quot;&gt;Application.yaml &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/maven-profiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;@profile.name@&lt;/code&gt; 从 &lt;code&gt;Maven&lt;/code&gt; 文件读取配置，当使用指定环境 &lt;code&gt;-P&lt;/code&gt; 参数时，打包时会替换 &lt;code&gt;active&lt;/code&gt; 为对应配置文件&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;主配置文件 &lt;/b&gt;application.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;spring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;jackson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;date-format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; yyyy&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;MM&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dd HH&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;mm&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;ss
    &lt;span class=&quot;token key atrule&quot;&gt;time-zone&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; GMT+8
  &lt;span class=&quot;token key atrule&quot;&gt;profiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;active&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@profile.name@&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;开发 &lt;/b&gt;application-dev.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8081&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;测试 &lt;/b&gt;application-test.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8082&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;生产 &lt;/b&gt;application-prod.yaml&lt;/div&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;port&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8083&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;项目 pom 文件 &lt;/b&gt;pom.xml&lt;/div&gt;
&lt;h2 id=&quot;maven&quot; tabindex=&quot;-1&quot;&gt;Maven &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/maven-profiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-xml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;plugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;plugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;org.springframework.boot&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;spring-boot-maven-plugin&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;2.3.7.RELEASE&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;configuration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;fork&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;fork&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
				&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;addResources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;addResources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;configuration&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;plugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;plugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- 开启 filtering 否则不会替换 application.yaml 中占位符号 --&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;resource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;src/main/resources&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;filtering&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;filtering&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;resource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;resources&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--  多环境配置  --&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;dev&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;activation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!--  默认开启开发环境  --&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;activeByDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;true&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;activeByDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;activation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;dev&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;test&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;test&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;prod&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
			&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;prod&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile.name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;properties&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;profiles&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ming4-ling4-da3-bao1&quot; tabindex=&quot;-1&quot;&gt;命令打包 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/maven-profiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;清除已编译内容&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mvn &lt;span class=&quot;token parameter variable&quot;&gt;-DskipTests&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true clean &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指定环境（-P）打包 &lt;code&gt;dev&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;mvn &lt;span class=&quot;token parameter variable&quot;&gt;-DskipTests&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;true package &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; dev&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;idea-jie4-mian4-cao1-zuo4&quot; tabindex=&quot;-1&quot;&gt;IDEA 界面操作 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/java/maven-profiles/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/eBqh1_2CRv-525.avif 525w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/eBqh1_2CRv-525.webp 525w&quot;&gt;&lt;img alt=&quot;idea-profiles&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/eBqh1_2CRv-525.png&quot; width=&quot;525&quot; height=&quot;195&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>SVN 分支处理命令</title>
		<link href="https://www.dtking.cn/blog/svn/"/>
		<updated>2025-06-30T01:31:26Z</updated>
		<id>https://www.dtking.cn/blog/svn/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;创建分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;检出分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;切换分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;合并分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;提交分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;删除分支 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;注意事项 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id=&quot;chuang4-jian4-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;创建分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;若要在 SVN 已有的仓库里创建分支，可借助 &lt;code&gt;svn copy&lt;/code&gt; 命令。下面为你介绍具体的操作步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;基于主干创建分支&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn copy https://svn.example.com/repo/trunk https://svn.example.com/repo/branches/myfeature &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;创建 myfeature 分支&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;从特定版本创建分支&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn copy https://svn.example.com/repo/trunk@1234 https://svn.example.com/repo/branches/myfeature &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;基于版本 1234 创建 myfeature 分支&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;jian3-chu1-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;检出分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;分支创建完成后，你可以将其检出到本地：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn checkout https://svn.example.com/repo/branches/myfeature local_myfeature&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;qie4-huan4-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;切换分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当你需要在不同分支间进行切换时，可使用以下命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn switch https://svn.example.com/repo/branches/newfeature&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;he2-bing4-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;合并分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;假设你要把分支上的修改合并到主干，可按如下方式操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;合并特定修订版本&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn merge &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1235&lt;/span&gt; https://svn.example.com/repo/branches/myfeature &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;合并两个版本间的修改&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn merge &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1234&lt;/span&gt;:1240 https://svn.example.com/repo/branches/myfeature &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;合并所有修改（完整合并）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn merge https://svn.example.com/repo/branches/myfeature https://svn.example.com/repo/trunk &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ti2-jiao1-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;提交分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对分支进行修改后，要记得提交这些修改：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;提交分支修改&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;shan1-chu2-fen1-zhi1&quot; tabindex=&quot;-1&quot;&gt;删除分支 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;若分支不再使用，可将其删除：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;svn delete https://svn.example.com/repo/branches/myfeature &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;删除 myfeature 分支&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URL 替换&lt;/strong&gt;：在实际操作时，请把 &lt;code&gt;https://svn.example.com/repo&lt;/code&gt; 替换为你自己仓库的 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：进行分支操作需要有足够的权限。如果遇到权限不足的错误，请联系管理员。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合并冲突&lt;/strong&gt;：在合并分支时，可能会出现冲突，这时需要手动解决冲突后再提交。&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama 常问问题</title>
		<link href="https://www.dtking.cn/blog/ollama/faq/"/>
		<updated>2025-06-30T01:31:26Z</updated>
		<id>https://www.dtking.cn/blog/ollama/faq/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何升级 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;我如何查看日志？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;我的 GPU 与 Ollama 兼容吗？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何指定上下文窗口大小？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;我如何知道我的模型是否已加载到 GPU 上？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何配置 Ollama 服务器？ &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;在 Mac 上设置环境变量 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;在 Linux 上设置环境变量 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;在 Windows 上设置环境变量 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何在代理后面使用 Ollama？ &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何在 Docker 中的代理后面使用 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;Ollama 会将我的提示和答案发送回 ollama.com 吗？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何在我的网络上公开 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何使用带有代理服务器的 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何将 Ollama 与 ngrok 一起使用？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何将 Ollama 与 Cloudflare Tunnel 一起使用？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何允许其他 Web 来源访问 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;模型存储在哪里？ &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;我如何将它们设置到不同的位置？ &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何在 Visual Studio Code 中使用 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何在 Docker 中使用带有 GPU 加速的 Ollama？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;为什么 Windows 10 上的 WSL2 网络很慢？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何将模型预加载到 Ollama 以获得更快的响应时间？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何让模型保持在内存中加载或立即卸载？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何管理 Ollama 服务器可以排队的最大请求数？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;Ollama 如何处理并发请求？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;Ollama 如何在多个 GPU 上加载模型？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何启用 Flash Attention？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;如何设置 K/V 缓存的量化类型？ &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/faq.md&quot; title=&quot;ollama faq&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-sheng1-ji2-ollama&quot; tabindex=&quot;-1&quot;&gt;如何升级 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;macOS 和 Windows 上的 Ollama 将自动下载更新。点击任务栏或菜单栏上的更新，然后点击“重新启动以更新”即可应用更新。您也可以通过&lt;a href=&quot;https://ollama.com/download/&quot;&gt;手动&lt;/a&gt;下载最新版本来安装更新。&lt;/p&gt;
&lt;p&gt;在 Linux 上，重新运行安装脚本：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wo3-ru2-he2-cha2-kan4-ri4-zhi4&quot; tabindex=&quot;-1&quot;&gt;我如何查看日志？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有关使用日志的更多信息，请参阅&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/troubleshooting.md&quot;&gt;故障排除文档。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;wo3-de-gpu-yu3-ollama-jian1-rong2-ma&quot; tabindex=&quot;-1&quot;&gt;我的 GPU 与 Ollama 兼容吗？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;请参阅&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/gpu.md&quot;&gt;GPU 文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-zhi3-ding4-shang4-xia4-wen2-chuang1-kou3-da4-xiao3&quot; tabindex=&quot;-1&quot;&gt;如何指定上下文窗口大小？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;默认情况下，Ollama 使用 4096 个标记的上下文窗口大小。&lt;/p&gt;
&lt;p&gt;这可以通过&lt;code&gt;OLLAMA_CONTEXT_LENGTH&lt;/code&gt;环境变量覆盖。例如，要将默认上下文窗口设置为 8K，请使用：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;OLLAMA_CONTEXT_LENGTH&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8192&lt;/span&gt; ollama serve&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要在使用时更改此设置&lt;code&gt;ollama run&lt;/code&gt;，请使用&lt;code&gt;/set parameter&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/set parameter num_ctx &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用API时，指定&lt;code&gt;num_ctx&lt;/code&gt;参数：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;prompt&quot;: &quot;Why is the sky blue?&quot;,
  &quot;options&quot;: {
    &quot;num_ctx&quot;: 4096
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wo3-ru2-he2-zhi1-dao4-wo3-de-mo2-xing2-shi4-fou3-yi3-jia1-zai4-dao4-gpu-shang4&quot; tabindex=&quot;-1&quot;&gt;我如何知道我的模型是否已加载到 GPU 上？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;ollama ps&lt;/code&gt;命令查看当前加载到内存中的模型。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ollama &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;输出&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;NAME      	ID          	SIZE 	PROCESSOR	UNTIL
llama3:70b	bcfb190ca3a7	&lt;span class=&quot;token number&quot;&gt;42&lt;/span&gt; GB	&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;% GPU 	&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; minutes from now&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;该&lt;code&gt;Processor&lt;/code&gt;列将显示模型被加载到哪个内存中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;100% GPU&lt;/code&gt;表示模型已完全加载到 GPU 中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;100% CPU&lt;/code&gt;表示模型已完全加载到系统内存中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;48%/52% CPU/GPU&lt;/code&gt;意味着模型已部分加载到 GPU 和系统内存中&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ru2-he2-pei4-zhi4-ollama-fu2-wu4-qi4&quot; tabindex=&quot;-1&quot;&gt;如何配置 Ollama 服务器？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 服务器可以配置环境变量。&lt;/p&gt;
&lt;h3 id=&quot;zai4-mac-shang4-she4-zhi4-huan2-jing4-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;在 Mac 上设置环境变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果 Ollama 作为 macOS 应用程序运行，则应使用以下命令设置环境变量&lt;code&gt;launchctl&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;对于每个环境变量，调用&lt;code&gt;launchctl setenv&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;launchctl setenv OLLAMA_HOST &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0.0:11434&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新启动 Ollama 应用程序。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;zai4-linux-shang4-she4-zhi4-huan2-jing4-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;在 Linux 上设置环境变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果 Ollama 作为 systemd 服务运行，则应使用以下命令设置环境变量&lt;code&gt;systemctl&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;通过调用 来编辑 systemd 服务&lt;code&gt;systemctl edit ollama.service&lt;/code&gt;。这将打开一个编辑器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Environment&lt;/code&gt;对于每个环境变量，在 section 下添加一行&lt;code&gt;[Service]&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;Service&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;OLLAMA_HOST=0.0.0.0:11434&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存并退出。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新加载&lt;code&gt;systemd&lt;/code&gt;并重新启动 Ollama：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl daemon-reload
systemctl restart ollama&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;zai4-windows-shang4-she4-zhi4-huan2-jing4-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;在 Windows 上设置环境变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 Windows 上，Ollama 继承您的用户和系统环境变量。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先通过单击任务栏上的 Ollama 来退出它。&lt;/li&gt;
&lt;li&gt;启动设置（Windows 11）或控制面板（Windows 10）应用程序并搜索&lt;em&gt;环境变量&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;单击*“编辑您帐户的环境变量”*。&lt;/li&gt;
&lt;li&gt;为您的用户帐户编辑或创建新变量&lt;code&gt;OLLAMA_HOST&lt;/code&gt;，&lt;code&gt;OLLAMA_MODELS&lt;/code&gt;例如 、 等。&lt;/li&gt;
&lt;li&gt;单击“确定/应用”保存。&lt;/li&gt;
&lt;li&gt;从 Windows 开始菜单启动 Ollama 应用程序。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ru2-he2-zai4-dai4-li3-hou4-mian4-shi3-yong4-ollama&quot; tabindex=&quot;-1&quot;&gt;如何在代理后面使用 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 从互联网拉取模型，可能需要代理服务器才能访问模型。用于&lt;code&gt;HTTPS_PROXY&lt;/code&gt;通过代理重定向出站请求。请确保代理证书已作为系统证书安装。请参阅上文，了解如何在您的平台上使用环境变量。&lt;/p&gt;
&lt;p&gt;笔记&lt;/p&gt;
&lt;p&gt;避免设置&lt;code&gt;HTTP_PROXY&lt;/code&gt;。Ollama 不使用 HTTP 进行模型拉取，仅使用 HTTPS。此设置&lt;code&gt;HTTP_PROXY&lt;/code&gt;可能会中断客户端与服务器的连接。&lt;/p&gt;
&lt;h3 id=&quot;ru2-he2-zai4-docker-zhong1-de-dai4-li3-hou4-mian4-shi3-yong4-ollama&quot; tabindex=&quot;-1&quot;&gt;如何在 Docker 中的代理后面使用 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;-e HTTPS_PROXY=https://proxy.example.com&lt;/code&gt;可以通过在启动容器时传递来配置 Ollama Docker 容器镜像使用代理。&lt;/p&gt;
&lt;p&gt;或者，可以将 Docker 守护进程配置为使用代理。 针对&lt;a href=&quot;https://docs.docker.com/desktop/settings/mac/#proxies&quot;&gt;macOS&lt;/a&gt;、&lt;a href=&quot;https://docs.docker.com/desktop/settings/windows/#proxies&quot;&gt;Windows&lt;/a&gt;和&lt;a href=&quot;https://docs.docker.com/desktop/settings/linux/#proxies&quot;&gt;Linux&lt;/a&gt;上的 Docker Desktop以及&lt;a href=&quot;https://docs.docker.com/config/daemon/systemd/#httphttps-proxy&quot;&gt;带有 systemd 的 Docker 守护进程&lt;/a&gt;提供了相关说明。&lt;/p&gt;
&lt;p&gt;使用 HTTPS 时，请确保将证书安装为系统证书。使用自签名证书时，可能需要新的 Docker 镜像。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;FROM ollama/ollama
COPY my-ca.pem /usr/local/share/ca-certificates/my-ca.crt
RUN update-ca-certificates&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构建并运行此图像：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; build &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; ollama-with-ca &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://my.proxy.example.com &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11434&lt;/span&gt;:11434 ollama-with-ca&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ollama-hui4-jiang1-wo3-de-ti2-shi4-he2-da2-an4-fa1-song4-hui2-ollamacom-ma&quot; tabindex=&quot;-1&quot;&gt;Ollama 会将我的提示和答案发送回 ollama.com 吗？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;不会。Ollama 在本地运行，对话数据不会离开您的机器。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-zai4-wo3-de-wang3-luo4-shang4-gong1-kai1-ollama&quot; tabindex=&quot;-1&quot;&gt;如何在我的网络上公开 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 默认绑定 127.0.0.1 端口 11434。请使用环境变量更改绑定地址&lt;code&gt;OLLAMA_HOST&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server&quot;&gt;请参阅上面的&lt;/a&gt;部分以了解如何在您的平台上设置环境变量。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-shi3-yong4-dai4-you3-dai4-li3-fu2-wu4-qi4-de-ollama&quot; tabindex=&quot;-1&quot;&gt;如何使用带有代理服务器的 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 运行 HTTP 服务器，可以使用 Nginx 等代理服务器进行公开。为此，请配置代理以转发请求，并可选地设置所需的标头（如果不在网络上公开 Ollama）。例如，使用 Nginx：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;server &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    listen &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    server_name example.com&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# Replace with your domain or IP&lt;/span&gt;
    location / &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        proxy_pass http://localhost:11434&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        proxy_set_header Host localhost:11434&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ru2-he2-jiang1-ollama-yu3-ngrok-yi4-qi3-shi3-yong4&quot; tabindex=&quot;-1&quot;&gt;如何将 Ollama 与 ngrok 一起使用？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以使用一系列隧道工具来访问 Ollama。例如使用 Ngrok：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ngrok http &lt;span class=&quot;token number&quot;&gt;11434&lt;/span&gt; --host-header&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;localhost:11434&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ru2-he2-jiang1-ollama-yu3-cloudflare-tunnel-yi4-qi3-shi3-yong4&quot; tabindex=&quot;-1&quot;&gt;如何将 Ollama 与 Cloudflare Tunnel 一起使用？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要将 Ollama 与 Cloudflare Tunnel 一起使用，请使用&lt;code&gt;--url&lt;/code&gt;和&lt;code&gt;--http-host-header&lt;/code&gt;标志：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;cloudflared tunnel &lt;span class=&quot;token parameter variable&quot;&gt;--url&lt;/span&gt; http://localhost:11434 --http-host-header&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;localhost:11434&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ru2-he2-yun3-xu3-qi2-ta1-web-lai2-yuan2-fang3-wen4-ollama&quot; tabindex=&quot;-1&quot;&gt;如何允许其他 Web 来源访问 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;Ollama 默认允许来自和的跨域请求&lt;code&gt;0.0.0.0&lt;/code&gt;。可以使用 来配置其他来源&lt;code&gt;OLLAMA_ORIGINS&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;对于浏览器扩展程序，您需要明确允许其来源模式。如果您希望允许所有浏览器扩展程序访问，或根据需要允许特定扩展程序访问，请设置&lt;code&gt;OLLAMA_ORIGINS&lt;/code&gt;为包含&lt;code&gt;chrome-extension://*&lt;/code&gt;、&lt;code&gt;moz-extension://*&lt;/code&gt;和：&lt;code&gt;safari-web-extension://*&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Allow all Chrome, Firefox, and Safari extensions&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;OLLAMA_ORIGINS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;chrome-extension://*,moz-extension://*,safari-web-extension://* ollama serve&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server&quot;&gt;请参阅上面的&lt;/a&gt;部分以了解如何在您的平台上设置环境变量。&lt;/p&gt;
&lt;h2 id=&quot;mo2-xing2-cun2-chu3-zai4-na3-li3&quot; tabindex=&quot;-1&quot;&gt;模型存储在哪里？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;macOS：&lt;code&gt;~/.ollama/models&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Linux：&lt;code&gt;/usr/share/ollama/.ollama/models&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;视窗：&lt;code&gt;C:&#92;Users&#92;%username%&#92;.ollama&#92;models&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;wo3-ru2-he2-jiang1-ta1-men-she4-zhi4-dao4-bu4-tong2-de-wei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;我如何将它们设置到不同的位置？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果需要使用不同的目录，请将环境变量设置&lt;code&gt;OLLAMA_MODELS&lt;/code&gt;为所选目录。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：在使用标准安装程序的 Linux 上，&lt;code&gt;ollama&lt;/code&gt;用户需要对指定目录具有读写权限。要将目录分配给&lt;code&gt;ollama&lt;/code&gt;用户，请运行&lt;code&gt;sudo chown -R ollama:ollama &amp;lt;directory&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server&quot;&gt;请参阅上面的&lt;/a&gt;部分以了解如何在您的平台上设置环境变量。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-zai4-visual-studio-code-zhong1-shi3-yong4-ollama&quot; tabindex=&quot;-1&quot;&gt;如何在 Visual Studio Code 中使用 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;目前，VSCode 以及其他支持 Ollama 的编辑器已经拥有大量可用的插件。请参阅主仓库 readme 文件底部的&lt;a href=&quot;https://github.com/ollama/ollama#extensions--plugins&quot;&gt;扩展和插件列表。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-zai4-docker-zhong1-shi3-yong4-dai4-you3-gpu-jia1-su4-de-ollama&quot; tabindex=&quot;-1&quot;&gt;如何在 Docker 中使用带有 GPU 加速的 Ollama？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama Docker 容器可以在 Linux 或 Windows（需要 WSL2）中配置 GPU 加速。这需要&lt;a href=&quot;https://github.com/NVIDIA/nvidia-container-toolkit&quot;&gt;nvidia-container-toolkit&lt;/a&gt;。更多详情请参阅&lt;a href=&quot;https://hub.docker.com/r/ollama/ollama&quot;&gt;ollama/ollama 。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由于缺乏 GPU 直通和模拟，macOS 中的 Docker Desktop 无法使用 GPU 加速。&lt;/p&gt;
&lt;h2 id=&quot;wei4-shen2-me-windows10-shang4-de-wsl2-wang3-luo4-hen3-man4&quot; tabindex=&quot;-1&quot;&gt;为什么 Windows 10 上的 WSL2 网络很慢？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这会影响安装 Ollama 以及下载模型。&lt;/p&gt;
&lt;p&gt;打开&lt;code&gt;Control Panel &amp;gt; Networking and Internet &amp;gt; View network status and tasks&lt;/code&gt;并点击&lt;code&gt;Change adapter settings&lt;/code&gt;左侧面板上的 。找到&lt;code&gt;vEthernel (WSL)&lt;/code&gt;适配器，右键单击并选择&lt;code&gt;Properties&lt;/code&gt;。点击&lt;code&gt;Configure&lt;/code&gt;并打开&lt;code&gt;Advanced&lt;/code&gt;选项卡。搜索每个属性，直到找到&lt;code&gt;Large Send Offload Version 2 (IPv4)&lt;/code&gt;和&lt;code&gt;Large Send Offload Version 2 (IPv6)&lt;/code&gt;。&lt;em&gt;禁用&lt;/em&gt;这两个属性。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-jiang1-mo2-xing2-yu4-jia1-zai4-dao4-ollama-yi3-huo4-de2-geng4-kuai4-de-xiang3-ying4-shi2-jian1&quot; tabindex=&quot;-1&quot;&gt;如何将模型预加载到 Ollama 以获得更快的响应时间？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您使用 API，可以通过向 Ollama 服务器发送空请求来预加载模型。此功能适用于&lt;code&gt;/api/generate&lt;/code&gt;和&lt;code&gt;/api/chat&lt;/code&gt;API 端点。&lt;/p&gt;
&lt;p&gt;要使用生成端点预加载 mistral 模型，请使用：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;model&quot;: &quot;mistral&quot;}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要使用聊天完成端点，请使用：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;model&quot;: &quot;mistral&quot;}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要使用 CLI 预加载模型，请使用以下命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ollama run llama3.2 &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ru2-he2-rang4-mo2-xing2-bao3-chi2-zai4-nei4-cun2-zhong1-jia1-zai4-huo4-li4-ji2-xie4-zai4&quot; tabindex=&quot;-1&quot;&gt;如何让模型保持在内存中加载或立即卸载？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;默认情况下，模型会在内存中保存 5 分钟，然后才会卸载。如果您向 LLM 发出大量请求，这可以缩短响应时间。如果您想立即从内存中卸载模型，请使用以下&lt;code&gt;ollama stop&lt;/code&gt;命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ollama stop llama3.2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果您使用 API，请将&lt;code&gt;keep_alive&lt;/code&gt;参数与&lt;code&gt;/api/generate&lt;/code&gt;和&lt;code&gt;/api/chat&lt;/code&gt;端点结合使用，以设置模型在内存中停留的时间。该&lt;code&gt;keep_alive&lt;/code&gt;参数可以设置为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;持续时间字符串（例如“10m”或“24h”）&lt;/li&gt;
&lt;li&gt;以秒为单位的数字（例如 3600）&lt;/li&gt;
&lt;li&gt;任何负数，将模型保持在内存中（例如 -1 或“-1m”）&lt;/li&gt;
&lt;li&gt;&#39;0&#39; 表示生成响应后立即卸载模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，要预加载模型并将其保留在内存中，请使用：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;model&quot;: &quot;llama3.2&quot;, &quot;keep_alive&quot;: -1}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要卸载模型并释放内存使用：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;model&quot;: &quot;llama3.2&quot;, &quot;keep_alive&quot;: 0}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt;或者，您可以通过在启动 Ollama 服务器时设置环境变量来更改所有模型加载到内存中的时间。该&lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt;变量使用的参数类型与&lt;code&gt;keep_alive&lt;/code&gt;上面提到的参数类型相同。请参阅说明&lt;a href=&quot;https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-configure-ollama-server&quot;&gt;如何配置 Ollama 服务器&lt;/a&gt;以正确设置环境变量的部分。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;keep_alive&lt;/code&gt;带有&lt;code&gt;/api/generate&lt;/code&gt;和API 端点的API参数&lt;code&gt;/api/chat&lt;/code&gt;将覆盖该&lt;code&gt;OLLAMA_KEEP_ALIVE&lt;/code&gt;设置。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-guan3-li3-ollama-fu2-wu4-qi4-ke3-yi3-pai2-dui4-de-zui4-da4-qing3-qiu2-shu4&quot; tabindex=&quot;-1&quot;&gt;如何管理 Ollama 服务器可以排队的最大请求数？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果发送到服务器的请求过多，服务器将返回 503 错误，表示服务器已超载。您可以通过设置 来调整排队的请求数量&lt;code&gt;OLLAMA_MAX_QUEUE&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;ollama-ru2-he2-chu3-li3-bing4-fa1-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;Ollama 如何处理并发请求？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 支持两种级别的并发处理。如果您的系统具有足够的可用内存（使用 CPU 推理时为系统内存，使用 GPU 推理时为 VRAM），则可以同时加载多个模型。对于给定的模型，如果加载时有足够的可用内存，则该模型将配置为允许并行请求处理。&lt;/p&gt;
&lt;p&gt;如果已加载一个或多个模型，且可用内存不足以加载新的模型请求，则所有新请求将排队等待，直到新模型加载完成。当之前的模型空闲时，将卸载一个或多个模型，为新模型腾出空间。排队的请求将按顺序处理。使用 GPU 推理时，新模型必须能够完全装入 VRAM，才能允许并发模型加载。&lt;/p&gt;
&lt;p&gt;给定模型的并行请求处理会导致上下文大小增加，具体数量取决于并行请求的数量。例如，一个 2K 的上下文，如果处理 4 个并行请求，则会导致上下文大小变为 8K，并额外分配内存。&lt;/p&gt;
&lt;p&gt;以下服务器设置可用于调整 Ollama 在大多数平台上处理并发请求的方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OLLAMA_MAX_LOADED_MODELS&lt;/code&gt;- 在可用内存允许的范围内，可同时加载的最大模型数量。默认值为 GPU 数量 * 3，或 CPU 推理时为 3。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OLLAMA_NUM_PARALLEL&lt;/code&gt;- 每个模型同时处理的最大并行请求数。默认值将根据可用内存自动选择 4 或 1。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OLLAMA_MAX_QUEUE&lt;/code&gt;- Ollama 在繁忙时排队的最大请求数，超过该数将拒绝其他请求。默认值为 512&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：由于 ROCm v5.7 中可用显存 (VRAM) 报告的限制，配备 Radeon GPU 的 Windows 系统目前默认最多可加载 1 个模型。一旦 ROCm v6.2 正式发布，Windows Radeon 系统将遵循上述默认设置。您可以在 Windows 版 Radeon 系统中启用并发模型加载功能，但请确保加载的模型数量不超过 GPU 显存 (VRAM) 的容量。&lt;/p&gt;
&lt;h2 id=&quot;ollama-ru2-he2-zai4-duo1-ge4-gpu-shang4-jia1-zai4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;Ollama 如何在多个 GPU 上加载模型？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;加载新模型时，Ollama 会根据当前可用的 VRAM 来评估模型所需的 VRAM。如果模型完全适合单个 GPU，Ollama 会将模型加载到该 GPU 上。这通常可以提供最佳性能，因为它可以减少推理过程中通过 PCI 总线传输的数据量。如果模型无法完全适合单个 GPU，则会将其分布到所有可用的 GPU 上。&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-qi3-yong4-flash-attention&quot; tabindex=&quot;-1&quot;&gt;如何启用 Flash Attention？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Flash Attention 是大多数现代模型都具备的功能，它可以随着上下文规模的增长显著减少内存占用。要启用 Flash Attention，请在启动 Ollama 服务器时将&lt;code&gt;OLLAMA_FLASH_ATTENTION&lt;/code&gt;环境变量设置为。&lt;code&gt;1&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-she4-zhi4-kv-huan3-cun2-de-liang2-hua4-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;如何设置 K/V 缓存的量化类型？ &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当启用 Flash Attention 时，可以量化 K/V 上下文缓存以显著减少内存使用量。&lt;/p&gt;
&lt;p&gt;要将量化的 K/V 缓存与 Ollama 一起使用，您可以设置以下环境变量：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OLLAMA_KV_CACHE_TYPE&lt;/code&gt;- 键/值缓存的量化类型。默认值为&lt;code&gt;f16&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：目前这是一个全局选项 - 意味着所有模型都将以指定的量化类型运行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;目前可用的K/V缓存量化类型有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;f16&lt;/code&gt;- 高精度和内存使用率（默认）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q8_0&lt;/code&gt;- 8 位量化，使用大约 1/2 的内存&lt;code&gt;f16&lt;/code&gt;，精度损失很小，这通常对模型的质量没有明显的影响（如果不使用 f16 则建议使用）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q4_0&lt;/code&gt;- 4 位量化，使用大约 1/4 的内存，&lt;code&gt;f16&lt;/code&gt;精度有中小损失，在上下文大小较高时可能会更加明显。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缓存量化对模型响应质量的影响程度取决于模型和任务。GQA 数量较多的模型（例如 Qwen2）可能比 GQA 数量较少的模型受到量化对准确率的影响更大。&lt;/p&gt;
&lt;p&gt;您可能需要尝试不同的量化类型来找到内存使用和质量之间的最佳平衡。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>EPS-01S 刷 Tasmota 固件手搓继电器开关</title>
		<link href="https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/"/>
		<updated>2025-06-15T06:43:42Z</updated>
		<id>https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;元器件清单 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;tasmota &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;一、接线 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;二、刷固件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;三、WiFi 配网 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;四、配置 GPIO &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;五、配置 MQTT（可选） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;docker 部署 emqx 服务 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;原理图 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;遇到的问题 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;1. EPS-01S 模块第一次上电无法启动 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;2. S8550 三极管高电平导通，低电平也导通，开关失效了 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;3. S8050 三极管第一次上电瞬间吸合问题 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;EPS-01S &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;管脚功能定义 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;模组启动模式说明 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;参考资料 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/OaMZrqaNnj-586.avif 586w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/OaMZrqaNnj-586.webp 586w&quot;&gt;&lt;img alt=&quot;relay&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/OaMZrqaNnj-586.jpeg&quot; width=&quot;586&quot; height=&quot;495&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;网上有卖这种 WiFi 继电器，自己手动实现这个 WiFi 继电器（硬件小白），&lt;strong&gt;操作时请注意用电安全&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;yuan2-qi4-jian4-qing1-dan1&quot; tabindex=&quot;-1&quot;&gt;元器件清单 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;序号&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;元件名称&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;型号 / 参数&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;数量&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;作用说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;WiFi 模块&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;ESP-01S&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;实现 WiFi 联网，接收远程控制指令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;继电器&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;JQC-3FF-S-Z&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;控制交流电通断，用于热水器控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;整流二极管&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;1N4007&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;防止继电器回流电压损坏元件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;降压芯片&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;AMS1117-3.3&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;将5V电压降为3.3V供 ESP-01S 使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;三极管&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;S8050 NPN&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;放大驱动电流控制继电器通断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;电阻&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;1kΩ/10kΩ&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;用于三极管基极限流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;电容&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;100uf&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;解决首次上电瞬间吸合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;指示灯&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;LED + 100Ω电阻&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;显示继电器工作状态（亮=加热）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;电源&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;5V 电源（USB 或降压）&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;提供系统电压&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;下载器&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;STC UST-TTL&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;USB下载器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;杜邦线&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;若干&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;连接电路&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;tasmota&quot; tabindex=&quot;-1&quot;&gt;tasmota &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;yi1-jie1-xian4&quot; tabindex=&quot;-1&quot;&gt;一、接线 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;确定设备上的引脚后，请根据下表连接电线：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;串行适配器&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;ESP 设备&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3V3&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3V3 or VCC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TX&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;RX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;RX&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GND&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GND&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IO0（接地下载模式）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;er4-shua1-gu4-jian4&quot; tabindex=&quot;-1&quot;&gt;二、刷固件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;具体操作网上有大量案例自己搜索，使用谷歌浏览在线 &lt;a href=&quot;https://tasmota.github.io/install/&quot; title=&quot;tasmota&quot;&gt;刷固件&lt;/a&gt;，下载连接电脑，打开网页选择对应的串口。要买个 STC 下载器 WiFi模块和下载器连接。&lt;/p&gt;
&lt;h3 id=&quot;san1-wifi-pei4-wang3&quot; tabindex=&quot;-1&quot;&gt;三、WiFi 配网 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用手机或 iPad 连接 WiFi &lt;code&gt;tasmota-xxxx&lt;/code&gt;，访问 &lt;a href=&quot;http://192.168.4.1&quot;&gt;http://192.168.4.1&lt;/a&gt; 进入 tasmota 配置页面，设置 WiFi SSID 密码。&lt;/p&gt;
&lt;h3 id=&quot;si4-pei4-zhi4-gpio&quot; tabindex=&quot;-1&quot;&gt;四、配置 GPIO &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过 IO 口驱动继电器或 LED 等等，我这里使用 &lt;code&gt;RXD/GPIO3&lt;/code&gt; 也可以使用 &lt;code&gt;TXD/GPIO1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/yQwvfS4LA_-385.avif 385w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/yQwvfS4LA_-385.webp 385w&quot;&gt;&lt;img alt=&quot;GPIO-config&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/yQwvfS4LA_-385.jpeg&quot; width=&quot;385&quot; height=&quot;490&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置页面说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一列展示可用 &lt;code&gt;GPIO&lt;/code&gt; (不同 ESP 模块可用 GPIO 不同，具体需要查使用手册)&lt;/li&gt;
&lt;li&gt;第二列选择功能 &lt;code&gt;relay&lt;/code&gt; 继电器，&lt;code&gt;relay_i&lt;/code&gt; 反正（高电平变低电平，低电平变高电平）&lt;/li&gt;
&lt;li&gt;第三列对应数量 &lt;code&gt;1&lt;/code&gt;	一个开关&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;&lt;code&gt;GPIO2&lt;/code&gt; 不能用，测试使用 GPIO2 时导致 WiFi 模块无法启动 IO 口被拉低了（&lt;strong&gt;S8050&lt;/strong&gt; B基），实际该口需要高电平才能启动，启动时可能要加上拉电阻才行，但 &lt;strong&gt;S8050&lt;/strong&gt; 高电平导通，要加电容或其他电路更麻烦所以我这里直接使用了 &lt;code&gt;GPIO3&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h3 id=&quot;wu3-pei4-zhi4-mqtt-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;五、配置 MQTT（可选） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;配置 MQTT 可以进行远程操作&lt;/p&gt;
&lt;h3 id=&quot;docker-bu4-shu3-emqx-fu2-wu4&quot; tabindex=&quot;-1&quot;&gt;docker 部署 emqx 服务 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;默认账号：admin，密码：public。&lt;/li&gt;
&lt;li&gt;MQTT 端口：1883&lt;/li&gt;
&lt;li&gt;Web 管理端：18083&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; run &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; emqx &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1883&lt;/span&gt;:1883 &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8083&lt;/span&gt;:8083 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8084&lt;/span&gt;:8084 &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8883&lt;/span&gt;:8883 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18083&lt;/span&gt;:18083 &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;
  emqx/emqx:latest&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;yuan2-li3-tu2&quot; tabindex=&quot;-1&quot;&gt;原理图 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;大概就样，不太会画，欢迎指正&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/uYMPsaKhev-572.avif 572w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/uYMPsaKhev-572.webp 572w&quot;&gt;&lt;img alt=&quot;ESP-Tasmota原理图&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/uYMPsaKhev-572.png&quot; width=&quot;572&quot; height=&quot;368&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;实物图&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;没有轻触开关，这里用鼠标拆下来的点击按钮也行，哈哈哈。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/8O2xNfh-FM-801.avif 801w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/8O2xNfh-FM-801.webp 801w&quot;&gt;&lt;img alt=&quot;实物图正面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/8O2xNfh-FM-801.jpeg&quot; width=&quot;801&quot; height=&quot;619&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/Zge6MDoEzk-753.avif 753w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/Zge6MDoEzk-753.webp 753w&quot;&gt;&lt;img alt=&quot;实物图反面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/Zge6MDoEzk-753.jpeg&quot; width=&quot;753&quot; height=&quot;621&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;继电器 NO 常开，COM 公共端引脚控制的是火线，&lt;strong&gt;一定要用粗一点的铜线&lt;/strong&gt;，否则功率大一点的电器直接把线烧断了（塑料端子已被烧😂）。&lt;code&gt;JQC-3FF-S-Z&lt;/code&gt; 理论上最大控制 10A 电流，也就是 2200W 以下电器。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h2 id=&quot;yu4-dao4-de-wen4-ti2&quot; tabindex=&quot;-1&quot;&gt;遇到的问题 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;1-eps01s-mo2-kuai4-di4-yi1-ci4-shang4-dian4-wu2-fa3-qi3-dong4&quot; tabindex=&quot;-1&quot;&gt;1. EPS-01S 模块第一次上电无法启动 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;现象&lt;/strong&gt;：首次上电无法启动，拔掉 WiFi 模块再重启插上 WiFi 模块就可以正常开关控制了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：因为使用了三极管接到了 &lt;code&gt;GPIO2&lt;/code&gt; 引脚导致WiFi模块启动时电平被拉低（&lt;strong&gt;要求启动时要高电平&lt;/strong&gt;）了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：换个引脚，哈哈。&lt;/p&gt;
&lt;h3 id=&quot;2-s8550-san1-ji2-guan3-gao1-dian4-ping2-dao3-tong1-di1-dian4-ping2-ye3-dao3-tong1-kai1-guan1-shi1-xiao4-le&quot; tabindex=&quot;-1&quot;&gt;2. S8550 三极管高电平导通，低电平也导通，开关失效了 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;GPIO3 RX&lt;span class=&quot;token comment&quot;&gt;---&gt;1kΩ---&gt;S8550(B) 3.3v&lt;/span&gt;

5v&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;---&gt;S8550(E)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：S8550 是低电平导通，继电器是 5v，基极和发射极有 Vbe ≈ 0.7V 压差（Ve-Vb）8550 就导通了。&lt;strong&gt;B&lt;/strong&gt; 和 &lt;strong&gt;E&lt;/strong&gt; 的压差是: &lt;code&gt;5v&lt;/code&gt; - &lt;code&gt;3.3v&lt;/code&gt; = &lt;code&gt;1.7v&lt;/code&gt; 高于 &lt;code&gt;0.7v&lt;/code&gt; 所以会一直是导通状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：简单粗暴换 S8050 NPN 高电平导通，即便是 &lt;strong&gt;B&lt;/strong&gt; &lt;strong&gt;E&lt;/strong&gt; 有压差也不影响&lt;/p&gt;
&lt;h3 id=&quot;3-s8050-san1-ji2-guan3-di4-yi1-ci4-shang4-dian4-shun4-jian1-xi1-he2-wen4-ti2&quot; tabindex=&quot;-1&quot;&gt;3. S8050 三极管第一次上电瞬间吸合问题 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：EPS-01S 上电瞬间引脚是高电平，请看&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;模组启动模式说明&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;解决办法&lt;/strong&gt;：加个 &lt;code&gt;100 uf&lt;/code&gt; 电容，第一次上电先给电容充电。&lt;/p&gt;
&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;GPIO3 RX&lt;span class=&quot;token comment&quot;&gt;---·&gt;1kΩ---&gt;S8550(B) &lt;/span&gt;
			&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
			&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; uf&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 电容
			&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
			&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;
			GND&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;eps-01s&quot; tabindex=&quot;-1&quot;&gt;EPS-01S &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;EPS-01S 引脚有八个，实际可用的引脚非常有限。&lt;/p&gt;
&lt;h3 id=&quot;guan3-jiao3-gong1-neng2-ding4-yi4&quot; tabindex=&quot;-1&quot;&gt;管脚功能定义 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;脚序&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;名称&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;功能说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GND&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;接地&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IO2&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;GPIO2/UART1_TXD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IO0&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;GPIO0;下载模式：外部拉低；运行模式：悬空或者外部拉高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;RXD&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;UARTO RXD/GPIO3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TXD&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;UARTO TXD/GPIO1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;EN（CH_PD）&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;芯片使能端，高电平有效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;RST&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;复位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;VCC&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;3.3V 供电(VDD)：外部供电电源输出电流建议在 500mA 以上&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;mo2-zu3-qi3-dong4-mo2-shi4-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;模组启动模式说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;模式&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;CH_PD(EN)&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;RST&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;GPIO15&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;GPIO0&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;GPIO2&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;TXD0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;下载模式&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;低&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;运行模式&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;低&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意：部分引脚已经内部上拉，请参考原理图&lt;/p&gt;
&lt;h2 id=&quot;can1-kao3-zi1-liao4&quot; tabindex=&quot;-1&quot;&gt;参考资料 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tasmota.github.io/docs/&quot; title=&quot;tasmota docs&quot;&gt;tasmota 开发文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tasmota.github.io/docs/Modules/&quot; title=&quot;tasmota 模块&quot;&gt;tasmota 模块&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tasmota.github.io/docs/Components/#gpio-overview&quot; title=&quot;GPIO概述&quot;&gt;GPIO 概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://item.szlcsc.com/datasheet/ESP-01S/516229.html&quot;&gt;JQC-3FF-S-Z&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://item.szlcsc.com/datasheet/ESP-01S/516229.html&quot;&gt;ESP-01S&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>基于 51 单片机 DIY 热水器控制器</title>
		<link href="https://www.dtking.cn/blog/c51/diy-wifi-controller/"/>
		<updated>2025-06-12T13:58:24Z</updated>
		<id>https://www.dtking.cn/blog/c51/diy-wifi-controller/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;一、介绍 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;二、功能 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;三、元器件清单 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;四、开发软件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;五、原理图 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;六、电路连接说明 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;七、软件设计与源代码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;八、ESP-01S 通讯控制方式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;九、遇到的问题与解决 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;S8050 NPN 型三极管，高电平导通 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;S8550 PNP 型三极管，低电平导通 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;十、三极管扩展 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;概念 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;实物 TO-92  封装 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;引脚 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;奇技淫巧（个人理解） &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;十一、注意事项 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;十二、总结 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;十三、参考资料 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;yi1-jie4-shao4&quot; tabindex=&quot;-1&quot;&gt;一、介绍 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我是一个软件开发者，心血来潮想 diy 远程控制热水器烧水的控制器，热水器功率较大一直开着费电，所以我就想能不能利用我毕生所学自己实战一下。选择 51 单片机因为简单入门快。这个过程中也遇到了大量问题，在黑电子论坛各位大佬的帮助下和 &lt;code&gt;AI&lt;/code&gt; 的加持下完成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;er4-gong1-neng2&quot; tabindex=&quot;-1&quot;&gt;二、功能 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;远程控制（通过 ESP-01S WiFi 模块）&lt;/li&gt;
&lt;li&gt;指示灯反馈控制状态&lt;/li&gt;
&lt;li&gt;电压降压保护电路&lt;/li&gt;
&lt;li&gt;简单的短路与反接保护&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;san1-yuan2-qi4-jian4-qing1-dan1&quot; tabindex=&quot;-1&quot;&gt;三、元器件清单 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;元件名称&lt;/th&gt;
&lt;th&gt;型号 / 参数&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;作用说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;单片机核心板&lt;/td&gt;
&lt;td&gt;STC89C516&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;控制核心，负责逻辑控制和指令响应&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;WiFi 模块&lt;/td&gt;
&lt;td&gt;ESP-01S&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;实现 WiFi 联网，接收远程控制指令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;继电器&lt;/td&gt;
&lt;td&gt;JQC-3FF-S-Z&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;控制交流电通断，用于热水器控制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;整流二极管&lt;/td&gt;
&lt;td&gt;1N4007&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;防止继电器回流电压损坏元件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;降压芯片&lt;/td&gt;
&lt;td&gt;AMS1117-3.3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;将5V电压降为3.3V供 ESP-01S 使用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;三极管&lt;/td&gt;
&lt;td&gt;S8550 PNP&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;放大驱动电流控制继电器通断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;电阻&lt;/td&gt;
&lt;td&gt;1.2kΩ&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;用于三极管基极限流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;指示灯&lt;/td&gt;
&lt;td&gt;LED + 100Ω电阻&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;显示继电器工作状态（亮=加热）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;电源&lt;/td&gt;
&lt;td&gt;5V 电源（USB 或降压）&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;提供系统电压&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;下载器&lt;/td&gt;
&lt;td&gt;STC UST-TTL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;USB下载器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;杜邦线&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;若干&lt;/td&gt;
&lt;td&gt;连接电路&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&quot;si4-kai1-fa1-ruan3-jian4&quot; tabindex=&quot;-1&quot;&gt;四、开发软件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;序号&lt;/th&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;sscomV5131.exe&lt;/td&gt;
&lt;td&gt;串口调试工具/网络调试工具，创建TCP服务和客户端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Keil uVision4&lt;/td&gt;
&lt;td&gt;C51代码开发工具，编译 hex 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;CH340&lt;/td&gt;
&lt;td&gt;STC 下载器驱动程序&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;AIapp-ISP-v6.95M&lt;/td&gt;
&lt;td&gt;STC-ISP 将 hex文件下载到单片机软件&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;wu3-yuan2-li3-tu2&quot; tabindex=&quot;-1&quot;&gt;五、原理图 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;画电路图不太行，简单画了下方便大家凑合看吧！&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/niyKkWrEvs-1004.avif 1004w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/niyKkWrEvs-1004.webp 1004w&quot;&gt;&lt;img alt=&quot;WiFi控制器原理图&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/niyKkWrEvs-1004.png&quot; width=&quot;1004&quot; height=&quot;560&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;接线图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/zSrswvu86t-1129.avif 1129w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/zSrswvu86t-1129.webp 1129w&quot;&gt;&lt;img alt=&quot;接线图&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/zSrswvu86t-1129.jpeg&quot; width=&quot;1129&quot; height=&quot;895&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;liu4-dian4-lu4-lian2-jie1-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;六、电路连接说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;单片机：
&lt;ul&gt;
&lt;li&gt;P3.0（RX） ←→ ESP-01S TX&lt;/li&gt;
&lt;li&gt;P3.1（TX） ←→ ESP-01S RX&lt;/li&gt;
&lt;li&gt;P1.0 → 控制三极管基极（限流电阻串联）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;继电器驱动：
&lt;ul&gt;
&lt;li&gt;线圈两端并联二极管（1N4007）防止反电动势，需要反接&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AMS1117 电源模块：
&lt;ul&gt;
&lt;li&gt;输入接 5V，输出接 ESP-01S VCC，GND 公共&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LED 指示灯：
&lt;ul&gt;
&lt;li&gt;与继电器共用控制线，继电器吸合时 LED 同时点亮（通过100Ω限流）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;qi1-ruan3-jian4-she4-ji4-yu3-yuan2-dai4-ma3&quot; tabindex=&quot;-1&quot;&gt;七、软件设计与源代码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;代码部分很简单，大部分内容AI生成，需要注意的时修改WiFi名称和密码。还有就是要修改 TCP 服务器地址和端口，可以现在自己电脑测试，有云服务器可以填写云服务地址+端口就可以实现远程操作。&lt;/p&gt;
&lt;pre class=&quot;language-c&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;reg51.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;intrins.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;string.h&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;lt;stdio.h&gt;&lt;/span&gt;  &lt;/span&gt;

&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;uchar&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;char&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token macro property&quot;&gt;&lt;span class=&quot;token directive-hash&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;token directive keyword&quot;&gt;define&lt;/span&gt; &lt;span class=&quot;token macro-name&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;token expression&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 引脚定义&lt;/span&gt;
sbit relay &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; P1&lt;span class=&quot;token operator&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 继电器控制引脚&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 将大数组放到XDATA区（外部数据存储器）&lt;/span&gt;
uchar xdata RecBuf&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// 接收缓冲区，使用xdata关键字&lt;/span&gt;
uchar RxCounter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 接收计数器&lt;/span&gt;
bit receiveFinish &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 接收完成标志&lt;/span&gt;


&lt;span class=&quot;token comment&quot;&gt;// 函数声明&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;UartInit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 串口初始化&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ESP8266_Init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// ESP8266初始化&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uchar &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;// 发送AT命令&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uint ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 毫秒延时&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ConnectWiFi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// 连接WiFi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ConnectTCP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 连接TCP服务器&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SendHeartbeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;CheckResponse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uchar &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 检查响应&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	
	&lt;span class=&quot;token function&quot;&gt;UartInit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 初始化串口&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ESP8266_Init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 初始化ESP8266&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ConnectWiFi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// 连接WiFi&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ConnectTCP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 连接TCP服务器&lt;/span&gt;

    
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;receiveFinish&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 如果接收到数据&lt;/span&gt;
            receiveFinish &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            
            &lt;span class=&quot;token comment&quot;&gt;// 检查是否接收到&quot;1&quot;或&quot;0&quot;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;strstr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RecBuf&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                relay &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 低电平，打开继电器&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSEND=4&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 准备发送数据&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0104&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 发送确认信息&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;strstr&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RecBuf&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token constant&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                relay &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;// 高电平，关闭继电器&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSEND=4&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0104&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            
            &lt;span class=&quot;token function&quot;&gt;memset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RecBuf&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RecBuf&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 清空缓冲区&lt;/span&gt;
            RxCounter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;SendHeartbeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 发送心跳包&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SendHeartbeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSEND=4&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 发送10字节数据&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0102&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;     &lt;span class=&quot;token comment&quot;&gt;// 心跳包内容&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;



&lt;span class=&quot;token comment&quot;&gt;// 串口初始化函数&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;UartInit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    SCON &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0x50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 8位数据，可变波特率&lt;/span&gt;
    TMOD &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0x20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;// 设置定时器1为8位自动重装方式&lt;/span&gt;
    TH1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0xFD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;// 波特率9600&lt;/span&gt;
    TL1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0xFD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    TR1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;            &lt;span class=&quot;token comment&quot;&gt;// 启动定时器1&lt;/span&gt;
    ES &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;             &lt;span class=&quot;token comment&quot;&gt;// 使能串口中断&lt;/span&gt;
    EA &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;             &lt;span class=&quot;token comment&quot;&gt;// 开总中断&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// ESP8266初始化&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ESP8266_Init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 等待ESP8266启动&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;// 测试AT命令&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+RST&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 重启ESP8266&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CWMODE=1&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 设置为STA模式&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPMUX=0&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 设置单连接模式&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 连接 WiFi&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ConnectWiFi&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uchar cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AT+CWJAP=&#92;&quot;FAST&#92;&quot;,&#92;&quot;12345678&#92;&quot;&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 等待连接WiFi&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 连接TCP服务器&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ConnectTCP&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uchar cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;sprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSTART=&#92;&quot;TCP&#92;&quot;,&#92;&quot;192.168.1.100&#92;&quot;,8888&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 等待连接TCP&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPMODE=1&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 设置为透传模式&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSEND&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;// 开始透传&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;AT+CIPSEND=4&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;0102&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 发送AT命令&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uchar &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uchar i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&#92;0&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        SBUF &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;TI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        TI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 毫秒延时函数&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;DelayMs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uint ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uint i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; j&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; ms&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;j &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; j &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; j&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 串口中断服务函数&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Uart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; interrupt &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        RI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        RecBuf&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;RxCounter&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; SBUF&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RxCounter &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;49&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 防止缓冲区溢出&lt;/span&gt;
            RxCounter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        
        &lt;span class=&quot;token comment&quot;&gt;// 判断是否接收完成&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;SBUF &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&#92;n&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            receiveFinish &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2 id=&quot;ba1-esp01s-tong1-xun4-kong4-zhi4-fang1-shi4&quot; tabindex=&quot;-1&quot;&gt;八、ESP-01S 通讯控制方式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;ESP 先连接 WiFi，然后建立 TCP 连接（可使用 sscom 创建 TCP server），TCP 服务端负责下发数据控制继电器。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;jiu3-yu4-dao4-de-wen4-ti2-yu3-jie3-jue2&quot; tabindex=&quot;-1&quot;&gt;九、遇到的问题与解决 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;s8050-npn-xing2-san1-ji2-guan3-gao1-dian4-ping2-dao3-tong1&quot; tabindex=&quot;-1&quot;&gt;S8050 NPN 型三极管，高电平导通 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;使用 S8050（NPN） P1.0 无法驱动继电器，串联电阻无法驱动，据说是IO口驱动能力较弱。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;GPIO P1&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;---&gt;1.2kΩ---&gt;S8050(B)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;在电源和P1.0口串联电阻（上拉电阻）就可以驱动了（大佬给原理图）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;5v+-----|
		|
	   [电阻 R1 1.2kΩ]  
	    |
P1.0----·---&gt;S8050(B)&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;又出现新的问题，第一次上电或复位时瞬间吸合一次，这个问题即使改代码也解决不了，因为51单片机IO口默认高电平。看了很多大佬的电路也是没能解决，电路是在 &lt;code&gt;P1.0&lt;/code&gt; 加下拉电阻，&lt;code&gt;P1.0&lt;/code&gt; 串联 1kΩ电阻到 &lt;code&gt;B&lt;/code&gt; 基，手头也没 10kΩ 电阻没有测试成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GPIO P1.0---&gt;1kΩ---&gt;S8050(B)
			|
			|
			|
		  [10kΩ 下拉]
            |
           GND&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;s8550-pnp-xing2-san1-ji2-guan3-di1-dian4-ping2-dao3-tong1&quot; tabindex=&quot;-1&quot;&gt;S8550 PNP 型三极管，低电平导通 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;最终采用了 S8550 来驱动继电器，正如标题它是低电平导通，所以单片机默认高电平，复位或上电就不会出现吸合一次的情况。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题描述&lt;/th&gt;
&lt;th&gt;解决办法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ESP-01S 工作不稳定 / 无响应&lt;/td&gt;
&lt;td&gt;使用 AMS1117 提供独立3.3V供电，加入电容滤波&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;串口通信乱码 / 无反应&lt;/td&gt;
&lt;td&gt;确认波特率一致（9600），ESP-01S 接 RX需分压至3.3V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;继电器吸合但没有动作&lt;/td&gt;
&lt;td&gt;检查三极管是否导通、电阻设置是否合理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LED 长亮/不亮&lt;/td&gt;
&lt;td&gt;检查LED极性、限流电阻是否连接、继电器是否正确驱动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;shi2-san1-ji2-guan3-kuo4-zhan3&quot; tabindex=&quot;-1&quot;&gt;十、三极管扩展 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h4 id=&quot;gai4-nian4&quot; tabindex=&quot;-1&quot;&gt;概念 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;三极管广泛用于电子电路中的开关和放大功能。其特点是价格低廉、体积小、性能稳定，常见于音频放大器、电源控制、信号处理等低功率场合。&lt;/p&gt;
&lt;h4 id=&quot;shi2-wu4-to92-feng1-zhuang1&quot; tabindex=&quot;-1&quot;&gt;实物 TO-92  封装 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;实物图&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;电路符号&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;电流方向&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NPN&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/J0KCeBBbd_-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/J0KCeBBbd_-500.webp 500w&quot;&gt;&lt;img alt=&quot;S8050&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/J0KCeBBbd_-500.jpeg&quot; width=&quot;500&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/EDf11urdA8-163.avif 163w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/EDf11urdA8-163.webp 163w&quot;&gt;&lt;img alt=&quot;S8050电路符号&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/EDf11urdA8-163.png&quot; width=&quot;163&quot; height=&quot;178&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;发射极流出，集电极流入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNP&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/KTe3zr2-kG-500.avif 500w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/KTe3zr2-kG-500.webp 500w&quot;&gt;&lt;img alt=&quot;S8550&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/KTe3zr2-kG-500.jpeg&quot; width=&quot;500&quot; height=&quot;500&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/0RUDEpMJW5-158.avif 158w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/0RUDEpMJW5-158.webp 158w&quot;&gt;&lt;img alt=&quot;S8050电路符号&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/0RUDEpMJW5-158.png&quot; width=&quot;158&quot; height=&quot;178&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;发射极流入，集电极流出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;yin3-jiao3&quot; tabindex=&quot;-1&quot;&gt;引脚 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;正面朝你（扁平面朝前，脚朝下）&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;序号&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;引脚&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;引脚名称&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;发射器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;基极&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;集电极&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;qi2-ji4-yin2-qiao3-ge4-ren2-li3-jie3&quot; tabindex=&quot;-1&quot;&gt;奇技淫巧（个人理解） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;第一次接触三极管感觉不太好理解，可能脑容量不够用哈哈！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;NPN &lt;/code&gt; 箭头方向 &lt;code&gt;→&lt;/code&gt; 接负极（&lt;code&gt;GND&lt;/code&gt;），另外一端 &lt;code&gt;→&lt;/code&gt; 接负载（例如：继电器线圈一端）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;PNP&lt;/code&gt; 箭头方向 &lt;code&gt;→&lt;/code&gt; 接正极（&lt;code&gt;VCC&lt;/code&gt;），另外一端 &lt;code&gt;→&lt;/code&gt; 接负载（例如：继电器线圈一端）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中间基极接 &lt;code&gt;IO&lt;/code&gt; 口，要串电阻。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shi2-yi1-zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;十一、注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;注意用电安全，尤其外接负载设备时。&lt;/li&gt;
&lt;li&gt;在继电器 &lt;code&gt;COM&lt;/code&gt;（公共端） 和 &lt;code&gt;NC&lt;/code&gt;（常开）接线时用质量好一点的线，否则有可能直接烧掉。热水器功率是 2000 W，第一次测试时用塑料接线端子没想到一会就直接烧掉了，后来焊接 1.5 ㎡铜线。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JQC-3FF-S-Z&lt;/code&gt; 大功率继电器理论上不超过 2000 W 就可以用，超过了建议别用小心炸了。继电器吸合通电时会产生热量，所以不要把继电器包裹起来要让它可以通风。&lt;/li&gt;
&lt;li&gt;串口调试 WiFi 模块发送指令时需要加 &lt;code&gt;&#92;r&#92;n&lt;/code&gt;，有些工具自带 &lt;code&gt;加回车换行&lt;/code&gt;选项&lt;/li&gt;
&lt;li&gt;ESP-01s 默认波特率 是 &lt;code&gt;128000&lt;/code&gt; 需要修改为 &lt;code&gt;9600&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;要远程操作需要有云服务器或者使用提供TCP物联网协议的云平台，就可以实现远程控制了。我的是使用 go 写了一个 TCP server ，部署在云服务器实现远程控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&quot;shi2-er4-zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;十二、总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本项目利用常见的 51 单片机 + &lt;code&gt;ESP-01S&lt;/code&gt; 模块，完成了一个低成本的智能热水器控制器。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;在完成该实践后我又发现实际上可以用 &lt;code&gt;ESP-01S&lt;/code&gt; 作为 &lt;code&gt;MCU&lt;/code&gt; 直接控制继电器（刷固件）而不用单独单片机也是可以的。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;对于老手来说这是一个很简单的电路，于我而言涉及的内容多且复杂的，你需要懂代码，电路图，元器件作用特性等等。不过完成该案例也是受益匪浅学到了不少知识点。&lt;/p&gt;
&lt;h2 id=&quot;shi2-san1-can1-kao3-zi1-liao4&quot; tabindex=&quot;-1&quot;&gt;十三、参考资料 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.espressif.com/projects/esp-at/zh-cn/release-v2.2.0.0_esp8266/AT_Command_Set/Basic_AT_Commands.html#at-at&quot;&gt;AT 指令集&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://item.szlcsc.com/datasheet/ESP-01S/516229.html&quot;&gt;JQC-3FF-S-Z&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://item.szlcsc.com/datasheet/ESP-01S/516229.html&quot;&gt;ESP-01S&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>MCS-51 特殊功能寄存器</title>
		<link href="https://www.dtking.cn/blog/c51/interrupt/"/>
		<updated>2025-05-31T07:40:34Z</updated>
		<id>https://www.dtking.cn/blog/c51/interrupt/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TMOD 定时器／计数器工作方式控制寄存器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;GATE 门控位 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;C/T̅ 工作模式选择位 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;M1,M0 工作方式控制位 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TCON 定时器／计数器控制寄存器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TR1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TF1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TR0 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TF0 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;IE 中断允许寄存器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;IP 中断优先级控制寄存器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PS &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PT1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PX1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PT0 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PX0 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;SCON 串行口控制寄存器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;SM0 和 SM1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;TI 串行通信的发送中断标志位 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;RI 串行接口的接收中断标志位 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;PCON 电源控制寄存器 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;SCON 波特率倍增控制位 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;中断对应信息 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;tmod-ding4-shi2-qi4-ji4-shu4-qi4-gong1-zuo4-fang1-shi4-kong4-zhi4-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;TMOD 定时器／计数器工作方式控制寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;英文全称：&lt;em&gt;Timer/Counter Mode Control Register&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;逐位定义的 8 位寄存器，&lt;code&gt;TMOD&lt;/code&gt; 是定时器、计数器模式控制寄存器，它是一个逐位定义的8位寄存器，但只能使用字节寻址，其字节地址为89H。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;位 序&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;位符号&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GATE&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;C/T̅&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;M1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;M0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;GATE&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;C/T̅&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;M1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;M0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;控制 T1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;控制 T0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;gate-men2-kong4-wei4&quot; tabindex=&quot;-1&quot;&gt;GATE 门控位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;控制定时器启动操作方式， 即定时器的启动是否受&lt;code&gt;外部脉冲控制&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;GATE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TR0 或 TR1 等于 1 定时器工作（启停只受 TRx 控制）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;code&gt;TR0 = 1&lt;/code&gt; 和 &lt;code&gt;INT0 = 1&lt;/code&gt; 或 &lt;code&gt;TR1 = 1&lt;/code&gt; 和 &lt;code&gt;INT1 = 1&lt;/code&gt; 时定时器才能工作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;ct-gong1-zuo4-mo2-shi4-xuan3-ze2-wei4&quot; tabindex=&quot;-1&quot;&gt;C/T̅ 工作模式选择位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为定时器／计数器的工作模式选择位。T̅ 逻辑非（NOT）&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;GATE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TR0 或 TR1 等于 1 定时器工作（启停只受 TRx 控制）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;code&gt;TR0 = 1&lt;/code&gt; 和 &lt;code&gt;INT0 = 1&lt;/code&gt; 或 &lt;code&gt;TR1 = 1&lt;/code&gt; 和 &lt;code&gt;INT1 = 1&lt;/code&gt; 时定时器才能工作&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;m1m0-gong1-zuo4-fang1-shi4-kong4-zhi4-wei4&quot; tabindex=&quot;-1&quot;&gt;M1,M0 工作方式控制位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为定时器／ 计数器 T0 和 T1 的工作方式控制位&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;M1&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;M0&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;工作方式&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;方式0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;13 位计数，有 THx 的 8 位和 TLx 的 5 位组成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;方式1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;16 位计数，有 THx 的 8 位和 TLx 的 8 位组成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;方式2&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;利用 TLx 的 8 位计数，当 TLx 计数溢出时，自动重装 Thi 的数据，TLx 在次基础上继续计数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;方式3&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;两个 8 位计数器，仅适用 T0，T1 停止计数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;tcon-ding4-shi2-qi4-ji4-shu4-qi4-kong4-zhi4-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;TCON 定时器／计数器控制寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;英文全称：&lt;em&gt;Timer Control Register&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TCON&lt;/code&gt; 是定时器／计数器控制寄存器， 也是 8 位寄存器， 其中高 4 位用于定时器／计数器； 低 4 位用于单片机的外部中断。 &lt;code&gt;TCON&lt;/code&gt; 支持位操作， 其格式为:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;TCON&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;位名称&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TF1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TR1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TF0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;TR0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IE1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IT1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IE0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;IT0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;tr1&quot; tabindex=&quot;-1&quot;&gt;TR1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为定时器 T1 的&lt;strong&gt;启停控制位&lt;/strong&gt;。 TR1 由指令置位和复位， 以启动或停止定时器／ 计数器开始定时或计数。&lt;/p&gt;
&lt;h3 id=&quot;tf1&quot; tabindex=&quot;-1&quot;&gt;TF1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为定时器 T1 的溢出中断标志位。 在 T1 计数溢出时， 由硬件自动将 TF1 置 1， 向 CPU 请求中断。 CPU 响应时， 由硬件自动将 TF1 清零。 TF1 的结果可用程序查询， 但在查询方式中， 如果 T1 不产生中断， TF1 置 1 后需要在程序中用软件将其清零。&lt;/p&gt;
&lt;h3 id=&quot;tr0&quot; tabindex=&quot;-1&quot;&gt;TR0 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为 T0 的计数&lt;strong&gt;启停控制位&lt;/strong&gt;， 功能同 TR1。 当 GATE ＝ 1 时， T0 受 TR0 和外部中断引脚 INT0 的双重控制。&lt;/p&gt;
&lt;h3 id=&quot;tf0&quot; tabindex=&quot;-1&quot;&gt;TF0 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为 T0 的溢出中断标志位， 功能同 TF1。&lt;/p&gt;
&lt;h2 id=&quot;ie-zhong1-duan4-yun3-xu3-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;IE 中断允许寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;8051 单片机的 CPU 对中断源的开放或屏蔽 （即关闭）， 是由片内的中断允许寄存器 IE （也称为中断控制寄存器或中断屏蔽寄存器） 控制的。 IE 的字节地址是 A8H， 既支持字节操作， 又支持位操作。 位地址的范围是 A8H ～ AFH。 8 位中有 6 位与中断有关， 剩下的两位没有定义。 其格式如下&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:center&quot;&gt;IE&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;位地址&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;AFH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;AEH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ADH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ACH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ABH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;AAH&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;A9H&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;A8H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:center&quot;&gt;位名称&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;EA&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;～&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;～&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ES&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ET1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;EX1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;ET0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;EX0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;EX0：外部中断 0 中断允许位&lt;/li&gt;
&lt;li&gt;ET0：定时器/计数器 0 中断允许位&lt;/li&gt;
&lt;li&gt;EX1：外部中断 1 中断允许位&lt;/li&gt;
&lt;li&gt;ET1：定时器/计数器 1 中断允许位&lt;/li&gt;
&lt;li&gt;ES：串口中断允许位&lt;/li&gt;
&lt;li&gt;ET2：定时器/计数器 2 中断允许位（进行52系列）&lt;/li&gt;
&lt;li&gt;EA：中断总开关&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ip-zhong1-duan4-you1-xian1-ji2-kong4-zhi4-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;IP 中断优先级控制寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;IP&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;位地址&lt;/td&gt;
&lt;td&gt;BFH&lt;/td&gt;
&lt;td&gt;BEH&lt;/td&gt;
&lt;td&gt;BDH&lt;/td&gt;
&lt;td&gt;BCH&lt;/td&gt;
&lt;td&gt;BBH&lt;/td&gt;
&lt;td&gt;BAH&lt;/td&gt;
&lt;td&gt;B9H&lt;/td&gt;
&lt;td&gt;B8H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位名称&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;PS&lt;/td&gt;
&lt;td&gt;PT1&lt;/td&gt;
&lt;td&gt;PX1&lt;/td&gt;
&lt;td&gt;PT0&lt;/td&gt;
&lt;td&gt;PX0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;ps&quot; tabindex=&quot;-1&quot;&gt;PS &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PS 为串行接口的中断优先级控制位。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PS ＝ 1&lt;/code&gt; 时， 串行接口被定义为高优先级中断源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PS ＝ 0&lt;/code&gt; 时， 串行接口被定义为低优先级中断源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pt1&quot; tabindex=&quot;-1&quot;&gt;PT1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PT1 为定时器／计数器 T1 的中断优先级控制位。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PT1 ＝ 1&lt;/code&gt;， T1 被定义为高优先级中断源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PT1 ＝ 0&lt;/code&gt;， T1 被定义为低优先级中断源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;px1&quot; tabindex=&quot;-1&quot;&gt;PX1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PX1 为外部中断 1（INT1） 的优先级控制位&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PX1 ＝ 1&lt;/code&gt;， T1 外部中断 1 被定义为高优先级中断源。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PX1 ＝ 0&lt;/code&gt;， T1 外部中断 1 被定义为低优先级中断源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pt0&quot; tabindex=&quot;-1&quot;&gt;PT0 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PT0 为定时器／计数器 T0 的中断优先级控制位。 其功能与 PT1 相同。&lt;/p&gt;
&lt;h3 id=&quot;px0&quot; tabindex=&quot;-1&quot;&gt;PX0 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;PX0 为外部中断 0（INT0） 的优先级控制位。 其功能与 PX1 相同。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;中断优先级控制寄存器 IP 的各位都由用户置位或复位， 可用位操作指令或字节操作指令更新 IP 的内容， 以改变各中断源的中断优先级， &lt;strong&gt;单片机复位后 IP 全为 0， 各个中断源均为低优先级中断&lt;/strong&gt;。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h2 id=&quot;scon-chuan4-xing2-kou3-kong4-zhi4-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;SCON 串行口控制寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;SCON 为串行通信控制寄存器，主要用于设置串行接口的工作方式，同时也用于保存串行接口的接收中断和发送中断标志。其字节地址是 98H， 既支持字节操作， 又支持位操作。 位地址的范围是 98H ～ 9FH。 8 位中只有&lt;strong&gt;最低的两位与中断&lt;/strong&gt;有关， 其格式如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SCON&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;位地址&lt;/td&gt;
&lt;td&gt;9FH&lt;/td&gt;
&lt;td&gt;9EH&lt;/td&gt;
&lt;td&gt;9DH&lt;/td&gt;
&lt;td&gt;9CH&lt;/td&gt;
&lt;td&gt;9BH&lt;/td&gt;
&lt;td&gt;9AH&lt;/td&gt;
&lt;td&gt;99H&lt;/td&gt;
&lt;td&gt;98H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;位名称&lt;/td&gt;
&lt;td&gt;SM0&lt;/td&gt;
&lt;td&gt;SM1&lt;/td&gt;
&lt;td&gt;SM2&lt;/td&gt;
&lt;td&gt;REN&lt;/td&gt;
&lt;td&gt;TB8&lt;/td&gt;
&lt;td&gt;RB8&lt;/td&gt;
&lt;td&gt;TI&lt;/td&gt;
&lt;td&gt;RI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;sm0-he2-sm1&quot; tabindex=&quot;-1&quot;&gt;SM0 和 SM1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;串行口方式选择&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SM0&lt;/th&gt;
&lt;th&gt;SM1&lt;/th&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;波特率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8位数据发送&lt;/td&gt;
&lt;td&gt;fosc/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10位数据发送，包括起始位，停止位&lt;/td&gt;
&lt;td&gt;可变&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;11位数据发送，包括起始位，停止位 ，校验位&lt;/td&gt;
&lt;td&gt;fosc/64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;同方式2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;SM2：多机通信使能位。在方式2或方式3中，若SM2＝1，则只有当接收到的第9位数据(RB8)为1时，才能将接收到的数据送入SBUF，并使接收中断标志RI置位向CPU申请中断，否则数据丢失；若SM2＝0，则不论接收到的第9位数据为1还是为0，都将会把前8位数据装入SBUF中，并使接收中断标志RI置位向CPU申请中断。在方式1，如SM2＝1，则只有收到有效的停止位时才会使RI置位。在方式0时，SM2必须为0。&lt;/li&gt;
&lt;li&gt;REN：串口数据接收允许位，1允许，0禁止&lt;/li&gt;
&lt;li&gt;TB8：在方式2和方式3中，这位发送的是第9位。在多机通信中，常以该位的状态来表示主机发送的是地址还是数据。通常规定：TB8为“0”表示主机发送的是数据，为“1”表示发送的是地址。&lt;/li&gt;
&lt;li&gt;RB8：在方式2和方式3中，这位发送的是第9位。它和SM2、TB8一起用于通信控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ti-chuan4-xing2-tong1-xin4-de-fa1-song4-zhong1-duan4-biao1-zhi4-wei4&quot; tabindex=&quot;-1&quot;&gt;TI 串行通信的发送中断标志位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要发送的数据一旦写入串行接口的数据缓冲器SBUF， 单片机的硬件电路就立即启动发送器进行发送。 CPU 响应中断时并不清零 TI， 同样要在程序中用软件来清零。&lt;/p&gt;
&lt;p&gt;发送完成手动清零 TI（&lt;code&gt;TI=1&lt;/code&gt;），如下代码：&lt;/p&gt;
&lt;pre class=&quot;language-c&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 发送AT命令&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;SendCmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uchar &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uchar i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token char&quot;&gt;&#39;&#92;0&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        SBUF &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cmd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;TI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        TI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ri-chuan4-xing2-jie1-kou3-de-jie1-shou1-zhong1-duan4-biao1-zhi4-wei4&quot; tabindex=&quot;-1&quot;&gt;RI 串行接口的接收中断标志位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;简单地说，串行接口在接收完一帧数据时自动将 &lt;code&gt;RI&lt;/code&gt; 置位（&lt;code&gt;RI=1&lt;/code&gt;）， 向CPU 申请中断。&lt;/p&gt;
&lt;p&gt;接收完成手动清零 RI，如下代码：&lt;/p&gt;
&lt;pre class=&quot;language-c&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 串口中断服务函数&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;Uart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; interrupt &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;RI&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        RI &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// ... 读取数据等等&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;pcon-dian4-yuan2-kong4-zhi4-ji4-cun2-qi4&quot; tabindex=&quot;-1&quot;&gt;PCON 电源控制寄存器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PCON 中的最高位 SMOD 是与串口的波特率设置有关的选择位， 其余 7 位都和串行通信 无关。&lt;/p&gt;
&lt;p&gt;SMOD ＝ 1 时， 方式 1、 2、 3 的波特率加倍。 PCON 格式为&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCON&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;7&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;6&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;5&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;4&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;3&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;
&lt;th&gt;D&lt;sub&gt;0&lt;/sub&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;名称&lt;/td&gt;
&lt;td&gt;SMOD&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;scon-bo1-te4-l4-bei4-zeng1-kong4-zhi4-wei4&quot; tabindex=&quot;-1&quot;&gt;SCON 波特率倍增控制位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;串行通信的波特率是由单片机的&lt;strong&gt;定时器 T1 产生&lt;/strong&gt;， 并且串行通信占用一个单片机的一个中断。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;简单理解，一般情况 51 系列只要串口通信就会用到占用 T1 定时器，固定写法 T1 定时器和串口没有直接关系。&lt;/em&gt;&lt;/p&gt;
&lt;pre class=&quot;language-c&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-c&quot;&gt;SCON &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0x50&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// 8位数据，可变波特率&lt;/span&gt;
TMOD &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0x20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;       &lt;span class=&quot;token comment&quot;&gt;// 设置定时器1为8位自动重装方式&lt;/span&gt;
TH1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0xFD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;         &lt;span class=&quot;token comment&quot;&gt;// 波特率9600&lt;/span&gt;
TL1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0xFD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zhong1-duan4-dui4-ying4-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;中断对应信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;中断名称&lt;/th&gt;
&lt;th&gt;中断标志位&lt;/th&gt;
&lt;th&gt;中断号&lt;/th&gt;
&lt;th&gt;默认优先级&lt;/th&gt;
&lt;th&gt;中断入口地址&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;外部中断0&lt;/td&gt;
&lt;td&gt;IE0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;0003H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;定时/计数器0溢出中断&lt;/td&gt;
&lt;td&gt;TF0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;000BH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部中断1&lt;/td&gt;
&lt;td&gt;IE1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;0013H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;定时/计数器1溢出中断&lt;/td&gt;
&lt;td&gt;TF1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;001BH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;串口发送或接收中断&lt;/td&gt;
&lt;td&gt;RI/TI&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;低&lt;/td&gt;
&lt;td&gt;0023H&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content>
	</entry>
	
	<entry>
		<title>devc - 开发者剪切板工具</title>
		<link href="https://www.dtking.cn/blog/devc/"/>
		<updated>2025-04-16T06:48:06Z</updated>
		<id>https://www.dtking.cn/blog/devc/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;简介 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;功能特点 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;命令行参数 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;参数说明 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;数据保存 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;历史记录 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;字典文件 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;使用示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;基础使用 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;置顶 CMD 窗口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;自动翻译 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;安装与运行 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;注意事项 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;贡献与反馈 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;参考资料 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;jian3-jie4&quot; tabindex=&quot;-1&quot;&gt;简介 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;devc 是一款运行在 Windows 系统下的剪切板监听小工具，使用 Go 语言开发，通过调用 Windows API 实现功能。它能够记录每天的剪切板内容，并提供翻译功能，支持中英互译，特别适用于开发人员在编写代码或数据库表字段时，快速将中文字段翻译为英文字段。&lt;/p&gt;
&lt;h2 id=&quot;gong1-neng2-te4-dian3&quot; tabindex=&quot;-1&quot;&gt;功能特点 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;剪切板内容记录&lt;/strong&gt;：每天自动记录剪切板中的内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;翻译功能&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;支持中英互译。&lt;/li&gt;
&lt;li&gt;支持关键字翻译，可自定义关键字长度。&lt;/li&gt;
&lt;li&gt;翻译后的内容可以重新写入剪切板。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命名规则转换&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;支持大驼峰命名（PascalCase）。&lt;/li&gt;
&lt;li&gt;支持小驼峰命名（camelCase）。&lt;/li&gt;
&lt;li&gt;支持下划线命名（snake_case）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行配置&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;支持通过命令行参数进行个性化配置。&lt;/li&gt;
&lt;li&gt;支持将 CMD 窗口置顶。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用场景&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;特别适合数据库表字段设置，可将中文字段自动翻译为英文字段。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ming4-ling4-xing2-can1-shu4&quot; tabindex=&quot;-1&quot;&gt;命令行参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;运行 &lt;code&gt;devc -h&lt;/code&gt; 可查看所有支持的命令行参数及其说明：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;devc &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;
Usage of devc:
  &lt;span class=&quot;token parameter variable&quot;&gt;-han&lt;/span&gt; int
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;关键字翻译&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 汉语关键字长度，默认支持4个汉字，最少2个汉字。例如：订单编号、订单状态、创建时间 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-hump&lt;/span&gt; int
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;关键字翻译&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 将翻译内容写入剪切板，命名规则：1.大驼峰 &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;.小驼峰 &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;.下划线 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;-top&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;窗口&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 置顶当前 CMD 窗口
  &lt;span class=&quot;token parameter variable&quot;&gt;-tran&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;翻译工具&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 开启自动检测翻译，关键字翻译将关闭
  &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;翻译工具&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;关键字翻译&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; 将翻译内容写入剪切板&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[&lt;strong&gt;注意&lt;/strong&gt;]：关键字翻译和翻译工具命令不能同时，同时使用优先翻译工具，未指定参数默认关键字翻译&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;参数说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-han&lt;/code&gt;：设置汉语关键字的长度，默认为 4 个汉字，最少为 2 个汉字。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-hump&lt;/code&gt;：设置翻译内容的命名规则：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt;：大驼峰命名（PascalCase）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt;：小驼峰命名（camelCase）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt;：下划线命名（snake_case）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-top&lt;/code&gt;：将当前 CMD 窗口置顶。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-tran&lt;/code&gt;：开启自动检测翻译，关键字翻译将关闭。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-w&lt;/code&gt;：将翻译后的内容写入剪切板。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shu4-ju4-bao3-cun2&quot; tabindex=&quot;-1&quot;&gt;数据保存 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;li4-shi3-ji4-lu4&quot; tabindex=&quot;-1&quot;&gt;历史记录 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;默认保存路径&lt;/strong&gt;：&lt;code&gt;%APPDATA%&#92;devc&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义保存路径&lt;/strong&gt;：通过配置 &lt;code&gt;DEVC&lt;/code&gt; 环境变量指定路径。
&lt;ul&gt;
&lt;li&gt;打开系统环境变量设置。&lt;/li&gt;
&lt;li&gt;添加一个名为 &lt;code&gt;DEVC&lt;/code&gt; 的环境变量，值为自定义路径（例如 &lt;code&gt;D:&#92;devc_data&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zi4-dian3-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;字典文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;字典文件&lt;/strong&gt;：&lt;code&gt;dict.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件格式&lt;/strong&gt;：&lt;pre class=&quot;language-lua&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-lua&quot;&gt;协程&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;coroutine&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;Coroutine&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;coroutine&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;coroutine
格式转换&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;Format conversion&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;FormatConversion&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;formatConversion&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;format_conversion
解析文件&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;Parsing file&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;ParsingFile&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;parsingFile&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;parsing_file
文件路径&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;File path&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;FilePath&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;filePath&lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt;file_path&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;每行表示一个关键字及其翻译。&lt;/li&gt;
&lt;li&gt;格式为：&lt;code&gt;中文|英文|大驼峰|小驼峰|下划线&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义字典文件&lt;/strong&gt;：将自定义的 &lt;code&gt;dict.txt&lt;/code&gt; 文件放置在历史记录目录中，或通过环境变量指定路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;shi3-yong4-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;使用示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ji1-chu3-shi3-yong4&quot; tabindex=&quot;-1&quot;&gt;基础使用 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;devc &lt;span class=&quot;token parameter variable&quot;&gt;-han&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-hump&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;指定关键字长度为 3 个汉字。&lt;/li&gt;
&lt;li&gt;使用小驼峰命名规则（camelCase）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhi4-ding3-cmd-chuang1-kou3&quot; tabindex=&quot;-1&quot;&gt;置顶 CMD 窗口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;devc &lt;span class=&quot;token parameter variable&quot;&gt;-top&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;将当前 CMD 窗口置顶。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zi4-dong4-fan1-yi4&quot; tabindex=&quot;-1&quot;&gt;自动翻译 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;devc &lt;span class=&quot;token parameter variable&quot;&gt;-tran&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-w&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;开启自动检测翻译。&lt;/li&gt;
&lt;li&gt;将翻译后的内容写入剪切板。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;an1-zhuang1-yu3-yun4-xing2&quot; tabindex=&quot;-1&quot;&gt;安装与运行 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;下载&lt;/strong&gt;：从 &lt;a href=&quot;https://github.com/systemmin/devc&quot;&gt;GitHub 仓库&lt;/a&gt; 下载最新版本的 &lt;code&gt;devc&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装&lt;/strong&gt;：将下载的文件解压到任意目录，或丢到 &lt;code&gt;C:&#92;Windows&#92;System32&lt;/code&gt; 目录下可直接 &lt;code&gt;cmd&lt;/code&gt; 使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行&lt;/strong&gt;：打开 CMD 窗口，切换到解压目录，运行以下命令：&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;devc &lt;span class=&quot;token parameter variable&quot;&gt;-h&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;本工具仅支持 Windows 系统。&lt;/li&gt;
&lt;li&gt;如果遇到问题，请查看日志文件或联系开发者。&lt;/li&gt;
&lt;li&gt;关键字翻译和翻译工具命令不能同时，同时使用优先翻译工具，未指定参数默认关键字翻译&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;gong4-xian4-yu3-fan3-kui4&quot; tabindex=&quot;-1&quot;&gt;贡献与反馈 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;欢迎通过 GitHub 提交 Issue 或 Pull Request，帮助改进 &lt;code&gt;devc&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;can1-kao3-zi1-liao4&quot; tabindex=&quot;-1&quot;&gt;参考资料 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-openclipboard&quot;&gt;Window API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/atotto/clipboard/blob/master/clipboard_windows.go&quot;&gt;Github atotto/clipboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>关于我</title>
		<link href="https://www.dtking.cn/about/"/>
		<updated>2025-04-16T06:48:06Z</updated>
		<id>https://www.dtking.cn/about/</id>
		<content type="html">&lt;p&gt;我是一名 Java Web 全栈开发人员，专注于高性能应用网站开发。拥有丰富的前端和后端开发经验，以及跨平台技术的知识。&lt;/p&gt;
&lt;h2 id=&quot;wo3-zuo4-shen2-me&quot; tabindex=&quot;-1&quot;&gt;我做什么 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我是一名具备全面技能的 Java 全栈开发人员，拥有丰富的项目经验和团队管理能力。&lt;/p&gt;
&lt;p&gt;我热爱编程，善于解决问题，具备良好的沟通和协调能力。&lt;/p&gt;
&lt;h2 id=&quot;he2-xin1-ji4-neng2&quot; tabindex=&quot;-1&quot;&gt;核心技能 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我能够适应任何项目并且学习速度很快，但我的核心能力如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;概念与咨询&lt;/li&gt;
&lt;li&gt;网络应用程序开发&lt;/li&gt;
&lt;li&gt;静态站点生成器&lt;/li&gt;
&lt;li&gt;Docker虚拟化容器&lt;/li&gt;
&lt;li&gt;APP/H5/PC/小程序/公众号/门户网站开发&lt;/li&gt;
&lt;li&gt;服务器运维&lt;/li&gt;
&lt;li&gt;无服务器和边缘&lt;/li&gt;
&lt;li&gt;API设计与开发&lt;/li&gt;
&lt;li&gt;CI/CD 工作流程&lt;/li&gt;
&lt;li&gt;电子商务与支付&lt;/li&gt;
&lt;li&gt;自动化操作&lt;/li&gt;
&lt;li&gt;海外项目部署&lt;/li&gt;
&lt;li&gt;性能优化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ji4-shu4-yu3-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;技术与工具 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我在日常工作中使用了大量的技术和工具。这几乎是我目前使用的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTML5&lt;/li&gt;
&lt;li&gt;CSS3&lt;/li&gt;
&lt;li&gt;JavaScript/Node、TypeScript、Express&lt;/li&gt;
&lt;li&gt;Eleventy、Electron、UNI-App、NuxtJS、VUE2、VUE3、Flutter、Dart、VuePress&lt;/li&gt;
&lt;li&gt;JAVA、JDK8、JDK11、JDK17&lt;/li&gt;
&lt;li&gt;Spring、Mybatis、Spring Cloud、Sa-Token、Jeecg-Boot、Swagger-UI、Druid、Quartz、Freemarker&lt;/li&gt;
&lt;li&gt;Python、Flask&lt;/li&gt;
&lt;li&gt;Cloudflare、阿里云、腾讯云、Vultr、Godaddy&lt;/li&gt;
&lt;li&gt;CMS、Wordpress&lt;/li&gt;
&lt;li&gt;PostgreSQL、MySQL、Redis&lt;/li&gt;
&lt;li&gt;Logstash、Elasticsearch&lt;/li&gt;
&lt;li&gt;VSCode、Git、GitHub 操作、HBuilderX、FinalShell、IntelliJ IDEA、Navcat、VM、ProcessOn&lt;/li&gt;
&lt;li&gt;Docker、NGINX、IIS、Tomcat、Apache&lt;/li&gt;
&lt;li&gt;Circle CI、Travis CI、Jenkins&lt;/li&gt;
&lt;li&gt;Puppeteer（浏览器）、Selenium（浏览器）、Autoxjs（Android）&lt;/li&gt;
&lt;li&gt;Golang&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;jing1-yan4&quot; tabindex=&quot;-1&quot;&gt;经验 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我拥有丰富软件开发经验，与各行各业的大大小小的客户合作。涉及行业教育、物流、电商、政务、物联网。&lt;/li&gt;
&lt;li&gt;涉及项目CRM、门户网站（国际化）、分销商城、直播教育、智慧路灯、政务网站等。&lt;/li&gt;
&lt;li&gt;涉及平台H5、PC、微信小程序、Android、IOS、AppStore、打包上架多平台分发等。&lt;/li&gt;
&lt;li&gt;我期待与优秀的团队合作，共同推动项目的成功实施。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;lian2-xi4-fang1-shi4&quot; tabindex=&quot;-1&quot;&gt;联系方式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您有任何问题或商务合作，请通过以下方式联系我：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;联系邮箱：&lt;a href=&quot;mailto:rebots_user@qq.com&quot;&gt;rebots_user@qq.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub：&lt;a href=&quot;https://github.com/systemmin/&quot;&gt;https://github.com/systemmin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;微信：昵称 = &lt;code&gt;404&lt;/code&gt; 账号 = &lt;code&gt;&amp;quot;_&amp;quot;.padEnd(5,&#39;8&#39;).padEnd(11,&#39;0&#39;)&lt;/code&gt;;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kai1-yuan2-xiang4-mu4&quot; tabindex=&quot;-1&quot;&gt;开源项目 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/systemmin/kill-doc&quot;&gt;kill-doc&lt;/a&gt; 在线文档下载（油猴脚本）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://star-history.com/#systemmin/kill-doc&amp;amp;Date&quot;&gt;&lt;img src=&quot;https://api.star-history.com/svg?repos=systemmin/kill-doc&amp;amp;type=Date&quot; alt=&quot;Star History Chart&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/systemmin/wxdown&quot;&gt;wxdown&lt;/a&gt; 微信公众号文章离线保存 （Go）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://star-history.com/#systemmin/wxdown&amp;amp;Date&quot;&gt;&lt;img src=&quot;https://api.star-history.com/svg?repos=systemmin/wxdown&amp;amp;type=Date&quot; alt=&quot;Star History Chart&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/systemmin/devc&quot;&gt;devc&lt;/a&gt; 开发者剪切板工具 （Go）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;guan1-yu2-ben3-wang3-zhan4&quot; tabindex=&quot;-1&quot;&gt;关于本网站 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/about/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;该网站是使用 Eleventy v2.0.1 构建的&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>iOS Safari h5页面 video 标签无法加载视频问题记录</title>
		<link href="https://www.dtking.cn/blog/ios-safari-play/"/>
		<updated>2025-04-11T01:57:38Z</updated>
		<id>https://www.dtking.cn/blog/ios-safari-play/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;NotSupportedError &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;问题1 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;问题2 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;视频转码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;推荐云测试平台 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;推荐 h5 页面调试 JS 库 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;解决 h5 页面安卓手机播放视频正常，苹果高版本系统无法加载视频问题，主要出现的 iOS 18 以上系统。&lt;/p&gt;
&lt;h2 id=&quot;notsupportederror&quot; tabindex=&quot;-1&quot;&gt;NotSupportedError &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;iOS Safari 一般支持 MP4（&lt;code&gt;H.264&lt;/code&gt; + &lt;code&gt;AAC&lt;/code&gt;）, 特别依赖视频头部 &lt;code&gt;metadata&lt;/code&gt;。如果视频是通过服务端动态拼接或未优化打包，很可能在 iOS 上出现 &lt;code&gt;NotSupportedError&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;wen4-ti2-1&quot; tabindex=&quot;-1&quot;&gt;问题1 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;NotSupportedError: The operation is not supported.&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;出现这问题是因为视频编码格式，用小米iPad拍摄一段 mp4 视频，在 Safari 浏览器加载视频，对视频进行&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;转码优化&lt;/a&gt;后可正常播放。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：使用 &lt;code&gt;ffmpeg&lt;/code&gt; 对有问题的视频进行转码&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/Hy1U7yVNzZ-1633.avif 1633w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/Hy1U7yVNzZ-1633.webp 1633w&quot;&gt;&lt;img alt=&quot;compare-to-video&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/Hy1U7yVNzZ-1633.png&quot; width=&quot;1633&quot; height=&quot;488&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;视频编码配置文件（Profile）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优化前：使用的是h264 (&lt;code&gt;High&lt;/code&gt;)，即高配置文件。这种配置文件虽然提供了更好的压缩效率和视频质量，但对解码器的要求较高，可能不被所有设备或浏览器完全支持。&lt;/li&gt;
&lt;li&gt;优化后：使用的是h264 (&lt;code&gt;Constrained Baseline&lt;/code&gt;)，即受限基线配置文件。这种配置文件是H.264标准中最基础的配置文件，对解码器的要求较低，兼容性更好，尤其是在移动设备和浏览器上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：iOS Safari浏览器可能不支持高配置文件（High Profile）的 &lt;code&gt;H.264&lt;/code&gt; 视频编码，导致优化前的视频无法播放。&lt;/p&gt;
&lt;h3 id=&quot;wen4-ti2-2&quot; tabindex=&quot;-1&quot;&gt;问题2 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Unhandle Promise Rejection：NotSupportedError: The operation is not supported.&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我这里是因为视频地址默认返回的是&lt;strong&gt;文件下载流&lt;/strong&gt;，导致在苹果设备无法播放，因为苹果 video 标签播放时响应头需要包含以下信息：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;头&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;Accept-Ranges&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;bytes&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;Content-Range&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;bytes 0-4303662/4303663&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;video/mp4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;Content-Length&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;4303663&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：使用 nginx 代理视频资源&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /access&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;# 设置文件的过期时间&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;expires&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10y&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;# 开启文件传输模块，支持分段请求&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;sendfile&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;tcp_nopush&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;tcp_nodelay&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;# 确保返回文件的修改时间&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if_modified_since&lt;/span&gt; before&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
		 
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;add_header&lt;/span&gt; Accept-Ranges bytes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 启用分段请求支持&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;add_header&lt;/span&gt; Cache-Control public&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 允许公共缓存&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;add_header&lt;/span&gt; Last-Modified &lt;span class=&quot;token variable&quot;&gt;$date_gmt&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 添加最后修改时间&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;# 确保返回文件的ETag&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;etag&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;on&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  
	
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;alias&lt;/span&gt;   /xxx/xxx/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;index&lt;/span&gt;  index.html index.htm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;shi4-pin2-zhuan3-ma3&quot; tabindex=&quot;-1&quot;&gt;视频转码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;ffmpeg -i 1544347924_1744204465890.mp4 &#92;
  -c:v libx264 -profile:v baseline -level 3.0 &#92;
  -c:a aac -movflags +faststart &#92;
  fixed_ios_video.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;参数&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;-c:v libx264&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;使用 H.264 编码（iOS 兼容）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;-profile:v baseline -level 3.0&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;限制编码复杂度（最大兼容性）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;-c:a aac&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;音频用 AAC 编码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;-movflags +faststart&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;把元信息（moov atom）移动到文件头部，Safari 可边下载边播&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;tui1-jian4-yun2-ce4-shi4-ping2-tai2&quot; tabindex=&quot;-1&quot;&gt;推荐云测试平台 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://zh.testingbot.com/&quot;&gt;testingbot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有多种设备可提供测试，有免费可用时长，强的可怕。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;您的试用包括。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100分钟的测试&lt;/li&gt;
&lt;li&gt;2个平行测试&lt;/li&gt;
&lt;li&gt;实时、互动的测试&lt;/li&gt;
&lt;li&gt;自动测试&lt;/li&gt;
&lt;li&gt;视觉测试&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/nSkBW6OFPb-1226.avif 1226w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/nSkBW6OFPb-1226.webp 1226w&quot;&gt;&lt;img alt=&quot;testingbot&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/nSkBW6OFPb-1226.png&quot; width=&quot;1226&quot; height=&quot;885&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;tui1-jian4-h5-ye4-mian4-tiao2-shi4-js-ku4&quot; tabindex=&quot;-1&quot;&gt;推荐 h5 页面调试 JS 库 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://eruda.liriliri.io/&quot;&gt;eruda&lt;/a&gt; 一款可以在手机h5打开控制的工具，方便开发测试。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>go goroutine (协程) 到底是什么</title>
		<link href="https://www.dtking.cn/blog/golang/goroutines/"/>
		<updated>2025-04-07T07:38:06Z</updated>
		<id>https://www.dtking.cn/blog/golang/goroutines/</id>
		<content type="html">&lt;h2 id=&quot;gai4-nian4&quot; tabindex=&quot;-1&quot;&gt;概念 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/goroutines/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;线程&lt;/strong&gt;：操作系统级别的调度单元，每个线程都有自己的栈空间、上下文环境等，通常占用较多的系统资源。创建和销毁线程的开销较大，线程的数量也受到操作系统的限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协程&lt;/strong&gt;：协程是 Go 语言运行时（runtime）管理的调度单元，比线程更轻量级。每个协程的栈空间初始大小较小（通常是 2KB），并且可以根据需要动态扩展。创建和销毁协程的开销非常小，因此可以轻松创建数百万个协程&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;guan1-fang1-nei4-rong2&quot; tabindex=&quot;-1&quot;&gt;官方内容 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/goroutines/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/goroutines/goroutines&quot;&gt;&lt;strong&gt;为什么使用 goroutines 而不是线程？&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;goroutines&lt;/code&gt; 是使并发易于使用的一部分。这个想法已经存在了一段时间，就是将独立执行的函数（协程）多路复用到一组线程上。当协程阻塞时（例如通过调用阻塞系统调用），运行时会自动将同一操作系统线程上的其他协程移动到不同的可运行线程，这样它们就不会被阻塞。程序员看不到这些，这就是重点。结果，我们称之为 &lt;code&gt;goroutines&lt;/code&gt;，可以非常便宜：除了堆栈内存（只有几千字节）之外，它们几乎没有开销。&lt;/p&gt;
&lt;p&gt;为了使堆栈变小，Go 的运行时使用可调整大小的有界堆栈。新创建的 &lt;code&gt;goroutine&lt;/code&gt; 被分配几千字节，这几乎总是足够的。当它不够时，运行时会自动增加（和缩小）用于存储堆栈的内存，从而允许许多 &lt;code&gt;goroutine&lt;/code&gt; 驻留在适量的内存中。CPU 开销平均每个函数调用大约三个廉价指令。在同一个地址空间中创建数十万个 &lt;code&gt;goroutine&lt;/code&gt; 是可行的。如果 &lt;code&gt;goroutine&lt;/code&gt; 只是线程，系统资源耗尽的数量就会少得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：&lt;strong&gt;一个进程有多个线程（板上钉钉），一个线程有多个协程（个人结论），所以它不是线程而是协程。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;xie2-cheng2-tong1-xin4&quot; tabindex=&quot;-1&quot;&gt;协程通信 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/goroutines/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;c:= make(chan struct{})&lt;/code&gt; 创建一个结构体通道用于信号传递&lt;/li&gt;
&lt;li&gt;&lt;code&gt;go func(){}()&lt;/code&gt; 启动一个协程&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&amp;lt;- struct{}{}&lt;/code&gt; 发送一个空结构体的值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;-c&lt;/code&gt; 阻塞主线程，此处作用只有一个阻塞线程。如果注释掉此处代码，输出 333、111，222 不会输出，因为此时主线程已结束&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;c&lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;chan&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sleep&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Millisecond&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	c&lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;222&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;c
fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;333&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;111&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;333&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;222&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tong1-xin4-cao1-zuo4-fu2-hao4&quot; tabindex=&quot;-1&quot;&gt;通信操作符号 &amp;lt;- &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/golang/goroutines/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;简单理解，c 在 &lt;code&gt;&amp;lt;-&lt;/code&gt; 前发送，c 在 &lt;code&gt;&amp;lt;-&lt;/code&gt; 后接收，c 创建的通道名称&lt;/p&gt;
&lt;p&gt;发送数据&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;c&lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接收数据&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;-&lt;/span&gt;c&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>jeecg 管理端富文本 JEditor 增加自定义视频上传</title>
		<link href="https://www.dtking.cn/blog/jeecg-boot-tinymce/"/>
		<updated>2025-04-07T03:05:07Z</updated>
		<id>https://www.dtking.cn/blog/jeecg-boot-tinymce/</id>
		<content type="html">&lt;p&gt;JEditor 本来就有插入视频链接功能，但是无法上传视频。所以就有了自定视频上传按钮，上传文件接口基于 jeecg 接口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;：&lt;a href=&quot;https://www.tiny.cloud/docs/tinymce/latest/custom-toolbarbuttons/&quot;&gt;tiny 自定义工具栏按钮&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;修改 &lt;code&gt;JEditor&lt;/code&gt; 组件，组件路径：&lt;code&gt;./src/components/jeecg/JEditor.vue&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;props&lt;/code&gt; 中 &lt;code&gt;toolbar&lt;/code&gt; 增加参数 &lt;code&gt;|CustomVideo&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;toolbar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;String&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undo redo |  formatselect | bold italic | forecolor backcolor| alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat preview| fullscreen|CustomVideo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;branding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;修改 &lt;code&gt;data&lt;/code&gt; 中 &lt;code&gt;init&lt;/code&gt; 初始化参数，增加下面代码&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;editor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	editor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ui&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;registry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CustomVideo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	  &lt;span class=&quot;token literal-property property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;上传视频&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	  &lt;span class=&quot;token literal-property property&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;embed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	  &lt;span class=&quot;token function-variable function&quot;&gt;onAction&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

		&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;input&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accept &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;video/mp4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

		input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onchange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; formData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FormData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;biz&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		  &lt;span class=&quot;token function&quot;&gt;uploadAction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_CONFIG&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;domianURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/sys/common/upload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; formData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;success&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; videoUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFileAccessHttpUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			  editor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insertContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;p&gt;&amp;lt;video controls=&quot;controls&quot; width=&quot;200&quot; height=&quot;350&quot;&gt;&amp;lt;source src=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;videoUrl&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; type=&quot;video/mp4&quot; /&gt;&amp;lt;/video&gt;&amp;lt;/p&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;code&gt;tinymce&lt;/code&gt; 效果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/N2zVWc6_2s-1239.avif 1239w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/N2zVWc6_2s-1239.webp 1239w&quot;&gt;&lt;img alt=&quot;tinymce&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/N2zVWc6_2s-1239.png&quot; width=&quot;1239&quot; height=&quot;303&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;完整代码&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;div &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tinymce-editor&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;editor v&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;!reloading&quot;&lt;/span&gt; v&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;model&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;myValue&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;init&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;init&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;disabled&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;disabled&quot;&lt;/span&gt; @onClick&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;onClick&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;editor&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;div&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;template&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; tinymce &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/tinymce&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Editor &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@tinymce/tinymce-vue&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/themes/silver/theme&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/image&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/link&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/media&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/table&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/lists&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/contextmenu&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/wordcount&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/colorpicker&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/textcolor&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/fullscreen&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/plugins/preview&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;tinymce/icons/default&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    uploadAction&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    getFileAccessHttpUrl
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@/api/manage&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    getVmParentByName
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;@/utils/util&#39;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;components&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      Editor
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;triggerChange&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;required&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;disabled&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Boolean&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;String&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;lists image link media table textcolor wordcount contextmenu fullscreen preview&#39;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;toolbar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;String&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Array&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undo redo |  formatselect | bold italic | forecolor backcolor| alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists link unlink image media table | removeformat preview| fullscreen|CustomVideo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;branding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;//初始化配置&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;language_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./tinymce/langs/zh_CN.js&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;zh_CN&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;skin_url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;./tinymce/skins/lightgray&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;plugins&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;plugins&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;toolbar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toolbar&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;branding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;menubar&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;toolbar_drawer&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update-begin-author:taoyan date:2022-5-6 for: issues/I4BCC3 富文本编辑器在服务器图片上传是相对路径&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;convert_urls&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update-end-author:taoyan date:2022-5-6 for: issues/I4BCC3 富文本编辑器在服务器图片上传是相对路径&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;images_upload_handler&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;blobInfo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; formData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FormData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; blobInfo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;blob&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; blobInfo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;biz&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;jeditor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;jeditor&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;token function&quot;&gt;uploadAction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_CONFIG&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;domianURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/sys/common/upload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; formData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;success&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;local&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;data:image/jpeg;base64,&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; blobInfo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;base64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token function&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFileAccessHttpUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  &lt;span class=&quot;token function&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token function-variable function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;editor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            editor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ui&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;registry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;CustomVideo&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token literal-property property&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;上传视频&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token literal-property property&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;embed&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;token function-variable function&quot;&gt;onAction&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

                &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; input &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;input&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;accept &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;video/mp4&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

                input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onchange&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; formData &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FormData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;file&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;biz&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  formData&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                  &lt;span class=&quot;token function&quot;&gt;uploadAction&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;_CONFIG&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;domianURL&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/sys/common/upload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; formData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;success&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                      &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; videoUrl &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFileAccessHttpUrl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                      editor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;insertContent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;lt;p&gt;&amp;lt;video controls=&quot;controls&quot; width=&quot;200&quot; height=&quot;350&quot;&gt;
                      &amp;lt;source src=&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;videoUrl&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot; type=&quot;video/mp4&quot; /&gt;&amp;lt;/video&gt;&amp;lt;/p&gt;
                      &lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
                  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
                input&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;click&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;myValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;reloading&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;mounted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initATabsChangeAutoReload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;onMounted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tinymce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

      &lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reloading &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$nextTick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reloading &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      &lt;span class=&quot;token function&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;onClick&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tinymce&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//可以添加一些自己的自定义事件，如清空内容&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;clear&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;myValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

      &lt;span class=&quot;token comment&quot;&gt;/**
       * 自动判断父级是否是 &amp;lt;a-tabs/&gt; 组件，然后添加事件监听，自动触发reload()
       *
       * 由于 tabs 组件切换会导致 tinymce 无法输入，
       * 只有重新加载才能使用（无论是vue版的还是jQuery版tinymce都有这个通病）
       */&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;initATabsChangeAutoReload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// 获取父级&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tabs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getVmParentByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ATabs&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tabPane &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getVmParentByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;ATabPane&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tabs &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; tabPane&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;// 用户自定义的 key&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; currentKey &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tabPane&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$vnode&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;key
          &lt;span class=&quot;token comment&quot;&gt;// 添加事件监听&lt;/span&gt;
          tabs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;change&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token comment&quot;&gt;// 切换到自己时执行reload&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentKey &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; key&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--begin--autor:liusq-----date:20210316------for：富文本编辑器tab父组件可能导致的赋值问题------&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--end--autor:liusq-----date:20210316------for：富文本编辑器tab父组件可能导致的赋值问题------&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--begin--autor:wangshuai-----date:20200724------for：富文本编辑器切换tab无法修改------&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tabLayout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getVmParentByName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;TabLayout&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--begin--autor:liusq-----date:20210713------for：处理特殊情况excuteCallback不能使用------&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            tabLayout&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;excuteCallback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tabLayout&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--end--autor:liusq-----date:20210713------for：处理特殊情况excuteCallback不能使用------&lt;/span&gt;
          &lt;span class=&quot;token comment&quot;&gt;//update--begin--autor:wangshuai-----date:20200724------for：文本编辑器切换tab无法修改------&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;myValue &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newValue &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;myValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;triggerChange&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;change&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;$emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;input&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; newValue&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//update--begin--autor:liusq-----date:20230420------for：[issues/19]缓存路由后，页面中富文本组件会出现无法编辑的问题------&lt;/span&gt;
      &lt;span class=&quot;token string-property property&quot;&gt;&#39;$route&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;newRoute&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$route&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keepAlive &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;$route&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;meta&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;componentName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token comment&quot;&gt;//update--end--autor:liusq-----date:20230420------for：[issues/19]缓存路由后，页面中富文本组件会出现无法编辑的问题------&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;style scoped&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;style&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Vue3 笔记</title>
		<link href="https://www.dtking.cn/blog/vue/vue3/"/>
		<updated>2025-03-27T09:16:07Z</updated>
		<id>https://www.dtking.cn/blog/vue/vue3/</id>
		<content type="html">&lt;p&gt;&lt;strong&gt;组件取值&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; String&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;审核&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;props&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		title
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; props
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;antv消息&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; useMessage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;/@/hooks/web/useMessage&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; createMessage &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

createMessage&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;warning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;查询失败&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;组件导出方法&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;props&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;emit&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;方法&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;数据&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>乱七八糟命令记录</title>
		<link href="https://www.dtking.cn/blog/common-commands/"/>
		<updated>2025-03-11T08:04:33Z</updated>
		<id>https://www.dtking.cn/blog/common-commands/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Github 代理配置 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Windows &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;端口 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;系统信息 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;网络 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Window 桌面飞了 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;安卓证书 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Linux &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Crontab &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Service &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Chrome &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;Git &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;将本地代码推送新仓库 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;解决冲突 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id=&quot;github-dai4-li3-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;Github 代理配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;设置代理&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; http.https://github.com.proxy http://127.0.0.1:33210&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取消代理&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; config &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--unset&lt;/span&gt; http.https://github.com.proxy&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;windows&quot; tabindex=&quot;-1&quot;&gt;Windows &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;duan1-kou3&quot; tabindex=&quot;-1&quot;&gt;端口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查找端口&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;netstat&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ano&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; findstr &lt;span class=&quot;token string&quot;&gt;&quot;8848&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;干的掉端口 &lt;code&gt;11724&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;taskkill /PID &lt;span class=&quot;token number&quot;&gt;11724&lt;/span&gt; /F&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;xi4-tong3-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;系统信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;系统信息&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systeminfo&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;环境变量&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DirectX 诊断工具 &lt;kbd&gt;WIN&lt;/kbd&gt; + &lt;kbd&gt;R&lt;/kbd&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;dxdiag&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注册表 &lt;kbd&gt;WIN&lt;/kbd&gt; + &lt;kbd&gt;R&lt;/kbd&gt;&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;regedit&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;wang3-luo4&quot; tabindex=&quot;-1&quot;&gt;网络 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;DNS 查询工具&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nslookup&lt;/span&gt; example.com&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;tracert 路由追踪&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tracert example.com&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;ipconfig 网络配置&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ipconfig /all
&lt;span class=&quot;token comment&quot;&gt;# 查看当前网卡 IP&lt;/span&gt;
ipconfig 
&lt;span class=&quot;token comment&quot;&gt;# 刷新 DNS&lt;/span&gt;
ipconfig /flushdns
&lt;span class=&quot;token comment&quot;&gt;# 查看 DNS 缓存&lt;/span&gt;
ipconfig /displaydns
&lt;span class=&quot;token comment&quot;&gt;# 重新注册DNS并刷新&lt;/span&gt;
ipconfig /registerdns&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;telnet 远程连接，可测试端口是否放行。&lt;code&gt;telnet&lt;/code&gt; &lt;code&gt;ip|域名&lt;/code&gt; &lt;code&gt;端口&lt;/code&gt;&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;telnet example.com &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;netstat 网络连接工具&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;netstat&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-ano&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;net use 挂载共享目录&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# net use &amp;lt;驱动器号&gt;: &#92;&#92;服务器IP&#92;共享名称 /user:用户名 密码&lt;/span&gt;
net use Z: &lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.1.100&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;SharedFolder /user:user password&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;window-zhuo1-mian4-fei1-le&quot; tabindex=&quot;-1&quot;&gt;Window 桌面飞了 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;没有桌面了，打开任务管理器（文件-&amp;gt;运行新任务），新建 &lt;code&gt;explorer.exe&lt;/code&gt; 即可恢复。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;explorer&lt;/p&gt;
&lt;pre class=&quot;language-base&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-base&quot;&gt;explorer&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;an1-zhuo2-zheng4-shu1&quot; tabindex=&quot;-1&quot;&gt;安卓证书 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;需要有 jdk 环境&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;keytool 生成密钥库和签名证书&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;keytool &lt;span class=&quot;token parameter variable&quot;&gt;-genkeypair&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-keystore&lt;/span&gt; my-release-key.keystore &lt;span class=&quot;token parameter variable&quot;&gt;-alias&lt;/span&gt; my-alias &lt;span class=&quot;token parameter variable&quot;&gt;-keyalg&lt;/span&gt; RSA &lt;span class=&quot;token parameter variable&quot;&gt;-keysize&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-validity&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;参数说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-genkeypair&lt;/code&gt;：生成密钥对（公钥和私钥）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt;：显示详细信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keystore my-release-key.keystore&lt;/code&gt;：指定生成的密钥库文件名（如 &lt;code&gt;my-release-key.keystore&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-alias my-alias&lt;/code&gt;：为密钥对设置别名（如 &lt;code&gt;my-alias&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keyalg RSA&lt;/code&gt;：指定密钥算法为 RSA。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-keysize 2048&lt;/code&gt;：指定密钥长度为 2048 位（推荐值）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-validity 10000&lt;/code&gt;：证书有效期为 10000 天（约 27 年）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看证书信息&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;keytool &lt;span class=&quot;token parameter variable&quot;&gt;-list&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-keystore&lt;/span&gt; my-release-key.keystore&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;linux&quot; tabindex=&quot;-1&quot;&gt;Linux &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;crontab&quot; tabindex=&quot;-1&quot;&gt;Crontab &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;添加定时任务&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;crontab&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每天 7 点 30 执行一次&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; * * * systemctl start xxxxx.service&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看定时任务&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;crontab&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;service&quot; tabindex=&quot;-1&quot;&gt;Service &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;添加系统服务&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; /etc/systemd/system/xxx.service&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;事件订阅通知&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;/home/xxx/xxx&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Install&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;multi-user.target&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Description&lt;/code&gt; 脚本描述&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ExecStart&lt;/code&gt; 脚本执行路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启用服务&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; xxx.service	&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chrome&quot; tabindex=&quot;-1&quot;&gt;Chrome &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md&quot;&gt;chrome-flags-for-tools&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--allow-insecure-localhost&lt;/code&gt; 允许忽略本地主机上的 TLS/SSL 错误（无间隙，不阻止请求）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ash-no-nudges&lt;/code&gt; 隐藏可能干扰 tast 集成测试的教育提示。有点类似于 --no-first-run，但会影响系统 UI 行为，而不是浏览器行为。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--incognito&lt;/code&gt; 隐身模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--kiosk&lt;/code&gt; 启动 Chrome 时进入全屏模式，并禁用界面操作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--force-dark-mode&lt;/code&gt; 控制浏览器主题&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--force-app-mode&lt;/code&gt; 强制APP模式，无法控制窗口大小&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--lang=cn&lt;/code&gt; 语言选择&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-first-run&lt;/code&gt;  跳过首次运行任务，也不显示其他对话框、提示或气泡&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--no-default-browser-check&lt;/code&gt;  禁用默认浏览器检查。对于我们希望避免显示默认浏览器信息栏的UI/浏览器测试很有用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--user-data-dir&lt;/code&gt; 浏览器存储用户配置文件的目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--window-size=1600,1024&lt;/code&gt; 设置初始窗口大小。以“800,600”格式的字符串提供。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过命令操作浏览器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;打开百度&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;chrome.exe ^
	--enable-automation ^
	&lt;span class=&quot;token parameter variable&quot;&gt;--app&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://www.baidu.com ^
	&lt;span class=&quot;token parameter variable&quot;&gt;--lang&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cn ^
	--no-first-run ^
	--user-data-dir&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;D:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;.temp&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;test&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;本地 HTML 导出 PDF&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;chrome.exe ^
	&lt;span class=&quot;token parameter variable&quot;&gt;--headless&lt;/span&gt; ^
	--disable-gpu ^
	--disable-javascript ^
	--no-pdf-header-footer ^
	--print-to-pdf&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;d:&lt;span class=&quot;token entity&quot; title=&quot;&#92;e&quot;&gt;&#92;e&lt;/span&gt;xample.pdf&quot;&lt;/span&gt; ^
	&lt;span class=&quot;token string&quot;&gt;&quot;file:///c:&#92;index.html&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;git&quot; tabindex=&quot;-1&quot;&gt;Git &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;jiang1-ben3-di4-dai4-ma3-tui1-song4-xin1-cang1-ku4&quot; tabindex=&quot;-1&quot;&gt;将本地代码推送新仓库 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 1、初始本地仓库&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; init

&lt;span class=&quot;token comment&quot;&gt;# 2、添加远程仓库地址&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; remote &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; origin https://github.com/yourusername/your-repo.git

&lt;span class=&quot;token comment&quot;&gt;# 3、添加当前目录下所有文件&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;
  
&lt;span class=&quot;token comment&quot;&gt;# 4、提交更改&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Initial commit&quot;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 提交并添加描述&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 5、推送到远程仓库的 master 分支&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; origin master  
&lt;span class=&quot;token comment&quot;&gt;# 或&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将 &lt;code&gt;index.js&lt;/code&gt; 回滚到 &lt;code&gt;e564e23f&lt;/code&gt; 版本&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; restore &lt;span class=&quot;token parameter variable&quot;&gt;--source&lt;/span&gt; e564e23f index.js&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;jie3-jue2-chong1-tu1&quot; tabindex=&quot;-1&quot;&gt;解决冲突 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;拉取远程更改&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull origin master&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;再次推送&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push origin master&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;强制推送（慎用，会覆盖）&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push origin master &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;合并远程分支的历史，拉取远程分支的最新更改，并允许合并不相关的历史&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull origin master --allow-unrelated-histories&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Golang 交叉编译 Android 平台可执行文件</title>
		<link href="https://www.dtking.cn/blog/go-gcc-build/"/>
		<updated>2025-03-04T06:52:05Z</updated>
		<id>https://www.dtking.cn/blog/go-gcc-build/</id>
		<content type="html">&lt;p&gt;在 Windows上设置交叉编译环境以编译 Android 平台的二进制文件，你需要使用 &lt;a href=&quot;https://developer.android.google.cn/ndk/downloads?hl=zh-cn&quot;&gt;Android NDK&lt;/a&gt;。以下是一般步骤来设置Go语言的交叉编译环境：&lt;/p&gt;
&lt;h3 id=&quot;1-an1-zhuang1-go-yu3-yan2-huan2-jing4&quot; tabindex=&quot;-1&quot;&gt;1. 安装Go语言环境 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;确保你已经安装了 &lt;code&gt;Go&lt;/code&gt; 语言环境，并且设置了 &lt;code&gt;GOPATH&lt;/code&gt; 和 &lt;code&gt;GOROOT&lt;/code&gt; 环境变量。&lt;/p&gt;
&lt;h3 id=&quot;2-jie3-ya1-ndk&quot; tabindex=&quot;-1&quot;&gt;2. 解压NDK &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;解压下载的Android NDK到某个目录，例如 &lt;code&gt;C:&#92;Android&#92;ndk&#92;&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;3-she4-zhi4-huan2-jing4-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;3. 设置环境变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在Windows上，你需要设置一些环境变量来指向&lt;code&gt;NDK&lt;/code&gt;的工具链。以下是一个示例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开环境变量编辑界面。&lt;/li&gt;
&lt;li&gt;新增以下环境变量：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ANDROID_NDK_HOME&lt;/code&gt;：指向你的NDK根目录，例如 &lt;code&gt;C:&#92;Android&#92;ndk&#92;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ANDROID_API&lt;/code&gt;：设置你想要编译的目标Android API级别，例如 &lt;code&gt;21&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CGO_ENABLED&lt;/code&gt;：设置为 &lt;code&gt;1&lt;/code&gt; 以启用CGO。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOOS&lt;/code&gt;：设置为 &lt;code&gt;android&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GOARCH&lt;/code&gt;：根据目标架构设置，例如 &lt;code&gt;arm&lt;/code&gt;、&lt;code&gt;arm64&lt;/code&gt;、&lt;code&gt;386&lt;/code&gt; 或 &lt;code&gt;amd64&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CC&lt;/code&gt;：设置交叉编译器的路径，例如 &lt;code&gt;C:&#92;Android&#92;ndk&#92;toolchains&#92;llvm&#92;prebuilt&#92;windows-x86_64&#92;bin&#92;arm-linux-androideabi-clang&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在Path环境变量中添加NDK的bin目录路径，例如 &lt;code&gt;C:&#92;Android&#92;ndk&#92;toolchains&#92;llvm&#92;prebuilt&#92;windows-x86_64&#92;bin&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Termux 支持哪种架构：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;uname&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如 armv7l、aarch64、i686 或 x86_64&lt;/p&gt;
&lt;h3 id=&quot;4-bian1-yi4-go-dai4-ma3&quot; tabindex=&quot;-1&quot;&gt;4. 编译Go代码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;打开命令提示符或 PowerShell，设置环境变量，并编译你的Go代码。以下是一个编译命令的示例：&lt;/p&gt;
&lt;pre class=&quot;language-sh&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-sh&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ANDROID_NDK_HOME&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;C:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;Android&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;ndk
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ANDROID_API&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;21&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CGO_ENABLED&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;GOOS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;android
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;GOARCH&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;arm
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CC&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;%ANDROID_NDK_HOME%&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;toolchains&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;llvm&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;prebuilt&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;windows-x86_64&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;bin&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;arm-linux-androideabi-clang
go build &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; your-app your-package&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请根据你的目标架构替换 &lt;code&gt;arm&lt;/code&gt; 和 &lt;code&gt;arm-linux-androideabi-clang&lt;/code&gt;。例如，如果你正在为64位ARM架构编译，你应该使用 &lt;code&gt;aarch64-linux-android-clang&lt;/code&gt; 作为CC的值，并将GOARCH设置为 &lt;code&gt;arm64&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;5-termux-ce4-shi4&quot; tabindex=&quot;-1&quot;&gt;5. termux 测试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;将文件下载到手机中： &lt;code&gt;curl -O http://192.168.0.18:3000/your-app&lt;/code&gt; 将文件下载到手机中&lt;/li&gt;
&lt;li&gt;添加可以执行权限：&lt;code&gt;chmod +x your-app&lt;/code&gt; 添加可以执行权限&lt;/li&gt;
&lt;li&gt;测试二进制文件：&lt;code&gt;./your-app&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;Welcome to Termux

Docs:       https://doc.termux.com
Community:  https://community.termux.com

Working with packages:
 - Search:  pkg search &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;query&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
 - Install: pkg &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;package&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
 - Upgrade: pkg upgrade

Report issues at https://bugs.termux.com
~ $
~ $ &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x ollamab
~ $ ./ollamab ddd
模型路径: /usr/share/ollama/.ollama/models
panic: runtime error: index out of range &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; with length &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

goroutine &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;running&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;:
main.main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        D:/code/private/ollamab/main.go:160 +0x640
~ $&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;确保你的NDK版本与Go版本兼容。&lt;/li&gt;
&lt;li&gt;根据你的NDK版本，工具链的路径可能有所不同。检查NDK的文档以获取正确的路径。&lt;/li&gt;
&lt;li&gt;如果你在编译过程中遇到问题，可能需要检查NDK的文档或在线社区来获取帮助。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完成这些步骤后，你应该能够在Windows上交叉编译Go代码为Android平台的二进制文件。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>vmess ss，trojan 分别是什么</title>
		<link href="https://www.dtking.cn/blog/protocol/"/>
		<updated>2025-02-21T02:12:42Z</updated>
		<id>https://www.dtking.cn/blog/protocol/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;🌐 1. vmess (V2Ray Mess Protocol) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;🔒 2. ss (Shadowsocks) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;🛡 3. trojan &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;🔄 4. 是否可以相互转换？ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;📝 5. 数据内容的主要区别 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;🔧 6. 如何提取和使用这些链接？ &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;code&gt;vmess&lt;/code&gt;、&lt;code&gt;ss&lt;/code&gt;（Shadowsocks）、&lt;code&gt;trojan&lt;/code&gt; 是用于代理和加密网络通信的不同协议或格式，它们在安全性、易用性、以及传输的数据格式上有所不同。下面我来详细说明它们的区别、是否可以相互转换以及内容格式。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-vmess-v2ray-mess-protocol&quot; tabindex=&quot;-1&quot;&gt;🌐 &lt;strong&gt;1. vmess (V2Ray Mess Protocol)&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：V2Ray 的核心协议，主要用于加密客户端和服务器之间的通信，常用于突破网络审查。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;默认加密传输，支持多种加密方式。&lt;/li&gt;
&lt;li&gt;支持多用户和动态端口。&lt;/li&gt;
&lt;li&gt;抗探测能力强（伪装流量特征）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据格式&lt;/strong&gt;：&lt;code&gt;vmess://&lt;/code&gt; 开头的链接通常是 &lt;strong&gt;Base64 编码&lt;/strong&gt; 的 JSON 对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例内容&lt;/strong&gt;：&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;v&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;ps&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;示例节点&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;add&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;443&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;uuid-字符串&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;aid&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;net&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/path&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;tls&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tls&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解码后格式&lt;/strong&gt;：JSON 字符串（使用 Base64 编码）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-ss-shadowsocks&quot; tabindex=&quot;-1&quot;&gt;🔒 &lt;strong&gt;2. ss (Shadowsocks)&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：轻量级代理协议，主要用于科学上网，通过加密流量以隐藏通信内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;简单高效，延迟低。&lt;/li&gt;
&lt;li&gt;支持多种加密算法（如 AES-256-GCM、ChaCha20）。&lt;/li&gt;
&lt;li&gt;没有复杂的握手流程，易于部署。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据格式&lt;/strong&gt;：&lt;code&gt;ss://&lt;/code&gt; 开头，&lt;strong&gt;Base64 编码&lt;/strong&gt; 的字符串。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例内容&lt;/strong&gt;：&lt;code&gt;ss://YWVzLTI1Ni1nY206cGFzc3dvcmRAZXhhbXBsZS5jb206ODQ0Mw==&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解码后格式&lt;/strong&gt;：&lt;code&gt;aes-256-gcm:password@example.com:8443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组成部分&lt;/strong&gt;：&lt;code&gt;加密方式:密码@服务器地址:端口&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-trojan&quot; tabindex=&quot;-1&quot;&gt;🛡 &lt;strong&gt;3. trojan&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：利用 TLS (通常是 HTTPS) 流量来伪装代理，达到高度抗审查的目的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;流量与普通的 HTTPS 流量无异，抗干扰性高。&lt;/li&gt;
&lt;li&gt;强制使用 TLS 加密，安全性高。&lt;/li&gt;
&lt;li&gt;不支持多协议，专注于稳定的代理。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据格式&lt;/strong&gt;：&lt;code&gt;trojan://&lt;/code&gt; 开头的链接，格式类似 URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例内容&lt;/strong&gt;：&lt;code&gt;trojan://password@example.com:443?security=tls&amp;amp;headerType=none#节点备注&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组成部分&lt;/strong&gt;：&lt;code&gt;trojan://密码@服务器地址:端口?参数#备注&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-shi4-fou3-ke3-yi3-xiang1-hu4-zhuan3-huan4&quot; tabindex=&quot;-1&quot;&gt;🔄 &lt;strong&gt;4. 是否可以相互转换？&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以，但需要通过工具或手动修改配置。转换时必须考虑每个协议支持的功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可用工具&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;V2RayN/V2RayNG&lt;/strong&gt;：支持 vmess 和 trojan。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clash&lt;/strong&gt;：支持 ss、vmess、trojan，可通过配置文件进行转换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quantumult X&lt;/strong&gt;：支持多种协议，可手动配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;转换示例&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vmess&lt;/code&gt; ➡ &lt;code&gt;trojan&lt;/code&gt;：需要确保目标服务器支持 TLS。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ss&lt;/code&gt; ➡ &lt;code&gt;vmess&lt;/code&gt;：需在 V2Ray 服务器端配置对应的入站协议。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trojan&lt;/code&gt; ➡ &lt;code&gt;ss&lt;/code&gt;：通常较少这样做，因为 trojan 提供了更高的安全性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-shu4-ju4-nei4-rong2-de-zhu3-yao4-qu1-bie2&quot; tabindex=&quot;-1&quot;&gt;📝 &lt;strong&gt;5. 数据内容的主要区别&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;协议&lt;/th&gt;
&lt;th&gt;数据格式&lt;/th&gt;
&lt;th&gt;安全性&lt;/th&gt;
&lt;th&gt;抗审查性&lt;/th&gt;
&lt;th&gt;易用性&lt;/th&gt;
&lt;th&gt;是否支持 TLS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vmess&lt;/td&gt;
&lt;td&gt;Base64+JSON&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ss&lt;/td&gt;
&lt;td&gt;Base64 字符串&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;简单&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;trojan&lt;/td&gt;
&lt;td&gt;URL+TLS&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;较简单&lt;/td&gt;
&lt;td&gt;强制&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;6-ru2-he2-ti2-qu3-he2-shi3-yong4-zhe4-xie1-lian4-jie1&quot; tabindex=&quot;-1&quot;&gt;🔧 &lt;strong&gt;6. 如何提取和使用这些链接？&lt;/strong&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vmess&lt;/strong&gt;：Base64 解码为 JSON 配置，导入 V2RayN/V2RayNG。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ss&lt;/strong&gt;：Base64 解码后手动输入到 Shadowsocks 客户端或扫码导入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trojan&lt;/strong&gt;：直接将链接粘贴到支持 Trojan 的客户端，或手动配置 JSON 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
</content>
	</entry>
	
	<entry>
		<title>人工智能之 AI 大模型相关术语</title>
		<link href="https://www.dtking.cn/blog/ai-model/"/>
		<updated>2025-02-21T02:12:42Z</updated>
		<id>https://www.dtking.cn/blog/ai-model/</id>
		<content type="html">&lt;h2 id=&quot;shu4-yu3&quot; tabindex=&quot;-1&quot;&gt;术语 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;LLM&lt;/code&gt;&lt;/strong&gt;：大语言模型（英文：Large Language Model，缩写LLM），也称大型语言模型，是一种人工智能模型，旨在理解和生成人类语言。它们在大量的文本数据上进行训练，可以执行广泛的任务，包括文本总结、翻译、情感分析等等。LLM的特点是规模庞大，包含数十亿的参数，帮助它们学习语言数据中的复杂模式。这些模型通常基于深度学习架构，如转化器，这有助于它们在各种 &lt;code&gt;NLP&lt;/code&gt; 任务上取得令人印象深刻的表现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;RAG&lt;/code&gt;&lt;/strong&gt;：检索增强生成（Retrieval-Augmented Generation，检索增强生成） 是一种结合了信息检索技术与语言生成模型的人工智能技术。该技术通过从外部知识库中检索相关信息，并将其作为提示（Prompt）输入给大型语言模型（LLMs），以增强模型处理知识密集型任务的能力，如问答、文本摘要、内容生成等。RAG模型由Facebook AI Research（FAIR）团队于2020年首次提出，并迅速成为大模型应用中的热门方案。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;LoRA&lt;/code&gt;&lt;/strong&gt;：全称Low-Rank Adaptation of Large Language Models，是一种用于微调大型语言模型的低秩适应技术。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;LoRA&lt;/code&gt;&lt;/strong&gt;：对 16 位小型可训练矩阵进行微调，无需更新所有模型权重。LoRA 是一个使用量化思想对 LoRA 进行优化的量化算法，可以显著的降低训练大模型时所需要的显存资源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;QLoRA （Quantized LoRA）&lt;/code&gt;&lt;/strong&gt;：quantized 模型量化，将 LoRA 与 4 位量化相结合，以最少的资源处理非常大的模型。QLoRA的优化有三个核心要点：
&lt;ul&gt;
&lt;li&gt;首先是定义了一种4位标准浮点数（Normal Float 4-bit，NF4）量化，基于分块的分位数量化的量化策略；&lt;/li&gt;
&lt;li&gt;其次是双重量化，包含对普通参数的一次量化和对量化常数的再一次量化，可以进一步减小缓存占用；&lt;/li&gt;
&lt;li&gt;最后是分页优化器（Page Optimizer），用来在显存过高时用一部分内存代替显存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;NLP&lt;/code&gt;&lt;/strong&gt;：全称是 Natuarl Language Processing，中文意思是自然语言处理，是人工智能领域的一个重要方向&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;unsloth-shu4-ju4-ge2-shi4&quot; tabindex=&quot;-1&quot;&gt;Unsloth 数据格式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;为了启用标记化过程，数据集需要采用标记器可以读取的格式。&lt;/p&gt;
&lt;p&gt;数据源可以是CSV文件，PDF甚至是网站。您也可以综合生成数据，但需要格外小心，以确保每个示例都是高质量和相关的。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.unsloth.ai/basics/datasets-101#data-format&quot; title=&quot;data-format&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;格式&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;训练类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;原始文本集合（Raw Corpus）&lt;/td&gt;
&lt;td&gt;来自网站、书籍或文章等来源的未经处理的文本。&lt;/td&gt;
&lt;td&gt;持续预训练&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指令（Instruct）&lt;/td&gt;
&lt;td&gt;模型需要遵循的指令以及期望的输出结果示例。&lt;/td&gt;
&lt;td&gt;监督式微调（Supervised fine-tuning，SFT）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对话（Conversation）&lt;/td&gt;
&lt;td&gt;用户与AI助手之间的多轮交流。&lt;/td&gt;
&lt;td&gt;监督式微调（Supervised fine-tuning，SFT）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;人类反馈强化学习（RLHF）&lt;/td&gt;
&lt;td&gt;用户与AI助手之间的对话，其中助手的回应由人类评估者进行评分。&lt;/td&gt;
&lt;td&gt;强化学习：是一种机器学习的方法，通过正向反馈来强化模型的学习过程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;yuan2-shi3-wen2-ben3-raw-corpus&quot; tabindex=&quot;-1&quot;&gt;原始文本 Raw Corpus &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;u&gt;Google Colab &lt;a href=&quot;https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Mistral_(7B)-Text_Completion.ipynb#scrollTo=vITh0KVJ10qX&quot;&gt;补全续写&lt;/a&gt;&lt;/u&gt;&lt;br&gt;
&lt;u&gt;Google Colab &lt;a href=&quot;https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Mistral_v0.3_(7B)-CPT.ipynb#scrollTo=LjY75GoYUCB8&quot;&gt;持续预训练&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;为了继续预训练，我们使用没有特定结构的原始文本格式：&lt;/p&gt;
&lt;pre class=&quot;language-line&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-line&quot;&gt;&quot;text&quot;: &quot;Pasta carbonara是一道传统的罗马面食。酱汁是由生鸡蛋、磨碎的佩科里诺罗马诺奶酪和黑胡椒混合而成的。然后，将热意大利面与酥脆的猪肉馅和鸡蛋混合物一起搅拌，用余热制成奶油酱汁。尽管人们普遍认为，正宗的carbonara从不含奶油或大蒜。这道菜可能起源于20世纪中叶的罗马，尽管其确切起源仍有争议。。。&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种格式保留了自然语言流，并允许模型从连续文本中学习。&lt;/p&gt;
&lt;h3 id=&quot;zhi3-ling4-instruct&quot; tabindex=&quot;-1&quot;&gt;指令 Instruct &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;基于特定的指令集在一个回合中输出文本，则可以使用 &lt;a href=&quot;https://docs.unsloth.ai/basics/tutorial-how-to-finetune-llama-3-and-use-in-ollama#id-6.-alpaca-dataset&quot; title=&quot;alpaca-dataset&quot;&gt;Alpaca&lt;/a&gt; 格式的指令格式&lt;/p&gt;
&lt;pre class=&quot;language-line&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-line&quot;&gt;&quot;Instruction&quot;: &quot;我们希望模型执行的任务。&quot;

&quot;Input&quot;: &quot;它是可选的，但很有用，它本质上是用户的查询。&quot;

&quot;Output&quot;: &quot;任务的预期结果和模型的输出。&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dui4-hua4-conversation&quot; tabindex=&quot;-1&quot;&gt;对话 Conversation &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;u&gt;Google Colab &lt;a href=&quot;https://colab.research.google.com/drive/1Aau3lgPzeZKQ-98h69CCu1UJcvIBLmy2?usp=sharing&quot;&gt;微调笔记&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;当我们想要多轮对话时，我们可以使用 sharegpt 会话格式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;human&lt;/code&gt;：人类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assistant&lt;/code&gt;：助手&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;conversations&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;human&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;你能帮我做意大利面吗？&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;你想要传统的罗马食谱，还是更简单的版本？&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;human&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;请使用传统版本&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;正宗的罗马烤肉只使用了几种配料：意大利面、瓜希拉、鸡蛋、罗马佩科里诺干酪和黑胡椒。你想要详细的食谱吗？&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每个消息在&lt;strong&gt;人类&lt;/strong&gt;和&lt;strong&gt;助理&lt;/strong&gt;之间交替，允许自然的对话流。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问&lt;/strong&gt;：如何将我的原始数据格式化为 Alpaca 指令？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;答&lt;/strong&gt;：一种方法是创建一个 Python 脚本来处理原始数据。如果您正在处理摘要任务，则可以使用本地 LLM 为每个示例生成指令和输出。&lt;/p&gt;
&lt;h3 id=&quot;ren2-lei4-fan3-kui4-qiang2-hua4-xue2-xi2-rlhf&quot; tabindex=&quot;-1&quot;&gt;人类反馈强化学习 RLHF &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;待补充内容……&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama 模型迁移备份工具 ollamab</title>
		<link href="https://www.dtking.cn/blog/ollama/ollamab/"/>
		<updated>2025-02-18T01:39:25Z</updated>
		<id>https://www.dtking.cn/blog/ollama/ollamab/</id>
		<content type="html">&lt;h2 id=&quot;bei4-jing3&quot; tabindex=&quot;-1&quot;&gt;背景 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ollama&lt;/code&gt; 模型和相关配置文件默认都放在 &lt;code&gt;models&lt;/code&gt; 文件夹下，想要把指定模型迁移到其他电脑比较麻烦，所以就有了该工具。还有就是模型下载本身就慢，一次下载多台使用减少下载次数。最重要的是公司电脑下载快，家里下载慢，在公司下载拷贝回家用 😄&lt;/p&gt;
&lt;h2 id=&quot;ru2-he2-shi3-yong4&quot; tabindex=&quot;-1&quot;&gt;如何使用 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Window &lt;a href=&quot;https://864000.lanzouu.com/i1fv42o5l7te&quot;&gt;ollamab.exe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux &lt;a href=&quot;https://864000.lanzouu.com/ir8E62o5l8ja&quot;&gt;ollamab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ollamab&lt;/code&gt; &lt;code&gt;模型名称+型号&lt;/code&gt;（和 ollama 名称列表一致） &lt;code&gt;输出路径&lt;/code&gt; (可选)&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollamab.exe qwen:0.5b D:/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;执行结果&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;D:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;private&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;model-backup&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;ollamab.exe qwen:0.5b
模型路径: D:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;ai&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;.ollama&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;models
开始打包，耐心等待…………
添加到 ZIP 中: blobs&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;sha256-fad2a06e4cc705c2fa8bec5477ddb00dc0c859ac184c34dcc5586663774161ca
添加到 ZIP 中: blobs&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;sha256-41c2cf8c272f6fb0080a97cd9d9bd7d4604072b80a0b10e7d65ca26ef5000c0c
添加到 ZIP 中: blobs&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;sha256-1da0581fd4ce92dcf5a66b1da737cf215d8dcf25aa1b98b44443aaf7173155f5
添加到 ZIP 中: blobs&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;sha256-f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
添加到 ZIP 中: manifests&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;registry.ollama.ai&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;library&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;qwen&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;.5b
zip文件创建成功: qwen-0.5b.zip&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;mu4-biao1-dian4-nao3&quot; tabindex=&quot;-1&quot;&gt;目标电脑 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;将打包的 &lt;code&gt;zip&lt;/code&gt; 拷贝到目标电脑 &lt;code&gt;models&lt;/code&gt; 下直接解压到当前目录即可&lt;/p&gt;
&lt;h3 id=&quot;ollama&quot; tabindex=&quot;-1&quot;&gt;ollama &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ollama list&lt;/code&gt; 输出所有模型命令&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;NAME                ID              SIZE      MODIFIED
gemma2:9b           ff02c3702f32    &lt;span class=&quot;token number&quot;&gt;5.4&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; hours ago
phi:2.7b            e2fd6321a5fe    &lt;span class=&quot;token number&quot;&gt;1.6&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; hours ago
qwen:7b             2091ee8c8d8f    &lt;span class=&quot;token number&quot;&gt;4.5&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; days ago
qwen:0.5b           b5dc5e784f2a    &lt;span class=&quot;token number&quot;&gt;394&lt;/span&gt; MB    &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; days ago
llama3.1:8b         46e0c10c039e    &lt;span class=&quot;token number&quot;&gt;4.9&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; days ago
deepseek-r1:1.5b    a42b25d8c10a    &lt;span class=&quot;token number&quot;&gt;1.1&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; days ago
deepseek-r1:7b      0a8c26691023    &lt;span class=&quot;token number&quot;&gt;4.7&lt;/span&gt; GB    &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; days ago&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ollama 在 Windows 上存储文件在几个不同的位置。您可以通过以下步骤查看它们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;按 &lt;code&gt;&amp;lt;cmd&amp;gt;+R&lt;/code&gt;   键并输入：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;explorer %LOCALAPPDATA%&#92;Ollama&lt;/code&gt;  ：包含日志和下载的更新&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;app.log&lt;/em&gt;：最近的 GUI 应用程序日志&lt;/li&gt;
&lt;li&gt;&lt;em&gt;server.log&lt;/em&gt;：最近的服务器日志&lt;/li&gt;
&lt;li&gt;&lt;em&gt;upgrade.log&lt;/em&gt;：升级日志输出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;explorer %LOCALAPPDATA%&#92;Programs&#92;Ollama&lt;/code&gt;：包含二进制文件（安装器将其添加到用户 PATH 中）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;explorer %HOMEPATH%&#92;.ollama&lt;/code&gt;：包含模型和配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;explorer %TEMP%&lt;/code&gt;：包含临时执行文件，在一个或多个 &lt;code&gt;ollama*&lt;/code&gt; 目录中&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;yuan2-ma3&quot; tabindex=&quot;-1&quot;&gt;源码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/**
 * @Time : 2025/2/14 
 * @File : main.go
 * @Software: ollamab
 * @Author : Mr.Fang
 * @Description: 备份 ollama 模型
 */&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;archive/zip&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;encoding/json&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;io&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;log&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;os&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;path/filepath&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;runtime&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;strings&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; modelPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 初始化获取模型文件路径，优先从系统环境变量获取，其次获取默认路径&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	models &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Getenv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;OLLAMA_MODELS&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;models&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		modelPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; models
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// Window&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; runtime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;GOOS &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;windows&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			home&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;UserHomeDir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				log&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Panicln&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;获取用户主目录失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			modelPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;home&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.ollama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;models&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// Linux&lt;/span&gt;
			modelPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/usr/share/ollama/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;.ollama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;models&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;模型路径:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; modelPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 将文件或文件夹添加到 zip 中&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addToZip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zipWriter &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;zip&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Writer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; baseFolder &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 计算文件的相对路径&lt;/span&gt;
	relativePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Rel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;baseFolder&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;添加到 ZIP 中:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; relativePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 如果是目录，则创建空目录&lt;/span&gt;
	info&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 如果是目录，创建空目录&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; info&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;IsDir&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; zipWriter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;relativePath &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 如果是文件，创建文件条目&lt;/span&gt;
	fileInZip&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; zipWriter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;relativePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 打开文件并复制内容到zip中&lt;/span&gt;
	file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;filePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 复制文件内容到zip&lt;/span&gt;
	&lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Copy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fileInZip&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; err
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 模型相关所有文件路径&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;blobsPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modelDataPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; basePath &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReadFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modelDataPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;model data 文件读取错误！&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 转 map&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; modelData &lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; blobsPath &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;
	err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Unmarshal&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;modelData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;model data 转换错误！&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 层数据&lt;/span&gt;
	layers &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; modelData&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;layers&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 模型详情信息&lt;/span&gt;
	layers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;layers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; modelData&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;config&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; layer &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; layers &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		item &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; layer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		digest &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// sha256&lt;/span&gt;
		digest &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;digest&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		join &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;basePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blobs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; digest&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 使用 os.Stat 检查文件是否存在&lt;/span&gt;
		fileInfo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Stat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; fileInfo &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			blobsPath &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blobsPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; join&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; blobsPath
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// build 打包 zip&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; folderPaths &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;开始打包，耐心等待…………&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 创建目标zip文件&lt;/span&gt;
	zipFilePath &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	zipFile&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Create&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zipFilePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;创建zip文件失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; zipFile&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 创建zip写入器&lt;/span&gt;
	zipWriter &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; zip&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NewWriter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zipFile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; zipWriter&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 逐个添加文件或目录到zip文件中&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filePath &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; folderPaths &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 注意：baseFolder 是我们希望在zip文件中根目录&lt;/span&gt;
		err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addToZip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;zipWriter&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filePath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; modelPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;添加文件到zip失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;zip文件创建成功:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; zipFilePath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	args &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Args&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;参数: ollamab 名称:型号（必填） 指定输出路径，默认输出当前路径（可选）&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;示例: ollamab deepseek-r1:1.5b &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;示例: ollamab deepseek-r1:1.5b D:/models&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;示例: ollamab lrs33/bce-embedding-base_v1:latest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	arg &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	name &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; arg&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	version &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; arg&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	output &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;./&quot;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 配置文件路径&lt;/span&gt;
	library &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modelPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;manifests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;registry.ollama.ai&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;library&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 特殊情况，用户自己分享的模型&lt;/span&gt;
	contains &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; contains &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		libs &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		library &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; filepath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modelPath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;manifests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;registry.ollama.ai&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; libs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; libs&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 替换 &quot;/&quot; 否则无法创建 zip&lt;/span&gt;
		name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReplaceAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	folderPaths &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;blobsPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;library&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; modelPath&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 模型路径&lt;/span&gt;
	folderPaths &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;folderPaths&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; library&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 打包&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Sprintf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;%s-%s.zip&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; folderPaths&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;geng1-xin1-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;更新说明 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;解决用户自己分享的模型备份路径问题&lt;/li&gt;
&lt;li&gt;模型 &lt;code&gt;config&lt;/code&gt; 配置文件未拷贝导致 &lt;code&gt;ollama list&lt;/code&gt; 未显示迁移模型，需要执行 &lt;code&gt;ollama run 模型&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Linux 下默认模型路径未处理&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama Window 安装</title>
		<link href="https://www.dtking.cn/blog/ollama/windows/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/windows/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;系统要求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;文件系统要求 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;更改安装位置 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;更改模型位置 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;API 访问 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;故障排除 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;卸载 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;独立 CLI &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;欢迎使用 Ollama for Windows。&lt;/p&gt;
&lt;p&gt;不再需要 WSL 啦！&lt;/p&gt;
&lt;p&gt;Ollama 现在作为一个原生 Windows 应用程序运行，包括 NVIDIA 和 AMD Radeon GPU 支持。&lt;br&gt;
安装完成 Ollama for Windows 后，Ollama 将在后台运行，并且 &lt;code&gt;ollama&lt;/code&gt; 命令行将可用于 &lt;code&gt;cmd&lt;/code&gt;、&lt;code&gt;powershell&lt;/code&gt; 或您的喜爱的终端应用程序。如常，Ollama &lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/api.md&quot;&gt;api&lt;/a&gt; 将在 &lt;code&gt;http://localhost:11434&lt;/code&gt; 上提供服务。&lt;/p&gt;
&lt;h2 id=&quot;xi4-tong3-yao1-qiu2&quot; tabindex=&quot;-1&quot;&gt;系统要求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 22H2 或更新版本，Home 或 Pro 版本&lt;/li&gt;
&lt;li&gt;如果您有 NVIDIA 卡，请使用 NVIDIA 452.39 或更新的驱动程序&lt;/li&gt;
&lt;li&gt;如果您有 Radeon 卡，请使用 AMD Radeon 驱动程序（&lt;a href=&quot;https://www.amd.com/en/support%EF%BC%89&quot;&gt;https://www.amd.com/en/support）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ollama 使用 Unicode 字符作为进度指示器，可能在一些较旧的 Windows 10 终端字体中渲染为未知方块。如果您看到这种情况，请尝试更改您的终端字体设置。&lt;/p&gt;
&lt;h2 id=&quot;wen2-jian4-xi4-tong3-yao1-qiu2&quot; tabindex=&quot;-1&quot;&gt;文件系统要求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 安装不需要管理员权限， 默认安装在 &lt;code&gt;C:&#92;Users&#92;Administrator&#92;AppData&#92;Local&#92;Programs&lt;/code&gt;目录中。安装 Ollama 需要至少 4GB 的空间。完成安装后，您还需要额外的空间来存储 Large Language 模型，这些模型可以达到几十到数百 GB 的大小。如果您的家目录没有足够的空间，请尝试更改安装位置和模型存储位置。&lt;/p&gt;
&lt;h3 id=&quot;geng1-gai3-an1-zhuang1-wei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;更改安装位置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要将 Ollama 应用程序安装在不同的位置（而不是当前用户目录），请在安装时使用以下标记启动安装器：&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;OllamaSetup&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exe &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;DIR&lt;/span&gt;=&lt;span class=&quot;token string&quot;&gt;&quot;d:&#92;some&#92;location&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 上述标记的具体命令根据实际情况可能会有所变化。 &lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;geng1-gai3-mo2-xing2-wei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;更改模型位置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要更改 Ollama 存储下载的模型的位置（而不是当前用户目录），请在您的用户账户中设置环境变量 &lt;code&gt;OLLAMA_MODELS&lt;/code&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;启动 Windows 11 的 &lt;em&gt;设置&lt;/em&gt; 或 Windows 10 的 &lt;em&gt;控制面板&lt;/em&gt; 应用程序，查找 &lt;em&gt;环境变量&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;em&gt;编辑环境变量为您的帐户&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;编辑或创建一个新的变量 &lt;code&gt;OLLAMA_MODELS&lt;/code&gt; 以指定存储模型的位置。&lt;/li&gt;
&lt;li&gt;点击确定/应用以保存更改。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果 Ollama 已经在运行，退出托盘应用程序并从启动菜单重新启动它，或者在保存环境变量后新打开终端。&lt;/p&gt;
&lt;h2 id=&quot;api-fang3-wen4&quot; tabindex=&quot;-1&quot;&gt;API 访问 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;以下是一个快速示例，演示了如何从 &lt;code&gt;powershell&lt;/code&gt; 中访问 API：&lt;/p&gt;
&lt;pre class=&quot;language-powershell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;method POST &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Body &lt;span class=&quot;token string&quot;&gt;&#39;{&quot;model&quot;:&quot;llama3.2&quot;, &quot;prompt&quot;:&quot;Why is the sky blue?&quot;, &quot;stream&quot;: false}&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;uri http:&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;localhost:11434/api/generate &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Content &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ConvertFrom-json&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;gu4-zhang4-pai2-chu2&quot; tabindex=&quot;-1&quot;&gt;故障排除 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 在 Windows 上存储文件在几个不同的位置。您可以通过以下步骤查看它们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按 &lt;code&gt;&amp;lt;cmd&amp;gt;+R&lt;/code&gt; 键并输入：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;explorer %LOCALAPPDATA%&#92;Ollama&lt;/code&gt;：包含日志和下载的更新
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;app.log&lt;/em&gt;：最近的 GUI 应用程序日志&lt;/li&gt;
&lt;li&gt;&lt;em&gt;server.log&lt;/em&gt;：最近的服务器日志&lt;/li&gt;
&lt;li&gt;&lt;em&gt;upgrade.log&lt;/em&gt;：升级日志输出&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;explorer %LOCALAPPDATA%&#92;Programs&#92;Ollama&lt;/code&gt;：包含二进制文件（安装器将其添加到用户 PATH 中）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;explorer %HOMEPATH%&#92;.ollama&lt;/code&gt;：包含模型和配置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;explorer %TEMP%&lt;/code&gt;：包含临时执行文件，在一个或多个 &lt;code&gt;ollama*&lt;/code&gt; 目录中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;xie4-zai4&quot; tabindex=&quot;-1&quot;&gt;卸载 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama Windows 安装程序注册了一个卸载器应用程序。您可以在 Windows 设置中的 &lt;em&gt;添加或删除程序&lt;/em&gt; 中卸载 Ollama。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 上如果您已经更改了 `OLLAMA_MODELS` 位置，则卸载程序将不会删除您的下载的模型。 &lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;du2-li4-cli&quot; tabindex=&quot;-1&quot;&gt;独立 CLI &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在 Windows 上安装 Ollama 的最简单方法是使用 &lt;code&gt;OllamaSetup.exe&lt;/code&gt; 安装程序。它会在您的帐户中安装，而不需要管理员权限。我们会定期更新 Ollama 以支持最新的模型，这个安装程序将帮助您保持更新。&lt;/p&gt;
&lt;p&gt;如果您想安装或集成 Ollama 为服务，一个独立的 &lt;code&gt;ollama-windows-amd64.zip&lt;/code&gt; zip 文件可用，它包含只有 Ollama CLI 和 Nvidia 和 AMD 的 GPU 库依赖项。这使得可以在现有应用程序中嵌入 Ollama，或使用工具如 &lt;a href=&quot;https://nssm.cc/&quot;&gt;NSSM&lt;/a&gt; 以 &lt;code&gt;ollama serve&lt;/code&gt; 的方式以系统服务的形式运行它。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 如果您正在从前版本升级，应先删除旧目录。 &lt;/div&gt;&lt;/div&gt;</content>
	</entry>
	
	<entry>
		<title>Ollama 模型文件</title>
		<link href="https://www.dtking.cn/blog/ollama/modelfile/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/modelfile/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;格式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;基础 Modelfile 文件 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;指令 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;FROM（必需） &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;从现有模型构建 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;从Safetensors模型构建 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;从GGUF文件构建 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;PARAMETER &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;有效参数和值 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;TEMPLATE &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;模板变量 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;SYSTEM &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;ADAPTER &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;Safetensor适配器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;GGUF适配器 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;LICENSE &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;MESSAGE &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;有效角色 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;示例对话 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;注释 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Ollama 模型文件的结构和配置方法，帮助开发者更好地理解和部署 AI 模型。通过清晰的指南和示例，用户可以快速掌握如何创建和优化模型文件，从而提升模型性能和应用效果&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;&lt;code&gt;Modelfile&lt;/code&gt;语法正在开发中&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;模型文件是使用 Ollama 创建和共享模型的蓝图。&lt;/p&gt;
&lt;h2 id=&quot;ge2-shi4&quot; tabindex=&quot;-1&quot;&gt;格式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Modelfile&lt;/code&gt;的格式：&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# comment&lt;/span&gt;
INSTRUCTION arguments&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;FROM&lt;/a&gt;（必需）&lt;/td&gt;
&lt;td&gt;定义要使用的基本模型。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;PARAMETER&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;设置Ollama运行模型时的参数。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;TEMPLATE&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;要发送到模型的完整提示模板。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;SYSTEM&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;指定模板中要设置的系统消息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;ADAPTER&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;定义要应用于模型的(Q)LoRA适配器。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;LICENSE&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;指定法律许可证。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;MESSAGE&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;指定模型响应时使用的消息历史记录。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;shi4-li4&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;ji1-chu3-modelfile-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;基础 &lt;code&gt;Modelfile&lt;/code&gt; 文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;创建 mario 蓝图的&lt;code&gt;Modelfile&lt;/code&gt;示例：&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; llama3.2&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 将 temperature 设置为 1 [更高更富有创造力，更低更连贯]&lt;/span&gt;
PARAMETER temperature 1
&lt;span class=&quot;token comment&quot;&gt;# 将上下文窗口大小设置为 4096，这控制 LLM 可以用来生成下一个标记的令牌数&lt;/span&gt;
PARAMETER num_ctx 4096
&lt;span class=&quot;token comment&quot;&gt;# 设置自定义系统消息以指定聊天助手的行为&lt;/span&gt;
SYSTEM You are Mario from super mario bros, acting as an assistant.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;保存为文件（例如&lt;code&gt;Modelfile&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama create choose-a-model-name -f &amp;lt;文件位置，例如 ./Modelfile&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ollama run choose-a-model-name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;开始使用模型！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要查看给定模型的 Modelfile，请使用 &lt;code&gt;ollama show --modelfile&lt;/code&gt; 命令。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama show &lt;span class=&quot;token parameter variable&quot;&gt;--modelfile&lt;/span&gt; llama3.2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt; &lt;span class=&quot;token comment&quot;&gt;# 由“ollama show”生成的模型文件&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;# 要基于此文件构建新的模型文件，请将FROM行替换为：&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;# FROM llama3.2:latest&lt;/span&gt;
 &lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; /Users/pdevine/.ollama/models/blobs/sha256-00e1317cbf74d901080d7100f57580ba8dd8de57203072dc6f668324ba545f29&lt;/span&gt;
 TEMPLATE &quot;&quot;&quot;{{ if .System }}&amp;lt;|start_header_id|&gt;system&amp;lt;|end_header_id|&gt;

 {{ .System }}&amp;lt;|eot_id|&gt;{{ end }}{{ if .Prompt }}&amp;lt;|start_header_id|&gt;user&amp;lt;|end_header_id|&gt;

 {{ .Prompt }}&amp;lt;|eot_id|&gt;{{ end }}&amp;lt;|start_header_id|&gt;assistant&amp;lt;|end_header_id|&gt;

 {{ .Response }}&amp;lt;|eot_id|&gt;&quot;&quot;&quot;
 PARAMETER stop &quot;&amp;lt;|start_header_id|&gt;&quot;
 PARAMETER stop &quot;&amp;lt;|end_header_id|&gt;&quot;
 PARAMETER stop &quot;&amp;lt;|eot_id|&gt;&quot;
 PARAMETER stop &quot;&amp;lt;|reserved_special_token&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zhi3-ling4&quot; tabindex=&quot;-1&quot;&gt;指令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;from-bi4-xu1&quot; tabindex=&quot;-1&quot;&gt;FROM（必需） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt;指令定义创建模型时要使用的基本模型。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &amp;lt;模型名称&gt;:&amp;lt;标签&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;cong2-xian4-you3-mo2-xing2-gou4-jian4&quot; tabindex=&quot;-1&quot;&gt;从现有模型构建 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; llama3.2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可用基本模型列表：&lt;br&gt;
&lt;a href=&quot;https://github.com/ollama/ollama#model-library&quot;&gt;https://github.com/ollama/ollama#model-library&lt;/a&gt;&lt;br&gt;
可在以下位置找到更多模型：&lt;br&gt;
&lt;a href=&quot;https://ollama.com/library&quot;&gt;https://ollama.com/library&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;cong2-safetensors-mo2-xing2-gou4-jian4&quot; tabindex=&quot;-1&quot;&gt;从Safetensors模型构建 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &amp;lt;模型目录&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模型目录应包含支持架构的Safetensors权重。&lt;/p&gt;
&lt;p&gt;当前支持模型架构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Llama（包括Llama 2、Llama 3、Llama 3.1和Llama 3.2）&lt;/li&gt;
&lt;li&gt;Mistral（包括Mistral 1、Mistral 2和Mixtral）&lt;/li&gt;
&lt;li&gt;Gemma（包括Gemma 1和Gemma 2）&lt;/li&gt;
&lt;li&gt;Phi3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;cong2-gguf-wen2-jian4-gou4-jian4&quot; tabindex=&quot;-1&quot;&gt;从GGUF文件构建 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; ./ollama-model.gguf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GGUF文件位置应指定为绝对路径或相对于&lt;code&gt;Modelfile&lt;/code&gt;位置。&lt;/p&gt;
&lt;h3 id=&quot;parameter&quot; tabindex=&quot;-1&quot;&gt;PARAMETER &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PARAMETER&lt;/code&gt; 指令定义在运行模型时可以设置的参数。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;PARAMETER &amp;lt;参数&gt; &amp;lt;参数值&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;you3-xiao4-can1-shu4-he2-zhi2&quot; tabindex=&quot;-1&quot;&gt;有效参数和值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;值类型&lt;/th&gt;
&lt;th&gt;示例用法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mirostat&lt;/td&gt;
&lt;td&gt;启用Mirostat采样以控制困惑度。（默认：0，0 = 禁用，1 = Mirostat，2 = Mirostat 2.0）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;mirostat 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mirostat_eta&lt;/td&gt;
&lt;td&gt;影响算法对生成文本的反馈的响应速度。较低的速率将导致调整较慢，而较高的速率将使算法更敏感。（默认：0.1）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;mirostat_eta 0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mirostat_tau&lt;/td&gt;
&lt;td&gt;控制输出的一致性和多样性之间的平衡。较低的值将导致更专注和一致性的文本。（默认：5.0）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;mirostat_tau 5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;num_ctx&lt;/td&gt;
&lt;td&gt;设置用于生成下一个标记的上下文窗口大小。（默认：2048）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;num_ctx 4096&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;repeat_last_n&lt;/td&gt;
&lt;td&gt;设置模型回溯多远以防止重复。（默认：64，0 = 禁用，-1 = num_ctx）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;repeat_last_n 64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;repeat_penalty&lt;/td&gt;
&lt;td&gt;设置对重复的惩罚强度。较高的值（例如，1.5）将更强烈地惩罚重复，而较低的值（例如，0.9）将更宽容。（默认：1.1）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;repeat_penalty 1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;temperature&lt;/td&gt;
&lt;td&gt;模型的温度。增加温度将使模型的回答更具创造力。（默认：0.8）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;temperature 0.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seed&lt;/td&gt;
&lt;td&gt;设置用于生成的随机数种子。将此设置为特定数字将使模型对相同的提示生成相同的文本。（默认：0）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;seed 42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stop&lt;/td&gt;
&lt;td&gt;设置要使用的停止序列。当遇到此模式时，LLM将停止生成文本并返回。可以通过在modelfile中指定多个单独的&lt;code&gt;stop&lt;/code&gt;参数来设置多个停止模式。&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;stop &amp;quot;AI assistant:&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;num_predict&lt;/td&gt;
&lt;td&gt;生成文本时要预测的最大标记数。（默认：-1，无限生成）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;num_predict 42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;top_k&lt;/td&gt;
&lt;td&gt;减少生成无意义文本的概率。较高的值（例如100）将提供更多样化的答案，而较低的值（例如10）将更保守。（默认：40）&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;top_k 40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;top_p&lt;/td&gt;
&lt;td&gt;与top-k一起工作。较高的值（例如，0.95）将导致更多样化的文本，而较低的值（例如，0.5）将生成更专注和保守的文本。（默认：0.9）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;top_p 0.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;min_p&lt;/td&gt;
&lt;td&gt;top_p的替代方案，旨在确保质量和多样性的平衡。参数&lt;em&gt;p&lt;/em&gt;表示相对于最可能标记的概率，标记被考虑的最小概率。例如，当&lt;em&gt;p&lt;/em&gt;=0.05且最可能标记的概率为0.9时，值小于0.045的logits将被过滤掉。（默认：0.0）&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;min_p 0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;template&quot; tabindex=&quot;-1&quot;&gt;TEMPLATE &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;要传递给模型的完整提示模板的&lt;code&gt;TEMPLATE&lt;/code&gt;。它可能包括（可选）系统消息、用户的消息和模型的响应。注意：语法可能是特定于模型的。模板使用Go &lt;a href=&quot;https://pkg.go.dev/text/template&quot;&gt;模板语法&lt;/a&gt;。&lt;/p&gt;
&lt;h4 id=&quot;mu2-ban3-bian4-liang4&quot; tabindex=&quot;-1&quot;&gt;模板变量 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{ .System }}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用于指定自定义行为的系统消息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{ .Prompt }}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用户的提示消息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{ .Response }}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;模型的响应。在生成响应时，此变量后的文本将被省略。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;TEMPLATE &quot;&quot;&quot;{{ if .System }}&amp;lt;|im_start|&gt;system
{{ .System }}&amp;lt;|im_end|&gt;
{{ end }}{{ if .Prompt }}&amp;lt;|im_start|&gt;user
{{ .Prompt }}&amp;lt;|im_end|&gt;
{{ end }}&amp;lt;|im_start|&gt;assistant
&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;system&quot; tabindex=&quot;-1&quot;&gt;SYSTEM &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SYSTEM&lt;/code&gt;指令指定在模板中使用的系统消息（如果适用）。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;SYSTEM &quot;&quot;&quot;&amp;lt;system message&gt;&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;adapter&quot; tabindex=&quot;-1&quot;&gt;ADAPTER &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ADAPTER&lt;/code&gt;指令指定应应用于基本模型的微调LoRA适配器。适配器的值应为绝对路径或相对于Modelfile的路径。基本模型应使用&lt;code&gt;FROM&lt;/code&gt;指令指定。如果基本模型与适配器微调的基本模型不同，行为将不稳定。&lt;/p&gt;
&lt;h4 id=&quot;safetensor-shi4-pei4-qi4&quot; tabindex=&quot;-1&quot;&gt;Safetensor适配器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;ADAPTER &amp;lt;safetensor适配器路径&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前支持的Safetensor适配器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Llama（包括Llama 2、Llama 3和Llama 3.1）&lt;/li&gt;
&lt;li&gt;Mistral（包括Mistral 1、Mistral 2和Mixtral）&lt;/li&gt;
&lt;li&gt;Gemma（包括Gemma 1和Gemma 2）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;gguf-shi4-pei4-qi4&quot; tabindex=&quot;-1&quot;&gt;GGUF适配器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;ADAPTER ./ollama-lora.gguf&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;license&quot; tabindex=&quot;-1&quot;&gt;LICENSE &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;LICENSE&lt;/code&gt;指令允许您指定使用此Modelfile的模型共享或分发的法律许可证。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;LICENSE &quot;&quot;&quot;
&amp;lt;许可证文本&gt;
&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;message&quot; tabindex=&quot;-1&quot;&gt;MESSAGE &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;MESSAGE&lt;/code&gt;指令允许您指定模型响应时使用的消息历史记录。使用多个MESSAGE命令迭代来建立对话，这将引导模型以类似的方式回答。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;MESSAGE &amp;lt;角色&gt; &amp;lt;消息&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;you3-xiao4-jue2-se4&quot; tabindex=&quot;-1&quot;&gt;有效角色 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;角色&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;system&lt;/td&gt;
&lt;td&gt;为模型提供SYSTEM消息的另一种方式。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;用户可能问过的示例消息。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;assistant&lt;/td&gt;
&lt;td&gt;模型应如何响应的示例消息。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;shi4-li4-dui4-hua4&quot; tabindex=&quot;-1&quot;&gt;示例对话 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-txt&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-txt&quot;&gt;MESSAGE user Is Toronto in Canada?
MESSAGE assistant yes
MESSAGE user Is Sacramento in Canada?
MESSAGE assistant no
MESSAGE user Is Ontario in Canada?
MESSAGE assistant yes&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zhu4-shi4&quot; tabindex=&quot;-1&quot;&gt;注释 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Modelfile&lt;/code&gt;不区分大小写&lt;/strong&gt;。在示例中，使用大写指令是为了更容易将其与参数区分开。&lt;/li&gt;
&lt;li&gt;指令可以按任何顺序。在示例中，&lt;code&gt;FROM&lt;/code&gt;指令首先是为了保持易于阅读。&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama Linux 安装</title>
		<link href="https://www.dtking.cn/blog/ollama/linux/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/linux/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;使用命令安装 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;手动安装 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;AMD GPU 安装 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;ARM64 安装 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;将 Ollama 作为启动服务添加（推荐） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;安装 CUDA 驱动 (可选) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;安装 AMD ROCm 驱动 (可选) &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;启动 Ollama &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;自定义设置 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;更新 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;安装特定版本 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;查看日志 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;卸载 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Ollama Linux 安装&lt;/p&gt;
&lt;h3 id=&quot;shi3-yong4-ming4-ling4-an1-zhuang1&quot; tabindex=&quot;-1&quot;&gt;使用命令安装 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;运行以下命令以安装 Ollama：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;shou3-dong4-an1-zhuang1&quot; tabindex=&quot;-1&quot;&gt;手动安装 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;如果您是从旧版本升级，请先使用 &lt;code&gt;sudo rm -rf /usr/lib/ollama&lt;/code&gt; 删除旧的库。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;p&gt;下载并解压软件包：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; https://ollama.com/download/ollama-linux-amd64.tgz &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; ollama-linux-amd64.tgz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; /usr &lt;span class=&quot;token parameter variable&quot;&gt;-xzf&lt;/span&gt; ollama-linux-amd64.tgz&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动 Ollama：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama serve&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在另一个终端中验证 Ollama 是否正在运行：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;amd-gpu-an1-zhuang1&quot; tabindex=&quot;-1&quot;&gt;AMD GPU 安装 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果您拥有 AMD GPU，请下载并解压额外的 ROCm 包：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; https://ollama.com/download/ollama-linux-amd64-rocm.tgz &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; ollama-linux-amd64-rocm.tgz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; /usr &lt;span class=&quot;token parameter variable&quot;&gt;-xzf&lt;/span&gt; ollama-linux-amd64-rocm.tgz&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;arm64-an1-zhuang1&quot; tabindex=&quot;-1&quot;&gt;ARM64 安装 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;下载并解压专门为 ARM64 设计的包：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; https://ollama.com/download/ollama-linux-arm64.tgz &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; ollama-linux-arm64.tgz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; /usr &lt;span class=&quot;token parameter variable&quot;&gt;-xzf&lt;/span&gt; ollama-linux-arm64.tgz&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;jiang1-ollama-zuo4-wei2-qi3-dong4-fu2-wu4-tian1-jia1-tui1-jian4&quot; tabindex=&quot;-1&quot;&gt;将 Ollama 作为启动服务添加（推荐） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;创建一个用于 Ollama 的用户和组：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;useradd&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /bin/false &lt;span class=&quot;token parameter variable&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; /usr/share/ollama ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;usermod&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-G&lt;/span&gt; ollama &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;whoami&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建一个服务文件 &lt;code&gt;/etc/systemd/system/ollama.service&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;Ollama Service&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;network-online.target&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;/usr/bin/ollama serve&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;ollama&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;ollama&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;always&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;RestartSec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;&quot;&lt;span class=&quot;token inner-value&quot;&gt;PATH=$PATH&lt;/span&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Install&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;default.target&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl daemon-reload
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; ollama&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;an1-zhuang1-cuda-qu1-dong4-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;安装 CUDA 驱动 (可选) &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot;&gt;下载并安装&lt;/a&gt; CUDA。&lt;/p&gt;
&lt;p&gt;验证驱动是否已安装，使用以下命令，应打印有关您的GPU的详细信息：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;nvidia-smi&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;an1-zhuang1-amd-rocm-qu1-dong4-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;安装 AMD ROCm 驱动 (可选) &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://rocm.docs.amd.com/projects/install-on-linux/en/latest/tutorial/quick-start.html&quot;&gt;下载和安装&lt;/a&gt; ROCm v6。&lt;/p&gt;
&lt;h3 id=&quot;qi3-dong4-ollama&quot; tabindex=&quot;-1&quot;&gt;启动 Ollama &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;启动 Ollama 并验证是否正在运行：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl start ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl status ollama&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;虽然 AMD 已将 &lt;code&gt;amdgpu&lt;/code&gt; 驱动合并到 Linux 内核源代码中，但该版本可能较旧，可能不支持所有 ROCm 功能。我们强烈建议您从以下位置下载最新驱动：&lt;br&gt;
&lt;a href=&quot;https://www.amd.com/en/support/linux-drivers&quot;&gt;https://www.amd.com/en/support/linux-drivers&lt;/a&gt;&lt;br&gt;
以获得 Radeon GPU 的最佳支持。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;zi4-ding4-yi4-she4-zhi4&quot; tabindex=&quot;-1&quot;&gt;自定义设置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要自定义 Ollama 的安装，您可以编辑 systemd 服务文件或运行以下命令更改环境变量：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl edit ollama&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者，手动创建一个覆盖文件 &lt;code&gt;/etc/systemd/system/ollama.service.d/override.conf&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token section-name selector&quot;&gt;Service&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;Environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token value attr-value&quot;&gt;&quot;&lt;span class=&quot;token inner-value&quot;&gt;OLLAMA_DEBUG=1&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;geng1-xin1&quot; tabindex=&quot;-1&quot;&gt;更新 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;更新 Ollama 时，请重新运行安装脚本：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或通过重新下载 Ollama：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; https://ollama.com/download/ollama-linux-amd64.tgz &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; ollama-linux-amd64.tgz
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-C&lt;/span&gt; /usr &lt;span class=&quot;token parameter variable&quot;&gt;-xzf&lt;/span&gt; ollama-linux-amd64.tgz&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;an1-zhuang1-te4-ding4-ban3-ben3&quot; tabindex=&quot;-1&quot;&gt;安装特定版本 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;OLLAMA_VERSION&lt;/code&gt; 环境变量与安装脚本一起使用，以安装 Ollama 的特定版本，包括预发布版本。您可以在 &lt;a href=&quot;https://github.com/ollama/ollama/releases&quot;&gt;发行版页面&lt;/a&gt; 中找到版本号。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;OLLAMA_VERSION&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;.7 &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;cha2-kan4-ri4-zhi4&quot; tabindex=&quot;-1&quot;&gt;查看日志 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要查看 Ollama 作为启动服务运行的日志，运行以下命令：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;journalctl &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-u&lt;/span&gt; ollama&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;xie4-zai4&quot; tabindex=&quot;-1&quot;&gt;卸载 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;移除 ollama 服务：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl stop ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; systemctl disable ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /etc/systemd/system/ollama.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除 ollama 二进制文件从您的 bin 目录中（其中之一）： &lt;code&gt;/usr/local/bin&lt;/code&gt;、&lt;code&gt;/usr/bin&lt;/code&gt; 或 &lt;code&gt;/bin&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; ollama&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除下载的模型和 Ollama 服务用户和组：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; /usr/share/ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;userdel&lt;/span&gt; ollama
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;groupdel&lt;/span&gt; ollama&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;移除安装的库：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-rf&lt;/span&gt; /usr/local/lib/ollama&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama 导入模型</title>
		<link href="https://www.dtking.cn/blog/ollama/import/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/import/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;从 Safetensors 权重导入微调适配器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;从 Safetensors 权重导入模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;导入基于 GGUF 的模型或适配器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;量化模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;支持的量化 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;K-means(聚类) 量化 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;在 ollama.com 上分享您的模型 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;这个文档是关于如何将 Ollama 模型从 Safetensors 权重中导入。它包括使用 Dockerfile 将模型导入 Ollama 的步骤，以及如何在 Ollama.com 上共享模型。&lt;/p&gt;
&lt;h2 id=&quot;cong2-safetensors-quan2-zhong4-dao3-ru4-wei1-tiao2-shi4-pei4-qi4&quot; tabindex=&quot;-1&quot;&gt;从 Safetensors 权重导入微调适配器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，创建一个&lt;code&gt;Modelfile&lt;/code&gt;，其中&lt;code&gt;FROM&lt;/code&gt;命令指向您用于微调的基础模型，&lt;code&gt;ADAPTER&lt;/code&gt;命令指向带有 Safetensors 适配器的目录：&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &amp;lt;base model name&gt;&lt;/span&gt;
ADAPTER /path/to/adapter&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保在 &lt;code&gt;FROM&lt;/code&gt; 命令中使用与创建适配器时相同的基本模型，否则会得到不稳定的结果。大多数框架使用不同的量化方法，因此最好使用非量化（即非QLoRA）适配器。如果您的适配器与&lt;code&gt;Modelfile&lt;/code&gt;位于同一目录中，请使用&lt;code&gt;adapter&lt;/code&gt;指定适配器路径。&lt;/p&gt;
&lt;p&gt;现在从创建&lt;code&gt;Modelfile&lt;/code&gt;的目录运行&lt;code&gt;ollama create&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama create my-model&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，测试模型:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama run my-model&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ollama 支持导入基于多种不同模型架构的适配器，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Llama (包括 Llama 2, Llama 3, Llama 3.1, 和 Llama 3.2);&lt;/li&gt;
&lt;li&gt;Mistral (包括 Mistral 1, Mistral 2, 和 Mixtral); 和&lt;/li&gt;
&lt;li&gt;Gemma (包括 Gemma 1 和 Gemma 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;您可以使用微调框架或工具创建适配器，该框架或工具可以以 Safetensors 格式输出适配器，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hugging Face &lt;a href=&quot;https://huggingface.co/docs/transformers/en/training&quot;&gt;微调框架&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/unslothai/unsloth&quot;&gt;Unsloth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ml-explore/mlx&quot;&gt;MLX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cong2-safetensors-quan2-zhong4-dao3-ru4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;从 Safetensors 权重导入模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，使用&lt;code&gt;FROM&lt;/code&gt;命令创建一个&lt;code&gt;Modelfile&lt;/code&gt;，该命令指向包含 Safetensors 权重的目录：&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; /path/to/safetensors/directory&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果在权重所在的同一目录中创建模型文件，则可以使用命令 &lt;code&gt;FROM&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;现在从创建 &lt;code&gt;Modelfile&lt;/code&gt; 的目录运行 &lt;code&gt;ollama create&lt;/code&gt; 命令：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama create my-model&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，测试模型:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama run my-model&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ollama 支持导入多种不同架构的模型，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Llama (包括 Llama 2, Llama 3, Llama 3.1, 和 Llama 3.2);&lt;/li&gt;
&lt;li&gt;Mistral (包括 Mistral 1, Mistral 2, 和 Mixtral);&lt;/li&gt;
&lt;li&gt;Gemma (包括 Gemma 1 和 Gemma 2); and&lt;/li&gt;
&lt;li&gt;Phi3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这包括导入基础模型以及与基础模型一起使用的任何微调模型。&lt;/p&gt;
&lt;h2 id=&quot;dao3-ru4-ji1-yu2-gguf-de-mo2-xing2-huo4-shi4-pei4-qi4&quot; tabindex=&quot;-1&quot;&gt;导入基于 GGUF 的模型或适配器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您有基于 GGUF 的模型或适配器，则可以将其导入 Ollama。您可以通过以下方式获得 GGUF 型号或适配器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 Llama.cpp 的 &lt;code&gt;convert_hf_to_gguf.py&lt;/code&gt; 转换 Safetensors 模型；&lt;/li&gt;
&lt;li&gt;使用 Llama.cpp 中的 &lt;code&gt;convert_lora_to_gguf.py&lt;/code&gt; 转换 Safetensors 适配器；或&lt;/li&gt;
&lt;li&gt;从 HuggingFace 等地方下载模型或适配器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要导入 GGUF 模型，请创建一个包含以下内容的 &lt;code&gt;Modelfile&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; /path/to/file.gguf&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 GGUF 适配器，使用以下命令创建 &lt;code&gt;Modelfile&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; &amp;lt;model name&gt;&lt;/span&gt;
ADAPTER /path/to/file.gguf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;导入 GGUF 适配器时，使用与创建适配器时使用的基本模型相同的基本模型非常重要。您可以使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ollama 的模型&lt;/li&gt;
&lt;li&gt;GGUF 文件&lt;/li&gt;
&lt;li&gt;基于 Safetensors 的模型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建 &lt;code&gt;Modelfile&lt;/code&gt; 后，使用 &lt;code&gt;ollama create&lt;/code&gt; 命令构建模型。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama create my-model&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;liang2-hua4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;量化模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;量化模型可以让您更快地运行模型，减少内存消耗，但精度降低。这允许您在更温和的硬件上运行模型。&lt;/p&gt;
&lt;p&gt;Ollama 可以使用带有 &lt;code&gt;Ollama create&lt;/code&gt; 命令的 &lt;code&gt;-q/--quantize&lt;/code&gt; 标志将基于 FP16 和 FP32 的模型量化为不同的量化级别。&lt;/p&gt;
&lt;p&gt;首先，使用要量化的基于 FP16 或 FP32 的模型创建一个模型文件。&lt;/p&gt;
&lt;pre class=&quot;language-dockerfile&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; /path/to/my/gemma/f16/model&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用  &lt;code&gt;ollama create&lt;/code&gt; 创建量化模型。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;$ ollama create &lt;span class=&quot;token parameter variable&quot;&gt;--quantize&lt;/span&gt; q4_K_M mymodel
transferring model data
quantizing F16 model to Q4_K_M
creating new layer sha256:735e246cc1abfd06e9cdcf95504d6789a6cd1ad7577108a70d9902fef503c1bd
creating new layer sha256:0853f0ad24e5865173bbf9ffcc7b0f5d56b66fd690ab1009867e45e7d2c4db0f
writing manifest
success&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zhi1-chi2-de-liang2-hua4&quot; tabindex=&quot;-1&quot;&gt;支持的量化 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;q4_0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q4_1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q5_0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q5_1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q8_0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kmeans-ju4-lei4-liang2-hua4&quot; tabindex=&quot;-1&quot;&gt;K-means(聚类) 量化 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;q3_K_S&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q3_K_M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q3_K_L&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q4_K_S&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q4_K_M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q5_K_S&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q5_K_M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q6_K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;zai4-ollamacom-shang4-fen1-xiang3-nin2-de-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;在 ollama.com 上分享您的模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;您可以通过将创建的任何模型推送到 &lt;a href=&quot;https://ollama.com&quot;&gt;ollama.com&lt;/a&gt; 来共享它以便其他用户可以尝试。&lt;/p&gt;
&lt;p&gt;首先，使用浏览器访问 &lt;a href=&quot;https://ollama.com/signup&quot;&gt;Ollama&lt;/a&gt; 注册页面。如果您已经拥有一个帐户，则可以跳过此步骤。&lt;/p&gt;
&lt;img src=&quot;https://github.com/ollama/ollama/raw/main/docs/images/signup.png&quot; alt=&quot;register&quot; width=&quot;40%&quot;&gt;
&lt;p&gt;&lt;code&gt;用户名&lt;/code&gt; 字段将用作模型名称的一部分（例如“jmorgaca/mymodel”），因此请确保您对所选的用户名感到满意。&lt;/p&gt;
&lt;p&gt;现在您已经创建了一个帐户并登录，请转到&lt;a href=&quot;https://ollama.com/settings/keys&quot;&gt;Ollama密钥设置&lt;/a&gt;页面。&lt;/p&gt;
&lt;p&gt;按照页面上的说明确定Ollama公钥的位置。&lt;/p&gt;
&lt;img src=&quot;https://github.com/ollama/ollama/raw/main/docs/images/ollama-keys.png&quot; alt=&quot;ollama keys&quot; width=&quot;80%&quot;&gt;
&lt;p&gt;点击 &lt;code&gt;Add Ollama Public Key&lt;/code&gt;按钮，将 Olama 公钥的内容复制并粘贴到文本字段中。&lt;/p&gt;
&lt;p&gt;将模型推送到 &lt;a href=&quot;https://ollama.com&quot;&gt;ollama.com&lt;/a&gt;，首先确保它与您的用户名正确命名。您可能需要使用&lt;code&gt;ollama-cp&lt;/code&gt;命令进行复制&lt;br&gt;
为您的模型命名。一旦您对模型的名称感到满意，请使用 &lt;code&gt;ollama-push&lt;/code&gt; 命令将其推送到 &lt;a href=&quot;https://ollama.com&quot;&gt;ollama.com&lt;/a&gt;。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; mymodel myuser/mymodel
ollama push myuser/mymodel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一旦你的模型被推送，其他用户可以使用以下命令拉取并运行它：:&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;ollama run myuser/mymodel&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama 示例</title>
		<link href="https://www.dtking.cn/blog/ollama/examples/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/examples/</id>
		<content type="html">&lt;p&gt;该目录包含使用 Ollama 的不同示例，Python 、JavaScript、OpenAI社区示例等&lt;/p&gt;
&lt;h2 id=&quot;python-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;Python 示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/examples/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama Python 示例位于 &lt;a href=&quot;https://github.com/ollama/ollama-python/tree/main/examples&quot;&gt;ollama-python/examples&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;javascript-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;JavaScript 示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/examples/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama JavaScript 示例位于 &lt;a href=&quot;https://github.com/ollama/ollama-js/tree/main/examples&quot;&gt;ollama-js/examples&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;openai-jian1-rong2-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;OpenAI 兼容示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/examples/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ollama 与 OpenAI 兼容的示例位于 &lt;a href=&quot;https://www.dtking.cn/blog/ollama/docs/openai.md&quot;&gt;ollama/examples/openai&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;she4-qu1-shi4-li4&quot; tabindex=&quot;-1&quot;&gt;社区示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/examples/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://python.langchain.com/docs/integrations/chat/ollama/&quot;&gt;LangChain Ollama Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://js.langchain.com/docs/integrations/chat/ollama/&quot;&gt;LangChain Ollama JS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Ollama API 文档</title>
		<link href="https://www.dtking.cn/blog/ollama/api/"/>
		<updated>2025-02-10T09:20:08Z</updated>
		<id>https://www.dtking.cn/blog/ollama/api/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;模型名称 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;持续时间 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;流式响应 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;生成一个完成 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;结构化输出 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;JSON模式 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;流式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;无流式 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;带后缀的请求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;结构化输出的请求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;JSON模式的请求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;带图像的请求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;原生模式请求 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;请求（可复现输出） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;生成请求（带选项） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;加载模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;卸载模型 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;生成聊天完成 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;结构化输出 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（流式响应） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（无流式传输） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（结构化输出） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（带历史记录） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（带图片） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（可重现输出） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（带工具） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;加载模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;卸载模型 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;创建模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;量化类型 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;创建新模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;量化模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;从GGUF文件创建模型 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;从Safetensors目录创建模型 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;检查Blob是否存在 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;查询参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;推送 Blob &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;查询参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;列出本地模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;显示模型信息 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;复制模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;删除模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;拉取模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;推送模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;生成嵌入 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;请求（多个输入） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;响应 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;列出运行中的模型 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;生成嵌入 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;参数 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id=&quot;mo2-xing2-ming2-cheng1&quot; tabindex=&quot;-1&quot;&gt;模型名称 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;模型名称遵循 &lt;code&gt;Model:tag&lt;/code&gt; 格式，其中 &lt;code&gt;Model&lt;/code&gt; 可以有一个可选的命名空间，如 &lt;code&gt;example/Model&lt;/code&gt; 。一些例子是 &lt;code&gt;orca-mini:3b-q4_1&lt;/code&gt; 和 &lt;code&gt;llama3:70b&lt;/code&gt; 。标签是可选的，如果没有提供，将默认为 &lt;code&gt;latest&lt;/code&gt; 。标签用于标识特定版本。&lt;/p&gt;
&lt;h3 id=&quot;chi2-xu4-shi2-jian1&quot; tabindex=&quot;-1&quot;&gt;持续时间 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;所有持续时间均以纳秒为单位返回。&lt;/p&gt;
&lt;h3 id=&quot;liu2-shi4-xiang3-ying4&quot; tabindex=&quot;-1&quot;&gt;流式响应 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;某些端点以JSON对象的形式流式传输响应。可以通过为这些端点提供 &lt;code&gt;{&amp;quot;stream&amp;quot;: false}&lt;/code&gt; 来禁用流式传输。&lt;/p&gt;
&lt;h2 id=&quot;sheng1-cheng2-yi2-ge4-wan2-cheng2&quot; tabindex=&quot;-1&quot;&gt;生成一个完成 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/generate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为给定的提示提供模型生成响应。这是一个流式端点，因此将有一系列的响应。最终的响应对象将包括请求的统计信息和额外数据。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;: （必填）&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;模型名称&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt;: 用于生成响应的提示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;suffix&lt;/code&gt;: 模型响应后的文本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;images&lt;/code&gt;: （可选）一系列base64编码的图像（适用于&lt;code&gt;llava&lt;/code&gt;等多模态模型）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;高级参数（可选）:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;format&lt;/code&gt;: 返回响应的格式。格式可以是 &lt;code&gt;json&lt;/code&gt; 或 JSON 模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;: 文档中&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;Modelfile&lt;/a&gt;列出的额外模型参数，如 &lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system&lt;/code&gt;: 系统消息（覆盖 &lt;code&gt;Modelfile&lt;/code&gt; 中定义的内容）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt;: 要使用的提示模板（覆盖 &lt;code&gt;Modelfile&lt;/code&gt; 中定义的内容）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;: 如果为 &lt;code&gt;false&lt;/code&gt;，响应将作为单个响应对象返回，而不是一系列对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raw&lt;/code&gt;: 如果为 &lt;code&gt;true&lt;/code&gt;，将不对提示进行格式化。如果您在请求API时指定了完整的模板提示，可以选择使用 &lt;code&gt;raw&lt;/code&gt; 参数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keep_alive&lt;/code&gt;: 控制模型在请求后保留在内存中的时间（默认：&lt;code&gt;5m&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context&lt;/code&gt; （已弃用）: 从先前的请求返回的上下文参数 &lt;code&gt;/generate&lt;/code&gt;，这可以用来保持简短的对话记忆&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;jie2-gou4-hua4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;结构化输出 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过在 &lt;code&gt;format&lt;/code&gt; 参数中提供 JSON 模式来支持结构化输出。模型将生成与模式匹配的响应。请参见下面的&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;结构化输出&lt;/a&gt;示例。&lt;/p&gt;
&lt;h4 id=&quot;json-mo2-shi4&quot; tabindex=&quot;-1&quot;&gt;JSON模式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;通过将 &lt;code&gt;format&lt;/code&gt; 参数设置为 &lt;code&gt;json&lt;/code&gt; 来启用 JSON 模式。这将使响应结构化为有效的 JSON 对象。请参见下面的 JSON 模式&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;示例&lt;/a&gt;。&lt;/p&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;重要的是要指示模型在 &lt;code&gt;prompt&lt;/code&gt; 中使用 JSON。否则，模型可能会生成大量空白字符。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;shi4-li4&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;liu2-shi4&quot; tabindex=&quot;-1&quot;&gt;流式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;prompt&quot;: &quot;为什么天空是蓝色的?&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T08:52:19.385406455-07:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;流中的最终响应还包括关于生成的额外数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;total_duration&lt;/code&gt;: 生成响应所花费的时间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;load_duration&lt;/code&gt;: 加载模型所花费的时间（以纳秒为单位）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt_eval_count&lt;/code&gt;: 提示中的令牌数量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt_eval_duration&lt;/code&gt;: 评估提示所花费的时间（以纳秒为单位）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eval_count&lt;/code&gt;: 响应中的令牌数量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eval_duration&lt;/code&gt;: 生成响应所花费的时间（以纳秒为单位）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;context&lt;/code&gt;: 用于此响应的对话编码，可以在下一个请求中发送以保持对话记忆&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response&lt;/code&gt;: 如果响应是流式的，则为空，如果不是流式的，这将包含完整的响应&lt;br&gt;
要计算响应生成的速度（令牌/秒），请用 &lt;code&gt;eval_count&lt;/code&gt; / &lt;code&gt;eval_duration&lt;/code&gt; * &lt;code&gt;10^9&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T19:22:45.499127Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10706818083&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6338219291&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;130079000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;259&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4232710000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;wu2-liu2-shi4&quot; tabindex=&quot;-1&quot;&gt;无流式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;当流式传输关闭时，可以在一次回复中接收响应。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;prompt&quot;: &quot;为什么天空是蓝色的?&quot;,
  &quot;stream&quot;: false
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果 &lt;code&gt;stream&lt;/code&gt; 设置为 &lt;code&gt;false&lt;/code&gt;，响应将是一个单个的 JSON 对象：&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T19:22:45.499127Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The sky is blue because it is the color of the sky.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5043500667&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5025959&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;325953000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;290&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4709213000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;dai4-hou4-zhui4-de-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;带后缀的请求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;codellama:code&quot;,
  &quot;prompt&quot;: &quot;def compute_gcd(a, b):&quot;,
  &quot;suffix&quot;: &quot;    return result&quot;,
  &quot;options&quot;: {
    &quot;temperature&quot;: 0
  },
  &quot;stream&quot;: false
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;codellama:code&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-07-22T20:47:51.147561Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&#92;n  if a == 0:&#92;n    return b&#92;n  else:&#92;n    return compute_gcd(b % a, a)&#92;n&#92;ndef compute_lcm(a, b):&#92;n  result = (a * b) / compute_gcd(a, b)&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1162761250&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6683708&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;201222000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;63&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;953997000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;jie2-gou4-hua4-shu1-chu1-de-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;结构化输出的请求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.1:8b&quot;,
  &quot;prompt&quot;: &quot;Ollama is 22 years old and is busy saving the world. Respond using JSON&quot;,
  &quot;stream&quot;: false,
  &quot;format&quot;: {
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
      &quot;age&quot;: {
        &quot;type&quot;: &quot;integer&quot;
      },
      &quot;available&quot;: {
        &quot;type&quot;: &quot;boolean&quot;
      }
    },
    &quot;required&quot;: [
      &quot;age&quot;,
      &quot;available&quot;
    ]
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.1:8b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-12-06T00:48:09.983619Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&#92;n  &#92;&quot;age&#92;&quot;: 22,&#92;n  &#92;&quot;available&#92;&quot;: true&#92;n}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1075509083&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;567678166&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;28&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;236000000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;269000000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;json-mo2-shi4-de-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;JSON模式的请求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;当 &lt;code&gt;format&lt;/code&gt; 设置为 &lt;code&gt;json&lt;/code&gt; 时，输出将始终是一个格式良好的JSON对象。指导模型以JSON格式响应也同样重要。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;prompt&quot;: &quot;一天中不同时间天空的颜色是什么？请使用JSON响应&quot;,
  &quot;format&quot;: &quot;json&quot;,
  &quot;stream&quot;: false
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-11-09T21:07:55.186497Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&#92;n&#92;&quot;morning&#92;&quot;: {&#92;n&#92;&quot;color&#92;&quot;: &#92;&quot;blue&#92;&quot;&#92;n},&#92;n&#92;&quot;noon&#92;&quot;: {&#92;n&#92;&quot;color&#92;&quot;: &#92;&quot;blue-gray&#92;&quot;&#92;n},&#92;n&#92;&quot;afternoon&#92;&quot;: {&#92;n&#92;&quot;color&#92;&quot;: &#92;&quot;warm gray&#92;&quot;&#92;n},&#92;n&#92;&quot;evening&#92;&quot;: {&#92;n&#92;&quot;color&#92;&quot;: &#92;&quot;orange&#92;&quot;&#92;n}&#92;n}&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4648158584&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4071084&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;36&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;439038000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4196918000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;response&lt;/code&gt; 的值将是一个包含类似以下内容的JSON字符串：&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;response &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;morning&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blue&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;noon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;blue-gray&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;afternoon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warm gray&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;evening&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;orange&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;dai4-tu2-xiang4-de-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;带图像的请求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;为了向像 &lt;code&gt;llava&lt;/code&gt; 或 &lt;code&gt;bakllava&lt;/code&gt; 这样的多模态模型提交图像，需要提供一个 base64 编码的 &lt;code&gt;images&lt;/code&gt; 列表：&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &#39;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llava&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;prompt&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;What is in this picture?&quot;&lt;/span&gt;,
  &lt;span class=&quot;token string&quot;&gt;&quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; false,
  &lt;span class=&quot;token string&quot;&gt;&quot;images&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&quot;iVBORw0KGgoAAAANSUhEUgAAAG0AAABmCAYAAADBPx+VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA3VSURBVHgB7Z27r0zdG8fX743i1bi1ikMoFMQloXRpKFFIqI7LH4BEQ+NWIkjQuSWCRIEoULk0gsK1kCBI0IhrQVT7tz/7zZo888yz1r7MnDl7z5xvsjkzs2fP3uu71nNfa7lkAsm7d++Sffv2JbNmzUqcc8m0adOSzZs3Z+/XES4ZckAWJEGWPiCxjsQNLWmQsWjRIpMseaxcuTKpG/7HP27I8P79e7dq1ars/yL4/v27S0ejqwv+cUOGEGGpKHR37tzJCEpHV9tnT58+dXXCJDdECBE2Ojrqjh071hpNECjx4cMHVycM1Uhbv359B2F79+51586daxN/+pyRkRFXKyRDAqxEp4yMlDDzXG1NPnnyJKkThoK0VFd1ELZu3TrzXKxKfW7dMBQ6bcuWLW2v0VlHjx41z717927ba22U9APcw7Nnz1oGEPeL3m3p2mTAYYnFmMOMXybPPXv2bNIPpFZr1NHn4HMw0KRBjg9NuRw95s8PEcz/6DZELQd/09C9QGq5RsmSRybqkwHGjh07OsJSsYYm3ijPpyHzoiacg35MLdDSIS/O1yM778jOTwYUkKNHWUzUWaOsylE00MyI0fcnOwIdjvtNdW/HZwNLGg+sR1kMepSNJXmIwxBZiG8tDTpEZzKg0GItNsosY8USkxDhD0Rinuiko2gfL/RbiD2LZAjU9zKQJj8RDR0vJBR1/Phx9+PHj9Z7REF4nTZkxzX4LCXHrV271qXkBAPGfP/atWvu/PnzHe4C97F48eIsRLZ9+3a3f/9+87dwP1JxaF7/3r17ba+5l4EcaVo0lj3SBq5kGTJSQmLWMjgYNei2GPT1MuMqGTDEFHzeQSP2wi/jGnkmPJ/nhccs44jvDAxpVcxnq0F6eT8h4ni/iIWpR5lPyA6ETkNXoSukvpJAD3AsXLiwpZs49+fPn5ke4j10TqYvegSfn0OnafC+Tv9ooA/JPkgQysqQNBzagXY55nO/oa1F7qvIPWkRL12WRpMWUvpVDYmxAPehxWSe8ZEXL20sadYIozfmNch4QJPAfeJgW3rNsnzphBKNJM2KKODo1rVOMRYik5ETy3ix4qWNI81qAAirizgMIc+yhTytx0JWZuNI03qsrgWlGtwjoS9XwgUhWGyhUaRZZQNNIEwCiXD16tXcAHUs79co0vSD8rrJCIW98pzvxpAWyyo3HYwqS0+H0BjStClcZ&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llava&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-11-03T15:36:02.583064Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;A happy cartoon character, which is cute and cheerful.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2938432250&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2559292&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2195557000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;44&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;736432000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;yuan2-sheng1-mo2-shi4-qing3-qiu2&quot; tabindex=&quot;-1&quot;&gt;原生模式请求 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;在某些情况下，您可能希望绕过模板系统并提供一个完整的提示。在这种情况下，您可以使用 &lt;code&gt;raw&lt;/code&gt; 参数来禁用模板。请注意，原生模式不会返回上下文。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;mistral&quot;,
  &quot;prompt&quot;: &quot;[INST] why is the sky blue? [/INST]&quot;,
  &quot;raw&quot;: true,
  &quot;stream&quot;: false
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;qing3-qiu2-ke3-fu4-xian4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;请求（可复现输出） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;为了获得可复现的输出，将 &lt;code&gt;seed&lt;/code&gt; 设置为一个数字：&lt;/p&gt;
&lt;h4 id=&quot;sheng1-cheng2-qing3-qiu2-dai4-xuan3-xiang4&quot; tabindex=&quot;-1&quot;&gt;生成请求（带选项） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果您想在运行时为模型设置自定义选项，而不是在Modelfile中设置，您可以使用 &lt;code&gt;options&lt;/code&gt; 参数。以下示例设置了所有可用的选项，但您可以选择性地设置任何选项，并省略您不想覆盖的选项。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;prompt&quot;: &quot;为什么天空是蓝色的？&quot;,
  &quot;stream&quot;: false,
  &quot;options&quot;: {
    &quot;num_keep&quot;: 5,
    &quot;seed&quot;: 42,
    &quot;num_predict&quot;: 100,
    &quot;top_k&quot;: 20,
    &quot;top_p&quot;: 0.9,
    &quot;min_p&quot;: 0.0,
    &quot;typical_p&quot;: 0.7,
    &quot;repeat_last_n&quot;: 33,
    &quot;temperature&quot;: 0.8,
    &quot;repeat_penalty&quot;: 1.2,
    &quot;presence_penalty&quot;: 1.5,
    &quot;frequency_penalty&quot;: 1.0,
    &quot;mirostat&quot;: 1,
    &quot;mirostat_tau&quot;: 0.8,
    &quot;mirostat_eta&quot;: 0.6,
    &quot;penalize_newline&quot;: true,
    &quot;stop&quot;: [&quot;&#92;n&quot;, &quot;user:&quot;],
    &quot;numa&quot;: false,
    &quot;num_ctx&quot;: 1024,
    &quot;num_batch&quot;: 2,
    &quot;num_gpu&quot;: 1,
    &quot;main_gpu&quot;: 0,
    &quot;low_vram&quot;: false,
    &quot;vocab_only&quot;: false,
    &quot;use_mmap&quot;: true,
    &quot;use_mlock&quot;: false,
    &quot;num_thread&quot;: 8
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T19:22:45.499127Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;天空是蓝色的，因为它是天空的颜色。&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;context&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4935886791&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;534986708&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;107345000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;237&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4289432000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;jia1-zai4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;加载模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果提供了空提示，模型将被加载到内存中。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-18T19:52:07.071755Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;xie4-zai4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;卸载模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果提供了空提示，并且 &lt;code&gt;keep_alive&lt;/code&gt; 参数设置为 &lt;code&gt;0&lt;/code&gt;，模型将从内存中卸载。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/generate &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;keep_alive&quot;: 0
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-09-12T03:54:03.516566Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;response&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unload&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sheng1-cheng2-liao2-tian1-wan2-cheng2&quot; tabindex=&quot;-1&quot;&gt;生成聊天完成 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/chat&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用提供的模型在聊天中生成下一条消息。这是一个流式端点，因此将有一系列的响应。可以通过设置 &lt;code&gt;&amp;quot;stream&amp;quot;: false&lt;/code&gt; 来禁用流式传输。最终的响应对象将包括请求的统计信息和附加数据。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-1&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;: （必填）&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;模型名称&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;messages&lt;/code&gt;: 聊天的消息，这可以用来保持聊天记忆&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools&lt;/code&gt;: 模型支持的工具列表（JSON格式）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;message&lt;/code&gt; 对象具有以下字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;role&lt;/code&gt;: 消息的角色，可以是 &lt;code&gt;system&lt;/code&gt;、&lt;code&gt;user&lt;/code&gt;、&lt;code&gt;assistant&lt;/code&gt; 或 &lt;code&gt;tool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content&lt;/code&gt;: 消息的内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;images&lt;/code&gt; （可选）: 消息中包含的图像列表（适用于如 &lt;code&gt;llava&lt;/code&gt; 等多模态模型）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_calls&lt;/code&gt; （可选）: 模型想要使用的工具列表（JSON格式）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;高级参数（可选）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;format&lt;/code&gt;: 返回响应的格式。格式可以是 &lt;code&gt;json&lt;/code&gt; 或 JSON 模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;: 文档中 &lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;Modelfile&lt;/a&gt; 提到的其他模型参数，如 &lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;: 如果设置为 &lt;code&gt;false&lt;/code&gt;，响应将作为一个单独的响应对象返回，而不是一系列的对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keep_alive&lt;/code&gt;: 控制模型在请求后保留在内存中的时间（默认：&lt;code&gt;5m&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jie2-gou4-hua4-shu1-chu1-1&quot; tabindex=&quot;-1&quot;&gt;结构化输出 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过在 &lt;code&gt;format&lt;/code&gt; 参数中提供 JSON 模式，支持结构化输出。模型将生成与模式匹配的响应。请参见下面的 &lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;聊天请求（结构化输出）&lt;/a&gt; 示例。&lt;/p&gt;
&lt;h3 id=&quot;shi4-li4-1&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-liu2-shi4-xiang3-ying4&quot; tabindex=&quot;-1&quot;&gt;聊天请求（流式响应） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;发送带有流式响应的聊天消息。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;为什么天空是蓝色的？&quot;
    }
  ]
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T08:52:19.385406455-07:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;images&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;最终响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T19:22:45.499127Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4883583458&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1334875&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;342546000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;282&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4535599000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-wu2-liu2-shi4-chuan2-shu1&quot; tabindex=&quot;-1&quot;&gt;聊天请求（无流式传输） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;为什么天空是蓝色的？&quot;
    }
  ],
  &quot;stream&quot;: false
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-12T14:13:43.416799Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;你好！你今天怎么样？&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5191566416&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2154458&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;383809000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;298&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4799921000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-jie2-gou4-hua4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;聊天请求（结构化输出） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-H&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Content-Type: application/json&quot;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.1&quot;,
  &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Ollama is 22 years old and busy saving the world. Return a JSON object with the age and availability.&quot;}],
  &quot;stream&quot;: false,
  &quot;format&quot;: {
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
      &quot;age&quot;: {
        &quot;type&quot;: &quot;integer&quot;
      },
      &quot;available&quot;: {
        &quot;type&quot;: &quot;boolean&quot;
      }
    },
    &quot;required&quot;: [
      &quot;age&quot;,
      &quot;available&quot;
    ]
  },
  &quot;options&quot;: {
    &quot;temperature&quot;: 0
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-12-06T00:46:58.265747Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{&quot;&lt;/span&gt;age&lt;span class=&quot;token string&quot;&gt;&quot;: 22, &quot;&lt;/span&gt;available&lt;span class=&quot;token string&quot;&gt;&quot;: false}&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2254970291&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;574751416&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;34&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1502000000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;175000000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-dai4-li4-shi3-ji4-lu4&quot; tabindex=&quot;-1&quot;&gt;聊天请求（带历史记录） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;发送带有聊天历史记录的聊天消息。您可以使用相同的方法使用多镜头或思维链提示来开始对话。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;why is the sky blue?&quot;
    },
    {
      &quot;role&quot;: &quot;assistant&quot;,
      &quot;content&quot;: &quot;due to rayleigh scattering.&quot;
    },
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;how is that different than mie scattering?&quot;
    }
  ]
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T08:52:19.385406455-07:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;The&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;最终响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-08-04T19:22:45.499127Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8113331500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6396458&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;61&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;398801000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;468&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7701267000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-dai4-tu2-pian4&quot; tabindex=&quot;-1&quot;&gt;聊天请求（带图片） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;发送带有图片的聊天消息。图片应以Base64编码作为数组提供。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llava&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;what is in this image?&quot;,
      &quot;images&quot;: [&quot;iVBORw0KGgoAAAANSUhEUgAAAG0AAABmCAYAAADBPx+VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA3VSURBVHgB7Z27r0zdG8fX743i1bi1ikMoFMQloXRpKFFIqI7LH4BEQ+NWIkjQuSWCRIEoULk0gsK1kCBI0IhrQVT7tz/7zZo888yz1r7MnDl7z5xvsjkzs2fP3uu71nNfa7lkAsm7d++Sffv2JbNmzUqcc8m0adOSzZs3Z+/XES4ZckAWJEGWPiCxjsQNLWmQsWjRIpMseaxcuTKpG/7HP27I8P79e7dq1ars/yL4/v27S0ejqwv+cUOGEGGpKHR37tzJCEpHV9tnT58+dXXCJDdECBE2Ojrqjh071hpNECjx4cMHVycM1Uhbv359B2F79+51586daxN/+pyRkRFXKyRDAqxEp4yMlDDzXG1NPnnyJKkThoK0VFd1ELZu3TrzXKxKfW7dMBQ6bcuWLW2v0VlHjx41z717927ba22U9APcw7Nnz1oGEPeL3m3p2mTAYYnFmMOMXybPPXv2bNIPpFZr1NHn4HMw0KRBjg9NuRw95s8PEcz/6DZELQd/09C9QGq5RsmSRybqkwHGjh07OsJSsYYm3ijPpyHzoiacg35MLdDSIS/O1yM778jOTwYUkKNHWUzUWaOsylE00MyI0fcnOwIdjvtNdW/HZwNLGg+sR1kMepSNJXmIwxBZiG8tDTpEZzKg0GItNsosY8USkxDhD0Rinuiko2gfL/RbiD2LZAjU9zKQJj8RDR0vJBR1/Phx9+PHj9Z7REF4nTZkxzX4LCXHrV271qXkBAPGfP/atWvu/PnzHe4C97F48eIsRLZ9+3a3f/9+87dwP1JxaF7/3r17ba+5l4EcaVo0lj3SBq5kGTJSQmLWMjgYNei2GPT1MuMqGTDEFHzeQSP2wi/jGnkmPJ/nhccs44jvDAxpVcxnq0F6eT8h4ni/iIWpR5lPyA6ETkNXoSukvpJAD3AsXLiwpZs49+fPn5ke4j10TqYvegSfn0OnafC+Tv9ooA/JPkgQysqQNBzagXY55nO/oa1F7qvIPWkRL12WRpMWUvpVDYmxAPehxWSe8ZEXL20sadYIozfmNch4QJPAfeJgW3rNsnzphBKNJM2KKODo1rVOMRYik5ETy3ix4qWNI81qAAirizgMIc+yhTytx0JWZuNI03qsrgWlGtwjoS9XwgUhWGyhUaRZZQNNIEwCiXD16tXcAHUs79co0vSD8rrJCIW98pzvxpAWyyo3HYwqS0+H0BjStClcZJT5coMm6D2LOF8TolGJtK9fvyZpyiC5ePFi9nc/oJU4eiEP0jVoAnHa9wyJycITMP78+eMeP37sXrx44d6+fdt6f82aNdkx1pg9e3Zb5W+RSRE+n+VjksQWifvVaTKFhn5O8my63K8Qabdv33b379/PiAP//vuvW7BggZszZ072/+TJk91YgkafPn166zXB1rQHFvouAWHq9z3SEevSUerqCn2/dDCeta2jxYbr69evk4MHDyY7d+7MjhMnTiTPnz9Pfv/+nfQT2ggpO2dMF8cghuoM7Ygj5iWCqRlGFml0QC/ftGmTmzt3rmsaKDsgBSPh0/8yPeLLBihLkOKJc0jp8H8vUzcxIA1k6QJ/c78tWEyj5P3o4u9+jywNPdJi5rAH9x0KHcl4Hg570eQp3+vHXGyrmEeigzQsQsjavXt38ujRo44LQuDDhw+TW7duRS1HGgMxhNXHgflaNTOsHyKvHK5Ijo2jbFjJBQK9YwFd6RVMzfgRBmEfP37suBBm/p49e1qjEP2mwTViNRo0VJWH1deMXcNK08uUjVUu7s/zRaL+oLNxz1bpANco4npUgX4G2eFbpDFyQoQxojBCpEGSytmOH8qrH5Q9vuzD6ofQylkCUmh8DBAr+q8JCyVNtWQIidKQE9wNtLSQnS4jDSsxNHogzFuQBw4cyM61UKVsjfr3ooBkPSqqQHesUPWVtzi9/vQi1T+rJj7WiTz4Pt/l3LxUkr5P2VYZaZ4URpsE+st/dujQoaBBYokbrz/8TJNQYLSonrPS9kUaSkPeZyj1AWSj+d+VBoy1pIWVNed8P0Ll/ee5HdGRhrHhR5GGN0r4LGZBaj8oFDJitBTJzIZgFcmU0Y8ytWMZMzJOaXUSrUs5RxKnrxmbb5YXO9VGUhtpXldhEUogFr3IzIsvlpmdosVcGVGXFWp2oU9kLFL3dEkSz6NHEY1sjSRdIuDFWEhd8KxFqsRi1uM/nz9/zpxnwlESONdg6dKlbsaMGS4EHFHtjFIDHwKOo46l4TxSuxgDzi+rE2jg+BaFruOX4HXa0Nnf1lwAPufZeF8/r6zD97WK2qFnGjBxTw5qNGPxT+5T/r7/7RawFC3j4vTp09koCxkeHjqbHJqArmH5UrFKKksnxrK7FuRIs8STfBZv+luugXZ2pR/pP9Ois4z+TiMzUUkUjD0iEi1fzX8GmXyuxUBRcaUfykV0YZnlJGKQpOiGB76x5GeWkWWJc3mOrK6S7xdND+W5N6XyaRgtWJFe13GkaZnKOsYqGdOVVVbGupsyA/l7emTLHi7vwTdirNEt0qxnzAvBFcnQF16xh/TMpUuXHDowhlA9vQVraQhkudRdzOnK+04ZSP3DUhVSP61YsaLtd/ks7ZgtPcXqPqEafHkdqa84X6aCeL7YWlv6edGFHb+ZFICPlljHhg0bKuk0CSvVznWsotRu433alNdFrqG45ejoaPCaUkWERpLXjzFL2Rpllp7PJU2a/v7Ab8N05/9t27Z16KUqoFGsxnI9EosS2niSYg9SpU6B4JgTrvVW1flt1sT+0ADIJU2maXzcUTraGCRaL1Wp9rUMk16PMom8QhruxzvZIegJjFU7LLCePfS8uaQdPny4jTTL0dbee5mYokQsXTIWNY46kuMbnt8Kmec+LGWtOVIl9cT1rCB0V8WqkjAsRwta93TbwNYoGKsUSChN44lgBNCoHLHzquYKrU6qZ8lolCIN0Rh6cP0Q3U6I6IXILYOQI513hJaSKAorFpuHXJNfVlpRtmYBk1Su1obZr5dnKAO+L10Hrj3WZW+E3qh6IszE37F6EB+68mGpvKm4eb9bFrlzrok7fvr0Kfv727dvWRmdVTJHw0qiiCUSZ6wCK+7XL/AcsgNyL74DQQ730sv78Su7+t/A36MdY0sW5o40ahslXr58aZ5HtZB8GH64m9EmMZ7FpYw4T6QnrZfgenrhFxaSiSGXtPnz57e9TkNZLvTjeqhr734CNtrK41L40sUQckmj1lGKQ0rC37x544r8eNXRpnVE3ZZY7zXo8NomiO0ZUCj2uHz58rbXoZ6gc0uA+F6ZeKS/jhRDUq8MKrTho9fEkihMmhxtBI1DxKFY9XLpVcSkfoi8JGnToZO5sU5aiDQIW716ddt7ZLYtMQlhECdBGXZZMWldY5BHm5xgAroWj4C0hbYkSc/jBmggIrXJWlZM6pSETsEPGqZOndr2uuuR5rF169a2HoHPdurUKZM4CO1WTPqaDaAd+GFGKdIQkxAn9RuEWcTRyN2KSUgiSgF5aWzPTeA/lN5rZubMmR2bE4SIC4nJoltgAV/dVefZm72AtctUCJU2CMJ327hxY9t7EHbkyJFseq+EJSY16RPo3Dkq1kkr7+q0bNmyDuLQcZBEPYmHVdOBiJyIlrRDq41YPWfXOxUysi5fvtyaj+2BpcnsUV/oSoEMOk2CQGlr4ckhBwaetBhjCwH0ZHtJROPJkyc7UjcYLDjmrH7ADTEBXFfOYmB0k9oYBOjJ8b4aOYSe7QkKcYhFlq3QYLQhSidNmtS2RATwy8YOM3EQJsUjKiaWZ+vZToUQgzhkHXudb/PW5YMHD9yZM2faPsMwoc7RciYJXbGuBqJ1UIGKKLv915jsvgtJxCZDubdXr165mzdvtr1Hz5LONA8jrUwKPqsmVesKa49S3Q4WxmRPUEYdTjgiUcfUwLx589ySJUva3oMkP6IYddq6HMS4o55xBJBUeRjzfa4Zdeg56QZ43LhxoyPo7Lf1kNt7oO8wWAbNwaYjIv5lhyS7kRf96dvm5Jah8vfvX3flyhX35cuX6HfzFHOToS1H4BenCaHvO8pr8iDuwoUL7tevX+b5ZdbBair0xkFIlFDlW4ZknEClsp/TzXyAKVOmmHWFVSbDNw1l1+4f90U6IY/q4V27dpnE9bJ+v87QEydjqx/UamVVPRG+mwkNTYN+9tjkwzEx+atCm/X9WvWtDtAb68Wy9LXa1UmvCDDIpPkyOQ5ZwSzJ4jMrvFcr0rSjOUh+GcT4LSg5ugkW1Io0/SCDQBojh0hPlaJdah+tkVYrnTZowP8iq1F1TgMBBauufyB33x1v+NWFYmT5KmppgHC+NkAgbmRkpD3yn9QIseXymoTQFGQmIOKTxiZIWpvAatenVqRVXf2nTrAWMsPnKrMZHz6bJq5jvce6QK8J1cQNgKxlJapMPdZSR64/UivS9NztpkVEdKcrs5alhhWP9NeqlfWopzhZScI6QxseegZRGeg5a8C3Re1Mfl1ScP36ddcUaMuv24iOJtz7sbUjTS4qBvKmstYJoUauiuD3k5qhyr7QdUHMeCgLa1Ear9NquemdXgmum4fvJ6w1lqsuDhNrg1qSpleJK7K3TF0Q2jSd94uSZ60kK1e3qyVpQK6PVWXp2/FC3mp6jBhKKOiY2h3gtUV64TWM6wDETRPLDfSakXmH3w8g9Jlug8ZtTt4kVF0kLUYYmCCtD/DrQ5YhMGbA9L3ucdjh0y8kOHW5gU/VEEmJTcL4Pz/f7mgoAbYkAAAAAElFTkSuQmCC&quot;]
    }
  ]
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llava&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-13T22:42:50.203334Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; The image features a cute, little pig with an angry facial expression. It&#39;s wearing a heart on its shirt and is waving in the air. This scene appears to be part of a drawing or sketching project.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;images&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1668506709&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1986209&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;359682000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;83&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1303285000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-ke3-chong2-xian4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;聊天请求（可重现输出） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;Hello!&quot;
    }
  ],
  &quot;options&quot;: {
    &quot;seed&quot;: 101,
    &quot;temperature&quot;: 0
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-12T14:13:43.416799Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello! How are you today?&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5191566416&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2154458&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;383809000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;298&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4799921000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liao2-tian1-qing3-qiu2-dai4-gong1-ju4&quot; tabindex=&quot;-1&quot;&gt;聊天请求（带工具） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [
    {
      &quot;role&quot;: &quot;user&quot;,
      &quot;content&quot;: &quot;What is the weather today in Paris?&quot;
    }
  ],
  &quot;stream&quot;: false,
  &quot;tools&quot;: [
    {
      &quot;type&quot;: &quot;function&quot;,
      &quot;function&quot;: {
        &quot;name&quot;: &quot;get_current_weather&quot;,
        &quot;description&quot;: &quot;Get the current weather for a location&quot;,
        &quot;parameters&quot;: {
          &quot;type&quot;: &quot;object&quot;,
          &quot;properties&quot;: {
            &quot;location&quot;: {
              &quot;type&quot;: &quot;string&quot;,
              &quot;description&quot;: &quot;The location to get the weather for, e.g. San Francisco, CA&quot;
            },
            &quot;format&quot;: {
              &quot;type&quot;: &quot;string&quot;,
              &quot;description&quot;: &quot;The format to return the weather in, e.g. &#39;&lt;/span&gt;celsius&lt;span class=&quot;token string&quot;&gt;&#39; or &#39;&lt;/span&gt;fahrenheit&lt;span class=&quot;token string&quot;&gt;&#39;&quot;,
              &quot;enum&quot;: [&quot;celsius&quot;, &quot;fahrenheit&quot;]
            }
          },
          &quot;required&quot;: [&quot;location&quot;, &quot;format&quot;]
        }
      }
    }
  ]
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-07-22T20:33:28.123648Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tool_calls&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;function&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;get_current_weather&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;arguments&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;celsius&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;location&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Paris, FR&quot;&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;stop&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;885095291&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3753500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;122&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;328493000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;33&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;eval_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;552222000&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;jia1-zai4-mo2-xing2-1&quot; tabindex=&quot;-1&quot;&gt;加载模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果消息数组为空，模型将被加载到内存中。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: []
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2024-09-12T21:17:29.110811Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;load&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;xie4-zai4-mo2-xing2-1&quot; tabindex=&quot;-1&quot;&gt;卸载模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;如果消息数组为空且 &lt;code&gt;keep_alive&lt;/code&gt; 参数设置为&lt;code&gt;0&lt;/code&gt;，模型将从内存中卸载。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/chat &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;,
  &quot;messages&quot;: [],
  &quot;keep_alive&quot;: 0
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3.2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;created_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2024-09-12T21:33:17.547535Z&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;content&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done_reason&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;unload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;chuang4-jian4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;创建模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/create&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从以下来源创建模型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;另一个模型；&lt;/li&gt;
&lt;li&gt;一个 safetensors 目录；或&lt;/li&gt;
&lt;li&gt;一个 GGUF 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果您从safetensors目录或GGUF文件创建模型，您必须为每个文件&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;创建一个blob&lt;/a&gt;，然后在&lt;code&gt;files&lt;/code&gt;字段中使用每个blob关联的文件名和SHA256摘要。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-2&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：要创建的模型的名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;from&lt;/code&gt;：（可选）用于创建新模型的现有模型的名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;files&lt;/code&gt;：（可选）一个文件名到blob的SHA256摘要的字典，用于创建模型&lt;/li&gt;
&lt;li&gt;&lt;code&gt;adapters&lt;/code&gt;：（可选）一个文件名到blob的SHA256摘要的字典，用于LORA适配器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template&lt;/code&gt;：（可选）模型的提示模板&lt;/li&gt;
&lt;li&gt;&lt;code&gt;license&lt;/code&gt;：（可选）包含模型许可证或许可证列表的字符串或字符串列表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system&lt;/code&gt;：（可选）包含模型系统提示的字符串&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parameters&lt;/code&gt;：（可选）模型的参数字典（有关参数列表，请参阅&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/modelfile.md&quot;&gt;Modelfile&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;messages&lt;/code&gt;：（可选）用于创建对话的消息对象列表&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;：（可选）如果为&lt;code&gt;false&lt;/code&gt;，则响应将作为单个响应对象返回，而不是对象流&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quantize&lt;/code&gt;（可选）：将非量化（例如float16）模型量化&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;liang2-hua4-lei4-xing2&quot; tabindex=&quot;-1&quot;&gt;量化类型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th style=&quot;text-align:center&quot;&gt;推荐&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;q2_K&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q3_K_L&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q3_K_M&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q3_K_S&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q4_0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q4_1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q4_K_M&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q4_K_S&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q5_0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q5_1&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q5_K_M&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q5_K_S&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q6_K&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;q8_0&lt;/td&gt;
&lt;td style=&quot;text-align:center&quot;&gt;*&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;shi4-li4-2&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;chuang4-jian4-xin1-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;创建新模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;从现有模型创建新模型。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/create &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;mario&quot;,
  &quot;from&quot;: &quot;llama3.2&quot;,
  &quot;system&quot;: &quot;You are Mario from Super Mario Bros.&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;reading model metadata&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;creating system layer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using already created layer sha256:22f7f8ef5f4c791c1b03d7eb414399294764d7cc82c7e94aa81a1feb80a983a2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using already created layer sha256:8c17c2ebb0ea011be9981cc3922db8ca8fa61e828c5d3f44cb6ae342bf80460b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using already created layer sha256:7c23fb36d80141c4ab8cdbb61ee4790102ebd2bf7aeff414453177d4f2110e5d&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using already created layer sha256:2e0493f67d0c8c9c68a8aeacdf6a38a2151cb3c4c1d42accf296e19810527988&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using already created layer sha256:2759286baa875dc22de5394b4a925701b1896a7e3f8e53275c36f75a877a82c9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing layer sha256:df30045fe90f0d750db82a058109cecd6d4de9c90a3d75b19c09e5f64580bb42&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing layer sha256:f18a68eb09bf925bb1b669490407c1b1251c5db98dc4d3d81f3088498ea55690&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing manifest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;liang2-hua4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;量化模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;量化非量化模型。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/create &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.1:quantized&quot;,
  &quot;from&quot;: &quot;llama3.1:8b-instruct-fp16&quot;,
  &quot;quantize&quot;: &quot;q4_K_M&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;quantizing F16 model to Q4_K_M&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;creating new layer sha256:667b0c1932bc6ffc593ed1d03f895bf2dc8dc6df21db3042284a6f4416b06a29&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using existing layer sha256:11ce4ee3e170f6adebac9a991c22e22ab3f8530e154ee669954c4bc73061c258&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using existing layer sha256:0ba8f0e314b4264dfd19df045cde9d4c394a52474bf92ed6a3de22a4ca31a177&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using existing layer sha256:56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;creating new layer sha256:455f34728c9b5dd3376378bfb809ee166c145b0b4c1f1a6feca069055066ef9a&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing manifest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;cong2-gguf-wen2-jian4-chuang4-jian4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;从GGUF文件创建模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;从GGUF文件创建模型。&lt;code&gt;files&lt;/code&gt;参数应填写您希望使用的GGUF文件的文件名和SHA256摘要。在调用此API之前，使用&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;/api/blobs/:digest&lt;/a&gt;将GGUF文件推送到服务器。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/create &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;my-gguf-model&quot;,
  &quot;files&quot;: {
    &quot;test.gguf&quot;: &quot;sha256:432f310a77f4650a88d0fd59ecdd7cebed8d684bafea53cbff0473542964f0c3&quot;
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;parsing GGUF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using existing layer sha256:432f310a77f4650a88d0fd59ecdd7cebed8d684bafea53cbff0473542964f0c3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing manifest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;cong2-safetensors-mu4-lu4-chuang4-jian4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;从Safetensors目录创建模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;files&lt;/code&gt;参数应包括safetensors模型的文件字典，包括每个文件的文件名和SHA256摘要。在调用此API之前，使用&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;/api/blobs/:digest&lt;/a&gt;首先将每个文件推送到服务器。文件将保留在缓存中，直到Ollama服务器重新启动。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/create &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;fred&quot;,
  &quot;files&quot;: {
    &quot;config.json&quot;: &quot;sha256:dd3443e529fb2290423a0c65c2d633e67b419d273f170259e27297219828e389&quot;,
    &quot;generation_config.json&quot;: &quot;sha256:88effbb63300dbbc7390143fbbdd9d9fa50587b37e8bfd16c8c90d4970a74a36&quot;,
    &quot;special_tokens_map.json&quot;: &quot;sha256:b7455f0e8f00539108837bfa586c4fbf424e31f8717819a6798be74bef813d05&quot;,
    &quot;tokenizer.json&quot;: &quot;sha256:bbc1904d35169c542dffbe1f7589a5994ec7426d9e5b609d07bab876f32e97ab&quot;,
    &quot;tokenizer_config.json&quot;: &quot;sha256:24e8a6dc2547164b7002e3125f10b415105644fcf02bf9ad8b674c87b1eaaed6&quot;,
    &quot;model.safetensors&quot;: &quot;sha256:1ff795ff6a07e6a68085d206fb84417da2f083f68391c2843cd2b8ac6df8538f&quot;
  }
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;converting model&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;creating new layer sha256:05ca5b813af4a53d2c2922933936e398958855c44ee534858fcfd830940618b6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using autodetected template llama3-instruct&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;using existing layer sha256:56bb8bd477a519ffa694fc449c2413c6f0e1d3b1c88fa7e3c9d88d3ae49d4dcb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;writing manifest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;jian3-cha2-blob-shi4-fou3-cun2-zai4&quot; tabindex=&quot;-1&quot;&gt;检查Blob是否存在 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;HEAD /api/blobs/:digest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保用于创建模型的文件blob（二进制大对象）存在于服务器上。这检查的是您的Ollama服务器，而不是ollama.com。&lt;/p&gt;
&lt;h3 id=&quot;cha2-xun2-can1-shu4&quot; tabindex=&quot;-1&quot;&gt;查询参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;digest&lt;/code&gt;：blob的SHA256摘要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-3&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-I&lt;/span&gt; http://localhost:11434/api/blobs/sha256:29fdb92e57cf0827ded04ae6461b5931d01fa595843f55d36f5b275a52087dd2&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;&lt;/div&gt;
&lt;p&gt;如果blob存在，则返回200 OK，如果不存在，则返回404 Not Found。&lt;/p&gt;
&lt;h2 id=&quot;tui1-song4-blob&quot; tabindex=&quot;-1&quot;&gt;推送 Blob &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/blobs/:digest&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将文件推送到Ollama服务器以创建一个&amp;quot;blob&amp;quot;（二进制大对象）。&lt;/p&gt;
&lt;h3 id=&quot;cha2-xun2-can1-shu4-1&quot; tabindex=&quot;-1&quot;&gt;查询参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;digest&lt;/code&gt;：文件的预期SHA256摘要&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-4&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-T&lt;/span&gt; model.gguf &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; POST http://localhost:11434/api/blobs/sha256:29fdb92e57cf0827ded04ae6461b5931d01fa595843f55d36f5b275a52087dd2&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;&lt;/div&gt;
&lt;p&gt;如果Blob成功创建，则返回201 Created，如果使用的摘要不符合预期，则返回400 Bad Request。&lt;/p&gt;
&lt;h2 id=&quot;lie4-chu1-ben3-di4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;列出本地模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;GET /api/tags&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列出可用的本地模型。&lt;/p&gt;
&lt;h3 id=&quot;shi4-li4-5&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/tags&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;models&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;codellama:13b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;modified_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-11-04T14:56:49.277302595-07:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;7365960935&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gguf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;family&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;families&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;parameter_size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;13B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;quantization_level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Q4_0&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama3:latest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;modified_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2023-12-07T09:32:18.757212583-08:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3825819519&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fe938a131f40e6f6d40083c9f0f430a515233eb2edaa6d72eb85c50d64f2300e&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gguf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;family&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;families&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token null keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;parameter_size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;7B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;quantization_level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Q4_0&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;xian3-shi4-mo2-xing2-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;显示模型信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/show&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;显示有关模型的信息，包括详细信息、modelfile、模板、参数、许可证和系统提示。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-3&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：要显示的模型的名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;verbose&lt;/code&gt;：（可选）如果设置为&lt;code&gt;true&lt;/code&gt;，则返回详细响应字段的完整数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-6&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/show &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;modelfile&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;# Modelfile generated by &quot;&lt;/span&gt;ollama show&lt;span class=&quot;token string&quot;&gt;&quot;&#92;n# To build a new Modelfile based on this one, replace the FROM line with:&#92;n# FROM llava:latest&#92;n&#92;nFROM /Users/matt/.ollama/models/blobs/sha256:200765e1283640ffbd013184bf496e261032fa75b99498a9613be4e94d63ad52&#92;nTEMPLATE &quot;&lt;/span&gt;&quot;&lt;span class=&quot;token string&quot;&gt;&quot;{{ .System }}&#92;nUSER: {{ .Prompt }}&#92;nASSISTANT: &quot;&lt;/span&gt;&quot;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nPARAMETER num_ctx 4096&#92;nPARAMETER stop &quot;&lt;/span&gt;&#92;u003c/s&#92;u003e&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nPARAMETER stop &quot;&lt;/span&gt;USER&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nPARAMETER stop &quot;&lt;/span&gt;ASSISTANT&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&quot;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;parameters&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;num_keep                       24&#92;nstop                           &quot;&lt;/span&gt;&amp;lt;|start_header_id|&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nstop                           &quot;&lt;/span&gt;&amp;lt;|end_header_id|&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;nstop                           &quot;&lt;/span&gt;&amp;lt;|eot_id|&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;template&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ if .System }}&amp;lt;|start_header_id|&gt;system&amp;lt;|end_header_id|&gt;&#92;n&#92;n{{ .System }}&amp;lt;|eot_id|&gt;{{ end }}{{ if .Prompt }}&amp;lt;|start_header_id|&gt;user&amp;lt;|end_header_id|&gt;&#92;n&#92;n{{ .Prompt }}&amp;lt;|eot_id|&gt;{{ end }}&amp;lt;|start_header_id|&gt;assistant&amp;lt;|end_header_id|&gt;&#92;n&#92;n{{ .Response }}&amp;lt;|eot_id|&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;parent_model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gguf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;family&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;families&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;parameter_size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;8.0B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;quantization_level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Q4_0&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model_info&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;general.architecture&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;general.file_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;general.parameter_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8030261248&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;general.quantization_version&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.attention.head_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.attention.head_count_kv&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.attention.layer_norm_rms_epsilon&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.00001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.block_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.context_length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8192&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.embedding_length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.feed_forward_length&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14336&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.rope.dimension_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.rope.freq_base&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;llama.vocab_size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.bos_token_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.eos_token_id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128009&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.merges&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;            &lt;span class=&quot;token comment&quot;&gt;// populates if `verbose=true`&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gpt2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.pre&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama-bpe&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.token_type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;        &lt;span class=&quot;token comment&quot;&gt;// populates if `verbose=true`&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tokenizer.ggml.tokens&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;             &lt;span class=&quot;token comment&quot;&gt;// populates if `verbose=true`&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fu4-zhi4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;复制模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/copy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制模型。从现有模型创建一个具有另一个名称的模型。&lt;/p&gt;
&lt;h3 id=&quot;shi4-li4-7&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/copy &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;source&quot;: &quot;llama3.2&quot;,
  &quot;destination&quot;: &quot;llama3-backup&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;响应&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果成功，则返回200 OK，如果源模型不存在，则返回404 Not Found。&lt;/p&gt;
&lt;h2 id=&quot;shan1-chu2-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;删除模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;DELETE /api/delete&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除模型及其数据。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-4&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：要删除的模型名称&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-8&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; DELETE http://localhost:11434/api/delete &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3:13b&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;响应&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果成功，则返回200 OK，如果待删除的模型不存在，则返回404 Not Found。&lt;/p&gt;
&lt;h2 id=&quot;la1-qu3-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;拉取模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/pull&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从ollama库下载模型。已取消的拉取将在上次停止的地方恢复，并且多个调用将共享相同的下载进度。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-5&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：要拉取的模型名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insecure&lt;/code&gt;：（可选）允许不安全的连接到库。仅在开发期间从您自己的库拉取时使用此选项。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;：（可选）如果设置为&lt;code&gt;false&lt;/code&gt;，则响应将作为单个响应对象返回，而不是对象流&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-9&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/pull &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;llama3.2&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;响应&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果未指定&lt;code&gt;stream&lt;/code&gt;，或设置为&lt;code&gt;true&lt;/code&gt;，则返回一系列JSON对象：&lt;/p&gt;
&lt;p&gt;第一个对象是清单：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pulling manifest&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后是一系列下载响应。在任何下载完成之前，可能不包括&lt;code&gt;completed&lt;/code&gt;键。要下载的文件数量取决于清单中指定的层数量。&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;downloading digestname&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;digestname&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2142590208&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;completed&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;241970&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在所有文件下载完成后，最终响应是：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;verifying sha256 digest&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;writing manifest&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;removing any unused layers&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果&lt;code&gt;stream&lt;/code&gt;设置为&lt;code&gt;false&lt;/code&gt;，则响应是单个JSON对象：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tui1-song4-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;推送模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/push&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将模型上传到模型库。首先需要在ollama.ai注册并添加公钥。&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-6&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：要推送的模型名称，格式为&lt;code&gt;&amp;lt;namespace&amp;gt;/&amp;lt;model&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insecure&lt;/code&gt;：（可选）允许不安全的连接到库。仅在开发期间向您的库推送时使用此选项。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream&lt;/code&gt;：（可选）如果设置为&lt;code&gt;false&lt;/code&gt;，则响应将作为单个响应对象返回，而不是对象流&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-10&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/push &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;mattw/pygmalion:latest&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;响应&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果未指定&lt;code&gt;stream&lt;/code&gt;，或设置为&lt;code&gt;true&lt;/code&gt;，则返回一系列JSON对象：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;retrieving manifest&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后是：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;starting upload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sha256:bc07c81de745696fdf5afca05e065818a8149fb0c77266fb584d9b2cba3711ab&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1928429856&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后是一系列上传响应：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;starting upload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;sha256:bc07c81de745696fdf5afca05e065818a8149fb0c77266fb584d9b2cba3711ab&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1928429856&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，在上传完成后：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pushing manifest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果&lt;code&gt;stream&lt;/code&gt;设置为&lt;code&gt;false&lt;/code&gt;，则响应是单个JSON对象：&lt;/p&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sheng1-cheng2-qian4-ru4&quot; tabindex=&quot;-1&quot;&gt;生成嵌入 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;POST /api/embed&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从模型生成嵌入&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-7&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：生成嵌入的模型名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt;：要生成嵌入的文本或文本列表&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;高级参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;truncate&lt;/code&gt;：截断每个输入的末尾以适应上下文长度。如果&lt;code&gt;false&lt;/code&gt;且超过上下文长度，则返回错误。默认为&lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;：&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/modelfile.md&quot;&gt;Modelfile&lt;/a&gt;文档中列出的其他模型参数，例如&lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keep_alive&lt;/code&gt;：控制模型在请求后保留在内存中的时间（默认：&lt;code&gt;5m&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;shi4-li4-11&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/embed &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;all-minilm&quot;,
  &quot;input&quot;: &quot;Why is the sky blue?&quot;
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;all-minilm&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;embeddings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;0.010071029&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.0017594862&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.05007221&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.04692972&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.054916814&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;0.008599704&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.105441414&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.025878139&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.12958129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031952348&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;total_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14143917&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;load_duration&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1019500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;prompt_eval_count&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;qing3-qiu2-duo1-ge4-shu1-ru4&quot; tabindex=&quot;-1&quot;&gt;请求（多个输入） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/embed &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;{
  &quot;model&quot;: &quot;all-minilm&quot;,
  &quot;input&quot;: [&quot;Why is the sky blue?&quot;, &quot;Why is the grass green?&quot;]
}&#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;xiang3-ying4&quot; tabindex=&quot;-1&quot;&gt;响应 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;all-minilm&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;embeddings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;0.010071029&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.0017594862&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.05007221&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.04692972&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.054916814&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;0.008599704&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.105441414&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.025878139&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.12958129&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.031952348&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;-0.0098027075&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.06042469&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.025257962&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.006364387&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.07272725&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;0.017194884&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.09032035&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;-0.051705178&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.09951512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.09072481&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lie4-chu1-yun4-xing2-zhong1-de-mo2-xing2&quot; tabindex=&quot;-1&quot;&gt;列出运行中的模型 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;GET /api/ps&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列出当前加载到内存中的模型。&lt;/p&gt;
&lt;h4 id=&quot;shi4-li4-12&quot; tabindex=&quot;-1&quot;&gt;示例 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;请求 &lt;/b&gt;curl&lt;/div&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; http://localhost:11434/api/ps&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;响应 &lt;/b&gt;json&lt;/div&gt;
&lt;pre class=&quot;language-json&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;models&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mistral:latest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mistral:latest&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5137025024&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;digest&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2ae6f6dd7a3dd734790bbbf58b8909a606e0e7e97e94b7604e0aa7ae4490e6d8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;details&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;parent_model&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;format&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;gguf&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;family&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;families&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token string&quot;&gt;&quot;llama&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;parameter_size&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;7.2B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;quantization_level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Q4_0&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;expires_at&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2024-06-04T14:38:31.83753-07:00&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;size_vram&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5137025024&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sheng1-cheng2-qian4-ru4-1&quot; tabindex=&quot;-1&quot;&gt;生成嵌入 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt;
&lt;p&gt;此端点已被&lt;code&gt;/api/embed&lt;/code&gt;取代&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;POST /api/embeddings
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从模型生成嵌入&lt;/p&gt;
&lt;h3 id=&quot;can1-shu4-8&quot; tabindex=&quot;-1&quot;&gt;参数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model&lt;/code&gt;：生成嵌入的模型名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt;：要生成嵌入的文本&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;高级参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;options&lt;/code&gt;：&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;Modelfile&lt;/a&gt;文档中列出的其他模型参数，例如&lt;code&gt;temperature&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keep_alive&lt;/code&gt;：控制模型在请求后保留在内存中的时间（默认：`5&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Markdown 一些不常见用法</title>
		<link href="https://www.dtking.cn/blog/markdown/"/>
		<updated>2024-12-30T05:40:36Z</updated>
		<id>https://www.dtking.cn/blog/markdown/</id>
		<content type="html">&lt;h3 id=&quot;lian4-jie1-shu3-biao1-xuan2-fu2-ti2-shi4&quot; tabindex=&quot;-1&quot;&gt;链接鼠标悬浮提示 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/markdown/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;给 &lt;code&gt;a&lt;/code&gt; 标签增加 &lt;code&gt;title&lt;/code&gt; 属性&lt;/p&gt;
&lt;pre class=&quot;language-md&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;span class=&quot;token url&quot;&gt;[&lt;span class=&quot;token content&quot;&gt;Visit dev.to&lt;/span&gt;](&lt;span class=&quot;token url&quot;&gt;https://dev.to/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Going to dev.to?&quot;&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/&quot; title=&quot;Going to dev.to?&quot;&gt;Visit dev.to&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;yin3-yong4-lian4-jie1&quot; tabindex=&quot;-1&quot;&gt;引用链接 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/markdown/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用引用链接&lt;/p&gt;
&lt;pre class=&quot;language-md&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;span class=&quot;token url-reference url&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;Google&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http://google.com/ &lt;span class=&quot;token string&quot;&gt;&quot;Google&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token url-reference url&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;example&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; http://example.com/ &lt;span class=&quot;token string&quot;&gt;(example)&lt;/span&gt;&lt;/span&gt;

这是 [Google][] ，这是 [example]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 &lt;a href=&quot;http://google.com/&quot; title=&quot;Google&quot;&gt;Google&lt;/a&gt; ，这是 &lt;a href=&quot;http://example.com/&quot; title=&quot;example&quot;&gt;example&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;zi4-dong4-lian4-jie1&quot; tabindex=&quot;-1&quot;&gt;自动链接 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/markdown/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-md&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&amp;lt;http://example.com/&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://example.com/&quot;&gt;http://example.com/&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>记录 TCP 数据包手动重组，Gzip 分块传输</title>
		<link href="https://www.dtking.cn/blog/tcp-data-reassembly/"/>
		<updated>2024-12-13T08:22:15Z</updated>
		<id>https://www.dtking.cn/blog/tcp-data-reassembly/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;字节数据 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;字节分析 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;编码解析 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;Gzip 文件结构 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;Header 结构 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;Compressed Data 结构 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;Trailer 结构 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;Gzip 数据格式是基于 &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc1952#page-6&quot;&gt;RFC 1952&lt;/a&gt; 标准的压缩文件格式&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;zi4-jie2-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;字节数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;72,84,84,80,47,49,46,49,32,50,48,48,32,13,10,86,97,114,121,58,32,111,114,105,103,105,110,44,97,99,99,101,115,115,45,99,111,110,116,114,111,108,45,114,101,113,117,101,115,116,45,109,101,116,104,111,100,44,97,99,99,101,115,115,45,99,111,110,116,114,111,108,45,114,101,113,117,101,115,116,45,104,101,97,100,101,114,115,44,97,99,99,101,112,116,45,101,110,99,111,100,105,110,103,13,10,67,111,110,116,101,110,116,45,69,110,99,111,100,105,110,103,58,32,103,122,105,112,13,10,67,111,110,116,101,110,116,45,84,121,112,101,58,32,97,112,112,108,105,99,97,116,105,111,110,47,106,115,111,110,13,10,84,114,97,110,115,102,101,114,45,69,110,99,111,100,105,110,103,58,32,99,104,117,110,107,101,100,13,10,68,97,116,101,58,32,84,117,101,44,32,49,48,32,68,101,99,32,50,48,50,52,32,48,52,58,50,50,58,53,54,32,71,77,84,13,10,13,10,97,13,10,31,139,8,0,0,0,0,0,0,0,13,10,50,48,48,13,10,164,86,71,207,172,202,17,253,47,223,150,39,193,144,134,121,150,23,77,206,67,78,59,6,24,114,206,88,254,239,230,190,43,203,242,194,43,35,181,186,40,85,151,84,167,235,156,174,127,252,204,107,146,100,243,252,243,231,50,173,217,31,63,237,109,199,121,246,243,231,207,207,31,63,73,159,222,22,242,199,207,148,205,107,179,220,206,52,94,226,63,203,246,142,128,171,33,255,219,39,158,51,18,255,3,126,85,48,14,128,105,215,145,108,229,128,6,57,184,255,238,29,176,48,186,211,44,0,185,64,231,137,64,155,185,72,239,137,204,152,185,194,210,166,206,130,89,101,233,218,230,118,202,21,173,254,43,22,72,124,7,228,50,131,119,18,35,205,210,177,39,10,155,12,42,11,14,157,53,17,241,76,8,195,201,79,131,193,47,157,85,127,231,54,235,59,223,126,231,201,117,214,202,79,201,218,11,173,146,206,255,111,169,240,14,128,197,0,80,1,161,102,129,45,1,80,112,52,56,56,26,166,76,32,238,191,234,115,105,96,114,191,22,248,207,199,49,96,55,249,187,86,137,49,123,245,87,236,98,221,238,156,99,193,46,113,96,119,249,251,192,237,224,95,192,148,110,92,76,139,182,164,66,115,57,129,123,240,5,125,202,7,207,42,116,29,115,146,132,40,199,110,121,54,242,5,181,134,202,103,158,215,10,95,36,161,96,245,141,92,38,189,98,247,136,238,132,216,155,173,73,19,177,120,171,78,37,219,29,28,143,247,124,239,81,68,126,171,215,145,31,117,177,208,140,9,102,61,210,46,197,179,96,100,11,201,23,10,188,148,203,65,113,26,217,247,27,162,140,218,81,169,6,197,111,7,178,28,198,73,185,22,213,71,151,103,73,172,247,245,28,90,32,28,84,37,159,139,234,60,244,192,127,188,170,8,93,197,18,135,156,134,88,191,61,153,77,7,181,25,200,235,251,193,32,163,35,127,227,115,99,178,115,255,198,231,119,201,255,19,31,238,23,62,204,29,196,210,32,249,141,143,41,99,127,197,30,28,71,219,220,65,23,50,237,154,105,145,88,90,169,245,156,196,115,138,213,127,68,154,177,181,203,221,128,23,118,170,197,20,97,173,191,185,134,178,254,194,168,189,17,27,13,10,50,48,48,13,10,148,202,69,245,43,39,222,181,206,89,110,36,218,92,163,184,15,203,243,154,52,244,189,161,138,4,175,141,208,98,136,59,29,73,131,8,203,196,134,204,251,55,87,132,177,88,74,173,82,15,111,183,137,226,160,149,219,184,31,223,245,16,199,221,168,180,227,60,189,145,229,19,99,171,218,146,251,108,112,71,242,17,79,173,83,144,197,112,31,233,39,64,245,46,198,87,163,38,178,79,71,190,187,241,191,240,121,245,128,5,218,205,13,201,186,235,3,198,206,98,167,39,212,149,50,41,148,101,80,49,136,68,34,175,94,10,119,230,190,78,128,11,151,233,35,175,217,173,162,172,14,106,180,38,182,229,67,210,22,62,127,62,192,233,237,76,82,137,242,75,75,94,219,215,232,252,229,203,195,123,213,99,21,67,34,162,203,183,149,210,111,109,128,53,76,140,97,130,145,24,141,219,84,251,238,214,236,59,99,119,45,7,47,190,252,94,117,93,166,121,196,25,205,249,209,170,14,24,98,146,112,98,53,116,211,225,200,17,90,138,141,34,139,181,111,100,65,172,53,78,37,10,166,177,137,93,14,96,103,254,190,13,118,59,38,74,128,228,197,89,116,37,102,160,229,83,148,67,174,63,153,105,68,250,157,247,236,73,75,137,107,183,233,238,113,154,44,105,87,253,105,247,229,194,121,183,184,244,180,36,19,87,30,193,91,68,64,67,15,100,217,173,109,131,181,63,162,194,203,82,177,178,9,65,86,134,40,202,134,192,62,134,58,121,94,65,118,52,117,193,40,12,31,78,16,37,139,134,40,239,171,71,208,71,253,160,168,76,124,105,198,113,80,126,124,164,241,148,5,115,86,196,142,56,207,170,143,165,33,193,177,115,218,157,181,214,218,163,190,190,173,107,1,144,11,216,24,18,179,129,172,112,9,82,218,30,102,99,27,135,30,113,130,84,122,216,58,4,90,8,198,27,168,95,53,23,164,165,6,92,22,157,26,152,109,144,97,124,132,247,3,243,58,5,217,148,90,156,54,218,211,100,156,156,234,110,30,85,18,46,190,149,148,160,62,232,183,179,25,91,22,2,34,199,149,121,251,116,200,65,194,85,183,217,215,185,203,162,132,28,193,135,219,218,149,209,158,230,219,76,190,249,13,10,50,48,48,13,10,247,156,136,23,28,33,109,140,205,27,63,147,71,107,30,37,146,140,34,74,129,139,163,96,167,19,191,131,73,191,64,17,62,51,11,139,241,200,147,212,70,252,74,226,136,25,18,128,86,154,116,29,173,182,37,106,158,123,78,105,173,22,64,20,208,196,52,207,160,36,235,113,210,37,56,247,210,223,147,114,158,82,79,139,9,43,147,196,81,117,8,108,44,121,166,110,156,190,225,46,165,199,213,23,115,35,125,249,236,81,233,43,90,206,193,169,175,87,75,100,10,159,120,77,68,1,174,1,43,3,125,102,76,187,37,172,65,150,48,51,44,36,180,78,34,156,126,190,222,108,53,38,119,119,24,205,202,84,35,87,105,227,115,175,158,12,227,202,71,37,189,222,73,135,224,248,203,232,182,61,162,140,212,135,84,111,134,203,238,88,38,15,127,12,122,163,234,106,138,120,55,243,164,235,153,14,22,15,57,159,92,97,14,193,169,128,154,166,120,12,113,9,86,4,7,251,137,7,252,67,153,193,156,246,149,182,60,195,128,155,62,81,231,201,160,80,149,177,120,176,90,119,54,111,163,147,62,6,15,196,177,57,18,70,47,4,190,137,77,92,25,203,252,179,102,249,125,171,119,171,11,9,126,121,101,173,140,135,219,152,246,112,14,18,41,10,111,227,210,85,147,6,117,186,215,131,188,2,42,74,150,37,214,34,176,107,10,163,165,108,55,178,176,191,117,78,176,152,200,101,111,232,208,110,105,64,245,126,226,206,178,106,231,188,151,160,101,169,87,93,30,38,99,122,28,203,209,73,71,187,245,171,9,217,59,20,135,208,71,49,214,105,69,169,175,83,56,85,71,190,70,138,95,55,86,67,135,239,162,156,152,48,144,114,130,9,5,181,200,106,230,15,49,221,216,15,180,104,195,42,246,176,17,48,25,164,81,8,136,224,99,121,56,14,204,109,229,115,191,62,25,255,36,31,219,203,147,21,217,136,156,222,22,82,132,179,179,112,3,251,30,86,106,194,159,25,176,2,68,164,13,173,166,235,166,204,61,180,187,181,115,10,217,148,63,181,136,184,138,68,20,239,238,178,215,132,210,191,172,177,119,248,103,195,83,15,121,154,200,146,90,30,3,136,174,105,168,45,209,184,155,146,13,10,50,48,48,13,10,194,221,3,214,19,90,21,114,125,163,254,91,58,158,196,253,178,43,135,188,31,146,160,31,97,66,72,199,245,100,114,150,32,33,246,129,197,25,189,113,112,137,237,7,94,111,234,215,153,250,82,99,98,50,10,113,145,26,90,90,136,244,65,74,108,229,164,146,169,166,18,247,185,19,210,86,126,95,253,229,190,50,100,193,241,69,159,117,42,236,196,171,191,95,223,5,161,182,152,153,248,146,33,167,174,241,62,162,195,103,27,36,109,197,11,207,168,0,142,162,141,19,58,43,240,136,143,34,61,86,62,197,209,72,71,109,118,86,8,154,192,223,233,16,226,100,247,110,238,88,35,86,241,4,153,160,243,37,32,208,45,220,33,97,63,45,240,60,131,147,93,163,210,182,191,107,205,117,146,128,36,33,0,116,218,20,77,93,7,33,81,53,40,208,223,60,45,104,212,216,203,111,230,27,208,207,52,97,54,0,163,31,67,141,157,195,224,80,66,108,108,204,147,61,92,129,73,76,162,159,226,6,223,114,111,12,193,24,28,12,21,198,4,238,230,51,130,24,251,45,82,88,18,148,231,40,20,30,122,75,148,185,34,243,168,216,251,219,78,162,160,112,46,76,84,191,52,182,211,227,150,63,173,197,105,30,35,86,233,216,168,42,198,44,37,31,188,174,212,222,199,162,221,182,110,2,226,0,165,96,61,7,226,48,100,196,252,244,209,252,38,69,232,66,46,43,29,33,80,76,254,90,232,99,117,163,11,17,191,200,68,83,41,201,170,248,12,137,237,66,26,161,99,27,201,57,65,36,54,26,93,93,37,198,76,191,145,48,170,209,95,210,252,162,203,181,179,137,216,185,26,95,19,124,125,166,181,58,18,195,78,18,197,224,54,232,163,29,234,175,113,206,30,151,187,124,195,70,71,7,117,52,172,228,236,14,227,42,100,232,34,50,153,62,165,146,68,122,196,122,70,134,20,250,250,224,19,51,175,164,35,67,209,28,166,182,61,152,20,190,91,29,205,80,244,151,2,197,115,199,240,123,175,88,252,126,95,88,97,234,220,39,99,147,51,33,203,71,106,93,124,196,38,28,159,34,33,16,129,139,147,20,108,111,253,247,224,169,183,193,116,229,228,186,219,18,32,25,19,167,94,168,13,10,100,99,13,10,75,69,44,19,247,152,65,71,181,164,134,12,254,139,235,71,217,47,60,36,124,243,109,191,146,51,88,170,190,25,171,162,110,124,155,184,180,208,110,109,193,26,24,187,184,174,154,75,105,242,238,225,137,84,226,235,25,88,233,36,166,29,145,107,185,136,189,12,10,122,188,123,160,124,68,161,182,27,87,0,190,250,45,157,26,30,29,203,50,1,89,150,101,14,134,201,178,22,169,174,164,33,213,158,190,68,4,198,221,42,174,235,2,157,42,37,187,117,206,154,218,107,110,89,4,219,212,210,111,111,27,199,64,120,190,36,3,217,37,4,11,49,236,59,9,29,43,138,2,4,65,103,181,121,16,175,113,112,69,35,196,47,88,114,25,65,123,7,40,152,125,140,48,110,193,253,212,89,39,242,60,15,88,242,215,9,3,126,213,127,191,199,247,165,188,167,249,37,110,135,159,63,31,79,12,163,16,156,120,146,56,138,254,243,95,0,0,0,255,255,13,10,97,13,10,3,0,150,174,235,139,246,11,0,0,13,10,48,13,10,13,10&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zi4-jie2-fen1-xi1&quot; tabindex=&quot;-1&quot;&gt;字节分析 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;关键信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#92;r&#92;n&#92;r&#92;n&lt;/code&gt; http 响应头和响应体结束分隔符号，字节对应 &lt;code&gt;13,10,13,10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;31,139&lt;/code&gt; 或 &lt;code&gt;0x1f,0x8B&lt;/code&gt; 标识 &lt;code&gt;Gzip&lt;/code&gt; 格式数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;48,13,10,13,10&lt;/code&gt; 分块传输结束标识&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;字节拆分分析：&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;72,84,84,80,47,49,46,49,32,50,48,48,32,&#92;r&#92;n, // header 信息
86,97,114,121,58,32,111,114,105,103,105,110,44,97,99,99,101,115,115,45,99,111,110,116,114,111,108,45,114,101,113,117,101,115,116,45,109,101,116,104,111,100,44,97,99,99,101,115,115,45,99,111,110,116,114,111,108,45,114,101,113,117,101,115,116,45,104,101,97,100,101,114,115,44,97,99,99,101,112,116,45,101,110,99,111,100,105,110,103,&#92;r&#92;n,
67,111,110,116,101,110,116,45,69,110,99,111,100,105,110,103,58,32,103,122,105,112,&#92;r&#92;n,
67,111,110,116,101,110,116,45,84,121,112,101,58,32,97,112,112,108,105,99,97,116,105,111,110,47,106,115,111,110,&#92;r&#92;n,
84,114,97,110,115,102,101,114,45,69,110,99,111,100,105,110,103,58,32,99,104,117,110,107,101,100,&#92;r&#92;n,
68,97,116,101,58,32,84,117,101,44,32,49,48,32,68,101,99,32,50,48,50,52,32,48,52,58,50,50,58,53,54,32,71,77,84,&#92;r&#92;n,&#92;r&#92;n,


97,&#92;r&#92;n, // 数据包大小
31,139,8,0,0,0,0,0,0,0,&#92;r&#92;n, // gzip 前十位标识位，31,139 标识是Gzip格式。数据包
50,48,48,&#92;r&#92;n, 
164,86,71,207,172,202,17,253,47,223,150,39,193,144,134,121,150,23,77,206,67,78,59,6,24,114,206,88,254,239,230,190,43,203,242,194,43,35,181,186,40,85,151,84,167,235,156,174,127,252,204,107,146,100,243,252,243,231,50,173,217,31,63,237,109,199,121,246,243,231,207,207,31,63,73,159,222,22,242,199,207,148,205,107,179,220,206,52,94,226,63,203,246,142,128,171,33,255,219,39,158,51,18,255,3,126,85,48,14,128,105,215,145,108,229,128,6,57,184,255,238,29,176,48,186,211,44,0,185,64,231,137,64,155,185,72,239,137,204,152,185,194,210,166,206,130,89,101,233,218,230,118,202,21,173,254,43,22,72,124,7,228,50,131,119,18,35,205,210,177,39,10,155,12,42,11,14,157,53,17,241,76,8,195,201,79,131,193,47,157,85,127,231,54,235,59,223,126,231,201,117,214,202,79,201,218,11,173,146,206,255,111,169,240,14,128,197,0,80,1,161,102,129,45,1,80,112,52,56,56,26,166,76,32,238,191,234,115,105,96,114,191,22,248,207,199,49,96,55,249,187,86,137,49,123,245,87,236,98,221,238,156,99,193,46,113,96,119,249,251,192,237,224,95,192,148,110,92,76,139,182,164,66,115,57,129,123,240,5,125,202,7,207,42,116,29,115,146,132,40,199,110,121,54,242,5,181,134,202,103,158,215,10,95,36,161,96,245,141,92,38,189,98,247,136,238,132,216,155,173,73,19,177,120,171,78,37,219,29,28,143,247,124,239,81,68,126,171,215,145,31,117,177,208,140,9,102,61,210,46,197,179,96,100,11,201,23,10,188,148,203,65,113,26,217,247,27,162,140,218,81,169,6,197,111,7,178,28,198,73,185,22,213,71,151,103,73,172,247,245,28,90,32,28,84,37,159,139,234,60,244,192,127,188,170,8,93,197,18,135,156,134,88,191,61,153,77,7,181,25,200,235,251,193,32,163,35,127,227,115,99,178,115,255,198,231,119,201,255,19,31,238,23,62,204,29,196,210,32,249,141,143,41,99,127,197,30,28,71,219,220,65,23,50,237,154,105,145,88,90,169,245,156,196,115,138,213,127,68,154,177,181,203,221,128,23,118,170,197,20,97,173,191,185,134,178,254,194,168,189,17,27,&#92;r&#92;n,

50,48,48,&#92;r&#92;n,
148,202,69,245,43,39,222,181,206,89,110,36,218,92,163,184,15,203,243,154,52,244,189,161,138,4,175,141,208,98,136,59,29,73,131,8,203,196,134,204,251,55,87,132,177,88,74,173,82,15,111,183,137,226,160,149,219,184,31,223,245,16,199,221,168,180,227,60,189,145,229,19,99,171,218,146,251,108,112,71,242,17,79,173,83,144,197,112,31,233,39,64,245,46,198,87,163,38,178,79,71,190,187,241,191,240,121,245,128,5,218,205,13,201,186,235,3,198,206,98,167,39,212,149,50,41,148,101,80,49,136,68,34,175,94,10,119,230,190,78,128,11,151,233,35,175,217,173,162,172,14,106,180,38,182,229,67,210,22,62,127,62,192,233,237,76,82,137,242,75,75,94,219,215,232,252,229,203,195,123,213,99,21,67,34,162,203,183,149,210,111,109,128,53,76,140,97,130,145,24,141,219,84,251,238,214,236,59,99,119,45,7,47,190,252,94,117,93,166,121,196,25,205,249,209,170,14,24,98,146,112,98,53,116,211,225,200,17,90,138,141,34,139,181,111,100,65,172,53,78,37,10,166,177,137,93,14,96,103,254,190,13,118,59,38,74,128,228,197,89,116,37,102,160,229,83,148,67,174,63,153,105,68,250,157,247,236,73,75,137,107,183,233,238,113,154,44,105,87,253,105,247,229,194,121,183,184,244,180,36,19,87,30,193,91,68,64,67,15,100,217,173,109,131,181,63,162,194,203,82,177,178,9,65,86,134,40,202,134,192,62,134,58,121,94,65,118,52,117,193,40,12,31,78,16,37,139,134,40,239,171,71,208,71,253,160,168,76,124,105,198,113,80,126,124,164,241,148,5,115,86,196,142,56,207,170,143,165,33,193,177,115,218,157,181,214,218,163,190,190,173,107,1,144,11,216,24,18,179,129,172,112,9,82,218,30,102,99,27,135,30,113,130,84,122,216,58,4,90,8,198,27,168,95,53,23,164,165,6,92,22,157,26,152,109,144,97,124,132,247,3,243,58,5,217,148,90,156,54,218,211,100,156,156,234,110,30,85,18,46,190,149,148,160,62,232,183,179,25,91,22,2,34,199,149,121,251,116,200,65,194,85,183,217,215,185,203,162,132,28,193,135,219,218,149,209,158,230,219,76,190,249,&#92;r&#92;n,

50,48,48,&#92;r&#92;n,
247,156,136,23,28,33,109,140,205,27,63,147,71,107,30,37,146,140,34,74,129,139,163,96,167,19,191,131,73,191,64,17,62,51,11,139,241,200,147,212,70,252,74,226,136,25,18,128,86,154,116,29,173,182,37,106,158,123,78,105,173,22,64,20,208,196,52,207,160,36,235,113,210,37,56,247,210,223,147,114,158,82,79,139,9,43,147,196,81,117,8,108,44,121,166,110,156,190,225,46,165,199,213,23,115,35,125,249,236,81,233,43,90,206,193,169,175,87,75,100,10,159,120,77,68,1,174,1,43,3,125,102,76,187,37,172,65,150,48,51,44,36,180,78,34,156,126,190,222,108,53,38,119,119,24,205,202,84,35,87,105,227,115,175,158,12,227,202,71,37,189,222,73,135,224,248,203,232,182,61,162,140,212,135,84,111,134,203,238,88,38,15,127,12,122,163,234,106,138,120,55,243,164,235,153,14,22,15,57,159,92,97,14,193,169,128,154,166,120,12,113,9,86,4,7,251,137,7,252,67,153,193,156,246,149,182,60,195,128,155,62,81,231,201,160,80,149,177,120,176,90,119,54,111,163,147,62,6,15,196,177,57,18,70,47,4,190,137,77,92,25,203,252,179,102,249,125,171,119,171,11,9,126,121,101,173,140,135,219,152,246,112,14,18,41,10,111,227,210,85,147,6,117,186,215,131,188,2,42,74,150,37,214,34,176,107,10,163,165,108,55,178,176,191,117,78,176,152,200,101,111,232,208,110,105,64,245,126,226,206,178,106,231,188,151,160,101,169,87,93,30,38,99,122,28,203,209,73,71,187,245,171,9,217,59,20,135,208,71,49,214,105,69,169,175,83,56,85,71,190,70,138,95,55,86,67,135,239,162,156,152,48,144,114,130,9,5,181,200,106,230,15,49,221,216,15,180,104,195,42,246,176,17,48,25,164,81,8,136,224,99,121,56,14,204,109,229,115,191,62,25,255,36,31,219,203,147,21,217,136,156,222,22,82,132,179,179,112,3,251,30,86,106,194,159,25,176,2,68,164,13,173,166,235,166,204,61,180,187,181,115,10,217,148,63,181,136,184,138,68,20,239,238,178,215,132,210,191,172,177,119,248,103,195,83,15,121,154,200,146,90,30,3,136,174,105,168,45,209,184,155,146,&#92;r&#92;n,

50,48,48,&#92;r&#92;n,
194,221,3,214,19,90,21,114,125,163,254,91,58,158,196,253,178,43,135,188,31,146,160,31,97,66,72,199,245,100,114,150,32,33,246,129,197,25,189,113,112,137,237,7,94,111,234,215,153,250,82,99,98,50,10,113,145,26,90,90,136,244,65,74,108,229,164,146,169,166,18,247,185,19,210,86,126,95,253,229,190,50,100,193,241,69,159,117,42,236,196,171,191,95,223,5,161,182,152,153,248,146,33,167,174,241,62,162,195,103,27,36,109,197,11,207,168,0,142,162,141,19,58,43,240,136,143,34,61,86,62,197,209,72,71,109,118,86,8,154,192,223,233,16,226,100,247,110,238,88,35,86,241,4,153,160,243,37,32,208,45,220,33,97,63,45,240,60,131,147,93,163,210,182,191,107,205,117,146,128,36,33,0,116,218,20,77,93,7,33,81,53,40,208,223,60,45,104,212,216,203,111,230,27,208,207,52,97,54,0,163,31,67,141,157,195,224,80,66,108,108,204,147,61,92,129,73,76,162,159,226,6,223,114,111,12,193,24,28,12,21,198,4,238,230,51,130,24,251,45,82,88,18,148,231,40,20,30,122,75,148,185,34,243,168,216,251,219,78,162,160,112,46,76,84,191,52,182,211,227,150,63,173,197,105,30,35,86,233,216,168,42,198,44,37,31,188,174,212,222,199,162,221,182,110,2,226,0,165,96,61,7,226,48,100,196,252,244,209,252,38,69,232,66,46,43,29,33,80,76,254,90,232,99,117,163,11,17,191,200,68,83,41,201,170,248,12,137,237,66,26,161,99,27,201,57,65,36,54,26,93,93,37,198,76,191,145,48,170,209,95,210,252,162,203,181,179,137,216,185,26,95,19,124,125,166,181,58,18,195,78,18,197,224,54,232,163,29,234,175,113,206,30,151,187,124,195,70,71,7,117,52,172,228,236,14,227,42,100,232,34,50,153,62,165,146,68,122,196,122,70,134,20,250,250,224,19,51,175,164,35,67,209,28,166,182,61,152,20,190,91,29,205,80,244,151,2,197,115,199,240,123,175,88,252,126,95,88,97,234,220,39,99,147,51,33,203,71,106,93,124,196,38,28,159,34,33,16,129,139,147,20,108,111,253,247,224,169,183,193,116,229,228,186,219,18,32,25,19,167,94,168,&#92;r&#92;n,

100,99,&#92;r&#92;n,
75,69,44,19,247,152,65,71,181,164,134,12,254,139,235,71,217,47,60,36,124,243,109,191,146,51,88,170,190,25,171,162,110,124,155,184,180,208,110,109,193,26,24,187,184,174,154,75,105,242,238,225,137,84,226,235,25,88,233,36,166,29,145,107,185,136,189,12,10,122,188,123,160,124,68,161,182,27,87,0,190,250,45,157,26,30,29,203,50,1,89,150,101,14,134,201,178,22,169,174,164,33,213,158,190,68,4,198,221,42,174,235,2,157,42,37,187,117,206,154,218,107,110,89,4,219,212,210,111,111,27,199,64,120,190,36,3,217,37,4,11,49,236,59,9,29,43,138,2,4,65,103,181,121,16,175,113,112,69,35,196,47,88,114,25,65,123,7,40,152,125,140,48,110,193,253,212,89,39,242,60,15,88,242,215,9,3,126,213,127,191,199,247,165,188,167,249,37,110,135,159,63,31,79,12,163,16,156,120,146,56,138,254,243,95,0,0,0,255,255,&#92;r&#92;n,

97,&#92;r&#92;n,
3,0,150,174,235,139,246,11,0,0,&#92;r&#92;n,

48,&#92;r&#92;n,&#92;r&#92;n // 发送 0 结束&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;分块传输的格式&lt;/strong&gt;： 每个分块都以十六进制表示大小，并以 &lt;code&gt;&#92;r&#92;n&lt;/code&gt; 结束。块数据后也会有 &lt;code&gt;&#92;r&#92;n&lt;/code&gt;，最后一个块的大小为 &lt;code&gt;0&lt;/code&gt;，表示数据结束。&lt;/p&gt;
&lt;h3 id=&quot;bian1-ma3-jie3-xi1&quot; tabindex=&quot;-1&quot;&gt;编码解析 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;go&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-go&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;package&lt;/span&gt; main

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;bytes&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;compress/gzip&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;fmt&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;io&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;os&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;strconv&quot;&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&quot;strings&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 解码 Chunked 数据&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decodeChunked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;byte&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 查找 HTTP 响应头 结束位置下标&lt;/span&gt;
	index &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;r&#92;n&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	header &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;index&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;header:&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;header&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 响应体 gzip 数据&lt;/span&gt;
	body &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;index&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 97 13 10&lt;/span&gt;

	i &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
	x &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; newByte &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;byte&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 数据包结束位置 &#92;rn 或 数据包大小结束位置 &#92;r&#92;n&lt;/span&gt;
		i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&#92;r&#92;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		x&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;
		blockData &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
		body &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; body&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
		i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 双数下标为字节数组、单数为描述字节包大小&lt;/span&gt;
			newByte &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;newByte&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; blockData&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blockData&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;blockData&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; newByte
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decompressGzip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 创建一个 bytes.Reader&lt;/span&gt;
	reader &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; bytes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NewReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 创建 gzip.Reader&lt;/span&gt;
	gzipReader&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; gzip&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;NewReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;reader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;解压失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;defer&lt;/span&gt; gzipReader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Close&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 解压数据&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; result bytes&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Buffer
	&lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Copy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; gzipReader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;nil&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;读取解压数据失败:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;func&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

	data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ReadFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tcp/bytes.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	split &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; strings&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; bytes &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;byte&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; s &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;range&lt;/span&gt; split &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		parseUint&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; strconv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ParseUint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		bytes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bytes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;parseUint&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	chunked &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decodeChunked&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	result &lt;span class=&quot;token operator&quot;&gt;:=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decompressGzip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;chunked&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	fmt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;Println&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解析结果：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;header:
 HTTP/1.1 &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; 
Vary: origin,access-control-request-method,access-control-request-headers,accept-encoding
Content-Encoding: &lt;span class=&quot;token function&quot;&gt;gzip&lt;/span&gt;
Content-Type: application/json
Transfer-Encoding: chunked
Date: Tue, &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; Dec &lt;span class=&quot;token number&quot;&gt;2024&lt;/span&gt; 04:22:56 GMT


&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;97&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;99&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dc&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;97&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; a
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;success&quot;&lt;/span&gt;:true,&lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;code&quot;&lt;/span&gt;:0,&lt;span class=&quot;token string&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAjAGkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3yVGkjKrK8RP8aAZH5gj9KEygWN5Az4JBxgkDvj8Rn+lMlaSJxIMtFg71AyVwCcjHJ9Mc9vfPnWtfF/wjo3jC60HUFmjKovmX3lCa33GPcPlUljwwUkDOeDwMgA9FifzkkidgZEPlybMjnAPHccEHjpnrxTJZ2iHlKJHkWPeXaMlTjHGQPvHngA/TsfOPDvxr8G+JtTtNKaC+tbhipgN7Crq0owFVSrMd5zwSBn1yQD6SjoySoitEVcodoBIJ5zgZ/vZ5+poAJJUkSPDSbHKFJIhuDc56jPHHJPGD1pkc7zXexlkhCKCFYr+8JHPHJwuV5Bxk188eH9MPxx8WaxdareXsehaTHssLW3dY5EDsdnykMmSqNuORztA+UADa+Hep6j4I+Kmo/DaS4+1ac0jNYmT52hGPOALfLgGItkAEeZyMAsSAe3FZ4opC9yGJQIm4BPmyQCTg8nKjpjI4HOKd58b2fnSCSJGX5g4Ksvbn0x6/jnvSzywJHI0xXbEvmuCM7QOQcfgfyr59/Z0ma3svFs6xmQxi0cqH28AzE8/TnHfpQB9AhY7eR3a4ZVILlHfIHq3PIA+uB6UTMkSI8ssoEKmRmA+8AMHdge+ceo46U5EUzNOrKyyIoBHcDJ65xjn0/PtgeLvENv4U8Najf3UZNtbwZiWKMgE/dWNjtZQGbaucHG/kADJANsCQSm5RpJI3QYhI2kcZ4B79ODjqcngAPluCjqEjMq7wj7CCUJxjI9Ocn0449PnvwZ8PdW+LVs/inxtrV41pNlLNLd0VmKkIz7dpRF+TbgKCxGTjALdd4a+Ec3hXxDbap4b8QXsdojMt7YXErbZnVJAhLKqh1DMnylOPnIbPFAHqlxcCNhGFlaQ4KqigbuegLfLnAPGc4zVikKqxUlQSpypI6HGOPzNLQBAkdwkpJuA8ZcttaMZAwMKCMdDnqD/WvnTXtQ0zSv2pmvdX8oWcUsJLSgFVc2iiNjngYcqdxxtxnIxmvouQ+Sw+aY+bKPuru28fThTjn69q8FuvDM2pftKy3Gp6Jc3Gh8tJLeWpaBlS12hmYjaV3qACe+M80AZ/xt1TT/Evi7wzbeF761v9VJKJPZToSGd0ESeYvAwwYjLcFyeARX0HBPMkBkligV2nCSMrYDdFyMZ5zhcHHTnHSuc8NfDPwn4bv4dV07Q0tdRVCA5nll8vcMEDc5GcHGR7+uK6uO2WOIx75GBQKxJwxIGNxYc5Ixz7CgD56+D13aeBvE/i3wx4kvLfTroiMCa6ZY4H8pmBGZNpIcSKy8crk8cU7w5Ivif9ozU9e0t44tNsN8YnHzoxEBt08vaCrFiC6rnlVbHTFev+Ivh94e8X/ZZvEGnRXV5bKI1uFd42ZN2SDsK5B54OdpY46nOl4e8PaL4c0r+y9G0+K0tY5S7RA7yXyDuZiSSfukEnIG0cYAABdlhlkkXY5jl2ANOFBGM8qoJOCfXB7dcCvA/2bPLaTxPE25HlS3VJV4K/63IB7Hv/AMBPpXqXxC8Ya54Ugs00Pwxda3cXiyqGhV2W3dQu0sqKSwOScZXhTz3HLfB3wBqvg7RtTl1q3jN3qLKPsIcb4kjLoW3ZwSRI3Q4A28/NgAHppe5s7W2gt7YYU+UDIxYAKQFztBxuUZz0Hf0rB8d6DL4s+Hmt6PYTSPcyr+63qPnkjcPsBO0YZk25zgZ9BiunS5aTzlWMGWNsBMkZHYnIHHXkZHBxmpkfPysVEgUFlDZxn+nB/KgDw/4L+PNH0rQW8L65dxaNe6Y829b4rCsu6TJ+ZsYdSSpQ84wRnBC8Bf8Ah7w34f8AjD4TsfDGrnU7CS6s5JJxdRzFZDcEFd0YAHAU468/SvofxF8OPCnirUUvtX0eCadVYNIhaJ5CQoBZkILYC4Gc4zxiotF+GfgvwzcyXtjolqjhklWS5zMYSmSGRpCShzzkEdB6CgDr6Kaz7XRdrHdn5gMgH39P8+1OoAKbHGkSlUGAWLfiTk/qTRRQA6iiigAprRRtIkjIpdM7WI5XPXB7UUUAN8iISmTyk8wkEttGSQMdfoSPxp5VWIJAJU5GR0PSiigBaKKKAGGNDMspHzqpUHPY4z/IUCGMOX2AsW35PODjbkenHFFFAD6KKKAP/9k=&quot;&lt;/span&gt;,&lt;span class=&quot;token string&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;:1733804576422&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;gzip-wen2-jian4-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;Gzip 文件结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Header 部分&lt;/strong&gt;&lt;br&gt;
定义了文件的基本信息，如压缩方法、时间戳和文件名等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compressed Data 部分&lt;/strong&gt;&lt;br&gt;
实际的压缩数据，使用 Deflate 算法编码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trailer 部分&lt;/strong&gt;&lt;br&gt;
包含 CRC 校验码和未压缩数据大小，用于验证完整性。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;header-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;Header 结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字节偏移&lt;/th&gt;
&lt;th&gt;长度 (字节)&lt;/th&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0-1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;ID1, ID2&lt;/td&gt;
&lt;td&gt;固定值  ID1 = &lt;code&gt;31 (0x1f, &#92;037)&lt;/code&gt;, ID2 = &lt;code&gt;139 (0x8b, &#92;213)&lt;/code&gt;，标识 Gzip 文件。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Compression Method&lt;/td&gt;
&lt;td&gt;压缩方法，固定值 &lt;code&gt;0x08&lt;/code&gt; 表示使用 Deflate 算法。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Flags&lt;/td&gt;
&lt;td&gt;标志位，用于指示是否包含额外字段、文件名、注释等。例如 &lt;code&gt;0x04&lt;/code&gt; 表示有额外字段，&lt;code&gt;0x08&lt;/code&gt; 表示包含文件名。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-7&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Modification Time&lt;/td&gt;
&lt;td&gt;文件最后修改时间，Unix 时间戳格式（从 1970-01-01 开始的秒数）。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Extra Flags&lt;/td&gt;
&lt;td&gt;与压缩算法相关的额外标志。0 表示无额外信息，2 表示最高压缩等级，4 表示最快压缩速度。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Operating System&lt;/td&gt;
&lt;td&gt;文件创建时的操作系统。例如 0 表示 FAT 文件系统，3 表示 Unix，255 表示未知操作系统。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;可变长度&lt;/td&gt;
&lt;td&gt;Extra Field&lt;/td&gt;
&lt;td&gt;根据 &lt;code&gt;Flags&lt;/code&gt; 设置的额外字段，格式自定义。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;可变长度&lt;/td&gt;
&lt;td&gt;File Name&lt;/td&gt;
&lt;td&gt;文件名字符串，以 NULL (&lt;code&gt;0x00&lt;/code&gt;) 结尾。如果标志位未设置，则省略该字段。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;可变长度&lt;/td&gt;
&lt;td&gt;Comment&lt;/td&gt;
&lt;td&gt;注释字符串，以 NULL (&lt;code&gt;0x00&lt;/code&gt;) 结尾。如果标志位未设置，则省略该字段。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可选&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Header CRC&lt;/td&gt;
&lt;td&gt;如果标志位设置了 &lt;code&gt;0x02&lt;/code&gt;，则包含此字段，用于校验 Header 的完整性。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;compressed-data-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;Compressed Data 结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这一部分是通过 &lt;strong&gt;Deflate 压缩算法&lt;/strong&gt;生成的压缩数据，具体格式由 Deflate 标准（RFC 1951）定义。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;trailer-jie2-gou4&quot; tabindex=&quot;-1&quot;&gt;Trailer 结构 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字节偏移&lt;/th&gt;
&lt;th&gt;长度 (字节)&lt;/th&gt;
&lt;th&gt;字段名称&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-8 至 -5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;CRC32&lt;/td&gt;
&lt;td&gt;未压缩数据的 CRC32 校验码，用于验证数据完整性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-4 至 -1&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;ISIZE&lt;/td&gt;
&lt;td&gt;未压缩数据的大小（以字节为单位，模 2^32）。如果数据大于 4 GB，存储的是数据大小的低 32 位。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
</content>
	</entry>
	
	<entry>
		<title>TCP 连接，三次握手，四次挥手</title>
		<link href="https://www.dtking.cn/blog/tcp-connection/"/>
		<updated>2024-12-10T07:59:29Z</updated>
		<id>https://www.dtking.cn/blog/tcp-connection/</id>
		<content type="html">&lt;h3 id=&quot;tcp-biao1-zhi4-wei4-zong3-jie2-biao3&quot; tabindex=&quot;-1&quot;&gt;TCP 标志位总结表 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-connection/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标志位&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;th&gt;常见场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SYN&lt;/td&gt;
&lt;td&gt;同步序列号&lt;/td&gt;
&lt;td&gt;TCP 三次握手，连接建立&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIN&lt;/td&gt;
&lt;td&gt;结束传输&lt;/td&gt;
&lt;td&gt;TCP 四次挥手，连接关闭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ACK&lt;/td&gt;
&lt;td&gt;确认&lt;/td&gt;
&lt;td&gt;确认数据包，握手与挥手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSH&lt;/td&gt;
&lt;td&gt;推送数据&lt;/td&gt;
&lt;td&gt;即时交付给应用层，实时传输&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RST&lt;/td&gt;
&lt;td&gt;重置连接&lt;/td&gt;
&lt;td&gt;异常终止连接或拒绝请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URG&lt;/td&gt;
&lt;td&gt;紧急数据&lt;/td&gt;
&lt;td&gt;处理带外数据（较少使用）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;san1-ci4-wo4-shou3&quot; tabindex=&quot;-1&quot;&gt;三次握手 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-connection/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A:192.168.0.18&lt;br&gt;
B:192.168.0.109&lt;/p&gt;
&lt;p&gt;第一次握手（A）--&amp;gt;（B）；&lt;code&gt;SYN=true&lt;/code&gt;：发起连接&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.18 --&gt; 192.168.0.109
序列号: 1534555792
确认号: 0
标志位: SYN=true, ACK=false, FIN=false, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二次握手（B）--&amp;gt;（A）；确认号:第一次序列号+1，&lt;code&gt;SYN=true&lt;/code&gt;, &lt;code&gt;ACK=true&lt;/code&gt;：确认同意连接&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.109 --&gt; 192.168.0.18
序列号: 1523651839
确认号: 1534555793
标志位: SYN=true, ACK=true, FIN=false, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三次握手（A）--&amp;gt;（B）；确认号:第二次序列号+1，&lt;code&gt;ACK=true&lt;/code&gt;:确认连接&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.18 --&gt; 192.168.0.109
序列号: 1534555793
确认号: 1523651840
标志位: SYN=false, ACK=true, FIN=false, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;si4-ci4-hui1-shou3&quot; tabindex=&quot;-1&quot;&gt;四次挥手 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-connection/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;任何一方（客户端或服务器）都可以发起关闭连接的请求&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第一次挥手（B）--&amp;gt;（A）；&lt;code&gt;ACK=true&lt;/code&gt;, &lt;code&gt;FIN=true&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.109 --&gt; 192.168.0.18
序列号: 3597518325
确认号: 1577851197
标志位: SYN=false, ACK=true, FIN=true, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二次挥手（A）--&amp;gt;（B）；&lt;code&gt;ACK=true	&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.18 --&gt; 192.168.0.109
序列号: 1577851197
确认号: 3597518326
标志位: SYN=false, ACK=true, FIN=false, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第三次挥手（A）--&amp;gt;（B）；&lt;code&gt;ACK=true&lt;/code&gt;, &lt;code&gt;FIN=true&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.18 --&gt; 192.168.0.109
序列号: 1577851197
确认号: 3597518326
标志位: SYN=false, ACK=true, FIN=true, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第四次挥手（B）--&amp;gt;（A）；&lt;code&gt;ACK=true&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.0.109 --&gt; 192.168.0.18
序列号: 3597518326
确认号: 1577851198
标志位: SYN=false, ACK=true, FIN=false, RST=false, PSH=false, URG=false&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;tu2-shi4&quot; tabindex=&quot;-1&quot;&gt;图示 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/tcp-connection/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;三次握手&lt;/th&gt;
&lt;th&gt;四次挥手&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/iHRHHuRjnH-366.avif 366w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/iHRHHuRjnH-366.webp 366w&quot;&gt;&lt;img alt=&quot;三次握手&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/iHRHHuRjnH-366.png&quot; width=&quot;366&quot; height=&quot;509&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/pPhKWK1mvc-366.avif 366w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/pPhKWK1mvc-366.webp 366w&quot;&gt;&lt;img alt=&quot;四次挥手&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/pPhKWK1mvc-366.png&quot; width=&quot;366&quot; height=&quot;608&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content>
	</entry>
	
	<entry>
		<title>自签浏览器授信 CA 证书</title>
		<link href="https://www.dtking.cn/blog/custom-ssl-v3/"/>
		<updated>2024-12-03T01:28:56Z</updated>
		<id>https://www.dtking.cn/blog/custom-ssl-v3/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;主题备用名称（SAN）说明： &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;1.创建一个 OpenSSL 配置文件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;2.生成自签证书 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;3.检查证书 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;4.导入证书到浏览器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;总结： &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;em&gt;此服务器无法证实它就是 &lt;code&gt;127.0.0.1&lt;/code&gt; - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;自签 &lt;code&gt;SSL&lt;/code&gt; 证书浏览器不授信，提示连接&lt;strong&gt;不安全&lt;/strong&gt;解决办法，自签证书时增加 &lt;code&gt;SAN&lt;/code&gt; 信息，将证书添加到&lt;code&gt;受信任的根证书颁发机构&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置前&lt;/th&gt;
&lt;th&gt;访问拦截&lt;/th&gt;
&lt;th&gt;配置后&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/vIU7QmWKXW-334.avif 334w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/vIU7QmWKXW-334.webp 334w&quot;&gt;&lt;img alt=&quot;配置前SSL&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/vIU7QmWKXW-334.png&quot; width=&quot;334&quot; height=&quot;452&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/P10YD5sViy-640.avif 640w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/P10YD5sViy-640.webp 640w&quot;&gt;&lt;img alt=&quot;访问拦截&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/P10YD5sViy-640.png&quot; width=&quot;640&quot; height=&quot;544&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;td&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/bDNkFznkIq-334.avif 334w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/bDNkFznkIq-334.webp 334w&quot;&gt;&lt;img alt=&quot;配置后SSL&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/bDNkFznkIq-334.png&quot; width=&quot;334&quot; height=&quot;358&quot;&gt;&lt;/picture&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;zhu3-ti2-bei4-yong4-ming2-cheng1-san-shuo1-ming2&quot; tabindex=&quot;-1&quot;&gt;主题备用名称（SAN）说明： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主题备用名称&lt;/strong&gt; 是证书的扩展字段，它允许证书支持多个域名或 IP 地址。对于自签证书，如果你希望它能够适用于 127.0.0.1 或 localhost，你需要在生成证书时指定这个 IP 地址或主机名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题根源&lt;/strong&gt;：自签证书通常只会将证书的 Common Name (CN) 字段设置为一个值（如 localhost 或 127.0.0.1），但在现代浏览器中，浏览器更偏向于检查 SAN 字段，以确保安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-chuang4-jian4-yi2-ge4-openssl-pei4-zhi4-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;1.创建一个 OpenSSL 配置文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;配置文件 &lt;/b&gt;openssl.ini&lt;/div&gt;
&lt;pre class=&quot;language-ini&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-ini&quot;&gt;
&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token section-name selector&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;default_bits&lt;/span&gt;        &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;2048&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;default_keyfile&lt;/span&gt;     &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;privkey.pem&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;distinguished_name&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;req_distinguished_name&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;req_extensions&lt;/span&gt;      &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;v3_req    # 指定请求使用 v3_req 扩展&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;prompt&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;no          # 不提示输入&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token section-name selector&quot;&gt;req_distinguished_name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;C&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;US&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;ST&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;California&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;L&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;San Francisco&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;O&lt;/span&gt;  &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;My Company&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;OU&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;My Department&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;CN&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;localhost&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;emailAddress&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;admin@mycompany.com&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token section-name selector&quot;&gt;v3_req&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;subjectAltName&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;@alt_names   # 引用 alt_names&lt;/span&gt;

&lt;span class=&quot;token section&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token section-name selector&quot;&gt;alt_names&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;DNS.1&lt;/span&gt;   &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;localhost&lt;/span&gt;
&lt;span class=&quot;token key attr-name&quot;&gt;IP.1&lt;/span&gt;    &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token value attr-value&quot;&gt;127.0.0.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;配置文件说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[ req_distinguished_name ]&lt;/strong&gt; 部分：定义了证书的基本信息，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C：国家&lt;/li&gt;
&lt;li&gt;ST：省份&lt;/li&gt;
&lt;li&gt;L：城市&lt;/li&gt;
&lt;li&gt;O：组织&lt;/li&gt;
&lt;li&gt;OU：单位&lt;/li&gt;
&lt;li&gt;CN：常见名称&lt;/li&gt;
&lt;li&gt;emailAddress：电子邮件地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[ v3_req ]&lt;/strong&gt;：这里指定了扩展字段 &lt;code&gt;subjectAltName&lt;/code&gt;，并引用了 &lt;code&gt;alt_names&lt;/code&gt; 部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[ alt_names ]&lt;/strong&gt;：定义了备用名称，&lt;code&gt;DNS.1&lt;/code&gt; 是域名，&lt;code&gt;IP.1&lt;/code&gt; 是 IP 地址。这里包括 &lt;code&gt;localhost&lt;/code&gt; 和 &lt;code&gt;127.0.0.1&lt;/code&gt;，这样证书会为这两个名称生效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-sheng1-cheng2-zi4-qian1-zheng4-shu1&quot; tabindex=&quot;-1&quot;&gt;2.生成自签证书 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用这个配置文件来生成证书和私钥：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl req &lt;span class=&quot;token parameter variable&quot;&gt;-x509&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-nodes&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-days&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;365&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-newkey&lt;/span&gt; rsa:2048 &lt;span class=&quot;token parameter variable&quot;&gt;-keyout&lt;/span&gt; private.key &lt;span class=&quot;token parameter variable&quot;&gt;-out&lt;/span&gt; certificate.crt &lt;span class=&quot;token parameter variable&quot;&gt;-config&lt;/span&gt; ./openssl.ini &lt;span class=&quot;token parameter variable&quot;&gt;-extensions&lt;/span&gt; v3_req&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令会生成一个包含 &lt;strong&gt;主题备用名称（SAN）&lt;/strong&gt; 的自签证书。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;days 365&lt;/code&gt;：指定证书的有效期为 365 天。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodes&lt;/code&gt;：表示不使用密码保护私钥。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;newkey rsa:2048&lt;/code&gt;：生成一个新的 2048 位 RSA 密钥对。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keyout private.key&lt;/code&gt;：指定私钥的输出文件名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;out certificate.crt&lt;/code&gt;：指定证书的输出文件名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config openssl.ini&lt;/code&gt;：指定自定义的 OpenSSL 配置文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;extensions v3_req&lt;/code&gt;：指定证书包含 SAN 扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-jian3-cha2-zheng4-shu1&quot; tabindex=&quot;-1&quot;&gt;3.检查证书 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;你可以使用工具如 &lt;a href=&quot;https://www.openssl.org/&quot;&gt;OpenSSL&lt;/a&gt; 或浏览器的证书查看器来验证生成的证书是否包含正确的 &lt;strong&gt;SAN&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;openssl&lt;/code&gt; 命令查看证书：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl x509 &lt;span class=&quot;token parameter variable&quot;&gt;-in&lt;/span&gt; certificate.crt &lt;span class=&quot;token parameter variable&quot;&gt;-text&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-noout&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保在证书信息中可以看到类似下面的部分：&lt;/p&gt;
&lt;pre class=&quot;language-less&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-less&quot;&gt;X509v3 &lt;span class=&quot;token property&quot;&gt;extensions&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
	X509v3 Subject Alternative &lt;span class=&quot;token property&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
		&lt;span class=&quot;token property&quot;&gt;DNS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;localhost&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; IP &lt;span class=&quot;token property&quot;&gt;Address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;127.0.0.1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不包含以上内容，请更新 &lt;code&gt;openssl&lt;/code&gt; 重新生成，否则浏览器还是会提示：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;此服务器无法证实它就是 127.0.0.1 - 它的安全证书没有指定&lt;strong&gt;主题备用名称&lt;/strong&gt;。这可能是因为某项配置有误或某个攻击者拦截了您的连接&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;4-dao3-ru4-zheng4-shu1-dao4-liu2-lan3-qi4&quot; tabindex=&quot;-1&quot;&gt;4.导入证书到浏览器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;双击 &lt;code&gt;certificate.crt&lt;/code&gt; 安装
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装证书&lt;/strong&gt;：-&amp;gt; &lt;strong&gt;本计算机&lt;/strong&gt; -&amp;gt; &lt;strong&gt;将所有的证书都放入下列存储&lt;/strong&gt; -&amp;gt; &lt;strong&gt;浏览&lt;/strong&gt; -&amp;gt; &lt;code&gt;受信任的根证书颁发机构&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;退出浏览器后台（不是关闭标签页）&lt;/li&gt;
&lt;li&gt;重新打开访问对应网站&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;谷歌浏览器导入
&lt;ol&gt;
&lt;li&gt;打开 Chrome 浏览器，进入 &lt;code&gt;chrome://certificate-manager/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;选择“本地证书”，管理从 Windows 导入的证书。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;受信任的根证书颁发机构&lt;/code&gt; 标签页下，点击“导入”。&lt;/li&gt;
&lt;li&gt;选择你生成的自签证书 certificate.crt，然后将其添加到受信任的根证书库中。&lt;/li&gt;
&lt;li&gt;重启浏览器&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;总结： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;浏览器警告的原因是自签证书没有设置主题备用名称（SAN）。要解决这个问题，生成自签证书时需要指定 SAN，确保包括你打算访问的主机名或 IP 地址（如 &lt;code&gt;localhost&lt;/code&gt; 和 &lt;code&gt;127.0.0.1&lt;/code&gt;）。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>自签 SSL 证书</title>
		<link href="https://www.dtking.cn/blog/custom-ssl/"/>
		<updated>2024-12-02T13:39:41Z</updated>
		<id>https://www.dtking.cn/blog/custom-ssl/</id>
		<content type="html">&lt;ul&gt;
&lt;li&gt;key 私钥  = 明文--自己生成（genrsa ）&lt;/li&gt;
&lt;li&gt;csr 公钥  = 由私钥生成&lt;/li&gt;
&lt;li&gt;crt  证书  = 公钥 + 签名（自签名或者由CA签名）&lt;/li&gt;
&lt;li&gt;需要安装 openssl&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;zheng4-shu1-sheng1-cheng2&quot; tabindex=&quot;-1&quot;&gt;证书生成 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;生成私钥，需要输入密码两次 12345678 （随便输）&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;openssl genrsa &lt;span class=&quot;token parameter variable&quot;&gt;-des3&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-out&lt;/span&gt; server.pass.key &lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成私钥 &lt;code&gt;server.key&lt;/code&gt; 输入上面的密码&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;openssl rsa &lt;span class=&quot;token parameter variable&quot;&gt;-in&lt;/span&gt; server.pass.key &lt;span class=&quot;token parameter variable&quot;&gt;-out&lt;/span&gt; server.key&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建公钥&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;openssl req &lt;span class=&quot;token parameter variable&quot;&gt;-new&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-key&lt;/span&gt; server.key &lt;span class=&quot;token parameter variable&quot;&gt;-out&lt;/span&gt; server.csr &lt;span class=&quot;token parameter variable&quot;&gt;-subj&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/C=CN/ST=Beijing/L=Beijing/O=dev/OU=dev/CN=127.0.0.1&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成证书 &lt;code&gt;days&lt;/code&gt; 后面指定天数&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;openssl x509 &lt;span class=&quot;token parameter variable&quot;&gt;-req&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-days&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;365&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-in&lt;/span&gt; server.csr &lt;span class=&quot;token parameter variable&quot;&gt;-signkey&lt;/span&gt; server.key &lt;span class=&quot;token parameter variable&quot;&gt;-out&lt;/span&gt; server.crt&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看证书&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;openssl x509 &lt;span class=&quot;token parameter variable&quot;&gt;-in&lt;/span&gt; server.crt &lt;span class=&quot;token parameter variable&quot;&gt;-noout&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-text&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;nginx-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;nginx 配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;server.crt&lt;/code&gt; 和 &lt;code&gt;server.key&lt;/code&gt; 文件拷贝之 nginx 下创建 ssl 文件中，如下配置重启 nginx 即可&lt;/li&gt;
&lt;li&gt;安装Nginx时使用了 &lt;code&gt;–with-http_ssl_module&lt;/code&gt;参数（Linux）&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;server&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;listen&lt;/span&gt;       &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt; ssl&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ssl_certificate&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;D:/dev/nginx/ssl/server.crt&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ssl_certificate_key&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;D:/dev/nginx/ssl/server.key&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	 
	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt; /404.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; = /40x.html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

	   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;502&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;503&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;504&lt;/span&gt; /50x.html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		   &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; = /50x.html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
   &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;kuo4-zhan3-xin4-xi1&quot; tabindex=&quot;-1&quot;&gt;扩展信息 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/custom-ssl/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;公用名称 (Common Name) 简称：CN 字段，对于 SSL 证书，一般为网站域名或IP地址；而对于代码签名证书则为申请单位名称；而对于客户端证书则为证书申请者的姓名；&lt;/li&gt;
&lt;li&gt;单位名称 (Organization Name) ：简称：O 字段，对于 SSL 证书，一般为网站域名；而对于代码签名证书则为申请单位名称；而对于客户端单位证书则为证书申请者所在单位名称；&lt;/li&gt;
&lt;li&gt;组织单位 (organizational unit)：简称：OU 字段 同上&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;证书申请单位所在地：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所在城市 (Locality) 简称：L 字段&lt;/li&gt;
&lt;li&gt;所在省份 (State/Provice) 简称：S 字段&lt;/li&gt;
&lt;li&gt;所在国家 (Country) 简称：C 字段，只能是国家字母缩写，如中国：CN&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;在线生成工具&lt;/strong&gt; &lt;a href=&quot;https://myssl.com/csr_create.html&quot;&gt;https://myssl.com/csr_create.html&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Javascript Arrary 解构 扩散运算</title>
		<link href="https://www.dtking.cn/blog/JavaScrip-array/"/>
		<updated>2024-11-28T09:52:46Z</updated>
		<id>https://www.dtking.cn/blog/JavaScrip-array/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;删除 Array 元素 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;delete &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;splice &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;Array 求和 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;基本类型数组 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;对象类型数组 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;解构赋值 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;shan1-chu2-array-yuan2-su4&quot; tabindex=&quot;-1&quot;&gt;删除 Array 元素 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;delete&quot; tabindex=&quot;-1&quot;&gt;delete &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;删除一个数组元素时，数组的长度（&lt;code&gt;length&lt;/code&gt;）不受影响&lt;/li&gt;
&lt;li&gt;删除元素变成了 &lt;strong&gt;&amp;quot;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections#%E7%A8%80%E7%96%8F%E6%95%B0%E7%BB%84&quot;&gt;空槽&lt;/a&gt;&amp;quot;&lt;/strong&gt; （有时称为“稀疏数组”）。&lt;/li&gt;
&lt;li&gt;使用迭代器遍历数组，空槽是被跳过，&lt;/li&gt;
&lt;li&gt;普通的 for 循环输出 &lt;code&gt;undefined&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;delete&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 空白&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--------forEach--------&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--------for--------&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;forEach&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;splice&quot; tabindex=&quot;-1&quot;&gt;splice &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;splice&lt;/code&gt; 数组长度发生变化，对应元素被删除&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
list&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;splice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;array-qiu2-he2&quot; tabindex=&quot;-1&quot;&gt;Array 求和 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;accumulator&lt;/code&gt;：累加器&lt;br&gt;
&lt;code&gt;currentValue&lt;/code&gt;：当前值或对象&lt;br&gt;
&lt;code&gt;0&lt;/code&gt;：初始值&lt;/p&gt;
&lt;h3 id=&quot;ji1-ben3-lei4-xing2-shu4-zu3&quot; tabindex=&quot;-1&quot;&gt;基本类型数组 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; basicTypeArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; basicSum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; basicTypeArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;accumulator&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; accumulator &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; currentValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;basicSum: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;basicSum&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; basicSum&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dui4-xiang4-lei4-xing2-shu4-zu3&quot; tabindex=&quot;-1&quot;&gt;对象类型数组 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; objectTypeArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;a&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;b&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;c&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;d&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; objectSum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; objectTypeArray&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;accumulator&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; accumulator &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; currentValue&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;objectSum: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;objectSum&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;objectSum&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;jie3-gou4-fu4-zhi2&quot; tabindex=&quot;-1&quot;&gt;解构赋值 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;解构赋值是一种从数组或对象中提取一系列值并将它们分配给一组标识符的简洁方法，有时称为“解包”原始数据结构的过程，尽管它不会修改原始数组或对象。&lt;/p&gt;
&lt;p&gt;解构赋值使用数组或类似对象的标识符列表来跟踪值。最简单的形式称为绑定模式解构，每个值都从数组或对象中解压出来并分配给相应的变量，并使用 let 或 const （或 var）进行初始化：&lt;/p&gt;
&lt;p&gt;使用花括号 (&lt;code&gt;{}&lt;/code&gt;) 来解构对象，使用方括号 (&lt;code&gt;[]&lt;/code&gt;) 来解构数组。&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myObject &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;firstValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;secondValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; myProp&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mySecondProp &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myObject&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; Uncaught TypeError&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; myObject is not iterable

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; myElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mySecondElement &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myArray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

myElement
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;

mySecondElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数组的解构按顺序进行，从左到右。解构赋值中的每个标识符对应于具有相同索引的数组元素：&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myArray &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; myElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mySecondElement&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; myThirdElement &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myArray&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

myElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

mySecondElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

myThirdElement&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这也是解构对象时的默认行为。但是，如果解构赋值中使用的标识符与对象属性的键匹配，则无论指定顺序如何，这些标识符都会填充相应的属性值：&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myObject &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;firstValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;secondValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;thirdValue&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; secondValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; thirdValue&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; firstValue &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; myObject&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

firstValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

secondValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;

thirdValue&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Nginx location，proxy_pass，sse 等指令常见问题</title>
		<link href="https://www.dtking.cn/blog/nginx-location/"/>
		<updated>2024-11-21T08:13:31Z</updated>
		<id>https://www.dtking.cn/blog/nginx-location/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;location &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;斜杠结尾 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;没有斜杠 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;官方解释 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;总结 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;proxy_pass 代理 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;不加斜杠 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;添加斜杠 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;总结 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;代理 SSE 接口 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;location&quot; tabindex=&quot;-1&quot;&gt;location &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;location&lt;/code&gt; 配置以斜杠结尾和不以斜杠结尾的区别&lt;/p&gt;
&lt;h3 id=&quot;xie2-gang4-jie2-wei3&quot; tabindex=&quot;-1&quot;&gt;斜杠结尾 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;状态：&lt;code&gt;301 Moved Permanently&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重定向： &lt;code&gt;http://127.0.0.1:80/law/&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /law/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;mei2-you3-xie2-gang4&quot; tabindex=&quot;-1&quot;&gt;没有斜杠 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;状态：&lt;code&gt;404 Not Found&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;未重定向&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /law&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;guan1-fang1-jie3-shi4&quot; tabindex=&quot;-1&quot;&gt;官方解释 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果一个 &lt;code&gt;location&lt;/code&gt; 由以斜线字符结尾的前缀字符串定义，并且请求由 &lt;code&gt;proxy_pass&lt;/code&gt;、&lt;code&gt;fastcgi_pass&lt;/code&gt;、&lt;code&gt;uwsgi_pass&lt;/code&gt;、&lt;code&gt;scgi_pass&lt;/code&gt;、&lt;code&gt;memcached_pass&lt;/code&gt; 或 &lt;code&gt;grpc_pass&lt;/code&gt; 之一处理，则执行特殊处理。对于 URI 等于此字符串但没有尾随斜线的请求，将返回一个带有代码 &lt;strong&gt;301&lt;/strong&gt; 的永久重定向到所请求的 URI，并附加斜线。如果不希望这样，可以这样定义 URI 和位置的精确匹配：&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /user/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://user.example.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; = /user&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://login.example.com&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;配置文件结尾加了斜杠，访问时就应该加上斜杠访问，否则 &lt;code&gt;URL&lt;/code&gt; 地址会被重定向一次。&lt;/p&gt;
&lt;h2 id=&quot;proxypass-dai4-li3&quot; tabindex=&quot;-1&quot;&gt;proxy_pass 代理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass&quot;&gt;nginx#proxy_pass&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;bu4-jia1-xie2-gang4&quot; tabindex=&quot;-1&quot;&gt;不加斜杠 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law/&lt;/code&gt; 将会代理到： &lt;code&gt;http://127.0.0.1:8080/law/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law/aaa&lt;/code&gt; 将会代理到：&lt;code&gt;http://127.0.0.1:8080/law/aaa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /law/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;tian1-jia1-xie2-gang4&quot; tabindex=&quot;-1&quot;&gt;添加斜杠 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law/&lt;/code&gt; 将会代理到：&lt;code&gt;http://127.0.0.1:8080/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;访问：&lt;code&gt;http://127.0.0.1:80/law/aaa&lt;/code&gt; 将会代理到：&lt;code&gt;http://127.0.0.1:8080/aaa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /law/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zong3-jie2-1&quot; tabindex=&quot;-1&quot;&gt;总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;proxy_pass&lt;/code&gt; 代理 &lt;code&gt;URL&lt;/code&gt; 地址后面加斜杠，当请求发送到服务器时会删除或替换 &lt;code&gt;location&lt;/code&gt; 配置的路径（/law/）。不加斜杠，请求 URI 会以客户端发送的相同形式传递给服务器。&lt;/p&gt;
&lt;h2 id=&quot;dai4-li3-sse-jie1-kou3&quot; tabindex=&quot;-1&quot;&gt;代理 SSE 接口 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nignx&lt;/code&gt; 代理接口响应结果是 &lt;code&gt;event-stream&lt;/code&gt; 流时配置&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering&quot;&gt;proxy_buffering&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;language-nginx&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nginx&quot;&gt;&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;location&lt;/span&gt; /law/&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;# 关闭代理服务器缓存，如果开启 nginx 会等待服务器端响应结束一次返回。&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_buffering&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;off&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;# 关闭请求代理缓存&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_request_buffering&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;off&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_pass&lt;/span&gt; http://127.0.0.1:8080/&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 后端服务器的SSE接口地址&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 使用 HTTP/1.1版本&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 清除connection header，允许代理保持长连接&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;# 传递必要的请求头信息&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Host &lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Real-IP &lt;span class=&quot;token variable&quot;&gt;$remote_addr&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Forwarded-For &lt;span class=&quot;token variable&quot;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; X-Forwarded-Proto &lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;# 配置超时，确保代理能够处理长连接&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_connect_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600s&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 根据需要调整连接超时时间&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_send_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600s&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 根据需要调整发送超时时间&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_read_timeout&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600s&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 根据需要调整读取超时时间&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;# 设置正确的Content-Type，确保SSE正常工作&lt;/span&gt;
	&lt;span class=&quot;token directive&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;proxy_set_header&lt;/span&gt; Accept &lt;span class=&quot;token string&quot;&gt;&quot;text/event-stream&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>谷歌浏览器书签脚本</title>
		<link href="https://www.dtking.cn/blog/BookmarkScript/"/>
		<updated>2024-11-21T08:13:31Z</updated>
		<id>https://www.dtking.cn/blog/BookmarkScript/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;一、书签本地路径 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;二、添加 JavaScript 小书签 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;三、示例 JavaScript 书签 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;四、注意事项 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;书签脚本小功能大作用&lt;/p&gt;
&lt;h2 id=&quot;yi1-shu1-qian1-ben3-di4-lu4-jing4&quot; tabindex=&quot;-1&quot;&gt;一、书签本地路径 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打开 &lt;code&gt;C:&#92;Users&#92;Administrator&#92;AppData&#92;Local&#92;Google&#92;Chrome&#92;User Data&#92;Default&lt;/code&gt; 文件夹。&lt;/li&gt;
&lt;li&gt;找到 “Bookmarks” 文件，用记事本打开。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Administrator&lt;/code&gt; 替换为你的电脑用户名，默认：Administrator&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;er4-tian1-jia1-javascript-xiao3-shu1-qian1&quot; tabindex=&quot;-1&quot;&gt;二、添加 JavaScript 小书签 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将 &lt;code&gt;JavaScript&lt;/code&gt; 代码保存为书签，以便在需要时执行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开Chrome浏览器。&lt;/li&gt;
&lt;li&gt;“书签栏”，右键选择“添加书签”。&lt;/li&gt;
&lt;li&gt;在名称文本框输入书签名称，网址文本框中输入 &lt;code&gt;JavaScript&lt;/code&gt; 代码，然后保存。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/7f3gPyuS-n-520.avif 520w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/7f3gPyuS-n-520.webp 520w&quot;&gt;&lt;img alt=&quot;效果图1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/7f3gPyuS-n-520.png&quot; width=&quot;520&quot; height=&quot;551&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/YKbFygY09o-520.avif 520w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/YKbFygY09o-520.webp 520w&quot;&gt;&lt;img alt=&quot;效果图2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/YKbFygY09o-520.png&quot; width=&quot;520&quot; height=&quot;551&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;san1-shi4-li4-javascript-shu1-qian1&quot; tabindex=&quot;-1&quot;&gt;三、示例 JavaScript 书签 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;查询页面布局&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; list &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;*&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; item &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; list&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; rgb&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;rgb(&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;,&#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;)&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; style &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;outline &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;1px solid &#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; rgb&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;编辑页面&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;designMode &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;designMode &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;on&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;off&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;on&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;旋转页面&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; rotateNum &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;undefined&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; rotateNum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; rotateNum &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rotateNum &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;180&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cssText &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;transition: all 1s; transform: rotate(&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; rotateNum &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deg);&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;网页最后更新时间&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastModified&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;解除网页复制&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopPropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stopImmediatePropagation&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;stopImmediatePropagation&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;copy&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;cut&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;contextmenu&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;selectstart&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mousedown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mouseup&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;keydown&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;keypress&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;keyup&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;documentElement&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;capture&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;破解限制成功！&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;si4-zhu4-yi4-shi4-xiang4&quot; tabindex=&quot;-1&quot;&gt;四、注意事项 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript: 前缀大小写不敏感，可以是 &lt;code&gt;javascript:&lt;/code&gt; 或 &lt;code&gt;JavaScript:&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;冒号后的脚本语句以分号分隔，行数无上限。&lt;/li&gt;
&lt;li&gt;书签JS脚本在新标签页、空白页、扩展管理页面无法执行。&lt;/li&gt;
&lt;li&gt;书签JS脚本中不能有 &lt;code&gt;//&lt;/code&gt; 或者 &lt;code&gt;/**/&lt;/code&gt; 的注释语句。&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>某趣G小说字体解码</title>
		<link href="https://www.dtking.cn/blog/font-decoding/"/>
		<updated>2024-11-21T02:53:47Z</updated>
		<id>https://www.dtking.cn/blog/font-decoding/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;前提条件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;查找加密字体 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;查找字体 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;下载字体 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;字码点和字形 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;编写代码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;最终效果 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;一些在线阅读小说网站，页面显示内容是正常，但获取到的文本内容却是乱码或语句不通的汉字。出现这种情况大概率是加密字。&lt;/p&gt;
&lt;h2 id=&quot;qian2-ti2-tiao2-jian4&quot; tabindex=&quot;-1&quot;&gt;前提条件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.fontcreator.com/&quot;&gt;FontCreator&lt;/a&gt; 字体编辑工具：查找网络字码点或字形名称&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hiroi-sora.lanzoul.com/s/umi-ocr&quot;&gt;Umi-OCR&lt;/a&gt; 文字识别工具：用来识别 &lt;code&gt;FontCreator&lt;/code&gt; 中的字形&lt;/li&gt;
&lt;li&gt;同时你需要一点点 &lt;code&gt;js&lt;/code&gt; 知识和对未知的探索精神 🙃&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;cha2-zhao3-jia1-mi4-zi4-ti3&quot; tabindex=&quot;-1&quot;&gt;查找加密字体 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;kbd&gt;F12&lt;/kbd&gt; 或 &lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;C&lt;/kbd&gt; 或 &lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;Shift&lt;/kbd&gt; + &lt;kbd&gt;J&lt;/kbd&gt; 打开控制台，找到对应文本内容元素节点。&lt;/p&gt;
&lt;h3 id=&quot;cha2-zhao3-zi4-ti3&quot; tabindex=&quot;-1&quot;&gt;查找字体 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/snMnGfZIyM-1621.avif 1621w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/snMnGfZIyM-1621.webp 1621w&quot;&gt;&lt;img alt=&quot;操作1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/snMnGfZIyM-1621.png&quot; width=&quot;1621&quot; height=&quot;466&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;网页显示内容和源码内容&lt;strong&gt;不一致&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;发现不常见字体 &lt;code&gt;bqg&lt;/code&gt; 大概率加密字体&lt;/li&gt;
&lt;li&gt;取消设置的默认字体，观察页面变化，发现确实是字体加密了。如下图：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/CxVPmp3EA3-1621.avif 1621w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/CxVPmp3EA3-1621.webp 1621w&quot;&gt;&lt;img alt=&quot;操作2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/CxVPmp3EA3-1621.png&quot; width=&quot;1621&quot; height=&quot;466&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;xia4-zai4-zi4-ti3&quot; tabindex=&quot;-1&quot;&gt;下载字体 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/XNnBmHXAo8-1621.avif 1621w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/XNnBmHXAo8-1621.webp 1621w&quot;&gt;&lt;img alt=&quot;操作3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/XNnBmHXAo8-1621.png&quot; width=&quot;1621&quot; height=&quot;466&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;控制台&lt;strong&gt;条件过滤&lt;/strong&gt;选择字体，&lt;code&gt;F5&lt;/code&gt; 刷新页面。没有条件过滤栏，点击左上侧有个漏斗形状图标。&lt;/li&gt;
&lt;li&gt;在当前请求上&lt;strong&gt;右键&lt;/strong&gt; -&amp;gt; &lt;strong&gt;在新标签页打开&lt;/strong&gt;（第一个）自动下载字体。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;zi4-ma3-dian3-he2-zi4-xing2&quot; tabindex=&quot;-1&quot;&gt;字码点和字形 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/HgPQ3Ghbx1-1916.avif 1916w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/HgPQ3Ghbx1-1916.webp 1916w&quot;&gt;&lt;img alt=&quot;操作4&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/HgPQ3Ghbx1-1916.png&quot; width=&quot;1916&quot; height=&quot;466&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;code&gt;FontCreator&lt;/code&gt; 将 &lt;code&gt;bqg.ttf&lt;/code&gt; 拖进去就可以看到字码点和字形了。&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;A&lt;/kbd&gt; 全选所有字形，&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;C&lt;/kbd&gt; 复制所有字码点。示例：&lt;code&gt;uni3984&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;Umi-OCR&lt;/code&gt; 识别汉字，内容少可以手动敲。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;默认情况下字码点复制顺序和字形排列顺序一致，从左到右。&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;p&gt;字码点：&lt;code&gt;uni3984&lt;/code&gt; &lt;strong&gt;uni&lt;/strong&gt; 没用，关键在后四位是字体 &lt;code&gt;Unicode&lt;/code&gt; 字符转十六进制后的结果。将获取到的字码点和汉字分成两个数组一一对应，方便后面代码处理。&lt;/p&gt;
&lt;h2 id=&quot;bian1-xie3-dai4-ma3&quot; tabindex=&quot;-1&quot;&gt;编写代码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;有了字码点和字形文本后，可以使用任意开发语言进行解码处理&lt;/em&gt;&lt;/strong&gt;。这里使用 &lt;code&gt;JavaScript&lt;/code&gt; 解码可以再浏览器直观看到内容变化。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;关键代码 &lt;/b&gt;js&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 将网页获取的乱码字体先转 Unicode 编码，再转 十六进制 大写就得到了最终数据。&lt;/span&gt;
text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charCodeAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;源码 &lt;/b&gt;js&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fontDecoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 字码点&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; points &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;37E6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;37E7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;382B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;382C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;382D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;386D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;38C7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;38C8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;38C9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;38CA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3917&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3919&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;391A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3955&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3956&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3967&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3968&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;396B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;396F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3981&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3982&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3983&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3984&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3985&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3986&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3987&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39A6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39A7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39A8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39A9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39AA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39AB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39AC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;39B3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39B9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39BA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39D8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39D9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39DA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;39DB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39DC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39DE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;39E0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A26&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A27&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A29&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A2A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A2B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A2C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A3C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3A3D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A3E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A3F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A41&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A58&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A76&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A77&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A78&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3A79&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A7B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A7C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A7D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A7E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A91&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3A92&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AA7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AA8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3AA9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AAA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AAB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AB9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ABA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3ABB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ABC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ABD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ABE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ABF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AC9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ACA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3ACB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3ACC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AE9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3AEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AEB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AEE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AEF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AF7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AF8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AF9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AFA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AFB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3AFC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3BBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3BBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3BBC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3BBD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3BBE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C18&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C19&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C1A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C1B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C1C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C1D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C30&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3C31&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C32&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C34&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C36&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C39&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C3A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C4F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3C51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C5D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C5E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3C5F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C66&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C67&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C68&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C69&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C6A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3C6B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CA4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CA5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CCD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CCE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CCF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3CD0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CD1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CD2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CD3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CD4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CE1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CE2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CE3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CE4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3CE5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3D52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D82&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D83&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3D84&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;3D85&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E4F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3E57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3EA7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4031&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4032&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4033&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4034&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4068&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4069&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;406A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;406B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;406C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;406D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;406F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4070&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4071&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4072&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;40C3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;40C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;40E2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;40E3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;40E4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42C6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;42C7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42DE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42DF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;42E8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42E9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;42EA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;431E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;431F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4320&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4321&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4453&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4454&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4455&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4457&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;45D5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45D8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45D9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45FB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45FC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45FD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45FE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;45FF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4602&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4613&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4614&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4618&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46C8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46C9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46CF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;46D2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;46D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4725&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4727&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4728&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;472A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;472C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;472D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;472E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4949&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;494A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;494B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;494C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;494D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;49A1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;49A2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;49A3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;49A4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;49A5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4A08&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4A09&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4A0A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4A9F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4AA0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B74&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B75&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B76&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B77&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B78&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B79&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B7B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4B7C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B7D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B7E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B7F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B80&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B81&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4B8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4BB7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BB8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BB9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BE9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BEB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BEE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4BEF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4BF0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C02&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C03&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C04&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C05&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C85&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C86&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C87&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C88&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C89&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C96&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C97&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4C98&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4C99&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CBF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4CC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4D8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4D90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4D91&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;4D92&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4D93&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E41&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E44&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E46&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E4A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4E55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;50FE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;5677&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5678&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5679&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;56A0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;56A1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;56A2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5718&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5719&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;571A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;571B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;571D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5828&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;5868&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;587A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;587F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;58B5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;58B7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;58BA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;58C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;58DC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;590C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;590D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;596B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5A48&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;5A56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5A64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5A7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5A90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5AA9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5AB1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5AC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5AF3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5B28&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5B2E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5D57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5D59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;5D5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5D5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5D5E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5D5F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5DEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5DEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;5DED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6AFF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6B07&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6B1B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6B1C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;6B1D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;9F32&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F34&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F36&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9F42&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;D6D2&quot;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 字形&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; indices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;
		&lt;span class=&quot;token string&quot;&gt;&quot;一二十丁厂七八人入儿九几了刀力又三千亏士工才寸丈大与万上小口山巾千亡义之尸已弓己也飞气川亿个么久勺丸凡及习叉马乡丰开夫天元无云扎艺五支厅犬区尤匹车巨牙屯互切止少日中贝冈见手午气升长？片化仇币仍仅斤爪反介父从今凶乏仓氏风欠丹匀乌勾凤六文方火忆订户认心尺巴队办以允予幻玉未未击打巧正扑功扔甘世古节本术可丙左厉石右布龙平轧东的是在不有和这为国我电由只要他时来叫用们叹四失生到代作地于出就分乎对令成会乐句册外处冬鸟包主市闪发年动头汉宁它百同能而下过子说产种面后多定学法行至此所民得光经进虫着等部度家里如回水高自理起物现实加量都两体制机当使点业去把性好应合还因其些然前政那社事形相全表间样色关各重新线内数你明看原利比或但质第向道命变条污没结解问意建月公军系很情者最立想通并提直题党阶阴程奸展妇妈戏果料象员革位常总痉茎筑弄战婴轮泽胡锦涛毛林湿白医痹疱批扯疣走抄坝贡裸赤枪抓女美罪交密宫啊爱痒她媚变缥購屌残智共亲活克神丽李独暴游集男死套骚操足插圆假幼弟盗货芽花爹跌劳魔鬼殖器领屁逼菊婊棒极消妹母卫&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;decodeing&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; target &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; code &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charCodeAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; findIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; points&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; item &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;findIndex &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				target &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; indices&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;findIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				target &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; target
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; html &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; text &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;decodeing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;解码完成&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;书签脚本 &lt;/b&gt;js&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function-variable function&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;fontDecoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; points&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;37E6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;37E7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;382B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;382C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;382D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;386D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;38C7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;38C8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;38C9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;38CA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3917&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3919&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;391A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3955&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3956&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3967&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3968&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;396B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;396F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3981&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3982&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3983&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3984&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3985&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3986&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3987&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39A6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39A7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39A8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39A9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39AA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39AB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39AC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39B9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39BA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39D8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39D9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39DA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39DB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39DC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39DE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;39E0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A26&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A27&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A29&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A2A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A2B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A2C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A3C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A3D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A3E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A3F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A41&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A58&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A76&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A77&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A78&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A79&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A7B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A7C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A7D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A7E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A91&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3A92&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AA7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AA8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AA9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AAA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AAB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AB9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ABF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AC9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ACA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ACB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3ACC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AE9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AEB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AEE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AEF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AF7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AF8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AF9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AFA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AFB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3AFC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3BBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3BBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3BBC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3BBD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3BBE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C18&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C19&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C1A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C1B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C1C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C1D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C30&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C31&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C32&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C34&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C36&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C39&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C3A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C4F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C5F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C66&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C67&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C68&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C69&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C6A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3C6B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CA4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CA5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CCD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CCE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CCF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CD0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CD1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CD2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CD3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CD4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CE1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CE2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CE3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CE4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3CE5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D5B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D82&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D83&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D84&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3D85&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E4F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E50&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E51&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E52&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E53&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E54&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3E57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;3EA7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4031&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4032&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4033&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4034&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4068&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4069&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;406A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;406B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;406C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;406D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;406F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4070&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4071&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4072&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;40C3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;40C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;40E2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;40E3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;40E4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42C7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42DD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42DE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42DF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42E9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;42EA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;431E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;431F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4320&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4321&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4453&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4454&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4455&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4456&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4457&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45D5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45D8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45D9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45FB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45FC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45FD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45FE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;45FF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4602&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4613&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4614&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4618&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46C8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46C9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46CF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D6&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;46D7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4725&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4727&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4728&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;472A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;472C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;472D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;472E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4949&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;494A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;494B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;494C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;494D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;49A1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;49A2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;49A3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;49A4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;49A5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4A08&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4A09&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4A0A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4A9F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4AA0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B74&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B75&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B76&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B77&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B78&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B79&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B7F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B80&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B81&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4B8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BB7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BB8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BB9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BE9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BEB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BEE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BEF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4BF0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C02&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C03&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C04&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C05&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C85&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C86&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C87&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C88&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C89&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C96&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C97&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C98&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4C99&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBB&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBD&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CBF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4CC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4D8F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4D90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4D91&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4D92&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4D93&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E41&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E44&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E46&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E4A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;4E55&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;50FE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5677&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5678&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5679&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;56A0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;56A1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;56A2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5718&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5719&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;571A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;571B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;571D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5828&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5868&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;587A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;587F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;58B5&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;58B7&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;58BA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;58C4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;58DC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;590C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;590D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;596B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5A48&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5A56&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5A64&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5A7A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5A90&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5AA9&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5AB1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5AC0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5AF3&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5B28&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5B2E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D57&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D59&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D5A&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D5C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D5E&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5D5F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5DEA&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5DEC&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;5DED&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;6AFF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;6B07&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;6B1B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;6B1C&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;6B1D&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F32&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F33&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F34&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F35&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F36&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F37&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F38&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F40&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;9F42&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;D6D2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; indices&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;一二十丁厂七八人入儿九几了刀力又三千亏士工才寸丈大与万上小口山巾千亡义之尸已弓己也飞气川亿个么久勺丸凡及习叉马乡丰开夫天元无云扎艺五支厅犬区尤匹车巨牙屯互切止少日中贝冈见手午气升长？片化仇币仍仅斤爪反介父从今凶乏仓氏风欠丹匀乌勾凤六文方火忆订户认心尺巴队办以允予幻玉未未击打巧正扑功扔甘世古节本术可丙左厉石右布龙平轧东的是在不有和这为国我电由只要他时来叫用们叹四失生到代作地于出就分乎对令成会乐句册外处冬鸟包主市闪发年动头汉宁它百同能而下过子说产种面后多定学法行至此所民得光经进虫着等部度家里如回水高自理起物现实加量都两体制机当使点业去把性好应合还因其些然前政那社事形相全表间样色关各重新线内数你明看原利比或但质第向道命变条污没结解问意建月公军系很情者最立想通并提直题党阶阴程奸展妇妈戏果料象员革位常总痉茎筑弄战婴轮泽胡锦涛毛林湿白医痹疱批扯疣走抄坝贡裸赤枪抓女美罪交密宫啊爱痒她媚变缥購屌残智共亲活克神丽李独暴游集男死套骚操足插圆假幼弟盗货芽花爹跌劳魔鬼殖器领屁逼菊婊棒极消妹母卫&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;decodeing&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;charCodeAt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; findIndex&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;points&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;findIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;item&lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;findIndex&lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;indices&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;findIndex&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; target&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; html&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; text&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;decodeing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;html&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;#content&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;text&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;解码完成&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;fontDecoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;书签脚本如何使用？ &lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot; title=&quot;谷歌浏览器书签脚本&quot;&gt;参考:谷歌浏览器书签脚本&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;h2 id=&quot;zui4-zhong1-xiao4-guo3&quot; tabindex=&quot;-1&quot;&gt;最终效果 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;随便打开一篇小说，&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;打开控制台&lt;/a&gt;观察，点击一次书签脚本，此时原文内容已被更新。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/cuwYqOExag-1621.avif 1621w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/cuwYqOExag-1621.webp 1621w&quot;&gt;&lt;img alt=&quot;操作5&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/cuwYqOExag-1621.png&quot; width=&quot;1621&quot; height=&quot;466&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>uni-app 常用方法记录</title>
		<link href="https://www.dtking.cn/blog/uniapp/"/>
		<updated>2024-11-09T02:34:23Z</updated>
		<id>https://www.dtking.cn/blog/uniapp/</id>
		<content type="html">&lt;h2 id=&quot;ye4-mian4-chuan2-can1&quot; tabindex=&quot;-1&quot;&gt;页面传参 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当前页面（传递参数）&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigateTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token literal-property property&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/pages/topic/index?id=&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		res&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;eventChannel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;toTopic&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目标页面（接收参数）&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; eventChannel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getOpenerEventChannel&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
eventChannel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;toTopic&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;data: &#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ke4-hu4-duan1-du2-xie3-ben3-di4-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;客户端读写本地文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;写入文件&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// see https://www.html5plus.org/doc/zh_cn/io.html#plus.io.PUBLIC_DOCUMENTS&lt;/span&gt;
	plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestFileSystem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PUBLIC_DOCUMENTS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;fs&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;//  fs.root是根目录操作对象DirectoryEntry , create 指示如果文件或目录不存在时是否进行创建，默认值为false。&lt;/span&gt;
		fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;fileEntry&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;showWaiting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;正在写入&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;//创建一个FileWriter来写入文件&lt;/span&gt;
			fileEntry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createWriter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;writer&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;// 定位文件的操作位置，有效值为 0 到文件的总长度减1。 0表示文件的起始位置。&lt;/span&gt;
				writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;seek&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 
				&lt;span class=&quot;token comment&quot;&gt;// 写入内容&lt;/span&gt;
				writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Data &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;// 成功&lt;/span&gt;
				writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onwrite&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;closeWaiting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;写入成功&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;本地路径：&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fileName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;long&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fileName&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token comment&quot;&gt;// 失败&lt;/span&gt;
				writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onerror&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;closeWaiting&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;写入失败&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;写入失败&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;创建 FileWriter 失败！&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;创建 FileWriter 失败&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token function&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;读取文件&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;resolve&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reject&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestFileSystem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;PUBLIC_DOCUMENTS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;fs&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		fs&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;fileEntry&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			fileEntry&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileReader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;io&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;FileReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				fileReader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readAsText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				fileReader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onloadend&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;evt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
				fileReader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onerror&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;读取文件失败&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;e&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		plus&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nativeUI&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;请求文件系统失败&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;error&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;web-view&quot; tabindex=&quot;-1&quot;&gt;web-view &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;web-view&lt;/code&gt; 加载本地 &lt;code&gt;html&lt;/code&gt; 文件&lt;/p&gt;
&lt;h3 id=&quot;chuang4-jian4-indexhtml&quot; tabindex=&quot;-1&quot;&gt;创建 index.html &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;目录结构 &lt;/b&gt;tree&lt;/div&gt;
&lt;pre class=&quot;language-text&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;├─hybrid
│  └─html
│      └─index.html&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;加载本地文件 &lt;/b&gt;html&lt;/div&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;zh&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;UTF-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;加载本地文件&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;input&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fileInput&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/plain,application/json&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;button&lt;/span&gt; &lt;span class=&quot;token special-attr&quot;&gt;&lt;span class=&quot;token attr-name&quot;&gt;onclick&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token value javascript language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;读取文件&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;button&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fileContent&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;uni.webview.1.5.5.js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;text/javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token script&quot;&gt;&lt;span class=&quot;token language-javascript&quot;&gt;
			&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;readFile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileInput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fileInput&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fileInput&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

					reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
						&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
						document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fileContent&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerHTML &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

					reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readAsText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;请选择文件！&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;back&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigateBack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;input[type=file]&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;change&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; fileInput &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;fileInput&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fileInput&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;files&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FileReader&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;onload&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
						&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; content &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
						uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;postMessage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token literal-property property&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
					&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
					reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;readAsText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;file&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					&lt;span class=&quot;token function&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;请选择文件！&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;webview-jia1-zai4-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;web-view 加载文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;web-view &lt;/b&gt;Vue&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;template&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
	&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;view &lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
		&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;web&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;view src&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/hybrid/html/index.html&quot;&lt;/span&gt; @message&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;web&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;view&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
	&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;view&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;template&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;onLoad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token literal-property property&quot;&gt;methods&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;// 监听 html 发送消息&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;callParentMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;detail&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;// 调用父级页面方法&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;callParentMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getCurrentPages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; page &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				page&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;localLoading&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;content&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;navigateBack&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;script&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;

&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;style lang&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;scss&quot;&lt;/span&gt; scoped&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
	
&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;style&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;uniapp-shi2-xian4-mao2-dian3&quot; tabindex=&quot;-1&quot;&gt;uniapp 实现锚点 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 uni-app 中实现锚点可以通过使用 scrollTo 函数来完成。&lt;/p&gt;
&lt;p&gt;示例代码如下所示：&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token function&quot;&gt;anchorPoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 获取到需要跳转的元素节点&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; targetElement &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;swiper-s&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 这里的 &#39;target&#39; 为目标元素的 id&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 调用 scrollTo 函数进行页面滚动&lt;/span&gt;
	uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createSelectorQuery&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;select&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;#swiper-s&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;boundingClientRect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;rect&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;rect&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; topOffset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; rect&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;top &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pageYOffset&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			uni&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pageScrollTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
				&lt;span class=&quot;token literal-property property&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;#swiper-s&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
				&lt;span class=&quot;token literal-property property&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
				&lt;span class=&quot;token function&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;滚动到指定位置成功&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
				&lt;span class=&quot;token function&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
					console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;滚动失败&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
				&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;未能获取到目标元素信息&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>adb 常用命令操作移动设备</title>
		<link href="https://www.dtking.cn/blog/adb/"/>
		<updated>2024-11-07T09:14:26Z</updated>
		<id>https://www.dtking.cn/blog/adb/</id>
		<content type="html">&lt;h2 id=&quot;chang2-yong4-ming4-ling4&quot; tabindex=&quot;-1&quot;&gt;常用命令 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/adb/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.android.google.cn/tools/adb?hl=zh-cn&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.android.google.cn/studio/run/oem-usb#Drivers&quot;&gt;安装原始设备制造商 (OEM) USB 驱动程序&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;设备列表（启动 &lt;code&gt;adb&lt;/code&gt; 服务）&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb devices&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设备列表 -l 显示设备信息&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb devices &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;停止 adb 服务&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb kill-server&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无线连接设备&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb connect &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.105:5555&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入指定设备 shell&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; 1234567890ABCDEF shell &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一台设备&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb shell &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指定设备安装 apk&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; emulator-5555 &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; helloWorld.apk
adb &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.105:5555 &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;D:&#92;Documents&#92;Downloads&lt;span class=&quot;token entity&quot; title=&quot;&#92;E&quot;&gt;&#92;E&lt;/span&gt;SFileExplorer v4.4.2.9 Mod.apk&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;卸载软件，需要指定 &lt;code&gt;package&lt;/code&gt; 命令&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb shell pm uninstall com.estrongs.android.pop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从设备复制文件到本地&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb pull remote &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将文件复制到设备&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb push &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; remote
adb push myfile.txt /sdcard/myfile.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;屏幕截图&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb shell screencap /sdcard/screen.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;拉到本地&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb pull /sdcard/screen.png&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;获取设备 apk base 路径&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb shell pm list packages &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或通过包名获取&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb shell pm path com.google.android.tts

package:/data/app/~~BwMBwOnuTHF59b3ZKyRqWQ&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;/com.google.android.tts--Sw7abhInXUL0n5uBi6ZRg&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;/base.apk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;备份 APK 文件&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb pull /data/app/~~BwMBwOnuTHF59b3ZKyRqWQ&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;/com.google.android.tts--Sw7abhInXUL0n5uBi6ZRg&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;/base.apk&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;wu2-xian4-tiao2-shi4&quot; tabindex=&quot;-1&quot;&gt;无线调试 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/adb/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 
&lt;p&gt;手机端需要在 &lt;strong&gt;开发者选项&lt;/strong&gt; &amp;gt; 打开 &lt;strong&gt;无线调试&lt;/strong&gt;&lt;br&gt;
第一次使用无线调试，需要通过 USB 连接设备&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将 Android 设备和 &lt;code&gt;adb&lt;/code&gt; 主机连接到同一 Wi-Fi 网络。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 USB 线将设备连接到主机。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置目标设备以监听端口 5555 上的 TCP/IP 连接：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb tcpip &lt;span class=&quot;token number&quot;&gt;5555&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拔掉连接目标设备的 USB 线。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到 Android 设备的 IP 地址。例如，对于 Nexus 设备，您可以在&lt;strong&gt;设置&lt;/strong&gt; &amp;gt; &lt;strong&gt;关于平板电脑&lt;/strong&gt;（或&lt;strong&gt;关于手机&lt;/strong&gt;）&amp;gt; 状态 &amp;gt; &lt;strong&gt;IP 地址&lt;/strong&gt;下找到 IP 地址。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 IP 地址连接到设备&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb connect device_ip_address:5555&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认主机已连接到目标设备：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;adb devices
List of devices attached
device_ip_address:5555 device&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
	</entry>
	
	<entry>
		<title>加强未成年人网络保护倡议书</title>
		<link href="https://www.dtking.cn/proposal/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/proposal/</id>
		<content type="html">&lt;p&gt;在信息化社会的今天，网络已成为未成年人学习、生活和娱乐的重要平台。然而，网络环境的复杂性和不确定性也给未成年人的身心健康带来了潜在风险。为了营造有利于未成年人身心健康发展的网络环境，保障未成年人的合法权益，根据&lt;a href=&quot;http://www.moe.gov.cn/jyb_xxgk/moe_1777/moe_1778/202310/t20231025_1087333.html&quot;&gt;《未成年人网络保护条例》&lt;/a&gt;&lt;a href=&quot;http://www.moe.gov.cn/jyb_sjzl/sjzl_zcfg/zcfg_qtxgfl/202110/t20211025_574798.html&quot;&gt;《中华人民共和国未成年人保护法》&lt;/a&gt;《中华人民共和国网络安全法》《中华人民共和国个人信息保护法》等法律，现发出如下倡议：&lt;/p&gt;
&lt;h2 id=&quot;yi1-wang3-luo4-chan3-pin3-he2-fu2-wu4-ti2-gong1-zhe3&quot; tabindex=&quot;-1&quot;&gt;一、网络产品和服务提供者 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;加强内容审核，确保所提供的网络产品和服务内容健康、适宜，不含暴力、色情、低俗等不良信息；&lt;/li&gt;
&lt;li&gt;设立未成年人保护专区或模式，提供有针对性的优质内容和服务，满足未成年人的学习和发展需求；建立便捷的举报机制，及时处理涉及未成年人的不良信息或违规行为；&lt;/li&gt;
&lt;li&gt;建立完善的未成年人保护机制，制定并执行严格的未成年人网络行为规范。在产品设计上充分考虑未成年人的身心特点，避免设计过于复杂或具有诱导性的功能；&lt;/li&gt;
&lt;li&gt;开发具有教育意义、寓教于乐的网络应用，引导未成年人健康上网。&lt;/li&gt;
&lt;li&gt;对于未成年人的个人信息，要采取更加严格的保护措施，防止信息泄露和滥用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;er4-ge4-ren2-xin4-xi1-chu3-li3-zhe3&quot; tabindex=&quot;-1&quot;&gt;二、个人信息处理者 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在收集、使用、存储未成年人的个人信息时，应事先征得法定监护人的同意，并确保信息的合法性和安全性。&lt;/li&gt;
&lt;li&gt;不得泄露、滥用或非法转让未成年人的个人信息，防止信息被用于不良目的。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;san1-zhi4-neng2-zhong1-duan1-chan3-pin3-zhi4-zao4-zhe3-he2-xiao1-shou4-zhe3&quot; tabindex=&quot;-1&quot;&gt;三、智能终端产品制造者和销售者 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在产品设计上，应充分考虑未成年人的身心特点和操作习惯，避免设计过于复杂或具有诱导性的功能。&lt;/li&gt;
&lt;li&gt;提供家长控制功能，让家长能够监控和管理孩子使用智能终端的时间和内容。&lt;/li&gt;
&lt;li&gt;加强对产品安全性能的测试，确保产品不受恶意软件或病毒的侵害。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;si4-jiao4-yu4-ji1-gou4-he2-jiao4-yu4-hang2-ye4&quot; tabindex=&quot;-1&quot;&gt;四、教育机构和教育行业 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将网络素养教育纳入课程体系，帮助学生树立正确的网络价值观，提高网络安全意识。&lt;/li&gt;
&lt;li&gt;开展形式多样的网络安全教育活动，增强学生的自我保护能力。&lt;/li&gt;
&lt;li&gt;加强与家长的沟通合作，共同引导未成年人正确使用网络。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;wu3-jia1-zhang3&quot; tabindex=&quot;-1&quot;&gt;五、家长 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;加强对孩子使用网络的监督，了解孩子的网络需求和困惑。&lt;/li&gt;
&lt;li&gt;设定合理的上网时间，避免孩子沉迷网络。&lt;/li&gt;
&lt;li&gt;与孩子共同学习网络安全知识，提高孩子的网络安全意识。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;liu4-wei4-cheng2-nian2-ren2&quot; tabindex=&quot;-1&quot;&gt;六、未成年人 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/proposal/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;增强辨别能力，自觉抵制不良信息和网络欺凌。&lt;/li&gt;
&lt;li&gt;合理安排上网时间，避免沉迷网络影响学习和生活。&lt;/li&gt;
&lt;li&gt;尊重他人权益，不发布或传播不良信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们呼吁广大网络产品和服务提供者、个人信息处理者、智能终端产品制造者和销售者，以及教育机构、家长和未成年人积极响应本倡议，共同为未成年人的网络保护贡献力量。让我们携手努力，为未成年人营造一个安全、健康、清朗的网络环境，促进未成年人的健康成长和全面发展。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>开发者必备导航</title>
		<link href="https://www.dtking.cn/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/</id>
		<content type="html">&lt;h1 class=&quot;f-400&quot;&gt;常用网站&lt;/h1&gt;
&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/cbdd2eb7b4a9880ea038909ad4983dd4.png&quot; alt=&quot;MDN Web文档&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;MDN Web文档&quot; href=&quot;https://developer.mozilla.org/zh-CN/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;MDN Web文档&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;MDN Web Docs网站提供了有关开放Web技术的信息，包括HTML、CSS和Web站点和渐进式Web应用程序的API。&quot;&gt;MDN Web Docs网站提供了有关开放Web技术的信息，包括HTML、CSS和Web站点和渐进式Web应用程序的API。&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/6c3635c310ec93710ce3bf7964602445.ico&quot; alt=&quot;幂简AI提示词商城｜灵活{变量}定制，免费试用&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;幂简AI提示词商城｜灵活{变量}定制，免费试用&quot; href=&quot;https://prompts.explinks.com/?ref=adb094212b7c&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;幂简AI提示词商城｜灵活{变量}定制，免费试用&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;幂简AI提示词商城提供3000+优质提示词模板，通过变量自定义，一键生成高质量Prompt，免费试用，满意再购买！&quot;&gt;幂简AI提示词商城提供3000+优质提示词模板，通过变量自定义，一键生成高质量Prompt，免费试用，满意再购买！&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/d9168ae383c07b030f5cc0bd88dedd65.png&quot; alt=&quot;MDPDF - 简洁高效的 Markdown 转 PDF 工具&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;MDPDF - 简洁高效的 Markdown 转 PDF 工具&quot; href=&quot;https://dtking.cn/mdpdf/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;MDPDF - 简洁高效的 Markdown 转 PDF 工具&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;AI内容Markdown转PDF在线工具，支持多主题切换、PDF大纲导出，实现所见即所得编辑体验！适配多平台保持一致性，支持图片上传嵌入，轻松将AI生成内容、Markdown文档快速转换为高质量PDF并下载，高效解决文档导出需求&quot;&gt;AI内容Markdown转PDF在线工具，支持多主题切换、PDF大纲导出，实现所见即所得编辑体验！适配多平台保持一致性，支持图片上传嵌入，轻松将AI生成内容、Markdown文档快速转换为高质量PDF并下载，高效解决文档导出需求&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/eeb83efc58e529985e2fe12aa126ef22.ico&quot; alt=&quot;草料二维码生成器&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;草料二维码生成器&quot; href=&quot;https://cli.im/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;草料二维码生成器&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;草料二维码把二维码技术变成简单实用的产品，让每个人都可以快速复用成功案例经验，自由组合内容展示、表单、批量、数据统计、美化和标签排版等功能，免费制作出能高效解决业务问题的二维码&quot;&gt;草料二维码把二维码技术变成简单实用的产品，让每个人都可以快速复用成功案例经验，自由组合内容展示、表单、批量、数据统计、美化和标签排版等功能，免费制作出能高效解决业务问题的二维码&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/09bdb305bc7c63e54701266be6c4f496.svg&quot; alt=&quot;Github Proxy 文件代理加速&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;Github Proxy 文件代理加速&quot; href=&quot;https://github.akams.cn/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Github Proxy 文件代理加速&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;oopsunix,git,github,proxy,github proxy,github代理,github镜像,github加速,github下载,github下载加速,github文件加速,代理加速,加速下载&quot;&gt;oopsunix,git,github,proxy,github proxy,github代理,github镜像,github加速,github下载,github下载加速,github文件加速,代理加速,加速下载&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/55915b594c58bce74d565ce59e50b79e.ico&quot; alt=&quot;时间戳转换工具&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;时间戳转换工具&quot; href=&quot;https://tool.lu/timestamp/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;时间戳转换工具&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;时间戳(Unix timestamp)转换工具 - 在线工具&quot;&gt;时间戳(Unix timestamp)转换工具 - 在线工具&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/92b097c0e60b0ef6885c81ee09056bfa.png&quot; alt=&quot;豆包&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;豆包&quot; href=&quot;https://www.doubao.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;豆包&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;豆包是你的AI 聊天智能对话问答助手，写作文案翻译情感陪伴编程全能工具。豆包为你答疑解惑，提供灵感，辅助创作，也可以和你畅聊任何你感兴趣的话题。&quot;&gt;豆包是你的AI 聊天智能对话问答助手，写作文案翻译情感陪伴编程全能工具。豆包为你答疑解惑，提供灵感，辅助创作，也可以和你畅聊任何你感兴趣的话题。&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/b3a11ef81822ba628a76d8dc8ae61bd8.png&quot; alt=&quot;OpenClaw - OpenClaw&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;OpenClaw - OpenClaw&quot; href=&quot;https://docs.openclaw.ai/zh-CN&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;OpenClaw - OpenClaw&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;&quot;&gt;&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
		&lt;div class=&quot;card-content&quot;&gt;
			&lt;div class=&quot;card-logo d-gap-5&quot;&gt;
				&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; src=&quot;https://www.dtking.cn/access/f9a64d9abfe1a80d0d52f157de3035b9.png&quot; alt=&quot;Rod&quot;&gt;
				&lt;a class=&quot;line1&quot; title=&quot;Rod&quot; href=&quot;https://go-rod.github.io/i18n/zh-CN/#/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Rod&lt;/a&gt;
			&lt;/div&gt;
			&lt;p class=&quot;line2&quot; title=&quot;一个用于 web 自动化和爬虫的 driver&quot;&gt;一个用于 web 自动化和爬虫的 driver&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>平台公约</title>
		<link href="https://www.dtking.cn/convention/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/convention/</id>
		<content type="html">&lt;p&gt;&lt;strong&gt;请您在开始使用平台之前，认真阅读并充分理解本协议，以共同营造风清气正的网络空间。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;yi1-xin4-xi1-nei4-rong2-fa1-bu4-gui1-fan4&quot; tabindex=&quot;-1&quot;&gt;一、信息内容发布规范 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/convention/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;​	在您按规定完成真实身份信息认证后，可以发布视频、图片、文字等信息内容，并保证所发布信息内容（无论是否公开）符合法律法规要求。 您不得制作、复制、发布、传播以下内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;危害国家安全、宣扬恐怖主义、泄露国家秘密、侵害英雄烈士、煽动民族仇恨、侮辱诽谤他人，以及包含色情、赌博、暴力等一切法律、行政法规禁止的内容；&lt;/li&gt;
&lt;li&gt;内容与标题严重不符、炒作绯闻丑闻、不当描述自然灾害、重大事故、煽动人群歧视、地域歧视、宣扬低俗、庸俗、媚俗、诱导未成年人不良嗜好等违反法律法规、公共政策、公序良俗的内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;er4-wang3-luo4-an1-quan2-bao3-hu4&quot; tabindex=&quot;-1&quot;&gt;二、网络安全保护 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/convention/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;您不得使用任何插件、外挂、系统或第三方工具对平台的正常运行进行干扰、破坏、修改或施加其他影响；&lt;/p&gt;
&lt;p&gt;不得进行任何危害平台系统安全的行为，亦不得利用平台从事任何危害计算机网络安全的行为；&lt;/p&gt;
&lt;p&gt;不得对平台中的信息或内容进行修改、劫持或其他导致用户无法正常使用平台的行为；&lt;/p&gt;
&lt;p&gt;不得以盗链、爬虫抓取等任何不正当方式盗取或使用平台中的信息或内容。&lt;/p&gt;
&lt;p&gt;如果我们有合理理由认为您的行为违反或可能违反上述约定的，或您有其他行为导致平台的信息和内容受到不利影响，或导致平台用户的权益受损的，我们有权进行处理，包括在不事先通知的情况下终止向您提供服务，并依法追究相关方的法律责任。&lt;/p&gt;
&lt;h2 id=&quot;san1-yong4-hu4-ge4-ren2-xin4-xi1-bao3-hu4&quot; tabindex=&quot;-1&quot;&gt;三、用户个人信息保护 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/convention/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;当您开启或使用平台时，我们会处理相关信息，除实现平台基本功能、服务所需的信息和根据法律法规要求所必需的信息之外，您可以拒绝我们处理其他信息，但这可能导致我们无法提供对应功能或服务。我们将依法保护您浏览、修改、删除相关个人信息以及撤回授权的权利，并将运用加密技术、匿名化处理等安全技术措施保护您的个人信息。&lt;/p&gt;
&lt;h2 id=&quot;si4-wei4-cheng2-nian2-ren2-bao3-hu4&quot; tabindex=&quot;-1&quot;&gt;四、未成年人保护 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/convention/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;若您是未满18周岁的未成年人，您应在监护人指导下认真阅读本协议，经您的监护人同意本公约后，方可使用平台。若您未取得监护人的同意，监护人可以通过平台公示渠道通知平台处理相关账号，平台有权对相关账号的功能（包括但不限于浏览、发布信息、互动交流等）进行限制。我们将与监护人共同努力，保护未成年人身心健康。如果您是监护人，您亦应履行对未成年人的监护义务，关注未成年人网络安全，引导未成年人健康合理使用网络。未成年人应当在其监护人的监督指导下，在合理范围内正确学习使用网络，养成良好上网习惯，避免沉迷虚拟的网络空间。&lt;/p&gt;
&lt;h2 id=&quot;wu3-wei2-yue1-chu3-li3&quot; tabindex=&quot;-1&quot;&gt;五、违约处理 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/convention/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您违反含平台规则在内的本协议约定，我们有权视情况采取预先警示、拒绝发布、立即停止传输信息、删除内容、短期禁止发布内容或评论、限制账号部分或者全部功能，直至终止提供服务、永久关闭账号及法律法规规定的其他处置措施，对于因此造成平台功能不可用、账号信息删除、内容删除、无法正常获取您账号内资产或其他权益等不利后果，应由您自行承担。对已删除的用户信息或内容，我们有权不予恢复。我们有权公告处理结果，且有权根据实际情况决定是否恢复相关账号的使用。对涉嫌违法犯罪的行为，我们将保存有关记录，并有权依法向有关主管部门报告、配合有关主管部门调查。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>导航站</title>
		<link href="https://www.dtking.cn/classify/1719365245222400003/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245222400003/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;导航站&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7c67b379b02f9f96d7943b82f7e0ad24.ico&quot; alt=&quot;设计导航&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;设计导航&quot; href=&quot;http://hao.shejidaren.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;设计导航&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;设计师网址导航专注分享优秀设计网站、免费无版权限制可商用的高品质素材，设计教程、尺寸规范、配色方案、设计素材和灵感&quot;&gt;设计师网址导航专注分享优秀设计网站、免费无版权限制可商用的高品质素材，设计教程、尺寸规范、配色方案、设计素材和灵感&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4f21c1f9b789f13b771ec5f0339c91c2.ico&quot; alt=&quot;DevDocs&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DevDocs&quot; href=&quot;https://devdocs.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DevDocs&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;DevDocs将多个API文档组合在一个快速、有组织且可搜索的界面中&quot;&gt;DevDocs将多个API文档组合在一个快速、有组织且可搜索的界面中&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/06eaab2939603d9a26c7796c60a63e0a.ico&quot; alt=&quot;优设导航官网 - 设计导航 - 国内专业设计师网站导航&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;优设导航官网 - 设计导航 - 国内专业设计师网站导航&quot; href=&quot;https://hao.uisdc.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;优设导航官网 - 设计导航 - 国内专业设计师网站导航&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;设计导航2013年上线至今，是优设网旗下最专业好用的设计师导航网站！设计导航为设计师提供UI设计、设计教程、素材下载、高清图库、配色方案、App设计、网页设计等设计网站导航指引。设计导航每周更新，设计风向标就看优设网！&quot;&gt;设计导航2013年上线至今，是优设网旗下最专业好用的设计师导航网站！设计导航为设计师提供UI设计、设计教程、素材下载、高清图库、配色方案、App设计、网页设计等设计网站导航指引。设计导航每周更新，设计风向标就看优设网！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b83afade18df5981432326b24f12af45.ico&quot; alt=&quot;网站 | awesome-bookmarks&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;网站 | awesome-bookmarks&quot; href=&quot;https://panjiachen.github.io/awesome-bookmarks/website/#%E5%B8%B8%E7%9C%8B%E7%9A%84%E7%BD%91%E7%AB%99&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;网站 | awesome-bookmarks&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;个人收藏夹&quot;&gt;个人收藏夹&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9311c3ce7d973809bbbad953747041d7.ico&quot; alt=&quot;龙轩导航-做个有用的导航&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;龙轩导航-做个有用的导航&quot; href=&quot;http://ilxdh.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;龙轩导航-做个有用的导航&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;龙轩导航,高清电影,最新网址发布页,ppt模板,精品软件,网址导航,网盘搜索,镜像谷歌,免费资源&quot;&gt;龙轩导航,高清电影,最新网址发布页,ppt模板,精品软件,网址导航,网盘搜索,镜像谷歌,免费资源&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5a3a71143543e5ffdaf4741299c627bc.ico&quot; alt=&quot;大数据导航-大数据工具导航-199IT大数据导航-199IT大数据工具导航-Hao.199it.com&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;大数据导航-大数据工具导航-199IT大数据导航-199IT大数据工具导航-Hao.199it.com&quot; href=&quot;http://hao.199it.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;大数据导航-大数据工具导航-199IT大数据导航-199IT大数据工具导航-Hao.199it.com&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;大数据导航,大数据工具导航,199大数据导航，199IT大数据工具导航，1199IT数据工具,数据工具,数据工具导航,大数据工具,统计数据,趋势分析工具,可视化数据工具&quot;&gt;大数据导航,大数据工具导航,199大数据导航，199IT大数据工具导航，1199IT数据工具,数据工具,数据工具导航,大数据工具,统计数据,趋势分析工具,可视化数据工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/de9ee4b1e9b045975f27009e50b36a06.png&quot; alt=&quot;设计导航 - 万千设计师必备的设计导航&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;设计导航 - 万千设计师必备的设计导航&quot; href=&quot;https://www.designnavs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;设计导航 - 万千设计师必备的设计导航&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;万千设计师必备的设计导航，上设计导航获设计灵感、攫设计资源、领设计软件、取设计教程。拥有全球无版权可商用图片素材、视频素材、字体素材等资源。设计人生，从设计导航开始！&quot;&gt;万千设计师必备的设计导航，上设计导航获设计灵感、攫设计资源、领设计软件、取设计教程。拥有全球无版权可商用图片素材、视频素材、字体素材等资源。设计人生，从设计导航开始！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d2745dd1d77ed7d68c43779fc7baaafd.ico&quot; alt=&quot;优波设计 - 设计师必备网址导航 ubuuk.com&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;优波设计 - 设计师必备网址导航 ubuuk.com&quot; href=&quot;https://www.ubuuk.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;优波设计 - 设计师必备网址导航 ubuuk.com&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;全球优秀的知名设计网址导航为设计师提供ps教程、UI设计、素材下载、高清图库、配色方案、用户体验、网页设计等全方位设计师网站导航指引。最实用、最专业、最全面、最好用的设计师导航！&quot;&gt;全球优秀的知名设计网址导航为设计师提供ps教程、UI设计、素材下载、高清图库、配色方案、用户体验、网页设计等全方位设计师网站导航指引。最实用、最专业、最全面、最好用的设计师导航！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6e47d11f7072662b86417e78838d5527.ico&quot; alt=&quot;即时工具-致力打造即用即走型在线工具箱&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;即时工具-致力打造即用即走型在线工具箱&quot; href=&quot;https://www.67tool.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;即时工具-致力打造即用即走型在线工具箱&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;致力开发即用即走型在线工具，无需客户端在线一键使用。拥有视频工具、音频工具、图片工具、 PDF工具、办公辅助、设计工具、文本工具、数字工具、加密工具、单位转换等等工具。同时拥有良好的用户体验，为您的工作学习提升效率！&quot;&gt;致力开发即用即走型在线工具，无需客户端在线一键使用。拥有视频工具、音频工具、图片工具、 PDF工具、办公辅助、设计工具、文本工具、数字工具、加密工具、单位转换等等工具。同时拥有良好的用户体验，为您的工作学习提升效率！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a2a24110e082566e30a2526ff9ad670f.png&quot; alt=&quot;小白工具箱 - 盒子部落旗下网站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;小白工具箱 - 盒子部落旗下网站&quot; href=&quot;https://www.ooopn.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;小白工具箱 - 盒子部落旗下网站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;小白工具箱 - 盒子部落旗下网站&quot;&gt;小白工具箱 - 盒子部落旗下网站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4aefd647b8f730c5ee43caa7d24ff33a.png&quot; alt=&quot;AI工具集导航 | 500+ AI工具导航大全，国内外AI工具集合网站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;AI工具集导航 | 500+ AI工具导航大全，国内外AI工具集合网站&quot; href=&quot;https://ai-bot.cn&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;AI工具集导航 | 500+ AI工具导航大全，国内外AI工具集合网站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;AI工具集导航收录了国内外数百个AI工具，包括AI写作工具、AI图像生成和背景移除、AI视频制作、AI音频转录、AI辅助编程、AI音乐生成、AI绘画设计、AI对话聊天等AI工具集合大全，以及AI学习开发的常用网站、框架和模型，帮助你加入人工智能浪潮，自动化高效完成任务&quot;&gt;AI工具集导航收录了国内外数百个AI工具，包括AI写作工具、AI图像生成和背景移除、AI视频制作、AI音频转录、AI辅助编程、AI音乐生成、AI绘画设计、AI对话聊天等AI工具集合大全，以及AI学习开发的常用网站、框架和模型，帮助你加入人工智能浪潮，自动化高效完成任务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3e97de741cf5db41c4c0fd4155f897bf.png&quot; alt=&quot;Tbox导航 | 只收录优质在线工具的导航网站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Tbox导航 | 只收录优质在线工具的导航网站&quot; href=&quot;https://www.tboxn.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Tbox导航 | 只收录优质在线工具的导航网站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Tbox导航是一个集合大量优质在线工具的导航网站，包括实用工具、影音工具、图片工具、编程工具、网络资源等几十种分类，覆盖全网在线工具，只收录最优质的的精品网站，做一个真正有用好用的工具导航网站。&quot;&gt;Tbox导航是一个集合大量优质在线工具的导航网站，包括实用工具、影音工具、图片工具、编程工具、网络资源等几十种分类，覆盖全网在线工具，只收录最优质的的精品网站，做一个真正有用好用的工具导航网站。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ae59a538dff03e9a9d7e79cf0397e19c.ico&quot; alt=&quot;程序员宝盒-专属程序员的一站式导航&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;程序员宝盒-专属程序员的一站式导航&quot; href=&quot;https://www.baoboxs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;程序员宝盒-专属程序员的一站式导航&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;程序员宝盒（baoboxs.com）是一个专门为程序员量身定制的一站式导航站，让程序员的学习、工作、娱乐更加高效、便捷&quot;&gt;程序员宝盒（baoboxs.com）是一个专门为程序员量身定制的一站式导航站，让程序员的学习、工作、娱乐更加高效、便捷&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>其他</title>
		<link href="https://www.dtking.cn/classify/1719365245155291143/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245155291143/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;其他&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/23f793a8366b5dc32d7cd419fc9c7d81.png&quot; alt=&quot;Roadmap 开发线路图&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Roadmap 开发线路图&quot; href=&quot;https://roadmap.sh/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Roadmap 开发线路图&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Roadmap 是一个社区努力创建路线图、指南和其他教育内容，以帮助指导开发人员选择道路并指导他们的学习。社区驱动的路线图、文章、指南、测验、提示和资源，供开发人员学习，确定他们的职业道路，了解他们不知道的事情，找出知识差距，学习和改进。&quot;&gt;Roadmap 是一个社区努力创建路线图、指南和其他教育内容，以帮助指导开发人员选择道路并指导他们的学习。社区驱动的路线图、文章、指南、测验、提示和资源，供开发人员学习，确定他们的职业道路，了解他们不知道的事情，找出知识差距，学习和改进。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/030e436d3b94cab444d1d10afd8e170f.png&quot; alt=&quot;30秒代码&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;30秒代码&quot; href=&quot;https://www.30secondsofcode.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;30秒代码&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在30秒的代码中浏览1188个短代码片段以满足所有开发需求。&quot;&gt;在30秒的代码中浏览1188个短代码片段以满足所有开发需求。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/215be33ba5d1660bb8fe275965b40963.ico&quot; alt=&quot;标准地图服务系统&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;标准地图服务系统&quot; href=&quot;http://bzdt.ch.mnr.gov.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;标准地图服务系统&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;标准地图服务系统&quot;&gt;标准地图服务系统&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5e48c724f3bad6092ed5257d49795037.ico&quot; alt=&quot;国家地理信息公共服务平台 天地图&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;国家地理信息公共服务平台 天地图&quot; href=&quot;https://www.tianditu.gov.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;国家地理信息公共服务平台 天地图&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;国家地理信息公共服务平台 天地图&quot;&gt;国家地理信息公共服务平台 天地图&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e4884168a4fcfab47c12b873eb5657a8.ico&quot; alt=&quot;NATAPP-内网穿透 基于ngrok的国内高速内网映射工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;NATAPP-内网穿透 基于ngrok的国内高速内网映射工具&quot; href=&quot;https://natapp.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;NATAPP-内网穿透 基于ngrok的国内高速内网映射工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;natapp是基于ngrok的国内高速内网穿透专业服务商,独家彻底解决ngrok1.7内存泄漏问题.稳定拒绝掉线,适用于微信开发调试,本地架设演示服务器,外网可以访问,远程服务器,远程桌面,远程办公,游戏联机等&quot;&gt;natapp是基于ngrok的国内高速内网穿透专业服务商,独家彻底解决ngrok1.7内存泄漏问题.稳定拒绝掉线,适用于微信开发调试,本地架设演示服务器,外网可以访问,远程服务器,远程桌面,远程办公,游戏联机等&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/87f97882478afb37cf13af0be2f188ae.svg&quot; alt=&quot;ngrok - Online in One Line&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ngrok - Online in One Line&quot; href=&quot;https://ngrok.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ngrok - Online in One Line&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;ngrok是用一个命令在互联网上发布任何内容的最快方法。&quot;&gt;ngrok是用一个命令在互联网上发布任何内容的最快方法。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e8da0c39a05d19d3a6e3c71e6be7e696.ico&quot; alt=&quot;设备规格-移动设备规格、比较、新闻、用户评论和评级&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;设备规格-移动设备规格、比较、新闻、用户评论和评级&quot; href=&quot;https://www.devicespecifications.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;设备规格-移动设备规格、比较、新闻、用户评论和评级&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;智能手机、平板电脑和其他移动设备的完整规格。行业新闻、设备比较、用户评论和评级。&quot;&gt;智能手机、平板电脑和其他移动设备的完整规格。行业新闻、设备比较、用户评论和评级。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-07-17_22-28-19_1721226370349.jpg&quot; alt=&quot;在线Grok Debug工具，Grok校验|调试&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线Grok Debug工具，Grok校验|调试&quot; href=&quot;https://www.5axxw.com/tools/v2/grok.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线Grok Debug工具，Grok校验|调试&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线Grok Debug工具，Grok校验|调试&quot;&gt;在线Grok Debug工具，Grok校验|调试&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>UI&amp;amp;素材</title>
		<link href="https://www.dtking.cn/classify/1719365245155291142/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245155291142/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;UI&amp;amp;素材&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7cdf40730bc155771061548084ac46f1.ico&quot; alt=&quot;UI Notes - 真实产品 UI 设计灵感库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;UI Notes - 真实产品 UI 设计灵感库&quot; href=&quot;https://uinotes.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;UI Notes - 真实产品 UI 设计灵感库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;UI Notes 收集了大量线上优秀 App 的完整 UI 截图，只有落地设计没有飞机稿，你可以在这里探索 UI 设计的最新趋势、浏览竞品的产品设计、快速找到工作中需要的灵感。&quot;&gt;UI Notes 收集了大量线上优秀 App 的完整 UI 截图，只有落地设计没有飞机稿，你可以在这里探索 UI 设计的最新趋势、浏览竞品的产品设计、快速找到工作中需要的灵感。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/720302ea049a93c65493a0dd6fd7147d.png&quot; alt=&quot;FreeUID，免费UI资源下载 – 最好的UI设计资源分享平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;FreeUID，免费UI资源下载 – 最好的UI设计资源分享平台&quot; href=&quot;https://www.freeuid.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;FreeUID，免费UI资源下载 – 最好的UI设计资源分享平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;FreeUID是一个UI设计资源分享平台，提供最新、最全的UI设计相关资源下载，内容涵盖UI资源下载，UI素材下载，UI源文件，运营设计，动效设计资源下载，ui设计教程，界面设计，交互设计，网页设计，图标等UI设计模板资源，为UI设计师减少70%加班时间，各种UI Kit、样机模板、mockup、VI模板等高质量素材下载-2023年最新UI资源下载&quot;&gt;FreeUID是一个UI设计资源分享平台，提供最新、最全的UI设计相关资源下载，内容涵盖UI资源下载，UI素材下载，UI源文件，运营设计，动效设计资源下载，ui设计教程，界面设计，交互设计，网页设计，图标等UI设计模板资源，为UI设计师减少70%加班时间，各种UI Kit、样机模板、mockup、VI模板等高质量素材下载-2023年最新UI资源下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a11c59f4a85c08cbe6e906620cbbd4c6.svg&quot; alt=&quot;Dribble-发现世界顶级设计师和创意专业人士&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Dribble-发现世界顶级设计师和创意专业人士&quot; href=&quot;https://dribbble.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Dribble-发现世界顶级设计师和创意专业人士&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在Dribble上查找顶级设计师和创意专家。我们是设计师获得灵感、反馈、社区和工作的地方。您发现世界各地设计师并与之联系的最佳资源。&quot;&gt;在Dribble上查找顶级设计师和创意专家。我们是设计师获得灵感、反馈、社区和工作的地方。您发现世界各地设计师并与之联系的最佳资源。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://s.pxhere.com/media/favicon.ico?v=66&quot; alt=&quot;世界著名的免费摄影图库 素材中国, 高清壁纸 - PxHere摄影图库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;世界著名的免费摄影图库 素材中国, 高清壁纸 - PxHere摄影图库&quot; href=&quot;https://pxhere.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;世界著名的免费摄影图库 素材中国, 高清壁纸 - PxHere摄影图库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;素材中国, 桌面壁纸, 高清壁纸, PxHere, CC0图库 ,苹果手机壁纸, 安卓手机壁纸, 摄影图库&quot;&gt;素材中国, 桌面壁纸, 高清壁纸, PxHere, CC0图库 ,苹果手机壁纸, 安卓手机壁纸, 摄影图库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>云盘网盘</title>
		<link href="https://www.dtking.cn/classify/1719365245155291140/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245155291140/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;云盘网盘&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1e9ca410555e554f449b4fc349d9674e.png&quot; alt=&quot;夸克网盘&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;夸克网盘&quot; href=&quot;https://pan.quark.cn/l&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;夸克网盘&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;夸克网盘,云存储,云同步,云盘,文件管理,相册备份,手机备份,高清播放,上传下载&quot;&gt;夸克网盘,云存储,云同步,云盘,文件管理,相册备份,手机备份,高清播放,上传下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7885c9e1865dc757a58540e8e36e4e31.ico&quot; alt=&quot;文叔叔 - 传文件，找文叔叔（永不限速）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;文叔叔 - 传文件，找文叔叔（永不限速）&quot; href=&quot;https://www.wenshushu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;文叔叔 - 传文件，找文叔叔（永不限速）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;文叔叔，免费空间 40GB，一款永不限速的云存储产品。传文件、收文件、网盘，还支持历史记录等高级功能。&quot;&gt;文叔叔，免费空间 40GB，一款永不限速的云存储产品。传文件、收文件、网盘，还支持历史记录等高级功能。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0aafd998f100c0dc162b8b61d2f5a266.png&quot; alt=&quot;阿里云盘 - 你的数字世界&amp;amp;middot;阿里巴巴集团出品&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;阿里云盘 - 你的数字世界&amp;amp;middot;阿里巴巴集团出品&quot; href=&quot;https://www.aliyundrive.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;阿里云盘 - 你的数字世界&amp;amp;middot;阿里巴巴集团出品&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;阿里云盘 - 你的数字世界&amp;amp;middot;阿里巴巴集团出品&quot;&gt;阿里云盘 - 你的数字世界&amp;amp;middot;阿里巴巴集团出品&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/280eb37141a237392241f0c2bdee204e.ico&quot; alt=&quot;百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全&quot; href=&quot;https://pan.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;百度网盘-免费云盘丨文件共享软件丨超大容量丨存储安全&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;百度网盘是一款国民级产品，已连续9年为超过7亿用户提供稳定、安全的个人云存储服务，已实现电脑、手机、电视等多种终端场景的覆盖和互联，并支持多类型文件的备份、分享、查看和处理&quot;&gt;百度网盘是一款国民级产品，已连续9年为超过7亿用户提供稳定、安全的个人云存储服务，已实现电脑、手机、电视等多种终端场景的覆盖和互联，并支持多类型文件的备份、分享、查看和处理&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4e6569d21c349f5cfbf881ccd59be607.ico&quot; alt=&quot;蓝奏&amp;amp;middot;云存储&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;蓝奏&amp;amp;middot;云存储&quot; href=&quot;https://up.woozooo.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;蓝奏&amp;amp;middot;云存储&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;蓝奏&amp;amp;middot;云存储&quot;&gt;蓝奏&amp;amp;middot;云存储&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/90c80c3d8c2a1950db9acf97726ef70a.ico&quot; alt=&quot;猫狸盘搜 - 阿里云盘搜索神器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;猫狸盘搜 - 阿里云盘搜索神器&quot; href=&quot;https://www.alipansou.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;猫狸盘搜 - 阿里云盘搜索神器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;阿里盘搜,猫狸云,猫狸云搜索,猫狸盘搜,喵狸盘搜,阿里云盘,阿里云盘搜索,阿里云盘资源分享,网盘搜索,资源搜索&quot;&gt;阿里盘搜,猫狸云,猫狸云搜索,猫狸盘搜,喵狸盘搜,阿里云盘,阿里云盘搜索,阿里云盘资源分享,网盘搜索,资源搜索&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/8070630fc80c819ef154f8195fda4f05.ico&quot; alt=&quot;PanSou 盘搜&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;PanSou 盘搜&quot; href=&quot;https://so.252035.xyz/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PanSou 盘搜&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;&quot;&gt;&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b7c649c6117cb9578d9ca32bd61f663e.ico&quot; alt=&quot;网盘俱乐部 - 高质量百度网盘搜索引擎_百度云资源搜索神器_100%有效&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;网盘俱乐部 - 高质量百度网盘搜索引擎_百度云资源搜索神器_100%有效&quot; href=&quot;https://pan.club/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;网盘俱乐部 - 高质量百度网盘搜索引擎_百度云资源搜索神器_100%有效&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;网盘俱乐部（PAN.CLUB）是专业的高质量百度网盘搜索引擎，致力于为您提供最快、最全、最有效的百度云资源搜索体验，专业索引电影、电视剧、学习资料等海量内容。&quot;&gt;网盘俱乐部（PAN.CLUB）是专业的高质量百度网盘搜索引擎，致力于为您提供最快、最全、最有效的百度云资源搜索体验，专业索引电影、电视剧、学习资料等海量内容。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>Linux手册</title>
		<link href="https://www.dtking.cn/classify/1719365245092376582/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245092376582/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;Linux手册&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/83389005519fc84ee8a3c96951b0c3b9.png&quot; alt=&quot;Linux命令大全&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Linux命令大全&quot; href=&quot;https://www.linuxcool.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Linux命令大全&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;专注于Linux命令大全与详解的在线命令查询网站，包含Linux命令手册、Linux命令详解、Linux命令学习与shell脚本编程大全等优质学习资料，准确，丰富，稳定，在技术之路上为您护航！&quot;&gt;专注于Linux命令大全与详解的在线命令查询网站，包含Linux命令手册、Linux命令详解、Linux命令学习与shell脚本编程大全等优质学习资料，准确，丰富，稳定，在技术之路上为您护航！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ec75768a5e7e3e88c9244e40394a3ce8.ico&quot; alt=&quot;linux命令在线中文手册&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;linux命令在线中文手册&quot; href=&quot;http://linux.51yip.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;linux命令在线中文手册&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;linux中文在线手册是一个可以检索linux命令,例子,实例.用户可以添加命令,例子,收藏命令的搜索平台.&quot;&gt;linux中文在线手册是一个可以检索linux命令,例子,实例.用户可以添加命令,例子,收藏命令的搜索平台.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>3D渲染</title>
		<link href="https://www.dtking.cn/classify/1719365245222400002/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245222400002/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;3D渲染&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f692f42f4f344f4792dbbe08ae5a1eb9.ico&quot; alt=&quot;Three.js &amp;amp;ndash; JavaScript 3D Library&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Three.js &amp;amp;ndash; JavaScript 3D Library&quot; href=&quot;https://threejs.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Three.js &amp;amp;ndash; JavaScript 3D Library&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Three.js &amp;amp;ndash; JavaScript 3D Library&quot;&gt;Three.js &amp;amp;ndash; JavaScript 3D Library&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/threejs.org.ico&quot; alt=&quot;在线创建3D模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线创建3D模型&quot; href=&quot;https://threejs.org/editor/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线创建3D模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线创建3D模型&quot;&gt;在线创建3D模型&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/41be2bb60a18db4562bf1cb887fd815d.png&quot; alt=&quot;3D 纹理&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;3D 纹理&quot; href=&quot;https://3dtextures.me/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;3D 纹理&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;3D TEXTURES | Free seamless PBR textures with Diffuse, Normal, Displacement, Occlusion and Roughness Maps.&quot;&gt;3D TEXTURES | Free seamless PBR textures with Diffuse, Normal, Displacement, Occlusion and Roughness Maps.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9f38bb364529cbb15c59a5e0382485ca.png&quot; alt=&quot;ambientCG-CC0纹理、HDRI和模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ambientCG-CC0纹理、HDRI和模型&quot; href=&quot;https://ambientcg.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ambientCG-CC0纹理、HDRI和模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Free 3D Assets Never Looked This Good! Get 2000+ PBR Materials, HDRIs and more for free under the Public Domain license.&quot;&gt;Free 3D Assets Never Looked This Good! Get 2000+ PBR Materials, HDRIs and more for free under the Public Domain license.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f7a9323734c063b5ed1f12c7b4997577.ico&quot; alt=&quot;无草图无缝纹理&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;无草图无缝纹理&quot; href=&quot;https://www.sketchuptextureclub.com/textures&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;无草图无缝纹理&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;高品质免费无缝纹理。建筑、材料、自然元素、背景和景观&quot;&gt;高品质免费无缝纹理。建筑、材料、自然元素、背景和景观&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/04ee667566805c3b0ea885a51d7eadba.ico&quot; alt=&quot;CGTrader-VR/AR和CG项目的3D模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CGTrader-VR/AR和CG项目的3D模型&quot; href=&quot;https://www.cgtrader.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CGTrader-VR/AR和CG项目的3D模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;VR/AR和CG项目的3D模型市场，以及专业的3D设计师社区。下载3D模型并找到满足您需求的3D设计师。&quot;&gt;VR/AR和CG项目的3D模型市场，以及专业的3D设计师社区。下载3D模型并找到满足您需求的3D设计师。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d569a3f9ff73467623731ceb1ed41b52.png&quot; alt=&quot;Newsfeed - Sketchfab 3D 模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Newsfeed - Sketchfab 3D 模型&quot; href=&quot;https://sketchfab.com/feed&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Newsfeed - Sketchfab 3D 模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用Sketchfab发布、共享和嵌入交互式三维文件。发现并下载来自游戏、文化遗产、建筑、设计等领域的数千个3D模型。&quot;&gt;使用Sketchfab发布、共享和嵌入交互式三维文件。发现并下载来自游戏、文化遗产、建筑、设计等领域的数千个3D模型。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/10a825fe7b68056d4b1ac702397bfbfe.ico&quot; alt=&quot;Blender（布兰德）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Blender（布兰德）&quot; href=&quot;https://blender.bgteach.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Blender（布兰德）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Blender（布兰德）是一款永久开源免费的3D创建套件。支持整个3D创作流程：建模、雕刻、骨骼装配、动画、模拟、实时渲染、合成和运动跟踪，甚至可用作视频编辑及游戏创建的全功能工具。&quot;&gt;Blender（布兰德）是一款永久开源免费的3D创建套件。支持整个3D创作流程：建模、雕刻、骨骼装配、动画、模拟、实时渲染、合成和运动跟踪，甚至可用作视频编辑及游戏创建的全功能工具。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b16d8918765559331e9078773766e9c7.ico&quot; alt=&quot;Mixamo&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Mixamo&quot; href=&quot;https://www.mixamo.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Mixamo&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为游戏、电影等制作3D角色动画。&quot;&gt;为游戏、电影等制作3D角色动画。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/33940d5364b2019d18743e7dc5fc12b8.ico&quot; alt=&quot;glTF Viewer&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;glTF Viewer&quot; href=&quot;https://gltf-viewer.donmccurdy.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;glTF Viewer&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;用于glTF 2.0三维模型的拖放预览工具&quot;&gt;用于glTF 2.0三维模型的拖放预览工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/github.com.svg&quot; alt=&quot;GitHub-KhronosGroup/glTF:glTF-运行时3D资产交付&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;GitHub-KhronosGroup/glTF:glTF-运行时3D资产交付&quot; href=&quot;https://github.com/KhronosGroup/glTF&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;GitHub-KhronosGroup/glTF:glTF-运行时3D资产交付&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;lTF&amp;amp;ndash;运行时3D资产交付。通过在GitHub上创建帐户，为KhronosGroup/glTF的开发做出贡献。&quot;&gt;lTF&amp;amp;ndash;运行时3D资产交付。通过在GitHub上创建帐户，为KhronosGroup/glTF的开发做出贡献。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/356b89cce921ec7420a85cbb7ee003d9.ico&quot; alt=&quot;Poly Haven&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Poly Haven&quot; href=&quot;https://polyhaven.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Poly Haven&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;公共三维资产库Arch viz，游戏，虚幻，Unity，Blender，Maya，Max，免费，cc0，创意共享&quot;&gt;公共三维资产库Arch viz，游戏，虚幻，Unity，Blender，Maya，Max，免费，cc0，创意共享&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/icons8-p-100_1721265459608.png&quot; alt=&quot;Panorama to Cubemap&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Panorama to Cubemap&quot; href=&quot;https://jaxry.github.io/panorama-to-cubemap/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Panorama to Cubemap&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;将360&amp;amp;deg;全景图转换为立方体图。&quot;&gt;将360&amp;amp;deg;全景图转换为立方体图。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b9c270ecb10fad998733d80d4ef51be2.gif&quot; alt=&quot;阴影之书：噪音&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;阴影之书：噪音&quot; href=&quot;https://thebookofshaders.com/11/?lan=ch&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;阴影之书：噪音&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;通过片段阴影的抽象和复杂的宇宙温和的逐步指导。&quot;&gt;通过片段阴影的抽象和复杂的宇宙温和的逐步指导。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>搜索引擎</title>
		<link href="https://www.dtking.cn/classify/1719365245092376580/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245092376580/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;搜索引擎&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e9666038a78fe49cad61ea1051023cc2.png&quot; alt=&quot;必应&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;必应&quot; href=&quot;https://cn.bing.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;必应&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;必应可帮助你将理论付诸实践，使得搜索更加方便快捷，从而达到事半功倍的效果。&quot;&gt;必应可帮助你将理论付诸实践，使得搜索更加方便快捷，从而达到事半功倍的效果。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a64004b6d18862d5a1bc487854749264.png&quot; alt=&quot;Yandex&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Yandex&quot; href=&quot;https://yandex.eu/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Yandex&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Yandex是一家技术公司，致力于构建由机器学习驱动的智能产品和服务。我们的目标是帮助消费者和企业更好地驾驭线上和线下世界。自1997年以来，我们提供了世界级的、与当地相关的搜索和信息服务。此外，我们还为全球数百万消费者开发了市场领先的按需运输服务、导航产品和其他移动应用程序。Yandex在全球拥有17个办事处，自2011年以来一直在纳斯达克上市。&quot;&gt;Yandex是一家技术公司，致力于构建由机器学习驱动的智能产品和服务。我们的目标是帮助消费者和企业更好地驾驭线上和线下世界。自1997年以来，我们提供了世界级的、与当地相关的搜索和信息服务。此外，我们还为全球数百万消费者开发了市场领先的按需运输服务、导航产品和其他移动应用程序。Yandex在全球拥有17个办事处，自2011年以来一直在纳斯达克上市。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d24cff2a5569c463f789d30445ddb713.ico&quot; alt=&quot;360搜索，SO靠谱&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;360搜索，SO靠谱&quot; href=&quot;https://www.so.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;360搜索，SO靠谱&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;360搜索是安全、精准、可信赖的新一代搜索引擎，依托于360母品牌的安全优势，全面拦截各类钓鱼欺诈等恶意网站，提供更放心的搜索服务。 360搜索 so靠谱。&quot;&gt;360搜索是安全、精准、可信赖的新一代搜索引擎，依托于360母品牌的安全优势，全面拦截各类钓鱼欺诈等恶意网站，提供更放心的搜索服务。 360搜索 so靠谱。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f142c4a386e72a794d72bb56ccd8a3f1.ico&quot; alt=&quot;搜狗搜索引擎 - 上网从搜狗开始&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;搜狗搜索引擎 - 上网从搜狗开始&quot; href=&quot;https://www.sogou.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;搜狗搜索引擎 - 上网从搜狗开始&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;搜狗搜索是全球第三代互动式搜索引擎，支持微信公众号和文章搜索、知乎搜索、英文搜索及翻译等，通过自主研发的人工智能算法为用户提供专业、精准、便捷的搜索服务。&quot;&gt;搜狗搜索是全球第三代互动式搜索引擎，支持微信公众号和文章搜索、知乎搜索、英文搜索及翻译等，通过自主研发的人工智能算法为用户提供专业、精准、便捷的搜索服务。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3e3c235df34e18e3837a2340a4757e71.ico&quot; alt=&quot;神马搜索&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;神马搜索&quot; href=&quot;https://yz.m.sm.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;神马搜索&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;神马是全球第一款完全基于移动互联网的搜索引擎。神马为移动而生，专注于移动搜索用户刚需满足和痛点解决，致力于创造有用、有趣的全新移动搜索体验。&quot;&gt;神马是全球第一款完全基于移动互联网的搜索引擎。神马为移动而生，专注于移动搜索用户刚需满足和痛点解决，致力于创造有用、有趣的全新移动搜索体验。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/duckuckgo_1755076698009.png&quot; alt=&quot;DuckDuckGo - 保护。隐私。安心。&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DuckDuckGo - 保护。隐私。安心。&quot; href=&quot;https://duckduckgo.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DuckDuckGo - 保护。隐私。安心。&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一家让你能够无缝掌控在线个人信息的互联网隐私公司，而无需做出任何取舍。&quot;&gt;一家让你能够无缝掌控在线个人信息的互联网隐私公司，而无需做出任何取舍。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0a3b4e3e57c5ada1c11e8c50f0d82885.png&quot; alt=&quot;SearXNG 一个尊重隐私的开放元搜索引擎&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;SearXNG 一个尊重隐私的开放元搜索引擎&quot; href=&quot;https://searx.bndkt.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;SearXNG 一个尊重隐私的开放元搜索引擎&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;SearXNG 一个尊重隐私的开放元搜索引擎&quot;&gt;SearXNG 一个尊重隐私的开放元搜索引擎&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>字体图标</title>
		<link href="https://www.dtking.cn/classify/1719365245092376579/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245092376579/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;字体图标&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/21f67db327062840754b51428cf17b60.ico&quot; alt=&quot;自由矢量线图标（SVG、PNG、PSD、CSH、EPS、图标字体等）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;自由矢量线图标（SVG、PNG、PSD、CSH、EPS、图标字体等）&quot; href=&quot;https://linearicons.com/free&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;自由矢量线图标（SVG、PNG、PSD、CSH、EPS、图标字体等）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Linearicons是最高质量的线条图标集，与iOS中的极简UI设计相匹配。这个图标包是在20&amp;amp;amp;times;20的网格上精心设计的，其效果非常清晰，像素完美。免费版和高级版都很容易在包括iOS和Android在内的任何平台上使用。&quot;&gt;Linearicons是最高质量的线条图标集，与iOS中的极简UI设计相匹配。这个图标包是在20&amp;amp;amp;times;20的网格上精心设计的，其效果非常清晰，像素完美。免费版和高级版都很容易在包括iOS和Android在内的任何平台上使用。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cfe41d8ab1c0d79eda25dfcf9434b881.png&quot; alt=&quot;unDraw&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;unDraw&quot; href=&quot;https://undraw.co/illustrations&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;unDraw&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;该设计项目带有开源插图，可供您想象和创作任何创意。免费使用您的颜色创建美丽的网站、产品和应用程序。&quot;&gt;该设计项目带有开源插图，可供您想象和创作任何创意。免费使用您的颜色创建美丽的网站、产品和应用程序。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/48c7f743947011b6341ec8c5a1dc10c5.png&quot; alt=&quot;CSS图标集&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CSS图标集&quot; href=&quot;https://cssicon.space/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CSS图标集&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;CSS图标集&amp;amp;amp;mdash;&amp;amp;amp;mdash;张文婷&quot;&gt;CSS图标集&amp;amp;amp;mdash;&amp;amp;amp;mdash;张文婷&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.gstatic.com/images/icons/material/apps/fonts/1x/catalog/v5/favicon.svg&quot; alt=&quot;Google Fonts 谷歌免费字体&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Google Fonts 谷歌免费字体&quot; href=&quot;https://fonts.google.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Google Fonts 谷歌免费字体&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;所有 Google Fonts 都是开源的，是免费的。您可以将其用于商业用途，甚至可以用于商业销售的产品。 许可中指定了使用情况和重新分布条件。 最常见的许可是 SIL 开放字体许可。某些字体受 Apache 许可或 Ubuntu Font License 约束。 您可以根据这些条件重新分发开源字体。Google Fonts 是一个包含 1474 个开源字体系列和 API 的库，可通过 CSS 和 Android 方便地使用。该库还为常见的操作和项目提供了令人愉悦且制作精美的图标。下载它们以在您的 Android、iOS 和 Web 数字产品中使用。&quot;&gt;所有 Google Fonts 都是开源的，是免费的。您可以将其用于商业用途，甚至可以用于商业销售的产品。 许可中指定了使用情况和重新分布条件。 最常见的许可是 SIL 开放字体许可。某些字体受 Apache 许可或 Ubuntu Font License 约束。 您可以根据这些条件重新分发开源字体。Google Fonts 是一个包含 1474 个开源字体系列和 API 的库，可通过 CSS 和 Android 方便地使用。该库还为常见的操作和项目提供了令人愉悦且制作精美的图标。下载它们以在您的 Android、iOS 和 Web 数字产品中使用。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3604322667a2d7e061ad5d2bf3b3aa07.ico&quot; alt=&quot;Playground | DiceBearGitHubGitHub&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Playground | DiceBearGitHubGitHub&quot; href=&quot;https://www.dicebear.com/playground&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Playground | DiceBearGitHubGitHub&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;配置您的自定义头像，并查看如何在项目中使用它。&quot;&gt;配置您的自定义头像，并查看如何在项目中使用它。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4d70169c7f9c5adcb1d28726dc948b8c.ico&quot; alt=&quot;Font Awesome&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Font Awesome&quot; href=&quot;http://www.fontawesome.com.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Font Awesome&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Fontawesome中文版webfont,是一款基于css框架的网页字体图标库，它完全免费&quot;&gt;Fontawesome中文版webfont,是一款基于css框架的网页字体图标库，它完全免费&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/af90468aa506473b28a9e609ae5ad2ae.png&quot; alt=&quot;Bootstrap 图标库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Bootstrap 图标库&quot; href=&quot;https://icons.bootcss.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Bootstrap 图标库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Bootstrap 官方开源图标（icon）库&quot;&gt;Bootstrap 官方开源图标（icon）库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ddde4f888b630ae3b70bdcdceadaacbd.png&quot; alt=&quot;免费的图标、剪贴画插图、照片和音乐&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;免费的图标、剪贴画插图、照片和音乐&quot; href=&quot;https://igoutu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;免费的图标、剪贴画插图、照片和音乐&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;免费下载设计素材：图标、照片、矢量插图和视频音乐。所有素材均由设计师制作 &amp;amp;rarr; 质量始终如一⚡️&quot;&gt;免费下载设计素材：图标、照片、矢量插图和视频音乐。所有素材均由设计师制作 &amp;amp;rarr; 质量始终如一⚡️&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/colors_1725346311170.png&quot; alt=&quot;Coolors-超快速调色板生成器！&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Coolors-超快速调色板生成器！&quot; href=&quot;https://coolors.co/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Coolors-超快速调色板生成器！&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为您的设计生成或浏览美丽的颜色组合。&quot;&gt;为您的设计生成或浏览美丽的颜色组合。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c61e38287c63224e4e28cb27c2926d57.svg&quot; alt=&quot;ByteDance IconPark&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ByteDance IconPark&quot; href=&quot;https://iconpark.oceanengine.com/home&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ByteDance IconPark&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;图标标记，停放您的图标。字节跳动制造&quot;&gt;图标标记，停放您的图标。字节跳动制造&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ba124db68fe05d2d80dbec7dd9f024cd.ico&quot; alt=&quot;Atlas Icons&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Atlas Icons&quot; href=&quot;https://atlasicons.vectopus.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Atlas Icons&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;开源免费图标库，提供可变笔划SVG格式、web字体、Figma、React、Vue和Flutter即用包&quot;&gt;开源免费图标库，提供可变笔划SVG格式、web字体、Figma、React、Vue和Flutter即用包&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>在线OCR</title>
		<link href="https://www.dtking.cn/classify/1719365245025267717/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245025267717/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;在线OCR&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ac81551981230846661fbe78e7cda7ad.ico&quot; alt=&quot;奇客PDF转Word&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;奇客PDF转Word&quot; href=&quot;https://zh.geekersoft.com/pdf-to-word.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;奇客PDF转Word&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;免费将PDF文件在线转换为Word文档，速度快，质量好。将PDF转换为Word文档的三个步骤&quot;&gt;免费将PDF文件在线转换为Word文档，速度快，质量好。将PDF转换为Word文档的三个步骤&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c30a72b90ee6cdd1090e8f36536e0fa3.png&quot; alt=&quot;PearOCR&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;PearOCR&quot; href=&quot;https://pearocr.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PearOCR&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;完全免费无限制的文字识别网站，从图片中识别出可复制的文字并导出！&quot;&gt;完全免费无限制的文字识别网站，从图片中识别出可复制的文字并导出！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0477f9513ab3592445a962eed68528e5.ico&quot; alt=&quot;图片转文字 - 图片转Excel表格 - PDF转Word - 白描网页版&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;图片转文字 - 图片转Excel表格 - PDF转Word - 白描网页版&quot; href=&quot;https://web.baimiaoapp.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;图片转文字 - 图片转Excel表格 - PDF转Word - 白描网页版&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;白描，高效准确的中文ocr文字识别软件与文件扫描软件，支持简体、繁体、英文、韩语、日语、俄语等多国语言的准确识别，高清晰的文件扫描合成PDF,最好用的手机扫描仪，可以表格识别、图片转Excel，可以图片文字翻译，拍照翻译，包含iOS版，安卓版，小程序版，网页版，网页版可直接在电脑/PC/Mac上使用&quot;&gt;白描，高效准确的中文ocr文字识别软件与文件扫描软件，支持简体、繁体、英文、韩语、日语、俄语等多国语言的准确识别，高清晰的文件扫描合成PDF,最好用的手机扫描仪，可以表格识别、图片转Excel，可以图片文字翻译，拍照翻译，包含iOS版，安卓版，小程序版，网页版，网页版可直接在电脑/PC/Mac上使用&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1b58dfbca2be03026b7d9ef3244ca521.png&quot; alt=&quot;文件转换器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;文件转换器&quot; href=&quot;https://cn.office-converter.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;文件转换器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用这款免费快速在线转换器. 将pdf, 图像, 视频, 文档, 音频, 电子书及压缩等文件格式转换为其他格式。现支持超过20200多种不同格式转换。&quot;&gt;使用这款免费快速在线转换器. 将pdf, 图像, 视频, 文档, 音频, 电子书及压缩等文件格式转换为其他格式。现支持超过20200多种不同格式转换。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f8387ec53596e2c318208b66120e6a66.ico&quot; alt=&quot;在线文字识别转换&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线文字识别转换&quot; href=&quot;https://ocr.wdku.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线文字识别转换&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;免费的文字在线识别工具 - 通过图片识别文字，可保留原始格式，提供图像文字识别，提取图片文字，pdf文字识别，扫描文件识别服务、pdf转Word文档服务等。我们的Ocr服务支持中文、繁体中文、日语、韩语、英语、法语、俄语、德语等多种语言，输出结果支持PDF、Word和Txt格式。&quot;&gt;免费的文字在线识别工具 - 通过图片识别文字，可保留原始格式，提供图像文字识别，提取图片文字，pdf文字识别，扫描文件识别服务、pdf转Word文档服务等。我们的Ocr服务支持中文、繁体中文、日语、韩语、英语、法语、俄语、德语等多种语言，输出结果支持PDF、Word和Txt格式。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6806b8334f7f1ea95f66e6837071f501.ico&quot; alt=&quot;PDF转Word_PDF在线转换_在线免费转换PDF文件 - HiPDF&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;PDF转Word_PDF在线转换_在线免费转换PDF文件 - HiPDF&quot; href=&quot;https://www.hipdf.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PDF转Word_PDF在线转换_在线免费转换PDF文件 - HiPDF&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;PDF在线转换器,PDF免费转换,PDF转换Word在线,PDF在线压缩,PDF合并,图片转PDF
icons:&quot;&gt;PDF在线转换器,PDF免费转换,PDF转换Word在线,PDF在线压缩,PDF合并,图片转PDF
icons:&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/convertio.co.png&quot; alt=&quot;Convertio &amp;amp;amp;amp;mdash; 文件转换器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Convertio &amp;amp;amp;amp;mdash; 文件转换器&quot; href=&quot;https://convertio.co/zh/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Convertio &amp;amp;amp;amp;mdash; 文件转换器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Convertio &amp;amp;amp;amp;mdash; 文件转换器&quot;&gt;Convertio &amp;amp;amp;amp;mdash; 文件转换器&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/03c687c033047474e8a13ec885e99480.ico&quot; alt=&quot;OnlineConvertFree-免费在线转换器：转换文档、视频、音频和照片等文件&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;OnlineConvertFree-免费在线转换器：转换文档、视频、音频和照片等文件&quot; href=&quot;https://onlineconvertfree.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;OnlineConvertFree-免费在线转换器：转换文档、视频、音频和照片等文件&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我们的文件转换器将帮助您免费转换任何文件：文档、图像、音频和视频格式。✅ 我们的在线转换器不需要安装。&quot;&gt;我们的文件转换器将帮助您免费转换任何文件：文档、图像、音频和视频格式。✅ 我们的在线转换器不需要安装。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5cc1aed6f5d6ca9e705bbfed05827967.png&quot; alt=&quot;PDF24 Tools: 免费且易于使用的在线PDF工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;PDF24 Tools: 免费且易于使用的在线PDF工具&quot; href=&quot;https://tools.pdf24.org/zh/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PDF24 Tools: 免费且易于使用的在线PDF工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;合并、压缩、创建、编辑和转换PDF文件的免费在线PDF工具。 快捷方便。没有安装。没有注册&quot;&gt;合并、压缩、创建、编辑和转换PDF文件的免费在线PDF工具。 快捷方便。没有安装。没有注册&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>机器学习</title>
		<link href="https://www.dtking.cn/classify/1719365244962353155/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244962353155/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;机器学习&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/storage.googleapis.com.png&quot; alt=&quot;Open Images Dataset V7&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Open Images Dataset V7&quot; href=&quot;https://storage.googleapis.com/openimages/web/factsfigures_v7.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Open Images Dataset V7&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Open Images Dataset V6是谷歌开源的一个强大的图像公开数据集，里面包含约 900 万张图像，600个类别。可用于图像分类、对象检测、视觉关系检测、实例分割和多模态图像描述。
下图为该数据集的600个类别：&quot;&gt;Open Images Dataset V6是谷歌开源的一个强大的图像公开数据集，里面包含约 900 万张图像，600个类别。可用于图像分类、对象检测、视觉关系检测、实例分割和多模态图像描述。
下图为该数据集的600个类别：&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/325e3911bcad9866c5199d435acaad1c.ico&quot; alt=&quot;基于DeepLearning4J框架实现人脸检测_Gejin00的博客-CSDN博客&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;基于DeepLearning4J框架实现人脸检测_Gejin00的博客-CSDN博客&quot; href=&quot;https://blog.csdn.net/weixin_39876866/article/details/131242590&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;基于DeepLearning4J框架实现人脸检测_Gejin00的博客-CSDN博客&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用Java代码基于DeepLearning4J框架实现人脸检测功能，并集成到Springboot中。_deeplearning4j&quot;&gt;使用Java代码基于DeepLearning4J框架实现人脸检测功能，并集成到Springboot中。_deeplearning4j&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/325e3911bcad9866c5199d435acaad1c.ico&quot; alt=&quot;用Open Images Dataset V6制作yolo训练数据集(darknet版本)_openimage数据集_Philharmy_Wang的博客-CSDN博客&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;用Open Images Dataset V6制作yolo训练数据集(darknet版本)_openimage数据集_Philharmy_Wang的博客-CSDN博客&quot; href=&quot;https://blog.csdn.net/PhilharmyWang/article/details/121784119&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;用Open Images Dataset V6制作yolo训练数据集(darknet版本)_openimage数据集_Philharmy_Wang的博客-CSDN博客&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;pen Images Dataset V6是谷歌开源的一个强大的图像公开数据集，里面包含约 900 万张图像，600个类别。可用于图像分类、对象检测、视觉关系检测、实例分割和多模态图像描述。下图为该数据集的600个类别：可在链接中预览某个类别/某个图像任务的标注框。数据集的详细信息可参考论文：The Open Images Dataset V4: Unified image classification, object detection, and visual relationship det_openimage数据集&quot;&gt;pen Images Dataset V6是谷歌开源的一个强大的图像公开数据集，里面包含约 900 万张图像，600个类别。可用于图像分类、对象检测、视觉关系检测、实例分割和多模态图像描述。下图为该数据集的600个类别：可在链接中预览某个类别/某个图像任务的标注框。数据集的详细信息可参考论文：The Open Images Dataset V4: Unified image classification, object detection, and visual relationship det_openimage数据集&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/vis-www.cs.umass.edu.png&quot; alt=&quot;FDDB : Main&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;FDDB : Main&quot; href=&quot;http://vis-www.cs.umass.edu/fddb/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;FDDB : Main&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;FDDB : Main&quot;&gt;FDDB : Main&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a617fa9239be1bbac80c054829e67a7d.ico&quot; alt=&quot;中国医学对话数据集| Kaggle&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;中国医学对话数据集| Kaggle&quot; href=&quot;https://www.kaggle.com/datasets/thedevastator/chinese-medical-dialogue-model?select=finetune_test.csv&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;中国医学对话数据集| Kaggle&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;智能医疗的深度学习&quot;&gt;智能医疗的深度学习&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9bfebc15c5fa7f75e88933211f731288.png&quot; alt=&quot;Fast Image Downloader for Open Images V4 | LearnOpenCV #&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Fast Image Downloader for Open Images V4 | LearnOpenCV #&quot; href=&quot;https://learnopencv.com/fast-image-downloader-for-open-images-v4/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Fast Image Downloader for Open Images V4 | LearnOpenCV #&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;We provide a fast, multithreading based python script that helps you download the images from the publicly available Open Images V4 dataset.&quot;&gt;We provide a fast, multithreading based python script that helps you download the images from the publicly available Open Images V4 dataset.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/eff11246f06ad061e9cea59aa46ffe82.png&quot; alt=&quot;Deeplearning4j Suite Overview - Deeplearning4j&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Deeplearning4j Suite Overview - Deeplearning4j&quot; href=&quot;https://deeplearning4j.konduit.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Deeplearning4j Suite Overview - Deeplearning4j&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;深度学习4j核心概念介绍。&quot;&gt;深度学习4j核心概念介绍。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0c1cbdb5d83479b058b017fc5f9b2766.png&quot; alt=&quot;DL4J 社区&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DL4J 社区&quot; href=&quot;https://community.konduit.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DL4J 社区&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;dl4j 社区&quot;&gt;dl4j 社区&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/archive.ics.uci.edu.png&quot; alt=&quot;UCI机器学习库首页-UCI机器学库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;UCI机器学习库首页-UCI机器学库&quot; href=&quot;https://archive.ics.uci.edu/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;UCI机器学习库首页-UCI机器学库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;发现世界各地的数据集！&quot;&gt;发现世界各地的数据集！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b20ad89e30fe7e20c38bce75a6f8c542.ico&quot; alt=&quot;CIFAR-10 and CIFAR-100 datasets&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CIFAR-10 and CIFAR-100 datasets&quot; href=&quot;http://www.cs.toronto.edu/~kriz/cifar.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CIFAR-10 and CIFAR-100 datasets&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;CIFAR-10 and CIFAR-100 datasets&quot;&gt;CIFAR-10 and CIFAR-100 datasets&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon-yolo_1755760967963.png&quot; alt=&quot; Ultralytics YOLO 文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot; Ultralytics YOLO 文档&quot; href=&quot;https://docs.ultralytics.com/zh/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt; Ultralytics YOLO 文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;探索 Ultralytics YOLO - 最新的实时对象检测和图像分割技术。了解其功能，并在您的项目中最大限度地发挥其潜力。&quot;&gt;探索 Ultralytics YOLO - 最新的实时对象检测和图像分割技术。了解其功能，并在您的项目中最大限度地发挥其潜力。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>资源下载</title>
		<link href="https://www.dtking.cn/classify/1719365245025267716/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245025267716/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;资源下载&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e04cf1e8098d8d656498481063ae25fb.ico&quot; alt=&quot;MSDN, 我告诉你&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;MSDN, 我告诉你&quot; href=&quot;https://msdn.itellyou.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;MSDN, 我告诉你&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;MSDN, 我告诉你 - 做一个安静的工具站&quot;&gt;MSDN, 我告诉你 - 做一个安静的工具站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ab39cd1c62f2ed991df66ae6b5309ec3.ico&quot; alt=&quot;Nginx 下载地址&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nginx 下载地址&quot; href=&quot;https://nginx.org/download/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nginx 下载地址&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;各种版本&quot;&gt;各种版本&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/11273b3d5fa7ea76af0bd33a60c08c8b.ico&quot; alt=&quot;LICEcap GIF制作工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;LICEcap GIF制作工具&quot; href=&quot;https://www.cockos.com/licecap/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;LICEcap GIF制作工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;LICEcap 可以捕获桌面区域并将其直接保存为 .GIF（用于在网络浏览器等中查看）或 .LCF（见下文）。
LICEcap 是一个直观但灵活的应用程序（适用于 Windows 和现在的 OSX），其设计轻巧且功能强大。&quot;&gt;LICEcap 可以捕获桌面区域并将其直接保存为 .GIF（用于在网络浏览器等中查看）或 .LCF（见下文）。
LICEcap 是一个直观但灵活的应用程序（适用于 Windows 和现在的 OSX），其设计轻巧且功能强大。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a53be1dbd62a98fa4b28161c9b67db41.png&quot; alt=&quot;Redis 桌面管理器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Redis 桌面管理器&quot; href=&quot;https://github.com/qishibo/AnotherRedisDesktopManager?tab=readme-ov-file&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Redis 桌面管理器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;&quot;&gt;&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7c81e66d59fb711c137ebc2ada85e435.png&quot; alt=&quot;Google Chrome 网络浏览器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Google Chrome 网络浏览器&quot; href=&quot;https://www.google.cn/chrome/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Google Chrome 网络浏览器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;得益于 Google 智能工具，Chrome 现在更易用、更安全、更快速。&quot;&gt;得益于 Google 智能工具，Chrome 现在更易用、更安全、更快速。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b57846244b535f168bdd6a9d1ef56bbc.png&quot; alt=&quot;node&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;node&quot; href=&quot;https://nodejs.org/en/download/releases/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;node&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;node 历史版本下载&quot;&gt;node 历史版本下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9bc1b3e86e93b020a9289d5e7b3ea6d9.ico&quot; alt=&quot;idea 插件在线下载&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;idea 插件在线下载&quot; href=&quot;https://plugins.jetbrains.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;idea 插件在线下载&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;idea 插件在线下载&quot;&gt;idea 插件在线下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/s3.amazonaws.com.ico&quot; alt=&quot;Outline Client&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Outline Client&quot; href=&quot;https://s3.amazonaws.com/outline-releases/client/windows/stable/Outline-Client.exe&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Outline Client&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Outline Client&quot;&gt;Outline Client&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/27d33dca0b2f54c7a969e0a85a3135f7.ico&quot; alt=&quot;Umi-OCR_文字识别工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Umi-OCR_文字识别工具&quot; href=&quot;https://hiroi-sora.lanzoul.com/s/umi-ocr&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Umi-OCR_文字识别工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Umi-OCR_文字识别工具，蓝秦下载&quot;&gt;Umi-OCR_文字识别工具，蓝秦下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/2d76d8d766206d073e31c5f840327a1b.png&quot; alt=&quot;ES 中间件下载&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ES 中间件下载&quot; href=&quot;https://www.elastic.co/cn/downloads/past-releases#elasticsearch&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ES 中间件下载&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;寻找Elasticsearch、Logstash、Kibana、es hadoop、Shield、Marvel或我们的语言客户的过去版本？你在正确的地方。&quot;&gt;寻找Elasticsearch、Logstash、Kibana、es hadoop、Shield、Marvel或我们的语言客户的过去版本？你在正确的地方。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/nanoduke_1739946015522.ico&quot; alt=&quot;Archived OpenJDK GA Releasesa&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Archived OpenJDK GA Releasesa&quot; href=&quot;https://jdk.java.net/archive/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Archived OpenJDK GA Releasesa&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;OpenJDK常规可用性版本存档
此页面是以前发布的JDK版本的存档，这些版本根据GNU通用公共许可证版本2获得许可，但存在Classpath异常。

警告：提供这些旧版本的JDK是为了帮助开发人员调试旧系统中的问题。它们没有使用最新的安全补丁进行更新，不建议在生产中使用。&quot;&gt;OpenJDK常规可用性版本存档
此页面是以前发布的JDK版本的存档，这些版本根据GNU通用公共许可证版本2获得许可，但存在Classpath异常。

警告：提供这些旧版本的JDK是为了帮助开发人员调试旧系统中的问题。它们没有使用最新的安全补丁进行更新，不建议在生产中使用。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon-16px_1739945620528.ico&quot; alt=&quot;OpenJDK Downloads | Download Java JDK 8, 11, 17, &amp;amp; 21 | OpenLogicBack ButtonFilter Button&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;OpenJDK Downloads | Download Java JDK 8, 11, 17, &amp;amp; 21 | OpenLogicBack ButtonFilter Button&quot; href=&quot;https://www.openlogic.com/openjdk-downloads&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;OpenJDK Downloads | Download Java JDK 8, 11, 17, &amp;amp; 21 | OpenLogicBack ButtonFilter Button&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;OpenJDK 8、11、17和21的免费OpenJDK Java下载。此外，获取有关开源Java开发的常见问题解答，并每季度下载经过认证的免费OpenJDK版本。&quot;&gt;OpenJDK 8、11、17和21的免费OpenJDK Java下载。此外，获取有关开源Java开发的常见问题解答，并每季度下载经过认证的免费OpenJDK版本。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/appicon_1731895061220.png&quot; alt=&quot;微型RDM | Redis桌面管理器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微型RDM | Redis桌面管理器&quot; href=&quot;https://redis.tinycraft.cc/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微型RDM | Redis桌面管理器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;现代轻量级Redis GUI桌面管理器，直观的Redis数据库管理，支持多平台Windows、Mac和Linux，易于快速安装，连接本地和远程Redis，可视化键值数据，快速操作键值，内置控制台直接执行命令，数据浏览和导出，慢速日志查询，非常适合初学者和专家，极大地提高了Redis应用程序开发效率。&quot;&gt;现代轻量级Redis GUI桌面管理器，直观的Redis数据库管理，支持多平台Windows、Mac和Linux，易于快速安装，连接本地和远程Redis，可视化键值数据，快速操作键值，内置控制台直接执行命令，数据浏览和导出，慢速日志查询，非常适合初学者和专家，极大地提高了Redis应用程序开发效率。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c7e10044a0a43efdcc50d959ceb249dd.ico&quot; alt=&quot;Releases · kkevsekk1/AutoX · GitHub&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Releases · kkevsekk1/AutoX · GitHub&quot; href=&quot;https://github.com/kkevsekk1/AutoX/releases&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Releases · kkevsekk1/AutoX · GitHub&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具) - Releases · kkevsekk1/AutoX&quot;&gt;A UiAutomator on android, does not need root access(安卓平台上的JavaScript自动化工具) - Releases · kkevsekk1/AutoX&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/favicon.ico&quot; alt=&quot;图片像素坐标拾取&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;图片像素坐标拾取&quot; href=&quot;https://github.com/qfz9527/PointsPicker&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;图片像素坐标拾取&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Github&quot;&gt;Github&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a0790947c19a8840927e32cbfdc81bf0.ico&quot; alt=&quot;7-Zip - 程序下载&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;7-Zip - 程序下载&quot; href=&quot;https://sparanoid.com/lab/7z/download.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;7-Zip - 程序下载&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;7-zip, 7zip, 7z, lzma, sevenzip, archiver, compression, zip, best, compress, compressor, gnu, lgpl, unzip, far, win32&quot;&gt;7-zip, 7zip, 7z, lzma, sevenzip, archiver, compression, zip, best, compress, compressor, gnu, lgpl, unzip, far, win32&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/06dbb461d4fb42197b25a07d829eff9d.png&quot; alt=&quot;ScreenToGif-录制屏幕，编辑并保存为gif、视频或其他格式&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ScreenToGif-录制屏幕，编辑并保存为gif、视频或其他格式&quot; href=&quot;https://www.screentogif.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ScreenToGif-录制屏幕，编辑并保存为gif、视频或其他格式&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;免费的屏幕录制工具，可以录制、编辑并保存为gif、视频或其他格式。&quot;&gt;免费的屏幕录制工具，可以录制、编辑并保存为gif、视频或其他格式。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/logo_1731895267956.svg&quot; alt=&quot;Chrome测试版本&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Chrome测试版本&quot; href=&quot;https://googlechromelabs.github.io/chrome-for-testing/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Chrome测试版本&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;此页面列出了每个Chrome发布渠道的最新可用跨平台Chrome测试版本&quot;&gt;此页面列出了每个Chrome发布渠道的最新可用跨平台Chrome测试版本&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/109b05ff0d7be191d280555f5fb7690e.png&quot; alt=&quot;CentOS 官网下载&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CentOS 官网下载&quot; href=&quot;https://www.centos.org/download/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CentOS 官网下载&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Centos 镜像下载&quot;&gt;Centos 镜像下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>站长工具</title>
		<link href="https://www.dtking.cn/classify/1813941918187413506/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1813941918187413506/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;站长工具&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/190b08389847852a747bad28f2d7ebcd.ico&quot; alt=&quot;必应&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;必应&quot; href=&quot;https://www.bing.com/webmasters/about&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;必应&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;提高您网站的搜索性能。获取免费报告、工具和资源。&quot;&gt;提高您网站的搜索性能。获取免费报告、工具和资源。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/348867c30b59388a9ea6e54cb538bf31.ico&quot; alt=&quot;百度&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;百度&quot; href=&quot;https://ziyuan.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;百度&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;百度搜索面向合作伙伴的官方平台，为开发者、内容创作者、站点管理者等伙伴，提供优化工具、数据、课程、Q&amp;amp;A等服务，助力资源进入搜索，同时提供搜索项目合作机会，让优质资源脱颖而出。&quot;&gt;百度搜索面向合作伙伴的官方平台，为开发者、内容创作者、站点管理者等伙伴，提供优化工具、数据、课程、Q&amp;amp;A等服务，助力资源进入搜索，同时提供搜索项目合作机会，让优质资源脱颖而出。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/search_console-32_1721312967025.png&quot; alt=&quot;谷歌&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;谷歌&quot; href=&quot;https://search.google.com/search-console&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;谷歌&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;谷歌站长工具&quot;&gt;谷歌站长工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/52ec076b9db3f192eae2a2e72b71c853.ico&quot; alt=&quot;搜狗&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;搜狗&quot; href=&quot;https://zhanzhang.sogou.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;搜狗&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;搜狗资源平台_公平开放的交流平台&quot;&gt;搜狗资源平台_公平开放的交流平台&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df705d76af5156bbcd86ca27f1458753.ico&quot; alt=&quot;百度统计&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;百度统计&quot; href=&quot;https://tongji.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;百度统计&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;百度统计——一站式智能数据分析与应用平台&quot;&gt;百度统计——一站式智能数据分析与应用平台&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/006391357156c2100b37659a2906b576.ico&quot; alt=&quot;站长工具 - 站长之家&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;站长工具 - 站长之家&quot; href=&quot;https://tool.chinaz.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;站长工具 - 站长之家&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;站长工具是站长的必备工具。经常上站长工具可以了解SEO数据变化。还可以检测网站死链接、蜘蛛访问、HTML格式检测、网站速度测试、友情链接检查、网站域名IP查询、PR、权重查询、alexa、whois查询等等。&quot;&gt;站长工具是站长的必备工具。经常上站长工具可以了解SEO数据变化。还可以检测网站死链接、蜘蛛访问、HTML格式检测、网站速度测试、友情链接检查、网站域名IP查询、PR、权重查询、alexa、whois查询等等。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6bf10e08ea93f9a098c73d95006d52ca.ico&quot; alt=&quot;Microsoft Clarity-免费热图和会话录制&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Microsoft Clarity-免费热图和会话录制&quot; href=&quot;https://clarity.microsoft.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Microsoft Clarity-免费热图和会话录制&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Clarity是一个免费的用户行为分析工具，可帮助您了解用户如何通过会话回放和热图与您的网站进行交互。&quot;&gt;Clarity是一个免费的用户行为分析工具，可帮助您了解用户如何通过会话回放和热图与您的网站进行交互。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/35d6e2f6992d935c1371d4450f692c9a.ico&quot; alt=&quot; 360站长平台-站长平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot; 360站长平台-站长平台&quot; href=&quot;https://zhanzhang.so.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt; 360站长平台-站长平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;
360站长平台-站长平台
&quot;&gt;
360站长平台-站长平台
&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>Github</title>
		<link href="https://www.dtking.cn/classify/1719365245092376578/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245092376578/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;Github&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;cheeriojs&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;cheeriojs&quot; href=&quot;https://github.com/cheeriojs/cheerio/wiki/Chinese-README&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;cheeriojs&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;The fast, flexible, and elegant library for parsing and manipulating HTML and XML. - Chinese README · cheeriojs/cheerio Wiki&quot;&gt;The fast, flexible, and elegant library for parsing and manipulating HTML and XML. - Chinese README · cheeriojs/cheerio Wiki&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c3771e2a87952ad9dd75b9b3c1a0e54e.png&quot; alt=&quot;Github-yzuu&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Github-yzuu&quot; href=&quot;https://hub.yzuu.cf/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Github-yzuu&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;GitHub是8300多万开发者共同塑造软件未来的地方。加入开源社区，管理您的Git存储库，像专业人员一样审查代码，跟踪错误和功能，为您的CI/CD和DevOps工作流提供动力，并在提交代码之前保护代码&quot;&gt;GitHub是8300多万开发者共同塑造软件未来的地方。加入开源社区，管理您的Git存储库，像专业人员一样审查代码，跟踪错误和功能，为您的CI/CD和DevOps工作流提供动力，并在提交代码之前保护代码&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;一个可视化爬虫软件，可以无代码图形化设计和执行的爬虫任务&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;一个可视化爬虫软件，可以无代码图形化设计和执行的爬虫任务&quot; href=&quot;https://github.com/NaiboWang/EasySpider&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;一个可视化爬虫软件，可以无代码图形化设计和执行的爬虫任务&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个可视化爬虫软件，可以无代码图形化设计和执行的爬虫任务&quot;&gt;一个可视化爬虫软件，可以无代码图形化设计和执行的爬虫任务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;java 热门项目&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;java 热门项目&quot; href=&quot;https://github.com/trending/java&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;java 热门项目&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;GitHub是人们构建软件的地方。超过1亿人使用GitHub来发现、分叉和贡献超过3.3亿个项目。&quot;&gt;GitHub是人们构建软件的地方。超过1亿人使用GitHub来发现、分叉和贡献超过3.3亿个项目。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;中华人民共和国行政区划&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;中华人民共和国行政区划&quot; href=&quot;https://github.com/modood/Administrative-divisions-of-China&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;中华人民共和国行政区划&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;中华人民共和国行政区划：省级（省份）、 地级（城市）、 县级（区县）、 乡级（乡镇街道）、 村级（村委会居委会） ，中国省市区镇村二级三级四级五级联动地址数据。 - modood/Administrative-divisions-of-China: 中华人民共和国行政区划：省级（省份）、 地级（城市）、 县级（区县）、 乡级（乡镇街道）、 村级（村委会居委会） ，中国省市区镇村二级三级四级五级联动地址数据。&quot;&gt;中华人民共和国行政区划：省级（省份）、 地级（城市）、 县级（区县）、 乡级（乡镇街道）、 村级（村委会居委会） ，中国省市区镇村二级三级四级五级联动地址数据。 - modood/Administrative-divisions-of-China: 中华人民共和国行政区划：省级（省份）、 地级（城市）、 县级（区县）、 乡级（乡镇街道）、 村级（村委会居委会） ，中国省市区镇村二级三级四级五级联动地址数据。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;GitHub中文排行榜&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;GitHub中文排行榜&quot; href=&quot;https://github.com/jackfrued/GitHub-Chinese-Top-Charts&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;GitHub中文排行榜&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;GitHub中文排行榜，帮助你发现高分优秀中文项目、更高效地吸收国人的优秀经验成果；榜单每周更新一次，敬请关注！ - jackfrued/GitHub-Chinese-Top-Charts: GitHub中文排行榜，帮助你发现高分优秀中文项目、更高效地吸收国人的优秀经验成果；榜单每周更新一次，敬请关注！&quot;&gt;GitHub中文排行榜，帮助你发现高分优秀中文项目、更高效地吸收国人的优秀经验成果；榜单每周更新一次，敬请关注！ - jackfrued/GitHub-Chinese-Top-Charts: GitHub中文排行榜，帮助你发现高分优秀中文项目、更高效地吸收国人的优秀经验成果；榜单每周更新一次，敬请关注！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;JigsawTwitter&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;JigsawTwitter&quot; href=&quot;https://github.com/Jigsaw-Code/?q=outline&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;JigsawTwitter&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Jigsaw is an incubator within Google that uses technology to address geopolitical issues. - Jigsaw&quot;&gt;Jigsaw is an incubator within Google that uses technology to address geopolitical issues. - Jigsaw&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;chatgpt-web&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;chatgpt-web&quot; href=&quot;https://github.com/Chanzhaoyu/chatgpt-web&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;chatgpt-web&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;chatgpt-web&quot;&gt;chatgpt-web&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&quot; href=&quot;https://github.com/Stability-AI/stablediffusion&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;High-Resolution Image Synthesis with Latent Diffusion Models - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&quot;&gt;High-Resolution Image Synthesis with Latent Diffusion Models - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;HUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;HUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型&quot; href=&quot;https://github.com/THUDM/ChatGLM-6B&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;HUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;High-Resolution Image Synthesis with Latent Diffusion Models - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&quot;&gt;High-Resolution Image Synthesis with Latent Diffusion Models - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/github.com.ico&quot; alt=&quot;基于本地知识库的 ChatGLM 问答&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;基于本地知识库的 ChatGLM 问答&quot; href=&quot;https://github.com/imClumsyPanda/langchain-ChatGLM&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;基于本地知识库的 ChatGLM 问答&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;langchain-ChatGLM, local knowledge based ChatGLM with langchain ｜ 基于本地知识库的 ChatGLM 问答 - imClumsyPanda/langchain-ChatGLM: langchain-ChatGLM, local knowledge based ChatGLM with langchain ｜ 基于本地知识库的 ChatGLM 问答&quot;&gt;langchain-ChatGLM, local knowledge based ChatGLM with langchain ｜ 基于本地知识库的 ChatGLM 问答 - imClumsyPanda/langchain-ChatGLM: langchain-ChatGLM, local knowledge based ChatGLM with langchain ｜ 基于本地知识库的 ChatGLM 问答&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>仓库镜像</title>
		<link href="https://www.dtking.cn/classify/1719365245025267714/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245025267714/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;仓库镜像&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c24406dbb65688bcf6f91b64d2f5ccb1.png&quot; alt=&quot;jsDelivr&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;jsDelivr&quot; href=&quot;https://www.jsdelivr.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;jsDelivr&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;支持npm、GitHub、WordPress、Deno等。所有CDN中最大的网络和最佳的性能。每月服务超过800亿次请求&quot;&gt;支持npm、GitHub、WordPress、Deno等。所有CDN中最大的网络和最佳的性能。每月服务超过800亿次请求&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9f43bcd4f1a01d5efa0b5be08510b846.png&quot; alt=&quot;字节跳动静态资源公共库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;字节跳动静态资源公共库&quot; href=&quot;https://cdn.bytedance.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;字节跳动静态资源公共库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;字节跳动静态资源库支持多协议、资源动态拼接、快速检索及资源的动态更新,安全、稳定、实时&quot;&gt;字节跳动静态资源库支持多协议、资源动态拼接、快速检索及资源的动态更新,安全、稳定、实时&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/59a8931b3b80eabe1b1675e6d143388f.png&quot; alt=&quot;BootCDN&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;BootCDN&quot; href=&quot;https://www.bootcdn.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;BootCDN&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Bootstrap 中文网开源项目免费 CDN 加速服务&quot;&gt;Bootstrap 中文网开源项目免费 CDN 加速服务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/836e6057e681bbd9d1ae29f5ea8ee4d6.ico&quot; alt=&quot;UNPKG&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;UNPKG&quot; href=&quot;https://unpkg.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;UNPKG&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;The CDN for everything on npm&quot;&gt;The CDN for everything on npm&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6e23e66f4a78fd3beee73a0c2d28dfdb.png&quot; alt=&quot;NPM源&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;NPM源&quot; href=&quot;https://www.npmjs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;NPM源&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;NPM&quot;&gt;NPM&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/7080b8b0f6f48e6fbaffd5f9d85fcc7f-favicon_1701163807840.ico&quot; alt=&quot;Maven仓库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Maven仓库&quot; href=&quot;https://mvnrepository.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Maven仓库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Maven中央仓库&quot;&gt;Maven中央仓库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4f180b49cd87b5822f28de616656f5e7.ico&quot; alt=&quot;Staticfile CDN&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Staticfile CDN&quot; href=&quot;https://www.staticfile.net&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Staticfile CDN&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我们的目标是提供这样一个仓库，让它尽可能面收录尤秀的开源库，并免费为之提供CDN 加速服务，时之有更好的访速度和稳定的环境。同时，我们也提供开源库源接入的入口，让所有人都可以提交开源库，包括JavaScript、Css、图片和swt等静态文件。&quot;&gt;我们的目标是提供这样一个仓库，让它尽可能面收录尤秀的开源库，并免费为之提供CDN 加速服务，时之有更好的访速度和稳定的环境。同时，我们也提供开源库源接入的入口，让所有人都可以提交开源库，包括JavaScript、Css、图片和swt等静态文件。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cb127b63e215a7799bd4c7aedb246b89.ico&quot; alt=&quot;阿里镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;阿里镜像站&quot; href=&quot;https://developer.aliyun.com/mirror/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;阿里镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;阿里巴巴开源镜像站，免费提供Linux镜像下载服务，拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源，此外还提供域名解析DNS、网络授时NTP等服务，致力于为互联网用户提供全面，高效和稳定的基础服务&quot;&gt;阿里巴巴开源镜像站，免费提供Linux镜像下载服务，拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源，此外还提供域名解析DNS、网络授时NTP等服务，致力于为互联网用户提供全面，高效和稳定的基础服务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df0e27e5f9ad7051ef229add5b2f4604.ico&quot; alt=&quot;Maven Central 仓库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Maven Central 仓库&quot; href=&quot;https://central.sonatype.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Maven Central 仓库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Maven Central Repository维护人员的官方搜索。&quot;&gt;Maven Central Repository维护人员的官方搜索。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/46422d85382ba49fe912a752ebee1b2c.ico&quot; alt=&quot;npmmirror 淘宝镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;npmmirror 淘宝镜像站&quot; href=&quot;https://npmmirror.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;npmmirror 淘宝镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;npmmirror 中国镜像站&quot;&gt;npmmirror 中国镜像站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9e504fc6c419d0f39d8f624be819b09c.png&quot; alt=&quot;Rpmfind&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Rpmfind&quot; href=&quot;https://www.rpmfind.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Rpmfind&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Rpmfind mirror located at Insa-lyon.&quot;&gt;Rpmfind mirror located at Insa-lyon.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3b7a3b87a34108993e13a742aba6ece8.ico&quot; alt=&quot;CentOS镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CentOS镜像站&quot; href=&quot;https://mirror.nsc.liu.se/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CentOS镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;CentOS&quot;&gt;CentOS&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://statics.itc.cn/mp-new/icon/1.1/favicon.ico&quot; alt=&quot;搜狐开源软件镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;搜狐开源软件镜像站&quot; href=&quot;http://mirrors.sohu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;搜狐开源软件镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;搜狐开源软件镜像站&quot;&gt;搜狐开源软件镜像站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/afa3aed47462906ae5bf1e79dbdf7136.ico&quot; alt=&quot;Maven &amp;amp; Gradle Repository - Maven Central&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Maven &amp;amp; Gradle Repository - Maven Central&quot; href=&quot;https://mavenlibs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Maven &amp;amp; Gradle Repository - Maven Central&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;搜索并安装Maven和Gradle依赖项。下载免费JAR、Javadoc、源代码-所有版本&quot;&gt;搜索并安装Maven和Gradle依赖项。下载免费JAR、Javadoc、源代码-所有版本&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/854762a59f55b025ae2406b4f8068372.png&quot; alt=&quot;清华大学开源软件镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;清华大学开源软件镜像站&quot; href=&quot;https://mirrors.tuna.tsinghua.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;清华大学开源软件镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;清华大学开源软件镜像站，致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务，帮助用户更方便地获取开源软件。本镜像站由清华大学 TUNA 协会负责运行维护&quot;&gt;清华大学开源软件镜像站，致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务，帮助用户更方便地获取开源软件。本镜像站由清华大学 TUNA 协会负责运行维护&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7ee03ff9407d05ecfdc302a2c1106c13.png&quot; alt=&quot;中国科学技术大学开源软件镜像&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;中国科学技术大学开源软件镜像&quot; href=&quot;https://mirrors.ustc.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;中国科学技术大学开源软件镜像&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;mirrors.ustc.edu.cn 是 Debian, Ubuntu, Fedora, Archlinux, CentOS 等多个发行版的官方源。目前是中国大陆高校访问量最大，收录最全的开源软件镜像。&quot;&gt;mirrors.ustc.edu.cn 是 Debian, Ubuntu, Fedora, Archlinux, CentOS 等多个发行版的官方源。目前是中国大陆高校访问量最大，收录最全的开源软件镜像。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/07c20df59923316690be014af4b6bf83.png&quot; alt=&quot;上海交通大学开源软件镜像&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;上海交通大学开源软件镜像&quot; href=&quot;https://mirror.sjtu.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;上海交通大学开源软件镜像&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;上海交通大学 Linux 用户组 软件源镜像服务&quot;&gt;上海交通大学 Linux 用户组 软件源镜像服务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/84585f8bf3395a9589c81811231923b8.png&quot; alt=&quot;重庆大学开源软件镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;重庆大学开源软件镜像站&quot; href=&quot;https://mirrors.cqu.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;重庆大学开源软件镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;重庆大学开源软件镜像站，致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务，帮助用户更方便地获取开源软件。本镜像站由重庆大学蓝盟负责维护。&quot;&gt;重庆大学开源软件镜像站，致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务，帮助用户更方便地获取开源软件。本镜像站由重庆大学蓝盟负责维护。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://cloud.tencent.com/favicon.ico&quot; alt=&quot;腾讯开源镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;腾讯开源镜像站&quot; href=&quot;https://mirrors.cloud.tencent.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;腾讯开源镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;腾讯开源镜像站&quot;&gt;腾讯开源镜像站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1958a75852e507c08e88ee80b174cfd9.ico&quot; alt=&quot;网易开源镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;网易开源镜像站&quot; href=&quot;http://mirrors.163.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;网易开源镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;网易开源镜像站&quot;&gt;网易开源镜像站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7a28e210591253721fb0a28b98c8274b.ico&quot; alt=&quot;南京大学开源软件镜像&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;南京大学开源软件镜像&quot; href=&quot;https://mirrors.nju.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;南京大学开源软件镜像&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;南京大学软件源镜像服务&quot;&gt;南京大学软件源镜像服务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d1773fea5ec4928d3037a3e41b89870b.png&quot; alt=&quot;浙江大学开源软件镜像&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;浙江大学开源软件镜像&quot; href=&quot;https://mirrors.zju.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;浙江大学开源软件镜像&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;浙江大学软件源镜像服务&quot;&gt;浙江大学软件源镜像服务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/eb3526c8b036973370e5fad4a87f070d.ico&quot; alt=&quot;兰州大学开源社区&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;兰州大学开源社区&quot; href=&quot;https://mirror.lzu.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;兰州大学开源社区&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;兰州大学开源社区镜像站提供主流 GNU/Linux 发行版以及开源、自由软件镜像。&quot;&gt;兰州大学开源社区镜像站提供主流 GNU/Linux 发行版以及开源、自由软件镜像。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b3f9c96a4a96fc60d2782ca12c63c984.ico&quot; alt=&quot;北京交通大学开源软件镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;北京交通大学开源软件镜像站&quot; href=&quot;https://mirror.bjtu.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;北京交通大学开源软件镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Beijing Jiaotong University free and open source software mirror,北京交通大学开源镜像站。&quot;&gt;Beijing Jiaotong University free and open source software mirror,北京交通大学开源镜像站。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/57ff54eff2db84915d93d1e55f24da1c.ico&quot; alt=&quot;华为开源镜像站&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;华为开源镜像站&quot; href=&quot;https://mirrors.huaweicloud.com/home&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;华为开源镜像站&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;华为云DevCloud团队提供的全类型镜像站服务，提供主流开发语言组件、操作系统、常用工具和库等镜像，极速下载，全站CDN，官方合作。&quot;&gt;华为云DevCloud团队提供的全类型镜像站服务，提供主流开发语言组件、操作系统、常用工具和库等镜像，极速下载，全站CDN，官方合作。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-07-17_22-32-14_1721226620657.jpg&quot; alt=&quot;开源镜像站 | 大连东软信息学院&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;开源镜像站 | 大连东软信息学院&quot; href=&quot;https://mirrors.neusoft.edu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;开源镜像站 | 大连东软信息学院&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;开源镜像站 | 大连东软信息学院&quot;&gt;开源镜像站 | 大连东软信息学院&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>攻防安全</title>
		<link href="https://www.dtking.cn/classify/1719365244962353157/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244962353157/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;攻防安全&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/334c52a97d02380cbe030869c94f1168.ico&quot; alt=&quot;BinaryAI&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;BinaryAI&quot; href=&quot;https://www.binaryai.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;BinaryAI&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;SCA,BinaryAI,security,KEENLAB,软件成分分析,二进制漏洞扫描,二进制程序分析&quot;&gt;SCA,BinaryAI,security,KEENLAB,软件成分分析,二进制漏洞扫描,二进制程序分析&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d6e043a3805912ad905bffe5ad1cd3d7.ico&quot; alt=&quot;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台&quot; href=&quot;https://www.ipdatacloud.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IP数据云 - 免费IP地址查询 - 全球IP地址定位平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;IP数据云提供精准IP地址查询、IP地址定位，提供实时查询、批量查询、IP接口定制等服务。IP数据云将网络空间地图测绘技术与人工智能&quot;&gt;IP数据云提供精准IP地址查询、IP地址定位，提供实时查询、批量查询、IP接口定制等服务。IP数据云将网络空间地图测绘技术与人工智能&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;404StarLink&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;404StarLink&quot; href=&quot;https://github.com/knownsec/404StarLink&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;404StarLink&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;404StarLink - 推荐优质、有意义、有趣、坚持维护的安全开源项目. Contribute to knownsec/404StarLink development by creating an account on GitHub.&quot;&gt;404StarLink - 推荐优质、有意义、有趣、坚持维护的安全开源项目. Contribute to knownsec/404StarLink development by creating an account on GitHub.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-10-31_10-04-42_1730340064142.jpg&quot; alt=&quot;从多个位置进行Ping、mtr、dig和TCP端口检查&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;从多个位置进行Ping、mtr、dig和TCP端口检查&quot; href=&quot;https://ping.pe/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;从多个位置进行Ping、mtr、dig和TCP端口检查&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;有史以来最好的Ping+MTR组合，加上TCP端口检查器和DNS诊断，可从多个位置进行挖掘。&quot;&gt;有史以来最好的Ping+MTR组合，加上TCP端口检查器和DNS诊断，可从多个位置进行挖掘。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/30131a2f426f7682848952d135f7e117.ico&quot; alt=&quot;IPChecker检查IP是否被封的利器 - VPS234主机测评&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;IPChecker检查IP是否被封的利器 - VPS234主机测评&quot; href=&quot;https://www.vps234.com/ipchecker/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IPChecker检查IP是否被封的利器 - VPS234主机测评&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;IPChecker是VPS234开发的一款检查IP是否被墙的利器，通过本工具你可以轻松检查IP是否被封，这款工具通过国内国外检查通过TCP、ICMP访问判断IP是否被封，轻松检查IP在中国大陆是否可以用&quot;&gt;IPChecker是VPS234开发的一款检查IP是否被墙的利器，通过本工具你可以轻松检查IP是否被封，这款工具通过国内国外检查通过TCP、ICMP访问判断IP是否被封，轻松检查IP在中国大陆是否可以用&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3ac981ccc9111ad6f18df48f2f5bb3aa.png&quot; alt=&quot;经纬度查询定位 拾取坐标系统 经纬度查询地图&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;经纬度查询定位 拾取坐标系统 经纬度查询地图&quot; href=&quot;http://jingweidu.757dy.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;经纬度查询定位 拾取坐标系统 经纬度查询地图&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;经纬度查询定位,经纬度查询,经纬度定位,拾取坐标系统&quot;&gt;经纬度查询定位,经纬度查询,经纬度定位,拾取坐标系统&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a11faa3c6c2f15572fa0581351c0b7ca.png&quot; alt=&quot;Nmap:网络映射器-免费安全扫描程序&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nmap:网络映射器-免费安全扫描程序&quot; href=&quot;https://nmap.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nmap:网络映射器-免费安全扫描程序&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Nmap免费安全扫描仪，端口扫描仪，和网络探索工具。下载适用于Linux、Windows、UNIX、FreeBSD等的开源软件。&quot;&gt;Nmap免费安全扫描仪，端口扫描仪，和网络探索工具。下载适用于Linux、Windows、UNIX、FreeBSD等的开源软件。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f0e0b0ba9935ce6fcb720364cfe6afe0.svg&quot; alt=&quot;NodeCook | 全球 Ping，Traceroute，DNS，HTTP 以及更多&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;NodeCook | 全球 Ping，Traceroute，DNS，HTTP 以及更多&quot; href=&quot;https://www.nodecook.com/zh/ping&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;NodeCook | 全球 Ping，Traceroute，DNS，HTTP 以及更多&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用 Ping，Traceroute，DNS，HTTP 等方式从全球的节点测试您的服务器和网站&quot;&gt;使用 Ping，Traceroute，DNS，HTTP 等方式从全球的节点测试您的服务器和网站&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/38113501892aa8197e5ff654bfe0b60a.ico&quot; alt=&quot;网站测速|网站速度测试|网速测试|电信|联通|网通|全国|监控|CDN|PING|DNS 一起测试|17CE.COM&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;网站测速|网站速度测试|网速测试|电信|联通|网通|全国|监控|CDN|PING|DNS 一起测试|17CE.COM&quot; href=&quot;https://17ce.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;网站测速|网站速度测试|网速测试|电信|联通|网通|全国|监控|CDN|PING|DNS 一起测试|17CE.COM&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;国内最专业最权威的实时网站测速、服务器监控、网络监控、IDC质量评测、PING,DNS,HTTP,CDN测试网站速度监控，遍及国内各省和国外的监测点，包括电信、网通、联通、移动、长城宽带、教育网等线路，测试网站在全国各地和海外的打开速度，全面的报表功能、对比功能、地图展示、柱型图展示等专业测速网站 &quot;&gt;国内最专业最权威的实时网站测速、服务器监控、网络监控、IDC质量评测、PING,DNS,HTTP,CDN测试网站速度监控，遍及国内各省和国外的监测点，包括电信、网通、联通、移动、长城宽带、教育网等线路，测试网站在全国各地和海外的打开速度，全面的报表功能、对比功能、地图展示、柱型图展示等专业测速网站 &lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon_1735896153956.ico&quot; alt=&quot;ITDOG - 在线ping_在线tcping_网站测速_HTTP测速_API测速_路由追踪_在线MTR_DNS查询_ITDOG&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ITDOG - 在线ping_在线tcping_网站测速_HTTP测速_API测速_路由追踪_在线MTR_DNS查询_ITDOG&quot; href=&quot;https://www.itdog.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ITDOG - 在线ping_在线tcping_网站测速_HTTP测速_API测速_路由追踪_在线MTR_DNS查询_ITDOG&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;本站为IT运维人员提供实用的工具，多地ping测试、多地tcping测试、网站测速、HTTP测速、API测速、路由追踪、在线MTR 、DNS查询等。&quot;&gt;本站为IT运维人员提供实用的工具，多地ping测试、多地tcping测试、网站测速、HTTP测速、API测速、路由追踪、在线MTR 、DNS查询等。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d1b3592982a1041780f5752fc18a202a.ico&quot; alt=&quot;IPUU IP查询&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;IPUU IP查询&quot; href=&quot;https://www.ipuu.net/query/ip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IPUU IP查询&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;IPUU IP查询&quot;&gt;IPUU IP查询&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/712905df59df6c0791e7401774aae61d.png&quot; alt=&quot;AcuMonitor Technology | Acunetix&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;AcuMonitor Technology | Acunetix&quot; href=&quot;https://www.acunetix.com/vulnerability-scanner/acumonitor-technology/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;AcuMonitor Technology | Acunetix&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;AcuMonitor是Acunetix中的一项服务，用于检查只能通过中间服务器检测到的XXE攻击等漏洞。&quot;&gt;AcuMonitor是Acunetix中的一项服务，用于检查只能通过中间服务器检测到的XXE攻击等漏洞。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/930e212af13a26dfb1b66e11a103a64a.ico&quot; alt=&quot;高精度IP地址查询|查IP|IP地址查询|IP定位|精确定位|百度高精度IP-www.chaipip.com&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;高精度IP地址查询|查IP|IP地址查询|IP定位|精确定位|百度高精度IP-www.chaipip.com&quot; href=&quot;https://chaipip.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;高精度IP地址查询|查IP|IP地址查询|IP定位|精确定位|百度高精度IP-www.chaipip.com&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;IP地址查询,IP地址精确查询,百度高精度IP定位,IP精准定位,百度高精度AK,国外IP定位,IP地址,IP探测,IP数据库,IP查询&quot;&gt;IP地址查询,IP地址精确查询,百度高精度IP定位,IP精准定位,百度高精度AK,国外IP定位,IP地址,IP探测,IP数据库,IP查询&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/logo_ip138_1721263678780.png&quot; alt=&quot;IP属地 IP属地查询 IP归属地查询 IP地址归属地查询&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;IP属地 IP属地查询 IP归属地查询 IP地址归属地查询&quot; href=&quot;https://www.ipshudi.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IP属地 IP属地查询 IP归属地查询 IP地址归属地查询&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;IP归属地查询是一个iP地址查询网站,通过IP查询出具体的归属地、运营商、网络类型等数据，IP属地查询支持ipV4和ipV6各类ip地址查询。&quot;&gt;IP归属地查询是一个iP地址查询网站,通过IP查询出具体的归属地、运营商、网络类型等数据，IP属地查询支持ipV4和ipV6各类ip地址查询。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/241b4cb28a998dcf636875776529dea1.ico&quot; alt=&quot;iP地址查询--手机号码查询归属地 | 邮政编码查询 | iP地址归属地查询 | 身份证号码验证在线查询网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;iP地址查询--手机号码查询归属地 | 邮政编码查询 | iP地址归属地查询 | 身份证号码验证在线查询网&quot; href=&quot;https://www.ip138.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;iP地址查询--手机号码查询归属地 | 邮政编码查询 | iP地址归属地查询 | 身份证号码验证在线查询网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;ip,ip查询,ip地址查询,ip138,查ip,我的ip,公网ip,ip归属地&quot;&gt;ip,ip查询,ip地址查询,ip138,查ip,我的ip,公网ip,ip归属地&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5243b65e27f447788b211280eaa4c81e.png&quot; alt=&quot;什么是我的IP地址？免费IP查找&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;什么是我的IP地址？免费IP查找&quot; href=&quot;https://www.ipaddress.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;什么是我的IP地址？免费IP查找&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我的IP地址是什么？IP查找、IP定位、IP跟踪器和IP跟踪器。最好的免费IP地址工具。&quot;&gt;我的IP地址是什么？IP查找、IP定位、IP跟踪器和IP跟踪器。最好的免费IP地址工具。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/1_1721263824761.png&quot; alt=&quot;我的IP地址是什么？- ifconfig.me&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;我的IP地址是什么？- ifconfig.me&quot; href=&quot;https://ifconfig.me/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;我的IP地址是什么？- ifconfig.me&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;获取我的IP地址&quot;&gt;获取我的IP地址&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/de12981653c00bc31c9a6ff67075ef6c.ico&quot; alt=&quot;IP-API.com-地理定位API&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;IP-API.com-地理定位API&quot; href=&quot;https://ip-api.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IP-API.com-地理定位API&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;http://ip-api.com/json/ip 获取地理位置，免费IP地理位置API-查找任何IP地址&quot;&gt;http://ip-api.com/json/ip 获取地理位置，免费IP地理位置API-查找任何IP地址&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/acf6416543133dcb35c011179e00033d.ico&quot; alt=&quot;ipstack-免费IP地理定位API&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ipstack-免费IP地理定位API&quot; href=&quot;https://ipstack.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ipstack-免费IP地理定位API&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用ipstack（一个免费的实时IP地址，用于定位JSON API和支持IPv4和IPv6查找的数据库服务）免费定位网站访问者。&quot;&gt;使用ipstack（一个免费的实时IP地址，用于定位JSON API和支持IPv4和IPv6查找的数据库服务）免费定位网站访问者。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon_1738806728526.ico&quot; alt=&quot;互联网档案馆（墙）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;互联网档案馆（墙）&quot; href=&quot;https://archive.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;互联网档案馆（墙）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;互联网档案馆是一个非营利性的图书馆，拥有数百万免费文本、电影、软件、音乐、网站等&quot;&gt;互联网档案馆是一个非营利性的图书馆，拥有数百万免费文本、电影、软件、音乐、网站等&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7b772a730277eac49589c25e34252540.ico&quot; alt=&quot;网络空间测绘，网络空间安全搜索引擎，网络空间搜索引擎，安全态势感知 - FOFA网络空间测绘系统&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;网络空间测绘，网络空间安全搜索引擎，网络空间搜索引擎，安全态势感知 - FOFA网络空间测绘系统&quot; href=&quot;https://fofa.info/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;网络空间测绘，网络空间安全搜索引擎，网络空间搜索引擎，安全态势感知 - FOFA网络空间测绘系统&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;FOFA 是白帽汇推出的一款网络空间搜索引擎，它通过进行网络空间测绘，能够帮助研究人员或者企业迅速进行网络资产匹配，例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。&quot;&gt;FOFA 是白帽汇推出的一款网络空间搜索引擎，它通过进行网络空间测绘，能够帮助研究人员或者企业迅速进行网络资产匹配，例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon_1738806630999.svg&quot; alt=&quot;Web Check （墙）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Web Check （墙）&quot; href=&quot;https://web-check.xyz/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Web Check （墙）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我们为您的网站提供X射线视野&quot;&gt;我们为您的网站提供X射线视野&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>微信生态</title>
		<link href="https://www.dtking.cn/classify/1719365244895244293/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244895244293/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;微信生态&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/856f79656e9013a3867e65e867a26850.ico&quot; alt=&quot;微信，是一个生活方式&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信，是一个生活方式&quot; href=&quot;https://weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信，是一个生活方式&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信,weixin,聊天,语音,朋友圈,发信息,发图片,发视频,视频聊天&quot;&gt;微信,weixin,聊天,语音,朋友圈,发信息,发图片,发视频,视频聊天&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/37f38eceb7542821312988541cd5655e.ico&quot; alt=&quot;微信公众号&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信公众号&quot; href=&quot;https://mp.weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信公众号&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信公众平台，给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。&quot;&gt;微信公众平台，给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0033c60fef8d05dc4644411691defc1b.ico&quot; alt=&quot;微信公众号测试账号&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信公众号测试账号&quot; href=&quot;https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信公众号测试账号&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信公众平台接口测试帐号申请无需公众帐号、快速申请接口测试号直接体验和测试公众平台所有高级接口&quot;&gt;微信公众平台接口测试帐号申请无需公众帐号、快速申请接口测试号直接体验和测试公众平台所有高级接口&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/21e07b017a8d9654bddbface454fba6a.ico&quot; alt=&quot;微信·开放平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信·开放平台&quot; href=&quot;https://open.weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信·开放平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信开放平台&quot;&gt;微信开放平台&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df7bd1a7b25952d11f6ab3cbc5fcf93e.ico&quot; alt=&quot;微信支付&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信支付&quot; href=&quot;https://pay.weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信支付&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信支付是腾讯公司的支付业务品牌，微信支付商户平台支持线下场所、公众号、小程序、PC网站、APP、企业微信等经营场景快速接入微信支付。微信支付全面打通O2O生活消费领域，提供专业的互联网+行业解决方案，微信支付支持微信红包和微信理财通，是移动支付的首选。&quot;&gt;微信支付是腾讯公司的支付业务品牌，微信支付商户平台支持线下场所、公众号、小程序、PC网站、APP、企业微信等经营场景快速接入微信支付。微信支付全面打通O2O生活消费领域，提供专业的互联网+行业解决方案，微信支付支持微信红包和微信理财通，是移动支付的首选。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df7bd1a7b25952d11f6ab3cbc5fcf93e.ico&quot; alt=&quot;微信支付文档(v2)&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信支付文档(v2)&quot; href=&quot;https://pay.weixin.qq.com/wiki/doc/api/index.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信支付文档(v2)&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信支付开发文档&quot;&gt;微信支付开发文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df7bd1a7b25952d11f6ab3cbc5fcf93e.ico&quot; alt=&quot;微信支付文档(v3)&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信支付文档(v3)&quot; href=&quot;https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信支付文档(v3)&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信支付开发文档&quot;&gt;微信支付开发文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/df7bd1a7b25952d11f6ab3cbc5fcf93e.ico&quot; alt=&quot;微信公众平台支付接口调试工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信公众平台支付接口调试工具&quot; href=&quot;https://pay.weixin.qq.com/wiki/tools/signverify/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信公众平台支付接口调试工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信公众平台支付接口调试工具&quot;&gt;微信公众平台支付接口调试工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c6128340240661d83aa5a5a1ff89c1cc.ico&quot; alt=&quot;微信小程序开发文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信小程序开发文档&quot; href=&quot;https://developers.weixin.qq.com/miniprogram/dev/framework/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信小程序开发文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信开发者平台文档&quot;&gt;微信开发者平台文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0033c60fef8d05dc4644411691defc1b.ico&quot; alt=&quot;微信公众平台接口调试工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信公众平台接口调试工具&quot; href=&quot;https://mp.weixin.qq.com/debug/cgi-bin/apiinfo&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信公众平台接口调试工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信公众平台接口调试工具&quot;&gt;微信公众平台接口调试工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/10dc2f07fee9f32e93685861e6dd0318.ico&quot; alt=&quot;微信文件传输助手网页版&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信文件传输助手网页版&quot; href=&quot;https://filehelper.weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信文件传输助手网页版&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;微信，微信文件传输助手，文件传输助手，文件传输，微信文件传输助手网页版&quot;&gt;微信，微信文件传输助手，文件传输助手，文件传输，微信文件传输助手网页版&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/bb39242d60a6ca1b6f6bfebf4d3559f2.png&quot; alt=&quot;微信客服&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;微信客服&quot; href=&quot;https://kf.weixin.qq.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;微信客服&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;腾讯企业微信让每个企业都拥有自己的微信,企业微信,企业微信官网,qiyeweixin,微信企业,企业微信注册,企业微信登陆,企业微信平台,企业微信申请,微信企业版,腾讯企业微信,企业微信号,企业weixin,企业微信手机版,企业微信电脑版,企业微信电脑版官网,企业微信网页版,企业微信下载,企业号,企业微信打卡,work.weixin.qq.com,企业微信OA,,企业微信支付,企业微信视频会议,企业微信免费电话,腾讯企业微信登录入口&quot;&gt;腾讯企业微信让每个企业都拥有自己的微信,企业微信,企业微信官网,qiyeweixin,微信企业,企业微信注册,企业微信登陆,企业微信平台,企业微信申请,微信企业版,腾讯企业微信,企业微信号,企业weixin,企业微信手机版,企业微信电脑版,企业微信电脑版官网,企业微信网页版,企业微信下载,企业号,企业微信打卡,work.weixin.qq.com,企业微信OA,,企业微信支付,企业微信视频会议,企业微信免费电话,腾讯企业微信登录入口&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>模型|训练</title>
		<link href="https://www.dtking.cn/classify/1894563451993391105/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1894563451993391105/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;模型|训练&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3fefde3304f762d11e2967ffb0215434.png&quot; alt=&quot;Ollama&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Ollama&quot; href=&quot;https://ollama.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ollama&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;启动并运行大型语言模型。&quot;&gt;启动并运行大型语言模型。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/unsloth_logo_no_shadow_KgfOV6keeBZnffQsKUny3_1739785596295.avif&quot; alt=&quot;Uncloth AI-LLM的开源微调&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Uncloth AI-LLM的开源微调&quot; href=&quot;https://unsloth.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Uncloth AI-LLM的开源微调&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;开源LLM微调Llama 3、Phi 3.5、Mistral等！对初学者友好。使用Uncloth加快速度。

        &quot;&gt;开源LLM微调Llama 3、Phi 3.5、Mistral等！对初学者友好。使用Uncloth加快速度。

        &lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e5d4b567b7af10e84321de07db766525.ico&quot; alt=&quot;DeepSeek 官网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DeepSeek 官网&quot; href=&quot;https://www.deepseek.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DeepSeek 官网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;DeepSeek，带着好奇心揭开AGI的神秘面纱。用长远的眼光回答根本问题。&quot;&gt;DeepSeek，带着好奇心揭开AGI的神秘面纱。用长远的眼光回答根本问题。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b0e060fdff315bca152a4edb2c79fb19.ico&quot; alt=&quot;LiblibAI·哩布哩布AI - 中国领先的AI创作平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;LiblibAI·哩布哩布AI - 中国领先的AI创作平台&quot; href=&quot;https://www.liblib.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;LiblibAI·哩布哩布AI - 中国领先的AI创作平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;原创AI模型分享社区，这里有最新、最热门的模型素材，10万+模型免费下载。欢迎每一位创作者加入，分享你的作品。与中国原创模型作者交流,共同探索AI绘画。&quot;&gt;原创AI模型分享社区，这里有最新、最热门的模型素材，10万+模型免费下载。欢迎每一位创作者加入，分享你的作品。与中国原创模型作者交流,共同探索AI绘画。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/804ded515ff71554d55e8ba9896cfd59.ico&quot; alt=&quot;模型 - Gitee AI（模力方舟）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;模型 - Gitee AI（模力方舟）&quot; href=&quot;https://ai.gitee.com/models&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;模型 - Gitee AI（模力方舟）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Gitee AI（模力方舟）汇聚最新最热 AI 模型，提供模型体验、推理、训练、部署和应用的一站式服务，提供充沛算力，做中国最好的 AI 社区。&quot;&gt;Gitee AI（模力方舟）汇聚最新最热 AI 模型，提供模型体验、推理、训练、部署和应用的一站式服务，提供充沛算力，做中国最好的 AI 社区。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/huggingface_logo-noborder_1738821776958.svg&quot; alt=&quot;Hugging Face（镜像站）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Hugging Face（镜像站）&quot; href=&quot;https://hf-mirror.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hugging Face（镜像站）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;加速访问Hugging Face的门户。作为一个公益项目，我们致力于提供稳定、快速的镜像服务，帮助国内用户无障碍访问Hugging Face的资源。&quot;&gt;加速访问Hugging Face的门户。作为一个公益项目，我们致力于提供稳定、快速的镜像服务，帮助国内用户无障碍访问Hugging Face的资源。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d35c318dd5b67e91b3ce88ed8856413a.png&quot; alt=&quot;智谱AI开放平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;智谱AI开放平台&quot; href=&quot;https://open.bigmodel.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;智谱AI开放平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;大模型开放平台-新一代国产自主通用AI开放平台，以最前沿人工智能技术-&amp;amp;amp;ldquo;智谱&amp;amp;amp;rdquo;超大规模预训练模型为核心技术，致力于将产品技术与行业场景双轮驱动的中国最先进的认知智能技术和千行百业应用相结合，构建更高精度、高效率、通用化的AI开发新模式，实现智谱大模型的产业化，将AI的好处带给每个人&quot;&gt;大模型开放平台-新一代国产自主通用AI开放平台，以最前沿人工智能技术-&amp;amp;amp;ldquo;智谱&amp;amp;amp;rdquo;超大规模预训练模型为核心技术，致力于将产品技术与行业场景双轮驱动的中国最先进的认知智能技术和千行百业应用相结合，构建更高精度、高效率、通用化的AI开发新模式，实现智谱大模型的产业化，将AI的好处带给每个人&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c76d89b3b3da3b33dbdb49d915143269.ico&quot; alt=&quot;始智AI &quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;始智AI &quot; href=&quot;https://wisemodel.cn/models/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;始智AI &lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;始智AI wisemodel.cn社区将从打造中国版huggingface开始，逐步建设成huggingface之外最活跃的中立开放的AI开源社区，汇聚模型、数据集等AI开源技术资源，并在此在打造新一代AI基础设施服务平台，为AI产业发展提供有力的平台支撑，让AI更简单，促进AI开源创新生态繁荣发展。&quot;&gt;始智AI wisemodel.cn社区将从打造中国版huggingface开始，逐步建设成huggingface之外最活跃的中立开放的AI开源社区，汇聚模型、数据集等AI开源技术资源，并在此在打造新一代AI基础设施服务平台，为AI产业发展提供有力的平台支撑，让AI更简单，促进AI开源创新生态繁荣发展。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/huggingface_logo-noborder_1738821776958.svg&quot; alt=&quot;Hugging Face（墙）—构建未来的人工智能社区。&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Hugging Face（墙）—构建未来的人工智能社区。&quot; href=&quot;https://huggingface.co/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hugging Face（墙）—构建未来的人工智能社区。&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我们正在通过开源和开放科学推进人工智能并使其民主化。&quot;&gt;我们正在通过开源和开放科学推进人工智能并使其民主化。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/044ed3ead90875abbe504098482efc14.ico&quot; alt=&quot;魔搭GPT（ModelScopeGPT）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;魔搭GPT（ModelScopeGPT）&quot; href=&quot;https://www.modelscope.cn/models&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;魔搭GPT（ModelScopeGPT）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;阿里达摩院推出的大小模型协同的智能助手，具备作诗、绘画、视频生成、语音播放等多模态能力&quot;&gt;阿里达摩院推出的大小模型协同的智能助手，具备作诗、绘画、视频生成、语音播放等多模态能力&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>效率工具</title>
		<link href="https://www.dtking.cn/classify/1719365244962353154/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244962353154/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;效率工具&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d9168ae383c07b030f5cc0bd88dedd65.png&quot; alt=&quot;MDPDF - 简洁高效的 Markdown 转 PDF 工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;MDPDF - 简洁高效的 Markdown 转 PDF 工具&quot; href=&quot;https://dtking.cn/mdpdf/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;MDPDF - 简洁高效的 Markdown 转 PDF 工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;AI内容Markdown转PDF在线工具，支持多主题切换、PDF大纲导出，实现所见即所得编辑体验！适配多平台保持一致性，支持图片上传嵌入，轻松将AI生成内容、Markdown文档快速转换为高质量PDF并下载，高效解决文档导出需求&quot;&gt;AI内容Markdown转PDF在线工具，支持多主题切换、PDF大纲导出，实现所见即所得编辑体验！适配多平台保持一致性，支持图片上传嵌入，轻松将AI生成内容、Markdown文档快速转换为高质量PDF并下载，高效解决文档导出需求&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/944ca49ef47ff325cfbb1c1418f47486.png&quot; alt=&quot;Excalidraw |手绘外观&amp;amp;bull;协作&amp;amp;bull;安全&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Excalidraw |手绘外观&amp;amp;bull;协作&amp;amp;bull;安全&quot; href=&quot;https://excalidraw.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Excalidraw |手绘外观&amp;amp;bull;协作&amp;amp;bull;安全&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Excalidraw是一个虚拟协作白板工具，它可以让您轻松地绘制具有手绘感觉的图表。&quot;&gt;Excalidraw是一个虚拟协作白板工具，它可以让您轻松地绘制具有手绘感觉的图表。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/70035680a0ba6eca98e305dbd26653f8.png&quot; alt=&quot;Lorem Picsum 展位图&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Lorem Picsum 展位图&quot; href=&quot;https://picsum.photos&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Lorem Picsum 展位图&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Lorem Ipsum... but for photos&quot;&gt;Lorem Ipsum... but for photos&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c19d5c891c530dd8015fbac750f34a3e.png&quot; alt=&quot;Umi-OCR 文字识别工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Umi-OCR 文字识别工具&quot; href=&quot;https://github.com/hiroi-sora/Umi-OCR&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Umi-OCR 文字识别工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片，段落排版/排除水印，扫描/生成二维码。内置多国语言库。 - GitHub - hiroi-sora/Umi-OCR: OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片，段落排版/排除水印，扫描/生成二维码。内置多国语言库。&quot;&gt;OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片，段落排版/排除水印，扫描/生成二维码。内置多国语言库。 - GitHub - hiroi-sora/Umi-OCR: OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片，段落排版/排除水印，扫描/生成二维码。内置多国语言库。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/af54445031b516a24145d16c89572d44.ico&quot; alt=&quot;Smry|AI摘要生成器和免费支付墙移除器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Smry|AI摘要生成器和免费支付墙移除器&quot; href=&quot;https://www.smry.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Smry|AI摘要生成器和免费支付墙移除器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;从任何网站删除付费墙、广告和弹出窗口并立即获取摘要。
&quot;&gt;从任何网站删除付费墙、广告和弹出窗口并立即获取摘要。
&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/338433e78c5b0f8ff84b9a456ab442b2.ico&quot; alt=&quot;为您的代码创建精美的图像&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;为您的代码创建精美的图像&quot; href=&quot;https://ray.so/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;为您的代码创建精美的图像&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;把你的代码变成漂亮的图像。从一系列语法颜色中选择，隐藏或显示背景，并在深色和浅色窗口之间切换。&quot;&gt;把你的代码变成漂亮的图像。从一系列语法颜色中选择，隐藏或显示背景，并在深色和浅色窗口之间切换。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/2bcfcfa913c086c8be688e6798ab9f32.png&quot; alt=&quot;在线Favicon图标生成 - Favicon图标制作&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线Favicon图标生成 - Favicon图标制作&quot; href=&quot;https://favicon.net.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线Favicon图标生成 - Favicon图标制作&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线Favicon图标生成器是一款方便的在线网站图标制作工具，能够快速生成ICO、JPG和PNG格式的Favicon图标。&quot;&gt;在线Favicon图标生成器是一款方便的在线网站图标制作工具，能够快速生成ICO、JPG和PNG格式的Favicon图标。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/09bdb305bc7c63e54701266be6c4f496.svg&quot; alt=&quot;Github Proxy 文件代理加速&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Github Proxy 文件代理加速&quot; href=&quot;https://github.akams.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Github Proxy 文件代理加速&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;oopsunix,git,github,proxy,github proxy,github代理,github镜像,github加速,github下载,github下载加速,github文件加速,代理加速,加速下载&quot;&gt;oopsunix,git,github,proxy,github proxy,github代理,github镜像,github加速,github下载,github下载加速,github文件加速,代理加速,加速下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e6b4f828df16cbfba83bf2e9b45b3c24.png&quot; alt=&quot;Apifox - API 文档、&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Apifox - API 文档、&quot; href=&quot;https://www.apifox.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Apifox - API 文档、&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体，提升 10 倍研发效率。是最好用的API文档工具，API自动化测试工具，API Mock工具，接口文档管理工具，接口文档&quot;&gt;Apifox = Postman + Swagger + Mock + JMeter。集接口文档工具、接口Mock工具、接口自动化测试工具、接口调试工具于一体，提升 10 倍研发效率。是最好用的API文档工具，API自动化测试工具，API Mock工具，接口文档管理工具，接口文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/18a22863ee5e017102799cebee596c44.png&quot; alt=&quot;立即从新闻文章中删除Paywalls | PaywallBuster&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;立即从新闻文章中删除Paywalls | PaywallBuster&quot; href=&quot;https://paywallbuster.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;立即从新闻文章中删除Paywalls | PaywallBuster&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;立即从新闻文章中删除付费墙。PaywallBuster是一个免费工具，可帮助您绕过新闻网站上的付费墙。&quot;&gt;立即从新闻文章中删除付费墙。PaywallBuster是一个免费工具，可帮助您绕过新闻网站上的付费墙。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ba3e1649e23eae81d48f1f72375ab3eb.png&quot; alt=&quot;PDFgear - Free PDF Editor Software &amp;amp; Online tools&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;PDFgear - Free PDF Editor Software &amp;amp; Online tools&quot; href=&quot;https://www.pdfgear.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;PDFgear - Free PDF Editor Software &amp;amp; Online tools&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线或离线编辑PDF与PDFgear的免费工具和软件。合并、分割、转换等等。强大和用户友好的解决方案，为您所有的PDF需求&quot;&gt;在线或离线编辑PDF与PDFgear的免费工具和软件。合并、分割、转换等等。强大和用户友好的解决方案，为您所有的PDF需求&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4821243bc289e387a56efd42adde3955.ico&quot; alt=&quot;Sublime Text - Text Editing, Done RightPlayPause&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Sublime Text - Text Editing, Done RightPlayPause&quot; href=&quot;http://www.sublimetext.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Sublime Text - Text Editing, Done RightPlayPause&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;SublimeText是一个复杂的文本编辑器，用于代码、标记和散文。你会喜欢流畅的用户界面、非凡的功能和惊人的性能。&quot;&gt;SublimeText是一个复杂的文本编辑器，用于代码、标记和散文。你会喜欢流畅的用户界面、非凡的功能和惊人的性能。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9ab1092fc35a14e0ed83ec2054752aed.png&quot; alt=&quot;draw.io&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;draw.io&quot; href=&quot;https://app.diagrams.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;draw.io&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;draw.io是一个免费的在线图表软件，用于制作流程图、过程图、组织图、UML、ER和网络图&quot;&gt;draw.io是一个免费的在线图表软件，用于制作流程图、过程图、组织图、UML、ER和网络图&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon-touch-de50acbf5d634ec6791894eba4ba9cf490f709b3d742597c6fc4b734e6492a5a_1703474449813.webp&quot; alt=&quot;codepen&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;codepen&quot; href=&quot;https://codepen.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;codepen&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个在线代码编辑器、学习环境和社区，用于使用HTML、CSS和JavaScript代码片段、项目和web应用程序进行前端web开发。&quot;&gt;一个在线代码编辑器、学习环境和社区，用于使用HTML、CSS和JavaScript代码片段、项目和web应用程序进行前端web开发。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/dfef0e545ba517136b02530c1f5b3ad0.png&quot; alt=&quot;Crx搜搜 - 一个牛X的扩展和应用商店&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Crx搜搜 - 一个牛X的扩展和应用商店&quot; href=&quot;https://www.crxsoso.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Crx搜搜 - 一个牛X的扩展和应用商店&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Crx搜搜，又名扩展搜搜，可以一键搜索并下载 Chrome，Edge，Firefox，Opera 扩展程序 crx/xpi 安装包和 Microsoft Store 应用程序，并可以将插件安装到 Chrome浏览器，Edge浏览器，QQ浏览器，360浏览器，搜狗浏览器，火狐浏览器等 90+ 款浏览器中。解决无法直接访问 Chrome 应用商店的问题&quot;&gt;Crx搜搜，又名扩展搜搜，可以一键搜索并下载 Chrome，Edge，Firefox，Opera 扩展程序 crx/xpi 安装包和 Microsoft Store 应用程序，并可以将插件安装到 Chrome浏览器，Edge浏览器，QQ浏览器，360浏览器，搜狗浏览器，火狐浏览器等 90+ 款浏览器中。解决无法直接访问 Chrome 应用商店的问题&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b7fea227731cd7323aebf8613b809fee.ico&quot; alt=&quot;免费logo在线制作,logo设计,logo在线生成,字体logo设计,U钙网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;免费logo在线制作,logo设计,logo在线生成,字体logo设计,U钙网&quot; href=&quot;https://www.uugai.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;免费logo在线制作,logo设计,logo在线生成,字体logo设计,U钙网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;logo在线设计,logo在线制作,标识设计,logo设计,字体logo设计,微信logo头像制作,抖音头像&quot;&gt;logo在线设计,logo在线制作,标识设计,logo设计,字体logo设计,微信logo头像制作,抖音头像&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0b2beca177068449b06175e8a329e437.ico&quot; alt=&quot;ioDraw 免费在线画流程图、思维导图、甘特图&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ioDraw 免费在线画流程图、思维导图、甘特图&quot; href=&quot;https://www.iodraw.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ioDraw 免费在线画流程图、思维导图、甘特图&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线作图,流程图,思维导图,甘特图,时序图,拓扑图,组织结构图,脑图,UML,diagram,visio&quot;&gt;在线作图,流程图,思维导图,甘特图,时序图,拓扑图,组织结构图,脑图,UML,diagram,visio&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/banner_1709256514682.jpg&quot; alt=&quot;wkhtmltopdf &quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;wkhtmltopdf &quot; href=&quot;https://wkhtmltopdf.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;wkhtmltopdf &lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;将网页保存pdf文件，将网页保存图片&quot;&gt;将网页保存pdf文件，将网页保存图片&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c7cca543515675b301cdb478b8844f26.ico&quot; alt=&quot;拼多多（用来获取测试数据）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;拼多多（用来获取测试数据）&quot; href=&quot;https://www.pinduoduo.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;拼多多（用来获取测试数据）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;拼多多作为新电商开创者，致力于将娱乐社交的元素融入电商运营中，通过“社交+电商”的模式，让更多的用户带着乐趣分享实惠，享受全新的共享式购物体验。&quot;&gt;拼多多作为新电商开创者，致力于将娱乐社交的元素融入电商运营中，通过“社交+电商”的模式，让更多的用户带着乐趣分享实惠，享受全新的共享式购物体验。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/12fcda221d0926b9a37a297164cca450.svg&quot; alt=&quot;tunnl.gg |将本地主机暴露到互联网的最简单方法&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;tunnl.gg |将本地主机暴露到互联网的最简单方法&quot; href=&quot;https://tunnl.gg/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;tunnl.gg |将本地主机暴露到互联网的最简单方法&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;本地web服务器的即时公共URL。无需安装，只需使用SSH。安全、快速且对开发人员友好的反向隧道。&quot;&gt;本地web服务器的即时公共URL。无需安装，只需使用SSH。安全、快速且对开发人员友好的反向隧道。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0692dbc2b342a9e1f07373fe00cbf48f.png&quot; alt=&quot;移除付费墙|免费在线付费墙移除工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;移除付费墙|免费在线付费墙移除工具&quot; href=&quot;https://www.removepaywall.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;移除付费墙|免费在线付费墙移除工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;移除付费墙，免费在线付费墙移除工具。无需付费或登录即可访问文章。在彭博社和其他数百家公司工作。&quot;&gt;移除付费墙，免费在线付费墙移除工具。无需付费或登录即可访问文章。在彭博社和其他数百家公司工作。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>在线工具</title>
		<link href="https://www.dtking.cn/classify/1719365244895244294/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244895244294/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;在线工具&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/eeb83efc58e529985e2fe12aa126ef22.ico&quot; alt=&quot;草料二维码生成器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;草料二维码生成器&quot; href=&quot;https://cli.im/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;草料二维码生成器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;草料二维码把二维码技术变成简单实用的产品，让每个人都可以快速复用成功案例经验，自由组合内容展示、表单、批量、数据统计、美化和标签排版等功能，免费制作出能高效解决业务问题的二维码&quot;&gt;草料二维码把二维码技术变成简单实用的产品，让每个人都可以快速复用成功案例经验，自由组合内容展示、表单、批量、数据统计、美化和标签排版等功能，免费制作出能高效解决业务问题的二维码&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/902af73b042f890851d443c4add710a7.ico&quot; alt=&quot;Base64 编码/解码 - 锤子在线工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Base64 编码/解码 - 锤子在线工具&quot; href=&quot;https://www.toolhelper.cn/EncodeDecode/Base64&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Base64 编码/解码 - 锤子在线工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;此工具是一个 Base64 编码或解码在线工具，实现把字符串转成 Base64 或者从 Base64 转成成字符串。&quot;&gt;此工具是一个 Base64 编码或解码在线工具，实现把字符串转成 Base64 或者从 Base64 转成成字符串。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/73a551f889fe869b249877e1091f6821.png&quot; alt=&quot;CSR在线生成工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;CSR在线生成工具&quot; href=&quot;https://myssl.com/csr_create.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CSR在线生成工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在申请数字证书之前，必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是公钥证书原始文件，包含了服务器信息和单位信息，需要提交给CA认证中心。在生成CSR文件时会同时生成私钥文件，请妥善保管和备份您的私钥。本工具是CSR在线生成工具工具、生成CSR工具、ECC CSR文件生成、SSL证书的 ECC RSA文件生成、代码签名证书的 ECC RSA文件生成、国密SSL的 SM2文件生成、Certificate Signing Request Generator tools&quot;&gt;在申请数字证书之前，必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是公钥证书原始文件，包含了服务器信息和单位信息，需要提交给CA认证中心。在生成CSR文件时会同时生成私钥文件，请妥善保管和备份您的私钥。本工具是CSR在线生成工具工具、生成CSR工具、ECC CSR文件生成、SSL证书的 ECC RSA文件生成、代码签名证书的 ECC RSA文件生成、国密SSL的 SM2文件生成、Certificate Signing Request Generator tools&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/55915b594c58bce74d565ce59e50b79e.ico&quot; alt=&quot;时间戳转换工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;时间戳转换工具&quot; href=&quot;https://tool.lu/timestamp/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;时间戳转换工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;时间戳(Unix timestamp)转换工具 - 在线工具&quot;&gt;时间戳(Unix timestamp)转换工具 - 在线工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/83f17eb53bdd4993c3d2e01e439e049b.ico&quot; alt=&quot;在线正则&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线正则&quot; href=&quot;https://c.runoob.com/front-end/854/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线正则&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线正则表达式测试&quot;&gt;在线正则表达式测试&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/193e3dd75d14ed2a314b59fe2ffd098e.ico&quot; alt=&quot;RSA在线加密/在线解密&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;RSA在线加密/在线解密&quot; href=&quot;https://the-x.cn/zh-cn/base64/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;RSA在线加密/在线解密&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;RSA在线加密/在线解密工具，支持HEX/Base64/UTF8/GB2312等多种编码格。可以支持非正常的私钥解密/公钥解密&quot;&gt;RSA在线加密/在线解密工具，支持HEX/Base64/UTF8/GB2312等多种编码格。可以支持非正常的私钥解密/公钥解密&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9bdbd9bb21e07d00966f68a0f2580590.ico&quot; alt=&quot;HTML压缩/格式化工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;HTML压缩/格式化工具&quot; href=&quot;https://www.wenyiso.com/tool/daima.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;HTML压缩/格式化工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线HTML压缩工具可实现HTML代码压缩解压，格式化美化html代码。使得html文件体积减小，传输速度更快，优化网页打开速度&quot;&gt;在线HTML压缩工具可实现HTML代码压缩解压，格式化美化html代码。使得html文件体积减小，传输速度更快，优化网页打开速度&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/904142ca84363518d0eb00c3e9c5f77d.ico&quot; alt=&quot;在线文件大小换算&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线文件大小换算&quot; href=&quot;https://www.bejson.com/convert/filesize/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线文件大小换算&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线文件大小转换,bit,bytes,KB,MB,GB,TB转换&quot;&gt;在线文件大小转换,bit,bytes,KB,MB,GB,TB转换&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/09994fc080a3e14e688e2b6ca9ba8dc9.ico&quot; alt=&quot;在线进制转换&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线进制转换&quot; href=&quot;https://tool.oschina.net/hexconvert/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线进制转换&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具，提供jsbin在线 CSS、JS 调试，在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器，MarkDown编译器等其他在线工具&quot;&gt;OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具，提供jsbin在线 CSS、JS 调试，在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器，MarkDown编译器等其他在线工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/252ad8e464737e66e621e59fdff58e5f.ico&quot; alt=&quot;在线Cron表达式&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;在线Cron表达式&quot; href=&quot;https://qqe2.com/cron&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;在线Cron表达式&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;通过这个生成器,您可以在线生成任务调度比如Quartz的Cron表达式,对Quartz Cron 表达式的可视化双向解析和生成.&quot;&gt;通过这个生成器,您可以在线生成任务调度比如Quartz的Cron表达式,对Quartz Cron 表达式的可视化双向解析和生成.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/09994fc080a3e14e688e2b6ca9ba8dc9.ico&quot; alt=&quot;常用对照表&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;常用对照表&quot; href=&quot;https://tool.oschina.net/commons&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;常用对照表&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具，提供jsbin在线 CSS、JS 调试，在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器，MarkDown编译器等其他在线工具&quot;&gt;OSCHINA.NET在线工具,ostools为开发设计人员提供在线工具，提供jsbin在线 CSS、JS 调试，在线 Java API文档,在线 PHP API文档,在线 Node.js API文档,Less CSS编译器，MarkDown编译器等其他在线工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e9cde3ebb03132a062f202e3278ca3f1.ico&quot; alt=&quot;Carbon | 代码转图片&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Carbon | 代码转图片&quot; href=&quot;https://carbon.now.sh/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Carbon | 代码转图片&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Carbon是创建和共享源代码美丽图像的最简单方法。&quot;&gt;Carbon是创建和共享源代码美丽图像的最简单方法。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7bd548e8b80f3e4cb682cb13e79ce924.ico&quot; alt=&quot;最佳JSON图形查看器：在线JSON可视化&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;最佳JSON图形查看器：在线JSON可视化&quot; href=&quot;https://www.jsonviewer.tools/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;最佳JSON图形查看器：在线JSON可视化&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;json diagram, genarate graph diagram,JSON graph editor,json to graph,convert json to graph online, graph json,json graph view,json editor, format, schema graph, free download diagram, schema graph, free json graph, search, formatter, json editor, json tree online, online json editor, tool, json tools, open source, free, json parser, json parser online, json formatter, json schema design, online json design, online json design, format json online,json visualizer, json graph, graph visualizer,json tree graph,json tree&quot;&gt;json diagram, genarate graph diagram,JSON graph editor,json to graph,convert json to graph online, graph json,json graph view,json editor, format, schema graph, free download diagram, schema graph, free json graph, search, formatter, json editor, json tree online, online json editor, tool, json tools, open source, free, json parser, json parser online, json formatter, json schema design, online json design, online json design, format json online,json visualizer, json graph, graph visualizer,json tree graph,json tree&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/006391357156c2100b37659a2906b576.ico&quot; alt=&quot;UrlEncode编码/UrlDecode解码 - 站长工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;UrlEncode编码/UrlDecode解码 - 站长工具&quot; href=&quot;https://tool.chinaz.com/tools/urlencode.aspx&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;UrlEncode编码/UrlDecode解码 - 站长工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为了让包含中文的URL可以使用，您可以使用本工具对中文进行UrlEncode编码。&quot;&gt;为了让包含中文的URL可以使用，您可以使用本工具对中文进行UrlEncode编码。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/244733defc1222a052d5bcb5380f55e0.png&quot; alt=&quot;16图床，永久免费，无需登录的图床&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;16图床，永久免费，无需登录的图床&quot; href=&quot;https://111666.best/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;16图床，永久免费，无需登录的图床&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;颜值担当，UI现代化，支持暗黑模式，多重备份，分布式数据库，oss冷备份，全格式支持，尊重隐私，允许撤回图片&quot;&gt;颜值担当，UI现代化，支持暗黑模式，多重备份，分布式数据库，oss冷备份，全格式支持，尊重隐私，允许撤回图片&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.107000.com/favicon.ico&quot; alt=&quot;Hex编码/解码 - 107000&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Hex编码/解码 - 107000&quot; href=&quot;https://www.107000.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hex编码/解码 - 107000&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;把代码以Hex编码/解码,工具由107000提供.&quot;&gt;把代码以Hex编码/解码,工具由107000提供.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7885c9e1865dc757a58540e8e36e4e31.ico&quot; alt=&quot;文叔叔 - 传文件，找文叔叔（永不限速）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;文叔叔 - 传文件，找文叔叔（永不限速）&quot; href=&quot;https://www.wenshushu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;文叔叔 - 传文件，找文叔叔（永不限速）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;文叔叔，免费空间 40GB，一款永不限速的云存储产品。传文件、收文件、网盘，还支持历史记录等高级功能。&quot;&gt;文叔叔，免费空间 40GB，一款永不限速的云存储产品。传文件、收文件、网盘，还支持历史记录等高级功能。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c98210c27982aeb4619914591baf0ef4.ico&quot; alt=&quot;将curl命令转换为代码&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;将curl命令转换为代码&quot; href=&quot;https://curlconverter.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;将curl命令转换为代码&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;用于将cURL命令转换为代码的实用程序&quot;&gt;用于将cURL命令转换为代码的实用程序&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/44295cb8c28d6de1e35ebe15bc41e324.ico&quot; alt=&quot;Postimages &amp;amp;mdash; 免费图片托管 / 图片上传&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Postimages &amp;amp;mdash; 免费图片托管 / 图片上传&quot; href=&quot;https://postimages.org&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Postimages &amp;amp;mdash; 免费图片托管 / 图片上传&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;提供免费的图片上传和论坛主办的整合。免费图片托管和照片共享网站和博客。&quot;&gt;提供免费的图片上传和论坛主办的整合。免费图片托管和照片共享网站和博客。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/2ea3ec907c3927cee528d660f1697698.ico&quot; alt=&quot;Squoosh 图片压缩&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Squoosh 图片压缩&quot; href=&quot;https://squoosh.app/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Squoosh 图片压缩&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Squoosh是终极的图像优化器，允许您在浏览器中使用不同的编解码器压缩和比较图像。&quot;&gt;Squoosh是终极的图像优化器，允许您在浏览器中使用不同的编解码器压缩和比较图像。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cbe47cb3461302b5efff8bb7e2c19079.ico&quot; alt=&quot;Volume Shader | Volume Shader BM - GPU基准测试平台与体积渲染&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Volume Shader | Volume Shader BM - GPU基准测试平台与体积渲染&quot; href=&quot;https://volumeshader.org/zh&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Volume Shader | Volume Shader BM - GPU基准测试平台与体积渲染&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一体化平台，提供实时体积渲染、GPU性能测试和交互式着色器游乐场。无需安装。为图形开发者、游戏工程师、学习者和硬件爱好者赋能。&quot;&gt;一体化平台，提供实时体积渲染、GPU性能测试和交互式着色器游乐场。无需安装。为图形开发者、游戏工程师、学习者和硬件爱好者赋能。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6f51955e06a1125817bcfe8cbd154410.png&quot; alt=&quot;轻松传 - 传文件，传文本，传屏幕，传实时视频&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;轻松传 - 传文件，传文本，传屏幕，传实时视频&quot; href=&quot;https://easychuan.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;轻松传 - 传文件，传文本，传屏幕，传实时视频&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;只需打开网页，手机、电脑、平板... 跨设备快速传文件、传文本、传屏幕、传实时视频，64T超大文件传输，无限速无扫描。&quot;&gt;只需打开网页，手机、电脑、平板... 跨设备快速传文件、传文本、传屏幕、传实时视频，64T超大文件传输，无限速无扫描。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>前端UI库</title>
		<link href="https://www.dtking.cn/classify/1719365244962353156/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244962353156/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;前端UI库&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5eb47bf2211f8dd3e963b80390bbc567.png&quot; alt=&quot;Bootstrap v5 中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Bootstrap v5 中文文档&quot; href=&quot;https://v5.bootcss.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Bootstrap v5 中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Bootstrap 是全球最受欢迎的 HTML、CSS 和 JS 前端工具库。&quot;&gt;Bootstrap 是全球最受欢迎的 HTML、CSS 和 JS 前端工具库。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/fd8702253d99a1a4f19deca53a2bdc81.ico&quot; alt=&quot;Ant Design of Vue&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Ant Design of Vue&quot; href=&quot;https://1x.antdv.com/docs/vue/introduce-cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ant Design of Vue&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;基于Ant Design和Vue的企业级UI组件&quot;&gt;基于Ant Design和Vue的企业级UI组件&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/be92e67ba1b0df4d73383d87dfbc5c5b.svg&quot; alt=&quot;Element UI v2&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Element UI v2&quot; href=&quot;https://element.eleme.cn/#/zh-CN/component/installation&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Element UI v2&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Element，一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库&quot;&gt;Element，一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1ad3576a126248d06155f2c689c0ff3f.png&quot; alt=&quot;Vant Weapp&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Vant Weapp&quot; href=&quot;https://youzan.github.io/vant-weapp/#/home&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Vant Weapp&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;轻量、可靠的小程序 UI 组件库&quot;&gt;轻量、可靠的小程序 UI 组件库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/923a45b3ad92c47829b0d7bc425c1fa2.ico&quot; alt=&quot;uView - 多平台快速开发的UI框架 - uni-app UI框架&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;uView - 多平台快速开发的UI框架 - uni-app UI框架&quot; href=&quot;https://v1.uviewui.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;uView - 多平台快速开发的UI框架 - uni-app UI框架&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;uView UI，是uni-app生态最优秀的UI框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水&quot;&gt;uView UI，是uni-app生态最优秀的UI框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0889a95d012c573da96d4aa5713c8009.png&quot; alt=&quot;Tailwind CSS-快速构建现代网站，无需离开HTML。&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Tailwind CSS-快速构建现代网站，无需离开HTML。&quot; href=&quot;https://tailwindcss.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Tailwind CSS-快速构建现代网站，无需离开HTML。&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Tailwind CSS框架的文档。&quot;&gt;Tailwind CSS框架的文档。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6664ca677adde5d76443a380824e1e23.png&quot; alt=&quot;NutUI - 移动端 Vue2、Vue3、小程序 组件库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;NutUI - 移动端 Vue2、Vue3、小程序 组件库&quot; href=&quot;https://nutui.jd.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;NutUI - 移动端 Vue2、Vue3、小程序 组件库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;京东风格的轻量级移动端 Vue、React 组件库&quot;&gt;京东风格的轻量级移动端 Vue、React 组件库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/8faca656648172a95d70571fbdb24bc9.png&quot; alt=&quot;样式支持表&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;样式支持表&quot; href=&quot;https://caniuse.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;样式支持表&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;提供了最新的浏览器支持表，以支持桌面和移动web浏览器上的前端web技术&quot;&gt;提供了最新的浏览器支持表，以支持桌面和移动web浏览器上的前端web技术&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/062d2a17b1855eb2faf363c3326eaf5b.png&quot; alt=&quot;Animista-CSS动画点播&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Animista-CSS动画点播&quot; href=&quot;https://animista.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Animista-CSS动画点播&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Animista是一个CSS动画库，您可以在这里玩现成的CSS动画集，并只下载您将使用的动画。&quot;&gt;Animista是一个CSS动画库，您可以在这里玩现成的CSS动画集，并只下载您将使用的动画。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a7ad902762cb5cd742906e055318d2cf.ico&quot; alt=&quot;uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架&quot; href=&quot;https://uiadmin.net/uview-plus/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;uview-plus 3.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;uview-plus，是uni-app生态最优秀的UI框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水&quot;&gt;uview-plus，是uni-app生态最优秀的UI框架，全面的组件和便捷的工具会让您信手拈来，如鱼得水&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0afd4b0acdea07ac63590fa2bb43ead2.octet-stream&quot; alt=&quot;uView Vue3.0 横空出世，继承uView1.0意志，再战江湖，风云再起！&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;uView Vue3.0 横空出世，继承uView1.0意志，再战江湖，风云再起！&quot; href=&quot;https://vkuviewdoc.fsq.pub/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;uView Vue3.0 横空出世，继承uView1.0意志，再战江湖，风云再起！&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;同时支持 Vue3.0 和 Vue2.0，你没看错，现在 uView 支持 Vue3.0 了！（不支持nvue，此版本为uView1.0的分支）&quot;&gt;同时支持 Vue3.0 和 Vue2.0，你没看错，现在 uView 支持 Vue3.0 了！（不支持nvue，此版本为uView1.0的分支）&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c90fcec1364d2ae4727ae4ad3ce781dd.ico&quot; alt=&quot;uView Vue3.0 &quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;uView Vue3.0 &quot; href=&quot;https://vkuviewdoc.fsq.pub/components/intro.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;uView Vue3.0 &lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;同时支持 Vue3.0 和 Vue2.0，你没看错，现在 uView 支持 Vue3.0 了！（不支持nvue，此版本为uView1.0的分支）&quot;&gt;同时支持 Vue3.0 和 Vue2.0，你没看错，现在 uView 支持 Vue3.0 了！（不支持nvue，此版本为uView1.0的分支）&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/fadbe0b2fc72e98241c87965c8a58381.ico&quot; alt=&quot;Gantt : Samples&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Gantt : Samples&quot; href=&quot;https://docs.dhtmlx.com/gantt/samples/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Gantt : Samples&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;gantt 甘特图示例库&quot;&gt;gantt 甘特图示例库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/51b8bdd908fe1ae0f71de16a6d2d9961.ico&quot; alt=&quot;Neumorphism/Soft UI CSS shadow generator&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Neumorphism/Soft UI CSS shadow generator&quot; href=&quot;https://neumorphism.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Neumorphism/Soft UI CSS shadow generator&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;CSS code generator that will help with colors, gradients and shadows to adapt this new design trend or discover its posibilities.&quot;&gt;CSS code generator that will help with colors, gradients and shadows to adapt this new design trend or discover its posibilities.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/361cd8a4138cc2ec9fda19e09223a460.ico&quot; alt=&quot;Boostrap4中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Boostrap4中文文档&quot; href=&quot;http://bs4.dashgame.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Boostrap4中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Boostrap4中文文档&quot;&gt;Boostrap4中文文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/icon_144x144.67aef2_1721226110880.png&quot; alt=&quot;bootstrap-vue&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;bootstrap-vue&quot; href=&quot;https://bootstrap-vue.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;bootstrap-vue&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;bootstrap-vue&quot;&gt;bootstrap-vue&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/8909fab0bc8c29253b489bb0cdb6f417.png&quot; alt=&quot;shadcn&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;shadcn&quot; href=&quot;https://ui.shadcn.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;shadcn&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;设计精美的组件，您可以将其复制并粘贴到应用程序中。可到达的可定制的。开源。&quot;&gt;设计精美的组件，您可以将其复制并粘贴到应用程序中。可到达的可定制的。开源。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>前端框架</title>
		<link href="https://www.dtking.cn/classify/1719365244895244291/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244895244291/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;前端框架&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/cn.vuejs.org_logo.svg_1701089851198.png&quot; alt=&quot;Vue3&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Vue3&quot; href=&quot;https://cn.vuejs.org/guide/quick-start.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Vue3&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Vue.js - 渐进式的 JavaScript 框架&quot;&gt;Vue.js - 渐进式的 JavaScript 框架&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/73f39a0e377a82409c605427171b0c2d.png&quot; alt=&quot;VuePress&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;VuePress&quot; href=&quot;https://vuepress.vuejs.org/zh/guide/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;VuePress&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Vue 驱动的静态网站生成器&quot;&gt;Vue 驱动的静态网站生成器&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9467c90c72ef14c39011131bd5f2bc7f.ico&quot; alt=&quot;Nuxt.js - Vue.js 通用应用框架 | Nuxt.js 中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nuxt.js - Vue.js 通用应用框架 | Nuxt.js 中文网&quot; href=&quot;https://www.nuxtjs.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nuxt.js - Vue.js 通用应用框架 | Nuxt.js 中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Nuxt.js 是一个基于 Vue.js 的轻量级应用框架，可用来创建服务端渲染 (SSR) 应用，也可充当静态站点引擎生成静态站点应用，具有优雅的代码结构分层和热加载等特性。&quot;&gt;Nuxt.js 是一个基于 Vue.js 的轻量级应用框架，可用来创建服务端渲染 (SSR) 应用，也可充当静态站点引擎生成静态站点应用，具有优雅的代码结构分层和热加载等特性。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/icon_1701090174638.png&quot; alt=&quot;Nuxt: The Intuitive Vue Framework · Nuxt&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nuxt: The Intuitive Vue Framework · Nuxt&quot; href=&quot;https://nuxt.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nuxt: The Intuitive Vue Framework · Nuxt&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Nuxt是一个开源框架，它使web开发直观而强大。满怀信心地创建性能和生产级的全栈web应用程序和网站。&quot;&gt;Nuxt是一个开源框架，它使web开发直观而强大。满怀信心地创建性能和生产级的全栈web应用程序和网站。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/349c0559edb12e451f0d7deee5f89c80.png&quot; alt=&quot;Elevent 静态站点生成器&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Elevent 静态站点生成器&quot; href=&quot;https://www.11ty.dev/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Elevent 静态站点生成器&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Eleventy is a simpler static site generator Eleventy是一个更简单的静态站点生成器&quot;&gt;Eleventy is a simpler static site generator Eleventy是一个更简单的静态站点生成器&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/8021150383e4e69bd7cf4f5c6e317667.png&quot; alt=&quot;Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter&quot; href=&quot;https://flutter.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Flutter: 为所有屏幕创造精彩 - Flutter 中文开发者网站 - Flutter&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Flutter 官方文档中文版，包含 SDK 下载、最新特性介绍、代码示例、开发文档、中文社区等内容。&quot;&gt;Flutter 官方文档中文版，包含 SDK 下载、最新特性介绍、代码示例、开发文档、中文社区等内容。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0effa13bc2111b3285f83ca05a68e740.png&quot; alt=&quot;Uni-app多端开发&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Uni-app多端开发&quot; href=&quot;https://uniapp.dcloud.net.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Uni-app多端开发&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;DCloud - HBuilder、HBuilderX、uni-app、uniapp、5+、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架&quot;&gt;DCloud - HBuilder、HBuilderX、uni-app、uniapp、5+、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5c44eda33029067817cea1e1f2e1064b.ico&quot; alt=&quot;Electron&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Electron&quot; href=&quot;https://www.electronjs.org/zh/docs/latest/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Electron&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux&amp;amp;amp;amp;amp;mdash;&amp;amp;amp;amp;amp;mdash;不需要本地开发 经验。&quot;&gt;Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux&amp;amp;amp;amp;amp;mdash;&amp;amp;amp;amp;amp;mdash;不需要本地开发 经验。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b70ee6a839369a66fa4e451719274cdf.ico&quot; alt=&quot;Layui - 极简模块化前端 UI 组件库(官方文档)&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Layui - 极简模块化前端 UI 组件库(官方文档)&quot; href=&quot;https://layui.dev/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Layui - 极简模块化前端 UI 组件库(官方文档)&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一套开源免费的 Web UI 组件库。采用自身极简的轻量级模块化规范，并遵循原生 HTML/CSS/JS 的开发模式，极易上手，开箱即用。非常适合网页界面的快速构建。&quot;&gt;一套开源免费的 Web UI 组件库。采用自身极简的轻量级模块化规范，并遵循原生 HTML/CSS/JS 的开发模式，极易上手，开箱即用。非常适合网页界面的快速构建。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f26543415732f0246858fc2e49c6e140.png&quot; alt=&quot;Vue Flow&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Vue Flow&quot; href=&quot;https://vueflow.dev/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Vue Flow&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用Vue Flow为您的流程图和图形带来交互性。这是一个高度可定制的Vue3流程图库，可用于使用Vue3流程图示可视化您的想法。具有无缝缩放和平移以及更多功能！&quot;&gt;使用Vue Flow为您的流程图和图形带来交互性。这是一个高度可定制的Vue3流程图库，可用于使用Vue3流程图示可视化您的想法。具有无缝缩放和平移以及更多功能！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c01260fa3abca59fbab9a4150c5f565f.ico&quot; alt=&quot;Clipboard.js-不使用Flash复制到剪贴板&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Clipboard.js-不使用Flash复制到剪贴板&quot; href=&quot;https://clipboardjs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Clipboard.js-不使用Flash复制到剪贴板&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;将文本复制到剪贴板应该不难。它不需要几十个步骤来配置，也不需要加载数百KB。但最重要的是，它不应该依赖于Flash或任何臃肿的框架。这就是为什么剪贴板。js存在。&quot;&gt;将文本复制到剪贴板应该不难。它不需要几十个步骤来配置，也不需要加载数百KB。但最重要的是，它不应该依赖于Flash或任何臃肿的框架。这就是为什么剪贴板。js存在。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/afc7862e6dc7fc5f77ebc0da19214b08.ico&quot; alt=&quot;Flexbox实验室&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Flexbox实验室&quot; href=&quot;https://flexboxlabs.netlify.app/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Flexbox实验室&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个用于实验flexbox布局的可视化工具&quot;&gt;一个用于实验flexbox布局的可视化工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/40fa3764a776c77acc0f3e148a2c9c77.ico&quot; alt=&quot;jQuery中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;jQuery中文文档&quot; href=&quot;http://jquery.yanzhihui.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;jQuery中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;jQuery API 1.11.3 中文手册最新版，在线地址：http://jquery.ttybz.com&quot;&gt;jQuery API 1.11.3 中文手册最新版，在线地址：http://jquery.ttybz.com&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1aad81555334536dfcd66ce5b5aa6551.png&quot; alt=&quot;TypeScript 入门教程&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;TypeScript 入门教程&quot; href=&quot;https://ts.xcatliu.com&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;TypeScript 入门教程&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;从 JavaScript 程序员的角度总结思考，循序渐进的理解 TypeScript。&quot;&gt;从 JavaScript 程序员的角度总结思考，循序渐进的理解 TypeScript。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-07-18_09-15-43_1721265209573.png&quot; alt=&quot;html2canvas - Screenshots with JavaScript&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;html2canvas - Screenshots with JavaScript&quot; href=&quot;https://html2canvas.hertzen.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;html2canvas - Screenshots with JavaScript&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;html2canvas-使用JavaScript的屏幕截图&quot;&gt;html2canvas-使用JavaScript的屏幕截图&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/fe0f8fbd4579659d8cebf32ebfbcbb44.png&quot; alt=&quot;DCloud 插件市场&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DCloud 插件市场&quot; href=&quot;https://ext.dcloud.net.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DCloud 插件市场&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;插件,插件市场,uniapp,uni-app,小程序,混合开发,html,javascript,跨平台开发,微信小程序,支付宝小程,百度小程序,原生插件,uniapp android原生插件, uniapp ios原生插件,组件,SDK,模板,页面模板,项目模板,HBuilderX插件,前端组件,unicloud,项目模版,网站模版,全套模版,全套源码,免费下载&quot;&gt;插件,插件市场,uniapp,uni-app,小程序,混合开发,html,javascript,跨平台开发,微信小程序,支付宝小程,百度小程序,原生插件,uniapp android原生插件, uniapp ios原生插件,组件,SDK,模板,页面模板,项目模板,HBuilderX插件,前端组件,unicloud,项目模版,网站模版,全套模版,全套源码,免费下载&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/lil-gui.georgealways.com.png&quot; alt=&quot;lil-gui web 浮动控制板&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;lil-gui web 浮动控制板&quot; href=&quot;https://lil-gui.georgealways.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;lil-gui web 浮动控制板&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为web上的控制器制作一个浮动面板。在大多数项目中作为dat.gui的替代品。有关中断更改的列表，请参见迁移。&quot;&gt;为web上的控制器制作一个浮动面板。在大多数项目中作为dat.gui的替代品。有关中断更改的列表，请参见迁移。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/978bd0e56d6175bca36dad288af4a569.png&quot; alt=&quot;eruda移动调试工具&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;eruda移动调试工具&quot; href=&quot;https://eruda.liriliri.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;eruda移动调试工具&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;eruda移动调试工具&quot;&gt;eruda移动调试工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3a74a63aec5af4de9a2204f912b00f1f.png&quot; alt=&quot;简介 | rollup.js 中文文档 | rollup.js中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;简介 | rollup.js 中文文档 | rollup.js中文网&quot; href=&quot;https://www.rollupjs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;简介 | rollup.js 中文文档 | rollup.js中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Rollup 是一个用于 JavaScript 的模块打包工具，它将小的代码片段编译成更大、更复杂的代码，例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式，而不是以前的 CommonJS 和 AMD 等特殊解决方案。&quot;&gt;Rollup 是一个用于 JavaScript 的模块打包工具，它将小的代码片段编译成更大、更复杂的代码，例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式，而不是以前的 CommonJS 和 AMD 等特殊解决方案。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/99326b866724a73597a069b781437e07.png&quot; alt=&quot;Editor.js 所见即所得&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Editor.js 所见即所得&quot; href=&quot;https://editorjs.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Editor.js 所见即所得&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;具有通用JSON输出的免费块样式编辑器&quot;&gt;具有通用JSON输出的免费块样式编辑器&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/75c7a6ffac69afe608d49cccefcc4e46.ico&quot; alt=&quot;Lodash 简介 | Lodash 中文文档 | Lodash 中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Lodash 简介 | Lodash 中文文档 | Lodash 中文网&quot; href=&quot;https://www.lodashjs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Lodash 简介 | Lodash 中文文档 | Lodash 中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。&quot;&gt;Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/a5723b679a3f46f571357cf0e0951999.ico&quot; alt=&quot;Quick Start | Crawlee&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Quick Start | Crawlee&quot; href=&quot;https://crawlee.dev/docs/quick-start&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Quick Start | Crawlee&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;通过这个简短的教程，您可以在一两分钟内开始使用Crawlee进行抓取。要了解更多信息，请阅读简介。&quot;&gt;通过这个简短的教程，您可以在一两分钟内开始使用Crawlee进行抓取。要了解更多信息，请阅读简介。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d91e37a727ca55124a05292908e05246.png&quot; alt=&quot;highlight-代码高亮&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;highlight-代码高亮&quot; href=&quot;https://highlightjs.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;highlight-代码高亮&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;197种语言和248种风格，自动语言检测，多语言代码突出显示，可用于node.js，使用任何标记，与任何js框架兼容&quot;&gt;197种语言和248种风格，自动语言检测，多语言代码突出显示，可用于node.js，使用任何标记，与任何js框架兼容&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/313e5e767d510d79153d80bcb6f1e585.ico&quot; alt=&quot;ES6入门文档-ES6官方文档,ES6新特性,ES6标准入门文档,ES6教程&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ES6入门文档-ES6官方文档,ES6新特性,ES6标准入门文档,ES6教程&quot; href=&quot;http://caibaojian.com/es6/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ES6入门文档-ES6官方文档,ES6新特性,ES6标准入门文档,ES6教程&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;ES6是什么？ES6的新特性有哪些？这篇文章介绍了ECMAScript 6.0（简称ES6）是JavaScript语言的下一代标准，已经在2015年6月正式发布了。它的目标，是使得JavaScript语言可以用来编写复杂的大型应用程序，成为企业级开发语言。&quot;&gt;ES6是什么？ES6的新特性有哪些？这篇文章介绍了ECMAScript 6.0（简称ES6）是JavaScript语言的下一代标准，已经在2015年6月正式发布了。它的目标，是使得JavaScript语言可以用来编写复杂的大型应用程序，成为企业级开发语言。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6bf1c8409e62d67e7a7d663896e95246.ico&quot; alt=&quot;vConsole: 一个轻量、可拓展、针对手机网页的前端开发者调试面板&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;vConsole: 一个轻量、可拓展、针对手机网页的前端开发者调试面板&quot; href=&quot;https://gitee.com/Tencent/vConsole#/Tencent/vConsole/blob/dev/doc/tutorial_CN.md&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;vConsole: 一个轻量、可拓展、针对手机网页的前端开发者调试面板&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个轻量、可拓展、针对手机网页的前端开发者调试面板&quot;&gt;一个轻量、可拓展、针对手机网页的前端开发者调试面板&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/ast_1733446549854.png&quot; alt=&quot;AST explorer&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;AST explorer&quot; href=&quot;https://astexplorer.net/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;AST explorer&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在线 AST 解析，语法树&quot;&gt;在线 AST 解析，语法树&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7be8731b45b3b7a37acda31ba3f15805.ico&quot; alt=&quot;Terser 中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Terser 中文网&quot; href=&quot;https://terser.nodejs.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Terser 中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;JavaScript 混淆器与压缩器工具包&quot;&gt;JavaScript 混淆器与压缩器工具包&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>开发文档</title>
		<link href="https://www.dtking.cn/classify/1719365244828135427/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244828135427/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;开发文档&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cbdd2eb7b4a9880ea038909ad4983dd4.png&quot; alt=&quot;MDN Web文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;MDN Web文档&quot; href=&quot;https://developer.mozilla.org/zh-CN/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;MDN Web文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;MDN Web Docs网站提供了有关开放Web技术的信息，包括HTML、CSS和Web站点和渐进式Web应用程序的API。&quot;&gt;MDN Web Docs网站提供了有关开放Web技术的信息，包括HTML、CSS和Web站点和渐进式Web应用程序的API。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5b8b930a4182bfd76df6abb5deefc39f.ico&quot; alt=&quot;HTML5+ API 规范&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;HTML5+ API 规范&quot; href=&quot;https://www.html5plus.org/doc/h5p.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;HTML5+ API 规范&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;HTML5中国产业联盟&quot;&gt;HTML5中国产业联盟&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/28f3ddf7a35dc31a380ba935e5fca5b8.ico&quot; alt=&quot;JeecgBoot 开发文档 &amp;amp;amp;amp;middot; 看云&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;JeecgBoot 开发文档 &amp;amp;amp;amp;middot; 看云&quot; href=&quot;http://doc.jeecg.com/2043868&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;JeecgBoot 开发文档 &amp;amp;amp;amp;middot; 看云&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;JeecgBoot是一款基于BPM的低代码平台！前后端分离架构 SpringBoot 2.x，SpringCloud，Ant Design&amp;amp;amp;amp;amp;Vue，Mybatis-plus，Shiro，JWT，支持微服务。强大的代码生成器让前后端代码一键生成，实现低代码开发！ JeecgBoot引领新低代码开发模式 OnlineCoding-&amp;amp;amp;amp;gt; 代码生成器-&amp;amp;amp;amp;gt; 手工MERGE， 帮助Java项目解决70%的重复工作，让开发更多关注业务&quot;&gt;JeecgBoot是一款基于BPM的低代码平台！前后端分离架构 SpringBoot 2.x，SpringCloud，Ant Design&amp;amp;amp;amp;amp;Vue，Mybatis-plus，Shiro，JWT，支持微服务。强大的代码生成器让前后端代码一键生成，实现低代码开发！ JeecgBoot引领新低代码开发模式 OnlineCoding-&amp;amp;amp;amp;gt; 代码生成器-&amp;amp;amp;amp;gt; 手工MERGE， 帮助Java项目解决70%的重复工作，让开发更多关注业务&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4746d4e05063d289745b1f46590fab48.png&quot; alt=&quot;JDK8 中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;JDK8 中文文档&quot; href=&quot;https://www.matools.com/api/java8&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;JDK8 中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;最新Java 8 中文版 api手册,Java 8 中文版 chm在线版浏览,Java 8 中文版在线中文参考手册,Java 8 中文版开发文档&quot;&gt;最新Java 8 中文版 api手册,Java 8 中文版 chm在线版浏览,Java 8 中文版在线中文参考手册,Java 8 中文版开发文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/fc4eeabcb515e0a9fa0661110879cebb.ico&quot; alt=&quot;Python Windows版本| Python.org&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Python Windows版本| Python.org&quot; href=&quot;https://www.python.org/downloads/windows/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Python Windows版本| Python.org&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Python编程语言的官方主页&quot;&gt;Python编程语言的官方主页&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/728a47d16645ef77c4aa756e31f550ce.ico&quot; alt=&quot;Python软件库&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Python软件库&quot; href=&quot;https://pypi.org/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Python软件库&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Python包索引（PyPI）是Python编程语言的软件库。&quot;&gt;Python包索引（PyPI）是Python编程语言的软件库。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/dev.bi__1718681097203.png&quot; alt=&quot;开发人员备忘单&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;开发人员备忘单&quot; href=&quot;https://quickref.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;开发人员备忘单&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为开发人员分享快速参考备忘清单【速查表】 (主要是方便自己)，在看到 Reference 快速参考备忘单，感觉非常简单，造轮子使命感突然来了，造个中文版本的，为了方便自己的技术栈查阅，立马撸起来 :)。如果您发现此处的备忘单不合适，您可以通过提交 PR 来修复它或提供更好的备忘清单，只针对【中文】用户。以下是开源天使提供的一些备忘清单和快速参考 :)。&quot;&gt;为开发人员分享快速参考备忘清单【速查表】 (主要是方便自己)，在看到 Reference 快速参考备忘单，感觉非常简单，造轮子使命感突然来了，造个中文版本的，为了方便自己的技术栈查阅，立马撸起来 :)。如果您发现此处的备忘单不合适，您可以通过提交 PR 来修复它或提供更好的备忘清单，只针对【中文】用户。以下是开源天使提供的一些备忘清单和快速参考 :)。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3f85b201ed274e49d9b261167b5390a4.ico&quot; alt=&quot;Hutool参考文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Hutool参考文档&quot; href=&quot;https://hutool.cn/docs/#/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Hutool参考文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Hutool，Java工具集&quot;&gt;Hutool，Java工具集&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/9380e3202280a1ec520455632f552293.png&quot; alt=&quot;web.dev for China&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;web.dev for China&quot; href=&quot;https://web.developers.google.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;web.dev for China&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;构建可在任何浏览器上运行的现代 Web 体验的指南。我们希望帮助您构建美观、易于访问、快速且安全的网站，从而能跨浏览器并为您的所有用户提供服务。本网站包含各种内容，由 Chrome 团队成员及外部专家撰写，可协助您顺利踏上这一旅程。
&quot;&gt;构建可在任何浏览器上运行的现代 Web 体验的指南。我们希望帮助您构建美观、易于访问、快速且安全的网站，从而能跨浏览器并为您的所有用户提供服务。本网站包含各种内容，由 Chrome 团队成员及外部专家撰写，可协助您顺利踏上这一旅程。
&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3b1bf3ffd73590aa2d6a7599f629c5b7.png&quot; alt=&quot;GORM - The fantastic ORM library for Golang, aims to be developer friendly.&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;GORM - The fantastic ORM library for Golang, aims to be developer friendly.&quot; href=&quot;https://gorm.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;GORM - The fantastic ORM library for Golang, aims to be developer friendly.&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;The fantastic ORM library for Golang aims to be developer friendly.&quot;&gt;The fantastic ORM library for Golang aims to be developer friendly.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f9a64d9abfe1a80d0d52f157de3035b9.png&quot; alt=&quot;Rod&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Rod&quot; href=&quot;https://go-rod.github.io/i18n/zh-CN/#/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Rod&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个用于 web 自动化和爬虫的 driver&quot;&gt;一个用于 web 自动化和爬虫的 driver&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/blog.redis.com.cn.ico&quot; alt=&quot;Nginx中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nginx中文文档&quot; href=&quot;https://blog.redis.com.cn/doc/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nginx中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Nginx中文文档&quot;&gt;Nginx中文文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/4c7822391b03ae365753339ece402185.ico&quot; alt=&quot;JDK8 API&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;JDK8 API&quot; href=&quot;https://docs.oracle.com/javase/8/docs/api/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;JDK8 API&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Overview, Java&amp;amp;amp;trade; Platform, Standard Edition 8 API Specification&quot;&gt;Overview, Java&amp;amp;amp;trade; Platform, Standard Edition 8 API Specification&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/dormousehole.readthedocs.io.png&quot; alt=&quot;Flask Python Web应用程序框架&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Flask Python Web应用程序框架&quot; href=&quot;https://dormousehole.readthedocs.io/en/latest/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Flask Python Web应用程序框架&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Flask Python Web应用程序框架&quot;&gt;Flask Python Web应用程序框架&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/01c9f4553ee3806390c9a22b639e2932.ico&quot; alt=&quot;Flask 概述_w3cschool&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Flask 概述_w3cschool&quot; href=&quot;https://www.w3cschool.cn/flask/flask_overview.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Flask 概述_w3cschool&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;什么是Web Framework？ Web Application Framework（Web应用程序框架）或简单的Web Framework（Web框架）表示一个库和模块的集合，使Web应用程序开发人员能够编写应用程序，而不必担心协议，线程管理等低级细节。 什么是Flask？ Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发，他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两_来自Flask 教程，w3cschool编程狮。&quot;&gt;什么是Web Framework？ Web Application Framework（Web应用程序框架）或简单的Web Framework（Web框架）表示一个库和模块的集合，使Web应用程序开发人员能够编写应用程序，而不必担心协议，线程管理等低级细节。 什么是Flask？ Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发，他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两_来自Flask 教程，w3cschool编程狮。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon_1718681453773.png&quot; alt=&quot;API 文档 | Node.js 中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;API 文档 | Node.js 中文网&quot; href=&quot;https://www.nodejs.cn/api/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;API 文档 | Node.js 中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;node 中文文档&quot;&gt;node 中文文档&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3227a853e44786b10162f3088874c872.ico&quot; alt=&quot;Go Packages - Go Packages&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Go Packages - Go Packages&quot; href=&quot;https://pkg.go.dev/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Go Packages - Go Packages&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Go是一种开源编程语言，可以轻松构建简单、可靠和高效的软件。&quot;&gt;Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Go是一种开源编程语言，可以轻松构建简单、可靠和高效的软件。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/29e9176a64c04ea8e884e6e1c563f747.ico&quot; alt=&quot;Python3 教程 | 菜鸟教程&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Python3 教程 | 菜鸟教程&quot; href=&quot;https://www.runoob.com/python3/python3-tutorial.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Python3 教程 | 菜鸟教程&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Python 3 教程 Python 的 3.0 版本，常被称为 Python 3000，或简称 Py3k。相对于 Python 的早期版本，这是一个较大的升级。为了不带入过多的累赘，Python 3.0 在设计的时候没有考虑向下兼容。 Python 介绍及安装教程我们在Python 2.X 版本的教程中已有介绍，这里就不再赘述。 你也可以点击 Python2.x与3​​.x版本区别 来查看两者的不同。 本教程主要针对 Pyt..&quot;&gt;Python 3 教程 Python 的 3.0 版本，常被称为 Python 3000，或简称 Py3k。相对于 Python 的早期版本，这是一个较大的升级。为了不带入过多的累赘，Python 3.0 在设计的时候没有考虑向下兼容。 Python 介绍及安装教程我们在Python 2.X 版本的教程中已有介绍，这里就不再赘述。 你也可以点击 Python2.x与3​​.x版本区别 来查看两者的不同。 本教程主要针对 Pyt..&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/84192f9060e0f5e78eaff3433f6eee25.ico&quot; alt=&quot;DataV.GeoAtlas地理小工具系列&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DataV.GeoAtlas地理小工具系列&quot; href=&quot;https://datav.aliyun.com/portal/school/atlas/area_selector&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DataV.GeoAtlas地理小工具系列&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;由阿里云DataV数据可视化团队出品，多年深耕数据可视化领域，数据大屏业务开拓者和领航者。致力用震撼而清晰的视觉语言，让更多人读懂大数据，受惠数据驱动的决策方式。&quot;&gt;由阿里云DataV数据可视化团队出品，多年深耕数据可视化领域，数据大屏业务开拓者和领航者。致力用震撼而清晰的视觉语言，让更多人读懂大数据，受惠数据驱动的决策方式。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f6a0c49626a4dea2b70b82566282dd8e.svg&quot; alt=&quot;Android 移动应用开发者工具 – Android 开发者 | Android Developers&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Android 移动应用开发者工具 – Android 开发者 | Android Developers&quot; href=&quot;https://developer.android.google.cn/?hl=zh-cn&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Android 移动应用开发者工具 – Android 开发者 | Android Developers&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;为每个Android设备的开发人员发现最新的应用程序开发工具、平台更新、培训和文档。&quot;&gt;为每个Android设备的开发人员发现最新的应用程序开发工具、平台更新、培训和文档。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-07-18_09-11-51_1721264981354.png&quot; alt=&quot;jsPDF - 文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;jsPDF - 文档&quot; href=&quot;https://parallax.github.io/jsPDF/docs/jsPDF.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;jsPDF - 文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;使用jsPDF轻松生成专业PDF，jsPDF是PDF生成的开源解决方案。使用我们直观的界面，在几分钟内创建活动门票、报告、证书等。&quot;&gt;使用jsPDF轻松生成专业PDF，jsPDF是PDF生成的开源解决方案。使用我们直观的界面，在几分钟内创建活动门票、报告、证书等。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c7e10044a0a43efdcc50d959ceb249dd.ico&quot; alt=&quot;AutoX.js&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;AutoX.js&quot; href=&quot;http://doc.autoxjs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;AutoX.js&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个支持无障碍服务的Android平台上的JavaScript 运行环境 和 开发环境，其发展目标是类似JsBox和Workflow。
&quot;&gt;一个支持无障碍服务的Android平台上的JavaScript 运行环境 和 开发环境，其发展目标是类似JsBox和Workflow。
&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/597575f96f4f0ea06fd7e8547671277d.png&quot; alt=&quot;Chrome 无头模式 | Chromium | Chrome for Developers&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Chrome 无头模式 | Chromium | Chrome for Developers&quot; href=&quot;https://developer.chrome.google.cn/docs/chromium/headless?hl=zh-cn&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Chrome 无头模式 | Chromium | Chrome for Developers&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;现在，Chrome 的无头模式更接近 Chrome 的常规“头”模式，因此对开发者来说更为实用。&quot;&gt;现在，Chrome 的无头模式更接近 Chrome 的常规“头”模式，因此对开发者来说更为实用。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ef1db59f510ced5088aa3800933b6b89.png&quot; alt=&quot;Selenium浏览器自动化项目&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Selenium浏览器自动化项目&quot; href=&quot;https://www.selenium.dev/documentation/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Selenium浏览器自动化项目&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Selenium使浏览器自动化。就是这样！&quot;&gt;Selenium使浏览器自动化。就是这样！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/favicon-32x32_1729243478159.png&quot; alt=&quot;Selenium node 文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Selenium node 文档&quot; href=&quot;https://www.selenium.dev/selenium/docs/api/javascript/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Selenium node 文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Selenium 是一个浏览器自动化库。Selenium 最常用于测试 Web 应用程序，可用于任何需要自动与浏览器交互的任务。
&quot;&gt;Selenium 是一个浏览器自动化库。Selenium 最常用于测试 Web 应用程序，可用于任何需要自动与浏览器交互的任务。
&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/343d4b08b85a88f805e334ebffbe316d.ico&quot; alt=&quot;Fyne toolkit 开发文档 | Fyne 开发文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Fyne toolkit 开发文档 | Fyne 开发文档&quot; href=&quot;https://go-circle.cn/fyne-press/v1.0/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Fyne toolkit 开发文档 | Fyne 开发文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;你喜爱的应用使用fyne框架构建&quot;&gt;你喜爱的应用使用fyne框架构建&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/93f55753a3b96d1f960e53af9f16bb04.png&quot; alt=&quot;Fyne.io | Fyne应用程序开发框架网站。&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Fyne.io | Fyne应用程序开发框架网站。&quot; href=&quot;https://fyne.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Fyne.io | Fyne应用程序开发框架网站。&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Fyne应用程序开发框架的网站。&quot;&gt;Fyne应用程序开发框架的网站。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/834338a1db8664b9c5cab57a7dc33292.ico&quot; alt=&quot;Puppeteer 官网文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Puppeteer 官网文档&quot; href=&quot;https://pptr.dev/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Puppeteer 官网文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Puppeteer &quot;&gt;Puppeteer &lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f708b6c21117ba590ea3446d11b44aba.ico&quot; alt=&quot;Puppeteer | Puppeteer 中文网&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Puppeteer | Puppeteer 中文网&quot; href=&quot;https://pptr.nodejs.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Puppeteer | Puppeteer 中文网&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Puppeteer 是一个 JavaScript 库，它提供了一个高级 API 来通过 开发工具协议 或 WebDriver 双向 控制 Chrome 或 Firefox。Puppeteer 默认在无头（无可见 UI）模式下运行&quot;&gt;Puppeteer 是一个 JavaScript 库，它提供了一个高级 API 来通过 开发工具协议 或 WebDriver 双向 控制 Chrome 或 Firefox。Puppeteer 默认在无头（无可见 UI）模式下运行&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/ccb472766e02029226c88ee1e04dc272.ico&quot; alt=&quot;Netty: Home&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Netty: Home&quot; href=&quot;https://netty.io/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Netty: Home&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;网络编程&quot;&gt;网络编程&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/bd936ded65fe65f0b41920803922a704.png&quot; alt=&quot;Socket.IO&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Socket.IO&quot; href=&quot;https://socket.io/zh-CN/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Socket.IO&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Socket.IO&quot;&gt;Socket.IO&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/Snipaste_2024-07-18_09-13-18_1721265125587.png&quot; alt=&quot;zip.js&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;zip.js&quot; href=&quot;https://gildas-lormeau.github.io/zip.js/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;zip.js&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;一个用于压缩和解压缩文件的JavaScript库&quot;&gt;一个用于压缩和解压缩文件的JavaScript库&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/61b4ef0268ad30f26d71c89fde4a5234.png&quot; alt=&quot;Nunjucks 中文文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Nunjucks 中文文档&quot; href=&quot;https://nunjucks.bootcss.com/templating.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Nunjucks 中文文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Nunjucks 模板引擎 -- JavaScript 专用的功能丰富、强大的模板引擎。&quot;&gt;Nunjucks 模板引擎 -- JavaScript 专用的功能丰富、强大的模板引擎。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7434364ddf35472b087cb3de2b2a9473.ico&quot; alt=&quot;Gantt 开发文档&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Gantt 开发文档&quot; href=&quot;https://docs.dhtmlx.com/gantt/desktop__guides.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Gantt 开发文档&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Guides Gantt Docs&quot;&gt;Guides Gantt Docs&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>开发论坛</title>
		<link href="https://www.dtking.cn/classify/1719365245155291138/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365245155291138/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;开发论坛&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/2932df6fc5447b33642e6613e03c1806.ico&quot; alt=&quot;Stack Overflow&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Stack Overflow&quot; href=&quot;https://stackoverflow.com/questions&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Stack Overflow&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Stack Overflow是最大、最值得信赖的在线社区，供开发人员学习、分享​ ​他们的程序​知识，并建立自己的职业生涯。&quot;&gt;Stack Overflow是最大、最值得信赖的在线社区，供开发人员学习、分享​ ​他们的程序​知识，并建立自己的职业生涯。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f7cd3a836d918b8df65634b045af2b8c.png&quot; alt=&quot;DEV Community&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DEV Community&quot; href=&quot;https://dev.to/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DEV Community&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;A constructive and inclusive social network for software developers. With you every step of your journey.&quot;&gt;A constructive and inclusive social network for software developers. With you every step of your journey.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19_1744365441733.png&quot; alt=&quot;medium（墙）&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;medium（墙）&quot; href=&quot;https://medium.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;medium（墙）&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;在Medium上，任何人都可以与世界分享有见地的观点、有用的知识和生活智慧。&quot;&gt;在Medium上，任何人都可以与世界分享有见地的观点、有用的知识和生活智慧。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/550537540c82282f7ee852a388b9c7e2.ico&quot; alt=&quot;SegmentFault 思否&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;SegmentFault 思否&quot; href=&quot;https://segmentfault.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;SegmentFault 思否&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;SegmentFault 思否是中国专业的开发者技术社区。我们以技术问答、技术博客、技术课程、技术资讯为核心的产品形态，为开发者提供纯粹、高质的技术交流平台。&quot;&gt;SegmentFault 思否是中国专业的开发者技术社区。我们以技术问答、技术博客、技术课程、技术资讯为核心的产品形态，为开发者提供纯粹、高质的技术交流平台。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d8da73bd4bc1ecd538d67bdc6b1b8b79.png&quot; alt=&quot;InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦&quot; href=&quot;https://www.infoq.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;InfoQ是一个实践驱动、以社区为中心的技术媒体平台，致力于促进软件开发及相关领域知识与创新的传播，提供架构，云计算，AI，前端，大数据等与软件开发相关的最新技术资讯、解读及技术会议。&quot;&gt;InfoQ是一个实践驱动、以社区为中心的技术媒体平台，致力于促进软件开发及相关领域知识与创新的传播，提供架构，云计算，AI，前端，大数据等与软件开发相关的最新技术资讯、解读及技术会议。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7cf2fd3c5f4e1e91d9025e83d15402e1.png&quot; alt=&quot;博客园 - 开发者的网上家园&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;博客园 - 开发者的网上家园&quot; href=&quot;https://www.cnblogs.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;博客园 - 开发者的网上家园&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;博客园是一个面向开发者的知识分享社区。自创建以来，博客园一直致力并专注于为开发者打造一个纯净的技术交流社区，推动并帮助开发者通过互联网分享知识，从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。&quot;&gt;博客园是一个面向开发者的知识分享社区。自创建以来，博客园一直致力并专注于为开发者打造一个纯净的技术交流社区，推动并帮助开发者通过互联网分享知识，从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cb127b63e215a7799bd4c7aedb246b89.ico&quot; alt=&quot;阿里云开发者社区-云计算社区-阿里云&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;阿里云开发者社区-云计算社区-阿里云&quot; href=&quot;https://developer.aliyun.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;阿里云开发者社区-云计算社区-阿里云&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;阿里云开发者社区覆盖云计算、物联网、大数据、云原生、数据库、人工智能、微服务、安全、开发、运维等技术领域，集合阿里巴巴经济体各个单元技术优势，提供分享、交流、学习、认证、工具、资源、大赛、活动、社群、创业一站式服务能力，满足开发者全生命周期成长需求。&quot;&gt;阿里云开发者社区覆盖云计算、物联网、大数据、云原生、数据库、人工智能、微服务、安全、开发、运维等技术领域，集合阿里巴巴经济体各个单元技术优势，提供分享、交流、学习、认证、工具、资源、大赛、活动、社群、创业一站式服务能力，满足开发者全生命周期成长需求。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/8fcd53ae29af7d0b7ff47c2bad5074c1.ico&quot; alt=&quot;腾讯云开发者社区-腾讯云&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;腾讯云开发者社区-腾讯云&quot; href=&quot;https://cloud.tencent.com/developer&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;腾讯云开发者社区-腾讯云&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;腾讯云开发者社区是腾讯云官方开发者社区，致力于打造开发者的技术分享型社区。提供专栏,问答，沙龙等产品和服务，汇聚海量精品云计算使用和开发经验，致力于帮助开发者快速成长与发展，营造开放的云计算技术生态圈。&quot;&gt;腾讯云开发者社区是腾讯云官方开发者社区，致力于打造开发者的技术分享型社区。提供专栏,问答，沙龙等产品和服务，汇聚海量精品云计算使用和开发经验，致力于帮助开发者快速成长与发展，营造开放的云计算技术生态圈。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/92093de895a8c1600f82073f5fd46f77.ico&quot; alt=&quot;开源Web服务提供商 - NGINX开源社区&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;开源Web服务提供商 - NGINX开源社区&quot; href=&quot;https://www.nginx.org.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;开源Web服务提供商 - NGINX开源社区&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;全球最大的开源Web服务提供者，专注于服务中国用户的社区欢迎加入我们自己的社区！NGINX社区，如您所愿！&quot;&gt;全球最大的开源Web服务提供者，专注于服务中国用户的社区欢迎加入我们自己的社区！NGINX社区，如您所愿！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/www.baeldung.com.ico&quot; alt=&quot;深入了解Java、Spring、Spring Boot、Security和REST的要点教程。&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;深入了解Java、Spring、Spring Boot、Security和REST的要点教程。&quot; href=&quot;https://www.baeldung.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;深入了解Java、Spring、Spring Boot、Security和REST的要点教程。&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;深入了解Java、Spring、Spring Boot、Security和REST的要点教程。&quot;&gt;深入了解Java、Spring、Spring Boot、Security和REST的要点教程。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/dash.cloudflare.com.ico&quot; alt=&quot;Cloudflare | Web Performance &amp;amp;amp; Security&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Cloudflare | Web Performance &amp;amp;amp; Security&quot; href=&quot;https://dash.cloudflare.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Cloudflare | Web Performance &amp;amp;amp; Security&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Cloudflare | Web Performance &amp;amp;amp; Security&quot;&gt;Cloudflare | Web Performance &amp;amp;amp; Security&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>人工智能</title>
		<link href="https://www.dtking.cn/classify/1719365244828135425/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/classify/1719365244828135425/</id>
		<content type="html">	&lt;h1 class=&quot;f-400&quot;&gt;人工智能&lt;/h1&gt;
	&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/6c3635c310ec93710ce3bf7964602445.ico&quot; alt=&quot;幂简AI提示词商城｜灵活{变量}定制，免费试用&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;幂简AI提示词商城｜灵活{变量}定制，免费试用&quot; href=&quot;https://prompts.explinks.com/?ref=adb094212b7c&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;幂简AI提示词商城｜灵活{变量}定制，免费试用&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;幂简AI提示词商城提供3000+优质提示词模板，通过变量自定义，一键生成高质量Prompt，免费试用，满意再购买！&quot;&gt;幂简AI提示词商城提供3000+优质提示词模板，通过变量自定义，一键生成高质量Prompt，免费试用，满意再购买！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/c08e717647964094d9463e543bc36ebb.ico&quot; alt=&quot;Kimi.ai - 帮你看更大的世界&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Kimi.ai - 帮你看更大的世界&quot; href=&quot;https://kimi.moonshot.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Kimi.ai - 帮你看更大的世界&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Kimi 是一个有着超大“内存”的智能助手，可以一口气读完二十万字的小说，还会上网冲浪，快来跟他聊聊吧 | Kimi.ai - Moonshot AI 出品的智能助手&quot;&gt;Kimi 是一个有着超大“内存”的智能助手，可以一口气读完二十万字的小说，还会上网冲浪，快来跟他聊聊吧 | Kimi.ai - Moonshot AI 出品的智能助手&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/bcff00c0eb8ecbd2b1e2c4d95d1268d9.png&quot; alt=&quot;ChatGLM&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;ChatGLM&quot; href=&quot;https://chatglm.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;ChatGLM&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;中国版对话语言模型，与GLM大模型进行对话。ChatGLM，glm，智谱大模型，大模型，中国版chatgpt，中国版gpt3&quot;&gt;中国版对话语言模型，与GLM大模型进行对话。ChatGLM，glm，智谱大模型，大模型，中国版chatgpt，中国版gpt3&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/7f2c736d8a3430ff52b295c462e6e5c1.ico&quot; alt=&quot;讯飞星火认知大模型&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;讯飞星火认知大模型&quot; href=&quot;https://xinghuo.xfyun.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;讯飞星火认知大模型&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;讯飞星火认知大模型，是由科大讯飞推出的大语言模型，能够通过自然语言理解，完成智能对答。&quot;&gt;讯飞星火认知大模型，是由科大讯飞推出的大语言模型，能够通过自然语言理解，完成智能对答。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/92b097c0e60b0ef6885c81ee09056bfa.png&quot; alt=&quot;豆包&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;豆包&quot; href=&quot;https://www.doubao.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;豆包&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;豆包是你的AI 聊天智能对话问答助手，写作文案翻译情感陪伴编程全能工具。豆包为你答疑解惑，提供灵感，辅助创作，也可以和你畅聊任何你感兴趣的话题。&quot;&gt;豆包是你的AI 聊天智能对话问答助手，写作文案翻译情感陪伴编程全能工具。豆包为你答疑解惑，提供灵感，辅助创作，也可以和你畅聊任何你感兴趣的话题。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/408dbe438acabe7765c071b29d713d1d.png&quot; alt=&quot;DeepSeek Chat&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DeepSeek Chat&quot; href=&quot;https://chat.deepseek.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DeepSeek Chat&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;与DeepSeek AI聊天-您的智能助手，用于编码、内容创建、文件读取等。上传文档，进行长时间的上下文对话，并获得人工智能、自然语言处理等方面的专家帮助。|DeepSeek助力编程代码开发、创意写作、文件处理等任务，支持文件上传及长文本对话，随时为您提供高效的AI支持&quot;&gt;与DeepSeek AI聊天-您的智能助手，用于编码、内容创建、文件读取等。上传文档，进行长时间的上下文对话，并获得人工智能、自然语言处理等方面的专家帮助。|DeepSeek助力编程代码开发、创意写作、文件处理等任务，支持文件上传及长文本对话，随时为您提供高效的AI支持&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/b3a11ef81822ba628a76d8dc8ae61bd8.png&quot; alt=&quot;OpenClaw - OpenClaw&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;OpenClaw - OpenClaw&quot; href=&quot;https://docs.openclaw.ai/zh-CN&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;OpenClaw - OpenClaw&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;&quot;&gt;&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1c99199d00613db9da693b932cbb18a5.png&quot; alt=&quot;通义千问&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;通义千问&quot; href=&quot;https://qianwen.aliyun.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;通义千问&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;我是通义千问，一个专门响应人类指令的大模型，希望能对你有所帮助&quot;&gt;我是通义千问，一个专门响应人类指令的大模型，希望能对你有所帮助&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/temp/replicate.com_lucataco_sdxl-lightning-4step_readme_1710492083905.png&quot; alt=&quot;字节跳动SDXL&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;字节跳动SDXL&quot; href=&quot;https://replicate.com/lucataco/sdxl-lightning-4step?prediction=574hqpzbpyt7ze4igcbdefynia&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;字节跳动SDXL&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;字节跳动的SDXL Lightning：一种快速的文本到图像模型，可通过4个步骤生成高质量图像&quot;&gt;字节跳动的SDXL Lightning：一种快速的文本到图像模型，可通过4个步骤生成高质量图像&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/d642d312dd100176ff2ba9f04db6c4a9.svg&quot; alt=&quot;Chat with Z.ai - Free AI Chatbot powered by GLM-4.5&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Chat with Z.ai - Free AI Chatbot powered by GLM-4.5&quot; href=&quot;https://chat.z.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Chat with Z.ai - Free AI Chatbot powered by GLM-4.5&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Chat with Z.ai&amp;#39;s free AI to build apps, create presentations, and write professionally. Fast, smart, and reliable, powered by GLM-4.6.&quot;&gt;Chat with Z.ai&amp;#39;s free AI to build apps, create presentations, and write professionally. Fast, smart, and reliable, powered by GLM-4.6.&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/94146b3ba9530ca9622700534f5e238d.png&quot; alt=&quot;商汤秒画SenseMirage – AI作画，有手就行！还是免费的！&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;商汤秒画SenseMirage – AI作画，有手就行！还是免费的！&quot; href=&quot;https://miaohua.sensetime.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;商汤秒画SenseMirage – AI作画，有手就行！还是免费的！&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;会打字就会用的AI绘画神器，完美支持中文提示词，支持摄影、可爱、精致、赛博朋克、电影等超多风格，人人都可以是插画师！快速创作二次元、写实向等多种风格小姐姐！&quot;&gt;会打字就会用的AI绘画神器，完美支持中文提示词，支持摄影、可爱、精致、赛博朋克、电影等超多风格，人人都可以是插画师！快速创作二次元、写实向等多种风格小姐姐！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/92e15f5af9b7276a50b863dee7273537.ico&quot; alt=&quot;即梦AI - 一站式AI创作平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;即梦AI - 一站式AI创作平台&quot; href=&quot;https://dreamina.jianying.com/ai-tool&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;即梦AI - 一站式AI创作平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;即梦AI是一个AI创作平台，可激发艺术创意、提升绘画和视频创作体验。您可以利用AI智能，将想象变为现实。即梦AI支持文字绘图、文字生成视频和图片生成视频，并提供创作灵感。让即梦AI开启您的AI生成艺术之旅，探索创造的无限可能！&quot;&gt;即梦AI是一个AI创作平台，可激发艺术创意、提升绘画和视频创作体验。您可以利用AI智能，将想象变为现实。即梦AI支持文字绘图、文字生成视频和图片生成视频，并提供创作灵感。让即梦AI开启您的AI生成艺术之旅，探索创造的无限可能！&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/39e4c203b6485871d73e9c420d8af432.png&quot; alt=&quot;FAKEOPEN 相关服务状态&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;FAKEOPEN 相关服务状态&quot; href=&quot;https://status.fakeopen.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;FAKEOPEN 相关服务状态&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Chat 服务状态&quot;&gt;Chat 服务状态&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/06403ec7981dad770ece1ddb742cd196.svg&quot; alt=&quot;Free QWQ - 免费分布式 AI 算力平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Free QWQ - 免费分布式 AI 算力平台&quot; href=&quot;https://qwq.aigpu.cn/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Free QWQ - 免费分布式 AI 算力平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;基于分布式家用电脑的 3090、3080、4090 显卡算力，提供完全免费、无限制的 AI 服务。支持免费使用 QwQ 32B 大语言模型。&quot;&gt;基于分布式家用电脑的 3090、3080、4090 显卡算力，提供完全免费、无限制的 AI 服务。支持免费使用 QwQ 32B 大语言模型。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/0d515dd3f8ca4317ad8faa18827c110e.ico&quot; alt=&quot;文心一言&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;文心一言&quot; href=&quot;https://yiyan.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;文心一言&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;文心一言,百度旗下产品&quot;&gt;文心一言,百度旗下产品&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/cc75362853c651eb0f77579f4bb451d7.png&quot; alt=&quot;360智脑 &amp;amp;mdash; 探索全新的人机协作模式&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;360智脑 &amp;amp;mdash; 探索全新的人机协作模式&quot; href=&quot;https://ai.360.cn/?src=ai-bot.cn&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;360智脑 &amp;amp;mdash; 探索全新的人机协作模式&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;360智脑 &amp;amp;mdash; 探索全新的人机协作模式&quot;&gt;360智脑 &amp;amp;mdash; 探索全新的人机协作模式&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f675d9d75c81fa66b1430a087d92694d.ico&quot; alt=&quot;Inworld&amp;amp;mdash;&amp;amp;mdash;人工智能角色和人工智能NPC的开发者平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Inworld&amp;amp;mdash;&amp;amp;mdash;人工智能角色和人工智能NPC的开发者平台&quot; href=&quot;https://www.inworld.ai/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Inworld&amp;amp;mdash;&amp;amp;mdash;人工智能角色和人工智能NPC的开发者平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;将实时可扩展的人工智能角色、人工智能NPC和情感人工智能聊天机器人与可配置的安全性、第四墙、多模式等集成在一起。用于游戏、品牌、培训等。&quot;&gt;将实时可扩展的人工智能角色、人工智能NPC和情感人工智能聊天机器人与可配置的安全性、第四墙、多模式等集成在一起。用于游戏、品牌、培训等。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/38534ce04089eb4314bbe464adaa78ff.ico&quot; alt=&quot;百度AI搜索伙伴&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;百度AI搜索伙伴&quot; href=&quot;https://chat.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;百度AI搜索伙伴&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;百度最新上线的AI搜索对话工具&quot;&gt;百度最新上线的AI搜索对话工具&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/3f86e655c1890fa69586b8497a917078.ico&quot; alt=&quot;盘古大模型-华为云&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;盘古大模型-华为云&quot; href=&quot;https://pangu.huaweicloud.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;盘古大模型-华为云&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;盘古大模型-华为云&quot;&gt;盘古大模型-华为云&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/e9ac8cd681f8a215d23cb40b6bbba138.ico&quot; alt=&quot;美图设计室-智能生成海报-一键生成-免费设计平面设计编辑软件-免费模板图文素材&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;美图设计室-智能生成海报-一键生成-免费设计平面设计编辑软件-免费模板图文素材&quot; href=&quot;https://design.meitu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;美图设计室-智能生成海报-一键生成-免费设计平面设计编辑软件-免费模板图文素材&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;美图设计室-是美图秀秀旗下的智能设计在线协作平台，是一款平面设计工具和在线平面设计软件,提供海量海报模板,跨境电商模板,跨境电商banner,跨境电商主图,邀请函,公告通知,喜报,logo等免费设计素材和模板,可在线一键稿定设计,智能生成海报,一键换色,一键换装,一键去水印,图片高清修复,无损放大,抠图,拼图&quot;&gt;美图设计室-是美图秀秀旗下的智能设计在线协作平台，是一款平面设计工具和在线平面设计软件,提供海量海报模板,跨境电商模板,跨境电商banner,跨境电商主图,邀请函,公告通知,喜报,logo等免费设计素材和模板,可在线一键稿定设计,智能生成海报,一键换色,一键换装,一键去水印,图片高清修复,无损放大,抠图,拼图&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/f19ce590249b5e68f109d0af58ce7f45.png&quot; alt=&quot;通义万相&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;通义万相&quot; href=&quot;https://wanxiang.aliyun.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;通义万相&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;刻削生千变，丹青图&amp;amp;ldquo;万相&amp;amp;rdquo;。我是通义万相，一个不断进化的AI绘画创作模型&quot;&gt;刻削生千变，丹青图&amp;amp;ldquo;万相&amp;amp;rdquo;。我是通义万相，一个不断进化的AI绘画创作模型&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/1ca1c26455343f8c3d66316173cd9eee.png&quot; alt=&quot;文心一格 - AI艺术和创意辅助平台&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;文心一格 - AI艺术和创意辅助平台&quot; href=&quot;https://yige.baidu.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;文心一格 - AI艺术和创意辅助平台&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;文心一格，AI艺术和创意辅助平台，依托飞桨、文心大模型的技术创新推出的&amp;amp;amp;ldquo;AI作画&amp;amp;amp;rdquo;产品，可轻松驾驭多种风格，人人皆可&amp;amp;amp;ldquo;一语成画&amp;amp;amp;rdquo;&quot;&gt;文心一格，AI艺术和创意辅助平台，依托飞桨、文心大模型的技术创新推出的&amp;amp;amp;ldquo;AI作画&amp;amp;amp;rdquo;产品，可轻松驾驭多种风格，人人皆可&amp;amp;amp;ldquo;一语成画&amp;amp;amp;rdquo;&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/bard.google.com.svg&quot; alt=&quot;体验 Bard - Google 的 AI 实验项目&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;体验 Bard - Google 的 AI 实验项目&quot; href=&quot;https://bard.google.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;体验 Bard - Google 的 AI 实验项目&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;Bard 是为你提供创意启发和实用信息的好帮手。无论是激发想象力、提升工作效率，还是实现创意构想，Bard 都可助你一臂之力。&quot;&gt;Bard 是为你提供创意启发和实用信息的好帮手。无论是激发想象力、提升工作效率，还是实现创意构想，Bard 都可助你一臂之力。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://dtking.cn/access/labs.openai.com.png&quot; alt=&quot;DALL&amp;amp;middot;E&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;DALL&amp;amp;middot;E&quot; href=&quot;https://labs.openai.com/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;DALL&amp;amp;middot;E&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;基于OpenAI的人工智能系统DALL&amp;amp;middot;E的实验&quot;&gt;基于OpenAI的人工智能系统DALL&amp;amp;middot;E的实验&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;div class=&quot;card&quot;&gt;
			&lt;div class=&quot;card-content&quot;&gt;
				&lt;div class=&quot;card-logo d-gap-5&quot;&gt;&lt;img loading=&quot;lazy&quot; width=&quot;45&quot; height=&quot;45&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/access/5787cc5d01a0cad2664a4251c5a2a5c1.png&quot; alt=&quot;Janus Pro 7B - 新一代多模态AI模型 | DeepSeek&quot;&gt;&lt;a class=&quot;line1&quot; title=&quot;Janus Pro 7B - 新一代多模态AI模型 | DeepSeek&quot; href=&quot;https://janus-deepseek.com/zh&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Janus Pro 7B - 新一代多模态AI模型 | DeepSeek&lt;/a&gt;
				&lt;/div&gt;
				&lt;p class=&quot;line2&quot; title=&quot;DeepSeek开源的先进多模态模型，提供1B和7B两种参数版本，采用MIT开源许可证。&quot;&gt;DeepSeek开源的先进多模态模型，提供1B和7B两种参数版本，采用MIT开源许可证。&lt;/p&gt;
			&lt;/div&gt;
		&lt;/div&gt;&lt;/div&gt;
</content>
	</entry>
	
	<entry>
		<title>npm 常用方法问题记录</title>
		<link href="https://www.dtking.cn/blog/npm/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/npm/</id>
		<content type="html">&lt;ol&gt;
&lt;li&gt;初始化一个新的 &lt;code&gt;npm&lt;/code&gt; 包，创建 &lt;code&gt;package.json&lt;/code&gt; 文件。&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;package.json&lt;/code&gt; 文件中列出的所有依赖项。&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 或&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# 全局安装&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; 
&lt;span class=&quot;token comment&quot;&gt;# 或&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; i &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;安装指定 &lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt;&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;package-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;卸载指定 &lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt;&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; uninstall &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;package-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm&lt;/code&gt; 检查版本&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;配置阿里镜像地址&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; config &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; registry https://registry.npmmirror.com&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;临时修改注册库地址，仅影响该命令的执行，并且安装了一个特定的包mirror-config-china到全局环境中。&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; mirror-config-china &lt;span class=&quot;token parameter variable&quot;&gt;--registry&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://registry.npmmirror.com&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;清理缓存&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; cache clean &lt;span class=&quot;token parameter variable&quot;&gt;--force&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;更新&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; update &lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;重新打包 node-sass&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; rebuild node-sass&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;忽略证书验证&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; config &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; strict-ssl &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;查看完整日志&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--verbose&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;解决 SSL 问题&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;SET &lt;span class=&quot;token assign-left variable&quot;&gt;NODE_OPTIONS&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;--openssl-legacy-provider&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
	</entry>
	
	<entry>
		<title>Eleventy 布局链</title>
		<link href="https://www.dtking.cn/blog/layout-chaining/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/layout-chaining/</id>
		<content type="html">&lt;p&gt;您的布局也可以使用布局！将相同的 &lt;code&gt;layout&lt;/code&gt; &lt;code&gt;front matter&lt;/code&gt; 数据添加到布局模板文件中，它就会链接起来。您不必在布局和内容中使用相同的模板引擎，您可以混合搭配。&lt;/p&gt;
&lt;p&gt;要链接布局，让我们看一个示例：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;layout-chain-example.md&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-md&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mainlayout.njk
&lt;span class=&quot;token key atrule&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; My Rad Blog&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; My Rad Markdown Blog Post&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们希望在帖子内容周围添加一个主要元素，因为我们喜欢可访问性。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mainlayout.njk&lt;/code&gt; 如下所示：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_includes/mainlayout.njk&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-md&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-md&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;layout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mylayout.njk
&lt;span class=&quot;token key atrule&quot;&gt;myOtherData&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hello&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  {{ content | safe }}
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，该布局本身将包装在我们在前面的示例中使用的相同 &lt;code&gt;mylayout.njk &lt;/code&gt;中：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;_includes/mylayout.njk&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{title}}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		{{ content | safe }}
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一起使用，这将输出：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;输出&lt;/em&gt;  &lt;code&gt;_site/layout-chain-example/index.html&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;doctype&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;lang&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;en&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;viewport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;My Rad Blog&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;My Rad Markdown Blog Post&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout&quot;&gt;&lt;div class=&quot;elv-callout-c&quot;&gt;
&lt;p&gt;模板关联关系&lt;/p&gt;
&lt;p&gt;layout-chain-example.md &lt;code&gt;-&amp;gt;&lt;/code&gt; mainlayout.njk &lt;code&gt;-&amp;gt;&lt;/code&gt; mylayout.njk&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;guan1-yu2-xian4-you3-mu2-ban3-gong1-neng2-de-fu4-lu4&quot; tabindex=&quot;-1&quot;&gt;关于现有模板功能的附录 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/layout-chaining/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;值得注意的是，您仍然可以使用内置于不同模板语言中的现有模板重用机制。例如，Nunjucks 将其称为&lt;a href=&quot;https://mozilla.github.io/nunjucks/templating.html#template-inheritance&quot;&gt;模板继承&lt;/a&gt;并使用 &lt;code&gt;{% extends %}&lt;/code&gt; 进行公开。Eleventy 的布局系统存在于其之上，并公开了一个很好的多模板语言机制来配置内容前面的布局并在它们之间共享数据。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>grid 网格布局</title>
		<link href="https://www.dtking.cn/blog/grid/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/grid/</id>
		<content type="html">&lt;style&gt;
  .code-container{display:grid;grid-template-columns:5em 100px 30%;grid-template-rows:200px auto;gap:10px;height:300px}.code-container&gt;div{background-color:#c7ab1a}.code-column-span{grid-column:auto/span 2}.code-row-span{grid-row:auto/span 2}#page{display:grid;width:100%;height:250px;grid-template-areas:&quot;head head&quot; &quot;nav  main&quot; &quot;nav  foot&quot;;grid-template-rows:50px 1fr 30px;grid-template-columns:150px 1fr}#page&gt;header{grid-area:head;background-color:#8ca0ff}#page&gt;nav{grid-area:nav;background-color:#ffa08c}#page&gt;main{grid-area:main;background-color:#ffff64}#page&gt;footer{grid-area:foot;background-color:#8cffa0}
&lt;/style&gt;
&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;简单行和列布局 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;css &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;html &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;效果 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;内在尺寸关键词 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;fr 单位 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;minmax() 函数 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;repeat（）符号 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;auto-fill 和 auto-fit &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;元素排列方式 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;将元素放置在列中（默认行布局） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;跨越轨道（跨行跨列） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;填补空白 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;放置元素 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;堆叠元素 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;负行号 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;grid-template-areas 命名网格线 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;grid 属性 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;资源 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;&lt;a href=&quot;https://web.developers.google.cn/learn/css/grid#intrinsic_sizing_keywords&quot;&gt;原文地址&lt;/a&gt; 来源 &lt;strong&gt;Google web dev&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;jian3-dan1-hang2-he2-lie4-bu4-ju2&quot; tabindex=&quot;-1&quot;&gt;简单行和列布局 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;grid-template-columns&lt;/strong&gt;：列&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;grid-template-rows&lt;/strong&gt;：行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gap&lt;/strong&gt;：间距&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;css&quot; tabindex=&quot;-1&quot;&gt;css &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #dadce0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5em 100px 30%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;gap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;.container div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	 &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #f3f4f4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;html&quot; tabindex=&quot;-1&quot;&gt;html &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;code-container&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item1&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item2&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item3&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item4&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item5&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;item6&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;xiao4-guo3&quot; tabindex=&quot;-1&quot;&gt;效果 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-template-columns&lt;/code&gt;: &lt;code&gt;5em 100px 30%&lt;/code&gt;; 第一列 5em 第二列 100px 第三列 30%&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-template-rows&lt;/code&gt;: &lt;code&gt;200px auto&lt;/code&gt;; 第一行 200px 第二行 auto 自动&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gap&lt;/code&gt;: &lt;code&gt;10px&lt;/code&gt;; 间距：10px&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;谷歌浏览器 &lt;kbd&gt;F12&lt;/kbd&gt; 开发者工具中查看布局详情，&lt;a href=&quot;https://developer.chrome.google.cn/docs/devtools/css/grid?hl=zh-cn&quot;&gt;Chrome 开发者工具中的网格叠加层 &lt;/a&gt;可帮助您了解网格的各个部分。&lt;/p&gt;
&lt;div class=&quot;code-container&quot;&gt;
	&lt;div&gt;item1&lt;/div&gt;
	&lt;div&gt;item2&lt;/div&gt;
	&lt;div&gt;item3&lt;/div&gt;
	&lt;div&gt;item4&lt;/div&gt;
	&lt;div&gt;item5&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/h4eh5boXJQ-698.avif 698w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/h4eh5boXJQ-698.webp 698w&quot;&gt;&lt;img alt=&quot;布局详情&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/h4eh5boXJQ-698.png&quot; width=&quot;698&quot; height=&quot;363&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chrome DevTools 中突出显示的网格会显示行号、单元格和轨迹。&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;nei4-zai4-chi3-cun4-guan1-jian4-ci2&quot; tabindex=&quot;-1&quot;&gt;内在尺寸关键词 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;min-content&lt;/strong&gt;：简单来说就按所有单元格中&lt;strong&gt;最小内容宽度&lt;/strong&gt;来算，每个单元格占多少宽度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;max-content&lt;/strong&gt;：按所有单元格中&lt;strong&gt;最大内容宽度&lt;/strong&gt;来算，每个单元格占多少宽度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fit-content()&lt;/strong&gt;：将给定大小夹紧为&lt;strong&gt;可用大小&lt;/strong&gt;，和 &lt;code&gt;max-content&lt;/code&gt; 类似。区别 &lt;code&gt;max-content&lt;/code&gt;不会换行，&lt;code&gt;fit-content()&lt;/code&gt;会动态计算会换行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/min-content&quot;&gt;min-content&lt;/a&gt; 关键字将使轨道尽可能小，而轨道内容不会溢出。将示例网格布局更改为具有 &lt;code&gt;min-content&lt;/code&gt; 大小的三列轨道将意味着它们变得与轨道中最长的单词一样窄。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/max-content&quot;&gt;max-content&lt;/a&gt; 关键字具有相反的效果。轨道将变得足够宽，以便所有内容都可以显示在一个长而不间断的字符串中。这可能会导致溢出，因为字符串不会换行。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/fit-content_function&quot;&gt;fit-content()&lt;/a&gt; 函数最初的作用类似于 &lt;code&gt;max-content&lt;/code&gt;。但是，一旦轨道达到您传递给函数的大小，内容就会开始换行。因此，如果最大内容大小小于 10em，则 &lt;code&gt;fit-content(10em)&lt;/code&gt; 将创建小于 10em 的轨道，但绝不会大于 10em。&lt;/p&gt;
&lt;p&gt;在下一个演示中，通过更改网格轨道的大小来尝试不同的内在大小调整关键字。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/qBRqNgL?height=600&amp;theme-id=light&amp;default-tab=result&amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; title=&quot;Pen qBRqNgL by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;fr-dan1-wei4&quot; tabindex=&quot;-1&quot;&gt;fr 单位 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们有现有的长度尺寸、百分比以及这些新关键字。还有一种特殊的调整方法，仅适用于网格布局。这是 &lt;code&gt;fr&lt;/code&gt; 单位，一个灵活的长度，描述了网格容器中可用空间的份额。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fr&lt;/code&gt; 单元的工作方式与在 Flexbox 中使用 &lt;code&gt;flex: auto&lt;/code&gt; 类似。它在放置物品后分配空间。因此，要有三列，它们都获得相同的可用空间份额：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1fr 1fr 1fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于 fr 单位共享可用空间，因此它可以与固定大小的间隙或固定大小的轨道组合。要拥有一个具有固定大小元素的组件，并且第二个轨道占据剩余空间，您可以使用 grid-template-columns: 200px 1fr 作为轨道列表。&lt;/p&gt;
&lt;p&gt;使用不同的 fr 单位值将按比例共享空间。值越大，可用空间越多。在下面的演示中，更改第三个轨道的值。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/vYgyXNE?height=600&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen vYgyXNE by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;minmax-han2-shu4&quot; tabindex=&quot;-1&quot;&gt;minmax() 函数 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;此功能意味着您可以设置轨道的最小和最大尺寸。这可能非常有用。如果我们以上面的 &lt;code&gt;fr&lt;/code&gt; 单元为例，它分配剩余空间，则可以使用 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/minmax&quot;&gt;minmax()&lt;/a&gt; 将其写为 &lt;code&gt;minmax(auto, 1fr)&lt;/code&gt;。网格查看内容的固有大小，然后在为内容提供足够的空间后分配可用空间。这意味着您可能无法获得每个轨道均等地共享网格容器中所有可用空间的轨道。&lt;/p&gt;
&lt;p&gt;要强制轨道占用网格容器中减去间隙的相同空间，请使用 minmax。将 1fr 替换为 minmax(0, 1fr) 作为轨道大小。这使得轨道的最小大小为 0，而不是最小内容大小。然后，Grid 将获取容器中的所有可用尺寸，扣除任何间隙所需的尺寸，并根据您的 fr 单位共享其余部分&lt;/p&gt;
&lt;h2 id=&quot;repeat-fu2-hao4&quot; tabindex=&quot;-1&quot;&gt;repeat（）符号 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果您想创建一个具有相等列的 12 列轨道网格，您可以使用以下 CSS。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者，您可以使用repeat()将其写出来：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;12&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;repeat()&lt;/code&gt; 函数可用于重复曲目列表的任何部分。例如，您可以重复曲目模式。您还可以有一些常规曲目和重复部分。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1fr 2fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/*creates 6 tracks*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;autofill-he2-autofit&quot; tabindex=&quot;-1&quot;&gt;auto-fill 和 auto-fit &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自动填充和自动调整&lt;/p&gt;
&lt;p&gt;您可以结合您所学到的有关轨道大小、&lt;code&gt;minmax()&lt;/code&gt; 和 &lt;code&gt;repeat&lt;/code&gt; 的所有内容，以创建具有网格布局的有用模式。也许您不想指定列轨道的数量，而是希望创建适合容器的尽可能多的列轨道。&lt;/p&gt;
&lt;p&gt;您可以使用 &lt;code&gt;repeat()&lt;/code&gt; 和 &lt;code&gt;auto-fill&lt;/code&gt; 或 &lt;code&gt;auto-fit&lt;/code&gt; 关键字来实现此目的。在下面的演示中，网格将创建尽可能多的 200 像素轨道，以适合容器。在新窗口中&lt;a href=&quot;https://codepen.io/web-dot-dev/embed/XWpNjgO?height=500&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot;&gt;打开演示&lt;/a&gt;，看看当您更改视口大小时网格如何变化。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/XWpNjgO?height=500&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen XWpNjgO by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;在演示中，我们获得了尽可能多的曲目。然而，轨道并不灵活。您将在末端出现间隙，直到有足够的空间容纳另一个 200 像素轨道。如果添加 &lt;code&gt;minmax()&lt;/code&gt; 函数，您可以请求尽可能多的轨道，最小尺寸为 200 像素，最大尺寸为 1fr。然后网格布置 200 像素轨道，剩余空间均等分配给它们。&lt;/p&gt;
&lt;p&gt;这将创建一个二维响应式布局，无需任何媒体查询。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/OJWbRax?height=500&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen OJWbRax by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;code&gt;auto-fill&lt;/code&gt; 和 &lt;code&gt;auto-fit&lt;/code&gt; 之间存在细微差别。在下一个演示中，使用上面解释的语法来玩网格布局，但网格容器中只有两个网格项。使用 &lt;code&gt;auto-fill&lt;/code&gt; 关键字，您可以看到已创建空轨道。将关键字更改为 &lt;code&gt;auto-fit&lt;/code&gt;，轨道会折叠至 0 大小。这意味着柔性轨道现在会增长以占用空间。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/MWJbbNe?height=500&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen MWJbbNe by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;否则，&lt;code&gt;aufo-fill&lt;/code&gt; 和 &lt;code&gt;auto-fit&lt;/code&gt; 关键字的作用完全相同。一旦第一条轨道被填满，它们之间就没有区别了。&lt;/p&gt;
&lt;h2 id=&quot;yuan2-su4-pai2-lie4-fang1-shi4&quot; tabindex=&quot;-1&quot;&gt;元素排列方式 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;到目前为止，您已经在演示中看到了网格元素排列的工作原理。元素按照它们在布局中出现的顺序放置在网格上的每个单元格中。对于许多布局来说，这可能就是您所需要的。如果您需要更多控制，那么您可能需要做一些事情。第一个是调整 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/grid-auto-flow&quot;&gt;grid-auto-flow&lt;/a&gt; 布局。&lt;/p&gt;
&lt;h3 id=&quot;jiang1-yuan2-su4-fang4-zhi4-zai4-lie4-zhong1-mo4-ren4-xing2-bu4-ju2&quot; tabindex=&quot;-1&quot;&gt;将元素放置在列中（默认行布局） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;网格布局的默认行为是沿行放置元素。您可以使用 &lt;code&gt;grid-auto-flow: column&lt;/code&gt; 将元素放入列中。您需要定义行轨道，否则元素将创建内在的列轨道，并将所有内容布局在一长行中。&lt;/p&gt;
&lt;p&gt;这些值与文档的书写模式有关。行始终沿着文档或组件的书写模式中句子运行的方向运行。在下一个演示中，您可以更改模式 &lt;code&gt;grid-auto-flow&lt;/code&gt; 的值和 &lt;code&gt;writing-mode&lt;/code&gt; 属性。在下一个演示中，您可以更改模式 &lt;code&gt;grid-auto-flow&lt;/code&gt; 的值和 &lt;code&gt;writing-mode&lt;/code&gt; 属性。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/PoWbWbr?height=600&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen PoWbWbr by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;kua4-yue4-gui3-dao4-kua4-xing2-kua4-lie4&quot; tabindex=&quot;-1&quot;&gt;跨越轨道（跨行跨列） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;grid-column（跨行）&lt;/strong&gt;：&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/grid-column&quot;&gt;grid-column&lt;/a&gt; CSS 属性是 &lt;code&gt;grid-column-start&lt;/code&gt; 和 &lt;code&gt;grid-column-end&lt;/code&gt; 的简写属性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;grid-row（跨列）&lt;/strong&gt;：&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/grid-row&quot;&gt;grid-row&lt;/a&gt; 属性是一种 &lt;code&gt;grid-row-start&lt;/code&gt; 和 &lt;code&gt;grid-row-end&lt;/code&gt; 的缩写&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;您可以使自动放置的布局中的部分或全部元素跨越多个轨道。使用 &lt;code&gt;span&lt;/code&gt; 关键字加上要跨越的行数作为 &lt;code&gt;grid-column-end&lt;/code&gt; 或 &lt;code&gt;grid-row-end&lt;/code&gt; 的值。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; span 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 将跨越两条线，因此覆盖两条轨道 */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于您尚未指定 &lt;code&gt;grid-column-start&lt;/code&gt;，因此它使用 &lt;code&gt;auto&lt;/code&gt; 的初始值并根据自动放置规则进行放置。您还可以使用简写 &lt;code&gt;grid-column&lt;/code&gt; 来指定相同的内容：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto / span 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;code &lt;/b&gt;css&lt;/div&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.code-container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5em 100px 30%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 200px auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;gap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 300px
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.code-container&gt;div&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #c7ab1a
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.code-column-span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto / span 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.code-row-span&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token property&quot;&gt;grid-row&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto / span 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;code &lt;/b&gt;html&lt;/div&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;code-container&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;短&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;code-column-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;跨列&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;code-row-span&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;跨行&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;非常长长&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;非常长长长&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;非常长长长长&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;效果图 &lt;/b&gt;html&lt;/div&gt;
&lt;div class=&quot;code-container&quot;&gt;
	&lt;div&gt;短&lt;/div&gt;
	&lt;div class=&quot;code-column-span&quot;&gt;跨列&lt;/div&gt;
	&lt;div class=&quot;code-row-span&quot;&gt;跨行&lt;/div&gt;
	&lt;div&gt;非常长长&lt;/div&gt;
	&lt;div&gt;非常长长长&lt;/div&gt;
	&lt;div&gt;非常长长长长&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/oYf6ezdbNk-672.avif 672w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/oYf6ezdbNk-672.webp 672w&quot;&gt;&lt;img alt=&quot;跨行跨列&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/oYf6ezdbNk-672.png&quot; width=&quot;672&quot; height=&quot;350&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Chrome DevTools 中突出显示的网格会显示行号、单元格和轨迹。&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&quot;tian2-bu3-kong4-bai2&quot; tabindex=&quot;-1&quot;&gt;填补空白 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自动放置的布局（其中某些元素跨越多个轨道）可能会导致网格中包含一些未填充的单元格。具有完全自动放置布局的网格布局的默认行为是始终向前推进。这些元素将根据它们在源中的顺序或对 &lt;code&gt;order&lt;/code&gt; 属性进行的任何修改进行放置。如果没有足够的空间来容纳元素，网格将留下间隙并移动到下一个轨道。&lt;/p&gt;
&lt;p&gt;下一个演示展示了这种行为。该复选框将应用密集包装模式。这是通过为 &lt;code&gt;grid-auto-flow&lt;/code&gt; 指定 &lt;code&gt;dense&lt;/code&gt; 来实现的。有了这个值，网格将在布局中稍后获取项目并使用它们来填充间隙。这可能意味着显示与逻辑顺序断开。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/ZELBLrJ?height=600&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen ZELBLrJ by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;fang4-zhi4-yuan2-su4&quot; tabindex=&quot;-1&quot;&gt;放置元素 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;您已经拥有 CSS Grid 的许多功能。现在让我们看看如何在我们创建的网格上放置元素。&lt;/p&gt;
&lt;p&gt;首先要记住的是 CSS 网格布局基于编号行网格。将事物放置到网格上的最简单方法是将它们从一条线放置到另一条线。您将在本指南中发现放置物品的其他方法，但您始终可以访问这些编号的行。&lt;/p&gt;
&lt;p&gt;可用于按行号放置元素的属性有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-column-start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-column-end&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-row-start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-row-end&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们具有允许您同时设置开始行和结束行的简写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-column&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-row&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要放置元素，请设置应放置元素的网格区域的起始线和结束线。&lt;/p&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;code &lt;/b&gt;css&lt;/div&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;4&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 1fr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 200px 100px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column-start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 从第 1 列开始 */&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 结束于第 4 列 */&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-row-start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 2&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 从第 2 行开始 */&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-row-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 4&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 结束于第 4 行 */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.chrome.google.cn/docs/devtools/css/grid&quot;&gt;Chrome DevTools&lt;/a&gt; 可以为您提供线条的视觉指南，以便检查您的元素的放置位置。&lt;/p&gt;
&lt;p&gt;行编号遵循组件的书写模式和方向。在下一个演示中，更改书写模式或方向，以查看元素的位置如何与文本流动的方式保持一致。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/QWdGdzd?height=600&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen QWdGdzd by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;dui1-die2-yuan2-su4&quot; tabindex=&quot;-1&quot;&gt;堆叠元素 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用基于行的定位，您可以将元素放置到网格的同一单元格中。这意味着您可以堆叠元素，或使一项与另一项部分重叠。源中较晚出现的元素将显示在较早出现的元素之上。您可以使用 &lt;code&gt;z-index&lt;/code&gt; 更改此堆叠顺序，就像定位元素一样&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/BapQWQW?height=600&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen BapQWQW by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;fu4-hang2-hao4&quot; tabindex=&quot;-1&quot;&gt;负行号 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;当您使用 &lt;code&gt;grid-template-rows&lt;/code&gt; 和 &lt;code&gt;grid-template-colums&lt;/code&gt; 创建网格时，您将创建所谓的&lt;strong&gt;显式网格&lt;/strong&gt;。这是您已定义并指定轨道大小的网格。&lt;/p&gt;
&lt;p&gt;有时，您的元素会显示在该显式网格之外。例如，您可以定义列轨道，然后添加几行网格项，而无需定义行轨道。默认情况下，轨道将自动调整大小。您还可以使用 &lt;code&gt;grid-column-end&lt;/code&gt; 放置一个位于定义的显式网格之外的元素。在这两种情况下，网格都会创建轨道以使布局正常工作，这些轨迹被称为&lt;strong&gt;隐式网格&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;大多数时候，无论您使用隐式网格还是显式网格，都没有什么区别。然而，通过基于行的布局，您可能会遇到两者之间的主要区别。&lt;/p&gt;
&lt;p&gt;使用负行号，您可以从显式网格的末尾行放置元素。如果您希望元素从第一个列行跨越到最后一个列行，这会很有用。在这种情况下，您可以使用 &lt;code&gt;grid-column: 1 / -1&lt;/code&gt;。该元素将直接延伸穿过显式网格。&lt;/p&gt;
&lt;p&gt;然而，这仅适用于显式网格。采用三行自动放置项目的布局，您希望第一个项目跨越网格的结束线。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/rzjVqpCAHJ-666.avif 666w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/rzjVqpCAHJ-666.webp 666w&quot;&gt;&lt;img alt=&quot;带有8个同级网格项的侧边栏&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/rzjVqpCAHJ-666.svg&quot; width=&quot;666&quot; height=&quot;299&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;您可能认为您可以为该项目指定 &lt;code&gt;grid-row: 1 / -1&lt;/code&gt;。在下面的演示中您可以看到这不起作用。轨道是在隐式网格中创建的，使用 -1 无法到达网格的末尾。&lt;/p&gt;
&lt;iframe allow=&quot;camera; clipboard-read; clipboard-write; encrypted-media; geolocation; microphone; midi;&quot; loading=&quot;lazy&quot; src=&quot;https://codepen.io/web-dot-dev/embed/YzNpZeq?height=500&amp;amp;theme-id=light&amp;amp;default-tab=result&amp;amp;editable=true&quot; style=&quot;height: 600px; width: 100%; border: 0;&quot; data-title=&quot;Pen YzNpZeq by web-dot-dev on Codepen&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;调整隐式轨道的大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认情况下，在隐式网格中创建的轨道将自动调整大小。但是，如果要控制行的大小，请使用 &lt;code&gt;grid-auto-rows&lt;/code&gt; 属性，对于列使用 &lt;code&gt;grid-auto-columns&lt;/code&gt; 属性。&lt;/p&gt;
&lt;p&gt;要以最小大小 10em 和最大大小 auto 创建所有隐式行：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-auto-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;minmax&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;10em&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建具有 100 像素和 200 像素宽轨道图案的隐式列。在这种情况下，第一个隐式列将为 100px，第二个为 200px，第三个为 100px，依此类推。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-auto-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100px 200px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;gridtemplateareas-ming4-ming2-wang3-ge2-xian4&quot; tabindex=&quot;-1&quot;&gt;grid-template-areas 命名网格线 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果行具有名称而不是数字，则可以更轻松地将元素放入布局中。您可以通过在方括号之间添加您选择的名称来命名网格上的任何行。可以添加多个名称，并在同一括号内用空格分隔。一旦命名了线，就可以使用它们来代替数字。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      [main-start aside-start] 1fr
      [aside-end content-start] 2fr
      [content-end main-end]&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 两列布局 */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;.sidebar&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; aside-start / aside-end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* 放置在第 1 行和第 2 行之间*/&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token selector&quot;&gt;footer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid-column&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; main-start / main-end&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;/* 位于第 1 行到第 3 行布局的右侧 */&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;code &lt;/b&gt;HTML&lt;/div&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token doctype&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;token doctype-tag&quot;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;token name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;utf-8&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;网格布局&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token style&quot;&gt;&lt;span class=&quot;token language-css&quot;&gt;
			&lt;span class=&quot;token selector&quot;&gt;#page&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 1.设置 display 为 grid */&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 250px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-template-areas&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
			    &lt;span class=&quot;token string&quot;&gt;&quot;head head&quot;&lt;/span&gt;
			    &lt;span class=&quot;token string&quot;&gt;&quot;nav  main&quot;&lt;/span&gt;
			    &lt;span class=&quot;token string&quot;&gt;&quot;nav  foot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 2.区域划分 当前为 三行 两列 */&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 50px 1fr 30px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 3.各区域 宽高设置 */&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-template-columns&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 150px 1fr&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			
			&lt;span class=&quot;token selector&quot;&gt;#page &gt; header&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; head&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* 4. 指定当前元素所在的区域位置，从 grid-template-areas 选取值 */&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #8ca0ff&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			
			&lt;span class=&quot;token selector&quot;&gt;#page &gt; nav&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nav&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffa08c&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			
			&lt;span class=&quot;token selector&quot;&gt;#page &gt; main&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; main&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #ffff64&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
			
			&lt;span class=&quot;token selector&quot;&gt;#page &gt; footer&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;grid-area&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; foot&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			  &lt;span class=&quot;token property&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; #8cffa0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

		&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;section&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;page&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Header&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;header&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Navigation&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;nav&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Main area&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Footer&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;footer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
		&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;section&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
	&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;&lt;/p&gt;
&lt;section id=&quot;page&quot;&gt;
  &lt;header&gt;Header&lt;/header&gt;
  &lt;nav&gt;Navigation&lt;/nav&gt;
  &lt;main&gt;Main area&lt;/main&gt;
  &lt;footer&gt;Footer&lt;/footer&gt;
&lt;/section&gt;
&lt;h2 id=&quot;grid-shu3-xing4&quot; tabindex=&quot;-1&quot;&gt;grid 属性 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;网格简写的使用方式与网格模板简写的使用方式完全相同。当以这种方式使用时，它将重置其接受的其他网格属性为其初始值。全套有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grid-template-rows&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-template-columns&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-template-areas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-auto-rows&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-auto-columns&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grid-auto-flow&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;您也可以使用此简写来定义隐式网格的行为方式，例如：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.container&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; grid&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;grid&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;repeat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 80px&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; / auto-flow  120px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;zi1-yuan2&quot; tabindex=&quot;-1&quot;&gt;资源 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本指南概述了网格布局规范的不同部分。要了解更多信息，请查看以下资源。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Web/CSS/CSS_Grid_Layout&quot;&gt;MDN CSS 网格布局&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/complete-guide-grid/&quot;&gt;网格完整指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2020/01/understanding-css-grid-container/&quot;&gt;创建网格容器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.google.cn/docs/devtools/css/grid&quot;&gt;在Chrome DevTools中检查CSS网格&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gridbyexample.com/&quot;&gt;网格学习材料的综合集合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>asar Electron 文件归档格式解压</title>
		<link href="https://www.dtking.cn/blog/asar/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/asar/</id>
		<content type="html">&lt;p&gt;&lt;code&gt;asar&lt;/code&gt; 是一种为Electron应用程序设计的文件归档格式，它将多个文件合并成一个文件，以减少应用程序在磁盘上的文件数量，并且可以加快文件的读取速度。以下是在不同操作系统下解压 &lt;code&gt;.asar&lt;/code&gt; 文件的方法：&lt;/p&gt;
&lt;h3 id=&quot;zai4-windows-xia4-jie3-ya1-asar-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;在Windows下解压asar文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/asar/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装Node.js和npm。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开命令提示符（cmd）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用npm安装asar工具：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; asar&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用asar解压文件：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;asar extract app.asar destination_folder&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;app.asar&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是你要解压的文件，&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;destination_folder&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是解压后的文件存放的目录。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;zai4-macos-xia4-jie3-ya1-asar-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;在macOS下解压asar文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/asar/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开终端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装asar工具，如果还没有安装的话：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; asar&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用asar解压文件：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;asar extract app.asar destination_folder&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;zai4-linux-xia4-jie3-ya1-asar-wen2-jian4&quot; tabindex=&quot;-1&quot;&gt;在Linux下解压asar文件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/asar/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开终端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装asar工具：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; asar&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用asar解压文件：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;asar extract app.asar destination_folder&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在所有操作中，请确保你有足够的权限来安装全局npm包和写入指定的目标文件夹。&lt;/p&gt;
&lt;p&gt;如果你不想全局安装asar，你也可以在项目目录中本地安装asar，然后使用&lt;code&gt;npx&lt;/code&gt;来运行它：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; asar
npx asar extract app.asar destination_folder&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请根据你的实际情况替换 &lt;code&gt;app.asar&lt;/code&gt; 和 &lt;code&gt;destination_folder&lt;/code&gt; 为你的 &lt;code&gt;.asar&lt;/code&gt; 文件路径和解压目标路径。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>重置 CSS 样式</title>
		<link href="https://www.dtking.cn/blog/a-more-modern-css-reset/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/a-more-modern-css-reset/</id>
		<content type="html">&lt;p&gt;原文地址: &lt;a href=&quot;https://piccalil.li/blog/a-more-modern-css-reset/&quot;&gt;A (more) Modern CSS Reset&lt;/a&gt; 来自 &lt;a href=&quot;https://piccalil.li/author/andy-bell&quot;&gt;Andy Bell&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我大约 4 年前写了“现代 &lt;code&gt;CSS&lt;/code&gt; 重置”，是的，它并没有过时。几天前我发现它再次被链接起来，并认为发布更新版本可能是个好主意。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我知道我在开源维护方面也有糟糕的记录，所以我想我应该&lt;a href=&quot;https://github.com/Andy-set-studio/modern-css-reset&quot;&gt;存档&lt;/a&gt;原始内容并发布此内容。用它做你想做的事！&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;需要明确的是，这是一个对我个人和 &lt;a href=&quot;https://set.studio/&quot;&gt;Set Studio&lt;/a&gt; 都有效的重置。每当我提到“我们”时，我指的就是那些人。&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;zheng3-ti3-zhong4-zhi4&quot; tabindex=&quot;-1&quot;&gt;整体重置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/a-more-modern-css-reset/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 盒子尺寸规则 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;*,
*::before,
*::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 防止字体大小膨胀 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 删除默认边距，以便更好地控制编写的 CSS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body, h1, h2, h3, h4, p,
figure, blockquote, dl, dd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-block-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 删除具有列表角色的ul，ol元素上的列表样式，这表明默认样式将被删除 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;ul[role=&#39;list&#39;],
ol[role=&#39;list&#39;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 设置 body 默认值 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 在标题和交互元素上设置较短的行高 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1, h2, h3, h4,
button, input, label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 平衡标题上的文本换行 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1, h2,
h3, h4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-wrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; balance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 没有类的元素将获得默认样式 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;a:not([class])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-decoration-skip-ink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; currentColor&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 使图像更易于使用 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;img,
picture&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100%&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; block&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 继承输入和按钮的字体 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;input, button,
textarea, select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 确保没有行属性的文本区域不是很小 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;textarea:not([rows])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10em&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;/* 任何被锚定的东西都应该有额外的滚动边距 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;:target&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-margin-block&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5ex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fen1-jie3&quot; tabindex=&quot;-1&quot;&gt;分解 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/a-more-modern-css-reset/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;按照传统，我们来分解一下：&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 盒子尺寸规则 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;*,
*::before,
*::after&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;box-sizing&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; border-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这条规则非常容易理解，但简而言之，我将所有元素和伪元素设置为使用 &lt;code&gt;border-box&lt;/code&gt;， &lt;a href=&quot;https://web.dev/learn/css/box-model/&quot;&gt;而不是默认的大小 &lt;code&gt;content-box&lt;/code&gt;&lt;/a&gt;。现在我们更专注于让 浏览器 通过 &lt;a href=&quot;https://utopia.fyi/&quot;&gt;流体类型和空间&lt;/a&gt; 的 &lt;a href=&quot;https://every-layout.dev/&quot;&gt;灵活布局&lt;/a&gt;&lt;a href=&quot;https://buildexcellentwebsit.es/&quot;&gt;做更多工作，这条规则不再像以前那么有用了。但是，项目没有明确的大小&lt;/a&gt;&lt;a href=&quot;https://web.dev/learn/css/box-model/&quot;&gt; 设置&lt;/a&gt;的情况很少见，因此它仍然在重置中占有一席之地。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 防止字体大小膨胀 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-moz-text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-size-adjust&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://kilianvalkhof.com/2022/css-html/your-css-reset-needs-text-size-adjust-probably/&quot;&gt;对此最好的解释是 Kilian&lt;/a&gt;。 他还解释了为什么我们仍然需要那些丑陋的前缀。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 删除默认边距，以便更好地控制编写的 CSS */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body, h1, h2, h3, h4, p,
figure, blockquote, dl, dd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;margin-block-end&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 0&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我总是倾向于删除用户代理样式的边距，以便 &lt;a href=&quot;https://andy-bell.co.uk/my-favourite-3-lines-of-css/&quot;&gt;在更宏观的层面上定义流程和空间&lt;/a&gt;。借助逻辑属性，我现在删除了末端边距，而不是旧重置中的所有边距。它在生产中似乎效果很好。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 删除具有列表角色的 ul、ol 元素上的列表样式，这表明将删除默认样式 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;ul[role=&#39;list&#39;],
ol[role=&#39;list&#39;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;list-style&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=170179&quot;&gt;Safari 做了一些疯狂的事情，其中&lt;/a&gt;包括 ：如果你删除列表样式，他们就会删除 VoiceOver 的语义。有些人会说这是一个功能，有些人会说这是一个错误。我认为这很愚蠢，但为了确保添加 &lt;code&gt;role&lt;/code&gt; ，我默认删除了列表样式作为小小奖励。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 设置核心 body 默认值 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 100vh&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我喜欢继承清晰易读的行高。 &lt;code&gt;100vh&lt;/code&gt; 在正文中设置最小高度也非常方便，特别是当你要设置装饰元素时。使用像这样的新单位可能很诱人 &lt;code&gt;dvh&lt;/code&gt;，但如果你 &lt;a href=&quot;https://ishadeed.com/article/new-viewport-units/#:~:text=Be%20careful%20with%20the%20dvh,is%20scrolling%20up%20or%20down.&quot;&gt;像 Ahmad 一样深入研究&lt;/a&gt;，你会发现这会导致更多问题而不是解决方案，而这并不是你希望重置的结果！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mastodon.social/@simevidas/111088262361593466&quot;&gt;该 &lt;code&gt;svh&lt;/code&gt; 单位似乎比 &lt;code&gt;dvh&lt;/code&gt; 更好 &lt;/a&gt;，但我对 &lt;code&gt;vh&lt;/code&gt; 很满意。在深入研究新单位之前，请务必确保您了解它们，或者将它们推荐为福音是我的建议。如果某些东西已经适合您，则无需更改它！&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 在标题和交互元素上设置较短的行高 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1, h2, h3, h4,
button, input, label&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;line-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1.1&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就像 &lt;code&gt;line-height&lt;/code&gt; 全局使用大写字母很方便一样，标题和按钮等使用较短的字母也同样方便。 &lt;code&gt;line-height&lt;/code&gt; 但是，如果您的字体有较大的上升部和下降部，则绝对值得删除或修改此规则。您最不希望看到的是它们相互冲突并造成可访问性问题。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 平衡标题文本换行 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;h1, h2,
h3, h4&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-wrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; balance&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这条规则对于我们的项目来说相当特殊，但这个较新的 &lt;code&gt;text-wrap&lt;/code&gt; 属性让标题看起来很漂亮。我想有些人会觉得这不合适，所以你可能想删除它。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 没有类的元素获得默认样式 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;a:not([class])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-decoration-skip-ink&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; currentColor&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此规则首先确保文本装饰不会干扰上升部和下降部。我认为这现在在浏览器中大多是默认设置，但设置它也是很好的保险策略。我们喜欢 在&lt;a href=&quot;https://set.studio/&quot;&gt;工作室&lt;/a&gt;&lt;code&gt;currentColor&lt;/code&gt; 默认设置链接以继承文本 ，但如果没有，您可能希望将其删除。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 继承输入和按钮的字体 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;input,
button,
textarea,
select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;font-size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; inherit&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时让表单元素和按钮继承一些字体属性很有用。它主要会影响 &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; 元素，但将其应用于其他表单元素也没有什么坏处，因为它可以在项目后期节省一些 CSS。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 确保没有 rows 属性的文本区域不是很小 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;textarea:not([rows])&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;min-height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 10em
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说到 &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; 元素，这条规则很方便。默认情况下，如果不添加属性 &lt;code&gt;rows&lt;/code&gt; ，它们可能非常小。这对于手指等粗指针来说并不理想，而且通过代理， &lt;code&gt;&amp;lt;textarea&amp;gt;&lt;/code&gt; 元素往往用于多行文本。让这更容易一些是有意义的。&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;/* 任何已锚定的内容都应该有额外的滚动边距 */&lt;/span&gt;
&lt;span class=&quot;token selector&quot;&gt;:target&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;scroll-margin-block&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 5ex&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，如果某个元素是锚定的，则有必要用 在其上方添加一些空间 &lt;code&gt;scroll-margin&lt;/code&gt;，但只有当该元素是目标元素时才会考虑这一点。 小小的调整可以带来很多用户体验！ 不过，如果您有一个固定标题，您可能需要调整这一点。&lt;/p&gt;
&lt;h2 id=&quot;zong3-jie2&quot; tabindex=&quot;-1&quot;&gt;总结 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/a-more-modern-css-reset/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这次重置会持续 4 年吗？也许吧！ &lt;a href=&quot;https://andy-bell.co.uk/a-modern-css-reset/&quot;&gt;另一次&lt;/a&gt;重置 肯定没有造成问题。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://set.studio/&quot;&gt;无论如何，它作为在工作室&lt;/a&gt;启动项目的基础非常有用 。我们不会回头并追溯更新客户项目上的其他重置，因为那个重置工作得非常好。&lt;/p&gt;
&lt;p&gt;重置是人们最关心的事情之一，但实际上，现在的浏览器已经如此优秀，你可能根本不需要重置。我的建议是从网上找到的重置中挑选出你喜欢的部分，然后创建适合 &lt;strong&gt;你和你团队的重置&lt;/strong&gt;。&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Nunjucks 语言模版使用方法</title>
		<link href="https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;一、{% %}： &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;二、{}： &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;三、{% raw %} 和 {% endraw %} &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;四、{%- 和 -%} &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;在 Nunjucks 模板语言中，&lt;code&gt;{% %}&lt;/code&gt; 和 &lt;code&gt;{{ }}&lt;/code&gt; 有着不同的用途，选择使用哪个取决于你想要在模板中实现的功能。&lt;/p&gt;
&lt;h2 id=&quot;yi1&quot; tabindex=&quot;-1&quot;&gt;一、{% %}： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用于表示控制结构，如循环、条件判断、宏定义等。这些结构通常不会直接输出到页面上，而是在模板渲染时被解析和执行。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;循环&lt;/strong&gt;：用于遍历数组或集合中的每个项目。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;items&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;条件判断&lt;/strong&gt;：用于根据条件渲染不同的内容。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;condition&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token test function&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token test function&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endif&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;宏定义&lt;/strong&gt;：用于定义可重用的模板片段。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;macro&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;render_user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endmacro&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;&lt;strong&gt;赋值&lt;/strong&gt;：用于在模板中创建变量。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;John Doe&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;&lt;strong&gt;包含&lt;/strong&gt;：用于包含其他模板文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;footer.html&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;&lt;strong&gt;继承&lt;/strong&gt;：用于创建一个基础模板，其他模板可以从中继承。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;base.html&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;&lt;strong&gt;块&lt;/strong&gt;：用于在继承的模板中定义可以被子模板覆盖的内容区域。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;block&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;This&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token test function&quot;&gt;the&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endblock&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 Eleventy 项目中，如果你想要在 Markdown 文件中使用 Nunjucks 的 &lt;code&gt;{% %}&lt;/code&gt; 表达式，你需要确保 Markdown 文件被正确地配置为 Nunjucks 模板。通常，这意味着你的 Markdown 文件的扩展名应该是 &lt;code&gt;.md&lt;/code&gt;，并且 Eleventy 配置文件应该设置 Nunjucks 作为默认模板语言。&lt;br&gt;
然后，你可以在 Markdown 文件中直接使用 &lt;code&gt;{% %}&lt;/code&gt; 表达式，例如：&lt;/p&gt;
&lt;pre class=&quot;language-markdown&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;&lt;span class=&quot;token front-matter-block&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token front-matter yaml language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; My Blog Post&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token title important&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;#&lt;/span&gt; {% raw %}{{ title }}{% endraw %}&lt;/span&gt;
{% for post in collections.posts %}
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ post.data.title }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ post.templateContent }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;article&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
{% endfor %}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这个例子中，&lt;code&gt;{% for post in collections.posts %}&lt;/code&gt; 和 &lt;code&gt;{% endfor %}&lt;/code&gt; 是 Nunjucks 的循环控制结构，它们会在 Eleventy 渲染模板时被处理。&lt;/p&gt;
&lt;h2 id=&quot;er4&quot; tabindex=&quot;-1&quot;&gt;二、{}： &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用于输出表达式的结果到模板中。这通常用于输出变量、对象的属性、数组的元素等。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输出变量&lt;/strong&gt;：用于输出变量的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello, {{ username }}!&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;访问对象属性&lt;/strong&gt;：用于输出对象属性的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;User&#39;s name is {{ user.name }}.&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;访问数组元素&lt;/strong&gt;：用于输出数组中特定元素的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;{{ items[0] }}&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;san1-raw-he2-endraw&quot; tabindex=&quot;-1&quot;&gt;三、&lt;code&gt;{% raw %}&lt;/code&gt; 和 &lt;code&gt;{% endraw %}&lt;/code&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用于阻止模板引擎解析标签内的内容。当你需要在模板中输出 Nunjucks 语法本身，而不是让 Nunjucks 解析这些语法时，你会使用这个标签。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输出 Nunjucks 代码示例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;language-nunjucks&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-nunjucks&quot;&gt;&lt;span class=&quot;token delimiter punctuation&quot;&gt;{%&lt;/span&gt; &lt;span class=&quot;token tag keyword&quot;&gt;raw&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;items&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endfor&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endraw&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;si4-he2&quot; tabindex=&quot;-1&quot;&gt;四、&lt;code&gt;{%-&lt;/code&gt; 和 &lt;code&gt;-%}&lt;/code&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;{%-&lt;/code&gt; 和 &lt;code&gt;-%}&lt;/code&gt; 语法用于消除标签周围的空白。这些特殊符号告诉 Nunjucks 去除标签前后的空白字符，包括空格、制表符和换行符。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{%-&lt;/code&gt;：在标签开始处不输出任何空白。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-%}&lt;/code&gt;：在标签结束处不输出任何空白。&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>Nunjucks 自定义表达式</title>
		<link href="https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;TOC 目录 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;提示 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;NJK原样输出 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;图片输出 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;YAML 配置 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;toc-mu4-lu4&quot; tabindex=&quot;-1&quot;&gt;TOC 目录 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;tableofcontents&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;open&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;ti2-shi4&quot; tabindex=&quot;-1&quot;&gt;提示 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;callout&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warn&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 警告 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endcallout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-warn&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;警告&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 警告 &lt;/div&gt;&lt;/div&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;callout&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 错误 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endcallout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-error&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;错误&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 错误 &lt;/div&gt;&lt;/div&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;callout&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;info&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 提示 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endcallout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout elv-callout-info&quot;&gt;&lt;div class=&quot;elv-callout-label&quot;&gt;提示&lt;/div&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 提示 &lt;/div&gt;&lt;/div&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;callout&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;info&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 提示 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endcallout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;elv-callout&quot;&gt;&lt;div class=&quot;elv-callout-c&quot;&gt; 默认 &lt;/div&gt;&lt;/div&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;callout&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 默认 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endcallout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;njk-yuan2-yang4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;NJK原样输出 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;raw&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 要填写的表达式 &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;endraw&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tu2-pian4-shu1-chu1&quot; tabindex=&quot;-1&quot;&gt;图片输出 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/QNHSWbezBM-262.avif 262w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/QNHSWbezBM-262.webp 262w&quot;&gt;&lt;img alt=&quot;HOT&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/QNHSWbezBM-262.gif&quot; width=&quot;262&quot; height=&quot;354&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre class=&quot;language-njk&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-njk&quot;&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;image&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;../../public/img/fire.gif&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;HOT&quot;&lt;/span&gt;  &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;yaml-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;YAML 配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class=&quot;language-yaml&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 排除加入收藏&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;eleventyExcludeFromCollections&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
	
	<entry>
		<title>Javascript/DOM：如何删除 DOM 对象的所有事件侦听器</title>
		<link href="https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;一、重写 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;二、代码注入 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;三、实战 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;yi1-zhong4-xie3&quot; tabindex=&quot;-1&quot;&gt;一、重写 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;重写 &lt;code&gt;EventTarget&lt;/code&gt; 添加监听事件方法 &lt;code&gt;addEventListener&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-javascript&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;EventTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;original_addEventListener &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;EventTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;original_addEventListener &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EventTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;addEventListener_hook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; opt&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;--- add event listener&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nodeName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all_handlers &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all_handlers &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all_handlers&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;opt&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;original_addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; opt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token class-name&quot;&gt;EventTarget&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prototype&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; addEventListener_hook&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;er4-dai4-ma3-zhu4-ru4&quot; tabindex=&quot;-1&quot;&gt;二、代码注入 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;您应该将此代码插入到主网页顶部附近（例如&lt;code&gt;index.html&lt;/code&gt;）。在清理期间，您可以循环遍历 &lt;code&gt;all_handlers&lt;/code&gt;，并为每个处理程序调用&lt;code&gt;removeEventHandler&lt;/code&gt;。不必担心使用同一函数多次调用 &lt;code&gt;removeEventHandler&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cleanup&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;elem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; elem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;on&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; elem&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        elem&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cleanup removed listener from &#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nodeName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; t &lt;span class=&quot;token keyword&quot;&gt;of&lt;/span&gt; elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;all_handlers &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;removeEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;opt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
        console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;cleanup removed listener from &#39;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;elem&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nodeName&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;typ&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**注意：**对于 IE，请使用 Element 而不是 EventTarget，并将 =&amp;gt; 更改为 function 以及其他各种内容。&lt;/p&gt;
&lt;h2 id=&quot;san1-shi2-zhan4&quot; tabindex=&quot;-1&quot;&gt;三、实战 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;举一反三&lt;/strong&gt;，该操作可移除监听复制事件，&lt;code&gt;Ctrl+C&lt;/code&gt; 等等事件。删除原有事件，你可以复用现有功能按钮添加自定义事件处理。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/Z6rMx1YUnc-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/Z6rMx1YUnc-1920.webp 1920w&quot;&gt;&lt;img alt=&quot;演示1&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/Z6rMx1YUnc-1920.png&quot; width=&quot;1920&quot; height=&quot;924&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/qto4qAzj2A-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/qto4qAzj2A-1920.webp 1920w&quot;&gt;&lt;img alt=&quot;演示2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/qto4qAzj2A-1920.png&quot; width=&quot;1920&quot; height=&quot;375&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/e05IlIMwAy-1920.avif 1920w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/e05IlIMwAy-1920.webp 1920w&quot;&gt;&lt;img alt=&quot;演示3&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/e05IlIMwAy-1920.png&quot; width=&quot;1920&quot; height=&quot;769&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/4386300/javascript-dom-how-to-remove-all-event-listeners-of-a-dom-object&quot;&gt;原文地址&lt;/a&gt;&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Eleventy-术语</title>
		<link href="https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Eleventy 特定术语 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Template 模板 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Layout 布局 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Data 数据 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Data Cascade 数据级联 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Filter 过滤器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Shortcode 短码 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Collection 收集 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Pagination 分页 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Plugin 插件 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Eleventy Edge 边缘 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Eleventy Serverless 无服务器 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;行业术语和流行语 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Static Sites 静态站点 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Jamstack &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Progressive Enhancement 渐进增强 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Data-Driven 数据驱动 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Serverless Friendly 无服务器友好 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Lean Web 精益 web &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Zero Config 零配置 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Convention over Configuration Routing 约定大于配置路由 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Pre-rendered Templates by Default 默认预渲染模板 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Hydration-less 注水 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;应用程序而不是应用程序服务器 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;单页应用程序 (SPA) 与多页应用程序 (MPA) &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;p&gt;此页面提供了两个术语列表 - 一个是 &lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Eleventy 特定的术语&lt;/a&gt;，在使用 Eleventy 构建项目时可能有用，另一个是&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;行业术语&lt;/a&gt;，可能有助于理解上下文。&lt;/p&gt;
&lt;h2 id=&quot;eleventy-te4-ding4-shu4-yu3&quot; tabindex=&quot;-1&quot;&gt;Eleventy 特定术语 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;template-mu2-ban3&quot; tabindex=&quot;-1&quot;&gt;Template 模板 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;以 &lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot;&gt;Markdown、HTML、Liquid、Nunjucks&lt;/a&gt; 等格式编写的内容文件，Eleventy 将其转换为构建站点中的一个或多个页面。模板可以使用模板语法访问通过&lt;a href=&quot;https://www.11ty.dev/docs/glossary/#data-cascade&quot;&gt;数据级联&lt;/a&gt;公开的数据。&lt;/p&gt;
&lt;h3 id=&quot;layout-bu4-ju2&quot; tabindex=&quot;-1&quot;&gt;Layout 布局 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这是一种模板，它围绕另一个模板，通常为了提供内容放置的脚手架标记。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/layouts/&quot;&gt;阅读有关使用布局的更多信息。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;data-shu4-ju4&quot; tabindex=&quot;-1&quot;&gt;Data 数据 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过变量暴露，这些变量可以在模板和布局中使用模板语法。给定模板的数据通过一个称为数据级联的过程进行聚合。&lt;/p&gt;
&lt;h3 id=&quot;data-cascade-shu4-ju4-ji2-lian2&quot; tabindex=&quot;-1&quot;&gt;Data Cascade 数据级联 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Eleventy 对于评估任何给定模板的所有数据的操作顺序，以及解决出现的冲突。数据级联遵循 colocation 原则，所以广泛定义以应用于许多模板的数据将被更具体针对给定模板的数据覆盖。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/data-cascade/&quot;&gt;阅读更多关于数据级联的信息。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;filter-guo4-l4-qi4&quot; tabindex=&quot;-1&quot;&gt;Filter 过滤器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一个可以在模板语法内部使用的函数，用于将数据转换成更易于展示的格式。过滤器通常被设计为可链式调用，即一个过滤器的返回值会传递给下一个过滤器。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/filters/&quot;&gt;阅读更多关于过滤器&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;shortcode-duan3-ma3&quot; tabindex=&quot;-1&quot;&gt;Shortcode 短码 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一个可以在模板语法内部使用的函数，用于将内容注入模板中。短码可以接受多个参数，并且可以被认为是一种用于可重用标记的模板化方法。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/shortcodes/&quot;&gt;阅读更多关于短码。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;collection-shou1-ji2&quot; tabindex=&quot;-1&quot;&gt;Collection 收集 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一个模板数组，用于对相似内容进行分组。可以通过使用标签或调用 Eleventy 配置中的集合 API 来创建集合。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/collections/&quot;&gt;阅读更多关于收集.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;pagination-fen1-ye4&quot; tabindex=&quot;-1&quot;&gt;Pagination 分页 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/pagination/&quot;&gt;阅读更多关于分页内容&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一种通过遍历数据来创建页面的方法。相同的模板被应用于分页数据的每个部分。&lt;/p&gt;
&lt;h3 id=&quot;plugin-cha1-jian4&quot; tabindex=&quot;-1&quot;&gt;Plugin 插件 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;一个可移植的，可安装的Eleventy配置，可以添加&lt;a href=&quot;https://www.11ty.dev/docs/glossary/#data&quot;&gt;数据&lt;/a&gt;，&lt;a href=&quot;https://www.11ty.dev/docs/glossary/#filter&quot;&gt;过滤器&lt;/a&gt;，&lt;a href=&quot;https://www.11ty.dev/docs/glossary/#shortcode&quot;&gt;简码&lt;/a&gt;，和更多的项目的设置。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/plugins/&quot;&gt;阅读更多关于Plugins的信息。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;eleventy-edge-bian1-yuan2&quot; tabindex=&quot;-1&quot;&gt;Eleventy Edge 边缘 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;选择 Eleventy 的短代码，其中动态功能可以与构建生成的或无服务器模板相结合。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/plugins/edge/&quot;&gt;了解有关 Eleventy Edge 的更多信息。&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;eleventy-serverless-wu2-fu2-wu4-qi4&quot; tabindex=&quot;-1&quot;&gt;Eleventy Serverless 无服务器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Eleventy 的一种选择加入构建模式，其中指定的页面是在用户请求时构建的，而不是在构建步骤期间提前构建的。或者，内容交付网络可以缓存根据请求构建的页面，以供将来访问该页面时使用。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.11ty.dev/docs/plugins/serverless/&quot;&gt;了解有关 Eleventy Serverless 的更多信息。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;hang2-ye4-shu4-yu3-he2-liu2-xing2-yu3&quot; tabindex=&quot;-1&quot;&gt;行业术语和流行语 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;沐浴在这种“&lt;em&gt;没有人因为购买 IBM 而被解雇&lt;/em&gt;”风格的，令人感觉良好的行业术语的温暖光芒中。&lt;/p&gt;
&lt;p&gt;我们的行业特别擅长为已经存在的事物创造新词汇。希望这个页面能帮助你在迷宫中导航。&lt;/p&gt;
&lt;h3 id=&quot;static-sites-jing4-tai4-zhan4-dian3&quot; tabindex=&quot;-1&quot;&gt;Static Sites 静态站点 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;静态站点是一组生成的 HTML 文件。内容内置于 HTML 文件中，而不是使用动态后端语言即时生成内容。当您添加缓存规则以使内容更具粘性时，动态站点可能会显示为静态。当您快速且频繁地运行构建时，静态站点可能会显得动态。&lt;/p&gt;
&lt;h3 id=&quot;jamstack&quot; tabindex=&quot;-1&quot;&gt;Jamstack &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;基于客户端 JavaScript、可重用 API 和预构建标记的现代 Web 开发架构。 —&lt;a href=&quot;https://jamstack.org/&quot;&gt;jamstack.org&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eleventy 为 Jamstack 站点提供了便利，但您仍可以完全控制 JavaScript。&lt;/p&gt;
&lt;h3 id=&quot;progressive-enhancement-jian4-jin4-zeng1-qiang2&quot; tabindex=&quot;-1&quot;&gt;Progressive Enhancement 渐进增强 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;内容应该是网站发展的首要任务的想法。换句话说，从适用于尽可能多的用户的基本内容和功能开始，然后逐步增强。&lt;/p&gt;
&lt;p&gt;正如 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement&quot;&gt;MDN Web&lt;/a&gt; 文档中所述：“应特别注意可访问性。应尽可能提供可接受的替代方案。”&lt;/p&gt;
&lt;h3 id=&quot;datadriven-shu4-ju4-qu1-dong4&quot; tabindex=&quot;-1&quot;&gt;Data-Driven 数据驱动 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;让组件和标记数据驱动，这样您的项目中就不会出现一堆一次性复制粘贴的 HTML 实例。&lt;/p&gt;
&lt;h3 id=&quot;serverless-friendly-wu2-fu2-wu4-qi4-you3-hao3&quot; tabindex=&quot;-1&quot;&gt;Serverless Friendly 无服务器友好 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;“你可以利用前端技能来做通常只有后端才能做的事情。您可以编写一个 JavaScript 函数，运行该函数并通过点击 URL 来接收响应。”—— &lt;a href=&quot;https://twitter.com/chriscoyier&quot;&gt;Chris Coyier&lt;/a&gt;的&lt;a href=&quot;https://serverless.css-tricks.com/&quot;&gt;《无服务器的力量》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;请注意确保 &lt;code&gt;无服务器（serverless）&lt;/code&gt; 功能 &lt;code&gt;逐步增强（progressively enhanced）&lt;/code&gt;。如果您在客户端 JavaScript 中调用无服务器函数，则它们应该用于站点核心功能之外的功能。使用 &lt;a href=&quot;https://www.11ty.dev/docs/plugins/serverless/&quot;&gt;Eleventy Serverless&lt;/a&gt; 根据请求生成页面，无需任何客户端 JavaScript。&lt;/p&gt;
&lt;h3 id=&quot;lean-web-jing1-yi4-web&quot; tabindex=&quot;-1&quot;&gt;Lean Web 精益 web &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;老实说，将精益方法与这个项目联系起来有点牵强，但这个只是感觉不错。&lt;/p&gt;
&lt;h3 id=&quot;zero-config-ling2-pei4-zhi4&quot; tabindex=&quot;-1&quot;&gt;Zero Config 零配置 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;零配置意味着 Eleventy 可以在没有任何命令行参数或配置文件的情况下运行。&lt;/p&gt;
&lt;p&gt;我们已经精心设置了 Eleventy，以至于运行默认的 &lt;code&gt;eleventy&lt;/code&gt; 命令时会使用合理的默认设置。降低第一个项目构建的入门门槛，以便更快地上手和运行。&lt;/p&gt;
&lt;h3 id=&quot;convention-over-configuration-routing-yue1-ding4-da4-yu2-pei4-zhi4-lu4-you2&quot; tabindex=&quot;-1&quot;&gt;Convention over Configuration Routing 约定大于配置路由 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;您能相信某些框架需要集中的路由配置吗？&lt;code&gt;eleventy&lt;/code&gt; 路由映射文件系统，除非您使用 &lt;code&gt;permalink&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;prerendered-templates-by-default-mo4-ren4-yu4-xuan4-ran3-mu2-ban3&quot; tabindex=&quot;-1&quot;&gt;Pre-rendered Templates by Default 默认预渲染模板 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;随着 JavaScript 中模板的客户端渲染的兴起，出现了严重的性能问题，特别是对于使用能力较差（但仍然很现代）硬件的用户来说。您是否知道他们正在销售硬件相当有限的新移动设备？&lt;/p&gt;
&lt;p&gt;许多框架转向了服务器端渲染（Server Side Rendering, SSR），这意味着需要运行一个应用服务器，并带有中间件，它会根据每个请求动态渲染标记。默认情况下，Eleventy 模板在构建时生成（有些人称之为预渲染）以提高性能。这种方式下，网页服务器只需要获取静态文件并将其发送回用户。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果您想为您的 Eleventy 项目添加动态服务器端功能，请在您的构建或服务器生成的模板之上使用 &lt;a href=&quot;https://www.11ty.dev/docs/plugins/edge/&quot;&gt;Eleventy Edge。&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Eleventy 还可以运行在&lt;a href=&quot;https://www.11ty.dev/docs/plugins/serverless/&quot;&gt;无服务器模式&lt;/a&gt;下，用于按需服务器端渲染，&lt;em&gt;甚至可以按需渲染一次并缓存后续访问者的请求&lt;/em&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;hydrationless-zhu4-shui3&quot; tabindex=&quot;-1&quot;&gt;Hydration-less 注水 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;嗯，呃，我们在 Eleventy 中不注入或使用任何客户端 JavaScript，所以没有任何需要 hydration（注水）的东西。&lt;/p&gt;
&lt;h3 id=&quot;ying4-yong4-cheng2-xu4-er2-bu2-shi4-ying4-yong4-cheng2-xu4-fu2-wu4-qi4&quot; tabindex=&quot;-1&quot;&gt;应用程序而不是应用程序服务器 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;应用程序服务器可能很慢。不再需要 PHP、Java 甚至 Node.js 在收到请求时动态生成页面响应，而是让您的预渲染模板准备好交付！最大性能。&lt;/p&gt;
&lt;h3 id=&quot;dan1-ye4-ying4-yong4-cheng2-xu4-spa-yu3-duo1-ye4-ying4-yong4-cheng2-xu4-mpa&quot; tabindex=&quot;-1&quot;&gt;单页应用程序 (SPA) 与多页应用程序 (MPA) &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;单页应用程序（SPA）使用 JavaScript 来实现网站内不同页面之间的导航。多页应用程序使用网络的经典导航模型，并通过完全刷新页面来访问新页面。&lt;/p&gt;
&lt;p&gt;您应该&lt;a href=&quot;https://www.11ty.dev/docs/single-page-applications/&quot;&gt;使用 Eleventy 构建单页应用程序吗&lt;/a&gt;？&lt;/p&gt;
</content>
	</entry>
	
	<entry>
		<title>Eleventy 入门</title>
		<link href="https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;一、 创建项目 eleventy-sample 目录 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;二、安装 eleventy &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;创建一个 package.json &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;安装 eleventy &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;三、运行 Eleventy &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;四、创建模板 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;五、观察模板 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;六、将其放到网上（可选） &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;六、继续学习 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;教程和入门项目 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;yi1-chuang4-jian4-xiang4-mu4-eleventysample-mu4-lu4&quot; tabindex=&quot;-1&quot;&gt;一、 创建项目 &lt;code&gt;eleventy-sample&lt;/code&gt; 目录 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用以下命令为您的项目创建一个目录&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; eleventy-sample&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在使用以下命令进入该目录（更改目录cd的缩写）：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; eleventy-sample&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;er4-an1-zhuang1-eleventy&quot; tabindex=&quot;-1&quot;&gt;二、安装 eleventy &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;chuang4-jian4-yi2-ge4-packagejson&quot; tabindex=&quot;-1&quot;&gt;创建一个 &lt;code&gt;package.json&lt;/code&gt; &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;安装 &lt;code&gt;Eleventy&lt;/code&gt; 需要一个 &lt;code&gt;package.json&lt;/code&gt; 文件。使用 &lt;a href=&quot;https://docs.npmjs.com/cli/init&quot;&gt;&lt;code&gt;npm init -y&lt;/code&gt;&lt;/a&gt; 创建该文件。 &lt;code&gt;-y&lt;/code&gt; 使用默认值并跳过命令行询问。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; init &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;an1-zhuang1-eleventy&quot; tabindex=&quot;-1&quot;&gt;安装 eleventy &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; @11ty/eleventy --save-dev&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;您也可以全局安装 Eleventy，但 &lt;code&gt;package.json&lt;/code&gt; 推荐使用上面的安装方法。&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-g&lt;/span&gt; @11ty/eleventy&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;san1-yun4-xing2-eleventy&quot; tabindex=&quot;-1&quot;&gt;三、运行 Eleventy &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们可以使用 npx 命令（也由Node.js提供）来运行本地项目的 Eleventy 版本。让我们确保我们的安装顺利进行，并尝试运行 Eleventy：&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;npx @11ty/eleventy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eleventy 运行结果：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx @11ty/eleventy
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Wrote &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.05&lt;/span&gt; seconds &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v2.0.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你在输出中看到 (v2.0.1) ，你就知道你使用的是最新版本。然而，Eleventy 并没有处理任何文件！文件夹还有没有查创建任何模板。&lt;/p&gt;
&lt;h2 id=&quot;si4-chuang4-jian4-mu2-ban3&quot; tabindex=&quot;-1&quot;&gt;四、创建模板 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模板是以 &lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot;&gt;Markdown&lt;/a&gt;，&lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot;&gt;HTML&lt;/a&gt;，&lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot;&gt;Liquid&lt;/a&gt;，&lt;a href=&quot;https://www.11ty.dev/docs/languages/&quot;&gt;Nunjucks&lt;/a&gt; 等格式编写的内容文件，Eleventy在构建网站时将其转换为页面（或页面）。&lt;/p&gt;
&lt;p&gt;让我们运行两个命令来创建两个新的模板文件。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# windows cmd 命令&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; ^&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;doctype html^&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;^&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;title^&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Page title^&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;/title^&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;^&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;p^&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;Hi^&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;/p^&lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; index.html&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# windows powershell 命令&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;!doctype html&gt;&amp;lt;title&gt;Page title&amp;lt;/title&gt;&amp;lt;p&gt;Hi&amp;lt;/p&gt;&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; index2.html&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;# Page header&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; README.md&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者，你也可以手动在项目根目录创建文件，注意文件名后缀即可。&lt;/p&gt;
&lt;p&gt;在你创建了一个HTML模板和一个 Markdown 模板之后，让我们用下面的命令再次运行 Eleventy：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx @11ty/eleventy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出可能如下所示：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx @11ty/eleventy
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing _site/README/index.html from ./README.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;liquid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing _site/index.html from ./index.html &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;liquid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Wrote &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; files &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.04&lt;/span&gt; seconds &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v2.0.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们已经将当前目录中的两个内容模板编译到输出文件夹中（ &lt;code&gt;_site&lt;/code&gt; 是默认值）。&lt;/p&gt;
&lt;h2 id=&quot;wu3-guan1-cha2-mu2-ban3&quot; tabindex=&quot;-1&quot;&gt;五、观察模板 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;--serve&lt;/code&gt; 启动热重载本地Web服务器。&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--serve&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你的命令行可能看起来像这样：&lt;/p&gt;
&lt;pre class=&quot;language-shell&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;E:&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;code&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;web&lt;span class=&quot;token punctuation&quot;&gt;&#92;&lt;/span&gt;eleventy-sample&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;npx @11ty/eleventy &lt;span class=&quot;token parameter variable&quot;&gt;--serve&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing _site/index.html from ./index.html &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;liquid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Writing _site/README/index.html from ./README.md &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;liquid&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Wrote &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; files &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.04&lt;/span&gt; seconds &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;v2.0.1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Watching…
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;11ty&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; Server at http://localhost:8080/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在浏览器中打开 &lt;a href=&quot;http://localhost:8080/&quot;&gt;http://localhost:8080/&lt;/a&gt; 或 &lt;a href=&quot;http://localhost:8080/README/&quot;&gt;http://localhost:8080/README/&lt;/a&gt; 即可实时查看您的 Eleventy 站点！当您保存模板文件时，Eleventy 将自动刷新浏览器并显示您的新更改！&lt;/p&gt;
&lt;h2 id=&quot;liu4-jiang1-qi2-fang4-dao4-wang3-shang4-ke3-xuan3&quot; tabindex=&quot;-1&quot;&gt;六、将其放到网上（可选） &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将您的新网站上线的最简单方法是前往 &lt;a href=&quot;https://app.netlify.com/drop&quot;&gt;Netlify Drop&lt;/a&gt;（无需注册帐户），并将您的新 Eleventy 生成的 _site 文件夹拖到 Netlify Drop Web界面。在几秒钟内，您的新网站将在线为任何人看到！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阅读其他一些&lt;a href=&quot;https://www.11ty.dev/docs/deployment/&quot;&gt;部署&lt;/a&gt;选项。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;liu4-ji4-xu4-xue2-xi2&quot; tabindex=&quot;-1&quot;&gt;六、继续学习 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;恭喜—您与 Eleventy 一起做出了一些东西！现在让它发挥作用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加更多内容！在上面的教程中，我们使用了 &lt;a href=&quot;https://www.11ty.dev/docs/languages/html/&quot;&gt;HTML&lt;/a&gt; 和 &lt;a href=&quot;https://www.11ty.dev/docs/languages/markdown/&quot;&gt;Markdown&lt;/a&gt; 。为什么接下来不使用 &lt;a href=&quot;https://www.11ty.dev/docs/languages/javascript/&quot;&gt;JavaScript&lt;/a&gt; 或 &lt;a href=&quot;https://www.11ty.dev/docs/languages/webc/&quot;&gt;WebC&lt;/a&gt;（用于组件）呢？&lt;a href=&quot;https://www.11ty.dev/docs/languages/nunjucks/&quot;&gt;Nunjucks&lt;/a&gt; 和 &lt;a href=&quot;https://www.11ty.dev/docs/languages/liquid/&quot;&gt;Liquid&lt;/a&gt; 也很受欢迎。也许你觉得超级冒险，想添加自己的自定义类型？&lt;/li&gt;
&lt;li&gt;使用布局文件，这样你就不必在每个模板上重复样板。&lt;/li&gt;
&lt;li&gt;将 &lt;a href=&quot;https://www.11ty.dev/docs/assets/&quot;&gt;CSS、JavaScript&lt;/a&gt; 或 &lt;a href=&quot;https://www.11ty.dev/docs/assets/&quot;&gt;Web&lt;/a&gt; 字体添加到项目中。&lt;/li&gt;
&lt;li&gt;了解 Eleventy 的更多&lt;a href=&quot;https://www.11ty.dev/docs/usage/&quot;&gt;命令行选项&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;也许你想在你的项目中使用来自&lt;a href=&quot;https://www.11ty.dev/docs/data-js/&quot;&gt;第三方API&lt;/a&gt;的数据？&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;jiao4-cheng2-he2-ru4-men2-xiang4-mu4&quot; tabindex=&quot;-1&quot;&gt;教程和入门项目 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;对于想要&lt;strong&gt;建立博客&lt;/strong&gt;的人，你可以学习如何从头开始（学习它是如何工作的）或使用我们的&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;官方博客启动项目&lt;/a&gt;（更快地启动和运行）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=kzf9A9tkkl4&quot;&gt;6 分钟从头开始使用 Eleventy 构建博客 (2023) ⏱ 6m&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/11ty/eleventy-base-blog&quot;&gt;eleventy-base-blog（官方启动项目）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.filamentgroup.com/lab/build-a-blog/&quot;&gt;使用 Eleventy 从头开始构建您自己的博客 (2018)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
	</entry>
	
	<entry>
		<title>文章</title>
		<link href="https://www.dtking.cn/blog/"/>
		<updated>2024-11-07T08:31:39Z</updated>
		<id>https://www.dtking.cn/blog/</id>
		<content type="html">
&lt;style&gt;
  main{padding:1rem;min-height:calc(100vh - 4rem);height:auto}.grid{display:grid}.grid-items{grid-template-columns:repeat(auto-fill,minmax(20rem,1fr));grid-gap:1.25rem}[role=list]{list-style:none}[role=list] a{color:var(--link-color)}[role=list] a:hover{text-decoration:underline}.flow&gt;*+*{margin-top:1.25rem}h1{margin:1.25rem 0}.postlist-date{color:var(--color-neutral-500);font-size:1rem}.desc{color:var(--body-text-color)}
&lt;/style&gt;

&lt;main&gt;
	&lt;h1&gt;文章&lt;/h1&gt;
	&lt;ul role=&quot;list&quot; class=&quot;grid grid-items&quot;&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/command/&quot;&gt;Windows 系统 Java 进程查看与项目启停脚本实战&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2026-04-17&quot;&gt;2026-04-17&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Windows 下使用 jps、tasklist、wmic 命令查看 Java 进程信息与启动参数，并提供完整的 Java 项目启动、停止批处理脚本编写示例&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov8-pose-train/&quot;&gt;YOLOv8-Pose 自定义关键点检测全流程：LabelMe 标注→模型训练→ONNX/RKNN 转换 RK3588 部署&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2026-01-27&quot;&gt;2026-01-27&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;YOLOv8-Pose 训练自定义图形关键点检测模型的全流程：从 LabelMe 标注数据（含 groupId 分组、JSON 格式说明）、编写 Python 脚本将标注数据转换为 YOLO-Pose 兼容格式，到配置 dataset.yaml 训练模型、验证模型效果，再到导出 ONNX 模型（适配 RKNN 参数）、转换为 RK3588 兼容的 RKNN 模型并完成推理验证；同时解决了 RKNN 量化失效、卷积层多核运行降级等部署问题，最终实现自定义关键点模型在瑞芯微 RK3588 上的落地&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/go-hosts/&quot;&gt;轻量级跨平台 Hosts 管理工具（支持 Ping/TCP 测速 + 自定义命令扩展）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2026-01-19&quot;&gt;2026-01-19&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Go Hosts 是一款基于 Go+fyne 开发的轻量级 Hosts 文件管理工具，适配 Windows 和 macOS 系统，作为 SwitchHosts（Electron）的轻量化替代方案；核心功能包含图形化 Hosts 规则管理、IP / 域名多绑定、Ping 测试（获取域名所有可访问 IP）、TCP 测速（筛选最快 IP），还支持自定义 CMD 命令按钮扩展，体积小巧且支持跨平台编译打包&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3588-WiFi-Hotspot/&quot;&gt;RK3588 nmcli 创建热点 DHCP 失败解决：hostapd+DNSmasq 搭建 AP 热点完整教程&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-12-30&quot;&gt;2025-12-30&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;nmcli 创建 ztl-wifi 热点出现手机 DHCP 连接失败、静态 IP 无法 PING 通的问题，提供hostapd+DNSmasq 替代搭建 AP 模式热点的完整解决方案；包含 NetworkManager 解除 wlan0 管理、hostapd 配置、wlan0 静态 IP 设置、DHCP 地址池分配、服务自启配置，以及恢复 NM 管理的回滚步骤，解决热点 IP 分配异常与局域网连通性问题&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576-WIFI-Bluetooth/&quot;&gt;RK3576 Ubuntu aic8800 芯片 WiFi 与蓝牙冲突解决：边缘盒子网络配置与蓝牙操作指南&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-12-26&quot;&gt;2025-12-26&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;aic8800 芯片边缘盒子播放音频导致 WiFi 断开的问题，提供官方及实测有效的冲突解决方法（如 rfkill 重置无线设备），同时详细整理了无线 / 有线网卡配置（WiFi 连接、静态 IP 设置、多网段配置）、蓝牙配对连接操作的完整命令，涵盖网络管理与蓝牙配置的全流程解决方案。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/memo/nginx/&quot;&gt;Nginx 备忘录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-12-04&quot;&gt;2025-12-04&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;一是 WebSocket 代理配置（含握手升级头转发、心跳保活），解决 WebSocket 与 HTTP 同端口代理问题；二是前端 Gzip 预压缩文件的 Nginx 适配配置，确保压缩页面正常访问；三是请求体大小限制、缓冲区调优及 sendfile/TCP 优化配置，解决 413 错误并提升文件传输效率。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/edge-box/RK3576/&quot;&gt;RK3576 设备 FFmpeg 与 OpenCV 集成指南：基于 rkmpp 硬解的编译安装与测试步骤&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-11-24&quot;&gt;2025-11-24&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;在 RK3576 平台上编译安装 MPP、rkmpp、rkrga、FFmpeg（支持 rkmpp 硬解）及 OpenCV 的完整流程，包含依赖安装、源码获取、编译配置（解决 - fPIC 等常见问题）、安装验证步骤，并提供 Python 测试代码验证 rkmpp 硬解是否生效，适用于需要在瑞芯微芯片上实现高效视频解码的开发场景。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/Jetson%20tx2/&quot;&gt;NVIDIA Jetson TX2 边缘盒子运行姿态检测模型记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-10-17&quot;&gt;2025-10-17&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;在 Jetson TX2（JetPack 4.6.1 系统）上通过 Docker 部署 MediaPipe 的完整流程，包含环境配置、镜像拉取与容器启动参数说明，提供基于 RTSP 视频流的姿态检测测试代码及开合跳动作计数实现，解决 ARM 架构下 MediaPipe 运行的适配问题，适用于边缘设备视频流处理与人体动作分析场景。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/roadmap-golang/&quot;&gt;Go 语言学习路线图&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-10-17&quot;&gt;2025-10-17&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Go 基础内容、数据类型、复合类型、命令与文档、方法和接口、错误处理、代码结构、并发、标准库、生态与工具链&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/context-package/&quot;&gt;Go 语言中 context 包（AI）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-09-23&quot;&gt;2025-09-23&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Go 语言的 `context` 包提供了一种在多个 goroutine 之间传递&amp;quot;上下文&amp;quot;的机制，主要用于**控制并发任务的生命周期**，包括设置超时时间、取消操作以及传递请求范围的元数据。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/concurrency_patterns/&quot;&gt;Go 语言中，Fan-out/Fan-in 和 Pipeline 是两种强大的并发模式（AI）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-09-23&quot;&gt;2025-09-23&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;使用 goroutine 和通道构建并发程序的设计方法 fan-in、fan-out、pipeline&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ml/yolov5/&quot;&gt;YOLOv5 模型训练记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-09-19&quot;&gt;2025-09-19&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Ultralytics YOLOv5 🚀 是由 Ultralytics 开发的尖端、达到业界顶尖水平（SOTA）的计算机视觉模型。基于 PyTorch 框架，YOLOv5 以其易用性、速度和准确性而闻名。它融合了广泛研究和开发的见解与最佳实践，使其成为各种视觉 AI 任务的热门选择，包括目标检测，图像分割和图像分类&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/FFmpeg/&quot;&gt;FFmpeg 常用命令&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-09-19&quot;&gt;2025-09-19&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;FFmpeg 关键帧、单预测帧、双向预帧、均匀测帧抽帧，图片、音频、视频等处理。用于录制、转换和传输音频和视频的完整跨平台解决方案。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/mediamtx/&quot;&gt;mediamtx 配置文件英文转中文&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-09-17&quot;&gt;2025-09-17&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;mediamtx 支持RTSP、RTMP、HLS、WebRTC等推拉流协议，同时支持动态通过 HTTP API 管理流地址&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript-module/&quot;&gt;Javascript CommonJS，AMD，ESM 模型分别是什么（AI）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-08-05&quot;&gt;2025-08-05&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;在 JavaScript 中，模块系统是管理代码依赖和组织大型应用的重要方式。目前主要有三种主流的模块规范：CommonJS、AMD 和 ES 模块（ESM）。它们各有特点，适用于不同的场景。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/github-code-contribution/&quot;&gt;Github 代码贡献（AI）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-08-04&quot;&gt;2025-08-04&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Github 代码贡献流程，具体操作步骤说明。首先需要将代码 Fork（派生）到你自己的 GitHub 账号下&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue-h5-wxpay/&quot;&gt;微信 H5 支付开发实战记录（含 Vue 和 Nginx 配置）&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-07-30&quot;&gt;2025-07-30&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;微信支付在 H5 页面中有一定的接入门槛和限制，本文记录了我在开发微信 H5 支付过程中的一些关键点与踩坑经验，适合使用 Vue 框架开发的项目参考&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ssh/&quot;&gt;CentOS 生成 SSH 秘钥文件&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-07-24&quot;&gt;2025-07-24&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;通常 ssh 私钥文件使用 scp 命令上传或下载文件服务器文件&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue2/&quot;&gt;Vue2 笔记&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-07-15&quot;&gt;2025-07-15&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Vue2 watch 监听各种应用，包含immediate、deep、handler、如何使用应用场景。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/java/maven-profiles/&quot;&gt;IntelliJ IDEA 开发工具使用 Maven 多环境配置&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-07-15&quot;&gt;2025-07-15&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;spring-boot 使用 Maven 配置 application.xml 动态多环境切换&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/svn/&quot;&gt;SVN 分支处理命令&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-06-30&quot;&gt;2025-06-30&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;SVN 创建,检出、切换、合并分支等&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/faq/&quot;&gt;Ollama 常问问题&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-06-30&quot;&gt;2025-06-30&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;见问题解答，涵盖了从安装更新、配置环境变量、GPU 兼容性到网络代理设置等多个方面。通过详细的步骤说明和示例代码，用户可以快速解决使用过程中遇到的问题，优化模型性能，并确保 Ollama 在不同环境下的稳定运行&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/EPS-01S-Tasmota/&quot;&gt;EPS-01S 刷 Tasmota 固件手搓继电器开关&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-06-15&quot;&gt;2025-06-15&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;使用 ESP-01S 刷 Tasmota 固件手动实现继电器开关，用于控制热水器加热，Tasmota 支持 MQTT 协议，有云服务器就可以实现远程开关。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/diy-wifi-controller/&quot;&gt;基于 51 单片机 DIY 热水器控制器&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-06-12&quot;&gt;2025-06-12&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;diy 远程控制热水器烧水的控制器，热水器功率较大一直开着费电，所以我就想能不能利用我毕生所学自己实战一下。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/c51/interrupt/&quot;&gt;MCS-51 特殊功能寄存器&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-05-31&quot;&gt;2025-05-31&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;51 系统常用寄存器名称，位符号，作用，中文名称，使用方法记录。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/devc/&quot;&gt;devc - 开发者剪切板工具&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-04-16&quot;&gt;2025-04-16&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;devc 是一款运行在 Windows 系统下的剪切板监听小工具，使用 Go 语言开发，通过调用 Windows API 实现功能。它能够记录每天的剪切板内容，并提供翻译功能，支持中英互译，特别适用于开发人员在编写代码或数据库表字段时，快速将中文字段翻译为英文字段。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ios-safari-play/&quot;&gt;iOS Safari h5页面 video 标签无法加载视频问题记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-04-11&quot;&gt;2025-04-11&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;解决 h5 页面安卓手机播放视频正常，苹果高版本系统无法加载视频问题，主要出现的 iOS 18 以上系统。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/golang/goroutines/&quot;&gt;go goroutine (协程) 到底是什么&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-04-07&quot;&gt;2025-04-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;go goroutine 记录，和线程的区别，如何实现的轻量级，高并发？&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/jeecg-boot-tinymce/&quot;&gt;jeecg 管理端富文本 JEditor 增加自定义视频上传&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-04-07&quot;&gt;2025-04-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;jeecg 管理端，富文本增加自定义视频上传&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/vue/vue3/&quot;&gt;Vue3 笔记&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-03-27&quot;&gt;2025-03-27&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Vue3 笔记&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/common-commands/&quot;&gt;乱七八糟命令记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-03-11&quot;&gt;2025-03-11&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Window github 代理，端口查找、网络配置、DNS、安卓证书生成等。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/go-gcc-build/&quot;&gt;Golang 交叉编译 Android 平台可执行文件&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-03-04&quot;&gt;2025-03-04&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;交叉编译环境变量配置，使用 Termux 测试验证是编译成功&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/protocol/&quot;&gt;vmess ss，trojan 分别是什么&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-21&quot;&gt;2025-02-21&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;vmess ss，trojan 内容说明&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ai-model/&quot;&gt;人工智能之 AI 大模型相关术语&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-21&quot;&gt;2025-02-21&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;大模型运行，部署、微调术语解释说明&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/ollamab/&quot;&gt;Ollama 模型迁移备份工具 ollamab&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-18&quot;&gt;2025-02-18&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Ollama 模型迁移备份工具，支持 Window Linux 系统&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/windows/&quot;&gt;Ollama Window 安装&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Ollama Window 安装&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/modelfile/&quot;&gt;Ollama 模型文件&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Ollama 模型文件的结构和配置方法，帮助开发者更好地理解和部署 AI 模型。通过清晰的指南和示例，用户可以快速掌握如何创建和优化模型文件，从而提升模型性能和应用效果&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/linux/&quot;&gt;Ollama Linux 安装&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Ollama Linux 安装&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/import/&quot;&gt;Ollama 导入模型&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;这个文档是关于如何将 Ollama 模型从 Safetensors 权重中导入。它包括使用 Dockerfile 将模型导入 Ollama 的步骤，以及如何在 Ollama.com 上共享模型。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/examples/&quot;&gt;Ollama 示例&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;该目录包含使用 Ollama 的不同示例，Python 、JavaScript、OpenAI社区示例等&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/ollama/api/&quot;&gt;Ollama API 文档&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2025-02-10&quot;&gt;2025-02-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;API 接口设计与使用方法，帮助开发者快速接入和调用 Ollama 的核心功能。通过详细的接口说明和示例代码，开发者可以轻松实现模型的部署、调用和管理，从而加速 AI 应用的开发流程&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/markdown/&quot;&gt;Markdown 一些不常见用法&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-12-30&quot;&gt;2024-12-30&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Markdown&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-data-reassembly/&quot;&gt;记录 TCP 数据包手动重组，Gzip 分块传输&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-12-13&quot;&gt;2024-12-13&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Gzip 分块传输数据解析&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/tcp-connection/&quot;&gt;TCP 连接，三次握手，四次挥手&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-12-10&quot;&gt;2024-12-10&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;TCP 连接详细步骤，分析连接过程记录及标识位解释说明&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl-v3/&quot;&gt;自签浏览器授信 CA 证书&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-12-03&quot;&gt;2024-12-03&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;自签 SSL 证书浏览器不授信，提示连接不安全解决办法，自签证书时增加SAN信息，将证书添加到受信任的根证书颁发机构&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/custom-ssl/&quot;&gt;自签 SSL 证书&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-12-02&quot;&gt;2024-12-02&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;使用 openssl 自签 SSL 证书，nginx 配置 https。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScrip-array/&quot;&gt;Javascript Arrary 解构 扩散运算&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-28&quot;&gt;2024-11-28&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;js 解构赋值、delete、splice、reduce 等方法操作&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/nginx-location/&quot;&gt;Nginx location，proxy_pass，sse 等指令常见问题&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-21&quot;&gt;2024-11-21&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Nginx location，proxy_pass 指令研究记录&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/BookmarkScript/&quot;&gt;谷歌浏览器书签脚本&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-21&quot;&gt;2024-11-21&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;谷歌浏览器书签脚本使用方法，常用脚本示例，简单且高效。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/font-decoding/&quot;&gt;某趣G小说字体解码&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-21&quot;&gt;2024-11-21&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;一些在线阅读小说网站，页面显示内容是正常，但获取到的文本内容却是乱码或语句不通的汉字。出现这种情况大概率是加密字。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/uniapp/&quot;&gt;uni-app 常用方法记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-09&quot;&gt;2024-11-09&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;页面之间传参，plus 接口使用，web-view 加载本地 html&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/adb/&quot;&gt;adb 常用命令操作移动设备&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;adb 操作移动设备，USB 调试 WIFI 调试，安装卸载 apk&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/npm/&quot;&gt;npm 常用方法问题记录&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;npm 命令使用，常见问题记录，源地址配置&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/layout-chaining/&quot;&gt;Eleventy 布局链&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/grid/&quot;&gt;grid 网格布局&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;显式网格属性 grid-template-rows、grid-template-columns 和 grid-template-areas， 隐式网格属性 grid-auto-rows、grid-auto-columns 和 grid-auto-flow， 间距属性 grid-column-gap 和 grid-row-gap。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/asar/&quot;&gt;asar Electron 文件归档格式解压&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;asar 文件解压&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/a-more-modern-css-reset/&quot;&gt;重置 CSS 样式&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;重置默认 CSS 样式，优化样式，统一样式处理。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E6%A8%A1%E6%9D%BF%E8%AF%AD%E8%A8%80/&quot;&gt;Nunjucks 语言模版使用方法&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;在 Nunjucks 模板语言中，{% %} 和 {{ }} 有着不同的用途，选择使用哪个取决于你想要在模板中实现的功能。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/NJK%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95/&quot;&gt;Nunjucks 自定义表达式&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Nunjucks 自定义表达式语法记录，包含 TOC、警告、错误、提示等提示框&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/JavaScript%E5%88%A0%E9%99%A4DOM%E4%BA%8B%E4%BB%B6/&quot;&gt;Javascript/DOM：如何删除 DOM 对象的所有事件侦听器&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;js 操作 DOM 并删除已添加所有事件&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E6%9C%AF%E8%AF%AD/&quot;&gt;Eleventy-术语&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/Eleventy-%E5%85%A5%E9%97%A8/&quot;&gt;Eleventy 入门&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-11-07&quot;&gt;2024-11-07&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Eleventy 入门，快速创建一个 eleventy 项目。&lt;/p&gt;
		&lt;/li&gt;&lt;li class=&quot;flow&quot;&gt;
			&lt;h2&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;Chrome 浏览器 F12 无法打开控制台，右键无法查看元素解决办法&lt;/a&gt;&lt;/h2&gt;
			&lt;p&gt;
				&lt;time class=&quot;postlist-date&quot; datetime=&quot;2024-08-29&quot;&gt;2024-08-29&lt;/time&gt;
			&lt;/p&gt;
			&lt;p class=&quot;desc line3&quot;&gt;Chrome 浏览器开发，调试控制台使用&lt;/p&gt;
		&lt;/li&gt;&lt;/ul&gt;
&lt;/main&gt;</content>
	</entry>
	
	<entry>
		<title>Chrome 浏览器 F12 无法打开控制台，右键无法查看元素解决办法</title>
		<link href="https://www.dtking.cn/blog/chrome-devtools/"/>
		<updated>2024-08-29T09:32:58Z</updated>
		<id>https://www.dtking.cn/blog/chrome-devtools/</id>
		<content type="html">&lt;details class=&quot;toc&quot;&gt;&lt;summary&gt;目录&lt;/summary&gt;
&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;table-of-contents&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;不可以打开 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;方法一 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;方法二 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;方法三 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;方法四 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;方法五 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;可以打开 &lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;beforeunload &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;devtoolschange &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;通过窗口高度和宽度来判断是否打开控制台 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;油猴脚本 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;bu4-ke3-yi3-da3-kai1&quot; tabindex=&quot;-1&quot;&gt;不可以打开 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;fang1-fa3-yi1&quot; tabindex=&quot;-1&quot;&gt;方法一 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;将鼠标光标移动到搜索或地址栏中，点击聚焦，此时再按 &lt;kbd&gt;F12&lt;/kbd&gt; 键就可以顺利打开控制台了。&lt;/p&gt;
&lt;h3 id=&quot;fang1-fa3-er4&quot; tabindex=&quot;-1&quot;&gt;方法二 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;随便找一个可以打开控制台的页面，然后将不能打开控制的页面地址，复制粘贴已打开的网页中，&lt;kbd&gt;Enter&lt;/kbd&gt; 键访问。&lt;/p&gt;
&lt;h3 id=&quot;fang1-fa3-san1&quot; tabindex=&quot;-1&quot;&gt;方法三 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;尝试 &lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;S&lt;/kbd&gt; 保存网页，对代码进行分析，然后通过 &lt;strong&gt;油猴&lt;/strong&gt; 注入脚本重新对应方法&lt;/p&gt;
&lt;h3 id=&quot;fang1-fa3-si4&quot; tabindex=&quot;-1&quot;&gt;方法四 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;操作系统&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;元素&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;控制台&lt;/th&gt;
&lt;th style=&quot;text-align:left&quot;&gt;您上次使用的面板&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Windows 或 Linux&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Ctrl + Shift + &lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Ctrl + Shift + &lt;strong&gt;J&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;F12 Ctrl + Shift + &lt;strong&gt;I&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Mac&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Cmd + Option + &lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Cmd + Option + &lt;strong&gt;J&lt;/strong&gt;&lt;/td&gt;
&lt;td style=&quot;text-align:left&quot;&gt;Fn + F12 Cmd + Option + &lt;strong&gt;I&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;下面介绍了一种记忆快捷键的简单方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C 代表 CSS。&lt;/li&gt;
&lt;li&gt;J 表示 JavaScript。&lt;/li&gt;
&lt;li&gt;I 表示您选择的选项。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;fang1-fa3-wu3&quot; tabindex=&quot;-1&quot;&gt;方法五 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;u&lt;/kbd&gt; 源码视图进行分析网页代码&lt;/p&gt;
&lt;h2 id=&quot;ke3-yi3-da3-kai1&quot; tabindex=&quot;-1&quot;&gt;可以打开 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有些网页可以打开控制台，但是打开一瞬间跳转 &lt;code&gt;about:blank&lt;/code&gt; 空白页，可以通过一下脚本阻止跳转同时弹框提醒是否离开&lt;/p&gt;
&lt;h3 id=&quot;beforeunload&quot; tabindex=&quot;-1&quot;&gt;beforeunload &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;监听页面卸载事件 &lt;/b&gt;油猴脚本&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;beforeunload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 尝试离开页面时执行&lt;/span&gt;
    event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;devtoolschange&quot; tabindex=&quot;-1&quot;&gt;devtoolschange &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;codetitle codetitle-left&quot;&gt;&lt;b&gt;监听控制台变化 &lt;/b&gt;油猴脚本&lt;/div&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// 如果已经存在的监听器需要移除&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; originalRemoveEventListener &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;removeEventListener&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;removeEventListener&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;devtoolschange&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 拦截对 devtoolschange 事件监听的移除&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;token comment&quot;&gt;// 对其他事件，使用原始方法进行移除&lt;/span&gt;
	&lt;span class=&quot;token function&quot;&gt;originalRemoveEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;tong1-guo4-chuang1-kou3-gao1-du4-he2-kuan1-du4-lai2-pan4-duan4-shi4-fou3-da3-kai1-kong4-zhi4-tai2&quot; tabindex=&quot;-1&quot;&gt;通过窗口高度和宽度来判断是否打开控制台 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;此刻就需要先打开&lt;a href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;控制台&lt;/a&gt;，点击控制台设置 停靠测：“取消停靠至单独的窗口”，然后控制台单独一个窗口&lt;/p&gt;
&lt;h3 id=&quot;you2-hou2-jiao3-ben3&quot; tabindex=&quot;-1&quot;&gt;油猴脚本 &lt;a class=&quot;header-anchor &quot; href=&quot;https://www.dtking.cn/blog/chrome-devtools/&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://greasyfork.org/zh-CN/scripts/559290-enable-devtool&quot;&gt;安装 enable-devtool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有些网站是通过 &lt;code&gt;setTimeout&lt;/code&gt; 定时触发检测或重定向，所以可以过滤 &lt;code&gt;callback&lt;/code&gt; 的内容然后对应方法失效（自行测试调整）。&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.dtking.cn/img/RRkl-czCvE-462.avif 462w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.dtking.cn/img/RRkl-czCvE-462.webp 462w&quot;&gt;&lt;img alt=&quot;离开页面提示框&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.dtking.cn/img/RRkl-czCvE-462.png&quot; width=&quot;462&quot; height=&quot;192&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;pre class=&quot;language-js&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// ==UserScript==&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @name         enable-devtool&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @namespace    http://tampermonkey.net/&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @version      2025-12-18&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @description  解决大部分页面，打开控制台页面直接重定向或 about:blank 问题&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @author       Mr.Fang&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @match        https://*/*&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @icon         https://www.google.com/s2/favicons?sz=64&amp;amp;domain=www.google.com&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @grant        unsafeWindow&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// @run-at 		 document-start&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// ==/UserScript==&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
	&lt;span class=&quot;token string&quot;&gt;&#39;use strict&#39;&lt;/span&gt;

	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; originalAddEventListener &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;addEventListener&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 重写 setTimeout ,拦截定时器执行 about:blank 内容&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; originalSetTimeout &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; unsafeWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setTimeout&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	unsafeWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;setTimeout&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delay&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; toStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; callback&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toStr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toStr &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; toStr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;about:blank&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 自定修改 about:blank 要匹配的内容&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;wrappedCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;// 也可注释掉此行进行验证&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;originalSetTimeout&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrappedCallback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delay&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 重写 setInterval,拦截定时器执行 about:blank 内容&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; originalSetInterval &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; unsafeWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setInterval&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	unsafeWindow&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;setInterval&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;callback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delay&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; toStr &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; callback&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toStr&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;toStr &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; toStr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;about:blank&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 自定修改 about:blank 要匹配的内容&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;wrappedCallback&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token function&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// 也可注释掉此行进行验证&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;originalSetInterval&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;wrappedCallback&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; delay&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 重写 addEventListener 方法&lt;/span&gt;
	window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;addEventListener&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;devtoolschange&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;// 拦截对 devtoolschange 事件的监听，阻止其添加&lt;/span&gt;
			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;拦截了添加“devtoolschange”侦听器的尝试.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 对其他事件，使用原始方法进行添加&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;originalAddEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

	&lt;span class=&quot;token comment&quot;&gt;// 如果已经存在的监听器需要移除&lt;/span&gt;
	&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; originalRemoveEventListener &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;removeEventListener&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function-variable function&quot;&gt;removeEventListener&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;devtoolschange&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
			&lt;span class=&quot;token comment&quot;&gt;// 拦截对 devtoolschange 事件监听的移除&lt;/span&gt;
			console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;拦截了删除“devtoolschange”侦听器的尝试.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
			&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 对其他事件，使用原始方法进行移除&lt;/span&gt;
		&lt;span class=&quot;token function&quot;&gt;originalRemoveEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;window&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; type&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; listener&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; options&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 监听开发者窗口改变&lt;/span&gt;
	window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;devtoolschange&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;阻止&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
		event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
	
	&lt;span class=&quot;token comment&quot;&gt;// 监听离开当前页面，例如使用 window.location.href&lt;/span&gt;
	window&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;beforeunload&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 在用户尝试离开页面时执行你的逻辑&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 例如：&lt;/span&gt;
		event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;preventDefault&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;阻止&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
		&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// event.returnValue = &quot;&quot;; // 兼容老版本浏览器&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// return &quot;&quot;; // 兼容新版本浏览器&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// 或者显示一个警告框&lt;/span&gt;
		&lt;span class=&quot;token comment&quot;&gt;// return &quot;您确定要离开吗？&quot;;&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
	</entry>
</feed>
