基于SpringBoot的人事管理系统

基于 Spring Boot 框架的人事管理系统的设计与实现 内容摘要 : 人事管理在政府机关和企事业单位中占有极其重要的地位,各部门岗位之间协作和工效的提高

本文包含相关资料包-----> 点击直达获取<-------

基于 Spring Boot 框架的人事管理系统的设计与实现

内容摘要 : 人事管理在政府机关和企事业单位中占有极其重要的地位,各部门岗位之间协作和工效的提高,是人事管理的基本要求.本设计旨在实现微型人事管理信息系统,功能主要由人事在线通信、员工资料、人事信息管理、薪资调整分配、统计分析管理和系统设置管理系统构成.系统实现了员工信息编辑、人事信息入库展示分析、工资套帐处理及系统的设置、点对点在线讯息等功能.本设计在技术方面采用了较前沿的技术,应用端基于 Java EE 体系中开源应用框架 Spring Boot(集成 IOC, MVC, ORM),Spring Security (安全框架),内嵌 Tomcat 服务器;前端基于 JavaScript 的渐进式框架 Vue.js;页面设计基于 Element UI 库;路由处理基于 vue-router.数据库端使用 MySQL 数据库;系统架构基于当前主流的 MVVM(Model-View-View Model)模式,前后端分离的 SPA(single page Web application),即单页富应用程序.

关键词 :人事管理; MVVM; Spring Boot; Vue.js; RBAC;

一、引言

1.1 研发背景

目前,人事管理的系统大都是 CS 架构的大型系统,很少有面向机关,事业单位内部的基于 BS 架构的微型人事系统,因此.开发一个基于 BS 架构的人事信息管理系统是非常必要的.但是基于 BS 架构的人事系统对于安全是一个大的考验点.在人事信息系统中,功能需简单清晰,可操作性强,其次安全和权限是关键点.对人事信息的保密涉及到安全处理,对不同的操作员角色根据保密级别给予不同权限,是当前信息系统的基本需求.

1.2 研发的目的及意义

基于 Spring Boot 的人事管理系统符合当下的生产实际需求,对于一般的机关和事业单位来讲,对人事系统在功能方面没有复杂的需求,满足基本需求即可,同时,要求软件的经济成本较低,界面相对好看,实施部署容易,即不需要通过 SaaS 平台供应商耗费大量金钱,由内部人员实施维护.所以本设计的实现是很有意义的.

1.3 国内外研发现状

人事管理的系统软件的研发在多年来不断发展.不断革新.在公共管理学科领域中对"E-HR 成功实施"的不断探索为 E-HR 的研发提供了理论和前提.国外的发展相较于国内早 30 多年.成熟的产品有 SPA,Oracle 等.国内而言.术业有专攻.不同的业务场景有不用的强势产品.制造行业的有汇通科技.国有企业的有宏景软件.互联网行业的有欢雀 HR.综合性较强的有用友,金蝶等等.

二、项目概述

人事管理系统功能包括人事通讯,员工信息,人事考评,奖惩,培训管理,薪资管理,统计分析,和系统管理六大模块,对应人事工作基本流程:新员工入职档案建立,调动,辞职,员工信息的查询及工资管理等方面.系统管理可以根据不同的角色分配菜单权限设置,不同的用户授予不同角色,对人事结构,单位结构进行整体调配设置.在线聊天可以实现操作员之间讯息的及时通讯.

项目基于 MVVM 的前后端分离开发模式进行开发.MVVM 即模型(Model)-视图(View)-视图模型(View Model),实现了数据视图的双向绑定.相对于 MVC 模式和 MVP 来说,MVVM 是一个比较新的开发架构,它是一种将 MVP 模式与 WPF 相结合应用方式发展演变而成的新型开发架.[1]

前后端分离是指将前端和后端从之前的全部由后端负责中分离开来,不再共用一个 Server,前端作为一个独立 Serve 存在.[2]前后端通过接口使用 HTTP 协议交互,本项目使用 vu 实体属性 outer 做前端路由处理.页面跳转不在由后端处理,前后端只是数据的交互.前后端分离的好处在于降低了前后端的耦合性.当面对不同的硬件场景时,需要构建不同的界面,前后端分离之后,只需要扩展前端项目即可,不需要修改后端服务.

在动态权限处理方面,使用安全框架 Spring Security,基于 RBAC(Role-Based Access Control )角色的访问控制模型,由该模型主要由鉴权和授权构成,鉴权基于 Servlet 中 Filter 原理处理,授权由系统管理员操作.RBAC 的主要思想是:权限是和角色相关的,而用户则被分配相应的角色作为其成员,这样就大大简化了权限的管理.[3]

三、系统分析

3.1 系统可行性分析

3.1.1 运营可行

本系统在打包之后整体大小只有 38MB,硬件内存需求相当于一个移动端的普通 App 大小,运行内存基本上普通的单核 CPU,2G RAM 的 ESC 就可以满足需求,系统硬件需求低.访问兼容大部分浏览器(IE8/9/10/11,Chrome,Firefox),用户体验处理上,由前端视图操作通知,结合后端逻辑处理消息构成.响应用户的每一步操作.构建了良好的用户体验.

3.1.2 技术可行性

本系统中技术使用,后端技术涉及到 Spring Boot,Spring Security, MyBatis, MySQL 等,前端技术设计到 Vue, ElementUI, axios,Web Socket 等.系统架构基于 B/S 架构.

Spring Boot 是当前流行的 Java EE 体系框架,Spring Boot 提供了一种新的编程范式,能在小的阻力下开发 Spring 应用程序,可以更加敏捷地开发 Spring 应用程序,专注于应用程序的功能,不用在 Spring 的配置上多花功夫,甚至完全不用配置.Spring Boot 遵循约定大于配置的理念,在父子工程理念上极大程度上解决了依赖冲突的问题.

Spring Security 是 Spring 家族中的安全框架,Spring Boot 对于 Spring Security 提供了自动化配置方案,可以零配置使用 Spring Security .Spring Security 借助过滤器技术对 Web 应用进行保护,包括认证和授权两个过程.

Mybatis,MySQL 是持久化技术,都是开源轻量,Mybatis 是 ORM 解决方案,MySQL 是数据库系统.

Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用,Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.

axios 是基于 Promise 用于浏览器和 node.js 的 HTTP 客户端的异步编程解决方案,可以从浏览器中创建 XMLHttpRequests,从 node.js 中创建 http 请求,支持 Promise API,拦截请求和响应,转换请求数据和响应数据,客户端支持防御 XSRF 等.

vu 实体属性 outer 在项目中用于前端动态加载路由管理.SPA 应用来讲,其实就是在前后端分离的基础上,加一层前端路由,即是由前端来维护路由规则,实现有两种,一种是利用 url 的 hash,另一种就是 HTML5 的 History 模式.[8]这里我们使用 vu 实体属性 outer 的 hash 方式.

B/S 架构是对 C/S 架构的一种改进,软件应用的业务逻辑完全由服务端实现[9],依托于浏览器,相对于 C/S 更轻量,用户体验要差一些,但是基于 B/S 的 SPA 和 AJAX 技术完美的解决了这个问题.

3.1.3 经济可行性

实现人事管理的自动化,HR 在减少失误的同时精简许多费用开支,在硬件消耗上依托于互联网.同时开发使用技术工具基本为开源产品技术.

3.2 系统流程分析

本系统所有管理员或操作员经由自定义验证,表单验证通过之后,会进行请求路径分析,Spring Security 会进行鉴权处理,确认当前登录用户的角色,匹配放行响应的资源.之后进行的业务,都是经过鉴权处理的,管理员对系统的操作都将被记录在日志里.前端会对所有请求拦截进行统一处理.分析需要返回数据还是消息.

3.2.1 系统访问控制流程图

访问控制基于 RBAC0 模型.由于之相对应的数据实体构成.由用户表,角色映射表,角色表,权限表,权限映射表构成.用户登录之后首先进行身份验证,成功之后获取当前用户的所有角色,之后根据角色加载对应的权限菜单, 前端为了良好的用户体验,这里默认不加载没有权限的菜单.当存在直接输入 URL 路径的情况时,对于登录用户的每一个请求,都会通过鉴权处理,分析角色.最后通过权限的判断分析是否可以访问菜单资源.

3.3 图 1 RBAC0 模型图

3.4 图 2 系统访问控制流程图

用户登录成功之后.选中不同的菜单.进行具体的业务处理.

3.4.1 系统业务操作流图

3.5 图 3 顶级数据流图

四、系统设计

4.1 系统功能模块设计

4.2 图 4 系统功能模块图

4.3 系统概念模型设计

系统实体部分 ER 图

图 5 员工实体属性图

图 6 员工奖惩实体属性图

图 7 操作日志实体属性图

图 8 操作员实体属性图

4.4 物理数据模型设计

在物理模型设计中,即将实体属性图的属性映射为具体的数据表中对应的列,在设计表中,除了要满足一些基本的建表规约,范式,还要根据具体的业务操作,考虑索引,表结构优化,以及在之后的系统业务需求迭代中的数据存储等问题.对于模式中的其他的结构,视图存储过程等,结合数据库事务特性合理创建.

表 1 appraise 表

列名 数值类型 是否为空 备注
id int(11) NOT NULL 主键 id
eid int(11) NULL 编号
appDate date NULL 考评日期
appResult varchar(255) NULL 考评结果
appContent varchar(255) NULL 考评内容
remark varchar(255) NULL 备注

表 2 employeeec 表

列名 数值类型 是否为空 备注
id int(11) NOT NULL 主键 id
eid int(11) NULL 员工编号
ecDate date NULL 奖罚日期
ecReason varchar(255) NULL 奖罚原因
ecPoint int(11) NULL 奖罚分
ecType int(11) NULL 奖罚类别
remark varchar(255) NULL 备注

表 3 salary 工资表

列名 数值类型 是否为空 备注
id int(11) NOT NULL 主键 id
basicSalary int(11) NULL 基本工资
bonus int(11) NULL 奖金
lunchSalary int(11) NULL 午餐补助
trafficSalary int(11) NULL 交通补助
allSalary int(11) NULL 应发工资
pensionBase int(11) NULL 养老金基数
pensionPer float NULL 养老金比率
createDate timestamp NULL 启用时间
medicalBase int(11) NULL 医疗基数
medicalPer float NULL 医疗保险比率
accumulationFundBase int(11) NULL 公积金基数
accumulationFundPer float NULL 公积金比率
name varchar(255) NULL 名称

表 4 employee 表

列名 数值类型 是否为空 备注
id int(11) NOT NULL 员工编号
name varchar(10) NULL 员工姓名
gender char(4) NULL 性别
birthday date NULL 出生日期
idCard char(18) NULL 身份证号
wedlock enum('已婚','未婚','离异') NULL 婚姻状况
nationId int(8) NULL 民族
nativePlace varchar(20) NULL 籍贯
politicId int(8) NULL 政治面貌
email varchar(20) NULL 邮箱
phone varchar(11) NULL 电话号码
address varchar(64) NULL 联系地址
departmentId int(11) NULL 所属部门
jobLevelId int(11) NULL 职称 ID
posId int(11) NULL 职位 ID
engageForm varchar(8) NULL 聘用形式
tiptopDegree enum('博士','硕士…… NULL 最高学历
specialty varchar(32) NULL 所属专业
school varchar(32) NULL 毕业院校
beginDate date NULL 入职日期
workState enum('在职','离职') NULL 在职状态
workID char(8) NULL 工号
contractTerm double NULL 合同期限
conversionTime date NULL 转正日期
notWorkDate date NULL 离职日期
beginContract date NULL 合同起始日期
endContract date NULL 合同终止日期
workAge int(11) NULL 工龄

表 5 oplog 表

列名 数值类型 是否为空 备注
id int(11) NOT NULL 主键 id
addDate date NULL 添加日期
operate varchar(255) NULL 操作内容
hrid int(11) NULL 操作员 ID

五、系统实现

用户登录访问后由 Spring Security 的 WebSecurityConfigurerAdapter 类实现认证和授权校验.登录成功后跳转主页,之后的每一次访问都会通过校验用户,角色,基于 Ant 格式的 URL 权限的匹配.

图 9 Spring Security 授权流程图

5.1 公共模块

5.1.1 主页

主页由日志和系统公告构成.逻辑处理上默认加载最新的操作日志及公告信息,数据展示通过 Spring 定时任务方式.服务端定时执行 SQL.以排序和截取方式获取最新入库数据,动态更新数据.

图 10 系统主页

5.1.2 在线聊天

在线聊天实现点对点的在线通讯.前端基于全双工通信 WebSocket 实现, WebSocket 由 HTTP 建立连接,由 TCP 进行会话,Web 服务器与客户端之间建立起 WebSocket 协议的连接,之后的协议都依靠专用协议进行,通信过程中可以互发送 JSON,XML,HTML 或图片等任意格式的数据,由于是建立在 HTTP 基础的协议上,即发起方仍是客户端,一旦确立 WebSocket 通信连接,不论服务器还是客户端,任意一方都可以直接向对方发送报文.[10] 在处理逻辑上.由键值对构建消息对象.

后端基于 Spring 框架提供的 WebSocket 的 STOMP 支持, STOMP 是一个简单的可互操作的协议, 通常被用于通过中间服务器在客户端之间进行异步消息传递.

图 11 在线聊天

5.2 员工资料

5.2.1 基本资料

实现对员工基本资料的增删改查.实现员工基本资料表 Excel 导入导出,多条件搜索.添加员工由数据库自动生成工号,其他信息为必填项.修改根据 id 进行数据更新.

图 12 基本资料

5.2.2 高级资料

高级资料主要实现查询功能,由以下三部分信息构成:

  • 培训资料:培训日期,培训内容.
  • 考评资料:考评日期,考评内容,考评结果.
  • 工资信息:账套名称,基本工资.

5.3 人事管理

5.3.1 员工奖惩.

人事管理主要用于对员工奖惩,培训,考评,调动信息的管理.员工奖惩主要对员工奖惩模块的增删改查的实现.在 UI 设计上使用穿梭框和 tab 标签,逻辑处理上员工实体和奖惩信息是一对多的关系,即对同一员工在相同或者不同时间都可以添加多个奖惩,奖惩管理页面显示有奖惩信息的全部员工,可以查看奖惩详情.

图 13 员工奖惩管理

5.3.2 员工培训

员工培训模块主要是对员工培训业务的增删改查的实现.员工培训由添加培训和培训管理两个子模块构成.在 UI 设计上加了进度条.逻辑处理上是一对一的关系,即同一员工在一个时间段只能参加一个培训,培训完成删除当前培训后可以添加新的培训,支持批量添加培训,培训进度修改.

5.3.3 员工好评

员工好评模块即对员工评价业务的增删改查的实现.UI 设计上结合评分条步骤条,支持批量添加评价.逻辑处理上是一对一的关系.

5.3.4 员工调动

员工调动模块即对员工调用的增删改查的实现.UI 设计上由 table 内嵌 table 构成,逻辑处理上是一对多的关系.

图 14 员工调动

5.4 工资管理

5.4.1 工资账套管理

实现对员工工资账套管理,员工账套设置,工资表管理,查询一系列对员工工资管理的功能.工资账套管理主要对员工奖金,基本工资,提成等各项的增刪改查. 设置当前套账信息.

5.4.2 员工账套设置

员工讨账设置主要根据公司账套查看相应的员工的工资信息,并实现员工套账的其增删功能.

5.4.3 工资表管理

工资表管理集中对员工工资,进行搜索查看的功能.添加筛选过滤功能,可以根据不同的职称部门进行表内筛选,工资套账详情查看.

图 15 员工工资管理

5.5 统计管理

统计管理主要对员工资料的动态分析统计,包括员工积分统计,人事信息统计,人事记录统计.在设计方面结合图表处理 VeCharts,由服务端对数据进行了整合,由 VeCharts 展示.代码方面,结合 java8 的 Stream API 及数据库端聚合函数实现.数据动态展示基于 Spring 定时任务.

5.5.1 员工积分统计

根据工号查找员工的积分情况.以条形图显示当前有积分员工的积分分布情况.积分分值由员工奖惩产生.

5.5.2 人事信息统计

人事信息统计主要对员工人数信息进行的分析统计,饼图的方式展示.以高校.职称.职位.党派.民族.学历.部门为维度的人员分布图,用于人事统计.

5.5.3 人事记录统计

人事记录统计主要对员工离职信息的统计,以部门.职称.职位为维度,对员工离职率,离职工龄,离职年龄进行分析.以柱状图结合折线图的方式统计.

图 16 人事记录统计

部分代码:

c++ public List<DataModel> dataViewschool() { List<Employee> employeeList = employeeMapper.selectByPrimaryKey(); Map<String, Integer> map = new HashMap<>(); List<DataModel> dataModels = new ArrayList<>(); employeeList.stream().forEach(o -> { if (!map.containsKey(o.getSchool())) { map.put(o.getSchool(), 1); } else { map.put(o.getSchool(), map.get(o.getSchool()) + 1); } }); map.forEach((o1, o2) -> { dataModels.add(new DataModel(o1, o2)); }); return dataModels; } public List<DataModelT> dataViewWorkAge() { List<DataModelT> dataModelTS = new ArrayList<>(); dataViewPosition().stream().forEach(o -> { dataModelTS.add(new DataModelT(o.getSum(), o.getName())); }); List<EmployeeRecycle> employeeRecycleList = employeeRecycleService.getAllEmployeeRecycle(); employeeRecycleService.dataViewPosition().stream() .forEach(o -> { dataModelTS.stream() .filter(o1 -> o.getName().equals(o1.getName())) .forEach(o1 -> { o1.setDimission(o.getSum()); o1.setSum(o.getWorkage()); o1.setaDouble((double) Math.round((o.getSum() / new Double(employeeRecycleList.size())) * 100) / 100); }); }); return dataModelTS; }

5.6 系统管理

5.6.1 基础信设置

系统管理主要对系统,管理员等一些操作,包括基础设置,系统管理,操作员管理,授权处理.基础信息设置主要对部门,职位,职称,奖惩规则和权限组的设置增删查改功能管理,实现部门树,权限树预览.职称等级设置.奖惩描述自定义及使用模糊提示等.

部门管理主要以多叉树的方式实现部门信息展示.及添加删除部门的操作.展示的实现由在 Server 端基于递归 SQL 的方式遍历部门树.删除操作当存在子部门.不能删除父部门.只能从叶子部门进行删除操作.添加不受限制.

员工职位管理即对企业职位的管理.由职位展示查询及自定义职位添加删除更改职位状态构成.员工奖惩管理主要用于自定义员工奖惩.由添加奖惩类型.分值.描述及删除修改编辑构成.自定义奖惩描述可以使用以有描述.也可以自己定义.员工职称管理于职位管理类似.由职称展示查询及自定义职称添加删除,更改职称状态构成.不同在于职称有对应等级.添加时需要选择职称等级.

用户权限管理由权限树预览.角色添加.角色权限设置构成.权限树在数据处理上以二叉树的结构展示.因为只有两级菜单.对于不同角色通过权限树的设置.赋予不同菜单权限.权限树预览是基于 VeCharts 树形图表的展示.在 UI 设计上.以折叠面板和 Tree 树型组件方式实现.

图 17 用户权限管理

5.6.2 系统管理

系统管理主要由公告管理和公告编辑构成.公告编辑主要结合 VueQuillEditor 富文本第三方扩展实现,有标题和具体公告内容构成.公告管理包括公告修改,公告预览,公告删除.可以动态修改所有公告信息并实现预览.

图 18 公告编辑

5.6.3 操作日志管理

操作日志管理主要展示登录用户对系统的操作信息.记录具体人事操作,便于以后的信息检索,功能上实现由日志类型,日期间隔的日志查询.

5.6.4 操作员管理

操作员管理在 UI 设计上使用卡片组件,弹性布局处理.功能包括基本信息展示,刪改功能.具体由管理员角色权限的设置,是否启用的修改,删除管理员操作构成,在权限修改上以相互赋予的方式实现,即登录用户不能自己给自己赋值.只能通过其他用户赋予权限.

图 19 操作员管理

六、系统测试

软件在设计后必须进行测试,主要从系统性能测试,功能测试和测试结果分析进行描述.

6.1 软件测试的目的

  • 确认软件的质量,即软件是否满足了所有功能或性能需求.
  • 将测试信息提供给开发,运维或项目经理,为之后的风险评估等做准备.
  • 确保整个软件开发过程的质量,如果一个软件产品开发完成之后,发现了很多问题,这说明此软件开发过程很可能是有缺陷的.

6.2 功能测试

功能测试主要是基于黑盒测试的方法,也就是不管某个功能后台代码的业务 实现逻辑是怎样,只需要根据开发人员提供的接口相关的测试数据,从前端界面或使用第三方工具如 Postman 等对各模块功能中的主要操作进行了功能测试.

表 6 系统功能测试表

功能测试 员工基本信息管理 员工基本信息管理 员工基本信息管理 员工基本信息管理 员工基本信息管理
测试目的 操作是否得到响应 操作是否得到响应 操作是否得到响应 操作是否得到响应 操作是否得到响应
测试内容 操作描述 数据 期望结果 实际结果 测试状态
删除员工 单机删除;按钮 -- 员工列消失,数据数据库没有;数据 员工列消失,数据数据库没有;数据 与预期;结果相同
修改员工;信息 单机员工列;修改按钮,输;入修改数据 姓名:小明 106;改为:小明 107 员工列数据;变成小明;107 员工列数据;变成小明;107 与预期;结果相同
搜索员工;信息 输入员工信;息,单机搜索 搜索框输入:;小明 107 小明 107;列显示 小明 107;列显示 与预期;结果相同
添加员工 单机添加,输入数据 小明 108….. 小明 108;列显示 小明 108;列显示 与预期;结果相同

6.3 测试结论

在开发中,开发流程是先设计界面,然后写接口,之后使用 Postman 进行接口测试,确认返回的 JSON 没有问题之后,写前端逻辑.最后会进行数据测试,项目中 Spring Boot 集成 Juntil 框架提拱了很好的测试手段,可以快速构建测试案例,同时基于断言策略很好的提供了对功能逻辑的正确性检查,在测试过程中,我发现对于异常的处理,不能在项目开始就定义全局异常处理器,即使定义,也不能直接定义父类异常,如果直接定义父类异常,Spring Boot 会直接处理异常返回白页(空白页),这样的话,不利于溯源异常点.

七、结束语

通过对基于 Spring Boot 框架的人事系统的开发,我对系统开发有一个更清楚的了解,系统的开发过程中,不但熟悉了人事系统业务需求,同时,也拓宽了我对 Spring Boot,Linux 的认知.对前后端分离的 SPA 有了新的认识,尤其是前后端分离的权限控制,前端更多的是为了良好的用户体验,正真处理权限的是后端的处理.同时对于 RBAC 权限管理模型有了新的认识.

相比于其他的大型的 e-HR 系统,比如钉钉之类商业软件,本系统显得相形见绌,但是我们面向的需求不同,相对于钉钉而言,功能众多,操作略显复杂,面向企业办公,而本系统功能简单轻量,属于 BS 架构 Web 版,面向基本的人事需求,即主要的使用人员是企业单位的 HR.

在人事管理的业务方面,本系统涉及业务逻辑较浅,与人事关联的考勤,工资,日常审批的业务,本系统都没有涉及到.在系统架构方面,本系统使用基本单模块,单服务,功能之间耦合性强.在此基础上,可以随着业务的深入进行模块服务解耦,实现多服务,接口交互架构.在多服务的基础上还可以进行云原生微服务架构.在使用场景方面,除了 PC 端,还可以开发面向微信的流应用,即微信小程序.所以,本系统的有很大的迭代升级空间.

参考文献

  • 基于Struts+Hibernate的人力资源管理系统(吉林大学·金勇杰)
  • 置信培训学校人力资源信息管理系统的设计与实现(电子科技大学·程敬)
  • 某认证中心HR系统的设计与实现(山东大学·周庆华)
  • 人事管理系统设计与开发(石家庄铁道大学·陈美伊)
  • 基于Spring Cloud的企业人事管理系统的设计与实现(吉林大学·王佳越)
  • 基于J2EE架构的企业人事管理系统的研究与开发(电子科技大学·张勇)
  • 基于Hibernate的人事管理系统(华东师范大学·赵炳森)
  • 基于SSH框架的人力资源管理系统的设计与开发(电子科技大学·唐伟)
  • 基于Spring Cloud的企业人事管理系统的设计与实现(吉林大学·王佳越)
  • 基于J2EE架构的人力资源管理系统的设计与实现(复旦大学·吴庆杰)
  • 人力资源管理系统设计(山东大学·郑重)
  • 基于J2EE架构的人力资源管理系统的设计与实现(复旦大学·吴庆杰)
  • 长春市水务集团人力资源管理系统的设计及实现(吉林大学·尤博楠)
  • 基于SSH框架的人力资源管理系统的设计与实现(吉林大学·陆贯中)
  • 基于.NET的企业智能人事管理系统的设计与实现(西安科技大学·娄荣荣)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码工厂 ,原文地址:https://m.bishedaima.com/yuanma/35806.html

相关推荐

发表回复

登录后才能评论