diff --git a/internal/db/models/server_daily_stat_dao.go b/internal/db/models/server_daily_stat_dao.go index 2d2a16b9..7b0779fa 100644 --- a/internal/db/models/server_daily_stat_dao.go +++ b/internal/db/models/server_daily_stat_dao.go @@ -59,10 +59,61 @@ func (this *ServerDailyStatDAO) SaveStats(stats []*pb.ServerDailyStat) error { // 根据用户计算某月合计 // month 格式为YYYYMM func (this *ServerDailyStatDAO) SumUserMonthly(userId int64, regionId int64, month string) (int64, error) { - return this.Query(). - Attr("regionId", regionId). - Between("day", month+"01", month+"32"). + query := this.Query() + if regionId > 0 { + query.Attr("regionId", regionId) + } + return query.Between("day", month+"01", month+"32"). Where("serverId IN (SELECT id FROM "+SharedServerDAO.Table+" WHERE userId=:userId)"). Param("userId", userId). SumInt64("bytes", 0) } + +// 获取某月带宽峰值 +// month 格式为YYYYMM +func (this *ServerDailyStatDAO) SumUserMonthlyPeek(userId int64, regionId int64, month string) (int64, error) { + query := this.Query() + if regionId > 0 { + query.Attr("regionId", regionId) + } + max, err := query.Between("day", month+"01", month+"32"). + Where("serverId IN (SELECT id FROM "+SharedServerDAO.Table+" WHERE userId=:userId)"). + Param("userId", userId). + Max("bytes", 0) + if err != nil { + return 0, err + } + return int64(max), nil +} + +// 获取某天流量总和 +// day 格式为YYYYMMDD +func (this *ServerDailyStatDAO) SumUserDaily(userId int64, regionId int64, day string) (int64, error) { + query := this.Query() + if regionId > 0 { + query.Attr("regionId", regionId) + } + return query. + Attr("day", day). + Where("serverId IN (SELECT id FROM "+SharedServerDAO.Table+" WHERE userId=:userId)"). + Param("userId", userId). + SumInt64("bytes", 0) +} + +// 获取某天带宽峰值 +// day 格式为YYYYMMDD +func (this *ServerDailyStatDAO) SumUserDailyPeek(userId int64, regionId int64, day string) (int64, error) { + query := this.Query() + if regionId > 0 { + query.Attr("regionId", regionId) + } + max, err := query. + Attr("day", day). + Where("serverId IN (SELECT id FROM "+SharedServerDAO.Table+" WHERE userId=:userId)"). + Param("userId", userId). + Max("bytes", 0) + if err != nil { + return 0, err + } + return int64(max), nil +} diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index 5d48ee53..08dfd4cf 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -464,7 +464,7 @@ func (this *ServerDAO) UpdateServerReverseProxy(serverId int64, config []byte) e } // 计算所有可用服务数量 -func (this *ServerDAO) CountAllEnabledServersMatch(groupId int64, keyword string) (int64, error) { +func (this *ServerDAO) CountAllEnabledServersMatch(groupId int64, keyword string, userId int64) (int64, error) { query := this.Query(). State(ServerStateEnabled) if groupId > 0 { @@ -475,6 +475,9 @@ func (this *ServerDAO) CountAllEnabledServersMatch(groupId int64, keyword string query.Where("(name LIKE :keyword OR serverNames LIKE :keyword)"). Param("keyword", "%"+keyword+"%") } + if userId > 0{ + query.Attr("userId", userId) + } return query.Count() } diff --git a/internal/rpc/services/service_server.go b/internal/rpc/services/service_server.go index 95dd1af0..02906fe4 100644 --- a/internal/rpc/services/service_server.go +++ b/internal/rpc/services/service_server.go @@ -381,7 +381,7 @@ func (this *ServerService) CountAllEnabledServersMatch(ctx context.Context, req if err != nil { return nil, err } - count, err := models.SharedServerDAO.CountAllEnabledServersMatch(req.GroupId, req.Keyword) + count, err := models.SharedServerDAO.CountAllEnabledServersMatch(req.GroupId, req.Keyword, 0) if err != nil { return nil, err } diff --git a/internal/rpc/services/service_user.go b/internal/rpc/services/service_user.go index 85376a6d..538dc55c 100644 --- a/internal/rpc/services/service_user.go +++ b/internal/rpc/services/service_user.go @@ -6,6 +6,8 @@ import ( rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + timeutil "github.com/iwind/TeaGo/utils/time" + "time" ) // 用户相关服务 @@ -215,3 +217,78 @@ func (this *UserService) UpdateUserLogin(ctx context.Context, req *pb.UpdateUser } return this.Success() } + +// 取得用户Dashboard数据 +func (this *UserService) ComposeUserDashboard(ctx context.Context, req *pb.ComposeUserDashboardRequest) (*pb.ComposeUserDashboardResponse, error) { + userId, err := this.ValidateUser(ctx) + if err != nil { + return nil, err + } + + if userId != req.UserId { + return nil, this.PermissionError() + } + + // 网站数量 + countServers, err := models.SharedServerDAO.CountAllEnabledServersMatch(0, "", req.UserId) + if err != nil { + return nil, err + } + + // 本月总流量 + month := timeutil.Format("Ym") + monthlyTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserMonthly(req.UserId, 0, month) + if err != nil { + return nil, err + } + + // 本月带宽峰值 + monthlyPeekTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserMonthly(req.UserId, 0, month) + if err != nil { + return nil, err + } + + // 今日总流量 + day := timeutil.Format("Ymd") + dailyTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserDaily(req.UserId, 0, day) + if err != nil { + return nil, err + } + + // 今日带宽峰值 + dailyPeekTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserDailyPeek(req.UserId, 0, day) + if err != nil { + return nil, err + } + + // 近 15 日流量带宽趋势 + dailyTrafficStats := []*pb.ComposeUserDashboardResponse_DailyStat{} + dailyPeekTrafficStats := []*pb.ComposeUserDashboardResponse_DailyStat{} + + for i := 14; i >= 0; i-- { + day := timeutil.Format("Ymd", time.Now().AddDate(0, 0, -i)) + + dailyTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserDaily(req.UserId, 0, day) + if err != nil { + return nil, err + } + + dailyPeekTrafficBytes, err := models.SharedServerDailyStatDAO.SumUserDailyPeek(req.UserId, 0, day) + if err != nil { + return nil, err + } + + dailyTrafficStats = append(dailyTrafficStats, &pb.ComposeUserDashboardResponse_DailyStat{Day: day, Count: dailyTrafficBytes}) + dailyPeekTrafficStats = append(dailyPeekTrafficStats, &pb.ComposeUserDashboardResponse_DailyStat{Day: day, Count: dailyPeekTrafficBytes}) + } + + return &pb.ComposeUserDashboardResponse{ + CountServers: countServers, + MonthlyTrafficBytes: monthlyTrafficBytes, + MonthlyPeekTrafficBytes: monthlyPeekTrafficBytes, + DailyTrafficBytes: dailyTrafficBytes, + DailyPeekTrafficBytes: dailyPeekTrafficBytes, + DailyTrafficStats: dailyTrafficStats, + DailyPeekTrafficStats: dailyPeekTrafficStats, + }, nil +}