基于 Java Spring Boot 的员工工资管理系统设计与实现
2026/9/24 17:40:49 网站建设 项目流程

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!

1. 引言

随着企业规模的不断扩大,员工数量持续增长,传统的人工工资核算方式已经难以满足现代企业高效、准确、规范的管理需求。工资管理涉及基本工资、绩效奖金、社保公积金、个税计算、考勤扣款等多个环节,数据量大、计算规则复杂,人工处理不仅效率低下,还容易出现差错。

本文基于 Java Spring Boot 框架,设计并实现一套员工工资管理系统。系统采用前后端分离架构,后端基于 Spring Boot + MyBatis-Plus,前端采用 Vue + Element UI,数据库使用 MySQL,实现了员工信息管理、工资项目配置、工资核算、工资发放记录、统计报表等核心功能,为企业提供了一套完整、可扩展的工资管理解决方案。

2. 系统需求分析

2.1 功能需求

本系统面向企业人事部门和财务部门,主要功能需求如下:

  • 员工信息管理:支持员工基本信息的增删改查,包括姓名、工号、部门、岗位、入职日期、银行卡号等。
  • 工资项目配置:支持自定义工资组成项目,如基本工资、岗位津贴、绩效奖金、加班费、社保、公积金、个税等,并可设置计算规则。
  • 工资核算:根据员工考勤、绩效等数据自动计算月度工资,支持批量核算和单人工核算。
  • 工资发放管理:记录工资发放状态,支持发放确认、发放记录查询和工资条生成。
  • 统计报表:按部门、月份等维度统计工资总额、平均工资、人力成本等,支持图表展示。
  • 系统管理:用户登录、角色权限管理、操作日志记录等。

2.2 非功能需求

  • 安全性:用户密码加密存储,接口权限校验,防止越权访问。
  • 可靠性:工资数据涉及员工切身利益,系统需保证数据的一致性和准确性。
  • 易用性:界面简洁清晰,操作流程符合人事、财务人员的使用习惯。
  • 可扩展性:系统架构分层设计,便于后续功能扩展和维护。

3. 系统总体设计

3.1 系统架构设计

系统采用经典的三层架构,即表现层、业务逻辑层和数据访问层,前后端通过 RESTful API 进行交互。

flowchart TD A[前端 Vue + Element UI] -->|HTTP/JSON| B[Controller 层] B --> C[Service 层] C --> D[Mapper 层 MyBatis-Plus] D --> E[(MySQL 数据库)] C --> F[Redis 缓存] B --> G[Spring Security 权限认证]

3.2 技术选型

层次技术说明
后端框架Spring Boot 2.7快速构建独立运行的 Spring 应用
持久层MyBatis-Plus简化 CRUD 操作,内置分页插件
安全框架Spring Security + JWT实现用户认证与接口授权
数据库MySQL 8.0存储业务数据
缓存Redis缓存热点数据,提升查询性能
前端Vue 3 + Element Plus构建管理后台界面
构建工具Maven项目依赖管理与构建

3.3 数据库设计

系统核心数据表包括员工表、部门表、工资项目表、工资核算表、工资发放记录表等。以下为主要的表结构设计。

员工表(employee)

字段名类型说明
idbigint主键,自增
emp_novarchar(20)员工工号,唯一
emp_namevarchar(50)员工姓名
dept_idbigint所属部门 ID
positionvarchar(50)岗位
entry_datedate入职日期
bank_cardvarchar(30)银行卡号
statustinyint在职状态:1 在职,0 离职

工资项目表(salary_item)

字段名类型说明
idbigint主键,自增
item_namevarchar(50)项目名称,如基本工资
item_typetinyint类型:1 收入项,2 扣款项
calc_typetinyint计算方式:1 固定金额,2 按比例,3 公式计算
calc_valuedecimal(10,2)固定金额或比例值
sort_orderint排序号

工资核算表(salary_record)

字段名类型说明
idbigint主键,自增
emp_idbigint员工 ID
salary_monthvarchar(7)工资月份,如 2026-09
base_salarydecimal(10,2)基本工资
bonusdecimal(10,2)绩效奖金
overtime_paydecimal(10,2)加班费
social_securitydecimal(10,2)社保扣款
housing_funddecimal(10,2)公积金扣款
taxdecimal(10,2)个人所得税
net_salarydecimal(10,2)实发工资
statustinyint状态:0 未发放,1 已发放

4. 系统核心功能实现

4.1 项目结构

后端项目采用标准的 Maven 多模块或单模块分层结构,包结构如下:

com.example.salary ├── controller // 控制层,接收前端请求 ├── service // 业务逻辑层 │ └── impl ├── mapper // 数据访问层 ├── entity // 实体类 ├── dto // 数据传输对象 ├── config // 配置类(安全、跨域等) ├── common // 通用工具、统一返回结果 └── SalaryApplication.java // 启动类

4.2 员工信息管理模块

员工信息管理是系统的基础模块,提供员工信息的增删改查功能。以下为员工实体类的核心代码。

@Data @TableName("employee") public class Employee { @TableId(type = IdType.AUTO) private Long id; private String empNo; private String empName; private Long deptId; private String position; private LocalDate entryDate; private String bankCard; private Integer status; }

员工查询接口采用 MyBatis-Plus 的分页插件,支持按姓名、工号、部门等条件进行组合查询。

@Service public class EmployeeServiceImpl implements EmployeeService { @Autowired private EmployeeMapper employeeMapper; @Override public PageResult<Employee> pageQuery(EmployeeQueryDTO queryDTO) { LambdaQueryWrapper<Employee> wrapper = new LambdaQueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(queryDTO.getEmpName()), Employee::getEmpName, queryDTO.getEmpName()) .like(StringUtils.isNotBlank(queryDTO.getEmpNo()), Employee::getEmpNo, queryDTO.getEmpNo()) .eq(queryDTO.getDeptId() != null, Employee::getDeptId, queryDTO.getDeptId()) .orderByDesc(Employee::getEntryDate); Page<Employee> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize()); employeeMapper.selectPage(page, wrapper); return new PageResult<>(page.getTotal(), page.getRecords()); } }

4.3 工资核算模块

工资核算模块是系统的核心。系统根据工资项目配置和员工考勤、绩效数据,自动计算每位员工的应发工资、扣款项和实发工资。核算流程如下:

flowchart LR A[选择核算月份] --> B[获取在职员工列表] B --> C[读取工资项目配置] C --> D[计算应发工资] D --> E[计算社保公积金] E --> F[计算个人所得税] F --> G[计算实发工资] G --> H[保存工资核算记录]

工资核算的核心代码如下:

@Service public class SalaryCalculateServiceImpl implements SalaryCalculateService { @Autowired private EmployeeMapper employeeMapper; @Autowired private SalaryItemMapper salaryItemMapper; @Autowired private SalaryRecordMapper salaryRecordMapper; @Override @Transactional(rollbackFor = Exception.class) public void calculateMonthlySalary(String salaryMonth) { // 1. 查询所有在职员工 List<Employee> employees = employeeMapper.selectList( new LambdaQueryWrapper<Employee>().eq(Employee::getStatus, 1)); // 2. 查询工资项目配置 List<SalaryItem> items = salaryItemMapper.selectList( new LambdaQueryWrapper<SalaryItem>().orderByAsc(SalaryItem::getSortOrder)); for (Employee emp : employees) { // 3. 计算各项工资 BigDecimal baseSalary = getItemValue(items, "基本工资", emp); BigDecimal bonus = getItemValue(items, "绩效奖金", emp); BigDecimal overtimePay = getItemValue(items, "加班费", emp); BigDecimal grossSalary = baseSalary.add(bonus).add(overtimePay); // 4. 计算社保、公积金 BigDecimal socialSecurity = grossSalary.multiply(new BigDecimal("0.08")); BigDecimal housingFund = grossSalary.multiply(new BigDecimal("0.12")); // 5. 计算个税(简化示例) BigDecimal taxableIncome = grossSalary.subtract(socialSecurity) .subtract(housingFund).subtract(new BigDecimal("5000")); BigDecimal tax = taxableIncome.compareTo(BigDecimal.ZERO) <= 0 ? BigDecimal.ZERO : taxableIncome.multiply(new BigDecimal("0.03")); // 6. 计算实发工资 BigDecimal netSalary = grossSalary.subtract(socialSecurity) .subtract(housingFund).subtract(tax); // 7. 保存核算记录 SalaryRecord record = new SalaryRecord(); record.setEmpId(emp.getId()); record.setSalaryMonth(salaryMonth); record.setBaseSalary(baseSalary); record.setBonus(bonus); record.setOvertimePay(overtimePay); record.setSocialSecurity(socialSecurity); record.setHousingFund(housingFund); record.setTax(tax); record.setNetSalary(netSalary); record.setStatus(0); salaryRecordMapper.insert(record); } } }

4.4 工资发放管理模块

工资核算完成后,财务人员对核算结果进行审核确认,确认无误后执行发放操作。发放后系统记录发放时间、操作人等信息,并支持生成工资条供员工查看。

@Service public class SalaryPayServiceImpl implements SalaryPayService { @Autowired private SalaryRecordMapper salaryRecordMapper; @Override @Transactional(rollbackFor = Exception.class) public void confirmPay(Long recordId, Long operatorId) { SalaryRecord record = salaryRecordMapper.selectById(recordId); if (record == null) { throw new BusinessException("工资记录不存在"); } if (record.getStatus() == 1) { throw new BusinessException("该工资记录已发放,请勿重复操作"); } record.setStatus(1); record.setPayTime(LocalDateTime.now()); record.setOperatorId(operatorId); salaryRecordMapper.updateById(record); } }

4.5 统计报表模块

统计报表模块按部门、月份等维度对工资数据进行汇总分析,帮助管理层掌握人力成本情况。以下为按部门统计工资总额的 SQL 示例。

SELECT d.dept_name, COUNT(DISTINCT e.id) AS emp_count, SUM(sr.net_salary) AS total_salary, ROUND(AVG(sr.net_salary), 2) AS avg_salary FROM salary_record sr JOIN employee e ON sr.emp_id = e.id JOIN department d ON e.dept_id = d.id WHERE sr.salary_month = #{salaryMonth} GROUP BY d.dept_name ORDER BY total_salary DESC;

5. 系统安全设计

工资数据属于企业敏感信息,系统在安全方面做了以下设计:

  • 用户认证:采用 Spring Security + JWT 实现无状态认证,登录后签发 Token,后续请求携带 Token 访问受保护接口。
  • 权限控制:基于角色的访问控制(RBAC),区分管理员、财务人员、普通员工等角色,不同角色拥有不同的操作权限。
  • 密码安全:用户密码使用 BCrypt 算法加密存储,防止明文泄露。
  • 操作日志:记录关键操作的日志信息,包括操作人、操作时间、操作内容,便于审计追溯。
  • 数据脱敏:员工银行卡号、身份证号等敏感字段在展示时进行脱敏处理。

6. 系统测试

系统开发完成后,对核心功能进行了功能测试和性能测试。功能测试覆盖员工管理、工资核算、工资发放、统计报表等主要业务流程,验证了各模块功能的正确性。性能测试方面,对工资批量核算接口进行了压测,在 1000 名员工规模下,单月工资核算耗时约 2 秒,满足日常使用需求。

7. 总结与展望

本文基于 Spring Boot 框架设计并实现了一套员工工资管理系统,系统涵盖了员工信息管理、工资项目配置、工资核算、工资发放、统计报表等核心功能,具有界面友好、操作简便、安全可靠、易于扩展等特点,能够有效提升企业工资管理的效率和准确性。

在后续的优化中,可以从以下几个方面进行改进:一是引入消息队列实现工资核算的异步处理,进一步提升大批量核算的性能;二是对接银行接口,实现工资的自动代发;三是增加移动端支持,方便员工随时查看工资条;四是引入更

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询