那么分享一个项目案例篇吧!

需求是:假设有一个部门表,一个员工表,一个年假表,

员工表里:

部门表:

休假表:

管理员表

    项目原型:

效果图:

管理员登录:

登录成功回调:

进入后台首页,这里只是做了个500展示,并没有报错500

首先添加部门(直接把端口重写成80端口,直接localhost访问)

这里先测试添加一个php研发的部门进去

回调成功ok

接着员工添加(这里字段太多就不测试了,反正做这个功能的时候该判断的都判断了,这个功能是可以添加的,我就不做展示了)

接着核心的查询就到了

根据员工入职时间去取当前年份去计算每年的年假,每满一年就增加一天,满第一年就有5天年假,第二年就6天.....以此类推,最大的年假不能超过15天。

进行365天的天数除以总入职的天数=工龄,如果工龄大于1,那么就根据上面的条件进行计算,注意这个工龄以及年假天数是不存进数据库的(当然也可以存进数据库,只不过要做定时写入更新数据库的值,根据业务需求来)因为每天都在增,所有不能直接写入mysql里

也可以按部门查询一对多关联查询,

这里是给某个员工设置休假

计算公式是:总休假天数-休假表的里日期=可剩余休假,

申请休年假的时候不能大于可休假的天数,在添加休假时具体的业务是根据休假的时间年等于年,月等于月,日减日,就等于休假的天减去总休假天数的剩余天数。做足判断

不能让日期溢出,防止当前可休假的天数大于当前总休假天数

可以修改个别信息,这里就不做展示了

添加管理员登录,可以赋予不同的权限,普通登录就只能查询,管理登录就可以增删改,记录每个登录的次数,

小结:总的来说最为复杂的就是申请休假的这个功能了,涉及到年月日 的计算
核心代码如下:

/**   {starttime:starttime,endtime:endtime,stauts:stauts,reason:reason}   1=成功   -1=空值   -2=未知异常   -3=空值   -4时间超出   根据当前员工编号   添加一个休假信息,   等价于休假申请   * @return   * @throws ParseException    */  @RequestMapping("/sendLeava_holiday")  @ResponseBody  public Integer sendLeava_holiday(@Param("starttime")String starttime,//开始时间      @Param("endtime")String endtime,//结束时间      @Param("stauts")String stauts,//状态      @Param("reason")String reason//理由      ) throws ParseException{    if(starttime==null&&endtime==null&&stauts==null||stauts==""&&reason==null||reason==""){      return ERRORNULL;//-3空值    }      //先进行空判断      if(usetlocal!=null){//先去线程本地看        String []arr=getinputDate(starttime);        String []arr2=getinputDate(endtime);//  System.out.println(arr[0]+""+arr[1]+""+arr[2]);        if(arr[0].equals(arr2[0])){//年份是否相等          if(arr[1].equals(arr[1])){//月份是否相等            if(Integer.parseInt(arr[2])              List listleav=leaveRecordsService.selectByPrimaryKey(this.threadlocalid);              if(listleav!=null){//假设休假表不等于空               int count=0;                for (LeaveRecords leRes : listleav) {                  count+=leRes.getLcount();//累计总休假天数                }                User users=this.usetlocal;//取可休假的总天数                if(users!=null){                  int total=users.getCount();                  if(count                    //可休假 顺便插入数据库                    int StartEndtime=Integer.parseInt(arr2[2])-Integer.parseInt(arr[2]);                    int resultcount=StartEndtime;                    if((StartEndtime+count)                      String datestart=Integer.parseInt(arr[0])+"-"+Integer.parseInt(arr[1])+"-"+Integer.parseInt(arr[2]);                      String dateend=Integer.parseInt(arr2[0])+"-"+Integer.parseInt(arr2[1])+"-"+Integer.parseInt(arr2[2]);                      LeaveRecords  leaveRecords=getLeaveRecords(users.getId(), resultcount, reason, datestart, dateend, stauts);                      int indexreuslyt=leaveRecordsService.insertSelective(leaveRecords);                      if(indexreuslyt>0){                        //删除redis休假表key                        if( redisTempService.getString(MyRedisKey.LeaveRecordsKey+""+this.threadlocalid)!=null){                          redisTempService.deleteKey(MyRedisKey.LeaveRecordsKey+""+this.threadlocalid);                        }                         //end delete redis                        return SUCCESS;//成功                      }                      }else{                        return MAXERROR;//休假天数大于可休假天数                      }                         }else if(count>total){//休假天数大于可休假天数                           return MAXERROR;                        }                } else{//休假表等于空                    users=this.usetlocal;//取可休假的总天数                    if(users!=null){                    int StartEndtime=Integer.parseInt(arr2[2])-Integer.parseInt(arr[2]);                    int resultcount=StartEndtime;//                    if(StartEndtime                      String datestart=Integer.parseInt(arr[0])+"-"+Integer.parseInt(arr[1])+"-"+Integer.parseInt(arr[2]);                      String dateend=Integer.parseInt(arr2[0])+"-"+Integer.parseInt(arr2[1])+"-"+Integer.parseInt(arr2[2]);                      //将年份月份日拼接成一个字符串                      LeaveRecords  leaveRecords=getLeaveRecords(users.getId(), resultcount, reason, datestart, dateend, stauts);                      int indexreuslyt=leaveRecordsService.insertSelective(leaveRecords);                      //插入                      if(indexreuslyt>0){                        //删除redis休假表key                        if( redisTempService.getString(MyRedisKey.LeaveRecordsKey+""+this.threadlocalid)!=null){                          redisTempService.deleteKey(MyRedisKey.LeaveRecordsKey+""+this.threadlocalid);                        }                         //end delete redis                        return SUCCESS;//成功                      }                      }else{                        return MAXERROR;//休假大于可休假的                      }                     }else{                    return METNONERROR;//月份超出                  }                  }            }else{              return YEARERROR;//年份不相等超出年份            }          }//        }        return ERROR2;      }               }    return ERROR2;  }

查询年假:

 /**     * 根据部门id查询     * 也可以根据年份     *      * @param did     * @return     */    @RequestMapping("/getListUserForRequest")    @ResponseBody    public ListgetListUserForRequest(@Param("did")String  did,@Param("year")String year){       if(did==null&&year==null){         return null;       }       //查询全部       if("all".equals(did)){         Listlist=null;         //= (List) redisTempService.getString(MyRedisKey.USERLIST);         if(list==null){           list= userService.selectAllNumber();          // redisTempService.setString(MyRedisKey.USERLIST, list, MyRedisKey.TimeOneHouse);         }         for (User user : list) {           userConfig.getUser(user);//计算业务           }        // System.out.println(list);         //这里可以做排序         return list;       }       //查询全部end      Listlist=userService.SelectAllDidDepartment(Integer.parseInt(did));      if(list==null){        return null;      }      ArrayListuserlist=new ArrayList<>();      if("all".equals(year)){//如果是查全部的话默认传递一个      //  System.out.println("进入");        for (User user : list) {          userConfig.getUser(user);//计算业务          }      //  System.out.println("user"+list);        return list;      }else{        for (User user : list) {          userConfig.getUserAnd(user,Integer.parseInt(year));//计算业务            userlist.add(user);        }        return userlist;//这是根据      }    }    

计算类:UserConfig.java

 /**     * sql计算版     * @param user     * @return     */    public  User getUser(User user){    //  System.out.println(user);      if(user!=null){           //取入职总天数         int reuslt=getResultCount(user.getNumber());         //先取年份(总天数/365=年)         int resultyear=reuslt/YEARCOUNT;         //System.out.println("reuslt===>>>"+reuslt+"&&resultyear===>>>"+resultyear);         int i=0;         user.setCount(DEFAULTCOUNT);//天数默认设置4         if(resultyear>0){           while(i               user.setCount(user.getCount()+1);               i++;             }         }                  String YearOld=resultyear+"年|共:"+reuslt+"天";          user.setYearanmethod(YearOld);                         if(user.getCount()==4){//如果是第一年 入职也就是把休假设置为零            user.setCount(DEFALUTNULL);          }          if(user.getCount()>DEFUALT){//年假最多不能大于15            user.setCount(DEFUALT);//如果大于15就设置最大休假天数为15          }      }      return null;    }    /**     * 此方法是根据员工的编号去     * 获取当前时间-入职时间=总天数*/    private int getResultCount(Integer number){      return userService.selectByRegistertime_NowTime(number);    }

application.properties

#spring.application.name=SpringCloud-Providerserver.port=80spring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/employee?useSSL=true&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=rootspring.datasource.type=com.alibaba.druid.pool.DruidDataSourcemybatis.type-aliases-package=com.wang.pojo#mybatis.mapper-locations=classpath:mappers/*.xmlspring.redis.database=0#spring.redis.host=eredisspring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=spring.redis.pool.max-active=200spring.redis.pool.max-wait=-1spring.redis.pool.max-idle=10spring.redis.pool.min-idle=0spring.redis.timeout=1000spring.resources.chain.strategy.content.paths=/**spring.resources.static-locations=classpath:/static/spring.main.allow-bean-definition-overriding=true

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0modelVersion>  <parent>    <groupId>org.springframework.bootgroupId>    <artifactId>spring-boot-starter-parentartifactId>    <version>2.1.4.RELEASEversion>  parent>  <groupId>com.wanggroupId>  <artifactId>springcloudartifactId>  <version>0.0.1-SNAPSHOTversion>   <properties>    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>  <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>  <java.version>1.8java.version>  properties>    <dependencies>    <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-webartifactId>        dependency>      <dependency>  <groupId>com.alibabagroupId>  <artifactId>fastjsonartifactId>  <version>1.2.28version>  dependency>         <dependency>           <groupId>org.springframework.bootgroupId>          <artifactId>spring-boot-devtoolsartifactId>          <optional>trueoptional>    dependency>           <dependency>        <groupId>org.springframework.sessiongroupId>        <artifactId>spring-session-data-redisartifactId>    dependency>  <dependency>      <groupId>redis.clientsgroupId>      <artifactId>jedisartifactId>   dependency>               <dependency>        <groupId>org.springframework.bootgroupId>        <artifactId>spring-boot-starter-data-redisartifactId>    dependency>      <dependency>       <groupId>org.carrot2.shadedgroupId>       <artifactId>carrot2-guavaartifactId>       <version>18.0version>     dependency>   <dependency>    <groupId>org.springframework.bootgroupId>    <artifactId>spring-boot-starter-aopartifactId>dependency>      <dependency>        <groupId>org.mybatis.spring.bootgroupId>        <artifactId>mybatis-spring-boot-starterartifactId>        <version>1.1.1version>    dependency>       <dependency>    <groupId>mysqlgroupId>    <artifactId>mysql-connector-javaartifactId>    dependency>     <dependency>        <groupId>com.alibabagroupId>        <artifactId>druidartifactId>        <version>1.1.10version>    dependency>    <dependency>    <groupId>org.projectlombokgroupId>    <artifactId>lombokartifactId>dependency>       <dependency>        <groupId>org.springframework.bootgroupId>        <artifactId>spring-boot-starter-thymeleafartifactId>    dependency>        <dependency>      <groupId>com.github.tobatogroupId>      <artifactId>fastdfs-clientartifactId>      <version>1.26.1-RELEASEversion>    dependency>   dependencies>   <build>        <plugins>            <plugin>                <groupId>org.springframework.bootgroupId>                <artifactId>spring-boot-maven-pluginartifactId>                 <configuration>            <mainClass>com.wang.ApplicationmainClass>          configuration>            plugin>        plugins>       build>     <packaging>jarpackaging>project>

这个是添加休假的ajax请求(angluar.js)

  //添加休假的对应的信息     $scope.sendLeava_holiday=function(){       var starttime=$scope.starttime;       var endtime=$scope.endtime;       var stauts=$("#stauts").val();       var reason=$scope.reason;       var data1={starttime:starttime,endtime:endtime,stauts:stauts,reason:reason};          $http({             method:'POST',               url:'/sendLeava_holiday',              headers:{"Content-Type":'application/x-www-form-urlencoded'},              params:data1,               }).success(function(data){               if(data==1){                alert("ok");               $scope.getUserForContent();               $scope.getLeaveRecordsList();               }else if(data==-3||data==-2){                 alert("输入出错");               }else{                 alert("时间超出");               }             });          }

注意拦截器是最后添加进去的,放行login.html和登录的ajax请求。

拦截器代码:

package com.wang.controller.index;import com.wang.pojo.LoginUser;/** * 拦截器 * @author Administrator */@Configurationpublic class LoginInterceptor implements HandlerInterceptor {  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)      throws Exception {    HttpSession session=request.getSession();    LoginUser loginUser=(LoginUser) request.getSession().getAttribute("Users");    //System.out.println("进入拦截器。。。loginUser===》》"+loginUser);    if(loginUser!=null){      return true;    }    response.sendRedirect(request.getContextPath()+"/login.html");    return false;  }  @Override  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,      ModelAndView modelAndView) throws Exception {    // TODO Auto-generated method stub    HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);  }  @Override  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)      throws Exception {    // TODO Auto-generated method stub    HandlerInterceptor.super.afterCompletion(request, response, handler, ex);  }}
@Configurationpublic class MyWebConfigurer implements WebMvcConfigurer{    @Autowired    private LoginInterceptor loginInterceptor;    // 这个方法是用来配置静态资源的,比如html,js,css,等等      @Override     public void addInterceptors(InterceptorRegistry registry) {          //注册TestInterceptor拦截器          InterceptorRegistration registration = registry.addInterceptor(loginInterceptor);          registration.addPathPatterns("/**");                      //所有路径都被拦截          registration.excludePathPatterns(                         //添加不拦截路径                                           "/login.html",      //登录                                           "/loginMainPethod",                                           "/**/*.html",            //html静态资源                                           "/**/*.js",              //js静态资源                                           "/**/*.css",             //css静态资源                                           "/**/*.woff",                                           "/**/*.ttf"                                           );          }    // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效   /* @Override    public void addInterceptors(InterceptorRegistry registry) {      // addPathPatterns("/**") 表示拦截所有的请求,      // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问      registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");    }*/}

最后完成总员工年假管理系统。。。

项目已经上传到githup,和数据库也在里面

所用到的技术:maven +springboot+mybatis+拦截器+redis+jquery+angluar.js

githup地址:https://github.com/717518268/springboot_redis_employee.git

这个项目还有很多没完善,就比如带薪休年假,计算工时签到等一系列问题,这里只做了休假功能,计算工龄,计算休假添加员工、部门,把部分经常读的数据放进redis里在做增删改的时候顺便把key给delete掉就可以了(或者更新mysql的同时也更新redis里的value)。

这里说得有不对的地方请多多指教,指出楼主接收批评;

mybatis redis_基于人事年假管理的系统springboot+mybatis+redis+拦截器相关推荐

  1. 人事档案管理c语言程序,人事档案管理完整系统c语言.doc

    人事档案管理完整系统c语言 <C语言程序设计>课程设计 人事档案管理系统 指导教师:李耀成 设 计 者:刘玉成.孙涛.马新涌.郭恒阳 专业班级:机电081 设计时间:2009年11月 人事 ...

  2. 基于javaweb的医院管理系统(java+springboot+mybatis+vue+mysql)

    基于javaweb的医院管理系统(java+springboot+mybatis+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclipse ...

  3. 基于虚拟化的混合云集群——基于集群管理监控系统

    摘要 本博文将详细的介绍本人在实现过程中的所经历的项目,同时对象将进行的详细的说明.将对项目的背景,项目的技术,项目的架构设计,项目的难点,项目的开发周期,项目中详细的功能的开发,项目中本人的主要工作 ...

  4. 基于JAVA学校校园网站系统(Springboot框架) 开题报告

      本科生毕业论文 基于Java(springboot框架)学校校园网站系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学本科生 ...

  5. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  6. 【基于AnyLogic的管理仿真系统】

    bass模型(系统动力学) 建立基础模型 将模型基础建立,组成一个简单的扩散模型,并填上变量值 添加从潜在消费者到消费者的流程 潜在消费者 消费者 转换速率(流量) 添加常量 两个动态变量 广告 口碑 ...

  7. 前后端分离后台管理项目(springboot+mybatis+vue)

    [实例简介] 前端采用Vue.Element UI. 后端采用Spring Boot.Spring Security.Redis & Jwt. 权限认证使用Jwt,支持多终端认证系统. 支持加 ...

  8. 基于java web高校社交系统 /springboot高校社交系统

    摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的系统应运而生,各行各业相继进入信息管理时代,高校社 ...

  9. java版b2b2c o2o 多租户多商家电子商务之(商家管理)SpringCloud SpringBoot Mybatis Uniapp 分布式商城源码 电子商务源码 社交电商 直播带货

    涉及平台:平台管理(包含自营店面).商家端(PC端.手机端).买家平台(PC端.H5/公众号.小程序.APP端(IOS/Android).微服务平台(业务服务) 核心架构:Spring Cloud.S ...

最新文章

  1. 几个比较好用的Windows API在C#中的用法。
  2. 互联网协议 — QUIC 快速 UDP 互联网连接
  3. Delphi 与 DirectX 之 DelphiX(35): TDIB.Saturation();
  4. extras mibs php7,ubuntu编译安装php7遇到的问题及解决方案
  5. Java二进制文件示例
  6. Js让光标停在输入框input框最后面
  7. C++内存和进程,线程学习补充(内存泄漏,信号量)
  8. git提交了不需要的文件夹或者文件怎么办
  9. Visio使用遇到的问题
  10. 提供了一个UBUNTU安装NVIDIA驱动的脚本的下载
  11. cst自学教材_CST Microwave Studio入门与应用基础课程
  12. python数列求和,怎样在python求和
  13. 积目服务器维护,搭建经济高效的制作网络服务器群试验平台
  14. gzip 命令的用法
  15. Irrlicht学习笔记(8)--SpecialFX
  16. (一)数字逻辑基础1
  17. 大电流滑环的结构特征
  18. 将图片转换为Icon
  19. 无人机原理::(一)模型框架与控制系统框架详解
  20. STM32硬件CRC32问题记录

热门文章

  1. python传递类的实例_使用Python将变量从一个类实例传递到另一个类实例?
  2. MySQL数据库搜题_智慧树知到_MySQL数据库设计与应用_搜题公众号
  3. 金牌访谈栏目《架构师说》重磅上线!
  4. 腾讯宣布捐赠1亿元驰援河南;苹果回应iPhone 安全隐患;贝索斯完成10分钟太空之旅|极客头条...
  5. 建议收藏!前端工程师一线大厂面试2021总结篇(50个JS常问知识点)
  6. 有奖征文 | 蒋涛邀你悦评《UNIX传奇》新书,赢技术进阶好礼
  7. 10 个内存引发的大坑,你能躲开几个?
  8. SkyWalking 观测 Service Mesh 技术大公开
  9. 国际研究机构:阿里巴巴语音AI中国第一
  10. 腾讯公布5G开放平台全景图,定义12大场景,引入45个应用