Termi AI:基于Electron的智能桌面开发伴侣,集成Vite预览与AI编程助手

news2026/5/8 6:36:14
1. 项目概述一个集成了AI助手的桌面开发伴侣如果你和我一样每天大部分时间都泡在终端和编辑器里那你肯定也幻想过能不能有一个工具能把我的项目实时预览和AI编程助手无缝地“焊”在一起不用在浏览器、终端、聊天窗口之间来回切换所有操作都在一个统一的界面里完成。这就是我今天要和大家深入聊的Termi AI。简单来说Termi AI是一个基于Electron构建的桌面应用程序。它的核心价值在于它不是一个简单的“终端模拟器浏览器”的缝合怪而是一个真正理解现代前端开发工作流的智能伴侣。它能够自动检测并嵌入你的React/Vite项目提供一个实时的开发服务器预览窗口同时在侧边栏集成了由Cursor Agent驱动的AI聊天助手。这意味着你一边在编辑器里改代码一边就能在同一个应用里看到改动效果还能随时向AI提问“为什么这个组件没渲染”或者“帮我把这个按钮样式改成圆角的”并立刻获得反馈。这个工具特别适合那些已经在使用或想尝试“AI结对编程”的开发者。无论是快速原型验证、学习新框架还是日常的bug排查和代码优化它都能显著减少上下文切换的损耗。接下来我会结合自己搭建和深度使用这类工具的经验为你拆解它的设计思路、核心实现、以及如何最大化地利用它来提升你的开发效率。2. 核心设计思路与架构解析2.1 为什么是“预览 AI”的组合在深入代码之前我们先聊聊这个产品形态背后的逻辑。现代前端开发尤其是React/Vite这类工具链核心体验就是“热重载”HMR。你保存文件浏览器几乎实时更新。但传统的流程是编辑器VSCode/Cursor - 终端运行npm run dev - 浏览器查看localhost:5173。这里存在两个主要的“摩擦点”终端与浏览器的分离你需要监控终端日志比如编译错误、网络请求同时又在浏览器里交互和调试。频繁的AltTab或分屏操作会打断心流。AI助手与开发环境的分离当你使用Cursor的Agent或类似Copilot Chat时你描述问题需要复制错误信息、截图或者手动告诉AI“我在哪个文件的哪一行”。这个过程是异步且割裂的。Termi AI的聪明之处在于它试图将这三个核心环节编码、运行、咨询整合到一个专注的桌面环境中。它的设计目标很明确为基于Vite的现代前端项目提供一个内置了智能助手的、一体化的开发沙盒。2.2 技术栈选型背后的考量看看它的技术栈Electron React Vite node-pty Cursor Agent。这是一个非常务实且高效的选择。Electron作为桌面应用的基石它允许使用Web技术HTML, CSS, JS来构建跨平台macOS, Windows, Linux的本地应用。对于Termi AI这种需要深度集成系统终端PTY和本地进程管理的工具Electron是成熟且自然的选择。它提供了访问本地文件系统、原生菜单、系统托盘等能力。React Vite用于构建应用本身的用户界面。Vite作为构建工具提供了极快的热更新这同样适用于Termi AI这个“元应用”自身的开发体验。React的组件化模型非常适合构建这种复杂的、状态驱动的桌面应用UI。node-pty这是一个关键依赖。它提供了在Node.js进而是在Electron的主进程或渲染进程中创建伪终端Pseudo Terminal的能力。简单理解它就是让你能在JavaScript代码里“模拟”一个真实的终端可以执行shell命令并捕获其输入输出。Termi AI里那个能跑npm run dev的终端窗口核心就是靠它驱动的。没有它所谓的“进程管理”就无从谈起。Cursor Agent这是AI能力的引擎。Cursor Agent是一个命令行工具它封装了与大语言模型如GPT-4交互的能力专门针对代码生成和理解进行了优化。Termi AI通过集成这个CLI将AI聊天的能力变成了应用的一个功能模块而不是自己从头去调用OpenAI API。注意这里有一个重要的技术决策点。Termi AI选择集成Cursor Agent CLI而不是直接调用OpenAI API。这样做有几个好处1可以利用Cursor团队对提示词Prompt和代码上下文的优化2简化了自身的配置用户只需要安装一个全局CLI工具3责任分离AI能力的更新和维护由Cursor团队负责。但这也带来了依赖风险如果Cursor Agent的接口或行为发生重大变化Termi AI需要同步适配。2.3 项目结构解读从提供的结构看这是一个典型的“Electron 分离渲染器”架构并且渲染器本身也是一个独立的Vite项目。这种结构清晰地将“原生部分”和“Web UI部分”解耦。termi-ai/ ├── electron/ # 【核心】Electron 主进程代码 │ ├── main.cjs # 应用入口创建窗口、处理生命周期 │ ├── preload.cjs # 安全桥梁暴露主进程API给渲染器 │ ├── runner.cjs # 【关键】封装与Cursor Agent的交互逻辑 │ └── viteRunner.cjs # 【关键】管理Vite项目进程启动/停止/监控 ├── renderer/ # 【界面】React前端应用 │ ├── src/ # 所有UI组件、状态管理在这里 │ └── public/ # 静态资源 └── docs/ # 项目文档electron/main.cjs这是Electron应用的“大脑”。它负责创建浏览器窗口、加载渲染器页面、设置应用菜单、以及通过ipcMain模块监听来自渲染进程的请求。例如当你在React界面点击“选择文件夹”按钮时这个请求会通过IPC进程间通信传递到main.cjs由它调用Electron的dialog.showOpenDialog原生API来打开系统文件选择器。electron/preload.cjs出于安全考虑Electron的渲染进程我们的React应用默认不能直接访问Node.js的fs、path等模块或主进程的环境。preload脚本在渲染器加载之前运行且拥有访问Node.js的能力。它的作用是将一些安全的、白名单化的API“注入”到渲染器的window对象中例如window.electron.selectFolder。这样渲染器就可以通过这些暴露的接口与主进程安全通信。electron/viteRunner.cjs这是项目管理的“发动机”。它很可能包含以下功能项目检测解析所选文件夹的package.json识别是否为Vite项目检查devDependencies或scripts中的vite。进程管理使用node-pty或child_process模块启动npm run dev或yarn dev,pnpm dev命令。它需要捕获进程的输出stdout/stderr并从中智能地提取开发服务器的URL例如从输出日志中匹配Local: http://localhost:5173/这样的模式。状态监控将进程的状态运行中、已停止、出错、输出日志、以及提取到的URL通过IPC实时发送给渲染器用于更新UI。electron/runner.cjs这是AI能力的“接线员”。它负责与cursor-agentCLI进行交互。可能的工作流程是接收渲染器传来的用户消息 - 构造合适的命令调用cursor-agent- 以流式streaming方式读取CLI的输出 - 将流式的文本或结构化数据如Markdown通过IPC实时发送回渲染器展示。这种架构保证了UI的流畅性React负责和后台任务的稳定性Node.js主进程负责是Electron应用的最佳实践之一。3. 核心功能模块深度剖析与实操3.1 智能项目检测与Vite服务器集成这是Termi AI的立身之本。它如何做到“开箱即用”1. 项目发现与验证当你点击“Choose folder”并选择一个目录后主进程会做以下几件事检查该目录下是否存在package.json。解析package.json寻找scripts对象中是否包含典型的开发命令如dev、serve、start。它会优先寻找包含vite关键词的命令或者通过分析devDependencies和dependencies来判断是否包含vite。同时它会检测目录中是否存在vite.config.js、vite.config.ts等配置文件来进一步确认。2. 包管理器探测为了正确地运行dev命令它需要知道使用哪个包管理器。常见的探测逻辑是检查是否存在yarn.lock- 使用yarn。检查是否存在pnpm-lock.yaml- 使用pnpm。检查是否存在package-lock.json- 使用npm。如果都没有则回退到npm或让用户选择。3. 启动与URL捕获这是最具技巧性的部分。viteRunner.cjs会使用node-pty启动一个终端进程执行类似yarn dev的命令。使用node-pty而非普通的child_process.spawn是为了获得更好的终端交互体验和样式支持。启动后它会实时监听进程的标准输出stdout。Vite在启动成功后会在日志中打印出访问地址例如VITE v5.2.0 ready in 320 ms ➜ Local: http://localhost:5173/ ➜ Network: http://192.168.1.100:5173/ ➜ press h enter to show helpviteRunner需要编写一个正则表达式来捕获这个URL。一个简单的模式可能是/Local:\s(https?:\/\/\S)/。一旦捕获到这个URL就会通过IPC发送到渲染器。4. 在Webview或iframe中嵌入渲染器收到URL后会将其加载到一个webview标签或iframe中。在Electron中webview标签提供了更强大的控制能力如独立的进程、preload脚本注入但iframe更简单通用。考虑到安全性和隔离性Termi AI很可能使用webview来嵌入开发服务器页面这样可以避免开发站点的脚本意外影响到主应用的运行。实操心得URL捕获的稳定性在实际开发中不同项目的Vite配置、插件可能会改变启动日志的格式。更健壮的做法是除了正则匹配还可以尝试在启动命令中加入--host和--port参数来明确指定主机和端口这样日志输出更可控。或者可以尝试在短暂的延迟后直接向http://localhost:${commonPort}如5173发起一个HEAD请求如果成功则判定服务器已就绪。这是一种“日志匹配 网络探测”的双重保障机制。3.2 基于node-pty的终端仿真与进程管理node-pty模块是实现在应用内运行终端的关键。它创建的是一个“伪终端”你可以把它想象成一个虚拟的TTY设备。在Termi AI中的典型工作流程创建PTY在主进程或一个专用的Worker进程中调用pty.spawn来启动一个shell如bash、zsh或cmd.exe。数据流管道输入当用户在渲染器的终端UI中输入字符时这些数据通过IPC传到主进程再写入到PTY的输入流 (pty.write)。输出PTY进程的输出包括命令回显、程序输出、错误信息会触发data事件。主进程监听这个事件将输出数据通过IPC实时发送回渲染器。渲染器中的终端UI渲染器端需要使用一个前端终端组件库如xterm.js来接收这些数据流并将其渲染为可读的、带格式的文本同时处理用户的键盘输入事件。进程管理的挑战对于npm run dev这样的长时间运行进程管理其生命周期尤为重要启动在PTY中执行cd /project/path npm run dev。停止当用户点击“停止”按钮或切换项目时需要向PTY进程发送一个终止信号如SIGINT对应CtrlC。这通过pty.kill(SIGINT)实现。状态监控除了监听输出流还需要监听PTY进程的exit事件以准确知道进程何时结束并更新UI状态。多进程隔离理想情况下每个项目或每个命令都应该在独立的PTY实例中运行避免相互干扰。Termi AI需要维护一个进程池或映射表来管理它们。注意事项node-pty的安装与重建node-pty是一个原生模块Native Addon它包含了需要编译的C代码。这意味着在开发时运行npm install后通常需要执行npm run rebuild或electron-rebuild来针对你当前系统上的Electron版本重新编译这个模块。在打包分发应用时需要为每个目标平台Windows, macOS, Linux分别编译对应的原生模块二进制文件。这通常通过CI/CD流水线或在打包脚本中配置electron-builder的npmRebuild选项来完成。如果处理不当会导致应用在用户电脑上崩溃提示“Module did not self-register”之类的错误。3.3 Cursor Agent集成与AI聊天实现这是Termi AI的“智能大脑”接入点。集成一个外部CLI工具核心在于进程通信和数据流处理。1. 调用机制在runner.cjs中当需要询问AI时它很可能这样工作// 伪代码示意 const { spawn } require(child_process); const cursorAgentPath cursor-agent; // 假设已在PATH中 function askAI(question, projectContext) { // 1. 构建命令参数。Cursor Agent可能需要项目路径作为上下文。 const args [--query, question, --project, projectContext]; // 2. 以流式方式启动进程 const aiProcess spawn(cursorAgentPath, args); // 3. 实时处理输出流 aiProcess.stdout.on(data, (data) { const chunk data.toString(); // 将数据块通过IPC发送给渲染器实现打字机效果 mainWindow.webContents.send(ai-response-chunk, chunk); }); // 4. 处理结束和错误 aiProcess.on(close, (code) { mainWindow.webContents.send(ai-response-end, { code }); }); aiProcess.stderr.on(data, (data) { // 处理错误信息 }); }渲染器端则监听ai-response-chunk事件将收到的文本块逐步追加到聊天界面上实现流式响应的效果。2. 上下文管理为了让AI的回答更精准需要给它提供项目上下文。最简单的方式是将当前打开的项目根目录路径作为--project参数传递给cursor-agent。更高级的集成可能会自动将当前预览页面的错误信息、选中的代码片段或最近修改的文件列表也作为上下文的一部分发送过去。3. 会话持久化“Persistent History”功能意味着需要将对话记录保存到本地。这通常在渲染器端完成使用如localStorage、IndexedDB或者通过IPC让主进程将数据保存到应用配置目录如app.getPath(userData)下的一个JSON文件中。每次启动应用时再从这个存储中加载历史记录。踩坑记录CLI工具的路径与版本兼容性依赖外部CLI工具最大的风险是环境差异。用户可能没有安装cursor-agent或者安装的版本太旧/太新。一个健壮的应用应该启动时检查应用启动时尝试在PATH中查找cursor-agent如果找不到给用户一个清晰的指引甚至提供一键安装的按钮但这需要处理各平台包管理器的差异复杂度高。提供配置项允许用户在设置中手动指定cursor-agent的绝对路径。处理输出格式不同版本的CLI输出格式可能有细微差别。解析其输出时尤其是为了提取结构化信息代码要有一定的容错性或者锁定一个推荐的CLI版本范围。4. 开发、构建与分发实战指南4.1 本地开发环境搭建与调试如果你想从源码构建或参与贡献以下是详细的步骤和注意事项1. 环境准备Node.js 18这是硬性要求因为Electron和许多现代JS工具链依赖较新的Node API。Git用于克隆代码。系统构建工具macOS需要安装Xcode Command Line Tools。在终端运行xcode-select --install。Windows需要安装Visual Studio Build Tools或更高版本并勾选“使用C的桌面开发”工作负载。也可以使用windows-build-toolsnpm包。Linux需要GCC、make等。在Ubuntu/Debian上可以运行sudo apt-get install build-essential。2. 克隆与安装git clone https://github.com/BaronJensen/termi-ai.git cd termi-ai npm install如果npm install后遇到关于node-pty的编译错误大概率是缺少系统构建工具请根据上一步检查。3. 重建原生模块关键步骤安装完依赖后必须执行重建命令确保node-pty是针对你本地Electron版本编译的。npm run rebuild # 或者如果package.json里配置了也可能是 # npx electron-rebuild4. 启动开发模式npm run dev这个命令通常会同时启动两个服务渲染器开发服务器通常运行在http://localhost:3000或类似端口提供React应用的热重载。Electron主进程加载上述本地开发服务器的URL并启用Electron的开发者工具。5. 调试技巧主进程调试在启动命令中加入--inspect或--inspect-brk参数可在package.json的dev脚本中配置然后使用Chrome DevTools的chrome://inspect页面进行调试。渲染进程调试在Electron应用内按CtrlShiftI(CmdOptI on Mac) 即可打开熟悉的Chrome开发者工具。进程间通信调试可以在preload.js和主进程的IPC监听器中添加console.log观察数据流动。Electron也有专门的electron-log库可以更好地记录日志到文件。4.2 应用打包与跨平台分发将Electron应用打包成可安装的二进制文件如.dmg, .exe, .AppImage是一个多步骤的过程Termi AI使用了electron-builder这个流行的工具。1. 配置electron-builder配置通常在package.json的build字段中。你需要关注appId: 应用的唯一标识符如com.youraccount.termiai。productName: 显示给用户的应用名称。directories.output: 打包产出的目录。files: 指定哪些文件需要被打包进应用。通常包括dist/构建后的渲染器代码、electron/主进程代码、package.json以及必要的资源文件。asar: 是否将应用代码打包成asar归档一种只读格式以保护源码和加快加载速度。通常建议设为true。平台特定配置如mac下的category、dmg设置win下的target为nsis(安装程序)linux下的target为AppImage。2. 构建渲染器在打包Electron主包之前需要先使用Vite构建出生产环境的渲染器代码。npm run build:renderer这会在dist/目录下生成优化过的HTML、JS、CSS文件。3. 执行打包命令npm run dist这个命令会触发electron-builder它会将配置中指定的文件收集到一起。为每个目标平台可在命令或配置中指定编译原生模块如node-pty。生成对应平台的安装包或可执行文件。4. 处理原生模块的跨平台编译这是打包中最容易出错的一环。electron-builder通过npmRebuild: true配置会在打包过程中自动为当前目标平台重建原生模块。关键点在于你不能在macOS上直接打包出Windows可用的原生模块。通常的解决方案是使用CI/CD在GitHub Actions、GitLab CI等平台上分别为macOS、Windows、Linux创建构建任务在每个任务对应的原生环境中执行打包命令。手动交叉编译比较复杂不推荐。5. 打包后的目录结构打包完成后在输出目录如dist/下你会看到类似这样的文件dist/ ├── termi-ai-1.0.0.dmg # macOS安装包 ├── termi-ai-1.0.0.exe # Windows安装程序 ├── termi-ai-1.0.0.AppImage # Linux可执行文件 └── ... (其他如zip, blockmap等)避坑指南打包体积与依赖管理Electron应用常被诟病体积庞大。为了控制体积确保package.json中的dependencies和devDependencies区分清楚。只有运行时必需的包才放在dependencies里。使用electron-builder的asar压缩。定期检查并移除未使用的依赖。可以使用depcheck这样的工具。注意即使你用了prune或production模式安装一些模块自带的测试文件、文档等也可能被打包进去可以通过electron-builder的files配置精细控制包含哪些文件。5. 高级使用技巧与自定义拓展5.1 提升AI助手的使用效率仅仅有一个聊天窗口是不够的如何让它真正成为你的“开发伴侣”1. 提供精准的上下文主动发送错误当终端或预览页面出现错误时可以设计一个“发送错误到AI”的按钮自动将错误堆栈和当前文件上下文填入聊天框。集成当前文件如果Termi AI未来能集成一个简单的代码编辑器哪怕是只读的那么就可以实现“选中代码右键询问AI”的功能这比手动复制粘贴高效得多。项目结构摘要在初次加载项目时可以让AI先分析一下package.json和主要目录结构生成一个项目简介帮助AI在后续对话中更好地理解项目背景。2. 预设常用指令Prompt Templates你可以在应用内保存一些常用的指令模板比如“为当前预览的页面组件编写一个Jest单元测试。”“解释一下项目里src/utils/目录下formatter.js这个函数的作用。”“根据Tailwind CSS文档帮我把这个div的布局从flex改为grid。” 点击模板就能快速发送避免重复输入。3. 利用聊天历史Termi AI的持久化历史功能不只是为了回顾。你可以基于之前的对话继续深入提问比如“按照你刚才说的方案A具体在App.tsx里该怎么改” AI会结合历史上下文给出更连贯的回答。5.2 支持更多框架与开发服务器目前Termi AI专注于Vite但思路可以扩展。1. 检测逻辑扩展在viteRunner.cjs的检测逻辑中可以增加对其他框架的识别Next.js检查package.json中是否存在next以及scripts中是否有dev。Nuxt.js检查是否存在nuxt.config.ts等配置文件。Astro检查是否存在astro.config.mjs。甚至静态服务器如果只是一个简单的index.html可以尝试启动一个serve或http-server。2. 通用服务器运行器可以设计一个更通用的projectRunner它接受项目路径、包管理器、启动命令作为参数。UI上可以让用户在选择项目后从一个下拉列表中选择项目类型自动检测或手动选择甚至自定义启动命令。3. 多服务器支持有些全栈项目可能同时运行前端Vite on 5173和后端Express on 3000服务器。一个更强大的Termi AI可以同时管理多个进程并提供多个预览标签页或一个聚合的仪表板。5.3 界面与工作流定制1. 布局记忆应用应该记住用户最后一次的窗口大小、面板布局如终端高度、聊天框宽度并在下次启动时恢复。2. 主题与快捷键支持深色/浅色主题切换是桌面应用的标配。此外可以定义一些全局快捷键比如Cmd/Ctrl Shift C快速聚焦到聊天框Cmd/Ctrl \切换终端显示/隐藏等。3. 项目工作区允许用户保存多个项目配置一键切换。每个工作区可以记住其特定的终端历史、AI对话历史和服务器状态。6. 常见问题排查与解决方案实录在实际使用和开发类似工具的过程中你肯定会遇到各种问题。这里我整理了一份“急救手册”。问题现象可能原因排查步骤与解决方案应用启动后一片空白或白屏1. 渲染器进程加载失败。2. 主进程与渲染器IPC通信失败。3. 原生模块node-pty加载崩溃。1. 打开开发者工具CtrlShiftI查看控制台是否有JS错误或网络加载失败。2. 查看主进程日志启动时加--enable-logging参数。3. 确认npm run rebuild已成功执行且Electron版本与node-pty兼容。终端无法输入或没有输出1. node-pty模块未正确初始化或进程创建失败。2. IPC通信链路中断数据未从主进程传到渲染器。3. 前端xterm.js组件配置错误。1. 在主进程的PTY创建代码附近添加日志检查pty.spawn是否成功是否有error事件。2. 检查preload脚本是否正确暴露了终端API渲染器是否成功调用。3. 在渲染器检查xterm.js实例是否成功挂载到DOM并监听了正确的数据事件。无法检测到Vite项目或启动失败1. 项目路径包含特殊字符或权限不足。2. 包管理器探测逻辑有误。3. Vite服务器启动超时或端口被占用。4. 正则表达式未能从日志中捕获URL。1. 尝试一个路径简单的纯英文目录下的项目。2. 在UI上增加手动选择包管理器的选项。3. 检查终端输出日志看是否有明显的错误信息如端口冲突。在代码中增加启动超时机制和端口检测。4. 将捕获到的原始日志打印出来调试你的URL正则表达式。AI聊天功能无响应1.cursor-agent未安装或不在PATH中。2.cursor-agent进程启动失败或报错。3. IPC通信问题响应未传回渲染器。1. 在系统终端中运行which cursor-agent或cursor-agent --version确认其可用性。在应用内增加友好的错误提示。2. 在主进程运行AI命令时同时监听stderr流并将错误信息反馈到UI。3. 在渲染器监听AI响应的IPC事件并添加超时处理超时后提示用户检查AI配置。打包后的应用在别的电脑上崩溃1. 目标机器缺少运行时库尤其是Windows上的VC Redistributable。2. 原生模块node-pty是针对打包环境平台编译的与运行环境不兼容。3. 应用资源文件缺失或路径错误。1. 对于Windows在安装程序或文档中说明需要安装VC运行库。electron-builder的NSIS目标可以尝试自动包含。2.确保在目标平台对应的操作系统上执行打包或者使用CI进行多平台构建。3. 使用app.getPath(exe)等API获取正确的资源路径不要使用相对路径。在开发模式下和生产模式下路径解析方式不同。应用性能差内存占用高1. 渲染器页面存在内存泄漏如未销毁的事件监听器、定时器。2. 终端输出历史过大xterm.js缓冲区未清理。3. 同时运行了多个重型进程未及时清理。1. 使用Chrome DevTools的Memory面板和Performance面板进行性能分析。2. 为终端输出设置行数上限定期清理滚动出视图的缓冲区。3. 确保在项目切换或应用关闭时正确终止所有由node-pty创建的进程。一个真实的调试案例我曾遇到在Linux上打包的应用终端功能完全失效。白屏问题通过DevTools发现是某个JS文件404。根本原因是electron-builder的files配置漏掉了electron/目录下的一个新增的.cjs文件。解决方案是仔细检查package.json中的build.files数组确保包含了所有必需的源代码和资源文件。教训每次新增重要文件都要考虑它是否需要被打包。Termi AI这个项目展示了一个非常清晰的思路将开发者日常高频使用的工具终端、浏览器、AI聊天整合到一个专注的、可定制的桌面环境中。它的实现涉及了Electron应用开发、进程管理、终端仿真、外部工具集成等多个有趣的技术点。无论你是想直接使用它来提升效率还是借鉴它的设计来构建自己的工具希望这篇深入的解析能给你带来实实在在的帮助。开发工具的本质是消除摩擦而减少一次切换或许就能多留住一刻灵感。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2593985.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…