diff --git a/web/src/components/LogContent.vue b/web/src/components/LogContent.vue
new file mode 100644
index 0000000..6dd321a
--- /dev/null
+++ b/web/src/components/LogContent.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+ {{ loadingText }}
+
+
+
+
+
+
+
+
{{ emptyTitle }}
+
+ {{ emptyDescription }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/LogDetailCard.vue b/web/src/components/LogDetailCard.vue
new file mode 100644
index 0000000..2c89394
--- /dev/null
+++ b/web/src/components/LogDetailCard.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+ {{ log.status }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 任务名称
+ {{ log.task_name }}
+
+
+
状态
+
+
+
+
+
+
+
+
+
{{ log.status === TASK_STATUS.SUCCESS ? 'SUCCESS' : log.status }}
+
+
+
+
+ 耗时
+ {{ formatDuration(log.duration) }}
+
+
+ 开始时间
+ {{ log.start_time || '-' }}
+
+
+ 结束时间
+ {{ log.end_time || '-' }}
+
+
+ 执行命令
+
+ {{ log.command }}
+
+
+
+
+
+
+
+
+
+
+ 系统错误
+
+
+ {{ log.error }}
+
+
+
+
+
+ 日志输出
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/views/history/History.vue b/web/src/views/history/History.vue
index f732ff4..4df790b 100644
--- a/web/src/views/history/History.vue
+++ b/web/src/views/history/History.vue
@@ -7,13 +7,12 @@ import { Input } from '@/components/ui/input'
import Pagination from '@/components/Pagination.vue'
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
import LogViewer from './LogViewer.vue'
-import Ansi from 'ansi-to-vue3'
import {
- RefreshCw, X, Search, Maximize2, GitBranch, Terminal,
- CheckCircle2, XCircle, AlertCircle, Ban, Clock, Zap as ZapIcon, Check, Trash2
+ RefreshCw, X, Search, GitBranch, Terminal,
+ AlertCircle, Ban, Clock, Zap as ZapIcon, Check, Trash2
} from 'lucide-vue-next'
import { api, type TaskLog } from '@/api'
-import { Badge } from '@/components/ui/badge'
+import LogDetailCard from '@/components/LogDetailCard.vue'
import {
AlertDialog,
AlertDialogAction,
@@ -282,24 +281,7 @@ async function handleDeleteLog() {
}
}
-function getStatusBadgeClass(status: string) {
- switch (status) {
- case TASK_STATUS.SUCCESS:
- return 'bg-green-500/10 text-green-600 border-green-500/20 dark:bg-green-500/20 dark:text-green-400 dark:border-green-500/30 shadow-[0_0_8px_-2px_rgba(34,197,94,0.15)]'
- case TASK_STATUS.FAILED:
- return 'bg-red-500/10 text-red-600 border-red-500/20 dark:bg-red-500/20 dark:text-red-400 dark:border-red-500/30'
- case TASK_STATUS.RUNNING:
- return 'bg-blue-500/10 text-blue-600 border-blue-500/20 dark:bg-blue-500/20 dark:text-blue-400 dark:border-blue-500/30'
- case TASK_STATUS.PENDING:
- return 'bg-amber-500/10 text-amber-600 border-amber-500/20 dark:bg-amber-500/20 dark:text-amber-400 dark:border-amber-500/30'
- case TASK_STATUS.TIMEOUT:
- return 'bg-orange-500/10 text-orange-600 border-orange-500/20 dark:bg-orange-500/20 dark:text-orange-400 dark:border-orange-500/30'
- case TASK_STATUS.CANCELLED:
- return 'bg-muted/50 text-muted-foreground border-muted-foreground/10'
- default:
- return 'bg-secondary text-secondary-foreground border-transparent'
- }
-}
+
function getTaskTypeTitle(type: string) {
return type === TASK_TYPE.REPO ? '仓库同步' : '普通任务'
@@ -505,115 +487,23 @@ watch(() => route.query, (newQuery) => {
-
-
- 日志详情
-
-
-
-
-
-
-
-
-
- 任务名称
- {{ selectedLog.task_name }}
-
-
-
状态
-
-
-
-
-
-
-
-
-
{{ selectedLog.status === TASK_STATUS.SUCCESS ? 'SUCCESS' : selectedLog.status }}
-
-
-
-
- 耗时
- {{ formatDuration(selectedLog.duration) }}
-
-
- 开始时间
- {{ selectedLog.start_time || '-' }}
-
-
- 结束时间
- {{ selectedLog.end_time || '-' }}
-
-
- 执行命令
-
- {{ selectedLog.command }}
-
-
-
-
-
-
-
- 系统错误
-
-
- {{ selectedLog.error }}
-
-
-
- 日志输出
-
-
-
-
-
-
-
-
-
-
无输出内容
-
此任务执行期间未产生标准输出日志
-
-
-
-
-
{{ decompressedOutput }}
-
-
-
-
+
-
+
diff --git a/web/src/views/history/LogViewer.vue b/web/src/views/history/LogViewer.vue
index 1be6162..242f59e 100644
--- a/web/src/views/history/LogViewer.vue
+++ b/web/src/views/history/LogViewer.vue
@@ -1,56 +1,30 @@