我的第一篇博客之fullcalendar的使用

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-26 09:12   94   0
第一篇博客,可能会很丑,可能会很蠢,可能会没人看,看了也可能不想看(因为一个人写的所以很乱哈哈,如果有问题懒得看的同学欢迎加入fullcalendar交流群: 620796673
有些注释也懒得写),但是这没关系,谁让我现在这么闲呢,哈哈!!!好吧虽然我是个菜鸡,但是还是得有一颗分享并且乐于助人的心的,接下来进入主题
由于工作中一个项目要用到一个预约功能,翻来覆去(在大牛的推荐下)还是决定使用fullcalendar这个日程管理控件,fullcalendar是一个非常强大并且API齐全的日程控件,官网上说是可以定制,原谅我修改只会改源码和重写QAQ,确实是还需要提升下自己的技术,接下来上代码跟效果图


嗯,丑了点,但是基本功能还是都能满足的,创建,修改,新增,删除,日历跳转,都OK

 var event=[];//数据源
        var isModifyDate=dialog({});//是否修改预约弹窗
        var doc=[];//医生源
        var msgShow=dialog({});//数据展示吸附窗
        var newBookingdialog=dialog({});//创建新预约弹窗
        var classState=['预约','已确认','咨询中','已挂号','治疗中','治疗完成','已结账','已离开','失约'];//预约状态
        var docmsg=``; //医生Select
        var statemsg=``;//治疗状态Select
        $('#makeCalendar').fullCalendar({
            header:{
                left:'agendaDay,agendaWeek  prev,next',
                center:'title',
                right:'today'
            },
            views: {
                agenda: {
                    eventLimit: 3, // 现在全天最多显示三个资源在agenda视图里
                },
                agendaDay: {
                    groupByResource: true,// 天视图  才显示医生资源视图
                },
            },
            //theme:true,
            //monthNames: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
            //monthNamesShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
            dayNames: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
            dayNamesShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
            defaultView:'agendaDay',
            editable:true,//是否可拖拽和改变大小
            height:'parent',//高度根据父元素
            slotEventOverlap:false,//议程视图中的定时事件是否可重叠。
            slotLabelFormat:'h:mma',//议程视图的垂直轴上显示的时间文本格式。
            slotLabelInterval:'00:20:00',//显示插槽的日期/时间的文本标记时间轴的频率。
            slotDuration:'00:10:00',//时隙的频率。
            minTime:'06:00:00',
            maxTime:'19:10:00',
            selectable: true, //允许用户拖动
            //weekNumbers:true,//左上角显示第几总周数
            dragRevertDuration:200,//拖动不成功后恢复到原始位置所需的时间。
            eventStartEditable:true,//允许事件的开始时间通过拖动进行编辑。
            groupByResource:false,//多日议程或基本视图是否应显示资源列。如果是这样,将资源标题放在日期标题之上。
            groupByDateAndResource:false,//多日议程或基本视图是否应显示资源列。如果是,将资源标题放在日期标题之下。
            businessHours:[{//强调日历上的某些时间段。
                dow:[1,2,3], //周
                start:'10:00',
                end:'13:10'
            }],//强调的时间段
            navLinks:true,//周视图可点击并跳转
            eventLimit:true,//设置全天显示多少个日程项 具体数值在views的agenda的eventLimit设置默认为5
            allDaySlot:false,//全天插槽 隐藏
            unselectAuto:false,//单击页面上的其他位置将导致当前选择被清除
            schedulerLicenseKey: 'CC-Attribution-NonCommercial-NoDerivatives',//隐藏试用版的提示
            selectHelper: true,//当点击或拖动选择时间时,显示默认加载的提示信息,该属性只在周/天视图里可用。
            selectMinDistance:10,//在选择之前,用户鼠标在鼠标移动后必须行进的最小距离。
            selectOverlap:false,//是否允许选择事件占用的时间段 给函数的话每次选择都会触发此事件 返回true允许选择 false反之 可在这之前做逻辑判断。
            selectConstraint:{
                //start: '10:00', // a start time (10am in this example)
                //end: '18:00', // an end time (6pm in this example)
                //dow: [ 1, 2, 3, 4 ]
                // days of week. an array of zero-based day of week integers (0=Sunday)
                // (Monday-Thursday in this example)
            },//将用户选择限制在某些时间窗口。
            eventResize: function (event,delta,revertFunc) {//事件被拉长或缩短
                isModifyDateFn(event,revertFunc);
            },
            resourceLabelText:'顶顶顶',
            resources: [
            ],
           // eventConstraint:"businessHours",
            eventClick: function (event, jsEvent, view) {
                jsEvent.stopPropagation();
                msgShow.close().remove();
                msgShow=dialog({
                    content:'预约医生为:'+event.resourceId+'<br/>大苏打撒旦我去饿我去饿了看手机哦多久啊<br/>地洒落;的空间我欸哦城镇乡村小镇<br/>dsad的我去额为全额的撒旦撒<br/>的dasdsad撒娇肯德基撒旦'
                })
                msgShow.show($(this)[0]);
            },
            eventDragStart: function () {//事件拖动开始时触发
                msgShow.close().remove();
            },
            eventDrop: function (event,delta,revertFunc,jsEvent,ui,view) {//事件停止拖动时触发并拖动到了新的时间
                isModifyDateFn(event,revertFunc);//修改时间
            },
            select: function( startDate, endDate, jsEvent, view ,resource){
                var state='新建预约';
                var start =startDate.format('YYYY-MM-DD HH:mm');
                var end =endDate.format('YYYY-MM-DD HH:mm');
                var docName;
                if(view.type=='agendaDay'){
                    docName=resource.title;
                }else{
                    docName='';
                }
                createBooking(start,end,docName,state,view);
            },
            dayClick: function (date,jsEvent,view,resourceObj) {
                console.log(date.format("yyyy-MM-dd hh:mm:ss"));
            },
            eventAfterRender:function(event,element,view){ //事件在面板完成后的处理事件
                $(element).on("dblclick",function (){ //双击事件
                    console.log(event.className);
                    var start=event.start.format('YYYY-MM-DD HH:mm');
                    var end=event.end.format('YYYY-MM-DD HH:mm');
                    var title=event.title;
                    var doc=event.resourceId;
                    var state='修改预约';
                    var classState=event.className[0].appointmentState;  //治疗状态
                    createBooking(start,end,doc,state,event,title,classState);
                });

            },
            eventRender: function (event, element) {//在呈现事件时触发
                var patientName=event.className[0].patientName?event.className[0].patientName:"";//患者姓名
                if(patientName){
                    element.prepend("<div class='myfc-title'>患者姓名:<span>"+patientName+"</span></div>");
                }else{
                    element.prepend("<div class='myfc-title'><span>"+"新建预约"+"</span></div>");
                }

            },
            resourceRender: function (resourceObj, labelTds, bodyTds) {//在资源呈现时触发
                $(labelTds).css({'cursor':'pointer'})
                $(labelTds).on('click',function(){
                    console.log(resourceObj);
                    var aaa=$('#makeCalendar').fullCalendar('refetchEventSources',function(Event){
                        if(Event.resourceId==resourceObj.id){
                            return Event;
                        }
                    });
                    console.log(aaa);
                    $('#makeCalendar').fullCalendar('changeView','agendaWeek'); //切换到不同视图
                })
            }
        })

基本视图配置上了接下来就是一些数据跟弹窗了
       //获取医生资源
        $.ajax({
            url:'../static/main/php/getDoctorList.php',
            type:'get',
            success: function (list) {
                for(var i= 0,arr={};i<list.length;i++){
                    arr={
                        id:list[i].dtdid,
                        title:list[i].dtname
                    };
                    doc.push(arr);
                    $('#makeCalendar').fullCalendar('addResource', {
                        id:list[i].dtdid,
                        title:list[i].dtname
                    });
                }
                doc=list;
                for(var i=0;i<doc.length;i++){
                    docmsg+=`<option>${doc[i].dtname}</option>`
                }
            },
            error: function () {

            }
        })
        //获取数据源
        $.ajax({
            url:'../static/main/php/appointmentEvent.php',
            type:'get',
            success: function (list) {
                for(var i= 0,arr={};i<list.length;i++){
                    arr={
                        title:list[i].atdiseases,
                        start:list[i].atstarTime,
                        end:list[i].atendTime,
                        id:list[i].atid,
                        resourceId:list[i].atdoctor,
                        className:[{appointmentState:list[i].classState,patientName:list[i].atpatient}]
                    };
                    event.push(arr);
                }
                $('#makeCalendar').fullCalendar('addEventSource',event);
            },
            error: function () {

            }
        })


        for(var i=0;i<classState.length;i++){
            statemsg+=`<option>${classState[i]}</option>`
        }
        //弹出框点击后下一次操作隐藏的两个方法
        $(document).on('click', function () {
                msgShow.close().remove();//预约项悬浮提示消息
            $('#makeClendar_title').hide();//预约项标题
        })
        $(document).on('mousewheel DOMMouseScroll', function () {
                msgShow.close().remove();//预约项悬浮提示消息
        })

        //修改预约时间
        function isModifyDateFn(event,revertFunc){
            isModifyDate=dialog({
                title:'预约修改确认',
                content:'您确认要修改预约时间吗',
                okValue:'确定',
                ok:function(){
                    var atid=event.id;
                    console.log(event);
                    var atpatient=event.className[0].patientName;
                    var atstarTime=event.start.format();
                    var atendTime=event.end.format();
                    var atdoctor=event.resourceId;
                    $.ajax({
                        url:'../static/main/php/modifyDate.php',
                        type:'post',
                        dataType:'text',
                        data:{"atid":atid,"atstarTime":atstarTime,"atendTime":atendTime,"atdoctor":atdoctor,"atpatient":atpatient},
                        success: function (data) {
                            console.log('succ');
                        },
                        error: function (data) {
                            console.log('err:'+data);
                        }
                    })
                },
                cancelValue:'取消',
                cancel: function () {
                    revertFunc();
                }
            })
            isModifyDate.showModal();
        }
        //创建新预约
        function createBooking(start,end,docName,state,jsEvent,title,appointmentState,patientName){
            //设置状态按钮
            var dialogButton=[];
            if(state=='修改预约'){
                dialogButton=[
                    {
                        value:'删除预约',
                        callback:function(){
                            $.ajax({
                                url:'../static/main/php/deleteEvent.php',
                                type:'post',
                                data:{"atpatient":jsEvent.id},
                                dataType:'text',
                                success: function (data) {
                                    if(data){
                                        $('#makeCalendar').fullCalendar('removeEvents',[jsEvent.id]);//删除事件用姓名做判断
                                    }
                                }
                            })
                        }
                    }
                ];
            }else{
                dialogButton=[];
            }
            var bookingHtml=`
                <div class="newBookingBox"id="wqeqwesa">
                    <label for="patientName">病人姓名:</label><input type="text"id="patientName"value="${jsEvent.className?jsEvent.className[0].patientName:''}"/> <br/><br/>
                     <label for="appointmentPro">预约项目:</label><input type="text"id="appointmentPro"value="${title?title:''}"/> <br/><br/>
                    <label for="startTime">开始时间:</label><input type="text"id="startTime"class="easyui-datetimebox"
                    data-options="showSeconds:false"value="${start}"/><br/><br/>
                    <label for="endTime">结束时间:</label><input type="text"id="endTime"class="easyui-datetimebox"
                    data-options="showSeconds:false"value="${end}"/><br/><br/>
                    <label for="">选择医生:</label>
                    <select class="easyui-combobox" id="docSelect" name="state" style="width:200px;"data-options="value:'${docName}',editable:false">
                    ${docmsg}
                    </select><br/>
                    <label for="stateSelect">选择状态:</label>
                    <select class="easyui-combobox" id="stateSelect"style="width:200px;"data-options="value:'${appointmentState?appointmentState:classState[0]}',editable:false">
                    ${statemsg}
                    </select>
                </div>
            `;
            newBookingdialog=dialog({
                title:state,
                content:bookingHtml,
                okValue:'保存预约',
                id:'newBookWarp',
                width:600,
                ok:function(){
                    var startTime= $('#startTime').datetimebox('getValue');
                    var endTime=$('#endTime').datetimebox('getValue');
                    var patientName=$('#patientName').val();
                    var docName=$('#docSelect').combobox('getValue');
                    var atscheduling='正常';
                    var atdiseases=$('#appointmentPro').val();
                    var atcreateTime=getNowFormatDate();
                    var classState=$('#stateSelect').val();
                    var atid=jsEvent.id;
                    if(!startTime||!endTime||!patientName||!docName||!atdiseases||!classState){
                        console.log('不能为空');
                        var alertNull=dialog({
                            title:'输入不能为空!!!!',
                            content:'请正确填写预约项',
                            okValue:'确定',
                            ok: function () {
                                alertNull.close();
                            }
                        }).showModal();
                        return false;
                    }else {
                        $.ajax({
                            url: '../static/main/php/setEvent.php',
                            type: 'post',
                            data: {
                                "atid":atid,
                                "state":state,
                                "startTime": startTime,
                                "endTime": endTime,
                                "patientName": patientName,
                                "docName": docName,
                                "atscheduling": atscheduling,
                                "atdiseases": atdiseases,
                                "atcreateTime": atcreateTime,
                                "classState":classState
                            },
                            dataType: 'text',
                            success: function (data) {
                                if(state=='修改预约'){
                                    console.log(1);
                                    jsEvent.startTime=startTime;
                                    jsEvent.endTime=endTime;
                                    jsEvent.title=atdiseases;
                                    jsEvent.className=[{appointmentState:classState,patientName:patientName}];
                                    jsEvent.resourceId=docName,
                                    $('#makeCalendar').fullCalendar('updateEvent', jsEvent);

                                }else {
                                    $('#makeCalendar').fullCalendar('unselect');
                                    $('#makeCalendar').fullCalendar('addEventSource', [{
                                        title: atdiseases,
                                        start: startTime,
                                        end: endTime,
                                        id: data,
                                        resourceId: docName,
                                        className: [{appointmentState: classState.classState, patientName: patientName}]
                                    }]);
                                }
                            },
                            error: function () {
                                console.log('err');
                            }
                        })
                    }
                },
                cancelValue:'取消',
                cancel: function () {
                    $('#makeCalendar').fullCalendar('unselect');
                },
                button:dialogButton
            })
            $.parser.parse($('#wqeqwesa').parent())
            newBookingdialog.showModal();
        }

        //预约盒子
        function createDialog(){

        }

        //获取当前时间
        function getNowFormatDate() {
            var date = new Date();
            var seperator1 = "-";
            var seperator2 = ":";
            var month = date.getMonth() + 1;
            var strDate = date.getDate();
            if (month >= 1 && month <= 9) {
                month = "0" + month;
            }
            if (strDate >= 0 && strDate <= 9) {
                strDate = "0" + strDate;
            }
            var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
                + " " + date.getHours() + seperator2 + date.getMinutes()
                + seperator2 + date.getSeconds();
            return currentdate;
        }
        /** 绑定事件到日期下拉框 **/
        $(function(){
            $('#makeClendar_title').calendar({
                onSelect: function(date){

                    $("#makeCalendar").fullCalendar('gotoDate',date);
                    $(this).hide();
                }
            });


            $("#fc-dateSelect").delegate("select","change",function(){
                var fcsYear = $("#fcs_date_year").val();
                var fcsMonth = $("#fcs_date_month").val();
                $("#makeCalendar").fullCalendar('gotoDate', fcsYear, fcsMonth);
            });
        });
        //日期标题点击出现日历
        $(document).on('click', '#dateSelectBtn',function (e) {
            e.stopPropagation();
            $('#makeClendar_title').show();
        })
        //对目标元素停止冒泡防止点击目标元素关闭
        $(document).on('click', '#makeClendar_title',function (e) {
            e.stopPropagation();
        })
    })

这里如果还能坚持看下去的同学在下佩服,我这里用到的标题日历是easyui 的日历,弹窗用的是artdialog,接下来可能有需要知道标题的同学我这里说一下,标题没有提供开源的自定义,所以我是直接修改源码来达到我的需求。
     if (buttonName == 'title') {
      //2017.5.8 jw 修改此处 标题下拉框选择年月
      var selectHtml = '<div class="makeTitle"><button id="dateSelectBtn"><span class=""></span><span></span><span class="scheduler-title"></span></button><div id="makeClendar_title"class="easyui-calendar"></div></div>';
      $('#makeClendar_title').calendar({
       current:new Date(),
      });

      groupChildren = groupChildren.add($(selectHtml)); // we always want it to take up height
      isOnlyButtons = false;
     }
 function updateTitle(text) {
  if (el) {
   //el.find('h2').text(text);
   $('.scheduler-title').html(text);
   text=text.replace(/年|月/g,',');
   text=text.replace(/日/g,'');
            //
   //var yearText=text.charAt(0)+text.charAt(1)+text.charAt(2)+text.charAt(3);
   //var month=text.charAt(5)+text.charAt(6);
   //var day = text.charAt(7)+text.charAt(6);
   $('#makeClendar_title').calendar({
    current:new Date(text),
   });
   $.parser.parse($('#makeClendar_title').parent());

  }
 }

修改这两个地方具体用ctrl,具体我就不解释了,找到位置看下源码就知道他是怎么操作的了




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP