<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>后青春期的诗</title>
        <link>https://alon.wang</link>
        <description></description>
        <language>zh-CN</language>
        <pubDate>Tue, 10 Feb 2026 15:35:49 +0800</pubDate>
        <lastBuildDate>Tue, 10 Feb 2026 15:35:49 +0800</lastBuildDate>
        <category>php</category>
        <category>laravel</category>
        <category>代码规范</category>
        <category>Java</category>
        <category>SSl</category>
        <category>Error</category>
        <category>CentOs</category>
        <category>神经痛</category>
        <category>胸痛</category>
        <category>blog</category>
        <category>扩展</category>
        <category>js</category>
        <category>redis</category>
        <category>tip</category>
        <category>hexo</category>
        <category>twikoo</category>
        <category>Ubuntu</category>
        <category>微信支付</category>
        <category>photoshop</category>
        <item>
            <guid isPermalink="true">https://alon.wang/2026/02/10/will-ps/</guid>
            <title>威哥的ps小课堂</title>
            <link>https://alon.wang/2026/02/10/will-ps/</link>
            <category>photoshop</category>
            <pubDate>Tue, 10 Feb 2026 15:35:49 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;去除图片纯色背景&#34;&gt;&lt;a href=&#34;#去除图片纯色背景&#34; class=&#34;headerlink&#34; title=&#34;去除图片纯色背景&#34;&gt;&lt;/a&gt;去除图片纯色背景&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;点击&lt;code&gt;选择&lt;/code&gt;菜单的 &lt;code&gt;色彩范围&lt;/code&gt; 功能，然后选中要去除的纯色背景,关闭 &lt;code&gt;色彩范围&lt;/code&gt; 弹窗&lt;/li&gt;
&lt;li&gt;按下键盘 &lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;shift&lt;/code&gt; + &lt;code&gt;I&lt;/code&gt; 反选，然后 &lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;J&lt;/code&gt; 粘贴，删除原图即可&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2026/698ae0439cdd7.webp&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2026/698ae055aab2b.webp&#34;&gt;&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2025/06/30/bt-supervisor-laravel/</guid>
            <title>记.宝塔进程守护管理器导致的laravel日志权限问题</title>
            <link>https://alon.wang/2025/06/30/bt-supervisor-laravel/</link>
            <category>Error</category>
            <pubDate>Mon, 30 Jun 2025 15:50:18 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;最近搭建了一个新的laravel项目,并搭配了宝塔面板食用。然后就出现了诡异的问题,每天早上都会用root用户创建laravel日志!!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/6862436eeb6a9.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;然鹅,我已经把php的用户,定时任务的运行用户以及队列的用户都设置成了www。这使我百思不得其解哪来的root用户建的日志&lt;/p&gt;
&lt;p&gt; 怎么办?简单,遇事不决找大佬。 &lt;a href=&#34;https://m-finder.alon.wang/&#34;&gt;m-finder&lt;/a&gt;前来觐见;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&#34;color:lime&#34;&gt;m-finder:&lt;/span&gt;  打开日志查看日志记录的是什么&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt;  看起来是查询的数据库sql,因为开启了debug,看sql是查询的&lt;code&gt;jobs&lt;/code&gt;表。&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 不对啊,我队列走的是redis啊???&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:lime&#34;&gt;m-finder:&lt;/span&gt; 是不是定时任务?&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 我停止掉队列跟定时任务试试…&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 我擦,怎么还是不停的在查询jobs表,我队列都关了啊??? [黑人问号]&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:lime&#34;&gt;m-finder:&lt;/span&gt; emmmmmmm,看下进程呢&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 我试试, &lt;code&gt;ps aux | grep artisan&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/68624600e2746.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 我靠!!!怎么还有这么多队列在运行?队列都停止了啊,而且三个是root用户启动的?&lt;/li&gt;
&lt;li&gt;&lt;span style=&#34;color:skyblue&#34;&gt;me:&lt;/span&gt; 懂了!!!!!! 是宝塔这个&lt;code&gt;进程守护管理器&lt;/code&gt;的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/6862467ba5513.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;事故原因&#34;&gt;&lt;a href=&#34;#事故原因&#34; class=&#34;headerlink&#34; title=&#34;事故原因&#34;&gt;&lt;/a&gt;事故原因&lt;/h2&gt;&lt;p&gt;这个小企鹅就是元凶!!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/686246c847d10.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;一开始在&lt;code&gt;进程守护管理器&lt;/code&gt;里配置队列,配的是root,后来发现不应该用root,改为了www,然后他没有取消root的三个进程而是又用www用户新开了几个进程…&lt;/p&gt;
&lt;p&gt;然后今天测试又重启了几次,然后今天又出来了几个进程。于是就有了上面那么多进程&lt;/p&gt;
&lt;h2 id=&#34;解决&#34;&gt;&lt;a href=&#34;#解决&#34; class=&#34;headerlink&#34; title=&#34;解决&#34;&gt;&lt;/a&gt;解决&lt;/h2&gt;&lt;p&gt;&lt;code&gt;kill -9 端口&lt;/code&gt;干掉这些进程.卸载这个坑爹的小企鹅。手动安装&lt;code&gt;supervisor&lt;/code&gt;并管理队列,完事&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 安装 supervisor&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;apt install supervisor&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 查看状态&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;systemctl status supervisor&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 设置开机自启动&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;systemctl &lt;span class=&#34;built_in&#34;&gt;enable&lt;/span&gt; supervisor&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;让我明天康康还报不报log权限了&lt;/p&gt;
&lt;/blockquote&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2025/02/05/netlify-hexo/</guid>
            <title>使用Netlify部署Hexo</title>
            <link>https://alon.wang/2025/02/05/netlify-hexo/</link>
            <category>blog</category>
            <pubDate>Wed, 05 Feb 2025 11:49:47 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;前几天把评论迁移到&lt;code&gt;netlify&lt;/code&gt;时，发现&lt;code&gt;hexo&lt;/code&gt;也支持部署在这里，并且支持&lt;code&gt;github&lt;/code&gt;，&lt;code&gt;bitbucket&lt;/code&gt;，&lt;code&gt;gitlab&lt;/code&gt;和&lt;code&gt;Azure DevOps&lt;/code&gt;一键部署。只需要推送代码过去，&lt;code&gt;netlify&lt;/code&gt;会自动部署。而且访问速度不慢&lt;br&gt;博客之前使用git部署在服务器上，正好有个问题一直没解决，就是在mac上运行 &lt;code&gt;hexo deploy&lt;/code&gt;到服务器上的只有public下的内容。而在家里的win10运行&lt;code&gt;hexo deploy&lt;/code&gt;，则部署的是整个项目，就导致nginx解析原本root路径是&amp;#x2F;，就需要解析到public，正好现在部署在在netlify解决一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;新建git仓库。&#34;&gt;&lt;a href=&#34;#新建git仓库。&#34; class=&#34;headerlink&#34; title=&#34;新建git仓库。&#34;&gt;&lt;/a&gt;新建git仓库。&lt;/h1&gt;&lt;p&gt;之前git仓库使用的是gitee，但netlify一键部署不支持，所以新建一个bitbucket的仓库来用。别问为什么不用github，推代码总是超时，用了魔法也经常失败。裆燃啦，你用github也可以，直接跳过这一步就好&lt;br&gt;因为之前用sourceTree已经注册过bitbucket，没有注册过的可以到 &lt;a href=&#34;https://bitbucket.org/&#34;&gt;bitbucket&lt;/a&gt; 注册一下.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;注册完&lt;code&gt;bitbucket&lt;/code&gt; 之后，新建一个&lt;code&gt;workspace&lt;/code&gt;&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a2fe3776f73.webp&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;进入刚刚新建的&lt;code&gt;workspace&lt;/code&gt;,然后创建一个仓库&lt;code&gt;Repository&lt;/code&gt;&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a300181f137.webp&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;上传本地的ssh公钥到bitbucket，使用ssh拉取或更新代码&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a302b65a7bb.webp&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;将本来到代码推送到bitbucket仓库&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;新建netlify项目&#34;&gt;&lt;a href=&#34;#新建netlify项目&#34; class=&#34;headerlink&#34; title=&#34;新建netlify项目&#34;&gt;&lt;/a&gt;新建netlify项目&lt;/h1&gt;&lt;h2 id=&#34;关联git仓库&#34;&gt;&lt;a href=&#34;#关联git仓库&#34; class=&#34;headerlink&#34; title=&#34;关联git仓库&#34;&gt;&lt;/a&gt;关联git仓库&lt;/h2&gt;&lt;p&gt;新建一个site，然后选择要关联的仓库类型，我这里选择的是bitbucket。如果关联的是github仓库，还需要点一下&lt;code&gt;Configure the Netlify app on GitHub.&lt;/code&gt; 授权一下可以关联的仓库。选择要使用的仓库&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a3035f3f43d.webp&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a304e0c82d2.webp&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置部署命令&#34;&gt;&lt;a href=&#34;#配置部署命令&#34; class=&#34;headerlink&#34; title=&#34;配置部署命令&#34;&gt;&lt;/a&gt;配置部署命令&lt;/h2&gt;&lt;p&gt;设置你的网站名字，然后选择你的仓库分支，Base directory填&lt;code&gt;/&lt;/code&gt;，Build command填&lt;code&gt;npm i &amp;amp;&amp;amp; hexo clean &amp;amp;&amp;amp; hexo generate&lt;/code&gt;,Publish directory 填&lt;code&gt;/public&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你的仓库是已经编译过的，Build command为空就可以了&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a3058624367.webp&#34;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;自定义域名&#34;&gt;&lt;a href=&#34;#自定义域名&#34; class=&#34;headerlink&#34; title=&#34;自定义域名&#34;&gt;&lt;/a&gt;自定义域名&lt;/h2&gt;&lt;p&gt;进入菜单&lt;code&gt;Domain management&lt;/code&gt;,点击&lt;code&gt;Add domain alias&lt;/code&gt;按钮新增一个域名。在你的域名管理平台添加一个dns解析，使用CNAME类型，添加解析记录为&lt;code&gt;你的netlify site名称.netlify.app.&lt;/code&gt;。注意最后面是有个&lt;code&gt;.&lt;/code&gt;的&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67a309900b0f9.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;至此部署完成，只需要往git仓库推送代码就会自动部署了&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2025/01/07/IntelliJ-IDEA-jar/</guid>
            <title>使用IntelliJ IDEA生成jar包</title>
            <link>https://alon.wang/2025/01/07/IntelliJ-IDEA-jar/</link>
            <category>Java</category>
            <pubDate>Tue, 07 Jan 2025 16:05:00 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;最近需要将java程序打成jar包使用，一番搜索后成功。在此记录一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;使用IDEA打开你的java项目，选择菜单栏的&lt;code&gt;文件(File)&lt;/code&gt;-&lt;code&gt;项目结构(Project Structure)&lt;/code&gt;-&lt;code&gt;项目设置(Project Settings)&lt;/code&gt;-&lt;code&gt;工件(Artifacts)&lt;/code&gt;-&lt;code&gt;+添加(Add)&lt;/code&gt;-&lt;code&gt;JAR&lt;/code&gt;-&lt;code&gt;来自具有依赖项的模块(From modules with dependencies)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdcba26a6c.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdcf1efcff.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择你的主类，配置文件目录以及输出目录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdd90b0e4b.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新建&lt;code&gt;lib&lt;/code&gt;目录统一管理依赖项&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdec2c2297.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变更 jar 包类路径的依赖想路径，统一调整到&lt;code&gt;lib&lt;/code&gt;目录下&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdf674365e.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdfa00cdd6.webp&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点击菜单栏的&lt;code&gt;构建(Build)&lt;/code&gt;-&lt;code&gt;构建工件(Build Artifacts)&lt;/code&gt;完成打包&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/01/07/677cdff17fea6.webp&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/12/10/twikoo-netlify/</guid>
            <title>twikoo 评论从 Hugging Face 切换到 Netlify</title>
            <link>https://alon.wang/2024/12/10/twikoo-netlify/</link>
            <category>hexo</category>
            <category>twikoo</category>
            <pubDate>Tue, 10 Dec 2024 11:27:59 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;评论挂了&#34;&gt;&lt;a href=&#34;#评论挂了&#34; class=&#34;headerlink&#34; title=&#34;评论挂了&#34;&gt;&lt;/a&gt;评论挂了&lt;/h1&gt;&lt;p&gt;今天突然收到一封来自 MongoDB 的邮件，显示有一个数据库从10月15号开始就没有连接过了，60天不连接将会暂停。&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/12/10/6757dc0666f27.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;通过邮件链接点进去一看，原来是本站的评论系统使用的 mongoDB 。然后看了一下评论系统果然是挂了。打开F12，看到连接Hugging Face一直报错206,打开 Hugging Face 的 space 也一直显示准备中，不知道是 Hugging Face 有啥改动。&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/12/10/6757dd8ed1d5b.png&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/12/10/6757ddc9c6b63.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;切换云函数平台&#34;&gt;&lt;a href=&#34;#切换云函数平台&#34; class=&#34;headerlink&#34; title=&#34;切换云函数平台&#34;&gt;&lt;/a&gt;切换云函数平台&lt;/h1&gt;&lt;p&gt;打开&lt;a href=&#34;https://twikoo.js.org/&#34;&gt;twikoo文档&lt;/a&gt;，发现 Netlify 的推荐指数与 Hugging Face 是一样的，现在 Hugging Face 不能用那就切换到 Netlify 好了。&lt;br&gt;顺便发现之前用 Hugging Face 时，新评论的邮件通知一直不管用，居然是因为云函数平台的问题，切换到 Netlify 就支持了。话不多说，开干&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/12/10/6757e09129cf5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;按照&lt;a href=&#34;https://twikoo.js.org/backend.html#netlify-%E9%83%A8%E7%BD%B2&#34;&gt;twikoo的Netlify部署&lt;/a&gt;文档操作后发现评论虽然可以用了，但是历史评论都没有了？？&lt;/p&gt;
&lt;h1 id=&#34;修复历史评论消失问题&#34;&gt;&lt;a href=&#34;#修复历史评论消失问题&#34; class=&#34;headerlink&#34; title=&#34;修复历史评论消失问题&#34;&gt;&lt;/a&gt;修复历史评论消失问题&lt;/h1&gt;&lt;p&gt;于是又回到 twikoo 的文档中一顿看，找到了这句话。&lt;a href=&#34;https://twikoo.js.org/mongodb-atlas.html&#34;&gt; Twikoo 会连接到默认的名为 test 的数据库&lt;/a&gt;&lt;br&gt;而我之前的 MongoDB 数据库好像跟着 twikoo 文档里的图片操作，建了一个叫 twikoo 的数据库，而不是 test。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/12/10/6757df60e4c92.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;那怎么才能指定数据库名，而不是连test呢？不慌，遇事不决就google，找到了答案。可以在mongoDB的连接中指定数据库。&lt;br&gt;比如之前 Netlify 的环境变量中配置的是&lt;br&gt;&lt;code&gt;mongodb+srv://alon:&amp;lt;password&amp;gt;@cluster0.sjwbezq.mongodb.net/?retryWrites=true&amp;amp;w=majority&amp;amp;appName=Cluster0&lt;/code&gt;&lt;br&gt;则可以改成&lt;br&gt;&lt;code&gt;mongodb+srv://alon:&amp;lt;password&amp;gt;@cluster0.sjwbezq.mongodb.net/twikoo?retryWrites=true&amp;amp;w=majority&amp;amp;appName=Cluster0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;进入 Netlify 中，修改 MongoD B的环境变量后重新部署，完美。然后也可以支持新评论的邮件通知了。&lt;/p&gt;
&lt;p&gt;再见咯 Hugging Face。&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/10/23/chest-pain/</guid>
            <title>胸痛的类型</title>
            <link>https://alon.wang/2024/10/23/chest-pain/</link>
            <category>神经痛</category>
            <category>胸痛</category>
            <pubDate>Wed, 23 Oct 2024 18:21:44 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;今天看到一直关注的医生发了一篇文章，介绍了胸痛的类型。之前被心脏神经痛折磨良久的忍不住分享一下。要是早看到就不用纠结那么久了！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;胸痛是什么病&#34;&gt;&lt;a href=&#34;#胸痛是什么病&#34; class=&#34;headerlink&#34; title=&#34;胸痛是什么病?&#34;&gt;&lt;/a&gt;胸痛是什么病?&lt;/h1&gt;&lt;p&gt;很多人以为心脏在左边，所以左边痛就是心脏痛，但其实真正的心脏&lt;code&gt;是在中间躺着的&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/23/6718cf173cd62.webp&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;什么是典型心绞痛？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;胸骨中下段的压榨感，&lt;code&gt;像被束缚着打不开、隐隐约约的憋闷感&lt;/code&gt;，范围约巴掌大小，可向左肩和手臂放射。&lt;/li&gt;
&lt;li&gt;如果这种感觉与&lt;code&gt;突然的寒冷、较大幅度的运动，激烈的情绪&lt;/code&gt;明确相关的话，那基本上就可以确定是心脏的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各种各样的其他的痛，又是什么情况呢？，今天说说最常见的八种胸痛情况&lt;/p&gt;
&lt;h2 id=&#34;No-01-胃食管反流&#34;&gt;&lt;a href=&#34;#No-01-胃食管反流&#34; class=&#34;headerlink&#34; title=&#34;No.01 胃食管反流&#34;&gt;&lt;/a&gt;No.01 胃食管反流&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/23/6718cf99c111a.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;睡觉的时候，&lt;code&gt;胸骨中间&lt;/code&gt;这一段，容易胸痛甚至是痛醒，并且&lt;code&gt;连着后心、颈部&lt;/code&gt;一起痛，痛的时间可长可短，像这种痛，最大的可能是&lt;code&gt;胃食管反流&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/23/6718cff3f03f1.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果是&lt;code&gt;第一次&lt;/code&gt;出现上述图片位置的疼痛,尤其是 &lt;code&gt;年纪大、抽烟、喝酒、高血压、高血脂、高血糖都占了&lt;/code&gt; 的人,建议去&lt;code&gt;心内科&lt;/code&gt;看一次,有较小的概率是心脏病的可能性&lt;/p&gt;
&lt;h2 id=&#34;No-02-胃的问题&#34;&gt;&lt;a href=&#34;#No-02-胃的问题&#34; class=&#34;headerlink&#34; title=&#34;No.02 胃的问题&#34;&gt;&lt;/a&gt;No.02 胃的问题&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/23/6718d0869441b.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;一饿了就这个区域痛,或者吃饱了就痛,这种跟吃饭明显相关的,大多数是胃的问题&lt;/p&gt;
&lt;h2 id=&#34;No-03-气胸&#34;&gt;&lt;a href=&#34;#No-03-气胸&#34; class=&#34;headerlink&#34; title=&#34;No.03 气胸&#34;&gt;&lt;/a&gt;No.03 气胸&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/24/6719a64b339d4.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;瘦高体型的人&lt;code&gt;做大幅度动作&lt;/code&gt;、&lt;code&gt;咳嗽之后&lt;/code&gt;开始胸痛，吸气的时候痛得更厉害，那可能是&lt;code&gt;气胸&lt;/code&gt;，需要去&lt;code&gt;胸外科&lt;/code&gt;把气吸出来&lt;/p&gt;
&lt;h2 id=&#34;No-04-肺或者胸膜的问题&#34;&gt;&lt;a href=&#34;#No-04-肺或者胸膜的问题&#34; class=&#34;headerlink&#34; title=&#34;No.04 肺或者胸膜的问题&#34;&gt;&lt;/a&gt;No.04 肺或者胸膜的问题&lt;/h2&gt;&lt;p&gt;如果你是&lt;code&gt;呼吸的时候痛&lt;/code&gt;、&lt;code&gt;咳嗽的时候痛&lt;/code&gt;，&lt;code&gt;其他时候不怎么痛&lt;/code&gt; 这个明显是 &lt;code&gt;肺或者胸膜&lt;/code&gt; 的问题，可以去 &lt;code&gt;呼吸科&lt;/code&gt; 看看&lt;/p&gt;
&lt;h2 id=&#34;No-05-肺癌&#34;&gt;&lt;a href=&#34;#No-05-肺癌&#34; class=&#34;headerlink&#34; title=&#34;No.05 肺癌&#34;&gt;&lt;/a&gt;No.05 肺癌&lt;/h2&gt;&lt;p&gt;&lt;code&gt;一直隐隐约约的胸痛&lt;/code&gt;、&lt;code&gt;长期咳嗽&lt;/code&gt;，尤其是吸烟的人，最好是去做个&lt;code&gt;肺部CT&lt;/code&gt;，排查一下肺癌&lt;/p&gt;
&lt;h2 id=&#34;No-06-肌肉劳损&#34;&gt;&lt;a href=&#34;#No-06-肌肉劳损&#34; class=&#34;headerlink&#34; title=&#34;No.06 肌肉劳损&#34;&gt;&lt;/a&gt;No.06 肌肉劳损&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/24/6719a7298a330.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果你肩胛骨缝痛,&lt;code&gt;干活后痛得更厉害&lt;/code&gt;、&lt;code&gt;一痛痛一整天&lt;/code&gt; 这种隐痛一般不是内脏器官的痛，而是&lt;code&gt;长期坐姿或者活动姿势不好&lt;/code&gt;引起的&lt;code&gt;肌肉劳损&lt;/code&gt;，需要做一些&lt;code&gt;加强背部肌肉的力量训练&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;No-07-颈椎病&#34;&gt;&lt;a href=&#34;#No-07-颈椎病&#34; class=&#34;headerlink&#34; title=&#34;No.07 颈椎病&#34;&gt;&lt;/a&gt;No.07 颈椎病&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/24/6719a78006ffc.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;如果你&lt;code&gt;前胸弥漫的痛&lt;/code&gt;、&lt;code&gt;有时候手指头发麻&lt;/code&gt;这可能是长期伏案工作引起的&lt;code&gt;颈椎病&lt;/code&gt;，久坐后多运动运动就好了&lt;/p&gt;
&lt;h2 id=&#34;No-08-神经痛&#34;&gt;&lt;a href=&#34;#No-08-神经痛&#34; class=&#34;headerlink&#34; title=&#34;No.08 神经痛&#34;&gt;&lt;/a&gt;No.08 神经痛&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/10/24/6719a7d5dcaa7.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;一个手指明确指出来的胸痛&lt;/code&gt;、&lt;code&gt;范围特别清晰明确&lt;/code&gt; 这是神经痛，与活动少压力大有一定的关系&lt;br&gt;&lt;code&gt;调整生活方式后&lt;/code&gt;一般自己会好，实在不舒服可以&lt;code&gt;咨询医生&lt;/code&gt;后用一些止痛药&lt;/p&gt;
&lt;h1 id=&#34;更多详细内容，请点击下方视频链接&#34;&gt;&lt;a href=&#34;#更多详细内容，请点击下方视频链接&#34; class=&#34;headerlink&#34; title=&#34;更多详细内容，请点击下方视频链接&#34;&gt;&lt;/a&gt;更多详细内容，请点击下方视频链接&lt;/h1&gt;&lt;div class=&#34;bvideo&#34;&gt;&lt;a href=&#34;//www.bilibili.com/video/BV1VK421i7MJ&#34; target=&#34;_blank&#34;&gt;
        &lt;div class=&#34;bvideo-box&#34;&gt;
            &lt;div class=&#34;bvideo-cover&#34;&gt;
                &lt;div class=&#34;cover-default&#34;&gt;&lt;/div&gt;
                &lt;div class=&#34;bvideo-cover-layer&#34; style=&#34;background-image:url(https://images.weserv.nl/?url=http://i0.hdslb.com/bfs/archive/744755050b81a1828a5e7b11f645c4c286cf4fed.jpg)&#34;&gt;
                    &lt;i class=&#34;icon-video&#34;&gt;&lt;/i&gt;
                &lt;/div&gt;
                &lt;span class=&#34;duration&#34;&gt;00:03:51&lt;/span&gt;
            &lt;/div&gt;
            &lt;div class=&#34;bvideo-info&#34;&gt;
                &lt;p class=&#34;title&#34;&gt;很多人以为心脏在左边，所以左边痛就吓死，但其实，胸痛是这些原因引起的。&lt;/p&gt;
                &lt;p class=&#34;card-status&#34;&gt;
                    &lt;span class=&#34;play-num&#34;&gt;
                        &lt;i class=&#34;fa fa-youtube-play&#34;&gt;&lt;/i&gt;
                        &lt;span&gt;44.4万&lt;/span&gt;&lt;/span&gt;
                    &lt;span&gt;
                        &lt;i class=&#34;fa fa-list-alt&#34;&gt;&lt;/i&gt;
                        &lt;span&gt;269&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
                &lt;div class=&#34;partition&#34;&gt;
                    &lt;label class=&#34;card-label&#34;&gt;视频&lt;/label&gt;
                    &lt;label class=&#34;up-label&#34;&gt;&lt;/label&gt;
                    &lt;label class=&#34;up-name&#34;&gt;鹤立烟雨&lt;/label&gt;
                &lt;/div&gt;
                &lt;div class=&#34;actions hide&#34;&gt;&lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/a&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;转载于&lt;a href=&#34;https://mp.weixin.qq.com/s/xjlBNl8emGEuv3UISFmq4Q&#34;&gt;鹤立烟雨&lt;/a&gt;公众号&lt;/p&gt;
&lt;/blockquote&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/08/29/rsa-php/</guid>
            <title>php使用rsa进行公钥解密</title>
            <link>https://alon.wang/2024/08/29/rsa-php/</link>
            <category>php</category>
            <pubDate>Thu, 29 Aug 2024 10:52:41 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;问题&#34;&gt;&lt;a href=&#34;#问题&#34; class=&#34;headerlink&#34; title=&#34;问题&#34;&gt;&lt;/a&gt;问题&lt;/h1&gt;&lt;p&gt;最近对接一个三方的通道,对方给了一个java的rsa公钥解密的demo。我想当然直接用php的openssl_public_decrypt一顿操作，出来个null。WTF?&lt;/p&gt;
&lt;p&gt;贴一下java的demo如下&lt;/p&gt;
&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;package&lt;/span&gt; com.test;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.core.codec.Base64;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.core.util.CharsetUtil;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.core.util.URLUtil;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.crypto.SecureUtil;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.crypto.asymmetric.KeyType;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; cn.hutool.crypto.asymmetric.RSA;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;import&lt;/span&gt; java.nio.charset.Charset;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * 3.0api 加解密 加签验签&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * &lt;span class=&#34;doctag&#34;&gt;@author&lt;/span&gt; Admin&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;VerifyRsaTest&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * 加解密 加签验签&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String[] args)&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;throws&lt;/span&gt; Exception &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        String publicKey=&lt;span class=&#34;string&#34;&gt;&amp;quot;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyxVgchYx/xx3jWyKPxb4s7boVOSDLxu7MP2U0NNAqtWSNMRRF+5sAjMd3RyeftsRT/QWAf2Rs9P/oZikGP0yqpsrWYHgbLcYLqIsgNPr6yOk855gvHB5szRsQggK0d4hl562Lx5T9DvHuM5u2jChsqZ7PvRXmNa+SDBtEB/3fnwIDAQAB&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        String aa=&lt;span class=&#34;string&#34;&gt;&amp;quot;C5rKZS/HWcEcaSFVyjmmOThYeEaEUwzK7kJf9NK5MkzkWxFH7VoQJS77c19jm9mt1YlhL5RGIficRi2W2+O8yMsT1Jps/7zvtzgV3lMp4ZBWciRg7/UU5CJq/CrVtfxHYrNQKn5eFTpaDX/cENb8u47vxtjZpwPhbNIc7HSCCLVZ0qSUgKCFHS/JNMGnin8rpCOL0ON5nEzmJnyDhlQikTVDTgDYdDyGokOkGnIUrD9JcMQ0sSLQXRk3qT3zfCAamgRWhDUDgUG+7HHoya5nFwjJ+UHq7pfxcu+gFDDWvHqAN1q+ayl1kb7hf0NSYjG0/d/MB2LT5XLxhDgVIQSwGiHRB/1nHIiNJGQnEirtsNcGSl9hXZ7PPaAm5Oo2gadIFh8ro0BKwnlmha6WmRS47sf7De3zlRVeSLWYXJYyniFj9+LumdUOgwWaZHrJXSpQSTj2GQtwLy0yjirkWKJXt2YfpeEXsUpaZib0Rbo8yuruvZqM1aAKtMwGRdBwTvKXECA6uCqizBPBtyNRRAUL7AvwZCKHJQdAY1u4yhKngDYEwO651PPVO/IkKw9CbC4mRpfhD5sIFoqIcFyl0f4ns/USip5gKUofKGv0hStQD8Hq9JIQEvR9M5lkx2KZarudIttZiZKycqMUA4xCHsJetbohBDQwMHY3I0tsKjy3WuiWbzJsuJrQD4qfbp72UOKjD+zdeyTzykdKOPEYvmsEucSlubFrd8jmQlyWjR/3roQCqlhGlZmH7CGf+epSewULOjQP6geUh1Zl2p0CJNBNd8olCqIHFt4AQqb1GhdVLcDpOg63HBGj8O+WiLbM9sE7umDYizmC7ImNIQ0mPRPuBw==&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt;  URLUtil.decode(aa, Charset.defaultCharset(),&lt;span class=&#34;literal&#34;&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;String&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;decrypt&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; decryptRsaPublicKey(str, publicKey);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        System.out.println(&lt;span class=&#34;string&#34;&gt;&amp;quot;对接方解密,decrypt = &amp;quot;&lt;/span&gt; + decrypt);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// RSA公钥解密&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;static&lt;/span&gt; String &lt;span class=&#34;title function_&#34;&gt;decryptRsaPublicKey&lt;/span&gt;&lt;span class=&#34;params&#34;&gt;(String targetData, String publicKeyBase64)&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;// RSA公钥解密&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;RSA&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;rsa&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; SecureUtil.rsa(&lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;, publicKeyBase64);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;type&#34;&gt;byte&lt;/span&gt;[] decrypt = rsa.decrypt(Base64.decode(targetData), KeyType.PublicKey);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;String&lt;/span&gt;(decrypt, CharsetUtil.CHARSET_UTF_8);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;再贴一下一开始的php尝试如下&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyxVgchYx/xx3jWyKPxb4s7boVOSDLxu7MP2U0NNAqtWSNMRRF+5sAjMd3RyeftsRT/QWAf2Rs9P/oZikGP0yqpsrWYHgbLcYLqIsgNPr6yOk855gvHB5szRsQggK0d4hl562Lx5T9DvHuM5u2jChsqZ7PvRXmNa+SDBtEB/3fnwIDAQAB&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$txt&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;C5rKZS/HWcEcaSFVyjmmOThYeEaEUwzK7kJf9NK5MkzkWxFH7VoQJS77c19jm9mt1YlhL5RGIficRi2W2+O8yMsT1Jps/7zvtzgV3lMp4ZBWciRg7/UU5CJq/CrVtfxHYrNQKn5eFTpaDX/cENb8u47vxtjZpwPhbNIc7HSCCLVZ0qSUgKCFHS/JNMGnin8rpCOL0ON5nEzmJnyDhlQikTVDTgDYdDyGokOkGnIUrD9JcMQ0sSLQXRk3qT3zfCAamgRWhDUDgUG+7HHoya5nFwjJ+UHq7pfxcu+gFDDWvHqAN1q+ayl1kb7hf0NSYjG0/d/MB2LT5XLxhDgVIQSwGiHRB/1nHIiNJGQnEirtsNcGSl9hXZ7PPaAm5Oo2gadIFh8ro0BKwnlmha6WmRS47sf7De3zlRVeSLWYXJYyniFj9+LumdUOgwWaZHrJXSpQSTj2GQtwLy0yjirkWKJXt2YfpeEXsUpaZib0Rbo8yuruvZqM1aAKtMwGRdBwTvKXECA6uCqizBPBtyNRRAUL7AvwZCKHJQdAY1u4yhKngDYEwO651PPVO/IkKw9CbC4mRpfhD5sIFoqIcFyl0f4ns/USip5gKUofKGv0hStQD8Hq9JIQEvR9M5lkx2KZarudIttZiZKycqMUA4xCHsJetbohBDQwMHY3I0tsKjy3WuiWbzJsuJrQD4qfbp72UOKjD+zdeyTzykdKOPEYvmsEucSlubFrd8jmQlyWjR/3roQCqlhGlZmH7CGf+epSewULOjQP6geUh1Zl2p0CJNBNd8olCqIHFt4AQqb1GhdVLcDpOg63HBGj8O+WiLbM9sE7umDYizmC7ImNIQ0mPRPuBw==&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//        $txt = urldecode($txt);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;quot;-----BEGIN PUBLIC KEY-----\n&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;. &lt;span class=&#34;title function_ invoke__&#34;&gt;wordwrap&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt;, &lt;span class=&#34;number&#34;&gt;64&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;, &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;. &lt;span class=&#34;string&#34;&gt;&amp;quot;\n-----END PUBLIC KEY-----&amp;quot;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$publicKeyResource&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;openssl_pkey_get_public&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;openssl_public_decrypt&lt;/span&gt;(&lt;span class=&#34;title function_ invoke__&#34;&gt;base64_decode&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$txt&lt;/span&gt;), &lt;span class=&#34;variable&#34;&gt;$decryptedData&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$publicKeyResource&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;dd&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$decryptedData&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//null&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;解决&#34;&gt;&lt;a href=&#34;#解决&#34; class=&#34;headerlink&#34; title=&#34;解决&#34;&gt;&lt;/a&gt;解决&lt;/h1&gt;&lt;p&gt;然后开始google，百度一顿搜，搜出来的不能说一点用没有吧，也可以说是啥忙也帮不上了。于是&lt;a href=&#34;https://learnku.com/articles/64653&#34;&gt;learnku&lt;/a&gt;求助了一下社区的大佬们，得到了解答，特此记录一下。&lt;/p&gt;
&lt;h2 id=&#34;原因&#34;&gt;&lt;a href=&#34;#原因&#34; class=&#34;headerlink&#34; title=&#34;原因&#34;&gt;&lt;/a&gt;原因&lt;/h2&gt;&lt;p&gt;rsa加密和解密根据秘钥长度不同，对密文长度是有限制的。&lt;/p&gt;
&lt;h3 id=&#34;秘钥对应密文长度&#34;&gt;&lt;a href=&#34;#秘钥对应密文长度&#34; class=&#34;headerlink&#34; title=&#34;秘钥对应密文长度&#34;&gt;&lt;/a&gt;秘钥对应密文长度&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;秘钥长度&lt;/th&gt;
&lt;th&gt;加密最大长度&lt;/th&gt;
&lt;th&gt;解密最大长度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;117&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2048&lt;/td&gt;
&lt;td&gt;245&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4096&lt;/td&gt;
&lt;td&gt;501&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&#34;解决开始对应的java-demo转译php&#34;&gt;&lt;a href=&#34;#解决开始对应的java-demo转译php&#34; class=&#34;headerlink&#34; title=&#34;解决开始对应的java demo转译php&#34;&gt;&lt;/a&gt;解决开始对应的java demo转译php&lt;/h2&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;decryptRsaPublicKey&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$targetData&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$publicKeyBase64&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 构建公钥&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;quot;-----BEGIN PUBLIC KEY-----\n&amp;quot;&lt;/span&gt; .&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;title function_ invoke__&#34;&gt;chunk_split&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$publicKeyBase64&lt;/span&gt;, &lt;span class=&#34;number&#34;&gt;64&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;) .&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;-----END PUBLIC KEY-----&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 将目标数据进行 Base64 解码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$decodedData&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;base64_decode&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$targetData&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 加载公钥&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$keyResource&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;openssl_pkey_get_public&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (!&lt;span class=&#34;variable&#34;&gt;$keyResource&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;Exception&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Invalid public key&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$decrypted&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$maxLength&lt;/span&gt; = &lt;span class=&#34;number&#34;&gt;128&lt;/span&gt;; &lt;span class=&#34;comment&#34;&gt;// 1024位密钥的块大小为128字节&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$offset&lt;/span&gt; = &lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 分片解密&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;while&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$offset&lt;/span&gt; &amp;lt; &lt;span class=&#34;title function_ invoke__&#34;&gt;strlen&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$decodedData&lt;/span&gt;)) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$chunk&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;substr&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$decodedData&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$offset&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$maxLength&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$offset&lt;/span&gt; += &lt;span class=&#34;variable&#34;&gt;$maxLength&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$decryptedChunk&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;// 公钥解密&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (!&lt;span class=&#34;title function_ invoke__&#34;&gt;openssl_public_decrypt&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$chunk&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$decryptedChunk&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$keyResource&lt;/span&gt;)) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;Exception&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Failed to decrypt data&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$decrypted&lt;/span&gt; .= &lt;span class=&#34;variable&#34;&gt;$decryptedChunk&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 释放密钥资源&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;title function_ invoke__&#34;&gt;openssl_free_key&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$keyResource&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$decrypted&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// 测试数据&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyxVgchYx/xx3jWyKPxb4s7boVOSDLxu7MP2U0NNAqtWSNMRRF+5sAjMd3RyeftsRT/QWAf2Rs9P/oZikGP0yqpsrWYHgbLcYLqIsgNPr6yOk855gvHB5szRsQggK0d4hl562Lx5T9DvHuM5u2jChsqZ7PvRXmNa+SDBtEB/3fnwIDAQAB&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$txt&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;C5rKZS/HWcEcaSFVyjmmOThYeEaEUwzK7kJf9NK5MkzkWxFH7VoQJS77c19jm9mt1YlhL5RGIficRi2W2+O8yMsT1Jps/7zvtzgV3lMp4ZBWciRg7/UU5CJq/CrVtfxHYrNQKn5eFTpaDX/cENb8u47vxtjZpwPhbNIc7HSCCLVZ0qSUgKCFHS/JNMGnin8rpCOL0ON5nEzmJnyDhlQikTVDTgDYdDyGokOkGnIUrD9JcMQ0sSLQXRk3qT3zfCAamgRWhDUDgUG+7HHoya5nFwjJ+UHq7pfxcu+gFDDWvHqAN1q+ayl1kb7hf0NSYjG0/d/MB2LT5XLxhDgVIQSwGiHRB/1nHIiNJGQnEirtsNcGSl9hXZ7PPaAm5Oo2gadIFh8ro0BKwnlmha6WmRS47sf7De3zlRVeSLWYXJYyniFj9+LumdUOgwWaZHrJXSpQSTj2GQtwLy0yjirkWKJXt2YfpeEXsUpaZib0Rbo8yuruvZqM1aAKtMwGRdBwTvKXECA6uCqizBPBtyNRRAUL7AvwZCKHJQdAY1u4yhKngDYEwO651PPVO/IkKw9CbC4mRpfhD5sIFoqIcFyl0f4ns/USip5gKUofKGv0hStQD8Hq9JIQEvR9M5lkx2KZarudIttZiZKycqMUA4xCHsJetbohBDQwMHY3I0tsKjy3WuiWbzJsuJrQD4qfbp72UOKjD+zdeyTzykdKOPEYvmsEucSlubFrd8jmQlyWjR/3roQCqlhGlZmH7CGf+epSewULOjQP6geUh1Zl2p0CJNBNd8olCqIHFt4AQqb1GhdVLcDpOg63HBGj8O+WiLbM9sE7umDYizmC7ImNIQ0mPRPuBw==&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$d&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;decryptRsaPublicKey&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$txt&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$publicKey&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;var_dump&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$d&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// string(489) &amp;quot;&amp;#123;&amp;quot;amt&amp;quot;:1000.0000,&amp;quot;createTime&amp;quot;:1694663267000,&amp;quot;errorCode&amp;quot;:&amp;quot;36020&amp;quot;,&amp;quot;errorMsg&amp;quot;:&amp;quot;账户可用余额不足&amp;quot;,&amp;quot;idCard&amp;quot;:&amp;quot;500231198602096055&amp;quot;,&amp;quot;merchantBatchId&amp;quot;:&amp;quot;20230914114746614223&amp;quot;,&amp;quot;merchantId&amp;quot;:1701443988206407682,&amp;quot;merchantOrderId&amp;quot;:&amp;quot;202309141147466142231&amp;quot;,&amp;quot;mobile&amp;quot;:&amp;quot;13983211095&amp;quot;,&amp;quot;orderBatchNo&amp;quot;:&amp;quot;202309141147478V2Y1X&amp;quot;,&amp;quot;orderNo&amp;quot;:&amp;quot;202309141147478V2Y1X00001&amp;quot;,&amp;quot;payeeAcc&amp;quot;:&amp;quot;oDely66AF4G-lD17AZTSx6D_rTLk&amp;quot;,&amp;quot;payeeName&amp;quot;:&amp;quot;杨小军&amp;quot;,&amp;quot;platFee&amp;quot;:0.0000,&amp;quot;splitFlag&amp;quot;:&amp;quot;0&amp;quot;,&amp;quot;status&amp;quot;:&amp;quot;60&amp;quot;,&amp;quot;tradeEndTime&amp;quot;:1694663267000&amp;#125;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/07/11/mailpit/</guid>
            <title>本地的邮件测试服务——Mailpit</title>
            <link>https://alon.wang/2024/07/11/mailpit/</link>
            <category>php</category>
            <pubDate>Thu, 11 Jul 2024 13:44:26 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;介绍一个用于本地测试的电子邮件测试工具：Mailpit 。通过它，可以在浏览器中查看应用发送出去的邮件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;安装&#34;&gt;&lt;a href=&#34;#安装&#34; class=&#34;headerlink&#34; title=&#34;安装&#34;&gt;&lt;/a&gt;安装&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;mac 上的安装方式如下，其他平台请参考&lt;a href=&#34;https://mailpit.axllent.org/docs/install/&#34;&gt;安装文档&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;brew install mailpit&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;brew services start mailpit&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;使用&#34;&gt;&lt;a href=&#34;#使用&#34; class=&#34;headerlink&#34; title=&#34;使用&#34;&gt;&lt;/a&gt;使用&lt;/h1&gt;&lt;p&gt;安装完毕之后，不出意外的话，此时访问 &lt;a href=&#34;http://localhost:8025/%EF%BC%8C%E5%B0%86%E4%BC%9A%E7%9C%8B%E5%88%B0&#34;&gt;http://localhost:8025/，将会看到&lt;/a&gt; Mailpit 的 UI 界面&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/07/11/668f742861d71.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;在 laravel 中使用的话配置 mail 的 env 文件就可以了。Mailpit 默认监听 8025 的Web UI 端口以及 1025的 SMTP 端口&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;MAIL_MAILER=smtp&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;MAIL_HOST=localhost&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;MAIL_PORT=1025&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;MAIL_USERNAME=null&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;MAIL_PASSWORD=null&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;MAIL_ENCRYPTION=null&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;使用程序发送邮件后，在 Mailpit 的 UI 界面可以看到发送的邮件，你可以在这里操作这些邮件&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/07/11/668f7521da634.webp&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;文档&#34;&gt;&lt;a href=&#34;#文档&#34; class=&#34;headerlink&#34; title=&#34;文档&#34;&gt;&lt;/a&gt;文档&lt;/h1&gt;&lt;p&gt;以上只是 Mailpit 的最简单用法，更多用法及配置可以参考 &lt;a href=&#34;https://mailpit.axllent.org/docs/usage/&#34;&gt;Mailpit 文档&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/06/12/acmesh/</guid>
            <title>使用 acme.sh 及 腾讯云DNSPod申请Let&#39;s Encrypt 的ssl 证书，并自动续签</title>
            <link>https://alon.wang/2024/06/12/acmesh/</link>
            <category>SSl</category>
            <pubDate>Wed, 12 Jun 2024 18:26:18 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;腾讯云、阿里云陆续都把免费的 ssl 证书有效期换成几个月了，之前一年有效期每次手动操作下还行。现在几个月就要一次太烦了。so，来把证书换成 Let’s Encrypt，并用 acme.sh实现自动续签&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;安装-acme&#34;&gt;&lt;a href=&#34;#安装-acme&#34; class=&#34;headerlink&#34; title=&#34;安装 acme&#34;&gt;&lt;/a&gt;安装 acme&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;curl https://get.acme.sh | sh -s email=my@example.com&lt;/code&gt;因为网络问题总是超时，所以改用 &lt;code&gt;gitee&lt;/code&gt; 方式安装 acme&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git clone https://gitee.com/neilpang/acme.sh.git&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cd acme.sh&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sh acme.sh --install -m 你的邮箱&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;安装完之后，应该会生成一个 cronjob，没有的话可以自己新增一个，该 job 可以每天检测所有证书并更新快过期的证书&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/06/13/666a54b8266f6.jpg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;生成证书（dns-验证方式）&#34;&gt;&lt;a href=&#34;#生成证书（dns-验证方式）&#34; class=&#34;headerlink&#34; title=&#34;生成证书（dns 验证方式）&#34;&gt;&lt;/a&gt;生成证书（dns 验证方式）&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;生成证书acme 提供了两种方式，一种是 http 方式，需要在网站根目录下放置一个验证文件。另一种是 dns 验证，给域名添加一条 txt 解析记录就可以了。&lt;br&gt;我选择使用 dns 验证的方式，可以通过域名解析伤提供的 api 来自动验证，就不需要手动验证了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;配置腾讯云的-api&#34;&gt;&lt;a href=&#34;#配置腾讯云的-api&#34; class=&#34;headerlink&#34; title=&#34;配置腾讯云的 api&#34;&gt;&lt;/a&gt;配置腾讯云的 api&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;进入&lt;a href=&#34;https://console.dnspod.cn/account/token/token&#34;&gt; 腾讯云 DNSPOD 控制台的 API密钥管理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;进入 DNSPod Token选项卡，创建密钥&lt;br&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/06/13/666a6ab6dd55f.jpg&#34;&gt;&lt;/li&gt;
&lt;li&gt;保存好 ID及 Token&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;配置环境变量并生成密钥&#34;&gt;&lt;a href=&#34;#配置环境变量并生成密钥&#34; class=&#34;headerlink&#34; title=&#34;配置环境变量并生成密钥&#34;&gt;&lt;/a&gt;配置环境变量并生成密钥&lt;/h2&gt;&lt;p&gt;回到服务器中，将上面的 api 密钥配置为环境变量，供后面 acme 脚本生成 ssl 证书时使用&lt;/p&gt;
&lt;figure class=&#34;highlight shell&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta prompt_&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;language-bash&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 配置环境变量&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;export DP_Id=&amp;quot;上一步生成的 ID&amp;quot; &amp;amp;&amp;amp; export DP_Key=&amp;quot;上一步生成的 Token&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta prompt_&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta prompt_&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;language-bash&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 生成ssl 证书&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;acme.sh --issue --server letsencrypt --dns dns_dp -d *.alon.wang --key-file /usr/local/nginx/conf/ssl/*.alon.wang.key --fullchain-file /usr/local/nginx/conf/ssl/*.alon.wang.crt&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;acme.sh --issue --server letsencrypt --dns dns_dp -d alon.wang --key-file /usr/local/nginx/conf/ssl/alon.wang.key --fullchain-file /usr/local/nginx/conf/ssl/alon.wang.crt&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/06/13/666a89d5cc3c6.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里是&lt;code&gt;DP_Id&lt;/code&gt;,&lt;code&gt;DP_Key&lt;/code&gt;,&lt;code&gt;dns_dp&lt;/code&gt;都是腾讯云方式的，如果是其他服务商，请参考 &lt;a href=&#34;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&#34;&gt;文档&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;acme.sh参数说明：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;left&#34;&gt;参数名&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;含义&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;–server&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;指定证书签发方&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;zerossl（默认值，但是会因为网络问题经常出错）， letsencrypt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;–dns&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;指定 dns的 api验证方&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;具体参考 &lt;a href=&#34;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&#34;&gt;文档&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;-d&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;要生成证书的域名&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;可生成*的泛域名证书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;–key-file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;生成的.key证书的存放目录&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;–fullchain-file&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;生成的crt证书的存放目录&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;–reloadcmd&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;重新加载证书&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;使用&lt;code&gt;service nginx force-reload&lt;/code&gt;，不要使用&lt;code&gt;service nginx reload&lt;/code&gt;，但我更愿意手动操作证书&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;修改-nginx-配置&#34;&gt;&lt;a href=&#34;#修改-nginx-配置&#34; class=&#34;headerlink&#34; title=&#34;修改 nginx 配置&#34;&gt;&lt;/a&gt;修改 nginx 配置&lt;/h1&gt;&lt;p&gt;在 nginx 配置中添加&lt;code&gt;ssl_certificate&lt;/code&gt;和&lt;code&gt;ssl_certificate_key&lt;/code&gt;，并重新加载 nginx 配置文件&lt;code&gt;nginx -s reload&lt;/code&gt;,使证书生效&lt;/p&gt;
&lt;h1 id=&#34;重新生成证书&#34;&gt;&lt;a href=&#34;#重新生成证书&#34; class=&#34;headerlink&#34; title=&#34;重新生成证书&#34;&gt;&lt;/a&gt;重新生成证书&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;今天打开网站发现证书没有自动续签，不知道是不是网络的问题。然后使用下面的命令手动续签了一下。续签完不知道要不要重启一下nginx，反正我执行了一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight sh&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;/root/acme.sh/acme.sh --renew -d *.alon.wang --force&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;nginx -s reload&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/06/13/666a88d3185cb.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2024/06/13/666a8a9a79b62.png&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/04/16/neuropathy/</guid>
            <title>我好像有神经病？</title>
            <link>https://alon.wang/2024/04/16/neuropathy/</link>
            <category>神经痛</category>
            <category>胸痛</category>
            <pubDate>Tue, 16 Apr 2024 09:34:08 +0800</pubDate>
            <description><![CDATA[ &lt;div class=&#34;hbe hbe-container&#34; id=&#34;hexo-blog-encrypt&#34;
     data-hbe-format=&#34;4&#34;
     data-wpm=&#34;抱歉, 这个密码看着不太对, 请再试试.&#34;
     data-whm=&#34;抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.&#34;
     data-salt=&#34;cebde75a688ab6f4e02520c238acad53e1c89655ae9e61c9cdb576a71ebcde81&#34;
     data-nonce=&#34;04d7c004f57b871e923c6df7&#34;
     data-kdf-iterations=&#34;250000&#34;
     data-auto-save=&#34;false&#34;&gt;
  &lt;script id=&#34;hbeData&#34; type=&#34;hbeData&#34;&gt;
    f0fc474a5a431f8347d0ca56f0feb880f5095457a2400f0e9fcfb84d8849a69537ef9ec8e6a2e3df27217f377d6a23c7bcc0d95e81bf8b3eac2d59c2cdd71ef808042b5d429af3baefb2e3f4010a67a50dabcf8ce1a43fbff319203843962d71d52fe28f04ca06bba56bf1f2805143788f176b37a58282f6a733a7424800ed31afb5195c1f76555e0c72ce831c2a7bf73343a5d4a432a7b23143b8c42cf045754843c852e247d7b9c07b252061239f3522d5e1436ca10291783b49692f14cd2e0b1cbc18dea9899f12997d390aad5374fcf442a54bb73c6bf681ec4639c672dfcd2e9d0db2749f3a1d8bf37444b0d3689fc01bda94d7d20cf5de7e7f31fcaea96fe81279983c132b4473a1ac08d1633ea873055202b611f87aff241efc17a4dc0ec5e9a3e35fceca0c63795c831b8e77b0eeb023ca79dca6bf6037507226ba4a3c271286174734251c7b8740bab95efbb3df2772206850e84d0678c3e017f852aae3c065b24b0052af6890a7385b56cc2e6c043a25a8e3ad3c574c0c55d93d1595c10edb926f6b3233edfbf669209b0edd3a1532c79126fe4592e719df8ac0255b06cd50668ee8b347d2ac09b795991b8b1c2916622055e0eb6b6d200884cbf9d8b3ba48874a560e35d7bd0aacb1fcf54794f6cfe97ad7d16133ae800f2f2bd7b74acb3ae25d0338ef26161f49400d98ae47bb368379bc40f1aac8156b579d81f0f451826ecbc26a8887e097ff633a7b0b506bad0b1173df1880afab23fb6982a086db4d30c8f2dfe6637e6f121e0431f5209c291846a79fdfbd977d914f3f356114d7ca2e48b6542dcd3d1f89363ccf6882ff1815b315145b2b95b58bf39377f91e6d068015a016526531d36f40f9f77d392f122f4e52131bd3507bf68a640118494727b60d50e94c9f7444ad90fce55c139ce82819b1e8ab5db49bac7a6c98f28a128d22b6f2d5e3ada5e42e4b5fc48af8d30091222736110bef9c5f23e643658c813fff18a4d95e01140f98a70d51be54f930b881c4da5bfc30c3f403aff1bac72b9b4e9bca6c056c37ad73e963910ad082de2f2ab5ed2386a26d8c5275e8663b843ee34a7e86b50e451cbc0a019752ae8ad2a157696f9aef04f381851f276bcc888f59ec8ffc443b1b5a97dd13df8fe61e3caa9efcbcdd8728e4ba34ece4a795d825314c9ef374b500f0d0d8c01afd6d6e562e8cbf8e4b35326931f0b68aa048df48dadce978679099f20e6cde5598047a35160efb7739a54e02aff2ca7900f251eaf8260e2b6ed8feab0f1968569233b98d9d1eed806bcad36393be687001e925db337ec999842cf8b1718e4b8d9a6a61cb83bd69d6de38f9b253dbdbdf6233b9d7f84bc48cadec6e3274d0c788ed4a4b4325bc68dcf40f1e607577ac37ef736823559b3343da89114755293a9800b2c39aab9e3217cd28f0a734e6671cb1bb9731ce751cb048c5700aa19771e65008e6db87d4c370c4f5f788df1ed6ad010d1c430d24cdeac21afbdbce9b585ac955c909e6404f06837f5b9448605ef885b883d6c78eb4793377056d7033e57f2ac4d82208ddb495cd9cda215ce0ebf942d00f25565429e4fa58aa9a8d0d1dffe813896dc85bd57f49721f7701803faaa43f6c750c8bd46d2150241e87c37a6e92ea0291585c99c1d8439019a6c81ade498cc03d2719a751322d9a6a9aa3b80f64bf337484a6f03def079505540098d0920c10e8f107845b1405d796b657746fb4ea9d72e43c38c6d031b1c4426da8cbbfef4fdccc4d09716ff32033f20dd1f67d8ea91b536a75e6b3089c66d5a1b113b71ffeeba4c3ea30fb9a9bf83d3a76592d392575fb69975ebedf7a1c8d33e0682eb8d1a5b621758f966519f0958505bcf6af79c7da4d06ae35307348f9b82a8e77921f5d048ffd16bfe24600f5f540e86b1b20846ba6cb2e3845f3cdf2491a500eb44ee54f84c1c0ef39f7319df8d71a11341028270373d7cbe5e81be869b42549fcd4aff66c565c753fc4d1a9d250da2e89e851e80b90492ada99a0b59a4014521bba3b11c6c874fe47e3af6cd3074052e019adf81fd17014e71ef8114e06cea35f5d7996c3204b514534365eb52d588fe11879c4eadcc2ff305301aec24dc323fff409a8bf74dcb3e3eea2886578ff6c445867875d14a1780f39359a9044da4d86ccdbf1fcfb3fe52dd479bea762edd83b5b2a09bb7460f90b271299e108682a262bb2ea217266792fe0d2b60751e2c001facf5b69e23c4e913535456b07a3213fda79dcd5dcea7cd2c721c1ab260915c568c61a9ffc34b84d508adbcf495cf92d9cc0b232239ae2f8b901d344d0f6bea4da0b7af741528edc46c0128455646ec4eb8d6cb5368382a413f8fe83c4592511170384ff76631b633be23b1aaa9d55dab4800bdc851a32d85df4f2575c693e6559c82f7b15ece6e4021f9e7460b4b96831bf35add3002c6e7dc6eebb0c2ef88a419895a6b6f1fdaa34b5129393201aa2f05454bcbd5dbc7fc73d1ec5916794bb7249d4be5cd39837c9e7ea4fe2aa93a858ad40c9a8732f287f0c688e7a883253a4dac9d622e7ddd1d8ed7b31701b751b127aeb30da93db45154ef70471b9a6241aa5d032d8aed6b51dd4787b4366188404011e620c0049b04b2fee7ef349f8458836cc0510b3debc0b14a9471f57ed0ae439c51e03fd3217dfafdb23d1597b95125cb152a29f3e7a58043460feb372525664da5f30c7c268e41972faa86241701cce89d80d8a61081a5909d08b80c7b7e9a2037f1a399d4619df9f75c01d79ccba18b386f45f23296c5398d304927a30fb4071994ad995324f25265136097113f8a3687b3bcc77ab780afe8d0b1899102feba57787aa65ed99232291829013ec79a36c6c49a954cf8ef2097596168189088928e70ca42a16323ff1991bbaf0eedce5b3d27902da1a271a49b1783fc4af949be7d825e027ae672dcfe2304ca3bb9adcbb1da451c1a2aff88f085dd2c2ef96d99725c75acca3d1a30e4273db91cfb9bb710bef9dfbb75970d97323dd12a64cc76bf044f3954172c8e71221db02b9bb6b578231652f6439a4e5ae18d8b6cbc2148a863033968696071d9400ea424469d4895f6e78001575d33470698ea0172eec9df0dce83155e9b10ef2dd9e2297df1f2868004ed8ad66c0ff8d9abc808cfb6cb90de481ee69c9b1b852f94b090eb5115f1d3db33927c4d0a93cb9cc5be84491cc3997c068841af9b992d521e35f0f583f3146db401859bdfc7a4074916a19ef8e2c1444fba3d2d3ad9ce68eff3cd37cc6f6b74efffcba65b5dca9e2a204d915842b54058a034d69a4c1d7b41563b5b6b09e5cf594f9982f759a0512b9800dbc783e96f04065568501fef21374128cf33ed9ae21fa39d4c2920ebd5a71470932d85e83e3caadc8693947260e26f0e9d4b70e999c060dd54b184f25b618c360c65dee81739d8ec69a574c24b8e13038992c80b8ba873ed3cc4e39c85a92db793cb7c4bd26b581f2cdcaf45b01356e08f33e094f77f31f434fc068fefdb63fba9b9cdf8288b97c3230eac3cc1206802a154438e5f8f02c385381e6a12df9a546f97c5e123297123951179cf5c799d99122fbe177b2324dedf1c08aca0170f00be2d0c45f1170537bb244f46822527f95ea1287f083f6ad0241ef071aedf287db1b139544d143cdc85b148a601cad061e3d237c205f2db2c9c6cc3c389fdb2e99006bc1318c8996155b4cfc67695d065786fb8a249a14afd3ee68a024b4486a387a04463d61eb4ba971f86b93a4a20d99e89796709253fe311269c5960baf50720cafbc9b071e6252631af155ab3993f573c7c6fa88b70b7bcf37ae59b2e2a9ef39605217b87542dd5d99144ca6bf8c5ddf38e634230ec8d59865674a4f9962e440ba2f195aa9fb5640d611fac06bfc938488232cdbef53523d579e5596458e6e63c815811260c29087330157229f528d3ce6b4345719af2b46214856b7d63c6b1accb00b98cabb4abecc8531631053c26c362e0a765a03805e15a36be8c06304ce4508eb56b9eee2cce67e6ee674a2b13ec466adf882c85a8daa15b7181db40148b3c7b600cc4dd7192343dccf4d5ed868d31735f0c96edbf3453ec833ee13114264652e58814ea8d190e83129afb13f8c3671976d2a5d27a2a10f4d75639285cd2603d3ef5b2d3f8c7cc48852c1705406b5314951fed57572d1bccb7d615b91fa9d77036a4a3bb06e8de66e22d9497f981761e1e1ec42a5b9496504f73d2541cd7598466744bd5275c4d9ded807e1171d9b96173064d1543a0e95527a7769629046543c975a4219c0dbe7444e6494fa07b6fe5537257f932c0a6839064e04ab64c4a53a4e203b3a2accdd1b12e02d82c5ca60d915de21735dc6797b3d35fd0c1a6da6ac5e179c63200a4f7da51101b6e2f1e8a73770036cc1a094f6814ce9d81927e16d8f0c36fc827141a6a72184c5a78d240a3d5f9a89c6c63c88ee304c907d301bae5fccc12d87300246807949e31957ddadccbf2cac7fec1893109d03327394e219ae75cb3c8136f175954222cb2caeb813adf41a94edf9898b51af24a2d640461a3b562505d472b2363f3f2e627355e4cd9a5b41b3720056bc85c13df167e922164dab9a2bd40268677a8017ecd15cf366a84658deae6f58e67418fa312d7be3c70307d81cc6555a0062a2bb16cc8d32337582b8354d18240c1d4e466c50715767a5e7cf0648030857135c7aafa24e0ba21bbd7a96c148559569689fb89743edb45fab7cdf3fb9b9a1b4d8bfd446ec0807a94664c8365cb7fd92a93ed0a8ba072030b38e26015265b85a1eaf9bed6bbca84a05e89a5be87ed72a895aa73e8bd5b20b700fcbf09c15808719edea81fee1e1b5f6ee4b58c484fb5321360a405b266619c179b5f4db25d2d2109be71f1dd992d1c750d1b0d400898a20d878a07404f6a879e7d51219e8218a39b47428f5439bfa87f003c267db28c8304b4674c9406811624ded740aef7e32ce89005b33ed4a2c7d6ffd9fec1e7f340923831b346ecff1334523646889b74f113907c05e8e650b531207b583683e28158f0ae7849bab25a00e9f4bc39087e96fc89ea40c938e2a2dbd1cf5af6632ee5114c2257d67e8a7fd9d4b303eb7dc1b06cef73019cffa837cfcaaa00830738f69d9bbd247db65814981541360792105de22e87be2f9a9c813b2b1ab189bc8e1ca964eb7177c24710197657ae4f1242eec3a2e4c675ab322ac5b577f5bc09f99091838e0adcf8836820bb2730a46a74add794bf1aa4e81b1eadbd2bca49e721728643870786b741744efcb1d2c49857ad425a8679fe3abc21125b6a1e93250bfa53968c48b17298ef13e8bbe5bca11e7fa31005923c7948c9c7b62ef17044f14fd41c871e30686147a78c960b4146c6df9b37c6439f50ea381a1d018ec0d0b300e5cf807580e86ebc651e753c044c60e0be804f01ed90377fb5216476cde330d670af3f28f20ed937f33fe160ab8d7786e278ead2ba28cc7ece784a59162a58c8bf3ce634aa53e6342a867e74b42544392399dd1353acf4304a0f8ad327ecaa9ab85caffd437565478897ae32819291620fcb45a946b9d812651c39dcde65567e44e799bf3bd6e73d0ba55307ce19c16dd68fb82eda146a3e19d0cf91862fce4b4dd2460319540ef7a1514bdef61388ed69611a875da33f0f50ed61373b84f7c026eccb9fac19d1204b5a6c1005169a4dfef19cde30621f126e29087070b8f2c45884deeefa820afc770721db84ee276ef6900a72eae5607aabedaa6d2d5fae87494195c3b3090d4b92150af67fe01d3b43bb077ec65be032a5e64ea4c7c0ac4e8288d3dba50e5f8dcaf73761451cdf1646a4136d72d83e6f58f26d8378e9e04a310a9897a96539d60a8b2defcbb9fd9e3c9f009f65d4a90daa21da412962e7c1958a88137ee408c99b6375306230b4ffeca4eca1e62c619536170552ff1c750c20cfe81817e8c35de56544742f1a038fcaef51a000467501c5d171ab7d0f286174b4dcea325fd614c3ed81ecf20f52a751f29cba0794ef29338673490bc4c4a255481bf142a30d3add7aca448b35e1e3918b0a6d085edd53c5cebfa03f4c12982ab0f214d5d1a4adc7283b43bee5bd3064789a7c703513bbe665cfcb5f903b63db036df690105f8e7ba3be414c7cc32d099fc826d5e4f05f6d1622ad67c35f2c0af72cf22e13fdd1e95668316bbff1fa0c98b96d0e4279be75a23b4cd568f63d2e669ca59ff91d256b97b83a9f5d69ef679333ba760b11ee7c7fa10afdd591001441cde6b20eb166d15d97f7d7a8a9c31c70bc524c376b8ed46d151af62dbcf3c78a417bbe1fcd15cda050e065d92a181cdfd62a79a1d5cbb01c33d9c71ee8571133b65b7706695eba069c5492c0689ac53e2a9f648747991b2ff4895c47e0e135535a1a078acd0753b50673c3f44555d73154732e8ee9f3d4e26f216d750fdfe9eca1f2b147eb032ef6902904fedd8d3c2512bbb78851dcbe0e5a68831d5ef6ae84f8af4d70c17e5e6233e2686b2d3fef612f902ba5b1bef7546d61d56248b4027f0cfe3cef7b4c3ba42115559f88865411c7ead42796c22768da53b800823fbd5bb202f5420030e49757358eaaf49823d6a7cc819f81320d51b3f0aaace0c7d871a041e6bbfe348f94742747cc3fac9f2e4040abbff350749b79660379243600a072bf2e685347ca0eb81ad4fd3b9335c818d1fcb03f5f1b28f66b0561aeb788c30d1faa4537305613d2f93a24774b1078cc2e8812dab869b3dca9c5da1fbcab93f87e72c833820d11afb5be67ede8b26cc87b220beebee71c89f6e08cb6b5ae02d5b8c4fd425c4ee3967ed8d0d3977a3ba31d9e0b57fb1aef427b9c5a2f4b5ef01bbfe78e96f5eb6b3f8698acae947dd31b1d7af1c56712436c1993c495607a575227429d55f2189c9daa168d2727bfbcdc8a353b51b1c22feac618ad4cf3cc90f24ce1e860088acb96fa600ba123987d297c9f1a42f5cd24c6b04ad1d90df778ed456e65f728c9ef56aeb20da6486885c6003705d99f48f952fade72ad2a5dc91415fce046ccda26ab90eee1ab450f09d55c15c98e63eb9d22713caa6601348c72adabe9f5361d8a6346c2fe2fc1b5f599e6014ef6f84b581b960d0f0006f8946951a7188b8b0d20de46ea90962342a1bfcedfdc57c6f76c3e51f4bd57a1a9fcf5f34fe38bccf235a5885026639466024bf713319026c2f53d79047da00fcdded89dccd07f6d54aa0cd8d3b7e27371094a5683af48988c80b202841baaa44f913cea64363e9ed2c6ecb7e7d799a3811720b51417d5d57f10772ff299111657087dea0d0e5c96fc0934a3bac45d9902f618a3d67a5a4ed489a42f841354a8b8b53c5ff9611685202f127fcc26a2f8a4af3406c36d05f757edb8dca1873c1f79411d798e258fec666eb8ca083d2a1e92d23359be13043cf37c0851760a56e0e25ef88ab496b456271fc0a2d2001d56aa9ce689e08c31890a47a5908a8c8b3b6143f4aed24cab4b31a0ba1908bf052996cdc68e6e9eb48eae62ac6e9073dff5cd34df0de257de399b971f012f225b8d30ce7d680e1d30b9b36805974485a01ed1356bbcf967471d0761b5ae7417163e5105ec765d8f7bcd194d0145adca0332b00887f97346c1b6d4aba3ef45fa1c3d5a787a373288ae66dcff83a97752392f31ee99b7ec28fb24e44365b12866f4ed328d4a513844f720eab64c90853c171647d1e95611d71d5f0b374827d2c8a58572e74a94a08964bb14e5c4609a8b191b40533113977caf9143f969d0ccebd2c928f63ee289dea8acfefdd251abdd2c56cf09a06dfe549434a3c0e589a21589cf3f4d1fb80c1c413267ad0de2fa19026df5ccc5d17665de4ad8397fa1ed295b247695a3f126415dea7970a5ad2e9290ea18f7e1e2c78ef4f067e310325c82cf9e18f244f8a1b5ddd0ad215936155a8f5f80f9535cd37b4b8d52c70090e7d52300fd1ebe3e9f2e8fa2381aad6f9afaf5ca3c8421b009654fbb058ee7fd9d270f52a43423a0edbac0148d9d177c11a135d6d7476ec01479b7a2021f1d565b92922cab13ba04975bfa4aff94e1cac806819ec70aeffe2717166df5d753952fa843e44a88f6ba74cb7ec0e765c043fc421dd9ef81c2443496eaa51c7bf5f73c8d080196498f58621a106a21e2dfc8477ddbb7464f11c998e6be5044e53548be9b4b3cc416b16495fccd6c28fc7816f8b72a1a1b99f56bc48dc0137257d44656fe794c777ee361e8ed3b7312ab1410e1867abc7c00791e7e6e847775dea6fd12bbc69a50f60e5fb82efaf3f512643d8eba404ea8856a5d6c07a3b36e4ef852adf62d2d7d9b4561c5721bdd3fecc0ffcc4e8cc6f8aadc7cc32e4f57f647c8e5fec278df2d17e482fa4fb8ff493b46bf6de6462ceddf234d0f2836e1485b07f62e435b615629886dc3c11f36fd546fae2d46720955690879f74cf93882273a342667c01181f1882a6b5de6053b5e3fdbc7d42a2b4906053cde7eb33b221852fc4e670c5d0d2e512b1e72e37e253071c8cb9306b65c48c398208a950eca907b93589fcbc0722a317e170aa8407151367a8532975146e9c2528b7b0f68b5b00afab270a650943d85e0a9a27c36292c5a54226cd8102deb87a562eea9846cca51ef0f37b00dadb82acae871f27e697a52c03f03b4d0222928837266c871329c0cd2da8c63fe699fda20eaa62f5503c39f21498ae8f8bb252cd474bdf0642231c35a45ad6771f10db3e358d3b8af67eca60f65fad513b5d57670ad02a99fec4a8c5e29a112dfe589d625eabcb19838ce1839bac2374dbc2c3d26e73aab678a3ce2508d595115c8a86c2e6be061254e5782b0aba8dd06d6427c44e5be94a53f15beddc4fb679afe81c84e5960e628cd2d5d9b962a1d0714398cd345d265815be44121e360e51cba5bd6c0454ee25d2f7b4d3a154694dc7303de9f65fde3c0be7305e1ac7af4ac7ba063f5fa953c60e6e87af2e0219684157716a93b7ac801ead3f1e9bedf3bfa342009042b6d569a97ad61cfd6eee44e0132dcf7360fc1bcdac101401620d623f23e86d59a34cc51de547bbd9ecee462160cbbf772304eec4db3dd5b9b4e2b9e102984458ba66a8324a43dac389c325b0929c635c4ef705f081076867b8807724d3bc0c13d423e715fe92d41f19f5726936b1101b2d46ee169e573a9dbb582b176fbca42b86dee0c21b14532b4c2050d296527fdbea0105543e04bd74ae388c7f659553d5c3048004fe58ea1c90b7e10b80cdfe1740f55590ea4e8171fcc4d354955d4f7dac581991b7912c54be809968dab51bc27ccc541238c56c29312a7e1dbf7b1098380a4f6338d39bde4c6c59e6dd55d235884e5589ab6c343069fd5bafdfd997ef065ac365e02006acd9ab3977de746e2cd8c4160e522611026ebb071ccfb4821d4183b626c8aff2d7ffda8afa41706057f4c7754880d5d8dec898e9a8a7465a3cb23929d245a0f104a70b6b400b8d9db39ee16f42ab925df7e33978c32ad8f9f9cae91918336f2a5ff3e9e5272d5c1eb93e2534cf0f41178ce6dea924ab198eb7df01e27d4853b44c4ee089cfd2482e360a72d0779c9b31946e2314ae8e2fd55fbef2994e2bc52b9b6014b111d6cf24925ece792b882e55e984bf13076cc9c5bf6bf6ca95715ca234909a3746d352ee6f0f34a45508c1bcd61b29ff485c60d63ebd0e443f87164a91eef89189112afb63e1c0f04804937be4e03a07b620b9ec29afda653409b2f45fbe4ca21b58a43a6832284286994ca594fe38ca1d9da29efef670980d62aad03cbb6a29e9ecbc186cc2211ac2fecf3f5fd918a351c8d7e88af2db3ad12355c5d7701f9192b582bee65e79a4f410537cfb6dfb470e952faf644fb9210b89f149e2c04dc1b5bc3c251ff54ec49322909a2c458aa6a1b7922881765674de856999b4e2776f14ecc574d5598a3a60a1bf9a2914d2445ef27294c91b5c936eba5247d6e151bc7d5c7b44282789c2c61470f1ab8c954efb81386ee1b95256ee8e4302fbf1b8d3eb2155834785f1de468e52b223cec555346f1ff6a22453c6d799f9fada0be88d322e7c258f0c3467dc4938a590cd8ae1be3798492a3e3d9752741e52c420e52f724c0061f2fa556abfe801574733387c1e0111554ee2b1de7ecd2945564a8d2b27243af59144c62364011f45b5747af54c9350400e3195129a62bac62efc4c83d55dd08c9bbb1b39c3c86e5a739b37ad76cf74a4755f43fa521c8371cb93e8a231015af25e27de2fd4e2c18f52596302faa14bedffcb21e76456bac3b22caf8a497b5245b2aeb1185f77c58b4f37cd9e9c8fb45c452c493f1d6761396d078a27dee75cfcbc241f668847fae2ffcadf35d18e6e1c715b924966b0e8b6856996e94e0e43ecf512e02635f9be513e85edfacfb4638a51cd7d62e22b4ef495709ca1dd9145685582a2b311ac587b84d187cb15374300b34c1fdc38f22289a522ccabdc9b11044af67f37aa63130653e3c55b7bae2c7d3936a50186c8a3caea0d6b318b6a89df30605b3b9e5f74a74dab1d191867954bb3814fed8719c407d61edd0ff86f59ac39ed15f7e49028778accc3bc44627efc7fe336dd960cfbf7333afb601fc5cec81a0cef925d420957b7f807c3da7ccce910dbb05b1754e229e90cf82682b9dc9b784ab4c282cb9c539ab830b478a409b157458442b8bf0452aa5df35e2511c9783133bb280bc3518efbcc5c0fb3e0af199cfb798df045e386f9c4591153d6c4b5a53203dbd1201883a13979d1038c96349e31ba7903241a2ba74cc0ee3911d2b3ca2cf4e2454ec2963bc32020514d280624f4fd0cf0bc55c6bac18840adaef3e5473ddcd7a6e8a4331d278086679d5a76a929976a65390ba377b761ae31305a0c4ce5f96a286d78123b37ab99fcdfc937e4a568151f70c4f638a8241a0b030975d953631f05de769039657aff227fd11f2353ded064bc344a3daa1e5618633602b5e37eb3e28d19a2877b20db610f9d178ef7835d04ad24f5808c267bab0d003d125c3de1dd6f90f59a62563dad16115d5f5f3b093b3e86adbda839ce860f1010243c96eaab5b318ded12f1ba837fc1416384dad0df0567ebcc6ca84ffea1f595351b41232cc3192840d61adb04fed83460d8d35f98997b9aa93aba8e11e9a97d68c2e50a170b422b14755181ffeb3871b9aaef30224935fafa69e08b534566744538a7cea42f54eefa2bdb67dbfdee9214f9909681cfe11564bf1115a343fa17c35429de9070b51b5b0d016e62d95745ea88593b937e4dcf2037d74d9f172e112eeda00c6f7cb2f9fe910a240ee43a6d0657867632e2ab71b53e3e495bc47ab9158e25b878f983f587c1281021867d7316ca7ad599746155bf4ac78829964504a39107005d1ccddeec1d984c093d91cac0eb775c97211e692d2c795ca75e4aeec4d9086895a60f5831f974b0f5d3edd4c00a4ca70a14e3fcd15864823f14470c13bef03fce087a1a68921f51e46c31111929dca68285b05f71c7c12b67bdebccfd22d1ee02d606b2bd9a354f6780ee971170d76fcb635d5aab8373b07021030583de3130efe7950ed215b4dc15b7afe210dbb7075af197489de1a5d355c1aa753b17453b669a001655e60c5b80a7a1bd512b87ea4ee51321ab59a6d0281e0c157cf9eb18c10e65ff100328149b87b5331d57b34f1e7af6eac2a72f82744a675ce6ee35aaf28b57a0c7e11d120f5093dba2039d6e874a0631bf16cdd917c51b783e628b18508e5f4f33adfbdb40658b21f02f9eddc89479f6ef8c11bdd798ff0a9e89729f9089fe2bb134e8bab2b7f4c862c8423fec8375240ddaf22b33f7de94a04a3a6244b701afaf49cfcd3fff04e9f33e766d53596ed8263262534dd57f92e6f6079f87ce1a7ab4f418260bdbac8a493da38c0ca3947c19f3b1944e305ec494b41de1cc0d3d2101c55845d4247c41644294fb6bee828709830e80dcfc0a6e4987454cb6e6c36417fe6f43037e31fb4104cbb8d1426db1261812c69f2902d56dca262a564ef3fb83a746bd2e3eb52485b103e1d335e19ad1bfe1448def924ab0f4a07fa3ff6483d7117f2e4948bdfc4c28cf1aa10db910faf29708a43e75dc2346006addeffbb1612297e032cbd003d03d98661bc79eb5c7384fbfbdaae94094b5b91558bb56a06154f8f0d7e2602ff56b5a6d055ed452d8dcc3793ce008c8581404f8fca9298889985ae9c7f42537cf3398ddcbc5e41bee18e3987a790cf47133654ef78ab6ab407df2a44b51e2116f055cd0236ee012fc72d63d172ea5bc71003bf6922275b1a4c06c497872acc0a597decd32f2c738702249faa6101f4c5692d4803341b409998315ec3ace99899f68fa3809d100fafeae2a37c346e55b6b371308324bfb9eafbf2e574f6045332c41653cdb5d39afa4fe7c021207e8093991ed13c1e1dcfeffd738c08d2cad7b8fdaa739ba79b3fc3c2b5391aa9d012235d985181e459928103c79d1594df023fb6668e2f45d220d936ec1b69cde9d91842c0ca1472840e8073055abf277233e3882039a5c6d51e6ab4b45126311b18256a0944fec1f915a535ce9ac6c7ec30d2bad93d9bf76214997952713fa6f1bf8727438f024b935bdc5a5633e692c4a070b2a671c5ba14ac5ffcb5d5630586e8a9aea974bc88e70049e2afc2afd08fa6e392380aaf2dc3e01d7d22c36ffd040a03fdc045a1d31d303f1fcbbcb59d162ed8d09ee7cf0b7a1c39c907674d17dd5d967e444422c7f653dd2ff0b178fc59f5caf743025fcc5d9b9ef909b0241a6579802d015900297b533fd2ea7df1c5ec7900a8e66967c271bbbd509cb8d91c696427d659f78761f67c399a3ea001f750b8724927226fcced3ca5acf1132dc7b9aef30a06ca367e421f88d3e11a5a186bb17b00554e3edaf3bcb62dbff5042e5caa0396e6df5f14c47c46140dad4cd30e7e391ccb04028a854965e1fd3a2845a4f0e10ed321f630a842a343441b6f8d4ca1119a1b1145ddd3e11b1abb87c77f3042f5dd6539060d9cc71b8a9a651c9468b221c07b846883415edba9a2faa83c5c288fc525df5314f0659f989521a58fed152012e52a71eabf8cabc09cafba7b0ec3f2b530909abdfac95ebf9e4750e6df9652574665c7e326aeb7e29cb340de029bfbd45f11042a725cde59079bb711461970cd4eb7d517e5caf8daf2126e3bae424c8be1c011905eca77657c16923c57da06e5ef5651a56a58c7e600318b4e17daf177c5fa1f81cdf8d018d31f26c24f95db4d572fd580de0dae68c912fc4627b7296b8ec32458bd0b5df61ef18dd9d082ba6ac5151facb45fba24aee5234abf5a6cdc978052b3273f8b86d5326f3a3a57574bee1ee34700f2fee846fdc6bd3162836c7949d8944ef4809414904cf8cde78dc8203c773a1a0614f364baea66272f6a2084e4683d7880ca92476ed44f7777ad6c98e5f994e88f572406f350a9c208f11f65b6ccb87e93c6beed94c37c7ab0a4e613e8a646461dcf48d115c830c3360c6641c150d28a3ca1c45152d84b6f87609cdd078f3286dc0d1b9971e92525452759d8c833b8cf78e0a37d77e8223293affecaf68e26ea148dbdbc48fb8d5083c7646c4b6e6594b9a9a2f11cd318fe8a8671d3a6abab8272f0c66f6e208292eb063ed8c1fc371974ddd54d8dc8bf212e7af49b522309b550aceaeba24c1c91303205ed8e9385503fe3303b0a8701f2e52b0bad6432bf5abeed32c6172f6164ec772c10025d427d41baeadb212ecf30e6c664416a25e4234944b98c66271967163457970ebfcf4164f58f490feceebc9ec518f8234a0d53fea1a3ad7b6b08f0b815c3ffc0853dbeb8f363fdb1bdf90ae3cddcd43097c6b7b6ab2c109ef4d477e8b53c4753b7ecd16e57e4a9427ef75900044978e30c3ed95d82f1a68c7c34f4f0ac350a62e0d7dac76e9c1c3fe905d75931e01cef9744d0eff8deb6b1297a5c85d9df3b903e6601f83c298384cd4f62725f571de64a9fa3f9418fa224c32183d488dbfcff0a438183124e8b1814e22f69f3fe7954725c6ee53b9f43c2c85ab4d58a8652e2a45ad2211835bf5c6aae8
  &lt;/script&gt;
  &lt;div class=&#34;hbe hbe-content&#34;&gt;
    &lt;form id=&#34;hbeForm&#34; class=&#34;hbe hbe-form&#34; onsubmit=&#34;return false&#34;&gt;
      &lt;div class=&#34;hbe hbe-input hbe-input-xray&#34;&gt;
      &lt;input class=&#34;hbe hbe-input-field hbe-input-field-xray&#34; type=&#34;password&#34; id=&#34;hbePass&#34;&gt;
      &lt;label class=&#34;hbe hbe-input-label hbe-input-label-xray&#34; for=&#34;hbePass&#34;&gt;
        &lt;span class=&#34;hbe hbe-input-label-content hbe-input-label-content-xray&#34;&gt;您好, 这里需要密码.&lt;/span&gt;
      &lt;/label&gt;
      &lt;svg class=&#34;hbe hbe-graphic hbe-graphic-xray&#34; width=&#34;300%&#34; height=&#34;100%&#34; viewBox=&#34;0 0 1200 60&#34; preserveAspectRatio=&#34;none&#34;&gt;
        &lt;path d=&#34;M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0&#34;&gt;&lt;/path&gt;
        &lt;path d=&#34;M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0&#34;&gt;&lt;/path&gt;
      &lt;/svg&gt;
    &lt;/div&gt;
      &lt;button class=&#34;hbe hbe-button&#34; type=&#34;submit&#34;&gt;解锁&lt;/button&gt;
      &lt;div class=&#34;hbe hbe-error&#34; role=&#34;alert&#34; aria-live=&#34;polite&#34;&gt;&lt;/div&gt;
    &lt;/form&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;script data-pjax src=&#34;/lib/hbe.9e70f1e1d2.js&#34;&gt;&lt;/script&gt;&lt;link href=&#34;/css/hbe.style.css&#34; rel=&#34;stylesheet&#34; type=&#34;text/css&#34;&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/02/04/ssh2/</guid>
            <title>PHP使用ssh2连接sftp</title>
            <link>https://alon.wang/2024/02/04/ssh2/</link>
            <category>php</category>
            <category>扩展</category>
            <pubDate>Sun, 04 Feb 2024 14:45:45 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;PHP使用ssh2连接sftp&#34;&gt;&lt;a href=&#34;#PHP使用ssh2连接sftp&#34; class=&#34;headerlink&#34; title=&#34;PHP使用ssh2连接sftp&#34;&gt;&lt;/a&gt;PHP使用ssh2连接sftp&lt;/h1&gt;&lt;p&gt;最近使用laravel 8文件上传的sftp功能，使用的是 phpseclib 2.0。发现连接不上对方使用sftpgo搭建的服务。报错&lt;/p&gt;
&lt;p&gt;&lt;code&gt;No compatible key exchange algorithms found&lt;/code&gt;，看起来是加密方式不匹配。看laravel9之后使用的是phpseclib 3.0。不知道能不能连接上。但是当前项目版本不能改变。只能换其他方式，使用ssh2来连接&lt;/p&gt;
&lt;h2 id=&#34;给php安装ssh2扩展&#34;&gt;&lt;a href=&#34;#给php安装ssh2扩展&#34; class=&#34;headerlink&#34; title=&#34;给php安装ssh2扩展&#34;&gt;&lt;/a&gt;给php安装ssh2扩展&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;查看是否已安装ssh2扩展 &lt;code&gt;php -m | grep &amp;quot;ssh2&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装ssh2扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;系统&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;mac&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pecl install ssh2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;centos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yum install php-ssh2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&#34;php封装sftp类&#34;&gt;&lt;a href=&#34;#php封装sftp类&#34; class=&#34;headerlink&#34; title=&#34;php封装sftp类&#34;&gt;&lt;/a&gt;php封装sftp类&lt;/h2&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Services&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;SftpService&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 连接为NULL&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$connect&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//sftp resource&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$sftp&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *  构造函数.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;__construct&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$host&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$username&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$password&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$port&lt;/span&gt; = &lt;span class=&#34;number&#34;&gt;22&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$sftpConfig&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;quot;host&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$host&lt;/span&gt;,     &lt;span class=&#34;comment&#34;&gt;//SFTP服务器ip地址&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;quot;username&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$username&lt;/span&gt;, &lt;span class=&#34;comment&#34;&gt;//SFTP服务器用户名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;quot;password&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$password&lt;/span&gt;, &lt;span class=&#34;comment&#34;&gt;//SFTP服务器密码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;quot;port&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$port&lt;/span&gt;,   &lt;span class=&#34;comment&#34;&gt;//SFTP服务器端口号&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ]; &lt;span class=&#34;comment&#34;&gt;//secret&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;connect = &lt;span class=&#34;title function_ invoke__&#34;&gt;ssh2_connect&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$sftpConfig&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;host&amp;#x27;&lt;/span&gt;], &lt;span class=&#34;variable&#34;&gt;$sftpConfig&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;port&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;// 使用用户名和密码登录&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;title function_ invoke__&#34;&gt;ssh2_auth_password&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$this&lt;/span&gt;-&amp;gt;connect, &lt;span class=&#34;variable&#34;&gt;$sftpConfig&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;username&amp;#x27;&lt;/span&gt;], &lt;span class=&#34;variable&#34;&gt;$sftpConfig&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;sftp = &lt;span class=&#34;title function_ invoke__&#34;&gt;ssh2_sftp&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$this&lt;/span&gt;-&amp;gt;connect);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 下载文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;download&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$remote&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$local&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;copy&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;ssh2.sftp://&lt;span class=&#34;subst&#34;&gt;&amp;#123;$this-&amp;gt;sftp&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt; . &lt;span class=&#34;variable&#34;&gt;$remote&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$local&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 文件上传&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;upload&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$remote&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$local&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;bool&lt;/span&gt; //, $&lt;span class=&#34;title&#34;&gt;file_mode&lt;/span&gt; = 0777&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;copy&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$local&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;quot;ssh2.sftp://&lt;span class=&#34;subst&#34;&gt;&amp;#123;$this-&amp;gt;sftp&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt; . &lt;span class=&#34;variable&#34;&gt;$remote&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 创建目录&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;mkdir&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$path&lt;/span&gt;&lt;/span&gt;)  //使用创建目录循环&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;title function_ invoke__&#34;&gt;ssh2_sftp_mkdir&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$this&lt;/span&gt;-&amp;gt;sftp, &lt;span class=&#34;variable&#34;&gt;$path&lt;/span&gt;, &lt;span class=&#34;number&#34;&gt;0777&lt;/span&gt;, &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;files&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$remote&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;bool&lt;/span&gt;|&lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$files&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;scandir&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;ssh2.sftp://&lt;span class=&#34;subst&#34;&gt;&amp;#123;$this-&amp;gt;sftp&amp;#125;&lt;/span&gt;&lt;span class=&#34;subst&#34;&gt;&amp;#123;$remote&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;array_diff&lt;/span&gt;( &lt;span class=&#34;variable&#34;&gt;$files&lt;/span&gt;, [&lt;span class=&#34;string&#34;&gt;&amp;#x27;.&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;..&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// 判段目录或者文件是否存在&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;exits&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$dir&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;file_exists&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;quot;ssh2.sftp://&lt;span class=&#34;subst&#34;&gt;&amp;#123;$this-&amp;gt;sftp&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt; . &lt;span class=&#34;variable&#34;&gt;$dir&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;__destruct&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;connect) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;title function_ invoke__&#34;&gt;ssh2_disconnect&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$this&lt;/span&gt;-&amp;gt;connect);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2024/01/10/DTO/</guid>
            <title>使用DTO进行方法间的数据传输</title>
            <link>https://alon.wang/2024/01/10/DTO/</link>
            <category>php</category>
            <category>laravel</category>
            <category>代码规范</category>
            <pubDate>Wed, 10 Jan 2024 16:45:06 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;使用DTO进行方法间的数据传输&#34;&gt;&lt;a href=&#34;#使用DTO进行方法间的数据传输&#34; class=&#34;headerlink&#34; title=&#34;使用DTO进行方法间的数据传输&#34;&gt;&lt;/a&gt;使用DTO进行方法间的数据传输&lt;/h1&gt;&lt;p&gt;工作中经常会遇到方法需要的参数很多的情况。以下拿php举栗&lt;/p&gt;
&lt;h2 id=&#34;以往的弊端&#34;&gt;&lt;a href=&#34;#以往的弊端&#34; class=&#34;headerlink&#34; title=&#34;以往的弊端&#34;&gt;&lt;/a&gt;以往的弊端&lt;/h2&gt;&lt;p&gt;很多情况下是直接一个个形参列举开来，但往往很难维护或者阅读代码：&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;supplementContract&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$appId&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$ecid&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$mtchId&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$certNo&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$file&lt;/span&gt;, &lt;span class=&#34;keyword&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$type&lt;/span&gt; = &lt;span class=&#34;number&#34;&gt;2&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;又或者数组传参，但往往又不能保证数组内的值是否规范，而需要再在方法中验证，徒增烦恼：&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;createInvoice&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$requestData&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;validation&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$requestData&lt;/span&gt;, [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;taxInclusiveTotalAmount&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;invoiceType&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required|in:004,007,026,027&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;goodsName&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;adresseeName&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;adresseePhone&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;provinceName&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;cityName&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;areaName&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;detailedAddress&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;address&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;telephone&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;openningBank&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;accountBank&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ], [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;taxInclusiveTotalAmount.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;价税合计必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;invoiceType.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票类型必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;invoiceType.in&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票类型非法,仅支持004:专票, 007:普票, 026:电子普票, 027:电子专票&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;goodsName.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;开票项目必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;adresseeName.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;收件人姓名必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;adresseePhone.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;收件人电话必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;provinceName.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;省名称必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;cityName.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;市名称必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;areaName.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;区名称必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;detailedAddress.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;详细地址必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;address.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票抬头地址必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;telephone.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票抬头电话必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;openningBank.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票抬头开户行必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;accountBank.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;发票抬头银行账号必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;此时，DTO就可以很好的解决这个问题；&lt;/p&gt;
&lt;h2 id=&#34;什么是DTO&#34;&gt;&lt;a href=&#34;#什么是DTO&#34; class=&#34;headerlink&#34; title=&#34;什么是DTO&#34;&gt;&lt;/a&gt;什么是DTO&lt;/h2&gt;&lt;p&gt;DTO即Data Transfer Object（数据传输对象）的简称。&lt;/p&gt;
&lt;p&gt;我们可以搭配spatie家的&lt;a href=&#34;https://github.com/spatie/data-transfer-object&#34;&gt;data-transfer-object&lt;/a&gt;来实现。&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer &lt;span class=&#34;keyword&#34;&gt;require&lt;/span&gt; spatie/data-transfer-&lt;span class=&#34;keyword&#34;&gt;object&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;UserDTO&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; \&lt;span class=&#34;title&#34;&gt;Spatie&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;DataTransferObject&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;DataTransferObject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$age&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$company&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt; = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;UserDTO&lt;/span&gt;([&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;Tom&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;age&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;18&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;company&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;996&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// 将$user作为参数传递即可&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// &amp;#x27;tom&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;var_dump&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;toArray&lt;/span&gt;());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//array(3) &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  [&amp;quot;name&amp;quot;]=&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  string(3) &amp;quot;Tom&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  [&amp;quot;age&amp;quot;]=&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  string(2) &amp;quot;18&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  [&amp;quot;company&amp;quot;]=&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//  string(3) &amp;quot;996&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;更多data-transfer-object用法，前往其&lt;a href=&#34;https://github.com/spatie/data-transfer-object&#34;&gt;github&lt;/a&gt;查看&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2023/11/20/centos-error1/</guid>
            <title>解决 centos使用node 报错 version &#39;GLIBC_2.27&#39; not found</title>
            <link>https://alon.wang/2023/11/20/centos-error1/</link>
            <category>Error</category>
            <category>CentOs</category>
            <pubDate>Mon, 20 Nov 2023 11:48:22 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;解决-centos使用node-报错-version-‘GLIBC-2-27’-not-found…&#34;&gt;&lt;a href=&#34;#解决-centos使用node-报错-version-‘GLIBC-2-27’-not-found…&#34; class=&#34;headerlink&#34; title=&#34;解决 centos使用node 报错 version ‘GLIBC_2.27’ not found…&#34;&gt;&lt;/a&gt;解决 centos使用node 报错 version ‘GLIBC_2.27’ not found…&lt;/h1&gt;&lt;p&gt;完整报错&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;node -v&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;node: /lib64/libm.so.6: version `GLIBC_2.27&lt;span class=&#34;string&#34;&gt;&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;node: /lib64/libc.so.6: version `GLIBC_2.25&amp;#x27;&lt;/span&gt; not found (required by node)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;node: /lib64/libc.so.6: version `GLIBC_2.28&lt;span class=&#34;string&#34;&gt;&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9&amp;#x27;&lt;/span&gt; not found (required by node)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20&lt;span class=&#34;string&#34;&gt;&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21&amp;#x27;&lt;/span&gt; not found (required by node)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;报错原因&#34;&gt;&lt;a href=&#34;#报错原因&#34; class=&#34;headerlink&#34; title=&#34;报错原因&#34;&gt;&lt;/a&gt;报错原因&lt;/h2&gt;&lt;p&gt;网上查了一下貌似是因为centos现在不维护了。导致安装最小的node之后，系统里这些东西版本太低不支持。&lt;/p&gt;
&lt;h2 id=&#34;先查看系统内的glibc版本&#34;&gt;&lt;a href=&#34;#先查看系统内的glibc版本&#34; class=&#34;headerlink&#34; title=&#34;先查看系统内的glibc版本&#34;&gt;&lt;/a&gt;先查看系统内的glibc版本&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;strings /lib64/libc.so.6 |grep GLIBC_&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;上面命令执行完，会发现GLIBC版本缺少报错里所需的几个版本&lt;/p&gt;
&lt;h2 id=&#34;安装glibc&#34;&gt;&lt;a href=&#34;#安装glibc&#34; class=&#34;headerlink&#34; title=&#34;安装glibc&#34;&gt;&lt;/a&gt;安装glibc&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 编译安装glibc&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; /root&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 下载tar包&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 解压tar包&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;tar xf glibc-2.28.tar.gz &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 删除安装包&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;rm&lt;/span&gt; glibc-2.28.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 编译&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; glibc-2.28/ &amp;amp;&amp;amp; &lt;span class=&#34;built_in&#34;&gt;mkdir&lt;/span&gt; build  &amp;amp;&amp;amp; &lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; build&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;注意这里可能在最后输出报错，如果报错则下一步，没报错的话继续执行&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 安装glibc&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make &amp;amp;&amp;amp; make install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;处理glibc编译报错&#34;&gt;&lt;a href=&#34;#处理glibc编译报错&#34; class=&#34;headerlink&#34; title=&#34;处理glibc编译报错&#34;&gt;&lt;/a&gt;处理glibc编译报错&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;如果上一步编译没有报错，略过，直接下一步&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上一步的最后可能会报错&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# configure: error: &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# *** These critical programs are missing or too old: compiler&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# *** Check the INSTALL file for required versions.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;如果报错了，则需要升级gcc和make&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 安装GCC&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install -y devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 设置环境变量&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;quot;source /opt/rh/devtoolset-8/enable&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;source&lt;/span&gt; /etc/profile&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 升级 make&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;wget https://ftp.gnu.org/gnu/make/make-4.3.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;tar -xzvf make-4.3.tar.gz &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;rm&lt;/span&gt; make-4.3.tar.gz&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; make-4.3/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;./configure  --prefix=/usr/local/make&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make &amp;amp;&amp;amp; make install&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 创建软链接&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; /usr/bin/ &amp;amp;&amp;amp; &lt;span class=&#34;built_in&#34;&gt;mv&lt;/span&gt; make make.bak&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;ln&lt;/span&gt; -sv /usr/local/make/bin/make /usr/bin/make&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 重新编译上一步的glibc&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; /root/glibc-2.28/build&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 安装glibc&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;make &amp;amp;&amp;amp; make install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;验证glibc版本&#34;&gt;&lt;a href=&#34;#验证glibc版本&#34; class=&#34;headerlink&#34; title=&#34;验证glibc版本&#34;&gt;&lt;/a&gt;验证glibc版本&lt;/h2&gt;&lt;p&gt;此时再查看一下glibc版本&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;strings /lib64/libc.so.6 |grep GLIBC_&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;会发现所需版本已经安装好了。继续执行&lt;code&gt;node -v&lt;/code&gt;发现依然会报错，但少了两个&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;node -v&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21&amp;#x27; not found (required by node)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;更新libstdc&#34;&gt;&lt;a href=&#34;#更新libstdc&#34; class=&#34;headerlink&#34; title=&#34;更新libstdc&#34;&gt;&lt;/a&gt;更新libstdc&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 安装libstdc&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install libstdc++.so.6 -y&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 查看CXXABI版本&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;strings /usr/lib/libstdc++.so.6 | grep &lt;span class=&#34;string&#34;&gt;&amp;#x27;CXXABI&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 下载需要的libstdc版本&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 更新软连接&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cp&lt;/span&gt; libstdc++.so.6.0.26 /usr/lib64/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; /usr/lib64&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;ln&lt;/span&gt; -snf ./libstdc++.so.6.0.26 libstdc++.so.6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;验证&#34;&gt;&lt;a href=&#34;#验证&#34; class=&#34;headerlink&#34; title=&#34;验证&#34;&gt;&lt;/a&gt;验证&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;node -v&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;18.17.1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;ok~~&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2023/10/17/wechatPayAgent/</guid>
            <title>微信支付（服务商模式）生成商户证书及平台证书</title>
            <link>https://alon.wang/2023/10/17/wechatPayAgent/</link>
            <category>php</category>
            <category>微信支付</category>
            <pubDate>Tue, 17 Oct 2023 10:02:36 +0800</pubDate>
            <description><![CDATA[ &lt;ul&gt;
&lt;li&gt;按 &lt;a href=&#34;https://kf.qq.com/faq/161222NneAJf161222U7fARv.html&#34;&gt;如何获取商户API证书？&lt;/a&gt; 下载商户秘钥，最后获得三个证书如下&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/WeChat37a6b53e62a269fb4add7f722371e3a5.jpg&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置v3Key，随机的32位数字即可&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/1697507690054.jpg&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用composer生成平台证书&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer &lt;span class=&#34;built_in&#34;&gt;exec&lt;/span&gt; CertificateDownloader.php -- -k &lt;span class=&#34;variable&#34;&gt;$&amp;#123;apiV3key&amp;#125;&lt;/span&gt; -m &lt;span class=&#34;variable&#34;&gt;$&amp;#123;mchId&amp;#125;&lt;/span&gt; -f &lt;span class=&#34;variable&#34;&gt;$&amp;#123;mchPrivateKeyFilePath&amp;#125;&lt;/span&gt; -s &lt;span class=&#34;variable&#34;&gt;$&amp;#123;mchSerialNo&amp;#125;&lt;/span&gt; -o &lt;span class=&#34;variable&#34;&gt;$&amp;#123;outputFilePath&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;apiV3key:第二部设置的32位key&lt;/p&gt;
&lt;p&gt;mchId:服务商的商户号&lt;/p&gt;
&lt;p&gt;mchPrivateKeyFilePath:第一步生成的证书里的apiclient_key.pem路径，不要带\，不然生成可能会失败&lt;/p&gt;
&lt;p&gt;mchSerialNo：服务商的证书序列号&lt;/p&gt;
&lt;p&gt;outputFilePath:平台证书生成路径&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2023/05/30/interventionImage/</guid>
            <title>laravel使用Intervention\Image扩展压缩图片</title>
            <link>https://alon.wang/2023/05/30/interventionImage/</link>
            <category>php</category>
            <category>扩展</category>
            <pubDate>Tue, 30 May 2023 18:16:02 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;记录一下使用Intervention-Image压缩图片&#34;&gt;&lt;a href=&#34;#记录一下使用Intervention-Image压缩图片&#34; class=&#34;headerlink&#34; title=&#34;记录一下使用Intervention\Image压缩图片&#34;&gt;&lt;/a&gt;记录一下使用Intervention\Image压缩图片&lt;/h1&gt;&lt;h2 id=&#34;安装扩展&#34;&gt;&lt;a href=&#34;#安装扩展&#34; class=&#34;headerlink&#34; title=&#34;安装扩展&#34;&gt;&lt;/a&gt;安装扩展&lt;/h2&gt;&lt;p&gt;&lt;code&gt;composer require intervention/image&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;确保php安装了GD库或者 Imagick才可以使用，默认使用Gd库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;使用&#34;&gt;&lt;a href=&#34;#使用&#34; class=&#34;headerlink&#34; title=&#34;使用&#34;&gt;&lt;/a&gt;使用&lt;/h2&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;use Intervention\Image\Facades\Image;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;//打开图片文件()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;$img = Image::make(&amp;#x27;public/foo.jpg&amp;#x27;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;//按宽300，等比缩放图片&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;$content = $img-&amp;gt;resize(300, null, function ($constraint) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			$constraint-&amp;gt;aspectRatio();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;#125;)-&amp;gt;stream();&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;方法使用&#34;&gt;&lt;a href=&#34;#方法使用&#34; class=&#34;headerlink&#34; title=&#34;方法使用&#34;&gt;&lt;/a&gt;方法使用&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;make(资源) ：支持二进制流、文件流、base64文件流、文件绝对路径、Gd库文件资源、Imagick文件资源等。具体可看下面代码&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/image-zpgn.png&#34; alt=&#34;image-zpgn.png&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;resize（宽，高，闭包）:重置大小。宽高两个参数为整数，闭包支持下列两方法：&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; (&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$constraint&lt;/span&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$constraint&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;aspectRatio&lt;/span&gt;();&lt;span class=&#34;comment&#34;&gt;//保持图片的纵横比例，宽高只上送一个时，该方法可以保持比例不失调&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$constraint&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;upsize&lt;/span&gt;();&lt;span class=&#34;comment&#34;&gt;//防止图片放大&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;具体可参考&lt;a href=&#34;https://image.intervention.io/v2/api/resize&#34;&gt;文档（resize）&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stream()：转为文件流&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;更多用法参考文档&#34;&gt;&lt;a href=&#34;#更多用法参考文档&#34; class=&#34;headerlink&#34; title=&#34;更多用法参考文档&#34;&gt;&lt;/a&gt;更多用法参考&lt;a href=&#34;https://image.intervention.io/v2/introduction/installation#integration-in-laravel&#34;&gt;文档&lt;/a&gt;&lt;/h2&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2022/12/16/metingJs/</guid>
            <title>使用MetingJs作为音乐外链播放器</title>
            <link>https://alon.wang/2022/12/16/metingJs/</link>
            <category>blog</category>
            <pubDate>Fri, 16 Dec 2022 11:55:30 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;使用MetingJS实现在任意地方使用外链播放器,在需要使用的地方插入如下html即可&lt;/p&gt;
&lt;figure class=&#34;highlight html&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;rel&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;href&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;src&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;script&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;src&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;meting-js&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;id&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;000owF6o3sHj50&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;server&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;tencent&amp;quot;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;type&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;song&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;autoplay&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;loop&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;all&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;order&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;attr&#34;&gt;list-folded&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;meting-js&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;是否必填&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;id（播放id）&lt;/td&gt;
&lt;td&gt;必填&lt;/td&gt;
&lt;td&gt;填入歌曲id、歌单id、专辑id、搜索关键字均可&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server（音乐平台）&lt;/td&gt;
&lt;td&gt;必填&lt;/td&gt;
&lt;td&gt;填netease（网抑云）,tencent（qq音乐）,kugou（酷狗音乐）,xiami（虾米音乐）,baidu（百度音乐）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;type（id类型）&lt;/td&gt;
&lt;td&gt;必填&lt;/td&gt;
&lt;td&gt;song（单曲）,playlist（歌单）,album（专辑）,search（搜索）,artist（艺术家）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autoplay（自动播放）&lt;/td&gt;
&lt;td&gt;非必填&lt;/td&gt;
&lt;td&gt;false（默认值），true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop（循环播放）&lt;/td&gt;
&lt;td&gt;非必填&lt;/td&gt;
&lt;td&gt;all(全部循环，默认值), one（单曲循环）, none（不循环）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;order（播放顺序）&lt;/td&gt;
&lt;td&gt;非必填&lt;/td&gt;
&lt;td&gt;list(顺序播放，默认值)，random（随机播放）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list-folded（播放列表是否折叠）&lt;/td&gt;
&lt;td&gt;非必填&lt;/td&gt;
&lt;td&gt;false（默认值），true&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href=&#34;https://gitee.com/mirrors_metowolf/MetingJS?_from=gitee_search&#34;&gt;MetingJS项目地址&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2022/12/15/imageBed/</guid>
            <title>使用github+PicGo搭建免费图床,并使用jsdeliver加速</title>
            <link>https://alon.wang/2022/12/15/imageBed/</link>
            <category>blog</category>
            <pubDate>Thu, 15 Dec 2022 13:39:59 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;使用github搭建图床-并使用jsdeliver加速&#34;&gt;&lt;a href=&#34;#使用github搭建图床-并使用jsdeliver加速&#34; class=&#34;headerlink&#34; title=&#34;使用github搭建图床,并使用jsdeliver加速&#34;&gt;&lt;/a&gt;使用github搭建图床,并使用jsdeliver加速&lt;/h1&gt;&lt;h2 id=&#34;github设置&#34;&gt;&lt;a href=&#34;#github设置&#34; class=&#34;headerlink&#34; title=&#34;github设置&#34;&gt;&lt;/a&gt;github设置&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在github中新建一个公开仓库,仓库名称随意&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在github的设置中添加 &lt;a href=&#34;https://github.com/settings/tokens&#34;&gt;私人令牌token&lt;/a&gt;,令牌在后面使用PicGo作为图床客户端时有用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;token名字随便取,要勾选repo项。token有效期如果不考虑安全性可以选不过期,然后创建即可。记得保存好token,只有生成时可见。&lt;/p&gt;
&lt;h2 id=&#34;使用jsdelivr进行cdn加速&#34;&gt;&lt;a href=&#34;#使用jsdelivr进行cdn加速&#34; class=&#34;headerlink&#34; title=&#34;使用jsdelivr进行cdn加速&#34;&gt;&lt;/a&gt;使用jsdelivr进行cdn加速&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;国内访问github难免会慢或者无法访问,使用jsdelivr加速一波&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;使用&lt;a href=&#34;https://www.jsdelivr.com/&#34;&gt;jsdelivr官网&lt;/a&gt;里github选项的这一条。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;无需什么配置,只需把链接中&lt;code&gt;user&lt;/code&gt;换成github用户名,&lt;code&gt;repo&lt;/code&gt;换成仓库名,&lt;code&gt;version&lt;/code&gt;换成分支名称,&lt;code&gt;file&lt;/code&gt;换成图片在仓库中的路径即可,例如&lt;br&gt;&lt;a href=&#34;https://cdn.jsdelivr.net/gh/ashin33/alon-images@master/images/south_country.jpg&#34;&gt;https:&amp;#x2F;&amp;#x2F;cdn.jsdelivr.net&amp;#x2F;gh&amp;#x2F;ashin33&amp;#x2F;alon-images@master&amp;#x2F;images&amp;#x2F;south_country.jpg&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用PicGo作为图床客户端&#34;&gt;&lt;a href=&#34;#使用PicGo作为图床客户端&#34; class=&#34;headerlink&#34; title=&#34;使用PicGo作为图床客户端&#34;&gt;&lt;/a&gt;使用PicGo作为图床客户端&lt;/h2&gt;&lt;p&gt;&lt;a href=&#34;https://mirrors.sdu.edu.cn/github-release/Molunerfinn_PicGo/&#34;&gt;PicGo下载地址&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PicGo设置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在PicGo中选择Github作为图床,并按要求设置即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上面token为前面保存的github私人令牌&lt;br&gt;自定义域名为上面jsdelivr加速的配置,但要注意只填写到分支名就好了,因为目录在PicGo里上面设置过了,域名这里再设置的话,自动生成的访问地址会访问不到&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;就这样可以愉快上传图片啦&#34;&gt;&lt;a href=&#34;#就这样可以愉快上传图片啦&#34; class=&#34;headerlink&#34; title=&#34;就这样可以愉快上传图片啦&#34;&gt;&lt;/a&gt;就这样可以愉快上传图片啦&lt;/h2&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2022/02/04/ubuntu-lnmp/</guid>
            <title>Ubuntu系统下安装LNMP</title>
            <link>https://alon.wang/2022/02/04/ubuntu-lnmp/</link>
            <category>Ubuntu</category>
            <pubDate>Fri, 04 Feb 2022 15:32:41 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;php&#34;&gt;&lt;a href=&#34;#php&#34; class=&#34;headerlink&#34; title=&#34;php&#34;&gt;&lt;/a&gt;php&lt;/h1&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 添加源&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt -y install software-properties-common&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo add-apt-repository ppa:ondrej/php&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 更新源&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt update&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 安装php8.0-fpm&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt -y install php8.0-fpm&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 安装扩展&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt install -y php8.0-&amp;#123;bcmath,bz2,intl,gd,mbstring,mysql,zip,gd,curl,imagick,xml,redis&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 检查php配置是否有误&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo php-fpm8.0 -t&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 重启php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo service php8.0-fpm restart&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;#查看当前安装了哪些版本的PHP&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;dpkg -l | grep php&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;nginx&#34;&gt;&lt;a href=&#34;#nginx&#34; class=&#34;headerlink&#34; title=&#34;nginx&#34;&gt;&lt;/a&gt;nginx&lt;/h1&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo nginx=stable &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo add-apt-repository ppa:nginx/&lt;span class=&#34;variable&#34;&gt;$nginx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt update&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt install nginx&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;#启动nginx&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo systemctl start nginx&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;#nginx开机自启动&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo systemctl &lt;span class=&#34;built_in&#34;&gt;enable&lt;/span&gt; nginx&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;mysql&#34;&gt;&lt;a href=&#34;#mysql&#34; class=&#34;headerlink&#34; title=&#34;mysql&#34;&gt;&lt;/a&gt;mysql&lt;/h1&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;wget -c https://repo.mysql.com/mysql-apt-config_0.8.20-1_all.deb&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo dpkg -i mysql-apt-config_0.8.20-1_all.deb&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt update&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo apt install mysql-server mysql-client&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;添加root用户和密码&#34;&gt;&lt;a href=&#34;#添加root用户和密码&#34; class=&#34;headerlink&#34; title=&#34;添加root用户和密码&#34;&gt;&lt;/a&gt;添加root用户和密码&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;#查看默认用户和密码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo &lt;span class=&#34;built_in&#34;&gt;cat&lt;/span&gt; /etc/mysql/debian.cnf&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16442037102415.jpg&#34; alt=&#34;16442037102415.jpg&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mysql -u debian-sys-maint -p    &lt;span class=&#34;comment&#34;&gt;# 换行后输入上述查到的密码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;use mysql;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 刷新权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;flush privileges;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 添加用户&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ALTER USER &lt;span class=&#34;string&#34;&gt;&amp;#x27;root&amp;#x27;&lt;/span&gt;@&lt;span class=&#34;string&#34;&gt;&amp;#x27;localhost&amp;#x27;&lt;/span&gt; IDENTIFIED WITH caching_sha2_password BY &lt;span class=&#34;string&#34;&gt;&amp;#x27;密码&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 刷新权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;flush privileges;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;quit;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 重启mysql&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;service mysql restart&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;配置外网navicat可访问mysql&#34;&gt;&lt;a href=&#34;#配置外网navicat可访问mysql&#34; class=&#34;headerlink&#34; title=&#34;配置外网navicat可访问mysql&#34;&gt;&lt;/a&gt;配置外网navicat可访问mysql&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;mysql -u root -p&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;use mysql；&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;update user &lt;span class=&#34;built_in&#34;&gt;set&lt;/span&gt; host=&lt;span class=&#34;string&#34;&gt;&amp;#x27;%&amp;#x27;&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;where&lt;/span&gt; user=&lt;span class=&#34;string&#34;&gt;&amp;#x27;root&amp;#x27;&lt;/span&gt; and host=&lt;span class=&#34;string&#34;&gt;&amp;#x27;localhost&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;flush privileges;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 在bin-address  = 127.0.0.1前添加#号&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16442040075215.jpg&#34; alt=&#34;16442040075215.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo service mysql restart&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16442040753811.jpg&#34; alt=&#34;16442040753811.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/WeChatcad30b1452273adfd4b51d8a6e18dae8.png&#34; alt=&#34;WeChatcad30b1452273adfd4b51d8a6e18dae8.png&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/12/08/stub/</guid>
            <title>使用stub配合laravel-excel实现后台运行的excel下载中心</title>
            <link>https://alon.wang/2021/12/08/stub/</link>
            <category>php</category>
            <category>laravel</category>
            <pubDate>Wed, 08 Dec 2021 11:27:59 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;创建模板stub&#34;&gt;&lt;a href=&#34;#创建模板stub&#34; class=&#34;headerlink&#34; title=&#34;创建模板stub&#34;&gt;&lt;/a&gt;创建模板stub&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;建一个stub模板,用于下面使用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在resources下新建stubs目录用于存储&lt;br&gt;新建一个query-download.stub&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;DummyNamespace&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exports&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;QueryExport&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;DummyClass&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;QueryExport&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;headings&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//表头&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;             &lt;span class=&#34;comment&#34;&gt;//&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;columns&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$row&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//每一列的数据&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;             &lt;span class=&#34;comment&#34;&gt;//&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;stringColumns&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//要转为字符串的列标&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;//&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;         ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;stub占位符介绍&#34;&gt;&lt;a href=&#34;#stub占位符介绍&#34; class=&#34;headerlink&#34; title=&#34;stub占位符介绍&#34;&gt;&lt;/a&gt;stub占位符介绍&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;stub文件中会有很多占位符,下面说几个,还有很多占位符,后面再熟悉一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;DummyNamespace : 命名空间&lt;/li&gt;
&lt;li&gt;DummyRootNamespace : 根命名空间&lt;/li&gt;
&lt;li&gt;DummyClass : 类名&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;创建command命令&#34;&gt;&lt;a href=&#34;#创建command命令&#34; class=&#34;headerlink&#34; title=&#34;创建command命令&#34;&gt;&lt;/a&gt;创建command命令&lt;/h1&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;php artisan make:command Make/Download&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;生成好的新的command,需要如下操作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;修改继承GeneratorCommand类并必须实现getStub方法&lt;/li&gt;
&lt;li&gt;移除自动生成的&lt;code&gt;protected $signature&lt;/code&gt;改为&lt;code&gt;protected $name&lt;/code&gt;,其中$name就是最后要执行的命令了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面直接上代码&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Console&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Commands&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Make&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Console&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;GeneratorCommand&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Symfony&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Component&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Console&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Input&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;InputOption&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Download&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;GeneratorCommand&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * 运行的命令&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;make:download&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * The console command description.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$description&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;生成下载中心&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * 这里是声明生成的文件类型,在新建成功时,命令行会显示xxx created successfully.这里的xxx在这就是Download&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$type&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;Download&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * 文件模板的地址,这里就是第一步新建的stub文件的路径&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;getStub&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;	&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;option&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;array&amp;#x27;&lt;/span&gt;)) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;base_path&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;resources/stubs/array-download.stub&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;#125;&lt;span class=&#34;keyword&#34;&gt;else&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;base_path&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;resources/stubs/query-download.stub&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * 获取文件的默认的命名空间,因为文件打算建立在app下的Exports目录下,所以修改了一下这个文件,若要生成在app下,可不重写此方法&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * Get the default namespace for the class.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@param&lt;/span&gt;  string  $rootNamespace&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; string&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;getDefaultNamespace&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$rootNamespace&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;string&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;	&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$rootNamespace&lt;/span&gt; . &lt;span class=&#34;string&#34;&gt;&amp;#x27;\Exports&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * 定义可输入的参数&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * Get the console command options.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;	 */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;getOptions&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;	&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		&lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;comment&#34;&gt;//VALUE_NONE 不接受选项的输入,默认值&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;comment&#34;&gt;//VALUE_REQUIRED 必须传入一个值&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;comment&#34;&gt;//VALUE_OPTIONAL 可以传值也可以不传值&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;comment&#34;&gt;//VALUE_IS_ARRAY 可以传多个值 --dir=/foo --dir=/bar&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			&lt;span class=&#34;comment&#34;&gt;//VALUE_NEGATABLE 可以正值也可以负值&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			[&lt;span class=&#34;string&#34;&gt;&amp;#x27;query&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;title class_&#34;&gt;InputOption&lt;/span&gt;::&lt;span class=&#34;variable constant_&#34;&gt;VALUE_NONE&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;Generate an export for a query.&amp;#x27;&lt;/span&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;			[&lt;span class=&#34;string&#34;&gt;&amp;#x27;array&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;title class_&#34;&gt;InputOption&lt;/span&gt;::&lt;span class=&#34;variable constant_&#34;&gt;VALUE_NONE&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;Generate an export for an array.&amp;#x27;&lt;/span&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;		];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;	&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;其他可用方法&#34;&gt;&lt;a href=&#34;#其他可用方法&#34; class=&#34;headerlink&#34; title=&#34;其他可用方法&#34;&gt;&lt;/a&gt;其他可用方法&lt;/h2&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;buildClass&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//可以根据传入的参数,自定义其他操作&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;replaceNamespace&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&amp;amp;&lt;span class=&#34;variable&#34;&gt;$stub&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$name&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;       &lt;span class=&#34;comment&#34;&gt;//可以修改底层占位符和自定义占位符&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;使用&#34;&gt;&lt;a href=&#34;#使用&#34; class=&#34;headerlink&#34; title=&#34;使用&#34;&gt;&lt;/a&gt;使用&lt;/h2&gt;&lt;h3 id=&#34;query类型测试&#34;&gt;&lt;a href=&#34;#query类型测试&#34; class=&#34;headerlink&#34; title=&#34;query类型测试&#34;&gt;&lt;/a&gt;query类型测试&lt;/h3&gt;&lt;p&gt;执行生成命令,生成query类型的下载器&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16395675015323.jpg&#34; alt=&#34;16395675015323.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16395675390875.jpg&#34; alt=&#34;16395675390875.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;array类型测试&#34;&gt;&lt;a href=&#34;#array类型测试&#34; class=&#34;headerlink&#34; title=&#34;array类型测试&#34;&gt;&lt;/a&gt;array类型测试&lt;/h3&gt;&lt;p&gt;执行生成命令,生成array类型的下载器&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16395676227417.jpg&#34; alt=&#34;16395676227417.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16395676560450.jpg&#34; alt=&#34;16395676560450.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;ok,就酱&lt;/p&gt;
&lt;p&gt;&amp;#96;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/07/10/tips/</guid>
            <title>tips</title>
            <link>https://alon.wang/2021/07/10/tips/</link>
            <category>tip</category>
            <pubDate>Sat, 10 Jul 2021 16:39:04 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;前端&#34;&gt;&lt;a href=&#34;#前端&#34; class=&#34;headerlink&#34; title=&#34;前端&#34;&gt;&lt;/a&gt;前端&lt;/h1&gt;&lt;h2 id=&#34;vue&#34;&gt;&lt;a href=&#34;#vue&#34; class=&#34;headerlink&#34; title=&#34;vue&#34;&gt;&lt;/a&gt;vue&lt;/h2&gt;&lt;h3 id=&#34;vue3-ts实现后端返回文件流-前端下载&#34;&gt;&lt;a href=&#34;#vue3-ts实现后端返回文件流-前端下载&#34; class=&#34;headerlink&#34; title=&#34;vue3+ts实现后端返回文件流,前端下载&#34;&gt;&lt;/a&gt;vue3+ts实现后端返回文件流,前端下载&lt;/h3&gt;&lt;figure class=&#34;highlight javascript&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// product.ts文件定义接口&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;batchImportTemplate&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; axios.&lt;span class=&#34;title function_&#34;&gt;get&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;/product_import_batches/template&amp;#x27;&lt;/span&gt;, &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;attr&#34;&gt;responseType&lt;/span&gt;: &lt;span class=&#34;string&#34;&gt;&amp;#x27;blob&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;figure class=&#34;highlight javascript&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//vue文件中实现下载&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;downloadTemplate&lt;/span&gt; = &lt;span class=&#34;keyword&#34;&gt;async&lt;/span&gt; (&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;) =&amp;gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    downloadLoading.&lt;span class=&#34;property&#34;&gt;value&lt;/span&gt; = &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;title function_&#34;&gt;batchImportTemplate&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        .&lt;span class=&#34;title function_&#34;&gt;then&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;(&lt;span class=&#34;params&#34;&gt;response&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// 获取文件名（从响应头中获取，或者自己指定）&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; filename = &lt;span class=&#34;string&#34;&gt;&amp;#x27;批量上传模板.xlsx&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// 创建下载链接&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; blobUrl = &lt;span class=&#34;variable language_&#34;&gt;window&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;URL&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;createObjectURL&lt;/span&gt;(response.&lt;span class=&#34;property&#34;&gt;data&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;const&lt;/span&gt; downloadLink = &lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;createElement&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            downloadLink.&lt;span class=&#34;property&#34;&gt;href&lt;/span&gt; = blobUrl&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            downloadLink.&lt;span class=&#34;property&#34;&gt;download&lt;/span&gt; = filename&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;body&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;appendChild&lt;/span&gt;(downloadLink)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            downloadLink.&lt;span class=&#34;title function_&#34;&gt;click&lt;/span&gt;()&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;// 清理&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable language_&#34;&gt;window&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;URL&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;revokeObjectURL&lt;/span&gt;(blobUrl)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable language_&#34;&gt;document&lt;/span&gt;.&lt;span class=&#34;property&#34;&gt;body&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;removeChild&lt;/span&gt;(downloadLink)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        .&lt;span class=&#34;title function_&#34;&gt;catch&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;(&lt;span class=&#34;params&#34;&gt;error&lt;/span&gt;) =&amp;gt;&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable language_&#34;&gt;console&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;log&lt;/span&gt;(error)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;title class_&#34;&gt;Message&lt;/span&gt;.&lt;span class=&#34;title function_&#34;&gt;error&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;下载Excel失败，请重试&amp;#x27;&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        .&lt;span class=&#34;title function_&#34;&gt;finally&lt;/span&gt;(&lt;span class=&#34;function&#34;&gt;() =&amp;gt;&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            downloadLoading.&lt;span class=&#34;property&#34;&gt;value&lt;/span&gt; = &lt;span class=&#34;literal&#34;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;CSS&#34;&gt;&lt;a href=&#34;#CSS&#34; class=&#34;headerlink&#34; title=&#34;CSS&#34;&gt;&lt;/a&gt;CSS&lt;/h2&gt;&lt;h3 id=&#34;display&#34;&gt;&lt;a href=&#34;#display&#34; class=&#34;headerlink&#34; title=&#34;display&#34;&gt;&lt;/a&gt;display&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;定义元素的显示方式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;显示方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;inline&lt;/td&gt;
&lt;td&gt;元素被显示为内联元素，与相邻元素在同一行内显示。宽度和高度属性不起作用，margin和padding属性只能设置左右方向的值。常见的内联元素有span、a、img等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;block&lt;/td&gt;
&lt;td&gt;元素被显示为块级元素，独占一行。宽度和高度属性可以设置，margin和padding属性可以设置四个方向的值。常见的块级元素有div、p、h1等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inline-block&lt;/td&gt;
&lt;td&gt;元素被显示为内联块级元素，与相邻元素在同一行内显示。宽度和高度属性可以设置，margin和padding属性可以设置四个方向的值。常见的内联块级元素有button、input等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;元素不显示，即隐藏元素。元素在页面上不占据任何空间，也不响应交互事件。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;flex&lt;/td&gt;
&lt;td&gt;使用弹性布局方式显示元素，可以进行灵活的布局。它使得元素能够根据可用空间自动调整大小和位置。通常与flex-direction、flex-wrap等属性一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;grid&lt;/td&gt;
&lt;td&gt;使用网格布局方式显示元素，将元素放置在一个二维的网格中。网格布局提供了更精确的布局控制，可以定义行和列的大小、间距等。通常与grid-template-columns、grid-template-rows等属性一起使用。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;table&lt;/td&gt;
&lt;td&gt;元素被显示为表格，类似于HTML中的table元素。元素会被解析为一个表格对象，内部可以包含表头（thead）、表体（tbody）和表尾（tfoot）等子元素。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inline-table&lt;/td&gt;
&lt;td&gt;元素被显示为内联表格，与相邻元素在同一行内显示。类似于table属性，但是以内联元素的方式显示。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;list-item&lt;/td&gt;
&lt;td&gt;元素被显示为列表项，类似于HTML中的li元素。适用于无序列表（ul）和有序列表（ol）中的子项。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;inherit&lt;/td&gt;
&lt;td&gt;继承父元素的display属性值。如果没有父元素，则被视为block。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&#34;transform&#34;&gt;&lt;a href=&#34;#transform&#34; class=&#34;headerlink&#34; title=&#34;transform&#34;&gt;&lt;/a&gt;transform&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;元素的移动，放大。可以搭配&lt;code&gt;transform-origin&lt;/code&gt;属性修改原点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;显示方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;translate(x,y)&lt;/td&gt;
&lt;td&gt;水平移动 + 垂直移动，x(y)正数表示向右(下)移动，x(y)负数表示像左(上)移动 ,单位可以是px，或者百分比等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;translate(x,y,z)&lt;/td&gt;
&lt;td&gt;水平移动 + 垂直移动 + 放大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;translateX(x)&lt;/td&gt;
&lt;td&gt;水平移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;translateY(y)&lt;/td&gt;
&lt;td&gt;垂直移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;translateZ(z)&lt;/td&gt;
&lt;td&gt;放大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotate(angle)&lt;/td&gt;
&lt;td&gt;2d旋转,单位deg(度数)，turn(圈数，1圈&amp;#x3D;360度)，rad（弧度）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotateX(angle)&lt;/td&gt;
&lt;td&gt;以X轴为中心旋转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotateY(angle)&lt;/td&gt;
&lt;td&gt;以Y轴为中心旋转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotateZ(angle)&lt;/td&gt;
&lt;td&gt;以Z轴为中心旋转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rotate3d(x,y,z,angle)&lt;/td&gt;
&lt;td&gt;以Z轴为中心旋转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scale(s)&lt;/td&gt;
&lt;td&gt;整体缩放倍数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scale(sx,sy)&lt;/td&gt;
&lt;td&gt;水平缩放 + 垂直缩放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scaleX(sx)&lt;/td&gt;
&lt;td&gt;水平缩放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scaleY(sy)&lt;/td&gt;
&lt;td&gt;垂直缩放&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&#34;transform-origin&#34;&gt;&lt;a href=&#34;#transform-origin&#34; class=&#34;headerlink&#34; title=&#34;transform-origin&#34;&gt;&lt;/a&gt;transform-origin&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;修改&lt;code&gt;transform&lt;/code&gt;的移动原点，单位px或者百分比等&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;Deprecation-弃用警告修复&#34;&gt;&lt;a href=&#34;#Deprecation-弃用警告修复&#34; class=&#34;headerlink&#34; title=&#34;Deprecation 弃用警告修复&#34;&gt;&lt;/a&gt;Deprecation 弃用警告修复&lt;/h2&gt;&lt;h3 id=&#34;Deprecation-Warning-The-legacy-JS-API-is-deprecated-and-will-be-removed-in-Dart-Sass-2-0-0&#34;&gt;&lt;a href=&#34;#Deprecation-Warning-The-legacy-JS-API-is-deprecated-and-will-be-removed-in-Dart-Sass-2-0-0&#34; class=&#34;headerlink&#34; title=&#34;Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0&#34;&gt;&lt;/a&gt;Deprecation Warning: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;升级到vite6会默认使用modern api。就不会有这个报警了。不升级的话修改vite.config.ts配置也可以&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;vite版本小于5的情况,屏蔽该警告。该版本还不支持modern api&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;## vite.config.ts&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;import &amp;#123; defineConfig &amp;#125; from &amp;quot;vite&amp;quot;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;export default defineConfig(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  // ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  css: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    preprocessorOptions: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      scss: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        silenceDeprecations: [&amp;quot;legacy-js-api&amp;quot;]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  // ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;vite版本5的情况,切换到modern api&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;## vite.config.ts&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;import &amp;#123; defineConfig &amp;#125; from &amp;quot;vite&amp;quot;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;export default defineConfig(&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  // ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  css: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    preprocessorOptions: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      scss: &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        api: &amp;quot;modern-compiler&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  &amp;#125;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  // ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;The-CJS-build-of-Vite’s-Node-API-is-deprecated&#34;&gt;&lt;a href=&#34;#The-CJS-build-of-Vite’s-Node-API-is-deprecated&#34; class=&#34;headerlink&#34; title=&#34;The CJS build of Vite’s Node API is deprecated.&#34;&gt;&lt;/a&gt;The CJS build of Vite’s Node API is deprecated.&lt;/h3&gt;&lt;p&gt;在&lt;code&gt;package.json&lt;/code&gt;中添加配置 &lt;code&gt;&amp;quot;type&amp;quot;: &amp;quot;module&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h1 id=&#34;nginx&#34;&gt;&lt;a href=&#34;#nginx&#34; class=&#34;headerlink&#34; title=&#34;nginx&#34;&gt;&lt;/a&gt;nginx&lt;/h1&gt;&lt;h2 id=&#34;nginx请求域名转发&#34;&gt;&lt;a href=&#34;#nginx请求域名转发&#34; class=&#34;headerlink&#34; title=&#34;nginx请求域名转发&#34;&gt;&lt;/a&gt;nginx请求域名转发&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;server &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    listen 80;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;## 请求的域名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    server_name aa.com;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    proxy_buffer_size 1024k;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    proxy_buffers 16 1024k;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    proxy_busy_buffers_size 2048k;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    proxy_temp_file_write_size 2048k;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    location / &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      &lt;span class=&#34;comment&#34;&gt;## 实际请求的域名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      proxy_pass bb.com;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;ssl证书更换&#34;&gt;&lt;a href=&#34;#ssl证书更换&#34; class=&#34;headerlink&#34; title=&#34;ssl证书更换&#34;&gt;&lt;/a&gt;ssl证书更换&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;进腾讯云ssl证书控制台下载nginx证书&lt;/li&gt;
&lt;li&gt;进入ssl目录替换证书文件(具体ssl目录看nginx配置的ssl路径)&lt;/li&gt;
&lt;li&gt;nginx -s reload&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;linux&#34;&gt;&lt;a href=&#34;#linux&#34; class=&#34;headerlink&#34; title=&#34;linux&#34;&gt;&lt;/a&gt;linux&lt;/h1&gt;&lt;h2 id=&#34;杀掉端口占用进程&#34;&gt;&lt;a href=&#34;#杀掉端口占用进程&#34; class=&#34;headerlink&#34; title=&#34;杀掉端口占用进程&#34;&gt;&lt;/a&gt;杀掉端口占用进程&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;netstat -tunlp | grep 端口号 &lt;span class=&#34;comment&#34;&gt;# 查询占用的端口的进程id&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;kill&lt;/span&gt; -9 进程&lt;span class=&#34;built_in&#34;&gt;id&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;服务器时间校准&#34;&gt;&lt;a href=&#34;#服务器时间校准&#34; class=&#34;headerlink&#34; title=&#34;服务器时间校准&#34;&gt;&lt;/a&gt;服务器时间校准&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 安装ntp&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;yum install ntp&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 校准时间&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ntpdate cn.pool.ntp.org&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;根据文件大小筛选目录下的文件&#34;&gt;&lt;a href=&#34;#根据文件大小筛选目录下的文件&#34; class=&#34;headerlink&#34; title=&#34;根据文件大小筛选目录下的文件&#34;&gt;&lt;/a&gt;根据文件大小筛选目录下的文件&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 查看当前文件夹下大于5G的文件夹及文件,5G可以换成5M，5K&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;du&lt;/span&gt; -h --max-depth=1 --threshold=5G&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 查看当前文件夹的空间分布&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;du&lt;/span&gt; -sh *&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;zip压缩（解压）&#34;&gt;&lt;a href=&#34;#zip压缩（解压）&#34; class=&#34;headerlink&#34; title=&#34;zip压缩（解压）&#34;&gt;&lt;/a&gt;zip压缩（解压）&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;压缩目录成zip&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zip -r [压缩文件结果名] [要压缩的目录]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;压缩文件成zip&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zip [压缩文件结果名] [要压缩的文件1]  [要压缩的文件2] ...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解压zip文件到指定目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unzip -d [要解压到的目录] [被解压的zip文件]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;解压zip文件到当前目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unzip [被解压的zip文件]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;markdown&#34;&gt;&lt;a href=&#34;#markdown&#34; class=&#34;headerlink&#34; title=&#34;markdown&#34;&gt;&lt;/a&gt;markdown&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://plantuml.com/zh/sequence-diagram&#34;&gt;顺序图&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&#34;https://apps.timwhitlock.info/emoji/tables/unicode&#34;&gt;emoji&lt;/a&gt;里的Unicode编码,将&lt;code&gt;U+&lt;/code&gt;换成&lt;code&gt;&amp;amp;#x&lt;/code&gt;并在尾部追加&lt;code&gt;;&lt;/code&gt;即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;vim&#34;&gt;&lt;a href=&#34;#vim&#34; class=&#34;headerlink&#34; title=&#34;vim&#34;&gt;&lt;/a&gt;vim&lt;/h1&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;动作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;复制行&lt;/td&gt;
&lt;td&gt;yy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前位置粘贴&lt;/td&gt;
&lt;td&gt;p&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;撤销&lt;/td&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显示行号&lt;/td&gt;
&lt;td&gt;set nu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;隐藏行号&lt;/td&gt;
&lt;td&gt;set nonu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;替换&lt;/td&gt;
&lt;td&gt;%s&amp;#x2F;旧文本&amp;#x2F;新文本&amp;#x2F;g&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&#34;mac&#34;&gt;&lt;a href=&#34;#mac&#34; class=&#34;headerlink&#34; title=&#34;mac&#34;&gt;&lt;/a&gt;mac&lt;/h1&gt;&lt;h2 id=&#34;防止brew-install-时自动更新其他&#34;&gt;&lt;a href=&#34;#防止brew-install-时自动更新其他&#34; class=&#34;headerlink&#34; title=&#34;防止brew install 时自动更新其他&#34;&gt;&lt;/a&gt;防止brew install 时自动更新其他&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;~/.zprofile&lt;/code&gt; 中添加下面配置&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;export&lt;/span&gt; HOMEBREW_NO_AUTO_UPDATE=1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;export&lt;/span&gt; HOMEBREW_NO_INSTALL_CLEANUP=1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;然后执行 &lt;code&gt;source ~/.zprofile&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;杀掉端口占用进程-1&#34;&gt;&lt;a href=&#34;#杀掉端口占用进程-1&#34; class=&#34;headerlink&#34; title=&#34;杀掉端口占用进程&#34;&gt;&lt;/a&gt;杀掉端口占用进程&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;lsof -i :端口 &lt;span class=&#34;comment&#34;&gt;# 查询占用的端口的进程id&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;kill&lt;/span&gt; -9 进程&lt;span class=&#34;built_in&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;comment&#34;&gt;# 杀死进程&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ps -p 进程&lt;span class=&#34;built_in&#34;&gt;id&lt;/span&gt; -o &lt;span class=&#34;built_in&#34;&gt;comm&lt;/span&gt;= &lt;span class=&#34;comment&#34;&gt;# 查看进程的程序位置&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;ps -ef | grep 服务名 &lt;span class=&#34;comment&#34;&gt;# 查看某个服务的端口信息&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;禁（启）用系统自带的apache启动&#34;&gt;&lt;a href=&#34;#禁（启）用系统自带的apache启动&#34; class=&#34;headerlink&#34; title=&#34;禁（启）用系统自带的apache启动&#34;&gt;&lt;/a&gt;禁（启）用系统自带的apache启动&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 禁用&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 启用&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;开启允许从任何来源安装程序&#34;&gt;&lt;a href=&#34;#开启允许从任何来源安装程序&#34; class=&#34;headerlink&#34; title=&#34;开启允许从任何来源安装程序&#34;&gt;&lt;/a&gt;开启允许从任何来源安装程序&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;sudo spctl --master-disable&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;安装软件提示”软件后出现-“已损坏，无法打开。您应该将它移到废纸娄””&#34;&gt;&lt;a href=&#34;#安装软件提示”软件后出现-“已损坏，无法打开。您应该将它移到废纸娄””&#34; class=&#34;headerlink&#34; title=&#34;安装软件提示”软件后出现 “已损坏，无法打开。您应该将它移到废纸娄””&#34;&gt;&lt;/a&gt;安装软件提示”软件后出现 “已损坏，无法打开。您应该将它移到废纸娄””&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;xattr -cr 软件路径&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;查找某个文件是否在运行及进程&#34;&gt;&lt;a href=&#34;#查找某个文件是否在运行及进程&#34; class=&#34;headerlink&#34; title=&#34;查找某个文件是否在运行及进程&#34;&gt;&lt;/a&gt;查找某个文件是否在运行及进程&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;ps aux | grep 文件名&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;使用brew安装低版本php&#34;&gt;&lt;a href=&#34;#使用brew安装低版本php&#34; class=&#34;headerlink&#34; title=&#34;使用brew安装低版本php&#34;&gt;&lt;/a&gt;使用brew安装低版本php&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;brew tap shivammathur/php&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;brew install shivammathur/php/php@版本号&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;JetBrains破解&#34;&gt;&lt;a href=&#34;#JetBrains破解&#34; class=&#34;headerlink&#34; title=&#34;JetBrains破解&#34;&gt;&lt;/a&gt;JetBrains破解&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;下面两种方式任选其一即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;破解器破解&#34;&gt;&lt;a href=&#34;#破解器破解&#34; class=&#34;headerlink&#34; title=&#34;破解器破解&#34;&gt;&lt;/a&gt;破解器破解&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/lsky/1/2025/67bd2b8a5c1b0.webp&#34;&gt;&lt;/p&gt;
&lt;p&gt;mac版下载： &lt;a href=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/alon/jetbrains-crack-macos.zip&#34;&gt;点我下载&lt;/a&gt;&lt;br&gt;win版下载： &lt;a href=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/alon/jetbrains-crack-win.zip&#34;&gt;点我下载&lt;/a&gt;&lt;br&gt;linux版下载： &lt;a href=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/alon/jetbrains-crack-linux.zip&#34;&gt;点我下载&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;命令行破解&#34;&gt;&lt;a href=&#34;#命令行破解&#34; class=&#34;headerlink&#34; title=&#34;命令行破解&#34;&gt;&lt;/a&gt;命令行破解&lt;/h3&gt;&lt;p&gt;mac版&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 破解&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;curl -L -o ckey.run ckey.run &amp;amp;&amp;amp; bash ckey.run&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 取消破解&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;curl -L ckey.run/uninstall -o ckey.run &amp;amp;&amp;amp; bash ckey.run&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;windows版本&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 破解&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;irm ckey.run|iex&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 取消破解&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;irm ckey.run/uninstall|iex&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;linux版&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 破解&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;wget --no-check-certificate ckey.run -O ckey.run &amp;amp;&amp;amp; bash ckey.run&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 取消破解 &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;wget --no-check-certificate ckey.run/uninstall -O ckey.run &amp;amp;&amp;amp; bash ckey.run&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;homebrew&#34;&gt;&lt;a href=&#34;#homebrew&#34; class=&#34;headerlink&#34; title=&#34;homebrew&#34;&gt;&lt;/a&gt;homebrew&lt;/h2&gt;&lt;h3 id=&#34;安装&#34;&gt;&lt;a href=&#34;#安装&#34; class=&#34;headerlink&#34; title=&#34;安装&#34;&gt;&lt;/a&gt;安装&lt;/h3&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;/bin/bash -c &lt;span class=&#34;string&#34;&gt;&amp;quot;&lt;span class=&#34;subst&#34;&gt;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;git&#34;&gt;&lt;a href=&#34;#git&#34; class=&#34;headerlink&#34; title=&#34;git&#34;&gt;&lt;/a&gt;git&lt;/h1&gt;&lt;h2 id=&#34;git淘宝下载镜像&#34;&gt;&lt;a href=&#34;#git淘宝下载镜像&#34; class=&#34;headerlink&#34; title=&#34;git淘宝下载镜像&#34;&gt;&lt;/a&gt;git淘宝下载镜像&lt;/h2&gt;&lt;p&gt;windows安装git时，国内下载过慢。可以使用下面的淘宝镜像下载。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://registry.npmmirror.com/binary.html?path=git-for-windows/&#34;&gt;https://registry.npmmirror.com/binary.html?path=git-for-windows/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;已有项目推送到空仓库&#34;&gt;&lt;a href=&#34;#已有项目推送到空仓库&#34; class=&#34;headerlink&#34; title=&#34;已有项目推送到空仓库&#34;&gt;&lt;/a&gt;已有项目推送到空仓库&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; 项目&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;//新版git init默认初始化为main，可以使用-b 指定分支&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git init [-b 分支名]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git add .&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git commit -m &lt;span class=&#34;string&#34;&gt;&amp;quot;first commit&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git remote add origin 仓库地址&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git push -u origin &lt;span class=&#34;string&#34;&gt;&amp;quot;master&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;清除git缓存&#34;&gt;&lt;a href=&#34;#清除git缓存&#34; class=&#34;headerlink&#34; title=&#34;清除git缓存&#34;&gt;&lt;/a&gt;清除git缓存&lt;/h2&gt;&lt;p&gt;gitignore新增然后不生效时，需清除git缓存&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git &lt;span class=&#34;built_in&#34;&gt;rm&lt;/span&gt; -r --cached .&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;git报错对应处理方法&#34;&gt;&lt;a href=&#34;#git报错对应处理方法&#34; class=&#34;headerlink&#34; title=&#34;git报错对应处理方法&#34;&gt;&lt;/a&gt;git报错对应处理方法&lt;/h2&gt;&lt;p&gt;&lt;code&gt;fatal: could not read Username for xxx: Device not configured&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在对应仓库下执行&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git config --global credential.helper store&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;h2 id=&#34;git全局记住和忘记用户名密码&#34;&gt;&lt;a href=&#34;#git全局记住和忘记用户名密码&#34; class=&#34;headerlink&#34; title=&#34;git全局记住和忘记用户名密码&#34;&gt;&lt;/a&gt;git全局记住和忘记用户名密码&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 记住用户名密码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git config --global credential.helper store&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 忘记用户名密码&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git config --system --&lt;span class=&#34;built_in&#34;&gt;unset&lt;/span&gt; credential.helper&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;git设置本地忽略某文件的更改&#34;&gt;&lt;a href=&#34;#git设置本地忽略某文件的更改&#34; class=&#34;headerlink&#34; title=&#34;git设置本地忽略某文件的更改&#34;&gt;&lt;/a&gt;git设置本地忽略某文件的更改&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;比如env里设置了host是127.0.0.1:8000，而你本地不是这个host，你需要改但是又不能提交上去影响其他开发人员&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 忽略&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git update-index --skip-worktree 文件名&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 取消忽略&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;git update-index --no-skip-worktree 文件名&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Mysql&#34;&gt;&lt;a href=&#34;#Mysql&#34; class=&#34;headerlink&#34; title=&#34;Mysql&#34;&gt;&lt;/a&gt;Mysql&lt;/h1&gt;&lt;h2 id=&#34;查看锁表语句及杀死语句&#34;&gt;&lt;a href=&#34;#查看锁表语句及杀死语句&#34; class=&#34;headerlink&#34; title=&#34;查看锁表语句及杀死语句&#34;&gt;&lt;/a&gt;查看锁表语句及杀死语句&lt;/h2&gt;&lt;figure class=&#34;highlight sql&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;-- 查看所有进程&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;SHOW&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;FULL&lt;/span&gt; PROCESSLIST;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;-- 找到锁表的进程id &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;kill &amp;#123;进程id&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;Nano&#34;&gt;&lt;a href=&#34;#Nano&#34; class=&#34;headerlink&#34; title=&#34;Nano&#34;&gt;&lt;/a&gt;Nano&lt;/h1&gt;&lt;h2 id=&#34;保存退出&#34;&gt;&lt;a href=&#34;#保存退出&#34; class=&#34;headerlink&#34; title=&#34;保存退出&#34;&gt;&lt;/a&gt;保存退出&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;control + x  (会提示：Save modified buffer (ANSWERING “No” WILL DESTROY CHANGES) ?)&lt;/li&gt;
&lt;li&gt;键入Y然后回车(会提示：File Name to write：xxxx)&lt;/li&gt;
&lt;li&gt;文件名不修改的话直接回车就可以保存并退出了&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;Windows&#34;&gt;&lt;a href=&#34;#Windows&#34; class=&#34;headerlink&#34; title=&#34;Windows&#34;&gt;&lt;/a&gt;Windows&lt;/h1&gt;&lt;h2 id=&#34;win10禁用更新&#34;&gt;&lt;a href=&#34;#win10禁用更新&#34; class=&#34;headerlink&#34; title=&#34;win10禁用更新&#34;&gt;&lt;/a&gt;win10禁用更新&lt;/h2&gt;&lt;p&gt;使用 &lt;a href=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/StopUpdates10Portable_4.5.2023.0523.rar&#34;&gt;StopUpdates10Portable&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/07/09/restful/</guid>
            <title>Restful HTTP API 设计规范</title>
            <link>https://alon.wang/2021/07/09/restful/</link>
            <category>代码规范</category>
            <pubDate>Fri, 09 Jul 2021 15:57:46 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;What’s-RESTful&#34;&gt;&lt;a href=&#34;#What’s-RESTful&#34; class=&#34;headerlink&#34; title=&#34;What’s RESTful&#34;&gt;&lt;/a&gt;What’s RESTful&lt;/h1&gt;&lt;p&gt;RESTful 是一种软件设计风格，由 &lt;a href=&#34;https://roy.gbiv.com/&#34;&gt;Roy Fielding&lt;/a&gt; 在他的 论文 中提出，全称为 Representational State Transfer，直译为表现层状态转移&lt;/p&gt;
&lt;h1 id=&#34;使用RESTful的优势&#34;&gt;&lt;a href=&#34;#使用RESTful的优势&#34; class=&#34;headerlink&#34; title=&#34;使用RESTful的优势&#34;&gt;&lt;/a&gt;使用RESTful的优势&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;安全可靠，高效，易扩展。&lt;/li&gt;
&lt;li&gt;简单明了，可读性强，没有歧义。&lt;/li&gt;
&lt;li&gt;API 风格统一，调用规则，传入参数和返回数据有统一的标准&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;设计规范&#34;&gt;&lt;a href=&#34;#设计规范&#34; class=&#34;headerlink&#34; title=&#34;设计规范&#34;&gt;&lt;/a&gt;设计规范&lt;/h1&gt;&lt;h2 id=&#34;域名&#34;&gt;&lt;a href=&#34;#域名&#34; class=&#34;headerlink&#34; title=&#34;域名&#34;&gt;&lt;/a&gt;域名&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;域名应尽量使用https协议,可使用&lt;a href=&#34;https://certbot.eff.org/&#34;&gt;certbot&lt;/a&gt;制作免费https证书,后面研究一下&lt;/li&gt;
&lt;li&gt;api应与主域名区分开,使用专用域名(.eg: &lt;code&gt;https://api.alon.wang&lt;/code&gt;)或者放在主域名下(eg:&lt;code&gt;https://alon.wang/api&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;版本迭代&#34;&gt;&lt;a href=&#34;#版本迭代&#34; class=&#34;headerlink&#34; title=&#34;版本迭代&#34;&gt;&lt;/a&gt;版本迭代&lt;/h2&gt;&lt;p&gt;随业务的发展,api大概率会发生迭代,为了保证新老用户的使用,应控制好版本.&lt;br&gt;实现方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本号加入URL中&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://alon.wang/api/v1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;https://alon.wang/api/v2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;使用HTTP请求头的Accept来进行区分&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;https://alon.wang/api/&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      Accept: application/prs.alon.v1+json&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;      Accept: application/prs.alon.v2+json&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;后端具体实现可以参考&lt;a href=&#34;https://learnku.com/laravel/t/10579/do-api-multi-version-compatibility-through-the-version-field-in-header&#34;&gt;zedisdog的实现思路&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;推荐使用第二种,前端可以不需要修改url&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;url编写&#34;&gt;&lt;a href=&#34;#url编写&#34; class=&#34;headerlink&#34; title=&#34;url编写&#34;&gt;&lt;/a&gt;url编写&lt;/h2&gt;&lt;p&gt;RESTful的设计中,所有东西都看作资源,而每一个资源都应该是一个名词,且尽量应为复数(也可以为单数,比如github中项目的issue锁,一个问题只有一个锁,所以此时锁为单数),URL设计中,应避免动词出现&lt;/p&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;GET /issues                                      列出所有的 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;GET /orgs/:org/issues                            列出某个项目的 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;GET /repos/:owner/:repo/issues/:number           获取某个项目的某个 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;POST /repos/:owner/:repo/issues                  为某个项目创建 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;PATCH /repos/:owner/:repo/issues/:number         修改某个 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;PUT /repos/:owner/:repo/issues/:number/lock      锁住某个 issue&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;DELETE /repos/:owner/:repo/issues/:number/lock   解锁某个 issue&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;GET:获取资源&lt;br&gt;POST:新建资源&lt;br&gt;PUT:更新整个资源的属性,应提供资源的所有属性过来更新&lt;br&gt;PATCH:更新资源的部分属性,不需要提供资源的所有属性&lt;br&gt;DELETE:删除某个属性&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;响应码&#34;&gt;&lt;a href=&#34;#响应码&#34; class=&#34;headerlink&#34; title=&#34;响应码&#34;&gt;&lt;/a&gt;响应码&lt;/h2&gt;&lt;p&gt;根据不同的响应,我们应该使用不同的状态码,使响应的数据更加规范与可读&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&#34;left&#34;&gt;响应码&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;200&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;OK - 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;201&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Created - 对创建新资源的 POST 操作进行响应。应该带着指向新资源地址的 Location 头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;202&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Accepted - 服务器接受了请求，但是还未处理，响应中应该包含相应的指示信息，告诉客户端该去哪里查询关于本次请求的信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;204&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;No Content - 对不会返回响应体的成功请求进行响应（比如 DELETE 请求）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;304&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Not Modified - HTTP 缓存 header 生效的时候用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;400&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Bad Request - 请求异常，比如请求中的 body 无法解析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;401&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Unauthorized - 没有进行认证或者认证非法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;403&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Forbidden - 服务器已经理解请求，但是拒绝执行它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;404&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Not Found - 请求一个不存在的资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;405&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Method Not Allowed - 所请求的 HTTP 方法不允许当前认证用户访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;410&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Gone - 表示当前请求的资源不再可用。当调用老版本 API 的时候很有用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;415&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Unsupported Media Type - 如果请求中的内容类型是错误的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;422&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Unprocessable Entity - 用来表示校验错误&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&#34;left&#34;&gt;429&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Too Many Requests - 由于请求频次达到上限而被拒绝访问&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/06/05/laravel-permission/</guid>
            <title>laravel-permission权限管理的使用</title>
            <link>https://alon.wang/2021/06/05/laravel-permission/</link>
            <category>php</category>
            <category>扩展</category>
            <pubDate>Sat, 05 Jun 2021 13:07:45 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;安装&#34;&gt;&lt;a href=&#34;#安装&#34; class=&#34;headerlink&#34; title=&#34;安装&#34;&gt;&lt;/a&gt;安装&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;https://spatie.be/docs/laravel-permission/v5/introduction&#34;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装composer包&#34;&gt;&lt;a href=&#34;#安装composer包&#34; class=&#34;headerlink&#34; title=&#34;安装composer包&#34;&gt;&lt;/a&gt;安装composer包&lt;/h2&gt;&lt;p&gt;&lt;code&gt;composer require spatie/laravel-permission&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置&#34;&gt;&lt;a href=&#34;#配置&#34; class=&#34;headerlink&#34; title=&#34;配置&#34;&gt;&lt;/a&gt;配置&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;生成迁移文件&lt;br&gt;&lt;code&gt;php artisan vendor:publish --provider=&amp;quot;Spatie\Permission\PermissionServiceProvider&amp;quot; --tag=&amp;quot;migrations&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行迁移命令&lt;br&gt;&lt;code&gt;php artisan migrate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;生成配置文件&lt;br&gt;&lt;code&gt;php artisan vendor:publish --provider=&amp;quot;Spatie\Permission\PermissionServiceProvider&amp;quot; --tag=&amp;quot;config&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用户模型需使&lt;code&gt;Spatie\Permission\Traits\HasRoles&lt;/code&gt;,如果使用了其他guard,还需设置&lt;code&gt;guard_name&lt;/code&gt;属性&lt;/li&gt;
&lt;li&gt;如果要扩展Role和Permission模型,需要继承扩展包的&lt;br&gt;&lt;code&gt;Spatie\Permission\Models\Role&lt;/code&gt;和&lt;code&gt;Spatie\Permission\Models\Permission&lt;/code&gt;,并在 项目根目录&amp;#x2F;config&amp;#x2F;permission.php 文件中,修改对应的模型&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Models&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Database&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Eloquent&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Factories&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;HasFactory&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Foundation&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Auth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Authenticatable&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Notifications&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Notifiable&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Spatie&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Permission&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Traits&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;HasRoles&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Admin&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Authenticatable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;HasFactory&lt;/span&gt;, &lt;span class=&#34;title&#34;&gt;Notifiable&lt;/span&gt;,&lt;span class=&#34;title&#34;&gt;HasRoles&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$table&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;admins&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that are mass assignable.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$fillable&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that should be hidden for arrays.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$hidden&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;remember_token&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that should be cast to native types.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$casts&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;email_verified_at&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;datetime&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//设置guard为jwt&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$guard_name&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;jwt&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;使用方法&#34;&gt;&lt;a href=&#34;#使用方法&#34; class=&#34;headerlink&#34; title=&#34;使用方法&#34;&gt;&lt;/a&gt;使用方法&lt;/h1&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Models&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Admin&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Spatie&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Permission&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Models&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Role&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Spatie&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Permission&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Models&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Permission&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//创建权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title class_&#34;&gt;Permission&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;create&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title class_&#34;&gt;Permission&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;findOrCreate&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//创建角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$role&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;Role&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;create&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给角色添加权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$role&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;givePermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给角色同步权限(用数组中的权限替换用户的权限)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$role&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;syncPermissions&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.store&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给角色删除权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$role&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;revokePermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * 用户直接管理权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * 该扩展支持不通过角色,直接给用户分配权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt; = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;Admin&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户添加权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;givePermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;givePermissionTo&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户同步权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;syncPermissions&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.store&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户删除权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;revokePermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;edit&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户添加角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;assignRole&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;assignRole&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员二号&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;assignRole&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员二号&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户移除一个角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;removeRole&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员二号&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//给用户同步角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;syncRoles&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//角色是否有权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$role&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasPermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasRole&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有以下任意一个角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasAnyRole&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员二号&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有以下所有角色&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasAllRoles&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;测试管理员二号&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasPermissionTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasPermissionTo&lt;/span&gt;(&lt;span class=&#34;number&#34;&gt;1&lt;/span&gt;);&lt;span class=&#34;comment&#34;&gt;//直接传权限的id也可以&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有以下任意一个权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasAnyPermission&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//用户是否有以下所有权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;hasAllPermissions&lt;/span&gt;([&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.index&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;admin.update&amp;#x27;&lt;/span&gt;]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//获取用户的所有权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$permissions&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;getAllPermissions&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//获取用户被直接分配的权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$permissions&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;getDirectPermissions&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//获取用户通过角色分配的权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$permissions&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;getPermissionsViaRoles&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// 获取用户所有角色名称&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$roles&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$user&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;getRoleNames&lt;/span&gt;(); &lt;span class=&#34;comment&#34;&gt;// 返回一个collection&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;ok,先这么多&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我这边直接给项目的原中间件修改了一下,当然也可以用他提供的中间件&lt;code&gt;RoleMiddleware&lt;/code&gt;,&lt;code&gt;PermissionMiddleware&lt;/code&gt;,&lt;code&gt;RoleOrPermissionMiddleware&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/05/26/jwt/</guid>
            <title>使用jwt在laravel中实现api的登录授权</title>
            <link>https://alon.wang/2021/05/26/jwt/</link>
            <category>php</category>
            <category>laravel</category>
            <category>扩展</category>
            <pubDate>Wed, 26 May 2021 10:55:21 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;emmmmm,发现一个问题;如果jwt过期时间设为2小时,则为绝对意义上的2小时,而不是用户无操作之后的2小时,这是为了保证token的安全,防止token被窃取后,一直使用,永远不过期。所以要用 &lt;code&gt;JWTAuth::parseToken()-&amp;gt;refresh()&lt;/code&gt; 刷新token,返回给前端;&lt;br&gt;当然也可以&lt;a href=&#34;#%E8%AE%BE%E7%BD%AE%E6%97%A0%E8%BF%87%E6%9C%9F%E6%97%B6%E9%97%B4&#34;&gt;设置无过期时间&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;jwt简单了解&#34;&gt;&lt;a href=&#34;#jwt简单了解&#34; class=&#34;headerlink&#34; title=&#34;jwt简单了解&#34;&gt;&lt;/a&gt;jwt简单了解&lt;/h1&gt;&lt;p&gt;jwt全称json web token，是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准（(RFC 7519)。特别适用于分布式站点的单点登录（SSO）场景。&lt;/p&gt;
&lt;h2 id=&#34;jwt认证流程&#34;&gt;&lt;a href=&#34;#jwt认证流程&#34; class=&#34;headerlink&#34; title=&#34;jwt认证流程&#34;&gt;&lt;/a&gt;jwt认证流程&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;客户端表单提交用户认证信息发送到服务端&lt;/li&gt;
&lt;li&gt;服务端验证用户信息，生成jwt（包括header，payload，signature），jwt的组成后面再具体研究&lt;/li&gt;
&lt;li&gt;服务端返回token给客户端&lt;/li&gt;
&lt;li&gt;客户端存储token，并在后续每次请求服务端时在Http请求的header中的Authorization中上送token，（也可不放在header中，但建议在header中上送，保证安全）&lt;/li&gt;
&lt;li&gt;服务端收到请求，验证jwt，然后处理业务逻辑返回结果&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;jwt认证与session认证的优势&#34;&gt;&lt;a href=&#34;#jwt认证与session认证的优势&#34; class=&#34;headerlink&#34; title=&#34;jwt认证与session认证的优势&#34;&gt;&lt;/a&gt;jwt认证与session认证的优势&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;用户认证后会存储用户认证记录在session中，而session通常保存在内存中，这就导致随用户增多，内存使用也会逐步增加。jwt则不存在内存问题。&lt;/li&gt;
&lt;li&gt;session认证的方式，认证记录存储在服务器的内存中，这就导致分布式应用中，其他服务器上无法获取认证记录。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;在laravel中具体使用&#34;&gt;&lt;a href=&#34;#在laravel中具体使用&#34; class=&#34;headerlink&#34; title=&#34;在laravel中具体使用&#34;&gt;&lt;/a&gt;在laravel中具体使用&lt;/h1&gt;&lt;h2 id=&#34;安装composer包&#34;&gt;&lt;a href=&#34;#安装composer包&#34; class=&#34;headerlink&#34; title=&#34;安装composer包&#34;&gt;&lt;/a&gt;安装composer包&lt;/h2&gt;&lt;p&gt;&lt;code&gt;composer require tymon/jwt-auth&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置&#34;&gt;&lt;a href=&#34;#配置&#34; class=&#34;headerlink&#34; title=&#34;配置&#34;&gt;&lt;/a&gt;配置&lt;/h2&gt;&lt;h3 id=&#34;生成配置文件-config-jwt-php&#34;&gt;&lt;a href=&#34;#生成配置文件-config-jwt-php&#34; class=&#34;headerlink&#34; title=&#34;生成配置文件 config&amp;#x2F;jwt.php&#34;&gt;&lt;/a&gt;生成配置文件 config&amp;#x2F;jwt.php&lt;/h3&gt;&lt;p&gt;&lt;code&gt;php artisan vendor:publish --provider=&amp;quot;Tymon\JWTAuth\Providers\LaravelServiceProvider&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;生成加密秘钥-会在env中添加一个JWT-SECRET配置项&#34;&gt;&lt;a href=&#34;#生成加密秘钥-会在env中添加一个JWT-SECRET配置项&#34; class=&#34;headerlink&#34; title=&#34;生成加密秘钥(会在env中添加一个JWT_SECRET配置项)&#34;&gt;&lt;/a&gt;生成加密秘钥(会在env中添加一个JWT_SECRET配置项)&lt;/h3&gt;&lt;p&gt;&lt;code&gt;php artisan jwt:secret&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;更换laravel的auth配置&#34;&gt;&lt;a href=&#34;#更换laravel的auth配置&#34; class=&#34;headerlink&#34; title=&#34;更换laravel的auth配置&#34;&gt;&lt;/a&gt;更换laravel的auth配置&lt;/h3&gt;&lt;p&gt;编辑 项目根目录&amp;#x2F;config&amp;#x2F;auth.php&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//这边项目为纯api,否则可不修改默认的guard&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;defaults&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;guard&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;jwt&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;passwords&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;users&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;guards&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;web&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;driver&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;session&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;provider&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;users&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;api&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;driver&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;token&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;provider&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;users&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;hash&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;literal&#34;&gt;false&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//这边新增了一个guard,也可直接修改原有的web及api,修改driver为jwt即可&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;jwt&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;driver&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;jwt&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;provider&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;users&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;hash&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;literal&#34;&gt;false&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//这边修改了默认的登录用户模型,如果使用原始的User,则不需改动&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;providers&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;users&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;driver&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;eloquent&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;model&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title class_&#34;&gt;App\Models\Admin&lt;/span&gt;::&lt;span class=&#34;variable language_&#34;&gt;class&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;],&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;修改用户模型&#34;&gt;&lt;a href=&#34;#修改用户模型&#34; class=&#34;headerlink&#34; title=&#34;修改用户模型&#34;&gt;&lt;/a&gt;修改用户模型&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;继承JWTSubject类并实现getJWTIdentifier及getJWTCustomClaims方法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Models&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Database&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Eloquent&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Factories&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;HasFactory&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Database&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Eloquent&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;SoftDeletes&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Foundation&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Auth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;User&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Authenticatable&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Notifications&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Notifiable&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Spatie&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Permission&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Traits&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;HasRoles&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Contracts&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTSubject&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//此处需继承JWTSubject类,并实现getJWTIdentifier及getJWTCustomClaims两个方法,如下&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Admin&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Authenticatable&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;implements&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;JWTSubject&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;HasFactory&lt;/span&gt;, &lt;span class=&#34;title&#34;&gt;Notifiable&lt;/span&gt;,&lt;span class=&#34;title&#34;&gt;HasRoles&lt;/span&gt;,&lt;span class=&#34;title&#34;&gt;SoftDeletes&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$table&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;admins&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that are mass assignable.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$fillable&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;email&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;is_super&amp;#x27;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that should be hidden for arrays.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$hidden&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;remember_token&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * The attributes that should be cast to native types.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@var&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$casts&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;email_verified_at&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;datetime&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;// Rest omitted for brevity&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * Get the identifier that will be stored in the subject claim of the JWT.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; mixed&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;getJWTIdentifier&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;getKey&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * Return a key value array, containing any custom claims to be added to the JWT.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;getJWTCustomClaims&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;注册facade&#34;&gt;&lt;a href=&#34;#注册facade&#34; class=&#34;headerlink&#34; title=&#34;注册facade&#34;&gt;&lt;/a&gt;注册facade&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;不注册也行,直接是用auth()函数也是可以的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;编辑 项目根目录&amp;#x2F;config&amp;#x2F;app.php&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;aliases&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;JWTAuth&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title class_&#34;&gt;Tymon\JWTAuth\Facades\JWTAuth&lt;/span&gt;::&lt;span class=&#34;variable language_&#34;&gt;class&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;JWTFactory&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title class_&#34;&gt;Tymon\JWTAuth\Facades\JWTFactory&lt;/span&gt;::&lt;span class=&#34;variable language_&#34;&gt;class&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;],&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;逻辑实现&#34;&gt;&lt;a href=&#34;#逻辑实现&#34; class=&#34;headerlink&#34; title=&#34;逻辑实现&#34;&gt;&lt;/a&gt;逻辑实现&lt;/h2&gt;&lt;h3 id=&#34;注册中间件&#34;&gt;&lt;a href=&#34;#注册中间件&#34; class=&#34;headerlink&#34; title=&#34;注册中间件&#34;&gt;&lt;/a&gt;注册中间件&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;这边项目需要,基于官方的中间件重写了一个,如无特殊需要可不注册,直接使用官方的jwt.auth中间件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;项目根目录&amp;#x2F;app&amp;#x2F;Http&amp;#x2F;Kernel.php&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;protected&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$routeMiddleware&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;api.auth&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title class_&#34;&gt;\App\Http\Middleware\ApiAuth&lt;/span&gt;::&lt;span class=&#34;variable language_&#34;&gt;class&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;];&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;添加路由&#34;&gt;&lt;a href=&#34;#添加路由&#34; class=&#34;headerlink&#34; title=&#34;添加路由&#34;&gt;&lt;/a&gt;添加路由&lt;/h3&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title class_&#34;&gt;Route&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;namespace&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Auth&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;post&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;register&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;AuthController@register&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;name&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;erp.register&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title class_&#34;&gt;Route&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;namespace&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Auth&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;post&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;login&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;AuthController@login&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;name&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;erp.login&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title class_&#34;&gt;Route&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;namespace&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Auth&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;middleware&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;api.auth&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;post&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;logout&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;AuthController@logout&amp;#x27;&lt;/span&gt;)-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;name&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;erp.logout&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;中间件代码&#34;&gt;&lt;a href=&#34;#中间件代码&#34; class=&#34;headerlink&#34; title=&#34;中间件代码&#34;&gt;&lt;/a&gt;中间件代码&lt;/h3&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Http&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Middleware&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;PermissionForbiddenException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;RouteNotFoundException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;UnauthorizedException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Symfony&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Component&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;HttpKernel&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exception&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;UnauthorizedHttpException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;TokenBlacklistedException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;TokenExpiredException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;TokenInvalidException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Http&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Middleware&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;BaseMiddleware&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;ApiAuth&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;BaseMiddleware&lt;/span&gt;//继承&lt;span class=&#34;title&#34;&gt;jwt&lt;/span&gt;的&lt;span class=&#34;title&#34;&gt;BaseMiddleware&lt;/span&gt;,以使用他的方法&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; PermissionForbiddenException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; \Tymon\JWTAuth\Exceptions\JWTException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; RouteNotFoundException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;handle&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;, \&lt;span class=&#34;built_in&#34;&gt;Closure&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$next&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;try&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 检查此次请求中是否带有 token，&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 如果没有则抛出UnauthorizedHttpException异常。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;checkForToken&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 检测用户的登录状态&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 如果校验失败则抛出TokenInvalidException异常&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 如果过期后刷新了新的token,传了旧token则抛出TokenBlacklistedException异常&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             * 如果过期了,则抛出TokenExpiredException异常&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;             */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable language_&#34;&gt;$this&lt;/span&gt;-&amp;gt;auth-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;parseToken&lt;/span&gt;()-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;authenticate&lt;/span&gt;()) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;comment&#34;&gt;//todo 身份验证通过,具体实现其他业务逻辑&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;UnauthorizedException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;未登录&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (UnauthorizedHttpException &lt;span class=&#34;variable&#34;&gt;$exception&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;UnauthorizedException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;未获取到token&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (TokenExpiredException | TokenBlacklistedException &lt;span class=&#34;variable&#34;&gt;$exception&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;UnauthorizedException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;token令牌已失效,请重新登录&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (TokenInvalidException &lt;span class=&#34;variable&#34;&gt;$exception&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;UnauthorizedException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;无效的token&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;控制器代码&#34;&gt;&lt;a href=&#34;#控制器代码&#34; class=&#34;headerlink&#34; title=&#34;控制器代码&#34;&gt;&lt;/a&gt;控制器代码&lt;/h3&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;meta&#34;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Http&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Controllers&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Api&lt;/span&gt;\&lt;span class=&#34;title class_&#34;&gt;Auth&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;InvalidArgumentException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;RepeatException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Erp&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;ServiceException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Http&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Controllers&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Controller&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;App&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Models&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Admin&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Foundation&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Validation&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;ValidatesRequests&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Illuminate&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Http&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Request&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Exceptions&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTException&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Tymon&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;Facades&lt;/span&gt;\&lt;span class=&#34;title&#34;&gt;JWTAuth&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Validator&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;AuthController&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;extends&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;Controller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;class&#34;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;ValidatesRequests&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@param&lt;/span&gt; Request $request&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; \Illuminate\Validation\ValidationException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; RepeatException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;register&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;Request &lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;all&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;Validator&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;make&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;, [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required|max:64&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required|max:64&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ], [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;手机号必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone.digits&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;手机号格式错误&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;用户名必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name.max&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;用户名长度超限&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;密码必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password.max&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;密码长度超限&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;fails&lt;/span&gt;()) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;InvalidArgumentException&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;errors&lt;/span&gt;()-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;messages&lt;/span&gt;());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;try&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;Admin&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;query&lt;/span&gt;()-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;create&lt;/span&gt;([&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;string&#34;&gt;&amp;#x27;phone&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;phone&amp;#x27;&lt;/span&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;bcrypt&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;[&lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;])&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            ]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (\&lt;span class=&#34;built_in&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;$exception&lt;/span&gt;)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;RepeatException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;手机号已注册,请直接登录&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$token&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;JWTAuth&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;fromUser&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$admin&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;token&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$token&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@param&lt;/span&gt; Request $request&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@return&lt;/span&gt; array&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; ServiceException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     * &lt;span class=&#34;doctag&#34;&gt;@throws&lt;/span&gt; \Illuminate\Validation\ValidationException&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;login&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;Request &lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;&lt;/span&gt;): &lt;span class=&#34;title&#34;&gt;array&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;all&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;Validator&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;make&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;, [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;required|max:64&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ], [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;name.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;用户名必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password.required&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;密码必填&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;password.max&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;密码长度超限&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ]);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;fails&lt;/span&gt;()) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;InvalidArgumentException&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$validator&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;errors&lt;/span&gt;()-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;messages&lt;/span&gt;());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$credentials&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$request&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;only&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;password&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;try&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (! &lt;span class=&#34;variable&#34;&gt;$token&lt;/span&gt; = &lt;span class=&#34;title class_&#34;&gt;JWTAuth&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;attempt&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$credentials&lt;/span&gt;)) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;                &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;built_in&#34;&gt;InvalidArgumentException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;用户名或者密码错误&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125; &lt;span class=&#34;keyword&#34;&gt;catch&lt;/span&gt; (JWTException &lt;span class=&#34;variable&#34;&gt;$e&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;keyword&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;ServiceException&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;token 无法生成&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;            &lt;span class=&#34;string&#34;&gt;&amp;#x27;token&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;variable&#34;&gt;$token&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        ];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;function&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;title&#34;&gt;logout&lt;/span&gt;(&lt;span class=&#34;params&#34;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;function&#34;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;title class_&#34;&gt;JWTAuth&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;setToken&lt;/span&gt;(&lt;span class=&#34;title class_&#34;&gt;JWTAuth&lt;/span&gt;::&lt;span class=&#34;title function_ invoke__&#34;&gt;getToken&lt;/span&gt;())-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;invalidate&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; [];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;设置无过期时间&#34;&gt;&lt;a href=&#34;#设置无过期时间&#34; class=&#34;headerlink&#34; title=&#34;设置无过期时间&#34;&gt;&lt;/a&gt;&lt;a id=&#34;设置无过期时间&#34;&gt;设置无过期时间&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;编辑 项目根目录&amp;#x2F;config&amp;#x2F;jwt.php&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//设置为null,或者设置env变量&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;ttl&amp;#x27;&lt;/span&gt; =&amp;gt; &lt;span class=&#34;title function_ invoke__&#34;&gt;env&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;JWT_TTL&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;),&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;...&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;string&#34;&gt;&amp;#x27;required_claims&amp;#x27;&lt;/span&gt; =&amp;gt; [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;iss&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;iat&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//&amp;#x27;exp&amp;#x27;,//注释掉exp,否则token生成是会将过期时间一起加进去,但是null过期时候会使token生成失败&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;nbf&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;sub&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;string&#34;&gt;&amp;#x27;jti&amp;#x27;&lt;/span&gt;,&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    ],&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;完事-测试一下&#34;&gt;&lt;a href=&#34;#完事-测试一下&#34; class=&#34;headerlink&#34; title=&#34;完事,测试一下&#34;&gt;&lt;/a&gt;完事,测试一下&lt;/h1&gt;&lt;p&gt;给整个postman组添加统一的authorization里的token变量&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220968473522.jpg&#34; alt=&#34;16220968473522.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220967381821.jpg&#34; alt=&#34;16220967381821.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220967715985.jpg&#34; alt=&#34;16220967715985.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220968118863.jpg&#34; alt=&#34;16220968118863.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;退出后再退出测试一下中间键&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220969071886.jpg&#34; alt=&#34;16220969071886.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;完事,撤&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16220969707137.jpg&#34; alt=&#34;16220969707137.jpg&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/04/16/redis1/</guid>
            <title>redis整理（一）</title>
            <link>https://alon.wang/2021/04/16/redis1/</link>
            <category>redis</category>
            <pubDate>Fri, 16 Apr 2021 15:58:46 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;最近一直在面试，发现redis的知识还是太薄弱了，慢慢梳理一下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;redis为何物&#34;&gt;&lt;a href=&#34;#redis为何物&#34; class=&#34;headerlink&#34; title=&#34;redis为何物&#34;&gt;&lt;/a&gt;redis为何物&lt;/h1&gt;&lt;p&gt;redis是基于内存的可持久化的key-value型数据库。&lt;/p&gt;
&lt;h1 id=&#34;redis的优点&#34;&gt;&lt;a href=&#34;#redis的优点&#34; class=&#34;headerlink&#34; title=&#34;redis的优点&#34;&gt;&lt;/a&gt;redis的优点&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;读写速度快&lt;/li&gt;
&lt;li&gt;支持持久化（AOF，RDB两种方式）&lt;/li&gt;
&lt;li&gt;支持事务&lt;/li&gt;
&lt;li&gt;数据类型丰富（string，hash，set，zet，list）&lt;/li&gt;
&lt;li&gt;支持主从，读写分离&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;redis的缺点&#34;&gt;&lt;a href=&#34;#redis的缺点&#34; class=&#34;headerlink&#34; title=&#34;redis的缺点&#34;&gt;&lt;/a&gt;redis的缺点&lt;/h1&gt;&lt;h1 id=&#34;redis数据类型&#34;&gt;&lt;a href=&#34;#redis数据类型&#34; class=&#34;headerlink&#34; title=&#34;redis数据类型&#34;&gt;&lt;/a&gt;redis数据类型&lt;/h1&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;数据类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;#string&#34;&gt;string&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;字符串，整数，浮点型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;#hash&#34;&gt;hash&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;有键值对的列表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;#set&#34;&gt;set&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;字符串的无序集合，每个字符串都是唯一的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;#zet&#34;&gt;zet&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;有序集合，由浮点key和字符串值组成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&#34;#list&#34;&gt;list&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;list链式表，每个节点上都一个值&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&#34;string&#34;&gt;&lt;a href=&#34;#string&#34; class=&#34;headerlink&#34; title=&#34;string&#34;&gt;&lt;/a&gt;&lt;a id=&#34;string&#34;&gt;string&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;获取值 &lt;code&gt;get key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;设置值 &lt;code&gt;set key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除值 &lt;code&gt;del key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;自增 &lt;code&gt;incr key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;按值自增 &lt;code&gt;incrby key&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16187382102057.jpg&#34; alt=&#34;16187382102057.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;hash&#34;&gt;&lt;a href=&#34;#hash&#34; class=&#34;headerlink&#34; title=&#34;hash&#34;&gt;&lt;/a&gt;&lt;a id=&#34;hash&#34;&gt;hash&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;设置值(可同时设置多个，空格分隔)&lt;code&gt;hset key field1 [field2]&lt;/code&gt;返回入库条数&lt;/li&gt;
&lt;li&gt;获取值&lt;code&gt;hget key field&lt;/code&gt;，返回值&lt;/li&gt;
&lt;li&gt;获取所有值&lt;code&gt;hgetall key&lt;/code&gt;，返回所有键值&lt;/li&gt;
&lt;li&gt;删除值(可同时删除过个)&lt;code&gt;hdel key field1 [field2]&lt;/code&gt;，返回删除条数&lt;/li&gt;
&lt;li&gt;删除整个hash&lt;code&gt;del&lt;/code&gt;，返回删除的hash表数&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16187431843823.jpg&#34; alt=&#34;16187431843823.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;set&#34;&gt;&lt;a href=&#34;#set&#34; class=&#34;headerlink&#34; title=&#34;set&#34;&gt;&lt;/a&gt;&lt;a id=&#34;set&#34;&gt;set&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;向集合添加一个（多个成员）&lt;code&gt;sadd key field1 [field2]&lt;/code&gt;,返回操作条数&lt;/li&gt;
&lt;li&gt;获取集合的成员数 &lt;code&gt;scard key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;获取第一个集合独有的元素，只传第一个参数则与库中所有的其他集合比较&lt;code&gt;sdiff key1 [key2]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;获取第一个集合的交集，只传第一个集合则与库中所有的其他集合比较&lt;code&gt;sinter key1 [key2]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;移除集合中的一个或多个元素 &lt;code&gt;srem key field1 [field2]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16212344696690.jpg&#34; alt=&#34;16212344696690.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;zet&#34;&gt;&lt;a href=&#34;#zet&#34; class=&#34;headerlink&#34; title=&#34;zet&#34;&gt;&lt;/a&gt;&lt;a id=&#34;zet&#34;&gt;zet&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;向集合中添加元素 &lt;code&gt;zadd key index1 value1 [index2 value2]&lt;/code&gt;,返回新增的元素数，不包括被更新的元素&lt;/li&gt;
&lt;li&gt;获取集合中的元素数 &lt;code&gt;zcard key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;获取集合中在指定区间中的元素数 &lt;code&gt;zcount key min max&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;移除集合中的一个或多个元素 &lt;code&gt;zrem key value1 [value2]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16212394834115.jpg&#34; alt=&#34;16212394834115.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;list&#34;&gt;&lt;a href=&#34;#list&#34; class=&#34;headerlink&#34; title=&#34;list&#34;&gt;&lt;/a&gt;&lt;a id=&#34;list&#34;&gt;list&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;将一个或多个元素插入列表头 &lt;code&gt;lpush key value1 [value2]&lt;/code&gt;,返回列表长度&lt;/li&gt;
&lt;li&gt;将一个或多个元素插入列表尾 &lt;code&gt;rpush key value1 [value2]&lt;/code&gt;,返回列表长度&lt;/li&gt;
&lt;li&gt;从头部移除并获取一个元素 &lt;code&gt;lpop key&lt;/code&gt;，返回元素值，不存在返回null&lt;/li&gt;
&lt;li&gt;从尾部移除并获取一个元素 &lt;code&gt;rpop key&lt;/code&gt;,返回元素值，不存在返回null&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16212429789072.jpg&#34; alt=&#34;16212429789072.jpg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;redis的持久化&#34;&gt;&lt;a href=&#34;#redis的持久化&#34; class=&#34;headerlink&#34; title=&#34;redis的持久化&#34;&gt;&lt;/a&gt;redis的持久化&lt;/h1&gt;&lt;h2 id=&#34;两种持久化类型&#34;&gt;&lt;a href=&#34;#两种持久化类型&#34; class=&#34;headerlink&#34; title=&#34;两种持久化类型&#34;&gt;&lt;/a&gt;两种持久化类型&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;全量的RDB持久化&lt;br&gt;指定时间间隔内，fork一个子进程，将数据写入临时文件，最后一次性替换之前的文件&lt;/li&gt;
&lt;li&gt;增量的AOF持久化&lt;br&gt;以文本的日志形式，记录每一个写、删除操作&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;优缺点&#34;&gt;&lt;a href=&#34;#优缺点&#34; class=&#34;headerlink&#34; title=&#34;优缺点&#34;&gt;&lt;/a&gt;优缺点&lt;/h2&gt;&lt;h3 id=&#34;RDB优点&#34;&gt;&lt;a href=&#34;#RDB优点&#34; class=&#34;headerlink&#34; title=&#34;RDB优点&#34;&gt;&lt;/a&gt;RDB优点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;备份频率和周期可以灵活自定义&lt;/li&gt;
&lt;li&gt;可以保持redis的高性能，不影响redis读写&lt;/li&gt;
&lt;li&gt;恢复快&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;RDB缺点&#34;&gt;&lt;a href=&#34;#RDB缺点&#34; class=&#34;headerlink&#34; title=&#34;RDB缺点&#34;&gt;&lt;/a&gt;RDB缺点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;无法保证数据的高可用性&lt;/li&gt;
&lt;li&gt;数据较大时，子进程可能会使服务停止几百毫秒甚至1秒&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;AOF优点&#34;&gt;&lt;a href=&#34;#AOF优点&#34; class=&#34;headerlink&#34; title=&#34;AOF优点&#34;&gt;&lt;/a&gt;AOF优点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;有更高的数据可用性&lt;/li&gt;
&lt;li&gt;宕机不会破坏已存储的日志内容&lt;/li&gt;
&lt;li&gt;有一个可读的日志文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;AOF缺点&#34;&gt;&lt;a href=&#34;#AOF缺点&#34; class=&#34;headerlink&#34; title=&#34;AOF缺点&#34;&gt;&lt;/a&gt;AOF缺点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;恢复速度比RDB慢&lt;/li&gt;
&lt;li&gt;运行效率往往比RDB慢&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;选择&#34;&gt;&lt;a href=&#34;#选择&#34; class=&#34;headerlink&#34; title=&#34;选择&#34;&gt;&lt;/a&gt;选择&lt;/h2&gt;&lt;p&gt;当使用bgsave全量持久化时，选择AOF来进行增量的持久化。&lt;br&gt;在对数据要求没有那么严格时，推荐RDB持久化，恢复速度更快&lt;/p&gt;
&lt;h1 id=&#34;如何使用redis实现消息队列&#34;&gt;&lt;a href=&#34;#如何使用redis实现消息队列&#34; class=&#34;headerlink&#34; title=&#34;如何使用redis实现消息队列&#34;&gt;&lt;/a&gt;如何使用redis实现消息队列&lt;/h1&gt;&lt;p&gt;Redis 的 list(列表) 数据结构常用来作为异步消息队列使用，使用rpush&amp;#x2F;lpush操作入队列，使用lpop 和 rpop来出队列。rpush 和 lpop 结合 或者lpush 和rpop 结合。&lt;/p&gt;
&lt;p&gt;客户端是通过队列的 pop 操作来获取消息，然后进行处理。处理完了再接着获取消息，再进行处理。如此循环往复，这便是作为队列消费者的客户端的生命周期。&lt;/p&gt;
&lt;h1 id=&#34;hash表的使用场景&#34;&gt;&lt;a href=&#34;#hash表的使用场景&#34; class=&#34;headerlink&#34; title=&#34;hash表的使用场景&#34;&gt;&lt;/a&gt;hash表的使用场景&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;添加一个雲放同学提供的hash使用场景&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;#购物车&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#用户1001添加1件10091商品&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hset cart:1001 10091 1 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#用户1001添加2件10021商品&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hset cart:1001 10021 2 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#用户1001增加1件10091商品&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hincrby cart:1001 10091 1 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#获取用户1001的购物车商品总数&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hlen cart:1001 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#删除用户1001的商品10091&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hdel cart:1001 10091 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#查看用户1001的购物车&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hgetall cart:1001&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;#清空用户1001的购物车&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;del cart:1001&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/04/09/keyboard/</guid>
            <title>我的键盘他不只是个键盘</title>
            <link>https://alon.wang/2021/04/09/keyboard/</link>
            <pubDate>Fri, 09 Apr 2021 22:11:00 +0800</pubDate>
            <description><![CDATA[ &lt;p&gt;我的键盘好像是个留言簿，它在可见的未来将承载并记录我的一步步旅程；&lt;/p&gt;
&lt;p&gt;告别了过去的三年，我没有挥一挥衣袖，不带走一片云彩，我，带走了小伙伴们教给我的无数知识和。。。。。emmm。。。。他们的的键帽（手动狗头），哈哈哈哈；&lt;/p&gt;
&lt;p&gt;若干月之前，偶然和测试阿斌哥互换了一个F5的键帽。再后来斌哥去往了更宽广的舞台，键帽就这样保留了下来。直到今天再添一员大将。&lt;/p&gt;
&lt;p&gt;感谢&lt;a href=&#34;https://m-finder.github.io/&#34;&gt;雲放同学&lt;/a&gt;的page down，也感谢斌哥的F5，感谢你们的键帽，让我的键盘不再只是个键盘。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/64141617979838_.pic_hd.jpg&#34; alt=&#34;64141617979838_.pic_hd.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;大家以后都要加油啊，你们都棒棒哒。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16176745414714.jpg&#34; alt=&#34;16176745414714.jpg&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/04/08/git-error/</guid>
            <title>解决Fatal:Not a gitflow-enabled repo yet. Please run &#39;git flow init&#39; first</title>
            <link>https://alon.wang/2021/04/08/git-error/</link>
            <category>Error</category>
            <pubDate>Thu, 08 Apr 2021 10:14:35 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;今天sourcetree操作git，报错Fatal: Not a gitflow-enabled repo yet. Please run ‘git flow。记录一下解决方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;问题&#34;&gt;&lt;a href=&#34;#问题&#34; class=&#34;headerlink&#34; title=&#34;问题!&#34;&gt;&lt;/a&gt;问题!&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/251617846939_.pic.jpg&#34; alt=&#34;251617846939_.pic.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;解决&#34;&gt;&lt;a href=&#34;#解决&#34; class=&#34;headerlink&#34; title=&#34;解决&#34;&gt;&lt;/a&gt;解决&lt;/h3&gt;&lt;h4 id=&#34;打开项目下的-git-config文件，并删除所有gitflow的配置&#34;&gt;&lt;a href=&#34;#打开项目下的-git-config文件，并删除所有gitflow的配置&#34; class=&#34;headerlink&#34; title=&#34;打开项目下的.git&amp;#x2F;config文件，并删除所有gitflow的配置&#34;&gt;&lt;/a&gt;打开项目下的.git&amp;#x2F;config文件，并删除所有gitflow的配置&lt;/h4&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16178492522634.jpg&#34; alt=&#34;16178492522634.jpg&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;删除后保存config，并重启sourcetree，重新点击git工作流-初始化仓库&#34;&gt;&lt;a href=&#34;#删除后保存config，并重启sourcetree，重新点击git工作流-初始化仓库&#34; class=&#34;headerlink&#34; title=&#34;删除后保存config，并重启sourcetree，重新点击git工作流&amp;#x3D;&amp;gt;初始化仓库!&#34;&gt;&lt;/a&gt;删除后保存config，并重启sourcetree，重新点击git工作流&amp;#x3D;&amp;gt;初始化仓库!&lt;/h4&gt;&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/261617847178_.pic_hd.jpg&#34; alt=&#34;261617847178_.pic_hd.jpg&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;重新执行之前报错的git操作，不再报错&#34;&gt;&lt;a href=&#34;#重新执行之前报错的git操作，不再报错&#34; class=&#34;headerlink&#34; title=&#34;重新执行之前报错的git操作，不再报错&#34;&gt;&lt;/a&gt;重新执行之前报错的git操作，不再报错&lt;/h4&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/04/01/pdfjs/</guid>
            <title>使用pdfjs展示pdf及电子签章</title>
            <link>https://alon.wang/2021/04/01/pdfjs/</link>
            <category>扩展</category>
            <category>js</category>
            <pubDate>Thu, 01 Apr 2021 19:16:40 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;项目中之前的小伙伴用的pdfh5.js,用起来有些许bug,于是乎准备使用pdf.js代替之&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;js下载&#34;&gt;&lt;a href=&#34;#js下载&#34; class=&#34;headerlink&#34; title=&#34;js下载&#34;&gt;&lt;/a&gt;js下载&lt;/h3&gt;&lt;p&gt;点击&lt;a href=&#34;http://mozilla.github.io/pdf.js/getting_started/#download&#34;&gt;pdf.js官网&lt;/a&gt;下载，本次使用的为 v2.7.570&lt;br&gt;下载后保持结构不变移植到项目中&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/1617330465291.jpg&#34; alt=&#34;1617330465291.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;使用&#34;&gt;&lt;a href=&#34;#使用&#34; class=&#34;headerlink&#34; title=&#34;使用&#34;&gt;&lt;/a&gt;使用&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;本次使用iframe用法，其他用法略复杂，等以后再研究&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在需要展示pdf的地方引用一下代码即可，官方已经封装好用法，即web目录下的viewer.html,在之后跟踪file参数接pdf地址即可，示例如下：&lt;/p&gt;
&lt;figure class=&#34;highlight html&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;&lt;span class=&#34;name&#34;&gt;iframe&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;src&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;js/plugins/pdfjs/web/viewer.html&amp;#x27;?file=http://tax-manage.test/storage/contract/test.pdf&amp;#x27;)&amp;#125;&amp;#125;&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;frameborder&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;width&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;height&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;800px&amp;quot;&lt;/span&gt; &lt;span class=&#34;attr&#34;&gt;id&lt;/span&gt;=&lt;span class=&#34;string&#34;&gt;&amp;quot;iframe&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;tag&#34;&gt;&amp;lt;/&lt;span class=&#34;name&#34;&gt;iframe&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;效果图&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173310594409.jpg&#34; alt=&#34;16173310594409.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;签章展示&#34;&gt;&lt;a href=&#34;#签章展示&#34; class=&#34;headerlink&#34; title=&#34;签章展示&#34;&gt;&lt;/a&gt;签章展示&lt;/h3&gt;&lt;h4 id=&#34;签章报错&#34;&gt;&lt;a href=&#34;#签章报错&#34; class=&#34;headerlink&#34; title=&#34;签章报错&#34;&gt;&lt;/a&gt;签章报错&lt;/h4&gt;&lt;p&gt;然鹅，如上使用后pdf可展示了，but 电子签章不展示，打开控制台看到一个报错&lt;br&gt;util.js:366 Warning: Unimplemented widget field type “Sig”, falling back to base field type.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173314778345.jpg&#34; alt=&#34;16173314778345.jpg&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;无效的解决方案&#34;&gt;&lt;a href=&#34;#无效的解决方案&#34; class=&#34;headerlink&#34; title=&#34;无效的解决方案&#34;&gt;&lt;/a&gt;无效的解决方案&lt;/h4&gt;&lt;p&gt;查了半天，都说注释掉&lt;code&gt;pdf.worker.js&lt;/code&gt;里三行的代码&lt;/p&gt;
&lt;figure class=&#34;highlight javascript&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// if (data.fieldType === &amp;quot;Sig&amp;quot;) &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//   data.fieldValue = null;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//   this.setFlags(_util.AnnotationFlag.HIDDEN);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;// &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;然并卵&lt;/p&gt;
&lt;h4 id=&#34;真正解决&#34;&gt;&lt;a href=&#34;#真正解决&#34; class=&#34;headerlink&#34; title=&#34;真正解决&#34;&gt;&lt;/a&gt;真正解决&lt;/h4&gt;&lt;p&gt;最后在一位叫带甜味的盐的同学的文章（&lt;a href=&#34;https://blog.csdn.net/s_y_w123/article/details/108869862&#34;&gt;原文链接&lt;/a&gt;）下找到答案&lt;br&gt;在&lt;code&gt;pdf.worker.js&lt;/code&gt;中搜索下面一行&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173320819737.jpg&#34; alt=&#34;16173320819737.jpg&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight javascript&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;(&lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;, _util.&lt;span class=&#34;property&#34;&gt;warn&lt;/span&gt;)(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Unimplemented widget field type &amp;quot;&amp;#x27;&lt;/span&gt; + fieldType + &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;quot;, &amp;#x27;&lt;/span&gt; + &lt;span class=&#34;string&#34;&gt;&amp;quot;falling back to base field type.&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;修改为以下&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173321213805.jpg&#34; alt=&#34;16173321213805.jpg&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight javascript&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt;(fieldType !== &lt;span class=&#34;string&#34;&gt;&amp;quot;Sig&amp;quot;&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    (&lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;, _util.&lt;span class=&#34;property&#34;&gt;warn&lt;/span&gt;)(&lt;span class=&#34;string&#34;&gt;&amp;#x27;Unimplemented widget field type &amp;quot;&amp;#x27;&lt;/span&gt; + fieldType + &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;quot;, &amp;#x27;&lt;/span&gt; + &lt;span class=&#34;string&#34;&gt;&amp;quot;falling back to base field type.&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;WidgetAnnotation&lt;/span&gt;(parameters);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;具体为啥修改，请戳上面原文查看&lt;/p&gt;
&lt;h4 id=&#34;效果&#34;&gt;&lt;a href=&#34;#效果&#34; class=&#34;headerlink&#34; title=&#34;效果&#34;&gt;&lt;/a&gt;效果&lt;/h4&gt;&lt;p&gt;乙方签章已展示，奶思&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173322941298.jpg&#34; alt=&#34;16173322941298.jpg&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;忍不住吐槽，现在搜个问题解决方案是真滴难，到处都是无脑cv的答案，毛用没有，难受&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/16173330315869.jpg&#34; alt=&#34;16173330315869.jpg&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/03/25/zipArchive/</guid>
            <title>php使用ZipArchive类,压缩文件</title>
            <link>https://alon.wang/2021/03/25/zipArchive/</link>
            <category>php</category>
            <pubDate>Thu, 25 Mar 2021 22:51:08 +0800</pubDate>
            <description><![CDATA[ &lt;blockquote&gt;
&lt;p&gt;今天工作中,需要从服务器打包个人的签约pdf文件回本地,从数据库拉出个人的身份证号码及对应的签约文件名,最后要实现将签约文件以身份证号命名,于是写了个小脚本拉一下;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;保存身份证及文件名的对应关系文件如下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/1616984423889.jpg&#34; alt=&#34;1616984423889.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;文件打包成zip&#34;&gt;&lt;a href=&#34;#文件打包成zip&#34; class=&#34;headerlink&#34; title=&#34;文件打包成zip&#34;&gt;&lt;/a&gt;文件打包成zip&lt;/h3&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//身份证及文件名一一对应的条件存储文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$txt_file&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;./condition.txt&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//最后打包的zip包名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$zip_name&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;./res.zip&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//签约文件存储地址&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$dir&lt;/span&gt; = &lt;span class=&#34;string&#34;&gt;&amp;#x27;/Volumes/PHP/tax-manage/public/downloads/&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt; = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;ZipArchive&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * open方法第一个参数是压缩或解压的文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * open第二个参数,用ZipArchive::CREATE,若文件已存在,会继续添加,用ZipArchive::OVERWIRITE则会覆盖之前的zip包&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * 传ZipArchive::CREATE时,若zip包不存在会自动创建&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * 传ZipArchive::OVERWIRITE时,若zip包不存在,$zip-&amp;gt;open会返回数字9,后续addFile会报错Invalid or uninitialized Zip object &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; * */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt; &lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt;(&lt;span class=&#34;title function_ invoke__&#34;&gt;file_exists&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$zip_name&lt;/span&gt;))&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;title function_ invoke__&#34;&gt;unlink&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$zip_name&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;open&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$zip_name&lt;/span&gt;, &lt;span class=&#34;title class_&#34;&gt;ZipArchive&lt;/span&gt;::&lt;span class=&#34;variable constant_&#34;&gt;CREATE&lt;/span&gt;) == &lt;span class=&#34;literal&#34;&gt;TRUE&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//打开条件文件,读取身份证及签约文件名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$file_handler&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;fopen&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$txt_file&lt;/span&gt;, &lt;span class=&#34;string&#34;&gt;&amp;#x27;r&amp;#x27;&lt;/span&gt;);&lt;span class=&#34;comment&#34;&gt;//以可读方式打开文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//fgets读取行&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;while&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;fgets&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$file_handler&lt;/span&gt;)) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;explode&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;,&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$data&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$file_name&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;trim&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt;[&lt;span class=&#34;number&#34;&gt;0&lt;/span&gt;]).&lt;span class=&#34;string&#34;&gt;&amp;#x27;.pdf&amp;#x27;&lt;/span&gt;;&lt;span class=&#34;comment&#34;&gt;//用身份证重命名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$path&lt;/span&gt; = &lt;span class=&#34;variable&#34;&gt;$dir&lt;/span&gt;.&lt;span class=&#34;title function_ invoke__&#34;&gt;trim&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt;[&lt;span class=&#34;number&#34;&gt;1&lt;/span&gt;]);&lt;span class=&#34;comment&#34;&gt;//一定要trim,不然取出来的数据会有换行符&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;comment&#34;&gt;//添加文件到zip包中,第二个参数传入用于重命名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;        &lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;addFile&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$path&lt;/span&gt;.&lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt;[&lt;span class=&#34;number&#34;&gt;1&lt;/span&gt;], &lt;span class=&#34;variable&#34;&gt;$file_name&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;close&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;title function_ invoke__&#34;&gt;fclose&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$file_handler&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;keyword&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;finish&amp;#x27;&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h5 id=&#34;记一个bug，心酸&#34;&gt;&lt;a href=&#34;#记一个bug，心酸&#34; class=&#34;headerlink&#34; title=&#34;记一个bug，心酸&#34;&gt;&lt;/a&gt;记一个bug，心酸&lt;/h5&gt;&lt;blockquote&gt;
&lt;p&gt;第一次写完后,&lt;code&gt;fgets()&lt;/code&gt;方法取出一行数据后,用&lt;code&gt;explode()&lt;/code&gt;方法分割数据,得到的文件路径是带了换行符&lt;code&gt;\n&lt;/code&gt;的,但是这茬给忽略了,导致所有数据只有最后一行处理成功,因为没有换行;太菜了,哈哈哈哈;还以为是后面的覆盖了前面的文件呢,跟旁边的小伙伴想了半天还,最后还是小伙伴发现了这个,给自己一巴掌;(痛苦面具);特此记录一次,再忘记剁手(捂脸)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;如果ZipArchive类的addFile方法返回false,不要怀疑就是文件不存在或者路径不对,不要质疑(捂脸)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;解压缩zip包&#34;&gt;&lt;a href=&#34;#解压缩zip包&#34; class=&#34;headerlink&#34; title=&#34;解压缩zip包&#34;&gt;&lt;/a&gt;解压缩zip包&lt;/h3&gt;&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt; = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;ZipArchive&lt;/span&gt;();&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;//解压,open方法不需要传第二个参数&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;keyword&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;open&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;res.zip&amp;#x27;&lt;/span&gt;) === &lt;span class=&#34;literal&#34;&gt;TRUE&lt;/span&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;comment&#34;&gt;//将res.zip的内容解压到res文件夹中&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;extractTo&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;res&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    &lt;span class=&#34;variable&#34;&gt;$zip&lt;/span&gt;-&amp;gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;close&lt;/span&gt;();&lt;span class=&#34;comment&#34;&gt;//关闭处理的zip文件&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/03/18/hexo-github-trvis/</guid>
            <title>通过hexo+github+trvis-ci搭建个人博客</title>
            <link>https://alon.wang/2021/03/18/hexo-github-trvis/</link>
            <category>blog</category>
            <pubDate>Thu, 18 Mar 2021 15:20:54 +0800</pubDate>
            <description><![CDATA[ &lt;div class=&#34;note warning modern&#34;&gt;&lt;p&gt;tries-ci已收费，且github.io在国内访问较慢，推荐使用 &lt;a href=&#34;https://alon.wang/2025/02/05/netlify-hexo/&#34;&gt;netlify&lt;/a&gt; 部署，支持github一键部署，且国内访问流畅&lt;/p&gt;
&lt;/div&gt;



&lt;h2 id=&#34;github&#34;&gt;&lt;a href=&#34;#github&#34; class=&#34;headerlink&#34; title=&#34;github&#34;&gt;&lt;/a&gt;github&lt;/h2&gt;&lt;h3 id=&#34;1-在github中新建仓库并命名为-github用户名-github-io的仓库&#34;&gt;&lt;a href=&#34;#1-在github中新建仓库并命名为-github用户名-github-io的仓库&#34; class=&#34;headerlink&#34; title=&#34;1. 在github中新建仓库并命名为  github用户名.github.io的仓库&#34;&gt;&lt;/a&gt;1. 在github中新建仓库并命名为  github用户名.github.io的仓库&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/Q1DoKuJkzL48s7S.jpg&#34; alt=&#34;1&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-新增token&#34;&gt;&lt;a href=&#34;#2-新增token&#34; class=&#34;headerlink&#34; title=&#34;2.新增token&#34;&gt;&lt;/a&gt;2.新增token&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/Przm8NMSjgyO1Q9.jpg&#34; alt=&#34;2&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/V2EOLmQd9o5puJ6.jpg&#34; alt=&#34;3&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/LMAYFTIH26Baxhr.jpg&#34; alt=&#34;4&#34;&gt;&lt;/p&gt;
&lt;p&gt;保存好生成的 token，后面用于配置 travis-ci&lt;/p&gt;
&lt;h3 id=&#34;3-新建一个hexo分支用于存储后面的项目（分支可以自定义，后面配置中保持一致即可）&#34;&gt;&lt;a href=&#34;#3-新建一个hexo分支用于存储后面的项目（分支可以自定义，后面配置中保持一致即可）&#34; class=&#34;headerlink&#34; title=&#34;3.新建一个hexo分支用于存储后面的项目（分支可以自定义，后面配置中保持一致即可）&#34;&gt;&lt;/a&gt;3.新建一个hexo分支用于存储后面的项目（分支可以自定义，后面配置中保持一致即可）&lt;/h3&gt;&lt;h2 id=&#34;安装node-js&#34;&gt;&lt;a href=&#34;#安装node-js&#34; class=&#34;headerlink&#34; title=&#34;安装node.js&#34;&gt;&lt;/a&gt;安装node.js&lt;/h2&gt;&lt;p&gt;mac下载地址：&lt;a href=&#34;https://nodejs.org/en/&#34;&gt;https://nodejs.org/en/&lt;/a&gt;&lt;br&gt;其他系统，请自行寻找，如不本地调试，node.js也可以不装&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;node.js我使用的12.21.0版本,最新版的node.js在hexo构建后会报错&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;lineno&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(Use `node --trace-warnings ...` to show &lt;span class=&#34;built_in&#34;&gt;where&lt;/span&gt; the warning was created)&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;column&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;filename&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;lineno&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;column&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;(node:25044) Warning: Accessing non-existent property &lt;span class=&#34;string&#34;&gt;&amp;#x27;filename&amp;#x27;&lt;/span&gt; of module exports inside circular dependency&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;全局安装hexo&#34;&gt;&lt;a href=&#34;#全局安装hexo&#34; class=&#34;headerlink&#34; title=&#34;全局安装hexo&#34;&gt;&lt;/a&gt;全局安装hexo&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;npm install -g hexo-cli&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;添加环境变量&#34;&gt;&lt;a href=&#34;#添加环境变量&#34; class=&#34;headerlink&#34; title=&#34;添加环境变量&#34;&gt;&lt;/a&gt;添加环境变量&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;string&#34;&gt;&amp;#x27;PATH=&amp;quot;$PATH:./node_modules/.bin&amp;quot;&amp;#x27;&lt;/span&gt; &amp;gt;&amp;gt; ~/.profile&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;运行&#34;&gt;&lt;a href=&#34;#运行&#34; class=&#34;headerlink&#34; title=&#34;运行&#34;&gt;&lt;/a&gt;运行&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;$ hexo init ashin33 &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;$ &lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; ashin33&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;$ npm install&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;在指定目录下(上面为我的文件夹，请根据个人实际情况修改)生成hexo项目&lt;/p&gt;
&lt;h2 id=&#34;运行以下命令就可以预览你的博客了&#34;&gt;&lt;a href=&#34;#运行以下命令就可以预览你的博客了&#34; class=&#34;headerlink&#34; title=&#34;运行以下命令就可以预览你的博客了&#34;&gt;&lt;/a&gt;运行以下命令就可以预览你的博客了&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;hexo clean &lt;span class=&#34;comment&#34;&gt;## 用于清除已构建的文件  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hexo generate &lt;span class=&#34;comment&#34;&gt;##或者 hexo g  构建项目  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;hexo server &lt;span class=&#34;comment&#34;&gt;##或者 hexo s&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;##也可以`hexo s -g` 一步更比两步强&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;安装hexo主题&#34;&gt;&lt;a href=&#34;#安装hexo主题&#34; class=&#34;headerlink&#34; title=&#34;安装hexo主题&#34;&gt;&lt;/a&gt;安装hexo主题&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;git submodule add https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;此处选择了butterfly主题，更多主题请移步 &lt;a href=&#34;https://hexo.io/themes/&#34;&gt;https://hexo.io/themes/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;此处使用了git submodule 子模块加载命令，用于后续我们主项目推送时，将主题可以一起推到项目里，否则后面travis-ci自动构建会报错，找不到标签等错误&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;安装pug和stylus渲染器-用于渲染主题&#34;&gt;&lt;a href=&#34;#安装pug和stylus渲染器-用于渲染主题&#34; class=&#34;headerlink&#34; title=&#34;安装pug和stylus渲染器,用于渲染主题&#34;&gt;&lt;/a&gt;安装pug和stylus渲染器,用于渲染主题&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;npm install hexo-renderer-pug hexo-renderer-stylus --save&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;hexo博客发布与butterfly主题的具体使用，参考各自文档&#34;&gt;&lt;a href=&#34;#hexo博客发布与butterfly主题的具体使用，参考各自文档&#34; class=&#34;headerlink&#34; title=&#34;hexo博客发布与butterfly主题的具体使用，参考各自文档&#34;&gt;&lt;/a&gt;hexo博客发布与butterfly主题的具体使用，参考各自文档&lt;/h2&gt;&lt;p&gt;hexo文档：&lt;a href=&#34;https://hexo.io/zh-cn/docs/&#34;&gt;https://hexo.io/zh-cn/docs/&lt;/a&gt;&lt;br&gt;butterfly文档：&lt;a href=&#34;https://butterfly.js.org/posts/21cfbf15/&#34;&gt;https://butterfly.js.org/posts/21cfbf15/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;hexo配置&#34;&gt;&lt;a href=&#34;#hexo配置&#34; class=&#34;headerlink&#34; title=&#34;hexo配置&#34;&gt;&lt;/a&gt;hexo配置&lt;/h2&gt;&lt;p&gt;修改项目根目录下的_config.yml文件&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;title: 神的孩子都在跳舞  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;subtitle: &lt;span class=&#34;string&#34;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;description: 神的孩子都在跳舞  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;keywords:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;author: Alon  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;language: zh-CN  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;timezone: Asia/Shanghai  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;url: https://ashin33.github.io/  &lt;span class=&#34;comment&#34;&gt;##github分配的静态页面地址&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/TrIVbHum86j1d5K.jpg&#34; alt=&#34;5.jpg&#34;&gt;&lt;/p&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;theme: butterfly  &lt;span class=&#34;comment&#34;&gt;##themes目录下的主题目录&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;deploy:  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;type&lt;/span&gt;: git  &lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;repo: https://github.com/ashin33/ashin33.github.io.git  &lt;span class=&#34;comment&#34;&gt;##仓库地址&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;branch: hexo  &lt;span class=&#34;comment&#34;&gt;##代码要推送的分支&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/cLE3u4IDjmJQreF.jpg&#34; alt=&#34;6&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;butterfly配置&#34;&gt;&lt;a href=&#34;#butterfly配置&#34; class=&#34;headerlink&#34; title=&#34;butterfly配置&#34;&gt;&lt;/a&gt;butterfly配置&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;复制themes&amp;#x2F;butterfly下的_config.yml文件到项目根目录下并重命名为_config.butterfly.yml&lt;/li&gt;
&lt;li&gt;hexo构建时会合并_config.yml和_config.butterfly.yml的配置&lt;/li&gt;
&lt;li&gt;在此修改butterfly的配置，在后面更新主题是就不会影响配置了&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;配置travis-ci用于自动构建&#34;&gt;&lt;a href=&#34;#配置travis-ci用于自动构建&#34; class=&#34;headerlink&#34; title=&#34;配置travis-ci用于自动构建&#34;&gt;&lt;/a&gt;配置travis-ci用于自动构建&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;不使用travis-ci手动构建也是可以的，可以直接使用&lt;br&gt; &lt;code&gt;hexo deploy -g&lt;/code&gt;  或者  &lt;code&gt;hexo d -g&lt;/code&gt;,此命令会根据hexo配置文件的deploy的参数直接构建并推送&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-在travis-ci官网用github账号登录-，并激活，如图&#34;&gt;&lt;a href=&#34;#1-在travis-ci官网用github账号登录-，并激活，如图&#34; class=&#34;headerlink&#34; title=&#34;1. 在travis-ci官网用github账号登录 ，并激活，如图&#34;&gt;&lt;/a&gt;1. 在&lt;a href=&#34;https://travis-ci.com/&#34;&gt;travis-ci官网&lt;/a&gt;用github账号登录 ，并激活，如图&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/3k7ORZsuLyAXYGM.jpg&#34; alt=&#34;7&#34;&gt;&lt;br&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/mFqDLaOQPgoJTRZ.jpg&#34; alt=&#34;8&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-进入travis-ci中的自己的项目中进入setting中，按下图进行设置&#34;&gt;&lt;a href=&#34;#2-进入travis-ci中的自己的项目中进入setting中，按下图进行设置&#34; class=&#34;headerlink&#34; title=&#34;2. 进入travis-ci中的自己的项目中进入setting中，按下图进行设置&#34;&gt;&lt;/a&gt;2. 进入travis-ci中的自己的项目中进入setting中，按下图进行设置&lt;/h3&gt;&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/FPs3cCAg2hpndUE.jpg&#34; alt=&#34;9&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.loli.net/2021/03/26/rAjgG3QofNq4PJb.jpg&#34; alt=&#34;10&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-在项目根目录新增travis-ci的配置文件-travis-yml，并写入以下内容&#34;&gt;&lt;a href=&#34;#3-在项目根目录新增travis-ci的配置文件-travis-yml，并写入以下内容&#34; class=&#34;headerlink&#34; title=&#34;3.在项目根目录新增travis-ci的配置文件.travis.yml，并写入以下内容&#34;&gt;&lt;/a&gt;3.在项目根目录新增travis-ci的配置文件&lt;code&gt;.travis.yml&lt;/code&gt;，并写入以下内容&lt;/h3&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 指定语言环境&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;language: node_js&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 指定需要sudo权限&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;sudo: required&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 指定node_js版本,版本过低的话构建时travis会报错Uncaught SyntaxError: Unexpected token....&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;node_js:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - 12.21.0&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 指定缓存模块，可选。缓存可加快编译速度。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;cache:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  directories:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    - node_modules&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 指定博客源码分支，因人而异。hexo博客源码托管在独立repo则不用设置此项&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;branches:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  only:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    - hexo&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;before_install:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - npm install -g hexo-cli&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# Start: Build Lifecycle&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;install:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - npm install&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - npm install hexo-deployer-git --save&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 执行清缓存，生成网页操作&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;script:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - hexo clean&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - hexo generate&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# user.name替换为自己的github用户名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# user.email替换为自己的github邮箱&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# $&amp;#123;travis_ci&amp;#125;中的travis替换为自己github中的token名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# 这样每次推送代码，travis会自动在master分支中构建hexo&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;after_script:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - &lt;span class=&#34;built_in&#34;&gt;cd&lt;/span&gt; ./public&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git init&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git config user.name &lt;span class=&#34;string&#34;&gt;&amp;quot;ashin33&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git config user.email &lt;span class=&#34;string&#34;&gt;&amp;quot;ashin_33@163.com&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git add .&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git commit -m &lt;span class=&#34;string&#34;&gt;&amp;quot;Travis ci push&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  - git push --force --quiet &lt;span class=&#34;string&#34;&gt;&amp;quot;https://&lt;span class=&#34;variable&#34;&gt;$&amp;#123;travis_ci&amp;#125;&lt;/span&gt;@&lt;span class=&#34;variable&#34;&gt;$&amp;#123;gh_repo&amp;#125;&lt;/span&gt;&amp;quot;&lt;/span&gt; master:master&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;built_in&#34;&gt;env&lt;/span&gt;:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;  global:&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    - gh_repo: github.com/ashin33/ashin33.github.io.git&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;# End: Build LifeCycle&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h3 id=&#34;5-推送干净的项目代码（hexo-clean过的项目代码）到hexo分支&#34;&gt;&lt;a href=&#34;#5-推送干净的项目代码（hexo-clean过的项目代码）到hexo分支&#34; class=&#34;headerlink&#34; title=&#34;5.推送干净的项目代码（hexo clean过的项目代码）到hexo分支&#34;&gt;&lt;/a&gt;5.推送干净的项目代码（hexo clean过的项目代码）到hexo分支&lt;/h3&gt;&lt;h3 id=&#34;6-代码推送后，进入travis中可以看到构建过程，等待构建成功，访问https-ashin33-github-io-即可，网址中的ashin33-github-io替换为你的仓库名即可&#34;&gt;&lt;a href=&#34;#6-代码推送后，进入travis中可以看到构建过程，等待构建成功，访问https-ashin33-github-io-即可，网址中的ashin33-github-io替换为你的仓库名即可&#34; class=&#34;headerlink&#34; title=&#34;6.代码推送后，进入travis中可以看到构建过程，等待构建成功，访问https://ashin33.github.io 即可，网址中的ashin33.github.io替换为你的仓库名即可&#34;&gt;&lt;/a&gt;6.代码推送后，进入travis中可以看到构建过程，等待构建成功，访问&lt;a href=&#34;https://ashin33.github.io/&#34;&gt;https://ashin33.github.io&lt;/a&gt; 即可，网址中的ashin33.github.io替换为你的仓库名即可&lt;/h3&gt; ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://alon.wang/2021/03/06/php-tips/</guid>
            <title>php-tips</title>
            <link>https://alon.wang/2021/03/06/php-tips/</link>
            <category>php</category>
            <category>扩展</category>
            <pubDate>Sat, 06 Mar 2021 16:01:08 +0800</pubDate>
            <description><![CDATA[ &lt;h1 id=&#34;php扩展&#34;&gt;&lt;a href=&#34;#php扩展&#34; class=&#34;headerlink&#34; title=&#34;php扩展&#34;&gt;&lt;/a&gt;php扩展&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://xlswriter-docs.viest.me/&#34;&gt;xlswriter&lt;/a&gt;：Excel 处理工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/opcodesio/log-viewer&#34;&gt;opcodesio&amp;#x2F;log-viewer&lt;/a&gt;：laravel 的图像化日志&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/barryvdh/laravel-snappy&#34;&gt;barryvdh&amp;#x2F;laravel-snappy&lt;/a&gt;：pdf 处理工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/SimpleSoftwareIO/simple-qrcode&#34;&gt;SimpleSoftwareIO&amp;#x2F;simple-qrcode&lt;/a&gt;：二维码生成工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mewebstudio/captcha&#34;&gt;mews&amp;#x2F;captcha&lt;/a&gt;：图片验证码&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://spatie.be/docs/laravel-permission/v5/introduction&#34;&gt;spatie&amp;#x2F;laravel-permission&lt;/a&gt;：rbac 权限管理&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/overtrue/laravel-lang&#34;&gt;overtrue&amp;#x2F;laravel-lang&lt;/a&gt;：laravel 国际化&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/laravel/sanctum&#34;&gt;laravel&amp;#x2F;sanctum&lt;/a&gt;：laravel Api 授权&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/topclaudy/compoships&#34;&gt;awobaz&amp;#x2F;compoships&lt;/a&gt;：laravel 多字段关联&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/AnourValar/eloquent-serialize&#34;&gt;anourvalar&amp;#x2F;eloquent-serialize&lt;/a&gt;：Eloquent 的 query 序列化&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://image.intervention.io/v3&#34;&gt;Intervention\Image&lt;/a&gt;：图片处理&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/overtrue/laravel-lang&#34;&gt;overtrue&amp;#x2F;laravel-lang&lt;/a&gt;：laravel语言国际化&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/overtrue/laravel-query-logger&#34;&gt;overtrue&amp;#x2F;laravel-query-logger&lt;/a&gt;：laravel Query sql 语句日志&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Propaganistas/Laravel-Phone&#34;&gt;propaganistas&amp;#x2F;laravel-phone&lt;/a&gt;：laravel 手机号功能&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/overtrue/laravel-socialite&#34;&gt;overtrue&amp;#x2F;laravel-socialite&lt;/a&gt;：laravel OAuth 登录&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Propaganistas/Laravel-Phone&#34;&gt;overtrue&amp;#x2F;easy-sms&lt;/a&gt;：短信发送组件&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mewebstudio/Purifier&#34;&gt;mews&amp;#x2F;purifier&lt;/a&gt;：laravel 的 html 过滤器&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/spatie/laravel-query-builder&#34;&gt;spatie&amp;#x2F;laravel-query-builder&lt;/a&gt;：laravel 的根据 api 请求构建 Eloquent 查询&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/vinkla/laravel-hashids&#34;&gt;vinkla&amp;#x2F;laravel-hashids&lt;/a&gt; 数据id的哈希序列化&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/slince/composer-registry-manager&#34;&gt;slince&amp;#x2F;composer-registry-manager&lt;/a&gt; composer 镜像源管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;Tips&#34;&gt;&lt;a href=&#34;#Tips&#34; class=&#34;headerlink&#34; title=&#34;Tips&#34;&gt;&lt;/a&gt;Tips&lt;/h1&gt;&lt;h2 id=&#34;array-column函数&#34;&gt;&lt;a href=&#34;#array-column函数&#34; class=&#34;headerlink&#34; title=&#34;array_column函数&#34;&gt;&lt;/a&gt;array_column函数&lt;/h2&gt;&lt;p&gt;&lt;code&gt;array_column()&lt;/code&gt;:第二个参数为null,指定第二维数组里的键为第三个参数,可以提取该键对应的值为一维的键值&lt;/p&gt;
&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt; = [&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    [&lt;span class=&#34;string&#34;&gt;&amp;#x27;id&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;A&amp;#x27;&lt;/span&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    [&lt;span class=&#34;string&#34;&gt;&amp;#x27;id&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;b&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;B&amp;#x27;&lt;/span&gt;],&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;    [&lt;span class=&#34;string&#34;&gt;&amp;#x27;id&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;c&amp;#x27;&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;=&amp;gt;&lt;span class=&#34;string&#34;&gt;&amp;#x27;C&amp;#x27;&lt;/span&gt;]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;];&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;variable&#34;&gt;$res&lt;/span&gt; = &lt;span class=&#34;title function_ invoke__&#34;&gt;array_column&lt;/span&gt;(&lt;span class=&#34;variable&#34;&gt;$arr&lt;/span&gt;,&lt;span class=&#34;literal&#34;&gt;null&lt;/span&gt;,&lt;span class=&#34;string&#34;&gt;&amp;#x27;id&amp;#x27;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;/*&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt; $res = [&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;    &amp;#x27;a&amp;#x27;=&amp;gt;[&amp;#x27;id&amp;#x27;=&amp;gt;&amp;#x27;a&amp;#x27;,&amp;#x27;name&amp;#x27;=&amp;gt;&amp;#x27;A&amp;#x27;],&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;    &amp;#x27;b&amp;#x27;=&amp;gt;[&amp;#x27;id&amp;#x27;=&amp;gt;&amp;#x27;b&amp;#x27;,&amp;#x27;name&amp;#x27;=&amp;gt;&amp;#x27;B&amp;#x27;],&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;    &amp;#x27;c&amp;#x27;=&amp;gt;[&amp;#x27;id&amp;#x27;=&amp;gt;&amp;#x27;c&amp;#x27;,&amp;#x27;name&amp;#x27;=&amp;gt;&amp;#x27;C&amp;#x27;]&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;];&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;php和java的哈希macSha256加密&#34;&gt;&lt;a href=&#34;#php和java的哈希macSha256加密&#34; class=&#34;headerlink&#34; title=&#34;php和java的哈希macSha256加密&#34;&gt;&lt;/a&gt;php和java的哈希macSha256加密&lt;/h2&gt;&lt;figure class=&#34;highlight java&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;type&#34;&gt;Mac&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;mac&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; Mac.getInstance(&lt;span class=&#34;string&#34;&gt;&amp;quot;HmacSHA256&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;type&#34;&gt;SecretKeySpec&lt;/span&gt; &lt;span class=&#34;variable&#34;&gt;signingKey&lt;/span&gt; &lt;span class=&#34;operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;SecretKeySpec&lt;/span&gt;(appSecret.getBytes(), &lt;span class=&#34;string&#34;&gt;&amp;quot;HmacSHA256&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;mac.init(signingKey);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;type&#34;&gt;byte&lt;/span&gt;[] signData = mac.doFinal(encodedStr.getBytes());&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;type&#34;&gt;byte&lt;/span&gt;[] resultBytes = Base64.getEncoder().encode(signData);&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;signatureResult = &lt;span class=&#34;keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;title class_&#34;&gt;String&lt;/span&gt;(resultBytes, &lt;span class=&#34;string&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;figure class=&#34;highlight php&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;title function_ invoke__&#34;&gt;base64_encode&lt;/span&gt;(&lt;span class=&#34;title function_ invoke__&#34;&gt;hash_hmac&lt;/span&gt;(&lt;span class=&#34;string&#34;&gt;&amp;#x27;sha256&amp;#x27;&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$str&lt;/span&gt;, &lt;span class=&#34;variable&#34;&gt;$this&lt;/span&gt;-&amp;gt;appSecret, &lt;span class=&#34;literal&#34;&gt;true&lt;/span&gt;))&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&#34;查看php-ini的文件位置&#34;&gt;&lt;a href=&#34;#查看php-ini的文件位置&#34; class=&#34;headerlink&#34; title=&#34;查看php.ini的文件位置&#34;&gt;&lt;/a&gt;查看php.ini的文件位置&lt;/h2&gt;&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;php --ini&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;&lt;img src=&#34;https://alon-image-1305333140.cos.ap-shanghai.myqcloud.com/blog/WeChat111b3a8227c5190eda96fe19820a9d8c.png&#34; alt=&#34;WeChat111b3a8227c5190eda96fe19820a9d8c.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;composer&#34;&gt;&lt;a href=&#34;#composer&#34; class=&#34;headerlink&#34; title=&#34;composer&#34;&gt;&lt;/a&gt;composer&lt;/h1&gt;&lt;h2 id=&#34;切换源&#34;&gt;&lt;a href=&#34;#切换源&#34; class=&#34;headerlink&#34; title=&#34;切换源&#34;&gt;&lt;/a&gt;切换源&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;使用扩展切换镜像源&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer global require slince/composer-registry-manager&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 查看可用镜像&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;composer repo:&lt;span class=&#34;built_in&#34;&gt;ls&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;comment&#34;&gt;## 切换镜像源&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;composer repo:use 源名称&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;手动切换至腾讯云&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer config -g repo.packagist composer https://mirrors.cloud.tencent.com/composer&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;手动切换至官方源&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer config -g repo.packagist composer https://repo.packagist.org&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;ul&gt;
&lt;li&gt;查看当前源&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&#34;highlight bash&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;composer config -g -l |grep &lt;span class=&#34;string&#34;&gt;&amp;quot;repositories.packagist.org.url&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h1 id=&#34;xdebug&#34;&gt;&lt;a href=&#34;#xdebug&#34; class=&#34;headerlink&#34; title=&#34;xdebug&#34;&gt;&lt;/a&gt;xdebug&lt;/h1&gt;&lt;h2 id=&#34;php-ini中xdebug的配置&#34;&gt;&lt;a href=&#34;#php-ini中xdebug的配置&#34; class=&#34;headerlink&#34; title=&#34;php.ini中xdebug的配置&#34;&gt;&lt;/a&gt;php.ini中xdebug的配置&lt;/h2&gt;&lt;figure class=&#34;highlight plaintext&#34;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&#34;code&#34;&gt;&lt;pre&gt;&lt;span class=&#34;line&#34;&gt;[xdebug]&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;zend_extension=&amp;quot;xdebug.so&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.mode = debug&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.client_host = 127.0.0.1&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.client_port = 9003&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.start_with_request=yes&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.idekey = xdebug&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.discover_client_host=false&lt;/span&gt;&lt;br&gt;&lt;span class=&#34;line&#34;&gt;xdebug.log_level=0&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
 ]]></description>
        </item>
    </channel>
</rss>
