Skip to content

Commit 8ed050b

Browse files
committed
fix(ui): Fix Drag Upload File failed in knowlegebase
1 parent 4ccbd2a commit 8ed050b

File tree

2 files changed

+118
-123
lines changed

2 files changed

+118
-123
lines changed

frontend/src/hooks/useKnowledgeBase.ts

Lines changed: 69 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ref, reactive, onMounted } from "vue";
1+
import { ref, reactive } from "vue";
22
import { storeToRefs } from "pinia";
33
import { formatStringDate, kbFileTypeVerification } from "../utils/index";
44
import { MessagePlugin } from "tdesign-vue-next";
@@ -11,6 +11,7 @@ import {
1111
} from "@/api/knowledge-base/index";
1212
import { knowledgeStore } from "@/stores/knowledge";
1313
import { useRoute } from 'vue-router';
14+
1415
const usemenuStore = knowledgeStore();
1516
export default function (knowledgeBaseId?: string) {
1617
const route = useRoute();
@@ -23,34 +24,32 @@ export default function (knowledgeBaseId?: string) {
2324
id: "",
2425
total: 0
2526
});
26-
const getKnowled = (query = { page: 1, page_size: 35 }) => {
27-
if (!knowledgeBaseId) return;
28-
listKnowledgeFiles(knowledgeBaseId, query)
27+
const getKnowled = (query = { page: 1, page_size: 35 }, kbId?: string) => {
28+
const targetKbId = kbId || knowledgeBaseId;
29+
if (!targetKbId) return;
30+
31+
listKnowledgeFiles(targetKbId, query)
2932
.then((result: any) => {
30-
let { data, total: totalResult } = result;
31-
let cardList_ = data.map((item: any) => {
32-
item["file_name"] = item.file_name.substring(
33-
0,
34-
item.file_name.lastIndexOf(".")
35-
);
36-
return {
37-
...item,
38-
updated_at: formatStringDate(new Date(item.updated_at)),
39-
isMore: false,
40-
file_type: item.file_type.toLocaleUpperCase(),
41-
};
42-
});
43-
if (query.page == 1) {
44-
cardList.value = cardList_ as any[];
33+
const { data, total: totalResult } = result;
34+
const cardList_ = data.map((item: any) => ({
35+
...item,
36+
file_name: item.file_name.substring(0, item.file_name.lastIndexOf(".")),
37+
updated_at: formatStringDate(new Date(item.updated_at)),
38+
isMore: false,
39+
file_type: item.file_type.toLocaleUpperCase(),
40+
}));
41+
42+
if (query.page === 1) {
43+
cardList.value = cardList_;
4544
} else {
46-
(cardList.value as any[]).push(...cardList_);
45+
cardList.value.push(...cardList_);
4746
}
4847
total.value = totalResult;
4948
})
50-
.catch((_err) => {});
49+
.catch(() => {});
5150
};
5251
const delKnowledge = (index: number, item: any) => {
53-
(cardList.value as any[])[index].isMore = false;
52+
cardList.value[index].isMore = false;
5453
moreIndex.value = -1;
5554
delKnowledgeDetails(item.id)
5655
.then((result: any) => {
@@ -61,7 +60,7 @@ export default function (knowledgeBaseId?: string) {
6160
MessagePlugin.error("知识删除失败!");
6261
}
6362
})
64-
.catch((_err) => {
63+
.catch(() => {
6564
MessagePlugin.error("知识删除失败!");
6665
});
6766
};
@@ -74,63 +73,45 @@ export default function (knowledgeBaseId?: string) {
7473
}
7574
};
7675
const requestMethod = (file: any, uploadInput: any) => {
77-
if (file instanceof File && uploadInput) {
78-
if (kbFileTypeVerification(file)) {
79-
return;
80-
}
81-
// 每次上传时动态解析当前 kbId(优先:路由 -> URL -> 初始参数)
82-
let currentKbId: string | undefined;
83-
try {
84-
currentKbId = (route.params as any)?.kbId as string;
85-
} catch {}
86-
if (!currentKbId && typeof window !== 'undefined') {
87-
try {
88-
const match = window.location.pathname.match(/knowledge-bases\/([^/]+)/);
89-
if (match && match[1]) currentKbId = match[1];
90-
} catch {}
91-
}
92-
if (!currentKbId) {
93-
currentKbId = knowledgeBaseId;
94-
}
95-
if (!currentKbId) {
96-
MessagePlugin.error("缺少知识库ID");
97-
return;
98-
}
99-
uploadKnowledgeFile(currentKbId, { file })
100-
.then((result: any) => {
101-
if (result.success) {
102-
MessagePlugin.info("上传成功!");
103-
getKnowled();
104-
} else {
105-
// 改进错误信息提取逻辑
106-
let errorMessage = "上传失败!";
107-
if (result.error && result.error.message) {
108-
errorMessage = result.error.message;
109-
} else if (result.message) {
110-
errorMessage = result.message;
111-
}
112-
if (result.code === 'duplicate_file' || (result.error && result.error.code === 'duplicate_file')) {
113-
errorMessage = "文件已存在";
114-
}
115-
MessagePlugin.error(errorMessage);
116-
}
117-
uploadInput.value.value = "";
118-
})
119-
.catch((err: any) => {
120-
let errorMessage = "上传失败!";
121-
if (err.code === 'duplicate_file') {
122-
errorMessage = "文件已存在";
123-
} else if (err.error && err.error.message) {
124-
errorMessage = err.error.message;
125-
} else if (err.message) {
126-
errorMessage = err.message;
127-
}
128-
MessagePlugin.error(errorMessage);
129-
uploadInput.value.value = "";
130-
});
131-
} else {
132-
MessagePlugin.error("file文件类型错误!");
76+
if (!(file instanceof File) || !uploadInput) {
77+
MessagePlugin.error("文件类型错误!");
78+
return;
79+
}
80+
81+
if (kbFileTypeVerification(file)) {
82+
return;
83+
}
84+
85+
// 获取当前知识库ID
86+
let currentKbId: string | undefined = (route.params as any)?.kbId as string;
87+
if (!currentKbId && typeof window !== 'undefined') {
88+
const match = window.location.pathname.match(/knowledge-bases\/([^/]+)/);
89+
if (match?.[1]) currentKbId = match[1];
90+
}
91+
if (!currentKbId) {
92+
currentKbId = knowledgeBaseId;
93+
}
94+
if (!currentKbId) {
95+
MessagePlugin.error("缺少知识库ID");
96+
return;
13397
}
98+
99+
uploadKnowledgeFile(currentKbId, { file })
100+
.then((result: any) => {
101+
if (result.success) {
102+
MessagePlugin.info("上传成功!");
103+
getKnowled({ page: 1, page_size: 35 }, currentKbId);
104+
} else {
105+
const errorMessage = result.error?.message || result.message || "上传失败!";
106+
MessagePlugin.error(result.code === 'duplicate_file' ? "文件已存在" : errorMessage);
107+
}
108+
uploadInput.value.value = "";
109+
})
110+
.catch((err: any) => {
111+
const errorMessage = err.error?.message || err.message || "上传失败!";
112+
MessagePlugin.error(err.code === 'duplicate_file' ? "文件已存在" : errorMessage);
113+
uploadInput.value.value = "";
114+
});
134115
};
135116
const getCardDetails = (item: any) => {
136117
Object.assign(details, {
@@ -142,31 +123,32 @@ export default function (knowledgeBaseId?: string) {
142123
getKnowledgeDetails(item.id)
143124
.then((result: any) => {
144125
if (result.success && result.data) {
145-
let { data } = result;
126+
const { data } = result;
146127
Object.assign(details, {
147128
title: data.file_name,
148129
time: formatStringDate(new Date(data.updated_at)),
149130
id: data.id,
150131
});
151132
}
152133
})
153-
.catch((_err) => {});
154-
getfDetails(item.id, 1);
134+
.catch(() => {});
135+
getfDetails(item.id, 1);
155136
};
137+
156138
const getfDetails = (id: string, page: number) => {
157139
getKnowledgeDetailsCon(id, page)
158140
.then((result: any) => {
159141
if (result.success && result.data) {
160-
let { data, total: totalResult } = result;
161-
if (page == 1) {
162-
(details.md as any[]) = data;
142+
const { data, total: totalResult } = result;
143+
if (page === 1) {
144+
details.md = data;
163145
} else {
164-
(details.md as any[]).push(...data);
146+
details.md.push(...data);
165147
}
166148
details.total = totalResult;
167149
}
168150
})
169-
.catch((_err) => {});
151+
.catch(() => {});
170152
};
171153
return {
172154
cardList,

frontend/src/views/platform/index.vue

Lines changed: 49 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div class="main" ref="dropzone" @dragover="dragover" @drop="drop" @dragstart="dragstart">
2+
<div class="main" ref="dropzone">
33
<Menu></Menu>
44
<RouterView />
55
<div class="upload-mask" v-show="ismask">
@@ -10,34 +10,26 @@
1010
</template>
1111
<script setup lang="ts">
1212
import Menu from '@/components/menu.vue'
13-
import { ref } from 'vue';
14-
import { useRouter, useRoute } from 'vue-router'
15-
import { storeToRefs } from "pinia";
16-
import { knowledgeStore } from "@/stores/knowledge";
17-
const usemenuStore = knowledgeStore();
13+
import { ref, onMounted, onUnmounted } from 'vue';
14+
import { useRoute } from 'vue-router'
1815
import useKnowledgeBase from '@/hooks/useKnowledgeBase'
1916
import UploadMask from '@/components/upload-mask.vue'
2017
import { getKnowledgeBaseById } from '@/api/knowledge-base/index'
2118
import { MessagePlugin } from 'tdesign-vue-next'
19+
2220
let { requestMethod } = useKnowledgeBase()
23-
const router = useRouter();
2421
const route = useRoute();
2522
let ismask = ref(false)
26-
let dropzone = ref();
2723
let uploadInput = ref();
2824
2925
// 获取当前知识库ID
30-
const getCurrentKbId = async (): Promise<string | null> => {
31-
let kbId = (route.params as any)?.kbId as string
32-
if (!kbId && route.name === 'chat' && (route.params as any)?.kbId) {
33-
kbId = (route.params as any).kbId
34-
}
35-
return kbId || null
26+
const getCurrentKbId = (): string | null => {
27+
return (route.params as any)?.kbId as string || null
3628
}
3729
3830
// 检查知识库初始化状态
3931
const checkKnowledgeBaseInitialization = async (): Promise<boolean> => {
40-
const currentKbId = await getCurrentKbId();
32+
const currentKbId = getCurrentKbId();
4133
4234
if (!currentKbId) {
4335
MessagePlugin.error("缺少知识库ID");
@@ -48,53 +40,74 @@ const checkKnowledgeBaseInitialization = async (): Promise<boolean> => {
4840
const kbResponse = await getKnowledgeBaseById(currentKbId);
4941
const kb = kbResponse.data;
5042
51-
// 检查知识库是否已初始化(有 EmbeddingModelID 和 SummaryModelID)
52-
if (!kb.embedding_model_id || kb.embedding_model_id === '' ||
53-
!kb.summary_model_id || kb.summary_model_id === '') {
43+
if (!kb.embedding_model_id || !kb.summary_model_id) {
5444
MessagePlugin.warning("该知识库尚未完成初始化配置,请先前往设置页面配置模型信息后再上传文件");
5545
return false;
5646
}
5747
return true;
5848
} catch (error) {
59-
console.error('获取知识库信息失败:', error);
6049
MessagePlugin.error("获取知识库信息失败,无法上传文件");
6150
return false;
6251
}
6352
}
6453
65-
const dragover = (event: DragEvent) => {
54+
55+
// 全局拖拽事件处理
56+
const handleGlobalDragEnter = (event: DragEvent) => {
6657
event.preventDefault();
58+
if (event.dataTransfer) {
59+
event.dataTransfer.effectAllowed = 'all';
60+
}
6761
ismask.value = true;
68-
if (((window.innerWidth - event.clientX) < 50) || ((window.innerHeight - event.clientY) < 50) || event.clientX < 50 || event.clientY < 50) {
69-
ismask.value = false
62+
}
63+
64+
const handleGlobalDragOver = (event: DragEvent) => {
65+
event.preventDefault();
66+
if (event.dataTransfer) {
67+
event.dataTransfer.dropEffect = 'copy';
7068
}
69+
ismask.value = true;
7170
}
72-
const drop = async (event: DragEvent) => {
71+
72+
const handleGlobalDrop = async (event: DragEvent) => {
7373
event.preventDefault();
74-
ismask.value = false
74+
ismask.value = false;
75+
76+
const DataTransferFiles = event.dataTransfer?.files ? Array.from(event.dataTransfer.files) : [];
77+
const DataTransferItemList = event.dataTransfer?.items ? Array.from(event.dataTransfer.items) : [];
7578
76-
// 检查知识库初始化状态
7779
const isInitialized = await checkKnowledgeBaseInitialization();
7880
if (!isInitialized) {
7981
return;
8082
}
8183
82-
const DataTransferItemList = event.dataTransfer?.items;
83-
if (DataTransferItemList) {
84-
for (const dataTransferItem of DataTransferItemList) {
84+
if (DataTransferFiles.length > 0) {
85+
DataTransferFiles.forEach(file => requestMethod(file, uploadInput));
86+
} else if (DataTransferItemList.length > 0) {
87+
DataTransferItemList.forEach(dataTransferItem => {
8588
const fileEntry = dataTransferItem.webkitGetAsEntry() as FileSystemFileEntry | null;
8689
if (fileEntry) {
87-
fileEntry.file((file: File) => {
88-
requestMethod(file, uploadInput)
89-
// 修复页面跳转问题:不跳转,让上传成功后的逻辑处理
90-
})
90+
fileEntry.file((file: File) => requestMethod(file, uploadInput));
9191
}
92-
}
92+
});
93+
} else {
94+
MessagePlugin.warning('请拖拽文件而不是文本或链接');
9395
}
9496
}
95-
const dragstart = (event: DragEvent) => {
96-
event.preventDefault();
97-
}
97+
98+
// 组件挂载时添加全局事件监听器
99+
onMounted(() => {
100+
document.addEventListener('dragenter', handleGlobalDragEnter, true);
101+
document.addEventListener('dragover', handleGlobalDragOver, true);
102+
document.addEventListener('drop', handleGlobalDrop, true);
103+
});
104+
105+
// 组件卸载时移除全局事件监听器
106+
onUnmounted(() => {
107+
document.removeEventListener('dragenter', handleGlobalDragEnter, true);
108+
document.removeEventListener('dragover', handleGlobalDragOver, true);
109+
document.removeEventListener('drop', handleGlobalDrop, true);
110+
});
98111
</script>
99112
<style lang="less">
100113
.main {

0 commit comments

Comments
 (0)