diff --git a/activity.log b/activity.log index 1c05908..b24d20f 100644 --- a/activity.log +++ b/activity.log @@ -256,3 +256,227 @@ {"level":"INFO","time":"2024-12-03T19:22:22.425+0800","caller":"utils/init.go:149","msg":"init logger success"} {"level":"INFO","time":"2024-12-03T19:22:22.430+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} {"level":"INFO","time":"2024-12-03T19:22:22.820+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:03:15.256+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:03:15.260+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:03:15.728+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:04:38.857+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:04:38.861+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:04:39.277+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:10:13.025+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:10:13.029+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:10:13.512+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:13:58.142+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:13:58.147+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:13:59.588+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:23:24.164+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:23:24.168+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:23:24.589+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:30:44.584+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:30:44.589+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:30:45.012+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:35:14.948+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:35:14.952+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:35:16.028+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-04T15:37:30.813+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.936+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.951+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.961+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.961+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.964+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.971+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.976+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:37:30.976+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.405+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.407+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.409+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.410+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.410+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.410+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.415+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:30.617+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"ERROR","time":"2024-12-04T15:39:31.153+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"unsupported data"} +{"level":"INFO","time":"2024-12-04T15:47:03.090+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:47:03.094+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:47:03.560+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-04T15:49:14.597+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.701+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.703+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.711+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.717+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.717+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.731+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:49:14.749+0800","caller":"handle/scheduledtasks.go:57","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"INFO","time":"2024-12-04T15:52:03.049+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:52:03.054+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:52:03.548+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:52:05.527+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:52:05.533+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:52:07.153+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-04T15:52:11.906+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.010+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.028+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.034+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.036+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.043+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.053+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"ERROR","time":"2024-12-04T15:52:12.073+0800","caller":"handle/scheduledtasks.go:56","msg":"价格上涨时入库失败","error":"empty slice found"} +{"level":"INFO","time":"2024-12-04T15:53:18.321+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:53:18.325+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:53:18.783+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:54:38.040+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:54:38.044+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:54:38.472+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:55:59.077+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:55:59.081+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:55:59.764+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:56:50.386+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:56:50.390+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:56:50.811+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T15:59:49.883+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T15:59:49.887+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T15:59:50.626+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:00:49.795+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:00:49.799+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:00:50.260+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:01:20.155+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:01:20.159+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:01:20.582+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:02:58.272+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:02:58.277+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:02:58.714+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:04:16.174+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:04:16.178+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:04:17.608+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:05:21.872+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:05:21.876+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:05:24.617+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:06:09.708+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:06:09.712+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:06:10.133+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:07:33.077+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:07:33.081+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:07:34.714+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T16:09:04.699+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T16:09:04.704+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T16:09:05.154+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T17:42:35.765+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T17:42:35.769+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T17:42:36.184+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T17:44:50.652+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T17:44:50.657+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T17:44:51.076+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T17:57:21.259+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T17:57:21.265+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T17:57:21.745+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-04T17:57:56.557+0800","caller":"controller/user.go:133","msg":"修改用户信息失败","error":"WHERE conditions required"} +{"level":"INFO","time":"2024-12-04T17:58:47.477+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T17:58:47.483+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T17:58:47.912+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T17:59:07.821+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T17:59:07.827+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T17:59:09.364+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-04T18:01:08.173+0800","caller":"controller/user.go:140","msg":"修改用户棋盘信息失败","error":"unsupported data type: map[avatar_id:2]: Table not set, please set it like: db.Model(&user) or db.Table(\"users\")"} +{"level":"INFO","time":"2024-12-04T18:01:11.032+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T18:01:11.037+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T18:01:11.461+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-04T18:05:47.371+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-04T18:05:47.376+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-04T18:05:47.794+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-05T13:58:52.067+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T13:58:52.073+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T13:58:52.504+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-05T16:15:11.596+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T16:15:11.601+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T16:15:12.058+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-05T16:17:34.534+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T16:17:34.538+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T16:17:34.959+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-05T16:20:12.624+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T16:20:12.628+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T16:20:13.048+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-05T16:20:58.341+0800","caller":"controller/checkerboard.go:55","msg":"获取格子信息失败","error":"Error 1054 (42S22): Unknown column 'gaid_id' in 'where clause'"} +{"level":"INFO","time":"2024-12-05T16:22:29.981+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T16:22:29.985+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T16:22:30.404+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-05T16:22:39.167+0800","caller":"controller/checkerboard.go:60","msg":"用户提交的数据不足以买下"} +{"level":"ERROR","time":"2024-12-05T16:23:26.576+0800","caller":"controller/checkerboard.go:60","msg":"用户提交的数据不足以买下"} +{"level":"INFO","time":"2024-12-05T16:23:31.131+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T16:23:31.136+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T16:23:31.809+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-05T16:23:45.872+0800","caller":"controller/checkerboard.go:60","msg":"用户提交的数据不足以买下"} +{"level":"INFO","time":"2024-12-05T17:23:37.641+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=1)次上涨"} +{"level":"INFO","time":"2024-12-05T18:23:37.591+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=2)次上涨"} +{"level":"ERROR","time":"2024-12-05T19:01:22.703+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:03:46.146+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:04:11.777+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:04:13.409+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:04:14.178+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:04:19.918+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-05T19:04:23.526+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"INFO","time":"2024-12-05T19:23:37.487+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=3)次上涨"} +{"level":"INFO","time":"2024-12-05T20:23:37.358+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=4)次上涨"} +{"level":"INFO","time":"2024-12-05T20:47:41.402+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-05T20:47:41.408+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-05T20:47:42.966+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T13:52:48.467+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T13:52:48.473+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T13:52:48.878+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T14:26:09.583+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T14:26:09.587+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T14:26:10.031+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T14:31:03.467+0800","caller":"controller/checkerboard.go:29","msg":"参数绑定失败","error":"Key: 'Record.Name' Error:Field validation for 'Name' failed on the 'required' tag"} +{"level":"INFO","time":"2024-12-06T14:31:19.812+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T14:31:19.817+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T14:31:20.279+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T14:31:28.770+0800","caller":"controller/checkerboard.go:29","msg":"参数绑定失败","error":"Key: 'Record.Name' Error:Field validation for 'Name' failed on the 'required' tag"} +{"level":"ERROR","time":"2024-12-06T14:31:32.559+0800","caller":"controller/checkerboard.go:29","msg":"参数绑定失败","error":"Key: 'Record.Name' Error:Field validation for 'Name' failed on the 'required' tag"} +{"level":"INFO","time":"2024-12-06T14:33:38.901+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T14:33:38.905+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T14:33:39.380+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T14:33:55.101+0800","caller":"controller/checkerboard.go:60","msg":"用户提交的数据不足以买下"} +{"level":"INFO","time":"2024-12-06T14:43:04.640+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T14:43:04.644+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T14:43:06.048+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T15:04:52.160+0800","caller":"controller/user.go:125","msg":"修改用户信息失败","error":"Key: 'User.WalletAdr' Error:Field validation for 'WalletAdr' failed on the 'required' tag\nKey: 'User.WalletPlatform' Error:Field validation for 'WalletPlatform' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"INFO","time":"2024-12-06T15:13:54.161+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T15:13:54.165+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T15:13:54.592+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T15:28:06.467+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T15:28:06.473+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T15:28:06.955+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T15:50:09.113+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T15:50:09.118+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T15:50:09.522+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T16:49:57.349+0800","caller":"controller/user.go:19","msg":"login invalid param error:","error":"Key: 'User.UserName' Error:Field validation for 'UserName' failed on the 'required' tag\nKey: 'User.AvatarId' Error:Field validation for 'AvatarId' failed on the 'required' tag"} +{"level":"INFO","time":"2024-12-06T16:50:16.990+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=1)次上涨"} +{"level":"INFO","time":"2024-12-06T16:52:02.572+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T16:52:02.578+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T16:52:03.033+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T17:52:10.071+0800","caller":"handle/scheduledtasks.go:49","msg":"定时入库成功第%!t(int=1)次上涨"} +{"level":"INFO","time":"2024-12-06T17:57:10.088+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T17:57:10.094+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T17:57:10.560+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T17:58:53.959+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T17:58:53.965+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T17:58:54.384+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T18:01:13.153+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:01:13.158+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:01:13.602+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T18:02:33.573+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:02:33.579+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:02:34.029+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T18:05:01.855+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:05:01.861+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:05:02.317+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T18:05:16.425+0800","caller":"controller/user.go:73","msg":"查询用户信息失败:","error":"record not found"} +{"level":"ERROR","time":"2024-12-06T18:05:16.526+0800","caller":"controller/user.go:73","msg":"查询用户信息失败:","error":"record not found"} +{"level":"INFO","time":"2024-12-06T18:05:51.401+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:05:51.406+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:05:51.851+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"INFO","time":"2024-12-06T18:10:12.571+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:10:12.577+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:10:13.010+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} +{"level":"ERROR","time":"2024-12-06T18:16:18.022+0800","caller":"controller/user.go:29","msg":"用户信息查询失败:","error":"record not found"} +{"level":"INFO","time":"2024-12-06T18:16:21.953+0800","caller":"utils/init.go:149","msg":"init logger success"} +{"level":"INFO","time":"2024-12-06T18:16:21.957+0800","caller":"utils/init.go:40","msg":"初始化logger成功"} +{"level":"INFO","time":"2024-12-06T18:16:22.416+0800","caller":"utils/init.go:45","msg":"初始化mysql成功"} diff --git a/api/route.go b/api/route.go index 8ccf0fb..6fea228 100644 --- a/api/route.go +++ b/api/route.go @@ -16,7 +16,7 @@ func ApiRoute(r *gin.Engine) { // 用户信息 user.GET("/userinfo", GetApiManager().GetUserInfo) // 修改用户信息 - user.PUT("/put/userinfo") + user.PUT("/put/userinfo", GetApiManager().PutUserInfo) // 充值信息 user.POST("/recharge", GetApiManager().Recharge) } diff --git a/checkerboard/dist.zip b/checkerboard/dist.zip deleted file mode 100644 index 69898d4..0000000 Binary files a/checkerboard/dist.zip and /dev/null differ diff --git a/checkerboard/package-lock.json b/checkerboard/package-lock.json index 5d8ccd7..0f82ab8 100644 --- a/checkerboard/package-lock.json +++ b/checkerboard/package-lock.json @@ -35,8 +35,10 @@ "antd": "^5.22.1", "axios": "^1.7.7", "ethers": "^5.7.2", + "i18next": "^23.11.5", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-i18next": "^15.1.3", "react-infinite-scroll-component": "^6.1.0", "react-router-dom": "^6.28.0", "react-window": "^1.8.10", @@ -17273,6 +17275,15 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", @@ -22324,6 +22335,28 @@ "react": "^18.3.1" } }, + "node_modules/react-i18next": { + "version": "15.1.3", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.1.3.tgz", + "integrity": "sha512-J11oA30FbM3NZegUZjn8ySK903z6PLBz/ZuBYyT1JMR0QPrW6PFXvl1WoUhortdGi9dM0m48/zJQlPskVZXgVw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-infinite-scroll-component": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", @@ -25765,6 +25798,15 @@ "license": "MIT", "peer": true }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wagmi": { "version": "2.13.0", "resolved": "https://registry.npmmirror.com/wagmi/-/wagmi-2.13.0.tgz", @@ -40329,6 +40371,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "requires": { + "void-elements": "3.1.0" + } + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", @@ -43996,6 +44046,15 @@ "scheduler": "^0.23.2" } }, + "react-i18next": { + "version": "15.1.3", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.1.3.tgz", + "integrity": "sha512-J11oA30FbM3NZegUZjn8ySK903z6PLBz/ZuBYyT1JMR0QPrW6PFXvl1WoUhortdGi9dM0m48/zJQlPskVZXgVw==", + "requires": { + "@babel/runtime": "^7.25.0", + "html-parse-stringify": "^3.0.1" + } + }, "react-infinite-scroll-component": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", @@ -46216,6 +46275,11 @@ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "peer": true }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==" + }, "wagmi": { "version": "2.13.0", "resolved": "https://registry.npmmirror.com/wagmi/-/wagmi-2.13.0.tgz", diff --git a/checkerboard/package.json b/checkerboard/package.json index 0448b53..284e30a 100644 --- a/checkerboard/package.json +++ b/checkerboard/package.json @@ -37,8 +37,10 @@ "antd": "^5.22.1", "axios": "^1.7.7", "ethers": "^5.7.2", + "i18next": "^23.11.5", "react": "^18.3.1", "react-dom": "^18.3.1", + "react-i18next": "^15.1.3", "react-infinite-scroll-component": "^6.1.0", "react-router-dom": "^6.28.0", "react-window": "^1.8.10", diff --git a/checkerboard/public/images/avatar/1.png b/checkerboard/public/images/avatar/1.png new file mode 100644 index 0000000..17a2d56 Binary files /dev/null and b/checkerboard/public/images/avatar/1.png differ diff --git a/checkerboard/public/images/avatar/2.png b/checkerboard/public/images/avatar/2.png new file mode 100644 index 0000000..6383791 Binary files /dev/null and b/checkerboard/public/images/avatar/2.png differ diff --git a/checkerboard/public/images/avatar/3.png b/checkerboard/public/images/avatar/3.png new file mode 100644 index 0000000..d7a3804 Binary files /dev/null and b/checkerboard/public/images/avatar/3.png differ diff --git a/checkerboard/public/images/avatar/4.png b/checkerboard/public/images/avatar/4.png new file mode 100644 index 0000000..6dfad7f Binary files /dev/null and b/checkerboard/public/images/avatar/4.png differ diff --git a/checkerboard/public/images/avatar/5.png b/checkerboard/public/images/avatar/5.png new file mode 100644 index 0000000..d3ae673 Binary files /dev/null and b/checkerboard/public/images/avatar/5.png differ diff --git a/checkerboard/public/images/avatar/6.png b/checkerboard/public/images/avatar/6.png new file mode 100644 index 0000000..59a2997 Binary files /dev/null and b/checkerboard/public/images/avatar/6.png differ diff --git a/checkerboard/public/images/avatar/7.png b/checkerboard/public/images/avatar/7.png new file mode 100644 index 0000000..646d465 Binary files /dev/null and b/checkerboard/public/images/avatar/7.png differ diff --git a/checkerboard/public/images/avatar/8.png b/checkerboard/public/images/avatar/8.png new file mode 100644 index 0000000..2311468 Binary files /dev/null and b/checkerboard/public/images/avatar/8.png differ diff --git a/checkerboard/src/App.jsx b/checkerboard/src/App.jsx index dd91a4e..75c0d69 100644 --- a/checkerboard/src/App.jsx +++ b/checkerboard/src/App.jsx @@ -1,11 +1,10 @@ - import { createContext, useContext, useState } from 'react'; import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; -import Expand from './pages/Expand'; +import Expand from './pages/home/Expand'; import ChessBoard from './components/chessboard/ChessBoard'; import RegisterForm from './pages/RegisterForm'; -import LoginForm from './pages/login/LoginForm' -import ConnectWallet from './components/web3wallet/Wallet'; +import LoginForm from './pages/login/LoginForm'; +import Rule from './components/Rule'; // 创建 AuthContext 用于管理用户登录状态 @@ -16,18 +15,15 @@ function App() { const [isLoggedIn, setIsLoggedIn] = useState(false); return ( - <> - {/*
- -
*/} - + <> }> - } /> + } /> } /> } /> + }> { const token = localStorage.getItem('atoken'); @@ -23,6 +24,7 @@ instance.interceptors.request.use( } ); +// 响应拦截器 instance.interceptors.response.use( (response) => { if (response.data.code == 200 ) { diff --git a/checkerboard/src/apis/manage.js b/checkerboard/src/apis/manage.js index 966425d..f5f4907 100644 --- a/checkerboard/src/apis/manage.js +++ b/checkerboard/src/apis/manage.js @@ -1,7 +1,7 @@ import instance from './api'; // 登录 -export const loginUser = (loginData) => instance.post('user/login', loginData); +export const loginUser = (loginData) => instance.post('login', loginData); // 用户信息 export const UserMessage = () => instance.get('user/userinfo') // 棋盘信息 @@ -11,4 +11,6 @@ export const Board = (board_id) => instance.get(`checkboard/board?boardId=${boar // 押注记录 export const Record = (page,size) => instance.get(`checkboard/record?page=${page}&size=${size}`) // 获取所有记录的前50条 -export const Records = () => instance.get('checkboard/records') \ No newline at end of file +export const Records = () => instance.get('checkboard/records') +// 修改用户信息 +export const UpdateUserInfo = (param) => instance.put('user/put/userinfo',param) diff --git a/checkerboard/src/components/Rule.jsx b/checkerboard/src/components/Rule.jsx index e6799a1..0705d75 100644 --- a/checkerboard/src/components/Rule.jsx +++ b/checkerboard/src/components/Rule.jsx @@ -1,37 +1,16 @@ -import React, { useState } from 'react'; -import { Button, Modal } from 'antd'; const Rule = () => { - const [open, setOpen] = useState(false); - const showModal = () => { - setOpen(true); - }; - const hideModal = () => { - setOpen(false); - }; return ( <> - - -

- git remote:查看当前连接的代码仓库,
- git clone:克隆一个git仓库
- git status:查看文件的状态
- git branch:创建一个分支,后面有分支名就创建,没有就查看本地分支,加上-r参数可以查看远程分支,-d参数可以删除分支
- git checkout 分支名:切换到该分支
- git merge 分支名:将任意分支合并到当前分支中
- git fetch:获取远程仓库新建分支
- git log 查看提交记录
-

-
+

+ git remote:查看当前连接的代码仓库,
+ git clone:克隆一个git仓库
+ git status:查看文件的状态
+ git branch:创建一个分支,后面有分支名就创建,没有就查看本地分支,加上-r参数可以查看远程分支,-d参数可以删除分支
+ git checkout 分支名:切换到该分支
+ git merge 分支名:将任意分支合并到当前分支中
+ git fetch:获取远程仓库新建分支
+ git log 查看提交记录
+

); }; diff --git a/checkerboard/src/components/TransactionRecord.jsx b/checkerboard/src/components/TransactionRecord.jsx index 3e44ae7..ca1db30 100644 --- a/checkerboard/src/components/TransactionRecord.jsx +++ b/checkerboard/src/components/TransactionRecord.jsx @@ -16,7 +16,7 @@ const TransactionRecord = () => { return ( <> 交易记录

} diff --git a/checkerboard/src/components/boardinfo/BoardInfo.jsx b/checkerboard/src/components/boardinfo/BoardInfo.jsx index e69de29..8b13789 100644 --- a/checkerboard/src/components/boardinfo/BoardInfo.jsx +++ b/checkerboard/src/components/boardinfo/BoardInfo.jsx @@ -0,0 +1 @@ + diff --git a/checkerboard/src/components/chessboard/ChessBoard.css b/checkerboard/src/components/chessboard/ChessBoard.css index 184d768..26f5d67 100644 --- a/checkerboard/src/components/chessboard/ChessBoard.css +++ b/checkerboard/src/components/chessboard/ChessBoard.css @@ -32,9 +32,10 @@ } .countdown-wrapper { - display: flex; - justify-content: space-between; - align-items: flex-end; + display: flex; + justify-content: space-between; + align-items: flex-start; + flex-direction: column; } .countdown-wrapper-son{ @@ -95,9 +96,9 @@ width: 39vw; height: 33vw; padding: 10px; - border: 2px solid #ddd; - border-radius: 8px; - background-color: #fafafa; + /* border: 2px solid #ddd; */ + /* border-radius: 8px; */ + /* background-color: #fafafa; */ } .grid-box { @@ -153,6 +154,22 @@ margin-top: 0; } +.popupStyle { + position: fixed; + transform: translate(-50%, -50%); + width: 250px; + height: 400px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); + border-radius: 6px; + background-color: white; + border: 1px solid black; + padding: 20px; + margin-left: 200px; + z-index: 1200; +} + +; + @media (max-width: 50vw) { .grid-container { grid-template-columns: repeat(5, 1fr); diff --git a/checkerboard/src/components/chessboard/ChessBoard.jsx b/checkerboard/src/components/chessboard/ChessBoard.jsx index a30bef1..a315d8e 100644 --- a/checkerboard/src/components/chessboard/ChessBoard.jsx +++ b/checkerboard/src/components/chessboard/ChessBoard.jsx @@ -1,13 +1,21 @@ -import { useState, useRef, useMemo, useEffect } from 'react'; +import { useState, useRef, useMemo, useEffect} from 'react'; +import { useParams,useNavigate } from 'react-router-dom'; +import { AntDesignOutlined,CaretLeftFilled,CaretRightFilled } from '@ant-design/icons'; +import { Avatar,Button, Input, Space } from 'antd'; import './Chessboard.css'; -import { frontURL } from '../../config/config' import { BoardInfo } from '../../apis/manage' +import UserInfo from '../userinfo/UserInfo'; const ChessBoard = () => { + const [selectedBoxes, setSelectedBoxes] = useState([]); + const isDragging = useRef(false); // 是否处于拖动状态 const [blockId, setBlockId] = useState(null); const [boxes, setBoxes] = useState(null); const [ws, setWs] = useState(null); - const [selectedBox, setSelectedBox] = useState(null); // 用来保存选中的格子信息 + const [showPopup, setShowPopup] = useState(false); // 控制弹窗显示与否 + const [message, setMessage] = useState(null); // 存储弹窗信息 + const { id } = useParams(); + const navigate = useNavigate(); const getInfo = async (blockId) => { const response = await BoardInfo(blockId) @@ -17,9 +25,8 @@ const ChessBoard = () => { useEffect(() => { const getBoardInfo = async () => { try { - const hash = window.location.hash.substring(1); - const parsedData = JSON.parse(decodeURIComponent(hash)); - setBlockId(parsedData); + const idInt = parseInt(id) + setBlockId(idInt); } catch (error) { console.error('Failed to parse URL hash data:', error); } @@ -29,16 +36,13 @@ const ChessBoard = () => { } } getBoardInfo() - if (blockId) { // 创建 WebSocket 连接 const socket = new WebSocket(`ws://localhost:9990/api/ws/handle?blockId=${blockId}`); setWs(socket); - socket.onopen = () => { console.log('WebSocket Connected'); }; - socket.onmessage = (event) => { // 当数据发生变化时,就去请求接口,更新页面数据 const data = JSON.parse(event.data); @@ -54,7 +58,6 @@ const ChessBoard = () => { socket.onclose = () => { console.log('WebSocket Closed'); }; - // 在组件卸载时关闭 WebSocket 连接 return () => { if (socket.readyState === WebSocket.OPEN) { @@ -65,13 +68,6 @@ const ChessBoard = () => { } }, [blockId]); - const goBack = () => { - window.location.href = frontURL - }; - - const [selectedBoxes, setSelectedBoxes] = useState([]); - const isDragging = useRef(false); // 是否处于拖动状态 - // 计算选中盒子的总金额 const totalAmount = useMemo(() => { return selectedBoxes.reduce((sum, boxId) => { @@ -125,18 +121,40 @@ const ChessBoard = () => { // 选择一个格子并显示其信息 const handleBoxClick = (box) => { - setSelectedBox(box); // 设置当前点击的格子信息 + setMessage(box); + setShowPopup(true); + if (showPopup) { + setSelectedBoxes([]); + toggleBoxSelection(box.ID); + } }; + // 关闭弹窗 + const closePopup = () => { + setSelectedBoxes([]); + setShowPopup(false); + }; + + // 向左 + const leftHandle = (blockId) => { + navigate(`/board/${blockId}`); + } + // 向右 + const rightHandle = (blockId) => { + navigate(`/board/${blockId}`); + } + return (
+
+

总金额: ${totalAmount}

当前位置: {blockId}

- +
{boxes && boxes.length > 0 ? ( @@ -146,7 +164,7 @@ const ChessBoard = () => { className={`grid-box ${selectedBoxes.includes(box.ID) ? 'selected' : ''}`} onMouseDown={(event) => handleMouseDown(box.ID, event)} onMouseEnter={(event) => handleMouseEnter(box.ID, event)} - onClick={() => handleBoxClick(box)} // 点击格子 + onClick={() => handleBoxClick(box)} >
{box.price}
@@ -157,15 +175,44 @@ const ChessBoard = () => {
- {/* 显示选中格子的信息 */} - {selectedBox && ( -
-

格子详细信息

-

价格: ${selectedBox.price}

-

ID: {selectedBox.ID}

- {/* 添加其他详细信息 */} -
- )} +
+ {showPopup && ( +
+
+ {/* 头像 */} + } + src="/images/avatar/1.png" + /> + {/* owner为空的话就展示未被占领 */} + {message.owner != "" ? ( +

{ message.owner}

+ ): ( +

未被占领

+ )} + {/* 哪个价格高展示哪个 */} + {message.price > message.price_increase ? ( +
+ + + + +

{ message.price}

+
+ ): ( +

{ message.price_increase}

+ )} + + +
+
+ )} +
diff --git a/checkerboard/src/components/header/Header.jsx b/checkerboard/src/components/header/Header.jsx new file mode 100644 index 0000000..d06109f --- /dev/null +++ b/checkerboard/src/components/header/Header.jsx @@ -0,0 +1,21 @@ +import Translation from '../translation/Translation'; +import './header.css' + + +const Header = () => { + return ( +
+
+ test +
+
+
Get Token!
+
+ +
+
+
+ ); +}; + +export default Header \ No newline at end of file diff --git a/checkerboard/src/components/header/header.css b/checkerboard/src/components/header/header.css new file mode 100644 index 0000000..894154b --- /dev/null +++ b/checkerboard/src/components/header/header.css @@ -0,0 +1,29 @@ +.header-box { + display: flex; + justify-content: space-around; + padding: 10px; + flex-direction: row; + align-items: center; + width: 100%; +} + +.left-box, +.right-box { + width: 50%; + /* 设置子盒子的宽度 */ + background-color: lightblue; + /* 背景色,用于区分盒子 */ + padding: 20px; + /* 内边距 */ + text-align: center; +} + +.left-box { + background-color: lightcoral; + /* 左侧盒子的背景色 */ +} + +.right-box { + background-color: lightgreen; + /* 右侧盒子的背景色 */ +} \ No newline at end of file diff --git a/checkerboard/src/components/table/RecordTable.jsx b/checkerboard/src/components/table/RecordTable.jsx index 6ef7b8c..c025ac9 100644 --- a/checkerboard/src/components/table/RecordTable.jsx +++ b/checkerboard/src/components/table/RecordTable.jsx @@ -1,20 +1,22 @@ import { useEffect, useState } from 'react'; -import { Divider, List, Skeleton } from 'antd'; +import { List, Skeleton } from 'antd'; import { Records } from '../../apis/manage'; import InfiniteScroll from 'react-infinite-scroll-component'; const RecordTable = () => { const [loading, setLoading] = useState(false); const [data, setData] = useState([]); + const loadMoreData = async () => { if (loading) { return; } setLoading(true); - const response = await Records() + const response = await Records(); setData(response.data); setLoading(false); }; + useEffect(() => { loadMoreData(); const intervalId = setInterval(() => { @@ -25,42 +27,95 @@ const RecordTable = () => { clearInterval(intervalId); }; }, []); - + return (
- - } - endMessage={仅展示最近50条记录} - scrollableTarget="scrollableDiv" +
- ( - -
{ item.owner}Occupied {item.old_owner} Altar with {item.transaction_amount} USDT!
-
- )} - /> - +
+ + } + scrollableTarget="scrollableDiv" + > + ( + +
{item.owner} Occupied {item.old_owner} Altar with {item.transaction_amount} USDT!
+
+ )} + /> +
+
+ + {/* 内容区域 2 */} +
+ + } + scrollableTarget="scrollableDiv" + > + ( + +
{item.owner} Occupied {item.old_owner} Altar with {item.transaction_amount} USDT!
+
+ )} + /> +
+
+
+ +
); }; -export default RecordTable; \ No newline at end of file + +export default RecordTable; diff --git a/checkerboard/src/components/table/UserRecordTable.jsx b/checkerboard/src/components/table/UserRecordTable.jsx index 685c57f..58e9a7b 100644 --- a/checkerboard/src/components/table/UserRecordTable.jsx +++ b/checkerboard/src/components/table/UserRecordTable.jsx @@ -31,7 +31,7 @@ const UserRecordTable = () => { const columns = [ { title: '用户', - dataIndex: 'owner', + dataIndex: 'name', }, { title: '原来值', diff --git a/checkerboard/src/components/translation/Translation.jsx b/checkerboard/src/components/translation/Translation.jsx new file mode 100644 index 0000000..a48a443 --- /dev/null +++ b/checkerboard/src/components/translation/Translation.jsx @@ -0,0 +1,26 @@ +import { useTranslation } from 'react-i18next'; +import './translation.css' + +function Translation() { + const {t,i18n } = useTranslation(); // 使用 i18next 实现语言切换 + + // 语言切换事件 + const handleLanguageChange = (event) => { + const selectedLang = event.target.value; + i18n.changeLanguage(selectedLang); // 切换语言 + }; + + return ( +
+ + +
+ ); +}; + + +export default Translation; + diff --git a/checkerboard/src/components/translation/translation.css b/checkerboard/src/components/translation/translation.css new file mode 100644 index 0000000..257f3fc --- /dev/null +++ b/checkerboard/src/components/translation/translation.css @@ -0,0 +1,41 @@ +.language-switcher-container { + display: flex; + align-items: center; + justify-content: center; + gap: 12px; + padding: 10px 20px; + background-color: #f4f4f4; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + width: 250px; + margin: 20px auto; +} + +.language-switcher-container label { + font-size: 16px; + color: #333; + font-weight: 500; +} + +.language-switcher-container select { + padding: 8px 16px; + font-size: 16px; + border-radius: 8px; + border: 1px solid #ccc; + outline: none; + transition: all 0.3s ease; + cursor: pointer; +} + +.language-switcher-container select:hover { + border-color: #007bff; +} + +.language-switcher-container select:focus { + border-color: #0056b3; + box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25); +} + +.language-switcher-container select option { + padding: 8px; +} \ No newline at end of file diff --git a/checkerboard/src/components/userinfo/UserInfo.css b/checkerboard/src/components/userinfo/UserInfo.css index 6e794f7..497dccd 100644 --- a/checkerboard/src/components/userinfo/UserInfo.css +++ b/checkerboard/src/components/userinfo/UserInfo.css @@ -8,12 +8,62 @@ } .info-row { + position: relative; + display: inline-block; display: flex; flex-wrap: wrap; - justify-content: space-between; + align-items: flex-end; } .info-row p { margin-right: 10px; } + +.image-grid-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: 20px; + max-width: 800px; + margin: 0 auto; +} + +.image-box { + display: flex; + justify-content: center; + align-items: center; + width: 100px; + height: 100px; + border-radius: 50%; + overflow: hidden; + background-color: #f4f4f4; +} + +.image-box img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.image-box.selected { + border: 2px solid blue; + /* 选中时的边框颜色 */ +} + +.icon-container { + position: absolute; + bottom: 0; + right: 0; + z-index: 1; +} + +.edit-icon { + font-size: 24px; + transition: all 0.3s ease; +} + +.edit-icon:hover { + font-size: 30px; + color: #1890ff; +} diff --git a/checkerboard/src/components/userinfo/UserInfo.jsx b/checkerboard/src/components/userinfo/UserInfo.jsx index c619d05..7bc8601 100644 --- a/checkerboard/src/components/userinfo/UserInfo.jsx +++ b/checkerboard/src/components/userinfo/UserInfo.jsx @@ -1,39 +1,126 @@ import { useState, useEffect } from "react"; +import { AntDesignOutlined,EditTwoTone } from '@ant-design/icons'; +import { Modal,Avatar } from 'antd'; +import { UserMessage,UpdateUserInfo } from '../../apis/manage'; +import { useTranslation } from 'react-i18next'; +import TransactionRecord from "../TransactionRecord"; import './UserInfo.css' -import {UserMessage} from '../../apis/manage'; const UserInfo = () => { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + const [confirmLoading, setConfirmLoading] = useState(false); + const [avatar, setAvatar] = useState(0) + const [selectedIndex, setSelectedIndex] = useState(null); // 用于跟踪选中的头像索引 + const [image, setImage] = useState(0); // 用于控制头像使用哪一个 + const [userInfo, setUserInfo] = useState({ username: "pater", - total: 10000, - frozen: 5000, - available: 5000, + total: 0, + frozen: 0, + available: 0, }); useEffect(() => { const fetchUserInfo = async () => { const response = await UserMessage() setUserInfo(response.data) + console.log(response.data.avatar_id); + + setImage(response.data.avatar_id-1) console.log(response.data) }; fetchUserInfo(); }, []); + + const showModal = () => { + setOpen(true); + }; + + const handleOk = async () => { + setConfirmLoading(true); + // 调用修改用户信息接口 + const data = { + "user_name": userInfo.user_name, + "avatar_id":avatar + } + const response = await UpdateUserInfo(data) + if (response.code == 200) { + setOpen(false); + setConfirmLoading(false); + } else { + setConfirmLoading(false); + console.log(response) + } + }; + const handleCancel = () => { + setOpen(false); + }; + + const divClickHandle = (index) => { + // 设置用户头像记录,在点击提交时修改数据提交上去 + setAvatar(index) + setSelectedIndex(index-1) + } + + const images = [ + '/images/avatar/1.png', + '/images/avatar/2.png', + '/images/avatar/3.png', + '/images/avatar/4.png', + '/images/avatar/5.png', + '/images/avatar/6.png', + '/images/avatar/7.png', + '/images/avatar/8.png', + ]; return (
-

{ userInfo.user_name}

-
-
-

总数:{userInfo.total}

-

冻结数:{userInfo.freeze}

-

可用数:{userInfo.available}

+ } + src={ images[image]} + /> +
+ +
+

{ userInfo.user_name}

+

{ t('total')}:{userInfo.total}

+

冻结数:{userInfo.frozen}

+

可用数:{userInfo.available}

+ + +
+ Dmail +
+ +
+ {images.map((image, index) => ( +
divClickHandle(index + 1)}> + {`image-${index}` +
+ ))} +
+
); }; +export default UserInfo; + -export default UserInfo; diff --git a/checkerboard/src/components/web3wallet/Wallet.jsx b/checkerboard/src/components/web3wallet/Wallet.jsx index 5be5eb5..1ffbfae 100644 --- a/checkerboard/src/components/web3wallet/Wallet.jsx +++ b/checkerboard/src/components/web3wallet/Wallet.jsx @@ -1,26 +1,42 @@ -import { useState } from 'react'; +import { useState,useEffect } from 'react'; import onboard from './WebOnboard'; +import {loginUser} from '../../apis/manage' import { ethers } from 'ethers'; const ConnectWallet = () => { const [wallet, setWallet] = useState(null); const [provider, setProvider] = useState(null); + // 在组件加载时设置语言 + useEffect(() => { + onboard.state.actions.setLocale('zh') + }, []); + // 连接钱包 const connectWallet = async () => { + const wallets = await onboard.connectWallet(); if (wallets && wallets.length > 0) { setWallet(wallets[0]); - - console.log("账户信息:", wallets); - + // 用户在连接钱包成功后,调用登录或注册的接口,直接判断钱包地址, + // 如果存在就说明不是第一次登录,则进行登录返回token + // 如果不存在就注册账号,然后创建一系列资源 + console.log(wallets); + + const user = { + user_id: wallets[0].accounts[0].address, + user_name: "", + wallet_adr: wallets[0].accounts[0].address, + wallet_platform: wallets[0].label + }; + const response = await loginUser(user) + // 获取到token + console.log(response) const ethersProvider = new ethers.providers.Web3Provider( wallets[0].provider, 'any', ); - setProvider(ethersProvider); - // 设置事件监听器 wallets[0].provider.on('disconnect', handleDisconnect); wallets[0].provider.on('accountsChanged', handleAccountsChanged); @@ -32,7 +48,6 @@ const ConnectWallet = () => { if (wallet) { wallet.provider.removeListener('disconnect', handleDisconnect); wallet.provider.removeListener('accountsChanged', handleAccountsChanged); - await onboard.disconnectWallet({ label: wallet.label }); setWallet(null); setProvider(null); diff --git a/checkerboard/src/components/web3wallet/WebOnboard.js b/checkerboard/src/components/web3wallet/WebOnboard.js index 70579d2..827fa9f 100644 --- a/checkerboard/src/components/web3wallet/WebOnboard.js +++ b/checkerboard/src/components/web3wallet/WebOnboard.js @@ -20,6 +20,30 @@ const onboard = Onboard({ rpcUrl: 'https://sepolia.infura.io/v3/512c7938c0084f22bc5369a77c5222ef', // 替换 ${INFURA_ID} 为实际 Infura 项目的 ID }, ], + i18n: { + en: { + connect: { + selectingWallet: { + header: 'Connect your wallet', + description: 'Connecting your wallet is like logging into Web3. Select your wallet to get started.', + noWalletsFound: 'I don’t have a wallet', + whyNotSeeWallet: 'Why don’t I see my wallet?', + clickHere: 'Click here to learn more' + } + } + }, + zh: { + connect: { + selectingWallet: { + header: '连接您的钱包', + description: '123', + noWalletsFound: '我没有钱包', + whyNotSeeWallet: '为什么没有看到我的钱包?', + clickHere: '点击这里了解更多' + } + } + } + } }); export default onboard; diff --git a/checkerboard/src/config/i18n.js b/checkerboard/src/config/i18n.js new file mode 100644 index 0000000..ba4b22e --- /dev/null +++ b/checkerboard/src/config/i18n.js @@ -0,0 +1,36 @@ +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; + +// 语言资源 +const resources = { + en: { + translation: { + "hello": "Hello", + "welcome": "Welcome to our application", + "total": "total", + "change": "changeLanguage" + } + }, + zh: { + translation: { + "hello": "你好", + "welcome": "欢迎来到我们的应用", + "total": "总数", + "change":"切换语言" + } + } +}; + +// 初始化 i18next +i18n + .use(initReactI18next) // 把 react-i18next 绑定到 i18next + .init({ + resources, // 语言资源 + lng: "en", // 默认语言 + keySeparator: false, // 不使用键分隔符 + interpolation: { + escapeValue: false, // React 已经处理了 XSS 问题 + }, + }); + +export default i18n; diff --git a/checkerboard/src/index.css b/checkerboard/src/index.css index bb02ec6..919dec4 100644 --- a/checkerboard/src/index.css +++ b/checkerboard/src/index.css @@ -2,14 +2,11 @@ html, body { display: flex; place-items: center; - min-width: 100vh; - min-height: 100vh; justify-content: center; align-items: center; flex-wrap: wrap; flex-direction: row; align-content: center; - padding: 0; height: 100%; width: 100%; /* overflow: hidden; */ diff --git a/checkerboard/src/main.jsx b/checkerboard/src/main.jsx index b9a1a6d..09147f6 100644 --- a/checkerboard/src/main.jsx +++ b/checkerboard/src/main.jsx @@ -1,6 +1,7 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' +import './config/i18n.js' import App from './App.jsx' createRoot(document.getElementById('root')).render( diff --git a/checkerboard/src/pages/Expand.jsx b/checkerboard/src/pages/Expand.jsx deleted file mode 100644 index b4ad818..0000000 --- a/checkerboard/src/pages/Expand.jsx +++ /dev/null @@ -1,86 +0,0 @@ -import { useState } from 'react'; -import '../components/chessboard/ChessBoard.css'; -import Rule from '../components/Rule'; -import UserInfo from '../components/userinfo/UserInfo' -import TransactionRecord from '../components/TransactionRecord'; -import { frontURL} from '../config/config' -import RecordTable from '../components/table/RecordTable'; - - - -const Expand = () => { - const gridSize = 10; - const mergedIds = [45, 46, 55, 56]; - const boxes = Array.from({ length: gridSize * gridSize }, (_, index) => { - const id = index + 1; - const isMerged = mergedIds.includes(id); - return { id, price: 500, isMerged }; - }); - - // eslint-disable-next-line no-unused-vars - const [currentBox, setCurrentBox] = useState(null); - - const handleBoxClick = (boxId, boxPrice) => { - const encodedData = encodeURIComponent(JSON.stringify(boxId)) - const newUrl = frontURL+`/newpage`; - window.open(`${newUrl}#${encodedData}`, '_blank'); - setCurrentBox({ id: boxId, price: boxPrice }); - }; - - return ( -
-
-
- - {/* */} -
- -
- {boxes.map((box) => { - if (box.isMerged) { - // 渲染合并后的大格子 - if (box.id === 45) { - return ( -
- 50000 -
- ); - } - return null; - } - // 渲染普通格子 - return ( -
handleBoxClick(box.id, box.price)} - > - {box.id} -
- - ); - })} -
-
-
- -
-
- - -
-
-
-
- ); -}; - -export default Expand; - diff --git a/checkerboard/src/pages/home/Expand.css b/checkerboard/src/pages/home/Expand.css new file mode 100644 index 0000000..1dd6054 --- /dev/null +++ b/checkerboard/src/pages/home/Expand.css @@ -0,0 +1,27 @@ +.page { + display: flex; + flex-direction: column; + align-items: center; +} + +.gridStyle{ + display: grid; + grid-template-columns: repeat(3, 200px); + grid-template-rows: repeat(3, 200px); + gap: 5px; + border-radius: 6px; + border: 1px solid black; + padding: 10px; +} + +.cellStyle { + width: 200px; + height: 200px; + border-radius: 6px; + border: 1px solid black; + display: flex; + justify-content: center; + align-items: center; + cursor:pointer; +} + diff --git a/checkerboard/src/pages/home/Expand.jsx b/checkerboard/src/pages/home/Expand.jsx new file mode 100644 index 0000000..239f6a7 --- /dev/null +++ b/checkerboard/src/pages/home/Expand.jsx @@ -0,0 +1,62 @@ +import { useNavigate } from 'react-router-dom'; +import UserInfo from '../../components/userinfo/UserInfo' +import TransactionRecord from '../../components/TransactionRecord'; +import RecordTable from '../../components/table/RecordTable'; +import ConnectWallet from '../../components/web3wallet/Wallet'; +import '../../components/chessboard/ChessBoard.css' +import './Expand.css' +import Header from '../../components/header/Header'; + +const Expand = () => { + const navigate = useNavigate(); + + const handleClick = (index) => { + navigate(`/board/${index + 1}`); + }; + + const ruleClickHandle = () => { + navigate("/rule") + } + + return ( +
+
+
+
+
+ + + {/* */} +
+ +
+ {Array(9).fill().map((_, index) => ( +
handleClick(index) : undefined} + > + {index + 1} +
+ ))} +
+
+
+ +
+
+
+ 规则 +
+ +
+
+
+
+
+ + ); +}; + +export default Expand; + diff --git a/config.yaml b/config.yaml index 312dfb6..69f3755 100644 --- a/config.yaml +++ b/config.yaml @@ -19,3 +19,6 @@ mysql: dbname: "activity" max_open_conns: 200 max_idle_conns: 50 + +# TG机器人:7559410093:AAENqFuXpFVGecRqMMoutiy99pNLcZEQObY +# chat_id:-4620695304 diff --git a/controller/checkerboard.go b/controller/checkerboard.go index 4b20cba..4ac86cd 100644 --- a/controller/checkerboard.go +++ b/controller/checkerboard.go @@ -49,6 +49,19 @@ func (p *CheckerBoardController) UserBetting(c *gin.Context) { pkg.ResponseError(c, pkg.CodeInsufficientBalance) return } + //获取当前格子的信息,判断该用户提交的金额是否符合要求 + checkerBoard, err := dao.GetDaoManager().GetGaidInfoByGaidId(bet.GridId) + if err != nil { + p.LG.Error("获取格子信息失败", zap.Error(err)) + pkg.ResponseError(c, pkg.CodeServerBusy) + return + } + if checkerBoard.PriceIncrease >= bet.TransactionAmount || checkerBoard.Price >= bet.TransactionAmount { + p.LG.Error("用户提交的数据不足以买下", zap.Error(err)) + pkg.ResponseError(c, pkg.CodePriceError) + return + } + //查询用户信息 userInfo, err := dao.GetDaoManager().GetUserInfo(userId) if err != nil { @@ -57,6 +70,11 @@ func (p *CheckerBoardController) UserBetting(c *gin.Context) { return } var board model.Board + //在记录中记录用户名用于前端展示 + bet.OldAmount = checkerBoard.Price + bet.Name = userInfo.UserName + bet.OldName = checkerBoard.Owner + bet.OldOwner = checkerBoard.UserId board.Record = bet board.UserName = userInfo.UserName board.Freeze = assetInfo.Freeze + bet.TransactionAmount @@ -80,7 +98,7 @@ func (p *CheckerBoardController) UserBetting(c *gin.Context) { pkg.ResponseSuccess(c, pkg.CodeSuccess) } -// GetOperateRecords 获取用户的操作记录 +// GetOperateRecords 获取用户的操作记录,包括被抢占的记录 func (p *CheckerBoardController) GetUserOperateRecords(c *gin.Context) { userId := c.GetString(pkg.USERID) if userId == "" { diff --git a/controller/user.go b/controller/user.go index 27a8c81..1dbba45 100644 --- a/controller/user.go +++ b/controller/user.go @@ -6,6 +6,7 @@ import ( "activity/pkg" "github.com/gin-gonic/gin" "go.uber.org/zap" + "gorm.io/gorm" ) type UserController struct { @@ -21,13 +22,40 @@ func (p *UserController) Login(c *gin.Context) { return } - userInfo, err := dao.GetDaoManager().GetUserInfo(user.UserName) - if err != nil { + userInfo, err := dao.GetDaoManager().GetUserInfoFirst(user.UserId) + if err == gorm.ErrRecordNotFound { + //检查用户是否之前注册过,如果之前注册过就进行登录,如果没有注册过就注册过之后再返回信息 + //区分用户使用的是钱包平台以及地址,创建用户,并初始化用户资源 + /** + 1、创建用户 + 2、创建用户资产数据 + */ + err := dao.GetDaoManager().Register(&user) + if err != nil { + p.LG.Error("用户注册失败:", zap.Error(err)) + pkg.ResponseError(c, pkg.CodeServerBusy) + return + } + + //初始化资产数据 + asset := model.Assets{ + Total: 0, + Freeze: 0, + Available: 0, + UserId: user.UserId, + } + err = dao.GetDaoManager().CreateAssetInfo(asset) + if err != nil { + p.LG.Error("创建用户资产数据失败:", zap.Error(err)) + pkg.ResponseError(c, pkg.CodeServerBusy) + return + } + } + if err != nil && err != gorm.ErrRecordNotFound { p.LG.Error("用户信息查询失败:", zap.Error(err)) pkg.ResponseError(c, pkg.CodeServerBusy) return } - //生成token,这个地方只返回一个token token, err := pkg.GenToken(userInfo.UserId) if err != nil { @@ -77,11 +105,13 @@ func (p *UserController) GetUserInfo(c *gin.Context) { } info := struct { - UserName string `json:"user_name"` - Total int `json:"total"` - Frozen int `json:"frozen"` - Available int `json:"available"` + UserName string `json:"user_name"` + AvatarId int `json:"avatar_id"` + Total float64 `json:"total"` + Frozen float64 `json:"frozen"` + Available float64 `json:"available"` }{ + AvatarId: userInfo.AvatarId, UserName: userInfo.UserName, Total: asset.Total, Frozen: asset.Freeze, @@ -120,26 +150,39 @@ func (p *UserController) PutUserInfo(c *gin.Context) { pkg.ResponseError(c, pkg.CodeNeedLogin) return } - var user model.User + var user model.UpdateUser if err := c.ShouldBind(&user); err != nil { p.LG.Error("修改用户信息失败", zap.Error(err)) pkg.ResponseError(c, pkg.CodeInvalidParam) return } - user.UserId = userId + userInfo, err := dao.GetDaoManager().GetUserInfo(userId) + if err != nil { + p.LG.Error("获取用户信息失败", zap.Error(err)) + pkg.ResponseError(c, pkg.CodeServerBusy) + return + } + if user.AvatarId != 0 { + userInfo.AvatarId = user.AvatarId + } + if user.UserName != "" { + userInfo.UserName = user.UserName + } + //更新用户信息 - err := dao.GetDaoManager().PutUserInfo(user) + err = dao.GetDaoManager().PutUserInfo(userInfo) if err != nil { p.LG.Error("修改用户信息失败", zap.Error(err)) pkg.ResponseError(c, pkg.CodeUpdateError) return } //更新棋盘信息 - err = dao.GetDaoManager().UpdateUserBoardInfo(user.AvatarId, userId) + err = dao.GetDaoManager().UpdateUserBoardInfo(userInfo) if err != nil { p.LG.Error("修改用户棋盘信息失败", zap.Error(err)) pkg.ResponseError(c, pkg.CodeUpdateError) return } + pkg.ResponseSuccess(c, pkg.CodeSuccess) } diff --git a/dao/checkboard.go b/dao/checkboard.go index df9b405..3e68dc7 100644 --- a/dao/checkboard.go +++ b/dao/checkboard.go @@ -12,7 +12,7 @@ type CheckBoardDao struct { // GetRecordByUserId 根据用户id查询用户的操作记录 func (p *CheckBoardDao) GetRecordByUserId(userId string, page, size int) ([]model.Record, int64, error) { var records []model.Record - err := p.DB.Where("owner = ?", userId).Limit(size).Offset((page - 1) * size).Order("created_at desc").Find(&records).Error + err := p.DB.Where("owner = ? or old_owner = ?", userId, userId).Limit(size).Offset((page - 1) * size).Order("created_at desc").Find(&records).Error if err != nil { return nil, 0, err } @@ -76,7 +76,13 @@ func (p *CheckBoardDao) GetRecord() ([]model.Record, error) { } // 更新用户在棋盘上的数据 -func (p *CheckBoardDao) UpdateUserBoardInfo(avatarId int, userId string) error { - err := p.DB.Where("user_id = ?", userId).Update("avatar_id", avatarId).Error +func (p *CheckBoardDao) UpdateUserBoardInfo(user model.User) error { + err := p.DB.Model(&model.CheckerBoard{}).Where("user_id = ?", user.UserId).Updates(model.CheckerBoard{AvatarId: user.AvatarId, Owner: user.UserName}).Error return err } + +func (p *CheckBoardDao) GetGaidInfoByGaidId(gaidId int) (model.CheckerBoard, error) { + var checkerBoard model.CheckerBoard + err := p.DB.Where("id = ?", gaidId).First(&checkerBoard).Error + return checkerBoard, err +} diff --git a/dao/interface.go b/dao/interface.go index 669b06f..0340a33 100644 --- a/dao/interface.go +++ b/dao/interface.go @@ -15,8 +15,10 @@ type DaoController struct { type User interface { CheckUserName(username string) (bool, error) GetUserInfo(userId string) (model.User, error) + GetUserInfoFirst(userId string) (model.User, error) CheckPassWord(password string) (bool, error) GetUserAssetInfo(userId string) (model.Assets, error) + CreateAssetInfo(assets model.Assets) error UpdateUserAssetInfo(chargeInfo model.RechargerRecord) error Register(user *model.User) error PutUserInfo(user model.User) error @@ -29,7 +31,8 @@ type CheckerBoard interface { GerRecordGrid(blockId string, userId string) ([]model.Record, error) CreateGridRecord(board model.Board) error GetRecord() ([]model.Record, error) - UpdateUserBoardInfo(avatarId int, userId string) error + UpdateUserBoardInfo(user model.User) error + GetGaidInfoByGaidId(gaidId int) (model.CheckerBoard, error) } type DaoManager interface { diff --git a/dao/user.go b/dao/user.go index 0c36f7d..3cb0be5 100644 --- a/dao/user.go +++ b/dao/user.go @@ -28,6 +28,12 @@ func (p *UserDao) GetUserInfo(userId string) (model.User, error) { return user, err } +func (p *UserDao) GetUserInfoFirst(userId string) (model.User, error) { + var user model.User + err := p.DB.Where("user_id = ?", userId).First(&user).Error + return user, err +} + // GetUserAssetInfo 根据用户id获取用户资产信息 func (p *UserDao) GetUserAssetInfo(userId string) (model.Assets, error) { var assets model.Assets @@ -68,6 +74,11 @@ func (p *UserDao) UpdateUserAssetInfo(chargeInfo model.RechargerRecord) error { return nil } +func (p *UserDao) CreateAssetInfo(asset model.Assets) error { + err := p.DB.Create(&asset).Error + return err +} + // CheckPassWord 检查密码是否正确 func (p *UserDao) CheckPassWord(password string) (bool, error) { var user User @@ -77,13 +88,15 @@ func (p *UserDao) CheckPassWord(password string) (bool, error) { } return true, nil } -func (p *UserDao) Register(user *model.User) error { - return nil +// Register 注册用户 +func (p *UserDao) Register(user *model.User) error { + err := p.DB.Create(user).Error + return err } // 更新用户信息 func (p *UserDao) PutUserInfo(user model.User) error { - err := p.DB.Updates(&user).Error + err := p.DB.Where("user_id = ?", user.UserId).Updates(&user).Error return err } diff --git a/go.mod b/go.mod index 57275d4..300b86a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,9 @@ require ( github.com/fsnotify/fsnotify v1.7.0 github.com/gin-gonic/gin v1.10.0 github.com/go-sql-driver/mysql v1.8.1 + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/golang-jwt/jwt/v5 v5.2.1 + github.com/gorilla/websocket v1.5.3 github.com/natefinch/lumberjack v2.0.0+incompatible github.com/spf13/viper v1.19.0 go.uber.org/zap v1.27.0 @@ -29,7 +31,6 @@ require ( github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/gorilla/websocket v1.5.3 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect diff --git a/go.sum b/go.sum index 63cf0a8..32183ac 100644 --- a/go.sum +++ b/go.sum @@ -35,6 +35,8 @@ github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaC github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= diff --git a/handle/run.go b/handle/run.go index 135b9b6..8440ec9 100644 --- a/handle/run.go +++ b/handle/run.go @@ -1,8 +1,10 @@ package handle +import "activity/pkg" + func Run() { //启动websocket消息监听 - go RunWs() + go pkg.PanicHandle(RunWs) //启动定时上涨任务 - go RunTask() + go pkg.PanicHandle(RunTask) } diff --git a/handle/scheduledtasks.go b/handle/scheduledtasks.go index e2c9eb9..9513727 100644 --- a/handle/scheduledtasks.go +++ b/handle/scheduledtasks.go @@ -3,21 +3,24 @@ package handle import ( "activity/model" "activity/utils" + "fmt" "go.uber.org/zap" - "sync" + "strconv" "time" ) func RunTask() { + i := 0 ticker := time.NewTicker(1 * time.Hour) for { <-ticker.C - riseHandle() + i++ + riseHandle(i) } } -// riseHandle 处理上涨函数 -func riseHandle() { +// RiseHandle 处理上涨函数 +func riseHandle(i int) { /** 按照当前格子的价值*1.05 */ @@ -26,28 +29,22 @@ func riseHandle() { if err != nil { // 报错并结束程序运行 } - /** - 截取切片,然后开携程优化处理速度 - */ - //m := make(map[int]model.CheckerBoard, 10) - var wg sync.WaitGroup - wg.Add(10) - start := 0 - for i := 1000; i < 10000; i = i + 1000 { - //切片传入携程 - start = i - boardSlice := boards[start:i] - go func(board []model.CheckerBoard) { - defer wg.Done() - for _, b := range board { - b.PriceIncrease = b.Price * 1.05 - } - // 入库 - err = utils.Tools.DB.Updates(&board).Error + for i := 0; i < len(boards); i++ { + //如果在一个小时内没有被抢占,就基于PriceIncrease价格上涨,被抢占了就基于当前格子价值上涨 + if boards[i].Price < boards[i].PriceIncrease { + boards[i].PriceIncrease, err = strconv.ParseFloat(strconv.FormatFloat(boards[i].PriceIncrease*1.05, 'f', 6, 64), 64) if err != nil { - utils.Tools.LG.Error("价格上涨时入库失败", zap.Error(err)) - return + } - }(boardSlice) + continue + } + boards[i].PriceIncrease, err = strconv.ParseFloat(strconv.FormatFloat(boards[i].Price*1.05, 'f', 6, 64), 64) + } + //入库 + err = utils.Tools.DB.Save(&boards).Error + if err != nil { + utils.Tools.LG.Error("价格上涨时入库失败", zap.Error(err)) + return } + utils.Tools.LG.Info(fmt.Sprintf("定时入库成功第%t次上涨", i)) } diff --git a/internal/test.go b/internal/test.go new file mode 100644 index 0000000..ba6d46a --- /dev/null +++ b/internal/test.go @@ -0,0 +1,66 @@ +package internal + +import ( + "fmt" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +type Client struct { + client *tgbotapi.BotAPI + chatID int64 +} + +func (c *Client) NewBot(token string, chatID int64) error { + var err error + c.client, err = tgbotapi.NewBotAPI(token) + if err != nil { + return err + } + fmt.Println("It is BOT:", c.client.Self.UserName) + c.client.Debug = true + c.chatID = chatID + return nil +} + +func (c *Client) SendMsg(text string) error { + msg := tgbotapi.NewMessage(c.chatID, text) + msg.ParseMode = tgbotapi.ModeHTML + _, err := c.client.Send(msg) + return err +} + +func (c *Client) SendImg(path string) error { + msg := tgbotapi.NewPhoto(c.chatID, tgbotapi.FilePath(path)) + _, err := c.client.Send(msg) + return err +} + +func (c *Client) SendDoc(path string) error { + msg := tgbotapi.NewDocument(c.chatID, tgbotapi.FilePath(path)) + var err error + _, err = c.client.Send(msg) + return err +} + +func (c *Client) SendSticker(path string) error { + msg := tgbotapi.NewSticker(c.chatID, tgbotapi.FilePath(path)) + var err error + _, err = c.client.Send(msg) + return err +} + +func (c *Client) GetUpdateCommand(cmd chan string) { + u := tgbotapi.NewUpdate(0) + updates := c.client.GetUpdatesChan(u) + for update := range updates { + cmd <- update.Message.Text + } +} +func InArray(s string, array []string) bool { + for _, i := range array { + if i == s { + return true + } + } + return false +} diff --git a/internal/tgmessage.go b/internal/tgmessage.go new file mode 100644 index 0000000..feb6830 --- /dev/null +++ b/internal/tgmessage.go @@ -0,0 +1,54 @@ +package internal + +import ( + "bytes" + "fmt" + "golang.org/x/net/proxy" + "log" + "net/http" +) + +const ( + telegramBotToken = "7559410093:AAENqFuXpFVGecRqMMoutiy99pNLcZEQObY" // 你的 Bot API Token + telegramChatID = "-4620695304" // 你的群组 Chat ID + proxyURL = "18.162.194.146:51206" // 你的代理地址和端口 +) + +func SendErrorToTelegram(message string) { + // 设置 SOCKS5 代理 + dialer, err := proxy.SOCKS5("tcp", proxyURL, nil, proxy.Direct) + if err != nil { + log.Printf("创建代理失败: %v", err) + return + } + + // 创建 HTTP 请求 + client := &http.Client{ + Transport: &http.Transport{ + Dial: dialer.Dial, + }, + } + + url := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", telegramBotToken) + data := fmt.Sprintf("chat_id=%s&text=%s", telegramChatID, message) + + req, err := http.NewRequest("POST", url, bytes.NewBufferString(data)) + if err != nil { + log.Printf("创建请求失败: %v", err) + return + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + resp, err := client.Do(req) + if err != nil { + log.Printf("发送请求失败: %v", err) + return + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + log.Printf("Telegram API 请求失败,状态码: %d", resp.StatusCode) + } else { + log.Println("错误信息已成功发送到 Telegram 群组") + } +} diff --git a/middleware/token.go b/middleware/token.go index 2e54f7c..f2083f6 100644 --- a/middleware/token.go +++ b/middleware/token.go @@ -25,7 +25,7 @@ func JWTAuthMiddleware() func(c *gin.Context) { // return //} //c.Set("userid", mc.UserID) - c.Set("user_id", "0x7D24a4398d5b9138451e6d16de31A45521CaACf4") + c.Set("user_id", "1231545") c.Next() } } diff --git a/model/assets.go b/model/assets.go index d5df62b..314b529 100644 --- a/model/assets.go +++ b/model/assets.go @@ -4,8 +4,8 @@ import "gorm.io/gorm" type Assets struct { gorm.Model - Total int `json:"total"` - Freeze int `json:"freeze"` - Available int `json:"available"` - UserId string `json:"user_id" gorm:"column:user_id"` + Total float64 `json:"total"` + Freeze float64 `json:"freeze"` + Available float64 `json:"available"` + UserId string `json:"user_id" gorm:"column:user_id"` } diff --git a/model/checkerboard.go b/model/checkerboard.go index a4a6973..b446373 100644 --- a/model/checkerboard.go +++ b/model/checkerboard.go @@ -19,7 +19,7 @@ type CheckerBoard struct { type Board struct { Record Record UserName string - Freeze int - Available int + Freeze float64 + Available float64 AvatarId int } diff --git a/model/rechargerecord.go b/model/rechargerecord.go index 4cc6a40..ea82c1c 100644 --- a/model/rechargerecord.go +++ b/model/rechargerecord.go @@ -5,11 +5,11 @@ import "gorm.io/gorm" // 用于记录用户的充值记录 type RechargerRecord struct { gorm.Model - FromUser string `json:"from_user" gorm:"column:from_user" binding:"required"` // 发送方 - ToUser string `json:"to_user" gorm:"column:to_user" binding:"required"` // 接收方 - BlockHash string `json:"block_hash" gorm:"column:block_hash" binding:"required"` // 块hash - BlockNumber int64 `json:"block_number" gorm:"column:block_number" binding:"required"` // 交易块号 - TransactionHash string `json:"transaction_hash" gorm:"column:transaction_hash" binding:"required"` // 交易hash - Amount int `json:"amount" gorm:"column:amount" binding:"required"` // 交易金额 - WalletType string `json:"wallet_type" gorm:"column:wallet_type" binding:"required"` // 通过哪个钱包交易的 + FromUser string `json:"from_user" gorm:"column:from_user" binding:"required"` // 发送方 + ToUser string `json:"to_user" gorm:"column:to_user" binding:"required"` // 接收方 + BlockHash string `json:"block_hash" gorm:"column:block_hash" binding:"required"` // 块hash + BlockNumber int64 `json:"block_number" gorm:"column:block_number" binding:"required"` // 交易块号 + TransactionHash string `json:"transaction_hash" gorm:"column:transaction_hash" binding:"required"` // 交易hash + Amount float64 `json:"amount" gorm:"column:amount" binding:"required"` // 交易金额 + WalletType string `json:"wallet_type" gorm:"column:wallet_type" binding:"required"` // 通过哪个钱包交易的 } diff --git a/model/record.go b/model/record.go index 6444f08..137a188 100644 --- a/model/record.go +++ b/model/record.go @@ -5,11 +5,13 @@ import "gorm.io/gorm" // 主要用于记录用户在游戏过程中所进行的操作 type Record struct { gorm.Model - Owner string `json:"owner" gorm:"column:owner"` // 拥有者 - OldOwner string `json:"old_owner" gorm:"column:old_owner" binding:"required"` // 原来拥有者 - OldAmount int `json:"old_amount" gorm:"column:old_amount" binding:"required"` // 成交前价格 - TransactionAmount int `json:"transaction_amount" gorm:"column:transaction_amount" binding:"required"` // 成交金额 - GridId int `json:"grid_id" gorm:"column:grid_id" binding:"required"` // 格子id - BlockId int `json:"block_id" gorm:"column:block_id" binding:"required"` // 块id - Total int `json:"total" gorm:"-"` + Owner string `json:"owner" gorm:"column:owner"` // 拥有者 + OldOwner string `json:"old_owner" gorm:"column:old_owner"` // 原来拥有者 + Name string `json:"name" gorm:"column:name"` // 现在拥有者的用户名 + OldName string `json:"old_name" gorm:"column:old_name"` // 之前拥有者的用户名 + OldAmount float64 `json:"old_amount" gorm:"column:old_amount"` // 成交前价格 + TransactionAmount float64 `json:"transaction_amount" gorm:"column:transaction_amount" binding:"required"` // 成交金额 + GridId int `json:"grid_id" gorm:"column:grid_id" binding:"required"` // 格子id + BlockId int `json:"block_id" gorm:"column:block_id" binding:"required"` // 块id + Total int `json:"total" gorm:"-"` } diff --git a/model/user.go b/model/user.go index 50d05e3..b9d6d66 100644 --- a/model/user.go +++ b/model/user.go @@ -2,9 +2,14 @@ package model type User struct { UserId string `json:"user_id" gorm:"column:user_id"` - UserName string `json:"user_name" gorm:"column:user_name" binding:"required"` + UserName string `json:"user_name" gorm:"column:user_name"` WalletAdr string `json:"wallet_adr" gorm:"column:wallet_adr" binding:"required"` // 钱包地址 WalletPlatform string `json:"wallet_platform" gorm:"column:wallet_platform" binding:"required"` // 钱包平台 - AvatarId int `json:"avatar_id" gorm:"column:avatar_id" binding:"required"` // 头像Id + AvatarId int `json:"avatar_id" gorm:"column:avatar_id"` // 头像Id Assets Assets `json:"assets" gorm:"-"` // 资产信息 } + +type UpdateUser struct { + UserName string `json:"user_name" gorm:"column:user_name"` + AvatarId int `json:"avatar_id" gorm:"column:avatar_id"` +} diff --git a/pkg/code.go b/pkg/code.go index 0084c92..f474c89 100644 --- a/pkg/code.go +++ b/pkg/code.go @@ -22,6 +22,7 @@ const ( CodeEmpowerUser CodeInsufficientBalance CodeUpdateError + CodePriceError ) var codeMsgMap = map[ResCode]string{ @@ -44,6 +45,7 @@ var codeMsgMap = map[ResCode]string{ CodeEmpowerUser: "用户赋权失败", CodeInsufficientBalance: "余额不足", CodeUpdateError: "更新失败", + CodePriceError: "提交的价格过低", } func (c ResCode) Msg() string { diff --git a/pkg/error_handle.go b/pkg/error_handle.go new file mode 100644 index 0000000..fd61e98 --- /dev/null +++ b/pkg/error_handle.go @@ -0,0 +1,16 @@ +package pkg + +import ( + "fmt" + "go.uber.org/zap" +) + +func PanicHandle(f func()) { + defer func() { + if r := recover(); r != nil { + fmt.Println(r) + zap.L().Error("数据中心异常,请联系管理员处理") + } + }() + f() +} diff --git a/utils/createData.go b/utils/createData.go index 14b3ca6..c3db5c8 100644 --- a/utils/createData.go +++ b/utils/createData.go @@ -14,7 +14,7 @@ func CreateBoardData() { fmt.Println(err) return } - if total >= 9600 { + if total >= 800 { fmt.Println("表中已有数据") return } @@ -23,8 +23,8 @@ func CreateBoardData() { 先创建第一块然后一块插入进去 */ //外层盒子 - for i := 1; i <= 100; i++ { - if i == 45 || i == 46 || i == 55 || i == 56 { + for i := 1; i <= 9; i++ { + if i == 5 { continue } //内层盒子