package internal import ( "admin/lib/httpclient" "admin/lib/xlog" "net/url" ) type ServerInfo struct { ProjectId int `json:"project_id"` ServerId string `json:"serverId"` ServerName string `json:"serverName"` Ccu int `json:"ccu"` TotalRoleCount int `json:"total_role_count"` TotalAccountCount int `json:"total_account_count"` Addr string `json:"addr"` IsServerDown bool `json:"open_whitelist_login"` } func (server *ServerInfo) Down(api string) error { addr := api + "/gm" params := &url.Values{} params.Set("server", server.ServerId) params.Set("cmd_data", "pauseServer") params.Set("reason", "down") rsp := make(map[string]any) err := httpclient.Request(addr, "get", params, rsp) if err != nil { return err } xlog.Infof("操作项目:%v服务器:%v停服返回:%v", server.ProjectId, server.ServerId, rsp) return nil } func (server *ServerInfo) Up(api string) error { addr := api + "/gm" params := &url.Values{} params.Set("server", server.ServerId) params.Set("cmd_data", "setWhite") params.Set("open", "false") rsp := make(map[string]any) err := httpclient.Request(addr, "get", params, rsp) if err != nil { return err } xlog.Infof("操作项目:%v服务器:%v起服返回:%v", server.ProjectId, server.ServerId, rsp) return nil } type ServerInfoList []*ServerInfo type PageServerCountInfo struct { Offset int Count int RawInfo *ServerInfo } type PageInfo struct { PageNo int // 页数,从1开始 Count int // 当前页的数量,一般是pageLen,但如果是最后一页可能不足 ServerList []*PageServerCountInfo // 参与组成这一页的服务器列表 } func (list ServerInfoList) FindByID(serverId string) *ServerInfo { for _, info := range list { if info.ServerId == serverId { return info } } return nil } func (list ServerInfoList) TidyToPageList(pageLen int, queryCountField func(info *ServerInfo) int) (totalCount int, pageList []*PageInfo) { curPageNo := 1 curPageNeedCount := pageLen var curPageInfo *PageInfo for _, serverInfo := range list { serverCount := queryCountField(serverInfo) totalCount += serverCount serverRestCount := serverCount serverAccOffset := 0 for { if serverRestCount >= curPageNeedCount { // 当前页数量足够,切下一页 if curPageInfo == nil { curPageInfo = &PageInfo{ PageNo: curPageNo, } } curPageInfo.Count += curPageNeedCount curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{ RawInfo: serverInfo, Offset: serverAccOffset, Count: curPageNeedCount, }) // 切下一个页 // 置空,等待下一次循环判断来创建 pageList = append(pageList, curPageInfo) curPageInfo = nil serverRestCount -= curPageNeedCount serverAccOffset += curPageNeedCount curPageNeedCount = pageLen curPageNo += 1 if serverRestCount <= 0 { // 当前服务器没有余额了,也要切下一个服务器 break } } else { // 当前页还不够,切下一个服务器信息 if curPageInfo == nil { curPageInfo = &PageInfo{ PageNo: curPageNo, } } curPageInfo.Count += serverRestCount curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{ RawInfo: serverInfo, Offset: serverAccOffset, Count: serverRestCount, }) // 切下一个服务器,页面不切 serverAccOffset += serverRestCount curPageNeedCount -= serverRestCount break } } } if curPageInfo != nil { // 最后一页还没达到数量的 pageList = append(pageList, curPageInfo) } return } type RspData struct { Code int `json:"code"` Msg string `json:"msg"` Data struct { List []*ServerInfo `json:"list"` } `json:"data"` } func GetRemoteServerInfoList(alisrvAddr string) (ServerInfoList, error) { rsp := &RspData{} err := httpclient.Request(alisrvAddr+"/server", "get", nil, rsp) if err != nil { return nil, err } return rsp.Data.List, nil }