SpringBoot校园招聘平台:前后端分离架构设计与核心模块实现
本文介绍一套采用SpringBoot作为后端服务框架、Vue3配合ElementPlus构建前端界面、MySQL8.0持久化数据的高校人才招聘系统。系统支持学生求职端、企业招聘端与平台管理后台三大业务场景,实现简历投递、职位发布、面试邀约等核心招聘流程的数字化管理。
技术架构选型
后端服务层选用SpringBoot 2.7.x快速搭建RESTful API,整合MyBatis-Plus简化数据访问层编码;前端采用Vue3组合式API配合ElementPlus组件库,通过Axios实现与服务端的异步通信;数据库使用MySQL8.0,利用InnoDB引擎保障事务一致性。
核心实体关系设计
系统围绕用户中心展开,区分求职者(ROLE_SEEKER)与招聘方(ROLE_RECRUITER)两种身份。关键关联包括:用户与简历的一对一映射、企业与职位的一对多关联、简历与职位的多对多投递关系。删除用户时需级联清理其附属数据,包括工作经历、项目经验、教育背景、作品集及期望职位等扩展信息。
企业资质审核模块
企业入驻平台需经过人工审核流程,管理员可对企业认证状态进行变更操作:
@RestController
@RequestMapping("/api/v1/enterprise")
public class EnterpriseAuditController {
@Autowired
private EnterpriseService enterpriseService;
@PostMapping("/audit")
public ResponseEntity<Result<Boolean>> auditEnterprise(
@RequestBody @Valid AuditDTO auditDTO) {
if (auditDTO.getEnterpriseId() == null) {
return ResponseEntity.badRequest()
.body(Result.fail(ErrorCode.PARAM_INVALID));
}
Enterprise entity = enterpriseService.getById(auditDTO.getEnterpriseId());
if (entity == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Result.fail(ErrorCode.ENTERPRISE_NOT_FOUND));
}
entity.setAuditStatus(auditDTO.getStatus());
entity.setAuditRemark(auditDTO.getRemark());
entity.setAuditTime(LocalDateTime.now());
boolean updated = enterpriseService.updateById(entity);
return updated ? ResponseEntity.ok(Result.success(true))
: ResponseEntity.internalServerError()
.body(Result.fail(ErrorCode.OPERATION_FAILED));
}
}
用户数据级联清理
由于用户关联多张扩展信息表,删除操作需保证事务原子性,避免脏数据残留:
@Service
@Transactional(rollbackFor = Exception.class)
public class UserLifecycleService {
@Autowired private UserMapper userMapper;
@Autowired private ResumeMapper resumeMapper;
@Autowired private ExperienceMapper experienceMapper;
@Autowired private EducationMapper educationMapper;
@Autowired private PortfolioMapper portfolioMapper;
@Autowired private ExpectationMapper expectationMapper;
@Autowired private EnterpriseMapper enterpriseMapper;
@Autowired private PositionMapper positionMapper;
public void terminateUserAccount(Long userId) {
User user = userMapper.selectById(userId);
if (user == null) return;
// 清理求职者附属数据
resumeMapper.deleteByUserId(userId);
experienceMapper.deleteByUserId(userId);
educationMapper.deleteByUserId(userId);
portfolioMapper.deleteByUserId(userId);
expectationMapper.deleteByUserId(userId);
// 若为企业账号,需清理企业相关数据
if (UserType.RECRUITER.equals(user.getUserType())) {
Enterprise enterprise = enterpriseMapper.selectByUserId(userId);
if (enterprise != null) {
// 删除企业下所有职位
positionMapper.deleteByEnterpriseId(enterprise.getId());
// 删除收到的所有简历投递
resumeMapper.deleteByEnterpriseId(enterprise.getId());
enterpriseMapper.deleteById(enterprise.getId());
}
}
userMapper.deleteById(userId);
}
}
管理员信息维护
后台管理员信息更新采用属性拷贝策略,保护敏感字段不被覆盖:
@PatchMapping("/{adminId}")
public ResponseEntity<Result<Void>> modifyAdmin(
@PathVariable Long adminId,
@RequestBody @Valid AdminUpdateDTO dto) {
if (adminId == null || adminId <= 0) {
return ResponseEntity.badRequest()
.body(Result.fail(ErrorCode.ID_EMPTY));
}
Admin existAdmin = adminService.getById(adminId);
if (existAdmin == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Result.fail(ErrorCode.ADMIN_NOT_EXIST));
}
// 仅拷贝允许修改的字段,忽略id、创建时间、密码等敏感属性
BeanUtils.copyProperties(dto, existAdmin,
"id", "createTime", "updateTime", "password", "salt");
existAdmin.setUpdateTime(LocalDateTime.now());
boolean success = adminService.updateById(existAdmin);
return success ? ResponseEntity.ok(Result.success())
: ResponseEntity.internalServerError()
.body(Result.fail(ErrorCode.UPDATE_FAILURE));
}
分页数据查询优化
后台列表查询采用MyBatis-Plus分页插件,统一封装响应结构:
@GetMapping("/list")
public ResponseEntity<Map<String, Object>> queryUserPage(
@RequestParam(defaultValue = "1") Integer current,
@RequestParam(defaultValue = "10") Integer size) {
Page<User> pageParam = new Page<>(current, size);
Page<User> resultPage = userService.page(pageParam);
Map<String, Object> response = new HashMap<>(2);
response.put("records", resultPage.getRecords());
response.put("total", resultPage.getTotal());
return ResponseEntity.ok(response);
}
环境配置与启动
项目采用Maven多模块结构,启动前需完成以下配置:
- 创建MySQL数据库并导入初始化脚本
- 修改
application-dev.yml中的数据源配置 - 安装Node依赖并启动前端服务:
npm install && npm run dev - 启动SpringBoot应用,默认服务端口8080
访问入口:前台http://localhost:8080,管理后台http://localhost:8080/admin