资讯动态

SpringBoot+Vue考试系统平台:Java Web毕设的完整实战指南

发布时间:2026/10/2 2:52:41 来源:尧图企业网站定制
1. 为什么我把考试系统平台列为Java Web毕设的“第一推荐”我做了这么多年Java开发带过的实习生、应届生不少也有很多人问过我毕设到底选什么题。说实话每次有人让我推荐题目考试系统平台总是排在我心里的前三名。它不是最有创意的选题但它一定是性价比最高的选题之一。先说个很多人容易忽略的点毕设选题的本质不是给导师展示你有多聪明而是让他“容易验收”。一个题库管理系统也好一个在线考试平台也好功能边界足够清晰前后端交互模式足够典型权限控制足够严谨又不用搞什么推荐算法、消息中间件这种容易给自己挖坑的复杂技术。只要你把基础功能做完、做完做好答辩时能讲清楚自己做了什么、为什么这么做就已经能拿到相当不错的分数了。SpringBootVue这套组合在2024、2025年几乎成了Java Web毕设的事实标准。SpringBoot负责后端接口、业务逻辑、数据库交互Vue负责前端页面渲染和用户交互两者通过RESTful API通信天然地切开了前后端职责边界。你做完这个项目哪怕不写一行额外代码光是把“前后端分离”这套架构讲明白就已经覆盖了毕设要求里“Web系统设计与实现”的核心考核点。更要紧的是这套系统是“有手就能跑”的。下载源码、导入数据库脚本、改一下配置、启动后端、启动前端五个步骤走完系统就在本地跑起来了。对于很多第一次接触完整Web项目的同学来说这一步的成功本身就是巨大的信心来源。后面我会按一个完整项目的落地顺序把技术选型、数据库设计、核心功能实现、对接联调、部署跑通、答辩准备全链路拆开讲。这篇分享的每一个步骤、每一段配置、每一张表的设计都是我之前带人做项目时反复验证过的方案不是凭空抄来的理论。2. 技术选型的底层逻辑不追新、只求稳很多同学一上来就纠结SpringBoot版本该用2.7还是3.2Vue该用2还是3前端组件库用Element Plus还是Ant Design Vue。我的建议很直接你选的不是“最好”的技术而是“最适合毕设”的技术。2.1 后端选型SpringBoot 2.7.x是当前的黄金版本SpringBoot 2.7.x是目前稳定性和教程资源平衡得最好的版本。它不像3.0之后强制要求JDK17也不像2.3那么老很多第三方教程都直接适用。JDK就用1.8对应pom.xml里的java.version1.8/java.version。说实话很多高校实验室的电脑装的还是JDK8如果你非要用SpringBoot 3.x配JDK17光是让实验室老师帮忙装环境这一步就可能卡住半天。下面这段是我经过多次验证的后端核心依赖配置可以作为pom.xml的基础模板parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.14/version relativePath/ /parent dependencies !-- Web层 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus大幅简化数据库操作 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency !-- Lombok简化实体类代码 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- JWT登录态管理 -- dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency /dependencies重点是MyBatis-Plus的引入。考试系统涉及大量的单表查询、分页查询、条件构造如果用原生MyBatis手写XML工作量会翻倍还不止。MyBatis-Plus的BaseMapper接口直接给你把selectById、selectPage、selectOne这些常用方法封装好了你只需要定义好实体类和Mapper接口就能用。比如试题查询里最常用的条件分页TestQuestionQueryVO.java严格来说这是伪代码注释我直接给出实际写法。在Service层里这样构造查询public PageResultTestQuestion pageQuery(QuestionQueryDTO dto) { LambdaQueryWrapperTestQuestion wrapper new LambdaQueryWrapper(); // 按题型过滤 if (dto.getType() ! null) { wrapper.eq(TestQuestion::getQuestionType, dto.getType()); } // 按知识点模糊查询 if (StringUtils.hasText(dto.getKnowledgePoint())) { wrapper.like(TestQuestion::getKnowledgePoint, dto.getKnowledgePoint()); } // 按难度排序 wrapper.orderByAsc(TestQuestion::getDifficulty); PageTestQuestion page new Page(dto.getPageNum(), dto.getPageSize()); testQuestionMapper.selectPage(page, wrapper); return new PageResult(page.getTotal(), page.getRecords()); }这就是核心了。一个查询接口五行代码就完成条件分页不需要写XML不需要拼接SQL字符串。这才是毕设最需要的“快速出活”模式。2.2 前端选型Vue 2 Element UI是老牌稳配前端我推荐Vue 2.6.x Element UI vue-router axios的组合而不是Vue 3 Element Plus。原因很朴素Vue 2的学习资料和现成代码模板在数量上远超Vue 3你遇到问题能搜到的解决方案几乎是全覆盖的。Vue 3的Composition API确实香但你要考虑自己的时间成本。做毕设的大部分人Java后端可能都还没完全吃透再去花两周啃Vue 3的组合式API、Teleport、Suspense这些新概念性价比太低。用Vue 2的Options API数据、方法、计算属性分开写结构一眼就能看懂。这是我在项目中反复用到的一个登录页面脚本结构可以让新手快速理解Vue组件怎么组织export default { name: LoginPage, data() { return { loginForm: { username: , password: , role: student // student / teacher / admin }, loading: false } }, methods: { handleLogin() { this.$refs.loginFormRef.validate(async (valid) { if (!valid) return; this.loading true; try { const res await loginApi(this.loginForm); localStorage.setItem(token, res.data.token); localStorage.setItem(userInfo, JSON.stringify(res.data.user)); this.$router.push(/dashboard); } catch (e) { this.$message.error(登录失败 e.message); } finally { this.loading false; } }); } } }你要知道Vue的本质是“数据驱动视图”。你只需要维护data里的状态页面自动跟着变。这个思维转换是很多后端同学学前端时最大的门槛。2.3 前后端联调axios 拦截器 路由守卫前端项目里一定要配置axios请求拦截器和响应拦截器。请求拦截器统一在Header里加token响应拦截器统一处理401token过期、500服务器异常、业务错误码等。这样每个页面调用接口时不需要重复写错误提示代码。// request.js import axios from axios; import { Message } from element-ui; import router from /router; const service axios.create({ baseURL: /api, // 开发环境走Vue代理生产环境由后端转发 timeout: 10000 }); service.interceptors.request.use(config { const token localStorage.getItem(token); if (token) { config.headers[Authorization] Bearer token; } return config; }); service.interceptors.response.use( response { // 后端统一返回 { code, msg, data } 结构 if (response.data.code ! 200) { Message.error(response.data.msg); return Promise.reject(new Error(response.data.msg)); } return response.data; }, error { if (error.response error.response.status 401) { localStorage.removeItem(token); router.push(/login); } Message.error(error.message); return Promise.reject(error); } );同时用vue-router的路由守卫控制页面权限未登录就跳转登录页router.beforeEach((to, from, next) { const token localStorage.getItem(token); if (!token to.path ! /login) { next(/login); } else { next(); } });这块做扎实了整个项目的骨架就稳了。后面加页面、加功能都是在骨架里填肉的事情。3. 数据库设计四张核心表和一个权限模型的拆解3.1 怎么最小化表设计又不被导师问倒很多同学做考试系统一上来就设计十几张表诸如试卷表、试题表、选项表、答题记录表、评分表、错题本表、消息通知表……最后把自己绕晕了。我的建议是先做减法再决定是否增量。考试系统的数据流无非是用户管理登录、角色、试题管理题库、考试管理试卷、答题、计分。最少、最稳的设计只需要四张表用户表sys_user字段名类型说明idbigint主键自增usernamevarchar(50)用户名唯一passwordvarchar(100)BCrypt加密后的密码real_namevarchar(50)姓名rolevarchar(20)admin / teacher / studentcreate_timedatetime创建时间试题表exam_question字段名类型说明idbigint主键subjectvarchar(100)科目question_typevarchar(20)single_choice / multiple_choice / judgequestion_contenttext题干optionstext选项JSON字符串如 [{key:A,content:...}]answervarchar(10)正确答案如 A 或 A,Cdifficultyint难度 1-5create_userbigint创建人ID考试表exam_paper字段名类型说明idbigint主键paper_namevarchar(100)试卷名称duration_minutesint考试时长分钟total_scoredecimal(5,1)总分question_idstext试题ID集合JSON数组statusint0未发布 1已发布 2已结束create_timedatetime创建时间答题记录表exam_answer_record字段名类型说明idbigint主键exam_idbigint考试IDuser_idbigint学生IDanswerstext答题详情JSON数组如 [{questionId:1,answer:A}]scoredecimal(5,1)得分submit_timedatetime提交时间这套设计有个好处写SQL脚本简单、导入数据库不需要处理复杂外键关系、接口实现时逻辑清晰。完全符合毕设答辩时“讲得出设计依据”的要求。3.2 权限控制的两种实现方式考试系统通常会涉及三种角色管理员、教师、学生。怎么用最少的代码实现角色区分我在这个项目里用的是单表用户 字段区分模式。用户在sys_user表里通过role字段指定身份后端将用户角色写进JWT token中。需要权限校验的接口上使用RequireRole注解配合拦截器检查。其实还有一个更进阶的方案Spring Security RBAC模型。但说实话完全用Spring Security那套过滤器链、UserDetailsService对很多第一次做Web项目的同学来说学习曲线陡得吓人。所以我推荐用拦截器 注解的方式实现一个极简的权限控制既能满足功能需求又能在答辩时展示你理解了“权限控制是怎么一回事”。自定义权限校验收到的核心逻辑大概这样Component public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod method (HandlerMethod) handler; RequireRole requireRole method.getMethodAnnotation(RequireRole.class); if (requireRole null) { return true; // 无注解的接口放行 } String token request.getHeader(Authorization).replace(Bearer , ); String role JwtUtil.parseToken(token).get(role).toString(); if (!requireRole.value().equals(role)) { response.setStatus(403); return false; } return true; } }而在Controller接口上只需要一行注解RequireRole(student) PostMapping(/submit) public Result submitExam(RequestBody SubmitDTO dto) { // 只有学生身份才能调用 }这样写既绕开了Spring Security复杂的配置又真实实现了接口级的角色隔离。比你什么都放行要好得多答辩老师也不会觉得你在糊弄。3.3 SQL脚本为什么值得单独交付很多人在分享毕设时只给源码不配SQL脚本这是很坑的。数据库表结构不明确项目根本跑不起来。我之所以强调要交付一份完整的init.sql是因为里面不只是建表语句还要有默认管理员账号已经用BCrypt加密好的测试教师账号、学生账号各一个每个科目至少3条示例试题数据一条示例考试数据这样一个新环境拿到脚本导入后登录就能看到数据立刻能开始体验功能。你做的不是给自己看的源码而是给导师、给评审、给未来接手者看的交付物。对于项目里的SQL文件建议这样组织sql/ ├── init.sql # 建库建表 初始化数据 ├── data_example.sql # 示例题库数据 └── update_backup.sql # 后续变更的增量脚本其中init.sql里我建议加入这样一条管理员数据。注意密码不要用明文之前我在实际项目中发现密码“123456”的明文形式直接写入表里会被同行狠狠吐槽而且答辩时就是活靶子。正确做法是INSERT INTO sys_user (id, username, password, real_name, role, create_time) VALUES (1, admin, $2a$10$X7...BCrypt哈希值..., 系统管理员, admin, NOW());BCrypt哈希值怎么生成你可以用SpringBoot启动时随便写一个测试类调用BCryptPasswordEncoder().encode(123456)得到一串哈希然后粘到SQL里。也可以直接用在线BCrypt生成器。但一定不要放明文这个是很多老开发一眼就能看出来的减分项。4. 前端核心页面与后端接口对接把“能跑”变成“好用”数据库和接口定下来之后前端的工作其实就是“翻译”把后端数据翻译成表格、表单、图表。4.1 三个角色的首页该怎么差异化系统最忌讳的就是所有角色共用一套界面。同样是登录学生进来看的是“待参加的考试列表”教师进来看的是“我创建的试卷和管理试题”管理员进来看的是“系统用户统计”。我用一套Vue侧路由按角色动态生成菜单// router/index.js const roleMenus { student: [ { path: /exam/list, title: 考试列表, icon: el-icon-edit }, { path: /exam/my-record, title: 我的考试记录, icon: el-icon-trophy } ], teacher: [ { path: /question/manage, title: 题库管理, icon: el-icon-collection }, { path: /paper/manage, title: 试卷管理, icon: el-icon-document } ], admin: [ { path: /user/manage, title: 用户管理, icon: el-icon-user }, { path: /statistics/overview, title: 系统概览, icon: el-icon-pie-chart } ] }在登录成功的handleLogin方法里根据返回的user.role动态过滤出可访问的路由再用router.addRoutes动态注册。这其实就是“动态路由”的思路在热词里也出现了vue动态路由。实现不难但很加分。4.2 在线答题最重要的倒计时和自动交卷考试系统里学生端最核心的场景就是答题页。这里有一个几乎所有教程都不会重点讲、但实际非常关键的细节倒计时和自动交卷。为什么必须做自动交卷因为如果学生关闭页面、超时不交卷服务端必须有一个最终兜底。我用前端倒计时后端交卷接口双重保障setTimer() { // 倒计时的秒数从进入页面时接口返回的 endTime 计算得来 const endTime new Date(this.examInfo.endTime).getTime(); this.timer setInterval(() { const remain Math.floor((endTime - Date.now()) / 1000); if (remain 0) { clearInterval(this.timer); this.handleAutoSubmit(); } this.remainTime remain; }, 1000); }而后端的自动交卷字段我是通过给exam_answer_record表增加一个status字段用1考试中、2已交卷来标记。学生每一次保存答题卡都会调用一次“暂存接口”更新answers字段到了考试结束时间后端定时任务把所有status1的记录强制置为2并按现有答案计算分数。前端主动交卷只是调用正式提交接口。这里有个很实际的坑一定不要在每次暂存时都计算分数。评分必须是交卷瞬间计算否则学生改答案之后分数会错。4.3 教师端批量导入试题很多考试系统只会给教师提供逐个添加试题的表单但我建议你顺手加一个“Excel模板导入”功能。理由很简单当你要录制演示视频时“批量导入30道题”这种功能点视觉效果上比一个一个敲题目强太多面试时也有的聊。Excel导入我用的是EasyExcel库代码流程是上传文件 - 解析Excel - 校验字段 - 批量插入数据库。EasyExcel的读功能只需要实现一个监听器public class QuestionExcelListener extends AnalysisEventListenerQuestionExcelRow { private final TestQuestionMapper questionMapper; private final ListTestQuestion cache new ArrayList(); public QuestionExcelListener(TestQuestionMapper questionMapper) { this.questionMapper questionMapper; } Override public void invoke(QuestionExcelRow row, AnalysisContext context) { TestQuestion question new TestQuestion(); question.setSubject(row.getSubject()); question.setQuestionType(row.getQuestionType()); question.setQuestionContent(row.getQuestionContent()); question.setOptions(row.getOptions()); question.setAnswer(row.getAnswer()); cache.add(question); if (cache.size() 100) { saveBatch(); } } Override public void doAfterAllAnalysed(AnalysisContext context) { saveBatch(); } private void saveBatch() { questionMapper.insertBatchSomeColumn(cache); // 批量插入 cache.clear(); } }这里有个教训想提醒Excel模板一定要设字段校验。我见过太多导入的脏数据比如题型写“单选”而不是“single_choice”后端起判题逻辑时就全废了。所以模板里要在备注列写明枚举值并且在代码里对非法值直接报错并提示哪一行哪一列出问题。5. 启动部署全过程把五步跑通变成一套可交付的完整包5.1 后端启动三步走拿到最终源码包后后端启动基本就这么三步但是每一步都有坑。我逐一列出注意点第一步初始化数据库。用Navicat或命令行执行init.sql。注意新建的数据库名要跟application.yml里的url保持一致否则连不上报错。这里常踩的坑是MySQL8的时区配置正确的url写法是spring: datasource: url: jdbc:mysql://localhost:3306/exam_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver第二步改redis坐标、改端口启动项目。其实项目默认不依赖Redis但登录态用JWT就足够了。如果pom.xml里有spring-boot-starter-data-redis依赖而你没有安装Redis项目是启动失败的。这里建议后续优化版本去掉Redis依赖用JWT自带无状态登录减少部署环境要求。端口默认8080如果冲突了在application.yml里改server: port: 8080第三步确认启动成功标志。日志里看到Started ExamApplication in XX seconds字样就说明后端跑起来了。这时可以去浏览器访问http://localhost:8080/api/auth/login用Postman测一个登录接口返回用户信息和token则说明连通。5.2 前端启动三步走前端的坑比后端多一点。首先是依赖安装cd exam-web npm install如果你在国内不推荐用默认的npm官方源容易超时。我建议先设成淘宝镜像Anytime都好使npm config set registry https://registry.npmmirror.com然后是代理配置。开发环境下前端页面调后端接口存在跨域问题解决方法是在vue.config.js里配代理module.exports { devServer: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } }这样前端请求/api/auth/login会被转发到后端http://localhost:8080/auth/login同时规避了浏览器跨域限制。这一步极其重要如果代理配错页面一直报404或跨域报错很多人会误以为代码有问题。最后启动npm run dev浏览器访问http://localhost:3000用admin账号登录看到后台管理界面就说明全链路通了。5.3 打包部署别只会在IDEA里点绿箭头毕设答辩有个高频问题“你这个项目怎么部署到服务器上”如果只回答在IDEA里跑那基本就挂了一半。至少要能说出Vue打包后的静态文件交给SpringBoot托管这种方案。生产环境最稳妥的做法是前端执行npm run build生成dist目录然后把dist里的静态文件复制到SpringBoot的src/main/resources/static目录下最后用Maven打包成单个jar直接运行mvn clean package -DskipTests java -jar target/exam-system-0.0.1-SNAPSHOT.jar这样你只要一台有JDK8和MySQL的服务器就能把整个系统跑起来。前端请求的/api路径不需要额外部署Nginx转发因为SpringBoot自动把请求匹配到后端Controller了。当然如果你服务器配了Nginx也可以把前端dist放到/usr/share/nginx/html然后单独配置反向代理location /api/ { proxy_pass http://localhost:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }两种方案挑一种写进部署文档就行。实际打包的时候注意前端项目里axios的baseURL要改成/api不要写死成http://localhost:8080/api否则打包后接口地址不通。6. 实际项目中出现的高频问题与排查思路这一节是用真金白银换来的经验测试环境跑通不代表演示时不出状况。我把最容易翻车的三个问题列出来每个问题都给出完整的排查链路不是直接给答案是想让你下次遇到类似问题时自己也能顺着走下来。6.1 启动报错“Failed to configure a DataSource”现象后端项目还没起来日志直接报错找不到数据源。排查思路先去确认application.yml里的spring.datasource配置是否有拼写错误比如serverTimezoneAsia/Shanghai的时区格式。确认MySQL服务启动了没有。Windows上可以看右下角小图标或者运行net start mysql。确认MySQL客户端能正常连上命令行里mysql -uroot -p密码 -h127.0.0.1 -P3306如果连不上就要检查MySQL是否允许远程连接、用户名密码是否正确。以上都没问题再考虑是不是pom.xml缺了MySQL驱动依赖。去掉scoperuntime/scope重新构建。大多数报这个错的都是密码或者数据库名写错了尤其注意不要把测试环境的库名和本地混用。6.2 前端页面一直loading接口全是404现象后端项目正常启动前端页面也能打开但登录按钮点了没反应F12看到请求全部404或者504。排查思路打开F12 Network看请求的URL是/api/auth/login还是http://localhost:8080/api/auth/login如果是后者说明代理没生效。检查vue.config.js的proxy配置重启npm run dev。这个文件改了必须重启前端服务。看后端控制台的日志有没有打印请求日志。如果压根没收到请求说明跨域或代理层没通。确认后端端口号改过端口的话前端代理target同步改。有个小技巧直接用浏览器访问http://localhost:8080/api/auth/login看看返回什么如果是JSON错误信息说明后端是好的问题就在前端代理。6.3 部署到服务器后图片不显示、接口超时现象本地一切正常打包上传到服务器后页面样式在但图片全裂接口偶尔超时。排查思路确认服务器防火墙是否放行3306和8080端口。很多时候是云服务商安全组没配置本地测试不会遇到。检查数据库连接如果服务器MySQL版本是5.7而本地是8.0pom.xml里用mysql-connector-java版本也要匹配。8.0的驱动在5.7数据库上通常也兼容但反过来5.7的驱动在8.0上会报错。服务器上MySQL的max_connections如果默认151而你用的连接池默认10一般不会炸。但如果你的项目里有多个服务同时连接就要注意调大连接数。7. 答辩和面试的加分项这些追问你要能接住7.1 导师必问的五个问题做过多年毕业设计指导我发现导师对那些“看起来有一定完成度”的项目追问的套路其实很集中。提前把下面这些问题准备成自己的回答答辩时就不会被问倒“为什么用JWT不发session吗”回答思路前后端分离架构下session依赖cookie跨域和移动端适配比较麻烦。JWT把用户信息编码在token里无状态、可扩展更适合分布式部署。“学生作弊怎么办”回答思路说实话毕设项目很难做到像正经考试系统那样锁屏、防切屏。但你可以加分地说题目可随机打乱系统记录了每个学生的登录IP和交卷时间并且判断题、选择题的选项顺序在生成试卷时做了洗牌。“如果同一个学生同时用两个浏览器登录考试怎么办”回答思路可以在登录时给用户生成一个login_token每次登录都更新答题提交时校验当前token是否与登录时一致不一致则视为异常。这个功能加不加取决于时间但讲出来绝对体现设计思考。“高并发下同一场考试多少人同时提交”回答思路先坦诚说明系统架构面向中小规模然后补充交卷接口设计为幂等同一个学生的提交请求后端的exam_answer_record表有唯一索引exam_iduser_id重复提交会走更新逻辑而不是插入。这就是在告诉导师你考虑过并发下的数据一致性。“考试成绩能不能导出Excel”回答思路默认是有的。教师端在考试记录页面点击“导出成绩”后端用EasyExcel生成Excel文件返回。Excel导出这个功能点实操很容易加但视觉冲击力极强答辩时一定要点到。7.2 展示什么最加分如果你想要导师在大庭广众之下夸一句“做得不错”演示环节的节奏可以这么设计第一步用管理员账号登录展示用户管理列表顺手提一句“密码在数据库里是BCrypt加密存储的”。第二步切到教师账号展示题库管理用“Excel批量导入”一次性导入10道题刷新列表看到新题。然后创建一份试卷勾选试题设置总分100分时长60分钟点击发布。第三步切到学生账号看到新发布的考试点击进入快速作答交卷查看成绩单。第四步切回教师账号导出成绩Excel打开Excel给镜头看一眼。这一套走下来整个系统的完整度、从前到后的数据流转一清二楚比你准备10页PPT都管用。8. 一些让我反复受益的开发小技巧这次做考试系统项目我攒了几个非常实用的开发习惯虽然不是多高级的技术但每次都能让我省大量调试时间。后端接口自测我建议不要一上来就跑前端页面。后端接口写完之后用Postman或者Apifox先把所有接口都过一遍。把登录接口请求成功后返回的token复制到Authorization头里然后把增删改查的路径顺序测完。这能让你把后端问题隔离在前端联调之前。前端页面不要毕其功于一役。我的习惯是先搭一个最简陋的列表页只要能显示出后端返回的JSON数据就立刻提交一版然后在这个基础上去美化、加弹窗、加表单校验。页面全部写完再调试只会加大Debug难度。代码提交一定要用Git即使你是单人项目。这不是给简历凑数而是有天你改了代码跑不回来了Git能让你“反悔”。推荐至少每天提交一次commit信息写清楚当天做了什么比如feat: 完成试题Excel导入。答辩前把提交历史整理一下还能看出来你的开发节奏心里有底。设计接口时统一响应结构。项目里的Controller返回值永远用统一的数据结构前端才不用每个接口都去猜。我在开发时全局定义了一个Result对象Data public class Result { private Integer code; // 200成功其他为错误 private String msg; private Object data; public static Result success(Object data) { Result r new Result(); r.code 200; r.data data; r.msg ok; return r; } public static Result error(String msg) { Result r new Result(); r.code 500; r.msg msg; return r; } }所有接口都返回Result.success(...)或Result.error(...)时间长了你会庆幸自己当时做了这个决定。代码里到处返回Map或者裸JSON接口一多就会乱套这是我在实际协作开发中无数次吃到苦头之后总结出来的底线规范。如果你正在为Java Web毕设选型或者已经在开发考试系统平台希望这篇分享能帮你少走弯路。这个题目包容度很高基础差的能做出一套完整可用的系统基础好的可以在上面加Redis缓存、Spring Security、WebSocket在线监考等进阶功能既不会因为太难而被卡住也不会因为太简单而显得没技术含量。剩下就看你自己怎么把握这个度了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑