-
人力资源系统
2008-11-30 15:15:59培训末期,历时近一个月,独立完成了人力资源系统.采用的是SSH架构,开发效率相比J2EE框架大大提高了.Struts负责呈现层,页面全部采用Struts标签,使得代码整齐,美观.Hibernate负责持久层,使得操作更加面向对象....培训末期,历时近一个月,独立完成了人力资源系统.采用的是SSH架构,开发效率相比J2EE框架大大提高了.Struts负责呈现层,页面全部采用Struts标签,使得代码整齐,美观.Hibernate负责持久层,使得操作更加面向对象.Spring负责业务逻辑层,有容器管理对象的创建和对象之间的依赖关系,还有进行外部应用的整合.(未完待续......)转载于:https://blog.51cto.com/52java/116265
-
SAP人力资源系统架构与经验分享_人力资源体系架构图
2020-08-03 16:11:26SAP人力资源系统架构与经验分享.ppt -
同享eHR软件人力资源系统HCM系统_hr人力资源系统
2020-09-16 02:27:38基于互联网+的人力资源管理平台 同享科技 TONGXIANG TECHNOLOGY 中国最精细的人力资源管理软件 叫目录 关于同享产品价值功能模块实施推动服务支持 关于同享 @9 奋5米 同享团队 东莞同享 ehR 事业群 SAP 事业群 业务... -
HR人力资源系统.zip
2021-03-15 12:42:10HR人力资源系统该系统提供了对 人员管理、人员调动、薪酬管理、代表事项、流程中心、基础设施、学校信息、系统配置、系统结构、图标管理 、健康检查、统一身份认证平台、消息提醒等模块。 -
人力资源系统需求规格说明书.pdf
2020-11-02 16:01:58人力资源系统需求规格说明书 -
XX人力资源系统改进项目管理者手册
2020-12-28 22:29:00人事部门都需要XX人力资源系统改进项目管理者手册来做统计规划,小编带来了详细模板供大家参考,作为一个...该文档为XX人力资源系统改进项目管理者手册,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以... -
企业人力资源系统_需求_原型
2016-12-29 10:37:08企业人力资源系统_需求_原型 -
基于战略的企业人力资源系统整合与管理.pptx
2020-06-14 12:05:012基于系统效率的困惑 企业人员不断投入但业绩并未相应提高员工创业激情衰竭人均效率递减人力资源系统效率低 问题导向与系统构建的矛盾 人力资源管理头痛医头脚痛医脚改革多动症 人力资源各专业职能模块如何进行系统... -
JavaEE 课程设计 SSM框架 人力资源系统
2018-11-09 09:45:42利用SSM框架实现的人力资源系统,本人亲自测试,可以用,界面比较简单,适合入门SSM框架的小伙伴使用,直接导入maven项目就可以啦 -
某集团SAPHR人力资源系统用户操作手册.docx
2020-07-01 19:05:54Wiimer稳健集团SAP HR Wiimer 稳健集团SAP HR 人力资源系统 用户操作手册 第 第 PAGE #页共84页 绝密 Wiimer稳健集团SAP HR Wiimer 稳健集团SAP HR 人力资源系统 用户操作手册 第 第 PAGE #页共84页 绝密 (vtimer... -
人力资源系统需求规格说明书-功能性需求说明.docx
2020-02-28 14:57:06软件需求规格说明书 人力资源系统 需求规格说明书 编号XXX-HR-DEV-SRS 版本1.0 1 / 13 档案管 档案管理设置 人力资源档案登记 人力资源档案复核 人力资源档案变更 系统设置 人力资源档案管理 人力资源档案查询 人力... -
基于Laravel + Vue + Element 实现 人力资源系统(考勤应用 )
2020-10-16 02:11:19Bee 是人力资源系统中的考勤应用,主要功能用于员工申请假单。接下来通过本文给大家介绍基于Laravel + Vue + Element 考勤应用 之 人力资源系统,需要的朋友可以参考下 -
人力资源系统简单流程介绍
2020-04-18 23:26:05人力资源系统简单流程介绍HRM人力资源管理系统项目简介项目结构(1)整体功能在这里插入图片描述(2)模块划分(3)整体架构分析(4)技术使用(5)团队成员负责模块及任务(1)系统管理中心:(2)课程中心(3)用户...人力资源系统简单流程介绍
HRM人力资源管理系统
XXX人力资源管理平台
项目简介
XXX公司推出的专业在线教育平台,聚合大量优质教育机构和名师,下设职业培训、公务员考试、托福雅思、考证考级、英语口语、中小学教育等众多在线学习精品课程,打造老师在线上课教学、学生及时互动学习的课堂。对于培训机构而言,可以入驻平台,发布相应的课程信息,也可以和企业定向合作进行定点培训。该项目分为6大模块:课程中心,岗位中心,用户中心,鉴权中心,机构管理中心,系统管理中心;
项目结构
(1)整体功能
(2)模块划分
该项目整体分为6大模板: 课程中心 :管理发布课程,课程的搜索服务 岗位中心 :管理发布岗位信息,岗位的搜索服务 用户中心 :用户注册,用户信息,用户的课程申请和订单管理 鉴权中心 :用户登录以及权限控制 机构管理中心 :机构入驻与管理 系统管理中心 :数据字典,员工角色权限信息的维护
(3)整体架构分析
项目是前后端分离架构,前端使用vue,后端采用springboot+springcloud微服务架构,springboot搭建单个服务,springcloud治理服务。
(4)技术使用
SpringBoot、SpringCloud、Mybatis-Plus、Redis、FastDFS、Elasticsearch、Vue、ElementUI、 Velocity、RabbitMQ 、Gitlab
(5)团队成员
项目经理:1、架构师:1、UI:1、前端:2、后端:4、测试:2、运维:1。
负责模块及任务
(1)系统管理中心:
需求:hrm人力资源系统是一个出租型服务,需要有需求的公司入驻,购买套餐,获得相应的服务。
搭建:基于SSM框架,配置注册Eureka,使用配置中心,配置网关路由
负责任务:基于代码生成器实现租户表的CRUD,租户入驻:使用FastDFS分布式文件系统实现租户LOGO文件的管理,使用百度地图接口,收集租户的地址。
(2)课程中心
需求:通过主站首页的链接跳转到课程中心门户,在课程中心门户首页有课程类型列表 - 后台:维护课程类型,选中某个类型后跳转到课程的列表页,列表课程信息 - 后台:维护课程信息,选中某个课程跳转到课程详情页,展示课程的详细信息,在课程的详情页可进行课程的购买,线上购买,线下学习,门户网站是高并发,需要进行页面静态化
搭建:基于SSM框架,配置注册Eureka,使用配置中心,配置网关路由
负责任务:使用循环+map的方式完成无线级别课程类型树数据的查询,使用redis对课程类型树的数据进行缓存,在前台页面展示,课程信息维护:基本信息,课程详情,市场信息,图片信息,课程管理表需要反三范式设计,创建人名称和机构名称冗余到了课程基本信息表,完成课程上下线:课程上线时,将上线课程的数据保存到ElasticSearch中,前台只能检索已经上线的课程。课程下线时:将上线课程的数据从ElasticSearch中删除。增删改时同步操作。使用velocity模板引擎技术,实现课程首页页面静态化,将静态化页面上传到FastDFS中,使用RabbitMQ消息队列接收fileId,下载页面完成静态化。课程中心首页:课程类型选择跳转,面包屑加载,课程的分页高级排序搜索。
(3)用户中心
需求:用户注册和登陆,各种用户的信息维护
搭建:基于SSM框架,配置注册Eureka,使用配置中心,配置网关路由
负责任务:用户注册:使用redis技术实现图形验证码注册,使用阿里云短信服务接口+redis实现短信验证码注册,同时进行用户注册其余信息的维护。用户登录:使用redis+cookie完成用户单点登录。
问题及解决
(1)前后联调登录时:跨域问题
首先对于跨域的概念是:请求从一个域发出,访问另一个域的资源 ip:端口号 -> 另一个或者端口的资源, 只要ip或者端口不同,都认定为不同的域,如果之间有资源访问,这种行为叫做跨域访问
但不是所有的跨域都会出现跨域问题,跨域问题出现在:出现在ajax请求中,因为同源策源的限制,浏览器出于安全起见,会对ajax跨域请求做限制,限制ajax请求访问其他域的资源
对于跨域问题的解决方法有很多,但是我比较常用CORS
在springboot+springcloud+前后端分离的微服务程序中,解决跨域问题需要,在网关中配置跨域过滤器,因为所有前端的请求都是通过zuul网关进行服务调用的,也就是说所有的前端请求都先访问网关,我们就把跨域配置到zuul网关中。/** * 解决跨域问题 */ @Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { //1.添加CORS配置信息 CorsConfiguration config = new CorsConfiguration(); //1) 允许的域,不要写*,否则cookie就无法使用了 //浏览器认为127.0.0.1和localhost不是同一个域 config.addAllowedOrigin("http://127.0.0.1:6001"); config.addAllowedOrigin("http://localhost:6001"); config.addAllowedOrigin("http://127.0.0.1:6002"); config.addAllowedOrigin("http://localhost:6002"); config.addAllowedOrigin("http://127.0.0.1:6003"); config.addAllowedOrigin("http://localhost:6003"); //2) 是否发送Cookie信息 config.setAllowCredentials(true); //3) 允许的请求方式 config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("HEAD"); config.addAllowedMethod("GET"); config.addAllowedMethod("PUT"); config.addAllowedMethod("POST"); config.addAllowedMethod("DELETE"); config.addAllowedMethod("PATCH"); // 4)允许的头信息 config.addAllowedHeader("*"); //2.添加映射路径,我们拦截一切请求 UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); //3.返回新的CorsFilter. return new CorsFilter(configSource); } }
(2)无限级别课程类型树获取
在课程中心业务模块,课程类型无限级别的树形菜单数据的获取 最开始是通过递归的方式进行获取,这种方式每次都要去查询数据库,导致效率低, 当数据量变大,递归深度增加,容易导致栈内存溢出
后面,我使用了嵌套循环的方式,查询出所有的课程类型,放入到一个list中,遍历查出来的所有类型,先判断是不是一级类型,一级类型就存储在一个专门的list容器中,不是一级类型,继续遍历,找出他的父类型,设置子类型到这个父类型中;但是这种方式,查询次数增加,导致效率低下;
所以,在项目中,我最终使用的是循环+Map的方式。
首先查询所有的类型放入List中,再将List中的所有类型放入Map中,Map的key为类型的ID,Map的value为当前类型对象。对List中所有类型进行遍历,如果是一级类型,则放入结果的List集合中,如果不是一级类型,则到Map中根据类型ID找到对应的父类型,将当前类型添加到父类型的children集合中,最终就能实现无线级别属性菜单数据的获取
/** * 嵌套循环+map * @return */ private List<CourseType> getTreeData() { //准备一个list集合 存放所有的一级类型 List<CourseType> firstLevelType = new ArrayList<>(); //查询出所有的课程类型 List<CourseType> allCourseTypes = baseMapper.selectList(null); //准备一个map,用来存放所有的课程类型 Map<Long,CourseType> courseTypeMap = new HashMap<>(); //遍历所有的课程类型,将其全部放入map中,以id为键,对象为值 for (CourseType courseType : allCourseTypes) { courseTypeMap.put(courseType.getId(),courseType); } //遍历所有课程类型 for (CourseType courseType : allCourseTypes) { //判断所有课程类型的pid if(courseType.getPid()==0){ //表示是一级类型,存入准备的容器中 firstLevelType.add(courseType); }else{ //说明不是一级类型,是子类型;找到该子类型对应的父类型,并设置进去 //通过课程类型的pid去map中查询出这个课程对象的父对象 CourseType parentType = courseTypeMap.get(courseType.getPid()); //判断父对象是否为null if(parentType!=null){ //不为null;将当前课程对象设置为父对象的儿子 parentType.getChildren().add(courseType); } } } return firstLevelType; }
(3)Redis的缓存穿透、缓存击穿、缓存雪崩
1.缓存穿透
①缓存穿透的案例
将用户信息缓存到redis中,使用用户的id作为key,我们知道,id通常不为负数,如果某些人发送大量请求访问id=-1的用户信息,缓存中查询不到,会直接查询数据库。如果并发量很高,则这种现象直接穿透了redis缓存,大量请求直接访问数据库,会压垮数据库,造成数据库宕机。
②解决方案
布隆过滤器
如果缓存不存在,则访问数据库,如果数据库也没有查询到数据,则存储一个null值在redis中,并设置一个过期时间[key(-1):value(null)] 同时,使用同步的方式避免高并发情况下还是会有很多请求直接访问数据库
2、缓存击穿
①案例
同时大量请求访问某一个key,而这个key由于刚刚过期或者redis刚刚启动缓存中还没有,造成大量的请求访问数据库
②解决方案
使用同步代码块+双重校验锁的形式进行数据库的查询
3、缓存雪崩
①案例
在同一时间,大量的缓存失效,导致查询这些缓存的请求都会访问DB,造成DB压力过大和缓存击穿不同的是,缓存击穿是“热点数据”失效(某几个key)而缓存雪崩是大量的key同一时间失效比如,项目启动,从数据库中加载所有的用户信息,我们设置相同的过期时间,时间到后,这些用户全部过期了,查询所有的用户的请求都要访问数据库(缓存雪崩)
②解决方案
让过期时间均匀分布(过期时间与随机值配合,在一段时间内依次过期)
缓存击穿优化:
@Override public List<CourseType> loadTreeCourseType() { //获取缓存中的数据 AjaxResult ajaxResult = redisClient.get(KEY); //判断是否成功获取 if(!ajaxResult.isSuccess()){ return null; } //判断缓存中的数据是否存在 String resultObj = (String) ajaxResult.getResultObj(); //当缓存中不存在时 if(!StringUtils.isNotBlank(resultObj)){ synchronized (this){ //查询key ajaxResult = redisClient.get(KEY); //当查询redis失败的时候,直接返回null if(!ajaxResult.isSuccess()){ return null; } //查询成功,获取查询的结果 resultObj = (String) ajaxResult.getResultObj(); if(!StringUtils.isNotBlank(resultObj)){ System.out.println("缓存中没有数据,查询数据获取"); List<CourseType> courseTypeList = null; //获取数据库数据 courseTypeList = this.getTreeData(); /* //模拟触发缓存击穿 try{ Thread.sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); }*/ //将查询的结果转为json字符串 String jsonString = JSONArray.toJSONString(courseTypeList); //存入redis缓存 redisClient.set(KEY,jsonString); //返回结果 return courseTypeList; } } } System.out.println("緩存中取得了数据!"); //获取数据,转为CourseType List<CourseType> courseTypeList = JSONArray.parseArray(resultObj, CourseType.class); return courseTypeList; }
(4)比较棘手的业务:页面静态化
在课程首页的门户网站实现静态化处理,需要这么几个步骤:
首先,当我们增删改课程类型的时候,手动发送页面静态的请求到课程服务中,课程服务调用方法打包上传我们的模板到分布式文件系统中,
同时调用静态化页面服务的接口,对我们的页面进行静态化操作,然后将生产的静态页面文件上传到分布式文件系统中,返回一个fileId
这时,我们需要使用rabbitMQ将这个fildId作为消息发布,而前端部署的java程序会一直监听rabbitMQ的消息队列,从而获得fileId,并发送请求访问分布式文件系统,下载已经成功实现静态化的页面,并且这个页面会存放到前端项目的指定位置.
/** * 课程前台首页的页面静态化 * */ @Override public void homePageStatic() { /** * ①上传模板到FastDfs中 * 需要将模板打包:使用hutool工具 * ②上传文件的接口使用的是MultipartFile,我们需要将File文件转为MultipartFile文件(百度方法) * ③调用dfs服务的接口上传文件 * ④准备模板的数据 * ⑤调用页面静态化的接口,实现页面静态化 * ⑥返回fileid作为消息发送到rabbitMQ中 */ //模板的路径(这里获取相对路径) String sourceDir = "F:/3IdeaProjects/hrm-parent/hrm-course-parent/hrm-course-service/src/main/resources/templates/home"; logger.debug("sourceDir: "+sourceDir); //打包后存放的路径(这里获取相对路径) String targetDir = "F:/3IdeaProjects/hrm-parent/hrm-course-parent/hrm-course-service/src/main/resources/tmp"; logger.debug("targetDir: "+targetDir); //调用工具进行打包 ZipUtil.zip(sourceDir,targetDir+"/home.zip",false); //将file文件转为MultipartFile InputStream inputStream = null; OutputStream outputStream = null; try { //File转成MultipartFile //获取压缩包的file对象 File file = new File(targetDir+"/home.zip"); FileItem fileItem = new DiskFileItem("file", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile()); inputStream = new FileInputStream(file); outputStream = fileItem.getOutputStream(); IOUtils.copy(inputStream, outputStream); //转化为MultipartFile MultipartFile multipartFile = new CommonsMultipartFile(fileItem); //调用dfs服务的接口上传文件 AjaxResult uploadAjax = fileClient.upload(multipartFile); //返回fileId String fileId = (String) uploadAjax.getResultObj(); logger.debug("fileId="+fileId); //封装模板的file和data Map<String,Object> data = new HashMap<>(); //课程类型的数据放入data中 List<CourseType> courseTypes = loadTreeCourseType(); data.put("courseTypes",courseTypes); //调用页面静态化接口 AjaxResult ajaxResult = pageStaticClient.pageStatic(fileId,data); //获取静态化页面的fileId String pageFileId = (String) ajaxResult.getResultObj(); logger.debug("pageFileId="+pageFileId); //将pageFileId作为消息发送到rabbitmq中 rabbitTemplate.convertAndSend(RabbitMqConfig.EXCHANGE_DIRECT_INFORM,RabbitMqConfig.ROUTING_KEY,pageFileId); } catch (Exception e){ e.printStackTrace(); } finally { //关闭资源 try { if(outputStream!=null) { outputStream.close(); } if(inputStream!=null){ inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } }
(5)使用feign的接口实现文件上传
1.文件上传服务提供feign的client
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aSLn5jWS-1587210823305)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1587210051817.png)]
2.添加依赖
<!--文件上传扩展依赖--> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
3.配置类
package cn.cyh.hrm.config; import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.context.annotation.Bean; public class FeignSupportConfig { @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } }
4.client接口
package cn.cyh.hrm.client; import cn.cyh.basic.util.AjaxResult; import cn.cyh.hrm.client.impl.FileClientImpl; import cn.cyh.hrm.config.FeignSupportConfig; import feign.Response; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @FeignClient(value = "DFS-SERVICE",fallback = FileClientImpl.class,configuration = FeignSupportConfig.class) public interface FileClient { /** * 文件上传 * @param file * @return */ @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) AjaxResult upload(@RequestPart(value = "file") MultipartFile file); /** * 文件下载 * @param fileId 文件标识 * @return */ @GetMapping(value = "/download") Response download(@RequestParam("fileId")String fileId); /** * 文件删除 */ @GetMapping("/delete") AjaxResult delete(@RequestParam("fileId") String fileId); }
(6)单点登录如何进行登录拦截
因为有多个前端站点,课程中心 用户中心 职位中心,需要登录才能访问,自己在网关中配置过滤器实现在一个站点登录了其他站点就不需要登录的功能。也可以用权限验证的框架shiro
前端用户访问需要登录认证才能访问的页面,课程中心 用户中心 职位中心,当点击登录的时候跳转到授权中心返回一个登录页面。发送登录请求,到zuul网关中,网关进行过滤后放行登录页面,调用授权中心接口进行登录操作,如果登录成功把用户信息保存到redis中,key用assess_token,value保存用户信心,然后将assess_token保存到前端cookie中。
认证成功后,访问课程中心的门户网站页面,判断浏览中是都有assess_token并验证正确性。访问其他门户同理。
如果zuul网关拦截器,获取到的assess_token不存在或者不正确,表示没有登录过。响应到授权中心的登录页面重新认证。
package cn.cyh.hrm.filter; import cn.cyh.basic.util.AjaxResult; import cn.cyh.hrm.client.RedisClient; import com.alibaba.fastjson.JSONObject; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; @Component public class AccessTokenFilter extends ZuulFilter { @Autowired private RedisClient redisClient; private Logger logger = LoggerFactory.getLogger(AccessTokenFilter.class); /** * 过滤器的类型,它决定过滤器在请求的哪个生命周期中执行。 * 这里定义为pre,代表会在请求被路由之前执行。 * * @return */ @Override public String filterType() { return "pre"; } /** * filter执行顺序,通过数字指定。 * 数字越大,优先级越低。 * * @return */ @Override public int filterOrder() { return 0; } /** * 判断该过滤器是否需要被执行。这里我们直接返回了true,因此该过滤器对所有请求都会生效。 * 实际运用中我们可以利用该函数来指定过滤器的有效范围。 * * @return */ @Override public boolean shouldFilter() { return true; } /** * 过滤器的具体逻辑 * * @return */ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); ctx.addZuulResponseHeader("Content-type", "text/json;charset=UTF-8"); ctx.getResponse().setCharacterEncoding("UTF-8"); String requestURI = request.getRequestURI(); logger.debug("*************请求地址:"+requestURI+"***************"); //放行swagger页面,登陆页面,注册页面 if(requestURI.contains("api-docs")||requestURI.contains("/sso/login")||requestURI.contains("/sso/register")){ return null; } //获取token请求头 String token = request.getHeader("token"); //验证请求头 if(StringUtils.isEmpty(token)) { ctx.setSendZuulResponse(false); ctx.setResponseBody(JSONObject.toJSONString(AjaxResult.me().setSuccess(false).setMessage("请先认证!"))); ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); } //验证token的准确性 Boolean exists = (Boolean) redisClient.exists("ACCESS_TOKEN:"+token).getResultObj(); if(!exists){ ctx.setSendZuulResponse(false); ctx.setResponseBody(JSONObject.toJSONString(AjaxResult.me().setSuccess(false).setMessage("token不正确!"))); ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); } return null; } }
-
人力资源系统年终述职报告_人力资源专员述职报告
2020-06-05 11:08:14L t d 人力资源部部长2002年年终述职报告 2002年12月 HOLLYSYS Confidential 内部资料 注意保密 内部资料 注意保密 1 目录 1. 不足与成绩 2. 市场分析及竞争对手分析技术能力及差距分 析 3. KPI总结 4. 核心竞争力... -
人力资源系统需求规格说明书-功能性需求说明_功能性需求描述
2020-08-03 01:21:32精品 人力资源系统 需求规格说明书 编号 XXX-HR-DEV-SRS 版本 1.0 可编辑 精品 1 功能性需求 描述系统功能按系统功能的体系结构组织本章内容 1.1 系统管理 1.1.1 人力资源档案管理设置 设置一级机构二级机构三级机构... -
HR常用的人力资源系统软件有哪些?
2020-12-17 17:55:58HR在日常工作中多多少少都会用到相关的人力资源系统软件,除了能提高办公效率也能适当的减轻工作压力。人力资源的工作内容主要分为人力资源规划、人员招聘与配置、培训开发与实施、绩效考核与实施、薪酬福利、人事...HR在日常工作中多多少少都会用到相关的人力资源系统软件,除了能提高办公效率也能适当的减轻工作压力。人力资源的工作内容主要分为人力资源规划、人员招聘与配置、培训开发与实施、绩效考核与实施、薪酬福利、人事管理、职业生涯管理和员工关系管理八大模块。可见人力资源系统软件对于HR的重要性!
HR常用的人力资源系统软件有哪些呢?
一、欢雀HR (一体化HR SaaS厂商)
欢雀HR是国内早期做HR SaaS的系统厂商之一,欢雀HR SaaS专注与为企业提供一体化人力资源管理系统解决方案,整合了互联网技术、云存储技术、大数据分析系统,融入了先进的人力资源管理理念。人事系统主要由两部分构成,线上管理模块实现了人力资源管理数字化、智能化,提高人资管理在统计、计算、分析、查询方面的效率,主要的功能模块有人事管理、组织及审批、考勤管理、薪酬绩效、管理、人力数据;其二是人力服务O2O模块,对接线下人力服务,解决企业人资工作中重复性高、专业度高并且工作量繁重、需要跑腿落地的工作。
二、钉钉
钉钉是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台,帮助中国企业通过系统化的解决方案,全方位提升中国企业沟通和协同效率。钉钉办公管理系统,可以帮助中小企业建立一个统一、整合的办公管理平台,规范员工的日常工作习惯、提高执行力,让每位员工都可以成为管理者。同时提高工作效率,缩短工作时间,让企业的管理更加高效。
三、飞书
飞书,字节跳动旗下企业协作平台,将即时沟通、智能日历、音视频会议、OKR、飞书文档和工作台深度整合,通过开放兼容平台,让成员在一处即可实现高效的沟通和流畅的协作,全方位提升企业效率。飞书将为所有规模的企业和组织,免费提供音视频会议、“线上办公室”实时语音沟通、在线文档与表格创作、企业专属云存储空间、飞书机器人及小程序应用、消息云端保存、高效会议室系统、双因素安全服务、AI 多语言翻译等多种高级功能。
-
考勤应用 - 人力资源系统
2019-09-18 06:27:01Bee 是人力资源系统中的考勤应用,主要功能用于员工申请假单。Bee具有较高的性能、扩展性等,其中包括前后端分离、插拔式的规则验证(验证器)、数据过滤(装饰器)、消息队列等,后端在Laravel 的MVC模式上,又添加...项目地址 Bee
介绍
Bee 是人力资源系统中的考勤应用,主要功能用于员工申请假单。Bee具有较高的性能、扩展性等,其中包括前后端分离、插拔式的规则验证(验证器)、数据过滤(装饰器)、消息队列等,后端在Laravel 的MVC模式上,又添加了Services、Repositories层,明确每个类的职责,使用Passport 的密码模式获取接口数据。
技术栈
- 服务器:Linux(Centos 7)、Nginx
- 前端:Element、Vue、Vue-Router、Vuex、Webpack、V-calendar
- 资源:Elephant
- 后端:Laravel
- 缓存:Redis
其他的就是一些基本工具了,比如node、npm(cnpm)、composer、git等
演示
1. 登录
2. 申请
3. 编辑
4. 审批
5. 搜索
安装
1. 下载
git clone git@github.com:SexyPhoenix/Bee.git
2. Laravel
composer install chmod -R 777 storage php artisan key:generate
3. 上传文件夹
mkdir -p uploads/bee chmod -R 777 uploads
4. 配置.env
cp .env.example .env
APP_URL=http://localhost ASSET_URL=http://localhost DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379
5. 数据库
php artisan migrate
6. Passport
php artisan passport:keys php artisan passport:client --password --name='bee' //name 自定义
7. 开启消息队列
php artisan queue:work bee --queue=apply --sleep=3 --tries=3 & > /dev/null
8. Nginx
server { listen 80; server_name dev.bee.goods; // 自定义 index index.html index.htm index.php; location / { rewrite ^/(.*)$ /index.php/$1 last; try_files $uri $uri/ /index.php?$query_string; } location ~ /uploads/ { root "/var/www/Bee"; // 自定义 } location ~ \.(html|gif|jpg|jpeg|css|js|eot|svg|ttf|woff|woff2|png)$ { root "/var/www/Bee/public"; // 自定义 } location ~ (.+\.php)(.*)$ { root /var/www/Bee/public; // 自定义 fastcgi_split_path_info ^(.+\.php)(.+)$; fastcgi_pass unix:/var/run/php-fpm/php7-fpm.sock; // 自定义 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; } }
9. 前端
cnpm install //cnpm淘宝的 export const API_DOMAIN = 'http://xxx/beeapi' //resources\js\config\bee.js 文件中修改域名 npm run dev
10. 导入基本数据(database\sql\bee.sql)
最后,注意配置域名到host。
打开 http://xxx/bee#/
账号:zhangxiaofan@qq.com 密码:123456 -
使用有界面控件的Delphi人力资源系统.rar
2019-07-10 11:09:54使用有界面控件的Delphi人力资源系统,数据库是Access,界面方面使用有三方控件,Delphi7下编译,需要先引入此控件,若找不到控件的可删除掉控件,功能模块:应聘人员登记、试用期登记、正式员工登记、基础数据维护... -
JAVA 人力资源系统
2018-05-15 16:35:55基于WEB应用的人事管理系统,适用于小型公司的人事管理。 -
{人力资源考勤管理}卡通系统建设与规划数据库设计及考勤系统_人力资源系统数据库设计
2020-08-24 23:01:32{人力资源考勤管理 }卡通系统建设 与规划数据库设计及考勤系统 摘要 随着信息时代的高速发展越来越多的高校在积极探索着建立数字化校园实现无纸化办公 现代化的学校离不开信息智能化的管理学校的收费管理教学服务... -
某集团SAPHR人力资源系统用户操作学习手册.docx
2020-12-23 15:26:45稳健集团 SAP HR人力资源系统 用户操作手册 目 录 第六章 招聘管理 2 第一节 功能概述 2 第二节 招聘计划管理 2 2.1.维护招聘计划信息 2 2.2.招聘计划明细表 6 2.3.日常招聘进度表 10 第三节 招聘过程管理 12 3.1.... -
HR人力资源系统
2013-01-27 22:23:10HR人力资源管理系统,自己收藏的,对于初学ASP.Net的童鞋很有用。 -
人力资源系统的基本功能有哪些?
2020-12-25 17:34:04虽然国内目前有很多人力资源系统的品牌,但相信绝大部分系统厂商在规划系统功能的时候,都会围绕人力资源工作中的各个模块进行开发,比如招聘模块、考勤模块、薪酬模块、绩效模块、员工管理、培训模块等等。... -
经典 毕业设计人力资源系统原型
2010-03-25 16:09:36需要人力资源系统原型的朋友 直接可以下载使用 -
sap模块有哪些_国内人力资源系统有哪些?
2020-11-24 01:37:22随着国内越来越多企业开始重视人力资源管理,国内企业的信息化管理进程在不断加快,人力 资源系统开始受到众多企业的青睐,那国内人力资源系统有哪些?目前市场上人力资源软件的选择有很多,主要的选择类型有国外... -
北大青鸟y2人力资源系统数据库
2009-05-02 22:23:49北大青鸟y2人力资源系统数据库, 本人在北大青鸟培训时得到的,特与大家分享,希望对学习中的你有所帮助。 -
资源文件分包_一处青岛仓储项目召开人力资源系统文件培训会
2020-12-25 02:12:40为进一步加强人力资源管理工作,一处陆续下发人力资源系统相关文件,为达到对公司管理制度办法的统一认识,避免政策解读偏差,青岛仓储项目部第一时间采取网络进行传阅宣贯的自我学习活动,并及时召开人力资源系统文件... -
项目经验--人力资源系统项目
2019-10-05 02:04:00人力资源系统项目是一个CS版的开发项目,主要需求来自于廊坊市人社局及其下属单位,大大小小将近200家公司单位。作为一个要上线的项目,显然第一次做上线的项目的我们还是想的有些不周全的地方。在此还是要感谢郑... -
Spark SQL入门案例之人力资源系统数据处理
2016-12-04 10:10:00人力资源系统的管理内容组织结构图 1) 人力资源系统的数据库与表的构建。 2) 人力资源系统的数据的加载。 3) 人力资源系统的数据的查询。 职工基本信息 职工姓名,职工id,职工性别,职工年龄,... -
{人力资源考勤管理}宏景软件考勤管理解决方案_宏景人力资源系统登录
2020-10-24 14:53:37{人力资源考勤管理}宏景 软件考勤管理解决方案 应休假已休假和休假明细查询 1. 系统设计方案 1.1 应用模式 宏景考勤模块适合多种类型单位对于不同单位提供不同解决办法宏景 提供 C/S 考勤模块B/S 考勤模块部门考勤...