1. 项目概述
这个基于SpringBoot+Vue的企业员工薪酬管理系统,是一个典型的前后端分离架构的Java Web应用。它采用当前主流的技术栈组合,后端使用SpringBoot框架,前端采用Vue.js,数据库选用MySQL,非常适合作为计算机相关专业的毕业设计或课程设计项目。
我在实际开发这类系统时发现,薪酬管理系统看似简单,但要处理好各种业务逻辑和权限控制,需要不少实战经验。这个项目源码提供了完整的实现方案,包含了企业薪酬管理中的核心功能模块,能够帮助学习者快速掌握SpringBoot和Vue的开发模式。
2. 系统架构设计
2.1 技术选型分析
后端采用SpringBoot 2.x作为基础框架,这是目前Java领域最流行的微服务开发框架。它内置了Tomcat服务器,简化了配置,让开发者可以快速搭建项目。数据库访问层使用MyBatis,这是一个优秀的持久层框架,通过XML或注解方式配置SQL语句,既灵活又高效。
前端选用Vue 2.x版本,配合Element UI组件库。Vue的响应式数据绑定和组件化开发模式,非常适合构建复杂的单页应用。Element UI提供了丰富的UI组件,可以快速搭建美观的管理系统界面。
2.2 系统模块划分
系统主要分为以下几个功能模块:
- 员工信息管理:包括员工基本信息的CRUD操作
- 部门管理:组织架构的维护
- 薪资管理:薪资计算、发放记录
- 考勤管理:与薪资挂钩的考勤数据
- 系统管理:用户、角色、权限配置
每个模块都遵循RESTful API设计规范,前后端通过JSON格式数据进行交互。
3. 核心功能实现
3.1 后端关键实现
薪资计算是系统的核心功能,我分享一下实现思路:
java复制// 薪资计算服务示例
@Service
public class SalaryService {
@Autowired
private EmployeeMapper employeeMapper;
@Autowired
private AttendanceMapper attendanceMapper;
public BigDecimal calculateSalary(Long employeeId, LocalDate month) {
// 获取基本工资
Employee employee = employeeMapper.selectById(employeeId);
BigDecimal baseSalary = employee.getBaseSalary();
// 计算考勤扣款
Attendance attendance = attendanceMapper.selectByEmployeeAndMonth(employeeId, month);
BigDecimal deduction = calculateDeduction(attendance);
// 计算绩效奖金
BigDecimal bonus = calculateBonus(employeeId, month);
// 最终薪资 = 基本工资 - 扣款 + 奖金
return baseSalary.subtract(deduction).add(bonus);
}
// 其他辅助方法...
}
3.2 前端关键实现
前端使用Vue Router实现路由导航,配合Vuex进行状态管理。下面是部门管理模块的示例代码:
javascript复制// 部门管理组件
<template>
<div>
<el-table :data="departments">
<el-table-column prop="name" label="部门名称"></el-table-column>
<el-table-column prop="manager" label="部门经理"></el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button @click="editDepartment(scope.row)">编辑</el-button>
<el-button @click="deleteDepartment(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default {
computed: {
...mapState('department', ['departments'])
},
methods: {
...mapActions('department', ['fetchDepartments', 'deleteDepartment']),
editDepartment(department) {
this.$router.push(`/department/edit/${department.id}`)
}
},
created() {
this.fetchDepartments()
}
}
</script>
4. 数据库设计
4.1 主要表结构
系统数据库包含以下核心表:
-
员工表(employee)
- id: 主键
- name: 姓名
- gender: 性别
- department_id: 部门ID
- position: 职位
- base_salary: 基本工资
-
部门表(department)
- id: 主键
- name: 部门名称
- parent_id: 上级部门ID
- manager_id: 部门经理ID
-
薪资记录表(salary_record)
- id: 主键
- employee_id: 员工ID
- month: 月份
- amount: 实发工资
- status: 发放状态
4.2 表关系设计
sql复制-- 创建部门表
CREATE TABLE department (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
parent_id BIGINT,
manager_id BIGINT,
FOREIGN KEY (parent_id) REFERENCES department(id),
FOREIGN KEY (manager_id) REFERENCES employee(id)
);
-- 创建员工表
CREATE TABLE employee (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
department_id BIGINT NOT NULL,
position VARCHAR(50),
base_salary DECIMAL(10,2),
FOREIGN KEY (department_id) REFERENCES department(id)
);
5. 项目部署与运行
5.1 环境准备
项目运行需要以下环境:
- JDK 1.8+
- MySQL 5.7+
- Node.js 12+
- Maven 3.6+
5.2 后端部署步骤
- 导入数据库脚本
- 修改application.yml中的数据库配置
- 使用Maven打包项目
- 运行生成的jar文件
bash复制# 打包命令
mvn clean package
# 运行命令
java -jar salary-system.jar
5.3 前端部署步骤
- 安装依赖
- 配置API基础地址
- 构建生产环境代码
bash复制# 安装依赖
npm install
# 开发模式运行
npm run serve
# 生产环境构建
npm run build
6. 常见问题与解决方案
6.1 跨域问题
前后端分离开发时常见的跨域问题,可以通过以下方式解决:
后端配置CORS:
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 权限控制实现
系统使用基于角色的权限控制(RBAC),主要实现思路:
- 定义权限注解
java复制@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
String[] value();
}
- 实现权限拦截器
java复制public class PermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 获取用户权限
Set<String> permissions = getCurrentUserPermissions();
// 检查方法权限注解
RequiresPermissions annotation = getAnnotation(handler);
if (annotation != null) {
for (String required : annotation.value()) {
if (!permissions.contains(required)) {
throw new AccessDeniedException("权限不足");
}
}
}
return true;
}
}
7. 项目扩展建议
在实际应用中,这个基础系统还可以进一步扩展:
- 集成钉钉/企业微信考勤数据
- 添加薪资条邮件发送功能
- 实现多维度薪资统计分析
- 增加审批流程(请假、加班等)
- 对接财务系统自动转账
我在开发类似系统时,发现薪资计算规则的灵活性非常重要。建议使用规则引擎来处理复杂的薪资计算逻辑,这样当企业薪资政策变化时,只需调整规则而不需要修改代码。
