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 (
+
+
当前位置: {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 (
+
+ );
+};
+
+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 (
);
};
-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}
+
+
+
+
+
+ {images.map((image, index) => (
+
divClickHandle(index + 1)}>
+

+
+ ))}
+
+
);
};
+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
}
//内层盒子