This commit is contained in:
unknown
2026-02-04 20:27:13 +08:00
commit 3b042d1dad
9410 changed files with 1488147 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
)
type CreatePopupAction struct {
actionutils.ParentAction
}
func (this *CreatePopupAction) Init() {
this.Nav("", "", "")
}
func (this *CreatePopupAction) RunGet(params struct{}) {
this.Data["unitOptions"] = []maps.Map{
{
"code": userconfigs.TrafficPackageSizeUnitGB,
"name": "GiB",
},
{
"code": userconfigs.TrafficPackageSizeUnitTB,
"name": "TiB",
},
{
"code": userconfigs.TrafficPackageSizeUnitPB,
"name": "PiB",
},
}
this.Show()
}
func (this *CreatePopupAction) RunPost(params struct {
Size int32
Unit string
Must *actions.Must
CSRF *actionutils.CSRF
}) {
var packageId int64
defer func() {
this.CreateLogInfo(codes.TrafficPackage_LogCreateTrafficPackage, packageId)
}()
if params.Size <= 0 {
this.FailField("size", "请输入正确的流量包尺寸")
return
}
// 限制最大值
if params.Unit == userconfigs.TrafficPackageSizeUnitPB && params.Size > 8000 {
this.FailField("size", "流量尺寸不能超过8000PB")
}
createResp, err := this.RPC().TrafficPackageRPC().CreateTrafficPackage(this.AdminContext(), &pb.CreateTrafficPackageRequest{
Size: params.Size,
Unit: params.Unit,
})
if err != nil {
this.ErrorPage(err)
return
}
packageId = createResp.TrafficPackageId
this.Success()
}

View File

@@ -0,0 +1,27 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type DeleteAction struct {
actionutils.ParentAction
}
func (this *DeleteAction) RunPost(params struct {
PackageId int64
}) {
defer this.CreateLogInfo(codes.TrafficPackage_LogDeleteTrafficPackage, params.PackageId)
_, err := this.RPC().TrafficPackageRPC().DeleteTrafficPackage(this.AdminContext(), &pb.DeleteTrafficPackageRequest{TrafficPackageId: params.PackageId})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,71 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/finance/financeutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/maps"
"strings"
)
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.Nav("", "", "index")
}
func (this *IndexAction) RunGet(params struct{}) {
// 是否已启用
config, err := financeutils.ReadPriceConfig(this.AdminContext())
if err != nil {
this.ErrorPage(err)
return
}
this.Data["enableTrafficPackages"] = config != nil && config.EnableTrafficPackages
// 流量包列表
packagesResp, err := this.RPC().TrafficPackageRPC().FindAllTrafficPackages(this.AdminContext(), &pb.FindAllTrafficPackagesRequest{})
if err != nil {
this.ErrorPage(err)
return
}
var packageMaps = []maps.Map{}
for _, p := range packagesResp.TrafficPackages {
// prices
countPricesResp, err := this.RPC().TrafficPackagePriceRPC().CountTrafficPackagePrices(this.AdminContext(), &pb.CountTrafficPackagePricesRequest{TrafficPackageId: p.Id})
if err != nil {
this.ErrorPage(err)
return
}
packageMaps = append(packageMaps, maps.Map{
"id": p.Id,
"size": p.Size,
"unit": strings.ToUpper(p.Unit),
"isOn": p.IsOn,
"countPrices": countPricesResp.Count,
})
}
this.Data["packages"] = packageMaps
// 所有区域
regionsResp, err := this.RPC().NodeRegionRPC().FindAllAvailableNodeRegions(this.AdminContext(), &pb.FindAllAvailableNodeRegionsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
// 有效期
periodsResp, err := this.RPC().TrafficPackagePeriodRPC().FindAllAvailableTrafficPackagePeriods(this.AdminContext(), &pb.FindAllAvailableTrafficPackagePeriodsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
this.Data["totalPriceItems"] = len(regionsResp.NodeRegions) * len(periodsResp.TrafficPackagePeriods)
this.Show()
}

View File

@@ -0,0 +1,52 @@
//go:build plus
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/configloaders"
"github.com/TeaOSLab/EdgeAdmin/internal/plus"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/finance/packages/periods"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/finance/packages/periods/period"
userpackages "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/finance/packages/user-packages"
"github.com/TeaOSLab/EdgeAdmin/internal/web/helpers"
"github.com/iwind/TeaGo"
)
func init() {
TeaGo.BeforeStart(func(server *TeaGo.Server) {
server.
Helper(plus.NewHelper(plus.ComponentCodeFinance)).
Helper(helpers.NewUserMustAuth(configloaders.AdminModuleCodeFinance)).
Data("teaMenu", "finance").
Data("teaSubMenu", "package").
// 流量包
Prefix("/finance/packages").
Get("", new(IndexAction)).
GetPost("/createPopup", new(CreatePopupAction)).
GetPost("/updatePopup", new(UpdatePopupAction)).
Post("/delete", new(DeleteAction)).
GetPost("/updatePricesPopup", new(UpdatePricesPopupAction)).
Post("/updatePrice", new(UpdatePriceAction)).
// 流量包有效期
Prefix("/finance/packages/periods").
Get("", new(periods.IndexAction)).
GetPost("/createPopup", new(periods.CreatePopupAction)).
// 流量包有效期详情
Prefix("/finance/packages/periods/period").
GetPost("/updatePopup", new(period.UpdatePopupAction)).
Post("/delete", new(period.DeleteAction)).
// 用户流量包
Prefix("/finance/packages/user-packages").
Get("", new(userpackages.IndexAction)).
GetPost("/createPopup", new(userpackages.CreatePopupAction)).
Post("/price", new(userpackages.PriceAction)).
Post("/delete", new(userpackages.DeleteAction)).
//
EndAll()
})
}

View File

@@ -0,0 +1,52 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package periods
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/actions"
)
type CreatePopupAction struct {
actionutils.ParentAction
}
func (this *CreatePopupAction) Init() {
this.Nav("", "", "")
}
func (this *CreatePopupAction) RunGet(params struct{}) {
this.Show()
}
func (this *CreatePopupAction) RunPost(params struct {
Count int32
Unit string
Must *actions.Must
CSRF *actionutils.CSRF
}) {
var periodId int64
defer func() {
this.CreateLogInfo(codes.TrafficPackagePeriod_LogCreateTrafficPackagePeriod, periodId)
}()
if params.Count <= 0 {
this.FailField("count", "请输入有效期数量")
}
createResp, err := this.RPC().TrafficPackagePeriodRPC().CreateTrafficPackagePeriod(this.AdminContext(), &pb.CreateTrafficPackagePeriodRequest{
Count: params.Count,
Unit: params.Unit,
})
if err != nil {
this.ErrorPage(err)
return
}
periodId = createResp.TrafficPackagePeriodId
this.Success()
}

View File

@@ -0,0 +1,49 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package periods
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/finance/financeutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/maps"
)
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.Nav("", "", "period")
}
func (this *IndexAction) RunGet(params struct{}) {
// 是否已启用
config, err := financeutils.ReadPriceConfig(this.AdminContext())
if err != nil {
this.ErrorPage(err)
return
}
this.Data["enableTrafficPackages"] = config != nil && config.EnableTrafficPackages
// 所有有效期
periodsResp, err := this.RPC().TrafficPackagePeriodRPC().FindAllTrafficPackagePeriods(this.AdminContext(), &pb.FindAllTrafficPackagePeriodsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
var periodMaps = []maps.Map{}
for _, period := range periodsResp.TrafficPackagePeriods {
periodMaps = append(periodMaps, maps.Map{
"id": period.Id,
"count": period.Count,
"unit": period.Unit,
"unitName": userconfigs.TrafficPackagePeriodUnitName(period.Unit),
"isOn": period.IsOn,
})
}
this.Data["periods"] = periodMaps
this.Show()
}

View File

@@ -0,0 +1,27 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package period
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type DeleteAction struct {
actionutils.ParentAction
}
func (this *DeleteAction) RunPost(params struct {
PeriodId int64
}) {
defer this.CreateLogInfo(codes.TrafficPackagePeriod_LogDeleteTrafficPackagePeriod, params.PeriodId)
_, err := this.RPC().TrafficPackagePeriodRPC().DeleteTrafficPackagePeriod(this.AdminContext(), &pb.DeleteTrafficPackagePeriodRequest{TrafficPackagePeriodId: params.PeriodId})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,64 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package period
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
)
type UpdatePopupAction struct {
actionutils.ParentAction
}
func (this *UpdatePopupAction) Init() {
this.Nav("", "", "")
}
func (this *UpdatePopupAction) RunGet(params struct {
PeriodId int64
}) {
periodResp, err := this.RPC().TrafficPackagePeriodRPC().FindTrafficPackagePeriod(this.AdminContext(), &pb.FindTrafficPackagePeriodRequest{TrafficPackagePeriodId: params.PeriodId})
if err != nil {
this.ErrorPage(err)
return
}
var period = periodResp.TrafficPackagePeriod
if period == nil {
this.NotFound("trafficPackagePeriod", params.PeriodId)
return
}
this.Data["period"] = maps.Map{
"id": period.Id,
"count": period.Count,
"unitName": userconfigs.PricePeriodName(period.Unit),
"isOn": period.IsOn,
}
this.Show()
}
func (this *UpdatePopupAction) RunPost(params struct {
PeriodId int64
IsOn bool
Must *actions.Must
CSRF *actionutils.CSRF
}) {
defer this.CreateLogInfo(codes.TrafficPackagePeriod_LogUpdateTrafficPackagePeriod, params.PeriodId)
_, err := this.RPC().TrafficPackagePeriodRPC().UpdateTrafficPackagePeriod(this.AdminContext(), &pb.UpdateTrafficPackagePeriodRequest{
TrafficPackagePeriodId: params.PeriodId,
IsOn: params.IsOn,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,65 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
"strings"
)
type UpdatePopupAction struct {
actionutils.ParentAction
}
func (this *UpdatePopupAction) Init() {
this.Nav("", "", "")
}
func (this *UpdatePopupAction) RunGet(params struct {
PackageId int64
}) {
packageResp, err := this.RPC().TrafficPackageRPC().FindTrafficPackage(this.AdminContext(), &pb.FindTrafficPackageRequest{TrafficPackageId: params.PackageId})
if err != nil {
this.ErrorPage(err)
return
}
var p = packageResp.TrafficPackage
if p == nil {
this.NotFound("trafficPackage", params.PackageId)
return
}
this.Data["package"] = maps.Map{
"id": p.Id,
"size": p.Size,
"unit": strings.ToUpper(p.Unit),
"isOn": p.IsOn,
}
this.Show()
}
func (this *UpdatePopupAction) RunPost(params struct {
PackageId int64
IsOn bool
Must *actions.Must
CSRF *actionutils.CSRF
}) {
defer this.CreateLogInfo(codes.TrafficPackage_LogUpdateTrafficPackage, params.PackageId)
_, err := this.RPC().TrafficPackageRPC().UpdateTrafficPackage(this.AdminContext(), &pb.UpdateTrafficPackageRequest{
TrafficPackageId: params.PackageId,
IsOn: params.IsOn,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,35 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type UpdatePriceAction struct {
actionutils.ParentAction
}
func (this *UpdatePriceAction) RunPost(params struct {
PackageId int64
RegionId int64
PeriodId int64
Price float64
}) {
defer this.CreateLogInfo(codes.TrafficPackagePrice_LogUpdateTrafficPackagePrice, params.PackageId, params.RegionId, params.PeriodId)
_, err := this.RPC().TrafficPackagePriceRPC().UpdateTrafficPackagePrice(this.AdminContext(), &pb.UpdateTrafficPackagePriceRequest{
TrafficPackageId: params.PackageId,
NodeRegionId: params.RegionId,
TrafficPackagePeriodId: params.PeriodId,
Price: params.Price,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,88 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package packages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
"strings"
)
type UpdatePricesPopupAction struct {
actionutils.ParentAction
}
func (this *UpdatePricesPopupAction) Init() {
this.Nav("", "", "")
}
func (this *UpdatePricesPopupAction) RunGet(params struct {
PackageId int64
}) {
packageResp, err := this.RPC().TrafficPackageRPC().FindTrafficPackage(this.AdminContext(), &pb.FindTrafficPackageRequest{
TrafficPackageId: params.PackageId,
})
if err != nil {
this.ErrorPage(err)
return
}
var p = packageResp.TrafficPackage
if p == nil {
this.NotFound("trafficPackage", params.PackageId)
return
}
this.Data["package"] = maps.Map{
"id": p.Id,
"size": p.Size,
"unit": strings.ToUpper(p.Unit),
}
// 所有区域
regionsResp, err := this.RPC().NodeRegionRPC().FindAllAvailableNodeRegions(this.AdminContext(), &pb.FindAllAvailableNodeRegionsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
var regionMaps = []maps.Map{}
for _, region := range regionsResp.NodeRegions {
regionMaps = append(regionMaps, maps.Map{
"id": region.Id,
"name": region.Name,
})
}
this.Data["regions"] = regionMaps
// 有效期
periodsResp, err := this.RPC().TrafficPackagePeriodRPC().FindAllAvailableTrafficPackagePeriods(this.AdminContext(), &pb.FindAllAvailableTrafficPackagePeriodsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
var periodMaps = []maps.Map{}
for _, period := range periodsResp.TrafficPackagePeriods {
periodMaps = append(periodMaps, maps.Map{
"id": period.Id,
"name": types.String(period.Count) + userconfigs.TrafficPackagePeriodUnitName(period.Unit),
})
}
this.Data["periods"] = periodMaps
// 所有价格
pricesResp, err := this.RPC().TrafficPackagePriceRPC().FindTrafficPackagePrices(this.AdminContext(), &pb.FindTrafficPackagePricesRequest{TrafficPackageId: params.PackageId})
if err != nil {
this.ErrorPage(err)
return
}
var priceMap = map[string]float64{} // regionId@periodId => price
for _, price := range pricesResp.TrafficPackagePrices {
priceMap[types.String(price.NodeRegionId)+"@"+types.String(price.TrafficPackagePeriodId)] = price.Price
}
this.Data["prices"] = priceMap
this.Show()
}

View File

@@ -0,0 +1,171 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package userpackages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types"
)
type CreatePopupAction struct {
actionutils.ParentAction
}
func (this *CreatePopupAction) Init() {
this.Nav("", "", "")
}
func (this *CreatePopupAction) RunGet(params struct{}) {
// 价格
pricesResp, err := this.RPC().TrafficPackagePriceRPC().FindAllTrafficPackagePrices(this.AdminContext(), &pb.FindAllTrafficPackagePricesRequest{})
if err != nil {
this.ErrorPage(err)
return
}
var priceMap = map[string]float64{} // packageId@regionId@periodId => price
var allPackageIdMap = map[int64]bool{}
var allRegionIdMap = map[int64]bool{}
var allPeriodIdMap = map[int64]bool{}
for _, price := range pricesResp.TrafficPackagePrices {
if price.Price > 0 {
allPackageIdMap[price.TrafficPackageId] = true
allRegionIdMap[price.NodeRegionId] = true
allPeriodIdMap[price.TrafficPackagePeriodId] = true
var key = types.String(price.TrafficPackageId) + "@" + types.String(price.NodeRegionId) + "@" + types.String(price.TrafficPackagePeriodId)
priceMap[key] = price.Price
}
}
this.Data["prices"] = priceMap
// 流量包
var packageMaps = []maps.Map{}
packagesResp, err := this.RPC().TrafficPackageRPC().FindAllAvailableTrafficPackages(this.AdminContext(), &pb.FindAllAvailableTrafficPackagesRequest{})
if err != nil {
this.ErrorPage(err)
return
}
for _, p := range packagesResp.TrafficPackages {
_, hasPrice := allPackageIdMap[p.Id]
if hasPrice {
packageMaps = append(packageMaps, maps.Map{
"id": p.Id,
"size": p.Size,
"unit": p.Unit,
})
}
}
this.Data["packages"] = packageMaps
// 区域
var regionMaps = []maps.Map{}
regionsResp, err := this.RPC().NodeRegionRPC().FindAllAvailableNodeRegions(this.AdminContext(), &pb.FindAllAvailableNodeRegionsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
for _, region := range regionsResp.NodeRegions {
_, hasPrice := allRegionIdMap[region.Id]
if hasPrice {
regionMaps = append(regionMaps, maps.Map{
"id": region.Id,
"name": region.Name,
})
}
}
this.Data["regions"] = regionMaps
// 周期
var periodMaps = []maps.Map{}
periodResp, err := this.RPC().TrafficPackagePeriodRPC().FindAllAvailableTrafficPackagePeriods(this.AdminContext(), &pb.FindAllAvailableTrafficPackagePeriodsRequest{})
if err != nil {
this.ErrorPage(err)
return
}
for _, period := range periodResp.TrafficPackagePeriods {
_, hasPrice := allPeriodIdMap[period.Id]
if hasPrice {
periodMaps = append(periodMaps, maps.Map{
"id": period.Id,
"count": period.Count,
"unit": period.Unit,
"unitName": userconfigs.TrafficPackagePeriodUnitName(period.Unit),
})
}
}
this.Data["periods"] = periodMaps
this.Show()
}
func (this *CreatePopupAction) RunPost(params struct {
UserId int64
PackageId int64
RegionId int64
PeriodId int64
Count int32
Must *actions.Must
CSRF *actionutils.CSRF
}) {
defer this.CreateLogInfo(codes.UserTrafficPackage_LogCreateUserTrafficPackage, params.UserId, params.PackageId, params.RegionId, params.PeriodId, params.Count)
if params.UserId <= 0 {
this.Fail("请选择用户")
return
}
if params.PackageId <= 0 {
this.Fail("请选择流量包规格")
return
}
if params.RegionId <= 0 {
this.Fail("请选择区域")
return
}
if params.PeriodId <= 0 {
this.Fail("请选择有效期")
return
}
if params.Count <= 0 {
this.Fail("请选择流量包数量")
return
}
resp, err := this.RPC().TrafficPackagePriceRPC().FindTrafficPackagePrice(this.AdminContext(), &pb.FindTrafficPackagePriceRequest{
TrafficPackageId: params.PackageId,
NodeRegionId: params.RegionId,
TrafficPackagePeriodId: params.PeriodId,
Count: params.Count,
})
if err != nil {
this.ErrorPage(err)
return
}
if resp.Price == 0 {
this.Fail("当前所选条件下的流量包不可用")
return
}
_, err = this.RPC().UserTrafficPackageRPC().CreateUserTrafficPackage(this.AdminContext(), &pb.CreateUserTrafficPackageRequest{
UserId: params.UserId,
TrafficPackageId: params.PackageId,
NodeRegionId: params.RegionId,
TrafficPackagePeriodId: params.PeriodId,
Count: params.Count,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,27 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package userpackages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/langs/codes"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type DeleteAction struct {
actionutils.ParentAction
}
func (this *DeleteAction) RunPost(params struct {
UserPackageId int64
}) {
defer this.CreateLogInfo(codes.UserTrafficPackage_LogDeleteUserTrafficPackage, params.UserPackageId)
_, err := this.RPC().UserTrafficPackageRPC().DeleteUserTrafficPackage(this.AdminContext(), &pb.DeleteUserTrafficPackageRequest{UserTrafficPackageId: params.UserPackageId})
if err != nil {
this.ErrorPage(err)
return
}
this.Success()
}

View File

@@ -0,0 +1,110 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package userpackages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/utils/dateutils"
"github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils"
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/maps"
timeutil "github.com/iwind/TeaGo/utils/time"
)
type IndexAction struct {
actionutils.ParentAction
}
func (this *IndexAction) Init() {
this.Nav("", "", "userPackage")
}
func (this *IndexAction) RunGet(params struct {
UserId int64
RegionId int64
PackageId int64
PeriodId int64
}) {
countResp, err := this.RPC().UserTrafficPackageRPC().CountUserTrafficPackages(this.AdminContext(), &pb.CountUserTrafficPackagesRequest{
TrafficPackageId: params.PackageId,
NodeRegionId: params.RegionId,
UserId: params.UserId,
ExpiresDay: "",
TrafficPackagePeriodId: params.PeriodId,
})
if err != nil {
this.ErrorPage(err)
return
}
var count = countResp.Count
var page = this.NewPage(count)
this.Data["page"] = page.AsHTML()
userPackagesResp, err := this.RPC().UserTrafficPackageRPC().ListUserTrafficPackages(this.AdminContext(), &pb.ListUserTrafficPackagesRequest{
TrafficPackageId: params.PackageId,
UserId: params.UserId,
NodeRegionId: params.RegionId,
TrafficPackagePeriodId: params.PeriodId,
ExpiresDay: "",
AvailableOnly: false,
Offset: page.Offset,
Size: page.Size,
})
if err != nil {
this.ErrorPage(err)
return
}
var userPackageMaps = []maps.Map{}
for _, userPackage := range userPackagesResp.UserTrafficPackages {
// user
var userMap maps.Map
if userPackage.User != nil {
userMap = maps.Map{
"id": userPackage.User.Id,
"username": userPackage.User.Username,
"fullname": userPackage.User.Fullname,
}
}
// package
var packageMap maps.Map
if userPackage.TrafficPackage != nil {
packageMap = maps.Map{
"id": userPackage.TrafficPackage.Id,
"size": userPackage.TrafficPackage.Size,
"unit": userPackage.TrafficPackage.Unit,
}
}
// region
var regionMap maps.Map
if userPackage.NodeRegion != nil {
regionMap = maps.Map{
"id": userPackage.NodeRegion.Id,
"name": userPackage.NodeRegion.Name,
}
}
userPackageMaps = append(userPackageMaps, maps.Map{
"id": userPackage.Id,
"dayFrom": dateutils.SplitYmd(userPackage.DayFrom),
"dayTo": dateutils.SplitYmd(userPackage.DayTo),
"user": userMap,
"package": packageMap,
"region": regionMap,
"createdTime": timeutil.FormatTime("Y-m-d H:i:s", userPackage.CreatedAt),
"periodCount": userPackage.TrafficPackagePeriodCount,
"periodUnitName": userconfigs.TrafficPackagePeriodUnitName(userPackage.TrafficPackagePeriodUnit),
"usedSize": numberutils.FormatBytes(userPackage.UsedBytes),
"availableSize": numberutils.FormatBytes(userPackage.TotalBytes - userPackage.UsedBytes),
"canDelete": userPackage.CanDelete,
"isExpired": userPackage.DayTo < timeutil.Format("Ymd"),
"isUsedAll": userPackage.UsedBytes >= userPackage.TotalBytes,
})
}
this.Data["userPackages"] = userPackageMaps
this.Show()
}

View File

@@ -0,0 +1,41 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package userpackages
import (
"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
)
type PriceAction struct {
actionutils.ParentAction
}
func (this *PriceAction) RunPost(params struct {
PackageId int64
RegionId int64
PeriodId int64
Count int32
}) {
if params.PackageId <= 0 || params.RegionId <= 0 || params.PeriodId <= 0 || params.Count <= 0 {
this.Data["price"] = 0
this.Data["amount"] = 0
this.Success()
return
}
resp, err := this.RPC().TrafficPackagePriceRPC().FindTrafficPackagePrice(this.AdminContext(), &pb.FindTrafficPackagePriceRequest{
TrafficPackageId: params.PackageId,
NodeRegionId: params.RegionId,
TrafficPackagePeriodId: params.PeriodId,
Count: params.Count,
})
if err != nil {
this.ErrorPage(err)
return
}
this.Data["price"] = resp.Price
this.Data["amount"] = resp.Amount
this.Success()
}