潞安化工集团招聘系统项目分析报告
一、项目概况
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 安全隐患
3.2 性能瓶颈
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_id、approval_status)添加数据库索引 |
4.3 代码质量提升
| 改进项 |
优先级 |
实施方案 |
| 删除测试代码 |
低 |
移除PasswordUtil中的main方法 |
| 修复角色判断逻辑 |
高 |
根据roleId字段正确判断用户角色 |
| 统一异常处理 |
中 |
定义全局异常处理器和业务异常类 |
| 参数封装优化 |
中 |
将changePassword的多个参数封装为DTO |
| 常量定义 |
中 |
将魔法数字定义为枚举或常量类 |
4.4 可扩展性增强
| 改进项 |
优先级 |
实施方案 |
| 角色管理模块 |
中 |
抽象角色权限配置,支持动态配置角色权限 |
| 业务配置中心化 |
中 |
将业务配置(如入口类型、审批流程)存入数据库或配置中心 |
| 完善接口文档 |
低 |
补充Swagger注解,生成完整的API文档 |
五、实施优先级建议
| 优先级 |
改进项 |
预期收益 |
| P0-紧急 |
敏感配置加密、Token黑名单持久化 |
消除重大安全隐患 |
| P1-高 |
修复角色判断逻辑、优化N+1查询 |
解决功能缺陷和性能问题 |
| P2-中 |
统一异常处理、流式Excel导出、CORS精细化 |
提升代码质量和系统稳定性 |
| P3-低 |
删除测试代码、完善接口文档、常量定义 |
代码规范化 |
六、总结
6.1 项目优势
- 技术选型合理:采用成熟的Spring Boot + Vue技术栈,社区活跃,文档丰富
- 功能覆盖完整:涵盖招聘流程的核心业务环节
- 安全性基础较好:已实现JWT认证、密码加密等基础安全措施
6.2 主要风险点
- 敏感信息泄露风险:配置文件中的明文密码和密钥
- 业务逻辑缺陷:角色判断逻辑不准确
- 性能隐患:大数据量场景下的内存和查询性能问题
第一个需求
需求描述
新增个接口吧,查询管理员,也就是查询users表中role_id = 0 and status = 1的数据
前端 PageManagerSet.vue 将接口替换一下(axios.get(‘/zhaopinapi/users/admins’, {headers: this.authHeaders(),}))
这个下拉框查询的备选值应该是所有的管理员账号