Spring Boot+Vue农产品溯源系统:从批次管理到二维码溯源

1. 项目背景与方案定位

做毕设或者项目练手,只要涉及“管理系统”四个字,十有八九离不开 Spring Boot 加 Vue 这套组合。而“农产品溯源”又是个特别适合拿来当业务载体的题材:它既有清晰的角色划分,又有完整的业务流程,从田间到餐桌的每个环节都能对应到数据记录,做出来的东西不是那种纯增删改查的玩具,而是真正有业务逻辑在里面的系统。

这套系统解决的核心问题很简单:消费者扫个码想看到手里的菜从哪来、谁种的、什么时候采摘的、中途怎么运输的;监管方想快速定位一批问题农产品的流通范围;生产企业想把自己的产品信息透明化以建立品牌信任。三个角色的诉求落到系统里,就是一套完整的“生产档案 + 批次管理 + 流转记录 + 扫码查询”的功能链条。

我当初拿到这个题目时的第一反应是:千万别把“溯源”做成“记录”。有些版本的系统打着溯源的旗号,其实就是一个农产品信息的 CRUD,种养记录、检测记录、运输记录全做成独立表单,用户真要查的时候得翻好几页。真正能打的溯源系统,核心一定是一条贯穿始终的批次号——所有环节的信息都挂在这个批次上,前端扫码拿到批次号,就能把整条链的数据一次性拉出来。这个思路的差异,直接决定了系统是“能用”还是“好用”。

整个系统面向的对象大致分四类:超级管理员负责全局配置和账号管理,生产企业负责录入自己产品的生产加工信息,检测机构上传质检报告,消费者和监管人员通过扫码或输入批号查询完整溯源档案。角色不用太复杂,但权限边界必须清晰,这既是业务需要,也是做权限模块时的天然练习场景。

技术上没有悬念:后端 Spring Boot 加 MyBatis Plus,前端 Vue 加 Element UI,数据库 MySQL。这套选型的理由特别朴素——资料多、坑少、招人认。你真要在毕设里换成 Spring Cloud 或者微服务那一套,反而显得为了技术而技术,溯源系统这类业务体量,单体应用绰绰有余,而且部署起来省心得多。

2. 核心功能模块拆解

2.1 角色权限体系的设计思路

溯源系统的角色划分,我建议直接做成五类:管理员、生产企业、种植基地、检测机构、消费者。前四个是后台管理端的角色,消费者的入口在独立的溯源查询页面。

这里有个容易踩的坑:很多人做权限管理时喜欢用拦截器硬编码判断角色,比如写一堆if (roleId == 1)之类的逻辑。初期看着挺顺,等角色一多、需求一改,维护成本直接起飞。更合理的做法是用 Spring Security 加 JWT 做认证授权,把权限控制从“代码硬编码”升级为“配置驱动”。

具体的实现思路是这样的:用户登录成功后,后端生成一个带角色信息的 JWT 返回给前端。前端把 Token 存到本地,每次请求时在请求头里带上Authorization: Bearer <token>。后端在 Spring Security 的过滤器链里解析 Token,把用户信息和权限列表塞进 SecurityContext。

权限的粒度控制在“接口级”就够了,不需要细到按钮级。比如:

@PreAuthorize("hasRole('ENTERPRISE')") @PostMapping("/product/add") public Result addProduct(@RequestBody Product product) { // 只有生产企业角色可以新增产品 }

再配合 Vue 前端的路由守卫做菜单显隐控制。有人会问:前端都控制了,后端为啥还要再控制一遍?因为前端的控制只是用户体验,真正的安全边界必须靠后端兜底。你永远不知道用户会不会用 Postman 直接调接口。

2.2 追溯链核心:批次管理

批次是整个溯源系统的灵魂。一个批次的完整生命周期要经历:种植/养殖记录、加工记录、质检记录、仓储记录、物流记录、销售记录。每一步都要挂在同一个批次号下面。

我建议批次号的规则用日期加序列号:BATCH + 年月日 + 四位流水号,比如BATCH202506120017。这种规则的好处是:第一,按时间维度可查;第二,流水号保证了唯一性;第三,生成逻辑简单,不会重码。

批次相关的核心表设计大概是:

CREATE TABLE t_batch ( id BIGINT PRIMARY KEY AUTO_INCREMENT, batch_no VARCHAR(32) UNIQUE NOT NULL COMMENT '批次号', product_id BIGINT NOT NULL COMMENT '关联产品', origin_place VARCHAR(100) COMMENT '产地', produce_date DATE COMMENT '生产日期', shelf_life INT COMMENT '保质期(天)', status TINYINT COMMENT '0-生产中 1-已入库 2-已发货 3-已售完', create_time DATETIME, update_time DATETIME );

批次的流转记录我单独建了一张表t_batch_trace:批次号、环节类型、操作者、操作时间、备注、还有一张图片 URL。消费者扫码之后,前端拿到的数据就是这条批次的所有环节记录,按时间正序渲染成一条时间线,一眼就能看明白从生产到销售的全过程。

2.3 二维码溯源查询模块

二维码的设计其实就是把批次号编码进去。项目里用现成的工具生成二维码,方案有两种:

一是直接用 Google 开源的 ZXing 库生成图片。在 Java 后端里写一个工具类:

public BufferedImage createQrCode(String content, int width, int height) { QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 遍历 BitMatrix 填充像素,生成黑白二维码图片 return image; }

二是交给前端用插件生成,后端只提供批次号接口。但更稳妥的做法是后端生成二维码图片,把图片存储后返回 URL,前端直接渲染图片链接。省去了前端集成插件的复杂度,同时二维码里可以顺带加上系统地址前缀,消费者扫出来直接跳转到溯源页面。

扫码后的查询逻辑不复杂,就是根据二维码内容里的批次号调后端接口:

@GetMapping("/trace/query/{batchNo}") public Result queryTrace(@PathVariable String batchNo) { // 1. 查询批次基本信息 // 2. 查询该批次所有溯源环节记录 // 3. 查询对应的产品信息 // 4. 组装返回 }

有个细节要提醒一下:二维码生成的目录权限千万不要给 root。有些项目部署在 Linux 服务器上,启动用户跑的 root,生成的二维码图片权限变成root:root,后面前端上传图片或其他用户写入同一目录时很容易出权限冲突。用专门的图片存储目录,启动用户单独配好写权限,省得排半天错。

3. 数据模型与后端接口落地

3.1 核心表结构一览

除了前面提到的批次表和批次追溯表,整套系统还需要这几张核心表:

第一张是用户表。基本字段外,需要设计好role_id和enterprise_id(非管理员关联所属企业)。这样用户登录后,系统能自动识别这个账号能操作哪些数据。比如一个生产企业账号,它只能维护本企业的产品和批次,不能看到其他企业的数据,这就是“数据权限”的雏形。

第二张是产品表。字段可以包括产品名称、类别、规格、单位、保质期、生产企业 ID、产品图片、产品介绍。产品作为批次的上层概念存在,一个产品下面可以有多个批次,毕竟农产品不是工业品,一批一批的出,每批情况都不一样。

第三张是溯源环节记录表。这里我建议用环节类型 + 详细记录 + 图片的组合,而不是每种环节建一张表。原因很实际:种植、加工、物流这三类信息的核心结构都类似——谁在什么时间点做了什么操作,只是具体内容不同。统一到一张表,用trace_type字段区分,查询时按批次号过滤即可。这种做法虽然后期写报表时灵活性稍差,但整体数据结构清爽太多。

还有个比较隐蔽但重要的表:检测报告表。农产品的检测信息是消费者最关心的,系统性设计时,让生产企业录入检测结果但不允许修改,质检机构的账号才有变更权限。这种不对称的权限设计能模拟出真实的业务约束,也能在答辩时讲出业务逻辑的深度来。

3.2 后端接口设计与分层

后端分层按常规来:Controller 接收请求、Service 处理业务、Mapper 访问数据库。但这里要格外注意事务的用法。

以“新增批次并登记溯源信息”为例:

@Transactional(rollbackFor = Exception.class) public void addBatch(BatchVO vo) { // 1. 生成批次号 // 2. 保存批次主表 // 3. 保存生产环节的溯源记录 // 4. 如果产品已设置默认质检项,初始化检测记录 }

事务必须放在 Service 层,并且rollbackFor要显式指定为Exception.class。不然 Spring 默认只回滚 RuntimeException,如果业务代码里抛了受检异常,数据就处于半提交状态。这个问题非常隐蔽,大部分人第一次遇到时都会一脸懵,查半天才发现是事务配置的问题。

接口统一返回结构也很重要。我习惯用 Result 包装类,结构固定为code + message + data。

@Data public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> result = new Result<>(); result.setCode(200); result.setMessage("操作成功"); result.setData(data); return result; } }

统一返回值的好处是前端处理逻辑完全一致:请求发出后先判断code是否是 200,是就取data,不是就提示message。不用为每个接口单独解析错误格式。全局异常处理器再兜个底,把系统内部异常统一转换为友好提示,避免把堆栈信息直接抛给前端。

3.3 前端页面与交互细节

前端页面主要涉及五块:登录页、后台管理主页、产品管理、批次管理、溯源查询展示页。

登录页没什么好说的,Element UI 的表单加验证规则就能搞定。后台管理主页走经典的左侧菜单 + 右侧内容区布局。菜单根据角色权限动态生成,这个前面说过。

产品管理页面是一个典型的列表 + 弹窗表单组合。列表用el-table展示产品数据,支持分页;点击新增或编辑时弹出对话框,表单里放产品名称、分类、规格、保质期等字段;图片上传走文件接口,后端保存文件后返回存储路径,前端提交的是相对路径而不是 Base64。

批次管理页面要稍微复杂一些。列表展示批次基础信息,操作列有“详情”和“添加溯源记录”两个按钮。点击详情,跳转到溯源时间线页面,或者直接用抽屉组件拉出详情面板。添加溯源记录时,用户选择环节类型(种植/加工/质检/物流),填写说明并上传图片,数据提交到溯源记录表。

溯源查询展示页就是面向消费者的 H5 页面。页面不需要左侧菜单和系统框架,纯粹展示:上方是产品图片和名称,中间是批次信息,下方是一条一条的溯源时间线。用 Element UI 的el-timeline组件就能实现,效果很直观。

有个前端开发的细节:在 Vue 项目里配置axios请求拦截器时,务必对返回的code做统一判断。比如code不等于 200 时,弹出错误提示并返回false;如果code等于 401(Token 过期),自动跳转到登录页并清除本地登录状态。这个处理不做,用户操作过程中 Token 过期会一直报错且无法自动恢复。

4. 部署与运维实战

4.1 前后端构建配置

部署分两步走:后端打包成 jar,前端构建成静态文件。

后端部分用 Maven 打包命令:

mvn clean package -DskipTests

打出来的 jar 包直接用java -jar启动。这里要注意配置文件里数据库连接的信息,生产环境建议把配置外置化,用启动命令覆盖:

java -jar trace-system.jar --spring.profiles.active=prod --server.port=8080

application-prod.yml 里配置生产环境的数据库地址、Redis 地址、文件存储路径等。好处特别明显:换一台服务器部署时,不用重新打包,只需要把外置的配置文件或者启动参数改一下,jar 包能直接用。

前端构建命令:

npm run build

构建产物生成在dist目录,把这个目录下的静态文件拷贝到 Nginx 的html目录即可。

4.2 Nginx 配置要点

Nginx 在这里不只是托管静态文件,还得做接口转发。生产环境前后端分离部署时,前端地址走 80 端口,后端接口走 8080 端口,跨域问题由 Nginx 转发解决。

关键配置如下:

server { listen 80; server_name your-domain.com; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

两个细节必须说清楚。

try_files那行是防止前端路由刷新时出现 404。Vue 的 history 模式在浏览器直接刷新某个子路由路径时,Nginx 会去查找对应的物理文件,找不到就报 404。加上try_files ... /index.html之后,所有找不到的路径都会回退到首页,由前端路由自行解析。

proxy_pass http://127.0.0.1:8080/这里的结尾斜杠也很讲究。带了斜杠,转发时会把/api/前缀去掉,比如请求/api/trace/query/BATCH202506120017会被转发到后端http://127.0.0.1:8080/trace/query/BATCH202506120017。这要求后端接口路径不额外加/api前缀,加不加看两端约定,但前后必须对齐,否则一上线接口就全挂。

4.3 部署时的几个常见坑

第一个坑是端口占用。服务器上同时跑着其他服务时,8080 端口冲突是常有的事。启动前先检查:

netstat -tlnp | grep 8080

有进程占用就换个端口,同时记得把 Nginx 转发配置里的端口同步改掉。

第二个坑是数据库初始化。首次部署时,数据库脚本不一定是最新的,有些建表语句可能漏了字段。建议自己多核对几遍建表脚本,最好在新库上完整跑一遍,确认所有表都能建出来、字段完整,别等部署完发现某个接口报 Unknown column。

第三个坑是图片访问路径。前端展示产品图片或者溯源记录图片时,图片路径如果存的是本地绝对路径,在服务器上部署时路径不对就会全部 404。我在后端写了一个虚拟映射:

@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { String uploadPath = System.getProperty("user.dir") + "/upload/"; registry.addResourceHandler("/upload/**") .addResourceLocations("file:" + uploadPath); } }

这样图片的实际存储路径和访问路径就解耦了。数据库里存/upload/2025/06/12/xxx.png,浏览器直接就能访问,不用关心文件具体在哪个目录,部署时也不用改数据。

5. 常见问题与排查技巧

5.1 登录后接口返回 401

这个问题几乎每个做 JWT 项目的人都会遇到,通常原因是前端请求头没带 Token,或者 Token 在拦截器里校验失败。

排查顺序先从前端看起。打开浏览器的开发者工具,切到 Network 标签,点开任意一个需要登录的接口,查看请求头里有没有Authorization字段。如果没有,就是 axios 请求拦截器没生效,检查拦截器里是否从 localStorage 取到了 Token。

如果请求头有 Token 但还是 401,那就看服务端日志。服务端抛出的异常如果是JwtException,大概率是 Token 过期或者被篡改;如果是其他异常,需要看具体堆栈信息。建议在后端过滤器里打详细日志,把 Token 解析失败的真正原因打出来,不然排查的效率会非常低。

5.2 扫码能查到批次,但时间线顺序是乱的

溯源时间线的排序问题说起来不复杂,但确实影响体验。农产品从生产到销售,各个环节发生的真实时间未必是按录入顺序排列的,直接用创建时间排序在高并发录入时会乱。

我的做法是在业务层面控制:录入溯源记录时,让前端把环节时间作为独立业务字段传给后端,查询时按trace_time ASC排序,而非默认的create_time。字段一拆,顺序就永远是对的。

5.3 文件上传失败,提示目录不存在

一般服务器上首次部署时最容易出现这个问题。项目刚启动,upload目录还没创建,而代码里直接写文件会因为没有父目录而报错。

两种解决方式:一是提前手动创建目录;二是在代码里做兜底逻辑:

File dir = new File(uploadPath); if (!dir.exists()) { dir.mkdirs(); }

我更推荐第二种,因为换服务器部署时不需要额外操作。注意是mkdirs()不是mkdir(),如果路径多级,前者会递归创建所有缺失的目录。

5.4 数据库连接超时

系统跑了一会儿之后,第一次操作特别卡,甚至报连接超时,这是典型的 MySQL 连接空闲超时问题。默认的wait_timeout为 8 小时,连接池里的连接长时间没被使用,数据库服务端就把连接断了,但连接池不知道,下次拿出来的还是断了的连接。

最简单的处理方式是在数据库连接池的配置文件中加两个配置项:

spring: datasource: druid: test-while-idle: true validation-query: SELECT 1

让连接池在空闲期间主动检测连接的有效性,发现失效自动抛弃并重建。这个问题不处理,每过一段时间系统就会抽风一次,而且越是使用频率低的接口越容易触发。

6. 项目优化与扩展方向

基础版本跑通之后,可以从几个方向深入优化,让它从一个“能跑的项目”升级为“有亮点的项目”。

第一个方向是引入 Redis 缓存热点数据。扫码查询是高频读操作,同一批次的溯源信息可能在同一时间被大量用户同时查询。把扫码查询的结果缓存到 Redis,设置五分钟过期,能显著降低数据库压力。这是性价比极高的一处优化,改动量不大,但性能提升立竿见影且容易在答辩时讲清楚。

第二个方向是给追溯链加上区块链概念。现在很多溯源系统的宣传点都在“数据不可篡改”。技术上完全引入区块链太重了,但可以做一个简化版本的思路:对每条溯源记录生成一个哈希值,存到独立的校验表中,查询时对哈希校验,数据被改动就能发现。不需要真的去搭区块链节点,但这个设计能体现出对业务本质的理解。

第三个方向是增加数据可视化大屏。管理端加一个统计页面,展示各企业的产品数量、批次分布、溯源查询量等指标。用 ECharts 画柱状图和饼图,视觉冲击力强,答辩时也更好演示。

第四个方向是接入短信验证码登录。消费者查询溯源信息时不强制登录,但生产企业如果需要回复消费者的问题,可以增加一个手机号验证码登录的轻量认证方式。需要一个短信服务商的接口,大多数平台都提供免费试用额度,毕设项目够用。

7. 写在最后的一点经验

前后端分离项目最怕的从来不是某个技术难点,而是数据流没捋顺就动手写代码。做这个溯源系统之前,我先把表的 ER 图和接口文档定义好,每个接口的入参出参在前端和后端各写一份,两端的同学(或者未来的自己)照着文档对接,联调时少说要省一半的时间。

另外,演示用的数据一定要真实感强。不要录那种“测试123”“苹果产品”之类的数据。认真编几条像样的溯源档案:某地的苹果,种植环节写清果园地址和施肥记录,加工环节写清分拣和包装流程,物流环节写清运输车辆和温度记录。演示时扫出这样一条完整的时间线,比任何代码层面的炫技都更有说服力。

这套系统做完以后,我自己最大的收获是:明白了业务流程梳理比代码更重要。技术选型再新、代码写得再漂亮,如果业务流转逻辑不对,系统交付给真实用户就是废的。农产品溯源系统虽然只是一个常见的业务场景,但把这个思路吃透,往后遇到进销存、供应链、资产管理之类的系统,设计思路基本都能直接迁移。一个项目值不值得投入精力,评判标准就是这个项目能让你沉淀出多少可复用的方法论,而不是代码量本身。

相关新闻

多模态Agent如何自主规划UI测试路径:视觉与DOM融合实战

多模态Agent如何自主规划UI测试路径:视觉与DOM融合实战

1. 多模态 Agent 做 UI 测试&#xff0c;到底难在哪UI 测试这件事&#xff0c;做过的人都懂——写起来不难&#xff0c;维护起来要命。一个按钮挪了位置、一个弹窗改了文案、一个加载动画多转了半秒&#xff0c;传统基于选择器的脚本就可能集体罢工。而多模态 Agent 的介入&…

2026/10/20 9:11:59 阅读更多 →
基于YOLOv12的冰箱内食物识别检测系统:从YOLOv8到v12的优化实践

基于YOLOv12的冰箱内食物识别检测系统:从YOLOv8到v12的优化实践

每个在家做饭的人&#xff0c;应该都有过这种经历&#xff1a;翻遍冰箱找不到那半盒牛奶&#xff0c;等找到时它已经成了冰箱深处一罐散发着存在感的“历史文物”。我决定做一个能自动看懂冰箱内容的系统&#xff0c;最终交付的东西&#xff0c;就是标题里那套“基于深度学习YO…

2026/10/20 9:11:59 阅读更多 →
JEB安卓逆向实战:从APK解析到脚本化批量分析

JEB安卓逆向实战:从APK解析到脚本化批量分析

做安卓逆向这几年&#xff0c;工具换了一茬又一茬&#xff0c;但JEB一直稳稳躺在我的主力工具列表里。可能有人会说&#xff0c;jadx够用了&#xff0c;还要JEB干什么&#xff1f;真到了分析恶意样本、追踪协议算法、调smali数据流的时候&#xff0c;你才会明白JEB这套东西的价…

2026/10/20 9:11:59 阅读更多 →

最新新闻

UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一诊断服务&#xff09;这个缩写&#xff0c;在车载电子圈里几乎每天都会碰到。做ECU开发的人要跟诊断仪打交道&#xff0c;做测试的人要对着诊断报文调参数&#xff0c;做车联网的人要解析诊断数据——但真正能把UDS…

2026/10/20 10:05:47 阅读更多 →
pyVideoTrans实战:从语音识别到自动配音的视频翻译工具指南

pyVideoTrans实战:从语音识别到自动配音的视频翻译工具指南

简介&#xff1a;pyVideoTrans是一款开源的视频翻译配音工具&#xff0c;主要面向视频创作者、字幕翻译者和需要批量处理音视频的用户&#xff0c;可将一种语言视频自动生成指定语言字幕并完成配音。它集成语音识别、字幕翻译、配音合成、字幕格式转换、人声分离、音视频合并与…

2026/10/20 10:05:47 阅读更多 →
YALMIP资源下载与安装全指南:MATLAB路径配置、求解器接口与避坑实战

YALMIP资源下载与安装全指南:MATLAB路径配置、求解器接口与避坑实战

简介&#xff1a;YALMIP 官方 R20230609 版资源包&#xff0c;是面向 MATLAB 环境下运筹优化、自动控制及算法研究者的完整建模工具箱&#xff0c;可用来快速构建与求解线性规划、二次规划、混合整数规划、非线性规划以及动态最优控制问题。压缩包共 1307 个文件&#xff0c;以…

2026/10/20 10:05:47 阅读更多 →
51单片机智能交通灯:车流感知与自适应配时实现

51单片机智能交通灯:车流感知与自适应配时实现

简介&#xff1a;本资源是一套完整的智能交通灯控制器嵌入式开发实践包&#xff0c;面向电子类、自动化及物联网方向的本科课程设计、毕业设计与单片机初学者&#xff0c;解决交通信号系统动态调度算法实现与软硬件联合验证问题。压缩包共17个文件&#xff0c;86KB&#xff0c;…

2026/10/20 10:05:47 阅读更多 →
dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

先提个问题&#xff1a;你写 Flutter 代码时&#xff0c;有没有经历过这种“工具人时刻”——定义一个对象&#xff0c;判空&#xff0c;取值&#xff0c;塞进构造器&#xff0c;再判空&#xff0c;再赋值……一个本该两行说完的逻辑&#xff0c;硬生生被样板代码撑出十行。想用…

2026/10/20 10:05:47 阅读更多 →
AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

最近总有人拿着检测报告截图来问我&#xff1a;论文AIGC疑似比例飙到六成以上&#xff0c;学校通知延期&#xff0c;怎么办&#xff1f;说实话&#xff0c;看到这种局面我心里也替人着急&#xff0c;但更着急的是&#xff0c;很多人的第一反应是冲去找“去AI痕迹神器”&#xf…

2026/10/20 10:04:46 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50: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/20 9:50:45 阅读更多 →