Node.js+Vue+ThinkPHP实战:构建农产品一物一码溯源系统
1. 先把技术角色拆清楚这套溯源系统里 Node.js、Vue、ThinkPHP 分别管什么1.1 农产品溯源本质上是在做一条完整的数据链农产品溯源听起来是个很“概念化”的东西好多项目做到最后就变成一个二维码加一个详情页。但真去基地里蹲过一段时间就会知道溯源系统要解决的核心问题不是“扫得出”而是“可信”。消费者扫一个码看到的信息必须能对应到真实的种植批次、加工时间、检测报告、物流节点甚至具体到某个大棚的温湿度记录。这些数据如果靠人工录入一个 Excel 再导进系统基本等于没有溯源。所以我做这套系统时第一件事不是写代码而是把数据链条理清楚种植/养殖环节记录农事操作和环境数据加工环节记录批次号和操作人仓储环节记录出入库时间物流环节记录运输轨迹销售环节记录门店和上架日期。每个环节都要有“谁在什么时间录入了什么数据”的痕迹。系统只是把这个链条数字化让每一批农产品都拥有一份可查询、可追溯的电子档案。1.2 三套技术不是平级关系而是按各自优势分工很多人看到“Node.js Vue ThinkPHP”这种组合会觉得奇怪Node.js 本身就能写后端为什么还要用 ThinkPHPVue 又夹在中间起什么作用实际上这三者在这套系统里承担的是完全不同的工作谁也不抢谁的活。技术栈承担的角色选择它的核心原因Node.js数据采集层、文件处理层、视频流分发层异步事件驱动模型适合对接传感器、轮询物联网设备处理大量并发连接不阻塞Vue用户扫码端页面、企业管理后台页面单页应用交互体验好组件化开发方便把溯源时间轴、图表、报告预览拆成独立模块ThinkPHP业务后台 API 服务成熟稳定RBAC 权限、数据库模型、表单验证开箱即用适合维护核心业务逻辑简单说ThinkPHP 管业务数据Node.js 管设备和流Vue 管界面。三者通过 HTTP 接口和 WebSocket 通信互不干扰。这种混合架构在真实项目里很常见尤其是农业项目需要对接各种硬件采集设备的时候Node.js 的优势会被放大。有朋友问我能不能直接用 Node.js 把 ThinkPHP 的活也干了当然能但要看你团队的维护能力。农业类项目的后台经常要跟现有的 ERP、进销存系统对接PHP 生态里现成的对接方案更多招人也相对容易。我的原则是核心业务逻辑尽量用团队最熟悉的框架边缘的、高并发的、涉及硬件的部分再交给 Node.js 去扛不要为了统一技术栈把简单事情搞复杂。2. 环境搭建的第一道坎Node 装好了npm 却运行不了2.1 Node.js 下载安装与环境变量配置的完整过程做这个项目的第一步就是装环境。不管你是 Windows 还是 macOS建议去 Node 官网下载 LTS 版本别追最新版有些包还没跟上新版本的节奏装上容易踩坑。Windows 安装时有个关键选项——安装向导会问是否要“Add to PATH”一定要勾上。如果当时没勾后面 node 命令能识别npm 命令却找不到就是因为 npm 的路径没有写入系统环境变量。安装完了先验证一下node -v npm -v能正常输出版本号说明环境基本就绪。如果提示“node 不是内部或外部命令”打开系统设置里的环境变量把 Node 安装目录默认是C:\Program Files\nodejs\加到Path里然后重新打开终端。Mac 上推荐用 nvm 管理 Node 版本装多个版本切换方便避免把系统目录搞乱。2.2 npm.ps1 报“禁止运行脚本”的根因和彻底修复这个报错应该困扰过不少刚接触 Vue 的人。Windows 上执行 npm 安装命令时终端会蹦出这么一段npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本。 有关详细信息请参阅 https://go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。刚开始我以为是 Node 装坏了重装了好几遍后来才发现问题根本不在 Node而在 PowerShell 的执行策略。Windows 默认把脚本执行策略设成了Restricted而 npm 本身是个.ps1脚本PowerShell 在受限策略下拒绝运行任何脚本文件。解决办法很简单用管理员身份打开 PowerShell执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这里解释一下RemoteSigned的含义本地创建的脚本允许执行从网上下载的脚本必须经过受信任的发布者签名。这是比较稳妥的策略既能跑 npm又不会完全放开限制。改完之后执行Get-ExecutionPolicy确认一下当前用户的策略会显示RemoteSigned然后再开一个终端试试npm -v。如果你不想动执行策略也有两种备选方案一是直接用命令提示符cmd运行 npm因为 cmd 不检查 PS1 策略二是手动调用npm.cmd文件比如把命令写成npm.cmd install。但说实话改执行策略是最省心的一劳永逸后面跑 Vue 脚手架、装依赖都要靠它。2.3 Vue 项目初始化和 ThinkPHP 运行前的准备Vue 这边的初始化我推荐直接用官方脚手架Vue 3 项目用create-vue创建执行npm create vuelatest它会交互式询问要不要装 Router、Pinia、ESLint 等按需选择就行。如果是老项目要维护 Vue 2也可以用全局安装vue/cli后执行vue create。装依赖的时候经常遇到网络慢的问题我习惯提前把镜像源切到国内官方镜像npm config set registry https://registry.npmmirror.comThinkPHP 这边需要先有 PHP 环境和 Composer。项目目录下执行composer create-project topthink/think tp这个命令会把 ThinkPHP 的骨架代码拉到tp目录里。然后在.env文件里配置数据库连接再执行php think run如果看到类似Server started on http://127.0.0.1:8000的输出就说明 ThinkPHP 已经跑起来了。这段环境准备看起来很碎但恰恰是后面所有联调工作的地基。我见过太多项目死在这一步不是 Node 装错版本就是 npm 权限问题要么就是 PHP 扩展没启用导致框架页能打开、数据库却连不上。3. 让“一物一码”真正成立数据库表结构与接口设计3.1 核心表结构产品批次、溯源节点、设备数据各司其职溯源系统的数据核心不是“一张大表全装”而是按环节拆表靠批次 ID 关联。我设计的核心表大致分四块product产品表存放农产品基础信息比如名称、品种、产地、图片。这是静态数据几乎不变。product_batch产品批次表同一产品不同批次的种植时间、采收时间、检测结论、负责人。消费者扫码后看到的“这一批果子”的信息主要查的就是这张表。trace_node溯源节点表记录批次经历过的每个环节比如施肥、灌溉、采收、加工、出库、运输、上架。每个节点有时间、地点、操作人、备注和图/视频附件。device_data设备数据表存放来自 Node.js 采集的传感器数据比如空气温湿度、土壤湿度、光照强度按时间戳落库数量会很大后续要考虑分表。建表的关键是外键关系的清晰。以product_batch表为例字段大致如下CREATE TABLE product_batch ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, product_id INT UNSIGNED NOT NULL COMMENT 产品ID, batch_no VARCHAR(64) NOT NULL COMMENT 批次号, trace_code VARCHAR(64) NOT NULL COMMENT 溯源码, plant_date DATE NULL COMMENT 种植日期, harvest_date DATE NULL COMMENT 采收日期, detect_result TINYINT NOT NULL DEFAULT 0 COMMENT 0未检测 1合格 2不合格, responsible VARCHAR(50) NULL COMMENT 负责人, create_time DATETIME NOT NULL, UNIQUE KEY uk_trace_code (trace_code) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT产品批次表;trace_code必须加唯一索引这是扫码查询的唯一入口也是防止重复生成的关键。产品表和批次表分开建是因为同一款农产品可能有多批同一批的溯源信息是共享的分开存才能避免重复录入产品详情。3.2 溯源码的生成逻辑不能简单用自增 ID这是我在实际项目里吃过亏的地方。最早图省事溯源码直接用数据库自增 ID结果被用户一眼看穿规律批量扫码就能把所有批次数据扒走。后来改成“时间前缀 随机数 校验位”的方式// ThinkPHP 生成溯源码 function generateTraceCode($batchId) { $prefix date(ymdHis); $random str_pad(random_int(0, 9999), 4, 0, STR_PAD_LEFT); $rawCode $prefix . $batchId . $random; // 简单校验位取字符 ASCII 之和模 10 $sum 0; $len strlen($rawCode); for ($i 0; $i $len; $i) { $sum ord($rawCode[$i]); } return $rawCode . ($sum % 10); }这样生成出来的码看起来是一串无规律的数字但服务器端可以重新算一次校验位快速判断码是否被输错。再把唯一索引加上去并发情况下也不会生成重复码。用户端扫码后后端拿到trace_code先去批次表查存在再去溯源节点表查链路两层查询逻辑清晰。3.3 ThinkPHP 后端如何输出溯源接口ThinkPHP 6 的路由可以直接映射到控制器方法。我的做法是建一个api应用模块所有接口都走控制器返回 JSONnamespace app\api\controller; use think\facade\Db; use think\Response; class Trace { public function detail($code ) { if (empty($code)) { return json([code 400, msg 溯源码不能为空]); } $batch Db::name(product_batch) -where(trace_code, $code) -find(); if (!$batch) { return json([code 404, msg 未找到该溯源信息]); } $nodes Db::name(trace_node) -where(batch_id, $batch[id]) -order(node_time asc) -select(); // 检测报告可能是一张图或 PDF把完整路径返回 $report $batch[detect_result] 1 ? Db::name(detect_report)-where(batch_id, $batch[id])-find() : null; return json([ code 0, data [ batch $batch, nodes $nodes, report $report, ] ]); } }接口的粒度按场景控制。用户扫码只需要一个detail接口管理端则要拆成批次列表、节点新增、节点编辑、数据统计等独立接口避免把一个接口做得过重。4. Vue 端怎么把溯源链路做成真正好看又好用的页面4.1 用户扫码页一条时间轴串联所有环节前端页面里用户扫码后最关心的不是某个字段值而是“这些东西是从哪来的”。所以我没有做一个普通的列表而是把溯源节点渲染成一条时间轴按时间顺序展开每个节点展示环节名称、时间、地点和现场照片。对用户来说这种形式的可信度感比表格高很多。核心实现很直接Vue 3 的组合式 API 写起来很顺template div classtrace-page div classsearch-box input v-modelcode placeholder请输入溯源码 keyup.enterqueryTrace / button :disabledloading clickqueryTrace查询/button /div div v-iferrorMsg classerror{{ errorMsg }}/div section v-iftraceData.nodes traceData.nodes.length classtimeline div v-fornode in traceData.nodes :keynode.id classtimeline-item div classdot/div div classcontent h4{{ node.node_name }}/h4 p{{ node.node_time }} · {{ node.location }}/p p{{ node.remark }}/p /div /div /section /div /template script setup import { ref } from vue import { getTraceDetail } from /api/trace const code ref() const loading ref(false) const errorMsg ref() const traceData ref({ nodes: [] }) async function queryTrace() { const value code.value.trim() if (!value) { errorMsg.value 请输入溯源码 return } loading.value true errorMsg.value try { const res await getTraceDetail(value) if (res.code 0) { traceData.value res.data } else { errorMsg.value res.msg } } finally { loading.value false } } /script用户扫码通常是从微信里扫码打开 H5 页面所以这个页面必须做移动端适配CSS 上用 flex 布局加合理的间距就够了不需要引入太重量的 UI 框架。4.2 管理端动态路由与权限控制管理后台要区分不同角色——基地管理员能录入节点质检员能提交检测报告普通员工只能查看。Vue Router 4 支持动态路由注册后端返回该角色能访问的菜单前端用router.addRoute逐个添加这样没权限的页面在路由层面就被拦住了。一个常见的坑是刷新页面后动态路由丢失。因为路由是在登录后通过用户信息动态加的一刷新整个 Vue 应用重新加载路由就还原了。解决方法是把用户菜单信息放到 Pinia 或 localStorage在router.beforeEach里判断如果已有用户但还没有注册动态路由先执行一次菜单拉取和addRoute再next({ ...to, replace: true })重新进入目标页面。这个细节不处理后台就会出现“登录后刷新变成空白页”的诡异问题。4.3 环境数据图表和检测报告预览产地环境数据用 ECharts 渲染折线图效果很直观。把 Node.js 采集的温湿度数据按小时聚合前端拿到数组往里塞就行const chart echarts.init(document.getElementById(envChart)) chart.setOption({ xAxis: { type: category, data: timeList }, yAxis: { type: value }, series: [ { name: 温度, type: line, data: tempList }, { name: 湿度, type: line, data: humidityList } ] })还要提醒一个点检测报告通常是 PDF 文件Vue 里直接用img是显示不了的。我在项目里用iframe :srcpdfUrl内嵌预览兼容性比embed好。如果要求更高可以集成 PDF.js 自己做阅读器但一般的溯源查询场景iframe 足够。5. 这套系统里 Node.js 真正不可替代的两个环节5.1 物联网传感器数据采集与接口转发农业溯源最有价值的数据其实是种植过程中的环境数据大棚里的温度、湿度、土壤 EC 值、光照强度。这些数据如果靠人工填基本都会变成“填表数据”没人愿意天天记录。所以我在基地部署了几个环境监测传感器通过 Node.js 读取并定时上报到 ThinkPHP 接口。传感器的通信协议很多是 Modbus RTU一个串口能挂多台设备。Node.js 在这里的优势非常明显异步非阻塞模型可以同时轮询多个串口设备不会因为某个设备响应慢拖累整条采集链路。代码大致这样const ModbusRTU require(modbus-serial) const cron require(node-cron) const client new ModbusRTU() async function readSensor() { try { await client.connectRTUBuffered(/dev/ttyUSB0, { baudRate: 9600 }) const data await client.readHoldingRegisters(0, 6) const temperature data.data[0] / 10 const humidity data.data[1] / 10 await fetch(http://127.0.0.1:8000/api/device/upload, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ deviceId: greenhouse-01, temperature, humidity, collectedAt: new Date().toISOString() }) }) } catch (e) { console.error(读取传感器失败, e) } } cron.schedule(*/10 * * * *, readSensor)Node.js 采集到数据后统一转发给 ThinkPHP 接口落库。这样设计的好处是前端展示和业务查询仍然走 ThinkPHPNode.js 只负责跟硬件打交道职责单一出了问题也好排查——传感器没数据先看 Node 日志接口报错再看 PHP 日志不用两边瞎猜。5.2 批量二维码生成与视频流处理溯源系统的二维码需要在批次创建后自动生成并且要支持批量导出打印。Node.js 的qrcode包很好用几行代码就能把二维码输出成图片文件const QRCode require(qrcode) const path require(path) async function generateQR(code, batchNo) { const filePath path.join(__dirname, qr, ${batchNo}.png) await QRCode.toFile(filePath, code, { width: 300, margin: 2 }) } module.exports { generateQR }ThinkPHP 在创建批次后可以通过命令行调用这个 Node 脚本也可以反过来让 Node 监听 ThinkPHP 数据库的批次表新数据出现就自动生成二维码。我倾向后者因为 Node 做这事本身就是异步友好的大批量生成几百个二维码时不会阻塞业务接口。再说视频流。基地里装了监控摄像头后刚开始只是简单的 RTSP 拉流在网页上播放但直接推流对带宽压力很大手机上经常卡顿。后来我用 ffmpeg 把 RTSP 流转成 HLS 切片放到指定目录让 Node.js 做一个静态文件服务Vue 端用hls.js播放。这里有个重要的兼容性坑大多数浏览器的原生video是不支持直接播放 m3u8 格式的视频流的必须通过 hls.js 把 m3u8 转换成 Media Source Extensions 能识别的格式再塞给 video 元素。所以网上会看到那么多“vue播放m3u8免安装”的搜索就是因为这个问题太常见了。import Hls from hls.js const video document.getElementById(camera) if (Hls.isSupported()) { const hls new Hls() hls.loadSource(/stream/greenhouse-01.m3u8) hls.attachMedia(video) }这套方案跑下来效果很稳定手机端只要网络正常基本能做到秒开、低延时。6. 联调部署阶段踩过的坑和收尾经验6.1 跨域配置ThinkPHP 允许跨域Vue 开发环境做转发因为前端 Vue 和后端 ThinkPHP 是分离的开发时一个跑在 5173 端口一个跑在 8000 端口跨域问题避免不了。我的处理方案是双管齐下ThinkPHP 端配置跨域响应头Vue 开发环境的 devServer 配置接口转发把/api开头的请求统一转发到后端地址。ThinkPHP 里可以写一个全局中间件来处理响应头// app/middleware.php namespace app\middleware; class AllowCrossDomain { public function handle($request, \Closure $next) { $response $next($request); $response-header([ Access-Control-Allow-Origin *, Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS, Access-Control-Allow-Headers Content-Type, Authorization, Access-Control-Max-Age 86400, ]); return $response; } }注意Access-Control-Allow-Origin设为*只适合公开接口溯源查询。如果涉及到管理后台登录、上传文件这些带状态的操作建议改成具体域名否则会有安全风险。Vue 开发环境的配置重点是所有请求都走/api前缀这样改动最小。用户扫码页请求/api/trace/detail?codexxx开发环境识别到/api就转发到http://127.0.0.1:8000/api/...生产环境再把同样路径交给 Nginx 处理。6.2 Nginx 部署时的路径规划项目上线后我建议用 Nginx 统一处理入口把静态页面、PHP 动态请求、Node 服务之间做清晰的路由划分。可以参考下面的对应关系请求路径处理方式/开头且是静态文件直接返回 Vue 打包后的 dist 目录文件/api/开头转发给 ThinkPHP 的public/index.php处理/stream/开头映射到 Node 托管的 HLS 视频切片目录/ws开头转发给 Node 的 WebSocket 服务用于设备实时告警推送这个映射关系里最容易忽略的是 Vue 的前端路由模式。如果用 history 模式用户访问/detail/123这类地址刷新时Nginx 找不到对应文件会报 404需要在配置里加一行try_files $uri $uri/ /index.html;把所有不存在的路径全部回退到 Vue 的入口文件让前端路由接管。6.3 上线后我发现真正该重视的是数据一致性系统的功能全部跑通后我原以为可以松一口气结果真正折磨人的却是几个很小的数据问题。首先是时区。Node.js 默认取的是服务器本地时间PHP 也有自己的时区配置。如果部署的服务器时区不是东八区设备采集数据和扫码记录的时间就会出现偏差。中英文系统、不同云的默认时区都不一样。我最后的处理是PHP 的date_default_timezone_set(Asia/Shanghai)Node 侧统一在从数据库读取时做一次08:00转换数据库连接也把时区指定成东八区保证三层一致。然后是重复数据。设备上报数据偶尔会因为网络重试导致重复插入我在device_data表加了设备 ID 加采集时间戳的唯一索引重复上报直接被数据库挡住不用在业务层做判断。扫码记录同理一个用户同一台设备一天内重复扫同一个码只记录一次避免统计数字虚高。最后是数据库的归档。环境数据一天一条设备就有 144 条记录十台设备一个月就是几万条读起来会越来越慢。我按月分表后历史数据归档到独立库查询接口只查最近三个月性能稳定了很多。这套系统做完最有成就感的反而不是技术上那些花哨的实现而是去基地的时候看到工人真的在用扫码页面查报告看到农户指着手机上的温湿度曲线说“这个准”。农产品溯源本来就是一件建立信任的事技术上把数据链做扎实比把页面做得好看更有意义。如果你也要上手类似项目我建议从环境配置开始就做好记录代码版本管理从第一天建立数据字典尽早统一后面会省掉大量返工的时间。

相关新闻

Python中实现带权重的随机测试

Python中实现带权重的随机测试

前言 「带权重的随机」指的是:从一组候选中抽一个,但每个候选被抽中的概率不相等,而是按给定权重分配。典型场景是抽奖(大奖权重低、谢谢参与权重高)、A/B 实验分流、游戏掉落表、按比例采样测试数据。 很多人第一反应…

2026/10/9 9:45:00 阅读更多 →
向量数据库基准测试为何失真?FineWeb 10b与Supernova实战避坑指南

向量数据库基准测试为何失真?FineWeb 10b与Supernova实战避坑指南

1. 为什么“向量数据库基准测试”正在集体失真?我第一次看到那张标着“Qdrant vs pgvector vs Milvus”的吞吐量对比图时,手边刚跑完一个真实业务查询——结果发现图里排名第一的系统,在我实际场景中响应慢了整整3.7倍。不是单位错了&#xf…

2026/10/9 9:43:59 阅读更多 →
数据库课程设计图书馆管理系统:从ER图到SQL建表的完整方案

数据库课程设计图书馆管理系统:从ER图到SQL建表的完整方案

简介:这是一份《数据库系统原理》课程设计文档——图书馆管理系统,面向正在学习数据库原理、需要完成课程设计报告的高校学生。文档系统阐述了课程设计目的与意义、图书馆信息化项目背景,并完整呈现可行性研究、需求分析与概要设计全过程。重…

2026/10/9 9:43:59 阅读更多 →

最新新闻

PIC18F87J10与PCA9422协同实现电池供电系统的动态电源管理

PIC18F87J10与PCA9422协同实现电池供电系统的动态电源管理

做电池供电的便携设备时,电源管理往往比业务逻辑更让人头疼。之前我把 PCA9422 和 PIC18F87J10 搭在一起做了一套完整的电源管理方案,从硬件设计、I2C 配置、动态调压到低功耗切换都实际跑了一遍。这篇文章就是这次实践的整体记录,核心思路是…

2026/10/9 14:30:56 阅读更多 →
机械设计必看:CATIA、SolidWorks、UG、Pro/E四款软件选型解析

机械设计必看:CATIA、SolidWorks、UG、Pro/E四款软件选型解析

这标题一看就是刚入行的朋友最喜欢问的问题。我当年也是这么过来的,在宿舍里把四款软件装了个遍,挨个折腾,最后才明白一个道理: 没有“最顺手”的软件,只有“最适合你当前做的事情”的软件。 拿着CATIA去画一个简单的…

2026/10/9 14:30:56 阅读更多 →
PCA9422 + TM4C1294:电池供电设备PMIC与MCU协同电源管理设计

PCA9422 + TM4C1294:电池供电设备PMIC与MCU协同电源管理设计

直接上结论:这套“PCA9422 TM4C1294NCZAD”组合,适合做电池供电的工业采集终端、便携式仪表和物联网边缘节点,核心思路是把“实时功率级控制”交给集成化 PMIC,把“充电策略、状态监控、低功耗调度”交给 MCU。我之前在接触这类嵌…

2026/10/9 14:30:56 阅读更多 →
基于PCA9422与TM4C123的低功耗电源管理设计实战

基于PCA9422与TM4C123的低功耗电源管理设计实战

做电源管理的人大多都有过这种经历:板子画完、固件跑通,结果一测功耗,待机电流比预期高一个数量级,电池没撑过两天就报警。真正把功耗压下去,靠的不只是挑几颗低静态电流的LDO,而是整套供电架构和控制策略。…

2026/10/9 14:30:56 阅读更多 →
ArcGIS基础地理空间数据库系统设计:从建库到出图全流程

ArcGIS基础地理空间数据库系统设计:从建库到出图全流程

简介:这份PDF文档面向地理信息系统、测绘与空间数据库方向的学习者与工程技术人员,围绕基于ArcGIS的基础地理空间数据库系统设计展开,帮助读者理解空间数据与属性数据统一管理的整体思路。文档重点讲解空间数据库建库组织、点面体三类数据分类…

2026/10/9 14:30:56 阅读更多 →
CAP理论与数据库分片架构:一致性、可用性与分库分表实战解析

CAP理论与数据库分片架构:一致性、可用性与分库分表实战解析

做分布式系统做了这么久,我发现一个特别有意思的现象:很多人都把CAP背得滚瓜烂熟,一问你“CAP是什么”,张口就来“一致性、可用性、分区容错性,三者不可兼得”。可真到设计一个数据库分片架构的时候,该选什…

2026/10/9 14:29:54 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →