ARTICLE DETAIL

资讯详情

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

SpringBoot+Vue政府管理系统从零到部署完整实战指南

SpringBoot+Vue政府管理系统从零到部署完整实战指南 又到了毕业设计的高峰期很多同学后台私信问我做一个“javavueSpringBoot政府管理系统”到底该怎么下手项目从哪开始、数据库怎么设计、前端怎么对接、最后怎么部署上服务器、答辩老师会问什么——这些问题几乎每个做这类课题的人都会遇到。今天我就把这个项目从零到一完整拆一遍把我自己踩过的坑、总结的经验、答辩现场老师爱问的点全部整理成文字给你一条可以直接照着走的路。先说清楚这个项目是什么。它是一个典型的B/S架构的管理信息系统后端用SpringBoot提供RESTful API接口前端用Vue框架构建页面数据库用MySQL存业务数据。项目名字叫“政府管理系统”但本质上功能的通用性很强用户登录认证、角色权限控制、基础数据增删改查、统计报表、文件管理等。之所以选题挂在“政府”下面主要是为了贴合公共服务、行政审批、公文流转这类业务场景但在技术实现上这套代码和通用的后台管理系统没有本质区别所以就算你的课题名字是“企业管理系统”“校园管理系统”技术方案也完全能复用。这篇文章适合谁来读如果你是计算机相关专业的学生正在做毕业设计或者课程设计选的题目跟SSM、SpringBoot、Vue有关如果你是在自学Java全栈想找一个完整的项目练手甚至如果你是刚入职想快速了解一套前后端分离系统是怎么搭起来的——这篇文章都很适合你。我会从整体架构讲到数据库设计从前端页面讲到后端接口从本地运行讲到服务器部署最后单独拿出一章来说答辩怎么准备。全程只讲干货和实操不讲废话。1. 项目整体设计与技术选型思路1.1 这类系统背后的真实需求先说需求。政府管理系统也好企业后台也罢核心永远围绕一件事谁能登录、能看到什么、能做什么。我们把需求拆开其实就三张脸第一类是系统管理员。他们要维护整个系统的运行管用户、管角色、管菜单权限、看操作日志偶尔还得给普通用户重置密码。第二类是业务经办人员。他们负责具体业务数据的录入和审核。比如公文管理里有人发起一份公文流转到下一步另一个人负责审批。这类需求背后就是一套简单的流程状态机起草中、待审批、已通过、已驳回。第三类是普通浏览用户。他们可能只需要查询数据、浏览公告、下载文件不需要写任何东西。把这三类角色的需求落成功能模块一个典型的政府管理系统通常包含登录认证、用户管理、角色权限管理、菜单管理、部门管理、公文/通知管理、审批流转、数据统计、系统日志、个人中心。这些模块划分清楚以后数据库表结构和后端代码的骨架基本就定了。这个系统能解决什么问题从学生角度说它覆盖了Java Web开发里几乎所有高频考点SpringBoot自动配置、MyBatis操作MySQL、JWT登录认证与拦截、Vue组件通信、axios请求封装、权限路由控制、文件上传下载、服务器部署。你把这一套做通了毕业设计答辩的底气就完全不一样了。从实际应用角度说这类系统的业务逻辑清晰流程完整代码结构规范后续加功能、换业务场景都很方便。1.2 为什么是JavaVueSpringBoot这套组合技术选型是这个项目最容易被同学忽略、但答辩老师极其爱问的一个点。你选什么技术栈不能只说“别人都用这个”你要能说出来为什么。后端用SpringBoot核心原因是开发效率高。以前用SSMSpringSpringMVCMyBatis搭一个项目要写一堆XML配置现在SpringBoot把常用配置都做成了starter自动装配一个注解就能启动内嵌Tomcat单独一个jar包就能跑起来。政府管理系统这种CRUD密集型的项目SpringBoot的快速开发优势非常明显。而且Spring官方生态成熟整合MyBatis、Redis、Shiro这些组件都有现成的starter遇到问题社区资料也多。前端用Vue看重的是组件化和响应式。如果对比传统JSP加JQuery的方式JSP页面和后端Java代码耦合在一起改一个按钮要前后端同时动维护起来很痛苦。Vue把页面拆成组件每个组件只管自己这块数据驱动视图自动更新配合Element UI这种现成的UI组件库几天就能把管理后台的界面全部写出来。尤其是Vue Router做前端路由控制配合后端返回的菜单权限能实现页面级别和按钮级别的权限过滤这一点在管理系统里是刚需。数据库用MySQL没什么争议。免费、稳定、资料多学生时期足够用了。配合Navicat或者DBeaver这样的图形化工具建表导数据都很方便。如果你选的课题数据量特别大需要跑复杂统计报表可以再考虑引入MyBatis-Plus的分页插件这是后话我们后面细讲。用生活化类比来解释这个技术栈SpringBoot是后厨的厨师长负责把菜做出来处理业务逻辑、操作数据库Vue是前厅的服务员负责把菜端到客人面前并根据客人的反馈调整摆盘渲染页面、响应用户操作MySQL是后厨的食材仓库所有原材料数据都存在里面。你点的每道菜点击页面按钮服务员Vue把单子传给厨师长SpringBoot厨师长去仓库MySQL拿食材加工完再传给服务员上菜。这个流程就是一套前后端分离系统最典型的请求链路。1.3 项目目录结构与开发环境规划项目用Maven做多模块管理还是单模块我建议你直接用单模块maven项目结构为SpringBoot标准结构即可理由很简单毕业设计阶段单模块就已经够用多模块会增加包管理和依赖引入的复杂度没必要给自己找麻烦。后端标准目录结构建议这样划分src/main/java/com/example/gov ├── config/ // 配置类跨域配置、拦截器注册、MyBatis-Plus配置 ├── controller/ // 控制器层接收前端请求返回结果 ├── service/ // 业务逻辑层接口实现类 ├── mapper/ // 数据访问层操作数据库 ├── entity/ // 实体类对应数据库表 ├── dto/ // 数据传输对象接收前端参数、返回响应体 ├── common/ // 通用类统一返回结果、异常处理、工具类 └── GovApplication.java // 启动类前端Vue项目建议用Vue CLI或者Vite创建目录结构src/ ├── api/ // 每个模块的接口请求封装 ├── assets/ // 静态资源 ├── components/ // 公共组件 ├── router/ // 前端路由配置 ├── store/ // 状态管理Vuex或Pinia ├── views/ // 页面组件 ├── utils/ // 工具函数比如axios封装、token存取 ├── App.vue └── main.js开发环境我建议JDK 1.8以上我用的是JDK 8稳定版Maven 3.6Node.js 14MySQL 5.7或8.0注意8.0以上的驱动连接配置跟5.7有区别IDEA开发后端VSCode开发前端或者你用IDEA全家桶也行。版本方面尽量用稳定的偶数版本不要追新否则很容易碰到依赖冲突。2. 数据库设计政府管理系统的数据底座2.1 核心业务表设计与关系梳理做管理系统的第一件事不是急着写代码而是先把表设计出来。表结构定了后面所有接口都围绕表来写。我建议你先画一张简单的E-R图梳理关系再建模。基于我们前面分析的三类用户需求我帮你提炼出这套系统最核心的7张表表名用途关键字段sys_user用户表id, username, password, real_name, dept_id, status, create_timesys_role角色表id, role_name, role_code, descriptionsys_menu菜单/权限表id, parent_id, menu_name, path, perms, icon, typesys_user_role用户-角色关联表user_id, role_idsys_role_menu角色-菜单关联表role_id, menu_idsys_dept部门表id, dept_name, parent_id, sort_ordersys_log操作日志表id, user_id, operation, method, params, ip, create_time如果课题涉及具体业务比如公文管理再增加两张业务表business_document 公文表id, title, content, status, create_user_id, approve_user_id, create_time, update_timebusiness_document_log 审批记录表id, doc_id, user_id, action, comment, create_time这里重点说明一下为什么用户和角色要分开、中间还要加关联表。这叫RBAC基于角色的访问控制模型是目前管理系统中应用最广泛的权限模型。一个用户可能有多个角色比如既是科长又是项目负责人一个角色也可能拥有多个用户同理一个角色可以拥有多个菜单权限一个菜单权限也可以分配给多个角色。用户、角色、菜单三者本来是多对多的关系靠“用户-角色关联表”和“角色-菜单关联表”这两张中间表把多对多拆成了两个一对多数据不会冗余查询也方便。答辩老师问权限设计时你把这个逻辑讲清楚这关基本就过了。2.2 设计规范与字段选择的坑数据库这块有几个细节我特别提醒你注意这些都是我在实际开发中踩过坑、或者答辩时被老师追问过的第一主键策略。建议使用自增主键加雪花算法生成业务ID。如果只用自增ID数据同步、分库分表时容易出问题但毕业设计阶段直接自增就行老师不会较真。用MyBatis-Plus的话实体类主键上标注TableId(type IdType.AUTO)。第二时间字段。创建时间和更新时间这种字段一定要有。可以设置默认值CURRENT_TIMESTAMP也可以后端代码里统一填充。更新到MySQL 8.0时注意datetime和timestamp的区别datetime范围更大且不受时区影响建议用datetime。第三逻辑删除。用户表和业务表建议加一个deleted字段默认为0。这样删除操作只是修改标记位方便数据恢复。配套的查询语句在MyBatis-Plus中可以用TableLogic注解实现自动在SQL后面追加WHERE deleted 0。第四建立索引。登录名、角色编码、部门ID这些高频查询字段建议建索引否则数据量一上来查询会明显变慢。答辩时老师可能会问“系统怎么优化查询性能”你从索引和分页两个点回答基本能过关。第五预留字段。业务表建议预留remark备注和status状态字段。比如公文表的status字段我用0表示草稿、1表示待审批、2表示已通过、3表示已驳回这样审批流转的逻辑就靠这一个字段驱动代码会很简洁。2.3 初始化数据与SQL脚本编写细节项目要提交数据库脚本我建议你把初始化数据也准备好。光有表结构、没有数据的系统演示起来很难看。项目交付时要有一个init.sql文件里面包括建库、建表、插入初始数据。几个要点建库语句我一般在MySQL中执行时指定字符集CREATE DATABASE IF NOT EXISTS gov_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE gov_system;管理员账号建议直接预置一个admin密码使用BCrypt加密后的字符串。前端不做任何加密传输一般开发阶段用HTTP明文登录生产环境通过HTTPS保证安全后端收到密码后用BCrypt校验。这个安全性设计也是答辩加分项后面展开说。普通用户和角色数据至少预置2到3套比如系统管理员、审批专员、普通用户。菜单数据将系统里的导航菜单、按钮权限的perms编码全部录入保证前端路由和数据表能对应上。这些初始化数据写进SQL文件后部署时执行一遍就能看到完整效果。3. 前后端实操从登录到业务功能的完整链路3.1 后端核心登录认证与JWT无状态鉴权管理系统第一个要做的接口就是登录。我用JWT做无状态登录认证主要原因是前后端分离架构下后端不能依赖Session存登录态而JWT把用户信息加密保存在客户端本地每次请求带上Token服务端校验签名即可天然适合这个场景。JWT结构是三段式Header加密算法信息、Payload自定义信息不要放密码、Signature签名。生成JWT我用了Java的io.jsonwebtoken库核心方法如下public String generateToken(Long userId, String username) { Date now new Date(); Date expireDate new Date(now.getTime() 7 * 24 * 60 * 60 * 1000); // 7天有效期 return Jwts.builder() .setSubject(username) .claim(userId, userId) .setIssuedAt(now) .setExpiration(expireDate) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }登录Controller的流程是接收前端传的username和password从MySQL查出用户用BCryptPasswordEncoder校验密码校验通过后生成Token返回给前端。前端存到localStorage或sessionStorage里后续每个请求在拦截器中加上Authorization: Bearer {token}。有了Token还不够还要有拦截器在请求到达Controller之前做校验。SpringBoot里用HandlerInterceptor实现注册时排除登录接口和静态资源路径public class JwtInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); // 校验token失败则返回401并抛出业务异常 return true; } }这一套逻辑看着简单但是答辩老师很喜欢问“Token放在哪里”“Token过期了怎么办”“多个设备登录怎么处理”。你的回答思路是Token由前端保存请求时通过拦截器携带过期后前端拦截到401状态码自动跳转登录页重新登录如果想要更强的安全性可以引入Redis存储Token实现服务端主动失效这作为扩展点说一下就够了。3.2 前端核心axios封装、路由守卫和动态菜单前端这边第一步要做的是把axios请求统一封装。建议在utils/request.js里新建一个axios实例配置基础URL、设置超时时间并在请求拦截器里自动添加Tokenimport axios from axios const request axios.create({ baseURL: process.env.VUE_APP_BASE_URL, // 通过环境变量控制本地/线上地址 timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[Authorization] Bearer token } return config }) export default request响应拦截器里统一处理后端返回的状态码。后端返回格式建议统一为{code: 200, message: 操作成功, data: {...}}这样前端不用每个接口单独处理异常统一在拦截器里拦截code ! 200的情况并弹出错误提示。路由守卫是前端的权限控制核心配合后端返回的菜单权限实现动态路由router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { next() } else if (!token) { next(/login) } else { // 用户已登录且路由匹配成功正常放行 next() } })有个细节后端返回的权限列表perms要在前端做按钮级别的控制。比如某个用户没有“删除用户”的权限删除按钮就不应该展示。这个可以用一个全局自定义指令v-permission实现在小公司或项目中经常这么做也能成为答辩的亮点。3.3 数据查询与分页MyBatis-Plus的合理使用政府管理系统里列表页是最多的用户列表、日志列表、公文列表都是典型的表格查询条件分页结构。用MyBatis-Plus的Page对象和分页插件写起来效率很高。先引入分页插件配置Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }查询接口返回给前端时我一般封装一个通用的分页响应数据结构public class PageResultT { private ListT records; private Long total; private Long pageNum; private Long pageSize; }前端可以在封装的分页组件里绑定页码和每页条数听接口返回的数据渲染表格。这里有个容易踩的坑选择字段时要注意驼峰和下划线自动映射。MyBatis-Plus默认开启map-underscore-to-camel-case所以实体类字段createTime会映射到数据库列create_time如果你手动写SQL别名一定要对应否则查出来就是null。3.4 跨域问题前端报错重灾区前后端分离项目只要你把前端页面放在8080端口、后端接口放在8081端口浏览器就会触发跨域。这个问题几乎每个同学都会遇到我直接把最稳妥的解决方案给你——在后端写一个CORS配置类Configuration public class CorsConfig { Bean public CorsFilter corsFilter() { CorsConfiguration config new CorsConfiguration(); config.addAllowedOriginPattern(*); config.addAllowedMethod(*); config.addAllowedHeader(*); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration(/**, config); return new CorsFilter(source); } }这里特别注意如果用了allowCredentials(true)addAllowedOrigin不能使用*要用addAllowedOriginPattern(*)否则跨域请求会报错。生产环境建议把addAllowedOriginPattern替换成你服务器的实际域名更安全。还有一个替代方案是用Nginx反向代理解决跨域这个在部署章节详细说。4. 部署上线本地跑起来到服务器发布4.1 本地环境搭建与启动步骤如果你用的IDEA开后端第一次启动流程大致是导入Maven项目等待依赖下载完成修改application.yml里的数据库连接信息运行GovApplication.java。这里有几个容易卡的坑第一数据库版本与驱动不匹配。MySQL 8.0以上需要在Maven依赖里引入mysql-connector-java8.0.x版本并且连接URL要加上serverTimezoneAsia/Shanghai否则数据库连接会报时区错误spring: datasource: url: jdbc:mysql://localhost:3306/gov_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver第二Maven依赖下载慢。国内环境一定在settings.xml里配置阿里云镜像仓库不然卡在下载那一步能急死人。镜像仓库配置的内容不展开写网上很多现成教程。第三前端依赖安装失败。先说Node.js版本Vue CLI项目在较新的Node版本上可能会报OpenSSL错误需要设置NODE_OPTIONS--openssl-legacy-provider。如果你用Vite创建的项目就没有这个老问题的烦恼。装依赖用npm install如果很慢可以用cnpm install或者配置npm的淘宝镜像。本地启动的完整顺序是启动MySQL → 执行SQL脚本初始化数据库 → 启动SpringBoot后端默认端口8080 → 启动Vue前端默认端口8080如果不冲突的话建议后端改到8081前端保持8080→ 浏览器访问前端地址。4.2 生产环境部署jar包加Nginx最省心生产环境部署我推荐的是最经典、也最简单的方案后端打成jar包直接在服务器上用Java命令跑前端用Vue打包成静态文件交给Nginx托管同时Nginx配一个反向代理把/api前缀的请求转发到后端服务。这整套方案的核心原因是不需要专门申请域名、不需要单独安装数据库图形化工具、不需要用Docker也完全够用。服务器哪怕只有2G内存也带得动这个系统。后端打包直接在项目根目录执行mvn clean package -DskipTests打包完成后到target目录下找到xxx.jar通过scp命令上传到服务器scp target/gov-system-0.0.1-SNAPSHOT.jar root服务器IP:/opt/gov-system/服务器上建议使用systemd管理Java服务这样能实现开机自启和崩溃自动重启[Unit] Descriptiongov-system Afternetwork.target [Service] Userroot WorkingDirectory/opt/gov-system ExecStart/usr/bin/java -jar /opt/gov-system/gov-system-0.0.1-SNAPSHOT.jar Restartalways RestartSec10 [Install] WantedBymulti-user.target写入/etc/systemd/system/gov.service后systemctl daemon-reload systemctl start gov systemctl enable gov前端打包npm run build打包完成后dist目录里的文件上传到服务器比如/usr/share/nginx/html/gov。然后配置Nginxserver { listen 80; server_name 你的服务器IP或域名; root /usr/share/nginx/html/gov; index index.html; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }配置文件里几个要点try_files那行是为了处理Vue Router的history模式刷新页面时不会404location /api/反代到Java服务的8080端口解决了前端跨域问题。如果你后端接口没有加/api前缀可以把前端的axios基础URL指向/api或者再改一下Nginx匹配规则总之要保证前后端路径能对应上。4.3 服务器部署常见坑部署一次你就会发现本地跑得欢的项目上了服务器总会有各种幺蛾子。我总结几个高概率出问题的点坑一MySQL权限问题。安装MySQL后root用户默认只允许本地登录。你从Java服务连接数据库时如果Java服务也在同一台服务器用localhost连接没问题。如果你在本地开发环境连远程服务器的数据库就要修改用户权限CREATE USER gov_user% IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON gov_system.* TO gov_user%; FLUSH PRIVILEGES;坑二端口没开放。阿里云、腾讯云的服务器默认有安全组规则只开放少数端口。你需要把80端口Nginx和8080端口SpringBoot在安全组里放行否则外网访问不到。如果你用了MySQL远程连接还要临时开放3306用完记得关掉。坑三防火墙拦截。CentOS服务器默认开着firewalld可能需要执行systemctl stop firewalld或者用firewall-cmd放行端口不然Nginx配好了外网还是打不开。坑四内存不够。2G内存的服务器Java进程加上MySQL很容易吃满内存。如果系统卡死可以先看看free -m内存不足时可以把MySQL的innodb_buffer_pool_size调小Java进程也可以设置最大堆内存ExecStart/usr/bin/java -Xms256m -Xmx512m -jar /opt/gov-system/gov-system-0.0.1-SNAPSHOT.jar坑五数据库数据备份。做完一次系统的完整部署后务必备份一份数据和配置。在服务器上执行mysqldump -u root -p gov_system gov_system_backup.sql恢复的时候执行mysql -u root -p gov_system gov_system_backup.sql答辩前一天备份一次数据能帮你避免很多崩溃场景。5. 毕业设计答辩从演示到问答的实战指导5.1 演示流程设计前5分钟定胜负答辩现场的演示环节核心原则就八个字事先排练脚本清晰。千万不要现场临时点着玩因为紧张状态下很容易点错。我建议你按这个顺序来演示第一步演示登录页面分别用管理员账号和普通用户账号各登录一次。重点展示不同账号登录后看到的菜单不一样这直观体现权限控制。很多同学登录完就切走了其实这是展示RBAC模型的最佳时机。第二步进入用户管理页面演示分页查询、条件搜索、新增用户、编辑用户、删除用户。操作时要注意语速慢一点每个操作后用一句话解释接口调用的逻辑。第三步进入一个业务模块比如公文管理或通知公告。重点演示新增一条数据和审批流转的过程把状态变化讲清楚。这类业务流程能体现系统的完整度也是老师愿意看的内容。第四步展示操作日志模块。老师如果问“系统有没有安全机制”你直接把日志模块调出来说“所有关键操作都有日志记录包括操作人、操作内容、IP地址和时间方便事后审计”。这个回答显得专业。演示时间控制在10分钟之内每一步都提前准备好测试数据避免现场输入中文半天打不出来卡壳。我见过不少同学因为演示不流畅被老师追问“这系统真的是你自己写的吗”场面相当尴尬。5.2 高频答辩问题与回答思路答辩老师水平不一但问的问题高度雷同。我整理几个高频问题你可以提前准备好答案问为什么选这个技术栈答从项目实际出发。后端用SpringBoot是为了快速开发、减少配置前端用Vue是因为前后端分离利于团队分工Vue的组件化开发适合管理后台这种界面重复度高的系统MySQL是主流关系型数据库稳定性和资料丰富度都适合这个规模的项目。不要只说“因为大家都在用”要落到项目本身。问权限管理怎么实现的答基于RBAC模型用户表、角色表、菜单表三张核心表加上用户-角色、角色-菜单两张关联表。用户登录后后端根据用户ID查出角色再根据角色查出对应的菜单权限生成权限集合返回给前端。前端通过路由守卫和自定义指令控制页面和按钮的展示。后端通过拦截器校验JWT并在必要时做接口级权限校验。问系统的安全性怎么保障答从几个层面讲密码加密存储、JWT无状态认证、拦截器统一鉴权、操作日志审计、SQL预编译防注入。如果有人提到XSS问题你可以说前端框架Vue自带转义机制后端也可以加过滤器统一处理上传内容。这个问答应提早想清楚层次一层层答。问数据量大了怎么办答先答索引和分页优化再说如果单表数据量过大可以考虑分库分表架构上可以引入Redis缓存热点数据。学生项目到索引和分页这个层面已经足够了不建议主动深入讲分库分表除非你确实做了。问项目里遇到过什么困难答建议准备一个具体的技术难题并说明解决思路。不要说“没遇到过困难”也不要直接说“和同学讨论解决了”要用第一人称讲清楚排查过程。比如跨域问题、数据库时间差8小时问题、前端Token失效后页面白屏问题这些都是真实场景讲出排查思路就能证明你确实做了项目。5.3 设计报告撰写要点设计报告或者叫毕业论文这块有两点核心建议第一一定要用Markdown或Word提前排版目录结构清晰第二报告内容要和技术实现对应不能“设计”一套、“实现”另一套。研究报告建议包含这七个章节绪论背景、意义、国内外现状、需求分析用户角色、功能需求、非功能需求、系统设计架构设计、功能模块设计、数据库设计、系统实现每个核心模块截屏加关键代码说明不用贴全部代码贴核心逻辑、系统测试功能测试用例表、测试结论、总结与展望总结工作内容、提出改进方向、参考文献。数据库设计部分要放图。建议用PowerDesigner或draw.io画出E-R图再放核心表的建表SQL脚本老师看到这个就知道你数据库下了功夫。5.4 答辩前的查漏补缺清单答辩前一晚照着这个清单过一遍[ ] 数据库能正常连接服务能正常启动用java -jar从零启动后端能否正常跑起来[ ] 项目里的配置信息没有写死密码数据库连接配置放到application.yml别把密码传给老师还无所谓至少演示时能用[ ] 系统里预置的演示数据丰富别只有两条空记录[ ] 前端页面没有明显的样式错乱按钮点击有反馈[ ] 准备好一份项目部署文档包括环境要求、部署步骤、账号说明[ ] 把项目上传到Gitee或GitHub给老师一个可以看的源码地址[ ] 提前准备一两台备用方案如果自己的电脑投影出问题要不要用服务器上的演示环境6. 开发排坑实录那些文档里查不到的教训6.1 Vue组件通信与表单数据绑定的坑写Vue页面的时候新手最容易在表单数据绑定上出问题。比如你用v-model直接绑定一个对象里的嵌套属性如果对象初始化时没声明这个属性页面可能不会实时响应。解决方案是提前在data()里把表单数据结构定义完整。另一个常见问题是列表页用了this.$set往对象里加字段结果发现视图不更新。实际上Vue 3的reactive和ref已经解决了大部分响应式问题如果你用的Vue 2记住新增属性要用this.$set就行。6.2 MyBatis-Plus条件构造器的坑使用QueryWrapper做条件查询时要注意对空值的判断。我之前写过一个用户列表的接口搜索条件里有个status字段前端没传值时后端直接eq(status, null)结果SQL变成了WHERE status null查出来是空列表。正确的做法是QueryWrapperUser wrapper new QueryWrapper(); if (StringUtils.isNotBlank(status)) { wrapper.eq(status, status); }这个坑很隐蔽建议画个表格提醒你的组员把所有用条件构造器的地方检查一遍。6.3 前端文件下载与上传项目里如果有文件上传功能建议后端使用单独的存储路径并把文件访问的静态资源映射配置清楚。SpringBoot中做文件上传有几个关键点第一配置上传大小限制spring: servlet: multipart: max-file-size: 10MB max-request-size: 20MB第二上传文件的存储路径不要放在项目打包目录里否则重新部署时会丢文件。建议配置到服务器的一个独立目录比如/data/files/并在Nginx中做个静态资源路径映射方便直接通过URL访问文件。第三下载或预览时如果文件名是中文要注意URL编码问题。用URLEncoder.encode处理后再拼接URL避免下载时文件名乱码。6.4 答辩现场环境故障应急手册最后再分享一份有备无患的应急手册都是我见过真实情况现场网络不好前端页面加载不出来提前在本地启动前端用localhost访问不依赖外网数据库连不上先检查MySQL服务启动状态systemctl status mysqld再检查账号密码后端启动报端口占用lsof -i:8080查看端口进程kill掉旧进程电脑没有中文字体页面中文变方块这个少见提前截图备用即可演示数据被误删准备一个reset_data.sql脚本一键恢复初始化数据写在最后做毕业设计这件事本质上锻炼的是你把一个完整系统从无到有架构起来的能力。技术本身不难难的是你在整个过程中有没有养成好的习惯有没有先设计再开发有没有在写代码时考虑扩展性和安全性有没有把每一步的坑记录下来形成自己的经验。就我个人经验来说毕业设计最值钱的不是代码本身而是过程中踩坑后沉淀下来的那套解决问题的思路。这套思路在答辩时能让你从容在工作后能让你独立上手。项目做完以后我建议你再往里面加一个小功能——比如数据导入导出或者对接一个天气接口做展示大屏这些听起来很小的改动实际上会让你的项目在整个答辩组里明显更亮眼。如果你做到最后发现还有时间试着把项目部署到云服务器用手机访问看看页面效果。那一刻你就知道从“能跑”到“能上线”中间隔着的这层纸终于捅破了。
返回列表