Skip to content

Commit

Permalink
Merge pull request #2 from zizdlp/feature/geo
Browse files Browse the repository at this point in the history
Feature/geo
  • Loading branch information
zizdlp authored Aug 13, 2024
2 parents 4ba53c3 + e6bfe31 commit 499ccdb
Show file tree
Hide file tree
Showing 13 changed files with 692 additions and 236 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 33 additions & 8 deletions zbook_backend/doc/swagger/service_zbook_admin.swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -635,6 +635,31 @@
}
},
"definitions": {
"pbAgentCount": {
"type": "object",
"properties": {
"bot": {
"type": "integer",
"format": "int32"
},
"computer": {
"type": "integer",
"format": "int32"
},
"phone": {
"type": "integer",
"format": "int32"
},
"tablet": {
"type": "integer",
"format": "int32"
},
"unknown": {
"type": "integer",
"format": "int32"
}
}
},
"pbCreateSystemNotificationRequest": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -800,6 +825,9 @@
"type": "object",
"$ref": "#/definitions/pbVisitor"
}
},
"agentCount": {
"$ref": "#/definitions/pbAgentCount"
}
}
},
Expand Down Expand Up @@ -1102,16 +1130,9 @@
"pbVisitor": {
"type": "object",
"properties": {
"IP": {
"type": "string"
},
"Agent": {
"ip": {
"type": "string"
},
"Count": {
"type": "integer",
"format": "int32"
},
"city": {
"type": "string"
},
Expand All @@ -1122,6 +1143,10 @@
"long": {
"type": "number",
"format": "double"
},
"count": {
"type": "integer",
"format": "int32"
}
}
},
Expand Down
57 changes: 37 additions & 20 deletions zbook_backend/gapi/admin_get_daily_visitors.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ package gapi

import (
"context"

"math/rand"

"net/netip"
"sort"

"github.com/rs/zerolog/log"
"github.com/zizdlp/zbook/pb/rpcs"
Expand All @@ -23,34 +27,41 @@ func (server *Server) GetDailyVisitors(ctx context.Context, req *rpcs.GetDailyVi
if err != nil {
return nil, status.Errorf(codes.Internal, "get daily visitor failed: %s", err)
}

unique_visitors := util.AggregateByIP(visitors)
ret_visitors := ConvertVisitor(server, unique_visitors, req.GetLang())
agents := util.SumAgentCounts(visitors)
rsp := &rpcs.GetDailyVisitorsResponse{
Visitors: convertVisitors(server, visitors, req.GetLang()),
Visitors: ret_visitors,
AgentCount: ConvertAgent(agents),
}
return rsp, nil
}
func ConvertAgent(agent util.AgentCounts) *rpcs.AgentCount {
// 初始化 ret_agent
ret_agent := &rpcs.AgentCount{
Bot: int32(agent.Bot),
Computer: int32(agent.Computer),
Phone: int32(agent.Phone), // 修复这里的错配
Tablet: int32(agent.Tablet),
Unknown: int32(agent.Unknown),
}
return ret_agent
}

func convertVisitors(server *Server, visitors []*VisitorData, lang string) []*rpcs.Visitor {
func ConvertVisitor(server *Server, visitors map[string]int, lang string) []*rpcs.Visitor {
var ret_reports []*rpcs.Visitor
for i := 0; i < len(visitors); i++ {
ip, err := netip.ParseAddr(visitors[i].IP)
for ipStr, count := range visitors {
ip, err := netip.ParseAddr(ipStr)
if err != nil {
log.Error().Err(err).Msgf("can not parse ip addr: %s", visitors[i].IP)
log.Error().Err(err).Msgf("can not parse ip addr: %s", ipStr)
continue
}
record, err := server.store.GetGeoInfo(context.Background(), ip)
if err != nil {
// 如果解析出错,则将错误信息添加到响应中,继续处理下一个 IP
ret_reports = append(ret_reports,
&rpcs.Visitor{
IP: visitors[i].IP,
Agent: visitors[i].Agent,
Count: int32(visitors[i].Count),
},
)
log.Error().Err(err).Msgf("can not get GeoInfo for ip addr: %s", ipStr)
continue
} else {
// 如果解析成功,则将城市、经度和纬度信息添加到响应中

city := ""
if lang == "en" {
if record.CityNameEn.Valid {
Expand All @@ -63,18 +74,24 @@ func convertVisitors(server *Server, visitors []*VisitorData, lang string) []*rp
city = record.CityNameEn.String
}
}
// 在这里添加随机扰动
latWithNoise := record.Latitude.Float64 + (rand.Float64()*2 - 1)
longWithNoise := record.Longitude.Float64 + (rand.Float64()*2 - 1)

ret_reports = append(ret_reports,
&rpcs.Visitor{
IP: visitors[i].IP,
Agent: visitors[i].Agent,
Count: int32(visitors[i].Count),
Ip: ipStr,
City: city,
Lat: record.Latitude.Float64,
Long: record.Longitude.Float64,
Count: int32(count),
Lat: latWithNoise,
Long: longWithNoise,
},
)
}
}
// 按照 Count 从大到小排序
sort.Slice(ret_reports, func(i, j int) bool {
return ret_reports[i].Count > ret_reports[j].Count
})
return ret_reports
}
14 changes: 4 additions & 10 deletions zbook_backend/gapi/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,8 @@ type DailyUniqueKeysCount struct {
Count int32
}

type VisitorData struct {
IP string
Agent string
Count int
}

// 定义排序函数,按照 Count 降序排序
type ByCountDesc []*VisitorData
type ByCountDesc []*util.VisitorData

func (a ByCountDesc) Len() int {
return len(a)
Expand All @@ -166,9 +160,9 @@ func (a ByCountDesc) Less(i, j int) bool {
return a[i].Count > a[j].Count // 降序排序
}

func (server *Server) GetDailyVisitorsForLastNDays(ndays int32) ([]*VisitorData, error) {
func (server *Server) GetDailyVisitorsForLastNDays(ndays int32) ([]*util.VisitorData, error) {
// 定义用于存储符合条件的访客数据的切片
var visitors []*VisitorData
var visitors []*util.VisitorData
location, err := time.LoadLocation(server.config.TIMEZONE)
if err != nil {
return nil, fmt.Errorf("failed to load location:%v", err)
Expand Down Expand Up @@ -202,7 +196,7 @@ func (server *Server) GetDailyVisitorsForLastNDays(ndays int32) ([]*VisitorData,
// 获取 IP 地址部分
ipParts := strings.Split(parts[1], ",")[0]
// 构建 VisitorData 结构体并添加到切片中
visitors = append(visitors, &VisitorData{
visitors = append(visitors, &util.VisitorData{
IP: ipParts,
Agent: parts[len(parts)-2],
Count: count,
Expand Down
Loading

0 comments on commit 499ccdb

Please sign in to comment.