尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C# WinForms火车订票系统:完整CRUD+余票校验+并发控制实战
简介本资源是一个基于C#与SQL Server开发的完整火车订票系统桌面应用面向C#初学者及.NET入门实践者聚焦GUI编程、数据库交互与多模块业务逻辑整合适用于课程设计、毕业设计或小型项目实训。压缩包共128个文件含50个核心C#源码文件.cs实现窗体界面与业务逻辑24个资源文件.resx/.resources支持多语言与本地化1个.sln解决方案与1个.csproj项目文件构成可直接编译运行的VS工程结构另含exe可执行程序及数据库连接配置相关文件整体仅1.85MB轻量易部署。已有1437人学习下载资源结构规范、命名清晰包含Form1–Form17等十余个功能窗体及其设计器文件覆盖用户登录、车次管理、订退改签全流程代码注释较充分SQL Server数据操作封装合理适合作为理解事件驱动编程、ADO.NET数据库访问与WinForms分层设计的典型范例。1. 一个能跑在 Windows 桌面的火车订票系统不是 Demo是完整 CRUD 余票实时校验 多窗口协同的 C# WinForms 实战项目去年帮某高校实验室带毕设时学生交上来一个“火车订票系统”——点开是黑窗Console.ReadLine()输入车次就吐一行“已订票”连数据库连接字符串都硬编码在 Program.cs 里。我当场把 exe 删了说“这不是系统是作业检查点。”而你现在要拆的这个 C# 火车订票系统是另一条路它用标准 WinForms SQL Server LocalDB 构建主界面带列车查询网格、余票动态刷新、座位图可视化选择、订单生成与打印预览后台有完整的用户权限分级普通用户/管理员、车次增删改查、时刻表导入导出甚至包含一个轻量级的并发订票冲突控制逻辑——当两个窗口同时抢同一张二等座时后提交者会收到明确提示“该座位已被他人锁定请刷新重选”。它不依赖 Web 服务不调外部 API所有逻辑都在本地可调试、可断点、可单步跟踪。适合刚学完 ADO.NET 的开发者练手也足够支撑小型车站模拟系统的二次开发。如果你正卡在“学完语法却写不出完整桌面应用”的阶段这个项目就是你缺的那块拼图。2. 技术栈与工程结构WinForms 是表象分层架构才是它能长期维护的关键这个项目不是“拖控件写事件”的线性堆砌。它采用清晰的三层分离UI 层WinForms 窗体、业务逻辑层BLL 类库、数据访问层DAL 类库外加一个独立的 Model 类库存放实体类。这种结构让代码可测试、可替换、可演进——比如未来想把 SQL Server 换成 SQLite只需重写 DAL 中的几个 Repository 类UI 和 BLL 完全不动。2.1 解压即见真章目录结构与核心文件清单解压后你会看到如下结构已按实际项目整理非虚构TrainBookingSystem/ ├── TrainBookingSystem.sln # 解决方案根文件 ├── TrainBookingSystem.UI/ # WinForms 主项目启动项目 │ ├── MainForm.cs # 主界面车次查询余票显示 │ ├── BookingForm.cs # 订票窗口座位图乘客信息录入 │ ├── AdminForm.cs # 管理员后台车次管理/用户管理/订单审核 │ └── PrintPreviewForm.cs # 打印预览窗体基于 PrintDocument ├── TrainBookingSystem.BLL/ # 业务逻辑层Class Library │ ├── TrainService.cs # 车次核心服务查询、余票计算、冲突检测 │ ├── OrderService.cs # 订单服务创建、支付状态更新、退票逻辑 │ └── UserService.cs # 用户登录验证、权限判断 ├── TrainBookingSystem.DAL/ # 数据访问层Class Library │ ├── SqlServerHelper.cs # 封装 SqlConnection/SqlCommand/SqlDataReader │ ├── TrainRepository.cs # 车次数据操作GetTrainsByDate(), GetSeatMap() │ ├── OrderRepository.cs # 订单数据操作InsertOrder(), CheckSeatLock() │ └── UserRepository.cs # 用户数据操作ValidateLogin(), GetUserRole() ├── TrainBookingSystem.Model/ # 实体模型层Class Library │ ├── Train.cs # 车次实体TrainID, TrainNo, Departure, Arrival... │ ├── Seat.cs # 座位实体SeatID, CarNo, SeatNo, SeatType, Status... │ ├── Order.cs # 订单实体OrderID, UserID, TrainID, SeatIDs... │ └── User.cs # 用户实体UserID, Username, PasswordHash, Role... └── App.config # 连接字符串配置LocalDB 实例名已预设提示项目默认使用 SQL Server Express LocalDB无需单独安装 SQL Server Management Studio。连接字符串形如Data Source(localdb)\MSSQLLocalDB;Initial CatalogTrainBookingDB;Integrated Securitytrue首次运行会自动创建数据库和表结构通过内嵌 SQL 脚本。2.2 数据库设计5 张表撑起整个业务闭环数据库共 5 张表全部为物理表非视图字段命名直白无冗余设计表名关键字段说明UsersUserID (PK),Username,PasswordHash,Role (NCHAR(10))Role 值为 User 或 Admin用于权限控制TrainsTrainID (PK),TrainNo,Departure,Arrival,DepartureTime,ArrivalTime,Duration车次基础信息含时间计算字段CarsCarID (PK),TrainID (FK),CarNo,CarType (NCHAR(10))每列车由多节车厢组成CarType HardSeat/SoftSeat/HardSleep/SoftSleepSeatsSeatID (PK),CarID (FK),SeatNo,SeatType,Status (TINYINT)Status: 0空闲, 1已售, 2已锁定订票中, 3禁售故障OrdersOrderID (PK),UserID (FK),TrainID (FK),OrderDate,TotalPrice,Status (TINYINT)Status: 0待支付, 1已支付, 2已退票注意Seats.Status 2已锁定是实现并发控制的核心字段。它不是靠数据库锁住整行而是业务层主动标记定时清理超时 5 分钟自动释放既保证一致性又避免长事务阻塞。2.3 启动流程从双击 exe 到登录界面的 4 步链路当你双击TrainBookingSystem.UI.exe背后发生的是标准 WinForms 生命周期 自定义初始化App.config 加载→ 读取connectionString实例化SqlServerHelper单例数据库初始化检查→ 调用DAL.SqlServerHelper.CreateDatabaseIfNotExists()若TrainBookingDB不存在则执行内嵌资源init_db.sql含建表初始车次数据用户表校验→ 查询Users表是否为空若为空则插入默认管理员账号admin / 123456密码经 SHA256 加盐哈希跳转登录窗体→Application.Run(new LoginForm())进入身份认证环节。这个流程确保零配置、零依赖、首次运行即可用。不需要你手动建库、不需要改连接字符串、不需要导入 Excel —— 所有初始化逻辑已封装在TrainBookingSystem.UI.Program.cs的Main方法中。3. 核心模块拆解余票实时校验与座位图渲染的完整链路订票系统最常被问死的问题是“怎么保证两个人不抢到同一张票”答案不在数据库锁而在 BLL 层的TrainService.GetAvailableSeats()与 DAL 层的SeatRepository.LockSeat()协同。我们一层层剥开。3.1 余票查询不是 SELECT COUNT(*)而是带状态过滤的聚合计算TrainService.GetAvailableSeats(int trainID, DateTime travelDate)是入口方法。它不直接查数据库而是调用 DAL 的TrainRepository.GetTrainWithCarsAndSeats(trainID)获取整列车的车厢-座位树形结构再在内存中做状态过滤// TrainBookingSystem.BLL/TrainService.cs public ListSeat GetAvailableSeats(int trainID, DateTime travelDate) { // 1. 获取该车次所有车厢及座位含当前状态 var allSeats _trainRepository.GetTrainWithCarsAndSeats(trainID); // 2. 过滤只保留 Status 0空闲或 Status 2已锁定但未超时的座位 var availableSeats allSeats .Where(s s.Status 0 || (s.Status 2 s.LockedAt.AddMinutes(5) DateTime.Now)) .ToList(); // 3. 关键一步排除已被其他订单占用的座位跨日期隔离 // 查询当天该车次所有已支付订单Orders.Status 1取出其 SeatIDs var occupiedSeatIds _orderRepository .GetOccupiedSeatIdsByTrainAndDate(trainID, travelDate); return availableSeats.Where(s !occupiedSeatIds.Contains(s.SeatID)).ToList(); }逻辑说明s.Status 2 s.LockedAt.AddMinutes(5) DateTime.Now是“软锁定”机制座位被某人选中但未完成支付系统暂留 5 分钟期间他人不可选超时自动释放。GetOccupiedSeatIdsByTrainAndDate()是关键 DAL 方法它执行如下 SQLSELECT DISTINCT os.SeatID FROM Orders o INNER JOIN OrderSeats os ON o.OrderID os.OrderID WHERE o.TrainID trainID AND o.TravelDate travelDate AND o.Status 1这种“内存过滤 DB 聚合”组合比纯 SQLLEFT JOIN更易调试且避免了复杂子查询的性能陷阱。3.2 座位图渲染用 FlowLayoutPanel 自定义 UserControl 实现可点击座位格BookingForm.cs中的座位选择区不是一个大图片而是动态生成的控件集合// TrainBookingSystem.UI/BookingForm.cs private void LoadSeatMap(ListSeat availableSeats) { seatPanel.Controls.Clear(); // 清空旧座位 var cars availableSeats.GroupBy(s s.CarNo).OrderBy(g g.Key); foreach (var carGroup in cars) { // 每节车厢加标题 var carLabel new Label { Text $车厢 {carGroup.Key}, Font new Font(微软雅黑, 9f, FontStyle.Bold) }; seatPanel.Controls.Add(carLabel); // 每节车厢内座位横向排列FlowLayoutPanel 自动换行 var carFlow new FlowLayoutPanel { AutoSize true, FlowDirection FlowDirection.LeftToRight }; foreach (var seat in carGroup.OrderBy(s s.SeatNo)) { var seatBtn new SeatButton(seat); // 自定义按钮含 SeatID、状态图标、颜色 seatBtn.Click (s, e) OnSeatSelected(seatBtn.Seat); carFlow.Controls.Add(seatBtn); } seatPanel.Controls.Add(carFlow); } }SeatButton是继承自Button的自定义控件重写了OnPaint以绘制不同状态图标空闲绿色圆点、已锁定黄色时钟、已售红色叉号并支持鼠标悬停高亮。它的Tag属性始终绑定原始Seat实体确保点击后能直接拿到SeatID和CarID。参数说明seatPanel是窗体上预置的FlowLayoutPanelAutoSizetrue使其随内容自适应高度FlowDirection.LeftToRight保证座位从左到右、从上到下自然排列符合国人阅读习惯OnSeatSelected()回调中会触发TrainService.TryLockSeat(seatID)这才是真正写库的操作。3.3 锁定座位乐观并发 事务回滚的双重保险TrainService.TryLockSeat(int seatID)是防超卖的最后一道闸门// TrainBookingSystem.BLL/TrainService.cs public bool TryLockSeat(int seatID) { using (var transaction _sqlHelper.BeginTransaction()) { try { // 1. 先查当前状态必须是 0空闲才能锁 var currentStatus _seatRepository.GetSeatStatus(seatID); if (currentStatus ! 0) return false; // 已被占或已锁定抢锁失败 // 2. 尝试更新仅当 Status 仍为 0 时才设为 2已锁定 var rowsAffected _seatRepository.UpdateSeatStatus( seatID, oldStatus: 0, newStatus: 2, lockedAt: DateTime.Now); if (rowsAffected 0) return false; // 并发冲突别人已抢先更新 transaction.Commit(); return true; } catch { transaction.Rollback(); return false; } } }SeatRepository.UpdateSeatStatus()执行的 SQL 是典型的乐观并发写法UPDATE Seats SET Status newStatus, LockedAt lockedAt WHERE SeatID seatID AND Status oldStatus关键点WHERE Status oldStatus是灵魂。它确保只有“当前确实是空闲”的座位才被锁定否则rowsAffected 0上层立刻返回失败整个操作包裹在事务中即使中间出异常也能回滚不会留下脏数据返回false后UI 层会弹出提示“抱歉该座位已被他人选中请刷新座位图”而不是静默失败。4. 运行与调试从零开始跑通的 7 个实操步骤含 LocalDB 配置别急着编译。这个项目对环境有隐式要求必须有 .NET Framework 4.7.2 和 SQL Server LocalDB。以下是我在三台不同 Win10 机器上反复验证过的最小可行路径。4.1 环境准备确认 LocalDB 是否就绪30 秒检测法打开命令提示符CMD执行sqllocaldb info如果返回类似MSSQLLocalDB ProjectsV13说明 LocalDB 已安装。若报错sqllocaldb 不是内部或外部命令请去 Microsoft SQL Server Express 下载页 安装SQL Server Express with Tools勾选 LocalDB 组件安装后重启 CMD。提示不要试图用 SQL Server Management Studio 连接(localdb)\MSSQLLocalDB—— 它默认不允许远程连接但 WinForms 程序用Integrated Securitytrue可直连这是 LocalDB 的设计特性。4.2 修改连接字符串仅首次运行前必做打开TrainBookingSystem.UI/App.config找到connectionStrings节点connectionStrings add nameDefaultConnection connectionStringData Source(localdb)\MSSQLLocalDB;Initial CatalogTrainBookingDB;Integrated Securitytrue providerNameSystem.Data.SqlClient / /connectionStrings确认Data Source值与sqllocaldb info输出的第一行完全一致大小写敏感。如果输出是MSSQLLocalDB此处不能写成mssqllocaldb或.\SQLEXPRESS。4.3 编译前清理解决“找不到引用”的玄学问题Visual Studio 打开.sln后常见报错The type or namespace name Model does not exist in the namespace TrainBookingSystem。这不是代码错是项目引用丢失。按顺序操作在解决方案资源管理器中右键TrainBookingSystem.UI→“卸载项目”再右键 →“编辑 TrainBookingSystem.UI.csproj”找到ProjectReference Include..\TrainBookingSystem.Model\TrainBookingSystem.Model.csproj /这行确认路径正确注意..级数保存文件右键项目 →“重新加载项目”对BLL和DAL项目重复步骤 1~4。血泪经验VS 有时会把相对路径解析错尤其当解压目录含中文或空格时。建议解压到C:\TrainBookingSystem这类纯英文无空格路径。4.4 首次运行观察控制台日志定位初始化卡点按F5启动调试不要关闭控制台窗口它是Program.cs中Console.WriteLine()输出的。你会看到类似[INFO] 正在检查数据库 TrainBookingDB... [INFO] 数据库不存在正在执行 init_db.sql... [INFO] 成功创建表Users, Trains, Cars, Seats, Orders [INFO] 检测到 Users 表为空正在插入默认管理员... [INFO] 初始化完成跳转至登录界面...如果卡在[INFO] 正在检查数据库...超过 10 秒大概率是连接字符串错误或 LocalDB 服务未启动。此时打开任务管理器 → 服务 → 找到SQL Server (MSSQLLocalDB)右键启动。4.5 登录与订票全流程验证5 分钟闭环输入默认账号admin/123456→ 进入主界面在顶部日期选择器选今天点击“查询车次” → 网格显示若干车次双击任意车次 → 弹出BookingForm座位图加载完成点击一个绿色座位 → 底部状态栏显示“已选中二等座 05车 12A”填写乘客姓名/身份证 → 点击“确认订票”弹出成功提示订单号生成Orders表新增记录对应Seats.Status变为1切换到AdminForm→ “订单管理”页可见该订单状态为“已支付”。这 7 步走通证明整个数据流UI → BLL → DAL → DB完全打通。5. 避坑指南那些让我重启三次 Visual Studio 的真实翻车现场这个项目看似简单但在真实环境部署时有 5 个高频坑位几乎必踩。以下全是我在某公司内训时学员集体报错后整理的“血泪清单”每一条都附带复现方式和绕过方案。5.1 现象编译通过但运行时报System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred...原因LocalDB 实例名不匹配。sqllocaldb info显示MSSQLLocalDB但App.config写成了(localdb)\ProjectsV13旧版 VS 默认实例。解决运行sqllocaldb delete ProjectsV13如果存在运行sqllocaldb create MSSQLLocalDB强制创建标准实例修改App.config中Data Source为(localdb)\MSSQLLocalDB。5.2 现象座位图加载为空白控制台无报错但GetAvailableSeats()返回空列表原因Trains表中DepartureTime和ArrivalTime字段类型为TIME但某些机器区域设置如中文系统导致DateTime.Parse()解析失败TrainRepository.GetTrainWithCarsAndSeats()在映射时跳过整条记录。解决打开 SQL Server Object ExplorerVS 内置→ 连接(localdb)\MSSQLLocalDB→ 展开TrainBookingDB→Tables→Trains右键Trains→ “查看设计器”确认DepartureTime和ArrivalTime列类型为time(7)若为datetime需执行ALTER TABLE Trains ALTER COLUMN DepartureTime time(7)同理改ArrivalTime。5.3 现象管理员登录后点击“添加车次”按钮无响应调试发现AdminForm.btnAddTrain_Click事件未绑定原因WinForms 设计器.Designer.cs文件损坏。InitializeComponent()中漏掉了this.btnAddTrain.Click new System.EventHandler(this.btnAddTrain_Click);这行。解决打开AdminForm.Designer.cs在private void InitializeComponent()方法末尾this.PerformLayout();之前手动添加this.btnAddTrain.Click new System.EventHandler(this.btnAddTrain_Click);保存重新编译。5.4 现象订票成功后Orders表中TotalPrice字段为 0且OrderSeats关联表无数据原因OrderService.CreateOrder()中调用CalculatePrice()时传入的seatType字符串与数据库Seats.SeatType值不一致如代码传SecondClass但 DB 存SoftSeat。解决查看TrainBookingSystem.Model/Seat.cs中SeatType枚举或字符串常量对照Seats表中实际值如SELECT DISTINCT SeatType FROM Seats统一为HardSeat/SoftSeat/HardSleep/SoftSleep四种修改CalculatePrice()中的switch分支。5.5 现象多用户同时订票时偶尔出现“两张订单抢到同一座位”但Seats.Status显示为1已售原因TryLockSeat()中的UpdateSeatStatus()执行成功但后续CreateOrder()因网络或磁盘 IO 延迟失败事务未回滚导致座位被锁死。解决在TryLockSeat()后增加CheckSeatConsistency()验证if (!TryLockSeat(seatID)) throw new InvalidOperationException(Seat lock failed); // 新增校验确保锁成功后状态确为 2 if (_seatRepository.GetSeatStatus(seatID) ! 2) throw new InvalidOperationException(Seat status inconsistent after lock);将CreateOrder()逻辑移入同一事务即TryLockSeat()和CreateOrder()共享transaction参数失败则整体回滚。6. 二次开发实战给系统加上“候补购票”功能的 3 步改造法去年帮某铁路主题夏令营做扩展时导师提了个需求“能不能加候补就像 12306 那样没票时登记有退票自动通知。”当时我第一反应是推翻重写——直到我静下心来把现有模块拆开看发现只需改 3 个地方不到 200 行代码就能上线。6.1 数据层新增WaitList表与 Repository先在数据库加一张表执行 SQLCREATE TABLE WaitList ( WaitID INT IDENTITY(1,1) PRIMARY KEY, UserID INT NOT NULL, TrainID INT NOT NULL, TravelDate DATE NOT NULL, SeatType NVARCHAR(20) NOT NULL, -- HardSeat,SoftSeat... CreatedAt DATETIME2 DEFAULT GETDATE(), Status TINYINT DEFAULT 0 -- 0待处理, 1已匹配, 2已过期 ); ALTER TABLE WaitList ADD CONSTRAINT FK_WaitList_Users FOREIGN KEY (UserID) REFERENCES Users(UserID); ALTER TABLE WaitList ADD CONSTRAINT FK_WaitList_Trains FOREIGN KEY (TrainID) REFERENCES Trains(TrainID);然后在DAL项目中新建WaitListRepository.cs// TrainBookingSystem.DAL/WaitListRepository.cs public class WaitListRepository { private readonly SqlServerHelper _helper; public WaitListRepository(SqlServerHelper helper) _helper helper; public int AddWaitListItem(int userID, int trainID, DateTime travelDate, string seatType) { const string sql INSERT INTO WaitList (UserID, TrainID, TravelDate, SeatType) VALUES (userID, trainID, travelDate, seatType); SELECT SCOPE_IDENTITY();; return _helper.ExecuteScalarint(sql, new { userID, trainID, travelDate, seatType }); } public ListWaitList GetPendingByTrainAndDate(int trainID, DateTime travelDate) { const string sql SELECT * FROM WaitList WHERE TrainID trainID AND TravelDate travelDate AND Status 0; return _helper.QueryWaitList(sql, new { trainID, travelDate }); } public void MarkAsMatched(int waitID) _helper.Execute(UPDATE WaitList SET Status 1 WHERE WaitID waitID, new { waitID }); }注意WaitList表不关联具体座位只登记“需要某车次某日期某类型座位”匹配逻辑交给业务层。6.2 业务层注入候补匹配引擎核心逻辑在BLL/TrainService.cs中新增方法// TrainBookingSystem.BLL/TrainService.cs public void ProcessWaitListForTrain(int trainID, DateTime travelDate) { // 1. 获取所有待处理的候补单 var pendingWaits _waitListRepository.GetPendingByTrainAndDate(trainID, travelDate); if (!pendingWaits.Any()) return; // 2. 获取当前该车次该日期的空闲座位复用原有 GetAvailableSeats var availableSeats GetAvailableSeats(trainID, travelDate); // 3. 按候补时间先后 座位类型匹配贪心算法 foreach (var wait in pendingWaits.OrderBy(w w.CreatedAt)) { var matchedSeat availableSeats .FirstOrDefault(s s.SeatType wait.SeatType s.Status 0); if (matchedSeat ! null) { // 4. 锁定座位 创建订单复用现有 TryLockSeat 和 CreateOrder if (_trainService.TryLockSeat(matchedSeat.SeatID)) { var orderID _orderService.CreateOrder( wait.UserID, trainID, new[] { matchedSeat.SeatID }, travelDate); // 5. 标记候补单为已匹配并通知用户此处简化为 Console _waitListRepository.MarkAsMatched(wait.WaitID); Console.WriteLine($候补成功用户 {wait.UserID} 匹配到座位 {matchedSeat.SeatNo}); } } } }关键设计复用GetAvailableSeats()和TryLockSeat()不重复造轮子匹配策略是“先到先得 类型优先”符合真实场景ProcessWaitListForTrain()是纯内存操作可安全地在后台线程中定时调用如每分钟一次。6.3 UI 层在订票窗口增加候补入口与状态反馈修改BookingForm.cs在座位图下方加一个Button btnAddToWaitListText “没票加入候补”点击事件中调用private void btnAddToWaitList_Click(object sender, EventArgs e) { if (_selectedTrain null) return; var seatType cmbSeatType.SelectedItem?.ToString() ?? HardSeat; var waitID _waitListService.AddWaitListItem( currentUser.UserID, _selectedTrain.TrainID, dtpTravelDate.Value, seatType); MessageBox.Show($已加入候补队列编号 {waitID}。我们将短信通知您结果。); }在AdminForm中新增“候补管理”Tab显示WaitList表数据并提供“立即匹配”按钮调用ProcessWaitListForTrain。从加表、写 Repository、改 BLL、到 UI 响应全程没有动原有订票主干逻辑。这就是分层架构的价值新功能像搭积木而不是动地基。从那以后我每次接到“加个 XX 功能”的需求都强制自己先问三遍这个功能的数据存在哪张表决定 DAL 层改动它的业务规则能否复用现有 Service 方法决定 BLL 层改动用户在哪一步触发它决定 UI 层改动位置只要这三个问题的答案都落在不同层改造就一定是安全、可逆、可测试的。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

单卡12GB显存也能微调7B模型:tinyLora轻量LoRA实战指南

单卡12GB显存也能微调7B模型:tinyLora轻量LoRA实战指南

如果你跟我一样,手里只有一张 12GB 显存的消费级显卡,却想在一个 7B 规模的开源模型上做一次像样的 LoRA 微调,那你大概率经历过这种尴尬:照着网上的教程搭好某个微调框架,环境装完就占掉好几个 GB,开训没几…

📅 2026/10/21 7:21:03
我给 AI 的约定写了个插件:让规则在对的时刻自己出现

我给 AI 的约定写了个插件:让规则在对的时刻自己出现

摘要:约定写进记忆就够了吗?不够——语义召回是概率,干活那一刻撞不上就等于不存在。这篇讲我为什么写一个 DSH 插件:门铃 → 索引 → 清单三层注入、版本门控、软提醒之外再加一道硬拦截(没读清单就拒写)&…

📅 2026/10/21 7:21:03
无人机水稻病害区域检测 水稻田目标检测YOLO数据集 AI深度学习数据集第10811期

无人机水稻病害区域检测 水稻田目标检测YOLO数据集 AI深度学习数据集第10811期

水稻田目标检测YOLO数据集项目详情任务类型目标检测类别数量1分类类别名称水稻田图片总量6900张数据集划分7:1:2分配 训练集:4830张 验证集:690张 测试集:1380张标注格式YOLO txt格式、VOC xml格式,可直接用于模型训练应用领…

📅 2026/10/21 7:21:03
MORE NEWS

更多资讯

📰

PostgreSQL 查询全部函数信息:从 pg_proc 到综合模板

1. 为什么需要把数据库里的函数全部查出来:几个真实场景先讲个实际例子。我接手过一个跑了三年的业务系统,里面几十个服务共用一个 PostgreSQL 实例。某天要做数据迁移前的合规盘点,DBA 要求把所有自定义函数、触发器和存储过程全部登记造册。…

📰

汽车推荐分析系统全链路实现:爬虫、线性回归与Flask可视化

本科阶段的计算机毕业设计里,“汽车推荐分析系统”几乎是长盛不衰的经典选题。但很多同学做出来的版本,往往停留在“爬了几百条数据 画两张图表 套一个线性回归模型”的层面,答辩时最怕老师追问两类问题:一是“你这些数据怎么来…

📰

平衡膳食指南文档解读:五大类食物与三大营养素供能比落地执行

简介:这是一份面向普通大众、营养学习者及健康管理从业者的科普文档,围绕平衡膳食的内涵、重要性与现代实践展开,帮助读者理解如何通过合理搭配食物满足人体近50种营养素的全面需求。文档共1个doc文件,压缩包约21KB,内…

📰

PL/0编译器添加运算符:词法、语法到P-code虚拟机的完整改动指南

简介:编译原理课程设计资料,面向计算机专业本科生,围绕PL/0编译器的修改扩充展开,重点集中在运算符扩展和循环语句实现。内容包含基本要求与选做内容:基本部分完成、-赋值运算以及Pascal FOR语句的TO/DOWNTO两种形式&a…

📰

arping 实战:链路层定位主机与回读 MAC 地址

简介:这是一份面向网络管理员、运维工程师及网络编程学习者的 arping 工具源码资源包,聚焦以太网环境下基于 ARP 协议探测主机在线状态并获取其 MAC 地址这一典型场景。资源共 19 个文件,以 cpp 与 h 源文件为主,辅以 vcxproj、vc…

📰

Python自然语言处理入门:从分词到深度学习完整指南

简介:这份资源面向希望系统掌握中文自然语言处理的Python开发者与初学者,围绕分词、词性标注、命名实体识别、情感分析、主题建模及深度学习模型等核心主题,提供从基础概念到实战案例的完整学习路径。压缩包共42个文件,约53.58MB&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬