Spring Boot校园考研论坛APP毕业设计全流程:从技术选型到部署避坑

发布时间:2026/9/10 6:07:12
Spring Boot校园考研论坛APP毕业设计全流程:从技术选型到部署避坑 从选题到答辩我做了快三个月Spring Boot校园考研论坛APP项目期间踩了不少坑也摸索出一套比较顺的流程。今天把这个项目从需求拆解、技术选型到实际运行、常见问题排查完整整理出来。这个项目本身是“springboot校园考研论坛APP 毕业设计”的典型形态附带完整源码我手上的版本是源码75849那套技术栈以Spring Boot为核心、面向移动端的论坛类应用很适合计算机相关专业作为毕业设计或课程项目参考。如果你正准备做类似题目或者已经在做但卡在某一步这篇文章能帮你节约大量查资料的时间。先说结论校园考研论坛APP这类项目属于典型的信息发布社区互动类应用业务模型清晰、功能模块边界明确非常契合毕业设计需要的“麻雀虽小、五脏俱全”。技术层面用Spring Boot做后端接口配合MySQL存储数据前端用APP形式承载整体工作量适中既能展示后端设计能力又不至于在三个月内做不完。我建议你把它当做一个“最小可运行的完整产品”来做而不是堆砌功能。1. 项目整体设计与技术选型思路1.1 考研论坛功能需求拆解做毕业设计最容易犯的错是一上来就写代码。我在第一次做这类项目时就吃过亏功能表列了一大堆结果数据库表改了好几轮。正确做法是先做需求拆解搞明白“校园考研论坛APP”到底要解决谁的什么问题。这个项目的目标用户非常明确在校考研学生。他们的核心诉求是什么找资料、找研友、问经验、看公告。所以论坛的核心功能可以归纳为三类内容类功能帖子发布、帖子浏览、评论回复、帖子分类政治/英语/数学/专业课/复试调剂等。互动类功能点赞、收藏、关注用户、浏览统计。管理类功能用户注册登录验证、管理员对帖子和评论的审核与删除、公告发布。如果你是学生可能还会想到加“考研资料下载”模块。但我要提醒一句文件上传下载功能会引入文件存储、文件类型校验、大小限制等一系列问题如果毕业设计时间紧张建议第一版先不做等核心功能全部跑通后作为加分项再加。这个项目的源码里保留的就是核心论坛闭环这个取舍是对的。另一个容易被忽视的需求点是“校园”二字。这意味着用户群体是一个学校内部的考研学生而不是全网用户。所以注册时可以考虑学号字段校验帖子列表可以按学院或校区筛选。实际开发中我建议保留这两个字段但不做强校验既能在答辩时说明“考虑到了校园属性”又不至于给自己挖坑。1.2 技术选型为什么后端一定要用Spring Boot“Spring Boot”能成为毕业设计的热门选择不是没有道理的。如果你用过传统的SSH框架或者纯Servlet开发一定体会过配置文件的痛苦。Spring Boot最大的价值是把“配置”变成了“习惯”通过自动配置和起步依赖让开发者只需要关注业务代码。以这个项目为例后端需要做的事非常清晰接收APP端发来的HTTP请求解析JSON参数。调用业务逻辑层处理数据。通过MyBatis-Plus或Spring Data JPA操作MySQL数据库。返回统一格式的JSON响应给APP端。Spring Boot的spring-boot-starter-web就能解决HTTP接口问题mybatis-plus-boot-starter解决数据库操作问题spring-boot-starter-validation解决参数校验问题。这三个依赖加进去项目骨架就起来了。比SSH时代配置十几个XML文件要省事太多。我在选型时也用Spring Boot 2.7.x搭配JDK 1.8这个组合最稳妥。为什么不追求Spring Boot 3.x因为Spring Boot 3.x强制要求JDK 17很多教学材料和老代码片段都是基于JDK 8的写法直接用新版容易遇到“springboot版本太高”导致的各种兼容性问题比如javax包名变成jakarta、MyBatis-Plus适配不完整等。毕业设计求的是稳不是新。1.3 APP端形态选择原生Android还是HBuilderX打包很多同学纠结APP端到底用什么技术做。我的建议如果时间充裕且有Android基础用原生Java/Kotlin写如果时间紧张或者以前没碰过移动端用HBuilderX uni-app框架。这个毕业设计源码里的APP端我看了下是uni-app写的。这个选择很聪明原因如下uni-app是一套代码编译到多端的框架一套Vue语法写的代码可以编译成Android APK、iOS应用、H5网页甚至微信小程序。毕业设计答辩时老师最关心的是“你的系统能不能跑通”小程序的演示环境比原生APK更容易搭建在电脑上装个模拟器或者直接扫码就能看效果。uni-app开发调试方便HBuilderX自带模拟器还能直接用浏览器调试改动代码实时刷新。当然用uni-app也有代价如果要调用手机原生能力比如推送、相机、定位需要写条件编译代码或使用插件。但考研论坛APP本质上就是“填表单看列表”基本用不到这些原生能力所以这个取舍完全划算。在技术架构上APP端通过HTTP调用后端的RESTful API。我建议后端接口统一返回一个Result对象结构类似{ code: 200, message: 操作成功, data: { } }这样好处是APP端拿到响应后先判断code再解析data。如果code不通一直接弹出message里的错误提示即可不需要为每个接口单独写错误处理逻辑。这个规范一定要从第一天就定下来我见过不少项目做到一半返回格式五花八门前端代码写了一堆if-else去兼容最后维护成本爆炸。2. 核心功能实现与关键细节2.1 用户注册登录与Token鉴权机制用户模块是所有论坛类应用的基石。这个项目的用户表字段说复杂不复杂但有几个关键点必须处理好。第一是密码存储。绝对不允许明文存储密码。使用BCrypt加密Spring Boot里引入spring-boot-starter-security可以顺便用上BCryptPasswordEncoder但如果你不想引入整个Security框架因为它的拦截链配置要花时间学习也可以单独引入spring-security-crypto这个依赖只使用加密工具类。第二是登录状态管理。APP端不能像浏览器端一样依赖CookieSession因为APP端每次请求都不一定保留Cookie容器而且Session在移动端场景下体验不好。推荐方案是JWTJSON Web Token。用户在登录成功后后端签发一个JWT字符串返回给APP端APP端保存到本地存储后续每次请求放在请求头Authorization字段中携带。JWT的校验代码不复杂关键是配置好密钥和过期时间。我在项目中设置的是2小时过期过期后APP端跳回登录页重新登录。如果你希望“7天内免登录”可以把过期时间改长或者引入刷新Token机制但毕业设计不必搞这么复杂2小时足够演示了。第三是登录拦截。使用Spring MVC的HandlerInterceptor拦截器在preHandle方法中从请求头取出Token并校验校验不通过直接返回401状态码。然后注册拦截器时配置好放行路径比如登录接口、注册接口、刷新验证码接口等必须放行帖子列表、帖子详情可以放行也可以拦截取决于你是否允许游客浏览。我这个项目里设定的是游客可以浏览但无法发帖、点赞、收藏所以仅拦截需要登录的操作。这个设计在答辩时也是个亮点可以体现你对用户权限粒度的思考。2.2 帖子发布与评论模块考研论坛的内容主体是帖子所以帖子模块的设计直接决定了系统的用户体验。数据库层面帖子表主要字段包括id、用户ID发布者、分类ID、标题、内容、图片URL可多张用JSON数组字符串存储、浏览量、点赞数、评论数、创建时间、更新时间、状态0禁用/1正常、是否置顶、是否精华。这里有个设计细节值得说图片存储。在实际部署时如果图片上传到本地磁盘会面临路径泄露、服务器重启后重新上传等问题。最省心的方案是上传到对象存储服务比如阿里云OSS但毕业设计没有云资源怎么办我的做法是在服务器上建一个images目录通过spring.resources.static-locations配置指向本地目录再用一个独立的映射路径访问。这样既能正常显示图片又不需要引入额外的依赖。注意上线时这个方案不适合高并发场景但毕业设计演示完全够用。发布帖子的接口逻辑看起来简单其实有几个隐藏点标题必填长度限制在50字以内内容必填长度限制在5000字以内。通过NotBlank和Size注解实现参数校验不通过直接抛异常。帖子内容需要进行HTML标签过滤防止XSS攻击。我用的是Jsoup工具库把内容里的script标签和onclick等事件属性清除掉。发布成功后返回帖子详情而不是只返回“成功”提示减少APP端因为数据不同步造成的bug。评论模块相对简单一张表解决评论ID、帖子ID、用户ID、父评论ID用来做楼中楼、内容、创建时间。楼中楼功能不是必须的如果你想控制工作量可以只做一层评论不做回复嵌套。2.3 点赞收藏与统计字段的取舍点赞和收藏是论坛互动的重要指标也经常是答辩时老师会追问的点“如果一万个人同时点赞你的数据库扛得住吗”如果你在毕业设计里使用Redis做热点数据缓存当然可以在这个问题上加分。但多数同学的实际情况是Redis不熟或者部署环境受限。这个时候更务实的表结构设计是单独建一张“点赞记录表”记录用户ID、点赞目标类型帖/评论、目标ID、创建时间。用户点赞时先查记录表是否已存在不存在则插入同时将帖子表中的点赞数字段1取消点赞则删除记录点赞数-1。这种设计虽然在高并发下会出现数字不准确的问题但优点是逻辑简单、数据一致性强也不会出现“同一用户对同一帖子点赞两次”的问题。其实对毕业设计场景来说一致性比性能重要因为答辩演示不可能构造出高并发环境。如果老师问到了性能问题你可以回答“目前方案通过数据库唯一约束保证同一用户只能点赞一次后续可引入Redis将点赞数做成异步缓存更新”——这个回答表明你懂优化方向但没做也不致命。收藏逻辑和点赞几乎一样唯一的区别是收藏记录表多个一个“收藏分类”字段方便用户对收藏内容分组管理。不过在我的项目中我还是决定不做分组只做单层收藏这样前端UI展示和后台数据结构都能省不少事。2.4 管理员后台与角色权限控制毕业设计如果没有后台管理功能整个系统的“管理闭环”就缺失了。我带过的学弟学妹里很多人只做用户端的APP导致答辩时老师说“你这个系统连个管理入口都没有”。实际上管理功能不需要做得很复杂但必须有。管理员角色和普通用户角色如何区分两种方案一种是用户表加role字段1表示管理员0表示普通用户另一种是单独建角色表用户-角色多对多关联。我用的是第一种方案因为考研论坛的权限模型简单不需要复杂的RBAC。这点在答辩时也可以说明“考虑到系统规模我采用了扁平化权限模型管理员和普通用户是互斥角色。”管理端功能包括用户管理查询用户列表、禁用/启用账号。帖子管理查看帖子列表、删除帖子、置顶/取消置顶、设置精华。评论管理删除违规评论。公告管理发布、编辑、删除公告。数据统计展示用户总数、帖子总数、今日发帖数等基础数据。管理端我建议做成Web页面用Vue Element Plus实现而不是放在APP里因为管理员通常用电脑操作而且Web页面在答辩时用大屏演示效果更好。当然如果你没时间做Web管理端也可以用APP内嵌一个管理员入口但从实际体验来说还是Web端更专业。为了避免每次判断用户是否为管理员都去查数据库我是在JWT Token生成时直接把角色信息放进payload里后端接口通过RequireAdmin注解的方式做权限校验。这样拦截器解析完Token就能拿到角色不用再查数据库。实践证明这个方案在项目里很好用减少了重复代码。2.5 数据库设计要点与ER模型考研论坛APP的数据库表我最终建了8张表表名说明核心字段user用户表id, username, password, nickname, avatar, role, statuspost帖子表id, user_id, category_id, title, content, images, view_count, like_count, comment_count, statuscomment评论表id, post_id, user_id, parent_id, content, create_timelike_record点赞记录表id, user_id, target_type, target_id, create_timecollect_record收藏记录表id, user_id, post_id, create_timecategory帖子分类表id, name, sort_ordernotice公告表id, title, content, create_timefollow_relation关注表id, user_id, follow_user_id, create_time设计时要注意几个容易踩的坑所有表必须有主键id、create_time字段。这是最基本的规范答辩时老师很看重表结构是否工整。数字字段设计好默认值。比如view_count默认0status默认1不要允许拼接NULL。时间字段用datetime类型要么用now()初始化要么在代码中set不要偷懒不赋值。外键约束不强建。虽然理论上应该用外键保证数据完整性但实际开发中主流做法是不建物理外键而是通过逻辑外键即字段名与关联表主键对应来关联。这样在删除数据时更灵活也能避免外键导致的死锁问题。数据库SQL脚本一般会放在源码的sql目录下。拿到项目源码后第一步要做的就是执行这个SQL脚本把表和基础数据导入MySQL。我知道不少同学卡在这一步后面我会详细说启动过程。3. 从零启动这个项目的完整流程3.1 环境准备JDK、Maven、MySQL、HBuilderX运行一个Spring Boot uni-app项目本机需要准备这些环境。我按照自己整理的稳定版本清单列一下工具推荐版本说明JDK1.8即Java 8稳定兼容Spring Boot 2.xMaven3.6.x依赖管理工具MySQL5.7或8.05.7较为稳定8.0也行IDEA2022以上后端开发IDEHBuilderX最新版uni-app开发工具Navicat任意版本数据库图形化管理工具安装时有个细节IDEA中打开项目之前要确认Maven配置的是本地仓库路径和阿里云镜像否则下载依赖会非常痛苦。在Maven的settings.xml文件里加上阿里云mirror配置速度能提升十倍不止。还有一点不要装最新的JDK 21去跑Spring Boot 2.x项目因为新版本的JDK会有模块化限制和字节码兼容性问题。老老实实用JDK 8能少踩很多坑。3.2 数据库初始化与连接配置拿到源码后第一步是打开Navicat新建数据库字符集建议选utf8mb4排序规则选utf8mb4_general_ci。然后导入SQL脚本。导入完成后检查几个核心表里是否有初始化数据。比如category表应该有“政治、英语、数学、专业课”等分类。notice表里应该有测试公告。如果没有要手动补几条否则APP端打开时列表是空的影响演示效果。接下来修改后端配置文件application.yml或application.propertiesserver: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/kaoyan_forum?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: 你自己的密码 servlet: multipart: max-file-size: 10MB max-request-size: 20MB jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl jwt: secret: 你的自定义密钥至少32位 expire: 7200这里有个关键技术点数据库用户名密码必须改成你自己的。很多同学运行错误都是数据库密码不一致导致的。另外MySQL 8.0以上需要指定driver-class-name为com.mysql.cj.jdbc.Driver而5.7版本用com.mysql.jdbc.Driver。如果你的连接报错ClassNotFoundException优先检查这里。还有spring.jackson.date-format配置必须设置否则后端返回给APP端的时间是时间戳格式很难看。3.3 后端启动步骤与接口自测后端项目导入IDEA后等待Maven下载完依赖第一次可能要下载几分钟然后运行主启动类通常叫KaoyanForumApplication文件名有Application后缀。启动成功后控制台会输出Spring Boot的日志包含Tomcat started on port(s): 8080。看到这个说明后端已经跑起来了。这时我建议先用Swagger或Postman自测几个核心接口而不是直接连APP端。代码里一般会整合Knife4j或Springfox Swagger启动后访问http://localhost:8080/doc.html就能看到接口文档页面。如果项目没有集成Swagger用Postman挨个测试也行。需要测试的接口清单模块接口预期结果用户POST /api/user/register注册成功返回用户信息用户POST /api/user/login登录成功返回token帖子GET /api/post/list?page1size10返回帖子分页列表帖子POST /api/post/create需要带token发布成功互动POST /api/like/toggle需要带token点赞成功管理GET /api/admin/post/list需要管理员token返回帖子列表测试时注意两个细节。第一个是POST请求参数如果是application/json要在Postman的Body里选raw JSON格式如果是form-data就选form-data传参。第二个是使用Token登录后把返回的token复制到Postman的Headers里键是Authorization值是“Bearer 实际token”。这两点能避免大部分“接口测试不通”的问题。3.4 前端APP端运行与联调用HBuilderX打开前端项目目录后需要修改一个核心配置文件通常是utils/request.js或者config.js。里面会有类似这样的一段代码const BASE_URL http://localhost:8080/api这个BASE_URL是前端请求后端的根路径。你在电脑浏览器上调试时用localhost没问题。但如果用手机真机预览或者用Android模拟器调试问题就来了Android模拟器里访问电脑不能用localhost要用10.0.2.2。手机真机访问电脑要换成电脑的局域网IP并且确保手机和电脑在同一个WiFi下。电脑的局域网IP可以通过ipconfig命令查看。所以更稳妥的写法是const BASE_URL http://192.168.1.104:8080/api把192.168.1.104换成你自己的局域网IP。注意如果你改了电脑IP这个地址也要同步改不然APP会连不上后端。另一个隐藏坑是防火墙。Windows电脑默认会拦截外部设备访问8080端口。解决办法是在Windows防火墙高级设置中添加入站规则放行8080端口。或者最简单的临时办法在第一次运行后端时弹出的Java访问网络提示框里点“允许访问”。如果还是连不上直接关掉防火墙测试演示完记得重新开启。修改完BASE_URL在HBuilderX中点击“运行到浏览器”先去浏览器里验收整个业务逻辑。浏览器通过后再运行到Android模拟器或真机。我个人的习惯是先用浏览器联调确认接口都通再跑真机这样排查问题的时间会少很多。4. 常见问题与排查技巧实录4.1 后端启动报错端口占用、数据库连接失败启动时最常遇到的三个错误我写个速查表错误现象原因解决方案Port 8080 was already in use8080端口被其他程序占用修改配置文件server.port为8081或在命令行使用netstat -ano查找占用进程并结束Access denied for user rootlocalhost数据库密码配置错误核对application.yml里的数据库密码Unknown database kaoyan_forum数据库不存在或库名不一致在Navicat中确认数据库名是否与配置文件一致com.mysql.cj.jdbc.Driver报错MySQL驱动版本不匹配检查pom.xml中mysql-connector-java版本MySQL 8用8.0.x版本端口占用的问题我遇到最多是因为以前用IDEA跑过其他服务没关干净。用netstat -ano | findstr 8080查到PID后taskkill /PID 进程号 /F强制结束就行。如果是毕业后要提交的演示环境不如直接改端口不跟本机环境较劲。数据库连接失败还有一个隐蔽问题MySQL 8.0使用了caching_sha2_password加密方式而部分旧版本的数据库驱动不支持会报127错误。解决方法是把驱动版本升级到8.0及以上或者在MySQL中把用户加密方式改为mysql_native_password。4.2 前端跨域问题与拦截器放行配置开发阶段前后端分离跨域问题是躲不掉的。APP端通过HTTP访问后端接口浏览器会先发送一个OPTIONS预检请求。如果后端没有处理OPTIONS请求就会出现“跨域请求被拦截”的报错浏览器控制台提示CORS error。解决办法是在后端写一个跨域配置类实现WebMvcConfigurer重写addCorsMappings方法Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }这个配置放在项目中很简短但很多同学漏掉这一步导致APP端请求全部失败。如果你的拦截器中做了登录校验要注意放行OPTIONS请求否则预检请求被拦截器拦下来CORS配置也无效。if (OPTIONS.equalsIgnoreCase(request.getMethod())) { return true; }这两行代码一定要加到拦截器preHandle的最前面。4.3 图片上传后无法显示帖子发布成功但图片显示不出来这个问题的排查路径是固定的在浏览器访问图片的完整URL看是否能直接打开。检查图片是否真的上传到了配置的目录里。看上传时的报错信息最常见的是路径不存在、没有写入权限、文件大小超限。我的项目里图片上传的接口逻辑分两步先把文件保存到磁盘目录然后把这个目录映射成静态资源。配置有三个关键点application.yml里设置上传路径我用的是项目根目录下的upload/。配置类是设置一个WebMvc的ResourceHandler把“/images/**”映射到本地upload目录。保存文件名时不能直接用原始文件名我用UUID重命名避免中文文件名和路径穿越问题。总结一下图片访问不到先检查磁盘目录里有没有文件再检查URL映射是否配置正确最后检查防火墙和端口。4.4 Maven依赖冲突与版本兼容“springboot版本太高”是很多人头痛的根源。我之前帮一个学弟排查他的项目启动直接报Invalid value type for attribute factoryBeanObjectType原因是Spring Boot 3.2 MyBatis-Plus 3.5.x的兼容问题。我给你的建议简单直接Spring Boot 2.7.x MyBatis-Plus 3.5.3 MySQL 8.0这是当前资料最丰富、坑最少的组合。不要在pom.xml里手动指定复杂版本号除非你清楚自己在干什么。如果项目已经用了Spring Boot 3.x那么注意引入依赖时MyBatis-Plus要用3.5.5以上的版本因为旧版对JDK 17的反射机制支持不好。Maven依赖冲突另一个典型症状是NoClassDefFoundError通常原因是某个包被不同版本重复引入。排查方法是在IDEA右侧的Maven面板里点击“Show Dependencies”查看依赖树找冲突。但说实话对毕业设计而言与其花时间调版本不如直接换成上面说的稳定组合省时间。4.5 App真机调试连不上后端的排查清单真机调试时前端请求一直转圈、报网络错误按这个顺序排查1. 手机和电脑是否处于同一局域网同一个WiFi。 2. 电脑上能否用浏览器访问 http://电脑IP:8080/api/user/list。 3. 后端是否设置了server.address为0.0.0.0默认就是无需改。 4. Windows防火墙是否放行8080端口。 5. 前端BASE_URL的IP是否是最新的局域网IP。 6. 如果安卓9以上系统是否开启了usesCleartextTraffic允许明文HTTP流量。最后这条很多人忽略。Android 9开始系统默认禁止HTTP明文请求如果APP没有在AndroidManifest里配置android:usesCleartextTraffictrue即使你在浏览器里能访问APP里也始终网络错误。uni-app项目里在manifest.json源码视图的app-plus配置下添加distribute: { android: { usesCleartextTraffic: true } }或者最简单在manifest.json的可视化界面中勾选“Android设置”里的“使用明文传输”。这个小问题能卡住一大批人我建议你提前检查。5. 源码阅读顺序与二次开发建议5.1 拿到源码后建议的阅读顺序源码75849这套项目文件不少但核心阅读路径很明朗。我建议按这个顺序看下去不要从头到尾瞎翻先看数据库SQL脚本了解项目有哪些表和表之间的关系。看后端pom.xml了解项目用了哪些依赖。看application.yml了解项目配置了哪些参数。看统一响应类Result和通用返回结构理解前后端交互约定。看用户相关的Controller、Service、Mapper这是最简单的业务链路。再看帖子模块重点理解分页查询和关联查询的写法。最后看管理端理解权限校验的实现方式。这样一趟走下来整个项目的骨架和业务逻辑就清晰了。如果一上来就翻某个复杂的代码类很容易迷失在细节里。5.2 四个值得扩展的方向如果做完核心功能还有时间我建议从下面四个方向选一个做扩展每一个都能成为答辩时的加分项引入Redis缓存帖子列表和会话Token替换JWT自带的无状态Token方案。虽然工作量不大但技术含量高老师很认可。增加私信聊天功能用WebSocket实现实时通信。这个模块在考研论坛场景里顺理成章研友之间需要私聊交流。增加搜索功能用Elasticsearch或MySQL全文索引实现帖子内容搜索。如果不想引入ES用MySQL的LIKE查询加索引也够用。增加数据可视化在管理后台用ECharts展示用户增长趋势、帖子分类占比等图表视觉效果非常好答辩时能抓眼球。以上四个方向我认为第一个和第四个性价比最高。第一个能体现出你对高并发场景的理解第四个能提升答辩演示的观感两者结合效果最佳。而私信聊天虽然在技术上很能打但WebSocket的调试成本不低如果时间不够容易翻车。5.3 整理项目文档的注意事项最后说一个很多人忽略但很重要的交付物项目文档。毕业设计不只看代码还需要论文或项目说明书。如果你参考了这个项目建议按照下面的结构整理系统需求分析写清楚背景、可行性、功能需求、非功能需求。系统设计包含架构图、功能模块图、数据库ER图。系统实现按照模块逐章节写关键代码和运行截图。系统测试写测试用例表格列出输入、预期输出、实际结果。总结与展望写开发过程的收获和项目可改进方向。论文里的截图一定要重新截图不要直接拿网上的图。老师查重虽然不查图片但答辩时对着模糊的截图讲很影响印象分。我在做这个校园考研论坛APP项目时最深的体会是技术本身不算难真正的难点在于“把每个环节串起来”。从数据库设计到后端接口再到APP端联调任何一个地方理解不到位整个链路就跑不通。这也是为什么这类项目适合作为毕业设计——它逼着你从全栈视角去理解一个完整系统的运行逻辑。把上面这些流程完整走一遍你收获的不仅是一个能交差的毕设而是一套独立开发应用的能力。