111 lines
2.9 KiB
Go
111 lines
2.9 KiB
Go
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
|
||
}
|