AI辅助构建复古像素风Hacker News聚合器:全栈开发实战

news2026/5/15 19:28:50
1. 项目概述一个AI驱动的复古风Hacker News聚合器最近在逛Hacker News的时候我总感觉“Show HN”板块里那些有趣的个人项目像流星一样刷一下就过去了想回头再找特别费劲。作为一个喜欢折腾的开发者我就在想能不能自己搭一个专门聚合“Show HN”内容的看板既能快速浏览又能有点自己的风格。正好手头有Claude和Cursor这些AI开发工具我就琢磨着能不能完全用AI辅助从零到一搞出个能用的东西来。于是就有了这个项目——一个带着复古像素风味的Hacker News “Show HN”聚合器。这个项目的核心目标很简单自动抓取Hacker News上最新的“Show HN”帖子用一个更友好、更有趣的界面展示出来。它不仅仅是简单罗列标题还会尝试提取帖子的摘要和首图让你一眼就能get到项目的大概。更重要的是整个项目从后端API、前端React组件到像素风UI设计几乎都是在AI的辅助下完成的。这对我来说既是一次效率实验也想看看现在AI编程工具到底能帮我们做到什么程度。如果你也对全栈开发、AI辅助编程或者只是想找个地方集中看看有趣的开发者项目感兴趣那这个项目的构建过程或许能给你一些启发。2. 技术栈选型与项目架构解析2.1 为什么选择React Node.js Vercel这套组合在启动项目前技术栈的选择直接关系到开发效率和后期维护。我最终敲定React、Node.js和Vercel是基于以下几个非常实际的考量前端选择React的核心原因在于其生态与组件化。“Show HN”的每个帖子卡片包含标题、作者、分数、评论数、摘要和图片本质上是一个高度重复的UI单元。用React的组件化思想我只需要设计好一个PostCard /组件然后通过props传入不同的数据就能渲染出整个列表。这比用原生JavaScript去操作DOM要清晰、高效得多。此外React庞大的生态系统比如状态管理、路由库虽然在这个小项目里不一定全用上但它为项目未来的功能扩展比如增加搜索、分类过滤预留了足够灵活的空间。后端用Node.js Express图的就是一个“全JavaScript”栈的便利。这个项目后端的主要任务并不复杂定时去Hacker News的官方API抓取数据稍作处理比如过滤出“Show HN”帖子、尝试获取摘要然后提供一个干净的API接口给前端。用Node.js写这个前后端语言统一思维上下文不用切换。Express框架轻量且足够应对这种场景写个简单的GET /api/posts路由配上一些中间件比如处理CORS、请求日志后端骨架很快就搭起来了。如果后端用PythonDjango/Flask或Go虽然性能可能更优但会引入额外的语言环境对于这个旨在快速验证、展示AI辅助开发能力的项目来说有点杀鸡用牛刀了。部署平台选择Vercel几乎是React项目的“标配”了。Vercel对于前端框架的优化做得非常好特别是对Next.js基于React。虽然我这个项目用的是纯React但Vercel的部署体验依然丝滑。它直接与GitHub仓库关联每次git push后自动触发部署无需手动操作服务器。更重要的是Vercel提供了Serverless Functions功能这让我可以把那个简单的Node.js后端API也一起部署上去前后端在一个平台上搞定省去了配置Nginx、管理服务器等运维工作。对于个人项目或原型来说这种零运维的体验极大地降低了发布门槛。注意技术选型没有绝对的好坏只有是否适合当前场景。对于追求极致性能、高并发的生产级应用可能需要考虑更专业的后端语言和部署架构。但在这个项目中“快速实现、易于部署、便于展示”是首要目标所以当前的技术栈是最佳选择。2.2 项目整体架构与数据流设计整个应用遵循典型的前后端分离架构数据流清晰明了数据获取层后端一个运行在Vercel Serverless Function或本地开发时的Node.js进程中的定时任务。它使用node-fetch或axios库定期调用Hacker News的公开APIhttps://hacker-news.firebaseio.com/v0/。首先获取最新的500个故事ID然后并发地获取每个故事的详情。接着过滤出标题以“Show HN:”开头的帖子。数据处理与缓存层后端获取到原始的帖子数据后后端会尝试进行“富化”处理。例如如果帖子包含一个外部链接后端可能会尝试抓取该链接的meta namedescription标签作为摘要并提取页面中的第一张图片URL。这个过程是耗时的因此缓存机制至关重要。我采用了一个简单的内存缓存开发时或Redis生产环境考虑为数据设置一个合理的过期时间比如10分钟避免频繁请求Hacker News API给对方服务器造成压力也极大提升了前端响应速度。API接口层后端处理好的数据通过一个Express路由如/api/show-hn-posts以JSON格式暴露出来。接口设计应简洁返回包含帖子数组、获取时间等信息的结构化数据。前端展示层React应用通过fetch或axios调用上述API接口获取帖子数据。前端的主要状态是posts数组。应用加载时或用户点击刷新按钮时触发数据获取。获取到的数据被映射成一系列的PostCard /组件进行渲染。像素风的样式通过CSS或CSS-in-JS方案如styled-components实现。这个架构的优势在于职责分离后端专心负责数据获取和加工前端专心负责展示和交互。两者通过定义良好的API契约连接使得前后端可以独立开发和部署。3. 核心功能实现细节与难点攻克3.1 如何精准抓取与过滤“Show HN”帖子Hacker News的API设计得很简洁但要用好也需要一点技巧。官方API根地址是https://hacker-news.firebaseio.com/v0/。我们主要用到两个端点https://hacker-news.firebaseio.com/v0/newstories.json返回最新500个故事的ID数组。https://hacker-news.firebaseio.com/v0/item/{id}.json根据故事ID获取故事的详细信息对象。抓取策略优化直接顺序请求500个故事详情会导致请求时间过长。我的做法是先获取ID列表然后使用Promise.all发起最多20-30个并发的请求这样可以大幅缩短数据获取的总时间。但要注意并发数不宜过高以免被目标服务器视为攻击。// 示例并发获取故事详情的简化代码 async function fetchPostDetails(postIds) { const concurrencyLimit 25; // 控制并发数 const batches []; for (let i 0; i postIds.length; i concurrencyLimit) { batches.push(postIds.slice(i, i concurrencyLimit)); } const allPosts []; for (const batch of batches) { const promises batch.map(id fetch(https://hacker-news.firebaseio.com/v0/item/${id}.json).then(r r.json()) ); const batchResults await Promise.all(promises); allPosts.push(...batchResults); // 可选在每个批次之间添加短暂延迟以示友好 await new Promise(resolve setTimeout(resolve, 100)); } return allPosts; }过滤逻辑并非所有title以“Show HN:”开头的帖子都是我们想要的。有时会有“Show HN: (something)”这样的变体。我采用的过滤条件是story.type story story.title story.title.toLowerCase().includes(show hn)。这样能覆盖大多数情况。更严格的可以用正则表达式/^Show HN:/i但前者容错性更好一些。3.2 实现“富化”内容摘要与图片提取这是项目的一个亮点也是难点。Hacker News的帖子详情API只返回标题、链接、分数等元数据没有摘要和图片。为了丰富展示内容我们需要主动去抓取帖子链接指向的外部页面。摘要提取最理想的方式是获取目标网页的meta namedescription标签内容。这通常是最准确的摘要。我们可以使用一个轻量级的HTML解析库比如node-html-parser或cheerio来解析抓取到的HTML。const cheerio require(cheerio); async function extractSummaryFromUrl(url) { try { const response await fetch(url); const html await response.text(); const $ cheerio.load(html); // 优先查找 meta description const metaDescription $(meta[namedescription]).attr(content) || $(meta[propertyog:description]).attr(content); if (metaDescription metaDescription.length 50) { return metaDescription.substring(0, 200) ...; // 截断处理 } // 次选获取第一个p标签的内容 const firstParagraph $(p).first().text(); if (firstParagraph firstParagraph.length 30) { return firstParagraph.substring(0, 200) ...; } } catch (error) { console.error(Failed to extract summary from ${url}:, error.message); } return null; // 提取失败返回null }图片提取思路类似优先寻找Open Graph图片标签meta propertyog:image这是社交媒体分享常用的标准图片。如果没有再尝试获取页面中第一个有意义的img标签的src。实操心得网络抓取充满了不确定性。目标网站可能没有设置meta description或者图片链接是相对路径甚至网站可能禁止爬虫。因此必须为这些“富化”操作添加完善的错误处理try-catch和超时控制。并且这个操作非常耗时绝对不能在前端进行必须在后端完成并利用缓存存储结果。对于提取失败的帖子前端UI应有降级方案比如显示一个默认的占位图或简单的文字提示。3.3 缓存策略的设计与实现没有缓存的聚合器是不合格的。我们的缓存需要解决两个问题1) 避免频繁请求Hacker News API2) 避免对同一个外部链接重复进行耗时的“富化”抓取。分层缓存思路原始数据缓存将从Hacker News API获取到的、过滤后的帖子列表缓存起来有效期较短比如2-5分钟。这能应对前端频繁刷新。富化内容缓存为每个帖子的外部链接对应的摘要和图片URL建立缓存。由于外部网页内容不会频繁变动这个缓存的有效期可以设得更长比如1小时甚至更长。这里需要一个键值对存储键可以是帖子的ID或URL的哈希值。实现方案开发环境/简单部署可以使用内存缓存比如一个简单的JavaScript对象配合定时器清除过期数据。但Serverless函数是无状态的内存缓存会在函数执行结束后丢失。因此在Vercel Serverless环境下内存缓存仅在一次函数调用内有效。生产环境推荐使用外部缓存服务。Vercel自身提供了Vercel KV基于Redis它与Serverless Functions集成度很高是完美选择。也可以使用Upstash等第三方Redis服务。将缓存逻辑从内存迁移到Redis代码结构变化不大主要是把cache.get/cache.set换成对Redis客户端的调用。// 伪代码使用内存缓存的简单示例 const cache new Map(); const CACHE_TTL 5 * 60 * 1000; // 5分钟 async function getCachedShowHNPosts() { const cacheKey show-hn-posts; const cached cache.get(cacheKey); // 检查缓存是否存在且未过期 if (cached (Date.now() - cached.timestamp CACHE_TTL)) { return cached.data; } // 缓存失效重新获取 const freshData await fetchAndProcessPosts(); cache.set(cacheKey, { data: freshData, timestamp: Date.now() }); return freshData; }4. 复古像素风UI的前端实现技巧项目的视觉风格是“复古像素风”这能让人联想到早期的计算机和网页与Hacker News本身的极客文化相得益彰。用CSS实现这种风格关键在于字体、边框、颜色和阴影的运用。4.1 核心CSS样式设计字体选择一款等宽、有像素感的字体是关键。Courier New,Monaco,Consolas是系统自带的等宽字体但像素感不强。我们可以使用Google Fonts上的像素字体比如Press Start 2P用于标题或强调文字或者Silkscreen。通过import引入并设置font-family。颜色方案复古风格常使用低饱和度、高对比度的颜色。例如深色背景#0a0a0a或#1a1a1a搭配亮色文字#00ff00绿色#ffff00黄色#00ffff青色。也可以模仿老式CRT显示器的效果使用黑底绿字。边框与阴影避免使用圆角border-radius和渐变。使用border属性创建硬朗的方框。为了营造“像素化”凸起或凹陷效果可以使用多层box-shadow。/* 一个像素风格的按钮 */ .pixel-button { background-color: #333; color: #0f0; border: 2px solid #0f0; padding: 8px 16px; font-family: Courier New, monospace; box-shadow: 2px 2px 0px #0a0; /* 右下角阴影营造凸起感 */ cursor: pointer; } .pixel-button:active { box-shadow: 1px 1px 0px #0a0; /* 点击时阴影变小模拟按下效果 */ transform: translate(1px, 1px); }图片处理为了让抓取来的各种风格的图片也融入像素风可以给图片添加一个CSS滤镜比如filter: contrast(1.2) saturate(1.1);来增强对比和饱和度或者用image-rendering: pixelated;让图片在放大时呈现像素块效果慎用可能影响清晰度。4.2 React组件结构与状态管理前端应用的结构并不复杂采用经典的“容器组件展示组件”模式。App组件容器组件负责状态管理。主要状态包括posts: Array帖子列表数据。loading: Boolean是否正在加载数据。error: String | null错误信息。 它包含数据获取的逻辑调用后端API并将状态和操作函数通过props传递给子组件。PostList组件接收posts数组负责遍历并渲染每个PostCard。PostCard组件展示组件这是一个纯UI组件接收一个post对象作为prop负责渲染帖子的标题、作者、分数、评论数、摘要和图片。所有样式都封装在这个组件内部或关联的CSS模块中。Header,Footer组件负责页面的页眉和页脚。状态管理使用React内置的useState和useEffectHook就足够了完全不需要引入Redux或Context API等复杂方案。数据获取在App组件的useEffect中完成。// App.js 核心逻辑简化示例 import { useState, useEffect } from react; import PostList from ./components/PostList; import ./App.css; function App() { const [posts, setPosts] useState([]); const [loading, setLoading] useState(true); const [error, setError] useState(null); useEffect(() { const fetchPosts async () { setLoading(true); setError(null); try { const response await fetch(/api/show-hn-posts); // 调用自己的后端API if (!response.ok) throw new Error(HTTP error! status: ${response.status}); const data await response.json(); setPosts(data); } catch (err) { setError(err.message); console.error(Failed to fetch posts:, err); } finally { setLoading(false); } }; fetchPosts(); // 可以设置一个定时器每5分钟自动刷新一次 const intervalId setInterval(fetchPosts, 5 * 60 * 1000); return () clearInterval(intervalId); // 组件卸载时清除定时器 }, []); if (loading) return div classNameloading-pixelLoading.../div; if (error) return div classNameerror-pixelError: {error}/div; return ( div classNameapp Header / PostList posts{posts} / Footer / /div ); }5. AI辅助开发实战从Prompt到代码这个项目被标记为“Proudly AI-Generated”其核心开发过程高度依赖与AI的对话。我主要使用了Cursor集成了Claude和GPT模型作为开发环境。下面分享几个关键环节中如何有效地利用AI。5.1 用自然语言描述生成项目骨架项目伊始我在Cursor中新建了一个文件直接输入了这样的Prompt “我想创建一个Web应用用来聚合展示Hacker News上的‘Show HN’帖子。前端用React希望是复古像素风格。后端用Node.js和Express主要功能是定时抓取Hacker News API的数据过滤出Show HN帖子并尝试抓取帖子链接的摘要和图片。请为我生成一个基本的项目结构包括前后端的主要文件。”Cursor背后的Claude迅速生成了一个清晰的项目目录树和建议show-hn-aggregator/ ├── client/ # React前端 │ ├── public/ │ ├── src/ │ │ ├── components/ │ │ │ ├── PostCard.jsx │ │ │ ├── PostList.jsx │ │ │ ├── Header.jsx │ │ │ └── Footer.jsx │ │ ├── App.jsx │ │ ├── index.js │ │ └── styles/ │ └── package.json ├── server/ # Node.js后端 │ ├── index.js # Express主文件 │ ├── fetcher.js # 数据抓取逻辑 │ ├── cache.js # 缓存逻辑 │ └── package.json ├── package.json (根目录可配置 concurrently 同时运行前后端) └── README.md它甚至生成了server/index.js里Express服务器的基本代码和client/src/App.jsx的React组件框架。这为我节省了大量初始化项目的时间。5.2 针对具体功能点的AI编程当需要实现具体功能时我会提出非常明确的问题。示例1实现并发抓取Hacker News故事详情。我对AI说“我在Node.js里有一个包含100个故事ID的数组。我想高效地获取所有故事详情但不想一个一个顺序请求那样太慢。请写一个函数使用Promise.all进行并发请求但同时要控制并发数比如最多同时20个请求避免把服务器打垮。”AI给出了使用Promise.all结合for...of循环和await来控制并发批次的代码这正是前面提到的优化方案的核心。示例2设计像素风CSS。我对AI说“请为我的React帖子卡片组件写一些CSS让它具有复古像素艺术风格。使用深色背景、亮绿色边框和文字。按钮要有被按下的感觉。” AI生成的代码不仅提供了基础样式还给出了box-shadow模拟凸起、active伪类模拟按下的细节这正是我想要的。示例3解决具体错误。在开发中当遇到“CORS错误”时我直接将错误信息贴给AI“我的React应用运行在localhost:3000后端API在localhost:5000前端请求后端时出现了CORS错误。我的Express后端应该怎么配置” AI准确地告诉我需要安装cors中间件并在Express应用中app.use(cors())。它甚至解释了在生产环境中可能需要配置特定源。核心技巧与AI协作编程提问的质量决定答案的质量。不要问“怎么写代码”而要问“如何用[技术栈]解决[具体问题]”。提供上下文、描述清楚输入输出、说明你已经尝试过什么。把AI当作一个经验丰富但需要精确指令的结对编程伙伴。6. 部署到Vercel的完整流程与配置将全栈应用React前端 Node.js后端API部署到Vercel需要一点配置但过程非常顺畅。6.1 项目根目录配置首先确保你的项目有一个清晰的目录结构。推荐将前后端代码放在同一个Git仓库中但分属不同文件夹如/client和/server。在项目根目录下创建一个vercel.json配置文件这是指导Vercel如何构建和部署的关键。// vercel.json { builds: [ { src: server/index.js, // 指定后端入口文件 use: vercel/node // 使用Node.js运行时 }, { src: client/package.json, // 指定前端构建配置 use: vercel/static-build, // 使用静态构建 config: { distDir: build } // 构建输出目录Create React App默认是build } ], routes: [ { src: /api/(.*), // 将所有以 /api 开头的请求 dest: server/index.js // 路由到后端Serverless Function }, { src: /(.*), // 将所有其他请求静态资源、页面路由 dest: client/build/$1 // 路由到前端静态文件 } ] }这个配置告诉Vercel两件事1) 将/server目录下的代码作为Serverless Function部署2) 将/client目录构建成静态文件并配置路由规则让API请求走后端页面请求走前端。6.2 前后端代码适配后端Server适配由于Vercel的Serverless Function是无服务器函数你的Express应用需要被包装成一个函数导出而不是直接监听端口。通常你需要创建一个类似server/api/index.js的文件根据vercel.json的src配置调整路径内容如下// server/index.js 或 server/api/index.js const express require(express); const app express(); const cors require(cors); // ... 引入你的路由和中间件 app.use(cors()); app.use(express.json()); // 定义你的API路由例如 app.get(/api/show-hn-posts, async (req, res) { // ... 你的业务逻辑 res.json(posts); }); // 关键导出为Vercel Serverless Function处理程序 module.exports app; // 或者如果你需要更底层的处理可以导出为一个函数 // module.exports (req, res) app(req, res);前端Client适配在React应用中你需要将API请求的基地址从本地开发时的http://localhost:5000改为生产环境的相对路径。因为前后端现在部署在同一个域名下你可以直接使用/api。// 在生产环境中直接使用 /api const API_BASE_URL process.env.NODE_ENV development ? http://localhost:5000 : ; fetch(${API_BASE_URL}/api/show-hn-posts)使用Create React AppCRA创建的项目运行npm run build后会在client/build目录生成优化后的静态文件。Vercel的vercel/static-build构建器会自动执行这个命令。6.3 连接GitHub与自动部署将你的代码推送到GitHub仓库。登录Vercel点击“New Project”。导入你的GitHub仓库Vercel会自动检测到vercel.json配置文件。在配置页面Vercel会识别出这是一个包含前后端的项目并显示构建配置预览。通常无需修改直接点击“Deploy”。部署完成后Vercel会为你生成一个唯一的URL如your-project.vercel.app。此后每次你向GitHub仓库的主分支推送代码Vercel都会自动触发一次新的部署。整个过程几乎无需手动干预服务器配置真正实现了“Git Push即部署”。7. 开发中遇到的典型问题与解决方案在构建这个项目的过程中我踩过不少坑这里把几个有代表性的问题和解决方法记录下来希望能帮你避坑。7.1 问题一Hacker News API请求限制与429错误现象在开发阶段频繁刷新页面或后端抓取逻辑写得不好时偶尔会收到HTTP 429Too Many Requests错误。原因分析Hacker News的公开API虽然没有明确的速率限制文档但显然不欢迎过于频繁的请求。我的初始代码在每次前端请求时后端都去实时抓取500个故事详情这很容易触发限制。解决方案引入缓存层如前所述这是根本解决方案。在后端对处理好的帖子数据做缓存至少5-10分钟内直接返回缓存数据。降低请求频率前端不要设置过短的自动刷新间隔比如几秒钟。用户手动刷新是合理的但自动刷新可以设置为5-10分钟一次。优化抓取逻辑使用并发控制避免瞬间发起大量请求。在批次之间添加微小延迟setTimeout模拟人类浏览行为。错误重试与降级在代码中添加重试逻辑例如遇到429错误等待2秒后重试一次。如果最终失败优雅地返回缓存中的旧数据或友好的错误提示给前端。7.2 问题二外部链接抓取超时或失败导致前端渲染卡顿现象页面加载很慢有时甚至超时控制台报错。原因分析后端在“富化”帖子时需要去抓取每个帖子外部链接的内容。有些网站可能响应很慢有些可能屏蔽了爬虫这会导致fetch或axios请求挂起拖慢整个API的响应速度。解决方案设置严格的超时为每个外部链接的抓取请求设置超时例如3-5秒。可以使用Promise.race或者axios的timeout配置。const controller new AbortController(); const timeoutId setTimeout(() controller.abort(), 5000); // 5秒超时 try { const response await fetch(url, { signal: controller.signal }); clearTimeout(timeoutId); // ... 处理响应 } catch (error) { if (error.name AbortError) { console.log(Fetch timeout for ${url}); } // 处理其他错误 }异步处理与缓存分离不要在主API请求同步流程中等待所有外部链接抓取完成。可以采用“懒加载”或“后台作业”思路。主API先返回基础数据标题、作者等。前端收到后立即渲染。摘要和图片的抓取作为一个异步任务完成后更新缓存。下次API请求时就直接返回已缓存好的富化内容。这样API响应速度极快。使用Headless浏览器服务的谨慎考量对于一些依赖JavaScript渲染的现代网站简单的HTTP抓取拿不到内容。虽然可以用Puppeteer等无头浏览器但这会极大增加资源消耗和复杂度。对于这个项目我选择放弃这部分内容因为性价比太低。我们的降级方案就是显示“暂无摘要”和默认图片。7.3 问题三像素风CSS在不同浏览器下的兼容性问题现象在Chrome上看起来不错的像素边框和阴影在Safari或Firefox上可能表现不一致。原因分析CSS的box-shadow和image-rendering等属性在不同浏览器引擎中的渲染细节有细微差别。解决方案使用浏览器前缀对于image-rendering: pixelated;可以加上各种浏览器前缀以增强兼容性。.pixel-image { image-rendering: -moz-crisp-edges; /* Firefox */ image-rendering: -webkit-crisp-edges; /* Safari */ image-rendering: pixelated; /* Standard */ image-rendering: crisp-edges; /* Fallback */ }简化效果拥抱差异复古风格本身带有一种“不完美”的美学。只要核心的字体、颜色和方块感出来了不同浏览器间阴影的轻微差异有时可以接受。确保在高对比度模式下也能看清内容。充分测试在部署前至少在Chrome、Firefox、Safari的最新版本上查看一下效果。Vercel提供的预览链接非常适合做跨浏览器测试。7.4 问题四Vercel部署后API路由404现象本地开发一切正常但部署到Vercel后前端无法访问/api/show-hn-posts返回404。原因分析这是Vercel部署中最常见的问题。通常是因为vercel.json中的routes配置不正确没有将/api/*请求正确路由到Serverless Function。后端Serverless Function的文件路径或导出方式不符合Vercel的预期。排查步骤检查vercel.json确保routes里有一条规则将/api/(.*)路由到你的后端入口文件如server/index.js。检查后端入口文件是否在正确的位置并且使用module.exports导出了Express app或处理函数。登录Vercel控制台进入项目的“Functions”标签页。这里会列出所有部署的Serverless Function。查看你的API函数是否在列以及其日志中是否有错误信息。日志是排查部署问题的第一手资料。确保你的package.json中包含了所有必要的依赖express,cors,node-fetch等并且没有将某些依赖错误地放在devDependencies里生产环境不会安装devDependencies。通过系统性地实施缓存、优化请求、设置超时和降级方案并仔细配置部署这个聚合器应用最终能够稳定、快速地运行为用户提供一个流畅的浏览“Show HN”项目的体验。整个开发过程也让我深刻体会到将清晰的思路与AI工具的高效执行力结合能如何显著地提升个人项目的落地速度。

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