发表于: 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,这个组员还没有解决
收获:
完成签到模块
进度:
签到模块已完成,讲完小课堂后进行视频前台模块的编写
评论