|
@@ -1,6 +1,6 @@
|
|
|
<script setup>
|
|
|
-import { ref, unref, onMounted } from 'vue';
|
|
|
-import { NPopconfirm } from 'naive-ui';
|
|
|
+import { ref, unref, computed, onMounted } from 'vue';
|
|
|
+import { useMessage } from 'naive-ui';
|
|
|
import { SvgIcon, BaseButton, RecodeCardItem, TheSubMenu, TheChatView, ChatWelcome } from '@/components';
|
|
|
import { ChatAsk, ChatAnswer, ChatInput } from '@/components/Chat';
|
|
|
import { chatApi } from '@/api/chat';
|
|
@@ -8,20 +8,40 @@ import { chatApi } from '@/api/chat';
|
|
|
import { useInfinite } from '@/composables/useInfinite';
|
|
|
import { useScroll } from '@/composables/useScroll';
|
|
|
import { useChat } from '@/composables/useChat';
|
|
|
+import { useRecommend } from '@/composables/useRecommend';
|
|
|
|
|
|
// TODO: 如果这里的key不一样,将会在拆一层组件出来 - list
|
|
|
-const { recordList, isFetching, onScrolltolower } = useInfinite({model: 0});
|
|
|
+const { recordList, isFetching, onScrolltolower, addHistoryRecord } = useInfinite({model: 0});
|
|
|
const { scrollRef, scrollToBottom, scrollToBottomIfAtBottom } = useScroll();
|
|
|
-const { chatDataSource, addChat, updateChat } = useChat();
|
|
|
+const { chatDataSource, addChat, updateChat, clearChat } = useChat();
|
|
|
+const { recommendList } = useRecommend({type: 0});
|
|
|
+
|
|
|
+const message = useMessage();
|
|
|
|
|
|
-// 控制按钮
|
|
|
const isLoading = ref(false);
|
|
|
|
|
|
const currenSessionId = ref(null);
|
|
|
|
|
|
+const isExistInHistory = computed(() => !(recordList.value.findIndex(({ sessionId: sId }) => sId === unref(currenSessionId)) === -1));
|
|
|
+
|
|
|
// 新建对话
|
|
|
-const handleCreateDialog = () => {
|
|
|
- console.log("handleCreateDialog");
|
|
|
+const handleCreateDialog = async () => {
|
|
|
+ message.destroyAll();
|
|
|
+
|
|
|
+ if (unref(isLoading)) {
|
|
|
+ return message.warning('当前对话生成中');
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!unref(chatDataSource).length) {
|
|
|
+ return message.info('已切换最新会话');
|
|
|
+ }
|
|
|
+
|
|
|
+ clearChat();
|
|
|
+}
|
|
|
+
|
|
|
+// 处理推荐问题
|
|
|
+const handleWelcomeRecommend = question => {
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// 查询对话详情
|
|
@@ -35,12 +55,13 @@ const handleChatDetail = async ({ sessionId }) => {
|
|
|
const onRegenerate = async ({ question, sessionId }) => {
|
|
|
const params = {
|
|
|
data: {
|
|
|
- sessionId,
|
|
|
- question,
|
|
|
+ sessionId,
|
|
|
+ question,
|
|
|
},
|
|
|
onDownloadProgress: ({ event }) => {
|
|
|
const xhr = event.target;
|
|
|
const { responseText: answer } = xhr;
|
|
|
+
|
|
|
updateChat({
|
|
|
sessionId,
|
|
|
question,
|
|
@@ -48,12 +69,12 @@ const onRegenerate = async ({ question, sessionId }) => {
|
|
|
loading: true,
|
|
|
delayLoading: false
|
|
|
})
|
|
|
+
|
|
|
scrollToBottomIfAtBottom();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- isLoading.value = true;
|
|
|
const { data: answer } = await chatApi.getChatStream(params);
|
|
|
updateChat({
|
|
|
sessionId,
|
|
@@ -67,10 +88,18 @@ const onRegenerate = async ({ question, sessionId }) => {
|
|
|
isLoading.value = false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// 提交问题
|
|
|
const handleSubmit = async (question) => {
|
|
|
- // 此步骤用于模拟 - 内容生成前置等待状态
|
|
|
- const sessionId = unref(currenSessionId.value);
|
|
|
+ // 用于模拟 - 内容生成前置等待状态
|
|
|
+ const sessionId = unref(currenSessionId);
|
|
|
+
|
|
|
+ if (unref(isExistInHistory)) {
|
|
|
+ const { data: sessionId } = await chatApi.getChatSessionTag();
|
|
|
+ currenSessionId.value = sessionId;
|
|
|
+ }
|
|
|
+
|
|
|
+ isLoading.value = true;
|
|
|
|
|
|
addChat({
|
|
|
sessionId,
|
|
@@ -82,10 +111,7 @@ const handleSubmit = async (question) => {
|
|
|
|
|
|
scrollToBottom();
|
|
|
|
|
|
- setTimeout(() => {
|
|
|
- onRegenerate({ question, sessionId })
|
|
|
- }, 2 * 1000)
|
|
|
-
|
|
|
+ setTimeout(() => onRegenerate({ question, sessionId }), 2 * 1000);
|
|
|
}
|
|
|
</script>
|
|
|
|
|
@@ -117,12 +143,9 @@ const handleSubmit = async (question) => {
|
|
|
:sub-title="[
|
|
|
'期待与您一同规划和完成未来的工作。有任何重点或需讨论的事项,随时告诉我。'
|
|
|
]"
|
|
|
- :card-content="[
|
|
|
- '帮我做一份如何快速入手污水处理厂的相关工作的学习计划?',
|
|
|
- '硝化作用的速度快慢与哪些因素有关?',
|
|
|
- '污泥回流比如何计算?'
|
|
|
- ]"
|
|
|
+ :card-content="recommendList"
|
|
|
v-if="!chatDataSource.length"
|
|
|
+ @on-click="handleWelcomeRecommend"
|
|
|
/>
|
|
|
|
|
|
<div class="conversation-item" v-if="chatDataSource.length">
|