From 0694b87706a709b67ee03ad2bf95e1e6f87def24 Mon Sep 17 00:00:00 2001 From: Leo <98382335+gaoziman@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:04:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E6=8A=A5=E5=90=8D=E9=9B=AA=E8=8A=B1ID=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将EventRegistrationParams的eventId类型从number改为string - 避免JavaScript Number类型精度限制导致的数据丢失 - JavaScript Number只能安全表示到2^53-1,而雪花ID是19位 - 在EventDetail页面直接传递字符串ID,不使用Number()转换 - 在eventApi中调整参数类型和接口调用方式 - 添加详细的调试日志便于问题排查 - 优化错误处理和用户提示信息 --- src/pages/News/EventDetail.tsx | 52 +++++++++++++++++++++++++--------- src/services/eventApi.ts | 4 +-- src/types/index.ts | 4 ++- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/pages/News/EventDetail.tsx b/src/pages/News/EventDetail.tsx index b795b1a..0413d8b 100644 --- a/src/pages/News/EventDetail.tsx +++ b/src/pages/News/EventDetail.tsx @@ -89,30 +89,52 @@ const EventDetailPage: React.FC = () => { // 提交报名 const handleSubmitRegister = async () => { try { - const values = await form.validateFields() - setRegistering(true) - - const params: EventRegistrationParams = { - eventId: Number(id), - phone: values.phone, - remark: values.remark, + // 先检查URL参数id + if (!id) { + message.error('活动ID不存在,无法报名') + console.error('活动报名失败:URL参数id为空') + return } - await registerEvent(params) - message.success('报名成功!') + const values = await form.validateFields() + + // 调试日志 + console.log('=== 活动报名调试信息 ===') + console.log('URL参数 id:', id, '类型:', typeof id) + console.log('表单验证结果:', values) + + setRegistering(true) + + // 🔧 重要:eventId直接使用字符串类型,避免Number精度丢失 + // JavaScript的Number只能安全表示到2^53-1 (约16位数字) + // 而雪花算法生成的ID是19位,会导致精度丢失 + const params: EventRegistrationParams = { + eventId: id, // ← 直接传字符串,不使用Number()转换 + phone: String(values.phone || ''), + remark: values.remark ? String(values.remark) : '' + } + + // 调试日志:打印最终参数 + console.log('准备发送的参数:', params) + console.log('参数JSON字符串:', JSON.stringify(params)) + + const result = await registerEvent(params) + console.log('报名成功,返回结果:', result) + + message.success(result || '报名成功!') setShowRegisterModal(false) form.resetFields() // 刷新数据 - if (id) { - fetchData(id) - } + fetchData(id) } catch (error: any) { if (error.errorFields) { // 表单验证错误 + console.warn('表单验证失败:', error.errorFields) return } - message.error(error.message || '报名失败') + console.error('报名请求失败:', error) + message.error(error.message || '报名失败,请稍后重试') } finally { setRegistering(false) } @@ -127,12 +149,14 @@ const EventDetailPage: React.FC = () => { content: '确定要取消报名吗?', onOk: async () => { try { - await cancelEventRegistration(Number(id)) + // 🔧 修复:直接传字符串,不使用Number()转换,避免精度丢失 + await cancelEventRegistration(id) message.success('已取消报名') // 刷新数据 fetchData(id) } catch (error: any) { + console.error('取消报名失败:', error) message.error(error.message || '取消报名失败') } }, diff --git a/src/services/eventApi.ts b/src/services/eventApi.ts index 6781af8..1e98ebc 100644 --- a/src/services/eventApi.ts +++ b/src/services/eventApi.ts @@ -41,10 +41,10 @@ export const registerEvent = (params: EventRegistrationParams): Promise /** * 取消报名 - * @param eventId 活动ID + * @param eventId 活动ID(使用string避免精度丢失) * @returns 操作消息 */ -export const cancelEventRegistration = (eventId: number): Promise => { +export const cancelEventRegistration = (eventId: string): Promise => { return request.post(`/api/event/cancel/${eventId}`) } diff --git a/src/types/index.ts b/src/types/index.ts index 04d1b39..83fc836 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -715,9 +715,11 @@ export interface EventDetail { /** * 活动报名请求参数 + * 注意:eventId使用string类型避免JavaScript的Number精度丢失问题 + * JavaScript的Number类型只能安全表示到2^53-1,超出此范围会丢失精度 */ export interface EventRegistrationParams { - eventId: number + eventId: string phone: string remark?: string }