企业人事档案管理系统:基于SpringBoot+Vue的完整实现方案
项目概述
本系统采用前后端分离架构,后端基于SpringBoot框架构建RESTful API,前端使用Vue.js框架实现交互界面,数据库选用MySQL。系统覆盖员工档案管理、部门组织架构、考勤记录、权限控制等核心功能模块,适用于中小型企业的人事管理场景。
核心技术栈
后端:SpringBoot + MyBatis-Plus
SpringBoot通过自动配置机制简化项目搭建,内置嵌入式服务器(Tomcat),开发者无需额外部署环境。它集成了Spring Data JPA、Spring Security等组件,便于快速实现数据访问和权限管理。MyBatis-Plus作为MyBatis的增强工具,提供代码生成器,自动生成Entity、Mapper和XML文件,并支持分页、乐观锁等实用功能。
// 登录接口示例
@PostMapping("/login")
public ApiResult login(@RequestParam String username,
@RequestParam String password,
HttpServletRequest request) {
UserEntity user = userService.findByUsername(username);
if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
return ApiResult.error("账号或密码错误");
}
String token = tokenProvider.generateToken(user.getId(), username, user.getRole());
return ApiResult.success().put("token", token);
}
// Token生成逻辑
public String generateToken(Long userId, String username, String role) {
TokenEntity existing = tokenMapper.selectOne(
new LambdaQueryWrapper<TokenEntity>()
.eq(TokenEntity::getUserId, userId)
.eq(TokenEntity::getRole, role)
);
String newToken = UUID.randomUUID().toString().replace("-", "");
LocalDateTime expireTime = LocalDateTime.now().plusHours(2);
if (existing != null) {
existing.setToken(newToken);
existing.setExpireTime(expireTime);
tokenMapper.updateById(existing);
} else {
TokenEntity token = new TokenEntity(userId, username, role, newToken, expireTime);
tokenMapper.insert(token);
}
return newToken;
}
// 权限拦截器核心逻辑
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 跨域处理
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Authorization,Content-Type");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpStatus.OK.value());
return false;
}
// 放开无需认证的接口
if (handler instanceof HandlerMethod) {
AuthIgnore ignore = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);
if (ignore != null) return true;
}
// 验证Token
String authToken = request.getHeader("Authorization");
if (StringUtils.isBlank(authToken)) {
sendError(response, "请先登录");
return false;
}
TokenEntity tokenEntity = tokenService.findByToken(authToken);
if (tokenEntity == null || tokenEntity.getExpireTime().isBefore(LocalDateTime.now())) {
sendError(response, "Token无效或已过期");
return false;
}
// 设置用户上下文
UserContext.setCurrentUser(tokenEntity.getUserId(), tokenEntity.getRole());
return true;
}
}
前端:Vue.js + Element UI
Vue.js利用虚拟DOM和响应式数据绑定,自动更新UI组件。选择Element UI作为UI库,提供表单验证、表格分页、对话框等现成组件,减少开发时间。前端通过axios与后端交互,接口遵循RESTful规范。
数据库:MySQL + MyBatis-Plus
以下为系统核心表结构(token表用于记录用户会话):
-- token表
CREATE TABLE `token` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`username` varchar(100) NOT NULL COMMENT '用户名',
`role` varchar(50) DEFAULT NULL COMMENT '角色',
`token` varchar(200) NOT NULL COMMENT '会话令牌',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`expires_at` timestamp NOT NULL COMMENT '过期时间',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_token` (`token`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
-- 示例数据
INSERT INTO `token` VALUES
(1, 1, 'admin', '管理员', 'abc123def456', '2024-01-01 10:00:00', '2024-01-01 12:00:00'),
(2, 2, 'zhangsan', '普通员工', 'ghi789jkl012', '2024-01-02 14:00:00', '2024-01-02 16:00:00');
系统测试策略
功能测试
采用黑盒测试方法,覆盖以下场景:
- 登录功能:验证用户名、密码、验证码的组合校验,确保角色权限分离。
- 员工管理:测试CRUD操作,包括必填项验证、唯一性约束、删除确认提示。
| 测试场景 | 输入数据 | 预期结果 |
|---|---|---|
| 正常登录 | 用户名: admin, 密码: 123456, 验证码: 正确 | 跳转至首页 |
| 密码错误 | 用户名: admin, 密码: wrong, 验证码: 正确 | 提示密码错误 |
| 添加员工_必填项为空 | 姓名为空,部门、职位填写正确 | 提示"姓名不能为空" |
| 权限越级 | 普通员工尝试访问管理员页面 | 返回403未授权 |
测试结论
经过上述功能与边界测试,系统在核心模块上符合需求规格。所有用例均通过,未发现严重缺陷。对于少数界面兼容性问题,已在后续迭代中修复。系统整体稳定,可满足日常人事管理需求。
项目架构说明
项目采用标准的三层架构:Controller层处理请求路由,Service层封装业务逻辑,Mapper层操作数据库。前端通过Vue Router管理单页路由,Vuex管理全局状态。部署时,后端打包为JAR运行,前端构建为静态文件部署至Nginx。