1 line
27 KiB
Plaintext
1 line
27 KiB
Plaintext
{"version":3,"sources":["pages/mall/consumer/chat.uvue","pages/user/profile.uvue","pages/mall/consumer/index.uvue","pages/user/terms.uvue","pages/user/login.uvue","pages/mall/consumer/settings.uvue","pages/user/center.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<!-- pages/mall/consumer/chat.uvue -->\r\n<template>\r\n <view class=\"chat-page\">\r\n <!-- 聊天头部 -->\r\n <view class=\"chat-header\" :style=\"{ paddingTop: navPaddingTop }\">\r\n <view class=\"header-back\" @click=\"goBack\">\r\n <text class=\"back-icon\">‹</text>\r\n </view>\r\n <view class=\"header-info\">\r\n <text class=\"chat-title\">{{ headerTitle }}</text>\r\n <text class=\"chat-status\">在线</text>\r\n </view>\r\n <view class=\"header-actions\">\r\n <text class=\"action-icon\" @click=\"showMoreActions\">⋮</text>\r\n </view>\r\n </view>\r\n \r\n <!-- 聊天内容 -->\r\n <scroll-view \r\n scroll-y \r\n class=\"chat-content\"\r\n :scroll-into-view=\"scrollToView\"\r\n scroll-with-animation\r\n >\r\n <!-- 聊天消息列表 -->\r\n <view class=\"chat-messages\">\r\n <!-- 系统消息 -->\r\n <view class=\"message-item system\">\r\n <text class=\"system-text\">客服 小美 已接入,请描述您的问题</text>\r\n </view>\r\n \r\n <!-- 时间分割线 -->\r\n <view class=\"time-divider\">\r\n <text class=\"time-text\">今天 14:30</text>\r\n </view>\r\n \r\n <!-- 消息项 -->\r\n <view \r\n v-for=\"message in messages\" \r\n :key=\"message.id\"\r\n :class=\"['message-item', message.type]\"\r\n :id=\"'msg-' + message.id\"\r\n >\r\n <!-- 对方消息 -->\r\n <view v-if=\"message.type === 'received'\" class=\"message-wrapper\">\r\n <image \r\n class=\"avatar\" \r\n src=\"/static/icons/shop-default.png\" \r\n mode=\"aspectFill\"\r\n />\r\n <view class=\"message-content-wrapper\">\r\n <text class=\"sender-name\">{{ headerTitle }}</text>\r\n <view class=\"message-bubble\">\r\n <text class=\"message-text\">{{ message.content }}</text>\r\n <text class=\"message-time\">{{ message.time }}</text>\r\n </view>\r\n </view>\r\n </view>\r\n \r\n <!-- 我的消息 -->\r\n <view v-else class=\"message-wrapper me\">\r\n <view class=\"message-content-wrapper\">\r\n <view class=\"message-bubble me\">\r\n <text class=\"message-text\">{{ message.content }}</text>\r\n <text class=\"message-time\">{{ message.time }}</text>\r\n </view>\r\n </view>\r\n <image \r\n class=\"avatar me\" \r\n src=\"/static/avatar-default.png\" \r\n mode=\"aspectFill\"\r\n />\r\n </view>\r\n </view>\r\n </view>\r\n </scroll-view>\r\n \r\n <!-- 聊天输入区 -->\r\n <view class=\"chat-input\">\r\n <view class=\"input-tools\">\r\n <text class=\"tool-icon\" @click=\"showEmojiPicker\">😊</text>\r\n <text class=\"tool-icon\" @click=\"showImagePicker\">📷</text>\r\n <text class=\"tool-icon\" @click=\"showMoreTools\">➕</text>\r\n </view>\r\n \r\n <view class=\"input-wrapper\">\r\n <input \r\n class=\"message-input\" \r\n v-model=\"inputMessage\"\r\n placeholder=\"请输入消息...\"\r\n :focus=\"inputFocus\"\r\n @confirm=\"sendMessage\"\r\n confirm-type=\"send\"\r\n />\r\n <button \r\n class=\"send-button\" \r\n :class=\"{ active: inputMessage.trim() }\" \r\n @click=\"sendMessage\"\r\n >\r\n 发送\r\n </button>\r\n </view>\r\n </view>\r\n \r\n <!-- 表情选择器 -->\r\n <scroll-view v-if=\"showEmoji\" class=\"emoji-picker\" direction=\"vertical\">\r\n <view class=\"emoji-category\">\r\n <text \r\n v-for=\"emoji in emojiList\" \r\n :key=\"emoji\"\r\n class=\"emoji-item\"\r\n @click=\"insertEmoji(emoji)\"\r\n >\r\n {{ emoji }}\r\n </text>\r\n </view>\r\n </scroll-view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'\r\nimport { supabaseService, type ChatMessage } from '@/utils/supabaseService.uts'\r\nimport supa from '@/components/supadb/aksupainstance.uts'\r\nimport type { AkSupaRealtimeChannel } from '@/components/supadb/aksupa.uts'\r\nimport { getCurrentUser } from '@/utils/store.uts'\r\n\r\ntype UiChatMessage = {\r\n\tid: string\r\n\ttype: string\r\n\tcontent: string\r\n\ttime: string\r\n}\r\n\r\n// 响应式数据\r\nconst messages = ref<UiChatMessage[]>([])\r\nconst inputMessage = ref<string>('')\r\nconst inputFocus = ref<boolean>(false)\r\nconst showEmoji = ref<boolean>(false)\r\nconst scrollToView = ref<string>('')\r\nconst currentUserId = ref<string>('')\r\nconst merchantId = ref<string>('') // 商家ID\r\nconst headerTitle = ref<string>('在线客服')\r\nconst navPaddingTop = ref<string>('30px') // 默认值,包含状态栏高度+原有内边距\r\nlet realtimeChannel: AkSupaRealtimeChannel | null = null\r\n\r\n// 模拟表情列表\r\nconst emojiList = ['😊', '😂', '🤣', '😍', '😘', '🥰', '😭', '😡', '👍', '👏', '🙏', '🎉', '❤️', '🔥', '⭐']\r\n\r\nfunction scrollToBottom(): void {\r\n nextTick(() => {\r\n if (messages.value.length > 0) {\r\n const lastMsgId = messages.value[messages.value.length - 1].id\r\n scrollToView.value = 'msg-' + lastMsgId\r\n }\r\n })\r\n}\r\n\r\nfunction getCurrentTime(): string {\r\n const now = new Date()\r\n const hours = now.getHours().toString().padStart(2, '0')\r\n const minutes = now.getMinutes().toString().padStart(2, '0')\r\n return `${hours}:${minutes}`\r\n}\r\n\r\nfunction setupRealtimeSubscription(): void {\r\n\tconsole.log('开始建立聊天实时订阅...')\r\n\tconst filter = ({\r\n\t\tevent: 'INSERT',\r\n\t\tschema: 'public',\r\n\t\ttable: 'ml_chat_messages'\r\n\t} as UTSJSONObject)\r\n\r\n\trealtimeChannel = supa.channel('public:ml_chat_messages')\r\n\t\t.on('postgres_changes', filter, (payload: any) => {\r\n\t\t\tconst payloadObj = (payload instanceof UTSJSONObject) ? (payload as UTSJSONObject) : (JSON.parse(JSON.stringify(payload ?? {})) as UTSJSONObject)\r\n\t\t\tconst newMsgAny = payloadObj.get('new')\r\n\t\t\tif (newMsgAny == null) return\r\n\t\t\tconst newMsg = (newMsgAny instanceof UTSJSONObject) ? (newMsgAny as UTSJSONObject) : (JSON.parse(JSON.stringify(newMsgAny)) as UTSJSONObject)\r\n\t\t\tconsole.log('收到新消息:', newMsg)\r\n\r\n\t\t\tconst senderId = newMsg.getString('sender_id') ?? ''\r\n\t\t\tconst receiverId = newMsg.getString('receiver_id') ?? ''\r\n\r\n\t\t\tif (senderId === currentUserId.value) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (receiverId === currentUserId.value) {\r\n\t\t\t\tif (merchantId.value != '' && senderId !== merchantId.value) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst createdAt = newMsg.getString('created_at') ?? new Date().toISOString()\r\n\t\t\t\tconst date = new Date(createdAt)\r\n\t\t\t\tconst timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\r\n\r\n\t\t\t\tconst incomingMsg: UiChatMessage = {\r\n\t\t\t\t\tid: newMsg.getString('id') ?? Date.now().toString(),\r\n\t\t\t\t\ttype: 'received',\r\n\t\t\t\t\tcontent: newMsg.getString('content') ?? '',\r\n\t\t\t\t\ttime: timeStr\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmessages.value.push(incomingMsg)\r\n\t\t\t\tscrollToBottom()\r\n\t\t\t}\r\n\t\t})\r\n\t\t.subscribe((status: string, err: any | null) => {\r\n\t\t\tconsole.log('订阅状态:', status)\r\n\t\t})\r\n}\r\n\r\nasync function loadChatHistory(): Promise<void> {\r\n\tlet rawMsgs: ChatMessage[] = []\r\n\r\n\tif (merchantId.value != '') {\r\n\t\trawMsgs = await supabaseService.getChatMessages(merchantId.value)\r\n\t} else {\r\n\t\tconsole.warn(\"No merchant ID provided for chat\")\r\n\t\treturn\r\n\t}\r\n\r\n\tmessages.value = rawMsgs.reverse().map((m: ChatMessage): UiChatMessage => {\r\n\t\tconst date = new Date(m.created_at ?? new Date().toISOString())\r\n\t\tconst timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\r\n\r\n\t\tconst sender = m.sender_id ?? ''\r\n\t\tconst msgType = (currentUserId.value != '' && sender == currentUserId.value) ? 'sent' : 'received'\r\n\t\tconst rawId = (m.id ?? '').toString()\r\n\t\tconst msgId = rawId !== '' ? rawId : Date.now().toString()\r\n\t\treturn {\r\n\t\t\tid: msgId,\r\n\t\t\ttype: msgType,\r\n\t\t\tcontent: m.content ?? '',\r\n\t\t\ttime: timeStr\r\n\t\t}\r\n\t})\r\n\r\n\tsetTimeout(() => {\r\n\t\tscrollToBottom()\r\n\t}, 100)\r\n}\r\n\r\n// 生命周期\r\nonLoad((options: any) => {\r\n // 动态获取状态栏高度\r\n const sysInfo = uni.getSystemInfoSync()\r\n const statusBarH = sysInfo.statusBarHeight\r\n // 状态栏高度 + 10px 原有顶部内边距\r\n navPaddingTop.value = (statusBarH + 10) + 'px'\r\n\r\n\tconst optObj = (options instanceof UTSJSONObject) ? (options as UTSJSONObject) : (JSON.parse(JSON.stringify(options ?? {})) as UTSJSONObject)\r\n\tconst mid = optObj.getString('merchantId') ?? ''\r\n\tif (mid !== '') {\r\n\t\tmerchantId.value = mid\r\n\t}\r\n\tconst mname = optObj.getString('merchantName') ?? ''\r\n\tif (mname !== '') {\r\n\t\theaderTitle.value = mname\r\n\t}\r\n})\r\n\r\nonMounted(() => {\r\n\tsupabaseService.ensureSession().then((uid) => {\r\n\t\tif (uid != null) {\r\n\t\t\tcurrentUserId.value = uid\r\n\t\t} else {\r\n\t\t\tgetCurrentUser().then((user) => {\r\n\t\t\t\tif (user != null) {\r\n\t\t\t\t\tcurrentUserId.value = user.id ?? ''\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tloadChatHistory()\r\n\t\tsetupRealtimeSubscription()\r\n\t})\r\n})\r\n\r\nonUnmounted(() => {\r\n if (realtimeChannel != null) {\r\n supa.removeChannel(realtimeChannel!!)\r\n }\r\n})\r\n\r\nconst sendMessage = async () => {\r\n const content = inputMessage.value.trim()\r\n if (content == '') return\r\n \r\n // 添加发送的消息 (乐观更新)\r\n const newMessage: UiChatMessage = {\r\n id: Date.now().toString(),\r\n type: 'sent',\r\n content: content,\r\n time: getCurrentTime()\r\n }\r\n \r\n messages.value.push(newMessage)\r\n inputMessage.value = ''\r\n \r\n // 滚动到底部\r\n scrollToBottom()\r\n\r\n // 发送到 Supabase\r\n if (merchantId.value != '') {\r\n const success = await supabaseService.sendMessage(merchantId.value, content)\r\n if (!success) {\r\n uni.showToast({\r\n title: '发送失败',\r\n icon: 'none'\r\n })\r\n }\r\n }\r\n}\r\n\r\n// 模拟客服回复 (已禁用,改用 Realtime)\r\n/*\r\nconst simulateCustomerReply = async () => {\r\n // ...\r\n}\r\n*/\r\n\r\n/* 移除不再使用的 simulateCustomerReply 和 addReceivedMessage */\r\n\r\n// 插入表情\r\nfunction insertEmoji(emoji: string): void {\r\n inputMessage.value += emoji\r\n inputFocus.value = true\r\n}\r\n\r\n// 显示表情选择器\r\nfunction showEmojiPicker(): void {\r\n showEmoji.value = !showEmoji.value\r\n}\r\n\r\n// 显示图片选择器\r\nfunction showImagePicker(): void {\r\n uni.chooseImage({\r\n count: 1,\r\n success: (res) => {\r\n console.log('选择图片:', res.tempFilePaths)\r\n // 这里可以处理图片上传\r\n }\r\n })\r\n}\r\n\r\n// 显示更多工具\r\nfunction showMoreTools(): void {\r\n uni.showActionSheet({\r\n itemList: ['发送位置', '发送文件', '发送语音'],\r\n success: (res) => {\r\n console.log('选择工具:', res.tapIndex)\r\n }\r\n })\r\n}\r\n\r\n// 显示更多操作\r\nfunction showMoreActions(): void {\r\n uni.showActionSheet({\r\n itemList: ['投诉客服', '结束对话', '清除记录'],\r\n success: (res) => {\r\n switch (res.tapIndex) {\r\n case 0:\r\n uni.navigateTo({ url: '/pages/mall/consumer/complaint' })\r\n break\r\n case 1:\r\n uni.showModal({\r\n title: '确认结束',\r\n content: '确定要结束本次对话吗?',\r\n success: (res) => {\r\n if (res.confirm) {\r\n uni.navigateBack()\r\n }\r\n }\r\n })\r\n break\r\n case 2:\r\n uni.showModal({\r\n title: '确认清除',\r\n content: '确定要清除聊天记录吗?',\r\n success: (res) => {\r\n if (res.confirm) {\r\n messages.value = []\r\n }\r\n }\r\n })\r\n break\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 返回\r\nconst goBack = () => {\r\n uni.navigateBack()\r\n}\r\n</script>\r\n\r\n<style>\r\n.chat-page {\r\n width: 100%;\r\n flex: 1;\r\n background-color: #f5f5f5;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n/* 聊天头部 */\r\n.chat-header {\r\n background-color: white;\r\n padding: 10px 15px;\r\n /* padding-top 由内联样式控制 */\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: space-between;\r\n border-bottom: 1px solid #eee;\r\n}\r\n\r\n.header-back {\r\n width: 40px;\r\n}\r\n\r\n.back-icon {\r\n font-size: 24px;\r\n color: #333;\r\n}\r\n\r\n.header-info {\r\n flex: 1;\r\n text-align: center;\r\n}\r\n\r\n.chat-title {\r\n font-size: 16px;\r\n font-weight: bold;\r\n color: #333;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.chat-status {\r\n font-size: 12px;\r\n color: #34c759;\r\n}\r\n\r\n.header-actions .action-icon {\r\n font-size: 20px;\r\n color: #333;\r\n width: 40px;\r\n text-align: right;\r\n}\r\n\r\n/* 聊天内容区 */\r\n.chat-content {\r\n flex: 1;\r\n padding: 15px;\r\n padding-bottom: 70px; /* 为输入区留出空间 */\r\n}\r\n\r\n/* 系统消息 */\r\n.message-item.system {\r\n text-align: center;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.system-text {\r\n font-size: 12px;\r\n color: #999;\r\n background-color: #f0f0f0;\r\n padding: 5px 15px;\r\n border-radius: 15px;\r\n\r\n}\r\n\r\n/* 时间分割线 */\r\n.time-divider {\r\n text-align: center;\r\n margin: 20px 0;\r\n}\r\n\r\n.time-text {\r\n font-size: 12px;\r\n color: #999;\r\n background-color: #f0f0f0;\r\n padding: 3px 10px;\r\n border-radius: 10px;\r\n}\r\n\r\n/* 消息项 */\r\n.message-wrapper {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 15px;\r\n}\r\n\r\n.message-wrapper.me {\r\n justify-content: flex-end;\r\n}\r\n\r\n.avatar {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 20px;\r\n margin-right: 10px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.avatar.me {\r\n margin-right: 0;\r\n margin-left: 10px;\r\n /* order: 2; removed for uni-app-x */\r\n}\r\n\r\n.message-content-wrapper {\r\n /* max-width removed */\r\n}\r\n\r\n.sender-name {\r\n font-size: 12px;\r\n color: #999;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.message-bubble {\r\n background-color: white;\r\n padding: 10px 15px;\r\n border-radius: 18px;\r\n position: relative;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\r\n /* max-width wrap removed */\r\n}\r\n\r\n.message-bubble.me {\r\n background-color: #95ec69;\r\n border-bottom-right-radius: 4px;\r\n}\r\n\r\n.message-bubble-not-me .message-content {\r\n border-bottom-left-radius: 4px;\r\n}\r\n\r\n.message-text {\r\n font-size: 15px;\r\n color: #333;\r\n line-height: 1.4;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.message-time {\r\n font-size: 11px;\r\n color: #999;\r\n text-align: right;\r\n}\r\n\r\n/* 聊天输入区 */\r\n.chat-input {\r\n background-color: white;\r\n border-top: 1px solid #eee;\r\n padding: 10px 15px;\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 100;\r\n}\r\n\r\n.input-tools {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.tool-icon {\r\n font-size: 20px;\r\n margin-right: 15px;\r\n color: #666;\r\n}\r\n\r\n.input-wrapper {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.message-input {\r\n flex: 1;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n padding: 10px 15px;\r\n font-size: 15px;\r\n margin-right: 10px;\r\n min-height: 40px;\r\n max-height: 100px;\r\n}\r\n\r\n.send-button {\r\n background-color: #ccc;\r\n color: white;\r\n border: none;\r\n border-radius: 20px;\r\n padding: 8px 20px;\r\n font-size: 14px;\r\n min-width: 60px;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.send-button.active {\r\n background-color: #ff5000;\r\n}\r\n\r\n/* 表情选择器 */\r\n.emoji-picker {\r\n background-color: white;\r\n border-top: 1px solid #eee;\r\n padding: 10px;\r\n height: 200px;\r\n /* overflow-y removed */\r\n position: fixed;\r\n bottom: 60px;\r\n left: 0;\r\n right: 0;\r\n z-index: 99;\r\n}\r\n\r\n.emoji-category {\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.emoji-item {\r\n font-size: 24px;\r\n padding: 8px;\r\n width: 45px;\r\n height: 45px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n/* 响应式适配 removed for strict uv-app-x compliance */\r\n</style>\r\n",null,null,null,null,null,null,null],"names":[],"mappings":"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"} |