SpringBoot+Vue+MySQL考务报名平台开发实战与毕设指南

发布时间:2026/9/10 7:00:33
SpringBoot+Vue+MySQL考务报名平台开发实战与毕设指南 说实话我当年选毕业设计题目的时候一眼就锁定了“考务报名平台”这个方向。原因很简单这类系统业务场景清晰学生、教师、管理员三类角色边界分明整个流程既有信息展示、又有在线报名、还得有后台审核和成绩管理该有的技术点全都能覆盖到。如果你正在为毕设题目发愁或者刚学完SpringBoot和Vue想找一个小而全的项目练手这套基于SpringBoot Vue MySQL的考务报名平台算是一个性价比非常高的选择。这篇文章我会把自己在做这个项目时踩过的坑、觉得关键的实现细节、以及答辩前怎么准备尽量完整地分享出来。不管你是只想跑通一个毕设还是想从中学到前后端分离项目的完整思路应该都能在这里面找到有价值的东西。1. 项目核心拆解考务报名平台到底在做什么1.1 业务需求分析真实考务场景里的痛点很多人拿到题目第一反应是“不就是个报名系统嘛”但真往细了想里面的业务规则其实不少。我先把考务报名这个线下场景捋了一遍一个培训机构或者学校组织一场考试首先是发布考试公告包含考试科目、时间、地点、报名起止时间、名额限制然后是学生在线报名老师后台审核审核通过后老师需要维护考场和座位信息考试结束后还要录入成绩、发布成绩让学生能查到自己的分数和排名。如果这些环节全靠线下表格和人工沟通信息不同步、名额统计不清楚、成绩分发麻烦都是常态。所以这个平台的核心价值就是把“考试信息发布、学生报名、老师审核、成绩管理”这条主链路搬到线上。我在需求分析时把用户分成三类学生关心的是“怎么快速报名、怎么查成绩”老师关心的是“怎么审核报名、怎么统计人数、怎么发成绩”系统管理员关心的是“角色权限对不对、数据别乱”。从这三类需求出发我把系统拆成了六个核心模块用户认证、考试信息展示、在线报名、报名审核管理、成绩发布与查询、公告管理。这个拆分做完之后数据库设计和接口设计就都顺了。1.2 技术选型为什么这套组合被称为“毕设最稳阵容”技术栈的确定我其实犹豫过要不要上Spring Cloud微服务后来被导师一句“你能讲清楚为什么要微服务吗”给劝退了。确实一个考务报名平台单机部署、数据量几千条的场景用微服务纯属给自己挖坑。SpringBoot Vue MySQL这套组合是我综合比较之后觉得最稳的。先讲后端SpringBoot。相比之前学的SSM框架要手动配置一堆XML文件SpringBoot的自动装配确实省心太多。起步依赖把常用组件的版本都锁好了我不需要担心jar包冲突RestController注解一把梭内嵌Tomcat直接跑jar包部署也简单。而且Spring Boot的生态非常成熟无论是集成MyBatis-Plus、JWT还是参数校验网上资料一搜一大把对于毕设阶段的新手非常友好。再讲前端Vue。Vue的核心是组件化开发和数据驱动视图。组件化意味着我把考试卡片、报名表格、弹窗这些重复出现的界面元素抽成组件页面代码能少写一大半数据驱动意味着页面上的数据变化会自动更新视图不用像以前写JQuery那样手动操作DOM。前后端分离之后前端可以本地起一个开发服务器后端单独跑接口两边并行开发互不干扰联调效率高很多。MySQL的选择几乎不需要犹豫。对于这个项目的数据量单机MySQL完全够用而且免费稳定、资料多。最重要的一个原因是这套技术栈是答辩评委老师最熟悉的组合你讲技术选型的时候他们能理解追问起来你也有把握答上来。2. 数据库设计考务数据怎么建模最合理2.1 核心表规划围绕“考试”这个业务核心向外扩展做表设计的时候我遵循了一个原则围绕核心业务实体向外扩展。考务报名平台的核心实体是“考试”所有其他表都是围绕考试和用户这两个基本点展开的。第一张核心表是用户表我是起了个名字叫sys_user。字段包括id、用户名、密码、姓名、手机号、角色标识、创建时间。这里有一个非常关键的设计决策密码绝对不能存明文。我用的是BCrypt加密每次加密结果都不一样就算数据库泄露了破解成本也非常高这个细节在答辩时基本都会被问到。第二张是考试信息表exam_info包含考试名称、考试类型笔试/机试/面试、报名开始时间、报名结束时间、考试开始时间、考试地点、最大报名人数、已报名人数、考试状态等字段。这里我给“已报名人数”单独留了一个字段而不是每次都靠count(*)去统计原因是为了列表页展示的效率。考试列表页要展示每场考试“已报名/剩余名额”如果用实时计数每次查询都要回表统计页面数据一多就会变慢。第三张是报名记录表enroll_record连接用户和考试的桥梁字段包括用户id、考试id、报名时间、审核状态、审核备注。这张表我加了一个联合唯一索引(user_id, exam_id)防止同一个学生对同一场考试重复报名。这个索引看起来不起眼但它是防重复报名的最后一道防线后面讲并发控制时还会详细说。第四张是成绩表exam_score字段包括考试id、用户id、成绩、排名、发布状态。另外我还建了公告表notice和操作日志表operation_log。公告表用于首页展示日志表是后来加的记录管理员的关键操作比如删除报名记录、修改成绩方便出问题的时候回溯。2.2 表关系梳理与字段设计细节画ER图的时候关系就很清晰了用户和考试之间是多对多关系通过报名记录表来关联考试和公告是一对多用户和成绩是一对多。这个ER图画到论文里基本能让评委看出你对数据库设计是有概念的。字段命名方面我统一用下划线风格比如exam_name、create_time后端实体类用驼峰命名靠MyBatis-Plus开启驼峰映射自动转换。所有表都加了create_time和update_time两个字段MyBatis-Plus有自动填充功能插入或更新时自动维护这两个字段不用手动赋值。以后查数据出问题看create_time能快速判断这条记录是什么时候产生的排查线上问题非常有用。2.3 MySQL安装与基础配置开发环境我用的MySQL 8.x这个版本性能比5.7强不少但连接时要注意时区问题。我之前在家里电脑装的时候一直连不上报错信息是Server returns invalid timezone后来在JDBC连接URL后面加上?serverTimezoneAsia/Shanghai才解决。建议新装MySQL的同学直接把连接URL配完整jdbc:mysql://localhost:3306/exam?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai可以省掉很多不必要的麻烦。建库时字符集要指定utf8mb4排序规则用utf8mb4_unicode_ci。如果使用默认的latin1中文会直接乱码而且后期改字符集很麻烦最好建库时就统一设置好。3. 后端实现SpringBoot接口层怎么组织更清晰3.1 分层架构与项目结构后端用了典型的Controller-Service-Mapper三层架构。Controller层只负责接收参数、调用服务、返回结果Service层做业务逻辑Mapper层负责数据库交互。三层分开之后好处是职责清晰出了问题知道去哪一层查答辩画架构图也方便。具体模块划分是这样的auth模块管登录注册user模块管用户管理exam模块管考试信息和公告enroll模块管报名业务score模块管成绩common模块放统一返回类、全局异常、工具类这些公共内容。每个模块就是一个包包里面再按Controller、Service、Mapper分包结构很直观。3.2 统一返回格式和全局异常处理前后端联调时最大的坑就是返回格式不统一。我见过有同学有的接口返回{code:200, data:{}}有的直接返回一个数组有的报错时只返回一个字符串前端每个接口都要单独去处理格式非常痛苦。我的做法是定义一个泛型类ResultT里面固定code、message、data三个字段无论接口成功还是失败都返回这个结构。成功时code为200失败时code为其他错误码。前端在axios响应拦截器里统一判断code如果不是200就直接弹出message每个页面再也不用单独处理错误逻辑。异常处理用RestControllerAdvice实现全局异常捕获。我在Service层抛出业务异常BizException在前端传参校验失败时框架会抛MethodArgumentNotValidException这些异常统一被全局异常处理器捕获转换成Result返回。这样Service层代码很干净不用每个方法都写try-catch逻辑看起来也舒服得多。3.3 用户认证JWT的接入与拦截器实现登录认证这块我选择用JWTJSON Web Token而不是传统的Session方案。核心原因是前后端分离后前端和后端可能运行在不同的域名上Session的跨域问题是绕不开的痛点而JWT是无状态的token本身携带用户信息后端不需要存登录状态扩展起来很方便。登录成功后的流程是后端根据用户id和角色生成JWT token返回给前端前端把token存在localStorage里每次请求时在Authorization请求头带上token。后端用一个拦截器统一解析token解析成功就把用户信息放到ThreadLocal里业务代码里可以直接取当前登录用户。拦截器只拦截需要登录的路径登录注册接口要放行。我用的HandlerInterceptor在preHandle方法里做token校验解析失败直接返回一个401状态码和统一格式的错误信息。这里有个细节拦截器里不要做任何业务操作只负责身份校验和用户信息注入保持职责单一。3.4 报名接口的核心逻辑并发控制与事务报名接口是整个系统里最值得细讲的部分因为这一个接口同时涉及事务、业务校验和并发控制。PostMapping(/enroll) public ResultString enroll(RequestBody Validated EnrollReq req) { // 业务校验 保存 更新名额 }拿一张图来说这个接口内部有三步第一步校验考试是否存在、报名时间窗口是否开放第二步判断当前用户是否已报名第三步插入报名记录并更新考试表的already_count字段。事务用Transactional注解标注这三步要么全部成功要么全部回滚。并发控制上有两个技术点要特别强调第一防止重复报名。虽然代码里已经查了一遍是否报名过但并发场景下两个请求同时通过校验就可能各自插入一条报名记录。所以我在数据库层面用联合唯一索引(user_id, exam_id)兜底插入时违反了约束直接抛异常这是最后一道防线。第二防止超卖名额。更新名额时不是先查后更而是用一条带条件的原子更新语句UPDATE exam_info SET already_count already_count 1 WHERE id #{examId} AND already_count max_count如果影响行数为0说明名额已满或者考试不存在直接抛“报名人数已满”的异常。这种写法把并发判断下推到数据库层比在Java代码里先查再更安全得多也是我在做这个项目时觉得收获最大的一个技巧。3.5 MyBatis-Plus让数据操作简化了一大截我整个项目没有手写过单表的SQL直接用MyBatis-Plus的BaseMapper接口单表CRUD直接继承就能用。条件查询用LambdaQueryWrapper写法很优雅LambdaQueryWrapperEnrollRecord wrapper new LambdaQueryWrapper(); wrapper.eq(EnrollRecord::getUserId, userId) .eq(EnrollRecord::getExamId, examId); EnrollRecord record enrollRecordMapper.selectOne(wrapper);分页用自带的Page对象作为Mapper方法参数分页插件会自动拦截SQL补全LIMIT语句。我的做法是分页参数统一从查询DTO里接收然后手动构建Page对象传给Mapper返回结果里带上总条数和列表数据前端做分页展示就很方便了。复杂查询场景比如“报名列表联查考试名称和用户名”我会写自定义SQL返回VO对象。这里有个需要注意的点自定义SQL里如果要分页Page对象必须作为方法参数传入MyBatis-Plus分页插件才能正确拦截。3.6 参数校验与安全细节Controller入参我用Validated注解在DTO字段上用NotBlank、Email、Size等注解声明校验规则。比如登录表单用户名不能为空密码长度要在6到20位之间。校验不通过时框架会自动抛出MethodArgumentNotValidException被全局异常处理器捕获后返回给前端根本不需要在业务代码里写一堆if判断。安全这块还有两个细节值得说一是密码加密用BCryptPasswordEncoder同一个密码每次加密结果都不同能有效防止彩虹表攻击二是JWT的密钥不要写在代码里放到配置文件中正式上线时可以通过环境变量注入。虽然毕设阶段这些安全要求不高但养成这个习惯对以后进企业写代码很有帮助。4. 前端实现Vue页面的关键设计与接口对接4.1 工程搭建与目录结构前端工程我是用Vue CLI创建的如果你用Vite也行Vite的冷启动更快但Vue CLI的Webpack生态更稳资料多、遇到问题好查。组件库方面Vue2项目用Element UIVue3项目用Element Plus我这里写的是Vue2 Element UI的组合也是目前网上资料最丰富的一套。项目结构按功能划分目录views放页面组件router放路由配置api放接口请求封装utils放工具函数components放公共组件store放全局状态管理。这样的目录结构让每个文件的职责清晰页面多了也不会乱。接口封装这块我特意做了模块化处理api目录下按后端模块拆文件比如exam.js里封装所有考试相关的接口请求enroll.js里封装报名相关的接口。页面里调用接口时只需要import { getExamList } from /api/exam非常方便也方便后期维护。4.2 Vue Router与路由守卫路由设计上我区分了学生端和管理员端。学生端的页面有登录页、首页、考试列表、考试详情、我的报名、成绩查询、个人中心管理员端套一个Layout布局组件下面挂考试管理、报名审核、成绩录入、公告管理等子页面。路由守卫是整个前端安全的核心必须要用好。我用Vue Router的beforeEach钩子做全局前置守卫逻辑很简单先判断本地有没有token没有就强制跳登录页有token再根据用户角色判断当前路由是否允许访问如果访问的是管理员页面但角色是学生直接重定向到首页并提示权限不足。这里我给一个建议按钮级别的权限不要都写在页面里可以抽一个自定义指令v-permission。比如审核按钮只有管理员能看到那按钮上加上v-permissionadmin指令指令内部判断当前用户角色没有权限就直接销毁这个元素。这样页面代码干净不少答辩时也能体现出你对权限控制有思考。4.3 Axios封装与Token处理axios实例统一在utils/request.js中创建设置基础URL为后端接口地址超时时间10秒。请求拦截器里从localStorage读取token并放到Authorization请求头响应拦截器先判断HTTP状态码如果是401说明token失效清空登录状态并跳转登录页然后判断业务状态码code不是200就this.$message.error(message)弹出错误提示。这里有我踩过的一个大坑跨域请求如果带着自定义请求头比如Authorization后端的CORS配置必须加上allowedHeaders(*)否则浏览器会直接拦截这个请求而且报错信息特别让人迷惑。还有一次我在前端改了接口地址忘了改baseURL所有请求都404排查了很久才发现是环境配置的问题。这类问题一旦遇到先检查浏览器网络面板看请求到底发到了哪个地址、响应状态码是什么比盲猜效率高得多。4.4 组件化复用与数据驱动视图我把考试信息展示抽成了组件ExamCard接收一个考试对象显示考试名称、报名时间、考试时间、剩余名额并根据状态显示不同颜色的标签绿色表示可报名黄色表示即将开始灰色表示名额已满。这样首页、考试列表页、学生个人中心都能复用这个卡片改样式只需要改一个地方。Vue的computed在展示层很好用比如剩余名额可以直接写成computedcomputed: { surplusCount() { return this.exam.maxCount - this.exam.alreadyCount } }这样当后端返回的alreadyCount变化时页面显示会自动更新不需要手动操作DOM。前端要做的只是正确地维护数据视图层完全交给框架处理这就是Vue数据驱动思想的体现。5. 核心业务场景串联从学生注册到成绩查询的完整闭环其实到这里系统的各个模块都讲得差不多了但模块再多不如把主链路完整跑一遍。我从用户的使用角度把整个系统串起来讲一遍也方便你答辩的时候给评委讲业务场景。5.1 学生端操作流程学生在注册页填写用户名、密码、姓名、手机号后端校验用户名唯一后用BCrypt加密存储注册成功默认分配student角色。登录后首页展示最新公告和正在报名中的考试列表点击考试详情可以看完整信息考试科目、报名起止时间、考试时间、考试地点、已报名和剩余名额。如果当前时间在报名窗口内页面上会显示“立即报名”按钮。报名成功后在“我的报名”页面看到这条记录状态是“待审核”。管理员审核通过后状态变成“已通过”考试详情页会显示具体的考场和座位信息。考试结束后老师录入成绩并发布学生在“成绩查询”页面能看到分数、排名和考试结果。这个流程逻辑完整且顺畅学生端的核心体验就是报名简单、信息透明、成绩可查。5.2 管理端操作流程管理员登录后进入后台布局第一步是先发布考试信息填好考试科目、报名时间、考试时间、地点和最大报名人数。报名开启后报名审核页会实时出现新记录管理员可以一键通过或驳回驳回时必须填写原因方便学生理解为什么没通过。考试时间到了管理员在成绩录入模块按考试科目选择已通过审核的学生逐个录入成绩录入完成后批量发布。发布后学生端马上能看到成绩整个闭环就闭合了。我建议你把这个流程画成时序图放进论文能很直观地向评委展示你对整个业务场景的理解远比大段文字描述有说服力。6. 部署交付从开发环境到可展示Demo6.1 本地联调的关键点本地开发时后端跑在8080端口前端开发服务器跑在3000Vue CLI或5173Vite端口。我用的是前后端分离开发模式所以需要在vue.config.js里配置代理把/api开头的请求转发到http://localhost:8080devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这样配置之后前端请求/api/exam/list会转发到http://localhost:8080/api/exam/list且不产生跨域问题。后端还需要配置CORS这里有很多人都搞混了如果前端用了代理后端其实可以不配CORS但如果前端直接请求后端地址比如某些朋友直接用postman测试前端代码就必须要配CORS。我的做法是后端写一个全局的CORS配置类开发环境允许本地的3000/5173端口访问生产环境通过Nginx同域部署后基本不需要跨域配置。6.2 打包与部署方法前端打包执行npm run build生成dist目录里面是纯静态文件。后端打包执行mvn clean package -DskipTests生成一个可执行jar包。部署时最省事的方式是前端dist目录放到Nginx的html目录下后端jar包直接java -jar exam-server.jar启动Nginx配置将/api前缀的请求反向代理到后端的8080端口。如果你有云服务器且时间充裕可以试试用Docker来部署。MySQL和Nginx用容器跑后端jar打成Docker镜像这样以后迁移环境很方便。Dockerfile很简单FROM openjdk:8-jre-alpine COPY exam-server.jar /app.jar ENTRYPOINT [java, -jar, /app.jar]但是要注意如果本地用的JDK版本比较新比如JDK17那构建镜像的基础镜像也要选对应的JDK版本否则JVM版本不兼容会启动报错。6.3 部署文档应该写清楚什么论文里的部署文档不需要写成运维手册但要点必须覆盖环境要求JDK版本、MySQL版本、Node版本、初始化数据库步骤执行SQL脚本、修改配置文件数据库账号密码、启动后端、启动前端、浏览器访问地址。我的建议是部署文档写成“5分钟上手”的风格每一步配一句说明和一张截图。这样即使评委老师现场想演示照着文档也能快速跑起来给评委留下好印象。7. 论文与答辩准备让毕设从代码升级为完整作品7.1 论文结构怎么规划这套毕设的论文结构上我是按这个顺序写的摘要、绪论背景与意义、国内外现状、相关技术介绍、需求分析与系统设计、数据库设计、系统详细设计核心流程与关键代码、系统测试、总结与展望。论文里最重要的两张图是系统架构图和数据库ER图。架构图我会画一个前后端分离的部署关系图明确标出浏览器、Nginx、前端静态资源、后端接口、MySQL数据库这几层的关系ER图把核心表的字段和关系画清楚。这两张图画好了评委对项目的了解就完成了一大半后续讲解压力小很多。写论文还有一个经验不要等项目全部写完再动笔。每完成一个模块就同步把该模块的界面截图、核心代码贴进论文对应的章节最后再统一润色。如果攒到最后一起写很容易遗漏细节而且回忆代码实现的过程特别痛苦。7.2 答辩必被追问的5个问题我把自己答辩时被问过的、以及身边同学被追问过的问题整理成了清单提前准备好基本就不会被问住。第一为什么选择前后端分离答职责清晰、团队可以并行开发、前端后端可以独立部署和扩展。因为考务报名平台需要同时适配PC端浏览器和移动端前后端分离后后端接口可以同时供多端使用。第二JWT和Session有什么区别答JWT是无状态的token服务端不用存储登录状态适合分布式部署和跨域场景Session依赖服务端存储集群环境下需要额外的session共享机制。同时JWT本身携带用户信息解析后可以直接用减少了查询数据库的成本。第三项目安全性怎么保证答密码BCrypt加密存储防止明文泄露接口参数用了Validation校验JWT拦截器做身份认证基于角色的权限控制MyBatis预编译防止SQL注入。这些点每一条都能展开讲两句就体现出你考虑过安全问题。第四如果集中报名导致并发量增大系统会不会出问题答目前项目在数据库层面做了并发兜底报名记录表加了联合唯一索引防止重复报名更新名额用了带条件的UPDATE防止超卖这是单机架构下的解决方案。如果并发量真正上来了可以用Redis分布式锁或消息队列削峰也可以把数据库拆成主从读写分离。答完这几层基本就够了。第五这个项目还有什么可以扩展的地方答可以增加在线支付功能报名费缴纳、邮件短信通知、Excel批量导入导出学生信息和成绩、对接统一身份认证等。我一般会强调“邮件通知”和“对接统一身份认证”因为这两个方向能体现出你对项目扩展性的思考。7.3 时间不够时怎么分配优先级如果你的时间比较紧我给你一个优先级排序先把核心流程跑通登录注册、考试列表、报名、审核、成绩查询这五个核心功能必须完整可用。时间再紧也千万别去搞一堆炫技模块比如图表可视化、消息推送结果核心流程反而有bug答辩时演示直接翻车。开发顺序上先设计数据库把表结构和字段都定下来然后写后端接口每一个模块完成后用Postman测试一遍再写前端页面。一边开发一边把论文和部署文档同步更新做到“做完即写完”最后留两三天时间整体联调和准备答辩PPT时间安排就从容很多。8. 常见问题与排查技巧实录8.1 环境启动类问题SpringBoot版本太高导致启动失败如果你用的是JDK8但pom.xml里引入的是Spring Boot 3.x启动时会报“Unsupported class file major version”之类的错误因为Spring Boot 3.x要求JDK17起步。最稳的组合是JDK8 Spring Boot 2.7.x这也是目前市面上大多数中小企业和教程使用的版本。MySQL连接失败先检查MySQL服务是否启动然后在命令行里用账号密码登一遍数据库确认账号密码没错。如果报时区错误回到连接URL把serverTimezoneAsia/Shanghai加上。如果端口不是默认的3306也必须在配置里指定。端口被占用改掉application.yml里的server.port就行或者用netstat -ano | findstr 8080找到占用进程并kill掉。但我一般建议直接换端口简单省事不用在意是哪个程序占用的。8.2 前后端联调类问题这类问题排查起来最花时间我单独列出来几张表跨域请求被浏览器拦截检查后端CORS配置是否允许了来源和请求头。要特别注意自定义请求头必须在allowedHeaders里加上否则浏览器直接拦住。我个人的建议是前端开发环境用代理生产环境用Nginx同域部署这两层配置互相配合跨域问题基本就不会出现了。前端请求404先在浏览器网络面板确认请求的URL然后对比后端Controller的RequestMapping路径。最常见的情况是前端baseURL配置错了比如配置成/api而后端接口路径是/exam/list而不是/api/exam/list。另外要检查路径中是否缺失了模块前缀。接口返回401基本上是token问题。看前端请求头里有没有带上tokentoken是否过期后端拦截器是否把该接口的路径给拦截了。登录接口一定记得放行否则就会陷入“没登录就无法登录”的死循环。8.3 数据与业务逻辑类问题报名成功但已报名人数没增加先检查事务是否提交失败回滚了再看更新名额的SQL条件already_count max_count是否不满足比如名额已满。还有一个隐蔽的坑如果接口是异步执行的事务还没提交就返回了前端看到的是旧数据这种时候要检查Service方法上是否加了Transactional且是否从外部调用Transactional只在代理对象调用时生效。中文乱码检查数据库表字符集是否为utf8mb4连接URL是否带useUnicodetruecharacterEncodingutf8参数。另外如果有旧数据是乱码的需要先把数据导出、重建表、再导入才能彻底解决。MyBatis-Plus自动填充不生效比如create_time没有自动赋值检查实体类上是否加了TableField(fill FieldFill.INSERT)且是否自定义了MetaObjectHandler实现类并在类上加了Component注解。这个坑我踩过一次然后发现是把自己写的Handler类放在common包下但没有被Spring扫描到而已。9. 最后想对后来者说的几句项目做完了从需求分析到数据库设计、从后端接口到前端页面、从部署到论文整个流程走下来我最真实的感受是毕业设计不是一次性应付差事的作业它给你提供了一个很完整的练手机会——把平时学的零散知识点串成一个能跑、能用、能讲的作品。如果你打算用这个方向做毕设或者已经选了这套技术栈但不知道从哪下手我的建议是先不要急着写代码花两天时间把数据库表结构和接口列表理清楚。只要这两项清楚了后面所有实现都是水到渠成的事。开发过程中多去搜“SpringBoot”“Vue”“MySQL”这些关键词网上踩过坑的人比你想的多得多你遇到的问题基本都能找到答案。最后再分享一个小技巧做任何模块之前先花10分钟把接口的入参、出参、异常情况写清楚然后再动手写代码。这个习惯会帮你减少至少一半的联调时间。祝顺利。