1. 项目概述与技术栈选型
这个基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的大学生就业招聘系统,是一个典型的Java Web全栈项目。作为高校信息化建设的重要组成部分,这类系统需要同时满足企业招聘需求和毕业生求职需求的双向匹配功能。
技术栈选择上,我们采用了目前企业级开发中最主流的组合:
- 后端:SpringBoot 2.7.3 + MyBatis-Plus 3.5.3.1
- 前端:Vue 3.2 + Element Plus 2.3
- 数据库:MySQL 8.0.28
- 构建工具:Maven 3.8 + Node.js 16.14
提示:MyBatis-Plus 3.5.x版本与SpringBoot 2.7.x有最佳兼容性,这也是当前生产环境最稳定的组合方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统核心功能模块设计
2.1 用户权限体系
采用RBAC模型实现四类用户角色:
- 超级管理员:system_admin
- 院校管理员:college_admin
- 企业用户:company_user
- 学生用户:student_user
权限控制通过Spring Security + JWT实现,前端路由动态生成。特别要注意的是企业用户和学生用户的权限隔离,这是招聘系统的核心安全要求。
2.2 简历管理模块
学生用户可以:
- 创建多份简历模板
- 设置默认简历
- 导出PDF格式简历
- 查看投递记录
技术实现要点:
java复制// MyBatis-Plus实现动态字段查询
@TableField(exist = false)
private List<EducationExperience> eduList;
// 使用LambdaQueryWrapper构建复杂查询
LambdaQueryWrapper<Resume> wrapper = Wrappers.lambdaQuery();
wrapper.eq(Resume::getStudentId, currentUserId)
.orderByDesc(Resume::getIsDefault);
2.3 职位发布与搜索
企业用户可以:
- 发布/下架职位
- 设置职位筛选条件
- 查看简历投递情况
采用Elasticsearch实现全文检索,配合Vue3的Composition API实现动态筛选:
javascript复制// Vue3组合式API实现筛选逻辑
const filterJobs = computed(() => {
return allJobs.value.filter(job =>
job.salary >= salaryRange.value[0] &&
job.salary <= salaryRange.value[1]
)
})
3. 关键技术实现细节
3.1 前后端分离架构
采用Nginx反向代理,配置示例:
code复制server {
listen 80;
server_name career.example.com;
location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}
3.2 MyBatis-Plus高级应用
- 自动分页实现:
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 逻辑删除配置:
yaml复制mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
3.3 Vue3性能优化
- 组件按需加载:
javascript复制const CompanyDetail = defineAsyncComponent(() =>
import('./views/CompanyDetail.vue')
)
- 使用Teleport优化模态框:
html复制<teleport to="body">
<div class="modal-mask" v-show="showModal">
<!-- 模态框内容 -->
</div>
</teleport>
4. 数据库设计与优化
4.1 核心表结构
| 表名 | 主要字段 | 索引设计 |
|---|---|---|
| t_user | user_id, username, password, role_type | 唯一索引(username) |
| t_resume | resume_id, student_id, resume_name, is_default | 联合索引(student_id, is_default) |
| t_position | position_id, company_id, title, salary_min, salary_max | 全文索引(title, description) |
| t_apply | apply_id, position_id, resume_id, status | 联合索引(position_id, status) |
4.2 MySQL8.0特性应用
- 窗口函数实现数据分析:
sql复制SELECT
company_id,
COUNT(*) OVER(PARTITION BY company_id) as position_count,
AVG(salary_max) OVER(PARTITION BY company_id) as avg_salary
FROM t_position
- JSON字段存储动态属性:
java复制// 实体类定义
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject extendInfo;
5. 部署与运维方案
5.1 多环境配置
使用Spring Profile实现:
yaml复制# application-dev.yml
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost:3306/career_dev
5.2 Docker部署方案
- MySQL8.0容器:
bash复制docker run --name mysql8 \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-e MYSQL_DATABASE=career_system \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-d mysql:8.0.28 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
- SpringBoot应用容器:
dockerfile复制FROM openjdk:17-jdk
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
6. 常见问题排查指南
6.1 MyBatis-Plus分页失效
症状:分页查询返回所有记录
排查步骤:
- 检查是否添加了分页拦截器
- 确认Page参数正确传递
- 检查SQL中是否有ORDER BY导致优化器忽略分页
6.2 Vue3响应式丢失
典型场景:
javascript复制// 错误写法
const filter = {
keyword: '',
salaryRange: [0, 20000]
}
// 正确写法
const filter = reactive({
keyword: '',
salaryRange: [0, 20000]
})
6.3 MySQL8.0连接问题
常见错误:Public Key Retrieval is not allowed
解决方案:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/career?allowPublicKeyRetrieval=true&useSSL=false
7. 项目二次开发建议
- 增加OAuth2.0第三方登录(微信、钉钉)
- 集成WebSocket实现实时消息通知
- 使用Redis缓存热门职位数据
- 添加Admin监控端点(SpringBoot Actuator)
- 实现简历智能匹配算法(TF-IDF或BERT)
对于教学用途,建议从简化版开始:
- 先实现基础CRUD功能
- 再添加权限控制
- 最后做性能优化和高级功能
我在实际开发中发现,MyBatis-Plus的ActiveRecord模式特别适合快速原型开发:
java复制// 学生查看自己简历的示例
List<Resume> myResumes = new LambdaQueryChainWrapper<>(resumeMapper)
.eq(Resume::getStudentId, currentUser.getId())
.list();
