最终效果图
日:
周:
月:
一、 FullCalendar插件说明
1. 官网介绍“The Most Popular JavaScript Calendar” 最受欢迎的JavaScript日历!支持 Vue、React、Angular、JavaScript脚本语言。
官网链接:[FullCalendar - JavaScript Event Calendar](https://fullcalendar.io/)
2. 使用时请先下载相关插件:
1 | npm i @fullcalendar/vue3 |
本篇中以上插件均使用 “^6.1.9” 版本
下载后通过import 引用即可
1 | import FullCalendar from '@fullcalendar/vue3' |
二、技术梳理
整体分为以下三部分
1. 左上el-calendar日历部分
当前周的背景色、与FullCalendar日期联动、日历本地化:设置周一为每周的第一天(此处有小坑)。
2. 左下订阅部分
checkbox本身不支持直接修改颜色,通过伪类样式覆盖实现不同颜色展示,再通过修改styleSheet修改checkbox伪类背景色、以及相关业务功能逻辑。
3. 右侧FullCalendar
熟悉fullCalenda相关配置项,按需配置初始视图、语言、固定行数、宽高比等静态结构,自定义周看板,根据相关事件,例如点击事件、滑动选择、拖动事件、等编写相关逻辑。
三、实现方案
1.自定义el-calender
**自定义头部**,通过绑定dateRef手动切换日期月份,同时调用FullCalendar相关方法,确保两个日历日期保持一致。
1 | <el-calendar v-model="date" ref="dateRef" class="custom-calendar"> |
1 | // 切换日期月份 |
**设置周背景色**,通过watch监视日期变化,当用户选择日期后实时计算此时的周一和周日的日期,处在两者中的日期,添加样式,完整代码如下
1 | <!-- 日历 --> |
1 | // 周背景色 |
**日历本地化**,设置周一为周的第一天
Element Plus官方文档解释说:我们使用 [Day.js](https://day.js.org/docs/en/i18n/i18n) 库来管理组件的日期和时间,例如DatePicker 。 必须在 Day.js 中设置一个适当的区域,以便使国际化充分发挥作用。 您必须分开导入Day.js的区域设置。
所以我们在main.js中加入如下代码
1 | import ElementPlus from 'element-plus' |
理论上这样就可以了,相信大部分人也都可以,**但是**这里有个坑就是这样可能并不会生效,博主在实验多次后发现,按照如上设置后其他的涵盖日期的组件都会生效,例如日期选择器、时间日期选择器,唯独这个日历不生效.....
最后,需要在上述代码的基础上额外添加
1 | import dayjs from 'dayjs' |
往往困扰几天,自认为很复杂,甚至都打算去扒源码的bug,只需要两行代码就能解决...hh
2.订阅功能
**功能部分,** 主要涉及权限的修改,订阅人的添加与取消,修改颜色,主要为业务逻辑,技术难度相对较低,这里只做展示,不进行展开。
**样式部分,** 主要涉及FullCalendar事件背景色,以及checkbox复选框颜色覆盖
由于checkbox复选框本身不支持颜色的修改,所以我们使用伪类样式对其进行覆盖
该结构由数据遍历而来,故而我们可以为每个checkbox绑定不同的类名: **:class="`itemBox_${index}`"** ,代码如下
1 | <el-collapse-item title="订阅日程" name="second" class="relative z-50 collapseBox" style="height: auto;"> |
这样当我们在获取订阅人数据时,通过styleSheets添加伪类样式,为不同的用户添加颜色
1 | // 正常获取数据,处理数据,储存数据... |
当用户修改颜色时,我们除了需要向后台发送最新的颜色外,还需要手动更新styleSheets样式(直接刷新用户列表,获取订阅人不会生效,原因为浏览器未刷新,样式表不会更新)
1 | // 修改事件颜色 |
3.FullCalendar的使用
**FullCalendar的内置函数及配置项**
1 | // 切换到下一月/周/日 |
更多更详细FullCalendar介绍可查询官方文档,本篇只展示当前功能下所需要的相关配置
官网链接:[FullCalendar - JavaScript Event Calendar](https://fullcalendar.io/)
**配置FullCalendar,** 了解相关配置项,本篇中使用的配置如下
1 | // fullCalendar 配置项 |
**同步日期,** el-calendar与fullCalendar需要双向绑定,前面点击小日历切换日期时同时修改日程日期,现使用FullCalendar内置函数对小日历进行日期绑定
1 | onMounted(() => { |
相关业务事件, 例如用户滑动选择、拖拽日程边缘增加/减少时间、拖动日程修改日程在对应方法中执行相关业务逻辑即可,对应的回调传递info参数,在info.event中可以获取用户执行后的开始时间和结束时间,需要强调的是,此时获取的时间为一个表示日期和时间的 ISO 8601 格式的字符串,我们需要把他转换成我们需要的YYYY-MM-DD HH:mm格式,封装formatDateTime方法。
1 | // 格式化日期 |
1 | //点击日期info是单元格的信息 |
1 | const resizeEventDate = async info => { |
**切换视图,** 通过内置方法datesSet中的view参数,可以获得当前视图是日期范围,**需要强调的是,返回的结束时间为后一天的零天,例如周时间为2023-12-11 至2023-12-17,实际返回的结果为2023-12-11T00:00:00+08:00" 至 "2023-12-18T00:00:00+08:00",** 所以我们需要修改结束时间。
1 | // 切换视图时触发 |
4.周看板
周看板为单独封装在FullCalendar上的,非FullCalendar原生自带功能。
主要需求是为了帮助领导助理及时安排、记录、处理领导的日程,方便规划领导整体行程。
**效果图**
使用FullCalendar中的 **customButtons**配置项,添加看板按钮
1 | customButtons: { |
看板列表与订阅人列表相同,在获取到事件数据后,对事件进行处理
1 | // 处理周视图弹窗数据--以 ownUser 维度组合 |
在切换视图时处理相关数据
1 | // 周视图-领导视图交互及数据处理 |
静态结构
1 | <el-dialog v-model="isWeekViewShow" width="60%" class="week-view-dialog"> |
四、总结
以上就是基于Vue3 + FullCalendar实现会议日程预约管理系统开发方案,在本方案中,我们对el-calendar的二次开发,订阅功能的实现,FullCalendar的技术说明等等...内容过多,所以有些地方并没有详细说明,若您有什么疑问或对我的内容进行指正,欢迎您在下方进行评论探讨。
希望本篇内容对您有所帮助。
本文转载自: 掘金