1. 项目整体设计与思路拆解做计算机毕业设计时很多人第一反应是“管理系统”——图书管理、教务管理、仓库管理换来换去都是增删改查。但如果你选的是计算机相关专业尤其是偏向硬件、体系结构方向的那“Spring Boot 计算机组成原理仿真实验平台”这个题目含金量比普通管理系统高出一大截。它既适配了当前企业里主流的 Java 后端技术栈又把计算机组成原理这门核心课里的知识点比如数字逻辑、运算器、存储器、指令流水线变成了可以动手交互的在线实验而不是一张静态的 PPT 截图。这个题目的核心价值在于把“虚拟仿真”和“教学管理”两条线拧在一起。学生不需要真实硬件板卡浏览器里点一点就能完成数字逻辑实验教师不需要手动收纸质报告系统自动判题、自动汇总成绩。换句话说这既是一套“实验环境”也是一套“教学管理平台”毕业设计答辩时你能同时展示 Spring Boot 的项目工程能力和计算机组成原理的专业理解这是纯 CRUD 项目比不了的。从技术选型角度看Spring Boot 是最稳妥的选择。原因有三层第一上手门槛低、生态成熟。Spring Boot 的自动配置、内嵌 Tomcat、Starter 机制让开发者不用把精力耗在繁琐的 XML 配置上一个SpringBootApplication就能把后端跑起来。这对毕设周期来说非常重要。第二前后端分离开发方便。Spring Boot 天然适合作为 RESTful API 服务端前端可以用 Vue 或 React 独立开发两边通过 JSON 数据交互。仿真实验平台的界面需要频繁绘制电路、总线、时序图前端独立出来会更灵活。第三后期扩展空间大。平台不可能只做一个实验后续要加“存储器实验”“流水线实验”Spring Boot 的模块化结构可以让你按功能拆包各实验互不干扰。1.1 核心需求拆解在动手写代码之前先把需求拆清楚。一个完整的计算机组成原理仿真实验平台至少需要覆盖这几个模块实验管理模块管理员创建实验、配置实验参数、设定截止时间学生查看实验列表、进入实验、提交实验结果。每个实验要有独立的 ID、名称、类型、难度、实验说明、附件等字段。在线仿真实验模块这是平台的核心也是最难啃的一块。需要根据实验类型提供不同的交互界面数字逻辑实验要能拖拽门电路、连线、输入信号、观察输出运算器实验要能设置操作数和操作码观察 ALU 计算结果和标志位存储器实验要能读写内存单元观察地址译码过程。仿真的数据不能是写死的必须有真实的逻辑计算过程。自动判题与成绩管理模块学生提交实验后系统需要根据预设的测试用例自动验证结果是否正确。比如数字逻辑实验系统给定几组输入学生搭的电路输出必须与真值表完全一致。判题结果、得分、提交时间、尝试次数都要记录。题库与考试模块热搜词里反复出现“二十套计算机组成原理试题库及答案”“考研计算机组成原理”说明题库功能是明显的加分项。可以做一个题库管理模块支持选择题、填空题、判断题、简答题教师维护题目学生在线练习或考试系统自动批改客观题。用户与权限模块学生、教师、管理员三种角色用 Spring Security JWT 做登录认证和接口权限控制。学生只能看自己的实验记录教师可以管理实验和题库查看班级成绩管理员负责全局配置。1.2 为什么选 Spring Boot 而非其他框架有些同学会纠结用 Python Flask 或 Django 行不行技术上行但从“计算机组成原理仿真”这个主题来看Spring Boot 有一个隐性优势它可以借助 Java 的强类型特性把电路仿真中的信号状态、总线数据、寄存器值封装成清晰的领域对象。比如定义一个Signal类包含signalName、logicLevel、updateTime比 Python 的字典结构更严谨也更符合“硬件描述”的思维习惯。另外如果你后续想把仿真的核心逻辑抽取成独立模块Java 这种静态语言在重构和单元测试上的体验更好。毕竟毕业设计要写论文代码的可读性和结构规范性直接影响答辩印象分。2. 数据库设计与后端架构仿真平台这种项目表结构虽然不算特别复杂但字段设计要提前想清楚否则后期加功能会很痛苦。我建议使用 MySQL 8.0原因无非是稳定、资料多、Navicat 连起来方便。表结构上核心表包括user用户表字段有id、username、password、real_name、roleSTUDENT / TEACHER / ADMIN、student_no、class_name、created_at。experiment实验表字段有id、experiment_name、experiment_typeDIGITAL_LOGIC / ALU / MEMORY / PIPELINE、description、difficulty、deadline、template_config、created_by。experiment_record学生实验记录表记录每次实验的提交情况字段有id、user_id、experiment_id、circuit_config、test_result、score、statusIN_PROGRESS / SUBMITTED / GRADED、submit_count、submitted_at。question题目表字段有id、question_type、content、optionsJSON、answer、analysis、difficulty、knowledge_point。exam与exam_record考试表与考试记录表用于在线测验。experiment_report实验报告表学生可以上传文字总结或文件教师进行评阅。这里有个设计细节值得说明template_config字段。每个实验的初始电路状态、可用元件列表、连线限制条件都不一样。如果为每个实验单独建表后期扩展新实验类型就要改表结构。不如把初始配置以 JSON 字符串存在template_config中前端拿到 JSON 后动态渲染。这样做的好处是新增一个实验只需要在管理后台录入 JSON 配置不用改代码也不加表。2.1 Spring Boot 后端架构设计后端我采用经典的分层架构Controller 层接收请求Service 层处理业务逻辑Mapper 层用 MyBatis-Plus 操作数据库。分层的目的不是走形式而是让项目结构清晰论文中的架构图也好画。详细目录结构可以参考com.simulab ├── controller │ ├── AuthController.java │ ├── ExperimentController.java │ ├── SimulationController.java │ ├── QuestionController.java │ └── ReportController.java ├── service │ ├── impl │ │ ├── UserServiceImpl.java │ │ ├── ExperimentServiceImpl.java │ │ ├── SimulationServiceImpl.java │ │ ├── JudgeServiceImpl.java │ │ └── QuestionServiceImpl.java │ └── JudgeService.java ├── mapper │ ├── UserMapper.java │ ├── ExperimentMapper.java │ ├── ExperimentRecordMapper.java │ └── QuestionMapper.java ├── entity │ ├── User.java │ ├── Experiment.java │ └── ExperimentRecord.java ├── common │ ├── Result.java │ ├── exception │ └── utils └── config ├── SecurityConfig.java └── CorsConfig.javaJudgeService是仿真判题的核心接口也是这个项目里最值得写进论文的部分。它的输入是学生提交的电路配置 JSON输出是测试用例通过情况和得分。2.2 数据库设计的几个经验之谈先说字段类型。实验记录中的circuit_config用TEXT类型就够了JSON 字符串可能很长别用VARCHAR(255)否则保存时会被截断排查起来很麻烦。提交次数submit_count的字段建议直接记录整数每次提交时在 Service 层做1操作。这里有个容易踩的坑如果不加同步控制学生快速点击提交可能出现并发请求导致submit_count少计。解决方法是使用乐观锁在表中加version字段MyBatis-Plus 的Version注解可以直接处理。题库的options字段也建议用 JSON 格式因为选择题选项数量不固定。判断答案时客观题直接比对answer字段简答题建议不要完全依赖系统判题可以设置“参考答案”和“教师复核”机制否则学生的表述千奇百怪完全匹配的字符串判题法很容易误判。3. 数字逻辑与体系结构仿真实验的核心实现这一节是整个平台的重头戏也是很多人在答辩时被追问最多的地方“你这个仿真到底是动画演示还是真的按电路逻辑在跑”如果想拿高分一定要做到后者——真实的逻辑计算而不是switch-case里写死输出。3.1 数字逻辑仿真信号与门电路建模数字逻辑实验是整个平台的地基。学生需要从元件库里拖出与门、或门、非门、异或门、触发器把它们连成半加器、全加器、译码器或者更复杂的时序电路。平台要做的就是接收这些连线信息构建一个电路拓扑图然后根据输入信号计算每个节点的电平。Java 建模思路如下public class LogicGate { private String gateId; private GateType type; // AND, OR, NOT, XOR, NAND, NOR, XNOR private ListString inputIds; private String outputId; private boolean outputLevel; public boolean compute(boolean... inputLevels) { switch (type) { case AND: outputLevel inputLevels[0] inputLevels[1]; break; case OR: outputLevel inputLevels[0] || inputLevels[1]; break; case NOT: outputLevel !inputLevels[0]; break; case XOR: outputLevel inputLevels[0] ^ inputLevels[1]; break; // ... 其余门电路 } return outputLevel; } }计算过程需要采用“拓扑排序 状态传播”的思路。学生连线后可能形成多级电路比如 A 门的输出接 B 门的输入B 门输出再接 C 门。因此要先将所有门电路节点按依赖关系排序从输入引脚开始逐步计算每个节点的电平直到所有输出节点都有确定值。关键点来了如果学生形成了环路比如 A 输出接到 B 输入B 输出又接回 A 输入这就构成了组合逻辑回路。实际硬件中这种电路是危险的仿真平台必须检测到并提示错误而不是让程序陷入死循环。我的做法是在拓扑排序时计算节点入度如果排序结束后仍有节点未被访问就说明存在环直接返回“电路中存在组合逻辑回路请检查连线”。判题逻辑同样依赖这个过程。平台内置一组标准测试用例例如半加器实验输入A0, B0期望SUM0, CARRY0输入A1, B1期望SUM0, CARRY1。学生提交电路后系统逐组输入信号计算实际输出与期望真值表逐项比对任何一项不一致都判定该测试用例不通过。数字逻辑实验的“防倒灌参数”在热搜词里也有提及这里顺带科普一下。在真实的 CMOS 电路中输出引脚和输入引脚直接相连如果一方输出高电平而另一方输出低电平会产生大电流这对芯片是有害的。仿真平台中也要做相应的规则校验不能把两个门电路的输出端直接连在一起除非是特殊的三态门或开漏输出结构。这个规则不算难实现在电路提交时遍历所有连线找到输出-输出连接关系直接报错。3.2 运算器仿真ALU 设计与标志位计算运算器实验是计算机组成原理的必修内容。学生需要设计一个简易 ALU支持加法、减法、与、或、异或、左移、右移等操作同时输出零标志位 ZF、进位标志位 CF、溢出标志位 OF、符号标志位 SF。这部分的仿真实现不要绕弯子直接在 Java 中用位运算处理public class AluResult { private int value; private boolean zf; private boolean cf; private boolean of; private boolean sf; public static AluResult compute(int operandA, int operandB, int opCode, int bitWidth) { AluResult result new AluResult(); int mask (bitWidth 8) ? 0xFF : 0xFFFF; // 计算时按 int 进行但只保留低 bitWidth 位 int rawResult 0; switch (opCode) { case 0x00: // ADD rawResult operandA operandB; break; case 0x01: // SUB rawResult operandA - operandB; break; case 0x02: // AND rawResult operandA operandB; break; // ... 其他操作 } result.value rawResult mask; // SF结果的最高位 int signBit (bitWidth 8) ? 0x80 : 0x8000; result.sf (result.value signBit) ! 0; // ZF所有位为 0 result.zf result.value 0; // 进位/借位 CF加法时看是否超出位宽减法时看是否有借位 if (opCode 0x00 || opCode 0x01) { int extendedMask (bitWidth 8) ? 0x100 : 0x10000; result.cf ((rawResult bitWidth) 1) ! 0; } // OF符号位是否溢出同号相加得异号或异号相减得同号 boolean aSign (operandA signBit) ! 0; boolean bSign (operandB signBit) ! 0; boolean rSign result.sf; if (opCode 0x00) { // ADD result.of (aSign bSign) (aSign ! rSign); } else if (opCode 0x01) { // SUB result.of (aSign ! bSign) (aSign ! rSign); } return result; } }这个类可以在后端单独封装成一个独立模块同时被仿真服务和题库服务复用。比如题库里如果出“8 位补码加法溢出判断”的选择题系统可以直接调用这个逻辑生成答案和解析也能在“教学演示模式”下让前端图形化展示 ALU 内部每一步的运算过程。值得一提的是bitWidth参数。实验平台应该允许学生选择 8 位或 16 位运算模式这也贴合真实 CPU 中不同数据宽度的设计。这部分别偷懒写死成 int否则答辩时老师如果问“如果我要做 4 位 ALU 怎么办”你会很被动。3.3 存储器与体系结构仿真从主存到 Cache存储器实验的方向有很多。最基本的是主存读写实验学生输入地址和写入数据系统通过地址译码逻辑将数据写入对应存储单元再通过读操作读回界面显示地址总线和数据总线的值。这个过程的核心是模拟“地址译码”和“数据读写时序”。Cache 仿真就更有意思了但工作量也直线上升。直接映射、全相联、组相联命中率、缺失率、替换策略LRU / FIFO如果全做完那基本就是一个简化版的内存层次结构模拟器。我的建议是优先完成主存实验和 Cache 命中率对比实验替换策略只做 LRU 和 FIFO 两种覆盖教学大纲的主要考点即可。Cache 仿真的数据模型可以参考public class CacheLine { private boolean valid; private boolean dirty; private int tag; private long lastAccessTime; private int[] data; // 替换时需要更新时间戳 }当 CPU 访问一个地址时平台需要计算 index 和 tag索引 Cache 组判断是否命中。未命中时从“主存”中加载数据块如果 Cache 行已满则按策略替换。整个流程跑一遍后统计命中次数和访问总次数计算命中率。这个实验的交互设计要直观。我见过一些平台用表格展示 Cache 每一行的状态有效位、脏位、Tag、数据访问地址时高亮命中行或替换行学生能一眼看出访问序列对命中率的影响。界面写得好这个实验的演示效果会非常出色答辩时直接现场演示“不同替换策略下命中率不同”这个现象比说十句话都管用。前端部分如果是从零开发工作量确实很大。但换个角度你也可以把仿真逻辑做成后端 API前端只负责采集参数、发送请求、渲染结果。比如 Cache 实验前端把“地址访问序列”提交给后端后端返回每一步的“状态快照”前端把这些快照做成动画播放。这样做的好处是核心仿真代码集中在 Java 端便于测试和复用。4. 在线实验平台的实操流程与关键环节前面讲的是项目模块这一节讲实际操作时怎么落地。不要一上来就写代码先把流程理顺否则后期反复重构很耽误时间。4.1 初始化项目和基础框架打开 IDEA用 Spring Initializr 创建项目Java 版本选择 JDK 17 或 21Spring Boot 版本建议 3.2.x 或 3.3.x。依赖方面我建议勾选Spring WebSpring SecurityMyBatis-Plus Framework通过 Maven 手动引入MySQL DriverLombokValidation如果你用的 Spring Boot 3.3 及以上版本需要额外注意Spring Security 6 的配置方式和旧版 5 有较大变化。很多网上教程是旧版的写法直接抄过来经常会报SecurityFilterChain相关的错误。建议以官方文档为准。项目创建好后先不要急着写业务代码先把统一的返回结果类写好。Data public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(String message) { ResultT result new Result(); result.setCode(500); result.setMessage(message); return result; } }再定义全局异常处理器这样后续代码中遇到业务异常只需要throw new BizException(电路存在环路)前端就能收到友好的错误提示而不是一坨堆栈信息。4.2 用户认证与权限控制Spring Security JWT 的组合是当前主流方案。流程很简单用户登录时后端校验用户名密码签发 JWT token前端后续请求带上Authorization: Bearer token后端通过拦截器解析 token获取用户信息和角色控制接口访问权限。安全配置核心代码大致是这样的Configuration EnableWebSecurity public class SecurityConfig { Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable) .sessionManagement(session - session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth - auth .requestMatchers(/api/auth/**).permitAll() .requestMatchers(/api/experiment/**).hasAnyRole(STUDENT, TEACHER, ADMIN) .requestMatchers(/api/admin/**).hasRole(ADMIN) .anyRequest().authenticated() ) .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } }这里要提醒一个重要小点跨域配置。如果你的前端跑在http://localhost:5173后端跑在http://localhost:8080浏览器默认会拦截跨域请求。要么在 Spring 中配置 CORS要么通过 Nginx 反向代理。我建议在开发阶段直接用 CorsConfig 解决省事。4.3 仿真接口的设计思路仿真实验涉及的核心 API 不多但每个都要好好设计。以下是我实际项目中用到的接口清单你可以直接参考方法路径功能POST/api/simulate/digital-logic/run运行数字逻辑电路仿真传入电路配置 JSON返回输出电平POST/api/simulate/alu/run运行运算器仿真传入操作数和操作码返回 ALU 结果与标志位POST/api/simulate/cache/run运行 Cache 仿真传入地址访问序列与策略参数返回命中率及状态变化POST/api/experiment/submit提交实验服务端自动判题并记录成绩GET/api/experiment/{id}/records查询某实验的当前用户提交记录GET/api/question/list分页查询题库题目支持按知识点、题型筛选在设计接口时入参和出参一定要定义清晰。比如数字逻辑仿真接口入参可以是{ inputSignals: [ { signalName: A, level: 1 }, { signalName: B, level: 0 } ], gates: [ { gateId: G1, type: AND, inputs: [A, B], output: S1 }, { gateId: G2, type: NOT, inputs: [S1], output: CARRY } ] }返回结果则是每个输出信号的电平值。出参里要加上success和message字段这样前端既能处理正常结果也能捕获到类似“输入端悬空”“两个输出短接”这类错误信息。4.4 自动判题服务的实现思路自动判题并不仅仅是“比对输出等于预期”。更严谨的做法是实现一个可配置的评分器。每个实验在创建时会绑定一组测试用例每条测试用例包含输入、期望输出、分值。判题流程如下解析学生提交的电路或运算配置如果是逻辑电路进行拓扑排序和合法性校验检查悬空引脚、输出短路、回路逐条跑测试用例计算实际输出比对实际输出与期望输出计算通过率根据通过率折算得分写入experiment_record表如果学生多次提交只记录最高分或最后一次得分这个策略可以在后台配置。判题结果最好返回给前端一份详细报告比如{ totalCases: 6, passedCases: 5, score: 83.3, details: [ { caseId: 1, input: A0,B0, expected: SUM0,CARRY0, actual: SUM0,CARRY0, pass: true }, { caseId: 2, input: A0,B1, expected: SUM1,CARRY0, actual: SUM1,CARRY1, pass: false } ] }这类详细报告非常有用学生能知道自己的电路到底错在了哪组输入下教师也能通过统计数据知道哪些知识点学生掌握得不好。这是系统做到“能用”和“好用”之间的关键区别。4.5 实验报告的提交与评阅不能把实验报告做成一个“可选项”因为教学场景里实验报告往往是必须的。我建议的流程是学生在完成仿真实验并得到成绩后可以继续编辑实验报告内容包括实验目的、实验原理、实验步骤、仿真结果截图或数据、心得体会。提交后教师端出现待评阅列表教师打分并填写评语。图片上传功能用本地存储或 OSS 都行。毕设项目图省事的话直接存本地然后配置一个静态资源映射。但要注意本地存储路径不要硬编码在代码里建议写在application.yml中通过Value注入。upload: dir: /data/simulab/uploads/如果担心上传文件大小影响服务器可以在配置里限制单文件最大 10MB。前端上传时也别直接往服务器甩做个简单的 size 校验体验会好很多。5. 常见问题与排查技巧实录这个部分直接记录我在开发和调试过程中踩过的坑可以说每一条都是真实教训。5.1 Spring Boot 版本引发的 Security 配置问题如果你创建项目时选了 Spring Boot 3.x默认引入的 Spring Security 是 6.x。这时候你还按网上那些WebSecurityConfigurerAdapter的老写法去配ClassNotFound 或者方法废弃的报错会扑面而来。正确做法是所有配置都基于SecurityFilterChain的 Bean 方式并直接使用 Lambda DSL。还有一个常见的坑前后端分离项目如果不配置 CORS前端调用接口时会提示CORS policy错误。解决办法是在 Security 配置中加上cors(Customizer.withDefaults())并且定义 CorsConfigurationSource Bean。不要只写一个CrossOrigin注解就完事全局配置更省心。建议参考 Logout 相关配置时注意新版 Spring Security 默认启用 CSRF 保护开发 API 时如果不做csrf.disable()POST 请求会返回 403排查半天都不知道问题在哪。5.2 JSON 序列化循环引用问题实验表关联用户表、记录表关联实验表和用户表如果实体类里使用ManyToOne直接双向关联用 Fastjson 或 Jackson 序列化时经常出现循环引用导致堆栈溢出。我的建议是实体类保持和数据库字段一一对应业务组装的数据用 DTO 或Map返回而不是直接在 Controller 里返回实体类。比如查询实验列表时需要附带“当前用户是否已提交”“最高分是多少”这些字段就单独写一个ExperimentVO包含Experiment的字段和附加字段。这样不仅避免序列化问题接口文档也更清晰。5.3 电路仿真前端渲染性能问题数字逻辑实验界面需要拖拽门电路、绘制连线。如果前端使用 SVG 渲染当门电路数量超过 50 个、连线超过 100 条时浏览器会感觉到明显卡顿。排查后发现问题出在每次拖动元件时都进行全量重绘。优化思路有两个分层渲染连线层和元件层分开拖动元件时只重绘元件层连线层只在变化时更新。防抖更新鼠标移动过程中不实时计算电路输出而是等待 200ms 停稳后再发送仿真请求避免高频请求压垮后端。前端代码里用requestAnimationFrame或者debounce都能有效缓解这个问题。不要等到答辩现场演示时卡成 PPT提前做性能测试很重要。5.4 并发提交实验导致成绩写入错乱我在测试阶段遇到过这样的问题学生快速点击“提交实验”按钮多次最终成绩记录出现了多条且提交次数统计不一致。后来排查发现是并发请求导致的问题。解决办法是在提交接口加上synchronized或使用乐观锁。不建议直接用分布式锁毕设项目没必要引入 Redis。我用的是 MyBatis-Plus 的乐观锁功能在experiment_record表加version字段更新前先查版本号更新时带上WHERE version ?如果影响行数为 0说明有并发冲突返回“请勿重复提交”。另外前端按钮在提交过程中要置灰并显示 loading这是最简单的第一道防线。5.5 题库数据初始化题库功能虽然不难但数据量少的话页面会很空。推荐写一个数据初始化 CommandLineRunner在项目启动时检查题目表如果为空就自动导入 SQL 文件中的题目。你可以找一些公开的计算机组成原理习题库整理成 JSON 或 SQL 格式。注意不要直接复制教材扫描版的题目尽量自己改写表述避免版权问题和重复率过高。热搜词里反复提到“二十套计算机组成原理试题库及答案”我额外提一句这种题库不要一股脑全导入优先覆盖以下知识点数制与编码、原码反码补码、浮点数 IEEE 754、主存储器组织、Cache 映射、指令格式、寻址方式、微程序控制、流水线、中断系统。覆盖这些知识点平台的题库才算有教学价值。6. 功能扩展与论文写作建议毕设做完核心功能后精力允许的话可以再加一些锦上添花的内容。这些内容不一定要完全实现但在论文“展望”部分提出来能体现出你对整个系统的全局思考。6.1 实时协作与课堂管理可以把“实验排行榜”做出来统计班级内各学生的实验完成度和平均分。也可以加一个简单的“在线状态”功能教师能看到哪些学生正在做实验这个功能用 WebSocket 推送就好Spring Boot 集成 WebSocket 并不复杂。有些学校要求实验教学必须有“课堂签到”环节你也可以做成学生进入实验页面即自动签到教师后台看到签到列表。这不算核心模块但提出来会让系统更像一个完整的教学平台。6.2 基于虚拟机的发动机装调工艺仿真开发这个方向虽然和“计算机组成原理”无关但如果你后续想结合学校虚拟仿真课程的要求可以把平台的仿真框架扩展到其他学科实验比如电路分析、信号与系统。做法就是抽象出“实验类型 配置器 判题器”三段式框架新增一个实验类型时只需要写对应的仿真模型和判题器前端用通用画布加载配置。6.3 论文写作的几个写作顺序论文结构建议按这样的顺序来第一章绪论背景与意义、国内外研究现状、论文结构。第二章关键技术Spring Boot、MyBatis-Plus、JWT、数字逻辑仿真原理、Cache 映射原理。第三章系统需求分析功能需求、非功能需求、用例图。第四章系统设计总体架构、功能模块划分、数据库设计。第五章系统实现用截图和核心代码片段说明各模块完成情况。第六章系统测试功能测试、性能测试、测试结论。第七章总结与展望。写论文的时候尽量把“仿真原理”部分写深一点。评审老师看这个题目时最关心的往往不是 CRUD 界面而是你对“计算机组成原理”本身的理解。你可以把数字逻辑仿真中的拓扑排序算法画成流程图把 ALU 中标志位计算的布尔表达式列出来这些都是实打实的干货比堆 200 行 Spring Boot 配置有说服力得多。7. 项目清单与交付物整理最后整理一下整个项目最终需要交付的东西方便你自己核对后端工程源码包含完整的接口文档Swagger 注解或 Postman 导出。前端工程源码包含学生端、教师端、管理端页面。数据库初始化脚本包含表结构和基础实验数据、题库数据。演示视频或录屏3 到 5 分钟即可重点展示数字逻辑仿真和 ALU 实验。部署文档说明如何快速在本地启动项目。实验说明文档每个实验的配置步骤和使用方法评阅老师未必会仔细看你代码但一定会点击操作一下系统。有些高校的毕业设计管理系统要求提交“项目演示视频”这个视频千万不能剪得太花哨重点是操作路径登录→学生进入实验→拖拽元件→连线→点击运行→看到输出结果→提交→查看成绩。整个过程干净利落就够了。还有一点经验之谈答辩的时候千万要把“仿真逻辑是自己写的”这句话讲清楚。老师大概率会问“你这个实验平台的仿真内核是怎么实现的”如果此时你能当场打开代码指出LogicGate.compute()方法的位置顺手改一个门电路类型重新运行测试用例效果会非常加分。这比任何漂亮的界面都更有说服力因为这证明你确实理解计算机组成原理的知识而不只是套了一个 Spring Boot 的壳。从我个人的体会来说这个项目最花时间的部分不是 Spring Boot 的接口开发而是数字逻辑电路的建模与判题逻辑。你要把“电路”从“图形”变成“数据”再让“数据”产生“计算结果”。一旦把这个核心模块打通后面的 ALU、Cache 实验都是同一套思路的延伸。选这个题目的同学如果你原来的硬件基础一般也别担心仿真实验能把那些抽象的概念变得可操作、可验证做完这个项目你对计算机组成原理的理解会明显上一个台阶。