fix: 修复活动报名雪花ID精度丢失问题

- 将EventRegistrationParams的eventId类型从number改为string
- 避免JavaScript Number类型精度限制导致的数据丢失
- JavaScript Number只能安全表示到2^53-1,而雪花ID是19位
- 在EventDetail页面直接传递字符串ID,不使用Number()转换
- 在eventApi中调整参数类型和接口调用方式
- 添加详细的调试日志便于问题排查
- 优化错误处理和用户提示信息
This commit is contained in:
Leo 2025-10-15 21:04:20 +08:00
parent 645367d890
commit 0694b87706
3 changed files with 43 additions and 17 deletions

View File

@ -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 || '取消报名失败')
}
},

View File

@ -41,10 +41,10 @@ export const registerEvent = (params: EventRegistrationParams): Promise<string>
/**
*
* @param eventId ID
* @param eventId ID使string避免精度丢失
* @returns
*/
export const cancelEventRegistration = (eventId: number): Promise<string> => {
export const cancelEventRegistration = (eventId: string): Promise<string> => {
return request.post(`/api/event/cancel/${eventId}`)
}

View File

@ -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
}