基于MCP协议的GitHub PR代码审查工具:自动化安全与质量分析

news2026/5/15 15:57:31
1. 项目概述与核心价值最近在折腾一个挺有意思的东西一个专门给GitHub Pull Request做代码审查的MCP服务器。简单来说它能让你的AI助手比如Cursor里的Claude直接读懂GitHub上的代码变更然后像一位经验丰富的技术主管一样给你一份详尽的代码审查报告。这玩意儿叫github-review本质上是一个实现了Model Context Protocol的服务器。MCP这协议现在挺火的它让AI模型能安全、结构化地访问外部工具和数据你可以把它理解成给AI模型插上的“USB接口”。我自己在团队里做Code Review很多年了深知这活儿有多费时费力。一个中等规模的PR涉及十几二十个文件你要看代码逻辑、查安全漏洞、评估代码风格、还得考虑对现有系统的影响没个半小时下不来。更头疼的是人的精力有限看久了容易疲劳一些潜在的安全隐患比如不小心写了个eval或者不符合团队规范的地方比如用了any类型很容易就漏过去了。这个工具瞄准的就是这个痛点——把那些重复、机械、但又至关重要的审查工作自动化让人能把精力集中在更高层次的架构设计和业务逻辑评审上。它特别适合几类人一是独立开发者或小团队没有专职的代码审查人员可以用它来保证基本的代码质量底线二是开源项目的维护者每天要处理大量来自社区的PR用它做第一道过滤能省不少心三是任何想提升代码安全性和规范性把AI能力融入开发工作流的工程师。接下来我就结合自己的使用和摸索把这个项目的里里外外、怎么用、怎么避坑给你拆解明白。2. 核心设计思路与方案选型2.1 为什么选择MCP架构这个项目最核心的设计决策就是基于MCP来构建。这步棋走得挺妙。MCP全称Model Context Protocol是由Anthropic提出的一套开放协议。它的目标很明确为AI模型比如Claude提供一个标准化的方式来调用外部工具、查询数据同时保证安全可控。你可以把它想象成AI世界的“驱动程序”标准。传统的AI集成方式要么是把所有功能都做进一个庞大的、定制化的AI应用里耦合度高难复用要么就是让AI模型去调用不规范的API风险高效果不稳定。MCP在中间做了个优雅的抽象层。服务器端比如这个github-review按照MCP规范声明自己能提供哪些“工具”Tools和“资源”Resources。客户端比如Cursor IDE通过标准化的方式目前主要是stdio连接这个服务器。AI模型在需要时客户端会代表模型去调用服务器提供的工具并把结果以结构化的格式返回给模型。这么做有几个巨大的优势。首先是安全性。AI模型本身不直接执行代码或访问敏感数据比如你的GitHub Token它只是“描述”一个意图。实际的执行由你本地或你信任的服务器完成Token等机密信息完全不会泄露给AI服务商。其次是可组合性。你可以同时运行多个MCP服务器一个管GitHub一个管数据库一个管内部文档AI模型能根据上下文动态选择使用哪个。最后是生态友好。只要遵循MCP协议你的工具就能接入所有支持MCP的客户端如Cursor、Claude Desktop等不用为每个平台单独开发插件。所以作者选择用MCP来实现GitHub PR审查是看中了它的标准化、安全性和未来的扩展潜力。这比写一个只能用在特定编辑器里的插件或者一个孤立的命令行工具要更有远见。2.2 功能模块拆解不止于“找Bug”从源码结构看这个项目的核心逻辑主要封装在src/services/目录下的三个文件里分工非常清晰。GitHubService.ts这是与外部世界打交道的“外交官”。它封装了所有对GitHub API的调用。它的职责很纯粹给定一个仓库地址和PR编号它能帮你把PR的元数据、所有变更的文件列表、每个文件的diff内容、评论历史等原始数据“拿回来”。它不关心这些数据具体是什么只保证数据获取的准确性和效率。这里会处理GitHub API的认证用你的Personal Access Token、分页、速率限制等琐碎但重要的事情。一个健壮的GitHubService是后面所有分析工作的基础。CodeAnalyzer.ts这是项目的“大脑”也是最体现技术含量的部分。它接收原始的代码diff片段和文件路径然后开始深度工作。它的分析是分层、分语言的语法解析首先它需要知道这段代码是什么语言。项目支持JavaScript/TypeScript、Python、Java、C#、PHP等。对于不同语言它可能会调用不同的底层解析器比如对于JavaScript/TypeScript很可能用了typescript-eslint/parser或babel/parser的某些能力来生成抽象语法树。只有理解了代码的结构才能做有意义的分析。模式匹配与规则引擎在AST上它运行一系列预定义的规则。这些规则就是它知识的体现。例如一条规则可能是“在AST中查找CallExpression其函数名是eval”一旦找到就标记为一个高危安全问题。另一条规则可能是“查找CatchClause如果它的参数为空即catch {}则标记为不良实践”。这些规则集合构成了它对“好代码”和“坏代码”的判断标准。度量计算除了找具体的“坏味道”它还会计算一些量化指标。比如“圈复杂度”——通过计算代码中决策路径的数量来评估逻辑的复杂程度或者“文件风险评分”——根据文件类型如配置文件、入口文件、变更模式是否修改了权限相关逻辑来综合评定。PRReviewer.ts这是“总指挥”。它协调GitHubService获取数据然后将每个文件的diff分发给CodeAnalyzer进行分析最后汇总所有结果。它要做的事情包括将各个文件发现的问题按严重性Critical, High, Medium, Low分类计算整个PR的总体风险评级是Low还是Critical生成一份对人类和AI都友好的、结构化的审查报告。这份报告不是简单的列表而应该包含问题描述、具体位置、严重程度、以及具体的修改建议。这才是价值所在。注意这种架构——数据获取、核心分析、结果编排分离——是经典的服务设计模式。它让每个部分的职责单一便于测试和维护。比如你想增加对Go语言的支持主要工作就是在CodeAnalyzer里添加Go的解析器和规则集其他部分几乎不用动。3. 从零开始的部署与配置实操光说原理不够咱们直接上手把它跑起来集成到日常开发环境里。这里我会把每一步的意图和可能遇到的坑都讲清楚。3.1 环境准备与项目初始化首先你需要一个基础运行环境。项目要求Node.js 18.0.0以上我推荐直接用最新的LTS版本比如Node.js 20.x兼容性和性能都更好。用node -v检查一下你的版本。第一步克隆仓库。这里有个小细节原文档给的仓库地址是doraemon0905/github-review但项目标题是Vibe-Code-Agent/github-review。这可能意味着项目转移了或是有不同的分支。以实际能访问的为准如果前者404了可以尝试在GitHub上搜索github-review找找看。git clone https://github.com/doraemon0905/github-review.git cd github-review进入目录后安装依赖。这里执行npm install就行。但根据我的经验这种涉及代码分析和多语言支持的项目依赖可能会比较复杂特别是那些需要本地编译的Node模块比如某些基于C的解析器。如果你在安装过程中遇到node-gyp相关的错误大概率是需要安装Python和C编译工具链。在macOS上可能需要xcode-select --install在Ubuntu上需要build-essential包在Windows上可能需要安装Visual Studio Build Tools。安装完依赖运行构建命令npm run build。这个命令通常会做两件事一是用TypeScript编译器tsc把src/下的.ts文件编译成.js文件输出到dist/目录二是可能执行一些代码打包或优化。确保这一步没有报错dist/index.js文件成功生成。3.2 获取并配置GitHub Token这是整个流程中最关键也最需要小心的一步。这个MCP服务器需要访问你的GitHub仓库数据所以你必须提供一个有相应权限的Personal Access Token。生成Token打开GitHub网站点击右上角头像 - Settings - 左侧最下方的Developer settings-Personal access tokens-Tokens (classic)。点击Generate new token (classic)。设置权限给这个Token起个名字比如MCP-GitHub-Review。过期时间我强烈建议设置为自定义比如30天或90天并记在日历里提醒自己续期。长期不换的Token有风险。勾选权限范围这是核心。这个工具需要读取仓库内容所以至少需要勾选repo权限下的所有子项或者根据你需求如果是公开库只读可能public_repo就够了。为了保险起见我通常直接勾选整个repo权限。绝对不要给予delete_repo等危险权限。生成并保存点击生成后你会看到一串以ghp_开头的字符串。这个Token只会显示一次务必立即复制并保存到安全的地方比如密码管理器。接下来配置环境变量。按照文档是在终端里执行export GITHUB_TOKENghp_yourActualTokenHere但这样设置的环境变量只在当前终端会话有效。一旦你关闭终端下次启动服务又得重新设置。对于长期使用有更好的方法。推荐方案使用.env文件在项目根目录创建一个名为.env的文件注意前面有个点内容如下GITHUB_TOKENghp_yourActualTokenHere然后你需要修改项目的启动方式让它能读取这个文件。通常需要安装dotenv包并在代码入口处加载。不过更简单的方法是如果你使用像forever、pm2这样的进程管理工具它们都支持从文件读取环境变量。或者在启动命令前加上env $(cat .env | xargs) npm start但最一劳永逸的是直接修改你的Shell配置文件如~/.bashrc,~/.zshrc在末尾加上export GITHUB_TOKEN...然后执行source ~/.zshrc。这样在任何终端都能用了。但请注意这会将Token明文保存在你的电脑上请确保你的电脑安全。重要安全提醒这个Token等同于你的GitHub密码拥有你赋予它的所有仓库权限。因此绝对不要将它提交到任何Git仓库.env文件必须加入.gitignore。绝对不要在公共场合如截图、录屏、粘贴到不安全的网站暴露这串字符。定期更换Token是个好习惯。3.3 集成到Cursor/Claude Desktop服务跑起来后得让AI助手能连接到它。这里以Cursor为例Claude Desktop类似。启动MCP服务器在项目目录下运行npm start。如果一切正常你会看到服务器启动并等待连接的日志类似MCP Server running on stdio。让这个终端窗口保持运行。配置Cursor打开Cursor IDE你需要找到MCP服务器的配置位置。这通常在Cursor的设置里可能叫MCP Servers或AI Tool Servers。你需要编辑Cursor的配置文件比如cursor.json或通过UI设置。添加服务器配置将文档中提供的JSON配置根据你的实际情况修改后添加进去。{ mcpServers: { github-pr-review: { command: node, args: [/absolute/path/to/your/github-review/dist/index.js], env: { GITHUB_TOKEN: ghp_yourActualTokenHere } } } }关键修改点args里的路径必须替换成你电脑上dist/index.js的绝对路径。例如在Mac上是/Users/yourname/Projects/github-review/dist/index.js。env里的GITHUB_TOKEN如果你已经在系统环境变量或通过.env文件配置好了这里其实可以省略。如果这里也写了它会覆盖系统环境变量。我建议如果系统环境变量已配置这里就不写更安全。重启Cursor保存配置后完全重启Cursor IDE让配置生效。如何验证连接成功在Cursor里打开Chat面板问Claude“你能帮我审查一个GitHub PR吗” 或者 “你有什么可用的工具”。如果配置正确Claude应该会回应并列出可用的工具其中就包括get_pull_request、review_pull_request等。如果没看到检查Cursor的错误日志最常见的问题是Node路径不对或者Token无效。4. 四大核心工具实战与结果解读配置好了我们来真刀真枪地试试它的几个核心工具。我会用一个模拟的PR场景来演示并告诉你如何理解它的输出。4.1 获取PR详情get_pull_request这个工具是基础它相当于AI的眼睛先去把PR的基本情况看明白。使用场景当你刚接触一个PR或者想快速了解一个PR的元信息标题、描述、创建者、状态、改了哪些文件时。操作示例在Cursor的Chat中输入请使用 get_pull_request 工具获取仓库 microsoft/vscode 下编号为 12345 的PR详情。注意这是一个示例你需要替换成你拥有访问权限的真实仓库和PR编号AI会调用该工具并返回一个结构化的JSON摘要通常会包含title: PR标题user: 创建者state: 状态open, closed, mergedadditions/deletions: 增删行数changed_files: 变更文件列表及每个文件的增删情况body: PR描述正文这个工具本身不进行分析但它为后续的深度审查提供了上下文。比如看到改了50个文件、2000行 -500行你心里就有数这是个大型重构需要更仔细地审查。4.2 执行全面审查review_pull_request这是核心功能相当于让AI做一次完整的代码走查。使用场景准备合并一个PR前进行自动化质量与安全检查。操作示例请对仓库 my-org/my-app 的PR #88 进行全面审查安全分析的严重性阈值设为 high。这里用到了severity_threshold: high参数意思是只报告“高”及以上级别的问题忽略“中”和“低”级别的问题。这在时间紧张时非常有用只关注最致命的风险。报告深度解析 一份典型的审查报告会分层呈现理解每一层的含义很重要总体风险评级报告开头会给出一个总结比如Overall Risk: MEDIUM。这是基于所有发现问题的严重性和数量得出的综合判断。LOW可以放心合并MEDIUM建议简单看看HIGH和CRITICAL就必须仔细处理了。按文件分类的问题列表这是报告的主体。它会逐个文件列出发现的问题。每个问题条目会包含文件路径src/utils/security.js行号L15-L18(注意这里指的是变更diff中的新行号)严重等级CRITICAL,HIGH,MEDIUM,LOW通常有颜色或符号标识。类别Security,Best Practice,Complexity,Maintainability问题描述Use of eval() with user input(使用了带有用户输入的eval函数)建议Replace eval() with a safe alternative like Function constructor with validation or a dedicated parsing library.(用安全的替代方案如经过验证的Function构造函数或专用解析库)代码质量指标报告可能还会总结一些量化数据比如Cyclomatic complexity increased in function processData from 5 to 8.(processData函数的圈复杂度从5增加到8)Found 3 instances of duplicate code blocks across 2 files.(在2个文件中发现3处重复代码块)File config/database.json contains potential hardcoded credentials.(配置文件包含可能的硬编码凭证)如何利用这份报告不要被问题列表吓到。你应该优先处理CRITICAL和HIGH级别的问题特别是安全相关的。对于MEDIUM和LOW级别的问题比如代码风格、轻微的重复可以酌情处理或作为技术债记录。把这份报告作为你人工审查的“检查清单”和“辅助视角”它能帮你发现那些容易忽略的细节。4.3 分析代码片段analyze_code_diff这个工具非常灵活它不依赖于一个真实的GitHub PR你可以直接丢给它一段代码diff进行分析。使用场景在本地写代码时随时选中一段让AI分析潜在问题。在代码评审讨论中针对某一段有争议的代码进行快速安全评估。编写新代码时作为实时检查工具。操作示例假设你刚写了一段JavaScript函数不确定是否安全。请用 analyze_code_diff 工具分析以下代码片段的安全问题 文件路径src/auth.js 代码diff diff function parseUserInput(jsonString) { const data JSON.parse(jsonString); // 为了灵活性允许执行动态属性 return eval((${data.expression})); }**关键点**你需要以Git diff的格式提供代码。开头的行表示新增-开头的行表示删除。这里全是表示是全新的代码。 **结果解读**工具会立刻指出在src/auth.js的新增行中使用了eval来执行用户提供的data.expression这是一个极高的安全风险CRITICAL因为它可能导致任意代码执行。它会建议使用沙箱环境或完全避免eval。 这个工具相当于一个随时待命的代码安全扫描器非常适合在代码提交前做最后一道检查。 ### 4.4 列出仓库PRget_repository_prs 这个工具帮你快速概览一个仓库的PR状态。 **使用场景**作为项目管理者想快速看看最近有哪些待处理的PR或者想找一些特定的PR比如long-running的进行重点处理。 **操作示例**列出仓库 facebook/react 所有开放的PR按更新时间排序最多显示20个。你可以组合参数 - state: open (默认) / closed / all - sort: created (默认) / updated / popularity / long-running (这个很实用能找出那些开了很久还没合并的PR) - limit: 50 (最大100) 返回结果是一个PR的简要列表包含编号、标题、状态、创建者、更新时间等。你可以快速浏览然后决定对哪个PR使用review_pull_request进行深度审查。 ## 5. 安全与代码质量分析引擎揭秘 这个项目的“智能”很大程度上来源于它的分析规则集。了解它检查什么能帮助你在写代码时就有意识地避免这些问题。 ### 5.1 安全漏洞扫描它到底在找什么 安全分析是重中之重。我们来看看它对不同语言的检查重点这其实是一份很好的安全编码自查清单。 **JavaScript/TypeScript** - **eval()、Function()构造函数、setTimeout/setInterval传入字符串**这是头号危险分子。它们会动态执行字符串形式的代码如果字符串来源不可信如用户输入就是远程代码执行的漏洞。工具会标记为CRITICAL。 - **XSS向量**直接使用innerHTML、outerHTML或document.write()来插入未经验证的用户数据。正确的做法是使用textContent或经过消毒的DOM API。 - **TypeScript的any类型滥用**过度使用any会绕过类型检查失去TypeScript的核心优势。工具会建议使用更具体的类型或unknown。 - **硬编码密钥**在代码中明文出现类似password、secret、api_key、token的字符串后面跟着一长串看似随机的字符。工具会通过正则表达式模式匹配来警告。 **Python** - **exec()和eval()**和JS一样动态执行代码是高风险操作。 - **不安全的反序列化**使用pickle.loads()加载不可信的数据源。pickle本身就不安全对于外部数据应使用json等安全格式。 - **过于宽泛的异常捕获**except: 或 except Exception: 会掩盖真正的错误不利于调试和安全事件发现。应该捕获特定的异常类型。 - **Shell注入**使用os.system()或subprocess.call()时如果参数包含用户输入且未做转义可能导致命令注入。建议使用subprocess.run()并传递参数列表。 **PHP** - **SQL注入模式**直接拼接用户输入到SQL字符串中如 $sql SELECT * FROM users WHERE id . $_GET[id];。必须使用参数化查询PDO预处理语句。 - **危险函数**如system(), exec(), shell_exec(), eval()等。 - **未过滤的超全局变量**直接使用$_GET、$_POST、$_REQUEST而不经过验证或过滤。 **通用模式** - **敏感信息泄露**在日志、错误信息或响应体中可能打印出密码、密钥、内部IP等。 - **不安全的随机数**在安全上下文中使用Math.random()JS或弱随机函数。 **实操心得**工具的报告是很好的学习材料。每次它报出一个安全问题不要只是“修复”而是去理解**为什么**这是问题以及**安全的替代方案是什么**。久而久之你就能在编码时形成“安全肌肉记忆”。 ### 5.2 代码质量评估量化你的代码健康度 除了安全代码的可维护性同样重要。工具主要从几个维度评估 1. **圈复杂度**衡量函数中独立路径的数量。数字越高逻辑越复杂越难测试和维护。通常建议单个函数的圈复杂度保持在10以下。工具会计算变更前后复杂度的变化如果显著增加比如从3跳到12就会发出警告。 2. **代码重复**它会在变更的代码中寻找相似或相同的代码块。重复是“万恶之源”一个逻辑在多处出现意味着将来修改时需要在多处同步极易出错。工具会建议将重复代码提取为公共函数或模块。 3. **代码风格与最佳实践** - **过长的行**通常超过80或120字符可配置的行会影响可读性。 - **魔法数字**在代码中直接出现的没有解释意义的数字如 setTimeout(5000)应定义为有名称的常量如 const TIMEOUT_MS 5000;。 - **注释掉的代码**遗留在代码库中的注释掉的代码// function oldMethod() {...}会增加混乱应该直接删除版本历史由Git来管理。 - **TODO/FIXME注释**虽然用于标记待办事项是常见做法但如果一个PR引入了新的TODO而没有明确的完成计划或Issue链接可能意味着功能不完整就提交了。 4. **文件风险启发式评估**工具会根据文件类型和位置给出风险提示。例如 - 修改了package.json或requirements.txt等依赖文件提示检查依赖版本升级是否安全、有无破坏性变更。 - 修改了数据库迁移脚本或模型定义提示进行数据一致性检查。 - 修改了身份验证或授权相关的文件提示进行额外的安全审查。 这些质量指标虽然不直接导致功能故障但长期来看它们决定了代码库是持续健康还是逐渐腐化。工具提供的是一种客观的、可量化的视角。 ## 6. 常见问题排查与进阶技巧 在实际使用中你肯定会遇到一些问题。这里把我踩过的坑和解决方案总结一下。 ### 6.1 连接与配置问题 | 问题现象 | 可能原因 | 排查步骤与解决方案 | | :--- | :--- | :--- | | Cursor/Claude 中看不到 github-review 的工具 | 1. MCP服务器未启动br2. Cursor配置路径错误br3. 环境变量未生效 | 1. 在项目目录运行 npm start确保终端无报错且显示等待连接。br2. 检查Cursor配置中args的路径是否为**绝对路径**且指向编译后的dist/index.js。br3. 在运行服务器的终端中执行 echo $GITHUB_TOKEN确认环境变量已设置且有效。 | | 运行 review_pull_request 时报权限错误 | 1. GitHub Token权限不足br2. Token已过期br3. 访问的是私有仓库 | 1. 到GitHub Token设置页面确认已勾选 repo 或至少 public_repo 权限。br2. 重新生成一个新Token替换。br3. 确认Token对目标私有仓库有访问权限。 | | 服务器启动后立即退出或报错 | 1. Node.js版本过低br2. 依赖安装不完整br3. TypeScript编译错误 | 1. 使用 node -v 确认版本 18。br2. 删除 node_modules 和 package-lock.json重新运行 npm install。br3. 运行 npm run build 查看具体编译错误可能是TS类型问题。 | ### 6.2 审查结果相关疑问 **问题工具报了一个问题但我觉得是误报怎么办** 这是静态分析工具的常见情况。比如它可能把一段用于测试的、故意写的“不安全”代码标记为漏洞。首先理解工具的判断逻辑它是基于模式匹配。然后你有几个选择 1. **忽略需谨慎**如果确认是误报且无关紧要可以在PR评论中说明情况然后忽略该问题。但更好的做法是—— 2. **改进代码以消除警报**即使是在测试代码中使用eval也可能有风险。能否用更安全的方式实现同样的测试目的 3. **未来增强**更高级的静态分析工具允许通过注释来抑制特定规则在特定代码行的警告例如ESLint的// eslint-disable-next-line。你可以给这个项目提Issue或PR建议增加类似功能。 **问题工具没报问题但合并后还是出了Bug是不是工具没用** 要明确一点这个工具是**辅助**不是**替代**。它擅长发现特定模式的安全漏洞和代码坏味道但它不理解业务逻辑。一个逻辑错误、一个算法缺陷、一个边界条件处理不当这些都需要人来判断。它的价值在于帮你守住底线安全、基础规范解放你的大脑去处理高层次的逻辑问题。 ### 6.3 性能与使用技巧 - **审查大型PR可能较慢**如果一个PR有上百个文件、数千行变更分析可能需要几十秒甚至更长时间。这是正常的因为它在逐个文件解析、构建AST、运行规则。耐心等待或者考虑将大PR拆分成多个小PR这本身也是最佳实践。 - **合理设置严重性阈值**在团队初期引入时可以把severity_threshold设为high只关注最严重的问题避免因为过多的风格建议Low级别让开发者感到抵触。等大家习惯后再逐步调低阈值追求更高的代码质量。 - **将审查集成到CI/CD流程**虽然这个工具主要面向交互式AI环境但其核心的代码分析能力可以通过命令行或其他方式触发。你可以考虑编写一个脚本在CI流水线如GitHub Actions中对新提交的PR自动运行类似的分析并将报告以评论的形式贴到PR中实现自动化的质量门禁。 ### 6.4 自定义与扩展 这个项目是开源的这意味着你可以根据自己团队的需求进行定制。 1. **添加新的代码规则**如果你想检查团队内部特有的编码规范比如“所有API响应必须包裹在{data, code, message}结构中”你可以修改src/services/CodeAnalyzer.ts在对应的语言分析器中添加新的规则函数。规则函数的核心就是遍历AST寻找特定的模式。 2. **支持新的编程语言**如果你想增加对Go或Rust的支持需要在CodeAnalyzer中 - 添加该语言的识别逻辑通常通过文件后缀。 - 引入该语言的解析器如Go的go/parserRust的tree-sitter。 - 为该语言定义一套安全与质量规则。 - 在review_pull_request的报告中集成新语言的分析结果。 3. **调整风险评级算法**默认的总体风险评级可能不符合你的风险偏好。你可以修改PRReviewer.ts中汇总和评级的部分例如提高安全问题的权重或者只有当Critical问题超过一定数量时才将整体风险评为High。 参与开源项目贡献的过程也是你深入理解静态代码分析和MCP协议的好机会。从修复一个小Bug开始逐步熟悉整个代码库你会对如何构建一个智能开发工具有更深刻的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2611239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…