TimeSlotController 类级的 @UseGuards(JwtAuthGuard) 与服务层 getAvailableSlots / getSlotById 的可选 userId 契约不一致,导致游客访问预约课程列表会被 401 拒绝。去掉类级守卫、把两个 GET 端点的 userId 改为可选,未登录时返回 isBookedByMe=false 的公开时段列表,登录时保留个人预约标记。 /api/booking/my 等需要 userId 才能查的接口不受影响。
TimeSlotController 类级的 @UseGuards(JwtAuthGuard) 与服务层 getAvailableSlots / getSlotById 的可选 userId 契约不一致,导致游客访问预约课程列表会被 401 拒绝。去掉类级守卫、把两个 GET 端点的 userId 改为可选,未登录时返回 isBookedByMe=false 的公开时段列表,登录时保留个人预约标记。 /api/booking/my 等需要 userId 才能查的接口不受影响。