系统需求分析
在设计任何系统之前,首先要明确它需要做什么,一个典型的人力资源管理系统通常包含以下核心模块:

(图片来源网络,侵删)
-
员工信息管理
- 员工档案的增、删、改、查。
- 员工信息的详细字段:工号、姓名、性别、出生日期、身份证号、联系电话、邮箱、入职日期、部门、职位、合同信息、教育背景、工作经历等。
- 员工信息导入/导出(如 Excel)。
- 员工搜索与筛选(按姓名、部门、职位等)。
-
组织架构管理
- 公司部门、职位的层级结构管理。
- 树形展示部门结构。
- 添加、修改、删除部门和职位。
-
考勤管理
- 员工打卡记录(签到、签退)。
- 请假申请与审批流程。
- 加班记录与申请。
- 生成月度/季度考勤报表。
-
薪酬福利管理
(图片来源网络,侵删)- 薪资结构定义(基本工资、绩效、奖金、补贴、扣款等)。
- 月度/年度薪资核算。
- 薪资条生成与发放。
- 社保、公积金管理。
-
绩效管理
- 绩效考核目标设定。
- 绩效评估流程(自评、上级评、跨部门评等)。
- 绩效结果记录与分析。
-
招聘管理
- 职位发布与管理。
- 简历收集与筛选。
- 面试安排与反馈。
- 录用管理。
-
系统与权限管理
- 用户管理(员工、HR、管理员)。
- 角色与权限分配(RBAC - 基于角色的访问控制)。
- 操作日志记录。
技术选型
对于一个现代化的 Java Web 应用,主流且成熟的技术栈如下:

(图片来源网络,侵删)
| 层面 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Vue.js / React / Angular | 现代化的前端框架,提供优秀的用户交互体验,推荐 Vue.js,上手快,生态完善,UI 库可以使用 Element Plus, Ant Design 等。 |
| 后端 | Spring Boot | 简化 Spring 应用的初始搭建和开发过程,是当前 Java Web 开发的绝对主流。 |
| Spring MVC | 用于处理 Web 请求和响应,是 Spring Boot 的核心部分。 | |
| Spring Data JPA / MyBatis-Plus | 持久层框架,JPA 简化数据库操作,MyBatis-Plus 在 MyBatis 基础上提供了更强大的 CRUD 功能,推荐 MyBatis-Plus,灵活性更高。 | |
| Spring Security | 用于实现认证和授权(登录、权限控制)。 | |
| 数据库 | MySQL / PostgreSQL | 关系型数据库,适合存储结构化的 HR 数据,MySQL 最常用,PostgreSQL 功能更强大。 |
| 缓存 | Redis | 用于缓存热点数据(如用户信息、权限菜单),减轻数据库压力,提高系统性能。 |
| 构建工具 | Maven / Gradle | 项目管理和构建工具,Maven 更普及,Gradle 在构建速度和灵活性上更优。 |
| 部署 | Docker + Nginx | 容器化部署,简化环境配置和服务器运维,Nginx 作为反向代理和静态资源服务器。 |
系统架构设计
采用经典的 分层架构,使代码结构清晰,职责分明。
+--------------------------------------------------+
| Presentation Layer | (前端: Vue.js)
|--------------------------------------------------|
| API Gateway / Nginx | (反向代理, 负载均衡)
+--------------------------------------------------+
| Business Logic Layer | (后端: Spring Boot)
|--------------------------------------------------|
| - Controller (控制层) |
| - Service (业务逻辑层) |
| - Manager (业务管理层, 可选) |
|--------------------------------------------------|
| Persistence Layer | (持久层)
|--------------------------------------------------|
| - Repository / Mapper (数据访问层) |
|--------------------------------------------------|
| Database | (数据库: MySQL)
+--------------------------------------------------+
| Cache | (缓存: Redis)
+--------------------------------------------------+
各层职责:
- Controller (控制层):负责接收 HTTP 请求,调用 Service 层处理业务,并返回响应(通常是 JSON 格式)。
- Service (业务逻辑层):实现核心业务逻辑。“计算薪资”的逻辑就在这里,它调用 DAO 层来获取和持久化数据。
- DAO / Mapper (数据访问层):负责与数据库进行交互,执行增删改查操作,使用 MyBatis-Plus 可以大大简化这部分代码。
- Entity / Model (实体层):与数据库表结构一一对应的 Java 类。
- DTO (Data Transfer Object):用于在 Controller 和 Service 之间传输数据,可以隐藏 Entity 的敏感字段或组合多个 Entity 的数据。
核心模块实现示例 (Spring Boot + MyBatis-Plus)
我们以最核心的 员工信息管理 模块为例,展示具体的代码实现。
步骤 1: 创建 Spring Boot 项目
使用 Spring Initializr (https://start.spring.io/) 快速创建项目,并勾选以下依赖:
- Spring Web
- Spring Data JPA (或 MyBatis-Plus)
- MySQL Driver
- Lombok (简化 getter/setter)
- Spring Security (可选,先从基础开始)
步骤 2: 配置 application.yml
server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/hrms_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: your_password
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
# MyBatis-Plus 配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名转换
global-config:
db-config:
id-type: auto # 主键自增
步骤 3: 数据库表设计
创建 employee 表。
CREATE TABLE `employee` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', `employee_id` varchar(20) NOT NULL COMMENT '员工工号', `name` varchar(50) NOT NULL COMMENT '姓名', `gender` tinyint(1) DEFAULT NULL COMMENT '性别 0-女 1-男', `birth_date` date DEFAULT NULL COMMENT '出生日期', `id_card` varchar(18) DEFAULT NULL COMMENT '身份证号', `phone` varchar(20) DEFAULT NULL COMMENT '联系电话', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `hire_date` date NOT NULL COMMENT '入职日期', `department_id` bigint DEFAULT NULL COMMENT '部门ID', `position_id` bigint DEFAULT NULL COMMENT '职位ID', `status` tinyint(1) DEFAULT '1' COMMENT '状态 0-离职 1-在职', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_employee_id` (`employee_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工信息表';
步骤 4: 编写实体类
// Employee.java
package com.example.hrms.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDate;
@Data
@TableName("employee")
public class Employee {
@TableId(type = IdType.AUTO)
private Long id;
private String employeeId;
private String name;
private Integer gender; // 0: Female, 1: Male
private LocalDate birthDate;
private String idCard;
private String phone;
private String email;
private LocalDate hireDate;
private Long departmentId;
private Long positionId;
private Integer status; // 0: Left, 1: Active
}
步骤 5: 编写 Mapper 接口
// EmployeeMapper.java
package com.example.hrms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.hrms.entity.Employee;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
// MyBatis-Plus 已经提供了基础的 CRUD 方法,无需再写
// 如果有复杂查询,可以在这里定义方法或使用 XML 文件
}
步骤 6: 编写 Service 层
// EmployeeService.java (接口)
package com.example.hrms.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.hrms.entity.Employee;
public interface EmployeeService extends IService<Employee> {
// 可以在这里定义自定义的业务方法,
// void addEmployee(Employee employee);
// void updateEmployee(Employee employee);
}
// EmployeeServiceImpl.java (实现)
package com.example.hrms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.hrms.entity.Employee;
import com.example.hrms.mapper.EmployeeMapper;
import com.example.hrms.service.EmployeeService;
import org.springframework.stereotype.Service;
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
// ServiceImpl 已经提供了 IService 中定义的默认实现,
// 我们可以直接使用,也可以在这里覆盖或扩展
}
步骤 7: 编写 Controller 层
// EmployeeController.java
package com.example.hrms.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.hrms.entity.Employee;
import com.example.hrms.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/api/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// 获取员工列表 (分页)
@GetMapping
public Object listEmployees(@RequestParam(defaultValue = "1") int current,
@RequestParam(defaultValue = "10") int size) {
Page<Employee> page = new Page<>(current, size);
return employeeService.page(page);
}
// 根据 ID 获取员工详情
@GetMapping("/{id}")
public Object getEmployeeById(@PathVariable Long id) {
return employeeService.getById(id);
}
// 添加新员工
@PostMapping
public boolean addEmployee(@RequestBody Employee employee) {
// 业务逻辑:生成工号、校验数据等
// employee.setEmployeeId("EMP" + System.currentTimeMillis());
return employeeService.save(employee);
}
// 更新员工信息
@PutMapping("/{id}")
public boolean updateEmployee(@PathVariable Long id, @RequestBody Employee employee) {
employee.setId(id);
return employeeService.updateById(employee);
}
// 删除员工
@DeleteMapping("/{id}")
public boolean deleteEmployee(@PathVariable Long id) {
return employeeService.removeById(id);
}
}
进阶考虑与扩展
-
事务管理:对于涉及多表操作的复杂业务(如薪资核算),必须使用
@Transactional注解来保证数据一致性。@Service public class SalaryServiceImpl implements SalaryService { @Autowired private EmployeeMapper employeeMapper; @Autowired private SalaryMapper salaryMapper; @Transactional public void calculateMonthlySalary() { // 1. 从 employee 表获取所有在职员工 // 2. 计算每个人的薪资 // 3. 将薪资记录插入 salary 表 // 如果中间任何一步失败,整个操作会回滚。 } } -
权限控制:集成 Spring Security,实现不同角色(普通员工、HR、部门经理、系统管理员)访问不同接口的权限控制。
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/admin/**").hasRole("ADMIN") // 只有管理员能访问 .antMatchers("/api/hr/**").hasAnyRole("ADMIN", "HR") // HR和管理员能访问 .antMatchers("/api/employee/my-info").hasAnyRole("ADMIN", "HR", "EMPLOYEE") // 所有人都能访问自己的信息 .anyRequest().authenticated() // 其他请求都需要认证 .and() .formLogin(); // 开启表单登录 } } -
代码生成:使用 MyBatis-Plus 的代码生成器,可以快速生成 Entity、Mapper、Service、Controller 等基础代码,提高开发效率。
-
前后端分离:后端只提供 RESTful API,前端通过 HTTP 请求获取数据并渲染页面,两者可以独立开发、独立部署。
-
微服务化:当系统变得非常庞大时,可以考虑拆分为微服务,将
员工服务、考勤服务、薪酬服务拆分成独立的微服务,通过 Spring Cloud 等框架进行服务治理。
使用 Java 开发人力资源管理系统是一个非常经典且成熟的项目,通过采用 Spring Boot + MyBatis-Plus + Vue.js 的技术栈,可以快速构建一个功能强大、性能稳定、易于维护的现代 Web 应用。
关键在于:
- 清晰的业务需求分析。
- 合理的架构设计(分层、模块化)。
- 规范的开发流程(编码、测试、部署)。
- 选择并熟练运用主流的技术框架。
希望这份详细的指南能帮助你开启或完善你的 HRMS 项目!
