admin_backend/controller/operation.go
2026-02-06 15:31:37 +08:00

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
}