You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:FullCalendar选择日期后无法向API端点推送事件的问题

求助:FullCalendar选择日期后无法向API端点推送事件的问题

我一眼就看到了代码里的核心问题——你在fetch里用了eventData变量,但这个变量根本没定义!浏览器执行到这里会直接报错,导致整个请求逻辑都跑不起来,这就是你看不到请求的原因。另外你想要的用户确认弹窗逻辑也没加,我帮你一步步修正:

第一步:修复未定义的eventData,提取选中的日期

FullCalendar的select回调里的info对象包含了你选中的开始和结束日期,你需要把这些数据整理成API需要的格式。比如:

// 从info里提取日期,转成ISO格式(或者你API要求的其他格式)
const eventData = {
  start: info.start.toISOString(),
  end: info.end ? info.end.toISOString() : info.start.toISOString(), // 处理单日选择的情况
  title: '用户预订' // 可根据需求自定义标题
};

第二步:添加确认弹窗逻辑

你想要用户确认日期后再发请求,最简单的可以用浏览器原生的confirm弹窗,也可以用Bootstrap的模态框(你已经引入了Bootstrap,样式会更统一)。这里先给你用原生的示例,足够简单直接:

修正后的完整select回调代码

把你原来的select函数替换成下面这段:

select: function(info) {
  // 先弹出确认框,用本地化日期格式更友好
  const startDate = info.start.toLocaleDateString();
  const endDate = info.end ? info.end.toLocaleDateString() : startDate;
  const isConfirmed = confirm(`你确定要预订从 ${startDate} 到 ${endDate} 的时段吗?`);
  
  if (!isConfirmed) {
    // 用户取消,清除日历选中状态后返回
    calendar.unselect();
    return;
  }

  // 构造要发送给API的数据
  const eventData = {
    start: info.start.toISOString(),
    end: info.end ? info.end.toISOString() : info.start.toISOString(),
    title: '用户预订'
  };

  // 发送POST请求
  fetch('/api/addbooking', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(eventData)
  })
  .then(response => {
    if (!response.ok) {
      throw new Error('请求失败: ' + response.statusText);
    }
    return response.json();
  })
  .then(data => {
    console.log('预订成功:', data);
    calendar.refetchEvents(); // 刷新日历事件
    calendar.unselect(); // 清除选中状态
    alert('预订已成功提交');
  })
  .catch(error => {
    console.error('预订出错:', error);
    alert('预订失败,请稍后重试');
  });
}

额外调试建议

  • 打开浏览器开发者工具(按F12),切换到Console标签页,查看是否有报错信息——这是前端调试最基础的步骤,你之前没看到请求,大概率是JS报错中断了执行,这里肯定能找到线索。
  • 先用Postman或curl测试你的/api/addbooking端点,确保后端能正常接收POST请求并返回正确响应,排除后端问题。
  • 如果前端和Go后端是跨域部署(比如前端在localhost:8080,后端在localhost:9000),需要在Go后端配置CORS允许跨域请求,否则浏览器会拦截请求。

这样修改后,应该就能正常触发确认弹窗,并且在用户确认后发送请求到你的API了。

备注:内容来源于stack exchange,提问作者Geoff Sweet

火山引擎 最新活动