1. 项目概述
这个基于SpringBoot的人力资源智能管理平台是我去年指导的一个计算机专业毕业设计项目。作为一个在企业HR系统领域有多年开发经验的工程师,我想分享这个项目的完整实现方案,希望能给正在做类似毕设的同学一些参考。
系统主要包含员工信息管理、考勤统计、薪资计算三大核心模块。采用前后端分离架构,后端使用SpringBoot+MyBatis框架,前端使用Vue.js+ElementUI组件库。整个系统从需求分析到部署上线共耗时3个月,最终实现了企业日常人事管理的数字化和自动化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型考量
选择SpringBoot作为后端框架主要基于以下几个考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大简化了项目搭建过程
- 微服务友好:便于后期扩展为分布式架构
- 生态丰富:有大量现成的Starter可以集成常用功能
- 社区活跃:遇到问题容易找到解决方案
数据库选用MySQL 8.0,主要因为:
- 对事务支持完善
- 开源免费
- 性能足够支撑中小型企业HR系统需求
2.2 系统模块划分
系统采用经典的三层架构:
code复制├── 表现层(Web)
│ ├── 员工管理界面
│ ├── 考勤管理界面
│ └── 薪资管理界面
├── 业务逻辑层(Service)
│ ├── 员工服务
│ ├── 考勤服务
│ └── 薪资服务
└── 数据访问层(DAO)
├── 员工Mapper
├── 考勤Mapper
└── 薪资Mapper
3. 核心功能实现
3.1 员工信息管理
员工表设计示例:
sql复制CREATE TABLE `employee` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`gender` tinyint DEFAULT NULL,
`birth_date` date DEFAULT NULL,
`id_card` varchar(18) DEFAULT NULL,
`department_id` bigint DEFAULT NULL,
`position_id` bigint DEFAULT NULL,
`hire_date` date DEFAULT NULL,
`status` tinyint DEFAULT '1' COMMENT '1-在职 2-离职',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_id_card` (`id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:身份证号字段需要添加唯一索引,避免重复录入
3.2 考勤管理系统
考勤记录表设计:
sql复制CREATE TABLE `attendance` (
`id` bigint NOT NULL AUTO_INCREMENT,
`employee_id` bigint NOT NULL,
`check_in` datetime DEFAULT NULL,
`check_out` datetime DEFAULT NULL,
`status` tinyint DEFAULT '1' COMMENT '1-正常 2-迟到 3-早退 4-缺勤',
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_employee_date` (`employee_id`,`check_in`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
考勤统计关键代码:
java复制public AttendanceStatisticVO getMonthlyStatistic(Long employeeId, LocalDate month) {
LocalDateTime start = month.withDayOfMonth(1).atStartOfDay();
LocalDateTime end = month.withDayOfMonth(month.lengthOfMonth()).atTime(23,59,59);
List<Attendance> records = attendanceMapper.selectByEmployeeAndPeriod(
employeeId, start, end);
AttendanceStatisticVO vo = new AttendanceStatisticVO();
vo.setNormalDays((int)records.stream()
.filter(r -> r.getStatus() == 1).count());
vo.setLateTimes((int)records.stream()
.filter(r -> r.getStatus() == 2).count());
// 其他统计项...
return vo;
}
3.3 薪资计算系统
薪资表设计:
sql复制CREATE TABLE `salary` (
`id` bigint NOT NULL AUTO_INCREMENT,
`employee_id` bigint NOT NULL,
`base_salary` decimal(10,2) NOT NULL,
`bonus` decimal(10,2) DEFAULT '0.00',
`deduction` decimal(10,2) DEFAULT '0.00',
`tax` decimal(10,2) DEFAULT '0.00',
`actual_salary` decimal(10,2) NOT NULL,
`month` varchar(7) NOT NULL COMMENT '格式:yyyy-MM',
`status` tinyint DEFAULT '0' COMMENT '0-未发放 1-已发放',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_employee_month` (`employee_id`,`month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
薪资计算服务:
java复制@Service
@RequiredArgsConstructor
public class SalaryService {
private final SalaryMapper salaryMapper;
private final AttendanceService attendanceService;
public Salary calculateSalary(Long employeeId, String month) {
// 获取基本工资
BigDecimal baseSalary = getBaseSalary(employeeId);
// 计算考勤扣款
AttendanceStatisticVO stat = attendanceService
.getMonthlyStatistic(employeeId, LocalDate.parse(month+"-01"));
BigDecimal deduction = calculateDeduction(stat, baseSalary);
// 计算奖金
BigDecimal bonus = calculateBonus(employeeId, month);
// 计算个税
BigDecimal taxableIncome = baseSalary.add(bonus).subtract(deduction);
BigDecimal tax = calculateTax(taxableIncome);
// 构建薪资对象
Salary salary = new Salary();
salary.setEmployeeId(employeeId);
salary.setMonth(month);
salary.setBaseSalary(baseSalary);
salary.setBonus(bonus);
salary.setDeduction(deduction);
salary.setTax(tax);
salary.setActualSalary(baseSalary.add(bonus)
.subtract(deduction).subtract(tax));
return salary;
}
// 其他辅助方法...
}
4. 系统安全设计
4.1 权限控制
采用RBAC(基于角色的访问控制)模型:
java复制@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("HR", "ADMIN")
.antMatchers("/api/employee/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.and()
.csrf().disable();
}
}
4.2 数据安全
敏感数据加密处理:
java复制public class IdCardEncryptor {
private static final String KEY = "your-encryption-key";
public static String encrypt(String idCard) {
// AES加密实现
// ...
}
public static String decrypt(String encrypted) {
// AES解密实现
// ...
}
}
5. 项目部署方案
5.1 开发环境配置
推荐开发环境:
- JDK 17
- IntelliJ IDEA 2022+
- MySQL 8.0
- Node.js 16+(前端开发)
application-dev.yml配置示例:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/hr_system?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: update
5.2 生产环境部署
使用Docker Compose部署:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: hr_system
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
backend:
image: hr-system-backend:latest
ports:
- "8080:8080"
depends_on:
- mysql
volumes:
mysql_data:
6. 常见问题解决
6.1 跨域问题
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
6.2 性能优化建议
- 添加Redis缓存高频访问数据:
java复制@Cacheable(value = "employee", key = "#id")
public Employee getEmployeeById(Long id) {
return employeeMapper.selectById(id);
}
- 数据库查询优化:
- 为常用查询条件添加索引
- 避免SELECT *,只查询需要的字段
- 大数据量表考虑分表分库
7. 项目扩展方向
- 集成钉钉/企业微信考勤数据
- 添加BI数据可视化看板
- 开发移动端应用
- 实现电子合同签署功能
- 集成AI面试功能
这个项目从技术选型到功能实现都考虑了实际企业应用场景,不仅适合作为毕业设计,稍加完善后完全可以投入实际使用。在开发过程中,我特别注重代码的可维护性和系统的扩展性,采用了清晰的模块划分和规范的编码风格。
