那么分享一个项目案例篇吧!
需求是:假设有一个部门表,一个员工表,一个年假表,
员工表里:
部门表:
休假表:
管理员表
项目原型:
效果图:
管理员登录:
登录成功回调:
进入后台首页,这里只是做了个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)。
这里说得有不对的地方请多多指教,指出楼主接收批评;
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://zblog.hqyman.cn/post/10677.html 非本站原创文章欢迎转载,原创文章需保留本站地址!


休息一下~~