From eebb5a920b707067b57bbdd3dfecc36e3f4ae545 Mon Sep 17 00:00:00 2001 From: jiangjunjie Date: Fri, 18 Sep 2026 16:36:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=83=A8=E5=88=86=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/send-button.png | Bin 0 -> 4995 bytes src/components/chat-new.vue | 136 +++++++++++++++++++++++- src/components/emoticon-box.vue | 2 +- src/components/footer-bar-input.vue | 155 ++++++++++++---------------- src/components/history-content.vue | 2 +- src/components/quick-access.vue | 2 +- src/components/send-message.vue | 2 +- src/components/text-content.vue | 2 +- src/components/text-folding.vue | 2 +- src/main.js | 10 +- src/utils/socket.js | 2 +- src/views/chat.vue | 4 +- 12 files changed, 218 insertions(+), 101 deletions(-) create mode 100644 src/assets/images/send-button.png diff --git a/src/assets/images/send-button.png b/src/assets/images/send-button.png new file mode 100644 index 0000000000000000000000000000000000000000..183a1ee9dd66114e5ded4bb61aa00656fa6a9e4e GIT binary patch literal 4995 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 -import { ref, onMounted } from 'vue' +import { ref, computed, inject, watch, nextTick } from 'vue' +import footerBarInput from '@/components/footer-bar-input.vue' +import { messageSend } from '@/utils/api' defineOptions({ name: 'chat-new', }) +const store = inject('appStore', null) +const chatArr = inject('chatArr', ref([])) +const isChatLoading = inject('isChatLoading', ref(false)) +const mainContainerRef = ref(null) const welcomeWord = ref('下午好,张先生') const welcomeSubWord = ref('我是您的服务管家皮卡丘') const abstractList = ref([ @@ -32,11 +38,44 @@ const abstractList = ref([ }, ]) const askList = ref(['贷款到期可以先还利息吗?', '查询已交费总额', '保单能领多少钱?']) + +function getItemText(item) { + return item?.message?.[0]?.options?.label || '' +} + +const showTyping = computed( + () => + isChatLoading.value && + chatArr.value.length > 0 && + chatArr.value[chatArr.value.length - 1].type === 'user', +) + +function sendText(text) { + if (!text) return + store?.pushUserMessage?.(text) + messageSend(text).catch((err) => { + console.log(err) + store?.pushUserMessage?.('服务异常,请您稍后再试~', 'bot') + }) +} + +function handleAskClick(item) { + sendText(item) +} + +watch( + () => chatArr.value.length, + async () => { + await nextTick() + const el = mainContainerRef.value + if (el) el.scrollTop = el.scrollHeight + }, +) @@ -97,6 +156,13 @@ const askList = ref(['贷款到期可以先还利息吗?', '查询已交费总 display: flex; flex-direction: column; padding: 12rem; + .chat-footer { + flex-shrink: 0; + margin: 12rem -12rem -12rem; + background: #ffffff; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } .main-container { flex: 1; overflow: auto; @@ -343,6 +409,70 @@ const askList = ref(['贷款到期可以先还利息吗?', '查询已交费总 } } } + .message-con { + display: flex; + flex-direction: column; + gap: 12rem; + margin-top: 16rem; + .msg-item { + display: flex; + .bubble { + max-width: 80%; + padding: 10rem 14rem; + font-family: PingFang SC; + font-size: 14rem; + font-weight: normal; + line-height: 20rem; + letter-spacing: 0rem; + color: #17204d; + word-break: break-all; + } + } + .from-user { + justify-content: flex-end; + .bubble { + background: linear-gradient(266deg, #025cea 0%, #3f8cf8 100%); + color: #ffffff; + border-radius: 12rem 12rem 4rem 12rem; + } + } + .from-bot { + justify-content: flex-start; + .bubble { + background: #fcfdfd; + box-shadow: 0rem 4rem 10rem 0rem #e7effd; + border-radius: 12rem 12rem 12rem 4rem; + } + } + .typing { + display: flex; + align-items: center; + gap: 5rem; + span { + width: 6rem; + height: 6rem; + border-radius: 50%; + background: #7e849f; + animation: typing-blink 1s infinite; + &:nth-child(2) { + animation-delay: 0.2s; + } + &:nth-child(3) { + animation-delay: 0.4s; + } + } + } + @keyframes typing-blink { + 0%, + 80%, + 100% { + opacity: 0.2; + } + 40% { + opacity: 1; + } + } + } } } diff --git a/src/components/emoticon-box.vue b/src/components/emoticon-box.vue index 4d2461c..5082243 100644 --- a/src/components/emoticon-box.vue +++ b/src/components/emoticon-box.vue @@ -10,7 +10,7 @@ import faceJSON from '@/mock/face.json' const elder = inject('elder', false) -const publicPath = ref(process.env.VUE_APP_SRC) +const publicPath = ref(import.meta.env.BASE_URL) const active = ref(0) const faceData = ref(faceJSON) const faceIndex = ref(0) diff --git a/src/components/footer-bar-input.vue b/src/components/footer-bar-input.vue index b1e2f5a..0fd1744 100644 --- a/src/components/footer-bar-input.vue +++ b/src/components/footer-bar-input.vue @@ -41,6 +41,7 @@
+
-
+
-
+
+ > +
- {{ txtTips }} + +
+ + +
-
- - -
- - - - - - - - - - - - - -
+ + + + + + + + + + + + + + +