ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Spring Boot简历系统实战:前后端分离与自动装配解析

Spring Boot简历系统实战:前后端分离与自动装配解析 简介基于Spring Boot的简历系统是一套可直接运行的Java毕业设计源码面向需要完成课程设计、毕设项目或Spring Boot实战练习的开发者。系统采用Java、Spring Boot、MySQL 5.7和Tomcat 7开发配合Vue、JavaScript、HTML、CSS等前端技术实现了管理员、注册用户和前台访客三类角色的完整业务闭环。后台功能包括首页、个人中心、用户管理、简历模板管理、模板类型管理、招聘会管理、报名招聘管理、简历上传管理、求职论坛、我的收藏管理和系统管理用户端支持报名招聘、简历上传与收藏管理前台首页提供简历模板、招聘会、简历上传、求职论坛、系统公告和在线客服等模块。资源包约20.76MB总共809个文件以Java源码、Vue组件、HTML页面、JS/CSS样式、SVG图标为主另含SQL数据库脚本、Maven工程配置、安装/启动/构建批处理脚本等下载后按说明导入即可运行。已有233人学习下载资料目录清晰、功能划分明确适合作为毕业设计参考或简历系统二次开发也是理解Spring Boot与Vue前后台交互逻辑的实践样例。1. 基于 Spring Boot 的简历系统一包能跑起来的前后端代码简历系统这种题目几乎被毕业设计做烂了但你下载到的源码有多少能一次跑起来这套基于 Spring Boot 的简历系统文件里保留了 1-install.bat、2-run.bat、3-build.bat 和一堆 .vue.bak说明原作者是在真实环境里反复装过依赖、起过服务、改过 Vue 页面才提交的。后端是 Spring Boot MySQL 5.7 JDK 1.8前端是 Vue 管理后台覆盖管理员、用户和游客三种视角业务上把简历模板、简历上传、招聘会报名、求职论坛和系统公告串成了一条完整的求职链路。如果你正在找 Spring Boot 毕业设计或者想把一个前后端分离项目改成自己的实战项目这个包比空壳 demo 强在保留了构建脚本和备份页面能直接看出接口、菜单和页面是怎么接起来的。看这套源码我的建议是先别急着跑先拆目录和配置把依赖版本和数据库连接理清楚再动业务否则很容易在第一轮编译就卡住。2. 先看 Spring Boot 自动装配和 Maven 结构再谈简历业务2.1 自动装配到底装了什么为什么 Controller 不用 new第一次打开这个项目的人通常会问为什么写了 RestController 就能直接接收 /resumeTemplate 请求到底谁在创建这些 Bean这就是 Spring Boot 自动装配在做的事。SpringBootApplication 由 ComponentScan、EnableAutoConfiguration 和 SpringBootConfiguration 三个注解组合而成。EnableAutoConfiguration 会读取 spring.factories 里的 AutoConfiguration 类根据 classpath 下引入的依赖来决定要不要创建对应的 Bean。比如引入 spring-boot-starter-web 后DispatcherServlet、Jackson 序列化器和内嵌 Tomcat 就会被自动配置引入 mybatis-spring-boot-starter 后SqlSessionFactory 和 MapperScannerConfigurer 也会自动注册。这个机制的好处是你不用像 SSM 时代那样手写一堆 applicationContext.xml。但这个项目是 JDK 1.8 的环境如果图新鲜把 Spring Boot 升到 3.x自动装配依然存在但底层改用 Jakarta EEjavax.servlet 全部变成 jakarta.servlet旧代码的 import 和 tomcat 7 的部署方式都会直接失效。所以我一般会提醒拿到这种资源的人JDK 1.8 配 Spring Boot 2.7.x 是最后能匹配的稳定分支别用太高的版本去跑旧项目不然第一步编译就过不去。2.2 项目目录里的 Maven 文件和分层模块这是一个典型的前后端分目录的 Spring Boot Maven 项目。后端根目录下可以看到 .classpath 和 mvnw.cmd前者是 Eclipse 的项目描述文件说明原项目用 Eclipse 或 MyEclipse 打开过后者是 Maven Wrapper它会在没有安装 Maven 的机器上自动下载指定版本的 Maven保证构建环境一致。项目输入的 Maven 版本是 3.3.9这个版本对 JDK9 以上支持不好如果你本地装的是高版本 JDK建议直接用 mvnw.cmd 或者像我一样换 3.6.3。后端主代码按 Spring Boot 习惯分层前端源码放在独立目录里由 npm 管理依赖。下面是这份资源对应的常见目录结构resume-system/ ├── .classpath ├── mvnw.cmd ├── pom.xml ├── src/main/java/com/example/resume/ │ ├── ResumeApplication.java │ ├── controller/ # 前后台接口入口 │ ├── service/ # 业务逻辑 │ ├── mapper/ # MyBatis 数据访问接口 │ ├── entity/ # 数据库实体 │ └── config/ # 拦截器、文件上传、跨域配置 ├── src/main/resources/ │ ├── application.yml │ ├── mapper/ # MyBatis XML 映射 │ └── static/ # 打包后的 Vue 静态文件 └── resume-web/ # 前端 Vue 工程后台路由把管理员操作拆成了用户管理、简历模板管理、模板类型管理、招聘会管理、报名招聘管理、简历上传管理、求职论坛、我的收藏管理和系统管理整体和菜单插件一一对应。很多人会把 Controller 写成几百行的业务代码这个项目里更接近标准的三层结构Controller 只做参数接收和返回结果Service 处理招聘会报名、简历模板分类这些规则Mapper 负责 SQL。如果以后要改功能比如给简历模板加标签分类只需要动 Service 和对应 XML不需要动接口。注意我看到毕业设计里最常见的坏味道是直接在 Controller 里 new Service正确做法是通过构造器注入或 Autowired 注入保持 Spring 容器的单例管理。分层或文件职责这个项目里对应的典型内容Controller接收 HTTP 请求做参数校验与响应封装ResumeTemplateController、JobFairControllerService业务逻辑如报名查重、模板分类ResumeTemplateService、JobFairServiceMapper与 MySQL 5.7 交互的接口配合 XML SQLResumeTemplateMapper.java ResumeTemplateMapper.xmlentity与表结构对应的 POJOResumeTemplate、User、JobFairconfig跨域、拦截器、文件上传路径WebMvcConfig、UploadConfigmvnw.cmd锁定 Maven 版本Windows 下直接 .\mvnw.cmd clean package无需额外安装 Maven2.3 application.yml 配置数据库、上传大小和时区后端能跑起来一半靠 application.yml 里的参数不出错。这个项目数据库是 MySQL 5.7用 Navicat 11 导入 SQL 时要注意字符集选 utf8mb4否则中文简历内容容易乱码。常见的配置片段是这样server: port: 8080 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/resume_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 servlet: multipart: max-file-size: 10MB max-request-size: 50MB mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.resume.entity logging: level: com.example.resume.mapper: debug其中 driver-class-name 用的还是 com.mysql.jdbc.Driver这是 MySQL 5.x 时代的写法。如果换成 MySQL 8.0要改成 com.mysql.cj.jdbc.DriverURL 后面最好加 serverTimezone否则 JDBC 会报时间区错误。spring.servlet.multipart 决定简历附件最大能传多大默认只有 1MB这个项目要上传 PDF 或 Word必须把 max-file-size 撑大。mybatis.mapper-locations 指向 XML 文件的位置如果你把 Mapper 接口和 XML 放在不同包这里漏配置启动不会立刻报错但一调用查询就报 Invalid bound statement。另外我习惯把 SQL 日志打开就是 logging.level 里的 debug这样可以看到 MyBatis 实际执行的 SQL排查 N1 查询也方便。注意密码不要带特殊字符如 # 或 YAML 里会被误解析改用引号包裹或者放到环境变量里。3. 简历模板到报名招聘核心链路的 Controller 与上传实战3.1 表和接口先对齐简历模板与招聘会的关系简历系统里的核心数据链很简单用户注册后选择简历模板上传简历文件再对招聘会报名最后在求职论坛发言。在动手改业务之前先把表关系理清。简历模板表的典型结构如下CREATE TABLE resume_template ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(64) NOT NULL COMMENT 模板名称, type_id int(11) DEFAULT NULL COMMENT 模板类型id, cover_url varchar(255) DEFAULT NULL COMMENT 预览图, file_url varchar(255) DEFAULT NULL COMMENT 模板下载地址, status tinyint(1) DEFAULT 1 COMMENT 1上架 0下架, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;管理员维护 resume_template 表用户在表里挑选模板招聘会报名表则一般设计成 job_fair apply_record 两个表apply_record 保存 user_id、job_fair_id 和报名时间。接口按资源命名前后端好对接请求方式路径角色说明GET/resumeTemplate/page?page1limit10游客/用户分页查询上架模板POST/resumeTemplate管理员新增或修改模板PUT/resumeTemplate/status/{id}管理员上下架POST/resume/upload用户上传简历文件POST/jobFair/apply用户报名招聘会GET/post/list游客求职论坛帖子列表3.2 Controller 怎么写常用注解和参数绑定下面是一个符合这个项目风格的 ResumeTemplateController包含了分页查询和新增模板两个常用动作。注意类上叠加的注解这是 Spring Boot 常用注解里最容易考到的一组组合。RestController RequestMapping(/resumeTemplate) public class ResumeTemplateController { Autowired private ResumeTemplateService resumeTemplateService; GetMapping(/page) public MapString, Object page( RequestParam(defaultValue 1) int page, RequestParam(defaultValue 10) int limit, RequestParam(required false) String name) { // 分页查询name是模糊搜索条件可为空 return resumeTemplateService.pageList(page, limit, name); } PostMapping public int save(RequestBody ResumeTemplate template) { // update或insert由id是否为null决定 return resumeTemplateService.save(template); } }RestController 是 Controller ResponseBody 的组合方法返回的对象会被 Jackson 自动序列化成 JSON所以页面拿到的是 { code: 200, data: [...] } 这样的结构。RequestParam 绑定 URL 查询参数defaultValue 设置默认页码required false 表示模糊搜索条件可空。RequestBody 则是把前端 Post 过来的 JSON 反序列化成 ResumeTemplate 对象省去手动 JSONObject.get 的过程。要注意的是RequestBody 只能有一个而且请求头 Content-Type 必须是 application/json如果你用 Postman 测试时选了 form-data这里会一直报 HttpMessageNotReadableException。实际项目里我不会把 Map 当返回值至少会套一个统一结果类比如 common.Result包含 code、msg、data 三个字段。这样前端 axios 拦截器可以根据 code 统一跳转登录而不是写一堆 if。你改造这个毕设时第一件事可以加一个 Result 类把所有 Controller 返回类型改掉。3.3 简历上传MultipartFile 接收、校验和重命名简历上传是用户端最核心的提交动作坑也最多。Controller 方法直接接收 MultipartFile配合一个保存目录的配置类。RestController RequestMapping(/resume) public class ResumeUploadController { Value(${resume.upload-dir}) private String uploadDir; PostMapping(/upload) public String upload(RequestParam(file) MultipartFile file) throws IOException { if (file.isEmpty()) { return 文件为空; } String originalFilename file.getOriginalFilename(); // 只允许pdf、doc、docx避免上传可执行文件 String ext originalFilename.substring(originalFilename.lastIndexOf(.) 1).toLowerCase(); if (!Arrays.asList(pdf, doc, docx).contains(ext)) { return 仅支持pdf/doc/docx; } // 用uuid重命名防止中文名和重名覆盖 String newName UUID.randomUUID().toString().replace(-, ) . ext; File dest new File(uploadDir, newName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); return newName; } }上传逻辑有三个关键点第一file.isEmpty() 要放在最前面否则你会在后续 substring 时空指针第二文件名后缀必须校验我见过有项目直接把原文件名存到服务器导致路径穿越漏洞第三用 UUID 或时间戳重命名避免两个用户都上传 简历.pdf 互相覆盖。上传目录可以单独配置在 application.yml 里resume: upload-dir: D:/upload/resume这里有个常见坑Spring Boot 默认上传大小限制是 1MB如果前端一传 PDF 就提示 MaxUploadSizeExceededException需要回到 2.3 节里的 spring.servlet.multipart.max-file-size 改大。另外transferTo(path) 是临时文件搬移如果 dest 的目录不存在某些环境下会抛 FileNotFoundException所以先 mkdirs 再做 transferTo 更稳。提示招聘会报名接口的查重不要只靠前端隐藏按钮Service 层要先 count 一次 user_id job_fair_id 是否存在再决定是否 insert或者直接在 apply_record 表加联合唯一索引双保险。4. 前端 Vue 管理后台与 Spring Boot 对接从 .vue.bak 到代理4.1 管理后台的页面组成和 .bak 恢复办法这套系统的前端管理后台是一套典型的 Vue Element 风格页面。从项目文件里也能看出端倪IndexAsideStatic.vue 是左侧静态菜单BreadCrumbs.vue 是面包屑导航IndexHeader.vue 是顶部头部update-password.vue 是修改密码弹窗index.html.bak 则是最外层 HTML 的备份文件通常里面引用了打包后的 JS/CSS也是排查页面白屏要看的入口。之所以带着 .bak是作者改前备份的习惯万一改坏了直接把 .bak 覆盖回 .vue 文件就行copy update-password.vue.bak update-password.vue这些 .vue.bak 文件本身没有被构建工具引用所以编译时会忽略不影响打包结果。你用 IDEA 创建 Spring Boot 项目时通常不会自动生成前端工程这个项目把前端独立成目录管理起来更清晰。如果哪天菜单加不上了先改 IndexAsideStatic.vue 里的 el-menu-item再在路由表里注册对应组件两步缺一不可不然点击菜单只报 404。4.2 开发环境下跨域怎么解决vue.config.js 代理前端开发服务器一般跑在 8081后端 Spring Boot 跑在 8080不同端口下直接 fetch 必然触发跨域。最省事的做法不是在后端写 CrossOrigin而是配 vue.config.js 的 devServer.proxy。module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } };这个配置的意思是前端请求 /api/resumeTemplate/page 时开发服务器会把它转发到 http://localhost:8080/resumeTemplate/page同时响应头里的 origin 保持为 8081从而骗过浏览器跨域校验。pathRewrite 里的 ^/api 是把前缀剥掉后端 Controller 里就不用额外加 /api 前缀。如果你改了 target 端口记得两边要一致否则控制台出现代理 404你还在疯狂排查后端接口为什么 404。4.3 1-install、2-run、3-build构建脚本到底做了什么三个 bat 文件是 Windows 下的前后端构建顺序我拆开常见的写法给你看:: 1-install.bat 第一次拉代码后执行装依赖 cd resume-web call npm install cd .. mvn install -DskipTests pause:: 2-run.bat 本地开发只需要起后端前端用 npm run serve mvn spring-boot:run pause:: 3-build.bat 上线前打包后端连带前端一起打 cd resume-web call npm run build cd .. mvn clean package -DskipTests pause表格里对应关系是这样脚本阶段作用失败时看什么1-install.bat初始化安装 Maven 依赖和 npm 依赖看控制台 ERR!优先换 npm 镜像2-run.bat开发启动 Spring Boot 开发服务器看端口是否被占用8080 冲突则改 server.port3-build.bat构建构建前端静态文件并打包后端 jar/war看是否缺少 node、maven 环境变量这套流程保证换一台机器也能按顺序复现。注意 mvn install -DskipTests 会在本地仓库生成构建缓存如果项目改了依赖版本要加 -U 强制刷新npm install 偶尔会因为网络失败设置 registry 为国内镜像就能解决。5. 从部署到进阶war/jar 选择和定时清理临时简历5.1 用 jar 还是 war先看要不要外部 Tomcat这个资源在摘要里写了服务器 tomcat7那原项目大概率是打 war 包丢进 Tomcat 的 webapps 下部署。如果你想让 Spring Boot 自动管理容器打成 jar 用 java -jar 跑就不用额外装 Tomcat。两种方式命令差别不大mvn clean package -DskipTests java -jar target/resume-0.0.1-SNAPSHOT.jar方式适用场景注意点jar独立部署、Docker、云主机内嵌 TomcatJDK1.8 要配 Spring Boot 2.xwar已有 tomcat7 统一管理需要继承 SpringBootServletInitializer并且外置 Tomcat 和项目 JDK 版本一致如果你用 IDEA 创建 Spring Boot 项目默认就是 jar要打 war 还得改 pom 的 packaging并在启动类里重写 configure。这个项目既然保留 tomcat7说明本地环境和生产环境已经按 war 验证过你想改成 jar 也不难但要注意上传文件路径和 MySQL 驱动在两种方式下没有区别。5.2 进阶技巧用 Scheduled 定时清理过期简历用户上传的简历积压在 D:/upload/resume 里时间长了全是垃圾文件。Spring Boot 的定时任务只需要三步启动类加 EnableScheduling在方法上标 Scheduled配置 cron 表达式。Component public class ResumeCleanTask { Scheduled(cron 0 0 2 * * ?) public void cleanExpiredFiles() { File dir new File(D:/upload/resume); File[] files dir.listFiles(); if (files null) return; long threshold System.currentTimeMillis() - 7 * 24 * 3600 * 1000L; for (File f : files) { // 超过7天未修改的文件直接删除 if (f.lastModified() threshold) { f.delete(); } } } }cron 0 0 2 * * ? 表示每天凌晨2点触发。这个任务可以配合日志一起做删除前打印文件名统计清理数量避免误删。注意最后那个 ? 是 Spring 对星期字段的特殊写法和 Linux crontab 里 * 的含义略有不同面试时经常被问。你还可以把上传目录、保留天数抽到配置里用 ConfigurationProperties 管理这样清理策略不用改代码。接下来如果你想把这套系统用于实战我建议优先加两个东西一是拦截器里校验登录 token二是给上传的简历文件加一个下载鉴权接口而不是把文件直接暴露在 static 目录下。改完这两点这个毕设简历系统在功能完整性上就已经超过大部分课程设计了。本文还有配套的精品资源点击获取
返回列表