news 2026/10/10 3:01:50

在线考试系统毕设项目包:从环境搭建到答辩通关指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在线考试系统毕设项目包:从环境搭建到答辩通关指南

简介:这份在线考试系统资料包内含毕业设计论文与完整源码,面向计算机相关专业学生、软件开发人员及教育技术研究者,可用于课程设计、毕业设计或二次开发参考。压缩包共378个文件,核心代码以C#(179个cs文件)和ASP.NET页面(68个aspx文件)为主,辅以Master页面、CSS样式、JS脚本、数据库脚本及配置文件,图片与文档资源也一并收录,整体仅4.27MB,结构清晰便于查用。系统覆盖用户管理、题库管理、考试管理、在线答题、自动评卷与成绩分析等模块,论文部分详细阐述设计原理与实现技术,源码可直接部署运行,并附带数据库文件(mdf)与SQL脚本,方便快速搭建环境。该资源已有52人学习,适合需要快速理解在线考试系统整体架构、获取可运行示例的开发者参考借鉴。

1. 在线考试系统(论文+源码)能解决什么:先给结论

在线考试系统(论文+源码)这个项目包,是计算机类毕业设计里出现频率最高的选题之一。它解决的问题很直接:给出一套能答辩的完整交付物——论文加可运行的源码,避开从零开始造轮子的两个空白月。但拿到包只是起点,真正决定答辩过不过的,是你能否把它跑起来、改得动、讲得清。这套东西适合需要完成课程设计、毕业设计的学生,也适合想快速走通一个全栈 Web 项目链路的新手。下面按我的实操习惯,把这条路径拆给你看。

2. 拿到项目包别急着跑:技术栈识别与架构摸底

2.1 从目录结构识别技术栈:先看根目录再动手

很多同学拿到 zip 后第一反应是解压、双击、报错、崩溃。我一般会先花 10 分钟做一件事:看根目录文件。这一步能省下后面一整天的环境折腾。项目包的正确定位不是“双击就能跑的神器”,而是“一套需要你接管并复现的环境快照”,识别它用了什么技术栈,是接管的第一步。

# 解压后先看根目录,不要急着点任何文件 unzip 在线考试系统_kaic.zip -d exam_project ls -la exam_project

根目录出现pom.xml说明是 Maven 管理的 Java 项目;如果出现build.gradle则是 Gradle;requirements.txt指向 Python 系;composer.json是 PHP;package.json单独存在则大概率是纯前端或 Node 项目。在线考试系统这类毕设包最常见的技术组合是 Java Spring Boot + MyBatis + MySQL,前端可能是 Vue 独立项目,也可能是 Thymeleaf 模板。

判断依据很具体:pom.xml里有spring-boot-starter-parent就是 Spring Boot;src/main/resources下存在application.yml或application.properties说明后端配置都在这里集中管理。这里有个血泪经验:不要相信项目包里 README 写的环境说明。README 里的版本往往是作者在自己机器上复制来的,跟实际代码依赖经常对不上。准确信息来源只有三个——pom.xml里的依赖版本号、前端package.json里的依赖列表、数据库脚本里的建表语句。

2.2 数据模型先行:从 ER 图看懂系统边界

在线考试系统的本质是一套围绕“考试”事件的数据流转系统。论文里通常有 ER 图(实体关系图),源码包里一般有sql/目录下的建表脚本。先把表结构过一遍,比先读代码高效得多。我见过太多人上来就跑代码,跑通了却不知道系统有哪些模块,答辩被问一句“你的数据库为什么这样设计”就卡壳。

核心表一般是这几张:

表名职责关键字段
sys_user / t_user用户表id, username, password, role
t_question题库表id, subject, type, content, options, answer, difficulty
t_paper试卷表id, paper_name, total_score, duration
t_paper_question试卷题目关联表paper_id, question_id, score
t_exam_record考试记录表id, user_id, paper_id, start_time, submit_time
t_answer_detail答题明细表record_id, question_id, user_answer, is_correct
t_score成绩表id, user_id, paper_id, score, rank

我一般会画一遍三条链路:出题链路(教师 → 管理题库 → 组卷 → 发布考试)、考试链路(学生 → 登录 → 开始考试 → 答题 → 提交 → 自动阅卷 → 得分)、管理链路(管理员 → 用户管理 → 数据统计)。把三条链路上的表对应清楚,系统的功能边界就出来了。答辩时被问“系统有哪些功能模块”,回答框架就来自这三条链路,而不是现场翻菜单。

2.3 论文与源码的对应关系:从目录级导读开始

项目包里的论文一般按这个结构组织:摘要、绪论、需求分析、系统设计、数据库设计、系统实现、系统测试、总结与展望。它和源码的对应关系是固定的——需求分析对应前端页面和接口清单,系统设计对应后端模块划分,数据库设计对应sql/下的建表脚本,系统实现对应各业务模块的核心代码。

拿到包后建议做一个对照清单:论文里的功能点、源码里的 Controller 接口、前端菜单,三者逐个打勾。这个动作听起来繁琐,但它是答辩前最重要的校准。常见问题是论文写了“短信验证码登录”,源码里实际只做了邮箱找回密码;论文数据库设计画了 9 张表,源码里实体类只有 6 个。这些不一致在答辩时是硬伤,老师翻开论文对着演示系统一眼就能看出来。

处理的办法也简单:以源码为准,论文里缺失或夸大的功能,要么补齐实现,要么删改论文描述。大部分线下课程设计和毕设,老师更看重“系统是你经手的、你讲得清”,而不是功能数量。

2.4 三个角色的权限模型:拦截器与菜单级控制

在线考试系统(论文+源码)包里几乎没有例外地有三个角色:学生、教师、管理员。权限控制的常见实现是在 Spring Boot 里通过 HandlerInterceptor 拦截请求,看 session 或 token 里的角色字段。菜单显示按角色过滤、接口访问按角色拦截,这是最标准也最好讲的设计。

@Component public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object userId = session.getAttribute("userId"); if (userId == null) { // 未登录,重定向到登录页 response.sendRedirect("/login"); return false; } // 从 session 中取角色,校验当前请求是否在角色允许范围内 String role = (String) session.getAttribute("role"); String uri = request.getRequestURI(); if (uri.startsWith("/admin/") && !"admin".equals(role)) { response.setStatus(403); return false; } if (uri.startsWith("/teacher/") && !"teacher".equals(role)) { response.setStatus(403); return false; } return true; } }

这段代码的逻辑说明:preHandle在请求进入 Controller 之前执行,返回false就中断请求。实际项目里角色权限不止做一层——前端菜单按角色渲染,按钮操作按权限码控制,后端接口再用拦截器兜底。前端隐藏按钮只是体验优化,不能当安全边界。

参数说明有三个关键点:拦截路径(/admin/**、/teacher/**这类前缀)、放行路径(/login、/static/**)、角色字段的存储方式(session 还是 token)。很多项目包的坑是 session 和 token 混用——前端传了 token,后端又去读 session,导致登录状态时好时坏,这个在第 5 章会细说。

3. 把源码跑起来:环境版本匹配与最小启动流程

3.1 环境版本匹配:先对齐再启动

在线考试系统项目包最容易翻车的地方是环境。Spring Boot 2.x 和 3.x 的差异、MySQL 5.7 和 8.0 的差异、JDK 8 和 17 的差异,任何一个错位都会让“应该能跑”变成“看不懂的报错”。这不是玄学,是依赖兼容性的硬边界。

我一般按这个顺序确认版本:先看pom.xml里spring-boot-starter-parent的版本号,再看<java.version>设置的 JDK 版本,然后看 MySQL 驱动坐标,最后看前端是否需要 Node 环境。版本匹配的基本原则是:Spring Boot 2.x 搭配 JDK 8 或 11,MySQL 驱动用 5.1.49 或 8.0.x;Spring Boot 3.x 最低要求 JDK 17,驱动坐标也变成了com.mysql:mysql-connector-j。

<!-- pom.xml 关键依赖参考,实际以你项目包里的为准 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> </parent> <properties> <java.version>1.8</java.version> </properties> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>

参数说明:java.version是 1.8 就意味着编译和运行都按 JDK 8 对待,机器上只有 JDK 17 时最好装一个 JDK 8,别硬用 17 跑 2.x 项目,会遇到 CGLIB 代理、反射访问内部包等一堆兼容报错。反过来 Spring Boot 3.x 用 JDK 8 直接起不来。环境对齐后再谈下一步,这一步值得花半小时,因为它决定了后面所有操作有没有意义。

3.2 初始化数据库:SQL 脚本执行与数据源配置

找到sql/目录(或db/、database/)下的初始化脚本,常见命名是exam_db.sql或schema.sql。执行命令:

mysql -uroot -p < sql/exam_db.sql

执行后进入 MySQL 验证表是否建好:

mysql -uroot -p -e "USE exam_db; SHOW TABLES;"

这一步常见问题:脚本里可能包含CREATE DATABASE IF NOT EXISTS exam_db,也可能没有。没有的话需要先手动建库再导入。另外,脚本里若有DROP TABLE IF EXISTS会清掉同名表,导入前确认这个数据库没有在用的数据,否则后悔药都没得吃。

数据源配置在src/main/resources/application.yml:

spring: datasource: url: jdbc:mysql://localhost:3306/exam_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver

这里的关键参数:useUnicode=true和characterEncoding=utf8管中文不乱码;serverTimezone=Asia/Shanghai管 MySQL 8.0 的时区报错。如果用的是 MySQL 5.7,时区参数一般不必要,驱动类也可以改成com.mysql.jdbc.Driver(对应旧驱动版本)。拿项目包后,99% 的数据库连接报错都集中在这几个参数上,先改这里再排查其他。

3.3 最小启动流程:按依赖顺序拉起进程

在线考试系统(论文+源码)包如果前后端分离,启动顺序是:先启动 MySQL,再启动后端,最后启动前端。不分离的项目(Thymeleaf 模板)则只需要 MySQL + 后端两个进程。顺序本身不是玄学——后端需要数据库连得上才起得来,前端需要后端接口已经监听端口才能正常登录。

后端启动:

# 在项目根目录执行,mvnw 是 Maven Wrapper,优先用它 ./mvnw spring-boot:run

如果项目没有 mvnw 文件,先本地装 Maven 再执行mvn spring-boot:run,或打包后运行:

mvn clean package -DskipTests java -jar target/exam-system-0.0.1-SNAPSHOT.jar

-DskipTests跳过测试,避免测试类在打包阶段报错。这个参数在毕设项目里几乎每次都要加,因为很多包的测试类是随手写的,跑起来全是环境断言失败。前端如果是单独的 Vue 项目:

cd frontend npm install # 第一次安装依赖,耗时看网络,通常几分钟 npm run dev # 开发模式,端口一般 8080 或 5173

npm install如果报网络错误或版本冲突,看package.json里的依赖是不是需要特定 Node 版本。常见的坑是包锁文件package-lock.json来自 Node 18,而你用的是 Node 22,依赖版本解析会不一致。这时候的后悔药是删除node_modules和锁文件重新npm install,但要注意项目包里的依赖版本本身是否过老,过老的就别强行升级,保持原状跑通最重要。

启动后验证:浏览器访问前端地址,能看到登录页;用项目包自带的初始账号(论文的测试章节通常有写)登录。登录不进去,先去后端控制台看有没有异常堆栈,再去排查数据库连接和账号密码,这个排查顺序不要反。很多同学一登录失败就去改代码,忘了看后端控制台其实已经把错误原因打印出来了。

4. 核心功能闭环拆解:题库、组卷、阅卷与成绩统计

4.1 题库管理:题型设计与批量导入

在线考试系统的核心是题库。题库表通常包含:题型(单选、多选、判断、简答)、所属科目、难度系数、题干、选项、标准答案。这个模块在后端接口上就是一组增删改查,真正的复杂度在“批量导入”和“选项存储格式”这两个细节上。

批量导入最常见的做法是 Excel 模板导入。后端解析上传文件,逐行校验后写入数据库。这类毕设包里大多封装了导入工具类,但很多只能处理固定的模板列顺序,一旦模板列顺序变了就读不出数据。我一般会先看导入工具类里对“选项”字段的解析方式:

// 题目导入 DTO 参考,重点是选项字段的分隔符约定 public class QuestionImportDTO { private String type; // 题型:single / multiple / judge / short_answer private String content; // 题干 private String options; // 选项,建议统一用 ||| 分隔 private String answer; // 答案 private String difficulty; // 难度:easy / medium / hard private Integer subjectId; // 科目 id }

用|||分隔选项有个实实在在的好处:选项内容里通常含有逗号甚至顿号,用逗号做分隔符会在解析时把选项切碎,导入后选项错位。这是项目包源码里很常见的隐蔽 bug。如果你打算改代码,把选项存储规范化是第一优先级——因为后面组卷、阅卷、随机打乱选项都依赖这个格式稳定。

导入逻辑的核心是逐行校验:先按题型判断必填字段,多选和判断的答案格式不同;科目 id 不存在时要反馈精确的错误行号,而不是整批回滚。很多项目包的做法是一条 SQL 逐行插入,数据量大时慢但稳定,个人项目这个量级完全接受得了。批量导入跑通后,建议再导一份 100 条以上的测试数据,后续调试组卷和阅卷都用得上。

4.2 随机组卷:按难度和题型比例抽题

组卷是把题库里的题目按规则组装成一份试卷。最常见的规则是“按难度比例 + 按题型数量”,稍微复杂一点会加“按章节覆盖”。这里有一个先决条件:你的题库数据要足够多,否则“随机”会变成“每次都差不多”。

// 按题型和难度系数随机抽题的算法片段 public List<Question> buildPaperQuestions(Integer subjectId, PaperRule rule) { List<Question> selected = new ArrayList<>(); // 遍历规则里每个题型配置:题型、数量、难度 for (RuleItem item : rule.getItems()) { List<Question> pool = questionMapper.selectByTypeAndDifficulty( subjectId, item.getType(), item.getDifficulty()); // 随机取 item.getCount() 道题 Collections.shuffle(pool); selected.addAll(pool.subList(0, Math.min(item.getCount(), pool.size()))); } return selected; }

逻辑说明:先按规则条件捞出候选池,再用Collections.shuffle打乱、取前 N 条实现随机抽取。关键参数:subjectId限定科目;item.getType()限定题型,取值对应single、multiple等;item.getDifficulty()限定难度;count是期望抽取数量。

这里的边界情况特别容易出问题:题库里某一难度题型数量不够时,subList会越界或抽不满,项目包大概率没有处理这个分支——组卷时明明设置出 5 道题,卷子实际只有 3 道。实际部署时建议把“数量不足”直接在当前页面报出来,而不是静默少题,否则学生端看到一份缺斤少两的试卷,印象分直接拉低。

组卷后还有一道工序:生成试卷题目关联记录,每道题绑定分值。总分计算要闭环,否则学生答完 100 分制的卷子,成绩表里出现总分 90 分,答辩时会被一句“总分怎么算的”问住。分值绑定可以简单按“每题分 = 卷面总分 / 题目数”来,也可以按题型区分分值权重,论文里写清楚即可。

4.3 自动阅卷与成绩统计:客观题严格、主观题兜底

自动阅卷是在线考试系统(论文+源码)里最体现完成度的模块。客观题(单选、多选、判断)逻辑简单:比对答案。多选要特别注意策略——全对才得分、少选得一半还是零分,不同项目包策略不同,但论文里一定要把你用的策略写清楚,因为答辩老师很可能追问。

// 客观题阅卷:单选用 equals,多选先排序再比较 public boolean judgeObjective(String userAnswer, String correctAnswer, String questionType) { if ("single".equals(questionType) || "judge".equals(questionType)) { // 去空格后直接比对 return userAnswer.trim().equals(correctAnswer.trim()); } if ("multiple".equals(questionType)) { // 多选:把 "A,B,C" 拆开后排序再比较,避免顺序影响结果 String[] uArr = userAnswer.replace(" ", "").split(","); String[] cArr = correctAnswer.replace(" ", "").split(","); Arrays.sort(uArr); Arrays.sort(cArr); return Arrays.equals(uArr, cArr); } return false; }

这里的逻辑说明:单选和判断不排序,因为选项顺序即用户选择意图;多选必须排序后再比,因为用户选 “A,C” 和 “C,A” 是同一个答案,而字符串比较对顺序敏感。这个细节是阅卷模块最容易翻车的位置——你会发现一部分学生分数不对,排查半天发现是答案存储顺序不一致导致的。

主观题(简答题)自动阅卷就复杂了。市面上的毕设项目包一般不会引入 NLP 模型来做语义判分,成本高且不稳定。常见做法是关键词匹配:预设参考答案中的几个必须出现的关键词,学生答案命中几个算几分;再结合“不能为空”“最少字数”两个硬条件。这种方案论文里好写、答辩好讲、实现成本低,适合这个项目的定位。

成绩统计模块相对套路:汇总答题明细表,客观题得分为按题累加,主观题得分为关键词命中分数加权,最后生成成绩表记录。这里注意一个很容易忽略的细节:成绩表中的总分要用“试卷总分”字段做换算,而不是单纯累加答案明细表里的得分——否则浮点运算累积误差会让总分离谱,比如学生全部答对但总分显示 99.99,这种尴尬在演示时出现一次就够你记一辈子。

5. 在线考试系统项目包避坑指南:5 个典型问题与排查路径

5.1 数据库连接失败:驱动、时区、密码三重门

现象:后端启动时报Communications link failure或Access denied for user,页面无法登录。

原因首位是驱动与 MySQL 版本不匹配——MySQL 8.0 的库用 5.x 的驱动会有 SSL 握手报错;第二是时区参数缺失,报错信息里会出现The server time zone value '�й���׼ʱ��'这种乱码字样;第三才是密码错误,很多人会先怀疑密码,但报错里明确写了Access denied,说明连接已经建立,纯粹是认证失败。

解决:先确认 MySQL 版本(SELECT VERSION();),再匹配驱动版本。URL 上补全serverTimezone=Asia/Shanghai和useSSL=false,密码确认无误。如果还连不上,检查 MySQL 服务是否在监听 3306 端口,本地部署优先确认服务状态,不要一上来就去改防火墙白名单,那是线下部署才需要考虑的事。

5.2 登录后页面样式全部失效:403 与 404 的来源

现象:输入正确账号密码后首页能进,但 CSS、JS、图片全部加载失败,或者点击菜单跳 404。

原因大概率是拦截器把静态资源路径拦截了,或前端基础路由配置与项目实际部署路径不一致。很多项目包的拦截器写得比较粗,addPathPatterns("/**")一刀切,把/static/**也拦进去了;前端如果是 Vue 的 history 路由,后端没有做路径重写,刷新当前路由就 404。

解决:后端拦截器注册时显式放行静态资源路径,写法上是给InterceptorRegistry加excludePathPatterns("/static/**", "/css/**", "/js/**", "/images/**");前端如果不需要漂亮的 URL,把路由改成 hash 模式(createWebHashHistory)成本最低。这个坑在本地开发时不容易暴露,因为默认根路径刚好是静态资源路径,一换部署路径或者刷新子页面就现原形。

5.3 中文乱码:建库字符集与连接参数不一致

现象:题库里输入的中文在列表页显示为???或乱码方块,即使改了数据库后问题依然存在。

原因:建库时没有指定CHARACTER SET utf8mb4,或者连接 URL 里没有characterEncoding=utf8,又或者后端响应头没有声明 UTF-8。三个环节任何一个断了都会乱码,只修一处治不好。

解决:数据库连接 URL 补useUnicode=true&characterEncoding=utf8,同时用ALTER DATABASE exam_db CHARACTER SET utf8mb4;修库,再确认后端响应头是Content-Type: text/html; charset=UTF-8。这个排查要三层一起做,改完重启后端再验证。记住一个原则:乱码问题 90% 是“写入时编码和读取时编码不一致”,而不是单纯某一层的锅。

5.4 自动阅卷评分异常:多选顺序与空串

现象:学生考试成绩普遍偏低,抽查发现多选题明明选对了却判错,或者某道题没作答还得了分。

原因:多选题答案存储时选项顺序不一致,字符串比较直接判错;空答案没有在提交阶段统一转为空字符串,数据库里的NULL参与比较逻辑时结果不确定。这两种情况在项目包里出现概率非常高。

解决:阅卷前统一做数据清洗——NULL转空串、统一去除首尾空格、多选题答案切分排序后再比较。这些清洗逻辑应该放在阅卷服务的入口处,而不是散落在各比较分支里,否则每加一个题型就要改一处比较逻辑。改完再跑一遍前面说的时间核对:拿一份已知分数的答卷做回归验证。

5.5 论文与代码对不上:表名、功能细节差异

现象:答辩时老师翻开论文的系统设计章节,对照现场演示,发现论文里的功能列表在系统里找不到入口,或者数据表字段名对不上。

原因:论文定稿时间和代码最后提交时间不同步,常见于论文里写了“短信验证码发送”,源码里实际只做了邮箱找回密码;或数据库设计图画了 9 张表,实体类只有 6 个。这不是小问题,是答辩现场最容易暴露的硬伤。

解决:拿到项目包后先把论文目录里的功能模块和实际菜单逐项对照,缺失的功能要么补一个简单实现,要么在论文里删掉对应描述。数据库设计用工具反向生成当前库的 ER 图,和论文里的图做比对,不一致就改论文。实体类字段和页面表单字段也要过一遍。三者一致后再打印论文,这是答辩前最值得花时间做的事,没有之一。

6. 把毕设项目包变成拿得出手的系统:三个低成本改造

6.1 给选择题加随机选项顺序

防作弊是考试系统避不开的讨论点。低成本做法:考试进入时,对每道选择题的各选项顺序打乱。实现上在返回题目 JSON 到前端时做 shuffle,同时把“正确答案”字段隐藏,前端只回显选项内容和用户选择。

// 打乱选项顺序,难度不大但答辩很好讲 public QuestionVO shuffleOptions(Question q) { QuestionVO vo = new QuestionVO(q); List<String> options = Arrays.asList(q.getOptions().split("\\|\\|\\|")); Collections.shuffle(options); vo.setOptions(String.join("|||", options)); vo.setAnswer(null); // 答案只在后端校验,不返回前端 return vo; }

注意:题目 id 对应的正确选项编号已经变了,所以提交答案时必须回传题目 id 和选项文本,后端再映射回原选项。最常见的翻车写法是前端只传A/B/C,打乱后A已经不是原来的A,答案全错。这个改造量不大,但答辩时讲“防作弊设计”,比讲用户管理有说服力得多。

6.2 准备演示用的题库数据

答辩演示最尴尬的场景是题库里只有几条测试数据,抽题结果一眼见底。用脚本批量生成几百道题的模拟数据,让“随机组卷”看起来是真的随机。生成后人工抽查几道,保证题干和答案对应关系合理。演示时提前把老师可能点进的功能——学生考试、教师组卷、成绩统计——各自准备一条干净的数据链路,不要现场临时造数据。

6.3 把演示流程写成清单一页

一条典型的演示链路:管理员登录 → 查看用户列表 → 教师登录 → 题库导入 → 组卷发布 → 学生登录 → 在线答题 → 提交查看成绩 → 教师端查看成绩统计。每个节点配一句要讲的话,控制在 8 分钟以内。我的习惯是给这个清单一页打印出来放桌上,指着屏幕一步步走。毕业设计答辩不是技术分享,老师要看到的是“系统是你经手的、逻辑通顺、经得起问”,不是行云流水的表演。

最后说句实在话:在线考试系统(论文+源码)这类项目包的价值在于给你一个可以站在肩膀上的起点,而不是让你原封不动交上去。我见过太多同学拿到项目包连 MySQL 都没有建好,答辩前一晚还在装环境。把环境跑通、把上面几个坑过一遍、把演示脚本练熟,这套东西才能真正变成你的作品。希望帮到你。

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

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

江苏耀玖市政:管道CCTV检测服务商口碑公司汇总

管道是城市的血脉&#xff0c;看不见却至关重要。当地下管网出现淤积、破裂、渗漏&#xff0c;问题往往藏在深处&#xff0c;肉眼无法察觉。有没有可以做管道CCTV检测的专业公司?想找能做管道CCTV检测的专业公司推荐?想找做管道CCTV检测的公司推荐?这些问题背后&#xff0c;…

作者头像 李华
网站建设 2026/10/10 3:01:15

石家庄智慧达打井队钻井施工队公司介绍,地址在哪

岁月流转&#xff0c;城市在时光中不断生长&#xff0c;地下深处的清泉也在静静流淌&#xff0c;滋养着这片土地上的人们。在京津冀地区的钻井行业里&#xff0c;有这样一支队伍&#xff0c;十余年如一日扎根一线&#xff0c;用钻机与汗水在广袤的大地上刻下坚实的印记&#xf…

作者头像 李华
网站建设 2026/10/10 2:59:30

单片机毕业设计-基于物联网的厨房四项环境参数 OLED 可视化物联网监测系统设计 基于单片机的支持远程阈值配置可燃气体环境监测告警装置设计(030119)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/10/10 2:58:46

PCA9422与MK20DX128双轨电源管理架构设计

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

作者头像 李华
网站建设 2026/10/10 2:57:17

InputStage 责任链核心执行流程

一句话总结 InputStage 是 Android 输入事件分发中的责任链处理器&#xff0c;输入事件从链头开始依次经过每个 Stage&#xff0c;每个 Stage 决定自己处理还是传给下一个。1. 事件入口 // ViewRootImpl.java void deliverInputEvent(QueuedInputEvent q) {InputStage stage;if…

作者头像 李华