在企业数字化转型浪潮中,人力资源管理作为企业核心运营环节,正面临从传统手工操作向智能化、集成化管理的转变。传统人事管理存在数据分散、流程割裂、决策支持不足等痛点,亟需一套高效统一的管理解决方案。企业智慧人事管理平台应运而生,基于成熟的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_id和today字段建立复合索引,优化查询性能 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