111 lines
2.9 KiB
Go
Raw Normal View History

2025-05-09 18:28:15 +08:00
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
}