Merge branch 'dev' of https://gitee.com/yudaocode/yudao-ui-admin-vue3 into dev
# Conflicts: # src/views/ai/chat/index.vuepull/453/head
						commit
						ac18d871ca
					
				| 
						 | 
				
			
			@ -387,6 +387,8 @@ onMounted(async () => {
 | 
			
		|||
    // 首次默认选中第一个
 | 
			
		||||
    if (conversationList.value.length) {
 | 
			
		||||
      activeConversationId.value = conversationList.value[0].id
 | 
			
		||||
      // 回调 onConversationClick
 | 
			
		||||
      await emits('onConversationClick', conversationList.value[0])
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,11 +36,10 @@
 | 
			
		|||
          <div class="message-container" >
 | 
			
		||||
            <MessageLoading v-if="listLoading" />
 | 
			
		||||
            <MessageNewChat v-if="!activeConversation" @on-new-chat="handlerNewChat" />
 | 
			
		||||
            <ChatEmpty v-if="!listLoading && messageList.length === 0 && activeConversation" @on-prompt="doSend"/>
 | 
			
		||||
            <Message v-if="!listLoading && messageList.length > 0"
 | 
			
		||||
            <ChatEmpty v-if="!listLoading && list.length === 0 && activeConversation" @on-prompt="doSend"/>
 | 
			
		||||
            <Message v-if="!listLoading && list.length > 0"
 | 
			
		||||
                     ref="messageRef"
 | 
			
		||||
                     :conversation="activeConversation"
 | 
			
		||||
                     :list="messageList"
 | 
			
		||||
                     :list="list"
 | 
			
		||||
                     @on-delete-success="handlerMessageDelete"
 | 
			
		||||
                     @on-edit="handlerMessageEdit"
 | 
			
		||||
                     @on-refresh="handlerMessageRefresh"/>
 | 
			
		||||
| 
						 | 
				
			
			@ -103,12 +102,14 @@ import MessageLoading from './MessageLoading.vue'
 | 
			
		|||
import MessageNewChat from './MessageNewChat.vue'
 | 
			
		||||
import {ChatMessageApi, ChatMessageVO} from '@/api/ai/chat/message'
 | 
			
		||||
import {ChatConversationApi, ChatConversationVO} from '@/api/ai/chat/conversation'
 | 
			
		||||
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
 | 
			
		||||
import {getUserProfile, ProfileVO} from '@/api/system/user/profile'
 | 
			
		||||
import {useClipboard} from '@vueuse/core'
 | 
			
		||||
import ChatConversationUpdateForm from "@/views/ai/chat/components/ChatConversationUpdateForm.vue";
 | 
			
		||||
import {Download, Top} from "@element-plus/icons-vue";
 | 
			
		||||
 | 
			
		||||
const route = useRoute() // 路由
 | 
			
		||||
const message = useMessage() // 消息弹窗
 | 
			
		||||
const {copy} = useClipboard() // 初始化 copy 到粘贴板
 | 
			
		||||
 | 
			
		||||
// ref 属性定义
 | 
			
		||||
const activeConversationId = ref<string | null>(null) // 选中的对话编号
 | 
			
		||||
| 
						 | 
				
			
			@ -338,8 +339,14 @@ const doSendStream = async (userMessage: ChatMessageVO) => {
 | 
			
		|||
      userMessage.content,
 | 
			
		||||
      conversationInAbortController.value,
 | 
			
		||||
      enableContext.value,
 | 
			
		||||
      async (message) => {
 | 
			
		||||
        const data = JSON.parse(message.data) // TODO 芋艿:类型处理;
 | 
			
		||||
      async (res) => {
 | 
			
		||||
        console.log('res', res)
 | 
			
		||||
        const { code, data, msg } = JSON.parse(res.data)
 | 
			
		||||
        if (code !== 0) {
 | 
			
		||||
          message.alert(`对话异常! ${msg}`)
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 如果内容为空,就不处理。
 | 
			
		||||
        if (data.receive.content === '') {
 | 
			
		||||
          return
 | 
			
		||||
| 
						 | 
				
			
			@ -360,14 +367,13 @@ const doSendStream = async (userMessage: ChatMessageVO) => {
 | 
			
		|||
        await scrollToBottom()
 | 
			
		||||
      },
 | 
			
		||||
      (error) => {
 | 
			
		||||
        console.log('onError')
 | 
			
		||||
        message.alert(`对话异常! ${error}`)
 | 
			
		||||
        // 标记对话结束
 | 
			
		||||
        conversationInProgress.value = false
 | 
			
		||||
        // 结束 stream 对话
 | 
			
		||||
        conversationInAbortController.value.abort()
 | 
			
		||||
      },
 | 
			
		||||
      () => {
 | 
			
		||||
        console.log('onClose')
 | 
			
		||||
        // 标记对话结束
 | 
			
		||||
        conversationInProgress.value = false
 | 
			
		||||
        // 结束 stream 对话
 | 
			
		||||
| 
						 | 
				
			
			@ -390,23 +396,6 @@ const stopStream = async () => {
 | 
			
		|||
 | 
			
		||||
// ============== message 数据 =================
 | 
			
		||||
 | 
			
		||||
/** 消息列表 */
 | 
			
		||||
const messageList = computed(() => {
 | 
			
		||||
  if (list.value.length > 0) {
 | 
			
		||||
    return list.value
 | 
			
		||||
  }
 | 
			
		||||
  // 没有消息时,如果有 systemMessage 则展示它
 | 
			
		||||
  // TODO add by 芋艿:这个消息下面,不能有复制、删除按钮
 | 
			
		||||
  if (activeConversation.value?.systemMessage) {
 | 
			
		||||
    return [{
 | 
			
		||||
      id: 0,
 | 
			
		||||
      type: 'system',
 | 
			
		||||
      content: activeConversation.value.systemMessage
 | 
			
		||||
    }]
 | 
			
		||||
  }
 | 
			
		||||
  return []
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 获取 - message 列表
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -486,6 +475,8 @@ const handleConversationClick = async (conversation: ChatConversationVO) => {
 | 
			
		|||
  await getMessageList()
 | 
			
		||||
  // 滚动底部
 | 
			
		||||
  scrollToBottom(true)
 | 
			
		||||
  // 清空输入框
 | 
			
		||||
  prompt.value = ''
 | 
			
		||||
  return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -536,6 +527,10 @@ const handlerNewChat = async () => {
 | 
			
		|||
 * 删除 message
 | 
			
		||||
 */
 | 
			
		||||
const handlerMessageDelete = async () => {
 | 
			
		||||
  if (conversationInProgress.value) {
 | 
			
		||||
    message.alert('回答中,不能删除!')
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
  // 刷新 message
 | 
			
		||||
  await getMessageList()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue