Skip to content

Commit fc9995d

Browse files
committed
【功能新增】AI:聊天记录返回时,增加 segments
1 parent 221c9d5 commit fc9995d

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
<!-- 知识引用组件 -->
2+
<template>
3+
<!-- 知识引用列表 -->
4+
<div v-if="segments && segments.length > 0" class="mt-10px p-10px rounded-8px bg-[#f5f5f5]">
5+
<div class="text-14px text-[#666] mb-8px flex items-center">
6+
<Icon icon="ep:document" class="mr-5px" /> 知识引用
7+
</div>
8+
<div class="flex flex-wrap gap-8px">
9+
<div
10+
v-for="(doc, index) in documentList"
11+
:key="index"
12+
class="p-8px px-12px bg-white rounded-6px cursor-pointer transition-all hover:bg-[#e6f4ff]"
13+
@click="handleClick(doc)"
14+
>
15+
<div class="text-14px text-[#333] mb-4px">
16+
{{ doc.title }}
17+
<span class="text-12px text-[#999] ml-4px">({{ doc.segments.length }} 条)</span>
18+
</div>
19+
</div>
20+
</div>
21+
</div>
22+
23+
<!-- 知识引用详情弹窗 -->
24+
<el-popover
25+
v-model:visible="dialogVisible"
26+
:width="600"
27+
trigger="click"
28+
placement="top-start"
29+
:offset="55"
30+
popper-class="knowledge-popover"
31+
>
32+
<template #reference>
33+
<div ref="documentRef"></div>
34+
</template>
35+
<template #default>
36+
<div class="text-16px font-bold mb-12px">{{ document?.title }}</div>
37+
<div class="max-h-[60vh] overflow-y-auto">
38+
<div
39+
v-for="(segment, index) in document?.segments"
40+
:key="index"
41+
class="p-12px border-b-solid border-b-[#eee] last:border-b-0"
42+
>
43+
<div
44+
class="block mb-8px px-8px py-2px bg-[#f5f5f5] rounded-4px text-12px text-[#666] w-fit"
45+
>
46+
分段 {{ segment.id }}
47+
</div>
48+
<div class="text-14px leading-[1.6] text-[#333] mt-[10px]">
49+
{{ segment.content }}
50+
</div>
51+
</div>
52+
</div>
53+
</template>
54+
</el-popover>
55+
</template>
56+
57+
<script setup lang="ts">
58+
const props = defineProps<{
59+
segments: {
60+
id: number
61+
documentId: number
62+
documentName: string
63+
content: string
64+
}[]
65+
}>()
66+
67+
const document = ref<{
68+
id: number
69+
title: string
70+
segments: {
71+
id: number
72+
content: string
73+
}[]
74+
} | null>(null) // 知识库文档列表
75+
const dialogVisible = ref(false) // 知识引用详情弹窗
76+
const documentRef = ref<HTMLElement>() // 知识引用详情弹窗 Ref
77+
78+
/** 按照 document 聚合 segments */
79+
const documentList = computed(() => {
80+
if (!props.segments) return []
81+
82+
const docMap = new Map()
83+
props.segments.forEach((segment) => {
84+
if (!docMap.has(segment.documentId)) {
85+
docMap.set(segment.documentId, {
86+
id: segment.documentId,
87+
title: segment.documentName,
88+
segments: []
89+
})
90+
}
91+
docMap.get(segment.documentId).segments.push({
92+
id: segment.id,
93+
content: segment.content
94+
})
95+
})
96+
return Array.from(docMap.values())
97+
})
98+
99+
/** 点击 document 处理 */
100+
const handleClick = (doc: any) => {
101+
document.value = doc
102+
dialogVisible.value = true
103+
}
104+
</script>

0 commit comments

Comments
 (0)