chore: update cmd task visual format
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/engigu/baihu-panel/internal/bootstrap"
|
"github.com/engigu/baihu-panel/internal/bootstrap"
|
||||||
"github.com/engigu/baihu-panel/internal/services"
|
"github.com/engigu/baihu-panel/internal/services"
|
||||||
@@ -43,3 +44,46 @@ func PrintSubCommandUsage(title, usageStr, exampleStr string, fs *flag.FlagSet)
|
|||||||
fmt.Fprintf(os.Stderr, "%s\n\n", exampleStr)
|
fmt.Fprintf(os.Stderr, "%s\n\n", exampleStr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VisualFormat 根据字符的视觉显示列宽(中文字符/宽字符计为2列,ASCII计为1列),
|
||||||
|
// 将字符串进行精确等宽填充或安全截断追加 "..",确保混合字符输出下控制台表格严丝合缝强制对齐。
|
||||||
|
func VisualFormat(s string, targetVisualWidth int) string {
|
||||||
|
w := 0
|
||||||
|
var sb strings.Builder
|
||||||
|
runes := []rune(s)
|
||||||
|
|
||||||
|
// 先计算总视觉宽度
|
||||||
|
totalW := 0
|
||||||
|
for _, r := range runes {
|
||||||
|
if r > 127 {
|
||||||
|
totalW += 2
|
||||||
|
} else {
|
||||||
|
totalW += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if totalW <= targetVisualWidth {
|
||||||
|
return s + strings.Repeat(" ", targetVisualWidth-totalW)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果总宽度超出,进行精准截断并追加 ".."
|
||||||
|
maxContentW := targetVisualWidth - 2
|
||||||
|
for _, r := range runes {
|
||||||
|
rw := 1
|
||||||
|
if r > 127 {
|
||||||
|
rw = 2
|
||||||
|
}
|
||||||
|
if w+rw > maxContentW {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
sb.WriteRune(r)
|
||||||
|
w += rw
|
||||||
|
}
|
||||||
|
|
||||||
|
res := sb.String() + ".."
|
||||||
|
// 补齐末尾可能相差的1个空格列宽
|
||||||
|
if w+2 < targetVisualWidth {
|
||||||
|
res += strings.Repeat(" ", targetVisualWidth-(w+2))
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|||||||
+17
-10
@@ -136,15 +136,16 @@ func runList(args []string) {
|
|||||||
var tasks []models.Task
|
var tasks []models.Task
|
||||||
query.Order("created_at DESC").Limit(*sizePtr).Offset(offset).Find(&tasks)
|
query.Order("created_at DESC").Limit(*sizePtr).Offset(offset).Find(&tasks)
|
||||||
|
|
||||||
fmt.Println("====================================================================================================")
|
fmt.Println(strings.Repeat("=", 90))
|
||||||
fmt.Printf("%-12s | %-25s | %-18s | %-8s | %-6s\n", "任务ID", "任务名称", "Cron规则", "类型", "状态")
|
fmt.Printf("%s | %s | %s | %s | %s\n",
|
||||||
fmt.Println("----------------------------------------------------------------------------------------------------")
|
clibase.VisualFormat("任务ID", 20),
|
||||||
|
clibase.VisualFormat("任务名称", 28),
|
||||||
|
clibase.VisualFormat("Cron规则", 18),
|
||||||
|
clibase.VisualFormat("类型", 6),
|
||||||
|
clibase.VisualFormat("状态", 6),
|
||||||
|
)
|
||||||
|
fmt.Println(strings.Repeat("-", 90))
|
||||||
for _, t := range tasks {
|
for _, t := range tasks {
|
||||||
name := t.Name
|
|
||||||
// 截断过长名称以对齐
|
|
||||||
if len(name) > 22 {
|
|
||||||
name = string([]rune(name)[:20]) + ".."
|
|
||||||
}
|
|
||||||
cron := t.Schedule
|
cron := t.Schedule
|
||||||
if cron == "" {
|
if cron == "" {
|
||||||
cron = "-"
|
cron = "-"
|
||||||
@@ -153,9 +154,15 @@ func runList(args []string) {
|
|||||||
if !utils.DerefBool(t.Enabled, true) {
|
if !utils.DerefBool(t.Enabled, true) {
|
||||||
status = "禁用"
|
status = "禁用"
|
||||||
}
|
}
|
||||||
fmt.Printf("%-12s | %-25s | %-18s | %-8s | %-6s\n", t.ID, name, cron, t.Type, status)
|
fmt.Printf("%s | %s | %s | %s | %s\n",
|
||||||
|
clibase.VisualFormat(t.ID, 20),
|
||||||
|
clibase.VisualFormat(t.Name, 28),
|
||||||
|
clibase.VisualFormat(cron, 18),
|
||||||
|
clibase.VisualFormat(t.Type, 6),
|
||||||
|
clibase.VisualFormat(status, 6),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
fmt.Println("====================================================================================================")
|
fmt.Println(strings.Repeat("=", 90))
|
||||||
totalPages := (total + int64(*sizePtr) - 1) / int64(*sizePtr)
|
totalPages := (total + int64(*sizePtr) - 1) / int64(*sizePtr)
|
||||||
if totalPages == 0 {
|
if totalPages == 0 {
|
||||||
totalPages = 1
|
totalPages = 1
|
||||||
|
|||||||
Reference in New Issue
Block a user