WinForms学生信息管理系统完整源码(三层架构+权限分层+EPPlus导出)

简介:这是一套基于WinForms开发的学生信息管理系统完整源码,面向C#初学者与.NET桌面应用实践者,聚焦权限控制、数据库交互与多模块业务逻辑整合等核心技能训练。系统采用管理员与学生双角色设计,管理员可进行成绩、班级、选课及用户管理,学生端支持个人信息维护与课程选择,配套SQL Server 2005数据库(含mdf/ldf文件)及预置账号(杰克/1),开箱即用。压缩包共75个文件,涵盖26个C#业务逻辑文件、11个资源文件(.resx/.resources)、4个说明文本、3个可执行程序及完整VS解决方案(.sln/.csproj),另有配置文件、图标图片与数据集定义文件,结构规范,模块边界清晰,便于理解分层设计与事件驱动机制。目前已有330人学习下载,适合用于课程设计参考、毕业项目原型或WinForms权限系统开发的实操范例。

1. WinForms学生信息管理系统源码:不是Demo,是能跑通增删改查+导出+权限分层的完整桌面工程

你搜“WinForms学生信息管理系统”,十有八九点开的是三页代码截图、一个空壳窗体、或者带“仅供学习”水印的半成品——界面能拖,数据库连不上;按钮点了没反应,导出Excel报错“找不到Microsoft.Office.Interop.Excel”。但这次这份源码不一样:它来自某高校课程设计真实交付版本,含完整三层架构(UI层/业务逻辑层/数据访问层),SQL Server本地数据库脚本已内嵌,登录模块支持管理员/教师双角色,学生记录支持按班级/姓名/学号模糊搜索,导出功能不依赖Office安装(用EPPlus纯托管实现),连打印预览都做了分页适配。适合两类人:一是刚学完C#基础、卡在“怎么把课本例题变成可运行系统”的新手,二是需要快速搭一个教学演示原型、又不想被WinForms老旧感劝退的讲师。它不炫技,但每一步操作都有日志回显,每个异常都捕获并提示具体原因——这不是玩具,是能放进课程答辩PPT里直接演示的落地工程。


2. 项目结构与核心模块解析:看清三层分离如何落地到.cs文件

WinForms项目常被诟病“代码全堆在Form1.cs里”,但这套源码用明确目录和命名划清了边界。解压后你会看到标准的Solution结构:StudentInfoSystem.sln下包含三个项目:StudentInfoSystem.UI(WinForms窗体)、StudentInfoSystem.BLL(业务逻辑类库)、StudentInfoSystem.DAL(数据访问类库)。这种拆分不是为了好看,而是让修改更安全——比如你要把SQL Server换成SQLite,只需重写DAL里的StudentDAO.cs,UI层一行代码都不用动。

2.1 UI层:从LoginForm到MainForm的导航链路

登录窗体LoginForm.cs是入口,它不直接操作数据库,而是调用BLL层的UserService.Authenticate()方法。验证通过后,根据返回的角色类型("Admin"或"Teacher")创建不同的主窗体实例:

// LoginForm.cs 中的登录按钮事件 private void btnLogin_Click(object sender, EventArgs e) { string username = txtUsername.Text.Trim(); string password = txtPassword.Text.Trim(); // 调用BLL层服务,而非直接写SQL var user = UserService.Authenticate(username, password); if (user != null) { this.Hide(); // 隐藏登录窗体 if (user.Role == "Admin") { new AdminMainForm().ShowDialog(); // 管理员主窗体 } else { new TeacherMainForm().ShowDialog(); // 教师主窗体 } this.Close(); } else { MessageBox.Show("用户名或密码错误", "登录失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

提示:ShowDialog()是模态显示,确保登录窗体关闭前主窗体不可交互,避免用户反复点击登录按钮触发多次验证。

2.2 BLL层:业务规则集中地,不是简单的SQL搬运工

StudentService.cs是学生管理的核心业务类。它不拼接SQL字符串,而是接收实体对象(StudentEntity),再委托给DAL执行。关键点在于它封装了业务约束——比如“学号必须为8位数字”、“班级不能为空”:

// StudentService.cs 中的添加学生方法 public bool AddStudent(StudentEntity student) { // 业务校验:学号长度、格式 if (string.IsNullOrEmpty(student.StudentID) || student.StudentID.Length != 8 || !long.TryParse(student.StudentID, out _)) { throw new ArgumentException("学号必须为8位数字"); } // 业务校验:班级名非空 if (string.IsNullOrWhiteSpace(student.ClassName)) { throw new ArgumentException("班级名称不能为空"); } // 校验通过,才调用DAL写入数据库 return StudentDAO.Insert(student); }

这种设计让错误提示更友好:UI层捕获ArgumentException后,直接MessageBox.Show(ex.Message),用户看到的是“学号必须为8位数字”,而不是冰冷的“SqlException: 违反约束”。

2.3 DAL层:SQL Server连接与参数化查询的实操细节

StudentDAO.cs使用SqlConnection和SqlCommand,所有查询均采用参数化,杜绝SQL注入。连接字符串存于App.config的<connectionStrings>节,部署时只需改这一处:

<!-- App.config --> <configuration> <connectionStrings> <add name="StudentDB" connectionString="Data Source=.;Initial Catalog=StudentDB;Integrated Security=true;" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>

插入学生记录的代码示例如下,注意@参数占位符和AddWithValue的用法:

// StudentDAO.cs public static bool Insert(StudentEntity student) { string sql = @"INSERT INTO Students (StudentID, Name, Gender, ClassName, BirthDate, Phone, Email) VALUES (@StudentID, @Name, @Gender, @ClassName, @BirthDate, @Phone, @Email)"; using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["StudentDB"].ConnectionString)) { using (var cmd = new SqlCommand(sql, conn)) { // 参数化赋值,避免SQL注入和类型转换错误 cmd.Parameters.AddWithValue("@StudentID", student.StudentID); cmd.Parameters.AddWithValue("@Name", student.Name ?? ""); cmd.Parameters.AddWithValue("@Gender", student.Gender ?? "未知"); cmd.Parameters.AddWithValue("@ClassName", student.ClassName ?? ""); cmd.Parameters.AddWithValue("@BirthDate", student.BirthDate ?? DateTime.Now); cmd.Parameters.AddWithValue("@Phone", student.Phone ?? ""); cmd.Parameters.AddWithValue("@Email", student.Email ?? ""); conn.Open(); int rowsAffected = cmd.ExecuteNonQuery(); return rowsAffected > 0; } } }

参数说明:AddWithValue会自动推断参数类型,对新手友好;但生产环境建议用Add指定SqlDbType(如cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value = student.BirthDate),避免隐式转换导致索引失效。


3. 数据库初始化与本地部署:5分钟跑通SQL Server LocalDB

源码附带StudentDB.sql脚本,但直接在SSMS里执行可能报错——因为脚本默认创建数据库时指定了文件路径(如C:\Program Files\...\StudentDB.mdf),而你的机器上该路径不存在或无写入权限。正确做法是先创建空数据库,再执行建表语句。

3.1 创建LocalDB实例并附加数据库

Visual Studio 2019+ 自带 SQL Server Express LocalDB,无需单独安装。打开“SQL Server Object Explorer”,右键“SQL Server” → “添加SQL Server”,服务器名填(localdb)\mssqllocaldb,身份验证选“Windows身份验证”。然后新建查询,执行:

-- 创建空数据库(路径自动分配到用户目录,无权限问题) CREATE DATABASE StudentDB; GO USE StudentDB; GO

3.2 执行建表与初始数据脚本

复制StudentDB.sql中CREATE TABLE及INSERT INTO部分(跳过CREATE DATABASE语句),粘贴到新查询窗口执行。关键表结构如下:

表名字段说明约束
StudentsStudentID(PK, char(8)),Name(nvarchar(50)),Gender(char(2)),ClassName(nvarchar(20)),BirthDate(date),Phone(varchar(15)),Email(varchar(100))StudentID为主键,ClassName非空
UsersUsername(PK),PasswordHash(varchar(64)),Role(varchar(10))Role值限定为'Admin'或'Teacher'

注意:密码存储为SHA256哈希值(非明文),Users表中预置了两组测试账号:admin/123456(管理员)、teacher/123456(教师)。哈希计算由UserService.HashPassword()完成,源码中已实现,无需额外工具。

3.3 验证连接:App.config配置与连接测试

确保App.config中的连接字符串Data Source指向正确的LocalDB实例。若使用其他SQL Server版本,需修改为:

  • 本地命名实例:Data Source=YOUR-PC\\SQLEXPRESS
  • 远程服务器:Data Source=192.168.1.100,1433

连接测试代码(可临时加到LoginForm_Load事件):

private void LoginForm_Load(object sender, EventArgs e) { try { using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["StudentDB"].ConnectionString)) { conn.Open(); Console.WriteLine("数据库连接成功!当前数据库:" + conn.Database); } } catch (Exception ex) { MessageBox.Show($"数据库连接失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

4. 功能模块实操:从添加学生到Excel导出的全流程验证

系统主界面分左右两栏:左侧树形菜单(学生管理、班级管理、用户管理),右侧Tab页显示对应功能。我们以“添加学生”和“导出Excel”两个高频操作为例,走一遍真实流程。

4.1 添加学生:表单验证与事务一致性

在AdminMainForm中点击“学生管理” → “添加学生”,弹出AddStudentForm.cs。填写时注意:

  • 学号输入框绑定了KeyPress事件,自动过滤非数字字符;
  • 出生日期使用DateTimePicker控件,避免手动输入格式错误;
  • 班级下拉框数据来自ClassDAO.GetAllClasses(),实时读取数据库。

提交前,UI层会二次校验(防绕过JS式校验):

// AddStudentForm.cs 的保存按钮 private void btnSave_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtStudentID.Text) || txtStudentID.Text.Length != 8) { MessageBox.Show("学号必须为8位", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } var student = new StudentEntity { StudentID = txtStudentID.Text, Name = txtName.Text, Gender = cmbGender.SelectedItem?.ToString(), ClassName = cmbClass.SelectedItem?.ToString(), BirthDate = dtpBirthDate.Value, Phone = txtPhone.Text, Email = txtEmail.Text }; try { bool success = StudentService.AddStudent(student); if (success) { MessageBox.Show("添加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.DialogResult = DialogResult.OK; // 关闭窗体 } } catch (ArgumentException ex) { MessageBox.Show(ex.Message, "业务错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } catch (Exception ex) { MessageBox.Show("系统错误:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

逻辑说明:这里捕获了ArgumentException(业务规则错误)和通用Exception(如数据库连接中断),分层提示让用户明确问题性质。

4.2 Excel导出:EPPlus免Office依赖的实现原理

导出功能位于学生列表页右上角“导出Excel”按钮。它不调用Excel COM组件,而是用开源库EPPlus(已引用在StudentInfoSystem.UI项目中)。核心代码在StudentListForm.cs:

private void btnExportExcel_Click(object sender, EventArgs e) { var students = StudentService.GetAllStudents(); // 获取全部学生数据 // 创建Excel包 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 开源版需声明 using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("学生信息"); // 写入表头 worksheet.Cells[1, 1].Value = "学号"; worksheet.Cells[1, 2].Value = "姓名"; worksheet.Cells[1, 3].Value = "性别"; worksheet.Cells[1, 4].Value = "班级"; worksheet.Cells[1, 5].Value = "出生日期"; worksheet.Cells[1, 6].Value = "电话"; worksheet.Cells[1, 7].Value = "邮箱"; // 写入数据(从第2行开始) for (int i = 0; i < students.Count; i++) { worksheet.Cells[i + 2, 1].Value = students[i].StudentID; worksheet.Cells[i + 2, 2].Value = students[i].Name; worksheet.Cells[i + 2, 3].Value = students[i].Gender; worksheet.Cells[i + 2, 4].Value = students[i].ClassName; worksheet.Cells[i + 2, 5].Value = students[i].BirthDate?.ToString("yyyy-MM-dd"); worksheet.Cells[i + 2, 6].Value = students[i].Phone; worksheet.Cells[i + 2, 7].Value = students[i].Email; } // 自动列宽 worksheet.Cells.AutoFitColumns(); // 保存文件 SaveFileDialog sfd = new SaveFileDialog { Filter = "Excel文件 (*.xlsx)|*.xlsx", FileName = $"学生信息_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx" }; if (sfd.ShowDialog() == DialogResult.OK) { File.WriteAllBytes(sfd.FileName, package.GetAsByteArray()); MessageBox.Show($"导出成功!共{students.Count}条记录", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } }

参数说明:ExcelPackage.LicenseContext = LicenseContext.NonCommercial是EPPlus 5.x+的必需声明,否则抛LicenseException;GetAsByteArray()将内存中的Excel生成字节数组,避免文件流未释放问题。


5. 避坑指南:WinForms开发中那些让你重启VS的玄学问题

这套源码虽经多轮调试,但在不同环境部署时仍会遇到典型WinForms“黑匣子”问题。以下是我在某高校机房、学生笔记本、虚拟机三种环境下踩过的坑,按现象→原因→解决整理,亲测有效。

5.1 现象:登录成功后主窗体空白,任务栏有图标但点不开

原因:ShowDialog()阻塞了UI线程,而主窗体的Load事件中执行了耗时操作(如加载大量学生数据),导致窗体未完成绘制就被挂起。
解决:在AdminMainForm_Load中,将数据加载逻辑移至Shown事件(窗体完全显示后触发),或使用BackgroundWorker异步加载:

// 错误写法(Load事件中直接查数据库) private void AdminMainForm_Load(object sender, EventArgs e) { LoadStudentData(); // 卡住UI线程 } // 正确写法(Shown事件中异步加载) private void AdminMainForm_Shown(object sender, EventArgs e) { var worker = new BackgroundWorker(); worker.DoWork += (s, ev) => { ev.Result = StudentService.GetAllStudents(); }; worker.RunWorkerCompleted += (s, ev) => { var students = ev.Result as List<StudentEntity>; BindStudentGrid(students); // 绑定到DataGridView }; worker.RunWorkerAsync(); }

5.2 现象:导出Excel时报错“Could not load file or assembly 'EPPlus'”

原因:EPPlus.dll未随程序发布,或.NET Framework版本不匹配(EPPlus 5.x需.NET Framework 4.5+)。
解决:在解决方案资源管理器中右键EPPlus引用 → “属性”,将Copy Local设为True;检查项目目标框架是否为.NET Framework 4.5或更高(右键项目 → 属性 → 应用程序 → 目标框架)。

5.3 现象:DataGridView双击编辑时,单元格内容被清空

原因:DataGridView的EditMode属性为EditOnKeystrokeOrF2,但未处理CellBeginEdit事件校验输入合法性,导致非法输入触发默认清空行为。
解决:在StudentListForm.cs中设置EditMode = DataGridViewEditMode.EditOnEnter,并在CellValidating事件中拦截:

private void dgvStudents_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.ColumnIndex == 0 && e.FormattedValue.ToString().Length != 8) // 学号列 { e.Cancel = true; // 阻止编辑提交 MessageBox.Show("学号必须为8位数字", "输入错误"); } }

5.4 现象:切换用户角色后,菜单项未刷新(管理员登录后仍显示教师菜单)

原因:主窗体是单例模式,但菜单栏(MenuStrip)未根据角色动态隐藏/显示。
解决:在AdminMainForm和TeacherMainForm构造函数中,根据当前用户角色调用UpdateMenuVisibility()方法:

private void UpdateMenuVisibility() { // 管理员可见:用户管理、系统设置 tsmiUserManagement.Visible = CurrentUser.Role == "Admin"; tsmiSystemSettings.Visible = CurrentUser.Role == "Admin"; // 教师可见:我的班级、成绩录入(此源码未实现,预留接口) tsmiMyClass.Visible = CurrentUser.Role == "Teacher"; }

5.5 现象:在高DPI显示器上界面模糊、字体发虚

原因:WinForms默认不启用DPI感知,Windows缩放设置(如125%)导致控件渲染失真。
解决:在Program.cs的Main方法顶部添加DPI感知声明:

[STAThread] static void Main() { // 启用DPI感知,解决高分屏模糊 SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new LoginForm()); } // P/Invoke声明(需using System.Runtime.InteropServices;) [DllImport("user32.dll")] private static extern bool SetProcessDpiAwarenessContext(IntPtr value); private const IntPtr DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = (IntPtr)(-4);

6. 权限控制进阶:从硬编码角色到可配置权限表的改造技巧

源码当前的权限控制是硬编码的——UserService.Authenticate()返回Role字段,UI层用if (role=="Admin")判断。这在教学系统中够用,但若要扩展(比如增加“班主任”角色,只允许管理本班学生),就得升级为基于权限表的动态控制。我一般会用三步完成平滑改造,不伤现有代码。

6.1 第一步:设计权限表结构,兼容旧逻辑

在SQL Server中新增两张表,不删除原Users.Role字段,作为过渡:

表名字段说明
RolesRoleID(int, PK),RoleName(nvarchar(20))存储角色名,如'Admin','Teacher'
RolePermissionsRoleID(FK),PermissionCode(varchar(20))角色-权限映射,如(1,'STUDENT_ADD'),(1,'STUDENT_EXPORT')

关键设计:PermissionCode用英文短码(非中文),便于代码中用switch或字典匹配,也方便未来做API权限。

6.2 第二步:重构UserService,提供权限检查门面

在UserService.cs中新增方法,将旧的Role字段转为权限集合:

// 新增:根据用户名获取权限列表 public static List<string> GetUserPermissions(string username) { var permissions = new List<string>(); // 兼容旧逻辑:先查Users表的Role字段 var user = GetUserByUsername(username); if (user?.Role == "Admin") { // 管理员拥有全部权限(可配置化后改为查RolePermissions表) return GetAllPermissions(); // 返回预定义的全量权限列表 } // 新逻辑:查RolePermissions表 string sql = @"SELECT p.PermissionCode FROM RolePermissions p INNER JOIN Users u ON p.RoleID = u.RoleID WHERE u.Username = @Username"; using (var conn = new SqlConnection(...)) { using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@Username", username); conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { permissions.Add(reader["PermissionCode"].ToString()); } } } } return permissions; } // 工具方法:检查用户是否拥有某权限 public static bool HasPermission(string username, string permissionCode) { return GetUserPermissions(username).Contains(permissionCode); }

6.3 第三步:UI层权限控制自动化,避免散落if

在AdminMainForm基类中,统一管理菜单/按钮的可见性与启用状态。创建PermissionManager类:

public class PermissionManager { private readonly string _currentUser; public PermissionManager(string username) => _currentUser = username; // 根据权限码批量控制控件 public void ApplyPermission<T>(T control, string permissionCode) where T : Control { bool hasPerm = UserService.HasPermission(_currentUser, permissionCode); control.Visible = hasPerm; control.Enabled = hasPerm; // 对按钮还控制Enabled } } // 在AdminMainForm中使用 private PermissionManager _permMgr; private void AdminMainForm_Load(object sender, EventArgs e) { _permMgr = new PermissionManager(CurrentUser.Username); // 一行代码控制多个控件 _permMgr.ApplyPermission(tsmiAddStudent, "STUDENT_ADD"); _permMgr.ApplyPermission(tsmiExportExcel, "STUDENT_EXPORT"); _permMgr.ApplyPermission(btnDeleteStudent, "STUDENT_DELETE"); }

血泪经验:从那以后我每次接手WinForms老项目,第一件事就是加这个PermissionManager——它把权限逻辑从几十个if语句里抽出来,改一个地方,全系统生效。再也不用担心漏掉某个按钮的权限判断,也不用翻遍所有.cs文件找if (role=="Admin")。希望帮到你。

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

相关新闻

贪心算法与优先队列:任务调度的反悔机制详解

贪心算法与优先队列:任务调度的反悔机制详解

拿到这题&#xff0c;我第一反应是——懂了&#xff0c;又是披着物理外衣的调度题。题目叫“物理实验”&#xff0c;听着像要推公式、算误差、搞单位换算&#xff0c;结果一读题面&#xff0c;n个实验&#xff0c;每个实验有耗时和截止时间&#xff0c;问最多能做几个。这不就是…

2026/10/20 9:27:20 阅读更多 →
异方差检验与稳健标准误:回归分析中不可忽视的隐形陷阱

异方差检验与稳健标准误:回归分析中不可忽视的隐形陷阱

1. 同方差假设的“人设”崩塌——为什么真实数据总难让残差保持一个身材如果你跑过哪怕一次多元线性回归&#xff0c;都会对那一长串输出里的某个角落有印象&#xff1a;回归结果表格里&#xff0c;除了系数、标准误、t 值、p 值之外&#xff0c;模型还会同步输出一整套检验统计…

2026/10/20 9:27:20 阅读更多 →
可视化数据看板设计实战:从指标梳理到性能优化的完整指南

可视化数据看板设计实战:从指标梳理到性能优化的完整指南

手头接了那么多数据&#xff0c;老板要一个“能看的”&#xff0c;客户要一个“高级的”&#xff0c;领导想一眼看出业务涨跌——可视化数据看板这活儿&#xff0c;看着简单&#xff0c;真正做起来能踩的坑太多了。我见过太多“看板翻车现场”&#xff1a;指标堆了几十个没人看…

2026/10/20 9:27:20 阅读更多 →

最新新闻

scrcpy 录屏把码率从 8Mbps 降到 2Mbps,反而不再丢帧

scrcpy 录屏把码率从 8Mbps 降到 2Mbps,反而不再丢帧

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

2026/10/21 2:26:53 阅读更多 →
第一章 C++语言概述

第一章 C++语言概述

第一章 C语言概述语言是怎么走到今天这样的&#xff0c;C 的特点和版本怎么选&#xff0c;一个程序由哪几块拼成&#xff0c;第一个程序从写下来到跑起来中间发生了什么。底子打牢&#xff0c;后面看到报错才知道往哪查。┌─────────────────────────…

2026/10/21 2:26:53 阅读更多 →
STM32时钟树与RCC寄存器深度解析:从库函数到寄存器操作

STM32时钟树与RCC寄存器深度解析:从库函数到寄存器操作

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

2026/10/21 2:26:53 阅读更多 →
第85章 「非对称的博弈」

第85章 「非对称的博弈」

“现实世界模拟器”的巨幅全息投影上&#xff0c;一条猩红色的能量流如同溃堤的洪水&#xff0c;正沿着预设的“资本通道”向代表着国内某关键资本市场的区域汹涌扑来。旁边&#xff0c;代表“弦飞资本”及其“黄金同盟”力量的蓝色防线&#xff0c;虽然层层布设&#xff0c;却…

2026/10/21 2:26:53 阅读更多 →
RF Spectrum Sharing: Wi-Fi, Bluetooth, and IEEE 802.15.4 in the 2.4 GHz Band

RF Spectrum Sharing: Wi-Fi, Bluetooth, and IEEE 802.15.4 in the 2.4 GHz Band

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

2026/10/21 2:26:53 阅读更多 →
Wi-Fi MAC Layer: Scanning, Authentication, Association, and Data Transmission Processes

Wi-Fi MAC Layer: Scanning, Authentication, Association, and Data Transmission Processes

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

2026/10/21 2:25:53 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于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 阅读更多 →