当前位置:首页 > VUE

vue实现日历人员值班

2026-01-19 23:15:39VUE

实现日历人员值班功能

日历人员值班功能可以通过Vue结合第三方日历组件或自定义实现。以下是一种基于FullCalendar的实现方案。

安装依赖

需要安装@fullcalendar/vue及相关插件:

vue实现日历人员值班

npm install @fullcalendar/vue @fullcalendar/core @fullcalendar/daygrid @fullcalendar/timegrid @fullcalendar/interaction

基本组件结构

创建一个Vue组件来承载日历功能:

<template>
  <FullCalendar :options="calendarOptions" />
</template>

<script>
import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import timeGridPlugin from '@fullcalendar/timegrid'
import interactionPlugin from '@fullcalendar/interaction'

export default {
  components: { FullCalendar },
  data() {
    return {
      calendarOptions: {
        plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin],
        initialView: 'dayGridMonth',
        headerToolbar: {
          left: 'prev,next today',
          center: 'title',
          right: 'dayGridMonth,timeGridWeek'
        },
        events: [
          {
            title: '张三值班',
            start: '2023-11-01',
            end: '2023-11-02',
            color: '#ff9f89'
          },
          {
            title: '李四值班',
            start: '2023-11-05',
            end: '2023-11-07',
            color: '#f6c3d0'
          }
        ],
        editable: true,
        selectable: true,
        dateClick: this.handleDateClick,
        eventClick: this.handleEventClick
      }
    }
  },
  methods: {
    handleDateClick(arg) {
      const name = prompt('输入值班人员姓名')
      if (name) {
        this.calendarOptions.events.push({
          title: name + '值班',
          start: arg.date,
          allDay: arg.allDay,
          color: this.getRandomColor()
        })
      }
    },
    handleEventClick(info) {
      if (confirm('确定要删除这个值班安排吗?')) {
        info.event.remove()
      }
    },
    getRandomColor() {
      return '#' + Math.floor(Math.random() * 16777215).toString(16)
    }
  }
}
</script>

数据持久化

通常需要将值班数据保存到后端:

vue实现日历人员值班

methods: {
  async saveDutySchedule() {
    try {
      const response = await axios.post('/api/duty-schedule', {
        events: this.calendarOptions.events
      })
      console.log('保存成功', response.data)
    } catch (error) {
      console.error('保存失败', error)
    }
  }
}

高级功能实现

实现人员分组和批量分配:

data() {
  return {
    staffGroups: [
      { id: 1, name: '早班', members: ['张三', '李四'] },
      { id: 2, name: '晚班', members: ['王五', '赵六'] }
    ],
    selectedGroup: null
  }
},
methods: {
  assignGroupToDate(date) {
    if (!this.selectedGroup) return

    this.selectedGroup.members.forEach(member => {
      this.calendarOptions.events.push({
        title: member + '值班',
        start: date,
        color: this.getGroupColor(this.selectedGroup.id)
      })
    })
  },
  getGroupColor(groupId) {
    const colors = ['#ff9f89', '#f6c3d0', '#a4e4f9']
    return colors[groupId % colors.length]
  }
}

响应式设计优化

添加响应式处理适应不同屏幕:

computed: {
  calendarOptions() {
    return {
      ...this.baseCalendarOptions,
      headerToolbar: {
        left: window.innerWidth > 768 ? 'prev,next today' : 'prev,next',
        center: 'title',
        right: window.innerWidth > 768 ? 'dayGridMonth,timeGridWeek' : 'dayGridMonth'
      }
    }
  }
}

注意事项

  1. 生产环境需要添加数据验证和错误处理
  2. 复杂场景可考虑使用Vuex管理状态
  3. 移动端可能需要单独优化交互方式
  4. 国际化和时区处理需要特别注意

这种实现方式提供了基本的交互功能,实际项目中可根据需求扩展更多功能如:值班历史查看、人员替换、值班统计等。

标签: 日历人员
分享给朋友:

相关文章

uniapp日历视图

uniapp日历视图

uniapp日历视图实现方法 在uniapp中实现日历视图可以通过多种方式完成,包括使用第三方组件库或自行开发。以下是几种常见方法: 使用uni-calendar组件 uni-calendar是u…

vue实现mac日历

vue实现mac日历

Vue 实现 Mac 日历功能 要在 Vue 中实现类似 Mac 日历的功能,可以结合第三方库或自定义组件开发。以下是两种常见方法: 使用 FullCalendar 库 FullCalendar 是…

vue实现日历方案

vue实现日历方案

vue实现日历方案 使用第三方库(推荐方案) 推荐使用成熟的日历组件库,如v-calendar或fullcalendar-vue,它们提供丰富的功能和定制选项。 安装v-calendar:…

vue日历拖拽实现

vue日历拖拽实现

Vue 日历拖拽实现方案 使用 vue-draggable 库 安装依赖库: npm install vuedraggable 基础拖拽日历实现代码: <template> <…

vue实现多选日历

vue实现多选日历

Vue 实现多选日历 使用 Vue 实现多选日历功能可以借助现有的日历库或手动构建。以下是两种常见方法: 使用第三方库(如 V-Calendar) 安装 V-Calendar 库: npm ins…

vue实现人员滚动抽奖

vue实现人员滚动抽奖

实现人员滚动抽奖的Vue方案 核心思路 通过Vue的数据绑定和动画特性,结合JavaScript定时器实现随机滚动效果,最终停在获奖人员位置。 基础实现代码 <template> &…