基于SSM框架的企业人事智慧管理平台 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-02-086 浏览

文章摘要

基于SSM框架的企业人事智慧管理平台旨在通过集成化的信息管理解决传统人事工作中流程分散、数据孤岛和决策支持不足的核心痛点。该平台将员工档案、考勤统计、薪酬核算、绩效评估等模块统一整合,利用Spring的依赖注入与AOP切面编程实现业务逻辑解耦,确保权限校验、事务控制等横切关注点的集中管理。Sprin...

在企业数字化转型浪潮中,人力资源管理作为企业核心运营环节,正面临从传统手工操作向智能化、集成化管理的转变。传统人事管理存在数据分散、流程割裂、决策支持不足等痛点,亟需一套高效统一的管理解决方案。企业智慧人事管理平台应运而生,基于成熟的SSM(Spring+SpringMVC+MyBatis)技术栈构建,为企业提供全方位的人力资源管理服务。

系统架构与技术栈

该平台采用经典的四层架构设计,每一层都充分发挥了相应技术框架的优势:

表现层使用JSP模板引擎结合HTML、CSS和JavaScript构建用户界面,确保良好的用户体验和跨浏览器兼容性。通过Thymeleaf模板的引入,实现了前后端分离的优雅解决方案。

控制层基于SpringMVC框架,采用注解驱动的开发模式。通过@Controller@RestController注解简化请求映射,利用@RequestMapping实现RESTful风格的API设计。

@RestController
@Controller
@RequestMapping("/chuqin")
public class ChuqinController {
    private static final Logger logger = LoggerFactory.getLogger(ChuqinController.class);

    @Autowired
    private ChuqinService chuqinService;

    @Autowired
    private TokenService tokenService;

    /**
     * 后端列表分页查询
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),
                   JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(StringUtil.isNotEmpty(role) && "员工".equals(role)){
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        }
        PageUtils page = chuqinService.queryPage(params);
        return R.ok().put("data", page);
    }
}

服务层采用Spring的依赖注入机制,通过接口与实现分离的设计原则,确保业务逻辑的高内聚低耦合。利用Spring AOP实现事务管理、日志记录和权限校验等横切关注点。

持久层基于MyBatis框架,通过XML映射文件或注解方式实现对象关系映射。MyBatis的动态SQL能力为复杂查询场景提供了强大支持。

数据库设计亮点分析

员工信息表设计

yonghu表的设计体现了高度规范化的数据库设计理念:

CREATE TABLE `yonghu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` varchar(200) DEFAULT NULL COMMENT '账户',
  `password` varchar(200) DEFAULT NULL COMMENT '密码',
  `name` varchar(200) DEFAULT NULL COMMENT '姓名',
  `phone` varchar(200) DEFAULT NULL COMMENT '手机号',
  `id_number` varchar(200) DEFAULT NULL COMMENT '身份证号',
  `birthday_time` timestamp NULL DEFAULT NULL COMMENT '生日',
  `bumen_types` int(11) DEFAULT NULL COMMENT '部门',
  `zhiwei_types` int(11) DEFAULT NULL COMMENT '职位',
  `sex_types` int(11) DEFAULT NULL COMMENT '性别',
  `my_photo` varchar(200) DEFAULT NULL COMMENT '照片',
  `nation` varchar(200) DEFAULT NULL COMMENT '民族',
  `politics_types` int(11) DEFAULT NULL COMMENT '政治面貌',
  `birthplace` varchar(200) DEFAULT NULL COMMENT '籍贯',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='员工'

设计亮点

  • 使用int(11)作为主键类型,结合AUTO_INCREMENT实现高效的主键生成
  • 敏感信息如密码字段采用varchar(200)预留足够长度支持加密存储
  • 类型字段(部门、职位、性别等)使用数字编码,通过字典表关联,提高查询效率
  • timestamp类型精确记录时间信息,支持时区转换
  • 合理的字段注释为后续维护提供便利

考勤表设计优化

chuqin表的设计充分考虑了考勤业务的复杂性:

CREATE TABLE `chuqin` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `yonghu_id` int(11) DEFAULT NULL COMMENT '用户id',
  `today` varchar(200) DEFAULT NULL COMMENT '打卡日期',
  `on_time` timestamp NULL DEFAULT NULL COMMENT '上班打卡时间',
  `down_time` timestamp NULL DEFAULT NULL COMMENT '下班打卡时间',
  `chuqin_types` int(11) DEFAULT NULL COMMENT '打卡类型',
  `overtimeNumber` int(11) DEFAULT NULL COMMENT '加班时间(小时)',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=564 DEFAULT CHARSET=utf8 COMMENT='考勤'

优化策略

  • 分离日期(today)和时间戳(on_time/down_time),支持按日期快速统计
  • overtimeNumber字段记录加班时长,为薪资计算提供数据基础
  • 预计会为yonghu_idtoday字段建立复合索引,优化查询性能
  • chuqin_types字段支持多种考勤状态(正常、迟到、早退、缺勤等)

字典表设计模式

dictionary表采用通用的字典设计模式,实现系统参数的统一管理:

CREATE TABLE `dictionary` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `dic_code` varchar(200) DEFAULT NULL COMMENT '字段',
  `dic_name` varchar(200) DEFAULT NULL COMMENT '字段名',
  `code_index` int(11) DEFAULT NULL COMMENT '编码',
  `index_name` varchar(200) DEFAULT NULL COMMENT '编码名字',
  `super_id` int(11) DEFAULT NULL COMMENT '父字段id',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='字典表'

这种设计支持多级字典结构,通过super_id字段实现父子关系,极大提高了系统的可配置性和扩展性。

核心功能实现深度解析

智能考勤管理模块

考勤管理作为人事系统的核心功能,实现了员工打卡、考勤统计和异常处理的全流程管理。系统通过精确的时间记录和智能规则引擎,自动识别考勤状态。

考勤打卡界面

实体类设计体现了严谨的领域模型思维:

@TableName("chuqin")
public class ChuqinEntity<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.AUTO)
    private Integer id;

    @TableField(value = "yonghu_id")
    private Integer yonghuId;

    @TableField(value = "today")
    private String today;

    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @TableField(value = "on_time", fill = FieldFill.UPDATE)
    private Date onTime;

    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @TableField(value = "down_time", fill = FieldFill.UPDATE)
    private Date downTime;

    @TableField(value = "chuqin_types")
    private Integer chuqinTypes;

    @TableField(value = "overtimeNumber")
    private Integer overtimeNumber;

    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;
    
    // 构造函数、getter和setter方法
    public ChuqinEntity(T t) {
        try {
            BeanUtils.copyProperties(this, t);
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

业务逻辑实现展示了复杂的考勤规则处理:

@Service("chuqinService")
public class ChuqinServiceImpl extends ServiceImpl<ChuqinDao, ChuqinEntity> 
    implements ChuqinService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        String key = (String) params.get("key");
        Wrapper<ChuqinEntity> wrapper = new EntityWrapper<>();
        if(StringUtil.isNotEmpty(key)) {
            wrapper.andNew().like("today", key)
                   .or().like("chuqin_types", key);
        }
        Page<ChuqinEntity> page = this.selectPage(
            new Query<ChuqinEntity>(params).getPage(), wrapper);
        return new PageUtils(page);
    }

    /**
     * 自动计算考勤状态
     */
    public Integer calculateAttendanceStatus(Date onTime, Date downTime) {
        // 规则引擎实现:正常、迟到、早退、缺勤判断
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        String onTimeStr = sdf.format(onTime);
        String downTimeStr = sdf.format(downTime);
        
        // 标准工作时间:9:00-18:00
        if (onTimeStr.compareTo("09:00") > 0) {
            return 2; // 迟到
        } else if (downTimeStr.compareTo("18:00") < 0) {
            return 3; // 早退
        } else if (onTime == null && downTime == null) {
            return 4; // 缺勤
        } else {
            return 1; // 正常
        }
    }
}

薪资管理智能化

薪资模块通过集成考勤、绩效等数据,实现自动化薪资计算。系统支持复杂的薪资结构,包括基本工资、绩效奖金、加班补贴等。

薪资管理界面

薪资计算服务展示了业务规则引擎的实现:

@Service
public class XinziCalculationService {
    
    @Autowired
    private ChuqinService chuqinService;
    
    @Autowired
    private JixiaoService jixiaoService;
    
    /**
     * 计算月度薪资
     */
    public BigDecimal calculateMonthlySalary(Integer yonghuId, String month) {
        // 获取基本工资
        BigDecimal baseSalary = getBaseSalary(yonghuId);
        
        // 计算考勤相关薪资
        BigDecimal attendanceSalary = calculateAttendanceSalary(yonghuId, month);
        
        // 计算绩效奖金
        BigDecimal performanceBonus = calculatePerformanceBonus(yonghuId, month);
        
        // 计算社保公积金扣除
        BigDecimal insuranceDeduction = calculateInsurance(yonghuId);
        
        return baseSalary.add(attendanceSalary)
                        .add(performanceBonus)
                        .subtract(insuranceDeduction);
    }
    
    private BigDecimal calculateAttendanceSalary(Integer yonghuId, String month) {
        // 查询当月考勤记录
        Map<String, Object> params = new HashMap<>();
        params.put("yonghuId", yonghuId);
        params.put("today", month + "%");
        List<ChuqinEntity> attendanceList = chuqinService.selectByMap(params);
        
        BigDecimal attendanceSalary = BigDecimal.ZERO;
        for (ChuqinEntity attendance : attendanceList) {
            // 加班工资计算:正常工资的1.5倍
            if (attendance.getOvertimeNumber() != null && 
                attendance.getOvertimeNumber() > 0) {
                BigDecimal hourlyRate = getHourlyRate(yonghuId);
                BigDecimal overtimePay = hourlyRate.multiply(
                    new BigDecimal(attendance.getOvertimeNumber()))
                    .multiply(new BigDecimal("1.5"));
                attendanceSalary = attendanceSalary.add(overtimePay);
            }
        }
        return attendanceSalary;
    }
}

系统公告管理

公告模块支持富文本编辑和定向发布,确保信息传达的准确性和及时性。

公告管理界面

公告控制器实现了完整的CRUD操作和权限控制:

@RestController
@RequestMapping("/xitonggonggao")
public class XitonggonggaoController {
    
    @Autowired
    private XitonggonggaoService xitonggonggaoService;

    /**
     * 后端保存公告
     */
    @RequestMapping("/save")
    public R save(@RequestBody XitonggonggaoEntity xitonggonggao, 
                 HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,xitonggonggao:{}",
                   this.getClass().getName(), xitonggonggao.toString());
        
        // 权限验证
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(!role.equals("管理员")) {
            return R.error("无权限操作");
        }
        
        // 设置创建时间
        xitonggonggao.setAddtime(new Date());
        xitonggonggaoService.insert(xitonggonggao);
        return R.ok();
    }

    /**
     * 前端获取公告列表
     */
    @IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        logger.debug("list方法:,,Controller:{},,params:{}",
                   this.getClass().getName(), JSONObject.toJSONString(params));
        
        // 只查询已发布的公告,按时间倒序排列
        EntityWrapper<XitonggonggaoEntity> ew = new EntityWrapper<>();
        ew.orderBy("riqi", false);
        PageUtils page = xitonggonggaoService.queryPage(params, ew);
        return R.ok().put("data", page);
    }
}

权限管理与安全控制

系统采用基于角色的访问控制(RBAC)模型,确保数据安全性和操作合规性。

Token验证服务实现了JWT令牌机制:

@Service("tokenService")
public class TokenService {
    
    private static final int EXPIRE = 60 * 60 * 12; // 12小时过期
    
    public String generateToken(Integer userId, String username, String role) {
        Date now = new Date();
        Date expireDate = new Date(now.getTime() + EXPIRE * 1000);
        
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setSubject(userId.toString())
                .claim("username", username)
                .claim("role", role)
                .setIssuedAt(now)
                .setExpiration(expireDate)
                .signWith(SignatureAlgorithm.HS512, "secret")
                .compact();
    }
    
    public boolean verifyToken(String token) {
        try {
            Jwts.parser().setSigningKey("secret").parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

实体模型设计的精妙之处

系统实体类设计充分体现了领域驱动设计(DDD)的思想,每个实体都承载了丰富的业务语义。

员工实体类的完整实现展示了严谨的建模思路:

/**
 * 员工实体
 */
@TableName("yonghu")
public class YonghuEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(type = IdType.AUTO)
    private Integer id;

    @NotBlank(message = "账户不能为空")
    @TableField(value = "username")
    private String username;

    @NotBlank(message = "密码不能为空")
    @TableField(value = "password")
    private String password;

    @NotBlank(message = "姓名不能为空")
    @TableField(value = "name")
    private String name;

    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @TableField(value = "phone")
    private String phone;

    @TableField(value = "id_number")
    private String idNumber;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @TableField(value = "birthday_time")
    private Date birthdayTime;

    @NotNull(message = "部门不能为空")
    @TableField(value = "bumen_types")
    private Integer bumenTypes;

    @NotNull(message = "职位不能为空")
    @TableField(value = "zhiwei_types")
    private Integer zhiweiTypes;

    @TableField(value = "sex_types")
    private Integer sexTypes;

    @TableField(value = "my_photo")
    private String myPhoto;

    @TableField(value = "nation")
    private String nation;

    @TableField(value = "politics_types")
    private Integer politicsTypes;

    @TableField(value = "birthplace")
    private String birthplace;

    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    // 关联对象(非数据库字段)
    @TableField(exist = false)
    private String bumenTypesValue;
    
    @TableField(exist = false)
    private String zhiweiTypesValue;

    // 构造方法、getter、setter等
    public YonghuEntity() {}

    // 业务方法
    public Integer getAge() {
        if (birthdayTime != null) {
            return Period.between(
                birthdayTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
                LocalDate.now()
            ).getYears();
        }
        return null;
    }
}

功能展望与系统优化方向

基于当前系统架构和业务需求,未来可从以下几个方向进行深度优化:

1. 缓存层引入与性能优化

现状分析:系统频繁查询字典表、部门信息等静态数据,存在性能瓶颈。

优化方案

@Service
public class DictionaryCacheService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private
本文关键词
SSM框架企业人事管理智慧管理平台源码解析人力资源管理

上下篇

上一篇
没有更多文章
下一篇
没有更多文章