diff --git a/apps/web-antd/src/components/card-title/CardTitle.vue b/apps/web-antd/src/components/card-title/CardTitle.vue deleted file mode 100644 index b59ed966c..000000000 --- a/apps/web-antd/src/components/card-title/CardTitle.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - {{ title }} - - - diff --git a/apps/web-antd/src/components/card-title/index.ts b/apps/web-antd/src/components/card-title/index.ts deleted file mode 100644 index 4ebdb4494..000000000 --- a/apps/web-antd/src/components/card-title/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as CardTitle } from './CardTitle.vue'; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue deleted file mode 100644 index 5b1c1d39e..000000000 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuMessageList.vue +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - {{ conversation.userNickname }} - - - - - - - - - - {{ formatDate(item.createTime) }} - - - - {{ item.content }} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 有新消息 - - - - - - - - - - - - - - - - - - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts b/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts deleted file mode 100644 index 90ddd0df4..000000000 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as KeFuConversationList } from './KeFuConversationList.vue'; -export { default as KeFuMessageList } from './KeFuMessageList.vue'; -export { default as MemberInfo } from './member/MemberInfo.vue'; - -// TODO @jawe:components =》modules;在 vben 里,modules 是给自己用的,把一个大 vue 拆成 n 个小 vue;components 是给别的模块使用的; -// TODO @jawe:1)组件名小写,类似 conversation-list.vue;2)KeFu 开头可以去掉,因为已经是当前模块下,不用重复拼写; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue deleted file mode 100644 index c41885b83..000000000 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/message/OrderItem.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - - 订单号: - - {{ getMessageContent.no }} - - - - {{ formatOrderStatus(getMessageContent) }} - - - - - - - - - 共 {{ getMessageContent?.productCount }} 件商品,总金额: - - - ¥{{ fenToYuan(getMessageContent?.payPrice) }} - - - - - - - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/index.vue b/apps/web-antd/src/views/mall/promotion/kefu/index.vue index c45defe83..fb385a150 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/index.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/index.vue @@ -1,7 +1,7 @@ - - - + + - + - + - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/conversation-list.vue similarity index 73% rename from apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/conversation-list.vue index 16d8f349a..7110f53dd 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/KeFuConversationList.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/conversation-list.vue @@ -18,8 +18,6 @@ import { useMallKefuStore } from '#/store/mall/kefu'; import { KeFuMessageContentTypeEnum } from './tools/constants'; import { useEmoji } from './tools/emoji'; -defineOptions({ name: 'KeFuConversationList' }); - /** 打开右侧的消息列表 */ const emits = defineEmits<{ (e: 'change', v: MallKefuConversationApi.Conversation): void; @@ -160,23 +158,22 @@ onBeforeUnmount(() => { - - + + 会话记录({{ kefuStore.getConversationList.length }}) - - + + { - - {{ item.userNickname || 'null' }} - + + {{ + item.userNickname || 'null' + }} + {{ lastMessageTimeMap.get(item.id) ?? '计算中' }} @@ -201,17 +200,21 @@ onBeforeUnmount(() => { item.lastMessageContent, ) " - class="last-message color-[#999] !flex items-center" + class="line-clamp-1 flex items-center text-[13px] text-[#999]" > - + @@ -219,78 +222,26 @@ onBeforeUnmount(() => { 取消置顶 - + 删除会话 - + 取消 - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/modules/index.ts b/apps/web-antd/src/views/mall/promotion/kefu/modules/index.ts new file mode 100644 index 000000000..eb34eb6ff --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/index.ts @@ -0,0 +1,3 @@ +export { default as ConversationList } from './conversation-list.vue'; +export { default as MemberInfo } from './member/member-info.vue'; +export { default as MessageList } from './message-list.vue'; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/member-info.vue similarity index 51% rename from apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/member/member-info.vue index 1a5fb9d0d..077ddc0fc 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/member/MemberInfo.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/member-info.vue @@ -1,5 +1,7 @@ - - - + + 会员信息 最近浏览 交易订单 - - - - - - 基本信息 - - - - + + + + + + 基本信息 + + + + + + 账户信息 + + + + + - - 账户信息 - - - - - - - - + + - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue similarity index 83% rename from apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue index a6c7f1a2f..a7a5fa65c 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/member/OrderBrowsingHistory.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue @@ -4,9 +4,7 @@ import type { MallKefuConversationApi } from '#/api/mall/promotion/kefu/conversa import { computed, reactive, ref } from 'vue'; import { getOrderPage } from '#/api/mall/trade/order'; -import OrderItem from '#/views/mall/promotion/kefu/components/message/OrderItem.vue'; - -defineOptions({ name: 'OrderBrowsingHistory' }); +import OrderItem from '#/views/mall/promotion/kefu/modules/message/order-item.vue'; const list = ref([]); // 列表 const total = ref(0); // 总数 @@ -45,10 +43,5 @@ defineExpose({ getHistoryList, loadMore }); - + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue similarity index 91% rename from apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue index f8b733310..ef0a31e7c 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/member/ProductBrowsingHistory.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue @@ -4,9 +4,7 @@ import type { MallKefuConversationApi } from '#/api/mall/promotion/kefu/conversa import { computed, reactive, ref } from 'vue'; import { getBrowseHistoryPage } from '#/api/mall/product/history'; -import ProductItem from '#/views/mall/promotion/kefu/components/message/ProductItem.vue'; - -defineOptions({ name: 'ProductBrowsingHistory' }); +import ProductItem from '#/views/mall/promotion/kefu/modules/message/product-item.vue'; const list = ref([]); // 列表 const total = ref(0); // 总数 diff --git a/apps/web-antd/src/views/mall/promotion/kefu/modules/message-list.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/message-list.vue new file mode 100644 index 000000000..fc1ed8bcc --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/message-list.vue @@ -0,0 +1,425 @@ + + + + + + {{ conversation.userNickname }} + + + + + + + + + + {{ formatDate(item.createTime) }} + + + + {{ item.content }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 有新消息 + + + + + + + + + + + + + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/message-item.vue similarity index 92% rename from apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/message/message-item.vue index ceaefc0e3..589628a75 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/message/MessageItem.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/message-item.vue @@ -4,7 +4,6 @@ import type { MallKefuMessageApi } from '#/api/mall/promotion/kefu/message'; import { UserTypeEnum } from '@vben/constants'; /** 消息组件 */ -defineOptions({ name: 'MessageItem' }); defineProps<{ message: MallKefuMessageApi.Message; diff --git a/apps/web-antd/src/views/mall/promotion/kefu/modules/message/order-item.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/order-item.vue new file mode 100644 index 000000000..34eadc504 --- /dev/null +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/order-item.vue @@ -0,0 +1,130 @@ + + + + + + + 订单号: + + {{ getMessageContent.no }} + + + + {{ formatOrderStatus(getMessageContent) }} + + + + + + + + + 共 {{ getMessageContent?.productCount }} 件商品,总金额: + + + ¥{{ fenToYuan(getMessageContent?.payPrice) }} + + + + + diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/product-item.vue similarity index 51% rename from apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/message/product-item.vue index 78ccf86c1..a03fcbbc6 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/message/ProductItem.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/message/product-item.vue @@ -5,8 +5,6 @@ import { fenToYuan } from '@vben/utils'; import { Button, Image } from 'ant-design-vue'; -defineOptions({ name: 'ProductItem' }); - defineProps({ spuId: { type: Number, @@ -43,81 +41,33 @@ function openDetail(spuId: number) { - + - + - - {{ title }} + + {{ title }} 库存: {{ stock || 0 }} 销量: {{ salesCount || 0 }} - ¥{{ fenToYuan(price) }} + ¥{{ fenToYuan(price) }} 详情 - - diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts b/apps/web-antd/src/views/mall/promotion/kefu/modules/tools/constants.ts similarity index 100% rename from apps/web-antd/src/views/mall/promotion/kefu/components/tools/constants.ts rename to apps/web-antd/src/views/mall/promotion/kefu/modules/tools/constants.ts diff --git a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue b/apps/web-antd/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue similarity index 91% rename from apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue rename to apps/web-antd/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue index b50bc11dd..40a56d8a5 100644 --- a/apps/web-antd/src/views/mall/promotion/kefu/components/tools/EmojiSelectPopover.vue +++ b/apps/web-antd/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue @@ -10,8 +10,6 @@ import { List, Popover } from 'ant-design-vue'; import { useEmoji } from './emoji'; -defineOptions({ name: 'EmojiSelectPopover' }); - /** 选择 emoji 表情 */ const emits = defineEmits<{ (e: 'selectEmoji', v: Emoji): void; @@ -26,9 +24,9 @@ function handleSelect(item: Emoji) { - + - + - - - 该功能支持 Vue3 + element-plus 版本! - - - - 可参考 - https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/mall/promotion/kefu/index - 代码,pull request 贡献给我们! - + + + + + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/conversation-list.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/conversation-list.vue new file mode 100644 index 000000000..3edb0e80c --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/conversation-list.vue @@ -0,0 +1,247 @@ + + + + + + 会话记录({{ kefuStore.getConversationList.length }}) + + + + + + + + + + + + {{ + item.userNickname || 'null' + }} + + {{ lastMessageTimeMap.get(item.id) ?? '计算中' }} + + + + + + + + + + + + + 置顶会话 + + + + 取消置顶 + + + + 删除会话 + + + + 取消 + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/index.ts b/apps/web-ele/src/views/mall/promotion/kefu/modules/index.ts new file mode 100644 index 000000000..eb34eb6ff --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/index.ts @@ -0,0 +1,3 @@ +export { default as ConversationList } from './conversation-list.vue'; +export { default as MemberInfo } from './member/member-info.vue'; +export { default as MessageList } from './message-list.vue'; diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/member/member-info.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/member-info.vue new file mode 100644 index 000000000..61c496c8f --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/member-info.vue @@ -0,0 +1,232 @@ + + + + + + + + 会员信息 + + + 最近浏览 + + + 交易订单 + + + + + + + + + 基本信息 + + + + + + 账户信息 + + + + + + + + + + + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue new file mode 100644 index 000000000..a7a5fa65c --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/order-browsing-history.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue new file mode 100644 index 000000000..ef0a31e7c --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/member/product-browsing-history.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/message-list.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/message-list.vue new file mode 100644 index 000000000..15bf7f3bf --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/message-list.vue @@ -0,0 +1,424 @@ + + + + + + {{ conversation.userNickname }} + + + + + + + + + + {{ formatDate(item.createTime) }} + + + + {{ item.content }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 有新消息 + + + + + + + + + + + + + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/message/message-item.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/message-item.vue new file mode 100644 index 000000000..589628a75 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/message-item.vue @@ -0,0 +1,25 @@ + + + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/message/order-item.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/order-item.vue new file mode 100644 index 000000000..34eadc504 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/order-item.vue @@ -0,0 +1,130 @@ + + + + + + + 订单号: + + {{ getMessageContent.no }} + + + + {{ formatOrderStatus(getMessageContent) }} + + + + + + + + + 共 {{ getMessageContent?.productCount }} 件商品,总金额: + + + ¥{{ fenToYuan(getMessageContent?.payPrice) }} + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/message/product-item.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/product-item.vue new file mode 100644 index 000000000..6d48657f9 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/message/product-item.vue @@ -0,0 +1,73 @@ + + + + + + + + + + + {{ title }} + + 库存: {{ stock || 0 }} + 销量: {{ salesCount || 0 }} + + + ¥{{ fenToYuan(price) }} + 详情 + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/constants.ts b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/constants.ts new file mode 100644 index 000000000..266a6cf02 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/constants.ts @@ -0,0 +1,17 @@ +/** 客服消息类型枚举类 */ +export const KeFuMessageContentTypeEnum = { + TEXT: 1, // 文本消息 + IMAGE: 2, // 图片消息 + VOICE: 3, // 语音消息 + VIDEO: 4, // 视频消息 + SYSTEM: 5, // 系统消息 + // ========== 商城特殊消息 ========== + PRODUCT: 10, // 商品消息 + ORDER: 11, // 订单消息" +}; + +/** Promotion 的 WebSocket 消息类型枚举类 */ +export const WebSocketMessageTypeConstants = { + KEFU_MESSAGE_TYPE: 'kefu_message_type', // 客服消息类型 + KEFU_MESSAGE_ADMIN_READ: 'kefu_message_read_status_change', // 客服消息管理员已读 +}; diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue new file mode 100644 index 000000000..2d14ec189 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji-select-popover.vue @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji.ts b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji.ts new file mode 100644 index 000000000..69b948d01 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/emoji.ts @@ -0,0 +1,126 @@ +import { onMounted, ref } from 'vue'; + +import { isEmpty } from '@vben/utils'; + +const emojiList = [ + { name: '[笑掉牙]', file: 'xiaodiaoya.png' }, + { name: '[可爱]', file: 'keai.png' }, + { name: '[冷酷]', file: 'lengku.png' }, + { name: '[闭嘴]', file: 'bizui.png' }, + { name: '[生气]', file: 'shengqi.png' }, + { name: '[惊恐]', file: 'jingkong.png' }, + { name: '[瞌睡]', file: 'keshui.png' }, + { name: '[大笑]', file: 'daxiao.png' }, + { name: '[爱心]', file: 'aixin.png' }, + { name: '[坏笑]', file: 'huaixiao.png' }, + { name: '[飞吻]', file: 'feiwen.png' }, + { name: '[疑问]', file: 'yiwen.png' }, + { name: '[开心]', file: 'kaixin.png' }, + { name: '[发呆]', file: 'fadai.png' }, + { name: '[流泪]', file: 'liulei.png' }, + { name: '[汗颜]', file: 'hanyan.png' }, + { name: '[惊悚]', file: 'jingshu.png' }, + { name: '[困~]', file: 'kun.png' }, + { name: '[心碎]', file: 'xinsui.png' }, + { name: '[天使]', file: 'tianshi.png' }, + { name: '[晕]', file: 'yun.png' }, + { name: '[啊]', file: 'a.png' }, + { name: '[愤怒]', file: 'fennu.png' }, + { name: '[睡着]', file: 'shuizhuo.png' }, + { name: '[面无表情]', file: 'mianwubiaoqing.png' }, + { name: '[难过]', file: 'nanguo.png' }, + { name: '[犯困]', file: 'fankun.png' }, + { name: '[好吃]', file: 'haochi.png' }, + { name: '[呕吐]', file: 'outu.png' }, + { name: '[龇牙]', file: 'ziya.png' }, + { name: '[懵比]', file: 'mengbi.png' }, + { name: '[白眼]', file: 'baiyan.png' }, + { name: '[饿死]', file: 'esi.png' }, + { name: '[凶]', file: 'xiong.png' }, + { name: '[感冒]', file: 'ganmao.png' }, + { name: '[流汗]', file: 'liuhan.png' }, + { name: '[笑哭]', file: 'xiaoku.png' }, + { name: '[流口水]', file: 'liukoushui.png' }, + { name: '[尴尬]', file: 'ganga.png' }, + { name: '[惊讶]', file: 'jingya.png' }, + { name: '[大惊]', file: 'dajing.png' }, + { name: '[不好意思]', file: 'buhaoyisi.png' }, + { name: '[大闹]', file: 'danao.png' }, + { name: '[不可思议]', file: 'bukesiyi.png' }, + { name: '[爱你]', file: 'aini.png' }, + { name: '[红心]', file: 'hongxin.png' }, + { name: '[点赞]', file: 'dianzan.png' }, + { name: '[恶魔]', file: 'emo.png' }, +]; + +export interface Emoji { + name: string; + url: string; +} + +export const useEmoji = () => { + const emojiPathList = ref([]); + + /** 加载本地图片 */ + const initStaticEmoji = async () => { + const pathList = import.meta.glob('../../asserts/*.{png,jpg,jpeg,svg}'); + for (const path in pathList) { + const imageModule: any = await pathList[path]?.(); + emojiPathList.value.push({ path, src: imageModule.default }); + } + }; + + /** 初始化 */ + onMounted(async () => { + if (isEmpty(emojiPathList.value)) { + await initStaticEmoji(); + } + }); + + /** + * 将文本中的表情替换成图片 + * + * @return 替换后的文本 + * @param content 消息内容 + */ + const replaceEmoji = (content: string) => { + let newData = content; + if (typeof newData !== 'object') { + const reg = /\[(.+?)\]/g; // [] 中括号 + const zhEmojiName = newData.match(reg); + if (zhEmojiName) { + zhEmojiName.forEach((item) => { + const emojiFile = getEmojiFileByName(item); + newData = newData.replace( + item, + ``, + ); + }); + } + } + return newData; + }; + + /** 获得所有表情 */ + function getEmojiList(): Emoji[] { + return emojiList.map((item) => ({ + url: getEmojiFileByName(item.name), + name: item.name, + })) as Emoji[]; + } + + function getEmojiFileByName(name: string) { + for (const emoji of emojiList) { + if (emoji.name === name) { + const emojiPath = emojiPathList.value.find( + (item: { path: string; src: string }) => + item.path.includes(emoji.file), + ); + return emojiPath ? emojiPath.src : undefined; + } + } + return false; + } + + return { replaceEmoji, getEmojiList }; +}; diff --git a/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/picture-select-upload.vue b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/picture-select-upload.vue new file mode 100644 index 000000000..b991f04a8 --- /dev/null +++ b/apps/web-ele/src/views/mall/promotion/kefu/modules/tools/picture-select-upload.vue @@ -0,0 +1,90 @@ + + + + + + + + diff --git a/packages/locales/src/langs/en-US/ui.json b/packages/locales/src/langs/en-US/ui.json index 7af6cf7ab..6fe3e8dfc 100644 --- a/packages/locales/src/langs/en-US/ui.json +++ b/packages/locales/src/langs/en-US/ui.json @@ -129,7 +129,8 @@ "maxSize": "A single file does not exceed {0}MB", "maxSizeMultiple": "Only upload files up to {0}MB!", "maxNumber": "Only upload up to {0} files", - "uploadSuccess": "Upload successfully" + "uploadSuccess": "Upload successfully", + "imgUploading": "Image sending, please wait..." }, "cropper": { "selectImage": "Select Image", diff --git a/packages/locales/src/langs/zh-CN/ui.json b/packages/locales/src/langs/zh-CN/ui.json index 2f7df1a6e..93a3f2bc2 100644 --- a/packages/locales/src/langs/zh-CN/ui.json +++ b/packages/locales/src/langs/zh-CN/ui.json @@ -129,7 +129,8 @@ "maxSize": "单个文件不超过{0}MB", "maxSizeMultiple": "只能上传不超过{0}MB的文件!", "maxNumber": "最多只能上传{0}个文件", - "uploadSuccess": "上传成功" + "uploadSuccess": "上传成功", + "imgUploading": "图片发送中,请稍等。。。" }, "cropper": { "selectImage": "选择图片", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 654a6e56f..926f993cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -175,7 +175,7 @@ catalogs: specifier: ^2.4.6 version: 2.4.6 '@vueuse/components': - specifier: ^13.4.0 + specifier: 13.9.0 version: 13.9.0 '@vueuse/core': specifier: ^13.4.0 @@ -672,10 +672,10 @@ importers: version: link:scripts/vsh '@vitejs/plugin-vue': specifier: 'catalog:' - version: 6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + version: 6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: 'catalog:' - version: 5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) + version: 5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)) '@vue/test-utils': specifier: 'catalog:' version: 2.4.6 @@ -717,10 +717,10 @@ importers: version: 3.6.1(sass@1.93.2)(typescript@5.9.3)(vue-tsc@2.2.10(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) vite: specifier: 'catalog:' - version: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + version: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vitest: specifier: 'catalog:' - version: 3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + version: 3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: specifier: ^3.5.17 version: 3.5.22(typescript@5.9.3) @@ -917,6 +917,9 @@ importers: '@vben/utils': specifier: workspace:* version: link:../../packages/utils + '@vueuse/components': + specifier: 'catalog:' + version: 13.9.0(vue@3.5.22(typescript@5.9.3)) '@vueuse/core': specifier: 'catalog:' version: 13.9.0(vue@3.5.22(typescript@5.9.3)) @@ -15123,14 +15126,14 @@ snapshots: dependencies: vite-plugin-pwa: 1.1.0(vite@5.4.21(@types/node@24.9.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0) - '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) '@rolldown/pluginutils': 1.0.0-beta.44 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -15152,10 +15155,10 @@ snapshots: vite: 5.4.21(@types/node@24.9.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0) vue: 3.5.22(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.22(typescript@5.9.3) '@vitejs/plugin-vue@6.0.1(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))': @@ -15172,13 +15175,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -21604,13 +21607,13 @@ snapshots: dependencies: vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) - vite-node@3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -21779,7 +21782,7 @@ snapshots: sass: 1.93.2 terser: 5.44.0 - vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) @@ -21790,7 +21793,7 @@ snapshots: optionalDependencies: '@types/node': 22.18.12 fsevents: 2.3.3 - jiti: 2.6.1 + jiti: 1.21.7 less: 4.4.2 sass: 1.93.2 terser: 5.44.0 @@ -21872,11 +21875,11 @@ snapshots: - typescript - universal-cookie - vitest@3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): + vitest@3.2.4(@types/node@22.18.12)(happy-dom@17.6.3)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -21894,8 +21897,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.18.12 @@ -21918,7 +21921,7 @@ snapshots: dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.11(@types/node@22.18.12)(jiti@1.21.7)(less@4.4.2)(sass@1.93.2)(terser@5.44.0)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5031b8161..1b3083a49 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -12,6 +12,7 @@ packages: - scripts/* - docs - playground + catalog: '@ast-grep/napi': ^0.37.0 '@changesets/changelog-github': ^0.5.1 @@ -73,7 +74,7 @@ catalog: '@vue/reactivity': ^3.5.17 '@vue/shared': ^3.5.17 '@vue/test-utils': ^2.4.6 - '@vueuse/components': ^13.4.0 + '@vueuse/components': 13.9.0 '@vueuse/core': ^13.4.0 '@vueuse/integrations': ^13.4.0 '@vueuse/motion': ^3.0.3