<template> <div> <FullCalendar :options="calendarOptions" ref="calendar" /> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible"> <el-form :model="form" :rules="rules" ref="form" size="medium" label-width="80px"> <el-form-item label="事件名称" prop="title"> <el-input v-model="form.title" auto-complete="off" placeholder="请输入事件名称" ></el-input> </el-form-item> <el-form-item label="开始时间" prop="start_time"> <el-date-picker v-model="form.start_time" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="选择日期时间" > </el-date-picker> </el-form-item> <el-form-item label="结束时间" prop="end_time"> <el-date-picker v-model="form.end_time" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" placeholder="选择日期时间" > </el-date-picker> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="warning" @click="deleteEvent" v-if="form.id" style="float: left" >删 除</el-button > <el-button size="medium" @click="dialogVisible = false" >取 消</el-button > <el-button size="medium" type="primary" @click="saveEvent" >确 定</el-button > </div> </el-dialog> </div> </template> <script> import FullCalendar from "@fullcalendar/vue"; import dayGridPlugin from "@fullcalendar/daygrid"; import timeGridPlugin from "@fullcalendar/timegrid"; import interactionPlugin /*, { Draggable }*/ from "@fullcalendar/interaction"; import { getCalendarList, addCalendar, updateCalendar, deleteCalendar, } from "@/api/index"; import { /*getUUID, */mapTrim, parseTime } from "@/utils/index" export default { name: "Calendar", components: { FullCalendar, }, data() { return { calendarOptions: { height: "auto", firstDay: "1", locale: "zh-cn", initialView: "dayGridMonth", // timeZone: "UTC", weekNumberCalculation: "ISO", headerToolbar: { start: "prevYear,prev,today,next,nextYear", center: "title", end: "dayGridMonth,timeGridWeek,timeGridDay", }, buttonText: { today: "今天", month: "月", week: "周", day: "天", }, eventTimeFormat: { // hour: "numeric", hour: "2-digit", minute: "2-digit", second: "2-digit", meridiem: false, hour12: false, // 24小时 }, selectable: true, droppable: true, displayEventEnd: true, dayMaxEventRows: 5, dayMaxEvents: 5, editable: true, moreLinkClick: 'popover', events: [], plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin], dateClick: this.handleDateClick, eventClick: this.handleEventClick, select: this.handleSelect, eventDrop: this.handleEventDrop, datesSet: this.handleViewChange, }, dialogVisible: false, form: { id: null, title: null, start_time: null, end_time: null, }, rules: { title: [ { type: "string", required: true, message: "事件标题不能为空", trigger: "blur", }, ], start_time: [ { type: "string", required: true, message: "事件开始时间不能为空", trigger: "blur", }, ], end_time: [ { type: "string", required: true, message: "事件结束时间不能为空", trigger: "blur", }, ], }, dialogTitle: "添加", }; }, // created() { // const startTime = new Date(); // startTime.setDate(1); // startTime.setHours(0); // startTime.setMinutes(0); // startTime.setSeconds(0); // const endTime = new Date(startTime); // endTime.setMonth(startTime.getMonth() + 1); // endTime.setDate(0); // endTime.setHours(0); // endTime.setMinutes(0); // endTime.setSeconds(0); // this.getEventsList({ // 'scope_type': 'list', // 'start_time': parseTime(startTime), // 'end_time': parseTime(endTime), // }) // }, // mounted() { // const calendar = this.$refs.calendar.getApi() // calendar.addEvent({ title: '测试', start: '2021-01-05', allDay: true }) // }, methods: { getCalendarEvents(info, successCallback) { // 获取日历事件 // info, successCallback, failureCallback let events = [ ...this.calendarOptions.events, { title: info.startStr, start: info.start.valueOf(), }, ]; successCallback(events); }, getEventsList(params) { const calendar = this.$refs.calendar.getApi() calendar.getEvents().forEach(evt => { // 先清除所有事件 evt.remove(); }) getCalendarList(params) .then((res) => { res.data.forEach(evt => { calendar.addEvent({ id: evt.id, title: evt.content, start: evt.start, end: evt.end, content: evt.title }); }) }) .catch((err) => { console.log(err.message) // this.$message.error(err.message) }); }, handleMoreLinkClick() {}, handleEventDrop(info) { // 当事件被拖动时会触发此函数 // 拖动事件 this.form.id = info.event.id this.form.title = info.event.extendedProps.content this.form.start_time = parseTime(info.event.start) if (info.event.end) this.form.end_time = parseTime(info.event.end) else this.form.end_time = this.form.start_time const calendar = this.$refs.calendar.getApi() updateCalendar(this.form.id, mapTrim(this.form)) .then((res) => { this.$message({ type: "success", message: "修改成功" }); const event = calendar.getEventById(this.form.id) event.setProp("title", res.data.content) event.setExtendedProp("content", res.data.title) }) .catch((err) => { this.$message.error(err.message) }); }, handleSelect(info) { // 拖拽选择单元格会触发此函数 this.form.start_time = parseTime(info.start) this.form.end_time = parseTime(info.end) }, handleViewChange(info) { // 当视图切换后,需要重新获取数据 this.getEventsList({ 'scope_type': 'calendar', 'start_time': parseTime(info.start), 'end_time': parseTime(info.end), }) }, handleDateClick(info) { // 点击单元格触发此函数 this.dialogVisible = true; this.dialogTitle = "添加"; this.form.title = ""; this.form.start_time = parseTime(info.date); this.form.end_time = parseTime(info.date); }, handleEventClick(info) { // 当事件被点击时会触发此函数 console.log(info) // info.el.style.borderColor = "yellow"; this.dialogVisible = true; this.dialogTitle = "修改"; this.form.id = info.event.id this.form.title = info.event.extendedProps.content this.form.start_time = parseTime(info.event.start) if (info.event.end) this.form.end_time = parseTime(info.event.end) }, saveEvent() { const calendar = this.$refs.calendar.getApi() // 保存事件 this.$refs["form"].validate((valid) => { let result = true; if (valid) { if (this.dialogTitle === "添加") addCalendar(this.form) .then((res) => { this.$message({ type: "success", message: "添加成功" }); calendar.addEvent({ id: res.data.id, title: res.data.content, start: res.data.start, end: res.data.end, content: res.data.title }); }) .catch((err) => { this.$message.error(err.message) }); else if (this.dialogTitle === "修改") updateCalendar(this.form.id, this.form) .then((res) => { this.$message({ type: "success", message: "修改成功" }); const event = calendar.getEventById(this.form.id) event.setProp("title", res.data.content) event.setExtendedProp("content", res.data.title) }) .catch((err) => { this.$message.error(err.message) }); } else { result = false; this.$message.error("表单校验未通过,请检查输入") } this.dialogVisible = false; return result; }); }, deleteEvent() { // 删除事件 deleteCalendar(this.form.id) .then((res) => { this.calendarOptions.events.forEach((item, index, arr) => { console.log(res); if (item.id == this.form.id) arr.splice(index, 1); }); this.dialogVisible = false; this.$message({ message: "删除成功", type: "success" }); }) .catch((err) => { this.$message.error(err.message) }); }, }, }; </script> <style lang="less" scoped> @import "~@fullcalendar/common/main.css"; @import "~@fullcalendar/daygrid/main.css"; @import "~@fullcalendar/timegrid/main.css"; </style>