news 2026/10/11 21:54:37

SQL Server职工考勤管理信息系统课程设计:六表建库、存储过程与触发器实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL Server职工考勤管理信息系统课程设计:六表建库、存储过程与触发器实战

简介:这份数据库课程设计文档面向计算机专业学生与数据库初学者,围绕职工考勤管理信息系统的完整设计流程展开,帮助读者掌握从需求分析到数据库实施的全套方法。文档共1个doc文件,压缩包约316KB,内容涵盖概述、需求分析、概念结构设计、逻辑结构设计、物理结构设计及数据库实施等章节,具体包括功能需求、数据流图、功能模块图、局部与整体E-R图、关系模式、数据关系图、存储记录结构、索引创建、数据表与存储过程、触发器等知识点,目录结构完整,便于按模块查阅与参考。目前已有67人学习,适合作为课程设计参考模板或数据库设计练习的对照材料,读者可借此理清E-R图绘制、关系模式转换与SQL实施之间的衔接思路,快速搭建符合规范的考勤管理数据库方案。

1. 从一份课程设计文档说起:职工考勤管理信息系统到底能跑通什么

很多同学做数据库课程设计,选题第一反应就是“学生管理系统”或者“图书管理系统”,结果答辩时老师一听就皱眉——太烂大街了。这份《职工考勤管理信息系统》课程设计文档,选题方向其实更贴近真实企业场景:员工基本信息、出勤记录、出差、加班、请假、月统计,六张核心表加上存储过程和触发器,完整覆盖了数据库课程设计从需求分析到物理结构设计的全流程。它不是一份只讲理论的论文,而是一套可以照着在 SQL Server 里跑起来的建库建表脚本加业务逻辑实现。适合正在做数据库课设的本科生、需要快速搭一个考勤数据模型原型的开发者,以及想复习 SQL Server 存储过程和触发器写法的从业者。文档里给出的 E-R 图、关系模式、建表语句、索引创建、存储过程和触发器代码,基本构成了一个闭环——你照着敲一遍,就能得到一个能增删改查、能自动统计月考勤的数据库。下面我从这份文档的实际内容出发,把怎么落地、参数怎么设、哪里容易翻车,一条条拆开讲。

2. 概念结构到逻辑结构:六张表怎么从 E-R 图落到关系模式

2.1 局部 E-R 图里的实体和联系,决定了后面表怎么拆

文档第 3 章画了六张局部 E-R 图,分别对应员工、出勤、出差、加班、请假、月统计。很多人看 E-R 图就是走个过场,直接跳到建表,结果表建出来要么字段冗余,要么关联关系对不上。这里的关键是先把实体和联系分清楚。

员工是核心实体,属性有职工编号、姓名、性别、年龄、职称。出勤、出差、加班、请假这四个都是“员工”参与的的业务事件,每个事件都有自己的编号和时间属性。月统计则是一个汇总实体,它的属性是出勤月统计、出差月统计、加班月统计、请假月统计,本质上是对前四类事件按月做聚合。

从 E-R 图到关系模式的转换规则很直接:每个实体转一张表,一对多联系把“一”端的主键放到“多”端做外键。文档第 4 章给出的关系模式是这样的:

  • 职工(职工编号,姓名,性别,年龄,职称)
  • 出勤记录(职工编号,出勤编号,上班时间,下班时间,缺勤记录)
  • 出差记录(职工编号,出差编号,开始时间,结束时间,统计天数)
  • 加班信息(职工编号,加班编号,加班开始时间,加班结束时间,加班时间统计)
  • 请假信息(职工编号,请假编号,请假开始时间,请假结束时间,请假时间统计)
  • 月统计(职工编号,出勤月统计,出差月统计,加班月统计,请假月统计)

注意出勤、出差、加班、请假这四张表的主键都是复合主键——职工编号加各自的业务编号。这个设计是合理的,因为同一个员工在同一个月可以有多条出勤记录、多条出差记录,业务编号单独做主键不够,必须和职工编号组合才能唯一标识一条记录。月统计表则以职工编号作为主键,因为每个员工每月只有一条汇总记录。

2.2 物理结构设计:字段类型和约束怎么定才不翻车

文档第 5 章给出了每张表的字段类型和约束,这部分是建表前必须敲定的。我把它整理成一张对照表,方便你建表时直接参考:

表名字段类型约束说明
职工信息表w_idCHAR(4)主键职工编号,固定4位
职工信息表w_nameCHAR(6)非空姓名
职工信息表w_sexCHAR(2)CHECK(‘男’或‘女’)性别
职工信息表w_ageINT非空年龄
职工信息表w_degreeCHAR(4)非空职称
出勤记录表w_idCHAR(4)复合主键职工编号
出勤记录表w_numINT复合主键出勤编号
出勤记录表work_timDATETIME允许空上班时间
出勤记录表end_timDATETIME允许空下班时间
出勤记录表work_noteDATETIME允许空缺勤记录
出差记录表w_idCHAR(4)复合主键职工编号
出差记录表out_numINT复合主键出差编号
出差记录表out_timDATETIME允许空开始时间
出差记录表back_timDATETIME允许空结束时间
出差记录表out_daysINT允许空统计天数
加班记录表w_idCHAR(4)复合主键职工编号
加班记录表over_numINT复合主键加班编号
加班记录表over_timDATETIME允许空开始时间
加班记录表overend_timDATETIME允许空结束时间
加班记录表over_daysINT允许空时间统计
请假记录表w_idCHAR(4)复合主键职工编号
请假记录表off_numINT复合主键请假编号
请假记录表off_timDATETIME允许空请假开始时间
请假记录表offend_timDATETIME允许空请假结束时间
请假记录表off_daysINT允许空统计天数
月统计表w_idCHAR(4)主键职工编号
月统计表work_noteINT非空出勤月统计
月统计表out_noteINT允许空出差月统计
月统计表over_noteINT允许空加班月统计
月统计表off_noteINT允许空请假月统计

这里有几个参数选择值得展开说。职工编号用 CHAR(4) 而不是 INT,是因为学号、工号这类编号经常有前导零,用字符类型能保留格式。性别字段用 CHAR(2) 加 CHECK 约束,比用 BIT 或 INT 更直观,查询的时候不用做映射。时间字段统一用 DATETIME,精度到毫秒,对于考勤场景够用。统计天数字段用 INT,因为请假和出差通常按整天算,如果你们公司按小时请假,那这个字段就得改成 DECIMAL 或者单独加一个按小时统计的字段。

月统计表的 w_id 类型在文档里写的是 CHAR(6),但职工信息表里是 CHAR(4),这是一个明显的笔误。建表的时候必须统一成 CHAR(4),否则后面创建外键或者做关联查询时会报类型不匹配的错误。这种细节在课程设计文档里经常出现,照着敲的时候要留个心眼。

2.3 索引和约束:唯一索引加在哪儿,CHECK 约束怎么写

文档第 5.2 节给出了一个索引创建语句:

CREATE INDEX M1 ON mounth_note(w_id) GO EXEC sp_helpIndex mounth_note

这里创建的是一个普通索引,不是唯一索引。文档正文写的是“创建唯一索引”,但代码里没有加 UNIQUE 关键字。如果你确实需要唯一索引,应该写成:

CREATE UNIQUE INDEX M1 ON mounth_note(w_id) GO

不过月统计表的 w_id 已经是主键了,主键默认就会创建唯一聚集索引,再建一个唯一索引意义不大。如果是为了加速按职工编号查询月统计记录,普通索引就够了。sp_helpIndex是 SQL Server 的系统存储过程,用来查看指定表上的索引信息,执行后会返回索引名称、描述、索引键列等。

CHECK 约束在职工信息表里用在了性别字段上:

SEX CHAR(2) CONSTRAINT SEX_Chk CHECK(SEX='男' OR SEX='女') NOT NULL

这个约束保证了性别字段只能录入“男”或“女”,防止脏数据。注意 CHAR(2) 对于中文“男”和“女”来说刚好够用,因为一个中文字符在 SQL Server 里占两个字节,CHAR(2) 能存一个汉字。如果你用 VARCHAR(2) 也行,但 CHAR 是定长,对于这种固定长度的字段更合适。

3. 数据库实施:建库建表、存储过程和触发器的完整落地

3.1 建库语句里的文件参数怎么改

文档第 6.1 节给出了建库语句:

CREATE DATABASE worker ON ( NAME = worker_data, FILENAME = 'f:\worker.mdf', SIZE = 3, FILEGROWTH = 1 ) LOG ON ( NAME = worker_LOG, FILENAME = 'C:\worker_log.ldf', SIZE = 1, MAXSIZE = 50, FILEGROWTH = 10% )

这段代码创建了一个名为 worker 的数据库,包含一个数据文件和一个日志文件。几个关键参数:SIZE = 3 表示初始大小 3MB,FILEGROWTH = 1 表示每次自动增长 1MB。日志文件的 MAXSIZE = 50 表示日志文件最大 50MB,FILEGROWTH = 10% 表示按当前大小的 10% 增长。

实际执行时,FILENAME 里的路径必须是你机器上真实存在的目录。如果 f 盘不存在,这条语句会直接报错。我一般会把路径改成 SQL Server 默认的数据目录,或者提前用mkdir建好目录。另外 SIZE 的单位是 MB,FILEGROWTH 如果不带单位默认也是 MB,带 % 就是按百分比增长。对于课程设计这种小数据量场景,初始 3MB 够用,但如果后面要批量插入测试数据,建议把 SIZE 调到 10MB 以上,避免频繁自动增长影响性能。

3.2 六张表的建表语句和字段修正

文档第 6.2 节给出了六张表的建表语句,我按顺序整理并标注了需要注意的地方。

员工信息表:

CREATE TABLE worker ( W_id CHAR(4) CONSTRAINT worker_Prim PRIMARY KEY, w_name CHAR(6) NOT NULL, SEX CHAR(2) CONSTRAINT SEX_Chk CHECK(SEX='男' OR SEX='女') NOT NULL, AGE INT NOT NULL, w_drgee VARCHAR(4) NOT NULL )

注意w_drgee这个字段名拼写有误,应该是w_degree。建表时建议改过来,不然后面写查询语句容易打错。另外 VARCHAR(4) 对于职称来说可能不够,比如“高级工程师”是五个字,VARCHAR(4) 存不下。建议改成 VARCHAR(10) 或 NVARCHAR(10)。

出勤记录表:

CREATE TABLE work_note ( W_id CHAR(4), w_num INT, CONSTRAINT work_note_Prim PRIMARY KEY(W_id, w_num), work_tim DATETIME, end_tim DATETIME, work_note DATETIME )

这里有个命名冲突:表名是 work_note,字段名也有一个 work_note。虽然 SQL Server 允许这样,但写查询的时候容易混淆。建议把字段名改成absence_note或者work_remark。另外缺勤记录用 DATETIME 类型不太合理,缺勤记录应该是文本描述,比如“迟到 15 分钟”或“事假半天”,用 VARCHAR(50) 更合适。

出差记录表:

CREATE TABLE out_note ( W_id CHAR(4), out_num INT, CONSTRAINT out_note_Prim PRIMARY KEY(W_id, out_num), out_tim DATETIME, back_tim DATETIME, out_days INT )

加班记录表:

CREATE TABLE over_note ( W_id CHAR(4), over_num INT, CONSTRAINT over_note_Prim PRIMARY KEY(W_id, over_num), over_tim DATETIME, overend_tim DATETIME, over_days INT )

请假记录表:

CREATE TABLE off_note ( W_id CHAR(4), off_num INT, CONSTRAINT off_note_Prim PRIMARY KEY(W_id, off_num), off_tim DATETIME, offend_tim DATETIME, off_days INT )

月统计表:

CREATE TABLE mounth_note ( w_id CHAR(6) CONSTRAINT mounth_Prim PRIMARY KEY, work_note INT NOT NULL, out_note INT, over_note INT, off_note INT )

前面提过,这里的 w_id 类型 CHAR(6) 和职工信息表的 CHAR(4) 不一致,必须改成 CHAR(4)。另外表名mounth_note拼写有误,应该是month_note。这些拼写问题在课程设计文档里很常见,照着敲的时候顺手改掉,不然后面写关联查询时自己都记不住哪个是哪个。

3.3 存储过程:插入出勤记录并自动验证

文档第 6.3 节创建了一个向出勤表插入数据的存储过程:

CREATE PROCEDURE insert_in ( @W_id CHAR(4), @w_num INT, @work_tim DATETIME, @end_tim DATETIME, @work_note DATETIME ) AS INSERT INTO work_note VALUES(@W_id, @w_num, @work_tim, @end_tim, @work_note) GO EXEC insert_in @W_id='0001', @w_num=1, @work_tim='2010/11/1', @end_tim='2010/11/1', @work_note=NULL GO SELECT * FROM work_note

这个存储过程接收五个参数,直接插入到 work_note 表。参数含义:@W_id 是职工编号,@w_num 是出勤编号,@work_tim 是上班时间,@end_tim 是下班时间,@work_note 是缺勤记录。执行时传入具体值,然后查询全表验证插入结果。

这个存储过程比较简单,没有做参数校验。实际用的时候,我一般会在插入前加一个判断,检查该职工编号是否存在于 worker 表,以及该出勤编号是否已经存在,避免插入重复记录。比如:

CREATE PROCEDURE insert_in ( @W_id CHAR(4), @w_num INT, @work_tim DATETIME, @end_tim DATETIME, @work_note DATETIME ) AS BEGIN IF NOT EXISTS (SELECT 1 FROM worker WHERE W_id = @W_id) BEGIN RAISERROR('职工编号不存在', 16, 1) RETURN END IF EXISTS (SELECT 1 FROM work_note WHERE W_id = @W_id AND w_num = @w_num) BEGIN RAISERROR('该出勤编号已存在', 16, 1) RETURN END INSERT INTO work_note VALUES(@W_id, @w_num, @work_tim, @end_tim, @work_note) END GO

这样调用方就能得到明确的错误提示,而不是插入一条脏数据。

3.4 触发器:插入考勤记录时自动更新月统计

文档第 6.4 节创建了两个触发器,一个是插入出勤记录时更新月统计,另一个是插入员工时初始化月统计记录。

第一个触发器:

CREATE TRIGGER mounth_insert ON work_note FOR INSERT AS BEGIN IF UPDATE(w_id) UPDATE mounth_note SET work_note = ( SELECT COUNT(work_tim) FROM work_note WHERE w_id = (SELECT W_id FROM inserted) GROUP BY w_id ) WHERE w_id = (SELECT W_id FROM inserted) END

这个触发器在 work_note 表上监听 INSERT 操作。当插入一条出勤记录时,它统计该员工在 work_note 表中的出勤次数,然后更新 mounth_note 表的 work_note 字段。逻辑上没问题,但有一个隐患:如果 mounth_note 表中还没有该员工的记录,UPDATE 语句不会报错,但也不会有任何行被更新,月统计就丢了。所以更稳妥的做法是先判断是否存在,不存在则插入:

CREATE TRIGGER mounth_insert ON work_note FOR INSERT AS BEGIN DECLARE @w_id CHAR(4) SELECT @w_id = W_id FROM inserted IF EXISTS (SELECT 1 FROM mounth_note WHERE w_id = @w_id) BEGIN UPDATE mounth_note SET work_note = (SELECT COUNT(work_tim) FROM work_note WHERE w_id = @w_id) WHERE w_id = @w_id END ELSE BEGIN INSERT INTO mounth_note(w_id, work_note, out_note, over_note, off_note) VALUES(@w_id, 1, 0, 0, 0) END END

第二个触发器:

CREATE TRIGGER worker_insert ON worker FOR INSERT AS BEGIN DECLARE @id CHAR(20) SELECT @id = W_id FROM inserted IF UPDATE(W_id) INSERT INTO mounth_note VALUES(@id, '0', '0', '0', '0') END

这个触发器在 worker 表上监听 INSERT,当新增员工时,自动在 mounth_note 表中插入一条初始记录,各项统计值为 0。注意 @id 声明为 CHAR(20),但 mounth_note 的 w_id 是 CHAR(4),这里类型不匹配,实际执行时可能会截断或报错。建议改成 CHAR(4)。

还有一个删除触发器:

CREATE TRIGGER delete_data ON worker FOR DELETE AS DELETE FROM work_note WHERE w_id = (SELECT w_id FROM deleted)

这个触发器实现了级联删除:删除员工时,自动删除该员工在 work_note 表中的所有出勤记录。但文档只写了删除出勤记录,没有删除出差、加班、请假和月统计记录。如果要做完整的级联删除,需要把其他几张表也加上:

CREATE TRIGGER delete_data ON worker FOR DELETE AS BEGIN DECLARE @w_id CHAR(4) SELECT @w_id = w_id FROM deleted DELETE FROM work_note WHERE w_id = @w_id DELETE FROM out_note WHERE w_id = @w_id DELETE FROM over_note WHERE w_id = @w_id DELETE FROM off_note WHERE w_id = @w_id DELETE FROM mounth_note WHERE w_id = @w_id END

另外文档还创建了一个视图:

CREATE VIEW mywork AS SELECT worker.W_id, w_name, SEX, AGE, w_drgee, work_note, over_note, out_note, off_note FROM worker, mounth_note WHERE worker.W_id = mounth_note.w_id

这个视图把员工基本信息和月统计信息关联在一起,方便查询。注意这里用的是逗号连接加 WHERE 条件,属于隐式内连接,写成 INNER JOIN 更规范。

4. 避坑与排查:这份课程设计文档里最容易翻车的五个地方

4.1 字段类型不一致导致外键创建失败

现象:执行建表语句时,mounth_note 表的 w_id 定义为 CHAR(6),而 worker 表的 W_id 是 CHAR(4),后面想加外键约束时直接报错“列类型不匹配”。

原因:文档在编写过程中出现了笔误,月统计表的 w_id 长度写成了 6,但实际应该和职工信息表保持一致。

解决:建表前统一检查所有表中 w_id 的类型,全部改成 CHAR(4)。如果表已经建好了,用 ALTER TABLE 修改字段类型,但要注意如果表里已有数据,修改类型可能会截断数据。

4.2 触发器里 SELECT 赋值多行时静默丢数据

现象:批量插入多条出勤记录时,月统计只更新了其中一条,其他员工的统计没变。

原因:触发器里用SELECT @w_id = W_id FROM inserted这种写法,当 inserted 表里有多行时,SQL Server 只会取其中一行的值赋给变量,其他行被忽略。这是 T-SQL 触发器里非常经典的坑。

解决:触发器逻辑必须基于集合操作,不能假设 inserted 只有一行。正确写法是直接用 INSERTED 表和目标表做 JOIN 更新:

CREATE TRIGGER mounth_insert ON work_note FOR INSERT AS BEGIN UPDATE mounth_note SET work_note = (SELECT COUNT(*) FROM work_note wn WHERE wn.w_id = mounth_note.w_id) FROM mounth_note mn INNER JOIN inserted i ON mn.w_id = i.W_id END

4.3 存储过程参数顺序和 VALUES 顺序对不上

现象:调用存储过程插入数据后,查询发现上班时间和下班时间反了,或者缺勤记录字段里存进了时间值。

原因:CREATE PROCEDURE 里定义的参数顺序是 @W_id, @w_num, @work_tim, @end_tim, @work_note,INSERT INTO 的 VALUES 也按这个顺序。但如果表结构里字段顺序变了,或者调用时用了不按顺序的参数传递方式,就容易错位。

解决:存储过程里不要用INSERT INTO 表 VALUES(...)这种省略列名的写法,显式写出列名:

INSERT INTO work_note(W_id, w_num, work_tim, end_tim, work_note) VALUES(@W_id, @w_num, @work_tim, @end_tim, @work_note)

这样即使表结构调整了字段顺序,也不会插错。

4.4 建库路径不存在导致 CREATE DATABASE 直接失败

现象:执行建库语句时报错“无法创建文件,因为路径不存在”或“拒绝访问”。

原因:FILENAME 里写的f:\worker.mdf和C:\worker_log.ldf是文档作者的机器路径,你的机器上不一定有 f 盘,或者 C 盘根目录没有写入权限。

解决:把 FILENAME 改成 SQL Server 默认数据目录,或者提前建好目录。查询默认目录可以用:

SELECT SERVERPROPERTY('InstanceDefaultDataPath') AS DataPath, SERVERPROPERTY('InstanceDefaultLogPath') AS LogPath

然后把建库语句里的路径替换成查出来的目录。

4.5 月统计表初始记录缺失导致 UPDATE 无效

现象:新增员工后没有自动在 mounth_note 表里生成初始记录,后面插入出勤记录时触发器执行 UPDATE 但影响行数为 0,月统计一直是空的。

原因:worker_insert 触发器可能因为类型不匹配(@id CHAR(20) vs w_id CHAR(4))而执行失败,或者插入顺序不对——先插了出勤记录再插员工信息,触发器执行时 mounth_note 里还没有对应记录。

解决:确保先插入员工信息,再插入出勤记录。同时修正 worker_insert 触发器里的变量类型,并在 mounth_insert 触发器里加上“不存在则插入”的逻辑,双保险。

5. 进阶用法:用视图和查询把月统计做成可验证的报表

5.1 用视图 mywork 做联查,再补一个按部门汇总的查询

文档里创建的 mywork 视图把员工基本信息和月统计关联在一起,但缺少部门维度。如果你们的考勤系统需要按部门统计,可以在 worker 表里加一个 dept 字段,然后扩展视图:

ALTER TABLE worker ADD dept VARCHAR(20) CREATE OR ALTER VIEW mywork_dept AS SELECT w.W_id, w.w_name, w.dept, w.SEX, w.AGE, w.w_drgee, m.work_note, m.out_note, m.over_note, m.off_note FROM worker w INNER JOIN mounth_note m ON w.W_id = m.w_id

然后按部门汇总:

SELECT dept, COUNT(*) AS 人数, SUM(work_note) AS 总出勤次数, SUM(out_note) AS 总出差天数, SUM(over_note) AS 总加班天数, SUM(off_note) AS 总请假天数 FROM mywork_dept GROUP BY dept

这个查询能直接输出每个部门的考勤汇总,比单看月统计表直观得多。

5.2 验证触发器是否真的生效:三步检查法

触发器这种东西,写完了不验证等于没写。我一般用三步检查法:

第一步,查触发器是否存在:

SELECT name, is_disabled FROM sys.triggers WHERE parent_id = OBJECT_ID('work_note')

如果 is_disabled 是 1,说明触发器被禁用了,需要ENABLE TRIGGER mounth_insert ON work_note启用。

第二步,插入一条测试数据,观察月统计表变化:

INSERT INTO work_note(W_id, w_num, work_tim, end_tim, work_note) VALUES('0001', 1, '2024-01-01 09:00', '2024-01-01 18:00', NULL) SELECT * FROM mounth_note WHERE w_id = '0001'

如果 mounth_note 里 work_note 字段从 0 变成了 1,说明触发器生效了。

第三步,删除测试数据,确认级联删除也正常:

DELETE FROM worker WHERE W_id = '0001' SELECT * FROM work_note WHERE W_id = '0001' SELECT * FROM mounth_note WHERE w_id = '0001'

三张表都查不到记录,说明删除触发器也生效了。

5.3 一个我踩过的坑:触发器嵌套导致死循环

最后说一个血泪经验。有一次我在 work_note 表上写了插入触发器去更新 mounth_note,又在 mounth_note 表上写了更新触发器去反查 work_note,结果两个触发器互相触发,SQL Server 直接报“最大嵌套层数超出”。后来查资料才知道,SQL Server 默认允许触发器嵌套 32 层,超过就报错。解决办法是在触发器里加IF TRIGGER_NESTLEVEL() > 1 RETURN,或者干脆避免在两张表上写互相引用的触发器。从那以后我每次写触发器之前,都会先画一张触发关系图,确认不会形成环,再动手写代码。

希望这份拆解能帮你把课程设计顺利跑通。

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

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

Kafka实战从零入门:核心概念、环境搭建与代码示例

后台经常有人问我:Kafka 到底是个什么东西,为什么每个技术岗位的 JD 里都写着“熟悉 Kafka 优先”?尤其是刚转行或者还在校的同学,看了一堆概念还是不知道它解决什么问题、代码到底怎么写。这篇我就从零开始,用最直白的…

作者头像 李华
网站建设 2026/10/11 21:50:38

OpenClaw 必装 Skill 总结:healthcheck 与 node-connect 的配置要点

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

作者头像 李华
网站建设 2026/10/11 21:50:35

Matlab脉冲压缩仿真:从LFM信号生成到距离像输出

简介:本资源是一套面向电子信息工程、计算机及数学专业本科生的雷达信号处理教学仿真工具,聚焦脉冲压缩核心原理,解决课程设计、期末大作业与毕业设计中缺乏可运行实操案例的痛点。压缩包共10个文件,含2个关键MATLAB源码&#xff…

作者头像 李华
网站建设 2026/10/11 21:49:59

深度学习边缘检测实战:从Canny到HED/RCF模型训练与部署

简介:面向计算机相关专业学生与开发者的边缘检测深度学习项目,整合了完整Python源码、预训练模型权重与配套数据集,可快速上手完成图像边缘检测实验,适用于课程设计、毕业设计及入门进阶。压缩包共34个文件,约8.72MB&a…

作者头像 李华
网站建设 2026/10/11 21:49:16

2026毕业论文降AI率全攻略:从30%到10%的工具与实操

2026年毕业季,AIGC检测已经成为论文送审前最让本科生和研究生头疼的一道关卡。我在毕业群里看到的真实场景是这样的:导师通知“论文AI率高于10%暂缓送审”,紧接着就有学生晒出检测报告,AI率32.6%,下面跟着一整排的吐槽…

作者头像 李华