22
2025
04
11:08:56

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

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

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

员工表里:

1a81ba6f3466189e5ae91adece7d5cd0.png

部门表:

665057e4f1729b438827c5b854812f0b.png

休假表:

c45305dee1fea81c35a9950fc20b79f2.png

管理员表

67e6c6975e492cc0bb90a0eee2bae898.png    项目原型:

746d05336aea4cd1aa1c6da9e2d88c4f.png

效果图:

管理员登录:

8978394a556fc5534bc2b9d630a16b88.png

登录成功回调:

3d5d127a030a697f6965d3720e57cce6.png

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

c8ebc4adf0de08220822e9b041d16301.png

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

e8db16b3ee7e05370b2a22fde5248e50.png

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

0dd8932a995e51653615ebe85bf272db.png

回调成功ok

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

d33226c77f62027d81ffeb4cecd84b37.png

接着核心的查询就到了

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

5c10d9420abead3d943cb513112295f9.png

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

babec012fb052538e31ed587757adcef.png

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

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

81b53272c93a8450c7eaf76869f00d24.png

1a82eaa2064297c08c3bbd5b0f862e92.png

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

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

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

19ce37f0952a47b8034d96aeca799f82.png

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

b5ea810d2ede9846edcb15ccf88f9f6c.png

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

318c7b52b66f87dd7411cb10efc0833f.png

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

/**   {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

dc0dd77521e7b00e40e7466f78f78438.png

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

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




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://zblog.hqyman.cn/post/10677.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: