<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>漫步技术分享</title><link>https://manbutech.top/</link><description>一个对技术充满热爱的全栈程序员</description><item><title>Cursor 编辑器使用指南</title><link>https://manbutech.top/?id=25</link><description>&lt;h2&gt;一、简介&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; 是一款基于 VS Code 构建的 AI 编程编辑器，由 Anysphere 团队开发。它将大型语言模型（如 GPT-4、Claude）深度集成到开发环境中，提供智能代码补全、对话式代码生成、上下文感知、项目理解等功能，旨在提升开发效率、降低学习门槛。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;二、安装与配置&lt;/h2&gt;&lt;h3&gt;2.1 下载与安装&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;官网&lt;/strong&gt;：&lt;a href=&quot;https://cursor.com/&quot;&gt;https://cursor.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;支持平台&lt;/strong&gt;：Windows、macOS、Linux（基于 VS Code 构建，支持大部分 VS Code 插件和设置）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2.2 初次启动与配置&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;首次启动&lt;/strong&gt;：安装后启动 Cursor，登录或注册账号。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;设置中文界面&lt;/strong&gt;：&lt;code inline=&quot;&quot;&gt;File &amp;gt; Preferences &amp;gt; Extensions&lt;/code&gt;，搜索并安装 Chinese (Simplified) Language Pack。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;三、核心功能&lt;/h2&gt;&lt;h3&gt;3.1 Tab 智能补全&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：按下 &lt;code inline=&quot;&quot;&gt;Tab&lt;/code&gt; 键，Cursor 会根据上下文自动补全代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：适用于快速编写函数、类、条件语句等。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3.2 Cmd+K 一键 AI 助手&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：按下 &lt;code inline=&quot;&quot;&gt;Cmd+K&lt;/code&gt;（或 &lt;code inline=&quot;&quot;&gt;Ctrl+K&lt;/code&gt;），启动 AI 助手，进行代码生成、重构、审查等操作。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：输入“生成一个 Node.js + Express 的用户管理 API”，AI 会自动生成相应代码。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3.3 Chat 对话式编程&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：在编辑器中与 AI 进行对话，获取代码建议、解释、优化等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：适用于调试、学习新技术、理解复杂代码等。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3.4 Agent 模式&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：AI 会自动分析项目结构，理解上下文，提供更精准的建议。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：适用于大型项目、复杂系统的开发和维护。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、上下文与规则系统&lt;/h2&gt;&lt;h3&gt;4.1 上下文功能&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Files&lt;/strong&gt;：引用特定文件，AI 会根据这些文件提供更准确的建议和分析。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Folders&lt;/strong&gt;：引用特定文件夹，帮助 AI 理解项目结构并提供相关上下文信息。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Code&lt;/strong&gt;：引用代码段，在对话中直接引用代码段，用于代码解释、优化和修改建议。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Docs&lt;/strong&gt;：引用文档，快速引用项目相关文档，帮助 AI 获取更多上下文信息。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Git&lt;/strong&gt;：版本控制，与版本控制系统交互，查看提交记录和分支信息。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;@Web&lt;/strong&gt;：网页搜索，可以在 Cursor 命令中动态添加最新的在线信息和文档作为上下文。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;4.2 规则系统&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;.cursorrules&lt;/strong&gt;：在项目根目录创建 &lt;code inline=&quot;&quot;&gt;.cursorrules&lt;/code&gt; 文件，定义项目的开发规则、代码风格、依赖库等，帮助 AI 更好地理解项目要求。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;.cursorignore&lt;/strong&gt;：在项目根目录创建 &lt;code inline=&quot;&quot;&gt;.cursorignore&lt;/code&gt; 文件，指定 AI 在分析项目时忽略的文件或目录，避免不必要的干扰。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;五、快捷键与命令&lt;/h2&gt;&lt;h3&gt;5.1 常用快捷键&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;快捷键&lt;/th&gt;&lt;th&gt;功能描述&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;Tab&lt;/code&gt;&lt;/td&gt;&lt;td&gt;智能代码补全&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;Cmd+K&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动 AI 助手&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;Ctrl+L&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动 Chat 对话式编程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;Ctrl+I&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动 Agent 模式&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;5.2 常用命令&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;cursor-agent&lt;/code&gt;&lt;/strong&gt;：启动 Agent 模式。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;cursor-agent -p &amp;quot;&amp;lt;prompt&amp;gt;&amp;quot;&lt;/code&gt;&lt;/strong&gt;：执行一次性任务。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;cursor-agent --resume &amp;lt;session-id&amp;gt;&lt;/code&gt;&lt;/strong&gt;：恢复指定会话。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、实战案例：构建 AI 驱动的博客系统&lt;/h2&gt;&lt;h3&gt;6.1 项目结构&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;ai-blog/
├──&amp;nbsp;backend/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;后端代码
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;api/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;service/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;model/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;database/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;main.go
├──&amp;nbsp;frontend/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;前端代码
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;components/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;pages/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;utils/
├──&amp;nbsp;tests/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;测试代码
│&amp;nbsp;&amp;nbsp;&amp;nbsp;├──&amp;nbsp;backend/
│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;frontend/
├──&amp;nbsp;docker/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;容器构建文件
│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;Dockerfile
├──&amp;nbsp;scripts/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;自动化脚本
│&amp;nbsp;&amp;nbsp;&amp;nbsp;└──&amp;nbsp;migrate.sh
├──&amp;nbsp;requirements.md&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;需求文档
├──&amp;nbsp;.rules.md&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Cursor&amp;nbsp;开发规则
└──&amp;nbsp;README.md&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;项目总览&lt;/pre&gt;&lt;h3&gt;6.2 需求文档（requirements.md）&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;AI&amp;nbsp;驱动博客系统需求文档

##&amp;nbsp;项目目标

构建一个支持&amp;nbsp;AI&amp;nbsp;自动生成内容、前后端分离的博客系统。

##&amp;nbsp;功能模块

-&amp;nbsp;用户注册与登录
-&amp;nbsp;博客文章的增删改查
-&amp;nbsp;评论与点赞
-&amp;nbsp;后台管理（用户管理、内容审核）
-&amp;nbsp;AI&amp;nbsp;助手（根据主题自动生成文章内容）

##&amp;nbsp;技术栈

-&amp;nbsp;后端：Go（Gin&amp;nbsp;框架）、PostgreSQL
-&amp;nbsp;前端：Next.js、Tailwind&amp;nbsp;CSS
-&amp;nbsp;AI&amp;nbsp;接口：OpenAI&amp;nbsp;GPT-4
-&amp;nbsp;容器：Docker&amp;nbsp;+&amp;nbsp;Devbox（开发环境）&lt;/pre&gt;&lt;h3&gt;6.3 开发规则（.rules.md）&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;Cursor&amp;nbsp;开发规则

##&amp;nbsp;技术与架构

-&amp;nbsp;后端必须使用&amp;nbsp;Go（Gin&amp;nbsp;框架），禁止使用外部&amp;nbsp;ORM。
-&amp;nbsp;数据库使用&amp;nbsp;PostgreSQL，表结构按&amp;nbsp;SQL&amp;nbsp;标准。
-&amp;nbsp;前端使用&amp;nbsp;Next.js，采用&amp;nbsp;Tailwind&amp;nbsp;CSS&amp;nbsp;样式。
-&amp;nbsp;所有&amp;nbsp;API&amp;nbsp;接口必须返回标准&amp;nbsp;JSON&amp;nbsp;格式。
-&amp;nbsp;AI&amp;nbsp;接口通过&amp;nbsp;GPT-4&amp;nbsp;调用，封装为单独服务层。

##&amp;nbsp;代码规范

-&amp;nbsp;命名使用驼峰风格（camelCase）。
-&amp;nbsp;单文件长度不超过&amp;nbsp;300&amp;nbsp;行。
-&amp;nbsp;单元测试覆盖率不低于&amp;nbsp;80%。

##&amp;nbsp;其他约束

-&amp;nbsp;必须提供&amp;nbsp;Dockerfile，支持容器化部署。
-&amp;nbsp;前后端完全分离，通过&amp;nbsp;REST&amp;nbsp;API&amp;nbsp;通信。&lt;/pre&gt;&lt;h3&gt;6.4 示例对话&lt;/h3&gt;&lt;p&gt;开发者输入：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;基于需求文档，帮我生成&amp;nbsp;Go&amp;nbsp;的&amp;nbsp;RESTful&amp;nbsp;API&amp;nbsp;后端框架，包括：

-&amp;nbsp;/api/article&amp;nbsp;增删改查接口
-&amp;nbsp;数据库&amp;nbsp;PostgreSQL&amp;nbsp;建表&amp;nbsp;SQL
-&amp;nbsp;使用&amp;nbsp;Gin&amp;nbsp;框架
-&amp;nbsp;符合&amp;nbsp;.rules.md&amp;nbsp;中的约束&lt;/pre&gt;&lt;p&gt;AI 响应：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;//&amp;nbsp;生成&amp;nbsp;Go&amp;nbsp;后端目录及主要代码：

//&amp;nbsp;main.go
package&amp;nbsp;main

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;github.com/gin-gonic/gin&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;ai-blog/api&amp;quot;
)

func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r&amp;nbsp;:=&amp;nbsp;gin.Default()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;api.RegisterRoutes(r)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.Run(&amp;quot;:8080&amp;quot;)
}

//&amp;nbsp;api/article.go
package&amp;nbsp;api

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;github.com/gin-gonic/gin&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;ai-blog/service&amp;quot;
)

func&amp;nbsp;RegisterRoutes(r&amp;nbsp;*gin.Engine)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.GET(&amp;quot;/api/article&amp;quot;,&amp;nbsp;service.GetArticles)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.POST(&amp;quot;/api/article&amp;quot;,&amp;nbsp;service.CreateArticle)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.PUT(&amp;quot;/api/article/:id&amp;quot;,&amp;nbsp;service.UpdateArticle)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r.DELETE(&amp;quot;/api/article/:id&amp;quot;,&amp;nbsp;service.DeleteArticle)
}

//&amp;nbsp;service/article.go
package&amp;nbsp;service

import&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;ai-blog/model&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;github.com/gin-gonic/gin&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;net/http&amp;quot;
)

func&amp;nbsp;GetArticles(c&amp;nbsp;*gin.Context)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;获取文章列表的逻辑
}

func&amp;nbsp;CreateArticle(c&amp;nbsp;*gin.Context)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;创建文章的逻辑
}

func&amp;nbsp;UpdateArticle(c&amp;nbsp;*gin.Context)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;更新文章的逻辑
}

func&amp;nbsp;DeleteArticle(c&amp;nbsp;*gin.Context)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;删除文章的逻辑
}&lt;/pre&gt;&lt;p&gt;开发者输入：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;生成&amp;nbsp;Next.js&amp;nbsp;前端页面：

-&amp;nbsp;博客文章列表（/pages/articles）
-&amp;nbsp;博客详情（/pages/articles/[id]）
-&amp;nbsp;样式用&amp;nbsp;Tailwind
-&amp;nbsp;遵循&amp;nbsp;.rules.md&amp;nbsp;约束&lt;/pre&gt;&lt;p&gt;AI 响应：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;//&amp;nbsp;pages/articles/index.js
import&amp;nbsp;React&amp;nbsp;from&amp;nbsp;&amp;#39;react&amp;#39;

const&amp;nbsp;Articles&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;获取文章列表的逻辑
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;className=&amp;quot;container&amp;nbsp;mx-auto&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;nbsp;className=&amp;quot;text-3xl&amp;nbsp;font-bold&amp;quot;&amp;gt;博客文章列表&amp;lt;/h1&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/*&amp;nbsp;文章列表&amp;nbsp;*/}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
}

export&amp;nbsp;default&amp;nbsp;Articles

//&amp;nbsp;pages/articles/[id].js
import&amp;nbsp;React&amp;nbsp;from&amp;nbsp;&amp;#39;react&amp;#39;

const&amp;nbsp;ArticleDetail&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;获取文章详情的逻辑
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;className=&amp;quot;container&amp;nbsp;mx-auto&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;nbsp;className=&amp;quot;text-3xl&amp;nbsp;font-bold&amp;quot;&amp;gt;文章详情&amp;lt;/h1&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/*&amp;nbsp;文章内容&amp;nbsp;*/}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
}

export&amp;nbsp;default&amp;nbsp;ArticleDetail&lt;/pre&gt;&lt;p&gt;开发者输入：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;生成&amp;nbsp;PostgreSQL&amp;nbsp;建表&amp;nbsp;SQL&lt;/pre&gt;&lt;p&gt;AI 响应：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;--&amp;nbsp;创建文章表
CREATE&amp;nbsp;TABLE&amp;nbsp;articles&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id&amp;nbsp;SERIAL&amp;nbsp;PRIMARY&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title&amp;nbsp;VARCHAR(255)&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content&amp;nbsp;TEXT&amp;nbsp;NOT&amp;nbsp;NULL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;created_at&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updated_at&amp;nbsp;TIMESTAMP&amp;nbsp;DEFAULT&amp;nbsp;CURRENT_TIMESTAMP
);&lt;/pre&gt;&lt;hr/&gt;&lt;h2&gt;七、最佳实践与团队建议&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;统一规则与记忆文件&lt;/strong&gt;：在团队项目中，建议统一建立项目级记忆文件（如 &lt;code inline=&quot;&quot;&gt;AGENTS.md&lt;/code&gt; 或 &lt;code inline=&quot;&quot;&gt;.rules.md&lt;/code&gt;），记录项目架构、规范、约定，供 AI 参考。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;权限控制&lt;/strong&gt;：在敏感或生产环境中使用 AI 自动改动前，务必备份代码，并设置权限控制，避免误操作。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;脚本化调用&lt;/strong&gt;：在 CI/CD 流程中使用非交互模式，并为关键任务设置超时、失败回退机制，确保稳定性&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 19 Oct 2025 12:04:19 +0800</pubDate></item><item><title>Claude Code CLI 使用指南</title><link>https://manbutech.top/?id=24</link><description>&lt;h2&gt;一、简介&lt;/h2&gt;&lt;p&gt;Claude Code CLI 是由 Anthropic 推出的命令行工具，专为开发者设计，使你能够在终端环境中调用 Claude 系列模型进行“编程助手机器人”式的辅助：代码生成、分析、审查、自动化流程。&lt;br/&gt;其核心价值包括：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;在终端环境中通过自然语言描述任务，快速生成或修改代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;支持脚本化、可编排、高度可定制，适合团队协作与 DevOps 流程。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;支持多语言／多模型、较长上下文、工具权限控制等高级能力。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;二、安装与初次配置&lt;/h2&gt;&lt;h3&gt;2.1 系统要求&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;支持：macOS、Linux、Windows（推荐在 Windows 使用 WSL2）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;安装之前建议安装 Node.js（如需使用 npm 安装方式）或遵循镜像站指引。&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2.2 安装方式&lt;/h3&gt;&lt;p&gt;示例安装命令：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;全局安装（npm）：
npm&amp;nbsp;install&amp;nbsp;-g&amp;nbsp;@anthropic-ai/claude-code

#&amp;nbsp;安装后验证版本：
claude&amp;nbsp;--version&lt;/pre&gt;&lt;h3&gt;2.3 环境配置&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;设置 API Key 环境变量：例如 &lt;code inline=&quot;&quot;&gt;ANTHROPIC_API_KEY=&amp;quot;sk-…&amp;quot;&lt;/code&gt;.&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在 Windows 上可能还需设置 &lt;code inline=&quot;&quot;&gt;ANTHROPIC_BASE_URL&lt;/code&gt; 等替代镜像地址。&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;启动 CLI：在项目目录运行：&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;cd&amp;nbsp;/path/to/project
claude&lt;/pre&gt;&lt;p&gt;你将看到欢迎界面，并可输入 &lt;code inline=&quot;&quot;&gt;/help&lt;/code&gt; 查看命令。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;三、基本使用模式&lt;/h2&gt;&lt;h3&gt;3.1 交互式模式（REPL）&lt;/h3&gt;&lt;p&gt;在命令行中直接运行 &lt;code inline=&quot;&quot;&gt;claude&lt;/code&gt; 进入交互式界面。你可以像聊天一样输入自然语言。例如：“帮我生成一个 Express API 服务”或“分析这段代码的性能问题”。&lt;br/&gt;可以执行命令如 &lt;code inline=&quot;&quot;&gt;/help&lt;/code&gt;、&lt;code inline=&quot;&quot;&gt;/resume&lt;/code&gt; 等。&lt;/p&gt;&lt;h3&gt;3.2 非交互／脚本模式（一次性任务）&lt;/h3&gt;&lt;p&gt;适用于脚本化调用、CI／自动化流程：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;claude&amp;nbsp;-p&amp;nbsp;&amp;quot;生成一个&amp;nbsp;Node.js&amp;nbsp;+&amp;nbsp;Express&amp;nbsp;用户管理服务&amp;quot;&amp;nbsp;--output-format=json&lt;/pre&gt;&lt;p&gt;常用参数：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-p &amp;lt;prompt&amp;gt;&lt;/code&gt;：非交互 prompt。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;--output-format=&amp;lt;text|json|stream-json&amp;gt;&lt;/code&gt;：指定输出格式。&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3.3 会话／历史管理&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-c&lt;/code&gt;：继续上次会话。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-r &amp;lt;session-id&amp;gt;&lt;/code&gt;：恢复指定会话。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;--session-id &amp;lt;id&amp;gt;&lt;/code&gt;：保持固定会话 ID 执行长期任务。&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、常用命令 &amp;amp; 参数速查&lt;/h2&gt;&lt;h3&gt;4.1 核心命令&lt;/h3&gt;&lt;p&gt;以下为部分常用命令速查：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;/&amp;nbsp;help&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;显示帮助
/&amp;nbsp;init&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;使用&amp;nbsp;CLAUDE.md&amp;nbsp;或其它初始化项目
/&amp;nbsp;memory&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;编辑或管理记忆文件
/&amp;nbsp;clear&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;清除当前会话上下文
/&amp;nbsp;compact&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;压缩／精简当前会话历史
/&amp;nbsp;resume&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;恢复会话
/&amp;nbsp;config&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;查看／修改配置
/&amp;nbsp;bug&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;报告错误或问题&lt;/pre&gt;&lt;h3&gt;4.2 启动参数示例&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;功能说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;-p &amp;lt;prompt&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;非交互 prompt 模式，一次性执行任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;--output-format=&amp;lt;…&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定输出格式（text、json、stream-json）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;-c&lt;/code&gt;&lt;/td&gt;&lt;td&gt;继续上次会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;-r &amp;lt;session-id&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;恢复指定会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;--allowedTools=&amp;lt;tools&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;允许使用的工具白名单&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;--disallowedTools=&amp;lt;tools&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;禁止使用的工具白名单&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;--permission-mode=&amp;lt;mode&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;权限模式（如 plan、acceptEdits、bypass）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;word-break: break-all;&quot;&gt;&lt;code inline=&quot;&quot;&gt;--model &amp;lt;model-name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定模型，比如：sonnet、opus 等&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr/&gt;&lt;h2&gt;五、核心机制解析&lt;/h2&gt;&lt;h3&gt;5.1 记忆（Memory）系统&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;支持将团队／项目上下文保存在记忆文件（如 &lt;code inline=&quot;&quot;&gt;CLAUDE.md&lt;/code&gt;）中，CLI 启动时自动加载。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;建议团队创建项目级别记忆文件，记录项目架构、规范、约定。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;5.2 工具与权限控制&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;CLI 支持工具调用（如 Bash 命令、文件读写、外部服务）并可设置权限控制。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;推荐在团队环境中设置白名单／黑名单工具，避免 AI 执行危险操作。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;5.3 多代理／子 Agent 机制&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;可以为特定任务定义子 Agent（Subagent）：拥有专属提示、工具权限、上下文。增强任务执行能力。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;5.4 集成 &amp;amp;自动化流&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;支持将 Claude Code CLI 嵌入 CI/CD、脚本、Git Hook 中。例如：&lt;code inline=&quot;&quot;&gt;git diff | claude -p &amp;quot;生成 PR 描述&amp;quot;&lt;/code&gt;。&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、实战案例：使用 Claude Code 生成服务 + 审查&lt;/h2&gt;&lt;h3&gt;案例背景&lt;/h3&gt;&lt;p&gt;项目：假设团队正在开发 “订单管理服务” (Order Service)，使用 Node.js + Express + MongoDB。&lt;br/&gt;任务：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;使用 Claude Code CLI 生成 &lt;code inline=&quot;&quot;&gt;GET /orders&lt;/code&gt; 和 &lt;code inline=&quot;&quot;&gt;POST /orders&lt;/code&gt; 路由。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;使用 CLI 对生成代码进行审查，获取优化建议。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;操作步骤&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;初始化项目：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;order-service&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cd&amp;nbsp;order-service
npm&amp;nbsp;init&amp;nbsp;-y&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;生成代码：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;claude&amp;nbsp;-p&amp;nbsp;&amp;quot;Generate&amp;nbsp;a&amp;nbsp;Node.js&amp;nbsp;+&amp;nbsp;Express&amp;nbsp;order&amp;nbsp;management&amp;nbsp;API&amp;nbsp;with&amp;nbsp;GET&amp;nbsp;/orders&amp;nbsp;and&amp;nbsp;POST&amp;nbsp;/orders&amp;nbsp;using&amp;nbsp;MongoDB&amp;quot;&amp;nbsp;--output-format=text&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;安装依赖并运行：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;npm&amp;nbsp;install&amp;nbsp;express&amp;nbsp;mongoose
node&amp;nbsp;index.js&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;审查代码：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;claude
#&amp;nbsp;在交互模式输入：
/review&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;CLI 将分析代码变更并提出性能、安全、可维护性建议。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;将审查结果加入团队记忆文件（如 &lt;code inline=&quot;&quot;&gt;CLAUDE.md&lt;/code&gt;），作为下一次任务参考。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;七、最佳实践与团队建议&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;在团队项目中，建议统一建立项目级记忆文件（&lt;code inline=&quot;&quot;&gt;CLAUDE.md&lt;/code&gt;）和子 Agent 模板。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;严格使用权限控制策略，特别是在生产环境或敏感仓库中。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;将 Claude Code 嵌入日常流程：如 Pull Request 审查、代码生成、模块重构。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在使用 -p 批处理模式时，做好 CI 回退机制和日志记录，避免误改。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;定期审查 使用成本、Token 消耗、模型选择，以控制预算。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;八、附录：快速命令速查表&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;安装验证
claude&amp;nbsp;--version

#&amp;nbsp;启动交互式
claude

#&amp;nbsp;脚本化调用
claude&amp;nbsp;-p&amp;nbsp;&amp;quot;Explain&amp;nbsp;this&amp;nbsp;function&amp;quot;&amp;nbsp;--output-format=json

#&amp;nbsp;会话管理
claude&amp;nbsp;-c
claude&amp;nbsp;-r&amp;nbsp;&amp;lt;session-id&amp;gt;

#&amp;nbsp;常用&amp;nbsp;/&amp;nbsp;命令
/&amp;nbsp;help&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;init&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;memory&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;review&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;config&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;bug&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;clear&amp;nbsp;&amp;nbsp;&amp;nbsp;/&amp;nbsp;compact

#&amp;nbsp;启动参数示例
claude&amp;nbsp;--allowedTools&amp;nbsp;&amp;quot;Edit&amp;quot;&amp;nbsp;--disallowedTools&amp;nbsp;&amp;quot;Bash(rm:*)&amp;quot;
claude&amp;nbsp;--permission-mode&amp;nbsp;plan&amp;nbsp;-p&amp;nbsp;&amp;quot;Draft&amp;nbsp;release&amp;nbsp;notes&amp;quot;&lt;/pre&gt;</description><pubDate>Sun, 19 Oct 2025 10:24:50 +0800</pubDate></item><item><title>Qoder CLI 使用指南（入门版）</title><link>https://manbutech.top/?id=23</link><description>&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://manbutech.top/zb_users/upload/2025/10/202510191760839676179105.png&quot; title=&quot;ScreenShot_2025-10-19_100700_261.png&quot; alt=&quot;ScreenShot_2025-10-19_100700_261.png&quot;/&gt;&lt;/h2&gt;&lt;h2&gt;引言&lt;/h2&gt;&lt;p&gt;在现代软件开发流程中，越来越多团队开始采用命令行工具和 AI 辅助来提升效率。 Qoder CLI 是 Qoder 平台推出的一款命令行界面工具，旨在让开发者直接在终端环境中使用自然语言生成代码、审查代码、自动化任务、管理记忆文件等。本文将从安装、使用、团队协作流程、实战案例等多个维度，带你快速掌握 Qoder CLI，并指导团队如何把它纳入日常工作流程。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;一、为什么使用 Qoder CLI？&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;轻量启动&lt;/strong&gt;：相比传统 IDE 插件，它无需复杂 UI 配置，直接在终端即可调用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自然语言驱动&lt;/strong&gt;：你只需用一句话描述需求，工具就可以生成代码、创建文件结构、甚至审查代码。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;团队记忆 &amp;amp;规范共享&lt;/strong&gt;：通过记忆文件（例如 AGENTS.md）保存团队规范、上下文信息，所有成员可共享。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多模式支持&lt;/strong&gt;：除交互式模式外，还支持非交互脚本模式，方便 CI/CD 集成。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;工具链集成&lt;/strong&gt;：支持权限控制、子 Agent（Subagent）、工作树（Worktree）并行任务等高级功能，非常适合团队协作。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;总之，Qoder CLI 是「在终端中就让 AI 成为开发助手」的工具，非常适合希望提升开发效率、统一团队流程的团队使用。&lt;/p&gt;&lt;/blockquote&gt;&lt;hr/&gt;&lt;h2&gt;二、安装与初次登录&lt;/h2&gt;&lt;h3&gt;2.1 系统准备&lt;/h3&gt;&lt;p&gt;确保你的开发环境为 macOS、Linux，或 Windows（建议用 Windows Terminal）即可。&lt;/p&gt;&lt;h3&gt;2.2 安装方式&lt;/h3&gt;&lt;p&gt;你可以选择以下任一方式安装：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;通用方式（curl&amp;nbsp;脚本）&amp;nbsp;&amp;nbsp;
curl&amp;nbsp;-fsSL&amp;nbsp;https://qoder.com/install&amp;nbsp;|&amp;nbsp;bash

#&amp;nbsp;macOS&amp;nbsp;/&amp;nbsp;Linux（Homebrew）&amp;nbsp;&amp;nbsp;
brew&amp;nbsp;install&amp;nbsp;qoderai/qoder/qodercli&amp;nbsp;--cask

#&amp;nbsp;npm&amp;nbsp;全局安装&amp;nbsp;&amp;nbsp;
npm&amp;nbsp;install&amp;nbsp;-g&amp;nbsp;@qoder-ai/qodercli&lt;/pre&gt;&lt;p&gt;安装完成后，运行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;qodercli&amp;nbsp;--version&lt;/pre&gt;&lt;p&gt;确认安装成功。&lt;/p&gt;&lt;h3&gt;2.3 登录&lt;/h3&gt;&lt;p&gt;在项目根目录中运行：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;qodercli&lt;/pre&gt;&lt;p&gt;首次启动将提示你登录账号。登录完成后即可使用 TUI 模式、非交互模式等功能。&lt;/p&gt;&lt;hr/&gt;&lt;h2&gt;三、基本使用模式&lt;/h2&gt;&lt;h3&gt;3.1 交互式 TUI 模式&lt;/h3&gt;&lt;p&gt;在项目目录直接执行 &lt;code inline=&quot;&quot;&gt;qodercli&lt;/code&gt;，你会进入一个终端交互界面。&lt;br/&gt;在该界面中，支持以下几种输入方式：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;对话模式&lt;/strong&gt;：直接输入自然语言，例如 “生成一个 Express API”。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;斜杠命令模式&lt;/strong&gt;：以 &lt;code inline=&quot;&quot;&gt;/&lt;/code&gt; 开头输入内置命令，如 &lt;code inline=&quot;&quot;&gt;/help&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bash 模式&lt;/strong&gt;：在对话中输入 &lt;code inline=&quot;&quot;&gt;!&lt;/code&gt; + shell 命令，如 &lt;code inline=&quot;&quot;&gt;!ls&lt;/code&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;记忆模式&lt;/strong&gt;：输入 &lt;code inline=&quot;&quot;&gt;#&lt;/code&gt; 可将多行文本追加到团队记忆文件（AGENTS.md）。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3.2 非交互／脚本化模式&lt;/h3&gt;&lt;p&gt;对于自动化脚本、CI/CD 流程，可以使用：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;qodercli&amp;nbsp;-p&amp;nbsp;&amp;quot;生成一个使用&amp;nbsp;Express&amp;nbsp;的&amp;nbsp;API&amp;nbsp;服务&amp;quot;&amp;nbsp;--output-format=json&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;-p&lt;/code&gt; 参数：用于指定 prompt。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code inline=&quot;&quot;&gt;--output-format&lt;/code&gt;：可选 &lt;code inline=&quot;&quot;&gt;text|json|stream-json&lt;/code&gt;。&lt;br/&gt;此模式适合无人工交互、自动执行的场景。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;四、常用命令速查&lt;/h2&gt;&lt;p&gt;在交互式 TUI 模式中，你可以输入以下斜杠命令来执行常见操作：&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;功能说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/login&lt;/code&gt;&lt;/td&gt;&lt;td&gt;登录 Qoder 账号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/help&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示帮助信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/init&lt;/code&gt;&lt;/td&gt;&lt;td&gt;在项目中初始化或更新 AGENTS.md 记忆文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/memory&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑 AGENTS.md 记忆文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/quest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;根据任务规格分配任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/review&lt;/code&gt;&lt;/td&gt;&lt;td&gt;审查本地代码改动&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/resume&lt;/code&gt;&lt;/td&gt;&lt;td&gt;查看／恢复指定会话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/clear&lt;/code&gt;&lt;/td&gt;&lt;td&gt;清除当前会话历史上下文&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/compact&lt;/code&gt;&lt;/td&gt;&lt;td&gt;对当前会话进行摘要／压缩&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/usage&lt;/code&gt;&lt;/td&gt;&lt;td&gt;查看账户状态（Credits、模型使用情况等）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/status&lt;/code&gt;&lt;/td&gt;&lt;td&gt;查看 CLI 状态（版本、模型、工具状态）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/config&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示系统／用户／项目配置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/agents&lt;/code&gt;&lt;/td&gt;&lt;td&gt;管理子 Agent（查看、创建、删除）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/bashes&lt;/code&gt;&lt;/td&gt;&lt;td&gt;查看当前后台运行的 Bash 任务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/release-notes&lt;/code&gt;&lt;/td&gt;&lt;td&gt;显示 CLI 更新日志&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/vim&lt;/code&gt;&lt;/td&gt;&lt;td&gt;打开外部编辑器编辑当前输入&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/feedback&lt;/code&gt;&lt;/td&gt;&lt;td&gt;反馈 Qoder CLI 相关问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/quit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;退出 TUI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code inline=&quot;&quot;&gt;/logout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;注销当前账号&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr/&gt;&lt;h2&gt;五、团队协作流程建议&lt;/h2&gt;&lt;h3&gt;5.1 记忆文件 （Memory）管理&lt;/h3&gt;&lt;p&gt;在项目根目录建议建立 &lt;code inline=&quot;&quot;&gt;AGENTS.md&lt;/code&gt; 作为团队共享记忆文件。内容可以包括：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;项目架构说明&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;团队开发规范&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;常用 Agent 定义&lt;br/&gt;团队成员在 TUI 中输入 &lt;code inline=&quot;&quot;&gt;#&lt;/code&gt; 即可将内容追加到该文件，实现共享记忆。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;5.2 子 Agent (Subagent)配置&lt;/h3&gt;&lt;p&gt;对于反复任务（如代码审查、单元测试生成、迁移脚本等），建议预定义子 Agent。文件目录如：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;project/
&amp;nbsp;&amp;nbsp;agents/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code-review.md
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unit-test-gen.md&lt;/pre&gt;&lt;p&gt;每个 Agent 文件内容示例：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;---
name:&amp;nbsp;code-review
description:&amp;nbsp;专注于代码质量审查和安全性检查
tools:&amp;nbsp;Read,&amp;nbsp;Grep,&amp;nbsp;Bash
---
你是一位资深代码审查专家，负责检查代码质量、安全风险、规范一致性…&lt;/pre&gt;&lt;p&gt;团队成员可直接调用这一 Agent 来执行任务，从而统一流程。&lt;/p&gt;&lt;h3&gt;5.3 权限控制与工具策略&lt;/h3&gt;&lt;p&gt;建议在项目目录下加入 &lt;code inline=&quot;&quot;&gt;.qoder/settings.local.json&lt;/code&gt; 并加入 .gitignore，以管理敏感配置。示例配置：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;{
&amp;nbsp;&amp;nbsp;&amp;quot;permissions&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;deny&amp;quot;:&amp;nbsp;[&amp;quot;Edit(src/config/production.json)&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;allow&amp;quot;:&amp;nbsp;[&amp;quot;Read(src/**)&amp;quot;,&amp;nbsp;&amp;quot;Write(src/**)&amp;quot;]
&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;这样可防止 AI 不经意修改生产配置文件。&lt;/p&gt;&lt;h3&gt;5.4 将 Qoder CLI 纳入开发流程&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;每位成员在本地环境安装 CLI 并登录。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在每次迭代开始时，通过 &lt;code inline=&quot;&quot;&gt;qodercli&lt;/code&gt; 生成初始代码、任务文档。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在 CI 流程或代码合并中，使用非交互模式自动执行代码生成或审查脚本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;团队会议中定期分享 CLI 使用心得、子 Agent 扩展经验。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;六、实战案例：生成用户管理 API + 代码审查&lt;/h2&gt;&lt;h3&gt;案例背景&lt;/h3&gt;&lt;p&gt;项目：用户管理服务（Node.js + Express）&lt;br/&gt;目标：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;通过 Qoder CLI 生成 GET /users 和 POST /users 接口，连接 MongoDB。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;对已生成代码进行代码审查，提出优化建议。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;操作步骤&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;初始化项目：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;user-service&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cd&amp;nbsp;user-service
npm&amp;nbsp;init&amp;nbsp;-y&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;生成接口代码：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;qodercli&amp;nbsp;-p&amp;nbsp;&amp;quot;生成一个&amp;nbsp;Node.js&amp;nbsp;+&amp;nbsp;Express&amp;nbsp;的用户管理服务，包含&amp;nbsp;GET&amp;nbsp;/users&amp;nbsp;和&amp;nbsp;POST&amp;nbsp;/users，使用&amp;nbsp;MongoDB，遵循&amp;nbsp;ESLint&amp;nbsp;团队规范&amp;quot;&amp;nbsp;--output-format=text&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;安装依赖并启动：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;npm&amp;nbsp;install&amp;nbsp;express&amp;nbsp;mongoose
node&amp;nbsp;index.js&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;引入代码审查：启动 TUI 模式执行：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;qodercli
#&amp;nbsp;输入&amp;nbsp;/review&lt;/pre&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;工具将分析当前代码变更并提供建议，如性能、结构、命名、异常处理等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;将审查结果整理进 AGENTS.md 中，作为团队规范参考。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr/&gt;&lt;h2&gt;七、注意事项与最佳实践&lt;/h2&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;虽然 Qoder CLI 功能强大，但建议它作为辅助工具，不应完全替代 IDE 或人工审查。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;执行 AI 自动生成或改动前，务必在 Git 中做 commit／分支备份。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;敏感或生产环境的配置文件，强烈建议加权限控制或设为 deny。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;团队应定期维护 AGENTS.md 和子 Agent 清单，保持内容同步、规范有效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在 CI 或自动化脚本场景使用非交互模式时，建议加入回退机制、防止误执行。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr/&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;如果你的团队希望在“终端+自然语言+AI”这一趋势中抢占效率优势，那么 Qoder CLI 是一个非常值得引入的工具。从快速生成代码、统一规范、自动审查，到脚本化流程、团队记忆共享，它都提供了丰富能力。配合本文中的安装、使用、团队流程及案例，你即可带领团队快速进入状态。期待你们在开发中取得更高效率、更优质的代码成果！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 19 Oct 2025 09:43:56 +0800</pubDate></item><item><title>记一次开源网站系统文件一直被篡改的问题及解决思路</title><link>https://manbutech.top/?id=22</link><description>&lt;h3&gt;前言&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;最近有个客户的网站过几天就会把网站系统的首页文件篡改一下，非常烦，客户找我恢复了好几次了，我想是时候要解决一下了&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;解决思路&lt;br/&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;他把是一直会篡改那个文件，那我就写一个脚本每5秒去检测一下是否被篡改，如果篡改了就恢复，天才的想法&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;实现代码&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!/bin/bash

#&amp;nbsp;定义要监控的文件路径
FILE=&amp;quot;/www/wwwroot/www.xxx.cc/index.php&amp;quot;

#&amp;nbsp;定义存储原始哈希值的文件
HASH_FILE=&amp;quot;/www/wwwroot/www.xxx.cc/index.php.original_hash&amp;quot;

#&amp;nbsp;定义备份文件路径
BACKUP_FILE=&amp;quot;/www/wwwroot/www.xxxx.cc/index.php.backup&amp;quot;

#&amp;nbsp;计算当前文件的哈希值
CURRENT_HASH=$(sha256sum&amp;nbsp;&amp;quot;$FILE&amp;quot;&amp;nbsp;|&amp;nbsp;awk&amp;nbsp;&amp;#39;{print&amp;nbsp;$1}&amp;#39;)

#&amp;nbsp;检查是否已经存在原始哈希值
if&amp;nbsp;[&amp;nbsp;-f&amp;nbsp;&amp;quot;$HASH_FILE&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;读取原始哈希值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORIGINAL_HASH=$(cat&amp;nbsp;&amp;quot;$HASH_FILE&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;比较当前哈希值与原始哈希值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;&amp;quot;$CURRENT_HASH&amp;quot;&amp;nbsp;!=&amp;nbsp;&amp;quot;$ORIGINAL_HASH&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;警告:&amp;nbsp;$FILE&amp;nbsp;已被修改!&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;当前文件哈希值:&amp;nbsp;$CURRENT_HASH&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;原始文件哈希值:&amp;nbsp;$ORIGINAL_HASH&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;恢复备份文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[&amp;nbsp;-f&amp;nbsp;&amp;quot;$BACKUP_FILE&amp;quot;&amp;nbsp;];&amp;nbsp;then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cp&amp;nbsp;&amp;quot;$BACKUP_FILE&amp;quot;&amp;nbsp;&amp;quot;$FILE&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;已恢复原始文件.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;备份文件不存在，无法恢复.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;发送警报（可选）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;mail&amp;nbsp;-s&amp;nbsp;&amp;quot;文件被修改警报&amp;quot;&amp;nbsp;598692079@qq.com&amp;nbsp;&amp;lt;&amp;lt;&amp;lt;&amp;nbsp;&amp;quot;$FILE&amp;nbsp;已被修改并已恢复.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;文件未被修改.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果原始哈希值文件不存在，则创建并保存当前哈希值
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;$CURRENT_HASH&amp;quot;&amp;nbsp;&amp;gt;&amp;nbsp;&amp;quot;$HASH_FILE&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;创建备份文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cp&amp;nbsp;&amp;quot;$FILE&amp;quot;&amp;nbsp;&amp;quot;$BACKUP_FILE&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;原始哈希值和备份文件已创建.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;原始文件哈希值:&amp;nbsp;$CURRENT_HASH&amp;quot;
fi&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 04 Jan 2025 09:30:53 +0800</pubDate></item><item><title>uniapp的支付宝小程序报：在自定义组件 /pages/member/header/header中无 Component() 构造器调用，但 Page() 页面构造器被错误调用</title><link>https://manbutech.top/?id=20</link><description>&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;uniapp生成的支付宝小程序报错：在自定义组件 /pages/member/header/header中无 Component() 构造器调用，但 Page() 页面构造器被错误调用，而同样的百度、微信、抖音则没有这种情况&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/09/202409031725373474872868.png&quot; alt=&quot;20231121045945319.png&quot;/&gt;&lt;br style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;原因就是支付宝小程序和其他小程序不一样的套路，原生支付宝小程序是不允许include其他页面的，只能import，并且该页面不能再pages.json里边声明，uniapp下，会员中心的头部我是直接放到pages目录下了，估计是类似这种情况，不能引入页面，只能引入组件，然后就出现了上面的错误，&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;br style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;strong style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;解决办法：&lt;/strong&gt;&lt;br style=&quot;margin: 0px; padding: 0px; word-break: break-all; color: rgb(51, 51, 51); font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #333333; font-family: &amp;quot;microsoft Yahei&amp;quot;, Arial, Helvetica, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;把header.vue页面放到components下，例如我放到了components/member/header.vue下，然后再引入这个头部，就不会再出现这种报错了&lt;/span&gt;&lt;/p&gt;</description><pubDate>Tue, 03 Sep 2024 22:23:52 +0800</pubDate></item><item><title>程序员必备的JSON可视化工具</title><link>https://manbutech.top/?id=19</link><description>&lt;h3&gt;前言&lt;/h3&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;margin: 0px; padding: 0px; outline: 0px; max-width: 100%; color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;JSON文本难于阅读，格式化也不够直观，而且当数据量大的时候还会造成卡顿，今天推荐一个JSON&lt;/span&gt;&lt;span class=&quot;wx_search_keyword_wrap&quot; style=&quot;margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; color: var(--weui-LINK); cursor: default;&quot;&gt;可视化工具&lt;em class=&quot;wx_search_keyword&quot; style=&quot;margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important; display: inline-block; vertical-align: super; font-size: 10px; width: 1.2em; height: 1.2em; -webkit-mask-position: 50% 50%; -webkit-mask-repeat: no-repeat; -webkit-mask-size: 100%; background-color: var(--weui-LINK); -webkit-mask-image: url(&amp;quot;data:image/svg+xml,%3csvg width=&amp;#39;12&amp;#39; height=&amp;#39;12&amp;#39; viewBox=&amp;#39;0 0 12 12&amp;#39; fill=&amp;#39;none&amp;#39; xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39;%3e%3cpath fill-rule=&amp;#39;evenodd&amp;#39; clip-rule=&amp;#39;evenodd&amp;#39; d=&amp;#39;M7.60772 8.29444C7.02144 8.73734 6.29139 9 5.5 9C3.567 9 2 7.433 2 5.5C2 3.567 3.567 2 5.5 2C7.433 2 9 3.567 9 5.5C9 6.28241 8.74327 7.00486 8.30946 7.5877C8.3183 7.59444 8.3268 7.60186 8.33488 7.60994L10.4331 9.70816L9.726 10.4153L7.62777 8.31704C7.62055 8.30983 7.61387 8.30228 7.60772 8.29444ZM8 5.5C8 6.88071 6.88071 8 5.5 8C4.11929 8 3 6.88071 3 5.5C3 4.11929 4.11929 3 5.5 3C6.88071 3 8 4.11929 8 5.5Z&amp;#39; fill=&amp;#39;%23576B95&amp;#39;/%3e%3c/svg%3e&amp;quot;);&quot;&gt;&lt;/em&gt;&lt;/span&gt;&lt;span style=&quot;margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;，让你一眼看穿JSON——&lt;/span&gt;&lt;/span&gt;&lt;code style=&quot;margin: 0px 2px; padding: 2px 4px; outline: 0px; max-width: 100%; overflow-wrap: break-word; text-wrap: wrap; color: rgb(40, 202, 113); line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all; box-sizing: border-box !important;&quot;&gt;jsoncrack&lt;/code&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722727923322998.png&quot; alt=&quot;6400.png&quot; style=&quot;color: rgb(40, 202, 113); font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; letter-spacing: 0em;&quot; title=&quot;6400.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;无论您是从事大型项目的开发人员，还是希望发现隐藏见解的数据爱好者，JSON Crack 都拥有释放数据全部潜力所需的工具和功能。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;code style=&quot;margin: 0px 2px; padding: 2px 4px; outline: 0px; max-width: 100%; overflow-wrap: break-word; text-wrap: wrap; color: rgb(40, 202, 113); line-height: 1.8em; letter-spacing: 0em; background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(27, 31, 35, 0.05); width: auto; height: auto; border-style: none; border-width: 3px; border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4); border-radius: 4px; font-family: &amp;quot;Operator Mono&amp;quot;, Consolas, Monaco, Menlo, monospace; word-break: break-all; box-sizing: border-box !important;&quot;&gt;JSON Crack&lt;/code&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&amp;nbsp;是一款免费的开源数据可视化应用程序，能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互式图表。凭借其直观且用户友好的界面，JSON Crack 可以轻松探索、分析和理解最复杂的数据结构。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722727945168435.webp&quot; alt=&quot;640.webp&quot; title=&quot;640.webp&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;特点&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul data-tool=&quot;mdnice编辑器&quot; class=&quot; list-paddingleft-2&quot; style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px; outline: 0px; max-width: 100%; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255); box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;图形和树视图模式&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;使用 AI 转换和过滤数据&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;导出到 PNG、SVG、JPEG 和剪贴板&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;通过触摸手势支持缩放和平移&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;支持 JSON、YAML、CSV、XML、TOML...&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;JQ，JSON模式，解码JWT，生成类型和接口&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;广泛的工具 - 搜索图形、json 路径、验证、保存到云...&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;可嵌入的 iframe 小部件&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;开发&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;Node.js版本需要&amp;gt;=18.x）&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;下载
git&amp;nbsp;clone&amp;nbsp;https://github.com/AykutSarac/jsoncrack.com.git

#&amp;nbsp;安装
pnpm&amp;nbsp;install

#&amp;nbsp;运行
pnpm&amp;nbsp;dev&lt;/pre&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722727963266318.webp&quot; alt=&quot;640 (1).webp&quot; title=&quot;640 (1).webp&quot;/&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;可以直接从文件导入JSON&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722727997356783.webp&quot; alt=&quot;640 (2).webp&quot; title=&quot;640 (2).webp&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;插件&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;JSON Crack 同时也支持VS Code 扩展。此扩展无缝弥合了数据和可视化之间的差距，使开发人员、数据分析师和爱好者能够毫不费力地将复杂的 JSON 数据集转换为信息丰富且具有视觉吸引力的图表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722728013188798.webp&quot; alt=&quot;640 (3).webp&quot; title=&quot;640 (3).webp&quot;/&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 31 Jul 2024 07:20:31 +0800</pubDate></item><item><title>图片压缩神器，直接可以在前端用</title><link>https://manbutech.top/?id=18</link><description>&lt;h3&gt;前言&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;js-image-compressor&amp;nbsp;&lt;/strong&gt;&lt;/em&gt;是一个实现轻量级图片压缩的 javascript 库，压缩后仅有 5kb，在前端页面即可实现对图片的压缩。在提供基本图片压缩功能同时，还暴露出图片处理相关公用方法&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br/&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722728166424103.png&quot; alt=&quot;640.png&quot; title=&quot;640.png&quot;/&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;特点&lt;br/&gt;&lt;/h3&gt;&lt;ul data-tool=&quot;mdnice编辑器&quot; class=&quot; list-paddingleft-2&quot; style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px; outline: 0px; max-width: 100%; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255); box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;可以对待转化图片大小设置一定的阈值，使得图片转化成 png 格式在不理想情况下不至于过大，同时大于这个阈值则可以自动转化成 jpeg 格式，实现更优压缩；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;可以限制输出图片宽高大小，从而防止意外情况发生，比如压缩运算过大使得浏览器奔溃；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;默认对 png 输出图片添加透明底色，其他格式设为白色，避免“黑屏”发生；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;读取 jpeg 格式图片的 EXIF 信息，矫正图片方位；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;提供一些图片处理的常用工具函数（image2Canvas、canvas2Blob 和 canvas2DataUrl 等），用户还可以自定义图片输出的样式特征（比如可以灰度处理、加水印）。&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;安装&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;npm安装&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;npm&amp;nbsp;install&amp;nbsp;js-image-compressor&amp;nbsp;--save-dev&lt;/pre&gt;&lt;h3&gt;使用&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/h3&gt;&lt;p&gt;简单配置&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;import&amp;nbsp;ImageCompressor&amp;nbsp;from&amp;nbsp;&amp;#39;js-image-compressor&amp;#39;;

function&amp;nbsp;imageCompress(file:&amp;nbsp;any)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;const&amp;nbsp;size&amp;nbsp;=&amp;nbsp;file.size&amp;nbsp;/&amp;nbsp;1024
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;Promise((resolve,&amp;nbsp;reject)&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;options&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file:&amp;nbsp;file,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;quality:&amp;nbsp;0.8,&amp;nbsp;//&amp;nbsp;图片质量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mimeType:&amp;nbsp;&amp;#39;image/jpeg&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxWidth:&amp;nbsp;file.height,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;maxHeight:&amp;nbsp;file.width,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;minWidth:&amp;nbsp;10,&amp;nbsp;//&amp;nbsp;指定压缩图片最小宽度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;1080,&amp;nbsp;//&amp;nbsp;指定压缩图片宽度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convertSize:&amp;nbsp;Infinity,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;loose:&amp;nbsp;true,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redressOrientation:&amp;nbsp;true,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;success:&amp;nbsp;(result)&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resolve(result)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error:&amp;nbsp;(msg)&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reject(msg)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&amp;nbsp;ImageCompressor(options)
&amp;nbsp;&amp;nbsp;})
&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;其中，钩子函数 beforeCompress 发生在读取图片之后，创建画布之前；钩子函数 success 函数发生在压缩完成生成图片之后。它们回调参数 result 是整合来尺寸、图片类型和大小等相关信息的 blob 对象。&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 16px 0px 8px; outline: 0px; max-width: 100%; clear: both; min-height: 1em; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-indent: 0em; text-wrap: wrap; background-color: rgb(255, 255, 255); color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;输出的压缩图片符合以下特征：&lt;/span&gt;&lt;/p&gt;&lt;ul data-tool=&quot;mdnice编辑器&quot; class=&quot; list-paddingleft-2&quot; style=&quot;margin-top: 8px; margin-bottom: 8px; padding: 0px 0px 0px 25px; outline: 0px; max-width: 100%; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255); box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;默认按照 0.8 压缩率配置；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;输出图片宽/高维持源图片宽/高；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;一般的，输出图片格式保持源图片格式；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;当 png 图片的 size 大于 2m 时，默认转化成 jpeg 格式图片；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;给 png 图片填充透明色；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;当输出图片 size 大于源图片时，将源图片当作输出图片返回；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑, &amp;quot;Microsoft YaHei&amp;quot;; font-size: 16px;&quot;&gt;jpeg 格式图片，矫正翻转/旋转方向；&lt;/span&gt;&lt;/section&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;其他&lt;br/&gt;&lt;/h3&gt;&lt;p&gt;在压缩输出图片之前，我们还可以对画布进行一些自定义处理，融入元素。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;var&amp;nbsp;options&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;file:&amp;nbsp;file,

&amp;nbsp;&amp;nbsp;//&amp;nbsp;图片绘画前
&amp;nbsp;&amp;nbsp;beforeDraw:&amp;nbsp;function&amp;nbsp;(ctx)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vm.btnText&amp;nbsp;=&amp;nbsp;&amp;#39;准备绘图...&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&amp;#39;准备绘图...&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.filter&amp;nbsp;=&amp;nbsp;&amp;#39;grayscale(100%)&amp;#39;;
&amp;nbsp;&amp;nbsp;},

&amp;nbsp;&amp;nbsp;//&amp;nbsp;图片绘画后
&amp;nbsp;&amp;nbsp;afterDraw:&amp;nbsp;function&amp;nbsp;(ctx,&amp;nbsp;canvas)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.restore();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vm.btnText&amp;nbsp;=&amp;nbsp;&amp;#39;绘图完成...&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&amp;#39;绘图完成...&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillStyle&amp;nbsp;=&amp;nbsp;&amp;#39;#fff&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.font&amp;nbsp;=&amp;nbsp;(canvas.width&amp;nbsp;*&amp;nbsp;0.1)&amp;nbsp;+&amp;nbsp;&amp;#39;px&amp;nbsp;microsoft&amp;nbsp;yahei&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillText(vm.watermarkText,&amp;nbsp;10,&amp;nbsp;canvas.height&amp;nbsp;-&amp;nbsp;20);
&amp;nbsp;&amp;nbsp;},
};

new&amp;nbsp;ImageCompressor(options);&lt;/pre&gt;&lt;p&gt;beforeDraw 是在画布创建后，图片绘画前的钩子函数，afterDraw 是在图绘画后的钩子函数。&lt;/p&gt;&lt;p&gt;这里有张图归纳了从本地上传到对图片压缩的详细过程&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br/&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722728178421525.webp&quot; alt=&quot;6401.webp&quot; title=&quot;6401.webp&quot;/&gt;&lt;/p&gt;</description><pubDate>Wed, 31 Jul 2024 07:08:21 +0800</pubDate></item><item><title>推荐一款在线的Excel表格开发库——x-spreadsheet</title><link>https://manbutech.top/?id=17</link><description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;h3&gt;前言&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722728313843896.png&quot; alt=&quot;640.png&quot; title=&quot;640.png&quot;/&gt;&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 16px 0px 8px; outline: 0px; max-width: 100%; clear: both; min-height: 1em; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-indent: 0em; text-wrap: wrap; background-color: rgb(255, 255, 255); color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;这是一个个人开发的项目，其他的开源表格库不能满足作者自己的开发需求，所以就自己开发一套类似的 google sheet的在线表格库&lt;/p&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 16px 0px 8px; outline: 0px; max-width: 100%; clear: both; min-height: 1em; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-indent: 0em; text-wrap: wrap; background-color: rgb(255, 255, 255); color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;并且开源出来，曾在一个星期内获得三千个star&lt;/p&gt;&lt;h3&gt;安装&lt;/h3&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;可以使用 npm 包的形式安装&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;npm&amp;nbsp;install&amp;nbsp;x-data-spreadsheet&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;或者使用CDN直接在 html 静态文件中引入&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;link&amp;nbsp;rel=&amp;quot;stylesheet&amp;quot;&amp;nbsp;href=&amp;quot;https://unpkg.com/x-data-spreadsheet@1.1.9/dist/xspreadsheet.css&amp;quot;&amp;gt;
&amp;lt;script&amp;nbsp;src=&amp;quot;https://unpkg.com/x-data-spreadsheet@1.1.9/dist/xspreadsheet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script&amp;gt;
&amp;nbsp;&amp;nbsp;x_spreadsheet(&amp;#39;#xspreadsheet&amp;#39;);
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;width: 1942.75px; text-wrap: wrap;&quot;&gt;&lt;li&gt;&lt;h3&gt;使用&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在html中引入&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;div&amp;nbsp;id=&amp;quot;x-spreadsheet-demo&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;在 js 中获取dom实例&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;import&amp;nbsp;Spreadsheet&amp;nbsp;from&amp;nbsp;&amp;quot;x-data-spreadsheet&amp;quot;;
//&amp;nbsp;If&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;override&amp;nbsp;the&amp;nbsp;default&amp;nbsp;options,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;set&amp;nbsp;the&amp;nbsp;override
//&amp;nbsp;const&amp;nbsp;options&amp;nbsp;=&amp;nbsp;{};
//&amp;nbsp;new&amp;nbsp;Spreadsheet(&amp;#39;#x-spreadsheet-demo&amp;#39;,&amp;nbsp;options);
const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Spreadsheet(&amp;quot;#x-spreadsheet-demo&amp;quot;)
&amp;nbsp;&amp;nbsp;.loadData({})&amp;nbsp;//&amp;nbsp;load&amp;nbsp;data
&amp;nbsp;&amp;nbsp;.change(data&amp;nbsp;=&amp;gt;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;save&amp;nbsp;data&amp;nbsp;to&amp;nbsp;db
&amp;nbsp;&amp;nbsp;});

//&amp;nbsp;data&amp;nbsp;validation
s.validate()&lt;/pre&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://manbutech.top/zb_users/upload/2024/08/202408041722728339493920.webp&quot; alt=&quot;6401.webp&quot; title=&quot;6401.webp&quot;/&gt;&lt;/p&gt;&lt;h3&gt;&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;width: 1942.75px; text-wrap: wrap;&quot;&gt;&lt;li&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;功能&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;h3&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;p data-tool=&quot;mdnice编辑器&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 16px 0px 8px; outline: 0px; max-width: 100%; clear: both; min-height: 1em; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; text-indent: 0em; text-wrap: wrap; background-color: rgb(255, 255, 255); color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;项目已经支持了许多功能，相信你说需要的功能都能满足&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;撤销重做&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;添加行列&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;删除行列&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;隐藏行列&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;动态调整行列功能&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;冻结行列&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;添加边框/颜色/边框线条样式&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;合并单元格&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;复制&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;粘贴&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;打印&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;公式&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;筛选&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;自动填充&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;多表支持&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;字体样式&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;自定义字体/大小/颜色&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;填充前景色/背景色&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;格式校验&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;对齐方式&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;section style=&quot;margin: 5px 0px; padding: 0px; outline: 0px; max-width: 100%; color: rgb(63, 63, 63); line-height: 1.8em; letter-spacing: 0.02em; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;文字换行&lt;/section&gt;&lt;/li&gt;&lt;li&gt;&lt;h3&gt;配置&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;项目中有一些默认配置可以直接使用，也可以根据自己的需求，自定义设置&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-css&quot;&gt;{
&amp;nbsp;&amp;nbsp;mode:&amp;nbsp;&amp;#39;edit&amp;#39;,&amp;nbsp;//&amp;nbsp;edit&amp;nbsp;|&amp;nbsp;read
&amp;nbsp;&amp;nbsp;showToolbar:&amp;nbsp;true,
&amp;nbsp;&amp;nbsp;showGrid:&amp;nbsp;true,
&amp;nbsp;&amp;nbsp;showContextmenu:&amp;nbsp;true,
&amp;nbsp;&amp;nbsp;view:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height:&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;document.documentElement.clientHeight,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;document.documentElement.clientWidth,
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;row:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height:&amp;nbsp;25,
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;col:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len:&amp;nbsp;26,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexWidth:&amp;nbsp;60,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;minWidth:&amp;nbsp;60,
&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;style:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bgcolor:&amp;nbsp;&amp;#39;#ffffff&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;align:&amp;nbsp;&amp;#39;left&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valign:&amp;nbsp;&amp;#39;middle&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;textwrap:&amp;nbsp;false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strike:&amp;nbsp;false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;underline:&amp;nbsp;false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color:&amp;nbsp;&amp;#39;#0a0a0a&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name:&amp;nbsp;&amp;#39;Helvetica&amp;#39;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size:&amp;nbsp;10,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bold:&amp;nbsp;false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;italic:&amp;nbsp;false,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;},
}&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FBF9FD;&quot;&gt;中文文档：&lt;/span&gt;&lt;span class=&quot;wx_text_underline&quot; style=&quot;margin: 0px; padding: 0px 0px 2px; outline: 0px; cursor: pointer; background: url(&amp;quot;data:image/svg+xml,%3Csvg width=&amp;#39;8&amp;#39; height=&amp;#39;2&amp;#39; viewBox=&amp;#39;0 0 8 2&amp;#39; fill=&amp;#39;none&amp;#39; xmlns=&amp;#39;http://www.w3.org/2000/svg&amp;#39;%3E%3Cpath d=&amp;#39;M3.25 1.5H0.75C0.335786 1.5 0 1.16421 0 0.75C0 0.335786 0.335786 0 0.75 0H3.25C3.66421 0 4 0.335786 4 0.75C4 1.16421 3.66421 1.5 3.25 1.5Z&amp;#39; fill=&amp;#39;%2307C160&amp;#39; fill-opacity=&amp;#39;0.5&amp;#39;/%3E%3C/svg%3E%0A&amp;quot;) 0px 100% / auto 2px repeat-x #FBF9FD; max-width: 100%; color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; box-sizing: border-box !important; overflow-wrap: break-word !important;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://hondrytravis.com/x-spreadsheet-doc/&quot; _src=&quot;https://hondrytravis.com/x-spreadsheet-doc/&quot;&gt;https://hondrytravis.com/x-spreadsheet-doc/&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FBF9FD;&quot;&gt;gitHub：&lt;/span&gt;&lt;a href=&quot;https://github.com/myliang/x-spreadsheet&quot; _src=&quot;https://github.com/myliang/x-spreadsheet&quot;&gt;https://github.com/myliang/x-spreadsheet&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #3F3F3F; font-family: Optima, &amp;quot;Microsoft YaHei&amp;quot;, PingFangSC-regular, serif; font-size: 16px; letter-spacing: 0.32px; text-wrap: wrap; background-color: #FBF9FD;&quot;&gt;预览地址：https://myliang.github.io/x-spreadsheet/&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 31 Jul 2024 06:45:47 +0800</pubDate></item><item><title>uniapp如何请求打开系统蓝牙</title><link>https://manbutech.top/?id=16</link><description>&lt;p&gt;直接用下列代码即可&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;let&amp;nbsp;main&amp;nbsp;=&amp;nbsp;plus.android.runtimeMainActivity();
let&amp;nbsp;BluetoothAdapter&amp;nbsp;=&amp;nbsp;plus.android.importClass(
	&amp;quot;android.bluetooth.BluetoothAdapter&amp;quot;);
let&amp;nbsp;BAdapter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BluetoothAdapter.getDefaultAdapter();
let&amp;nbsp;receiver&amp;nbsp;=&amp;nbsp;plus.android.implements(
	&amp;#39;io.dcloud.android.content.BroadcastReceiver&amp;#39;,&amp;nbsp;{
		onReceive:&amp;nbsp;function(context,
			intent)&amp;nbsp;{&amp;nbsp;//实现onReceiver回调函数
			console.log(&amp;#39;intent:&amp;#39;,&amp;nbsp;intent)
			plus.android.importClass(intent);
			main.unregisterReceiver(receiver);
			//重新打开蓝牙
			_that.isBluetooth();

		}
	});
let&amp;nbsp;IntentFilter&amp;nbsp;=&amp;nbsp;plus.android.importClass(
	&amp;#39;android.content.IntentFilter&amp;#39;);
console.log(&amp;#39;IntentFilter:&amp;#39;,&amp;nbsp;IntentFilter)
let&amp;nbsp;filter&amp;nbsp;=&amp;nbsp;new&amp;nbsp;IntentFilter();
filter.addAction(BAdapter.ACTION_STATE_CHANGED);&amp;nbsp;//监听蓝牙开关
main.registerReceiver(receiver,&amp;nbsp;filter);&amp;nbsp;//注册监听
console.log(&amp;#39;filter:&amp;#39;,&amp;nbsp;filter)
if&amp;nbsp;(!BAdapter.isEnabled())&amp;nbsp;{
	console.log(&amp;#39;启动蓝牙:&amp;#39;)
	BAdapter.enable();&amp;nbsp;//启动蓝牙
}&amp;nbsp;else&amp;nbsp;{
	BAdapter.disable();
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 19 May 2024 16:42:52 +0800</pubDate></item><item><title>webman框架redis如何实现接口重复请求</title><link>https://manbutech.top/?id=15</link><description>&lt;h3&gt;前言&lt;/h3&gt;&lt;p&gt;最近项目发现部分接口有异步操作，前端请求时候这个接口没有做防抖设计所以出现同一秒有多次请求过来，由于这个接口会请求三方接口，这个接口是个耗时操作平均2秒才能返回，所以想办法要防止前端多次请求&lt;br/&gt;&lt;/p&gt;&lt;h3&gt;解决方案代码&lt;/h3&gt;&lt;pre class=&quot;prism-highlight prism-language-php&quot;&gt;/**
&amp;nbsp;*&amp;nbsp;redis锁
&amp;nbsp;*/
if&amp;nbsp;(!function_exists(&amp;#39;redisLock&amp;#39;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;redis锁
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;$key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;$ttl
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;redisLock($key,&amp;nbsp;$ttl):&amp;nbsp;bool
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(Redis::get($key))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;false;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Redis::setEx($key,&amp;nbsp;$ttl,&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;这个方法封装一个redisLock方法，接收两个方法，第一个是redis的键值，根据实际情况声明，要保证这个接口的唯一，ttl是失效时间也就是想多少秒内不在接受新的请求&lt;/p&gt;</description><pubDate>Sun, 07 Jan 2024 21:07:31 +0800</pubDate></item></channel></rss>