拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

基于Spring Boot前后端分离的大学生兼职平台毕设设计与实现

基于Spring Boot前后端分离的大学生兼职平台毕设设计与实现 一到毕设季群里全是问选题的。很多同学来来回回就那几个问题做什么题目好过用哪套框架稳有没有带源码能直接跑的项目今天我就来说说我做过的这套“大学生兼职平台”它是计算机毕业设计里很典型的Web管理系统带完整源码和部署文档工作量适中、技术栈主流、答辩好讲适合基础一般但想稳扎稳打做完的同学。如果你正在纠结选题或者已经选了类似题目但不知道怎么搭代码可以认真看看我下面的拆解。这个项目表面上是“发布兼职信息学生报名后台审核”的一套系统但把它拆透了之后你会发现它其实覆盖了登录鉴权、角色权限、信息管理、状态流转、列表检索、文件上传这些做毕业设计必须会的核心点。也就是说做完它之后你不仅交了一个毕设还把Spring Boot相关的常见套路都过了一遍。1. 为什么“大学生兼职平台”是性价比极高的毕设选题1.1 从需求到代码这个题目的边界很好控制我见过太多同学一开始选了“校园二手交易平台”、“在线教育系统”、“社区团购小程序”这些题目不是不行但需求边界很容易失控。比如二手交易你得考虑订单、支付、物流、退款、纠纷哪怕只是做个演示版设计出来也是又臭又长。而大学生兼职平台的核心业务非常清晰谁能发布兼职、谁能报名兼职、谁审核和下线岗位。就这三条主线足够撑起一个毕设系统又不会让开发量炸掉。更关键的是这个题目有天然的角色划分。学生、企业/雇主、平台管理员各干各的事权限逻辑好做页面也容易区分。答辩的时候老师问“你的系统有哪些角色”你能很清楚地说出来而不是支支吾吾说“用户和管理员”。我自己做的时候还把兼职类型拆成了长期兼职、短期兼职、实习兼职、线上兼职这样首页筛选和数据统计就有话可讲。论文里写数据的多样性也方便因为字段足够丰富。1.2 技术栈选择为什么我推荐Spring Boot Vue现在毕设主流基本是两派一是Spring Boot做后端配一个Vue或者Thymeleaf前端二是用Python的Django/Flask。我选Spring Boot的原因很朴素网上资料最多遇到问题一搜就有答案。热词里也能看到很多“基于springboot的毕设选题”这已经是计算机毕设事实标准了。我做的这套是前后端分离的Spring Boot后端 Vue前端。后端用MyBatis Plus操作数据库鉴权用JWT文件上传用本地存储前端用Vue 3 Element Plus。选这套组合的理由很简单MyBatis Plus能从单表CRUD省下大量代码JWT比session在答辩时更容易讲清楚Element Plus的表格和表单组件能让管理员界面一天就搭出来。你可能会问为什么不直接用SSMSpring Spring MVC MyBatisSSM当然也行但配置比较多现在教程都开始往Spring Boot迁移了。既然毕设时间是有限的能少踩一个坑就少踩一个坑Spring Boot的自动配置能让你把精力集中在业务逻辑上。1.3 功能列表要“看起来完整但实现不痛苦”毕设答辩有一个潜规则功能不能太少但也不要做那些需要真实支付、真实短信验证码之类的外部依赖功能。我的功能清单是这样定的学生端注册登录、浏览兼职、按类型/薪资筛选、报名兼职、收藏兼职、查看我的报名记录和收藏列表、修改个人资料。企业端注册登录、发布兼职、修改下架自己发布的兼职、查看报名人员列表、审核通过或拒绝报名。管理员端管理所有用户、审核兼职信息的上架与下架、管理兼职类型、查看系统数据统计。每个端的功能都控制在6个以内但整体一拼页面就有十多个。这样的数量级数据库表不会太多代码量也不会把你逼疯。而且每个功能都有明确的业务意义写论文的时候能逐一对应需求分析。2. 系统设计从角色权限到数据库表我是怎么一步步落地的2.1 三种角色搞清楚了整个系统的骨架就出来了在做数据库设计之前我先把用户表设计成带角色字段的“单表用户体系”。学生和企业用户都可以放在同一张用户表里用role字段区分分别是1和2管理员在初始化数据时手动插入一个role3的账号。这样做的好处是登录逻辑统一只需要一张用户表、一个登录接口通过JWT里的角色字段去控制前端页面显示和后端接口权限。角色和权限映射我用了很简单的策略后端写一个拦截器或者AOP注解比如RequireRole(enterprise)只有对应角色才能访问。我在项目里用的是Spring MVC的拦截器在拦截器里判断请求路径前缀和当前用户角色比如/api/enterprise/**必须企业角色才能访问。这样不用引入Spring Security那套复杂配置也能在答辩时清楚说出权限是怎么控制的。你如果觉得拦截器配置有点绕也可以用MyBatis Plus自带的方式或者直接在每个Controller方法里校验。但我不建议把权限校验写在业务代码里那样重复代码太多答辩时老师问“如果我直接调你的接口怎么办”你会很难说清楚。2.2 核心表结构不是越多越好够用且能讲明白才是重点我的数据库叫parttime_job核心表一共7张这7张已经能覆盖所有功能了t_user用户表字段有id、username、password、role、phone、email、real_name、status。t_user_detail用户扩展表存学生简历信息或企业营业执照信息避免主表字段太杂。t_job_type兼职类型表比如家教、餐饮、前台、线上推广sayfa前端下拉框直接查这张表。t_job兼职信息表字段有title、type_id、company_id、salary_type、salary_min、salary_max、address、description、requirement、status、publish_time、deadline。t_application报名表字段有id、job_id、student_id、status、apply_time、audit_time这里status分待审核、已通过、已拒绝。t_favorite收藏表字段有job_id、student_id、create_time防止重复收藏用唯一索引。t_feedback反馈表学生在报名后可以给企业留言教师答辩时会觉得这个细节很完整。有一点要重点说t_job表的salary_type字段我存的是月薪/日薪/时薪/面议这种枚举值而不是直接存字符串。这样前端可以用标签显示后端也好统计论文里还可以写“字典设计”。另外我没有用金额的大额头字段而是用salary_min和salary_max两个整数简单直接。2.3 那些最容易乱的状态一定要用枚举和状态机去约束兼职信息的状态我设计了四种0-待审核、1-招聘中、2-已截止、3-已下架。学生报名记录状态设计了三种0-待审核、1-已通过、2-已拒绝。这些状态看着简单但实际操作中稍不注意就会乱。我踩过的坑是企业发布兼职后如果状态不区分“待审核”和“招聘中”管理员审核功能就不存在了整个后台缺了一大块。所以一定要在管理员审核通过后才把兼职状态从0改成1学生只能看到状态为1的兼职并报名状态为0的普通招聘。兼职到期或手动下架后状态改成2或3学生端就不再展示。报名表还有一个细节同一个学生对同一个兼职不能重复报名。这个逻辑不能在代码里写了if之后再insert因为存在并发问题。更稳的做法是给t_application表加上job_id和student_id的联合唯一索引再次插入时数据库会直接报错你只需要捕获异常返回提示就行。3. 从零到能跑环境准备与核心代码实现记录3.1 开发环境搭起来先别急着写代码我的开发环境是JDK 8、MySQL 5.7、Maven 3.8、Redis 7。是的我用了Redis但不是必须的。如果你不想让毕设增加部署负担Redis可以去掉。我加它的原因是为了存验证码和一些热门的兼职列表缓存答辩时能讲“性能优化”。需要提醒的是Redis在本机启动后默认端口6379Spring Boot的配置文件里要对应改一下。如果你没有用Redis就在项目里把相关缓存代码删掉完全不影响核心功能。毕设最重要是“稳定能跑”而不是“技术炫”。当然如果你的毕设要求里明确要写中间件加一个Redis是很讨喜的加分项。项目结构上我分成了几个清晰的模块controller、service、mapper、entity、common、config。entity里放数据库实体类mapper里放MyBatis Plus的接口和XMLservice放业务逻辑controller只做参数接收和返回结果。这套分层是后端开发最标准的写法也是答辩时“项目结构清晰”的证据。3.2 登录鉴权与角色权限找到一个30分钟能讲清的方案登录接口我设计在AuthController里用用户名密码登录密码通过BCrypt加密存储。登录成功后后端生成一个JWT令牌里面包含userId、username、role有效时间设成24小时。前端把token放在请求头Authorization里后端接口通过拦截器解析token再拿到当前用户信息。这里有一个细节很多人会忽略密码加密不要用MD5一定要用BCrypt。因为MD5在线解密很容易老师会问安全性BCrypt自带盐值每次加密结果都不一样明显更稳。在项目里引入的是spring-security-crypto包只用了它的BCrypt工具类不需要引入完整的Spring Security。拦截器的路由拦截规则我是这么分的所有/api/auth/**直接放行其他接口全部要校验token。校验完成后再判断路径是否包含/admin/或/enterprise/如果有再校验角色是否符合。这样统一处理代码量只有几十行但每个接口的权限都覆盖到了。注意放行的接口里不要出现任何业务接口否则别人不登录也能查数据。3.3 兼职信息发布流程从下拉框到数据库字段每一步都别想当然企业端发布兼职的页面核心是一个大表单包含标题、类型、薪资、工作地点、描述、要求、截止时间。后端JobController接收表单后先校验字段是否为空再手动设置企业ID、状态为待审核、发布时间为当前时间然后插入数据库。这个过程中最容易出问题的是类型ID的传递。前端新增兼职时会加载一个下拉框选项来自/jobType/list接口所以后端保存时拿到的是major类型ID。如果前端传的是字符串比如“家教”后端转成Long时会报类型转换错误。我就在全局异常处理器里加了一个类型转换异常捕获统一返回“参数格式错误”的提示。审核逻辑是在管理员端所有待审核兼职用分页列表展示管理员点通过或拒绝。拒绝时我会让管理员填一个原因这个原因会存入t_job表的reject_reason字段学生端在查看兼职时能显示“审核未通过学历要求不符合”这样业务流程就更完整了。3.4 报名与推荐收藏并发与幂等这两个词说出来就很加分学生端点“报名兼职”按钮时按钮要做防重复提交处理。前端在点击后置灰2秒同时后端再次做数据库唯一索引校验。我用INSERT语句直接把job_id和student_id插进去如果捕获到DuplicateKeyException就返回“你已经报过这个兼职”。收藏功能也是差不多的逻辑收藏表设置了唯一索引点击收藏时如果已存在就自动取消收藏这样能实现一个按钮同时处理收藏和取消收藏。代码里不需要先查再删再插直接用“先查是否存在再决定insert或delete”也是可以的只要注意并发即可。为了避免并发我把收藏接口的delete和insert写在同一个事务里并用job_id和student_id拼接了一个唯一键实测下来很稳。推荐兼职这个功能我并没有搞复杂的机器学习算法而是根据学生已收藏的兼职类型去查同类兼职工单按发布时间倒序取8条。这个逻辑虽然简单但在答辩时可以讲成“基于行为偏好的简单推荐”比完全没有推荐强多了。4. 项目跑通与调试实录那些你不自己跑一遍就遇不到的坑4.1 初始化数据和测试账号最好一键能搞定毕设项目发给老师或者放到GitHub上别人第一步肯定是想跑起来。如果初始化数据要手动一行行插入体验就很差。我在项目里放了一个sql文件里面除了建表语句还插入了管理员账号、常规兼职类型、8条测试兼职数据、3个测试学生账号、2个测试企业账号。这样别人把sql导进MySQL后直接启动项目就能看到数据。测试账号的密码我都统一用123456并且数据库中存的是BCrypt加密后的值。如果你不知道怎么生成BCrypt加密串可以临时写一个main方法调用BCryptPasswordEncoder生成再把生成的字符串放进sql。这里特别提醒如果你的mysql是8.0以上数据库驱动版本一定要没匹配好会出现“Public Key Retrieval is not allowed”的报错。解决方法是mybatis配置中加一行allowPublicKeyRetrievaltrue或者直接用mysql-connector-java 8.0.33版本并把驱动类改成com.mysql.cj.jdbc.Driver。4.2 跨域问题前后端分离最容易让新手自闭的坑前端用Vue起的默认端口是5173后端Spring Boot的端口是8080两者一访问就会出现跨域问题。跨域报错的表现是浏览器Console报CORS error但后端日志看不到任何请求进来。我当时卡了挺久最后在Spring Boot里加了一个CorsConfig配置类里面放行所有来源和常见请求方法并且允许请求头Authorization。如果你用代理方式也可以在Vue的vite.config.js里配置proxy把/api代理到localhost:8080这样前端请求就是同源的根本不会触发跨域。两种方案我建议选CorsConfig因为部署时不用区分前端环境更一步到位。4.3 常见运行报错与排查速查表我整理了一份我在项目调试中遇到过的报错和解决办法你可以直接照着排查现象可能原因解决办法启动时数据库连接失败数据库名、用户名或密码不一致检查application.yml里的spring.datasource配置主键冲突或插入数据失败表主键没用自增策略或insert语句没传id在实体id上加TableId(type IdType.AUTO)访问接口404Controller路径写错或没有加RestController用Postman确认请求URL是否匹配返回401但接口不需要登录拦截器拦截了不需要鉴权的路径调整拦截器排除放行路径把静态资源和auth放进去前端页面空白F12报错Vue版本兼容或组件引入错误检查main.js和router配置确认Element Plus已use时间差8小时时区设置为UTC在数据库连接后加上serverTimezoneAsia/Shanghai其中时间差8小时是最好修的但如果不小心就能在列表里看到所有时间都少了8个小时。你要在数据库连接的URL里加上serverTimezoneAsia/Shanghai同时在后端全局配置里设置Jackson的日期格式和时区这样前端显示的时间就对上了。5. 论文配合代码与答辩冲刺让项目从“能跑”变成“好讲”5.1 代码和论文怎么对齐老师才没话挑有同学把项目做完了论文不知道怎么写原因是代码和论文之间的关系没理清楚。我的经验是先画功能结构图和业务流程图再按流程写论文。功能结构图直接从后端Controller就能梳理出来API路径就是功能点前端路由也能对得上。论文的核心章节要这样对应需求分析对应功能列表数据库设计对应sql里的表结构系统实现对应几个核心功能的代码截图和运行截图。这里千万不要把全部代码贴上去每小节贴3到5行关键代码配合解释说明业务流程就够了。图表一定要用VISIO或者draw.io画干净老师第一眼看的是图表规不规范。5.2 我能额外加的且有效的亮点功能如果你想让项目在答辩时有更多话题我建议加三个轻量级功能不会拖慢开发但非常出彩第一是Excel导出。管理员在后台可以按日期导出兼职发布情况表后端用EasyExcel前端一个导出按钮就搞定。EasyExcel相比POI更简洁内存占用小论文里写“大数据量导出方案”也算一个点。第二是登录验证码。用一个简单的图片验证码接口生成Base64图片返给前端后端把验证码存到Redis或session中。这样项目就多了“图形验证码防机器攻击”的话题。第三是数据统计。用JetService接口去查询用户数量和兼职数量前端用ECharts画柱状图。比如“近30天每日新增兼职数”这个统计数据来自job表的publish_timeSQL只需要一行group by代码量很小但视觉效果和答辩效果都很强。5.3 源码交付与部署别让环境问题毁掉你一个学期的努力如果你要把项目送到老师那里或者放到网上分享一定要有README.md。README要写清楚技术栈、启动步骤、默认账号、目录结构说明。没有README的项目别人拿到之后多半是跑不起来的因为数据库密码和端口都是你自己的。部署上如果老师要求不能只在本机跑你可以把前后端分别打成jar包和静态文件用Nginx做反向代理。后端用mvn package打成jar前端用npm run build产出dist目录再把dist放到nginx的html目录配置一条location规则把/api反向代理到后端8080端口。整个过程半小时能搞定但能让你在答辩时说出“项目已部署到服务器”这个加分项。服务器如果只是想演示用本地虚拟机或者一台阿里云轻量应用服务器都行。注意不要暴露数据库端口只开放80/443安全上会说得更专业。5.4 我在答辩现场被问到最多的问题我给你提前预测几个答辩问题心里有底就不慌。老师可能会问系统有哪些角色你是如何防止学生重复报名同一个兼职的兼职信息的审核流程是怎样的密码是怎么存储的如果用户量大了你怎么优化这些问题其实都不难但你要提前准备好重复报名直接答数据库唯一索引密码存储答BCrypt加盐审核流程按状态机说一遍性能优化答Redis缓存热点数据和MySQL索引优化。这些都是我上面写过的点只要能用自己的话讲出来答辩就非常稳。这个项目给我最大的体会就是毕业设计并不需要堆砌很多高深技术你能把一个常规系统的流程讲清楚、代码写扎实、踩过的坑有记录就已经超过一大片人了。如果你正打算用这套“大学生兼职平台”作为参考建议多花点时间在前面的需求分析和数据库设计上面后面写代码时你会感谢自己当初没有偷懒。
返回列表