fullcalendar日历插件的使用并动态增删改查
我上个项目是做了一个关于教育方面的web端页面,其中的课程表就要用到fullcalendar日历插件,刚开始也是不会用,因为以前也没用过,后面也是看官方文档,问同事,最后完成了这个课程表,个人感觉fullcalendar这个日历插件功能很强大!下面我来附上几张图片:
1、刚进去默认显示当前月份,查出数据库的数据并展示,今天是2018年1月19号,所以我给上过的课次颜色变为灰色,而没上过的课次变为橙色:

2、点击特定的日期,添加课次:

点击未上过的课次进行编辑或删除:

以及课次的拖动,如将1月22号的“08:00-09:00 高数一班”拖动到1月29号:

下面我来说一下我是怎么实现的
首先需要导入必须的css和js:
<link href='../../../../static/fullcalendar/css/fullcalendar.css' rel='stylesheet' />
<script src='../../../../static/fullcalendar/js/jquery.min.js'></script>
<script src='../../../../static/fullcalendar/js/moment.min.js'></script>
<script src='../../../../static/fullcalendar/js/fullcalendar.min.js'></script>
<script src='../../../../static/fullcalendar/js/bootstrap.min.js'></script>
<script src='../../../../static/fullcalendar/js/zh-cn.js'></script>
在页面中我还使用了bootstrap和layer,所有我还导入了:
<link href="./bootstrap/3.3.4/css_default/bootstrap.min.css" type="text/css" rel="stylesheet" />//我的弹出框是用bootstrap实现的,所以我导入了bootstrap的css和js
<script src="./bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
<link href="./layui/css/layui.css" rel="stylesheet">
<script src="./layui/layui.js"></script>
<script src="./layer-v2.0/layer/layer.js"></script>
还会用到一些公用的js方法对时间格式做转化:
Date.prototype.Format = function(format){
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
};
if(/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
};
//将数据库的时间戳转成 *年*月*日 字符串
function getDate(DBTime){
var date = new Date(DBTime);
var year = date.getFullYear();
var month = date.getMonth()+1;
var day = date.getDate();
var dateStr;
if(month<10&&day<10){
dateStr = year+"-0"+month+"-0"+day;
}else if(month<10&&day>=10){
dateStr = year+"-0"+month+"-"+day;
}else if(month>=10&&day<10){
dateStr = year+"-"+month+"-0"+day;
}else if(month>=10&&day>=10){
dateStr = year+"-"+month+"-"+day;
}
return dateStr;
}
//将数据库的时间戳转成 *时*分 字符串
function getTime(DBTime){
var time = DBTime.substring(0,2)+"-"+DBTime.substring(3,5);
return time;
}
然后就是初始化FullCalendar:
下面这些代码建议在document。ready中写,在页面初始化的时候就加载运行
$('#calendar').fullCalendar({
//设置头部信息,如果不想显示,可以设置header为false
header: {
//日历头部左边:初始化切换按钮
left: '',
//日历头部中间:显示当前日期信息
center: 'title',
//日历头部右边:初始化视图
right: 'prev,next today'
},
//月视图下日历格子宽度和高度的比例
aspectRatio: 1.35,
//月视图的显示模式,fixed:固定显示6周高;liquid:高度随周数变化;variable: 高度固定
weekMode: 'liquid',
//初始化时的默认视图,month、agendaWeek、agendaDay
defaultView: 'month',
//agenda视图下是否显示all-day
allDaySlot: true,
//agenda视图下all-day的显示文本
allDayText: '全天',
//agenda视图下两个相邻时间之间的间隔
slotMinutes: 30,
//区分工作时间
businessHours: true,
//非all-day时,如果没有指定结束时间,默认执行120分钟
defaultEventMinutes: 60,
//设置为true时,如果数据过多超过日历格子显示的高度时,多出去的数据不会将格子挤开,而是显示为 +...more ,点击后才会完整显示所有的数据
eventLimit: true,
//设置是否显示周六和周日,设为false则不显示
weekends: true,
//日历初始化时显示的日期,月视图显示该月,周视图显示该周,日视图显示该天,和当前日期没有关系
//defaultDate: '2016-08-11',
//设置是否可被单击或者拖动选择
selectable: true,
//点击或者拖动选择时,是否显示时间范围的提示信息,该属性只在agenda视图里可用
selectHelper: true,
//点击或者拖动选中之后,点击日历外的空白区域是否取消选中状态 true为取消 false为不取消,只有重新选择时才会取消
unselectAuto: true,
//Event是否可被拖动或者拖拽
editable: true,
//Event被拖动时的不透明度
dragOpacity: 0.5,
//日程数据
events:
function(start,end,timezone,callback){
var className = $("#keyword").val();//该keyword是页面搜索框要查询的班级名称
var date = new Date();
var nowDate = date.Format("yyyyMMdd");
var nowTime = date.Format("hhmmss");
$.ajax({//通过ajax动态查询要展示的课次数据信息
url: '后台controller中查询的路径',
data : {
"className": className,
},
dataType: 'json',
type : 'post',
success: function(result) { // 获取当前月的数据
var events = [];
if(result.body.wesClassCourseList!=null){//result.body.wesClassCourseList其实就是从后台返回前台的一个课次list,
var len = result.body.wesClassCourseList.length;
var wesClassCourseList=result.body.wesClassCourseList;
var wesClassList=result.body.wesClassList;//result.body.wesClassList其实就是从后台返回前台的一个班级list,每一个课次都一一对应每一个班级,也就是说result.body.wesClassCourseList的长度和result.body.wesClassList的长度是一样的
for(var i=0;i<len;i++){
var classCourseDate=getDate(wesClassCourseList[i].classCourseDate);//通过getDate方法将日期格式进行转化
var ccDate = classCourseDate.replace(/\-/g,"");//去掉日期格式中的“-”
var classCourseTime=getTime(wesClassCourseList[i].classCourseTime);//通过getTime方法将时间格式进行转化
var ccTime = classCourseTime.replace(/\-/g,"");//去掉时间格式中的“-”
var wesClass = wesClassList[i].status;
if((ccDate>nowDate||(ccDate==nowDate&&ccTime>nowTime))&&wesClass==false){
events.push({
id:wesClassCourseList[i].classCourseId+","+wesClassCourseList[i].classId,//这里我是将班级课次Id和班级Id一起作为fullcalendar中event事件的Id
title: wesClassCourseList[i].classCourseTime+" "+wesClassList[i].name,//title我显示的是每一个课次的上下课时间和班级名称
start: classCourseDate,//start表示这个event事件放在哪个日期框中
color: 'red',//设置event的背景颜色,若该课次还没上且该班级已经删除则显示为红色
});
}else if((ccDate>nowDate||(ccDate==nowDate&&ccTime>nowTime))&&wesClass==true){
events.push({
id:wesClassCourseList[i].classCourseId+","+wesClassCourseList[i].classId,
title: wesClassCourseList[i].classCourseTime+" "+wesClassList[i].name,
start: classCourseDate,
color: '#ff9f2c',//若该课次还没上且该班级没被删除则显示为红色
});
}
else{
events.push({
id:wesClassCourseList[i].classCourseId+","+wesClassCourseList[i].classId,
title: wesClassCourseList[i].classCourseTime+" "+wesClassList[i].name,
start: classCourseDate,
color: 'gray',//若该课次已经上过则显示为灰色
});
}
}
}
callback(events);
}
});
},
//添加事件
dayClick : function(date, allDay, jsEvent, view ) {
var classCourseDate=date.format();//选择的日期
var ccDate = classCourseDate.replace(/\-/g,"");
var date = new Date();
var nowDate = date.Format("yyyyMMdd");
var nowTime = date.Format("hhmmss");
var nowClassCourseDate = getDate(classCourseDate).replace(/\-/g,"");
if(ccDate<nowDate){
return;
}
$("#startTimeAdd").val("");
$("#endTimeAdd").val("");
//ajax获取班级信息,并展示添加框
$.ajax({
url: '后台controller层查询班级信息的路径',//因为点击日历某个特定日期时,弹出框需要以下拉框的形式显示班级信息
dataType: 'json',
type : 'post',
success: function(result){ // 获取当前月的数据
var len = result.body.wesClassList.length;
var teacherClassInfo=result.body.wesClassList;
str="";
$("#classListInfoAdd").empty();
//循环取教师所带班级
str +='<select id="classIdAdd" style="width: 60%;height:30px; padding-left:4px; padding-top:0px;padding-bottom:0px; line-height:30px; color: grey" >';
str +='<option value="0">请选择</option>';
for(var i=0;i<len;i++){
str +='<option value="'+teacherClassInfo[i].classId+'">'+teacherClassInfo[i].name+'</option>';
}
str +='</select>';
$("#classListInfoAdd").append(str);//班级下拉框赋值
$("#addObjcectInputModalAdd").modal("show");//显示弹出框
}
});
//编辑事件
eventClick : function( event ){
var id=event.id;
var classCourseId=id.split(",")[0];
var classId=id.split(",")[1];
var firstClassId = classId;
var title= event.title;
var startTimeEdit=(title.split(" ")[0]).split("-")[0];
var endTimeEdit=(title.split(" ")[0]).split("-")[1];
var classCourseDate=getDate(event.start);
$.ajax({
url: '查询所有班级信息的路径,弹出框要以下拉框的形式显示',
dataType: 'json',
type : 'post',
success: function(result){ // 获取当前月的数据
var len = result.body.wesClassList.length;
var teacherClassInfo=result.body.wesClassList;
str="";
$("#classListInfoEdit").empty();
//循环取教师所带班级
str +='<select id="classIdEdit" style="width: 60%;height:30px; padding-left:4px; padding-top:0px;padding-bottom:0px; line-height:30px >';
str +='<option value="0">请选择</option>';
for(var i=0;i<len;i++){
if(teacherClassInfo[i].classId==classId){
str +='<option value="'+teacherClassInfo[i].classId+'" selected = "selected" >'+teacherClassInfo[i].name+'</option>';
}else{
str +='<option value="'+teacherClassInfo[i].classId+'" >'+teacherClassInfo[i].name+'</option>';
}
}
str +='</select>';
$("#classListInfoEdit").append(str);//班级下拉框赋值
$("#startTimeEdit").val(startTimeEdit);
$("#endTimeEdit").val(endTimeEdit);
$("#addObjcectInputModalEdit").modal("show");//显示弹出框
}
});
//保存修改内容
var classCourseTime=startTimeEdit+"-"+endTimeEdit;//开始结束时间段
var updateEditBtn=document.getElementById('updateEdit');
updateEditBtn.onclick=function(){
$.ajax({
url: '保存编辑内容的后台路径',
data : {
classCourseId : classCourseId,
classId : classId,
classCourseTime : classCourseTime,
classCourseDate : classCourseDate,
},
dataType: 'json',
type : 'post',
success: function(result) { // 获取当前月的数据
if (result.success) {
$('#calendar'). fullCalendar ( 'refetchEvents' );
$("#addObjcectInputModalEdit").modal("hide");//隐藏弹出框
}
}
}
//删除
var deleEditBtn=document.getElementById('deleEdit');
deleEditBtn.onclick=function(){
layer.confirm('是否确认删除?', {closeBtn: 0, icon : 3 ,skin : 'layui-layer-red',btn: ['确认','取消'] //按钮
}, function(){
$.ajax({
url: '路径',
data : {
classCourseId : classCourseId,
},
dataType: 'json',
type : 'post',
success: function(result) { // 获取当前月的数据
if (result.success) {
$('#calendar').fullCalendar( 'removeEvents' ,[ id ]),//删除当前日程
$("#addObjcectInputModalEdit").modal("hide");//隐藏弹出框
layer.closeAll('dialog');//隐藏消息提示框
}
}
});
});
};
//取消
var cancelEditBtn=document.getElementById('cancelEdit');
cancelEditBtn.onclick=function(){
$("#addObjcectInputModalEdit").modal("hide");//隐藏弹出框
};
},
//拖动事件
eventDrop : function( event, dayDelta, revertFunc ) {
var color = event.color;
if(color=='gray'){
layer.alert("已上课和已关闭的班级课次不能被拖动修改!", {skin:'layui-layer-red',closeBtn:0,icon:2});
revertFunc(); //恢复原状
return;
}
var id=event.id;
var classId=id.split(",")[1];
var title= event.title;
var startTimeEdit=(title.split(" ")[0]).split("-")[0];
var endTimeEdit=(title.split(" ")[0]).split("-")[1];
var classCourseDate=getDate(event.start);
var startTimeEditString = startTimeEdit.replace(/\:/g,"");
var endTimeEditString = endTimeEdit.replace(/\:/g,"");
var classCourseId=id.split(",")[0];
$.ajax({
url: '保存修改信息的后台路径',
data : {
classCourseId : classCourseId,
classCourseDate : classCourseDate,
},
dataType: 'json',
type : 'post',
success: function(result) { // 获取当前月的数据
if (result.success) {
$('#calendar'). fullCalendar ( 'refetchEvents' );
$("#addObjcectInputModalEdit").modal("hide");//隐藏弹出框
}
}
});
$("#search").click(function(){//当点击搜索按钮时页面重新刷新,日历重新初始化
$('#calendar'). fullCalendar ( 'refetchEvents' );
});
//我的添加课次、编辑删除课次弹出框是在body中写的:
//添加课次弹出框代码:
<div class="modal fade" id="addObjcectInputModalAdd" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content" style="width: 45%;border:1px solid;margin: 42%;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
<h4 class="modal-title"><i class="fa fa-info-circle"></i>新建课程</h4>
</div>
<div class="modal-body">
<div class="form-group" style="margin: 2px; margin-bottom: 20px">
<div class="input-group" style="width:100%;line-height: 3; ">
<p>
选择班级:<span id="classListInfoAdd"></span>
</p>
<p>
开始时间:<input type="time" id="startTimeAdd" />
</p>
<p>
结束时间:<input type="time" id="endTimeAdd" />
</p>
<p>
<input type="button" class="btn btn-xs btn-secondary" id="cancelAdd" value="取 消">
<input type="button" class="btn btn-xs btn-success" id="determineAdd" value="确 定">
</p>
</div>
</div>
</div>
</div>
//编辑删除课次弹出框代码:
<div class="modal fade" id="addObjcectInputModalEdit" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content" style="width: 45%;border:1px solid;margin: 42%;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
<h4 class="modal-title"><i class="fa fa-info-circle"></i>编辑课程</h4>
</div>
<div class="modal-body">
<div class="form-group" style="margin: 2px; margin-bottom: 20px">
<div class="input-group" style="width:100%;line-height: 3; ">
<p>
选择班级:<span id="classListInfoEdit"></span>
</p>
<p>
开始时间:<input type="time" id="startTimeEdit" />
</p>
<p>
结束时间:<input type="time" id="endTimeEdit" />
</p>
<p>
<input type="button" class="btn btn-xs btn-secondary" id="cancelEdit" value="取 消">
<input type="button" class="btn btn-xs btn-success" id="updateEdit" value="修 改">
<input type="button" class="btn btn-xs btn-danger" id="deleEdit" value="删 除">
</p>
</div>
</div>
</div>
</div>
</div>
</div>
fullcalendar日历插件的使用并动态增删改查的更多相关文章
- jQuery动态增删改查表格信息,可左键/右键提示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- mybatis的动态增删改查
1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) ...
- SSM 整合 quartz JDBC方式实现job动态增删改查记录
虽然网上有很多资料,但是都不够系统,本文记录下自己的整合过程. 1. 搭建一个SSM项目,此处略. 2. 按照quartz官方要求,建立quartz相关的数据库和表,相关sql语句如下: /* Nav ...
- 实现Quartz的动态增删改查
1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...
- iOS开发-plist文件增删改查
plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plis ...
- 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))
仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- eclipse添加插件实现php的增删改查
一:eclipse添加php插件 1.运行eclipse,在主界面里找到Help下的“Instal New Software”.然后在Work with中选择“All Available Sites” ...
- day 57 data 插件 表的增删改查
一 data的含义 在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值. 1 .data(key, value): 描述:在匹配 ...
随机推荐
- requestAnimationFrame 知多少?
在Web应用中,实现动画效果的方法比较多,JavaScript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和 animation 来实现,html5 中 ...
- SCSS & SASS Color 颜色函数用法
最近做一个没有设计师参与的项目,发现 scss 内置的颜色函数还挺好用.记录分享下 rgba() 能省掉手工转换 hex 到 rgb 格式的工作,如以下 SCSS 代码 $linkColor: #20 ...
- JVM 学习(一)反射、垃圾回收、异常处理--- 2019年4月
1.JVM 基础知识点 JVM 虚拟机包含了:自动内存管理器.垃圾回收(垃圾回收调优). 执行顺序:Java 代码 --- .class 字节码文件(加载到虚拟机中) --- Java 类放在方法区中 ...
- Xapian索引-文档检索过程分析之匹配百分比
本文属于文档检索过程分析的一部分,重点分析文档匹配百分比(percent)的计算过程. 1 percent是什么? 我们之前分析的检索demo: Xapian::Query term_one = Xa ...
- 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
- redis的string类型!!!!
value的最大存储量为512m,可储存图像数据或json数据等 1.redis的增加操作 127.0.0.1:6379> set name China --返回ok,说明增加成功,若n ...
- Devexpress常见问题
1.DevExpress控件组中的GridControl控件不能使横向滚动条有效. 现象:控件中的好多列都挤在一起,列宽都变的很小,根本无法正常浏览控件单元格中的内容. 解决:gridView1.Op ...
- 《Unity3D/2D游戏开发从0到1》正式出版发行
<Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Uni ...
- 时间序列算法(平稳时间序列模型,AR(p),MA(q),ARMA(p,q)模型和非平稳时间序列模型,ARIMA(p,d,q)模型)的模型以及需要的概念基础学习笔记梳理
在做很多与时间序列有关的预测时,比如股票预测,餐厅菜品销量预测时常常会用到时间序列算法,之前在学习这方面的知识时发现这方面的知识讲解不多,所以自己对时间序列算法中的常用概念和模型进行梳理总结(但是为了 ...
- element表格添加序号
表格代码:黄色部分为序号列关键代码上图: <el-table :data="tableData" border height="480" style=&q ...