diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 28884b9b..756e4262 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -107,6 +107,10 @@ func (this *RPCClient) DBNodeRPC() pb.DBNodeServiceClient { return pb.NewDBNodeServiceClient(this.pickConn()) } +func (this *RPCClient) DBRPC() pb.DBServiceClient { + return pb.NewDBServiceClient(this.pickConn()) +} + func (this *RPCClient) OriginRPC() pb.OriginServiceClient { return pb.NewOriginServiceClient(this.pickConn()) } diff --git a/internal/utils/numberutils/utils.go b/internal/utils/numberutils/utils.go index b7cd4b35..ca022a98 100644 --- a/internal/utils/numberutils/utils.go +++ b/internal/utils/numberutils/utils.go @@ -1,6 +1,9 @@ package numberutils -import "strconv" +import ( + "fmt" + "strconv" +) func FormatInt64(value int64) string { return strconv.FormatInt(value, 10) @@ -9,3 +12,17 @@ func FormatInt64(value int64) string { func FormatInt(value int) string { return strconv.Itoa(value) } + +func FormatBytes(bytes int64) string { + if bytes < 1024 { + return FormatInt64(bytes) + "B" + } else if bytes < 1024*1024 { + return fmt.Sprintf("%.2fK", float64(bytes)/1024) + } else if bytes < 1024*1024*1024 { + return fmt.Sprintf("%.2fM", float64(bytes)/1024/1024) + } else if bytes < 1024*1024*1024*1024 { + return fmt.Sprintf("%.2fG", float64(bytes)/1024/1024/1024) + } else { + return fmt.Sprintf("%.2fP", float64(bytes)/1024/1024/1024/1024) + } +} diff --git a/internal/web/actions/default/settings/database/clean.go b/internal/web/actions/default/settings/database/clean.go index 3bec1f33..f8cf05ec 100644 --- a/internal/web/actions/default/settings/database/clean.go +++ b/internal/web/actions/default/settings/database/clean.go @@ -1,6 +1,12 @@ package profile -import "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/utils/numberutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/actions" + "github.com/iwind/TeaGo/maps" +) type CleanAction struct { actionutils.ParentAction @@ -13,3 +19,30 @@ func (this *CleanAction) Init() { func (this *CleanAction) RunGet(params struct{}) { this.Show() } + +func (this *CleanAction) RunPost(params struct { + Must *actions.Must +}) { + tablesResp, err := this.RPC().DBRPC().FindAllDBTables(this.AdminContext(), &pb.FindAllDBTablesRequest{}) + if err != nil { + this.ErrorPage(err) + return + } + + tableMaps := []maps.Map{} + for _, table := range tablesResp.DbTables { + if !table.IsBaseTable || (!table.CanClean && !table.CanDelete) { + continue + } + tableMaps = append(tableMaps, maps.Map{ + "name": table.Name, + "rows": table.Rows, + "size": numberutils.FormatBytes(table.DataLength + table.IndexLength), + "canDelete": table.CanDelete, + "canClean": table.CanClean, + "comment": table.Comment, + }) + } + this.Data["tables"] = tableMaps + this.Success() +} diff --git a/internal/web/actions/default/settings/database/deleteTable.go b/internal/web/actions/default/settings/database/deleteTable.go new file mode 100644 index 00000000..329f8ef1 --- /dev/null +++ b/internal/web/actions/default/settings/database/deleteTable.go @@ -0,0 +1,23 @@ +package profile + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type DeleteTableAction struct { + actionutils.ParentAction +} + +func (this *DeleteTableAction) RunPost(params struct { + Table string +}) { + defer this.CreateLogInfo("删除数据表 %s", params.Table) + + _, err := this.RPC().DBRPC().DeleteDBTable(this.AdminContext(), &pb.DeleteDBTableRequest{DbTable: params.Table}) + if err != nil { + this.ErrorPage(err) + return + } + this.Success() +} diff --git a/internal/web/actions/default/settings/database/init.go b/internal/web/actions/default/settings/database/init.go index e497799a..2d932834 100644 --- a/internal/web/actions/default/settings/database/init.go +++ b/internal/web/actions/default/settings/database/init.go @@ -17,6 +17,8 @@ func init() { GetPost("/update", new(UpdateAction)). GetPost("/clean", new(CleanAction)). GetPost("/cleanSetting", new(CleanSettingAction)). + GetPost("/truncateTable", new(TruncateTableAction)). + GetPost("/deleteTable", new(DeleteTableAction)). EndAll() }) } diff --git a/internal/web/actions/default/settings/database/truncateTable.go b/internal/web/actions/default/settings/database/truncateTable.go new file mode 100644 index 00000000..282f0ab7 --- /dev/null +++ b/internal/web/actions/default/settings/database/truncateTable.go @@ -0,0 +1,23 @@ +package profile + +import ( + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" +) + +type TruncateTableAction struct { + actionutils.ParentAction +} + +func (this *TruncateTableAction) RunPost(params struct { + Table string +}) { + defer this.CreateLogInfo("清空数据表 %s 数据", params.Table) + + _, err := this.RPC().DBRPC().TruncateDBTable(this.AdminContext(), &pb.TruncateDBTableRequest{DbTable: params.Table}) + if err != nil { + this.ErrorPage(err) + return + } + this.Success() +} diff --git a/web/views/@default/settings/database/clean.html b/web/views/@default/settings/database/clean.html index e896c845..e9d30ee8 100644 --- a/web/views/@default/settings/database/clean.html +++ b/web/views/@default/settings/database/clean.html @@ -1,2 +1,24 @@ {$layout} -{$template "menu"} \ No newline at end of file +{$template "menu"} + +
+ +| 表名 | +占用空间 | +用途 | +操作 | +
|---|---|---|---|
| {{table.name}} | +{{table.size}} | +{{table.comment}} | ++ 删除 + 清空 + | +