从零用 Java 实现小红书 SpringBoot Vue UniApp(16)消息体系:私信、群聊与视频通话
移动端演示 http://8.146.211.120:8081/#/管理端演示 http://8.146.211.120:8088/#/项目整体介绍及演示前言前十五章已经走通内容、商城以及评论 / IM 基础图文能力。但真正让用户愿意留下来的往往不是商品页而是人与人之间更完整的连接。本章在此基础上补齐完整消息体系私信多媒体文字 / 图片 / 语音 / 视频 / 笔记卡片群聊创建、广场、禁言、撤回、在线人数会话聚合 Inbox置顶、未读社交互动通知赞藏、关注、评论1v1 音视频通话腾讯云 TRTC形成「内容社区 IM」双引擎。相对原教程本章新增了什么能力早期教程当前工程私信文本为主文本/图/语音/视频/笔记/通话记录/直播邀请卡群聊无完整群生命周期 广场发现会话列表简单列表Inbox 聚合、置顶、未读角标实时通道有限全局 WebSocket 单连接多业务复用音视频通话无TRTC 发起/接听/拒绝/挂断全流程一、整体架构消息体系拆成四条线会话线Inbox 汇总私信会话 群会话负责未读与置顶内容线统一contentType content多媒体用 JSON 存 payload实时线WebSocket 推送新消息、已读、在线人数、来电通话线RTC 信令走业务接口媒体走 TRTC消息 Tab ├─ 赞藏 / 关注 / 评论 通知入口 └─ Inbox 会话列表私信 群 ↓ 点进会话 chat.vue / group-chat.vue ↓ 发送 POST /member/dm/message/send ↓ 落库 WebSocket 推对端二、消息类型协议核心后端在MemberDmServiceImpl中定义类型常量前后端约定同一套数字private static final int TYPE_TEXT 1; private static final int TYPE_IMAGE 2; private static final int TYPE_VOICE 3; private static final int TYPE_NOTE 4; private static final int TYPE_VIDEO 5; /** 语音/视频通话记录 */ private static final int TYPE_CALL 6; /** 直播分享卡片 */ private static final int TYPE_LIVE 7; /** 音视频聊天室分享卡片 */ private static final int TYPE_VOICE_ROOM 8;发送时做白名单校验非法类型回落为文本int contentType reqVO.getContentType() null ? TYPE_TEXT : reqVO.getContentType(); if (contentType ! TYPE_TEXT contentType ! TYPE_IMAGE contentType ! TYPE_VOICE contentType ! TYPE_NOTE contentType ! TYPE_VIDEO contentType ! TYPE_LIVE contentType ! TYPE_VOICE_ROOM) { contentType TYPE_TEXT; }会话列表摘要按类型简化展示和早期「评论/IM 加图片」同一思路private String buildSummary(int contentType, String content) { if (contentType TYPE_IMAGE) { return [图片]; } if (contentType TYPE_VOICE) { return [语音]; } if (contentType TYPE_VIDEO) { return [视频]; } if (contentType TYPE_NOTE) { return [笔记] extractNoteTitle(content); } if (contentType TYPE_LIVE) { return [直播] extractNoteTitle(content); } if (contentType TYPE_VOICE_ROOM) { return [聊天室] extractNoteTitle(content); } // ... return StrUtil.maxLength(content, 80); }前端类型常量与组装工具sheep/helper/dmContent.jsexport const DM_TYPE { TEXT: 1, IMAGE: 2, VOICE: 3, NOTE: 4, VIDEO: 5, }; export function buildVoicePayload(url, durationSec) { return JSON.stringify({ url, duration: Math.max(1, Math.round(durationSec || 1)), }); } export function buildNotePayload(note) { const cover note.coverUrl || (note.picUrls note.picUrls.length ? note.picUrls[0] : ) || ; const summary (note.content || note.title || ).replace(/\s/g, ).trim().slice(0, 80); return JSON.stringify({ noteId: note.id, title: note.title || summary || 笔记, coverUrl: cover, nickname: note.nickname || , avatar: note.avatar || , summary, noteType: Number(note.noteType || 0), likeCount: Number(note.likeCount || 0), }); }发送接口// sheep/api/member/dm.js sendMessage: (data) { return request({ url: /member/dm/message/send, method: POST, data, custom: { auth: true, showLoading: false }, }); },三、私信气泡按 contentType 条件渲染pages/message/chat.vue里根据类型切换 UI笔记卡 / 语音条 / 视频封面 / 图片 / 文本!-- 笔记卡片 -- view v-ifitem.contentType DM_TYPE.NOTE classnote-card tapgoNoteCard(item) image classnote-card__cover :srcsheep.$url.cdn(notePayload(item).coverUrl) modeaspectFill / text classnote-card__title{{ notePayload(item)?.title || 笔记 }}/text /view !-- 语音 -- view v-else-ifitem.contentType DM_TYPE.VOICE classbubble bubble--voice tapplayVoice(item) uni-icons typesound size18 / text{{ voiceDuration(item) }}/text /view !-- 视频 -- view v-else-ifitem.contentType DM_TYPE.VIDEO classvideo-card tapopenVideo(item) image classvideo-card__cover :srcvideoCover(item) modeaspectFill / text classvideo-card__dur{{ videoDurationText(item) }}/text /view !-- 图片 / 文本 -- view v-else classbubble :class{ bubble--img: item.contentType DM_TYPE.IMAGE } image v-ifitem.contentType DM_TYPE.IMAGE classbubble__img :srcsheep.$url.cdn(item.content) modewidthFix tappreview(item.content) / text v-else classbubble__text{{ item.content }}/text /view发送封装async function sendContent(content, contentType DM_TYPE.TEXT) { const payload contentType DM_TYPE.TEXT ? (content || ).trim() : content || ; const { code, data } await DmApi.sendMessage({ peerId: state.peerId, contentType, content: payload, }); // 成功后 push 到本地 messageList并滚到底部 }四、WebSocket一条连接多业务复用类型常量集中在WebSocketMessageTypeConstants/** 私信新消息 */ String MEMBER_DM_MESSAGE member_dm_message_type; /** 群聊新消息 */ String MEMBER_GROUP_CHAT_MESSAGE member_group_chat_message_type; /** 消息未读总数变更 */ String MEMBER_UNREAD_COUNT member_unread_count_type; /** 视频通话邀请 / 接听 / 拒绝 / 取消 / 挂断 */ String MEMBER_RTC_CALL_INVITE member_rtc_call_invite_type; String MEMBER_RTC_CALL_ACCEPTED member_rtc_call_accepted_type; String MEMBER_RTC_CALL_REJECTED member_rtc_call_rejected_type; String MEMBER_RTC_CALL_CANCELLED member_rtc_call_cancelled_type; String MEMBER_RTC_CALL_HANGUP member_rtc_call_hangup_type;前端sheep/helper/wsGlobal.js订阅未读与来电进聊天页再处理具体消息推送。这样消息 Tab 角标、聊天页气泡、来电弹窗共用同一条长连接。五、群聊要点群聊覆盖运营侧常见能力创建群、群广场发现、申请加入群公告、成员列表、邀请入群群主禁言、踢人、消息撤回群在线人数实时订阅MEMBER_GROUP_CHAT_ONLINE_*消息体同样走contentType与私信协议对齐前端group-chat.vue复用气泡渲染思路。六、1v1 音视频通话通话信令接口AppMemberRtcControllerPostMapping(/call/create) Operation(summary 发起 1v1 视频通话) public CommonResultAppMemberRtcCallRespVO create(Valid RequestBody AppMemberRtcCallCreateReqVO reqVO) { return success(rtcService.createCall(getLoginUserId(), reqVO)); } PostMapping(/call/accept) public CommonResultAppMemberRtcCallRespVO accept(RequestParam(roomId) String roomId) { return success(rtcService.acceptCall(getLoginUserId(), roomId)); } PostMapping(/call/reject) public CommonResultBoolean reject(RequestParam(roomId) String roomId) { rtcService.rejectCall(getLoginUserId(), roomId); return success(true); }创建通话后通过 WebSocket 推送来电接听返回 TRTC 凭证媒体进独立通话页。结束后写一条TYPE_CALL气泡到私信会话。流程发起方 createCall → 对端 WS 收到 INVITE → accept / reject / timeout → TRTC 进房通话 → hangup → 私信写入通话记录气泡关键代码位置后端私信yudao-module-member/.../service/dm/MemberDmServiceImpl.java群聊.../controller/app/groupchat/会话 Inbox.../controller/app/inbox/通话.../controller/app/rtc/AppMemberRtcController.javaWS 常量.../enums/WebSocketMessageTypeConstants.java移动端消息 Tabpages/index/message.vue私信pages/message/chat.vue内容协议sheep/helper/dmContent.js全局 WSsheep/helper/wsGlobal.js总结用统一contentType扩展多媒体避免每种消息各建一套表Inbox WebSocket 解决多入口未读不一致信令与媒体分离业务状态走后端音视频走 TRTC下一章预告有了 IM 通道之后下一章接入TRTC 直播笔记开播、公屏弹幕、心跳关播、体验时长倒计时。演示地址移动端http://8.146.211.120:8081/#/管理端http://8.146.211.120:8088/#/代码地址https://gitee.com/ddeatrr/springboot_vue_xhs

相关新闻

Horos医学影像软件:macOS上的免费专业级DICOM查看器终极指南

Horos医学影像软件:macOS上的免费专业级DICOM查看器终极指南

Horos医学影像软件:macOS上的免费专业级DICOM查看器终极指南 【免费下载链接】horos Horos™ is a free, open source medical image viewer. The goal of the Horos Project is to develop a fully functional, 64-bit medical image viewer for OS X. Horos is ba…

2026/8/6 18:07:47 阅读更多 →
高温高速超大构件皆可测!DIC攻克多尺度全场应变

高温高速超大构件皆可测!DIC攻克多尺度全场应变

传统接触式应变片仅能单点采集数据,难以捕捉裂纹扩展、大变形、高温、高速冲击、微小芯片、大型构件等复杂场景下全域力学演化。数字图像相关(DIC)依托双目/多目立体视觉与数字散斑匹配算法,实现非接触、全场、多尺度、极端工况兼…

2026/8/6 18:07:47 阅读更多 →
计算机毕业设计之基于Spring Boot的社区便民服务管理系统的设计与实现

计算机毕业设计之基于Spring Boot的社区便民服务管理系统的设计与实现

二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

2026/8/6 18:06:47 阅读更多 →

最新新闻

毕业论文写不出来?这款AI学术神器轻松救急

毕业论文写不出来?这款AI学术神器轻松救急

Gradpaper-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/课程论文。Gradpaper论文智能生成软件,10分钟生成万字毕业论文、期刊论文、文献综述、PPT,Agc查重、降重报告、文献资料。只需一个标题,从开题报告到答辩一键生成软件&a…

2026/8/6 19:04:11 阅读更多 →
amis框架FormItem表单项校验优化代码示例

amis框架FormItem表单项校验优化代码示例

前言 在 amis 低代码表单开发中,校验逻辑的编排往往比想象中更复杂。本文聚焦两个最常困扰开发者的核心问题:一是点击「重置」按钮时,如何让日期范围等组件主动触发校验,避免重置后校验状态残留;二是当「保存」和「提交…

2026/8/6 19:04:11 阅读更多 →
Power Compiler:增量综合时的门控时钟转换

Power Compiler:增量综合时的门控时钟转换

相关阅读 Power Compilerhttps://blog.csdn.net/weixin_45791458/category_13013065.html?spm1001.2014.3001.5482 在增量综合时,如果设计中的门控时钟单元不满足要求,比如最小位宽(由门控时钟单元clock_gating_reg_size属性决定&#xff0…

2026/8/6 19:04:11 阅读更多 →
PDF-to-Image-PDF的安全优势 - 保护您的文档和数据

PDF-to-Image-PDF的安全优势 - 保护您的文档和数据

在数字化时代,文档安全和数据隐私成为了越来越重要的问题。特别是处理包含敏感信息的PDF文档时,如何确保数据不被泄露成为了用户最关心的问题之一。PDF-to-Image-PDF作为一款注重安全的PDF转换工具,提供了多项安全优势,本文将详细…

2026/8/6 19:04:11 阅读更多 →
Qwen3.5-9B-Claude-4.6-HighIQ-THINKING-HERETIC-UNCENSORED:完全无审查的AI思维模型终极指南

Qwen3.5-9B-Claude-4.6-HighIQ-THINKING-HERETIC-UNCENSORED:完全无审查的AI思维模型终极指南

Qwen3.5-9B-Claude-4.6-HighIQ-THINKING-HERETIC-UNCENSORED:完全无审查的AI思维模型终极指南 【免费下载链接】Qwen3.5-9B-Claude-4.6-HighIQ-THINKING-HERETIC-UNCENSORED 项目地址: https://ai.gitcode.com/hf_mirrors/DavidAU/Qwen3.5-9B-Claude-4.6-HighIQ-…

2026/8/6 19:04:11 阅读更多 →
3步掌握Waifu2x-Extension-GUI:免费AI图片视频放大神器终极教程

3步掌握Waifu2x-Extension-GUI:免费AI图片视频放大神器终极教程

3步掌握Waifu2x-Extension-GUI:免费AI图片视频放大神器终极教程 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, RTX Video Sup…

2026/8/6 19:03:11 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →