1. 项目概述:SSM企业人事管理系统
这个基于SSM框架的企业人事管理系统,是我在2019年为某中型制造企业开发的一套内部管理工具。当时企业正从Excel手工管理转向信息化系统,这套75101版本源码经过三年实际生产环境检验,稳定支撑了800+员工的人事管理工作。
系统采用经典的Spring+SpringMVC+MyBatis技术栈,之所以选择SSM而非当时新兴的Spring Boot,主要考虑到两个实际因素:一是企业IT部门已有成熟的Tomcat运维体系,二是需要与遗留的Oracle 11g数据库保持兼容。下面这张技术架构图展示了核心组件关系:
code复制[SSM] → [Spring Security] → [Oracle]
↑ ↑
[前端页面] ← [Redis缓存]
提示:源码中的75101是版本编号规则,75代表部门编号,1表示人事模块,01是迭代版本。这种编码方式在企业内部系统中很常见。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块解析
2.1 员工信息管理中心
采用MyBatis的动态SQL实现多条件复合查询,这是系统使用最频繁的功能模块。其中有个设计细节值得注意:在员工基础信息表中,我们没有直接存储部门名称,而是通过dept_id关联部门表。这种设计虽然增加了联表查询的成本,但保证了数据一致性——当部门名称变更时,所有相关员工信息会自动同步。
xml复制<!-- 示例:MyBatis动态查询语句 -->
<select id="selectByCondition" parameterType="Employee" resultMap="BaseResultMap">
SELECT * FROM employee
<where>
<if test="name != null">AND name like CONCAT('%',#{name},'%')</if>
<if test="deptId != null">AND dept_id = #{deptId}</if>
<if test="status != null">AND status = #{status}</if>
</where>
ORDER BY id DESC LIMIT #{start},#{pageSize}
</select>
2.2 考勤异常处理机制
考勤模块最复杂的不是正常打卡记录处理,而是异常情况判断。系统实现了三级异常处理流程:
- 自动比对排班表与打卡记录(时间容差±15分钟)
- 部门主管确认异常类型(迟到/早退/缺勤)
- HR最终审核并关联奖惩制度
这里有个实际踩过的坑:最初使用Java的Date类型处理时间,在跨时区远程办公场景下出现混乱,后来统一改用LocalDateTime并显式存储时区信息。
2.3 薪资计算引擎
薪资模块采用策略模式设计,核心类图如下:
code复制[SalaryCalculator]
↑
[BaseSalaryStrategy]
[BonusStrategy]
[DeductionStrategy]
特别要注意的是个税计算部分,2019年正值个税改革过渡期,系统需要同时支持新旧两种计算方式。我们在tax_calculation表增加了version字段来区分算法版本,而不是简单覆盖旧逻辑。
3. 关键技术实现细节
3.1 性能优化实践
当员工数量突破500人时,我们遇到了报表查询性能瓶颈。通过以下三步优化将响应时间从12s降至1.5s内:
- 添加复合索引:为高频查询条件创建(name, dept_id, status)的联合索引
- 引入二级缓存:使用Redis缓存组织架构等变化频率低的数据
- SQL重构:将5个关联查询拆分为2个主查询+内存拼接
注意:缓存使用时一定要设置合理的过期时间,我们曾因忘记设置缓存过期导致显示旧的组织结构,引发调岗纠纷。
3.2 安全防护方案
人事系统对安全性要求极高,我们实施了四层防护:
- 传输层:强制HTTPS+证书固定
- 认证层:Spring Security + 验证码+登录失败锁定
- 权限控制:基于RBAC模型,细粒度到按钮级别
- 审计日志:记录所有敏感操作(如薪资修改)
特别提醒:MyBatis使用#{}防止SQL注入,但批量导出功能如果使用${}拼接ORDER BY字段,仍然存在风险。我们最终采用白名单方式校验排序字段。
4. 部署与运维要点
4.1 数据库配置建议
生产环境Oracle配置示例:
properties复制# 连接池配置
spring.datasource.initialSize=5
spring.datasource.maxActive=50
spring.datasource.validationQuery=SELECT 1 FROM DUAL
4.2 常见问题排查
问题现象:批量导入员工信息时报事务超时
排查步骤:
- 检查MySQL的innodb_lock_wait_timeout值(默认50s)
- 分析导入文件是否有循环依赖(如A的上级是B,B的上级又是A)
- 确认@Transactional注解的propagation配置
问题现象:中文姓名显示乱码
解决方案:
- 确保数据库字符集为AL32UTF8
- 在jdbcUrl后添加?useUnicode=true&characterEncoding=UTF-8
- 检查Tomcat的server.xml中URIEncoding="UTF-8"
5. 二次开发建议
如果基于此源码进行扩展,我有几个实用建议:
-
组织架构扩展:当前是简单的树形结构,可考虑引入矩阵式管理模型,添加virtual_dept表支持虚拟项目组
-
移动端适配:增加H5页面适配手机端,建议用Vue重构前端而非继续使用JSP
-
对接OA系统:通过添加webhook模块,实现与钉钉/企业微信的审批流对接
-
数据分析增强:集成Apache POI实现更复杂的Excel报表,注意大文件导出时要分片处理
这套系统最值得借鉴的是它的稳健性设计——没有使用花哨的新技术,但在事务处理、异常恢复、数据一致性等基础能力上做得非常扎实。三年运行期间,核心模块从未出现需要回滚版本的重大故障。
