首页 文章 精选 留言 我的

精选列表

搜索[Java实现],共10019篇文章
优秀的个人博客,低调大师

从零用 Java 实现小红书 SpringBoot Vue UniApp(19)分享卡片、体验时长与上线清单

>## [**移动端演示 http://8.146.211.120:8081/#/**](https://gitee.com/link?target=http%3A%2F%2F8.146.211.120%3A8081%2F%23%2F) ## [**管理端演示 http://8.146.211.120:8088/#/**](https://gitee.com/link?target=http%3A%2F%2F8.146.211.120%3A8088%2F%23%2F) ## [**项目整体介绍及演示**](https://gitee.com/link?target=https%3A%2F%2Fblog.csdn.net%2Fqq_35238367%2Farticle%2Fdetails%2F145126222) **前言** (16)~(18)分别做了 IM、直播、聊天室。把用户真正「拉进来」,还差最后一公里:**分享**与**可控的试用时长**。 本章聚焦两件运营向能力: 1. 直播 / 聊天室邀请以**卡片消息**发到私信或群聊,点击直达房间 2. `max-minutes` 体验限制:配置、倒计时、到期关房、一键 SQL ---- ![IM 架构:卡片消息走统一协议](https://developer.qcloudimg.com/http-save/yehe-12101878/04bc4457806b7d1a66ec617a0543f174.png) ![消息中的直播 / 聊天室邀请卡片](https://developer.qcloudimg.com/http-save/yehe-12101878/953b8b5d07c8bc3753a354e4c606d76e.png) ![线上演示:消息 Tab 会话列表](https://developer.qcloudimg.com/http-save/yehe-12101878/e1bfc2452659ce1148957ea2f8bd400c.png) ![线上演示:私信聊天页](https://developer.qcloudimg.com/http-save/yehe-12101878/905fbdc6e09e8cbb356b02979cfd9cdb.png) ![直播倒计时示意](https://developer.qcloudimg.com/http-save/yehe-12101878/1f41eabad5117b0ae83220c7dae3a065.png) ![聊天室倒计时示意](https://developer.qcloudimg.com/http-save/yehe-12101878/35952566f3618adba262e29d25e2e937.png) ![开播页](https://developer.qcloudimg.com/http-save/yehe-12101878/b2977e3a0ae47120a9aecccafad13891.png) ![聊天室入口](https://developer.qcloudimg.com/http-save/yehe-12101878/f483d9ee5fa9b4d7eda17dfc92bcd679.png) ![管理端仪表盘(线上截图)](https://developer.qcloudimg.com/http-save/yehe-12101878/62d6c56986ff1e8930800477d8bae40a.png) ### 一、分享卡片:为什么不用纯文本链接 纯文本链接有两个问题:聊天里不好识别;无法带封面、标题、主播信息。 因此扩展私信/群聊 `contentType`: |类型值|含义|会话摘要| |:-:|:-:|:-:| |`7` LIVE|直播邀请卡|`[直播]标题`| |`8` VOICE_ROOM|聊天室邀请卡|`[聊天室]标题`| 后端摘要(16 已埋点): ``` if (contentType == TYPE_LIVE) { return "[直播]" + extractNoteTitle(content); } if (contentType == TYPE_VOICE_ROOM) { return "[聊天室]" + extractNoteTitle(content); } ``` #### 发送链路 ``` 直播间/聊天室点击分享 → 选择「发给好友」 → share-invite 页选互关好友(或进群) → 组装卡片 payload 调用私信/群发接口 → 对端气泡渲染卡片 → 点击跳转 live?id= / voice-room/room?roomNo= ``` #### 邀请链接(站外私域) ``` export function buildLiveInviteLink(noteId) { // #ifdef H5 if (typeof location !== 'undefined') { const base = `${location.origin}${location.pathname || '/'}`; return `${base}#/pages/note/live?id=${encodeURIComponent(noteId)}`; } // #endif return `/pages/note/live?id=${noteId}`; } export function buildVoiceRoomInviteLink(roomNo) { // #ifdef H5 if (typeof location !== 'undefined') { const base = `${location.origin}${location.pathname || '/'}`; return `${base}#/pages/voice-room/room?roomNo=${encodeURIComponent(roomNo)}`; } // #endif return `/pages/voice-room/room?roomNo=${roomNo}`; } ``` #### 卡片 payload 组装思路 与笔记分享同一套路(`buildNotePayload` 模式):JSON 字符串写入 `content`,`contentType` 标 7 或 8。 ``` // 直播卡示意 function buildLiveSharePayload(note) { return JSON.stringify({ noteId: note.id, title: note.title || '直播中', coverUrl: note.coverUrl || '', nickname: note.anchorNickname || '', avatar: note.anchorAvatar || '', liveMode: note.liveMode, // 0 语音 / 1 视频 }); } // 聊天室卡示意 function buildVoiceRoomSharePayload(room) { return JSON.stringify({ roomNo: room.roomNo, title: room.title || '聊天室', coverUrl: room.ownerAvatar || '', nickname: room.ownerNickname || '', mediaMode: room.mediaMode, }); } // 发送 await DmApi.sendMessage({ peerId, contentType: 7, // 或 8 content: buildLiveSharePayload(note), }); ``` 后端只需放宽 `contentType` 白名单并写好会话摘要,**不必为卡片单独建表**。 前端协议与页面: - `sheep/helper/dmContent.js` - `pages/message/share-invite.vue` - `pages/message/chat.vue` / `group-chat.vue` 渲染与点击跳转 ---- ### 二、体验时长:配置驱动 |config_key|默认|说明| |:-:|:-:|:-:| |`member.live.max-minutes`|30|直播单场最长分钟,`0`=不限制| |`member.voice-room.max-minutes`|30|聊天室单场最长分钟,`0`=不限制| #### 三端协同 1. **后端**:credentials / 进房接口返回 `maxMinutes` + 到期时间;定时任务扫到期房间 2. **Vue 页**:`experienceCountdown.js` 中部倒计时;到期弹窗 3. **Hybrid TRTC 页**:URL 带 `expireAt`,App WebView 内同样倒计时兜底 ``` export function createExperienceCountdown(options) { const expireAtMs = Number(options?.expireAtMs) || 0; const onTick = options?.onTick; const onExpire = options?.onExpire; let timer = null; const tick = () => { const remain = Math.max(0, Math.ceil((expireAtMs - Date.now()) / 1000)); if (typeof onTick === 'function') onTick(remain, formatRemain(remain)); if (remain **演示地址** 移动端:[http://8.146.211.120:8081/#/](https://gitee.com/link?target=http%3A%2F%2F8.146.211.120%3A8081%2F%23%2F) 管理端:[http://8.146.211.120:8088/#/](https://gitee.com/link?target=http%3A%2F%2F8.146.211.120%3A8088%2F%23%2F) **代码地址** https://gitee.com/ddeatrr/springboot_vue_xhs

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册