279 lines
257 KiB
JSON
279 lines
257 KiB
JSON
{
|
||
"version": "https://jsonfeed.org/version/1",
|
||
"title": "涛声依旧",
|
||
"subtitle": "天下事有难易乎?为之,则难者亦易矣",
|
||
"icon": "https://hitoli.com/images/favicon.ico",
|
||
"description": "天生我材必有用",
|
||
"home_page_url": "https://hitoli.com",
|
||
"items": [
|
||
{
|
||
"id": "https://hitoli.com/2024/01/03/%E8%A7%A3%E5%86%B3Nginx%E8%AE%BF%E9%97%AE%E8%87%AA%E7%AD%BEssl%E8%AF%81%E4%B9%A6%E6%8A%A5%E4%B8%8D%E5%AE%89%E5%85%A8%E5%91%8A%E8%AD%A6/",
|
||
"url": "https://hitoli.com/2024/01/03/%E8%A7%A3%E5%86%B3Nginx%E8%AE%BF%E9%97%AE%E8%87%AA%E7%AD%BEssl%E8%AF%81%E4%B9%A6%E6%8A%A5%E4%B8%8D%E5%AE%89%E5%85%A8%E5%91%8A%E8%AD%A6/",
|
||
"title": "解决Nginx访问自签ssl证书报不安全告警",
|
||
"date_published": "2024-01-03T10:01:00.000Z",
|
||
"content_html": "<h4 id=\"生成根证书私钥和根证书\"><a class=\"anchor\" href=\"#生成根证书私钥和根证书\">#</a> 生成根证书私钥和根证书</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl req <span class=\"token parameter variable\">-x509</span> <span class=\"token parameter variable\">-nodes</span> <span class=\"token parameter variable\">-days</span> <span class=\"token number\">36500</span> <span class=\"token parameter variable\">-newkey</span> rsa:2048 <span class=\"token parameter variable\">-subj</span> <span class=\"token string\">\"/C=国家/ST=省/L=市/O=机构\"</span> <span class=\"token parameter variable\">-keyout</span> CA-private.key <span class=\"token parameter variable\">-out</span> CA-certificate.crt <span class=\"token parameter variable\">-reqexts</span> v3_req <span class=\"token parameter variable\">-extensions</span> v3_ca</pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">#示例</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>openssl req <span class=\"token parameter variable\">-x509</span> <span class=\"token parameter variable\">-nodes</span> <span class=\"token parameter variable\">-days</span> <span class=\"token number\">36500</span> <span class=\"token parameter variable\">-newkey</span> rsa:2048 <span class=\"token parameter variable\">-subj</span> <span class=\"token string\">\"/C=CN/ST=EZ/L=EZ/O=EZ\"</span> <span class=\"token parameter variable\">-keyout</span> CA-private.key <span class=\"token parameter variable\">-out</span> CA-certificate.crt <span class=\"token parameter variable\">-reqexts</span> v3_req <span class=\"token parameter variable\">-extensions</span> v3_ca</pre></td></tr></table></figure><h4 id=\"生成自签名证书私钥\"><a class=\"anchor\" href=\"#生成自签名证书私钥\">#</a> 生成自签名证书私钥</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl genrsa <span class=\"token parameter variable\">-out</span> private.key <span class=\"token number\">2048</span></pre></td></tr></table></figure><h4 id=\"根据自签名证书私钥生成自签名证书申请文件\"><a class=\"anchor\" href=\"#根据自签名证书私钥生成自签名证书申请文件\">#</a> 根据自签名证书私钥生成自签名证书申请文件</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl req <span class=\"token parameter variable\">-new</span> <span class=\"token parameter variable\">-key</span> private.key <span class=\"token parameter variable\">-subj</span> <span class=\"token string\">\"/C=CN/ST=EZ/L=EZ/O=EZ/CN=192.168.2.117\"</span> <span class=\"token parameter variable\">-sha256</span> <span class=\"token parameter variable\">-out</span> private.csr</pre></td></tr></table></figure><h4 id=\"定义自签名证书扩展文件解决chrome安全告警新建privateext文件并写入以下内容ip为nginx服务器ip同nginxconf中的server_name\"><a class=\"anchor\" href=\"#定义自签名证书扩展文件解决chrome安全告警新建privateext文件并写入以下内容ip为nginx服务器ip同nginxconf中的server_name\">#</a> 定义自签名证书扩展文件 (解决 chrome 安全告警),新建 private.ext 文件并写入以下内容(IP 为 nginx 服务器 ip,同 nginx.conf 中的 server_name)</h4>\n<figure class=\"highlight text\"><figcaption data-lang=\"text\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>[ req ]</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>default_bits = 1024</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>distinguished_name = req_distinguished_name</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>req_extensions = san</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>extensions = san</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>[ req_distinguished_name ]</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>countryName = CN</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>stateOrProvinceName = Definesys</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>localityName = Definesys</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>organizationName = Definesys</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>[SAN]</pre></td></tr><tr><td data-num=\"12\"></td><td><pre>authorityKeyIdentifier=keyid,issuer</pre></td></tr><tr><td data-num=\"13\"></td><td><pre>basicConstraints=CA:FALSE</pre></td></tr><tr><td data-num=\"14\"></td><td><pre>keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment</pre></td></tr><tr><td data-num=\"15\"></td><td><pre>subjectAltName = IP:192.168.2.117</pre></td></tr></table></figure><h4 id=\"生成自签名证书有效期100年\"><a class=\"anchor\" href=\"#生成自签名证书有效期100年\">#</a> 生成自签名证书(有效期 100 年)</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl x509 <span class=\"token parameter variable\">-req</span> <span class=\"token parameter variable\">-days</span> <span class=\"token number\">36500</span> <span class=\"token parameter variable\">-in</span> private.csr <span class=\"token parameter variable\">-CA</span> CA-certificate.crt <span class=\"token parameter variable\">-CAkey</span> CA-private.key <span class=\"token parameter variable\">-CAcreateserial</span> <span class=\"token parameter variable\">-sha256</span> <span class=\"token parameter variable\">-out</span> private.crt <span class=\"token parameter variable\">-extfile</span> private.ext <span class=\"token parameter variable\">-extensions</span> SAN</pre></td></tr></table></figure><h4 id=\"nginx的ssl证书配置\"><a class=\"anchor\" href=\"#nginx的ssl证书配置\">#</a> nginx 的 ssl 证书配置</h4>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>ssl_certificate_key /usr/local/nginx/ssl/private.key;</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>ssl_certificate /usr/local/nginx/ssl/private.crt;</pre></td></tr></table></figure><h4 id=\"证书安装\"><a class=\"anchor\" href=\"#证书安装\">#</a> 证书安装</h4>\n<p>需要安装 CA-certificate.crt 到受信任的根证书颁发机构下,即可从浏览器正常访问且不会报不安全警告。</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#ssl 测试</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>openssl s_client <span class=\"token parameter variable\">-connect</span> localhost:8080</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">#检查证书格式</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>openssl x509 <span class=\"token parameter variable\">-in</span> private.crt <span class=\"token parameter variable\">-text</span> <span class=\"token parameter variable\">-noout</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>openssl rsa <span class=\"token parameter variable\">-in</span> private.key <span class=\"token parameter variable\">-check</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\">#检查证书是否过期(确保 \"notBefore\" 小于当前日期,\"notAfter\" 大于当前日期)</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>openssl x509 <span class=\"token parameter variable\">-in</span> private.crt <span class=\"token parameter variable\">-noout</span> <span class=\"token parameter variable\">-dates</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token comment\">#查看证书链</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>openssl x509 <span class=\"token parameter variable\">-in</span> private.crt <span class=\"token parameter variable\">-noout</span> <span class=\"token parameter variable\">-issuer</span> <span class=\"token parameter variable\">-subject</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Nginx",
|
||
"https",
|
||
"SSL",
|
||
"证书"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2024/01/03/Centos7%E7%BC%96%E8%AF%91%E5%8D%87%E7%BA%A7nginx/",
|
||
"url": "https://hitoli.com/2024/01/03/Centos7%E7%BC%96%E8%AF%91%E5%8D%87%E7%BA%A7nginx/",
|
||
"title": "Centos7编译升级nginx",
|
||
"date_published": "2024-01-03T09:40:00.000Z",
|
||
"content_html": "<h4 id=\"配置\"><a class=\"anchor\" href=\"#配置\">#</a> 配置</h4>\n<p>./configure<br />\n# 安装目录<br />\n --prefix=/usr/local/nginx<br />\n#nginx 运行时的非特权用户<br />\n --user=nginx<br />\n#nginx 运行时的非特权用户组<br />\n --group=nginx<br />\n#nginx 运行时 pid 的目录<br />\n --pid-path=/var/run/nginx/nginx.pid<br />\n# 锁定文件目录,防止误操作,或其他使用<br />\n --lock-path=/var/lock/nginx.lock<br />\n#nginx 错误日志目录<br />\n --error-log-path=/var/log/nginx/error.log<br />\n#nginx 运行日志目录<br />\n --http-log-path=/var/log/nginx/access.log<br />\n# 开启 gz 模块,压缩静态页面<br />\n --with-http_gzip_static_module<br />\n--with-http_gunzip_module<br />\n# 开启 ssl 模块<br />\n --with-http_ssl_module<br />\n# 开启 http2 模块<br />\n --with-http_v2_module<br />\n#openssl 目录<br />\n --with-openssl=/home/openssl-3.2.0<br />\n#nginx 的客户端状态<br />\n --with-http_stub_status_module<br />\n--with-http_realip_module<br />\n# 设定客户端请求的临时目录<br />\n --http-client-body-temp-path=/usr/local/nginx/client<br />\n# 设定 http 代理临时目录<br />\n --http-proxy-temp-path=/usr/local/nginx/proxy<br />\n# 设定 fastcgi 临时目录<br />\n --http-fastcgi-temp-path=/usr/local/nginx/fastcgi<br />\n# 设定 uwsgi 临时目录<br />\n --http-uwsgi-temp-path=/usr/local/nginx/uwsgi<br />\n# 设定 scgi 临时目录<br />\n --http-scgi-temp-path=/usr/local/nginx/scgi</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>./configure <span class=\"token parameter variable\">--prefix</span><span class=\"token operator\">=</span>/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-openssl<span class=\"token operator\">=</span>/home/openssl-3.2.0</pre></td></tr></table></figure><h4 id=\"编译\"><a class=\"anchor\" href=\"#编译\">#</a> 编译</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>make(不要make install)</pre></td></tr></table></figure><h4 id=\"备份\"><a class=\"anchor\" href=\"#备份\">#</a> 备份</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">cp</span> /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old</pre></td></tr></table></figure><h4 id=\"更新\"><a class=\"anchor\" href=\"#更新\">#</a> 更新</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#关闭 nginx</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>nginx <span class=\"token parameter variable\">-s</span> stop</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">#更新 nginx</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token function\">cp</span> /root/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin/</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\">#启动 nginx</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>nginx</pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Nginx",
|
||
"CentOS"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/12/24/Docker-desktop%E9%83%A8%E7%BD%B2nacos/",
|
||
"url": "https://hitoli.com/2023/12/24/Docker-desktop%E9%83%A8%E7%BD%B2nacos/",
|
||
"title": "Docker desktop部署nacos",
|
||
"date_published": "2023-12-24T13:37:00.000Z",
|
||
"content_html": "<h4 id=\"创建数据库\"><a class=\"anchor\" href=\"#创建数据库\">#</a> 创建数据库</h4>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">create</span> <span class=\"token keyword\">database</span> nacos</pre></td></tr></table></figure><h4 id=\"下载初始化脚本\"><a class=\"anchor\" href=\"#下载初始化脚本\">#</a> 下载初始化脚本</h4>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FsaWJhYmEvbmFjb3MvYmxvYi9tYXN0ZXIvZGlzdHJpYnV0aW9uL2NvbmYvbXlzcWwtc2NoZW1hLnNxbA==\">脚本文件</span></p>\n<h4 id=\"以普通模式启动获取数据\"><a class=\"anchor\" href=\"#以普通模式启动获取数据\">#</a> 以普通模式启动获取数据</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">docker</span> run <span class=\"token parameter variable\">-d</span> <span class=\"token parameter variable\">--restart</span><span class=\"token operator\">=</span>always <span class=\"token parameter variable\">--name</span><span class=\"token operator\">=</span><span class=\"token string\">\"nacos\"</span> <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MODE</span><span class=\"token operator\">=</span>standalone <span class=\"token parameter variable\">-p</span> <span class=\"token number\">8848</span>:8848 <span class=\"token parameter variable\">-p</span> <span class=\"token number\">9848</span>:9848 nacos/nacos-server:latest</pre></td></tr></table></figure><h4 id=\"进入容器内修改文件权限\"><a class=\"anchor\" href=\"#进入容器内修改文件权限\">#</a> 进入容器内修改文件权限</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">chmod</span> <span class=\"token number\">777</span> /home/nacos/conf</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">chmod</span> <span class=\"token number\">777</span> /home/nacos/data</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">chmod</span> <span class=\"token number\">777</span> /home/nacos/logs</pre></td></tr></table></figure><h4 id=\"拷贝文件到本地\"><a class=\"anchor\" href=\"#拷贝文件到本地\">#</a> 拷贝文件到本地</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">docker</span> <span class=\"token function\">cp</span> nacos:/home/nacos/conf D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">docker</span> <span class=\"token function\">cp</span> nacos:/home/nacos/data D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">docker</span> <span class=\"token function\">cp</span> nacos:/home/nacos/logs D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span></pre></td></tr></table></figure><h4 id=\"创建正式容器\"><a class=\"anchor\" href=\"#创建正式容器\">#</a> 创建正式容器</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">docker</span> run <span class=\"token parameter variable\">-d</span> <span class=\"token parameter variable\">--name</span> nacos <span class=\"token parameter variable\">--restart</span><span class=\"token operator\">=</span>always <span class=\"token parameter variable\">--network</span> my-net <span class=\"token parameter variable\">-p</span> <span class=\"token number\">8848</span>:8848 <span class=\"token parameter variable\">-p</span> <span class=\"token number\">9848</span>:9848 <span class=\"token parameter variable\">-p</span> <span class=\"token number\">9849</span>:9849 <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MODE</span><span class=\"token operator\">=</span>standalone <span class=\"token parameter variable\">--privileged</span><span class=\"token operator\">=</span>true <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">SPRING_DATASOURCE_PLATFORM</span><span class=\"token operator\">=</span>mysql <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MYSQL_SERVICE_HOST</span><span class=\"token operator\">=</span>mysql地址 <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MYSQL_SERVICE_PORT</span><span class=\"token operator\">=</span>mysql端口 <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MYSQL_SERVICE_USER</span><span class=\"token operator\">=</span>mysql用户名 <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MYSQL_SERVICE_PASSWORD</span><span class=\"token operator\">=</span>mysql密码 <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">MYSQL_SERVICE_DB_NAME</span><span class=\"token operator\">=</span>nacos <span class=\"token parameter variable\">-e</span> <span class=\"token assign-left variable\">TIME_ZONE</span><span class=\"token operator\">=</span><span class=\"token string\">'Asia/Shanghai'</span> <span class=\"token parameter variable\">-v</span> D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span>logs:/home/nacos/logs <span class=\"token parameter variable\">-v</span> D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span>data:/home/nacos/data <span class=\"token parameter variable\">-v</span> D:<span class=\"token punctuation\">\\</span>docker<span class=\"token punctuation\">\\</span>nacos<span class=\"token punctuation\">\\</span>data<span class=\"token punctuation\">\\</span>conf:/home/nacos/conf nacos/nacos-server:latest</pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"Windows",
|
||
"工具",
|
||
"docker",
|
||
"nacos"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/12/02/fastjson%E5%BA%8F%E5%88%97%E5%8C%96%E5%8E%BB%E9%99%A4%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/",
|
||
"url": "https://hitoli.com/2023/12/02/fastjson%E5%BA%8F%E5%88%97%E5%8C%96%E5%8E%BB%E9%99%A4%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/",
|
||
"title": "fastjson序列化去除空字符串属性",
|
||
"date_published": "2023-12-02T13:47:00.000Z",
|
||
"content_html": "<p>今天在把对象转为 json 时需要去除 key 或者 value 为 null 或空字符串的属性,特此记录一下后续好复用。</p>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">String</span> <span class=\"token function\">toJSONString</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Object</span> object<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre> <span class=\"token class-name\">SerializerFeature</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> serializerFeatures <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SerializerFeature</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> <span class=\"token comment\">// 格式化时间</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token class-name\">SerializerFeature<span class=\"token punctuation\">.</span>WriteDateUseDateFormat</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">toJSONString</span><span class=\"token punctuation\">(</span>object<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ValueFilter</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">Object</span> <span class=\"token function\">process</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Object</span> object<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> name<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Object</span> value<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token comment\">// 如果名称或者值为 null 或空字符串,则不序列化该属性</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>name <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> <span class=\"token punctuation\">(</span>name <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">&&</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">)</span> name<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> value <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> <span class=\"token punctuation\">(</span>value <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">String</span> <span class=\"token operator\">&&</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">)</span> value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token keyword\">return</span> value<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> serializerFeatures<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"fastjson"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/11/03/Linux%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%84%9A%E6%9C%AC/",
|
||
"url": "https://hitoli.com/2023/11/03/Linux%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%84%9A%E6%9C%AC/",
|
||
"title": "Linux下快速部署SpringBoot项目的脚本",
|
||
"date_published": "2023-11-03T13:35:00.000Z",
|
||
"content_html": "<h4 id=\"windows部署脚本\"><a class=\"anchor\" href=\"#windows部署脚本\">#</a> Windows 部署脚本</h4>\n<p>只需要把 jar 和 yml 跟脚本放在同一目录下即可快速启动。</p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,<span class=\"exturl\" data-url=\"aHR0cDovL3huLS1zdGFydC1kcTFoNzE2YXVzOGFldHcuc2g=\">然后改为 start.sh</span></p>\n</div>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token shebang important\">#!/bin/bash</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token builtin class-name\">export</span> <span class=\"token assign-left variable\">CLOUD_HOME</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\"># 获取当前目录中的第一个 JAR 文件的名称</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token assign-left variable\">jar_file</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">find</span> <span class=\"token builtin class-name\">.</span> <span class=\"token parameter variable\">-maxdepth</span> <span class=\"token number\">1</span> <span class=\"token parameter variable\">-type</span> f <span class=\"token parameter variable\">-name</span> <span class=\"token string\">\"*.jar\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">head</span> <span class=\"token parameter variable\">-n</span> <span class=\"token number\">1</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token parameter variable\">-n</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file</span>\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token assign-left variable\">jar_file</span><span class=\"token operator\">=</span><span class=\"token variable\">${jar_file<span class=\"token operator\">#</span>.<span class=\"token operator\">/</span>}</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token comment\">#echo \"JAR 文件的名称是: $jar_file\"</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token assign-left variable\">jar_file_name</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">basename</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file</span>\"</span> .jar<span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">else</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"当前目录没有JAR文件.\"</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token builtin class-name\">exit</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token keyword\">fi</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token comment\"># 获取当前目录中的第一个 yml 文件的名称</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token assign-left variable\">yml_file</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">find</span> <span class=\"token builtin class-name\">.</span> <span class=\"token parameter variable\">-maxdepth</span> <span class=\"token number\">1</span> <span class=\"token parameter variable\">-type</span> f <span class=\"token parameter variable\">-name</span> <span class=\"token string\">\"*.yml\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">head</span> <span class=\"token parameter variable\">-n</span> <span class=\"token number\">1</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre></pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token parameter variable\">-n</span> <span class=\"token string\">\"<span class=\"token variable\">$yml_file</span>\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token assign-left variable\">yml_file</span><span class=\"token operator\">=</span><span class=\"token variable\">${yml_file<span class=\"token operator\">#</span>.<span class=\"token operator\">/</span>}</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token comment\">#echo \"YML 文件的名称是: $yml_file\"</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre><span class=\"token keyword\">else</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"当前目录中没有YML文件.\"</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token keyword\">fi</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token assign-left variable\">pids</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">ps</span> <span class=\"token parameter variable\">-ef</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token function\">java</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> $jar_file_name <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-v</span> <span class=\"token function\">grep</span> <span class=\"token operator\">|</span> <span class=\"token function\">awk</span> <span class=\"token string\">'{print $2}'</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre></pre></td></tr><tr><td data-num=\"29\"></td><td><pre><span class=\"token keyword\">for</span> <span class=\"token for-or-select variable\">pid</span> <span class=\"token keyword\">in</span> <span class=\"token variable\">$pids</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">do</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file_name</span> is running, pid=\"</span><span class=\"token variable\">$pid</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> <span class=\"token builtin class-name\">exit</span> <span class=\"token number\">0</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre><span class=\"token keyword\">done</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre></pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file_name</span> is pedding...\"</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre></pre></td></tr><tr><td data-num=\"36\"></td><td><pre><span class=\"token function\">sleep</span> <span class=\"token number\">3</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre></pre></td></tr><tr><td data-num=\"38\"></td><td><pre><span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span><span class=\"token string\">\"-Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8\"</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre><span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span><span class=\"token string\">\"<span class=\"token variable\">$JAVA_OPTS</span> -Dsun.jnu.encoding=UTF8 -Xms512m -Xmx1024m\"</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre><span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span><span class=\"token string\">\"<span class=\"token variable\">$JAVA_OPTS</span> -Dpid.path=<span class=\"token variable\">$CLOUD_HOME</span>/temp -Dspring.config.additional-location=<span class=\"token variable\">$CLOUD_HOME</span>/<span class=\"token variable\">$yml_file</span>\"</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre><span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span><span class=\"token string\">\"<span class=\"token variable\">$JAVA_OPTS</span> -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007\"</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre></pre></td></tr><tr><td data-num=\"43\"></td><td><pre><span class=\"token function\">nohup</span> <span class=\"token function\">java</span> <span class=\"token variable\">$JAVA_OPTS</span> <span class=\"token parameter variable\">-jar</span> <span class=\"token variable\">$CLOUD_HOME</span>/<span class=\"token variable\">$jar_file</span> <span class=\"token operator\">></span>/dev/null <span class=\"token operator\"><span class=\"token file-descriptor important\">2</span>></span> <span class=\"token variable\">$CLOUD_HOME</span>/<span class=\"token variable\">$jar_file_name</span>.run <span class=\"token operator\">&</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre><span class=\"token comment\">#nohup java $JAVA_OPTS -jar $CLOUD_HOME/$jar_file > $CLOUD_HOME/$jar_file_name.run 2>&1 &</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre></pre></td></tr><tr><td data-num=\"46\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file_name</span> started.\"</span></pre></td></tr></table></figure><div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,<span class=\"exturl\" data-url=\"aHR0cDovL3huLS1zdG9wLXVoNWZ0MjJhOWs1YXBidS5zaA==\">然后改为 stop.sh</span></p>\n</div>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token shebang important\">#!/bin/bash</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token builtin class-name\">export</span> <span class=\"token assign-left variable\">CLOUD_HOME</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">`</span><span class=\"token builtin class-name\">pwd</span><span class=\"token variable\">`</span></span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token comment\"># 获取当前目录中的第一个 JAR 文件的名称</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token assign-left variable\">jar_file</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">find</span> <span class=\"token builtin class-name\">.</span> <span class=\"token parameter variable\">-maxdepth</span> <span class=\"token number\">1</span> <span class=\"token parameter variable\">-type</span> f <span class=\"token parameter variable\">-name</span> <span class=\"token string\">\"*.jar\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">head</span> <span class=\"token parameter variable\">-n</span> <span class=\"token number\">1</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token parameter variable\">-n</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file</span>\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token assign-left variable\">jar_file</span><span class=\"token operator\">=</span><span class=\"token variable\">${jar_file<span class=\"token operator\">#</span>.<span class=\"token operator\">/</span>}</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token comment\">#echo \"JAR 文件的名称是: $jar_file\"</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token assign-left variable\">jar_file_name</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">basename</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file</span>\"</span> .jar<span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token keyword\">else</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"当前目录没有JAR文件.\"</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token builtin class-name\">exit</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token keyword\">fi</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token comment\"># 获取当前目录中的第一个 yml 文件的名称</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token assign-left variable\">yml_file</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">find</span> <span class=\"token builtin class-name\">.</span> <span class=\"token parameter variable\">-maxdepth</span> <span class=\"token number\">1</span> <span class=\"token parameter variable\">-type</span> f <span class=\"token parameter variable\">-name</span> <span class=\"token string\">\"*.yml\"</span> <span class=\"token operator\">|</span> <span class=\"token function\">head</span> <span class=\"token parameter variable\">-n</span> <span class=\"token number\">1</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre></pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token keyword\">if</span> <span class=\"token punctuation\">[</span> <span class=\"token parameter variable\">-n</span> <span class=\"token string\">\"<span class=\"token variable\">$yml_file</span>\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">then</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token assign-left variable\">yml_file</span><span class=\"token operator\">=</span><span class=\"token variable\">${yml_file<span class=\"token operator\">#</span>.<span class=\"token operator\">/</span>}</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token comment\">#echo \"YML 文件的名称是: $yml_file\"</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre><span class=\"token keyword\">else</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"当前目录中没有YML文件.\"</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre><span class=\"token keyword\">fi</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token assign-left variable\">pids</span><span class=\"token operator\">=</span><span class=\"token variable\"><span class=\"token variable\">$(</span><span class=\"token function\">ps</span> <span class=\"token parameter variable\">-ef</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token function\">java</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> $jar_file_name <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-v</span> <span class=\"token function\">grep</span> <span class=\"token operator\">|</span> <span class=\"token function\">awk</span> <span class=\"token string\">'{print $2}'</span><span class=\"token variable\">)</span></span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre></pre></td></tr><tr><td data-num=\"29\"></td><td><pre><span class=\"token keyword\">for</span> <span class=\"token for-or-select variable\">pid</span> <span class=\"token keyword\">in</span> <span class=\"token variable\">$pids</span><span class=\"token punctuation\">;</span> <span class=\"token keyword\">do</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token function\">kill</span> <span class=\"token parameter variable\">-9</span> <span class=\"token variable\">$pid</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre><span class=\"token keyword\">done</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre></pre></td></tr><tr><td data-num=\"33\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file_name</span> is stopping...\"</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre></pre></td></tr><tr><td data-num=\"35\"></td><td><pre><span class=\"token function\">sleep</span> <span class=\"token number\">5</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre></pre></td></tr><tr><td data-num=\"37\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"<span class=\"token variable\">$jar_file_name</span> stopped.\"</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"Linux",
|
||
"工具",
|
||
"Linux",
|
||
"SpringBoot",
|
||
"快速部署",
|
||
"bash"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/29/%E7%BB%99%E6%88%91%E7%9A%84%E8%80%81%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%B8%85%E7%90%86%E7%81%B0%E5%B0%98/",
|
||
"url": "https://hitoli.com/2023/10/29/%E7%BB%99%E6%88%91%E7%9A%84%E8%80%81%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%B8%85%E7%90%86%E7%81%B0%E5%B0%98/",
|
||
"title": "给我的老笔记本清理灰尘",
|
||
"date_published": "2023-10-29T12:41:00.000Z",
|
||
"content_html": "<p>今天闲着无事就把我的老笔记本拆了,清理了一下灰尘。笔记本已经 10 多年了,中间加过内存,换过固态硬盘。清理一下还能发挥它的余热!<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/c7b84a3d703a.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/fd2e099d875d.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/0fea7641ccde.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/73c63c1438a8.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/4c5d526af3e7.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/4b9bcbecbca3.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/38ffc2e9639f.jpg\" alt=\"\" /></p>\n",
|
||
"tags": [
|
||
"生活",
|
||
"日常记录",
|
||
"笔记本",
|
||
"DELL"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/28/Windows%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%89%B9%E5%A4%84%E7%90%86/",
|
||
"url": "https://hitoli.com/2023/10/28/Windows%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%89%B9%E5%A4%84%E7%90%86/",
|
||
"title": "Windows下快速部署SpringBoot项目的批处理",
|
||
"date_published": "2023-10-28T11:56:00.000Z",
|
||
"content_html": "<h4 id=\"windows部署脚本\"><a class=\"anchor\" href=\"#windows部署脚本\">#</a> Windows 部署脚本</h4>\n<p>只需要把 jar 和 yml 跟批处理放在同一目录下即可点击快速启动。启动后再次点击会关闭上次启动的窗口并重新启动。</p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,然后改为 start.bat</p>\n</div>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>@ECHO OFF</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>setlocal enabledelayedexpansion</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>REM 关闭上次进程</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>SET <span class=\"token string\">\"pidFile=pid.txt\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">if</span> exist <span class=\"token string\">\"%pidFile%\"</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>\t<span class=\"token keyword\">for</span> /f <span class=\"token string\">\"usebackq\"</span> %%a <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"pid.txt\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>\t\t<span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">PID</span><span class=\"token operator\">=</span>%%a</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>\t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>\t<span class=\"token keyword\">if</span> not <span class=\"token string\">\"!PID!\"</span><span class=\"token operator\">==</span><span class=\"token string\">\"\"</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>\t\ttaskkill /F /T /PID <span class=\"token operator\">!</span>pid<span class=\"token operator\">!</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>\t\tdel pid.txt</pre></td></tr><tr><td data-num=\"13\"></td><td><pre>\t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>REM 存储当前进程</pre></td></tr><tr><td data-num=\"17\"></td><td><pre><span class=\"token keyword\">for</span> /f %%i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'wmic process where \"name='</span>cmd.exe<span class=\"token string\">' and CommandLine like '</span>%%<span class=\"token operator\"><</span>scriptname<span class=\"token operator\">></span>.bat%%<span class=\"token string\">'\" get ParentProcessId ^| findstr /r \"[0-9]\"'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">pid</span><span class=\"token operator\">=</span>%%i</pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token builtin class-name\">echo</span> %PID% <span class=\"token operator\">></span> pid.txt</pre></td></tr><tr><td data-num=\"19\"></td><td><pre></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>REM 设置title</pre></td></tr><tr><td data-num=\"21\"></td><td><pre><span class=\"token keyword\">for</span> /f <span class=\"token string\">\"tokens=2\"</span> %%i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'chcp'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">codepage</span><span class=\"token operator\">=</span>%%i</pre></td></tr><tr><td data-num=\"22\"></td><td><pre>chcp <span class=\"token number\">65001</span> <span class=\"token operator\">></span> nul</pre></td></tr><tr><td data-num=\"23\"></td><td><pre>title 我的SpringBoot项目</pre></td></tr><tr><td data-num=\"24\"></td><td><pre>chcp %codepage% <span class=\"token operator\">></span> nul</pre></td></tr><tr><td data-num=\"25\"></td><td><pre></pre></td></tr><tr><td data-num=\"26\"></td><td><pre><span class=\"token builtin class-name\">cd</span> %~dp0</pre></td></tr><tr><td data-num=\"27\"></td><td><pre></pre></td></tr><tr><td data-num=\"28\"></td><td><pre>REM 获取jar</pre></td></tr><tr><td data-num=\"29\"></td><td><pre><span class=\"token builtin class-name\">set</span> <span class=\"token string\">\"jarFile=\"</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre><span class=\"token keyword\">for</span> %%i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span>*.jar<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> <span class=\"token keyword\">if</span> not defined jarFile <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre> <span class=\"token builtin class-name\">set</span> <span class=\"token string\">\"jarFile=%%i\"</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre> <span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre></pre></td></tr><tr><td data-num=\"36\"></td><td><pre><span class=\"token keyword\">if</span> not defined jarFile <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre> <span class=\"token builtin class-name\">echo</span> not <span class=\"token function\">find</span> jar</pre></td></tr><tr><td data-num=\"38\"></td><td><pre> pause</pre></td></tr><tr><td data-num=\"39\"></td><td><pre> <span class=\"token builtin class-name\">exit</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre></pre></td></tr><tr><td data-num=\"42\"></td><td><pre>SET <span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span>-Djava.security.egd<span class=\"token operator\">=</span>file:/dev/./urandom <span class=\"token parameter variable\">-Dfile.encoding</span><span class=\"token operator\">=</span>UTF-8</pre></td></tr><tr><td data-num=\"43\"></td><td><pre><span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span>%JAVA_OPTS% <span class=\"token parameter variable\">-Dsun.jnu.encoding</span><span class=\"token operator\">=</span>UTF8 <span class=\"token parameter variable\">-Xms512m</span> <span class=\"token parameter variable\">-Xmx1024m</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre><span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span>%JAVA_OPTS% <span class=\"token parameter variable\">-agentlib:jdwp</span><span class=\"token operator\">=</span>transport<span class=\"token operator\">=</span>dt_socket,server<span class=\"token operator\">=</span>y,suspend<span class=\"token operator\">=</span>n,address<span class=\"token operator\">=</span><span class=\"token number\">5007</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre><span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span>%JAVA_OPTS% <span class=\"token parameter variable\">-Dpid.path</span><span class=\"token operator\">=</span>./temp</pre></td></tr><tr><td data-num=\"46\"></td><td><pre></pre></td></tr><tr><td data-num=\"47\"></td><td><pre>REM 获取yml</pre></td></tr><tr><td data-num=\"48\"></td><td><pre><span class=\"token builtin class-name\">set</span> <span class=\"token string\">\"ymlFile=\"</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre><span class=\"token keyword\">for</span> %%i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span>*.yml<span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre> <span class=\"token keyword\">if</span> not defined ymlFile <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre> <span class=\"token builtin class-name\">set</span> <span class=\"token string\">\"ymlFile=%%i\"</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre> <span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre></pre></td></tr><tr><td data-num=\"55\"></td><td><pre><span class=\"token keyword\">if</span> defined ymlFile <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre>\t<span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">JAVA_OPTS</span><span class=\"token operator\">=</span>%JAVA_OPTS% -Dspring.config.additional-location<span class=\"token operator\">=</span><span class=\"token operator\">!</span>ymlFile<span class=\"token operator\">!</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre><span class=\"token punctuation\">)</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre>\t<span class=\"token builtin class-name\">echo</span> not <span class=\"token function\">find</span> yml</pre></td></tr><tr><td data-num=\"59\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre></pre></td></tr><tr><td data-num=\"61\"></td><td><pre>REM 启动服务</pre></td></tr><tr><td data-num=\"62\"></td><td><pre><span class=\"token function\">java</span> %JAVA_OPTS% <span class=\"token parameter variable\">-jar</span> <span class=\"token operator\">!</span>jarFile<span class=\"token operator\">!</span></pre></td></tr><tr><td data-num=\"63\"></td><td><pre>pause</pre></td></tr></table></figure><div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,然后改为 stop.bat</p>\n</div>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>@ECHO OFF</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>setlocal enabledelayedexpansion</pre></td></tr><tr><td data-num=\"3\"></td><td><pre></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>REM 关闭上次进程</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>SET <span class=\"token string\">\"pidFile=pid.txt\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token keyword\">if</span> exist <span class=\"token string\">\"%pidFile%\"</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>\t<span class=\"token keyword\">for</span> /f <span class=\"token string\">\"usebackq\"</span> %%a <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"pid.txt\"</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>\t\t<span class=\"token builtin class-name\">set</span> <span class=\"token assign-left variable\">PID</span><span class=\"token operator\">=</span>%%a</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>\t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>\t<span class=\"token keyword\">if</span> not <span class=\"token string\">\"!PID!\"</span><span class=\"token operator\">==</span><span class=\"token string\">\"\"</span> <span class=\"token punctuation\">(</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>\t\ttaskkill /F /T /PID <span class=\"token operator\">!</span>pid<span class=\"token operator\">!</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>\t\tdel pid.txt</pre></td></tr><tr><td data-num=\"13\"></td><td><pre>\t<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre></pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token builtin class-name\">exit</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"Windows",
|
||
"工具",
|
||
"SpringBoot",
|
||
"快速部署",
|
||
"Bat",
|
||
"批处理"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/28/Centos%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/",
|
||
"url": "https://hitoli.com/2023/10/28/Centos%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/",
|
||
"title": "Centos挂载新硬盘",
|
||
"date_published": "2023-10-28T11:26:00.000Z",
|
||
"content_html": "<h4 id=\"查看磁盘信息\"><a class=\"anchor\" href=\"#查看磁盘信息\">#</a> 查看磁盘信息</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">fdisk</span> <span class=\"token parameter variable\">-l</span> 查看当前磁盘的分区情况</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/4dc953fc5a5e.png\" alt=\"\" /><br />\n可从图中获取以下信息:<br />\n/dev/vdb 数据盘容量为 60GB,包含 MBR 分区 /dev/vdb1,容量为 50GB。<br />\n/dev/vdc 数据盘容量为 60GB,包含 GPT 分区 /dev/vdc1,容量为 50GB。</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">df</span> <span class=\"token parameter variable\">-TH</span> 分区的文件系统类型</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/8996c9620632.png\" alt=\"\" /><br />\n可从图中获取以下信息:<br />\n/dev/vdb1 文件系统类型为 ext4,已挂载至 /mnt/disk1。<br />\n/dev/vdc1 文件系统类型为 xfs,已挂载至 /mnt/disk2。</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">fdisk</span> /dev/vdb 查看新磁盘情况</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/0f1237aef57b.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>lsbl 查看分区情况</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/8071a3832e29.png\" alt=\"\" /></p>\n<h4 id=\"挂载新硬盘\"><a class=\"anchor\" href=\"#挂载新硬盘\">#</a> 挂载新硬盘</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>mkfs.ext4 /dev/vdb 格式化磁盘</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/9353dd85579f.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">cd</span> /mnt</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">mkdir</span> data 新建挂载点</pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token function\">mount</span> /dev/vdb /mnt/data 挂载</pre></td></tr></table></figure><figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">df</span> <span class=\"token parameter variable\">-h</span> 查看挂载情况</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/ead4f7b1323f.png\" alt=\"\" /><br />\n查看 UUID 有三种方式:</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>blkid</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/236412bc1e3f.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>lsblk <span class=\"token parameter variable\">-f</span></pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/35d7182c5647.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>ll /dev/disk/by-uuid/</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/3f9d4f69d8ea.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>设置自动挂载:</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token builtin class-name\">echo</span> <span class=\"token string\">\"UUID=c8ac09ca-fd4d-4511-bd2c-4fdf96f08168 /data ext4 defaults 0 0\"</span> <span class=\"token operator\">>></span> /etc/fstab</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>自动挂载/etc/fstab里面的东西</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token function\">mount</span> <span class=\"token parameter variable\">-a</span></pre></td></tr></table></figure><h4 id=\"临时卸载\"><a class=\"anchor\" href=\"#临时卸载\">#</a> 临时卸载</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">umount</span> /dev/vdb 重启机器之后又恢复到挂载状态</pre></td></tr></table></figure><h4 id=\"永久卸载\"><a class=\"anchor\" href=\"#永久卸载\">#</a> 永久卸载</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">vim</span> /etc/fstab 把添加的磁盘信息删除即可。</pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"Linux",
|
||
"Centos",
|
||
"Centos",
|
||
"Linux",
|
||
"Mount"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/09/09/squid-stunnel-%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/",
|
||
"url": "https://hitoli.com/2023/09/09/squid-stunnel-%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/",
|
||
"title": "squid+stunnel 科学上网",
|
||
"date_published": "2023-09-09T08:48:00.000Z",
|
||
"content_html": "<h4 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h4>\n<p>科学上网的方法有多种,有很多第三方提供的免费方案,这些方案优缺点暂时不予讨论。实际工作生活中还是会有需要自己搭建的情况,这次介绍的是使用 squid+stunnel 方案进行搭建。</p>\n<h4 id=\"准备\"><a class=\"anchor\" href=\"#准备\">#</a> 准备</h4>\n<p>一台可以访问外网的服务器,如香港的云主机并安装 Ubuntu 系统。</p>\n<h5 id=\"squid部分\"><a class=\"anchor\" href=\"#squid部分\">#</a> squid 部分</h5>\n<ul>\n<li>1、安装</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">apt-get</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-y</span> squid</pre></td></tr></table></figure><ul>\n<li>2、配置</li>\n</ul>\n<div class=\"note info\">\n<p>生成用户文件</p>\n</div>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">apt-get</span> <span class=\"token function\">install</span> apache2-utils</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>htpasswd <span class=\"token parameter variable\">-c</span> /etc/squid/squid_user.txt 用户名</pre></td></tr></table></figure><div class=\"note info\">\n<p>修改 squid 配置<br />\n 1、直接修改 /etc/squid/squid.conf 文件<br />\n 2、修改 /etc/squid/conf.d/debian.conf 文件<br />\n两种方式都一样,在底部加入以下代码</p>\n</div>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#dns 服务器地址</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>dns_nameservers 8.8.8.8 8.8.4.4</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>dns_v4_first on</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token comment\"># 监听端口</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>http_port 3128</pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\"># 定义 squid 密码文件与 ncsa_auth 文件位置</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid_user.txt</pre></td></tr><tr><td data-num=\"8\"></td><td><pre><span class=\"token comment\"># 认证进程的数量</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>auth_param basic children 15</pre></td></tr><tr><td data-num=\"10\"></td><td><pre><span class=\"token comment\"># 认证对话框显示提示信息</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>auth_param basic realm Squid proxy<span class=\"token punctuation\">-</span>caching web server</pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token comment\"># 认证有效期</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre>auth_param basic credentialsttl 24 hours</pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token comment\"># 是否区分用户名大小,off 为不区分</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre>auth_param basic casesensitive off</pre></td></tr><tr><td data-num=\"16\"></td><td><pre><span class=\"token comment\"># 对定义的 squid_user 文件内的用户开启认证访问</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>acl 用户名 proxy_auth REQUIRED</pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token comment\"># 允许 squid_user 文件内用户进行代理</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>http_access allow 用户名</pre></td></tr><tr><td data-num=\"20\"></td><td><pre><span class=\"token comment\"># 顺序匹配,最后添加拒绝所有未允许的规则。不添加会发现,未匹配到的规则会被放行</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre>http_access deny all</pre></td></tr><tr><td data-num=\"22\"></td><td><pre><span class=\"token comment\"># 缓存设置</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>cache_dir ufs /var/spool/squid 100 16 256 read<span class=\"token punctuation\">-</span>only</pre></td></tr><tr><td data-num=\"24\"></td><td><pre>cache_mem 0 MB</pre></td></tr><tr><td data-num=\"25\"></td><td><pre>coredump_dir /var/spool/squid</pre></td></tr><tr><td data-num=\"26\"></td><td><pre><span class=\"token comment\"># 配置高匿,不允许设置任何多余头信息,保持原请求 header。</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre>header_access Via deny all</pre></td></tr><tr><td data-num=\"28\"></td><td><pre>header_access X<span class=\"token punctuation\">-</span>Forwarded<span class=\"token punctuation\">-</span>For deny all</pre></td></tr><tr><td data-num=\"29\"></td><td><pre>header_access Server deny all</pre></td></tr><tr><td data-num=\"30\"></td><td><pre>header_access X<span class=\"token punctuation\">-</span>Cache deny all</pre></td></tr><tr><td data-num=\"31\"></td><td><pre>header_access X<span class=\"token punctuation\">-</span>Cache<span class=\"token punctuation\">-</span>Lookup deny all</pre></td></tr><tr><td data-num=\"32\"></td><td><pre>forwarded_for off</pre></td></tr><tr><td data-num=\"33\"></td><td><pre>via off</pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token comment\"># logs 相关配置</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre>emulate_httpd_log on</pre></td></tr><tr><td data-num=\"36\"></td><td><pre>logformat squid %<span class=\"token punctuation\">{</span>X<span class=\"token punctuation\">-</span>Forwarded<span class=\"token punctuation\">-</span>For<span class=\"token punctuation\">}</span><span class=\"token punctuation\">></span>h %ui %un <span class=\"token punctuation\">[</span>%tl<span class=\"token punctuation\">]</span> \"%rm %ru HTTP/%rv\" %Hs %<st \"%<span class=\"token punctuation\">{</span>Referer<span class=\"token punctuation\">}</span><span class=\"token punctuation\">></span>h\" \"%<span class=\"token punctuation\">{</span>User<span class=\"token punctuation\">-</span>Agent<span class=\"token punctuation\">}</span><span class=\"token punctuation\">></span>h\" %Ss<span class=\"token punctuation\">:</span>%Sh</pre></td></tr><tr><td data-num=\"37\"></td><td><pre>access_log /var/log/squid/access.log squid</pre></td></tr><tr><td data-num=\"38\"></td><td><pre>cache_log /var/log/squid/cache.log</pre></td></tr><tr><td data-num=\"39\"></td><td><pre>cache_store_log /var/log/squid/store.log</pre></td></tr><tr><td data-num=\"40\"></td><td><pre>logfile_rotate 20</pre></td></tr></table></figure><div class=\"note primary\">\n<p>至次已经可以通过填写安装 squid 的服务器 ip 加端口 3128 加用户名密码进行代理访问了(通过访问<span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuaXAuY24v\"> https://www.ip.cn/</span></span> 查看 ip 就会发现自己的出口 ip 已经变成了 squid 服务器的 ip 了)。但是要想科学上网还必须对代理的数据进行加密,否则访问外网还是会被我国的长城防火墙阻挡,所以还需要安装 stunnel 来实现此目的。</p>\n</div>\n<h5 id=\"stunnel服务端部分\"><a class=\"anchor\" href=\"#stunnel服务端部分\">#</a> stunnel 服务端部分</h5>\n<ul>\n<li>1、安装(和 squid 装在一起)</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">apt-get</span> <span class=\"token function\">install</span> <span class=\"token parameter variable\">-y</span> stunnel</pre></td></tr></table></figure><ul>\n<li>2、生成 TLS/SSL 证书</li>\n</ul>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>openssl req <span class=\"token parameter variable\">-new</span> <span class=\"token parameter variable\">-x509</span> <span class=\"token parameter variable\">-days</span> <span class=\"token number\">3650</span> <span class=\"token parameter variable\">-nodes</span> <span class=\"token parameter variable\">-out</span> stunnel.pem <span class=\"token parameter variable\">-keyout</span> stunnel.pem</pre></td></tr></table></figure><ul>\n<li>\n<p>3、将证书 stunnel.pem 放到 /etc/stunnel/ 目录下</p>\n</li>\n<li>\n<p>4、修改 stunnel 配置 (/etc/stunnle/stunnle.conf)</p>\n</li>\n</ul>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>; 设置stunnel的pid文件路径</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>pid = /etc/stunnel/stunnel.pid</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>; 设置stunnel工作的用户(组)</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>setuid = root</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>setgid = root</pre></td></tr><tr><td data-num=\"6\"></td><td><pre></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>; 开启日志等级:emerg (0)<span class=\"token punctuation\">,</span> alert (1)<span class=\"token punctuation\">,</span> crit (2)<span class=\"token punctuation\">,</span> err (3)<span class=\"token punctuation\">,</span> warning (4)<span class=\"token punctuation\">,</span> notice (5)<span class=\"token punctuation\">,</span> info (6)<span class=\"token punctuation\">,</span> or debug (7)</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>debug = 7</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>; 日志文件路径</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>output = /etc/stunnel/stunnel.log</pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>; 证书文件</pre></td></tr><tr><td data-num=\"13\"></td><td><pre>cert = /etc/stunnel/stunnel.pem</pre></td></tr><tr><td data-num=\"14\"></td><td><pre>; 私钥文件</pre></td></tr><tr><td data-num=\"15\"></td><td><pre>key = /etc/stunnel/stunnel.pem</pre></td></tr><tr><td data-num=\"16\"></td><td><pre></pre></td></tr><tr><td data-num=\"17\"></td><td><pre>; 自定义服务名squid<span class=\"token punctuation\">-</span>proxy</pre></td></tr><tr><td data-num=\"18\"></td><td><pre><span class=\"token punctuation\">[</span>squid<span class=\"token punctuation\">-</span>proxy<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre>; 服务监听的端口,client要连接这个端口与server通信</pre></td></tr><tr><td data-num=\"20\"></td><td><pre>accept = 1234(自定义)</pre></td></tr><tr><td data-num=\"21\"></td><td><pre>; 服务要连接的端口,连接到squid的3128端口,将数据发给squid</pre></td></tr><tr><td data-num=\"22\"></td><td><pre>connect = 3128</pre></td></tr></table></figure><h5 id=\"stunnel客户端部分\"><a class=\"anchor\" href=\"#stunnel客户端部分\">#</a> stunnel 客户端部分</h5>\n<div class=\"note info\">\n<p>可以安装在要代理的机器上,在需要代理的情况下再开启(代理地址填 127.0.0.1 加客户端监听端口)。也可以安装在国内的服务器上一直保持连接(代理信息填国内服务器 ip 加客户端监听端口)。本示例客户端为 windows 系统</p>\n</div>\n<ul>\n<li>1、下载地址</li>\n</ul>\n<p><span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuc3R1bm5lbC5vcmcvZG93bmxvYWRzLmh0bWw=\">https://www.stunnel.org/downloads.html</span></span></p>\n<ul>\n<li>2、修改配置(C:\\Program Files (x86)\\stunnel\\config\\stunnel.conf)</li>\n</ul>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token punctuation\">[</span>squid<span class=\"token punctuation\">-</span>proxy<span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>client = yes</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>; 监听3128端口,那么用户浏览器的代理设置就是 stunnel<span class=\"token punctuation\">-</span>client<span class=\"token punctuation\">-</span>ip<span class=\"token punctuation\">:</span><span class=\"token number\">3128</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>accept = 3128</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>; 要连接到的stunnel server的ip与端口</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>connect = stunnel服务端ip<span class=\"token punctuation\">:</span>1234(服务端自定义端口)</pre></td></tr><tr><td data-num=\"7\"></td><td><pre></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>; 需要验证对方发过来的证书</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>verify = 2</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>; 用来进行证书验证的文件(stunnel服务端生成的证书复制到以下目录并改名为stunnel<span class=\"token punctuation\">-</span>server.pem)</pre></td></tr><tr><td data-num=\"11\"></td><td><pre>CAfile = C<span class=\"token punctuation\">:</span>\\Program Files (x86)\\stunnel\\config\\stunnel<span class=\"token punctuation\">-</span>server.pem</pre></td></tr></table></figure><div class=\"note primary\">\n<p>至次配置好代理 ip 为 stunnel 客户端 ip 加端口 3128 就可以正式科学上网了。如果只想对需要科学的 url 进行代理,可以通过安装 Proxy SwitchyOmega 插件实现(规则地址可通过<span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2dmd2xpc3QvZ2Z3bGlzdA==\"> https://github.com/gfwlist/gfwlist</span></span> 获取)。</p>\n</div>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2023/09/09/6a38fcb32752.png\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/09/09/72892168bfeb.png\" alt=\"\" /></p>\n",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"squid",
|
||
"stunnel",
|
||
"科学上网",
|
||
"代理"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/09/09/Windows-11%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E6%81%A2%E5%A4%8D%E8%80%81%E7%89%88%E6%9C%AC/",
|
||
"url": "https://hitoli.com/2023/09/09/Windows-11%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E6%81%A2%E5%A4%8D%E8%80%81%E7%89%88%E6%9C%AC/",
|
||
"title": "Windows 11右键菜单恢复老版本",
|
||
"date_published": "2023-09-09T08:38:00.000Z",
|
||
"content_html": "<h4 id=\"恢复方法\"><a class=\"anchor\" href=\"#恢复方法\">#</a> 恢复方法</h4>\n<p>1、按【Win+X】</p>\n<p>2、选择【终端管理员】</p>\n<p>3、输入以下命令并回车:<br />\n <code>reg add "HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32" /f /ve</code></p>\n<p>4、重启电脑</p>\n",
|
||
"tags": [
|
||
"Windows",
|
||
"系统优化",
|
||
"Windows 11"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/07/08/%E8%A7%A3%E5%86%B3Lombok%E6%8A%A5%E9%94%99/",
|
||
"url": "https://hitoli.com/2023/07/08/%E8%A7%A3%E5%86%B3Lombok%E6%8A%A5%E9%94%99/",
|
||
"title": "解决Lombok报错",
|
||
"date_published": "2023-07-08T02:51:00.000Z",
|
||
"content_html": "<h4 id=\"问题描述\"><a class=\"anchor\" href=\"#问题描述\">#</a> 问题描述</h4>\n<ol>\n<li>报错详情</li>\n</ol>\n<div class=\"note info\">\n<p>java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled.<br />\nYour processor is: com.sun.proxy.$Proxy26<br />\nLombok supports: OpenJDK javac, ECJ</p>\n</div>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2023/07/08/393a238856e4.png\" alt=\"\" /></p>\n<ol start=\"2\">\n<li>\n<p>问题分析<br />\n属于 lombok 编译不通过,原因可能是因为依赖没有更到最新版本</p>\n</li>\n<li>\n<p>解决办法<br />\n在 IntelliJ IDEA 的全局配置 Compiler 中添加如下配置:</p>\n</li>\n</ol>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token punctuation\">-</span>Djps.track.ap.dependencies=false</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/07/08/34bac08a5d10.png\" alt=\"\" /></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Lombok",
|
||
"IntelliJ",
|
||
"IDEA"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/07/01/shoka%E4%B8%BB%E9%A2%98%E9%80%9F%E5%BA%A6%E4%BC%98%E5%8C%96-%E6%8B%86%E5%88%86jsdelivr/",
|
||
"url": "https://hitoli.com/2023/07/01/shoka%E4%B8%BB%E9%A2%98%E9%80%9F%E5%BA%A6%E4%BC%98%E5%8C%96-%E6%8B%86%E5%88%86jsdelivr/",
|
||
"title": "shoka主题速度优化-拆分jsdelivr",
|
||
"date_published": "2023-06-30T17:15:00.000Z",
|
||
"content_html": "<h4 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h4>\n<div class=\"note primary\">\n<p>该篇文章介绍了如何对 shoka 主题进行 jsdelivr 聚合拆分,以便使用国内镜像源和异步加载,从而优化网站速度。具体操作包括更改模板、注册 helper 和更改配置。其中,推荐使用 advVendors 配置,可自定义加载源和 js 文件名,同时支持异步加载、pjax 刷新和 integrity 防 XXS 等特性。</p>\n</div>\n<p>众所周知,jsdelivr 在国内的速度可以用慢的一批来形容而 shoka 主题使用了 jsdelivr 的 combine 功能加载第三方 js, 而 combine 在国内没有镜像源并且阻断了使用 CDN 并发加速的道路,本篇博文会将 jsdelivr 聚合拆分为几个独立的 js, 以便使用国内镜像源和异步加载。</p>\n<div class=\"note info\">\n<p>此方案相较于本地化而言有较大速度优势,尤其在 CDN 并发加持下</p>\n</div>\n<h4 id=\"拆分-jsdelivr\"><a class=\"anchor\" href=\"#拆分-jsdelivr\">#</a> 拆分 jsdelivr</h4>\n<ol>\n<li>更改模板</li>\n</ol>\n<p>打开 <span class=\"red\">shoka\\layout_partials\\layout.njk</span>,找到第 144 行左右:</p>\n<figure class=\"highlight html\"><figcaption data-lang=\"HTML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\"><</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://cdn.polyfill.io/v3/polyfill.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\"></</span>script</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>{{ _vendor_js() }}</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>{{ _js('app.js') }}</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>{{ partial('_partials/third-party/baidu-analytics.njk', {}, {cache: true}) }}</pre></td></tr></table></figure><p>更改为如下内容:</p>\n<figure class=\"highlight html\"><figcaption data-lang=\"HTML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\"><</span>script</span> <span class=\"token attr-name\">src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://cdn.polyfill.io/v3/polyfill.js<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\"></</span>script</span><span class=\"token punctuation\">></span></span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>{%- if theme.advVendors.enable %}</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\t{% for i in _list_vendor_js() %}</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>\t\t{{ _adv_vendor_js(i) }}</pre></td></tr><tr><td data-num=\"5\"></td><td><pre>\t{% endfor %}</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>{%- else %}</pre></td></tr><tr><td data-num=\"7\"></td><td><pre>{{ _vendor_js() }}</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>{%- endif %}</pre></td></tr><tr><td data-num=\"9\"></td><td><pre>{{ _js('app.js')}}</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>{{ partial('_partials/third-party/baidu-analytics.njk', {}, {cache: true}) }}</pre></td></tr></table></figure><ol start=\"2\">\n<li>注册 helper</li>\n</ol>\n<p>打开 <span class=\"red\">shoka\\scripts\\helpers\\asset.js</span>, 最后一行新建空行,增加如下内容:</p>\n<figure class=\"highlight javascript\"><figcaption data-lang=\"javascript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>hexo<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">.</span>helper<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">'_list_vendor_js'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre> <span class=\"token keyword\">return</span> hexo<span class=\"token punctuation\">.</span>theme<span class=\"token punctuation\">.</span>config<span class=\"token punctuation\">.</span>vendorsList<span class=\"token punctuation\">.</span>js<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>hexo<span class=\"token punctuation\">.</span>extend<span class=\"token punctuation\">.</span>helper<span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">'_adv_vendor_js'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">js_name</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token keyword\">const</span> config <span class=\"token operator\">=</span> hexo<span class=\"token punctuation\">.</span>theme<span class=\"token punctuation\">.</span>config<span class=\"token punctuation\">.</span>advVendors<span class=\"token punctuation\">.</span>js<span class=\"token punctuation\">[</span>js_name<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token keyword\">const</span> src <span class=\"token operator\">=</span> config<span class=\"token punctuation\">[</span><span class=\"token string\">\"src\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token keyword\">let</span> result<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>src<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"http\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> result <span class=\"token operator\">=</span> src<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>src<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"combine\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"The combine feature is not recommended!\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> result <span class=\"token operator\">=</span> hexo<span class=\"token punctuation\">.</span>theme<span class=\"token punctuation\">.</span>config<span class=\"token punctuation\">.</span>advVendors<span class=\"token punctuation\">.</span>combine <span class=\"token operator\">+</span> src<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>src<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"npm\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> result <span class=\"token operator\">=</span> hexo<span class=\"token punctuation\">.</span>theme<span class=\"token punctuation\">.</span>config<span class=\"token punctuation\">.</span>advVendors<span class=\"token punctuation\">.</span>npm <span class=\"token operator\">+</span> src<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>src<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"gh\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!==</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> result <span class=\"token operator\">=</span> hexo<span class=\"token punctuation\">.</span>theme<span class=\"token punctuation\">.</span>config<span class=\"token punctuation\">.</span>advVendors<span class=\"token punctuation\">.</span>github <span class=\"token operator\">+</span> src<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre> result <span class=\"token operator\">=</span> <span class=\"token string\">\"/\"</span> <span class=\"token operator\">+</span> src<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token keyword\">let</span> attr <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">src</span><span class=\"token operator\">:</span> result<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">[</span><span class=\"token string\">\"async\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> attr<span class=\"token punctuation\">[</span><span class=\"token string\">\"async\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"async\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">[</span><span class=\"token string\">\"data-pjax\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> attr<span class=\"token punctuation\">[</span><span class=\"token string\">\"data-pjax\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"data-pjax\"</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">[</span><span class=\"token string\">\"hash-value\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> attr<span class=\"token punctuation\">[</span><span class=\"token string\">\"integrity\"</span><span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>config<span class=\"token punctuation\">[</span><span class=\"token string\">\"hash-value\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">[</span><span class=\"token string\">\"deferLoad\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token function\">htmlTag</span><span class=\"token punctuation\">(</span><span class=\"token string\">'script'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token string-property property\">\"data-pjax\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\"></pre></td></tr><tr><td data-num=\"27\"></td><td><pre> const script=document.createElement(\"script\");script.src=\"</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>result<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">\",script.async=true,document.body.appendChild(script)</pre></td></tr><tr><td data-num=\"28\"></td><td><pre> </span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token function\">htmlTag</span><span class=\"token punctuation\">(</span><span class=\"token string\">'script'</span><span class=\"token punctuation\">,</span> attr<span class=\"token punctuation\">,</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure><ol start=\"3\">\n<li>更改配置</li>\n</ol>\n<p>在 shoka 目录下 <span class=\"red\">_config.yml</span> 增加如下内容:</p>\n<div class=\"note info\">\n<p>推荐内容,可根据自己情况更改</p>\n</div>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token key atrule\">advVendors</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre> <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> <span class=\"token key atrule\">github</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"https://cdn.jsdelivr.net/gh/\"</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token key atrule\">combine</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"https://cdn.jsdelivr.net/\"</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token key atrule\">npm</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"https://unpkg.com/\"</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token key atrule\">js</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token key atrule\">pace</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/pace/1.0.2/pace.min.js</pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token key atrule\">pjax</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lib.baomitu.com/pjax/0.2.8/pjax.min.js</pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token key atrule\">fetch</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> npm/whatwg<span class=\"token punctuation\">-</span>fetch@3.4.0/dist/fetch.umd.js</pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token key atrule\">anime</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/animejs/3.2.0/anime.min.js</pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token key atrule\">algolia</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/algoliasearch/4.12.1/algoliasearch<span class=\"token punctuation\">-</span>lite.umd.min.js</pre></td></tr><tr><td data-num=\"17\"></td><td><pre> <span class=\"token key atrule\">instantsearch</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/instantsearch.js/4.39.0/instantsearch.production.min.js</pre></td></tr><tr><td data-num=\"19\"></td><td><pre> <span class=\"token key atrule\">lazyload</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/lozad.js/1.16.0/lozad.min.js</pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token key atrule\">quicklink</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/quicklink/2.2.0/quicklink.umd.min.js</pre></td></tr><tr><td data-num=\"23\"></td><td><pre> <span class=\"token key atrule\">fancybox</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf26<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/<span class=\"token punctuation\">?</span><span class=\"token punctuation\">?</span>jquery/3.5.1/jquery.min.js<span class=\"token punctuation\">,</span>fancybox/3.5.7/jquery.fancybox.min.js<span class=\"token punctuation\">,</span>justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js</pre></td></tr><tr><td data-num=\"25\"></td><td><pre> <span class=\"token key atrule\">async</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token key atrule\">valine</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> gh/amehime/MiniValine@4.2.2<span class=\"token punctuation\">-</span>beta10/dist/MiniValine.min.js</pre></td></tr><tr><td data-num=\"28\"></td><td><pre> <span class=\"token key atrule\">copy_tex</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//lf9<span class=\"token punctuation\">-</span>cdn<span class=\"token punctuation\">-</span>tos.bytecdntp.com/cdn/expire<span class=\"token punctuation\">-</span>1<span class=\"token punctuation\">-</span>M/KaTeX/0.12.0/contrib/copy<span class=\"token punctuation\">-</span>tex.min.js</pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token key atrule\">async</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> <span class=\"token key atrule\">chart</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre> <span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> npm/frappe<span class=\"token punctuation\">-</span>charts@1.5.0/dist/frappe<span class=\"token punctuation\">-</span>charts.min.iife.js</pre></td></tr><tr><td data-num=\"33\"></td><td><pre></pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token key atrule\">vendorsList</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre> <span class=\"token key atrule\">js</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre> <span class=\"token punctuation\">-</span> pace</pre></td></tr><tr><td data-num=\"37\"></td><td><pre> <span class=\"token punctuation\">-</span> pjax</pre></td></tr><tr><td data-num=\"38\"></td><td><pre> <span class=\"token punctuation\">-</span> fetch</pre></td></tr><tr><td data-num=\"39\"></td><td><pre> <span class=\"token punctuation\">-</span> anime</pre></td></tr><tr><td data-num=\"40\"></td><td><pre> <span class=\"token punctuation\">-</span> algolia</pre></td></tr><tr><td data-num=\"41\"></td><td><pre> <span class=\"token punctuation\">-</span> instantsearch</pre></td></tr><tr><td data-num=\"42\"></td><td><pre> <span class=\"token punctuation\">-</span> lazyload</pre></td></tr><tr><td data-num=\"43\"></td><td><pre> <span class=\"token punctuation\">-</span> quicklink</pre></td></tr><tr><td data-num=\"44\"></td><td><pre> <span class=\"token punctuation\">-</span> fancybox</pre></td></tr><tr><td data-num=\"45\"></td><td><pre> <span class=\"token punctuation\">-</span> valine</pre></td></tr><tr><td data-num=\"46\"></td><td><pre> <span class=\"token punctuation\">-</span> copy_tex</pre></td></tr><tr><td data-num=\"47\"></td><td><pre> <span class=\"token punctuation\">-</span> chart</pre></td></tr></table></figure><p>下面为结构详解:</p>\n<figure class=\"highlight yaml\"><figcaption data-lang=\"YAML\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token key atrule\">advVendors</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\t<span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span> <span class=\"token comment\">#是否开启,关闭使用主题默认加载</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\t<span class=\"token key atrule\">github</span><span class=\"token punctuation\">:</span> <span class=\"token comment\">#github 使用的加载源,需要协议头和末尾斜杠</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>\t<span class=\"token key atrule\">combine</span><span class=\"token punctuation\">:</span> <span class=\"token comment\">#聚合 js 使用的加载源 (不建议使用)</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>\t<span class=\"token key atrule\">npm</span><span class=\"token punctuation\">:</span> <span class=\"token comment\">#npm 的加载源</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre>\t<span class=\"token key atrule\">js</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>\t\t<span class=\"token key atrule\">jspackage</span><span class=\"token punctuation\">:</span> <span class=\"token comment\">#js 名,可以与文件名不一致</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>\t\t\t<span class=\"token key atrule\">src</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"资源地址,详情见后面\"</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>\t\t\t<span class=\"token comment\"># async: true 异步加载此 js</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>\t\t\t<span class=\"token comment\"># data-pjax: true 在 pjax 加载时刷新此 js</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre>\t\t\t<span class=\"token comment\"># hash-value: 这个资源的 integrity 值,用于防 XXS</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre>\t\t\t<span class=\"token comment\"># deferLoad: true 使用动态 DOM 节点添加延迟 js 加载 (实验性)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token key atrule\">vendorsList</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token key atrule\">js</span><span class=\"token punctuation\">:</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> \t<span class=\"token punctuation\">-</span> jspackage <span class=\"token comment\">#与上方 jspackage 一致即可</span></pre></td></tr></table></figure><p>资源地址格式如下:</p>\n<p><span class=\"red\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly9leGFtcGxlLmNvbS94eHguanM=\">https://example.com/xxx.js</span></span> 使用 http (s) 地址加载 js<br />\n<span class=\"red\">combine/xxx.js,xxx.js</span> 使用 jsdelivr 的 combine 功能加载 (不推荐)<br />\n<span class=\"red\">npm/xxx/xxx.js</span> 使用 npm 源加载 js<br />\n<span class=\"red\">gh/xxx/xxx.js</span> 使用 gh 源加载 js<br />\n<span class=\"red\">xxx.js</span> 从本地加载 js<br />\n 优先级如下:<br />\n<span class=\"red\">http>combine>npm>gh > 本地</span></p>\n",
|
||
"tags": [
|
||
"极空间",
|
||
"Docker",
|
||
"Hexo",
|
||
"Hexo",
|
||
"Shoka",
|
||
"jsdelivr"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/30/http%E8%AF%B7%E6%B1%82%E4%B9%8BrestTemplate%E9%85%8D%E7%BD%AE%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/",
|
||
"url": "https://hitoli.com/2023/05/30/http%E8%AF%B7%E6%B1%82%E4%B9%8BrestTemplate%E9%85%8D%E7%BD%AE%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/",
|
||
"title": "http请求之restTemplate配置超时时间",
|
||
"date_published": "2023-05-30T09:20:00.000Z",
|
||
"content_html": "<h4 id=\"问题\"><a class=\"anchor\" href=\"#问题\">#</a> 问题</h4>\n<p>http 请求发起后接收不到返回数据!!!【测试环境没出问题,发到正式环境就有问题】</p>\n<p>项目中通过 restTemplate 发起请求:</p>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"请求入参:{}\"</span><span class=\"token punctuation\">,</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">toJSONString</span><span class=\"token punctuation\">(</span>request<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 打印日志 1</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token comment\">// 配置 http 请求的连接超时时间和读取超时时间</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token class-name\">HttpsClientRequestFactory</span> factory <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HttpsClientRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>factory<span class=\"token punctuation\">.</span><span class=\"token function\">setConnectTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>factory<span class=\"token punctuation\">.</span><span class=\"token function\">setReadTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token class-name\">RestTemplate</span> restTemplate <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RestTemplate</span><span class=\"token punctuation\">(</span>factory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre><span class=\"token class-name\">Result</span><span class=\"token generics\"><span class=\"token punctuation\"><</span><span class=\"token class-name\">InventoryResult</span><span class=\"token punctuation\">></span></span> result <span class=\"token operator\">=</span> restTemplate<span class=\"token punctuation\">.</span><span class=\"token function\">postForObject</span><span class=\"token punctuation\">(</span>address<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>inventoryUrl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Result</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre>log<span class=\"token punctuation\">.</span><span class=\"token function\">info</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"库存同步,返回数据: {}\"</span><span class=\"token punctuation\">,</span> result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span><span class=\"token comment\">// 打印日志 2</span></pre></td></tr></table></figure><ul>\n<li>打印日志 1 内容为:</li>\n</ul>\n<p>http 请求入参:{data=[{ productStatus=10,skuCode=null}], messageId=ewpfpr1t6ey5r6qj0su0w1h6rt73hr,token=vgvU5EJKuZbuHii7WH6pTINp40ZRicaqLz4dq5P7L6pDzWir8EEGZhCKPucQjljsw69EHasEy+iJfdTofDg==}</p>\n<ul>\n<li>\n<p>打印日志 2 内容为:没有打印内容!!!</p>\n</li>\n<li>\n<p>最后发现是因为测试环境中数据量较小,http 请求后,很快能得到相应,而正式环境数据量较大,没有及时得到响应,连接或者读取超时!!!</p>\n</li>\n</ul>\n<h4 id=\"解决方式\"><a class=\"anchor\" href=\"#解决方式\">#</a> 解决方式</h4>\n<h6 id=\"第一种\"><a class=\"anchor\" href=\"#第一种\">#</a> 第一种</h6>\n<ol>\n<li>添加 HttpsClientRequestFactory 类,并继承 SimpleClientHttpRequestFactory</li>\n</ol>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">/**</pre></td></tr><tr><td data-num=\"2\"></td><td><pre> * 兼容调 Https 接口</pre></td></tr><tr><td data-num=\"3\"></td><td><pre> */</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">HttpsClientRequestFactory</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">SimpleClientHttpRequestFactory</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> </pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token keyword\">protected</span> <span class=\"token keyword\">void</span> <span class=\"token function\">prepareConnection</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpURLConnection</span> connection<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> httpMethod<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">IOException</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>connection <span class=\"token keyword\">instanceof</span> <span class=\"token class-name\">HttpsURLConnection</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token function\">prepareHttpsConnection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpsURLConnection</span><span class=\"token punctuation\">)</span> connection<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">prepareConnection</span><span class=\"token punctuation\">(</span>connection<span class=\"token punctuation\">,</span> httpMethod<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> </pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">void</span> <span class=\"token function\">prepareHttpsConnection</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">HttpsURLConnection</span> connection<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> connection<span class=\"token punctuation\">.</span><span class=\"token function\">setHostnameVerifier</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SkipHostnameVerifier</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> connection<span class=\"token punctuation\">.</span><span class=\"token function\">setSSLSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token function\">createSslSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> ex<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token comment\">// Ignore</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> </pre></td></tr><tr><td data-num=\"25\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token class-name\">SSLSocketFactory</span> <span class=\"token function\">createSslSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">Exception</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token class-name\">SSLContext</span> context <span class=\"token operator\">=</span> <span class=\"token class-name\">SSLContext</span><span class=\"token punctuation\">.</span><span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"TLS\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre> context<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TrustManager</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SkipX509TrustManager</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SecureRandom</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre> <span class=\"token keyword\">return</span> context<span class=\"token punctuation\">.</span><span class=\"token function\">getSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> </pre></td></tr><tr><td data-num=\"32\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SkipHostnameVerifier</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">HostnameVerifier</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre> </pre></td></tr><tr><td data-num=\"34\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">verify</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> s<span class=\"token punctuation\">,</span> <span class=\"token class-name\">SSLSession</span> sslSession<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre> </pre></td></tr><tr><td data-num=\"39\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre> </pre></td></tr><tr><td data-num=\"41\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SkipX509TrustManager</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">X509TrustManager</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre> </pre></td></tr><tr><td data-num=\"43\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">X509Certificate</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token function\">getAcceptedIssuers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">X509Certificate</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"47\"></td><td><pre> </pre></td></tr><tr><td data-num=\"48\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">checkClientTrusted</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">X509Certificate</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> chain<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> authType<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre> </pre></td></tr><tr><td data-num=\"52\"></td><td><pre> <span class=\"token annotation punctuation\">@Override</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">checkServerTrusted</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">X509Certificate</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> chain<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> authType<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"54\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre> </pre></td></tr><tr><td data-num=\"56\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre><span class=\"token punctuation\">}</span></pre></td></tr></table></figure><ol start=\"2\">\n<li>使用 restTemplate 发起请求前先设置连接和超时时间或者通过容器加载配置类然后设置超时时间</li>\n</ol>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">// 配置 http 请求的连接超时时间和读取超时时间</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token class-name\">HttpsClientRequestFactory</span> factory <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HttpsClientRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>factory<span class=\"token punctuation\">.</span><span class=\"token function\">setConnectTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre>factory<span class=\"token punctuation\">.</span><span class=\"token function\">setReadTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">5</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token class-name\">RestTemplate</span> restTemplate <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RestTemplate</span><span class=\"token punctuation\">(</span>factory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token class-name\">BaseResult</span><span class=\"token generics\"><span class=\"token punctuation\"><</span><span class=\"token class-name\">QueryInventoryResult</span><span class=\"token punctuation\">></span></span> result <span class=\"token operator\">=</span> restTemplate<span class=\"token punctuation\">.</span><span class=\"token function\">postForObject</span><span class=\"token punctuation\">(</span>address<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>inventoryUrl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> request<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Result</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token annotation punctuation\">@Configuration</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">RestConfig</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> </pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token comment\">//60 * 1000</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${rest.connectTimeout:60000}\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> connectTimeout<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> </pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token comment\">//5 * 60 * 1000</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${rest.readTimeout:300000}\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> readTimeout<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> </pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token annotation punctuation\">@Bean</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">RestTemplate</span> <span class=\"token function\">restTemplate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token class-name\">SimpleClientHttpRequestFactory</span> simpleClientHttpRequestFactory <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SimpleClientHttpRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> simpleClientHttpRequestFactory<span class=\"token punctuation\">.</span><span class=\"token function\">setConnectTimeout</span><span class=\"token punctuation\">(</span>connectTimeout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> simpleClientHttpRequestFactory<span class=\"token punctuation\">.</span><span class=\"token function\">setReadTimeout</span><span class=\"token punctuation\">(</span>readTimeout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> <span class=\"token class-name\">RestTemplate</span> restTemplate <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RestTemplate</span><span class=\"token punctuation\">(</span>simpleClientHttpRequestFactory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> <span class=\"token keyword\">return</span> restTemplate<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr></table></figure><h6 id=\"第二种\"><a class=\"anchor\" href=\"#第二种\">#</a> 第二种</h6>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token annotation punctuation\">@Configuration</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">RestConfig</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> </pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token comment\">//60 * 1000</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${rest.connectTimeout:60000}\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> connectTimeout<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> </pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token comment\">//5 * 60 * 1000</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${rest.readTimeout:300000}\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> readTimeout<span class=\"token punctuation\">;</span> </pre></td></tr><tr><td data-num=\"11\"></td><td><pre> </pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token annotation punctuation\">@Value</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"${rest.connectionRequestTimeout:300000}\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> connectionRequestTimeout<span class=\"token punctuation\">;</span> </pre></td></tr><tr><td data-num=\"14\"></td><td><pre> </pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token comment\">/**</pre></td></tr><tr><td data-num=\"16\"></td><td><pre> * 使用 HttpComponentsClientHttpRequestFactory 创建 http 请求(推荐)</pre></td></tr><tr><td data-num=\"17\"></td><td><pre> */</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> <span class=\"token annotation punctuation\">@Bean</span></pre></td></tr><tr><td data-num=\"19\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">RestTemplate</span> <span class=\"token function\">restTemplate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre> <span class=\"token class-name\">HttpComponentsClientHttpRequestFactory</span> httpRequestFactory <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HttpComponentsClientHttpRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> httpRequestFactory<span class=\"token punctuation\">.</span><span class=\"token function\">setConnectionRequestTimeout</span><span class=\"token punctuation\">(</span>connectionRequestTimeout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> httpRequestFactory<span class=\"token punctuation\">.</span><span class=\"token function\">setConnectTimeout</span><span class=\"token punctuation\">(</span>connectTimeout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre> httpRequestFactory<span class=\"token punctuation\">.</span><span class=\"token function\">setReadTimeout</span><span class=\"token punctuation\">(</span>readTimeout<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RestTemplate</span><span class=\"token punctuation\">(</span>httpRequestFactory<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre> </pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre><span class=\"token punctuation\">}</span></pre></td></tr></table></figure><h6 id=\"第三种基于第二种升级\"><a class=\"anchor\" href=\"#第三种基于第二种升级\">#</a> 第三种(基于第二种升级)</h6>\n<figure class=\"highlight java\"><figcaption data-lang=\"java\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token annotation punctuation\">@Configuration</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">RestConfig</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> </pre></td></tr><tr><td data-num=\"4\"></td><td><pre> </pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token comment\">/**</pre></td></tr><tr><td data-num=\"6\"></td><td><pre> * 高并发采用 HttpClient 连接池</pre></td></tr><tr><td data-num=\"7\"></td><td><pre> */</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token annotation punctuation\">@Bean</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">RestTemplate</span> <span class=\"token function\">restTemplate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RestTemplate</span><span class=\"token punctuation\">(</span><span class=\"token function\">httpRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> </pre></td></tr><tr><td data-num=\"13\"></td><td><pre> </pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token annotation punctuation\">@Bean</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">ClientHttpRequestFactory</span> <span class=\"token function\">httpRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">HttpComponentsClientHttpRequestFactory</span><span class=\"token punctuation\">(</span><span class=\"token function\">httpClient</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> </pre></td></tr><tr><td data-num=\"19\"></td><td><pre> </pre></td></tr><tr><td data-num=\"20\"></td><td><pre> <span class=\"token annotation punctuation\">@Bean</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token keyword\">public</span> <span class=\"token class-name\">HttpClient</span> <span class=\"token function\">httpClient</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token class-name\">Registry</span><span class=\"token generics\"><span class=\"token punctuation\"><</span><span class=\"token class-name\">ConnectionSocketFactory</span><span class=\"token punctuation\">></span></span> registry <span class=\"token operator\">=</span> <span class=\"token class-name\">RegistryBuilder</span><span class=\"token punctuation\">.</span><span class=\"token generics\"><span class=\"token punctuation\"><</span><span class=\"token class-name\">ConnectionSocketFactory</span><span class=\"token punctuation\">></span></span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"http\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">PlainConnectionSocketFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">getSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">register</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"https\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">SSLConnectionSocketFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">getSocketFactory</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token class-name\">PoolingHttpClientConnectionManager</span> connectionManager <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PoolingHttpClientConnectionManager</span><span class=\"token punctuation\">(</span>registry<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre> <span class=\"token comment\">// 设置整个连接池最大连接数</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre> connectionManager<span class=\"token punctuation\">.</span><span class=\"token function\">setMaxTotal</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre> \t\t\t<span class=\"token comment\">// 路由是对 maxTotal 的细分</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> connectionManager<span class=\"token punctuation\">.</span><span class=\"token function\">setDefaultMaxPerRoute</span><span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> <span class=\"token comment\">// 定义不活动的时间(毫秒),超过的连接从连接池拿取需要重新验证</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre> connectionManager<span class=\"token punctuation\">.</span><span class=\"token function\">setValidateAfterInactivity</span><span class=\"token punctuation\">(</span><span class=\"token number\">200</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre> <span class=\"token class-name\">RequestConfig</span> requestConfig <span class=\"token operator\">=</span> <span class=\"token class-name\">RequestConfig</span><span class=\"token punctuation\">.</span><span class=\"token function\">custom</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">setSocketTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">30000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 返回数据的超时时间</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">setConnectTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">20000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 连接上服务器的超时时间</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">setConnectionRequestTimeout</span><span class=\"token punctuation\">(</span><span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 从连接池中获取连接的超时时间</span></pre></td></tr><tr><td data-num=\"37\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre> <span class=\"token keyword\">return</span> <span class=\"token class-name\">HttpClientBuilder</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">setDefaultRequestConfig</span><span class=\"token punctuation\">(</span>requestConfig<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"40\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">setConnectionManager</span><span class=\"token punctuation\">(</span>connectionManager<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">evictIdleConnections</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">TimeUnit</span><span class=\"token punctuation\">.</span><span class=\"token constant\">SECONDS</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// 保持空闲的最大时间</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre> <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre><span class=\"token punctuation\">}</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"RestTemplate"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||
"url": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||
"title": "解决MySQL报only_full_group_by错误",
|
||
"date_published": "2023-05-25T10:25:00.000Z",
|
||
"content_html": "<h4 id=\"问题描述\"><a class=\"anchor\" href=\"#问题描述\">#</a> 问题描述</h4>\n<p>当我们迁移到 MySQL 5.7+ 的版本时,常会碰到 ERROR 1055 only_full_group_by 错误,这是 5.7 之后 SQL_MODE 默认打开了严格模式导致的错误。说明你代码里有地方写的不严谨。</p>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<ol>\n<li>重写 sql</li>\n<li>返回宽松模式</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#查询 sql_mode</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token keyword\">select</span> @<span class=\"token variable\">@GLOBAL.sql_mode</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre><span class=\"token comment\">#删除 ONLY_FULL_GROUP_BY</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token comment\">#设置 sql_mode</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">set</span> @<span class=\"token variable\">@GLOBAL.sql_mode</span><span class=\"token operator\">=</span><span class=\"token string\">'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'</span><span class=\"token punctuation\">;</span></pre></td></tr></table></figure><ol start=\"3\">\n<li>使用聚合函数<br />\n如果某些特别的原因就是要查询未分组字段,但你又没空改代码,那么我们可使用聚合函数来规避这类错误,算是一种折中的方案了,语法改严谨了,代码又不需要大动。如 ANY_VALUE ()、MAX ()、MIN () 或者 GROUP_CONCAT () 等聚合函数。</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"mysql"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||
"url": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||
"title": "MySQL中的any_value()函数",
|
||
"date_published": "2023-05-25T10:07:00.000Z",
|
||
"content_html": "<h4 id=\"问题\"><a class=\"anchor\" href=\"#问题\">#</a> 问题</h4>\n<p>业务要求:查询所有省份:<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/778f34f5670d.png\" alt=\"\" /></p>\n<h4 id=\"方法\"><a class=\"anchor\" href=\"#方法\">#</a> 方法</h4>\n<ol>\n<li>distinct 排除重复</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\t<span class=\"token keyword\">DISTINCT</span><span class=\"token punctuation\">(</span>province_code<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\tprovince_name</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>\tt_mip_base_area</pre></td></tr></table></figure><ol start=\"2\">\n<li>group by 根据身份编码分组</li>\n</ol>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span> </pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\tprovince_code<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>\tany_value<span class=\"token punctuation\">(</span>province_name<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span> t_mip_base_area</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">GROUP</span> <span class=\"token keyword\">BY</span> province_code</pre></td></tr></table></figure><h6 id=\"若这样写\"><a class=\"anchor\" href=\"#若这样写\">#</a> 若这样写</h6>\n<figure class=\"highlight sql\"><figcaption data-lang=\"SQL\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">SELECT</span> </pre></td></tr><tr><td data-num=\"2\"></td><td><pre> province_code<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> province_name</pre></td></tr><tr><td data-num=\"4\"></td><td><pre><span class=\"token keyword\">FROM</span> t_mip_base_area</pre></td></tr><tr><td data-num=\"5\"></td><td><pre><span class=\"token keyword\">GROUP</span> <span class=\"token keyword\">BY</span> province_code</pre></td></tr></table></figure><p>则会报错<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/c57a8e811928.png\" alt=\"\" /></p>\n<h4 id=\"总结\"><a class=\"anchor\" href=\"#总结\">#</a> 总结:</h4>\n<ol>\n<li>\n<p>MySQL5.7 之后,sql_mode 中 ONLY_FULL_GROUP_BY 模式默认设置为打开状态。</p>\n</li>\n<li>\n<p>ONLY_FULL_GROUP_BY 的语义就是确定 select target list 中的所有列的值都是明确语义,简单的说来,在此模式下,target list 中的值要么是来自于聚合函数(sum、avg、max 等)的结果,要么是来自于 group by list 中的表达式的值</p>\n</li>\n<li>\n<p>MySQL 提供了 any_value () 函数来抑制 ONLY_FULL_GROUP_BY 值被拒绝</p>\n</li>\n<li>\n<p>any_value () 会选择被分到同一组的数据里第一条数据的指定列值作为返回数据</p>\n</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"mysql"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||
"url": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||
"title": "命令大杂烩",
|
||
"date_published": "2023-04-16T05:32:00.000Z",
|
||
"content_html": "<h4 id=\"日常命令记录\"><a class=\"anchor\" href=\"#日常命令记录\">#</a> 日常命令记录</h4>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token comment\">#windows 系统修复</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>DISM.exe /Online /Cleanup-image /Scanhealth</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>DISM.exe /Online /Cleanup-image /Restorehealth </pre></td></tr><tr><td data-num=\"4\"></td><td><pre>sfc /scannow</pre></td></tr><tr><td data-num=\"5\"></td><td><pre></pre></td></tr><tr><td data-num=\"6\"></td><td><pre><span class=\"token comment\">#windows 网络修复</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>netsh winsock reset</pre></td></tr><tr><td data-num=\"8\"></td><td><pre></pre></td></tr><tr><td data-num=\"9\"></td><td><pre><span class=\"token comment\">#合并 ts 文件</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre>copy /b c:<span class=\"token punctuation\">\\</span>Users<span class=\"token punctuation\">\\</span>hito<span class=\"token punctuation\">\\</span>Downloads<span class=\"token punctuation\">\\</span>*.ts d:<span class=\"token punctuation\">\\</span><span class=\"token number\">50</span>.mp4</pre></td></tr><tr><td data-num=\"11\"></td><td><pre></pre></td></tr><tr><td data-num=\"12\"></td><td><pre><span class=\"token comment\">#windows11 家庭版安装 Hyper-V(以下命令拷贝到 txt 文本后重命名为 bat 文件然后用管理员权限运行)</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre><span class=\"token function\">pushd</span> <span class=\"token string\">\"%~dp0\"</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre><span class=\"token function\">dir</span> /b %SystemRoot%<span class=\"token punctuation\">\\</span>servicing<span class=\"token punctuation\">\\</span>Packages<span class=\"token punctuation\">\\</span>*Hyper-V*.mum <span class=\"token operator\">>></span> hyper-v.txt</pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token keyword\">for</span> /f %%i <span class=\"token keyword\">in</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'findstr /i . hyper-v.txt 2^>nul'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">do</span> dism /online /norestart /add-package:<span class=\"token string\">\"%SystemRoot%\\servicing\\Packages\\%%i\"</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre>del hyper-v.txt</pre></td></tr><tr><td data-num=\"17\"></td><td><pre>Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL</pre></td></tr><tr><td data-num=\"18\"></td><td><pre></pre></td></tr><tr><td data-num=\"19\"></td><td><pre><span class=\"token comment\">#mysql 查看索引使用情况</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre>EXPLAIN SELECT A.XXX, B.XXX FROM TABLE1 A, TABLE2 B ON A.XXX <span class=\"token operator\">=</span> B.XXX<span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre></pre></td></tr><tr><td data-num=\"22\"></td><td><pre><span class=\"token comment\">#mysql 使用触发器插入数据自动生产 uuid 主键</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre>insert_before BEFORE 插入</pre></td></tr><tr><td data-num=\"24\"></td><td><pre>BEGIN</pre></td></tr><tr><td data-num=\"25\"></td><td><pre>\t\t\tSET NEW.ID <span class=\"token operator\">=</span> REPLACE<span class=\"token punctuation\">(</span>UUID<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>,<span class=\"token string\">\"-\"</span>,<span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre>END</pre></td></tr><tr><td data-num=\"27\"></td><td><pre></pre></td></tr><tr><td data-num=\"28\"></td><td><pre><span class=\"token comment\">#excel</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre><span class=\"token comment\">#合并</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre><span class=\"token operator\">=</span>CONCATENATE<span class=\"token punctuation\">(</span><span class=\"token string\">\"EX010\"</span>,D2,C2,<span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre><span class=\"token comment\">#截断</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre><span class=\"token operator\">=</span>LEFT<span class=\"token punctuation\">(</span>E2,6<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre><span class=\"token comment\">#判断取值</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre><span class=\"token operator\">=</span>IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"宜都市\"</span>,<span class=\"token string\">\"420500000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"高新区\"</span>,<span class=\"token string\">\"420592000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"枝江市\"</span>,<span class=\"token string\">\"420583000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"当阳市\"</span>,<span class=\"token string\">\"420582000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"远安县\"</span>,<span class=\"token string\">\"420525000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"兴山县\"</span>,<span class=\"token string\">\"420526000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"秭归县\"</span>,<span class=\"token string\">\"420527000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"长阳\"</span>,<span class=\"token string\">\"420528000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"五峰县\"</span>,<span class=\"token string\">\"420529000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"夷陵区\"</span>,<span class=\"token string\">\"420506000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"点军区\"</span>,<span class=\"token string\">\"420504000000000\"</span>,IF<span class=\"token punctuation\">(</span>O2<span class=\"token operator\">=</span><span class=\"token string\">\"西陵区\"</span>,<span class=\"token string\">\"420502000000000\"</span>,IF<span class=\"token punctuation\">(</span>OR<span class=\"token punctuation\">(</span>ISNUMBER<span class=\"token punctuation\">(</span>FIND<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token string\">\"伍家\"</span><span class=\"token punctuation\">;</span><span class=\"token string\">\"伍家区\"</span><span class=\"token punctuation\">;</span><span class=\"token string\">\"伍家岗区\"</span><span class=\"token punctuation\">}</span>,O2<span class=\"token punctuation\">))</span><span class=\"token punctuation\">)</span>,<span class=\"token string\">\"420503000000000\"</span>,IF<span class=\"token punctuation\">(</span>OR<span class=\"token punctuation\">(</span>ISNUMBER<span class=\"token punctuation\">(</span>FIND<span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token string\">\"猇亭\"</span><span class=\"token punctuation\">;</span><span class=\"token string\">\"猇亭区\"</span><span class=\"token punctuation\">}</span>,O2<span class=\"token punctuation\">))</span><span class=\"token punctuation\">)</span>,<span class=\"token string\">\"420505000000000\"</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span><span class=\"token punctuation\">))</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre><span class=\"token comment\">#经纬度计算</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre><span class=\"token operator\">=</span>LEFT<span class=\"token punctuation\">(</span>T2,FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"°\"</span>,T2<span class=\"token punctuation\">)</span>-1<span class=\"token punctuation\">)</span>+MID<span class=\"token punctuation\">(</span>T2,FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"°\"</span>,T2<span class=\"token punctuation\">)</span>+1,FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"′\"</span>,T2<span class=\"token punctuation\">)</span>-FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"°\"</span>,T2<span class=\"token punctuation\">)</span>-1<span class=\"token punctuation\">)</span>/60+MID<span class=\"token punctuation\">(</span>T2,FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"′\"</span>,T2<span class=\"token punctuation\">)</span>+1,FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"″\"</span>,T2<span class=\"token punctuation\">)</span>-FIND<span class=\"token punctuation\">(</span><span class=\"token string\">\"′\"</span>,T2<span class=\"token punctuation\">)</span>-1<span class=\"token punctuation\">)</span>/3600</pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"命令"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/K8S%E9%A1%B9%E7%9B%AE%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E6%AD%A5%E9%AA%A4/",
|
||
"url": "https://hitoli.com/2023/04/16/K8S%E9%A1%B9%E7%9B%AE%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E6%AD%A5%E9%AA%A4/",
|
||
"title": "K8S项目本地部署步骤",
|
||
"date_published": "2023-04-16T04:39:00.000Z",
|
||
"content_html": "<h4 id=\"本地部署步骤\"><a class=\"anchor\" href=\"#本地部署步骤\">#</a> 本地部署步骤</h4>\n<ol>\n<li>本机安装 wsl_update_x64.msi (已安装可忽略)</li>\n<li>本机安装 Docker Desktop Installer.exe (已安装可忽略)</li>\n<li>安装成功后,打开设置<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/ab557bae79bf.png\" alt=\"\" /></li>\n<li>选择 Docker Engine,粘贴进如下配置后重启</li>\n</ol>\n<figure class=\"highlight json\"><figcaption data-lang=\"JSON\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre> <span class=\"token property\">\"builder\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> <span class=\"token property\">\"gc\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token property\">\"defaultKeepStorage\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"20GB\"</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token property\">\"enabled\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token property\">\"experimental\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token property\">\"features\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token property\">\"buildkit\"</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token property\">\"insecure-registries\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token string\">\"http://192.168.86.117\"</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre><span class=\"token punctuation\">}</span></pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/93533dd8e043.png\" alt=\"\" /><br />\n5. 本项目 clean、compile、package<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/c14b2405a234.jpg\" alt=\"\" /><br />\n6. 添加一个 DockerFile 的启动配置<br />\n 192.168.86.117/zhsl/ys-zhslsgcgl:0.0.1<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/66f152c95d6e.png\" alt=\"\" /><br />\n7. 保证代码是最新的之后,运行上步的配置,会把刚才 install 生成的 jar 包上传到本机 Docker 生成一个本机 docker 镜像<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/4b915691271f.png\" alt=\"\" /><br />\n 8. 命令行登录本地的 KUBESPHERE,把本机 docker 镜像上传到 KUBESPHERE</p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">docker</span> login <span class=\"token number\">192.168</span>.86.117</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/d1acb4e8e336.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">docker</span> images命令也可以看到本机docker镜像</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/2b22d19f4649.png\" alt=\"\" /></p>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>把本机docker镜像上传到KUBESPHERE</pre></td></tr><tr><td data-num=\"2\"></td><td><pre><span class=\"token function\">docker</span> push <span class=\"token number\">192.168</span>.86.117/zhsl/ys-zhslsgcgl:0.0.1</pre></td></tr></table></figure><p><img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/f1d792024e54.png\" alt=\"\" /><br />\n9. 网页登录本地的 KUBESPHERE。<br />\n<span class=\"exturl\" data-url=\"aHR0cDovLzE5Mi4xNjguODYuMTE3OjMwODgwLyVFRiVCQyU4QyVFOCVCRiU5QiVFNSU4NSVBNSVFMiU4MCU5QyVFNSVCNyVBNSVFNCVCRCU5QyVFOCVCNCU5RiVFOCVCRCVCRCVFMiU4MCU5RCVFNiU4OSVCRSVFNSU4OCVCMCVFNSU4OCU5QSVFNCVCOCU4QSVFNCVCQyVBMERvY2tlciVFNiU5QyU4RCVFNSU4QSVBMSVFOSU5NSU5QyVFNSU4MyU4RiVFRiVCQyU4QyVFNSVCOSVCNiVFNSU5MCVBRiVFNSU4QSVBOCVFMyU4MCU4Mg==\">http://192.168.86.117:30880/,进入 “工作负载” 找到刚上传 Docker 服务镜像,并启动。</span><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/fcd7e6459555.png\" alt=\"\" /></p>\n<h4 id=\"通过导出镜像部署\"><a class=\"anchor\" href=\"#通过导出镜像部署\">#</a> 通过导出镜像部署</h4>\n<ol>\n<li>docker images 查看要导出的镜像 id<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/1edd4bacf81c.png\" alt=\"\" /></li>\n<li>docker save 58310865054f > szy.tar 导出到用户目录下 C:\\Users\\hito</li>\n<li>docker load -i szy.tar 载入镜像<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/32154204eff2.png\" alt=\"\" /></li>\n<li>docker tag 58310865054f harbor.zhsl.local:30881/zhsl/ys-zhslszy:0.0.1 标记镜像</li>\n<li>docker push harbor.zhsl.local:30881/zhsl/ys-zhslszy:0.0.1 上传镜像</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"项目部署",
|
||
"项目部署",
|
||
"K8S"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/%E7%83%BD%E7%81%AB10G-ONU%E5%A4%A9%E7%BF%BC%E7%BD%91%E5%85%B34-0%E7%A0%B4%E8%A7%A3%EF%BC%88HG5143F/",
|
||
"url": "https://hitoli.com/2023/04/16/%E7%83%BD%E7%81%AB10G-ONU%E5%A4%A9%E7%BF%BC%E7%BD%91%E5%85%B34-0%E7%A0%B4%E8%A7%A3%EF%BC%88HG5143F/",
|
||
"title": "烽火10G-ONU天翼网关4.0破解(HG5143F)",
|
||
"date_published": "2023-04-16T03:03:00.000Z",
|
||
"content_html": "<h4 id=\"开启telent\"><a class=\"anchor\" href=\"#开启telent\">#</a> 开启 telent</h4>\n<p>注意:54XXXXXXXXC8 为光猫背后 ONU MAC:54-XX-XX-XX-XX-C8</p>\n<ol>\n<li>打开 http://192.168.X.X:8080 (网关地址) 使用密码登陆</li>\n<li>执行 http://192.168.X.X:8080/cgi-bin/telnetenable.cgi?key=54XXXXXXXXC8&telnetenable=1</li>\n<li>用 telent 命令登陆<br />\n用户名:telecom 密码:nE7jA%5m</li>\n<li>获取 telnet 用户名密码</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>获取telnet的用户名</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetUserName</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>获取telnet的密码</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetPassword</pre></td></tr></table></figure><ol start=\"5\">\n<li>转为 root 用户</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token function\">su</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>密码:Fh@XXXXXX<span class=\"token punctuation\">(</span>X为mac地址的后6位<span class=\"token punctuation\">)</span></pre></td></tr></table></figure><ol start=\"6\">\n<li>获取 web 超级密码</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.Password <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token string\">'get success'</span> <span class=\"token operator\">|</span> <span class=\"token function\">cut</span> <span class=\"token parameter variable\">-d</span> <span class=\"token operator\">=</span> <span class=\"token parameter variable\">-f</span> <span class=\"token number\">2</span></pre></td></tr></table></figure><p>7、访问 http://192.168.1.1:8080/html/logoffaccount.html 把隐藏用户打开,其它选项改为可修改</p>\n<p>两种命令模式:</p>\n<h4 id=\"工厂模式\"><a class=\"anchor\" href=\"#工厂模式\">#</a> 工厂模式</h4>\n<ol>\n<li>进入工厂模式</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>load_cli factory</pre></td></tr></table></figure><ol start=\"2\">\n<li>显示管理员密码</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>show admin_pwd</pre></td></tr></table></figure><ol start=\"3\">\n<li>显示所有命令</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>?</pre></td></tr></table></figure><ol start=\"4\">\n<li>显示所有 show 命令</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>show ?</pre></td></tr></table></figure><ol start=\"5\">\n<li>显示所有 set 命令</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token builtin class-name\">set</span> ?</pre></td></tr></table></figure><ol start=\"6\">\n<li>显示所有信息</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>show allinfo</pre></td></tr></table></figure><h4 id=\"cfg_cmd命令模式\"><a class=\"anchor\" href=\"#cfg_cmd命令模式\">#</a> cfg_cmd 命令模式</h4>\n<ol>\n<li>开启 TELNET</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetEnable <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetUserName 用户名</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetPassword 密码</pre></td></tr></table></figure><ol start=\"2\">\n<li>打开 FTP 功能</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpEnable <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpUserName 用户名</pre></td></tr><tr><td data-num=\"3\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpPassword 密码</pre></td></tr></table></figure><ol start=\"3\">\n<li>获取 LOID</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd get InternetGatewayDevice.X_CT-COM_UserInfo.UserName <span class=\"token operator\">|</span><span class=\"token function\">grep</span> <span class=\"token string\">'value'</span> <span class=\"token operator\">|</span><span class=\"token function\">cut</span> <span class=\"token parameter variable\">-d</span> <span class=\"token string\">'='</span> <span class=\"token parameter variable\">-f</span> <span class=\"token number\">2</span></pre></td></tr></table></figure><ol start=\"4\">\n<li>TR069</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Enable</pre></td></tr><tr><td data-num=\"2\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Enable <span class=\"token number\">0</span> <span class=\"token comment\">#0 禁用,1 启用</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre>cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.VLANIDMark</pre></td></tr><tr><td data-num=\"4\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.VLANIDMark <span class=\"token number\">99</span> <span class=\"token comment\">#默认 46</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre>cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Mode</pre></td></tr><tr><td data-num=\"6\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Mode <span class=\"token number\">2</span> <span class=\"token comment\">#默认 2</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre>cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_AccessControl.Enabled</pre></td></tr><tr><td data-num=\"8\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_AccessControl.Enabled <span class=\"token number\">0</span> <span class=\"token comment\">#0 禁用,1 启用</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre>cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.Enable</pre></td></tr><tr><td data-num=\"10\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.Enable <span class=\"token number\">0</span> <span class=\"token comment\">#0 禁用,1 启用</span></pre></td></tr></table></figure><ol start=\"5\">\n<li>关闭 TR069 中间件</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_MiddlewareMgt.Tr069Enable <span class=\"token number\">0</span></pre></td></tr></table></figure><ol start=\"6\">\n<li>删除 1_TR069_R_VID_46</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.IP_Routed<span class=\"token operator\">=</span><span class=\"token string\">''</span></pre></td></tr></table></figure><ol start=\"7\">\n<li>查看设备目前的连接数</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd get InternetGatewayDevice.Services.X_CT-COM_MWBAND.TotalTerminalNumber</pre></td></tr></table></figure><ol start=\"8\">\n<li>设置设备连接数</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">set</span> InternetGatewayDevice.Services.X_CT-COM_MWBAND.TotalTerminalNumber <span class=\"token number\">255</span></pre></td></tr></table></figure><ol start=\"9\">\n<li>用户信息</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd get InternetGatewayDevice.X_CT-COM_UserInfo.UserName</pre></td></tr></table></figure><ol start=\"10\">\n<li>获取 cfg_cmd 帮助</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd <span class=\"token builtin class-name\">help</span></pre></td></tr></table></figure><ol start=\"11\">\n<li>获取指定节点后的节点</li>\n</ol>\n<figure class=\"highlight bash\"><figcaption data-lang=\"bash\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre>cfg_cmd shownode InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1. <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token operator\">|</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> </pre></td></tr><tr><td data-num=\"2\"></td><td><pre>(如cfg_cmd shownode InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1. <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>)</pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"烽火",
|
||
"天翼网关",
|
||
"破解",
|
||
"HG5143F"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/02/18/%E4%BF%AE%E6%94%B9IntellIJ-IDE%E8%83%8C%E6%99%AF%E8%89%B2%E5%92%8C%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F/",
|
||
"url": "https://hitoli.com/2023/02/18/%E4%BF%AE%E6%94%B9IntellIJ-IDE%E8%83%8C%E6%99%AF%E8%89%B2%E5%92%8C%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F/",
|
||
"title": "修改IntellIJ IDE背景色和字体大小",
|
||
"date_published": "2023-02-18T09:42:00.000Z",
|
||
"content_html": "<h4 id=\"引言\"><a class=\"anchor\" href=\"#引言\">#</a> 引言</h4>\n<p>网上搜索了几个修改 IDE 背景色和字体大小的方法,记录一下方便以后查看。</p>\n<h4 id=\"操作截图\"><a class=\"anchor\" href=\"#操作截图\">#</a> 操作截图</h4>\n<ol>\n<li>\n<p>修改代码区颜色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/bb050e7e4c3b3ff2968b0a1be311d31f.png\" alt=\"bb050e7e4c3b3ff2968b0a1be311d31f.png\" /></p>\n</li>\n<li>\n<p>修改代码区字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/af92e69249a74978f56a5b2f8bf792a8.png\" alt=\"af92e69249a74978f56a5b2f8bf792a8.png\" /></p>\n</li>\n<li>\n<p>修改控制台背景色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/80dd5d82bfc6d0380ce34a590d8beeb4.png\" alt=\"80dd5d82bfc6d0380ce34a590d8beeb4.png\" /></p>\n</li>\n<li>\n<p>修改控制台字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/86bd97d1937b77faa27d31db7c2abb91.png\" alt=\"86bd97d1937b77faa27d31db7c2abb91.png\" /></p>\n</li>\n<li>\n<p>修改左侧背景色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/4875f8006144733c0e6710a2b04bc2be.jpg\" alt=\"4875f8006144733c0e6710a2b04bc2be.jpg\" /></p>\n</li>\n<li>\n<p>修改 UI 字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/03/02/UI.png\" alt=\"UI.png\" /></p>\n</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"IDE",
|
||
"IDE",
|
||
"intellIJ"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/01/31/KLineChart%E7%94%BB%E6%B3%A2%E6%AE%B5%E9%AB%98%E4%BD%8E%E4%BB%B7%E5%9B%BE/",
|
||
"url": "https://hitoli.com/2023/01/31/KLineChart%E7%94%BB%E6%B3%A2%E6%AE%B5%E9%AB%98%E4%BD%8E%E4%BB%B7%E5%9B%BE/",
|
||
"title": "KLineChart画波段高低价图",
|
||
"date_published": "2023-01-31T01:44:00.000Z",
|
||
"content_html": "<h4 id=\"引言\"><a class=\"anchor\" href=\"#引言\">#</a> 引言</h4>\n<p>使用指定数据方式得到的线条总是不能达到想要的效果,一是阶梯线在价格发生变化的点存在倾斜,二是高低价的线很难完美显示,所以只能自己动手画了。代码仅供参考,如有错误的地方请指正!<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/01/31/ee3c75b472c5869794e205747703d888.png\" alt=\"ee3c75b472c5869794e205747703d888.png\" /></p>\n<h4 id=\"模版代码\"><a class=\"anchor\" href=\"#模版代码\">#</a> 模版代码</h4>\n<figure class=\"highlight js\"><figcaption data-lang=\"JavaScript\"></figcaption><table><tr><td data-num=\"1\"></td><td><pre><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>chart<span class=\"token punctuation\">.</span><span class=\"token function\">addTechnicalIndicatorTemplate</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"2\"></td><td><pre>\t<span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">'BandHighLowInd'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"3\"></td><td><pre> <span class=\"token literal-property property\">shortName</span><span class=\"token operator\">:</span> <span class=\"token string\">'波段高低价'</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"4\"></td><td><pre> <span class=\"token literal-property property\">calcParams</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"5\"></td><td><pre> <span class=\"token literal-property property\">precision</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"6\"></td><td><pre> <span class=\"token literal-property property\">plots</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span></pre></td></tr><tr><td data-num=\"7\"></td><td><pre> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">key</span><span class=\"token operator\">:</span> <span class=\"token string\">'high'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> <span class=\"token string\">'高: '</span><span class=\"token punctuation\">,</span> <span class=\"token function-variable function\">color</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">data<span class=\"token punctuation\">,</span> options</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> options<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"8\"></td><td><pre> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">key</span><span class=\"token operator\">:</span> <span class=\"token string\">'low'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> <span class=\"token string\">'低: '</span><span class=\"token punctuation\">,</span> <span class=\"token function-variable function\">color</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">data<span class=\"token punctuation\">,</span> options</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> options<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"9\"></td><td><pre> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">key</span><span class=\"token operator\">:</span> <span class=\"token string\">'highLow'</span><span class=\"token punctuation\">,</span> <span class=\"token literal-property property\">title</span><span class=\"token operator\">:</span> <span class=\"token string\">'高低: '</span><span class=\"token punctuation\">,</span> <span class=\"token function-variable function\">color</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">data<span class=\"token punctuation\">,</span> options</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> options<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"10\"></td><td><pre> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"11\"></td><td><pre> <span class=\"token function-variable function\">calcTechnicalIndicator</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">dataList<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> params <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"12\"></td><td><pre> <span class=\"token keyword\">let</span> compareKlineSize <span class=\"token operator\">=</span> params<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token comment\">// 取前后 k 的范围</span></pre></td></tr><tr><td data-num=\"13\"></td><td><pre> <span class=\"token keyword\">let</span> highs <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"14\"></td><td><pre> <span class=\"token keyword\">let</span> lows <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"15\"></td><td><pre> <span class=\"token keyword\">let</span> highLows <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"16\"></td><td><pre> <span class=\"token keyword\">let</span> findHigh <span class=\"token comment\">// 高低价当前查找标识</span></pre></td></tr><tr><td data-num=\"17\"></td><td><pre> dataList<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">kLineData<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"18\"></td><td><pre> <span class=\"token keyword\">let</span> frontIndex <span class=\"token operator\">=</span> i <span class=\"token operator\">-</span> compareKlineSize</pre></td></tr><tr><td data-num=\"19\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>frontIndex <span class=\"token operator\"><=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"20\"></td><td><pre> frontIndex <span class=\"token operator\">=</span> <span class=\"token number\">0</span></pre></td></tr><tr><td data-num=\"21\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"22\"></td><td><pre> <span class=\"token keyword\">let</span> frontDatas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"23\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>frontIndex <span class=\"token operator\"><</span> i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"24\"></td><td><pre> frontDatas <span class=\"token operator\">=</span> dataList<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span>frontIndex<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"25\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"26\"></td><td><pre> <span class=\"token keyword\">let</span> afterIndex <span class=\"token operator\">=</span> i <span class=\"token operator\">+</span> compareKlineSize <span class=\"token operator\">+</span> <span class=\"token number\">1</span></pre></td></tr><tr><td data-num=\"27\"></td><td><pre> <span class=\"token keyword\">let</span> afterDatas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"28\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>i <span class=\"token operator\"><</span> dataList<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"29\"></td><td><pre> afterDatas <span class=\"token operator\">=</span> dataList<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span>i <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> afterIndex<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"30\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"31\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>frontDatas<span class=\"token punctuation\">.</span>length <span class=\"token operator\">===</span> compareKlineSize <span class=\"token operator\">&&</span> afterDatas<span class=\"token punctuation\">.</span>length <span class=\"token operator\">===</span> compareKlineSize<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 前后 K 线数据必须都找到要比较的条数</span></pre></td></tr><tr><td data-num=\"32\"></td><td><pre> <span class=\"token keyword\">let</span> high <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span></pre></td></tr><tr><td data-num=\"33\"></td><td><pre> <span class=\"token keyword\">let</span> low <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span></pre></td></tr><tr><td data-num=\"34\"></td><td><pre> frontDatas<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>afterDatas<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">kLineData<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 找出前后 k 线中的最高和最低价</span></pre></td></tr><tr><td data-num=\"35\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>high <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> kLineData<span class=\"token punctuation\">.</span>high <span class=\"token operator\">></span> high<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"36\"></td><td><pre> high <span class=\"token operator\">=</span> kLineData<span class=\"token punctuation\">.</span>high</pre></td></tr><tr><td data-num=\"37\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"38\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>low <span class=\"token operator\">===</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> kLineData<span class=\"token punctuation\">.</span>low <span class=\"token operator\"><</span> low<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"39\"></td><td><pre> low <span class=\"token operator\">=</span> kLineData<span class=\"token punctuation\">.</span>low</pre></td></tr><tr><td data-num=\"40\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"41\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"42\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>kLineData<span class=\"token punctuation\">.</span>high <span class=\"token operator\">></span> high<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 当前 k 的高大于前后 k 中找出的高,则放入高价集合中</span></pre></td></tr><tr><td data-num=\"43\"></td><td><pre> highs<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"44\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"45\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"46\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"47\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"48\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>findHigh<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"49\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>findHigh <span class=\"token operator\">&&</span> highLows<span class=\"token punctuation\">[</span>highLows<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">!==</span> kLineData<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"50\"></td><td><pre> highLows<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"51\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"52\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"53\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"54\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"55\"></td><td><pre> findHigh <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span></pre></td></tr><tr><td data-num=\"56\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"57\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"58\"></td><td><pre> highLows<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"59\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"60\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"61\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"62\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"63\"></td><td><pre> findHigh <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span></pre></td></tr><tr><td data-num=\"64\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"65\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"66\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>kLineData<span class=\"token punctuation\">.</span>low <span class=\"token operator\"><</span> low<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 当前 k 的低小于前后 k 中找出的低,则放入低价集合中</span></pre></td></tr><tr><td data-num=\"67\"></td><td><pre> lows<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"68\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"69\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"70\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"71\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"72\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>findHigh<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"73\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>findHigh <span class=\"token operator\">&&</span> highLows<span class=\"token punctuation\">[</span>highLows<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>value <span class=\"token operator\">!==</span> kLineData<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"74\"></td><td><pre> highLows<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"75\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"76\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"77\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"78\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"79\"></td><td><pre> findHigh <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"80\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"81\"></td><td><pre> <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"82\"></td><td><pre> highLows<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"83\"></td><td><pre> <span class=\"token literal-property property\">time</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>timestamp<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"84\"></td><td><pre> <span class=\"token literal-property property\">value</span><span class=\"token operator\">:</span> kLineData<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"85\"></td><td><pre> <span class=\"token literal-property property\">index</span><span class=\"token operator\">:</span> i</pre></td></tr><tr><td data-num=\"86\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"87\"></td><td><pre> findHigh <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"88\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"89\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"90\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"91\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"92\"></td><td><pre> <span class=\"token keyword\">let</span> high<span class=\"token punctuation\">,</span> low<span class=\"token punctuation\">,</span> highLow</pre></td></tr><tr><td data-num=\"93\"></td><td><pre> <span class=\"token keyword\">return</span> dataList<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">kLineData<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"94\"></td><td><pre> <span class=\"token keyword\">let</span> item <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"95\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"96\"></td><td><pre> highs<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"97\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>kLineData<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">===</span> data<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"98\"></td><td><pre> high <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>value</pre></td></tr><tr><td data-num=\"99\"></td><td><pre> item<span class=\"token punctuation\">.</span>highOrigin <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"100\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"101\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"102\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>high<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 持续先前的高,画出阶梯线</span></pre></td></tr><tr><td data-num=\"103\"></td><td><pre> item<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">=</span> kLineData<span class=\"token punctuation\">.</span>timestamp</pre></td></tr><tr><td data-num=\"104\"></td><td><pre> item<span class=\"token punctuation\">.</span>high <span class=\"token operator\">=</span> high</pre></td></tr><tr><td data-num=\"105\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"106\"></td><td><pre> lows<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"107\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>kLineData<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">===</span> data<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"108\"></td><td><pre> low <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>value</pre></td></tr><tr><td data-num=\"109\"></td><td><pre> item<span class=\"token punctuation\">.</span>lowOrigin <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"110\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"111\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"112\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>low<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 持续先前的低,画出阶梯线</span></pre></td></tr><tr><td data-num=\"113\"></td><td><pre> item<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">=</span> kLineData<span class=\"token punctuation\">.</span>timestamp</pre></td></tr><tr><td data-num=\"114\"></td><td><pre> item<span class=\"token punctuation\">.</span>low <span class=\"token operator\">=</span> low</pre></td></tr><tr><td data-num=\"115\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"116\"></td><td><pre> highLows<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">data</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"117\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>kLineData<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">===</span> data<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"118\"></td><td><pre> highLow <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>value</pre></td></tr><tr><td data-num=\"119\"></td><td><pre> item<span class=\"token punctuation\">.</span>highLowOrigin <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span></pre></td></tr><tr><td data-num=\"120\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"121\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"122\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>highLow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 持续先前的高低,方便 title 显示</span></pre></td></tr><tr><td data-num=\"123\"></td><td><pre> item<span class=\"token punctuation\">.</span>timestamp <span class=\"token operator\">=</span> kLineData<span class=\"token punctuation\">.</span>timestamp</pre></td></tr><tr><td data-num=\"124\"></td><td><pre> item<span class=\"token punctuation\">.</span>highLow <span class=\"token operator\">=</span> highLow</pre></td></tr><tr><td data-num=\"125\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"126\"></td><td><pre> <span class=\"token keyword\">return</span> item</pre></td></tr><tr><td data-num=\"127\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"128\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span></pre></td></tr><tr><td data-num=\"129\"></td><td><pre> <span class=\"token function-variable function\">render</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> ctx<span class=\"token punctuation\">,</span> dataSource<span class=\"token punctuation\">,</span> viewport<span class=\"token punctuation\">,</span> styles<span class=\"token punctuation\">,</span> xAxis<span class=\"token punctuation\">,</span> yAxis <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"130\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>dataSource<span class=\"token punctuation\">.</span>technicalIndicatorDataList<span class=\"token punctuation\">.</span>length <span class=\"token operator\"><=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"131\"></td><td><pre> <span class=\"token keyword\">return</span></pre></td></tr><tr><td data-num=\"132\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"133\"></td><td><pre> <span class=\"token keyword\">let</span> x <span class=\"token operator\">=</span> xAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"134\"></td><td><pre> <span class=\"token keyword\">let</span> high<span class=\"token punctuation\">,</span> low<span class=\"token punctuation\">,</span> highLow<span class=\"token punctuation\">,</span> highLowX</pre></td></tr><tr><td data-num=\"135\"></td><td><pre> dataSource<span class=\"token punctuation\">.</span>technicalIndicatorDataList<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">data<span class=\"token punctuation\">,</span> i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"136\"></td><td><pre> <span class=\"token comment\">// 画高线</span></pre></td></tr><tr><td data-num=\"137\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>textBaseline <span class=\"token operator\">=</span> <span class=\"token string\">'middle'</span></pre></td></tr><tr><td data-num=\"138\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>textAlign <span class=\"token operator\">=</span> <span class=\"token string\">'center'</span></pre></td></tr><tr><td data-num=\"139\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"140\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"141\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>styles<span class=\"token punctuation\">.</span>line <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"142\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"143\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"144\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"145\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>high<span class=\"token punctuation\">)</span> <span class=\"token operator\">&&</span> data<span class=\"token punctuation\">.</span>high <span class=\"token operator\">!==</span> high<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"146\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"147\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>high<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"148\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"149\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"150\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"151\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"152\"></td><td><pre> high <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>high</pre></td></tr><tr><td data-num=\"153\"></td><td><pre> <span class=\"token keyword\">let</span> y <span class=\"token operator\">=</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>high<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"154\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"155\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"156\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">+</span> viewport<span class=\"token punctuation\">.</span>dataSpace<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"157\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"158\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"159\"></td><td><pre> <span class=\"token comment\">// 画低线</span></pre></td></tr><tr><td data-num=\"160\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"161\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"162\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>styles<span class=\"token punctuation\">.</span>line <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"163\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"164\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"165\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"166\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>low<span class=\"token punctuation\">)</span> <span class=\"token operator\">&&</span> data<span class=\"token punctuation\">.</span>low <span class=\"token operator\">!==</span> low<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"167\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"168\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>low<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"169\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"170\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"171\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"172\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"173\"></td><td><pre> low <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>low</pre></td></tr><tr><td data-num=\"174\"></td><td><pre> y <span class=\"token operator\">=</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>low<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"175\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"176\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"177\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>x <span class=\"token operator\">+</span> viewport<span class=\"token punctuation\">.</span>dataSpace<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"178\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"179\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"180\"></td><td><pre> <span class=\"token comment\">// 画高低线</span></pre></td></tr><tr><td data-num=\"181\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>highLow<span class=\"token punctuation\">)</span> <span class=\"token operator\">&&</span> data<span class=\"token punctuation\">.</span>highLowOrigin <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"182\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>highLow<span class=\"token punctuation\">)</span> <span class=\"token operator\">&&</span> <span class=\"token function\">isNotEmpty</span><span class=\"token punctuation\">(</span>highLowX<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"183\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"184\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"185\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>styles<span class=\"token punctuation\">.</span>line <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"186\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"187\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>strokeStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"188\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"189\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">beginPath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"190\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">moveTo</span><span class=\"token punctuation\">(</span>highLowX<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>highLow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"191\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">lineTo</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>highLow<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"192\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">stroke</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"193\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">closePath</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"194\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"195\"></td><td><pre> highLow <span class=\"token operator\">=</span> data<span class=\"token punctuation\">.</span>highLow</pre></td></tr><tr><td data-num=\"196\"></td><td><pre> highLowX <span class=\"token operator\">=</span> x</pre></td></tr><tr><td data-num=\"197\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"198\"></td><td><pre> <span class=\"token comment\">// 画价格</span></pre></td></tr><tr><td data-num=\"199\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>high <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">&&</span> data<span class=\"token punctuation\">.</span>highOrigin <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 画高价</span></pre></td></tr><tr><td data-num=\"200\"></td><td><pre> <span class=\"token keyword\">let</span> text <span class=\"token operator\">=</span> Number<span class=\"token punctuation\">.</span><span class=\"token function\">parseFloat</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toFixed</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"201\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"202\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>styles<span class=\"token punctuation\">.</span>line <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"203\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"204\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"205\"></td><td><pre> <span class=\"token keyword\">let</span> offset <span class=\"token operator\">=</span> <span class=\"token number\">10</span></pre></td></tr><tr><td data-num=\"206\"></td><td><pre> <span class=\"token keyword\">let</span> y <span class=\"token operator\">=</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>high<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"207\"></td><td><pre> <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\"><</span> offset <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"208\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">fillText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.'</span><span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">-</span> i<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"209\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"210\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">fillText</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">-</span> offset<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"211\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"212\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>low <span class=\"token operator\">!==</span> <span class=\"token keyword\">undefined</span> <span class=\"token operator\">&&</span> data<span class=\"token punctuation\">.</span>lowOrigin <span class=\"token operator\">===</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// 画低价</span></pre></td></tr><tr><td data-num=\"213\"></td><td><pre> <span class=\"token keyword\">let</span> text <span class=\"token operator\">=</span> Number<span class=\"token punctuation\">.</span><span class=\"token function\">parseFloat</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toFixed</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"214\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> <span class=\"token string\">'#fff'</span></pre></td></tr><tr><td data-num=\"215\"></td><td><pre> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>styles<span class=\"token punctuation\">.</span>line <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors <span class=\"token operator\">&&</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"216\"></td><td><pre> ctx<span class=\"token punctuation\">.</span>fillStyle <span class=\"token operator\">=</span> styles<span class=\"token punctuation\">.</span>line<span class=\"token punctuation\">.</span>colors<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span></pre></td></tr><tr><td data-num=\"217\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"218\"></td><td><pre> <span class=\"token keyword\">let</span> offset <span class=\"token operator\">=</span> <span class=\"token number\">15</span></pre></td></tr><tr><td data-num=\"219\"></td><td><pre> <span class=\"token keyword\">let</span> y <span class=\"token operator\">=</span> yAxis<span class=\"token punctuation\">.</span><span class=\"token function\">convertToPixel</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">.</span>low<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"220\"></td><td><pre> <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\"><</span> offset <span class=\"token operator\">-</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">+=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></pre></td></tr><tr><td data-num=\"221\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">fillText</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.'</span><span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> i<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"222\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"223\"></td><td><pre> ctx<span class=\"token punctuation\">.</span><span class=\"token function\">fillText</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> offset<span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"224\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"225\"></td><td><pre> x <span class=\"token operator\">+=</span> viewport<span class=\"token punctuation\">.</span>dataSpace</pre></td></tr><tr><td data-num=\"226\"></td><td><pre> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr><tr><td data-num=\"227\"></td><td><pre> <span class=\"token punctuation\">}</span></pre></td></tr><tr><td data-num=\"228\"></td><td><pre><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span></pre></td></tr></table></figure>",
|
||
"tags": [
|
||
"工作",
|
||
"KLineChart",
|
||
"KLineChart",
|
||
"K线",
|
||
"自定义指标"
|
||
]
|
||
}
|
||
]
|
||
} |