feat(data-process): 优化上传切分流程与PDF高亮预览

This commit is contained in:
caoxiaozhu
2026-07-24 11:28:02 +08:00
parent 33d0ed2e01
commit ad64e44860
18 changed files with 1940 additions and 395 deletions

View File

@@ -1,5 +1,6 @@
<script setup lang="ts">
import { computed, nextTick, ref, watch } from 'vue'
import PdfSourceViewer from './PdfSourceViewer.vue'
import { sourceLines } from './previewModel'
import type { PreviewItem, ProcessType } from './types'
@@ -9,6 +10,8 @@ const props = defineProps<{
selectedId: string | null
processType: ProcessType
fileName: string
taskId: string | number | null
sourceFileId: string | number | null
files: { id: string; name: string; count: number; modifiedCount: number }[]
selectedFileId: string | null
}>()
@@ -31,6 +34,7 @@ const editorDraft = ref('')
const lines = computed(() => sourceLines(props.sourceText))
const selectedItem = computed(() => props.items.find((item) => item.id === props.selectedId) ?? props.items[0])
const editingItem = computed(() => props.items.find((item) => item.id === editingItemId.value))
const isPdfSource = computed(() => /\.pdf$/i.test(props.fileName))
const filteredItems = computed(() => props.items.filter((item, index) => {
const matchesSearch = !search.value.trim()
@@ -102,7 +106,7 @@ watch(selectedItem, async (item) => {
currentPage.value = Math.floor(visibleIndex / PREVIEW_PAGE_SIZE) + 1
}
if (item.sourceStart == null) return
if (isPdfSource.value || item.sourceStart == null) return
await nextTick()
const target = sourceViewerRef.value?.querySelector<HTMLElement>(`[data-source-start="${item.sourceStart}"]`)
?? sourceViewerRef.value?.querySelector<HTMLElement>('.source-line.is-highlighted')
@@ -160,7 +164,14 @@ function lineRange(item: PreviewItem) {
</div>
</div>
<div ref="sourceViewerRef" class="source-viewer" tabindex="0" aria-label="源文件内容">
<PdfSourceViewer
v-if="isPdfSource"
:task-id="taskId"
:source-file-id="sourceFileId"
:file-name="fileName"
:selected-item="selectedItem ?? null"
/>
<div v-else ref="sourceViewerRef" class="source-viewer" tabindex="0" aria-label="源文件内容">
<div
v-for="line in lines"
:key="line.number"
@@ -198,6 +209,8 @@ function lineRange(item: PreviewItem) {
:key="item.id"
class="preview-item"
:class="{ 'is-active': item.id === selectedItem?.id }"
:data-preview-id="item.id"
:aria-selected="item.id === selectedItem?.id"
role="button"
tabindex="0"
@click="selectItem(item.id)"