+
()
const logBox = ref()
+const statsLoading = ref(true)
const detailedStats = ref({
input_images: 0,
@@ -260,12 +274,6 @@ const stats = computed(() => [
},
])
-function fmtSize(b: number): string {
- if (b < 1024) return b + ' B'
- if (b < 1048576) return (b / 1024).toFixed(1) + ' KB'
- return (b / 1048576).toFixed(1) + ' MB'
-}
-
function fmtTime(i: number): string {
const d = new Date()
d.setSeconds(d.getSeconds() - (logs.value.length - i))
@@ -283,11 +291,14 @@ function clearLogs(): void {
}
async function refreshStats(): Promise {
+ statsLoading.value = true
try {
const res = await api.get('/files/stats/detailed')
detailedStats.value = res.data
} catch {
// silent
+ } finally {
+ statsLoading.value = false
}
}
@@ -328,6 +339,7 @@ async function upload(files: File[]): Promise {
uploading.value = true
uploadPct.value = 0
const uploadedFiles: { name: string; type: string }[] = []
+ const failedFiles: string[] = []
for (let i = 0; i < files.length; i++) {
const file = files[i]
uploadingName.value = file.name
@@ -344,9 +356,8 @@ async function upload(files: File[]): Promise {
})
const typeLabel = getFileTypeLabel(file.name)
uploadedFiles.push({ name: file.name, type: typeLabel })
- ElMessage.success(`${file.name} → ${typeLabel === 'OCR' ? '全流程处理队列' : 'Excel处理队列'}`)
} catch (err: any) {
- ElMessage.error(`上传失败: ${file.name}`)
+ failedFiles.push(file.name)
}
}
uploading.value = false
@@ -354,15 +365,21 @@ async function upload(files: File[]): Promise {
uploadPct.value = 0
refreshStats()
+ // Show upload results
+ if (uploadedFiles.length > 0) {
+ ElMessage.success(`${uploadedFiles.length} 个文件上传成功`)
+ }
+ if (failedFiles.length > 0) {
+ ElMessage.error(`${failedFiles.length} 个文件上传失败: ${failedFiles.join(', ')}`)
+ }
+
// Auto-process: pipeline for images, excel for Excel files
if (uploadedFiles.length > 0) {
const hasImages = uploadedFiles.some(f => f.type === 'OCR')
const hasExcel = uploadedFiles.some(f => f.type === 'Excel')
if (hasImages) {
- ElMessage.info('自动启动一键全流程...')
await doAction('/processing/pipeline')
} else if (hasExcel) {
- ElMessage.info('自动启动Excel处理...')
await doAction('/processing/excel')
}
}
diff --git a/web/frontend/src/views/Layout.vue b/web/frontend/src/views/Layout.vue
index b2e642e..6118ec6 100644
--- a/web/frontend/src/views/Layout.vue
+++ b/web/frontend/src/views/Layout.vue
@@ -86,6 +86,11 @@
{{ pageTitle }}
+
+
+
+ 离线
+
{{ (authStore.username || 'U')[0].toUpperCase() }}
@@ -135,7 +140,7 @@