package controller import ( "backend/model" "backend/util" "fmt" "time" "github.com/gin-gonic/gin" ) func CopyUser(c *gin.Context) { CopyUser := struct { SrcAppID int `json:"src_app"` DstAppID int `json:"dst_app"` SrcUid int `json:"src_uid"` DstUid int `json:"dst_uid"` }{} if err := c.BindJSON(&CopyUser); err != nil { failed(c, "参数绑定失败: "+err.Error()) return } err := CopyUserOperation(CopyUser.SrcAppID, CopyUser.DstAppID, CopyUser.SrcUid, CopyUser.DstUid) if err != nil { failed(c, "复制用户数据失败: "+err.Error()) return } success(c, "复制用户数据成功") } func CopyUserOperation(srcAppID, dstAppID, srcUid, dstUid int) error { if dstAppID == 0 { return fmt.Errorf("不能复制用户数据到正式环境") } type DbData struct { DwUin int `db:"dwUin"` MData string `db:"mData"` UpdateTime int `db:"updateTime"` } SrcAppConf, err := util.GetAppConfig(srcAppID) if err != nil { return err } DstDb := &util.Db{} SrcDb := util.MPool.GetMysqlDB(SrcAppConf, 1) if srcAppID == dstAppID { DstDb = SrcDb } else { DstAppConf, err := util.GetAppConfig(dstAppID) if err != nil { return err } DstDb = util.MPool.GetMysqlDB(DstAppConf, 1) } defer SrcDb.Close() defer DstDb.Close() srcTableName := "t_player_mod" dstTableName := "t_player_mod" newscrTableName := fmt.Sprintf("t_player_mod_%02d", srcUid%100) // 复制 Mod 表 srcData := DbData{} err = SrcDb.Get(&srcData, fmt.Sprintf("SELECT dwUin, mData, updateTime FROM %s WHERE dwUin = ? LIMIT 1", newscrTableName), srcUid) if err != nil { err = SrcDb.Get(&srcData, fmt.Sprintf("SELECT dwUin, mData, updateTime FROM %s WHERE dwUin = ? LIMIT 1", srcTableName), srcUid) if err != nil { return err } } type player_data struct { DwUin int `db:"dwUin"` Register int64 `db:"rolecreatetime"` } var player player_data err = SrcDb.Get(&player, "SELECT dwUin, rolecreatetime FROM t_player_baseinfo WHERE dwUin = ? LIMIT 1", srcUid) if err != nil { return err } fmt.Printf("rolecreatetime %d", player.Register) var auto_id int64 _ = DstDb.Get(&auto_id, "SELECT auto_id FROM t_account WHERE user_name = ?", srcData.DwUin) if auto_id == 0 { result, err := DstDb.Exec("INSERT INTO t_account (user_name, user_password) VALUES (?, ?) ON DUPLICATE KEY UPDATE user_password = VALUES(user_password)", srcData.DwUin, "123456") if err != nil { return err } auto_id, err = result.LastInsertId() } else { newUid := int(auto_id) + 100000000*dstAppID + 100000 var node int _ = DstDb.Get(&node, "SELECT node FROM t_player_baseinfo WHERE dwUin = ?", newUid) if node != 0 { _, err = model.UserGM(dstAppID, node, newUid, "logout") time.Sleep(time.Second * 2) } } newUid := int(auto_id) + 100000000*dstAppID + 100000 _, err = DstDb.Exec("INSERT INTO t_player_baseinfo (dwUin, user_name, rolecreatetime, start_order_id) VALUES (?, ?, ?, 1) ON DUPLICATE KEY UPDATE user_name = VALUES(user_name), rolecreatetime = VALUES(rolecreatetime)", newUid, srcData.DwUin, player.Register) if err != nil { return err } dstTableName = fmt.Sprintf("t_player_mod_%02d", newUid%100) _, err = DstDb.Exec(fmt.Sprintf("INSERT INTO %s (dwUin, mData, updateTime) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE mData = VALUES(mData), updateTime = VALUES(updateTime)", dstTableName), newUid, srcData.MData, srcData.UpdateTime) if err != nil { return err } // 复制 User 表 return nil }