Laravel7 FullCalendar3.10.2事件不显示 修正代码实现考勤节假日展示
原有代码问题点
- 类引用错误:控制器参数
request $request未正确引用Request类,会导致请求参数获取失败 - 查询条件字段错误:查询工作日配置时误用
status字段筛选,实际表中对应字段为working_status,导致周末数据查询为空 - 事件优先级缺失:同一日期同时命中多类规则时会重复渲染事件,未按「法定节假日>周末休息>考勤状态」的规则做过滤
- 考勤逻辑错误:所有考勤记录统一返回「Leave」标题,未根据
leave_cat_id、status字段区分休假、出勤、缺勤三种状态 - 时间范围不匹配:固定循环42天生成周末数据,未对接FullCalendar传入的视图起止时间,易出现数据缺失或冗余
- 前端配置冗余:重复声明
editable属性,eventRender中allDay判断逻辑无效,3.x版本可直接在事件数据中声明allDay属性
修正后代码
控制器代码
首先确保头部引入相关类:
use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB;
业务逻辑代码:
/** * 生成指定时间范围内的周末休息事件 * @param array $weekendDays 配置为休息的星期缩写 * @param string $start 日历视图开始时间 * @param string $end 日历视图结束时间 * @param array $holidayDates 法定节假日日期列表 * @return array */ private function getWeekendEvents($weekendDays, $start, $end, $holidayDates) { $events = []; $current = Carbon::parse($start)->startOfDay(); $endDate = Carbon::parse($end)->startOfDay(); while ($current->lte($endDate)) { $dateStr = $current->format('Y-m-d'); $weekDay = $current->format('D'); // 命中休息星期 且 当天不是法定节假日才生成周末事件 if (in_array($weekDay, $weekendDays) && !in_array($dateStr, $holidayDates)) { $events[] = [ 'title' => '周末休息', 'start' => $dateStr, 'end' => $dateStr, 'color' => '#9e9e9e', 'allDay' => true ]; } $current->addDay(); } return $events; } public function index(Request $request) { if ($request->ajax()) { // 1. 查询配置的休息日星期 $weekendDays = DB::table('working_days') ->where('working_status', 0) ->pluck('day') ->toArray(); // 2. 查询法定节假日,同时生成日期数组用于优先级判断 $holidayList = DB::table('holidays')->get(); $holidayDates = []; $holidayEvents = []; foreach ($holidayList as $holiday) { $dateStr = Carbon::parse($holiday->date)->format('Y-m-d'); $holidayDates[] = $dateStr; $holidayEvents[] = [ 'title' => '法定节假日', 'start' => $dateStr, 'end' => $dateStr, 'color' => '#2196f3', 'allDay' => true ]; } // 3. 生成周末事件,同时提取周末日期数组 $weekendEvents = $this->getWeekendEvents($weekendDays, $request->start, $request->end, $holidayDates); $weekendDates = array_column($weekendEvents, 'start'); // 4. 查询当前视图范围内的考勤记录,过滤掉节假日、周末的考勤数据 $attendanceEvents = DB::table('attendances') ->where('user_id', Auth::id()) ->whereBetween('date', [ Carbon::parse($request->start)->format('Y-m-d'), Carbon::parse($request->end)->format('Y-m-d') ]) ->get() ->map(function ($item) use ($holidayDates, $weekendDates) { $dateStr = Carbon::parse($item->date)->format('Y-m-d'); // 节假日、周末不展示考勤事件 if (in_array($dateStr, $holidayDates) || in_array($dateStr, $weekendDates)) { return null; } // 按规则匹配考勤状态 if (!is_null($item->leave_cat_id)) { return [ 'title' => '休假', 'start' => $dateStr, 'end' => $dateStr, 'color' => '#f44336', 'allDay' => true ]; } if ($item->status == 1) { return [ 'title' => '出勤', 'start' => $dateStr, 'end' => $dateStr, 'color' => '#4caf50', 'allDay' => true ]; } return [ 'title' => '缺勤', 'start' => $dateStr, 'end' => $dateStr, 'color' => '#ff9800', 'allDay' => true ]; }) ->filter() ->values() ->toArray(); // 合并所有事件返回 return response()->json(array_merge($holidayEvents, $weekendEvents, $attendanceEvents)); } return view('admin.dashboard'); }
Blade模板脚本代码
<script> $(document).ready(function () { $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); $('#full-calendar').fullCalendar({ editable: false, events: { url: '/dashboard', type: 'GET', error: function () { console.log('日历事件加载异常'); } } }); }); </script>
效果说明
- 事件优先级符合要求:法定节假日、周末休息的日期不会重复展示考勤事件
- 不同类型事件用颜色区分:节假日蓝色、周末灰色、休假红色、出勤绿色、缺勤橙色,辨识度高
- 所有数据按日历视图范围查询,无冗余数据,加载效率更高
- 直接在事件数据中声明
allDay: true,兼容FullCalendar 3.10.2版本解析规则,无需额外渲染处理
内容的提问来源于stack exchange,提问作者Shan Md Shazarul Haque 171-15-
相关产品推荐
相关产品推荐

