潞安化工集团招聘系统项目分析报告

一、项目概况

1.1 项目定位与背景

本项目是潞安化工集团招聘网站的技术实现,采用前后端分离架构,用于管理招聘流程中的用户注册、岗位发布、应聘报名、资格审查、考试安排及成绩管理等核心业务。

1.2 技术架构总览

分类 技术栈 版本
后端框架 Spring Boot 3.1.5
数据库 MySQL -
ORM框架 MyBatis Plus 3.5.7
认证方式 JWT 0.11.5
前端框架 Vue.js 2.6.14
UI组件库 Element UI 2.15.14
Java版本 Java 17

1.3 模块划分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
├── 后端模块(luan_recruitment_system-master)
│ ├── controller/ # REST API控制层(30+个控制器)
│ ├── service/ # 业务逻辑层(含接口与实现)
│ ├── mapper/ # 数据访问层
│ ├── entity/ # 数据库实体(40+个实体)
│ ├── dto/ # 数据传输对象
│ ├── config/ # 配置类(安全、数据源、异步等)
│ ├── security/ # 安全相关(JWT过滤器、认证处理)
│ └── utils/ # 工具类(JWT、密码、HTTP等)

└── 前端模块(luan-job-master)
├── components/ # Vue组件(页面级组件)
├── router/ # 路由配置
├── utils/ # 工具函数
└── assets/ # 静态资源

二、技术分析

2.1 架构设计

优点:

  • 采用标准的三层架构(Controller → Service → Mapper),职责清晰
  • 使用MyBatis Plus简化CRUD操作,支持自动分页和逻辑删除
  • Spring Security集成JWT实现无状态认证
  • 前后端分离,接口化交互

不足:

  • 部分Controller存在方法过于庞大的问题(如JobApplicationController超过800行)
  • 缺少统一的异常处理机制
  • 业务逻辑与数据访问耦合度较高

2.2 安全机制分析

认证机制:

  • JWT Token存储在Cookie(reqToKen)或Authorization头中
  • Token黑名单采用内存存储(ConcurrentHashMap
  • 密码使用BCrypt加密

授权机制:

  • 通过roleId字段区分管理员(0/1)和普通用户(2)
  • Spring Security配置了公开API路径白名单

2.3 数据流程

1
2
3
用户请求 → JwtAuthenticationFilter → Controller → Service → Mapper → MySQL
↓ ↓
Token验证 业务逻辑处理 SQL执行

三、问题诊断

3.1 安全隐患

问题类别 严重程度 问题描述 关联文件
密钥硬编码 JWT密钥硬编码在application.yml中,生产环境存在泄露风险 application.yml
CORS配置过松 允许所有来源(*),可能导致CSRF攻击 SecurityConfig.java
默认密码风险 密码重置使用固定默认密码”123456”,易被暴力破解 UserServiceImpl.java
Token黑名单持久化缺失 黑名单存储在内存中,服务重启后失效 TokenBlacklistService.java
敏感配置明文存储 数据库密码、阿里云OCR密钥等敏感信息明文存储 application.yml
手机号验证码登录绕过风险 /auth/mobile/authentication接口仅验证手机号即可获取Token AuthController.java

3.2 性能瓶颈

问题类别 严重程度 问题描述 关联文件
全量数据查询 /job-applications/all接口不分页查询,数据量大时性能差 JobApplicationController.java
N+1查询问题 enrichJobApplicationListMeta方法对每条记录单独查询关联数据 JobApplicationController.java
Excel导出内存消耗 年度导出时先写入临时文件,大数据量可能导致OOM JobApplicationController.java
Token验证性能 每次请求都需解析JWT并查询用户信息 JwtAuthenticationFilter.java

3.3 代码质量问题

问题类别 严重程度 问题描述 关联文件
测试代码残留 PasswordUtil中包含main方法用于测试 PasswordUtil.java
角色判断逻辑缺陷 getUserRole方法仅根据用户名”admin”判断角色,忽略roleId字段 UserServiceImpl.java
异常处理不规范 多处使用RuntimeException作为通用异常,缺少自定义异常体系 多处
方法参数过多 changePassword方法参数使用多个@RequestBody,不符合规范 AuthController.java
魔法数字硬编码 角色ID(0/1/2)、审批状态等魔法数字散落在代码中 多处

3.4 可扩展性问题

问题类别 严重程度 问题描述 关联文件
硬编码角色判断 角色权限判断依赖硬编码的roleId值,新增角色需修改多处代码 UserServiceImpl.java
配置分散 业务配置(如入口类型、审批流程状态)分散在代码中 多处
缺少接口文档 虽然集成了Knife4j,但部分接口缺少完整的Swagger注解 多处Controller

四、改进方案

4.1 安全性改进

改进项 优先级 实施方案
敏感配置加密存储 使用Spring Cloud Config或Vault管理敏感配置,或使用Jasypt加密配置文件
Token黑名单持久化 将黑名单存储到Redis,支持服务集群部署
CORS精细化配置 生产环境限制允许的源域名列表
默认密码策略改进 密码重置时生成随机密码并通过短信/邮件发送
加强验证码校验 /mobile/authentication接口增加验证码校验或频率限制
实现权限注解 自定义@RequiresRole注解,统一权限控制

4.2 性能优化

改进项 优先级 实施方案
优化N+1查询 使用MyBatis Plus的关联查询或批量查询,减少数据库访问次数
流式Excel导出 使用SXSSFWorkbook实现流式写入,避免内存溢出
用户信息缓存 将用户信息缓存到Redis,设置合理过期时间
添加索引 为常用查询字段(如user_idapproval_status)添加数据库索引

4.3 代码质量提升

改进项 优先级 实施方案
删除测试代码 移除PasswordUtil中的main方法
修复角色判断逻辑 根据roleId字段正确判断用户角色
统一异常处理 定义全局异常处理器和业务异常类
参数封装优化 changePassword的多个参数封装为DTO
常量定义 将魔法数字定义为枚举或常量类

4.4 可扩展性增强

改进项 优先级 实施方案
角色管理模块 抽象角色权限配置,支持动态配置角色权限
业务配置中心化 将业务配置(如入口类型、审批流程)存入数据库或配置中心
完善接口文档 补充Swagger注解,生成完整的API文档

五、实施优先级建议

优先级 改进项 预期收益
P0-紧急 敏感配置加密、Token黑名单持久化 消除重大安全隐患
P1-高 修复角色判断逻辑、优化N+1查询 解决功能缺陷和性能问题
P2-中 统一异常处理、流式Excel导出、CORS精细化 提升代码质量和系统稳定性
P3-低 删除测试代码、完善接口文档、常量定义 代码规范化

六、总结

6.1 项目优势

  1. 技术选型合理:采用成熟的Spring Boot + Vue技术栈,社区活跃,文档丰富
  2. 功能覆盖完整:涵盖招聘流程的核心业务环节
  3. 安全性基础较好:已实现JWT认证、密码加密等基础安全措施

6.2 主要风险点

  1. 敏感信息泄露风险:配置文件中的明文密码和密钥
  2. 业务逻辑缺陷:角色判断逻辑不准确
  3. 性能隐患:大数据量场景下的内存和查询性能问题

第一个需求

需求描述

新增个接口吧,查询管理员,也就是查询users表中role_id = 0 and status = 1的数据
前端 PageManagerSet.vue 将接口替换一下(axios.get(‘/zhaopinapi/users/admins’, {headers: this.authHeaders(),}))
这个下拉框查询的备选值应该是所有的管理员账号