|
@@ -1,7 +1,7 @@
|
|
<script setup>
|
|
<script setup>
|
|
import { ref, unref, computed, onMounted } from 'vue';
|
|
import { ref, unref, computed, onMounted } from 'vue';
|
|
import { useMessage } from 'naive-ui';
|
|
import { useMessage } from 'naive-ui';
|
|
-import { SvgIcon, BaseButton, RecodeCardItem, TheSubMenu, TheChatView, ChatWelcome } from '@/components';
|
|
|
|
|
|
+import { BaseButton, RecodeCardItem, TheSubMenu, TheChatView, ChatWelcome } from '@/components';
|
|
import { ChatAsk, ChatAnswer, ChatInput } from '@/components/Chat';
|
|
import { ChatAsk, ChatAnswer, ChatInput } from '@/components/Chat';
|
|
import { chatApi } from '@/api/chat';
|
|
import { chatApi } from '@/api/chat';
|
|
|
|
|
|
@@ -11,7 +11,7 @@ import { useChat } from '@/composables/useChat';
|
|
import { useRecommend } from '@/composables/useRecommend';
|
|
import { useRecommend } from '@/composables/useRecommend';
|
|
|
|
|
|
// TODO: 如果这里的key不一样,将会在拆一层组件出来 - list
|
|
// TODO: 如果这里的key不一样,将会在拆一层组件出来 - list
|
|
-const { recordList, isFetching, onScrolltolower, addHistoryRecord } = useInfinite({model: 0});
|
|
|
|
|
|
+const { recordList, isFetching, onScrolltolower, onReset, addHistoryRecord } = useInfinite({model: 0});
|
|
const { scrollRef, scrollToBottom, scrollToBottomIfAtBottom } = useScroll();
|
|
const { scrollRef, scrollToBottom, scrollToBottomIfAtBottom } = useScroll();
|
|
const { chatDataSource, addChat, updateChat, clearChat } = useChat();
|
|
const { chatDataSource, addChat, updateChat, clearChat } = useChat();
|
|
const { recommendList } = useRecommend({type: 0});
|
|
const { recommendList } = useRecommend({type: 0});
|
|
@@ -22,7 +22,7 @@ const isLoading = ref(false);
|
|
|
|
|
|
const currenSessionId = ref(null);
|
|
const currenSessionId = ref(null);
|
|
|
|
|
|
-const isExistInHistory = computed(() => !(recordList.value.findIndex(({ sessionId: sId }) => sId === unref(currenSessionId)) === -1));
|
|
|
|
|
|
+const isExistInHistory = computed(() => (recordList.value.findIndex(({ sessionId: sId }) => sId === unref(currenSessionId)) === -1));
|
|
|
|
|
|
// 新建对话
|
|
// 新建对话
|
|
const handleCreateDialog = async () => {
|
|
const handleCreateDialog = async () => {
|
|
@@ -39,24 +39,27 @@ const handleCreateDialog = async () => {
|
|
clearChat();
|
|
clearChat();
|
|
}
|
|
}
|
|
|
|
|
|
-// 处理推荐问题
|
|
|
|
-const handleWelcomeRecommend = question => {
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
// 查询对话详情
|
|
// 查询对话详情
|
|
const handleChatDetail = async ({ sessionId }) => {
|
|
const handleChatDetail = async ({ sessionId }) => {
|
|
|
|
+ isLoading.value = false;
|
|
const { data } = await chatApi.getAnswerHistoryDetail({ sessionId });
|
|
const { data } = await chatApi.getAnswerHistoryDetail({ sessionId });
|
|
- chatDataSource.value = data.map(({ createTime, sessionId, question, answer }) => ({ createTime, sessionId, question, answer, loading: false }));
|
|
|
|
|
|
+ chatDataSource.value = data.map(({ createTime, sessionId, question, answer }) => ({
|
|
|
|
+ createTime,
|
|
|
|
+ sessionId,
|
|
|
|
+ question,
|
|
|
|
+ answer,
|
|
|
|
+ loading: false
|
|
|
|
+ }));
|
|
currenSessionId.value = sessionId;
|
|
currenSessionId.value = sessionId;
|
|
scrollToBottom();
|
|
scrollToBottom();
|
|
}
|
|
}
|
|
|
|
|
|
-const onRegenerate = async ({ question, sessionId }) => {
|
|
|
|
|
|
+const onRegenerate = async ({ question, realQuestion }) => {
|
|
|
|
+ const sessionId = unref(currenSessionId);
|
|
const params = {
|
|
const params = {
|
|
data: {
|
|
data: {
|
|
sessionId,
|
|
sessionId,
|
|
- question,
|
|
|
|
|
|
+ question: realQuestion || question,
|
|
},
|
|
},
|
|
onDownloadProgress: ({ event }) => {
|
|
onDownloadProgress: ({ event }) => {
|
|
const xhr = event.target;
|
|
const xhr = event.target;
|
|
@@ -90,10 +93,9 @@ const onRegenerate = async ({ question, sessionId }) => {
|
|
}
|
|
}
|
|
|
|
|
|
// 提交问题
|
|
// 提交问题
|
|
-const handleSubmit = async (question) => {
|
|
|
|
|
|
+const handleSubmit = async (question, realQuestion = '') => {
|
|
// 用于模拟 - 内容生成前置等待状态
|
|
// 用于模拟 - 内容生成前置等待状态
|
|
- const sessionId = unref(currenSessionId);
|
|
|
|
-
|
|
|
|
|
|
+
|
|
if (unref(isExistInHistory)) {
|
|
if (unref(isExistInHistory)) {
|
|
const { data: sessionId } = await chatApi.getChatSessionTag();
|
|
const { data: sessionId } = await chatApi.getChatSessionTag();
|
|
currenSessionId.value = sessionId;
|
|
currenSessionId.value = sessionId;
|
|
@@ -102,8 +104,9 @@ const handleSubmit = async (question) => {
|
|
isLoading.value = true;
|
|
isLoading.value = true;
|
|
|
|
|
|
addChat({
|
|
addChat({
|
|
- sessionId,
|
|
|
|
|
|
+ sessionId: unref(currenSessionId),
|
|
question,
|
|
question,
|
|
|
|
+ realQuestion,
|
|
answer: '',
|
|
answer: '',
|
|
loading: true,
|
|
loading: true,
|
|
delayLoading: true
|
|
delayLoading: true
|
|
@@ -111,7 +114,20 @@ const handleSubmit = async (question) => {
|
|
|
|
|
|
scrollToBottom();
|
|
scrollToBottom();
|
|
|
|
|
|
- setTimeout(() => onRegenerate({ question, sessionId }), 2 * 1000);
|
|
|
|
|
|
+ setTimeout(() => onRegenerate({ question, realQuestion }), 2 * 1000);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 处理推荐问题
|
|
|
|
+const handleWelcomeRecommend = ({ question, realQuestion }) => {
|
|
|
|
+ handleSubmit( question, realQuestion );
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 删除历史对话
|
|
|
|
+const handeChatDelete = async (id) => {
|
|
|
|
+ await chatApi.deleteHistory(id);
|
|
|
|
+ onReset();
|
|
|
|
+ clearChat();
|
|
|
|
+ message.success('删除成功');
|
|
}
|
|
}
|
|
</script>
|
|
</script>
|
|
|
|
|
|
@@ -133,6 +149,7 @@ const handleSubmit = async (question) => {
|
|
:time="item.createTime"
|
|
:time="item.createTime"
|
|
:data-item="item"
|
|
:data-item="item"
|
|
@on-click="handleChatDetail"
|
|
@on-click="handleChatDetail"
|
|
|
|
+ @on-delete="handeChatDelete"
|
|
/>
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@@ -149,7 +166,7 @@ const handleSubmit = async (question) => {
|
|
/>
|
|
/>
|
|
|
|
|
|
<div class="conversation-item" v-if="chatDataSource.length">
|
|
<div class="conversation-item" v-if="chatDataSource.length">
|
|
- <template v-for="item in chatDataSource" :key="item.sessionId">
|
|
|
|
|
|
+ <template v-for="item in chatDataSource" :key="item.id">
|
|
<ChatAsk :content="item.question"></ChatAsk>
|
|
<ChatAsk :content="item.question"></ChatAsk>
|
|
<ChatAnswer :content="item.answer" :loading="item.loading" :delay-loading="item.delayLoading"></ChatAnswer>
|
|
<ChatAnswer :content="item.answer" :loading="item.loading" :delay-loading="item.delayLoading"></ChatAnswer>
|
|
</template>
|
|
</template>
|