admin_backend/controller/operation.go
hahwu 9468ec5873 用户权限管理
Co-authored-by: Copilot <copilot@github.com>
2026-04-29 10:35:36 +08:00

109 lines
3.4 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()
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
}