VB.NET考勤系统源码实战:WinForms+ADO.NET从打卡到报表
简介这份资源是一套基于 VB.NET 开发的考勤管理系统源码面向具备一定 VB.NET 与 .NET Framework 基础、希望学习企业级桌面应用开发的开发者。系统围绕员工信息管理、考勤记录、迟到早退旷工等异常处理、报表生成与权限管理展开采用 Windows Forms 构建界面并可连接 SQL Server、Access 等数据库完成数据存储与查询适合作为课程设计、毕业设计或企业考勤工具的参考实现。压缩包共 138 个文件约 30.87MB包含 21 个 vb 源码文件、26 个 dll 依赖库、25 个 xml 配置、8 个 resx 与 7 个 resources 资源文件以及 exe、config、sln、vbproj 等工程与运行文件完整保留了可编译的项目结构。目前已有 289 人学习下载。读者可从中获取考勤系统的模块划分思路、事件驱动与异步编程的实践方式、异常判定逻辑及报表输出方案便于快速理解并二次开发。1. 一个考勤系统从打卡到报表VB.NET 到底能扛多少事很多做企业内训或者校园信息化的朋友一提到考勤系统第一反应就是“这玩意儿不是随便找个 Web 框架就搞定了吗”。但真落到一个中小型单位、几十号到几百号人、每天四次打卡、月底还要拉出迟到早退统计表的场景里你会发现用 VB.NET 写一个桌面端考勤系统反而是最省事、最稳的一条路。这份 VB.NET 考勤系统源码就是围绕“人员管理 打卡记录 排班规则 统计报表”这条主线搭起来的完整工程适合刚接触 VB.NET 想找一个能跑通的项目练手的人也适合手里有类似需求、想直接拿一套骨架去改的开发者。它不追求高并发也不搞微服务那一套就是把考勤这件事用最直接的方式做扎实。2. 项目定位与技术选型为什么是 WinForms ADO.NET 这套组合2.1 这套源码解决的是什么问题从项目结构来看这套 VB.NET 考勤系统是一个典型的 C/S 架构桌面应用。它的核心业务闭环是管理员在后台维护部门、人员和排班规则员工在客户端进行打卡操作系统把每次打卡写入数据库最后按月份、部门、个人三个维度生成考勤统计。它不涉及复杂的审批流也没有移动端打卡定位非常清晰——就是给内网环境下的单位用部署简单不需要额外配服务器环境一台装了 .NET Framework 的 Windows 机器就能跑起来。这种定位决定了它的技术选型不会太花哨。整个项目基于 VB.NET 语言界面层用 WinForms数据访问层用 ADO.NET 直接操作数据库没有引入 ORM 框架也没有用 WPF 做界面。对于刚上手 VB.NET 的开发者来说这套组合的好处是“所见即所得”每个按钮点下去代码怎么走的、SQL 怎么拼的、数据怎么绑到表格上的全都能在代码里一眼看到不存在框架帮你藏了一层又一层的情况。2.2 技术栈拆解与依赖说明项目用到的技术栈可以拆成四块来看。第一块是语言和运行时VB.NET 配合 .NET Framework 4.x这是 Visual Studio 里创建 WinForms 项目时的默认搭配兼容性好XP 之后的 Windows 系统基本都能跑。第二块是界面层用的是 WinForms 的常用控件——DataGridView 做数据展示、TextBox 和 ComboBox 做输入、DateTimePicker 做日期选择没有用第三方 UI 库所以不需要额外装 NuGet 包。第三块是数据访问用 ADO.NET 的 SqlConnection、SqlCommand、SqlDataAdapter 这一套数据库选的是 SQL Server也可以换成 SQL Server Express 本地版改一下连接字符串就行。第四块是报表输出常见做法是用 Microsoft Report Viewer 或者直接导出 Excel源码里如果带了导出功能一般是引用 Microsoft.Office.Interop.Excel 或者用 StreamWriter 写 CSV。注意如果你机器上装的是较新版本的 Visual Studio打开项目时可能会提示 .NET Framework 版本不匹配这时候在项目属性里把目标框架改成你本机已有的版本即可不需要重装环境。2.3 目录结构长什么样一个典型的 VB.NET WinForms 考勤系统目录结构大致是这样的AttendanceSystem/ ├── AttendanceSystem.sln ├── AttendanceSystem/ │ ├── My Project/ │ │ ├── AssemblyInfo.vb │ │ ├── Resources.resx │ │ └── Settings.settings │ ├── Forms/ │ │ ├── FrmLogin.vb │ │ ├── FrmMain.vb │ │ ├── FrmEmployee.vb │ │ ├── FrmAttendance.vb │ │ └── FrmReport.vb │ ├── Modules/ │ │ ├── DbHelper.vb │ │ ├── EmployeeModule.vb │ │ └── AttendanceModule.vb │ ├── Models/ │ │ ├── Employee.vb │ │ └── AttendanceRecord.vb │ └── App.config └── Database/ └── AttendanceDB.sqlForms 文件夹放的是各个窗体Modules 里是业务逻辑和数据访问的封装Models 里是实体类Database 文件夹里是建库建表的 SQL 脚本。这种分层方式在 VB.NET 项目里很常见虽然没有严格按三层架构去拆但至少把界面、逻辑、数据分开写了改起来不会牵一发动全身。3. 核心模块拆解从登录到打卡的完整链路3.1 数据库连接与 DbHelper 封装不管什么业务系统数据库连接都是第一道坎。这套源码里通常会有一个 DbHelper 模块把连接字符串、打开连接、执行命令这些重复操作封装起来。下面是一个典型的实现Module DbHelper 从 App.config 读取连接字符串避免硬编码 Private ReadOnly connStr As String ConfigurationManager.ConnectionStrings(AttendanceDB).ConnectionString 执行增删改返回受影响行数 Public Function ExecuteNonQuery(sql As String, params As SqlParameter()) As Integer Using conn As New SqlConnection(connStr) Using cmd As New SqlCommand(sql, conn) If params IsNot Nothing Then cmd.Parameters.AddRange(params) conn.Open() Return cmd.ExecuteNonQuery() End Using End Using End Function 执行查询返回 DataTable方便直接绑到 DataGridView Public Function ExecuteQuery(sql As String, params As SqlParameter()) As DataTable Using conn As New SqlConnection(connStr) Using cmd As New SqlCommand(sql, conn) If params IsNot Nothing Then cmd.Parameters.AddRange(params) Dim adapter As New SqlDataAdapter(cmd) Dim dt As New DataTable() adapter.Fill(dt) Return dt End Using End Using End Function End Module这段代码的关键点有两个。一是连接字符串从 App.config 读不写死在代码里换数据库的时候只改配置文件。二是用 Using 语句包住 SqlConnection 和 SqlCommand保证用完就释放不会因为忘记 Close 导致连接池被占满。参数化查询通过 SqlParameter 传入避免拼接 SQL 字符串带来的注入风险。参数说明上sql 是带占位符的语句比如SELECT * FROM Employee WHERE DeptId DeptIdparams 是对应的参数数组。3.2 登录验证与权限区分登录窗体 FrmLogin 的逻辑不复杂但它是整个系统的入口权限区分也在这里做。用户输入工号和密码后系统去 Employee 表里查匹配记录如果查到并且密码正确就把员工角色写进一个全局变量或者 Session 类似的模块里然后打开主窗体。Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim sql As String SELECT EmpId, EmpName, Role FROM Employee WHERE EmpNo EmpNo AND Password Pwd Dim params As SqlParameter() { New SqlParameter(EmpNo, txtEmpNo.Text.Trim()), New SqlParameter(Pwd, txtPwd.Text.Trim()) } Dim dt As DataTable DbHelper.ExecuteQuery(sql, params) If dt.Rows.Count 0 Then MessageBox.Show(工号或密码错误请重新输入。) Return End If 把登录信息存到全局模块后续窗体直接读 CurrentUser.EmpId CInt(dt.Rows(0)(EmpId)) CurrentUser.EmpName dt.Rows(0)(EmpName).ToString() CurrentUser.Role dt.Rows(0)(Role).ToString() Me.Hide() Dim main As New FrmMain() main.ShowDialog() Me.Close() End Sub这里有个细节值得注意密码在数据库里是明文存储的。对于内网小系统来说这样写能跑但如果要稍微正规一点常见做法是在存密码的时候做一次 MD5 或者 SHA256 哈希登录时把输入的密码同样哈希后再比对。改起来不难在 EmployeeModule 里加一个哈希函数就行。3.3 打卡记录写入与重复打卡判断打卡是考勤系统的核心动作。员工在主界面点“上班打卡”或“下班打卡”系统要做三件事确认当前时间、判断今天这个时段是否已经打过卡、把记录写进 AttendanceRecord 表。Public Function AddAttendance(empId As Integer, punchType As String) As Boolean Dim today As Date Date.Today 先查今天该时段是否已有记录避免重复打卡 Dim checkSql As String SELECT COUNT(*) FROM AttendanceRecord WHERE EmpId EmpId AND PunchDate Date AND PunchType Type Dim checkParams As SqlParameter() { New SqlParameter(EmpId, empId), New SqlParameter(Date, today), New SqlParameter(Type, punchType) } Dim count As Integer Convert.ToInt32(DbHelper.ExecuteScalar(checkSql, checkParams)) If count 0 Then Return False 写入打卡记录PunchTime 精确到秒 Dim insertSql As String INSERT INTO AttendanceRecord (EmpId, PunchDate, PunchTime, PunchType) VALUES (EmpId, Date, Time, Type) Dim insertParams As SqlParameter() { New SqlParameter(EmpId, empId), New SqlParameter(Date, today), New SqlParameter(Time, Date.Now), New SqlParameter(Type, punchType) } Return DbHelper.ExecuteNonQuery(insertSql, insertParams) 0 End Function这段逻辑里PunchType 一般用“上班”“下班”两个值区分。重复打卡判断是先查后插严格来说在高并发下会有竞态问题但内网几十个人的场景完全够用。如果想让数据库层面兜底可以在 AttendanceRecord 表上给 EmpId PunchDate PunchType 建一个唯一索引插入重复时直接报错代码里捕获异常提示“今天已经打过卡了”。3.4 考勤统计与报表生成统计模块是整个系统里 SQL 写得最重的地方。以月度统计为例需要把每个员工当月的打卡记录按日期分组算出每天的最早打卡时间和最晚打卡时间再和排班表里的标准上下班时间比对得出迟到、早退、缺卡的次数。Public Function GetMonthlyReport(deptId As Integer, year As Integer, month As Integer) As DataTable Dim sql As String SELECT e.EmpNo, e.EmpName, COUNT(DISTINCT a.PunchDate) AS AttendDays, SUM(CASE WHEN a.PunchType 上班 AND CONVERT(TIME, a.PunchTime) 09:00:00 THEN 1 ELSE 0 END) AS LateCount, SUM(CASE WHEN a.PunchType 下班 AND CONVERT(TIME, a.PunchTime) 18:00:00 THEN 1 ELSE 0 END) AS EarlyCount FROM Employee e LEFT JOIN AttendanceRecord a ON e.EmpId a.EmpId AND YEAR(a.PunchDate) Year AND MONTH(a.PunchDate) Month WHERE e.DeptId DeptId GROUP BY e.EmpNo, e.EmpName ORDER BY e.EmpNo Dim params As SqlParameter() { New SqlParameter(Year, year), New SqlParameter(Month, month), New SqlParameter(DeptId, deptId) } Return DbHelper.ExecuteQuery(sql, params) End Function这个查询用 LEFT JOIN 保证即使某个员工当月一条打卡记录都没有也会出现在报表里显示出勤天数为 0。LateCount 和 EarlyCount 用 CASE WHEN 做条件计数比在 VB.NET 里循环 DataTable 逐行判断要快得多。查出来的 DataTable 直接绑到 FrmReport 的 DataGridView 上再加一个导出按钮用 StreamWriter 写成 CSV 文件Excel 打开就能看。4. 避坑与常见问题那些第一次跑容易翻车的地方4.1 连接字符串写错导致连不上数据库现象是程序一启动就弹异常提示“未找到连接字符串”或者“登录失败”。原因通常是 App.config 里的 name 属性和代码里 ConfigurationManager.ConnectionStrings 取的键名不一致或者 SQL Server 实例名写成了默认的.\SQLEXPRESS但本机装的是完整版。解决办法是打开 App.config 确认 connectionString 的 name 和代码里完全一致然后去 SQL Server 配置管理器里确认实例名和 TCP/IP 协议是否启用。4.2 DataGridView 绑定后不刷新打卡之后回到记录列表发现新数据没出来手动关掉窗体再打开才有。原因是 DataGridView 绑定的 DataTable 是一次性查询结果不会自动感知数据库变化。解决方式是在打卡成功后重新调用一次查询方法把新的 DataTable 重新赋给 DataSource或者用 BindingSource 做一层中转调用 ResetBindings(False) 强制刷新。4.3 日期时间格式在不同区域设置下解析失败现象是打卡记录写入时抛“字符串转换为 DateTime 失败”。原因是代码里用了CDate(2024/01/15)这种依赖区域设置的转换在某些系统上会按月/日/年解析。解决办法是统一用DateTime.ParseExact指定格式或者在 SQL 参数里直接传 DateTime 类型的值让 ADO.NET 去处理格式转换不要自己拼字符串。4.4 导出 Excel 时提示“未安装 Office”如果报表导出用的是 Microsoft.Office.Interop.Excel那目标机器上没装 Office 就会直接报错。这是很多内网机器的通病。解决方式有两种一是改成导出 CSV用 StreamWriter 写逗号分隔文件Excel 照样能打开二是换成 NPOI 这类不需要装 Office 的库但需要额外引入 DLL。4.5 多用户同时打卡时记录丢失现象是两个人几乎同时点打卡结果只有一条记录写进去了。原因是先查后插的逻辑在并发下存在窗口期。解决办法是在 AttendanceRecord 表的 EmpId PunchDate PunchType 上建唯一约束插入冲突时捕获 SqlException提示“请勿重复打卡”这样即使并发也不会丢数据。5. 二次开发与改造从能跑到好用还差哪几步5.1 把密码明文改成哈希存储这是最值得先做的一步改造。在 EmployeeModule 里加一个哈希函数用 SHA256 对密码加盐后存库登录时同样处理再比对。改动量很小但安全性提升明显。具体做法是在 Employee 表加一个 Salt 字段每个用户注册时生成随机盐值存Hash(password salt)验证时用同样的盐重新计算。5.2 增加排班规则表支持弹性上下班现在的统计逻辑把上班时间硬编码成 09:00下班硬编码成 18:00。如果单位有多个班次就需要加一张 Schedule 表字段包括 ScheduleId、ScheduleName、WorkStart、WorkEndEmployee 表加一个 ScheduleId 外键。统计查询里把硬编码的时间换成 JOIN Schedule 表取对应班次的时间这样不同部门可以套不同班次改起来也不影响已有数据。5.3 用参数化配置替换硬编码项目里凡是出现“09:00”“18:00”“迟到阈值”这类数字的地方都建议抽到一个 Config 表或者 App.config 的 appSettings 节点里。比如加一个LateThresholdMinutes配置项统计迟到时用WorkStart LateThresholdMinutes去比对这样调整宽限时间不用改代码重新编译。5.4 报表导出换成 NPOI 或直接写 CSV如果目标部署环境不确定有没有 Office建议把导出功能改成写 CSV。下面是一个简单的 CSV 导出方法Public Sub ExportToCsv(dt As DataTable, filePath As String) Dim sb As New StringBuilder() 写表头 Dim headers As String() dt.Columns.Cast(Of DataColumn)().Select(Function(c) c.ColumnName).ToArray() sb.AppendLine(String.Join(,, headers)) 写数据行字段里如果有逗号就加引号包起来 For Each row As DataRow In dt.Rows Dim fields As String() row.ItemArray.Select( Function(f) If(f.ToString().Contains(,), f.ToString() , f.ToString()) ).ToArray() sb.AppendLine(String.Join(,, fields)) Next File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8) End Sub这个方法不依赖任何外部库生成的 CSV 用 Excel 打开中文也不会乱码因为指定了 UTF8 编码。参数 dt 是统计查询返回的 DataTablefilePath 是保存路径调用前用 SaveFileDialog 让用户选位置就行。5.5 验证改造是否成功的几个检查点改完之后怎么确认没改坏我一般会走一遍这几个检查点第一用两个不同角色的账号登录确认权限区分仍然生效第二手动改系统时间到上下班边界测试迟到早退判断是否按新规则走第三连续打两次同类型卡确认重复打卡拦截还在第四导出报表后用 Excel 打开检查中文列名和数据行数是否和界面一致第五把 App.config 里的连接字符串指向一个新库跑一遍建表脚本确认部署流程没有遗漏。从那以后我每次改完考勤统计相关的 SQL都会先把系统时间调到月初和月末各跑一次报表确认跨月边界不会漏记录或者多算天数。这个习惯帮我省了好几次被业务方追着问“为什么上个月的数据对不上”的麻烦。希望这份拆解能帮到你源码拿下去先跑通登录和打卡再慢慢往统计和报表上改节奏会顺很多。本文还有配套的精品资源点击获取

相关新闻

SpringBoot+AES电商助农产销系统:设计与实现全解析

SpringBoot+AES电商助农产销系统:设计与实现全解析

每年到这个时间点,都能看到一批同学为了计算机毕业设计选题焦头烂额。电商类、管理系统类、订餐类都是老面孔,想做出点区分度确实不容易。如果你现在手上拿的是“SpringBoot基于AES的电商助农产销系统”这个题目,恭喜你,这个方向其…

2026/10/18 8:53:22 阅读更多 →
DotNET Reactor加固选型避坑指南:启动成功率与JIT稳定性实战分析

DotNET Reactor加固选型避坑指南:启动成功率与JIT稳定性实战分析

简介:本资源为DotNET Reactor最新破解版工具集,面向C#/.NET开发者及逆向分析学习者,用于代码混淆、反调试、反反编译等核心保护场景,帮助开发者快速加固商业级.NET应用程序,防范源码泄露与恶意篡改。压缩包共105个文件…

2026/10/18 8:53:22 阅读更多 →
JVM垃圾回收器实战:从分代到G1与ZGC,调优排查全攻略

JVM垃圾回收器实战:从分代到G1与ZGC,调优排查全攻略

线上服务每隔两三小时就出现一次数秒停顿,报警刷屏成一片。我远程登录上去,先敲了那句Java程序员都背过、但排障时总想不起来的命令:jstat -gcutil。输出里Full GC连续飙升,老年代占用接近100%。那一刻,曾经背过的JVM垃…

2026/10/18 8:53:22 阅读更多 →

最新新闻

基于深度学习的目标检测道路坑洼识别:YOLOv8训练与部署实践

基于深度学习的目标检测道路坑洼识别:YOLOv8训练与部署实践

毕业设计选“基于深度学习的道路坑洼识别”这个方向的同学,最近明显多了起来。原因不难理解:既能用到Python、深度学习、图像识别这些当下最热的技术词汇,又有一个清晰可落地的应用场景,数据也相对容易获取。但真正动手做起来&…

2026/10/18 11:13:00 阅读更多 →
机器学习与深度学习道路坑洼识别:从数据集到部署的完整实践指南

机器学习与深度学习道路坑洼识别:从数据集到部署的完整实践指南

在开始写之前,我先说句题外话。每年这个时间,都有很多同学在课程设计和毕业设计的选题边缘反复横跳,既想找个有区分度的方向,又怕最后做不出来。道路坑洼识别这个题目,说实话,方向是好的——机器学习和深度…

2026/10/18 11:13:00 阅读更多 →
2026年AI接口聚合服务实力横评:词元之河与硅基流动稳定性对比

2026年AI接口聚合服务实力横评:词元之河与硅基流动稳定性对比

这轮横评的方法论先交代清楚:七十二小时连续压测、十二类典型调用场景模拟,再叠加对三十七位一线开发者的访谈,围绕协议兼容、稳定性、成本透明、密钥治理等八项指标逐一打分。行业背景也不容忽视——《中国AI基础设施白皮书》的调研显示&…

2026/10/18 11:13:00 阅读更多 →
MySQL 8.0免安装版配置指南:从解压到多实例部署

MySQL 8.0免安装版配置指南:从解压到多实例部署

简介:这是一份面向后端开发、运维及数据库初学者的 MySQL 8.0 免安装绿色版资源,主打解压即用,无需繁琐的安装与初始化流程,适合需要快速搭建本地测试环境、临时验证 SQL 语句或学习数据库原理的场景。压缩包共 420 个文件&#x…

2026/10/18 11:13:00 阅读更多 →
AI辅助教材写作如何降低查重率?五个阶段实操指南

AI辅助教材写作如何降低查重率?五个阶段实操指南

1. 先别急着让AI“写”,先搞清楚查重系统到底在“查”什么干过教材编写的人应该都有同感:最让人头疼的不是“没内容可写”,而是辛辛苦苦熬了几个通宵弄出来的稿子,往查重系统里一丢,重复率直接飙到百分之三四十。这时候…

2026/10/18 11:13:00 阅读更多 →
虚拟专题:联邦学习 | 基于 TaoToken 统一 API 通道的联邦学习研究综述与工程落地指南

虚拟专题:联邦学习 | 基于 TaoToken 统一 API 通道的联邦学习研究综述与工程落地指南

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

2026/10/18 11:12:00 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →