m0_56789428 2023-05-08 15:02 采纳率: 97.4%
浏览 31
已结题

日历考勤表,思路的提问

想问一下思路。用日历记录考勤。举例,有效日期是2023-05-02到2023-05-31。上三天休两天的话,怎么在上班时候显示上班,休息日显示休假?

img

  • 写回答

1条回答 默认 最新

  • 星辰引路-Lefan 2023-05-08 16:01
    关注

    可以按照以下步骤实现:

    1. 使用 el-calendar 组件来展示日历,并设置其有效日期范围为2023-05-02到2023-05-31。
    2. 根据休息日规则(例如,上三天休两天),计算出每一天是工作日还是休息日。
    3. 根据已记录的考勤信息(例如,请假、加班等情况),计算出每一天的考勤状态。
    4. 在日历上,使用不同的颜色或样式来区分工作日和休息日,同时根据考勤状态来显示相应的提示信息。

    以下是一个简单的代码示例:

    <template>
      <div class="calendar-container">
        <el-calendar v-model="selectedDate" :range="[startDate, endDate]" 
          :cell-style="getCellStyle" :popper-class="getPopperClass"/>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          startDate: '2023-05-02',
          endDate: '2023-05-31',
          selectedDate: null,
          restDays: [2, 3, 4], // 周二、周三、周四是休息日
          workDays: [0, 1, 5, 6], // 周日、周一、周五、周六是工作日
          attendanceData: [
            { date: '2023-05-04', status: 'vacation' }, // 请假
            { date: '2023-05-06', status: 'extra_work' } // 加班
            // 其他考勤记录
          ]
        }
      },
      methods: {
        getCellStyle({ row, column, value }) {
          const date = this.formatDate(value)
          const isRestDay = this.isRestDay(date)
          const attendanceStatus = this.getAttendanceStatus(date)
          return {
            color: isRestDay ? '#999' : '',
            backgroundColor: attendanceStatus === 'vacation' ? '#FADBD8' 
                              : attendanceStatus === 'extra_work' ? '#D6EAF8'
                              : ''
          }
        },
        getPopperClass({ row, column, value }) {
          const date = this.formatDate(value)
          const isRestDay = this.isRestDay(date)
          const attendanceStatus = this.getAttendanceStatus(date)
          return isRestDay ? 'rest-day-popper' 
                 : attendanceStatus === 'vacation' ? 'vacation-popper'
                 : attendanceStatus === 'extra_work' ? 'extra-work-popper'
                 : ''
        },
        formatDate(date) {
          return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`
        },
        isRestDay(date) {
          const dayOfWeek = new Date(date).getDay()
          return this.restDays.includes(dayOfWeek)
        },
        getAttendanceStatus(date) {
          const attendanceRecord = this.attendanceData.find(record => record.date === date)
          return attendanceRecord ? attendanceRecord.status : ''
        }
      }
    }
    </script>
    
    <style scoped>
    /* 样式规则 */
    .rest-day-popper {
      background-color: #999;
    }
    .vacation-popper {
      background-color: #FADBD8;
    }
    .extra-work-popper {
      background-color: #D6EAF8;
    }
    </style>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 已采纳回答 5月9日
  • 创建了问题 5月8日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗