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 }