发表于: 2017-12-14 23:23:56

1 668


今天完成的事情:

完成了签到模块

前面施星大佬说用户表里边不能添加签到字段,要保持表的功能单一性,只能从下表中计算出“当前连续签到”,“总签到”,“最高连续签到”

虽然后边施星大佬回去看了下以前的学渣乐园项目,用户表里边都有签到字段,直接存储上面说的三个字段,不过都写出来了,不能浪费,就不改表结构,就按这个签到表来计算了

网上扒下来的工具类,改成我们想要的样子

public class SignUtil {
   // 获得当天0点时间
   public static long getTimesStart() {
       Calendar cal = Calendar.getInstance();
       cal.set(Calendar.HOUR_OF_DAY, 0);
       cal.set(Calendar.SECOND, 0);
       cal.set(Calendar.MINUTE, 0);
       cal.set(Calendar.MILLISECOND, 0);
       return cal.getTimeInMillis();
   }


   // 获得当天24点时间
   public static long getTimesEnd() {
       Calendar cal = Calendar.getInstance();
       cal.set(Calendar.HOUR_OF_DAY, 24);
       cal.set(Calendar.SECOND, 0);
       cal.set(Calendar.MINUTE, 0);
       cal.set(Calendar.MILLISECOND, 0);
       return cal.getTimeInMillis();
   }


   // 获得本周一0点时间
   public static long getTimesWeekStart() {
       Calendar cal = Calendar.getInstance();
       cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
       cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
       return cal.getTimeInMillis();
   }

   // 获得本周日24点时间
   public  static long getTimesWeeknight() {
       Calendar cal = Calendar.getInstance();
       cal.setTimeInMillis(getTimesWeekStart());
       cal.add(Calendar.DAY_OF_WEEK, 7);
       return cal.getTimeInMillis();
   }


   // 获得本月第一天0点时间
   public static long getTimesMonthStart() {
       Calendar cal = Calendar.getInstance();
       cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
       cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
       cal.set(Calendar.SECOND, 0);
       cal.set(Calendar.MILLISECOND, 0);
       return  cal.getTimeInMillis();
   }


   // 获得本月最后一天24点时间
   public static long getTimesMonthEnd() {
       Calendar cal = Calendar.getInstance();
       cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
       cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
       cal.set(Calendar.HOUR_OF_DAY, 24);
       cal.set(Calendar.SECOND, 0);
       cal.set(Calendar.MILLISECOND, 0);
       return cal.getTimeInMillis();
   }

   //day1和day2是否为连续的一天
   public static boolean isContinue(long day1, long day2) {
       Calendar cal1 = Calendar.getInstance();
       Calendar cal2 = Calendar.getInstance();

       cal1.setTimeInMillis(day1);
       cal1.set(Calendar.HOUR_OF_DAY, 0);
       cal1.set(Calendar.MINUTE, 0);
       cal1.set(Calendar.SECOND, 0);
       cal1.set(Calendar.MILLISECOND, 0);

       cal2.setTimeInMillis(day2);
       cal2.set(Calendar.HOUR_OF_DAY, 0);
       cal2.set(Calendar.MINUTE, 0);
       cal2.set(Calendar.SECOND, 0);
       cal2.set(Calendar.MILLISECOND, 0);
       return cal1.getTimeInMillis()-cal2.getTimeInMillis()==86400000;
   }


   //day1和day2是否为同一天
   public static boolean isSameDay(long day1, long day2) {
       Calendar cal1 = Calendar.getInstance();
       Calendar cal2 = Calendar.getInstance();

       cal1.setTimeInMillis(day1);
       cal1.set(Calendar.HOUR_OF_DAY, 0);
       cal1.set(Calendar.MINUTE, 0);
       cal1.set(Calendar.SECOND, 0);
       cal1.set(Calendar.MILLISECOND, 0);

       cal2.setTimeInMillis(day2);
       cal2.set(Calendar.HOUR_OF_DAY, 0);
       cal2.set(Calendar.MINUTE, 0);
       cal2.set(Calendar.SECOND, 0);
       cal2.set(Calendar.MILLISECOND, 0);
       return cal1.getTimeInMillis()-cal2.getTimeInMillis()==0;
   }


   //判断day是否在当前月
   public static boolean isInCurrentMonth(long day) {
       return day < SignUtil.getTimesMonthEnd() && day >= SignUtil.getTimesMonthStart();
   }

   //取long时间类型的“天”数据
   public static int getDayDataByTimeInMillis(long time) {
       Calendar cal = Calendar.getInstance();
       cal.setTimeInMillis(time);
       return cal.get(Calendar.DAY_OF_MONTH);
   }


然后是控制器中的逻辑,展示签到历史:

@RequestMapping(value = "/a/u/signtest", method = RequestMethod.GET)
public String getSignHistoryTest(HttpServletRequest request,
                        HttpServletResponse response, ModelMap model) {
  Long uid = 5L;
  List<Integer> signHistory = new ArrayList<>();
  User user;
  int maxSignNum = 0;
  int totalSignNum;
  try {
     List<Long> signTimeStamp = signService.getSignIdsByUId(uid);

     totalSignNum = signTimeStamp.size();//签到总数

     user = userService.getObjectById(uid);

     //计算最高连续签到
     int ctn = 0;
     for (int i = 0; i < signTimeStamp.size() - 1; i++) {
        if (SignUtil.isContinue(signTimeStamp.get(i), signTimeStamp.get(i + 1))) {
    ctn++;
        } else {
               if (ctn > maxSignNum) {
        maxSignNum = ctn;
           }
         ctn = 0;
        }
     }

     //签到历史数组
     for (Long sign : signTimeStamp) {
        if (SignUtil.isInCurrentMonth(sign)) {
           signHistory.add(SignUtil.getDayDataByTimeInMillis(sign));
        }
     }
     Collections.sort(signHistory);

     model.addAttribute("code", 0);
     model.addAttribute("signHistory", signHistory);
     model.addAttribute("user", user);
     model.addAttribute("totalSignNum", totalSignNum);
     model.addAttribute("maxSignNum", maxSignNum);


  } catch (Throwable t) {
     log.error(t.getMessage());
     model.addAttribute("code", -100000);
  }


  return "data/signHistoryTest";
}


签到行为:

@RequestMapping(value = "/a/u/sign", method = RequestMethod.POST)
public String sign(ModelMap model) {
Long uid = 10L;
  Sign sign = new Sign();
  sign.setUid(uid);
  try {
//获取最近一次签到的时间
     Long currentSign = signService.getSignTimeByCurrent(uid);
     Long nowDay = System.currentTimeMillis();

     //若上面获取时间为今天,code设定为“今天已签到,请勿重复签到”
     if (SignUtil.isSameDay(currentSign, nowDay)) {
signService.insert(sign);
        model.addAttribute("code", 0);
     } else {
model.addAttribute("code", -2001);
     }

} catch (Throwable t) {
model.addAttribute("code", -100000);
  }
return "data/sign";
}



明天计划的事情:

准备小课堂,讲小课堂


遇到的问题:

如何在控制器中获取uid,这个组员还没有解决


收获:

完成签到模块


进度:

签到模块已完成,讲完小课堂后进行视频前台模块的编写




返回列表 返回列表
评论

    分享到