想问一下思路。用日历记录考勤。举例,有效日期是2023-05-02到2023-05-31。上三天休两天的话,怎么在上班时候显示上班,休息日显示休假?
可以按照以下步骤实现:
el-calendar
组件来展示日历,并设置其有效日期范围为2023-05-02到2023-05-31。以下是一个简单的代码示例:
<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>