🎨客户端列表新增客户端数据流量情况
This commit is contained in:
parent
697341f823
commit
4b864f76bb
@ -9,6 +9,7 @@ import (
|
|||||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
"wireguard-ui/component"
|
"wireguard-ui/component"
|
||||||
"wireguard-ui/http/param"
|
"wireguard-ui/http/param"
|
||||||
"wireguard-ui/http/response"
|
"wireguard-ui/http/response"
|
||||||
@ -82,6 +83,25 @@ func (ClientApi) List(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for i, v := range data {
|
||||||
|
// 获取客户端链接信息
|
||||||
|
peer, err := component.Wireguard().GetClientByPublicKey(v.Keys.PublicKey)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var ipAllocation string
|
||||||
|
for _, iaip := range peer.AllowedIPs {
|
||||||
|
ipAllocation += iaip.String() + ","
|
||||||
|
}
|
||||||
|
data[i].DataTraffic = &vo.DataTraffic{
|
||||||
|
Online: time.Since(peer.LastHandshakeTime).Minutes() < 3,
|
||||||
|
ReceiveBytes: utils.FlowCalculation().Parse(peer.TransmitBytes),
|
||||||
|
TransmitBytes: utils.FlowCalculation().Parse(peer.ReceiveBytes),
|
||||||
|
ConnectEndpoint: ipAllocation,
|
||||||
|
LastHandAt: peer.LastHandshakeTime.Format("2006-01-02 15:04:05"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
response.R(c).Paginate(data, total, p.Current, p.Size)
|
response.R(c).Paginate(data, total, p.Current, p.Size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ package router
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"wireguard-ui/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Option func(engine *gin.RouterGroup)
|
type Option func(engine *gin.RouterGroup)
|
||||||
@ -19,6 +20,10 @@ func InitRouter() *gin.Engine {
|
|||||||
// 将请求打印至控制台
|
// 将请求打印至控制台
|
||||||
r.Use(gin.Logger())
|
r.Use(gin.Logger())
|
||||||
|
|
||||||
|
if config.Config.File.Type == "local" {
|
||||||
|
r.Static("/assets", config.Config.File.Path)
|
||||||
|
}
|
||||||
|
|
||||||
for _, opt := range options {
|
for _, opt := range options {
|
||||||
opt(r.Group("api"))
|
opt(r.Group("api"))
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,9 @@ import "wireguard-ui/model"
|
|||||||
// ClientItem
|
// ClientItem
|
||||||
// @description: 客户端信息
|
// @description: 客户端信息
|
||||||
type ClientItem struct {
|
type ClientItem struct {
|
||||||
Id string `json:"id"` // id
|
Id string `json:"id"` // id
|
||||||
Name string `json:"name"` // 名称
|
Name string `json:"name"` // 名称
|
||||||
Email string `json:"email"` // 通知邮箱
|
Email string `json:"email"` // 通知邮箱
|
||||||
//SubnetRange string `json:"subnetRange"` // 子网范围段
|
|
||||||
IpAllocation []string `json:"ipAllocation" gorm:"-"` // 分配的IP
|
IpAllocation []string `json:"ipAllocation" gorm:"-"` // 分配的IP
|
||||||
IpAllocationStr string `json:"-" gorm:"ipAllocationStr"`
|
IpAllocationStr string `json:"-" gorm:"ipAllocationStr"`
|
||||||
AllowedIps []string `json:"allowedIps" gorm:"-"` // 允许访问的IP
|
AllowedIps []string `json:"allowedIps" gorm:"-"` // 允许访问的IP
|
||||||
@ -19,11 +18,12 @@ type ClientItem struct {
|
|||||||
UseServerDns int `json:"useServerDns"` // 是否使用服务端DNS
|
UseServerDns int `json:"useServerDns"` // 是否使用服务端DNS
|
||||||
Keys *Keys `json:"keys" gorm:"-"` // 密钥等
|
Keys *Keys `json:"keys" gorm:"-"` // 密钥等
|
||||||
KeysStr string `json:"-" gorm:"keys_str"`
|
KeysStr string `json:"-" gorm:"keys_str"`
|
||||||
CreateUser string `json:"createUser"` // 创建人
|
CreateUser string `json:"createUser"` // 创建人
|
||||||
Enabled int `json:"enabled"` // 是否启用
|
Enabled int `json:"enabled"` // 是否启用
|
||||||
OfflineMonitoring int `json:"offlineMonitoring"` // 离线通知
|
OfflineMonitoring int `json:"offlineMonitoring"` // 离线通知
|
||||||
CreatedAt model.JsonTime `json:"createdAt"` // 创建时间
|
DataTraffic *DataTraffic `json:"dataTraffic" gorm:"-"` // 数据流量
|
||||||
UpdatedAt model.JsonTime `json:"updatedAt"` // 更新时间
|
CreatedAt model.JsonTime `json:"createdAt"` // 创建时间
|
||||||
|
UpdatedAt model.JsonTime `json:"updatedAt"` // 更新时间
|
||||||
}
|
}
|
||||||
|
|
||||||
type Keys struct {
|
type Keys struct {
|
||||||
@ -31,3 +31,13 @@ type Keys struct {
|
|||||||
PublicKey string `json:"publicKey"`
|
PublicKey string `json:"publicKey"`
|
||||||
PresharedKey string `json:"presharedKey"`
|
PresharedKey string `json:"presharedKey"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DataTraffic
|
||||||
|
// @description: 数据流量
|
||||||
|
type DataTraffic struct {
|
||||||
|
Online bool `json:"online"` // 是否在线
|
||||||
|
ReceiveBytes string `json:"receiveBytes"` // 接收流量
|
||||||
|
TransmitBytes string `json:"transmitBytes"` // 传输流量
|
||||||
|
ConnectEndpoint string `json:"connectEndpoint"` // 链接端点
|
||||||
|
LastHandAt string `json:"lastHandAt"` // 最后握手时间
|
||||||
|
}
|
||||||
|
@ -3,7 +3,9 @@ package utils
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"gitee.ltd/lxh/logger/log"
|
"gitee.ltd/lxh/logger/log"
|
||||||
|
"github.com/google/uuid"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"wireguard-ui/config"
|
"wireguard-ui/config"
|
||||||
"wireguard-ui/global/client"
|
"wireguard-ui/global/client"
|
||||||
@ -31,15 +33,18 @@ func (fileSystem) UploadFile(file []byte, suffix string) (filePath string, err e
|
|||||||
|
|
||||||
filePath = ossObj.LongPath
|
filePath = ossObj.LongPath
|
||||||
case "local":
|
case "local":
|
||||||
filePath = fmt.Sprintf("%v/%d-avatar%s", config.Config.File.Path, time.Now().Unix(), suffix)
|
basePath := fmt.Sprintf("%s/%d/avatar", config.Config.File.Path, time.Now().Unix())
|
||||||
|
filePath = fmt.Sprintf("%s/%s%s", basePath, strings.ReplaceAll(uuid.NewString(), "-", ""), suffix)
|
||||||
// 创建目录
|
// 创建目录
|
||||||
if err = os.MkdirAll(filePath, os.FileMode(0777)); err != nil {
|
if err = os.MkdirAll(basePath, os.FileMode(0777)); err != nil {
|
||||||
log.Errorf("本地存储目录创建失败: %v", err)
|
log.Errorf("本地存储目录创建失败: %v", err)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if err = os.WriteFile(filePath, file, os.FileMode(0777)); err != nil {
|
if err = os.WriteFile(filePath, file, os.FileMode(0777)); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
subPath := strings.ReplaceAll(filePath, fmt.Sprintf("%s/", config.Config.File.Path), "")
|
||||||
|
filePath = fmt.Sprintf("http://%s/assets/%s", config.Config.Http.Endpoint, subPath)
|
||||||
}
|
}
|
||||||
return filePath, err
|
return filePath, err
|
||||||
}
|
}
|
||||||
|
22
utils/flow_calculation.go
Normal file
22
utils/flow_calculation.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/dustin/go-humanize"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
type flowCalculation struct{}
|
||||||
|
|
||||||
|
func FlowCalculation() flowCalculation {
|
||||||
|
return flowCalculation{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse
|
||||||
|
// @description: 解析流量,序列化为字符串
|
||||||
|
// @receiver flowCalculation
|
||||||
|
// @param b
|
||||||
|
// @return string
|
||||||
|
func (flowCalculation) Parse(b int64) string {
|
||||||
|
b2 := big.Int{}
|
||||||
|
return humanize.BigBytes(b2.SetInt64(b))
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user