VB6销售管理系统源码解析:环境搭建、核心模块与避坑指南

简介:这是一套面向VB6初学者与数据库入门者的销售管理系统完整源码,采用VB6.0结合SQLServer2000开发,可用于学习VB与SQLServer之间的连接、查询与数据操作。系统已实现产品信息录入、产品管理、查询打印、金额汇总及简单报表等模块,登录界面截图直观展示了运行效果,SQL2000数据库脚本单独存放于SQL目录,便于还原数据库环境。压缩包共51个文件,约1.37MB,以frm窗体与frx资源文件为主体,配合bas模块、cls类模块、vbp工程文件及ocx控件,另有sql脚本、db数据库与jpg截图等,结构完整,可直接在VB6中打开研究。目前已有441人学习参考,适合作为课程设计、毕业设计或自学练手的范例,帮助读者理解窗体事件、报表控件与数据库访问的配合方式,快速积累VB数据库项目经验。

1. 从一份 VB6 销售管理源码说起:老框架里藏着多少真东西

翻到一份 VB6 + SQL Server 的销售管理系统完整源代码,第一反应不是“这语言太老了”,而是“这套东西居然还能跑”。VB6 在 2024 年的今天确实属于上古技术栈,但国内大量中小企业的进销存、销售开单、库存对账系统,底层仍然是这套组合。原因很直接:业务逻辑稳定、部署成本低、维护人员好找。这份源码包覆盖了销售管理最核心的几个模块——商品资料、客户档案、销售开单、退货处理、库存查询、报表统计,数据库端用 SQL Server 做持久化,前端用 VB6 做界面和业务逻辑。适合两类人:一是需要快速搭一套销售管理原型的小团队,二是想通过完整项目理解 C/S 架构数据库编程的开发者。它不是什么新潮技术,但胜在完整、能跑、逻辑清晰,拿来拆解学习或者二次开发都比从零写起省事得多。

2. 环境搭建与数据库还原:让这套老代码先跑起来

2.1 运行环境选型与依赖清单

VB6 项目对运行环境有硬性要求,不是随便装个 Windows 就能编译。先把依赖理清楚,再动手装,能省掉大量“玄学”报错。

组件推荐版本说明
操作系统Windows 7 / Windows 10 32位64位系统需要额外处理兼容性
VB6 IDEVisual Basic 6.0 SP6必须打 SP6 补丁,否则部分控件注册失败
SQL ServerSQL Server 2008 R2 或 2012更高版本需调整连接字符串
MDACMDAC 2.8数据访问组件,Win10 需手动安装
报表组件Crystal Reports 9 或 DataReport源码中报表模块依赖此组件

装 VB6 的时候有个血泪经验:安装程序会检测系统里有没有 Java 虚拟机,没有就卡住。解决办法是先在安装目录下建一个空的JVM文件夹,骗过检测。装完 VB6 后立刻打 SP6 补丁,再装 MDAC,最后装 SQL Server。顺序错了,后面控件注册会各种翻车。

2.2 数据库还原与连接配置

源码包里一般会带一个.bak备份文件或者.sql建库脚本。我一般优先用.sql脚本,因为版本兼容性更好,不容易出现“备份集来自不同服务器”的报错。

-- 先建库 CREATE DATABASE SalesDB ON PRIMARY ( NAME = 'SalesDB_Data', FILENAME = 'D:\SQLData\SalesDB_Data.mdf', SIZE = 50MB, FILEGROWTH = 10MB ) LOG ON ( NAME = 'SalesDB_Log', FILENAME = 'D:\SQLData\SalesDB_Log.ldf', SIZE = 20MB, FILEGROWTH = 5MB ); GO -- 建一个专用登录名,别用 sa CREATE LOGIN sales_user WITH PASSWORD = 'Sales@2024'; GO USE SalesDB; CREATE USER sales_user FOR LOGIN sales_user; ALTER ROLE db_owner ADD MEMBER sales_user; GO

这段脚本做了三件事:建库时显式指定数据文件和日志文件的路径与增长策略,避免默认路径磁盘爆满;创建独立登录名而不是直接用 sa,方便权限控制;把用户加入 db_owner 角色,保证源码里的建表、增删改查都能执行。参数上,初始大小给 50MB 是保守值,实际数据量大可以调到 200MB,FILEGROWTH 设 10MB 比按百分比增长更可控。

数据库还原后,打开 VB6 项目,找到数据库连接模块。通常是一个.bas文件或者窗体里的ConnectionString属性。把连接字符串改成:

' 在模块级变量中定义连接字符串 Public Const CONN_STR As String = _ "Provider=SQLOLEDB.1;" & _ "Persist Security Info=False;" & _ "User ID=sales_user;" & _ "Password=Sales@2024;" & _ "Initial Catalog=SalesDB;" & _ "Data Source=127.0.0.1" ' 打开连接的通用函数 Public Function OpenConnection() As ADODB.Connection Dim conn As New ADODB.Connection On Error GoTo ErrHandler conn.ConnectionTimeout = 10 conn.Open CONN_STR Set OpenConnection = conn Exit Function ErrHandler: MsgBox "数据库连接失败:" & Err.Description, vbCritical Set OpenConnection = Nothing End Function

连接字符串里几个关键参数:Provider=SQLOLEDB.1是 SQL Server 的 OLE DB 提供程序,比 ODBC 快;Persist Security Info=False表示连接打开后不保留密码信息,安全一些;ConnectionTimeout=10设 10 秒超时,避免界面卡死。如果 SQL Server 装在本机默认实例,Data Source写127.0.0.1或(local)都行;如果是命名实例,要写成127.0.0.1\实例名。

2.3 工程引用与控件注册

VB6 项目打开后,先看“工程 → 引用”里有没有缺失的引用项。常见的有Microsoft ActiveX Data Objects 2.8 Library、Microsoft Data Report Designer 6.0、Crystal Reports 9 ActiveX Designer Run Time Library。缺哪个就勾哪个,勾不上说明组件没装。

控件方面,销售管理系统常用到MSFlexGrid、DTPicker、CommonDialog、ListView、TreeView。这些.ocx文件在源码包的控件文件夹里一般都有,用regsvr32注册:

# 以管理员身份运行 CMD,逐个注册 regsvr32 MSFLXGRD.OCX regsvr32 COMCTL32.OCX regsvr32 COMDLG32.OCX regsvr32 MSCOMCTL.OCX regsvr32 MSCOMCT2.OCX

注册成功会弹“DllRegisterServer 成功”的提示。如果报“找不到指定模块”,先确认文件路径没有中文和空格,再检查是不是 64 位系统把 32 位控件注册到了错误的位置。32 位控件必须用C:\Windows\SysWOW64\regsvr32.exe来注册,直接双击regsvr32可能调用的是 64 位版本,注册不上。

3. 核心模块拆解:销售开单、库存扣减与事务处理

3.1 销售开单的业务逻辑与代码实现

销售开单是整个系统的核心,涉及商品选择、数量录入、单价计算、折扣处理、金额汇总、保存入库。VB6 里通常用一个主窗体加若干辅助窗体来实现。主窗体上放MSFlexGrid显示明细,下面放合计金额的Label,工具栏放“新增”“保存”“删除行”“打印”按钮。

保存逻辑不是简单的一条 INSERT,而是“主表 + 明细表”的联动写入。主表存单头信息(单号、客户、日期、总金额),明细表存每行商品(单号、商品编码、数量、单价、金额)。常见做法是用 ADO 的事务来保证一致性:

' 保存销售单的主逻辑 Public Function SaveSalesOrder( _ ByVal strOrderNo As String, _ ByVal lngCustomerID As Long, _ ByVal dtOrderDate As Date, _ ByRef arrItems() As Variant) As Boolean Dim conn As ADODB.Connection Dim cmd As ADODB.Command Dim i As Integer Dim dblTotal As Double Set conn = OpenConnection() If conn Is Nothing Then Exit Function ' 开启事务,任何一步失败都回滚 conn.BeginTrans On Error GoTo Rollback ' 第一步:插入单头 Set cmd = New ADODB.Command cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO SalesOrder " & _ "(OrderNo, CustomerID, OrderDate, TotalAmount) " & _ "VALUES (?, ?, ?, ?)" cmd.Parameters.Append cmd.CreateParameter("OrderNo", adVarChar, adParamInput, 20, strOrderNo) cmd.Parameters.Append cmd.CreateParameter("CustomerID", adInteger, adParamInput, , lngCustomerID) cmd.Parameters.Append cmd.CreateParameter("OrderDate", adDate, adParamInput, , dtOrderDate) cmd.Parameters.Append cmd.CreateParameter("TotalAmount", adDouble, adParamInput, , 0) cmd.Execute ' 第二步:循环插入明细,同时累加总金额 dblTotal = 0 For i = LBound(arrItems) To UBound(arrItems) Set cmd = New ADODB.Command cmd.ActiveConnection = conn cmd.CommandText = "INSERT INTO SalesOrderDetail " & _ "(OrderNo, ProductCode, Quantity, UnitPrice, Amount) " & _ "VALUES (?, ?, ?, ?, ?)" cmd.Parameters.Append cmd.CreateParameter("OrderNo", adVarChar, adParamInput, 20, strOrderNo) cmd.Parameters.Append cmd.CreateParameter("ProductCode", adVarChar, adParamInput, 30, arrItems(i, 0)) cmd.Parameters.Append cmd.CreateParameter("Quantity", adDouble, adParamInput, , arrItems(i, 1)) cmd.Parameters.Append cmd.CreateParameter("UnitPrice", adDouble, adParamInput, , arrItems(i, 2)) cmd.Parameters.Append cmd.CreateParameter("Amount", adDouble, adParamInput, , arrItems(i, 1) * arrItems(i, 2)) cmd.Execute dblTotal = dblTotal + arrItems(i, 1) * arrItems(i, 2) Next i ' 第三步:回写单头总金额 conn.Execute "UPDATE SalesOrder SET TotalAmount = " & dblTotal & _ " WHERE OrderNo = '" & strOrderNo & "'" conn.CommitTrans SaveSalesOrder = True conn.Close Exit Function Rollback: conn.RollbackTrans MsgBox "保存失败,已回滚:" & Err.Description, vbCritical SaveSalesOrder = False conn.Close End Function

这段代码的关键点在于事务边界。BeginTrans之后,单头插入、明细插入、总金额回写三步要么全成功,要么全回滚。如果不用事务,明细插到一半报错,数据库里就会留下一条没有明细的“孤儿单头”,对账的时候能把人逼疯。参数化查询用CreateParameter而不是拼字符串,既防 SQL 注入,也避免日期和字符串格式问题。arrItems是个二维数组,第一维是行号,第二维依次是商品编码、数量、单价。

3.2 库存扣减的并发控制与触发器方案

销售开单保存后,库存要同步扣减。最简单的做法是在保存逻辑里加一条 UPDATE:

UPDATE Inventory SET Quantity = Quantity - @Qty WHERE ProductCode = @Code AND Quantity >= @Qty;

但这里有个并发问题:两个人同时卖同一件商品,库存只剩 1 件,两个人都查库存够,都执行扣减,结果库存变成 -1。VB6 时代常见的解决方案有三种:一是用 SQL Server 的UPDLOCK提示锁住行;二是把扣减逻辑放到存储过程里,用事务包住;三是用触发器自动扣减。

我一般推荐存储过程方案,逻辑集中、好维护:

CREATE PROCEDURE sp_DeductInventory @ProductCode VARCHAR(30), @Qty DECIMAL(18,4), @Result INT OUTPUT AS BEGIN SET NOCOUNT ON; BEGIN TRANSACTION; UPDATE Inventory WITH (UPDLOCK, ROWLOCK) SET Quantity = Quantity - @Qty WHERE ProductCode = @ProductCode AND Quantity >= @Qty; IF @@ROWCOUNT = 0 BEGIN SET @Result = -1; -- 库存不足 ROLLBACK TRANSACTION; RETURN; END SET @Result = 0; COMMIT TRANSACTION; END

UPDLOCK在读取时加更新锁,防止其他事务同时读到同一行;ROWLOCK把锁粒度控制在行级,避免锁表。@@ROWCOUNT = 0说明库存不足,直接回滚并返回 -1。VB6 端调用时用ADODB.Command执行存储过程,检查@Result输出参数决定是否继续。

注意:触发器方案虽然省事,但调试困难,而且嵌套触发器容易出死锁。如果源码里用的是触发器,建议改成存储过程调用,可控性高很多。

3.3 报表模块的数据源与打印输出

销售管理系统离不开报表:销售日报、月报、客户对账单、库存预警表。VB6 时代主流方案是 DataReport 或 Crystal Reports。DataReport 是 VB6 自带的,部署简单,但样式调整麻烦;Crystal Reports 功能强,但运行时要装客户端组件。

源码里如果用的是 DataReport,数据源通常是一个ADODB.Recordset或者DataEnvironment。绑定的时候注意字段名要和报表设计器里拖的字段一致,否则运行时报“字段不存在”。打印之前先调DataReport1.Show预览,再调PrintReport输出到打印机。

' 销售日报的报表加载逻辑 Private Sub LoadDailyReport(ByVal dtDate As Date) Dim rs As ADODB.Recordset Dim strSQL As String strSQL = "SELECT OrderNo, CustomerName, ProductName, " & _ "Quantity, UnitPrice, Amount " & _ "FROM v_SalesDetail " & _ "WHERE OrderDate = '" & Format(dtDate, "yyyy-mm-dd") & "' " & _ "ORDER BY OrderNo" Set rs = OpenConnection().Execute(strSQL) Set DataReport1.DataSource = rs DataReport1.Refresh DataReport1.Show End Sub

这里用了一个视图v_SalesDetail把单头、明细、客户、商品四张表关联好,报表端直接查视图,不用在 VB6 里拼复杂 SQL。日期格式化用yyyy-mm-dd,避免区域设置导致的日期解析错误。如果数据量大,报表加载会卡,可以在视图里加索引或者限制查询范围。

4. 避坑与排查:老项目里那些让人后悔药的坑

4.1 连接字符串报错“未找到提供程序”

现象:运行程序时弹窗提示“未找到提供程序。该程序可能未正确安装”。原因通常是 MDAC 没装或者版本不对,也可能是连接字符串里Provider写成了SQLNCLI但系统里只有SQLOLEDB。解决:先确认 MDAC 2.8 已安装,再把Provider改成SQLOLEDB.1。如果 SQL Server 是 2012 以上,也可以试SQLNCLI11,但 VB6 对它的兼容性不如SQLOLEDB稳。

4.2 控件注册失败“DllRegisterServer 返回 0x8002801C”

现象:用regsvr32注册.ocx时报错,错误码0x8002801C。原因是权限不够或者控件被占用。解决:以管理员身份运行 CMD,先taskkill /f /im vb6.exe关掉 VB6,再注册。如果还不行,检查.ocx文件是否被杀毒软件隔离了,加白名单后重试。

4.3 保存销售单时提示“事务已在处理中”

现象:点保存按钮,弹“事务已在处理中”或者“连接忙”。原因是上一次操作的事务没提交或回滚,连接对象还挂着。常见于代码里On Error Resume Next吞掉了错误,导致Rollback没执行。解决:在错误处理里强制If conn.State = adStateOpen Then conn.RollbackTrans,然后conn.Close再重新打开。更彻底的办法是每次操作都用新的连接对象,不要全局复用一个Connection。

4.4 报表打印出来是空白页

现象:DataReport 预览正常,打印出来只有空白。原因是报表的PaperSize或Printer属性没设对,或者数据源在Show之后被释放了。解决:在Show之前调DataReport1.Printer.PaperSize = vbPRPSA4,并且确保Recordset在报表关闭前不要Set rs = Nothing。如果用的是 Crystal Reports,检查打印机驱动是否匹配,换一个通用驱动试试。

4.5 库存扣减后对不上账

现象:销售单保存成功,但库存数量和实际差了几个。原因通常是扣减逻辑和保存逻辑不在同一个事务里,保存成功但扣减失败,或者扣减成功但保存回滚了。解决:把扣减库存的存储过程调用放到销售单保存的同一个事务里,用同一个Connection对象执行。如果源码里是分开的,改成在SaveSalesOrder的CommitTrans之前调用sp_DeductInventory,检查返回值,失败就整体回滚。

5. 二次开发与验证:从能跑到好用还差哪几步

源码能跑起来只是第一步,真正拿去用还得做几件事。第一是加操作日志,谁在什么时候改了哪张单,出问题能追溯。VB6 里可以在每个保存函数末尾插一条INSERT INTO OperationLog,记录用户 ID、操作类型、单号、时间戳。第二是加数据校验,比如数量不能为负、单价不能为零、客户必须选。这些校验放在界面层和数据库层各做一遍,界面层给提示,数据库层用CHECK约束兜底。

验证方法上,我一般会跑三个场景:一是正常开单,看库存扣减和报表数据是否一致;二是并发开单,用两个客户端同时卖同一件库存只剩 1 的商品,看是否只有一个成功;三是异常回滚,故意在明细里插一条不存在的商品编码,看单头和明细是否都没写进去。这三个场景过了,基本逻辑就稳了。

-- 验证库存和销售明细是否对得上 SELECT p.ProductCode, p.ProductName, p.StockQty AS 当前库存, ISNULL(SUM(d.Quantity), 0) AS 累计销售, p.InitQty - ISNULL(SUM(d.Quantity), 0) AS 理论库存 FROM Product p LEFT JOIN SalesOrderDetail d ON p.ProductCode = d.ProductCode LEFT JOIN SalesOrder o ON d.OrderNo = o.OrderNo AND o.Status = '已审核' GROUP BY p.ProductCode, p.ProductName, p.StockQty, p.InitQty HAVING p.StockQty <> p.InitQty - ISNULL(SUM(d.Quantity), 0);

这条 SQL 查的是“当前库存”和“期初库存减累计销售”不一致的商品。如果查出来有记录,说明扣减逻辑有漏单或者重复扣减。我每次改完库存相关的代码,都会跑一遍这个校验,确认没有差异才继续。

从那以后我每次拿到老 VB6 项目,都强制先跑一遍环境依赖检查、再还原数据库、最后用这条对账 SQL 验一遍数据一致性,三步走完才动手改代码。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

华为交换机初始化与SSH/Telnet远程登录配置实战指南

华为交换机初始化与SSH/Telnet远程登录配置实战指南

1. 为什么初始化与远程登录配置是网络工程师的第一道坎刚拿到一台崭新的华为交换机&#xff0c;或者接手一台被前任管理员改得面目全非的设备&#xff0c;第一件事永远是把它恢复到可管理的状态&#xff0c;然后配好远程登录通道。这件事听起来简单&#xff0c;但我在实际项目里…

2026/10/20 22:50:29 阅读更多 →
NX CAM二次开发:批量创建电极程序组的C#实现

NX CAM二次开发:批量创建电极程序组的C#实现

做模具编程的朋友应该都有这种体会——一套模具下来&#xff0c;电极少说十几个&#xff0c;多的时候四五十个。每个电极在程序顺序视图里至少要建粗加工、精加工、清角三个程序组&#xff0c;命名还得严格按照项目规范来。以前我都是手动在NX里一个个新建、一个个改名&#xf…

2026/10/20 22:49:27 阅读更多 →
通信基站学习指南:从硬件架构到网络优化的系统路径

通信基站学习指南:从硬件架构到网络优化的系统路径

通信基站学习资料的存量非常大&#xff0c;大到哪怕你只收集和“通信基站相关学习链接”沾边的资料&#xff0c;也能在一个晚上攒下一百多个收藏。真正的问题从来不是找不到资源&#xff0c;而是资源一多&#xff0c;就不知道按什么顺序读、读哪一版、读到什么程度才算会。我在…

2026/10/20 22:49:27 阅读更多 →

最新新闻

Agent工程栈五层拆解:任务编排、工具调用、记忆管理、可观测性与多Agent协作

Agent工程栈五层拆解:任务编排、工具调用、记忆管理、可观测性与多Agent协作

1. 从五条动态里拆出来的工程信号10 月 7 日那天&#xff0c;我关注的几个技术社区里集中冒出来五条动态&#xff0c;主题各不相同&#xff0c;但放在一起看&#xff0c;指向的是同一件事&#xff1a;Agent 这套东西&#xff0c;正在从"演示能跑"往"工程能交付&…

2026/10/20 23:28:02 阅读更多 →
PPT认知工程:信息压缩、视觉锚点与逻辑呼吸感

PPT认知工程:信息压缩、视觉锚点与逻辑呼吸感

1. “PPT-Master”不是软件名&#xff0c;而是一类人的隐性职业标签最近在几个技术协作群和高校教学支持论坛里&#xff0c;频繁看到有人用“PPT-Master”自称或称呼他人——不是指某款叫这个名字的工具&#xff0c;也不是某个开源项目&#xff0c;而是一种带着自嘲又带点敬意的…

2026/10/20 23:28:02 阅读更多 →
AI Agent架构与任务规划算法深度解析:复杂任务系统的工程选型指南

AI Agent架构与任务规划算法深度解析:复杂任务系统的工程选型指南

过去一个多月&#xff0c;我把主流可查的AI Agent架构、任务规划算法和复杂任务处理系统从头到尾梳理了一遍&#xff0c;同时在自建的任务集上跑了一轮对比实验。起因是某公司准备上一套复杂任务处理平台&#xff0c;我被拉去做前期技术调研&#xff0c;给后续选型提供判断依据…

2026/10/20 23:28:02 阅读更多 →
XML大文件解析与树形查看器:从DOM到延迟加载的完整实践

XML大文件解析与树形查看器:从DOM到延迟加载的完整实践

简介&#xff1a;XMLViewer是一款面向开发者、测试人员及数据处理用户的轻量XML查看工具&#xff0c;核心用途是快速打开并浏览XML文件&#xff0c;清晰展示节点层级结构&#xff0c;同时辅助检测语法是否正确&#xff0c;减少手动排查标签不匹配、缩进异常等问题的成本&#x…

2026/10/20 23:28:02 阅读更多 →
ASP.NET值班管理系统:排班规则建模与EF Core领域设计

ASP.NET值班管理系统:排班规则建模与EF Core领域设计

简介&#xff1a;这是一套基于ASP.NET Web Forms开发的值班管理信息系统&#xff0c;面向初学者与中小型单位信息化建设者&#xff0c;解决排班登记、人员调度、值班记录查询等日常行政管理痛点。系统采用B/S架构&#xff0c;适配Windows Server 2003VS2010开发环境&#xff0c…

2026/10/20 23:28:02 阅读更多 →
SST-2评测任务配置逐项拆解:从64条开发样本到可复现评测

SST-2评测任务配置逐项拆解:从64条开发样本到可复现评测

1. 评测任务配置的底层逻辑&#xff1a;为什么一个配置文件值得逐项拆解很多人第一次接触评测框架时&#xff0c;注意力都放在模型本身——参数量、推理速度、准确率曲线。但真正跑过几轮完整评测的人会慢慢意识到&#xff0c;决定评测结果是否可信的&#xff0c;往往不是模型&…

2026/10/20 23:26:59 阅读更多 →

日新闻

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/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#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 阅读更多 →