news 2026/9/2 23:58:32

.NET WinForm仓储管理系统通用源码设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET WinForm仓储管理系统通用源码设计与实现

简介:这是一套基于.NET Framework的WinForm仓储管理系统通用源码,适合.NET初学者及需要快速搭建库存管理、出入库等业务模块的开发者。源码采用模块化分层设计,涵盖数据库管理、数据访问层(DAL)、业务逻辑层(BLL)与WinForm界面,并附带库存预警、审批流程等常见业务逻辑,稍作修改即可迁移到不同项目中。压缩包共170个文件,以74个C#源码文件(.cs)为主,同时包含20个资源文件(.resx/.resources)、SQL数据库文件(.mdf/.ldf)、项目配置文件及运行所需的DLL和EXE,整体仅1017KB,便于下载与二次开发。目前已有566人学习下载,适合作为学习分层架构、ADO.NET操作和WinForm界面开发的入门范例。源码中的数据库表结构、工厂模式封装以及日志权限等辅助模块,能帮助开发者理解企业级系统的组织方式,缩短实际项目的开发周期。

1. 项目概述

1.1 核心需求解析

做仓储管理系统(WMS)这件事,在 .NET 圈子里面其实已经不算新鲜了。但如果你去 GitHub 上搜一圈,会发现一个尴尬的局面:要么是拿 Java 写的重型微服务版本,部署一个系统要配 Redis、MQ、Nacos 一堆东西,小仓库根本跑不起来;要么是 .NET Framework 4.5 时代的老代码,连异步都用不了,界面还停在灰不溜秋的 WinForms 原生风格。

这套基于 .NET WinForm 的仓储管理系统通用源码,解决的正是这个痛点:用最成熟稳重的 C/S 架构,搭配 WinForm 桌面客户端,把仓库日常管理中最核心的入库、出库、盘点、库存查询、报表统计全部跑通,同时保留清晰的分层结构和通用设计,让你拿过来改改数据库连接字符串,就能在真实仓库里投入运行。

这套系统适合谁?如果你是刚入行的 .NET 开发,想找一个完整项目来读懂 WinForm 分层架构、SqlHelper 封装、DataGridView 绑定这些核心知识点,它非常适合;如果你是传统制造企业或第三方仓储团队的技术负责人,想用一套不挑服务器配置的轻量方案替代手工台账,它同样够用。选 WinForm 不是因为它"老",而是因为桌面端在局域网仓库场景下有不可替代的优势:响应快、不依赖浏览器兼容性、搞个内网就能跑,加上部署简单——一台 xp/win7/win10 都能跑的机器就搞定。

1.2 技术框架选型

这套系统的技术栈非常经典,但正是这种"经典"让它有了极高的通用性和可维护性。底层基于 .NET Framework 4.x(建议 4.6.1 以上),开发工具用 Visual Studio 2019/2022 都可以,如果电脑上只有 VS2015 也能打开,只是少了语法提示而已。

界面层用 WinForm(Windows Forms),自带的 DataGridView 控件经过封装后能实现列自定义、单元格按钮、行号显示等常见功能;数据访问层用 ADO.NET + SqlHelper 封装类,支持 SQL Server 2008 R2 及以上版本;数据库直接用 SQL Server 自带的 Northwind 风格设计,也可以根据自己仓库的业务进行调整。整套框架遵循经典的三层架构:UI(界面层)→ BLL(业务逻辑层)→ DAL(数据访问层),中间用 Model(实体层)传参。

注意:这套系统建议不要用 EF(Entity Framework),也别用 Dapper 这种轻 ORM。理由很简单——通用源码意味着你要去改它,SQL 写在存储过程和 SqlHelper 里,哪出问题改哪里,对于中小仓库的业务变化来说,这种"看得见摸得着"的方式反而是最高效的。

2. 系统整体设计与模块拆解

2.1 功能模块划分

整套系统按仓库作业流程拆成六个核心模块:基础资料、入库管理、出库管理、库存管理、盘点管理、报表中心。这六个模块不是拍脑袋定的,而是对照着标准仓库日常作业流程来的——先建好货品档案,然后处理入出库单据,接着保证账实一致(盘点),最后通过报表看出经营情况。

基础资料模块管三类东西:货品分类、货品档案、仓库/库区/货位信息。货品档案里除了一般的编码、名称、规格之外,还应该加上货品条码(支持一维码)、默认库位、上下限预警值、计量单位,后面做扫码入库和库存预警都是靠这些字段支撑。这里有一个很多人前期不在意、后期非常痛苦的坑:货品编码规则一定要先定好,建议采用"分类码+流水号"的规则(比如 01-0001),一旦系统上线后再改编码规则,所有历史单据和库存数据都得跟着动,非常痛苦。

入库管理包含采购入库单、退货入库单、其他入库单三种类型。出库管理对应销售出库单、领料出库单、其他出库单。它们底层共用同一套库存流水逻辑,因为从数据库设计角度看,入和出本质都是"往库存事务表插一条记录,然后更新即时库存",区别只在于单据类型和正负方向。这里总结出来最实用的设计是:不要把入库单和出库单各建一套表,而是建一张 StockTransaction(库存事务表)加上 Type 字段来区分,查询和汇总都省事。

盘点管理是整个系统的加分项,很多商业版 WMS 都不一定做得好。它支持按仓库/库区生成盘点单、录入实盘数量、自动生成盘盈盘亏差异表、差异确认后自动调整库存,这是一套完整的闭环流程。报表中心则提供库存台账、收发存汇总表、库存预警表、单据明细表四大类,报表本质上全部走 SQL 存储过程查询,UI 只负责把 DataTable 丢给 DataGridView 或打印控件。

2.2 数据库设计核心要点

数据库是这套系统的灵魂,设计得好不好决定了系统能撑多大的数据量、改起来费不费力。核心表一共有九张:Product(货品表)、Category(货品分类表)、Warehouse(仓库表)、StorageLocation(库位表)、Stock(即时库存表)、StockTransaction(库存事务流水表)、InboundOrder(入库单主表)、InboundOrderDetail(入库单明细表)、OutboundOrder(出库单主表)、OutboundOrderDetail(出库单明细表)。出入库拆主表和明细表是好习惯,因为一张入库单会包含多个货品,主表存单号、供应商、经手人、审核状态等统一信息,明细表再逐行记货品、数量、单价。

库存即时表的唯一性约束很关键:一个货品在同一个仓库同一个库位只能有一条记录,以(ProductId + WarehouseId + LocationId)作为联合唯一索引,这样才能防止并发操作时库存数据错乱。库存事务流水表记录每一次出入库的来龙去脉:单号、货品、仓库、库位、事务类型、变动前数量、变动数量、变动后数量、操作人、操作时间。有了这个表,你才能做真正的追溯——仓库和财务吵架的时候,一查流水就清楚了。

盘点相关表建议直接和事务表打通:盘点单录入实盘数量后,系统自动计算盈亏数,确认后生成一条 StockTransaction 记录(类型为盘点入库或盘点出库),同时把 Stock 表里对应记录的数量改成实盘数。整个过程保证一个事务,避免"库存调了但流水没记"或者"流水记了但库存没动"的不一致问题。

3. 核心功能实现与技术细节

3.1 分层的正确姿势

一套通用源码,最忌讳的就是把代码全堆在 Form 的按钮点击事件里。刚开始改起来很爽,但一旦业务复杂起来,你会发现改一个入库逻辑要同时改入库单界面、库存更新界面、报表界面三处代码,改一处漏一处,查 bug 查到怀疑人生。

这套系统的工程结构推荐分四层:WMS.UI(WinForm 界面层)、WMS.BLL(业务逻辑层)、WMS.DAL(数据访问层)、WMS.Model(实体层)。Model 层最简单,每个数据库表对应一个 C# 类,属性与字段一一对应;DAL 层只写 SQL 和存储过程的调用,返回值统一用 DataTable 或泛型集合;BLL 层做业务校验和流程控制,比如入库单审核时要检查明细行是否为空、是更新库存还是只是保存草稿;UI 层只管绑定数据、收集用户输入、调用 BLL 并弹窗提示结果。

这里我强烈建议在 UI 层和 BLL 层之间再夹一层"瘦瘦的 Service 层",专门处理事务。因为一次入库往往涉及三个操作:插入入库单主表、插入入库单明细表、更新即时库存表并插入事务流水。这三个操作必须处于同一个数据库事务里,任何一个失败都要整体回滚。如果这些代码放在 UI 层的按钮事件里,你能保证前端愿意去写 SqlTransaction 吗?把事务放在 Service 层统一管理,UI 只要调用_inboundService.SaveOrder(order, details),干净利落。

3.2 DataGridView 封装与 UI 实践

WinForm 开发中,DataGridView 是使用率最高的控件,但原生控件用起来有几个让人抓狂的点:自动排序把列顺序打乱、单元格显示"数据库值"而不是用户看得懂的"文本值"、选中行的背景颜色难受。这套系统做了一个简单的DataGridViewHelper静态类来统一处理这些问题。

比较值得借鉴的做法是:给 DataGridView 封装了BindDataSource扩展方法,绑定数据源之前自动关闭自动排序(AutoGenerateColumns = false),然后根据传入的列映射字典生成列。这样即使后台 SQL 改了查询结果的列名,只要列映射对得上,界面不会崩。另外对于仓库场景常用的操作按钮,可以在 DataGridView 中加一个"操作"列,用按钮列来触发行事件,比每行都放一个独立的编辑按钮框要高效得多。

界面布局上,主窗体用左侧菜单(可以用 TreeView 或者 ListBox 做菜单)+ 右侧 Panel 容器,子窗体全部设置为 TopLevel=false 然后加到 Panel 里,这样可以做到无边框的嵌入效果。WinForm 界面美化不是靠各种第三方皮肤——那玩意一到授权和兼容性就出问题,而是靠统一字体(推荐微软雅黑 9pt)、统一控件间距(8px 基准)、统一按钮配色(重点操作用蓝色,删除用红色)来提升整体质感,项目里自带一套BaseForm基类可以全局控制这些。

3.3 库存计算与并发处理

仓储系统的技术核心不在界面,而在库存计算和并发控制。库存逻辑只有一条:当前库存 = 原库存 ± 变动数量。但这句话落地的时候,不同系统设计会走出完全不同的路。

我推荐"事务流水反算"模式:任何时候都不直接去改 Stock 表里的数量,而是只往 StockTransaction 表里插流水,查询库存时用 SUM 聚合流水得出结果。这种设计的好处是永远不用担心数据对不上,只要流水没错,库存就没错。缺点是数据量大时聚合查询会慢,但对于几万条流水的中小仓库完全够用。如果数据量更大,可以在 Stock 表上再加"冗余库存字段",每插一条流水同时更新一下 Stock 表冗余值,以流水为基准定期校验。

并发问题主要出现在两个人同时对同一个货品做入库和出库时。解决思路有两种:悲观锁(SELECT ... WITH (UPDLOCK))和乐观锁(在 Stock 表加 Version 字段,更新时比对 Version)。对于仓储管理这种操作频率不高但准确性要求极高的场景,悲观锁更简单可靠——在事务里先锁住库存行,再执行更新,更新完自动释放,避免两个事务同时把库存改坏。

4. 实操过程与核心环节实现

4.1 环境准备与快速跑通

我拿到这套源码测试时,用的环境是:Windows 11 + Visual Studio 2022 + SQL Server 2019 开发者版。如果你还是 Windows 7 或者旧版 SQL Server,问题也不大——这套系统的 .NET Framework 版本是 4.6.1,兼容 Windows 7 SP1 及更高版本的 Windows 系统。

跑通整个系统只需要五步。第一步,用 Visual Studio 打开解决方案,确认目标框架是 .NET Framework 4.6.1,项目属性里没有奇怪的依赖项;第二步,打开 SQL Server Management Studio,执行项目根目录下的WMS_DB.sql脚本,自动建库建表并插入演示数据;第三步,找到解决方案中WMS.UI项目下的App.config文件,修改connectionString里的服务器地址、用户名、密码,指向你自己的数据库实例;第四步,把WMS.UI设为启动项目,按 F5 编译运行;第五步,用初始化 SQL 脚本里内置的账号(通常是admin / 123456)登录,看一下主界面菜单是否完整。

如果你编译时报CS0246找不到命名空间,基本都是两种原因:一是项目之间的引用没加,解决方案里右键 WMS.UI 项目,添加引用,把 WMS.BLL、WMS.Model 勾上;二是项目目标框架不一致,把全部改成 .NET Framework 4.6.1 再重新生成。

4.2 入库业务完整流水

这里我记录一次真实的入库操作,给你看整个逻辑链。以"采购入库单"为例,界面上选择供应商、仓库、经手人,然后在明细区域添加货品,填写数量、单价,点击保存。此时系统执行的是一组完整动作:

第一步,向 InboundOrder 主表插入一条记录,状态为"草稿";同时向 InboundOrderDetail 明细表插入多行明细。第二步,点击审核后,系统检查明细是否为空、货品是否存在、数量是否大于 0,这些校验通过后才开事务。第三步,针对每一行明细,更新 Stock 表中的库存数量(原有数量 + 入库数量);如果货品和库位在 Stock 表中没有记录,则新增一条。第四步,往 StockTransaction 流水表插入对应的事务记录,变动类型为"采购入库",变动数量为正向。第五步,更新 InboundOrder 主表的状态为"已审核",提交事务。整个过程一个事务回滚,保障数据一致。

功能实现的核心代码长这样(只展示最关键的 DAL 方法骨架):

public bool SaveInboundOrder(InboundOrder order, List<InboundOrderDetail> details) { using (SqlConnection conn = new SqlConnection(_connString)) { conn.Open(); SqlTransaction tran = conn.BeginTransaction(); try { // 1. 插入主表,获取新单号 int orderId = InsertInboundOrder(conn, tran, order); // 2. 循环插入明细 foreach (var item in details) { InsertInboundOrderDetail(conn, tran, orderId, item); // 3. 更新库存 UpdateStock(conn, tran, item.ProductId, item.WarehouseId, item.LocationId, item.Quantity); // 4. 写流水 InsertStockTransaction(conn, tran, order.OrderNo, item, TransactionType.Inbound, item.Quantity); } tran.Commit(); return true; } catch (Exception ex) { tran.Rollback(); throw new Exception("入库保存失败,事务已回滚:" + ex.Message); } } }

你在拿到源码后,如果你的仓库有"先进先出"或者"批次管理"的要求,在这个基础上改起来也不复杂:StockTransaction 表里加一个 BatchNo 字段,出库查询时按批次排序取最早批次即可。这些扩展点我在源码里都加了注释。

4.3 库存盘点对账逻辑

盘点模块很多人做成了"输入实盘数,看一眼差异"就完事,这是不够的。我在这个项目里把盘点做成了全流程:生成盘点单→录入实盘数量→审核差异→调整库存→查看盈亏汇总。

生成盘点单时,系统根据选定的仓库,把 Stock 表中该仓库的所有货品生成盘点明细,账面数量自动带出。仓管员拿着纸档去仓库清点,回来后在界面上录入实盘数量。录入完成点"审核差异",系统计算"盈亏数 = 实盘数 - 账面数",盈亏数不为零的行会进入盈亏明细列表。最后点"确认调整",系统事务性更新库存,并生成盘盈入库或盘亏出库的流水记录。

这个流程里面最容易出问题的点是:盘点确认后才发现有几行漏盘了,想再改。所以我在代码中加了状态机——盘点是"草稿"状态时允许修改;一旦点过"确认调整",盘点单变为"已完成",任何修改都不允许,只能重新生成一张新的盘点单。这个设计可以在源码里直接看到,实际用下来非常稳。

4.4 报表统计实现

报表模块用了一个很朴素但非常实用的方案:SQL 存储过程负责聚合,前端用 DataGridView 展示。没有用第三方报表控件,是因为这种仓库内部使用的报表,关注的是数据准确、打印出来看得清,而 Crystal Reports 或 RDLC 的学习和维护成本对于通用源码的接受者来说太高了。

收发存汇总表是仓库管理最常用也最高频的报表,核心 SQL 是透视查询:按货品、仓库汇总期初结存、本期收入数量、本期发出数量、期末结存。

SELECT p.ProductCode, p.ProductName, ISNULL(SUM(CASE WHEN t.TransType IN ('采购入库','退货入库') THEN t.Quantity ELSE 0 END), 0) AS InQty, ISNULL(SUM(CASE WHEN t.TransType IN ('销售出库','领料出库') THEN t.Quantity ELSE 0 END), 0) AS OutQty, ISNULL(SUM(CASE WHEN t.TransType IN ('采购入库','退货入库') THEN t.Quantity ELSE 0 END), 0) - ISNULL(SUM(CASE WHEN t.TransType IN ('销售出库','领料出库') THEN t.Quantity ELSE 0 END), 0) AS StockQty FROM StockTransaction t JOIN Product p ON t.ProductId = p.Id WHERE t.TransDate BETWEEN @startDate AND @endDate GROUP BY p.ProductCode, p.ProductName

这个思路和实际业务的吻合度非常高。如果你要加入"按供应商统计"或者"按客户统计",只需要在 WHERE 条件加一个维度字段,GROUP BY 加一列,存储过程的改动成本非常低。

5. 常见问题与排查技巧实录

5.1 登录超时和数据库连接问题

这套系统最常见的第一个坑,就是拿到代码后运行,弹出"在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误"。八成是连接字符串里服务器地址不对,或者 SQL Server 的 TCP/IP 协议没启用。排查分三步:第一步,在 SSMS 里确认你的数据库实例名,是SQLEXPRESS还是LOCALDB还是默认实例,直接复制到连接字符串的Server字段;第二步,打开 SQL Server 配置管理器,确认SQL Server 网络配置下的 TCP/IP 已启用;第三步,确认真实账号能登录数据库,不要一上来就用sa密码试,Windows 身份验证的账号也可以直接填进连接字符串。

5.2 部署后的字体和分辨率适配

WinForm 程序在开发机上看着正常,部署到仓库的旧电脑上就出现界面错位、字体发虚、按钮显示不全——这是 DPI 缩放导致的问题。WinForm 默认不支持高 DPI 自动缩放,而 Windows 10/11 普遍默认开了 125% 或 150% 缩放。解决办法是在Program.csMain方法入口加上一行:

[STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } [DllImport("user32.dll")] private static extern bool SetProcessDPIAware();

或者更省事的方式,在app.manifest文件里把<dpiAware>节点设为true。这个改动虽然不起眼,但能让程序在缩放屏幕上从"模糊+错位"变成"清晰+整齐",属于必改项。如果仓库的电脑分辨率特别低(比如 1366x768),建议主窗体布局不要设计得太紧凑,留出滚动余地,并把窗口默认大小设为 1280x720,这样大部分显示器的可用空间都放得下。

5.3 WinForm 界面卡顿优化

用 WinForm 做仓储系统,最影响用户体验的就是大数据量加载时界面卡几秒钟。主要原因是 DataGridView 一次性加载了所有行,并且每行都要做一次单元格样式计算。优化方案有两个:一是分页,但数据录入类的界面不太适合分页;二是用virtual mode虚拟模式,DataGridView 只加载当前可视区域的几十行,滚动时再加载新数据,这个模式下加载一万行也是秒开。

如果你不想改虚拟模式这种高级玩法,还有一个更简单粗暴但非常有效的办法:数据从数据库取出来之后,先放到DataTable里,然后把DataGridViewAutoSizeColumnsMode设置为FillRowHeadersWidthSizeMode设置为DisableResizing,最后再给 DataGridView 设置数据源——先关掉界面刷新,数据绑定完成后再统一刷新,视觉上会流畅非常多。

5.4 部署安装包制作技巧

WinForm 程序做安装包,用 Visual Studio 自带的 InstallShield Limited Edition 授权限制比较多,而且界面很丑。推荐两个思路:如果你要给仓库内部的电脑部署,而且每台电脑都装了 .NET Framework 4.6.1 运行时(Win10/11 自带),那完全没必要做安装包,直接把 Debug 或 Release 目录下的 exe 和 dll 拷过去,配好连接字符串,双击 exe 就能用。

如果你一定要做一个给客户演示用的"像样"的安装包,建议用 Inno Setup,免费、脚本简洁、生成的安装包体积小。下面的脚本就是打包这个项目成安装程序的最简实现:

[Setup] AppName=仓储管理系统 AppVersion=1.0 DefaultDirName={pf}\WMS DefaultGroupName=WMS OutputBaseFilename=WMS_Setup Compression=lzma2 SolidCompression=yes [Files] Source: "D:\Project\WMS.UI\bin\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs [Icons] Name: "{group}\仓储管理系统"; Filename: "{app}\WMS.UI.exe"

编译出安装包后,要在干净的 Windows 虚拟机上测试一遍——很多系统连 .NET Framework 4.6.1 都没有,安装包界面需要提示用户去官网下载运行时,或者直接把dotNetFx461_Full_x86_x64.exe加进安装脚本的[Run]节。这一点不提前处理,客户现场装不上时你只能干瞪眼。

6. 通用化设计的经验沉淀

6.1 让"通用"真正落到代码里的细节

很多标榜"通用源码"的项目,实际只体现在数据库脚本能改几个表名,代码里却还是写死业务逻辑。真正的通用系统必须做到三个层面:数据库层面,核心业务表不绑定任何特定企业的字段命名习惯,统一用通用术语;代码层面,业务逻辑和界面交互分离到可以独立替换数据库而不改 UI 的程度;功能层面,通过配置表和字典表来兼容不同仓库的管理规则。

这个项目我在设计时做了几个通用化的妥协和取舍。例如"货品档案"里面预置了"自定义字段1""自定义字段2"这样的扩展字段,方便企业需要记录批次号、颜色、尺寸这类属性时不用改表结构,在前端再加上一个动态列绑定,就能显示出扩展属性的值。又比如单据编号规则,通过一张SysSequence表控制,支持自定义前缀(比如 RD202501),默认有采购入库用 RK、销售出库用 CK,如果想改成其他前缀,直接改表数据就可以,不用动代码。

6.2 二次开发的正确姿势

如果你准备把这套源码改成自己公司的系统,我的建议是:先跑通流程,再做减法,最后才做加法。先跑通流程,是把演示数据玩熟,搞清楚每个按钮背后的数据库操作,这个阶段可以边看代码边点界面;做减法,是把你公司根本不需要的模块先屏蔽掉,比如如果你们不做退货业务,就把退货按钮和对应的存储过程注释掉,减少干扰;最后做加法,是把自己特有的字段、流程加进去,并且在做加法时尽量沿着已经设计好的扩展点走——扩展字段、字典表、存储过程改查询条件,而不是去动底层的库存事务逻辑。

另外,千万不要一上来就急着改成"多仓库多公司"。通用系统的第一版通常只适合单仓库,多仓多公司意味着所有表都要加一个 CompanyId、WarehouseId 的分支逻辑,这是一个伤筋动骨的改动。真需要多仓,建议先把单仓跑半年,稳定了再动这个手术。

6.3 安全与权限控制

最后这套系统内置了简单的用户权限控制:用户表、角色表、菜单权限表三张表。登录后根据角色加载可见菜单,按钮级别的权限通过Permission表判断。对于内部仓储系统,这种角色权限基本够用——管理员、仓管员、财务、老板,各看一下自己的菜单和按钮,不用做复杂到按钮级别的权限,否则自己维护起来都头疼。

但有一点必须做:操作日志。我在 BLL 层的基类里统一写了一段日志逻辑,所有增删改操作都会自动记录操作人、操作时间、操作类型、操作内容到一个日志表里。后期如果库存对不上、单子找不到了,查日志是恢复现场的唯一手段。不要以为内部系统不用留痕,仓库出了问题需要追责时,没有日志的系统和没做系统一样。

在我自己把很多类似系统推到生产环境的经验里,日志和权限这两块从来没省过。省了,上线后补得想哭;不省,平时安静得像个摆设,关键时刻能救命。

拿到这套源码后,你先不要急着改业务,把登录、基础资料、一张入库单从草稿走到审核、一张出库单从草稿走到审核,对着数据库里的表记录看一遍数据变化,整个系统的运行逻辑就刻在你脑子里面了。之后再根据自己的业务需求,在这个骨架上加肉,它会成为一套非常趁手的工具。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:58:31

资讯日报生成器实战:从Prompt到Agent工作流编排与落地

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

作者头像 李华
网站建设 2026/9/2 23:53:24

2026 实测|思梦航 AI 隐藏功能大揭秘❗4000 + 院校模板真的太实用

测评过几十款 AI 论文工具&#xff0c;发现绝大多数同学仅仅挖掘了思梦航 AI 一小部分能力&#xff01; 很多人只知道它可以免费查重、智能降重&#xff0c;却忽略 2026 版本更新的多款宝藏隐藏功能&#xff0c;能够直接搞定格式排版、科研图表制作、定向精细化改稿这些毕业生老…

作者头像 李华
网站建设 2026/9/2 23:52:55

Qt6连接MySQL入门:从零构建C++数据库桌面应用

如果你学过 C&#xff0c;又刚把 Qt6 装上&#xff0c;打算写一个带数据库的项目练手&#xff0c;那么 Qt6 MySQL 这个小项目应该排在前面。它不像纯 C 控制台练习那样只跟算法打交道&#xff0c;也不像只做静态界面那样缺少工程感。做完这个项目&#xff0c;你会理解 C 在图形…

作者头像 李华
网站建设 2026/9/2 23:52:17

嵌入式蒸汽烤箱安装全攻略:水电预留、橱柜开孔与调试维护要点

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

作者头像 李华
网站建设 2026/9/2 23:48:12

上海12K测试开发面试高频考点与备考思路解析

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

作者头像 李华