From 5614a89478982b1b70afeab266b538d7692b65c3 Mon Sep 17 00:00:00 2001 From: yinbangzhong <zhongbangyin@126.com> Date: 星期四, 08 八月 2024 20:18:25 +0800 Subject: [PATCH] 滚动显示问题 --- src/router/routes/modules/session.ts | 13 - /dev/null | 421 ---------------------------------------------------- src/views/sessionManager/index.vue | 2 src/views/sessionManager/components/addSession.vue | 0 4 files changed, 3 insertions(+), 433 deletions(-) diff --git a/src/router/routes/modules/session.ts b/src/router/routes/modules/session.ts index 7404798..7728a62 100644 --- a/src/router/routes/modules/session.ts +++ b/src/router/routes/modules/session.ts @@ -20,18 +20,9 @@ requiresAuth: true, roles: ['*'], }, - component:()=>import('@/views/session/sessionManager/index.vue'), + component:()=>import('@/views/sessionManager/index.vue'), }, - { - path:'sessionRecordsManager', - name:"sessionRecordsManager", - meta:{ - locale: '浼氳瘽璁板綍', - requiresAuth: true, - roles: ['*'], - }, - component:()=>import('@/views/session/sessionRecordsManager/index.vue'), - } + ] }; export default session; \ No newline at end of file diff --git a/src/views/session/sessionManager/index.vue b/src/views/session/sessionManager/index.vue deleted file mode 100644 index 1ab6516..0000000 --- a/src/views/session/sessionManager/index.vue +++ /dev/null @@ -1,421 +0,0 @@ -<script setup lang="ts"> - import { - IconMoreVertical, - IconQuestionCircleFill, - IconPoweroff, - IconCommon, - IconSend, - } from '@arco-design/web-vue/es/icon'; - import img1 from '@/assets/images/u64.png'; - import img2 from '@/assets/images/u69.png'; - import img3 from '@/assets/images/u74.png'; - import AddSession from './components/addSession.vue'; - import { ref, onMounted, computed, reactive, nextTick, watch } from 'vue'; - import { useUserStore, useAppStore } from '@/store'; - import { - sessionListApi, - deleteSessionApi, - getSessionDetailsApi, - chatApi, - } from '@/api/session'; - import { Message } from '@arco-design/web-vue'; - const userStore = useUserStore(); - const appStore = useAppStore(); - const theme = computed(() => { - return appStore.theme; - }); - const sessionList = ref([]); //浼氳瘽鍒楄〃 - const sessionDetailList = ref([]); //鏍规嵁浼氳瘽id鍑烘潵鐨勪細璇濊鎯� - const activeSessionId = ref(''); - const inputMsg = ref(''); - const scrollbar = ref(null); - - const currIndex = ref(0); - const displayedText = ref(''); // 姝e湪鏄剧ず鐨勬枃瀛� - let timer: number | null = null; - const streamStr = ref(''); - const modalObj = reactive({ add: false }); - //鏌ヨ浼氳瘽鍒楄〃 - const querySessionList = async () => { - const { code, data } = await sessionListApi(); - if (code === 200) { - sessionList.value = data; - if (Array.isArray(data) && data.length > 0) { - activeSessionId.value = data[0].id; - const res = await getSessionDetailsApi(data[0].id); - if (res.code === 200) { - sessionDetailList.value = res.data.message; - refreshScroll(); - } - } - } else { - Message.warning('鏌ヨ澶辫触'); - } - }; - //鏍规嵁浼氳瘽id鍒犻櫎浼氳瘽 - const deleteSession = async (session) => { - const { code } = await deleteSessionApi([session.id]); - if (code === 200) { - Message.success('鍒犻櫎鎴愬姛'); - querySessionList(); - } - }; - // eslint-disable-next-line prettier/prettier - // 鏂板浼氳瘽涔嬪悗鍒锋柊浼氳瘽鍒楄〃 - const addSession = () => { - querySessionList(); - }; - // 鍒濆鍖栨暟鎹� - const initData = () => { - querySessionList(); - }; - // 鑾峰彇鐧诲綍淇℃伅 - const userName = computed(() => { - return userStore.name; - }); - const avatar = computed(() => { - return userStore.avatar; - }); - const refreshScroll = () => { - nextTick(() => { - const container = document.getElementById('home'); - scrollbar.value.scrollTop(container.scrollHeight); - }); - }; - // 鏍规嵁浼氳瘽id 鏌ヨ浼氳瘽璇︽儏 - const querySessionDetail = async (session) => { - activeSessionId.value = session.id; - const { code, data } = await getSessionDetailsApi(session.id); - if (code === 200) { - sessionDetailList.value = data.message; - refreshScroll(); //鍒锋柊婊氬姩鏉′綅缃� - } - }; - const sendMessage = async () => { - if (inputMsg.value) { - const { code, data } = await chatApi({ - conversation_id: activeSessionId.value, - messages: inputMsg.value, - }); - const res = await getSessionDetailsApi(activeSessionId.value); - if (res.code === 200) { - sessionDetailList.value = res.data.message.map((item, index) => { - if (index === res.data.message.length - 1) { - item.role = 'last'; - displayedText.value = ''; - currIndex.value = 0; - streamStr.value = item.content; - startDisplayStr(); - } - return item; - }); - refreshScroll(); - } - inputMsg.value = ''; - } else { - Message.warning('娑堟伅涓嶈兘涓虹┖'); - } - }; - onMounted(() => { - initData(); - }); - //鏂囧瓧鍔ㄦ�佽緭鍑� - const startDisplayStr = () => { - if (timer) { - clearTimeout(timer!); - } - const res = streamStr.value; - // 灏嗘暟缁勪腑鐨勫瓧绗︿覆鎷兼帴璧锋潵 - if (currIndex.value < res.length) { - displayedText.value += res[currIndex.value]; - currIndex.value++; - setTimeout(startDisplayStr, 100); - } else { - clearTimeout(timer!); - timer = null; - } - }; - watch( - () => scrollbar.value, - (newScroll, oldScroll) => { - if (newScroll) { - // 鑾峰彇a-scroll鐨勯珮搴� - const height = newScroll.$el.offsetHeight; - console.log('a-scroll height changed to:', height); - } - }, - { deep: true } - ); -</script> - -<template> - <div class="container"> - <AddSession :modalObj="modalObj" @addSession="addSession"></AddSession> - <a-row :gutter="[0, 0]"> - <a-col :span="5"> - <a-card class="left"> - <template #cover> - <a-button - type="outline" - class="card-btn" - @click="modalObj.add = true" - > - +鏂板缓浼氳瘽 - </a-button> - </template> - <a-scrollbar class="left-list" style="height: 60vh; overflow-y: auto"> - <div - class="item" - :class="{ isLeftActive: activeSessionId === session.id }" - v-for="session in sessionList" - :key="session.id" - @click="querySessionDetail(session)" - > - <div class="item-left"> - <IconQuestionCircleFill />銆� - {{ session.name }} - </div> - <div class="item-right"> - <a-popover position="bottom"> - <icon-more-vertical></icon-more-vertical> - <template #content> - <!--<div> - <a-button type="text" size="mini">缂栬緫</a-button> - </div>--> - <div> - <a-button - type="text" - size="mini" - @click="deleteSession(session)" - >鍒犻櫎</a-button - > - </div> - </template> - </a-popover> - </div> - </div> - </a-scrollbar> - <div class="left-bottom"> - <div class="item"><IconCommon />銆�<span>鍚戞湅鍙嬫帹鑽�</span></div> - <div class="item"><IconCommon />銆�<span>鏈�鏂版秷鎭�</span></div> - <div class="item"><IconCommon />銆�<span>闂鍙嶉</span></div> - <div class="item"><IconCommon />銆�<span>甯歌闂</span></div> - <div class="item"><IconPoweroff />銆�<span>閫�鍑�</span></div> - </div> - </a-card> - </a-col> - <a-col :span="19"> - <a-card class="right"> - <div v-if="sessionDetailList.length === 0"> - <div class="right-title">ChatAI</div> - <a-row justify="center" class="right-middle"> - <a-col :span="5" class="item"> - <p><a-image :src="img1" width="50px"></a-image></p> - <p>绀轰緥</p> - </a-col> - <a-col :span="5" class="item"> - <p><a-image :src="img2" width="50px"></a-image></p> - <p>鏍稿績鍔熻兘</p> - </a-col> - <a-col :span="5" class="item"> - <p><a-image :src="img3" width="50px"></a-image></p> - <p>灞�闄愭��</p> - </a-col> - </a-row> - <a-row justify="center" class="right-middle-list"> - <a-col :span="6" class="item">鈥滆鐢ㄧ畝鍗曠殑鏈瑙i噴閲忓瓙璁$畻鈥�</a-col> - <a-col :span="6" class="item">鍙互瀵瑰巻鍙插璇濊繘琛岃蹇�</a-col> - <a-col :span="6" class="item">鍙兘浼氬嚭鐜伴敊璇殑鍐呭</a-col> - </a-row> - <a-row justify="center" class="right-middle-list"> - <a-col :span="6" class="item" - >鈥滄彁渚涗竴浜涘簡绁�10宀佸瀛愮敓鏃ョ殑鍒涙剰锛熲��</a-col - > - <a-col :span="6" class="item">鍏佽鐢ㄦ埛瀵圭瓟妗堣繘琛屼慨姝�</a-col> - <a-col :span="6" class="item">鍙兘浼氫骇鐢熸湁瀹虫垨铏氬亣鐨勫唴瀹�</a-col> - </a-row> - <a-row justify="center" class="right-middle-list"> - <a-col :span="6" class="item" - >鈥滃浣曞湪Javascript涓彂鍑篽ttp璇锋眰锛熲��</a-col - > - <a-col :span="6" class="item">鍙互鎺ュ彈鎴栨嫆缁濅笉鎭板綋鐨勮缁�</a-col> - <a-col :span="6" class="item" - >瀵�2023骞翠互鍚庡緱涓栫晫鍜屼簨浠朵簡瑙f湁闄�</a-col - > - </a-row> - </div> - <a-scrollbar - ref="scrollbar" - id="home" - v-else - class="chat-list" - style="width: 90%; overflow: auto; height: 70vh; margin: 0px auto" - > - <div class="chat-item" v-for="sessionDetail in sessionDetailList"> - <a-comment - v-if="sessionDetail.role === 'user'" - avatar="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp" - > - <template #content> - <div :class="{ light: theme === 'light' }">{{ - sessionDetail.content - }}</div> - </template> - </a-comment> - <a-comment - v-else-if="sessionDetail.role === 'assistant'" - avatar="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/9eeb1800d9b78349b24682c3518ac4a3.png~tplv-uwbnlip3yd-webp.webp" - > - <template #content> - <a-card - class="chat-item-answer" - style="background-color: rgba(63, 64, 79, 1)" - > - <div :class="{ light: theme === 'light' }">{{ - sessionDetail.content - }}</div> - </a-card> - </template> - </a-comment> - <a-comment - v-else-if="sessionDetail.role === 'last'" - avatar="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/9eeb1800d9b78349b24682c3518ac4a3.png~tplv-uwbnlip3yd-webp.webp" - > - <template #content> - <a-textarea - readonly - auto-size - v-model="displayedText" - class="chat-item-answer" - style="background-color: rgba(63, 64, 79, 1)" - > - </a-textarea> - </template> - </a-comment> - </div> - </a-scrollbar> - <div class="bottom"> - <div class="input"> - <a-input - v-model="inputMsg" - @keydown.enter="sendMessage" - placeholder="杈撳叆鎮ㄦ兂浜嗚В鐨勫唴瀹癸紝鎸塃nter鍙戦��" - > - <template #suffix> - <icon-send style="cursor: pointer" @click="sendMessage" /> - </template> </a-input - ></div> - <div class="text" - >鍐呭鐢盇I鐢熸垚锛屼粎渚涘弬鑰冿紝璇烽伒瀹堛�婄敤鎴峰崗璁�嬨�併�婁釜浜轰俊鎭繚鎶よ鍒欍�嬶紝鍩轰簬ChatGPT澶фā鍨嬶紝鐗堟湰锛歏3.3.0</div - > - </div> - </a-card> - </a-col> - </a-row> - </div> -</template> - -<style scoped lang="scss"> - .isLeftActive { - background-color: rgba(52, 53, 66, 1); - } - .light { - color: white !important; - } - .container { - background-color: #1d2129; - .left, - .right { - color: white; - height: calc(100vh - 60px); - border: 0px; - } - .left { - position: relative; - background-color: rgba(30, 33, 34, 1); - .card-btn { - width: 90%; - margin: 15px auto; - border: 1px solid white; - color: white; - } - .left-list { - .item { - display: flex; - justify-content: space-between; - padding-left: 30px; - color: white; - cursor: pointer; - line-height: 40px; - .item-right { - margin-right: 10px; - } - &:hover { - background-color: rgba(52, 53, 66, 1); - } - } - } - .left-bottom { - position: absolute; - bottom: 30px; - left: 40px; - .item { - text-align: left; - color: white; - font-size: 12px; - line-height: 30px; - } - } - } - .right { - position: relative; - background-color: rgba(52, 53, 66, 1); - .right-title { - font-size: 30px; - color: white; - text-align: center; - margin-top: 100px; - } - .right-middle { - margin-top: 40px; - text-align: center; - color: white; - } - .right-middle-list { - color: white; - .item { - padding-top: 15px; - text-align: center; - height: 50px; - background-color: rgba(63, 64, 79, 1); - margin: 8px 20px; - border-radius: 10px; - } - } - .bottom { - width: 100%; - position: absolute; - bottom: 40px; - left: 20%; - .input { - width: 60%; - } - .text { - font-size: 12px; - color: lightgrey; - line-height: 40px; - } - } - .chat-list { - width: 90%; - margin: 0px auto; - .chat-item { - margin-top: 20px; - .chat-item-answer { - color: white; - } - } - } - } - } -</style> diff --git a/src/views/session/sessionManager/components/addSession.vue b/src/views/sessionManager/components/addSession.vue similarity index 100% rename from src/views/session/sessionManager/components/addSession.vue rename to src/views/sessionManager/components/addSession.vue diff --git a/src/views/session/sessionRecordsManager/index.vue b/src/views/sessionManager/index.vue similarity index 99% rename from src/views/session/sessionRecordsManager/index.vue rename to src/views/sessionManager/index.vue index 15079e2..d0d32a3 100644 --- a/src/views/session/sessionRecordsManager/index.vue +++ b/src/views/sessionManager/index.vue @@ -323,7 +323,7 @@ import { Message } from '@arco-design/web-vue'; import { EventSourceParserStream } from 'eventsource-parser/stream'; import moment from 'moment'; - import AddSession from '@/views/session/sessionManager/components/addSession.vue'; + import AddSession from '@/views/sessionManager/components/addSession.vue'; import { chatApi, getDialogListApi, -- Gitblit v1.8.0