From 11697cb7da4e5d78d21bd2f5c107da456a08c594 Mon Sep 17 00:00:00 2001
From: houzhongjian <houzhongyi@126.com>
Date: 星期四, 12 六月 2025 13:22:21 +0800
Subject: [PATCH] 大模型功能修改

---
 src/views/ai/dashboard/components/message/MessageList.vue |  132 ++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 120 insertions(+), 12 deletions(-)

diff --git a/src/views/ai/dashboard/components/message/MessageList.vue b/src/views/ai/dashboard/components/message/MessageList.vue
index 0caa248..616b9f4 100644
--- a/src/views/ai/dashboard/components/message/MessageList.vue
+++ b/src/views/ai/dashboard/components/message/MessageList.vue
@@ -3,9 +3,58 @@
     <div class="chat-list" v-for="(item, index) in list" :key="index">
       <!-- 靠左 message:system、assistant 类型 -->
       <div class="left-message message-item" v-if="item.type !== 'user'">
+        <div class="avatar">
+          <el-avatar :src="roleAvatar" />
+        </div>
         <div class="message">
-          <div class="left-text-container" ref="markdownViewRef">
-            <MarkdownView class="left-text" :content="item.content" />
+          <div>
+            <el-text class="time">{{ formatDate(item.createTime) }}</el-text>
+          </div>
+          <div v-if="item.thinkingFlag" class="left-text-container-thinking" ref="markdownViewRef">
+            <MarkdownView v-if="item.thinking" class="left-text thinking" :content="item.thinking" />
+            <MarkdownView v-else class="left-text thinking" :content="item.content" />
+          </div>
+          <div v-else-if="item.thinking" class="left-text-container-thinking" ref="markdownViewRef">
+            <MarkdownView class="left-text thinking" :content="item.thinking" />
+          </div>
+          <div class="left-text-container-conclusion" ref="markdownViewRef">
+            <MarkdownView class="left-text" :content="item.conclusion" />
+          </div>
+          <div class="left-btns">
+            <el-button class="btn-cus" link @click="copyContent(item.content)">
+              <img class="btn-image" src="@/assets/ai/zhuanlu/copy.png" />
+            </el-button>
+            <el-button v-if="item.id > 0" class="btn-cus" link @click="onDelete(item.id)">
+              <img class="btn-image h-17px" src="@/assets/ai/zhuanlu/delete.png" />
+            </el-button>
+          </div>
+        </div>
+      </div>
+      <!-- 靠右 message:user 类型 -->
+      <div class="right-message message-item" v-if="item.type === 'user'">
+        <div class="avatar">
+          <el-avatar :src="userAvatar" />
+        </div>
+        <div class="message">
+          <div>
+            <el-text class="time">{{ formatDate(item.createTime) }}</el-text>
+          </div>
+          <div class="right-text-container">
+            <div class="right-text">{{ item.content }}</div>
+          </div>
+          <div class="right-btns">
+            <el-button class="btn-cus" link @click="copyContent(item.content)">
+              <img class="btn-image" src="@/assets/ai/zhuanlu/copy.png" />
+            </el-button>
+            <el-button class="btn-cus" link @click="onDelete(item.id)">
+              <img class="btn-image h-17px mr-12px" src="@/assets/ai/zhuanlu/delete.png" />
+            </el-button>
+            <el-button class="btn-cus" link @click="onRefresh(item)">
+              <img class="btn-image h-17px mr-12px" src="@/assets/ai/zhuanlu/refresh.png" />
+            </el-button>
+            <el-button class="btn-cus" link @click="onEdit(item)">
+              <img class="btn-image h-17px mr-12px" src="@/assets/ai/zhuanlu/edit.png" />
+            </el-button>
           </div>
         </div>
       </div>
@@ -18,12 +67,15 @@
 </template>
 <script setup lang="ts">
 import { PropType } from 'vue'
+import { formatDate } from '@/utils/formatTime'
 import MarkdownView from '@/components/MarkdownView/index.vue'
 import { useClipboard } from '@vueuse/core'
 import { ArrowDownBold} from '@element-plus/icons-vue'
 import { ChatMessageApi, ChatMessageVO } from '@/api/ai/chat/message'
 import { ChatConversationVO } from '@/api/ai/chat/conversation'
 import { useUserStore } from '@/store/modules/user'
+import userAvatarDefaultImg from '@/assets/ai/zhuanlu/user.png'
+import roleAvatarDefaultImg from '@/assets/ai/zhuanlu/assistant.png'
 
 const message = useMessage() // 消息弹窗
 const { copy } = useClipboard() // 初始化 copy 到粘贴板
@@ -32,6 +84,10 @@
 // 判断“消息列表”滚动的位置(用于判断是否需要滚动到消息最下方)
 const messageContainer: any = ref(null)
 const isScrolling = ref(false) //用于判断用户是否在滚动
+
+const userAvatar = computed(() => userAvatarDefaultImg)
+// const userAvatar = computed(() => userStore.user.avatar || userAvatarDefaultImg)
+const roleAvatar = computed(() => props.conversation.roleAvatar ?? roleAvatarDefaultImg)
 
 // 定义 props
 const props = defineProps({
@@ -78,16 +134,18 @@
 /** 回到底部 */
 const handleGoBottom = async () => {
   const scrollContainer = messageContainer.value
+  console.log(scrollContainer.scrollHeight)
   scrollContainer.scrollTop = scrollContainer.scrollHeight
 }
 
 /** 回到顶部 */
 const handlerGoTop = async () => {
   const scrollContainer = messageContainer.value
+  console.log(scrollContainer.scrollHeight)
   scrollContainer.scrollTop = 0
 }
 
-defineExpose({ scrollToBottom, handlerGoTop }) // 提供方法给 parent 调用
+defineExpose({ scrollToBottom, handlerGoTop, handleGoBottom }) // 提供方法给 parent 调用
 
 // ============ 处理消息操作 ==============
 
@@ -100,7 +158,7 @@
 /** 删除 */
 const onDelete = async (id) => {
   // 删除 message
-  await ChatMessageApi.deleteEnergyChatMessage(id)
+  await ChatMessageApi.deleteChatMessage(id)
   message.success('删除成功!')
   // 回调
   emits('onDeleteSuccess')
@@ -143,15 +201,24 @@
     flex-direction: row;
   }
 
+  .right-message {
+    display: flex;
+    flex-direction: row-reverse;
+    justify-content: flex-start;
+  }
+
   .message {
     display: flex;
     flex-direction: column;
     text-align: left;
-    height: 462px;
+    margin: 0 15px;
 
-    .left-text-container {
-      width: 855px;
-      height: 462px;
+    .time {
+      text-align: left;
+      line-height: 30px;
+    }
+
+    .left-text-container-thinking {
       position: relative;
       display: flex;
       flex-direction: column;
@@ -160,14 +227,55 @@
       border-radius: 4px 4px 4px 4px;
       border-left: 1px solid #73C4FF;
       padding: 10px 10px 5px 10px;
-
       .left-text {
-        font-weight: 400;
-        font-size: 14px;
-        color: rgba(219,238,255,0.6);
+        color: rgba(219,238,255,0.5);
+        font-size: 0.85rem;
       }
     }
 
+    .left-text-container-conclusion {
+      position: relative;
+      display: flex;
+      flex-direction: column;
+      overflow-wrap: break-word;
+      background: rgba(115,196,255,0);
+      border-radius: 4px 4px 4px 4px;
+      padding: 20px 10px 5px 0;
+      .left-text {
+        color: rgba(219,238,255,0.8);
+        font-size: 1rem;
+      }
+    }
+
+    .right-text-container {
+      display: flex;
+      flex-direction: row-reverse;
+
+      .right-text {
+        font-size: 0.95rem;
+        color: #DBEEFF;
+        display: inline;
+        background: rgba(40,139,255,0.1);
+        box-shadow: 0 0 0 1px rgba(40,139,255,0.3);
+        border-radius: 10px;
+        padding: 10px;
+        width: auto;
+        overflow-wrap: break-word;
+        white-space: pre-wrap;
+      }
+    }
+
+    .left-btns {
+      display: flex;
+      flex-direction: row;
+      margin-top: 8px;
+    }
+
+    .right-btns {
+      display: flex;
+      flex-direction: row-reverse;
+      margin-top: 8px;
+    }
   }
 
   // 复制、删除按钮

--
Gitblit v1.9.3