93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
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()
|
|
// 复制 Mod 表
|
|
srcData := DbData{}
|
|
|
|
err = SrcDb.Get(&srcData, "SELECT dwUin, mData, updateTime FROM t_player_mod WHERE dwUin = ? LIMIT 1", srcUid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
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, start_order_id) VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE user_name = VALUES(user_name)", newUid, srcData.DwUin)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = DstDb.Exec("INSERT INTO t_player_mod (dwUin, mData, updateTime) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE mData = VALUES(mData), updateTime = VALUES(updateTime)", newUid, srcData.MData, srcData.UpdateTime)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// 复制 User 表
|
|
return nil
|
|
}
|