package internal import "admin/lib/httpclient" type ServerInfo struct { 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"` OpenWhitelistLogin bool `json:"open_whitelist_login"` } 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) 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 }