fix: 修复活动报名雪花ID精度丢失问题
- 将EventRegistrationParams的eventId类型从number改为string - 避免JavaScript Number类型精度限制导致的数据丢失 - JavaScript Number只能安全表示到2^53-1,而雪花ID是19位 - 在EventDetail页面直接传递字符串ID,不使用Number()转换 - 在eventApi中调整参数类型和接口调用方式 - 添加详细的调试日志便于问题排查 - 优化错误处理和用户提示信息
This commit is contained in:
parent
645367d890
commit
0694b87706
@ -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 || '取消报名失败')
|
||||
}
|
||||
},
|
||||
|
||||
@ -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}`)
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user