SpringBoot+MyBatis实现员工账户管理系统的核心功能

SpringBootMyBatis员工账户管理
于 2026-07-03 09:44:14 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. 项目背景与核心需求

最近在开发一个名为"苍穹外卖"的后台管理系统,其中员工账户管理模块需要实现三个核心功能:账户启用/禁用、账户信息修改以及分页查询。这些功能看似基础,但在实际开发中涉及到权限控制、数据一致性、接口设计等多个技术要点。

这个模块的典型使用场景包括:

  • 管理员发现某个员工离职,需要立即禁用其账户
  • 员工职位变动时需要修改其部门信息
  • 人事部门需要查看所有员工的状态并进行批量操作

2. 技术架构设计

2.1 整体技术栈

项目采用标准的SpringBoot+MyBatis技术栈:

  • Spring Boot 2.7.x
  • MyBatis-Plus 3.5.x
  • MySQL 8.0
  • Redis 6.x(用于缓存和会话管理)

2.2 数据库设计

员工表(employee)关键字段:

SQL
CREATE TABLE `employee` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '姓名',
`username` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
`password` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '密码',
`phone` varchar(11) COLLATE utf8mb4_bin NOT NULL COMMENT '手机号',
`sex` varchar(2) COLLATE utf8mb4_bin NOT NULL COMMENT '性别',
`id_number` varchar(18) COLLATE utf8mb4_bin NOT NULL COMMENT '身份证号',
`status` int NOT NULL DEFAULT '1' COMMENT '状态 0:禁用,1:启用',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '更新时间',
`create_user` bigint NOT NULL COMMENT '创建人',
`update_user` bigint NOT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

3. 核心功能实现

3.1 启用/禁用账户功能

Controller层实现:

JAVA
@PostMapping("/status/{status}")
public Result<String> updateStatus(@PathVariable Integer status, Long id) {
employeeService.updateStatus(status, id);
return Result.success(status == 1 ? "启用成功" : "禁用成功");
}

Service层实现要点:

  1. 检查操作权限(只有管理员可以执行此操作)
  2. 检查目标账户是否存在
  3. 防止禁用当前登录账户
  4. 使用MyBatis-Plus的LambdaUpdateWrapper进行高效更新
JAVA
public void updateStatus(Integer status, Long id) {
// 1. 权限校验
Long currentUserId = BaseContext.getCurrentId();
if (!isAdmin(currentUserId)) {
throw new BusinessException(MessageConstant.NO_PERMISSION);
}
// 2. 防止禁用自己
if (currentUserId.equals(id) && status == 0) {
throw new BusinessException(MessageConstant.CANNOT_DISABLE_SELF);
}
// 3. 更新状态
LambdaUpdateWrapper<Employee> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Employee::getId, id)
.set(Employee::getStatus, status)
.set(Employee::getUpdateTime, LocalDateTime.now())
.set(Employee::getUpdateUser, currentUserId);
if (!update(updateWrapper)) {
throw new BusinessException(MessageConstant.ACCOUNT_NOT_FOUND);
}
// 4. 记录操作日志
logService.recordOperationLog(...);
}

3.2 修改员工信息功能

DTO设计:

JAVA
@Data
public class EmployeeDTO {
private Long id;
@NotBlank(message = "姓名不能为空")
private String name;
@NotBlank(message = "用户名不能为空")
private String username;
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
@NotBlank(message = "性别不能为空")
private String sex;
@NotBlank(message = "身份证号不能为空")
@Pattern(regexp = "^[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[0-9Xx]$",
message = "身份证号格式不正确")
private String idNumber;
}

Service层关键逻辑:

JAVA
@Transactional
public void updateEmployee(EmployeeDTO employeeDTO) {
// 1. 基本校验
if (employeeDTO.getId() == null) {
throw new BusinessException(MessageConstant.ILLEGAL_OPERATION);
}
// 2. 用户名唯一性校验
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername, employeeDTO.getUsername())
.ne(Employee::getId, employeeDTO.getId());
if (count(queryWrapper) > 0) {
throw new BusinessException(MessageConstant.USERNAME_EXISTS);
}
// 3. 更新操作
Employee employee = new Employee();
BeanUtils.copyProperties(employeeDTO, employee);
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
if (!updateById(employee)) {
throw new BusinessException(MessageConstant.ACCOUNT_NOT_FOUND);
}
}

3.3 分页查询功能

分页查询参数封装:

JAVA
@Data
public class EmployeePageQueryDTO {
private String name;
private Integer page = 1;
private Integer pageSize = 10;
}

分页查询实现:

JAVA
public PageResult pageQuery(EmployeePageQueryDTO queryDTO) {
Page<Employee> page = new Page<>(queryDTO.getPage(), queryDTO.getPageSize());
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(queryDTO.getName()),
Employee::getName, queryDTO.getName())
.orderByDesc(Employee::getUpdateTime);
page(page, queryWrapper);
return new PageResult(page.getTotal(), page.getRecords());
}

4. 关键问题与解决方案

4.1 并发修改问题

当多个管理员同时修改同一个员工信息时,可能出现数据不一致问题。解决方案:

  1. 使用乐观锁机制:
JAVA
@Version
private Integer version;
  1. 更新时检查版本号:
JAVA
LambdaUpdateWrapper<Employee> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Employee::getId, employeeDTO.getId())
.eq(Employee::getVersion, employeeDTO.getVersion())
.set(Employee::getVersion, employeeDTO.getVersion() + 1);

4.2 敏感信息处理

员工密码、身份证号等敏感信息需要特殊处理:

  1. 查询时不返回密码字段:
JAVA
@TableField(select = false)
private String password;
  1. 身份证号脱敏显示:
JAVA
public String getIdNumber() {
if (StringUtils.isBlank(idNumber) || idNumber.length() < 8) {
return idNumber;
}
return idNumber.substring(0, 3) + "****" + idNumber.substring(idNumber.length() - 4);
}

4.3 操作日志记录

所有关键操作都需要记录日志:

JAVA
@Aspect
@Component
@Slf4j
public class OperationLogAspect {
@Autowired
private OperationLogService operationLogService;
@Around("@annotation(operationLog)")
public Object around(ProceedingJoinPoint joinPoint, OperationLog operationLog) throws Throwable {
// 获取操作描述
String operation = operationLog.value();
// 执行目标方法
Object result = joinPoint.proceed();
// 记录日志
OperationLogEntity logEntity = new OperationLogEntity();
logEntity.setOperation(operation);
// 设置其他参数...
operationLogService.save(logEntity);
return result;
}
}

5. 性能优化实践

5.1 缓存优化

频繁访问的员工信息可以加入缓存:

JAVA
@Cacheable(value = "employee", key = "#id")
public Employee getById(Long id) {
return getBaseMapper().selectById(id);
}
 
@CacheEvict(value = "employee", key = "#employeeDTO.id")
public void updateEmployee(EmployeeDTO employeeDTO) {
// 更新逻辑
}

5.2 批量操作优化

当需要批量启用/禁用账户时:

JAVA
@Transactional
public void batchUpdateStatus(Integer status, List<Long> ids) {
if (CollectionUtils.isEmpty(ids)) {
return;
}
Long currentUserId = BaseContext.getCurrentId();
LocalDateTime now = LocalDateTime.now();
List<Employee> updateList = ids.stream()
.filter(id -> !id.equals(currentUserId) || status != 0)
.map(id -> {
Employee employee = new Employee();
employee.setId(id);
employee.setStatus(status);
employee.setUpdateTime(now);
employee.setUpdateUser(currentUserId);
return employee;
}).collect(Collectors.toList());
if (!updateBatchById(updateList)) {
throw new BusinessException("批量操作失败");
}
}

6. 安全防护措施

6.1 权限控制

使用Spring Security实现方法级权限控制:

JAVA
@PreAuthorize("hasAuthority('employee:edit')")
@PostMapping("/status/{status}")
public Result<String> updateStatus(@PathVariable Integer status, Long id) {
// 方法实现
}

6.2 参数校验

使用Hibernate Validator进行参数校验:

JAVA
@PostMapping
public Result<String> save(@Valid @RequestBody EmployeeDTO employeeDTO) {
// 保存逻辑
}

6.3 SQL注入防护

MyBatis-Plus默认使用预编译语句,但自定义SQL需要注意:

JAVA
@Select("SELECT * FROM employee WHERE name = #{name}")
List<Employee> findByName(@Param("name") String name);

7. 测试要点

7.1 单元测试示例

JAVA
@Test
public void testUpdateStatus() {
// 准备测试数据
Long adminId = 1L;
Long employeeId = 2L;
BaseContext.setCurrentId(adminId);
// 测试禁用操作
employeeService.updateStatus(0, employeeId);
Employee employee = employeeService.getById(employeeId);
assertEquals(0, employee.getStatus());
// 测试启用操作
employeeService.updateStatus(1, employeeId);
employee = employeeService.getById(employeeId);
assertEquals(1, employee.getStatus());
// 测试禁用自己
assertThrows(BusinessException.class, () -> {
employeeService.updateStatus(0, adminId);
});
}

7.2 接口测试用例

  1. 无权限用户尝试修改状态 - 应返回403
  2. 修改不存在的员工ID - 应返回404
  3. 修改自己的状态为禁用 - 应返回业务异常
  4. 并发修改测试 - 应保证数据一致性

8. 部署注意事项

  1. 生产环境需要关闭Swagger等开发工具
  2. 建议使用Nginx配置HTTPS
  3. 数据库连接池配置优化:
YAML
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000

9. 扩展功能建议

  1. 员工账户操作短信通知
  2. 账户状态变更历史记录
  3. 基于角色的更细粒度权限控制
  4. 员工离职自动交接流程

在实际开发中,我发现账户状态管理最容易被忽视的是并发操作问题和操作日志完整性。建议在项目初期就建立完善的操作日志体系,这对后续的审计和问题排查非常重要。另外,对于敏感操作如账户禁用,可以考虑增加二次确认机制,避免误操作。

基于springboot+mybatis+mysql+layui员工工资管理系统
本文介绍了基于SpringBootMyBatis、MySQL和Layui开发的员工工资管理系统,涵盖了账户管理、部门管理、权限分配、薪资参数设置、奖惩录入、薪资发放和查看等功能。系统采用RBAC权限模型,利用Apache Shiro实现细粒度权限控制,并提供了系统结构设计和开发配置详情。
五星资源
1202
基于SpringBoot企业员工考勤管理系统的设计与实现
本文围绕基于Spring Boot的企业员工考勤管理系统展开。介绍了系统通过自动化处理考勤数据,实现信息录入、存储等功能,采用Spring Boot框架、Java语言和MySQL数据库。还阐述了员工和管理员端的功能需求,如考勤记录管理、请假申请等,验证了系统的有效性和可靠性。
一点源码
803
基于SpringBoot+Vue人力资源管理系统的设计与实现
本文设计并实现了基于SpringBoot的人力资源管理系统,以满足现代企业人力资源管理需求。系统采用SpringBoot后端框架、MyBatis持久层框架,前端用vue等。划分员工、经理、管理员三个模块,具备员工信息管理、招聘管理等功能,还采用Spring Security保障安全。
一季春秋
1166
基于springboot的人力资源管理系统的设计与实现
本文设计并实现了基于SpringBoot的人力资源管理系统,以满足现代企业人力资源管理需求。系统功能涵盖员工信息、招聘、培训、工资管理等。采用SpringBoot后端框架、MyBatis持久层框架,前端用vue等。按角色分为员工、经理、管理员模块,还进行了系统测试。
一点教程
1151
基于springboot的工作绩效管理系统的设计与实现+文档
设计与实现基于SpringBoot的工作绩效管理系统,涵盖员工绩效、工资管理等功能,采用MySQL、MyBatis及Thymeleaf,提升企业竞争力。
全职计算机毕业设计
953
基于SpringBoot+Vue的企业员工薪酬管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
本文介绍了基于SpringBoot和Vue的企业员工薪酬管理系统的设计与实现。系统采用前后端分离架构,使用SpringBoot作为后端框架,Vue.js构建前端界面,MySQL存储数据,并通过MyBatis进行数据持久化。系统包含员工信息管理、薪资核算、发放记录查询及权限管理等功能,有效提高薪酬管理的准确性与效率。
qq8_811517515
318
java-springboot银行账户管理系统 基于SpringBoot的银行个人账户综合管理平台 Java技术栈驱动的银行账户业务处理与风险控制系统计算机毕业设计
本文设计并实现了一个基于SpringBoot的银行账户管理系统,涵盖开户、存取款、转账、挂失、注销等核心业务功能。系统采用Vue3前端与Java后端结合,使用MySQL存储数据,Redis缓存热点信息,RabbitMQ异步处理交易流水,提升系统性能与稳定性。通过权限分级管理,支持管理员、员工和用户三类角色高效协作,实现了银行业务的数据化闭环管理。
计算机毕设_见清
779
(课程设计)springboot宠物管理系统-毕业设计 附源码121654
本文设计并实现了一个基于SpringBoot框架、Java语言和MySQL数据库的B/S架构宠物管理系统。系统涵盖用户管理、宠物信息管理、订单管理、疫苗药物管理、会员留言、宠物热点及饲料下单等核心功能模块,采用Vue.js前端框架与MyBatis后端持久层技术,支持高响应交互与数据安全操作。系统通过组件化设计、E-R建模与规范化表结构,满足中小型宠物服务机构的信息化管理需求。
计算机开发者
6839
Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现
本文介绍了如何利用Eclipse、MySQL和SpringBoot技术开发的一款便捷的银行管理系统,涵盖了用户管理、账户操作、贷款管理等多个模块,提升了银行运营效率。
java李杨勇
15821
基于Springboot+mysql+mybatis-plus+swagger+redis+rabbimq+Springcloud+eureka+feign(http)+Apollo的员工管理系统1
本文介绍了如何使用Springboot集成MySQL、Mybatis-Plus简化CRUD操作,加入Redis实现缓存,以及利用Feign进行HTTP服务间调用。通过Swagger展示API文档,展示了如何在实际项目中整合这些技术构建高效员工管理系统
越过山林游动海浪
799
前后端分离鹿幸公司员工在线餐饮管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
本文介绍了鹿幸公司员工在线餐饮管理系统的开发过程,采用前后端分离架构,使用SpringBoot、Vue.js、MyBatis和MySQL技术栈。系统包含员工信息管理、订单管理、菜品管理等功能,并支持高并发处理和移动端访问。
qq10_811517515
602
【2025最新】基于SpringBoot+Vue的工资信息管理系统管理系统源码+MyBatis+MySQL
本文介绍了一款基于SpringBoot和Vue.js的工资信息管理系统,采用前后端分离架构,结合MyBatis与MySQL实现数据持久化。系统涵盖员工管理、工资发放、权限控制等核心功能,具备高安全性与可扩展性,适用于企业级人力资源信息化场景。
qq2__811517515
686
springboot基于Java的员工工资管理系统员工考勤(源码+文档+运行视频+讲解视频)
本文介绍基于SpringBoot+Vue+MyBatis-Plus开发的员工工资与考勤一体化管理系统。系统实现考勤数据自动采集、加班/请假统计、工资核算、个税及社保计算,并支持多角色权限控制。后端采用SpringBoot自动配置与嵌入式Web容器,前端使用Vue响应式框架,持久层依托MyBatis-Plus简化ORM操作。系统经完整功能测试,满足HR与财务管理核心需求。
QQ_2279239102
375
基于SpringBoot+Vue+uniapp的JavaEE的龙腾公司员工信息管理系统的+jsp的详细设计和实现(源码+lw+部署文档+讲解等)
本文介绍基于SpringBoot、Vue和MyBatis-Plus的龙腾公司员工信息管理系统。阐述后端SpringBoot自动配置等优点,前端Vue的虚拟DOM等特性,持久层MyBatis-Plus简化开发。还进行系统测试,包括目的、功能测试和结论,最终系统在功能和性能上满足设计要求。
qdy0007-coding
1010
springboot+mybatis实现员工管理系统
《基于SpringBoot+MyBatis员工管理系统实现详解》在现代企业信息化管理中,员工管理系统扮演着至关重要的角色,它能有效地管理员工信息、跟踪员工工作情况,从而提升企业管理效率。
思念变成海h
5829
springboot+mybatis+bootstrap开发员工OA后台管理系统
springboot+mybatis+bootstrap开发员工OA后台管理系统项目描述jboa项目有请假以及报销单的申请和审核session共享加登陆拦截人事对人员的管理员工添加报销单提交到(本部门
tiny__boy
3364
Maven+SpringBoot+MyBatis+MySQL实现增删改查源码
MyBatisSpringBoot结合使用时,可以通过注解或XML配置来定义SQL映射文件,实现DAO层的操作。
6628
springboot+mybatis+mysql+layUI+thymeleaf实现增删改查
在本项目中,我们利用了SpringBootMyBatis、MySQL、LayUI和Thymeleaf这五种核心技术,构建了一个完整的Web应用程序,实现了学生信息管理系统的增删改查功能。
zlzhaoe
6195
springboot + mybatis + jsp的图书管理系统
综上所述,这个"springboot + mybatis + jsp的图书管理系统"是一个典型的Java Web项目,它融合了多种技术,展现了SpringBoot的灵活性和高效性,MyBatis的易用性
一只金niu座
2013
SpringBoot员工管理系统.zip
总结来说,基于SpringBoot员工管理系统结合mybatis和mysql,实现了高效、稳定的员工数据管理。
MJJ@
1169
SpringBoot+Mybatis+Mybatis Plus+Shiro实现一个简单的项目架构
在本项目中,"SpringBoot+Mybatis+Mybatis Plus+Shiro实现一个简单的项目架构",开发者构建了一个基于Java的轻量级Web应用框架,旨在简化开发流程并强化安全控制。
小蓝波
3340
SpringBoot+Mybatis+SpringSecurity+JWT
在本项目中,我们主要探讨的是如何利用SpringBootMybatis、SpringSecurity和JWT(JSON Web Token)构建一个完整的权限管理和登录管理系统
2577
springboot+mybatis+sqlserver 仓库管理系统
SpringBoot+Mybatis+SQLServer构建的仓库管理系统详解》在现代企业信息化管理中,仓库管理系统扮演着至关重要的角色,它能够有效地管理和追踪库存,提高运营效率。
追x
1530
springboot+maven+mybatis 实现管理系统
在"springboot+maven+mybatis 实现管理系统"项目中,开发者已经准备了完整的代码、文档和数据库资料。
Lbaci
819