截止日期获取中间日期并且动态展示到日历上"/>
根据起始截止日期获取中间日期并且动态展示到日历上
根据后端起始截止日期获取中间日期
并将这些日期放到mark里面进行展示
有前后端交互,基于layui、ssm、mybatisPlus、html、javascript
推荐和ayui文档日期时间的模块选择一起看
.html#mark
先看效果
第一步初始化:
1.数据库字段定义
2.对应的实体
public class Holiday extends BaseEntity {/*** 节假日名称*/private String holidayName;/*** 节假日开始时间*/private LocalDateTime holidayStartTime;/*** 节假日结束时间*/private LocalDateTime holidayEndTime;
}
3.前端嵌套layui日历
<div class="layui-card-body"><span id="testView"></span><div id="test2"></div></div>
layui.use(['laydate'], function(){var laydate = layui.laydate;laydate.render({elem: '#test2',position: 'static',btns: ['now'],change: function(value, date){ //监听日期被切换lay('#testView').html(value);},theme: 'grid',mark:holiday //holiday是我在***最外层***自定义的变量});
第二步研究问题:mark放的其实很像json数组或者map
第三步功能实现:
3.js功能-------此功能最好写在上面js功能的前边
var holiday;
$(document).ready(function () {$.ajax({url: "holiday/getdatejson",type: "get",async: false,success: function (data) {if (data.flag) {console.log(data.map);holiday = data.map;}console.log(holiday);},error: function() {console.log('请求失败~');},});
})
后端
我定义了一个回参接收类 ,此处没有写get、set
public class ResultMsg {private Boolean flag;private String msg;private Map<String,Object> map = new HashMap<>();public static ResultMsg success(){ResultMsg resultMsg = new ResultMsg();resultMsg.flag=true;resultMsg.msg = "处理成功";return resultMsg;}public static ResultMsg failed(){ResultMsg resultMsg = new ResultMsg();resultMsg.flag=false;resultMsg.msg = "处理失败";return resultMsg;}public ResultMsg add(String name, Object value){map.put(name,value);return this;}
}
定义了一个似乎相对来说没有用的类,本来是想做list集合,后来发现直接放入map里面更好,其实后面Controller和Service写复杂了,但是我懒得改了233
public class nameToDate {String date;String name;
}
Controller层------把拿到的《日期和名字的集合》都放到map集合里面
@GetMapping("getdatejson")@ResponseBodypublic ResultMsg getdatejson() throws ParseException {ResultMsg resultMsg = ResultMsg.success();List<nameToDate> res = holidayService.getDatesJson();for (int i = 0; i <res.size() ; i++) {resultMsg.add(res.get(i).getDate(),res.get(i).getName());}return resultMsg;}
Service层------这里是遍历拿到中间日期和名字,为什么做了几次转换就是因为我数据库存的其实是datetime,但是我只需要年月日就够了,使用了Mybatisplus
public List<nameToDate> getDatesJson() throws ParseException {
// 查所有List<Holiday> holiday=list();
// 设置回参listList<nameToDate> res=new ArrayList<nameToDate>();
// 开始遍历for (int i = 0; i <holiday.size() ; i++) {
// res.get(i).setName(holiday.get(i).getHolidayName());
// 格式化成日期字符串再强转DateString holidayStartTime= DateUtil.format(holiday.get(i).getHolidayStartTime(),"yyyy-MM-dd");String holidayEndTime=DateUtil.format(holiday.get(i).getHolidayEndTime(),"yyyy-MM-dd");SimpleDateFormat sdf1 =new SimpleDateFormat("yyyy-MM-dd" );Date d1 = sdf1.parse(holidayStartTime);Date d2 = sdf1.parse(holidayEndTime);
// 遍历的日期Calendar dd = Calendar.getInstance(); //定义日期实例
// 起始日期放进去dd.setTime(d1);
// 开始遍历while(d1pareTo(d2)<=0){ //小于结束日期dd.setTime(d1);nameToDate nametodate=new nameToDate(); //定义单个回参实例nametodate.setName(holiday.get(i).getHolidayName());nametodate.setDate(sdf1.format(dd.getTime()));res.add(nametodate);dd.add(dd.DATE,1); //当前日期加一天d1 = dd.getTime(); //重新赋值起始日期}}return res;}
到此为止就差不多实现了上述功能,
问题:1.其实我没怎么做参数的校验,这个是一个比较严肃的问题
2.功能写复杂了
3.出现日期相同的最新的会把老一点的覆盖掉
如果有更好的方法或者优化请在楼下评论,谢谢!
更多推荐
根据起始截止日期获取中间日期并且动态展示到日历上
发布评论