news 2026/9/4 3:52:45

JavaWeb学籍管理系统毕业设计实战:从数据库设计到Servlet+MyBatis核心实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaWeb学籍管理系统毕业设计实战:从数据库设计到Servlet+MyBatis核心实现

简介:本资源是一套完整的基于JavaWeb的学生学籍管理系统毕设项目,面向计算机专业本科生、Java初学者及急需实战项目的毕业设计学生,解决学籍信息数字化管理与多角色协同操作的实际需求。压缩包共3个文件(1个SQL数据库脚本、1个含源码的ZIP包、1个项目说明TXT),总大小9.21MB,涵盖可直接运行的JSP+Servlet+JDBC全栈代码、MySQL建表与初始化脚本、以及清晰的功能模块说明与部署指引。已有3241人学习下载,项目经严格调试,支持学生、教师、管理员三角色权限分离,完整实现学生/教师信息维护、考试与成绩管理、年级班级课程基础配置、通知发布及统计查询等核心功能,代码结构规范、注释充分、界面简洁易用,适合作为毕设答辩原型或JavaWeb入门级工程实践范例。

1. 项目缘起:一个“老掉牙”选题的深度价值重估

又到了一年一度的毕业季,后台和私信里关于“JavaWeb学生学籍管理系统”的咨询又多了起来。很多同学拿到这个题目,第一反应往往是:“这选题也太老套了吧,网上源码一大堆,能做出什么新意?” 或者“老师会不会觉得我在敷衍?” 作为一个带过不少毕业设计、也评审过不少项目的过来人,我想说,这个选题恰恰是检验你四年学习成果的“试金石”。它看似简单,实则五脏俱全,从需求分析、数据库设计、后端逻辑到前端交互,一个完整的软件开发生命周期都涵盖在内。做得好,它能成为你简历上扎实的一笔;做得糙,它就是你技术短板的“照妖镜”。

今天,我们不谈空泛的理论,就以一个基于JavaWeb技术栈,使用MySQL数据库,在IntelliJ IDEA环境下开发的学籍管理系统为例,从头到尾拆解一遍。我会分享如何把一个“模板项目”做出深度和亮点,避开那些让答辩老师皱眉的常见坑,并附上可落地的核心代码片段与数据库脚本设计思路。我们的目标不是复制粘贴,而是让你真正理解一个管理系统的“骨架”与“灵魂”,即便未来你做电商、OA或其他任何系统,这套方法论依然通用。

2. 需求深挖与架构设计:别从“登录注册”开始

大多数新手拿到需求,打开IDE就开始建User表、写登录页面。这是最大的误区。学籍管理的核心是“数据”与“流程”,我们必须先抛开技术,用业务的眼光审视它。

2.1 核心业务实体与关系梳理

一个完整的学籍系统,远不止学生和老师。我们需要抽象出关键实体:

  • 学生:核心主体,属性除基础信息外,应包含学号(唯一业务键)、班级ID入学日期学籍状态(在读、休学、毕业、退学)。
  • 班级:学生归属的组织单元。属性包括班级名称所属专业入学年份辅导员
  • 课程:教学的基本单元。属性包括课程代码课程名称学分课程类型(必修/选修)。
  • 成绩:连接学生与课程的核心业务数据。这是一个典型的多对多关系中间实体,属性包括学生ID课程ID成绩考试时间成绩类型(正常、补考、重修)。
  • 教师:负责课程教学。属性包括工号姓名所属院系
  • 用户:系统操作者(学生、教师、管理员)。注意,用户学生/教师可以是1对1关系,也可以将登录信息直接放在学生/教师表中,后者更简单。我建议初期采用后者。

它们之间的关系用一句话概括:学生归属于班级,选修多门课程,每门课程产生一条成绩记录,课程由教师教授。

2.2 技术选型与架构设计

明确了业务,我们再来搭技术架子。一个典型的JavaWeb三层架构是我们的不二之选。

  • 前端层:虽然现在Vue、React很火,但毕设为了快速验证和展示,JSP + Servlet + JSTL/EL表达式组合依然是最稳妥、最能体现JavaWeb基本功的选择。配合Bootstrap或Layui这类UI框架,能快速搭建出美观的界面。有能力的同学可以尝试前后端分离(如SpringBoot + Vue),但这会显著增加复杂度。
  • 控制层Servlet是核心控制器。每个功能模块对应一个或多个Servlet,负责接收请求、调用业务、转发视图。这里要严格遵循MVC,Servlet只做流程控制,不做具体业务。
  • 业务逻辑层Service类。这里是所有业务规则实现的地方,比如“成绩录入时,分数必须在0-100之间”、“学生转班需要更新其班级ID和同步相关数据”。Service调用DAO层完成持久化。
  • 数据访问层DAO接口及其实现。使用JDBCMyBatis来操作数据库。对于毕设,我强烈推荐MyBatis,它的XML映射或注解方式比纯JDBC更高效,能让你更专注于SQL本身。数据库连接池使用Druid,性能好,监控功能强大。
  • 数据库MySQL 5.7+8.0。务必注意字符集设置为utf8mb4,以支持存储Emoji等特殊字符。

注意:很多同学为了“炫技”直接上SpringBoot全家桶,但基础不牢,遇到问题调试起来极其困难。用最经典的Servlet+JSP+MyBatis把流程走通,理解本质,远比堆砌框架更有价值。

3. 数据库设计实战:从ER图到健壮的SQL脚本

数据库是系统的基石,设计好坏直接决定后期开发的难易。

3.1 核心表结构设计示例

以下是最核心的几张表,我附上了关键字段和设计理由:

学生表 (student)

CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `student_no` varchar(20) NOT NULL COMMENT '学号,唯一业务标识', `name` varchar(50) NOT NULL COMMENT '姓名', `gender` char(1) DEFAULT '男' COMMENT '性别', `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号', `class_id` int(11) NOT NULL COMMENT '所属班级ID', `enrollment_date` date NOT NULL COMMENT '入学日期', `status` tinyint(4) DEFAULT '1' COMMENT '学籍状态:1在读,2休学,3毕业,4退学', `phone` varchar(11) DEFAULT NULL COMMENT '手机号', `email` varchar(50) DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_student_no` (`student_no`), UNIQUE KEY `uk_id_card` (`id_card`), KEY `idx_class_id` (`class_id`), CONSTRAINT `fk_student_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

设计要点student_no(学号)必须设唯一索引,它是业务上的主键。class_id是外键,关联班级表。status用tinyint表示状态,便于扩展。添加create_timeupdate_time是良好习惯。

成绩表 (score)

CREATE TABLE `score` ( `id` int(11) NOT NULL AUTO_INCREMENT, `student_id` int(11) NOT NULL COMMENT '学生ID', `course_id` int(11) NOT NULL COMMENT '课程ID', `score` decimal(5,2) DEFAULT NULL COMMENT '成绩,允许NULL(未考试)', `exam_time` datetime DEFAULT NULL COMMENT '考试时间', `score_type` tinyint(4) DEFAULT '1' COMMENT '成绩类型:1正常,2补考,3重修', `academic_year` varchar(9) NOT NULL COMMENT '学年,如2023-2024', `semester` tinyint(4) NOT NULL COMMENT '学期:1或2', `teacher_id` int(11) DEFAULT NULL COMMENT '录入教师ID', PRIMARY KEY (`id`), UNIQUE KEY `uk_student_course` (`student_id`,`course_id`,`academic_year`,`semester`) COMMENT '同一学年学期,同一学生同一课程只能有一条记录', KEY `idx_course_id` (`course_id`), KEY `idx_student_id` (`student_id`), CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`), CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生成绩表';

设计要点:这是设计精髓所在。联合唯一索引uk_student_course确保了数据的唯一性,防止同一学生同一课程在同一学年学期被重复录入。score字段为decimal(5,2),精确存储小数成绩。academic_yearsemester是重要维度,便于按学期查询。

3.2 数据库脚本的“坑”与最佳实践

  1. 字符集与排序规则:建库语句开头就要声明CREATE DATABASEyour_dbDEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;utf8mb4才是真正的UTF-8,支持四字节字符(如表情符号)。
  2. 外键约束:像上面示例一样,显式声明FOREIGN KEY。这能保证数据完整性,避免产生“孤儿数据”。但在大量批量导入或测试时,可以暂时禁用外键检查SET FOREIGN_KEY_CHECKS = 0;,操作完再开启。
  3. 索引策略:主键、唯一键自动建索引。对于高频查询条件,如student.namescore.academic_year,考虑添加普通索引。但索引不是越多越好,会影响写入性能。
  4. 数据初始化:脚本里应包含必要的初始数据,如管理员账号、基础院系、专业信息等。使用INSERT INTO ... VALUES (...);语句,并注意插入顺序(先父表,后子表)。

4. 后端核心逻辑实现:Servlet与MyBatis的精准配合

有了数据库,我们开始实现业务。以“学生成绩录入”这个核心功能为例,展示三层架构如何协作。

4.1 数据访问层:MyBatis Mapper 设计

首先定义ScoreMapper.java接口和对应的ScoreMapper.xml映射文件。

ScoreMapper.java

public interface ScoreMapper { // 插入或更新成绩(基于唯一约束) int insertOrUpdate(Score score); // 根据学生ID和学年学期查询成绩列表(关联课程表) List<ScoreVO> selectByStudentAndSemester(@Param("studentId") Integer studentId, @Param("academicYear") String academicYear, @Param("semester") Integer semester); // 教师查询所教课程的学生成绩 List<ScoreVO> selectByTeacherAndCourse(@Param("teacherId") Integer teacherId, @Param("courseId") Integer courseId, @Param("academicYear") String academicYear, @Param("semester") Integer semester); }

ScoreMapper.xml (片段)

<!-- 插入或更新,使用ON DUPLICATE KEY UPDATE语法 --> <insert id="insertOrUpdate" parameterType="com.yourproject.entity.Score"> INSERT INTO score (student_id, course_id, score, exam_time, score_type, academic_year, semester, teacher_id) VALUES (#{studentId}, #{courseId}, #{score}, #{examTime}, #{scoreType}, #{academicYear}, #{semester}, #{teacherId}) ON DUPLICATE KEY UPDATE score = VALUES(score), exam_time = VALUES(exam_time), score_type = VALUES(score_type), teacher_id = VALUES(teacher_id) </insert> <!-- 复杂查询结果映射到VO(View Object) --> <select id="selectByStudentAndSemester" resultMap="scoreVOMap"> SELECT s.*, c.course_name, c.credit, stu.name as student_name FROM score s JOIN course c ON s.course_id = c.id JOIN student stu ON s.student_id = stu.id WHERE s.student_id = #{studentId} AND s.academic_year = #{academicYear} AND s.semester = #{semester} </select>

实操心得ON DUPLICATE KEY UPDATE是处理“有则更新,无则插入”的利器,完美契合成绩录入场景(防止重复提交)。查询时多表关联,使用ResultMap映射到自定义的ScoreVO对象,避免在后端做数据组装,效率更高。

4.2 业务逻辑层:Service中的规则校验

ScoreServiceImpl.java需要处理业务规则。

@Service public class ScoreServiceImpl implements ScoreService { @Autowired private ScoreMapper scoreMapper; @Autowired private CourseMapper courseMapper; @Override @Transactional(rollbackFor = Exception.class) // 声明式事务 public boolean submitScore(Score score, Integer operatorTeacherId) throws BusinessException { // 1. 基础校验 if (score.getScore() != null && (score.getScore().compareTo(BigDecimal.ZERO) < 0 || score.getScore().compareTo(new BigDecimal("100")) > 0)) { throw new BusinessException("成绩必须在0-100分之间"); } // 2. 权限校验(简化示例):确保操作教师有权限操作该课程 Course course = courseMapper.selectById(score.getCourseId()); if (course == null || !operatorTeacherId.equals(course.getTeacherId())) { throw new BusinessException("您无权录入此课程成绩"); } score.setTeacherId(operatorTeacherId); // 3. 调用DAO int rows = scoreMapper.insertOrUpdate(score); return rows > 0; } }

踩坑记录:业务校验一定要放在Service层,而不是Controller或DAO层。@Transactional注解确保操作原子性,比如更新成绩同时要记录日志,必须在一个事务里。BusinessException是自定义的业务异常,便于统一处理。

4.3 控制层:Servlet处理请求与响应

ScoreSubmitServlet.java(使用注解@WebServlet或web.xml配置)

@WebServlet("/score/submit") public class ScoreSubmitServlet extends HttpServlet { private ScoreService scoreService = new ScoreServiceImpl(); // 可用IOC容器优化 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=utf-8"); PrintWriter out = response.getWriter(); JsonObject result = new JsonObject(); try { // 1. 获取参数并封装对象 Integer studentId = Integer.valueOf(request.getParameter("studentId")); Integer courseId = Integer.valueOf(request.getParameter("courseId")); BigDecimal scoreValue = new BigDecimal(request.getParameter("score")); // ... 获取其他参数 Score score = new Score(studentId, courseId, scoreValue, ...); // 2. 获取当前登录教师ID(从Session) Integer teacherId = (Integer) request.getSession().getAttribute("teacherId"); if (teacherId == null) { throw new BusinessException("用户未登录或会话已过期"); } // 3. 调用Service boolean success = scoreService.submitScore(score, teacherId); if (success) { result.addProperty("success", true); result.addProperty("message", "成绩提交成功"); } else { result.addProperty("success", false); result.addProperty("message", "成绩提交失败"); } } catch (BusinessException e) { result.addProperty("success", false); result.addProperty("message", e.getMessage()); } catch (Exception e) { e.printStackTrace(); // 生产环境应记录日志 result.addProperty("success", false); result.addProperty("message", "系统错误,请联系管理员"); } out.print(result.toString()); out.flush(); } }

关键点:Servlet中要做好编码设置、参数获取与校验、Session权限判断、异常捕获与友好提示。返回JSON格式数据,便于前端AJAX调用。异常处理要区分业务异常和系统异常,给用户不同的反馈。

5. 前端交互与页面渲染:JSP+EL+Bootstrap的经典组合

前端页面负责展示和收集数据。我们使用JSP作为视图,EL表达式和JSTL标签简化页面逻辑,Bootstrap美化界面。

5.1 成绩录入页面示例 (score_input.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>成绩录入</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-5"> <h2>成绩录入</h2> <form id="scoreForm"> <div class="mb-3"> <label for="courseSelect" class="form-label">选择课程</label> <select class="form-select" id="courseSelect" name="courseId" required> <option value="">--请选择--</option> <c:forEach items="${teacherCourses}" var="course"> <option value="${course.id}">${course.courseName} (${course.courseCode})</option> </c:forEach> </select> </div> <div class="mb-3"> <label for="studentNo" class="form-label">学号</label> <input type="text" class="form-control" id="studentNo" name="studentNo" placeholder="输入学号" required> <button type="button" class="btn btn-secondary mt-2" onclick="searchStudent()">查询学生</button> <div id="studentInfo" class="mt-2" style="display:none;"> <!-- 动态显示学生信息 --> </div> <input type="hidden" id="studentId" name="studentId"> </div> <div class="mb-3"> <label for="score" class="form-label">成绩</label> <input type="number" step="0.01" min="0" max="100" class="form-control" id="score" name="score" placeholder="0-100" required> </div> <button type="button" class="btn btn-primary" onclick="submitScore()">提交成绩</button> </form> </div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script> function searchStudent() { let studentNo = $('#studentNo').val(); $.get('${pageContext.request.contextPath}/student/search?studentNo=' + studentNo, function(data) { if(data.success) { $('#studentInfo').html(`姓名:`+data.name+` | 班级:`+data.className).show(); $('#studentId').val(data.id); } else { alert('未找到该学生'); $('#studentInfo').hide(); $('#studentId').val(''); } }); } function submitScore() { let formData = $('#scoreForm').serialize(); $.post('${pageContext.request.contextPath}/score/submit', formData, function(resp) { alert(resp.message); if(resp.success) { $('#scoreForm')[0].reset(); $('#studentInfo').hide(); } }, 'json'); } </script> </body> </html>

技巧分享:页面加载时,通过Servlet将${teacherCourses}(当前教师所授课程列表)传到页面。使用jQuery进行AJAX交互,实现学生信息的动态查询和表单的异步提交,提升用户体验。表单验证使用了HTML5的requirednumber类型等属性,结合后端校验,构成双重保障。

5.2 成绩查询与分页展示

成绩列表页通常需要分页。我们在Servlet中处理分页逻辑,使用PageHelper(MyBatis分页插件)可以极大简化工作。

Servlet中处理分页参数:

int pageNum = 1; int pageSize = 10; try { pageNum = Integer.parseInt(request.getParameter("pageNum")); pageSize = Integer.parseInt(request.getParameter("pageSize")); } catch (NumberFormatException e) { // 使用默认值 } PageHelper.startPage(pageNum, pageSize); // 开始分页 List<ScoreVO> scoreList = scoreService.getScoreList(...); PageInfo<ScoreVO> pageInfo = new PageInfo<>(scoreList); request.setAttribute("pageInfo", pageInfo); request.getRequestDispatcher("/score_list.jsp").forward(request, response);

JSP中展示分页信息:

<table class="table table-striped"> <c:forEach items="${pageInfo.list}" var="score"> <tr><td>${score.studentName}</td><td>${score.courseName}</td><td>${score.score}</td></tr> </c:forEach> </table> <nav> <ul class="pagination"> <c:if test="${pageInfo.hasPreviousPage}"> <li class="page-item"><a class="page-link" href="?pageNum=${pageInfo.prePage}">上一页</a></li> </c:if> <c:forEach begin="1" end="${pageInfo.pages}" var="i"> <li class="page-item ${pageInfo.pageNum == i ? 'active' : ''}"><a class="page-link" href="?pageNum=${i}">${i}</a></li> </c:forEach> <c:if test="${pageInfo.hasNextPage}"> <li class="page-item"><a class="page-link" href="?pageNum=${pageInfo.nextPage}">下一页</a></li> </c:if> </ul> </nav>

6. 项目部署、优化与答辩准备

6.1 本地运行与部署上线

  1. 本地运行:在IDEA中配置好Tomcat服务器(建议8.5或9.0版本),将项目添加为Artifact,直接运行即可。确保数据库连接池配置(如druid.properties)中的URL、用户名、密码正确。
  2. 打包部署:使用Maven的package命令生成WAR包。将WAR包放入服务器Tomcat的webapps目录下,启动Tomcat会自动解压部署。也可以将项目打成可执行的JAR包(SpringBoot项目常用),但Servlet项目传统方式是WAR。
  3. 数据库迁移:将本地的数据库脚本在服务器MySQL上执行一遍。可以使用mysqldump工具导出导入,或者直接执行你的sql脚本文件。

6.2 性能与安全优化点(加分项)

  • 连接池配置:优化Druid连接池参数,如initialSizemaxActiveminIdlemaxWait,根据预估并发调整。
  • SQL优化:对慢查询(可通过MySQL慢查询日志定位)添加合适的索引,避免SELECT *,只查询需要的字段。
  • 前端缓存:对于不经常变动的下拉框数据(如院系、专业列表),可以在Servlet中设置响应头进行浏览器端缓存,或使用Redis等缓存中间件(进阶)。
  • XSS与SQL注入防护:使用Filter对请求参数进行过滤,或使用ESAPI等工具库。MyBatis的#{}预编译方式已能有效防止SQL注入,切忌在动态SQL中拼接用户输入。
  • 密码安全:用户密码切勿明文存储。使用BCryptPBKDF2等加盐哈希算法进行加密。MD5SHA-1已不安全。

6.3 毕业设计答辩核心要点

答辩不是代码展示会,而是思路阐述会。你需要讲清楚:

  1. 项目背景与意义:简述传统学籍管理的痛点,你的系统如何解决。
  2. 系统架构图:绘制一张清晰的三层架构图或功能模块图。
  3. 核心技术与选型理由:为什么用Servlet不用SpringBoot?为什么用MyBatis不用JPA?体现你的思考。
  4. 数据库设计亮点:展示你的ER图,重点讲解像成绩表唯一约束这样的设计巧思。
  5. 功能演示:流畅地演示核心流程(登录->成绩录入->多条件查询->数据导出)。提前准备好测试数据。
  6. 遇到的问题与解决方案:准备1-2个开发中遇到的实际技术难题(如分页查询效率、事务处理)和你如何解决的。这最能体现你的能力。
  7. 系统不足与展望:客观说明当前系统的局限性(如未做前后端分离、界面可以更美观、未引入缓存),并提出可行的改进方向。

记住,老师想看到的是你分析问题、设计解决方案、动手实现、总结反思的完整能力链条。一个逻辑清晰、代码规范、考虑周全的“学籍管理系统”,远比一个功能花哨但漏洞百出的“创新”项目更能赢得高分。

从一张空白的数据库表开始,到一个个功能模块的实现,再到最终的系统上线与演示,这个过程本身就是对软件工程最好的实践。希望这篇长文能为你扫清一些障碍,注入一些信心。动手去做,在调试bug和翻阅文档中成长,这才是毕业设计带给你的、比一纸文凭更宝贵的财富。

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

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

AT89C51驱动步进电机Proteus仿真:ULN2003与28BYJ-48实战指南

简介&#xff1a;本资源是一套基于AT89C51单片机控制步进电机的完整Proteus仿真工程&#xff0c;面向嵌入式初学者、自动化控制课程设计者及单片机实训人员&#xff0c;解决电机驱动电路设计、多按键交互逻辑与LCD状态反馈等典型实践问题。压缩包共17个文件&#xff0c;含Prote…

作者头像 李华
网站建设 2026/9/4 3:52:01

校园人脸识别考勤系统工程实践指南

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

作者头像 李华
网站建设 2026/9/4 3:51:28

LangChain与MCP实战:从FastMCP到Agent工具调用拦截器

先问一个问题&#xff1a;你看到的 AI Agent 大多数还停留在“能聊天、能写诗”的阶段&#xff0c;而真正有价值的是让大模型去执行任务。可是大模型本身不会操作你的 API、不会查你的数据库、不会调用你项目里的工具&#xff0c;它只会“说话”。为了让模型安全、统一、低成本…

作者头像 李华
网站建设 2026/9/4 3:50:11

标舵上机前必做的全套测试:mj911舵机从空载扫描到负载选型指南

很多人买舵机回来第一件事不是装舵角&#xff0c;而是先把每个通道都接上舵机测试仪完整跑一遍&#xff0c;尤其是准备用在固定翼、直升机甚至涡喷机上的“标舵”。标准舵机看起来外观差不多&#xff0c;实际批次之间的一致性、回中精度、负载能力和发热表现差别很大。这篇文章…

作者头像 李华
网站建设 2026/9/4 3:49:38

智能车硬件入门:NE555无稳态电路从原理到实战应用

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

作者头像 李华
网站建设 2026/9/4 3:45:10

tmux 多 AI 会话管理:如何快速识别“谁在等你”

在终端里同时开几个 AI Agent&#xff0c;是一件听起来很“工程师”&#xff0c;实际上却很折磨人的事情。比如我正在同时让一个 Agent 做接口重构&#xff0c;另一个 Agent 修测试用例&#xff0c;还有一个 Agent 在写临时分析脚本。为了不让它们互相抢占上下文&#xff0c;我…

作者头像 李华