From fe48f87f37f1a6d7cddf6bf17789f7bbcdd41e16 Mon Sep 17 00:00:00 2001 From: puhui999 <puhui999@163.com> Date: Wed, 17 Jul 2024 17:22:19 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E9=87=8D=E6=9E=84=E3=80=91=E5=AE=A2?= =?UTF-8?q?=E6=9C=8D=E6=8A=BD=E7=A6=BB=E5=B0=81=E8=A3=85=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kefu/components/KeFuMessageList.vue | 47 ++++++++++--- .../components/message/ImageMessageItem.vue | 34 ---------- .../{TextMessageItem.vue => MessageItem.vue} | 16 ++--- .../{OrderMessageItem.vue => OrderItem.vue} | 68 ++++++++----------- .../components/message/ProductMessageItem.vue | 39 ----------- 5 files changed, 71 insertions(+), 133 deletions(-) delete mode 100644 src/views/mall/promotion/kefu/components/message/ImageMessageItem.vue rename src/views/mall/promotion/kefu/components/message/{TextMessageItem.vue => MessageItem.vue} (53%) rename src/views/mall/promotion/kefu/components/message/{OrderMessageItem.vue => OrderItem.vue} (56%) delete mode 100644 src/views/mall/promotion/kefu/components/message/ProductMessageItem.vue diff --git a/src/views/mall/promotion/kefu/components/KeFuMessageList.vue b/src/views/mall/promotion/kefu/components/KeFuMessageList.vue index bdcab5dc..7e0306c4 100644 --- a/src/views/mall/promotion/kefu/components/KeFuMessageList.vue +++ b/src/views/mall/promotion/kefu/components/KeFuMessageList.vue @@ -40,19 +40,46 @@ v-if="item.senderType === UserTypeEnum.MEMBER" :src="conversation.userAvatar" alt="avatar" + class="w-60px h-60px" /> <div :class="{ 'kefu-message': KeFuMessageContentTypeEnum.TEXT === item.contentType }" class="p-10px" > <!-- 文本消息 --> - <TextMessageItem :message="item" /> + <MessageItem :content-type="KeFuMessageContentTypeEnum.TEXT" :message="item"> + <div + v-dompurify-html="replaceEmoji(item.content)" + class="flex items-center" + ></div> + </MessageItem> <!-- 图片消息 --> - <ImageMessageItem :message="item" /> + <MessageItem :content-type="KeFuMessageContentTypeEnum.IMAGE" :message="item"> + <el-image + :initial-index="0" + :preview-src-list="[item.content]" + :src="item.content" + class="w-200px" + fit="contain" + preview-teleported + /> + </MessageItem> <!-- 商品消息 --> - <ProductMessageItem :message="item" /> + <MessageItem :content-type="KeFuMessageContentTypeEnum.PRODUCT" :message="item"> + <ProductItem + :picUrl="getMessageContent(item).picUrl" + :price="getMessageContent(item).price" + :skuText="getMessageContent(item).introduction" + :title="getMessageContent(item).spuName" + :titleWidth="400" + class="max-w-70%" + priceColor="#FF3000" + /> + </MessageItem> <!-- 订单消息 --> - <OrderMessageItem :message="item" /> + <MessageItem :content-type="KeFuMessageContentTypeEnum.ORDER" :message="item"> + <OrderItem :message="item" /> + </MessageItem> </div> <el-avatar v-if="item.senderType === UserTypeEnum.ADMIN" @@ -97,11 +124,9 @@ import { KeFuMessageApi, KeFuMessageRespVO } from '@/api/mall/promotion/kefu/mes import { KeFuConversationRespVO } from '@/api/mall/promotion/kefu/conversation' import EmojiSelectPopover from './tools/EmojiSelectPopover.vue' import PictureSelectUpload from './tools/PictureSelectUpload.vue' -import TextMessageItem from './message/TextMessageItem.vue' -import ImageMessageItem from './message/ImageMessageItem.vue' -import ProductMessageItem from './message/ProductMessageItem.vue' -import OrderMessageItem from './message/OrderMessageItem.vue' -import { Emoji } from './tools/emoji' +import ProductItem from './message/ProductItem.vue' +import OrderItem from './message/OrderItem.vue' +import { Emoji, useEmoji } from './tools/emoji' import { KeFuMessageContentTypeEnum } from './tools/constants' import { isEmpty } from '@/utils/is' import { UserTypeEnum } from '@/utils/constants' @@ -115,7 +140,7 @@ dayjs.extend(relativeTime) defineOptions({ name: 'KeFuMessageList' }) const message = ref('') // 消息弹窗 - +const { replaceEmoji } = useEmoji() const messageTool = useMessage() const messageList = ref<KeFuMessageRespVO[]>([]) // 消息列表 const conversation = ref<KeFuConversationRespVO>({} as KeFuConversationRespVO) // 用户会话 @@ -127,6 +152,8 @@ const queryParams = reactive({ }) const total = ref(0) // 消息总条数 const refreshContent = ref(false) // 内容刷新,主要解决会话消息页面高度不一致导致的滚动功能精度失效 +/** 获悉消息内容 */ +const getMessageContent = computed(() => (item: any) => JSON.parse(item.content)) /** 获得消息列表 */ const getMessageList = async () => { const res = await KeFuMessageApi.getKeFuMessagePage(queryParams) diff --git a/src/views/mall/promotion/kefu/components/message/ImageMessageItem.vue b/src/views/mall/promotion/kefu/components/message/ImageMessageItem.vue deleted file mode 100644 index 6b60651b..00000000 --- a/src/views/mall/promotion/kefu/components/message/ImageMessageItem.vue +++ /dev/null @@ -1,34 +0,0 @@ -<template> - <!-- 图片消息 --> - <template v-if="KeFuMessageContentTypeEnum.IMAGE === message.contentType"> - <div - :class="[ - message.senderType === UserTypeEnum.MEMBER - ? `ml-10px` - : message.senderType === UserTypeEnum.ADMIN - ? `mr-10px` - : '' - ]" - > - <el-image - :initial-index="0" - :preview-src-list="[message.content]" - :src="message.content" - class="w-200px" - fit="contain" - preview-teleported - /> - </div> - </template> -</template> - -<script lang="ts" setup> -import { KeFuMessageContentTypeEnum } from '../tools/constants' -import { UserTypeEnum } from '@/utils/constants' -import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' - -defineOptions({ name: 'ImageMessageItem' }) -defineProps<{ - message: KeFuMessageRespVO -}>() -</script> diff --git a/src/views/mall/promotion/kefu/components/message/TextMessageItem.vue b/src/views/mall/promotion/kefu/components/message/MessageItem.vue similarity index 53% rename from src/views/mall/promotion/kefu/components/message/TextMessageItem.vue rename to src/views/mall/promotion/kefu/components/message/MessageItem.vue index fd4b6edb..c3033ac3 100644 --- a/src/views/mall/promotion/kefu/components/message/TextMessageItem.vue +++ b/src/views/mall/promotion/kefu/components/message/MessageItem.vue @@ -1,8 +1,7 @@ <template> - <!-- 文本消息 --> - <template v-if="KeFuMessageContentTypeEnum.TEXT === message.contentType"> + <!-- 消息组件 --> + <template v-if="contentType === message.contentType"> <div - v-dompurify-html="replaceEmoji(message.content)" :class="[ message.senderType === UserTypeEnum.MEMBER ? `ml-10px` @@ -10,20 +9,19 @@ ? `mr-10px` : '' ]" - class="flex items-center" - ></div> + > + <slot></slot> + </div> </template> </template> <script lang="ts" setup> -import { KeFuMessageContentTypeEnum } from '../tools/constants' import { UserTypeEnum } from '@/utils/constants' -import { useEmoji } from '../tools/emoji' import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' -defineOptions({ name: 'TextMessageItem' }) +defineOptions({ name: 'MessageItem' }) defineProps<{ message: KeFuMessageRespVO + contentType: number }>() -const { replaceEmoji } = useEmoji() </script> diff --git a/src/views/mall/promotion/kefu/components/message/OrderMessageItem.vue b/src/views/mall/promotion/kefu/components/message/OrderItem.vue similarity index 56% rename from src/views/mall/promotion/kefu/components/message/OrderMessageItem.vue rename to src/views/mall/promotion/kefu/components/message/OrderItem.vue index cebe9626..80a4ab72 100644 --- a/src/views/mall/promotion/kefu/components/message/OrderMessageItem.vue +++ b/src/views/mall/promotion/kefu/components/message/OrderItem.vue @@ -1,57 +1,43 @@ <template> - <!-- 图片消息 --> - <template v-if="KeFuMessageContentTypeEnum.ORDER === message.contentType"> - <div - :class="[ - message.senderType === UserTypeEnum.MEMBER - ? `ml-10px` - : message.senderType === UserTypeEnum.ADMIN - ? `mr-10px` - : '' - ]" - > - <div :key="getMessageContent.id" class="order-list-card-box mt-14px max-w-70%"> - <div class="order-card-header flex items-center justify-between p-x-20px"> - <div class="order-no">订单号:{{ getMessageContent.no }}</div> - <div :class="formatOrderColor(getMessageContent)" class="order-state font-16"> - {{ formatOrderStatus(getMessageContent) }} - </div> + <div :key="getMessageContent.id" class="order-list-card-box mt-14px max-w-70%"> + <div class="order-card-header flex items-center justify-between p-x-20px"> + <div class="order-no">订单号:{{ getMessageContent.no }}</div> + <div :class="formatOrderColor(getMessageContent)" class="order-state font-16"> + {{ formatOrderStatus(getMessageContent) }} + </div> + </div> + <div v-for="item in getMessageContent.items" :key="item.id" class="border-bottom"> + <ProductItem + :num="item.count" + :picUrl="item.picUrl" + :price="item.price" + :skuText="item.properties.map((property: any) => property.valueName).join(' ')" + :title="item.spuName" + /> + </div> + <div class="pay-box flex justify-end pr-20px"> + <div class="flex items-center"> + <div class="discounts-title pay-color" + >共 {{ getMessageContent?.productCount }} 件商品,总金额: </div> - <div v-for="item in getMessageContent.items" :key="item.id" class="border-bottom"> - <ProductItem - :num="item.count" - :picUrl="item.picUrl" - :price="item.price" - :skuText="item.properties.map((property: any) => property.valueName).join(' ')" - :title="item.spuName" - /> - </div> - <div class="pay-box flex justify-end pr-20px"> - <div class="flex items-center"> - <div class="discounts-title pay-color" - >共 {{ getMessageContent?.productCount }} 件商品,总金额: - </div> - <div class="discounts-money pay-color"> - ¥{{ fenToYuan(getMessageContent?.payPrice) }} - </div> - </div> + <div class="discounts-money pay-color"> + ¥{{ fenToYuan(getMessageContent?.payPrice) }} </div> </div> </div> - </template> + </div> </template> <script lang="ts" setup> -import { KeFuMessageContentTypeEnum } from '../tools/constants' -import ProductItem from './ProductItem.vue' -import { UserTypeEnum } from '@/utils/constants' -import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' import { fenToYuan } from '@/utils' +import ProductItem from './ProductItem.vue' +import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' -defineOptions({ name: 'OrderMessageItem' }) +defineOptions({ name: 'OrderItem' }) const props = defineProps<{ message: KeFuMessageRespVO }>() + const getMessageContent = computed(() => JSON.parse(props.message.content)) /** diff --git a/src/views/mall/promotion/kefu/components/message/ProductMessageItem.vue b/src/views/mall/promotion/kefu/components/message/ProductMessageItem.vue deleted file mode 100644 index 72cd8726..00000000 --- a/src/views/mall/promotion/kefu/components/message/ProductMessageItem.vue +++ /dev/null @@ -1,39 +0,0 @@ -<template> - <!-- 图片消息 --> - <template v-if="KeFuMessageContentTypeEnum.PRODUCT === message.contentType"> - <div - :class="[ - message.senderType === UserTypeEnum.MEMBER - ? `ml-10px` - : message.senderType === UserTypeEnum.ADMIN - ? `mr-10px` - : '' - ]" - > - <ProductItem - :picUrl="getMessageContent.picUrl" - :price="getMessageContent.price" - :skuText="getMessageContent.introduction" - :title="getMessageContent.spuName" - :titleWidth="400" - class="max-w-70%" - priceColor="#FF3000" - /> - </div> - </template> -</template> - -<script lang="ts" setup> -import { KeFuMessageContentTypeEnum } from '../tools/constants' -import ProductItem from './ProductItem.vue' -import { UserTypeEnum } from '@/utils/constants' -import { KeFuMessageRespVO } from '@/api/mall/promotion/kefu/message' - -defineOptions({ name: 'ProductMessageItem' }) -const props = defineProps<{ - message: KeFuMessageRespVO -}>() - -/** 获悉消息内容 */ -const getMessageContent = computed(() => JSON.parse(props.message.content)) -</script>