ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot+Vue大创管理系统毕设源码解析与答辩攻略

SpringBoot+Vue大创管理系统毕设源码解析与答辩攻略 每年三四月份论坛和群聊里就会开始刷屏同一个问题毕设题目到底选什么。如果你盯上了“SpringBootVue 大创管理系统好全套源码SQL脚本接口文档”这类资源那说明你已经摸到了一个很稳的方向——这类题目不追求花哨炫技但业务链路完整、角色权限清晰、前后台功能都有天然适合用来做 Java Web 方向的毕业设计。我把这套系统从源码、SQL 脚本到接口文档完整过了一遍前后也踩了不少坑这篇就按实操路线把业务拆解、技术选型、环境启动、接口联调和答辩要准备的点一次性讲清楚。先给还没入坑的同学交代一下背景。大创全称“大学生创新创业训练计划”绝大多数高校都在做分创新训练、创业训练、创业实践三种项目类型又分成校级、省级、国家级三个层级。学校每年要组织学生申报、老师审核、专家评审、中期检查、结题验收还要统计成果和经费这么多流程靠 Excel 根本管不过来。于是“大创管理系统”就变成了一个很典型的 Java Web 题目前端给不同角色做操作界面后端处理各类审批和查询底下一堆关联表单要设计。这套资料能帮你省的事很清楚源码不用从零写数据库脚本直接导入就能跑接口文档拿来就能和后端对接剩下的核心工作就是“看懂它、跑通它、改成自己的”。下面我按自己的实操顺序展开。1. 先把这个系统讲透大创管理系统到底管什么业务拿到一套源码第一件事不是急着启动而是先把业务模型看懂。你如果连系统里面为什么要有那些表和状态字段都说不清楚答辩的时候一追问就会露馅。1.1 项目分类与层级大创项目不是简单一张表就能装下的它天然存在两个维度的差异。维度分类说明项目类型创新训练项目学生团队在导师指导下提出创意完成实验、调研、设计并形成成果创业训练项目模拟创业过程围绕一个商业点子做市场分析、商业计划书创业实践项目已经有一定落地基础的团队做真实运营实践项目层级校级学校自己立项资助规模最小省级从校级优秀项目中推荐有省级经费支持国家级从省级项目中遴选代表学校最高水平系统设计里最常见的方式是给项目表设计两个字段category存类型level存层级都用整型数字做枚举值。比如category定义成 1、2、3level定义成 1、2、3比直接存中文字符串更规范也方便条件查询。很多同学看源码时容易忽略这种小设计其实这正是答辩时能拿出来讲的点为什么用整型枚举——避免脏数据、查询效率高、程序里做映射也清晰。1.2 角色权限设计大创系统的角色划分非常清晰这也是它适合做毕设的原因之一。一般至少有五类角色学生项目负责人或团队成员能做申报、中期填报、结题申请、查看审核结果。指导教师审阅自己指导的项目申报书给出意见。学院管理员初审本院学生申报的项目进行院级推荐。校级管理员发布通知、分配评审专家、管理立项名单、查看统计报表。评审专家对立项申报、结题成果进行打分和评价。权限控制这块源码里通常会做成“用户表 角色表 菜单/权限表”的结构。如果简化一点就只在用户表里加一个role_id字段后端接口根据角色判断能不能访问。我建议你重点看源码里用的是哪种方式。如果是用拦截器加注解比如自定义RequireRole那属于中等偏上的做法能体现设计能力如果只是单纯在代码里if (user.getRoleId() 3)这种写死判断虽然也能跑但答辩时容易被追问“如果以后加一个角色怎么办”。1.3 一条完整的项目申报流程把这个流程走一遍你基本就掌握了系统的主线业务。典型流程是学生登录系统填写申报书包括项目名称、类型、层级、成员信息、指导老师、项目简介、预期成果。指导教师在后台看到待审核列表点开申报书详情填写审核意见选择通过或不通过。学院管理员对本院项目做资格初审排除不合格申报推荐优秀项目。校级管理员组织专家评审专家对每个项目打分系统汇总分数排序。学校根据名额和分数发布立项名单项目状态变为“已立项”。项目执行周期内进行中期检查学生提交进度报告导师确认。项目到期后学生提交结题申请、成果材料论文、专利、实物照片、软件著作权等专家验收打分。这套流程里最关键的是“状态机”设计。项目从申报到结题会经历多个状态比如草稿 → 待导师审核 → 待学院审核 → 待专家评审 → 已立项 → 中期检查中 → 待结题 → 已结题 → 中止。源码里项目表一定会有一个status字段这个字段就是整条业务线的核心。实际开发时建议用数字枚举而不是字符串状态流转写一个专门的 service 方法控制避免出现“从结题状态跳到草稿状态”这种非法操作。1.4 核心数据表怎么设计根据上面的业务模型数据库至少应该有这些表表名用途关键字段user用户信息id, username, password, real_name, role_id, collegerole角色定义id, role_name, role_codeproject项目主表id, project_code, name, category, level, leader_id, teacher_id, statusproject_member项目成员id, project_id, user_id, is_leaderaudit_record审核记录id, project_id, auditor_id, result, comment, audit_timemidterm_check中期检查id, project_id, progress_desc, problem, plan, statusfinal_acceptance结题验收id, project_id, result_summary, attachment, score, statusfund_record经费记录id, project_id, amount, purpose, apply_timenotice系统公告id, title, content, publish_time我在看源码的时候特别关注audit_record这张表。很多简化版系统会把导师意见、学院意见、专家评审意见都做成project表里的冗余字段虽然也能用但遇到一个项目被退回重报、再次审核的情况历史记录就丢了。正规一点的实现会用一张独立的审核记录表每个项目每次审核都插入一条记录前端展示时把轨迹列出来。这个设计在答辩时是加分项说明你考虑到了数据追溯的问题。2. 技术选型逻辑为什么偏偏是 SpringBoot Vue这个组合不是随便定的它对应的是当前 Java Web 毕业设计里最主流、最稳妥、也最好讲的一套路子。你如果问老师“为什么不用 JSP 或者 SSM”自己要能说出个一二三。2.1 SpringBoot 把重心还给业务老一代的 SSM 项目最大的痛点是什么配置复杂。web.xml、spring-mvc.xml、mybatis-config.xml、log4j.properties建项目先配半小时。SpringBoot 直接把这些杂事砍掉了内嵌 Tomcat启动一个main方法就能跑还提供一堆 starter 依赖帮你把常用组件集成好。实际开发里SpringBoot 最舒服的地方是三层结构不折腾Controller 接收请求Service 做业务逻辑Mapper 操作数据库写完就能跑。而且市面上面试题也好、教程也好SpringBoot 资料比 SSM 时期好找得多遇到问题搜索一下就能解决。对于毕设这个场景技术选型的第一原则是“风险可控”SpringBoot 完全满足。2.2 Vue 前后端分离模式更适合毕设展示前端这块Vue 相比 JSP 的优势太明显了。JSP 那种服务端渲染前端代码和后端 Java 代码混在一个项目里每次改页面都要重启服务开发效率很低。Vue 用组件化开发页面拆成一个个.vue文件数据和页面双向绑定交互体验也明显更好。更重要的是前后端分离模式跟现在企业的实际开发方式一致你答辩时说“前端 Vue 项目通过 Axios 调用后端 REST 接口后端返回 JSON 数据”这在评委听来是专业的。而且 Vue 的生态太完善了管理后台有 Element UI / Element Plus表格、表单、分页、弹窗这些组件直接拿来用比你自己手写 HTML 快出不止一倍。Vue 2 和 Vue 3 的选择也值得说一句。现在 Vue 3 Element Plus 已经是新项目的主流但很多现成源码用的还是 Vue 2 Element UI。如果你拿到的源码是 Vue 2只要跑通了就没有非得升级的必要毕设求的是稳定。如果从零搭建我会首选 Vue 3 Vite Element Plus。2.3 一套标准的工程目录长什么样前后端分离项目启动后你会看到两个项目目录。我建议先整体看一眼结构再动手改代码。backend ├── pom.xml ├── src/main/java/com/example/dachuang │ ├── controller # 接口层 │ ├── service # 业务逻辑层 │ ├── mapper # 数据库操作层 │ ├── entity # 实体类 │ ├── config # 配置类跨域、拦截器、mybatis-plus │ └── common # 统一返回体、异常处理、工具类 └── src/main/resources ├── application.yml # 核心配置 └── mapper/*.xml # 复杂 SQL 的 XML 文件 frontend ├── package.json ├── vue.config.js # Webpack 配置Vue2 ├── vite.config.js # Vite 配置Vue3 └── src ├── router # 路由配置 ├── views # 页面文件 ├── api # 接口请求封装 └── components # 公共组件这套结构的好处是分工明确。后端按 controller/service/mapper 分层前端把页面和接口分开出了问题定位很快。我见过有些同学的毕设把逻辑全写在 Controller 里一个类两千行看起来功能完成了但答辩时老师问“你这个业务逻辑放哪了”你就会很尴尬。分层清晰是代码质量最直观的体现。3. 从拿到源码到成功启动环境、SQL、配置步骤这一部分是实操的重头戏。很多同学卡在两个问题上环境版本不匹配起不来SQL 脚本导不进去。下面我把每一步都用最容易踩坑的方式过一遍。3.1 环境版本组合别乱搭先说结论我用过最稳的组合是组件推荐版本注意事项JDK1.8 或 11SpringBoot 2.x 首选Maven3.6.x 或 3.8.x镜像源配阿里云MySQL5.7 或 8.0驱动类名不同注意区分Node.js14.x 或 16.xVue2 完全够用Vue3 建议 16IDEIDEA 2021 或 VSCode后端用 IDEA 最顺手为什么反复强调版本因为 SpringBoot 版本和 JDK 版本是强绑定的。如果你本地装的是 JDK 17却拿了一个基于 SpringBoot 2.x 的老项目可能会遇到依赖编译不过的问题。反过来SpringBoot 3.x 要求 JDK 17 起步如果你用 JDK 8 去跑某一些很新的源码也会直接报错。拿到源码先看pom.xml里parent标签中 Spring Boot 的版本号再决定用哪个 JDK这是最高效的做法。Node 版本也一样。Vue 2 项目用 Node 18 在个别情况下装依赖会报 OpenSSL 错误经典提示是Error: error:0308010C:digital envelope routines::unsupported。遇到先别慌用 Node 16 或者设置环境变量NODE_OPTIONS--openssl-legacy-provider都能解但我更推荐最开始就用 Node 16 少折腾。3.2 SQL 脚本导入的四个细节拿到 SQL 脚本先别急着双击导入。我按顺序建议你这么做新建一个空数据库字符集选utf8mb4排序规则用utf8mb4_general_ci就行。不要直接导入到默认的test库里后面配置数据源容易搞混。用命令行或 Navicat 运行脚本。命令行方式mysql -u root -p dachuang dachuang.sql注意先use dachuang;把当前库切对。检查脚本里有没有初始账号。一般脚本末尾会有INSERT INTO user之类的语句常见默认管理员是admin / admin123。项目启动后先登录试一下如果登录不上去user表里直接改一条记录的密码字段再重新登录。观察表结构里的时间字段和状态字段。时间字段一般用datetime状态字段用tinyint或int。如果导入报错大多出现在外键约束和字符集上把脚本里SET NAMES utf8mb4;这行加在最开头通常能解决。这里有个我实际遇到的坑MySQL 8.0 默认字符集是utf8mb4但如果脚本开头没有指定字符集表里面存的还是latin1中文会出现乱码。导入完成后可以在 Navicat 里随便开一张表查一下中文数据是不是正常显示不正常就说明库表字符集出问题了。3.3 后端配置文件怎么改后端的核心配置基本都在application.yml里。你重点改三块端口、数据源、日志级别。一个参考配置长这样server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/dachuang?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 你自己的密码 driver-class-name: com.mysql.cj.jdbc.Driver jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl这里有几个点要提醒你。driver-class-name如果是 MySQL 8.0必须写com.mysql.cj.jdbc.Driver如果用的是 MySQL 5.7写com.mysql.jdbc.Driver更合适。连接串里的serverTimezoneAsia/Shanghai也很关键不写的话 MySQL 8.0 会直接报时区错误。日志那块StdOutImpl是为了让你在控制台能看到每次执行的 SQL开发阶段强烈建议打开排查问题一目了然。配置改完之后直接运行启动类里的main方法。能看到 Spring Boot 的 banner 刷出来端口 8080 正常监听基本就算后端成功了。如果你发现端口被占用改server.port换一个比如 8081。3.4 前端环境搭建与代理前端启动之前先确认有没有package.json。在这个目录下执行npm install这一步在国内经常卡住建议先把 npm 镜像切成淘宝源npm config set registry https://registry.npmmirror.com装完依赖后Vue 2 项目执行npm run serveVue 3 Vite 项目执行npm run dev。启动成功后浏览器访问http://localhost:8080之类的地址具体看控制台提示。前后端分离项目开发期必然遇到跨域问题解决方式一般有两种前端代理或者后端配置 CORS。前端代理的做法是在vue.config.jsVue2/Webpack里加module.exports { devServer: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }Vite 项目的写法是在vite.config.js里加server: { port: 3000, proxy: { /api: http://localhost:8080 } }这里/api是前端请求统一带的前缀。实际联调时前端请求/api/auth/login代理会把它转发到http://localhost:8080/api/auth/login。如果后端接口路径本身不带/api前缀你需要在代理里做路径重写比如proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } }这个细节特别容易忽略很多同学前端页面打不开、接口报 404问题就出在代理路径没有对上后端真实接口地址。4. 接口文档到底怎么设计、怎么用接口文档这套资料里通常是一份 Word 或 PDF或者后端集成了 Swagger 可以直接在线看。不要因为看不懂就跳过接口文档是你把前后端串起来的桥梁也是毕业论文“系统设计”章节的重要素材。4.1 统一返回体的约定一个大项目几十个接口如果每个接口返回的结构都不一样前端就没法封装请求。所以正规源码一定会定义一个统一返回体类似这样public class ResultT { private Integer code; private String msg; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMsg(操作成功); result.setData(data); return result; } public static T ResultT error(Integer code, String msg) { ResultT result new Result(); result.setCode(code); result.setMsg(msg); return result; } }配合全局异常处理器无论业务成功还是异常前端拿到的所有响应都能统一解析。前端封装的 Axios 响应拦截器里通常会对code做判断code 200才取data否则弹错误提示。状态码的规范一般是这样200 成功400 参数错误401 未登录或登录已过期403 没有权限500 服务端异常。很多坑都出在前端拿到了 401 却没有统一处理导致用户看到白屏或者死循环跳转。拿到的源码里如果做了全局 401 跳登录页的处理说明作者是考虑过真实使用场景的。4.2 接口清单和分页约定典型的接口文档里至少包含这些接口接口地址方法功能权限/api/auth/loginPOST登录返回 token公开/api/auth/logoutPOST退出登录登录用户/api/user/pageGET用户分页查询管理员/api/project/applyPOST学生申报项目学生/api/project/pageGET项目分页、条件查询登录用户/api/project/auditPOST审核项目导师/学院/专家/api/midterm/submitPOST提交中期检查学生负责人/api/final/submitPOST提交结题申请学生负责人/api/statistics/overviewGET首页统计数据管理员分页查询是这类管理系统最常用的接口形态。约定通常是前端传pageNum和pageSize后端返回总条数total和当前页数据列表。源码里如果用 MyBatis-Plus分页写起来非常简洁PageProject page new Page(pageNum, pageSize); LambdaQueryWrapperProject wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.isNotBlank(keyword), Project::getName, keyword) .orderByDesc(Project::getCreateTime); return projectMapper.selectPage(page, wrapper);面试或者答辩的时候如果老师问你分页是怎么实现的你可以答MyBatis-Plus 的Page对象会生成带LIMIT的 SQL并且自动执行一条COUNT查询获得总条数。原理上就是物理分页不是一次性把所有数据查出来再内存截取这点要拎清楚。4.3 JWT 登录流程拆解登录是每个系统踏不过去的一道关。现在主流做法是 JWT 拦截器我来完整拆一遍。用户提交用户名密码后后端先查user表比对密码正规系统用 BCrypt 加密存储不是明文比对成功就生成一个 JWT 字符串。JWT 分成三段Header声明算法、Payload存放用户 id、角色、过期时间、Signature用密钥对前两段签名防篡改。前端拿到 token 后一般存到localStorage或pinia/vuex里。每次请求通过请求拦截器加上请求头Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...后端有一个拦截器或过滤器对所有受保护的接口做校验从请求头取出 token验签、检查是否过期解析出用户 id 后放到请求上下文里方便后续业务代码获取当前登录人。如果 token 缺失或无效拦截器直接返回 401。我建议你认真看一遍源码里这个拦截器的写法因为它是整个系统安全性的核心。一个容易出的问题是部分源码把登录接口也拦截了结果用户根本登录不了或者拦截器校验了 token 但没放行“公开接口”名单前端说什么都调不通。4.4 用 Swagger / Apifox 快速调试接口文档不是拿来看的是要用来调用的。如果源码里集成了 knife4jSwagger 的增强版启动后端后访问http://localhost:8080/doc.html就能看到一个可视化的接口页面可以点“调试”直接传参测试非常方便。没集成的话推荐用 Apifox 或 Postman 导入接口文档。Apifox 的优势是能直接导入 Swagger JSON 或 OpenAPI 格式生成接口列表还能在线调试。调试的时候注意有些接口需要手动填 token先调登录接口拿到 token然后把它填到全局认证信息里再调其他接口。这里给你一个小技巧接口文档里每一条记录你手抄一遍到 Apifox 或 Postman 里对着源码跑一遍。这个动作虽然枯燥但效果极好——你会在跑的过程中发现哪些接口是废的、哪些参数命名不一致、哪些返回结构和文档对不上这些都是答辩时可以讲的“联调过程中发现并解决的问题”。5. 高频问题排查从开发到答辩的实战记录这部分全部来自我实际跑这类项目时踩过的坑。每个问题都附上排查思路比单纯给答案有用得多。5.1 跨域问题开发环境和生产环境是两码事开发环境如果你用了前端代理上文提到的方式一般不会遇到跨域。但如果前端直接请求后端 IP 地址控制台大概率报Access-Control-Allow-Origin错误。解决办法有两个。第一个是后端加全局 CORS 配置Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(*) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }注意allowCredentials(true)的时候allowedOriginPatterns不能以*直接通配所有域名需要按实际前端地址配置比如http://localhost:3000。开发阶段图省事也可以allowCredentials(false)。第二个是生产环境用 Nginx 做反向代理把前端静态资源和后端接口都挂在同一个域名和端口下从源头规避跨域。部署时这也是最推荐的方式前端npm run build生成的dist目录交给 Nginx接口路径/api反代到http://127.0.0.1:8080。5.2 数据库版本、时区和中文乱码三连坑这类项目八成用 MySQL八成会碰到时区问题。MySQL 8.0 的默认时区常常报The server time zone value Öйú±ê׼ʱ¼ä is unrecognized看着就是乱码。解决办法就是在连接串加上serverTimezoneAsia/Shanghai。如果还不行去 MySQL 里执行SET GLOBAL time_zone 08:00;中文乱码则是另一层问题。你导入的 SQL 表结构用的是latin1或者连接串没写characterEncodingutf8前端查出来的数据全是问号。排查时先看数据库表字符集再看连接串最后看后端返回的 Content-Type。按这个顺序查百分之九十的乱码都能解决。5.3 Vue 打包部署后的刷新 404开发环境一切正常部署上线后输入地址回车没问题但刷新就 404。原因是前端用的 history 路由模式下服务端没有配置回退到index.html。解决方式要么前端改用 hash 路由URL 里带#刷新不会 404要么 Nginx 加配置location / { try_files $uri $uri/ /index.html; }我建议毕设阶段优先用 hash 路由省事且稳。答辩时如果老师问起你可以主动解释 history 模式和 hash 模式的区别这本身就是一个不错的加分小点。5.4 答辩最容易被追问的 10 个问题把源码跑通只是第一步答辩才是重头戏。下面这 10 个问题是我综合多年毕设答辩场景总结的高频追问建议提前准备好答案为什么选 SpringBoot它能让你少写哪些配置SpringBoot 自动配置的原理是什么SpringBootApplication里到底发生了什么MyBatis-Plus 和 MyBatis 有什么区别分页插件为什么能自动分页项目的数据库是怎么设计的为什么把审核记录单独建表JWT 和 Session 有什么区别token 过期后前端怎么处理你的权限控制是怎么做的拦截器有没有放行登录接口和静态资源用户密码是怎么存的直接 MD5 加密和 BCrypt 加盐有什么区别前端路由守卫是干什么的未登录用户访问后台页面会怎样系统是怎么部署的本地演示和生产环境部署有什么差异数据量大了怎么办分页查询有性能问题吗每个问题不用回答得多深但至少得有一个清晰的主线。比如第一个问题就可以从“内嵌容器 自动配置 starter 依赖”三个点展开说到spring.factories或AutoConfiguration.imports里的配置类加载机制老师基本就不会再往下深挖了。6. 怎么把一套通用源码变成自己的作品源码跑通了别急着上交。如果全班十几个人用的是同一套资源老师一眼就能看出来。你要做的不是“改个标题就完事”而是从业务、代码、文档三个层面把它变成真正属于你的东西。6.1 先动一个完整小模块公告管理为例我的建议是挑一个相对独立的小模块做二次开发比如公告管理。完整流程是一条从上到下的链路数据库加表或者看现有表结构是否支持。后端写实体类、Mapper、Service、Controller实现公告新增、修改、删除、分页查询。前端在路由配置文件里加一个页面路径写对应的.vue页面。调用后端接口跑通增删改查。这个流程走完你会把整套项目的代码风格、分层逻辑、命名规范都过一遍。而且二次开发的功能是你亲手写的答辩时你有底气说“这个功能是我自己独立完成的”。切忌上来就动核心功能比如动登录或者项目审核逻辑一旦改崩了三五天都修不回来。6.2 论文里每章能对应源码里的什么论文写作不用凭空造车源码和开发过程里都是素材。我整理了一个简单的对应关系论文章节可以写的素材需求分析角色分析、业务流程图、功能列表系统设计系统架构图、ER 图、核心表结构设计功能实现登录模块、项目申报、审核流程、分页查询的详细实现系统测试Apifox 调试记录、功能测试用例、异常场景测试结果总结遇到的坑和解决方案、二次开发的功能尤其“测试”这一章很多同学只会写“经测试系统运行正常”这是最无效的表达。你应该放几张 Apifox 调接口的截图标注出请求参数和响应结果再放几个异常用例比如“项目名称超过最大长度”“审核意见为空”时系统给出什么提示。这些素材在开发过程中顺手就能积累比最后临时编靠谱得多。6.3 六个让系统不像“一模一样”的小改动在不改变项目核心逻辑的前提下有几个性价比极高的小改动改系统名称把“大创管理系统”换成“大学生创新创业训练计划管理平台”之类的具体化名称。换前端主题色Element UI / Element Plus 的primary-color变量改一个值整个系统观感立马不一样。增加一个首页统计模块展示各学院项目数量、项目类型分布图用 ECharts 画两个图表。增加 Excel 导入导出功能比如把项目列表导出成 Excel后台导入项目成员名单。给审核记录加一个时间线组件让用户能看到项目的完整流转历史。增加消息提醒当项目被退回或者审核通过时在系统内给相关用户发一条通知。第六个改动相对复杂一些但效果也最好说明你考虑了用户体验。不做也不要紧前面几个小改动已经足以让老师多给你打几分印象分。说实话这类项目网上资源很多真正拉开差距的不是你下载了多少而是你有没有从头到尾跑通一遍能不能讲清楚每个模块为什么这么设计。我见过不少同学答辩时被问到登录流程就卡住明明系统是自己“做”的却说不清 token 存在哪、校验在哪做、过期了怎么处理。我的建议是拿到源码后别把精力全花在改首页上把登录、项目申报、审核记录、分页查询这几条主线代码亲自过一遍哪怕只完整重写其中一个模块你答辩时的底气都会完全不一样。最后记得把数据库脚本里默认管理员密码改掉这个小细节往往就是老师翻阅系统时默默加分的地方。
返回列表