腾讯云 Web 超级播放器开发实战

目录

关于超级播放器

范例运行环境

开发前准备

设计与实现

初始化播放器

播放器重要属性设置

播放器实用事件

 一些兼容性判断

浏览器支持

关于华为手机

 实现代码

小结


关于超级播放器

腾讯云 Web 超级播放器 TCPlayer 可实现在手机浏览器和 PC 浏览器上播放音视频流的问题,功能强劲,兼容性好,可以不依赖用户安装 App,就能进行播放。

在实际的应用中,我们仍然根据需求直接改造了混淆代码,主要解决了以下问题:

1、增加、集成了播放快进组件

2、更改了一些样式

3、增强了一些旧版手机的兼容性

范例运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C# 

浏览器需要支持 H5 技术。

开发前准备

(1)我们需要引入腾讯云 Web 超级播放器的 JS 库,以下是我改造后的资源,可点击如下链接进行下载:

https://download.csdn.net/download/michaelline/89367455

(2)前端布局,下载我的资源后,假设放在当前应用目录下,首先我们需要引入样式单,如下代码:

<link rel="stylesheet" href="tcplayer2021.css" />

 其次,引入核心库,如下代码:

 <script type="text/javascript" src="hls.min.0.12.4.js"> </script><script type="text/javascript" src="tcplayer.v4.min.js"> </script>

(3)需要引入 Jquery,以下是一组基于Jquery的自定义开发的扩展应用库,请下载我的资源:

https://download.csdn.net/download/michaelline/88615565

进行引用,本库用于调用服务器静态方法等功能使用。

设计与实现

初始化播放器

播放器需要引入与结合 H5 的 Video 控件,假设有如下引用:

<div id="coplayer" style="box-shadow:2px 0px 35px  #000;  -webkit-box-shadow:2px 0px 35px  #000; background-color:rgb(69,69,69); position:fixed;top:40px;left:0px;width:80%;height:100px;  margin: 0px auto;"><video id="realcoplayer" autoplay="autoplay" controls="controls" webkit-playsinline playsinline x5-playsinline x-webkit-airplay="allow"  runat="server" ></video><a id="b_rate" onclick="rate(this);" style=" float:right; line-height:25px; margin-right:10px; color:#fff;display:none;">1x</a> </div>

其中

1、coplayer 为外围容器层,控制一些样式和位置输出  

2、realcoplayer 为 h5 video 控件,用于结合腾讯 web 超级播放器使用

其关键属性说明如下:

序号属性与设置说明
1autoplay="autoplay" 设置是否自动播放,在移动端或IOS系统可能无法实现
2controls="controls"是否显示控制工具栏,这里设置为需要显示
3webkit-playsinline playsinline

兼容性属性:webkit-playsinline使ios 10中设置可以让视频在小窗内播放,即不全屏播放。  playsinline 可使用IOS/微信浏览器支持小窗内播放

4x5-playsinlineH5 移动是否禁用全屏,这里为允许,为空则不允许
5x-webkit-airplay="allow"使此视频支持ios的AirPlay(隔空播放)功能,隔空播放能将各种 Apple 设备中的音乐流传输到家中的多个扬声器上,并让这些扬声器中播放的旋律始终保持合拍, 让音乐荡漾在每个房间。

3、b_rate 为用于改造及引入超级播放器的快进组件,配合其使用。

客户端播放器的初始化代码如下:

var player = new TCPlayer('realcoplayer', { 
fileID: 111, 
appID: '125407', 
playbackRates: [0.5, 1, 1.25, 1.5, 2],autoplay: false,live: false,x5_player: true,volume: 0.5,flash: true,x5_player: true,systemFullscreen: false,playsinline: true,x5_orientation: 0,x5_type: 'h5',allowFullScreen: false,width:_w,height:_h,});

播放器重要属性设置

在实际使用中,为保证良好的可用性和兼容性,还需要设置如下属性,说明见下表:

序号参数类型说明
1fileID string云点播平台可播放视频文件的 fileID
2appIDstring云点播平台申请的 appID
3playbackRatesfloat[]快进倍速设置,如此数组 [0.5, 1, 1.25, 1.5, 2]
4autoplaybool是否设置为自动播放,false 为不自动
5livebool是否直播功能,默认为 false
6x5_playerbool设为 true 。是否启用 TBS 的播放 flv 或 hls 。启用时播放器将在 TBS 模式下(例如 Android 的微信、QQ 浏览器),将 flv 或 hls 播放地址直接赋给 <video> 播放。
7volumefloat默认音量,0-1,0.5为居中
8flashbool一个兼容的重要属性,设为 true
9systemFullscreenbool开启后(true),在不支持 Fullscreen API 的浏览器环境下,尝试使用浏览器提供的 webkitEnterFullScreen 方法进行全屏,如果支持,将进入系统全屏,控件为系统控件
10playsinlinebool兼容性属性,设为 true
11x5_orientationint

通过 video 属性 “x5-video-orientation” 声明 TBS 播放器支持的方向,可选值:

0:landscape 横屏

1:portraint 竖屏

2:landscape &verbar; portrait 跟随手机自动旋转。

(备注:该属性为 TBS 内核实验性属性,非 TBS 内核不支持)

12x5_typestring通过 video 属性 “x5-video-player-type” 声明启用同层 H5 播放器,支持的值:h5-page (该属性为 TBS 内核实验性属性,非 TBS 内核不支持)
13allowFullScreenbool兼容性写法,是否允许全屏播放
14widthint设置播放器宽度,单位为像素。
15heightint设置播放器高度,单位为像素。

播放器实用事件

通过跟踪超级播放器提供的监听事件,实现我们的开发需求,其关键事件说明如下:

序号事件说明
1timeupdate

播放时间更新事件,可记录播放时间,其结构体如下:

player.on('timeupdate',function(){  }) 

2play

开始播放时事件,其结构体如下:

player.on('play',function(){ })

3fullscreenchange

切换全屏状态事件,其结构体如下:

player.on('fullscreenchange',function(){    })

4seeked

拖动播放进度结束事件,其结构体如下:

player.on('seeked',function(){    })

5pause

播放暂停时事件,其结构体如下:

player.on('pause',function(){    })

6ended

播放结束时事件,其结构体如下:

player.on('ended',function(){    })

7canplay

播放能力执行成功事件,其结构体如下:

player.on('canplay',function(){    })

8loadeddata

音视频数据加载完毕时事件,其结构体如下:

player.on('loadeddata',function(){    })

9ratechange

改变快进倍速完成时事件,其结构体如下:

player.on('ratechange',function(){    })

类实现代码如下:

public class QR_LIMIT_STR_SCENE
{public string AccessToken { get; set; }public string ticket { get; set; }public string url { get; set; }public string ResultJson = "";public QR_LIMIT_STR_SCENE(){}public string getUrl(string scene_str){string PostJson = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"" + scene_str + "\"}}}";String action = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + AccessToken;WebService ws = new WebService();string rs = ws.GetResponseResult(action, Encoding.UTF8, "POST", PostJson);Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(rs);ticket = jsonObj["ticket"] != null ? jsonObj["ticket"].ToString() : "";url = jsonObj["url"] != null ? jsonObj["url"].ToString() : "";ResultJson = rs;return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;}
}

 一些兼容性判断

浏览器支持

编写浏览器是否支持终端H5播放的判断,实现代码如下:

        function checkVideo() {if (!!document.createElement('video').canPlayType) {var vidTest = document.createElement("video");oggTest = vidTest.canPlayType('video/ogg; codecs="theora, vorbis"');if (!oggTest) {h264Test = vidTest.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');if (!h264Test) {return false;}else {if (h264Test == "probably") {return true;}else {return false;}}}else {if (oggTest == "probably") {return true;}else {return false;}}}else {return false;}return true;}if (!checkVideo()) {alert('您的浏览器不支持Video播放,请使用支持H5技术的浏览器!');}    
关于华为手机

在某些华为手机我们发现倍速快进组件样式显示异常,因此引入 JS 函数,对机型增加了一些判断 ,代码如下:

    function judgeBrand(sUserAgent) {var isIphone = sUserAgent.match(/iphone/i) == "iphone";var isHuawei = sUserAgent.match(/huawei/i) == "huawei";var isHonor = sUserAgent.match(/honor/i) == "honor";var isOppo = sUserAgent.match(/oppo/i) == "oppo";var isOppoR15 = sUserAgent.match(/pacm00/i) == "pacm00";var isVivo = sUserAgent.match(/vivo/i) == "vivo";var isXiaomi = sUserAgent.match(/mi\s/i) == "mi ";var isXiaomi2s = sUserAgent.match(/mix\s/i) == "mix ";var isRedmi = sUserAgent.match(/redmi/i) == "redmi";var isSamsung = sUserAgent.match(/sm-/i) == "sm-";if (isIphone) {return 'iphone';} else if (isHuawei || isHonor) {return 'huawei';} else if (isOppo || isOppoR15) {return 'oppo';} else if (isVivo) {return 'vivo';} else if (isXiaomi || isRedmi || isXiaomi2s) {return 'xiaomi';} else if (isSamsung) {return 'samsung';} else {return 'default';}}

对华为手机的判断处理代码如下:

if(judgeBrand(navigator.userAgent.toLowerCase())=='huawei'){$("#b_rate").html="1x";$("#b_rate").css("display","");}else{$("#b_rate").css("display","none");}

 实现代码

相对完整的实现代码(包括样式引入、前端控件和JS控制)如下:

<link rel="stylesheet" href="tcplayer2021.css" /><asp:TextBox ID="x_roomid" checkSchema="" runat="server" style="display:none"></asp:TextBox><script type="text/javascript" src="hls.min.0.12.4.js"> </script><script type="text/javascript" src="tcplayer.v4.min.js"> </script>
<script type="text/javascript" language="javascript" src="jquery.js" ></script><div id="h5panel" runat="server" >
<asp:TextBox ID="x_fileid" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="current" Text="0" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="duration" Text="0" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="mname" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="x_mp4url" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="x_CoverUrl" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="x_playMark" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="x_lasttime" style="display:none;" runat="server"></asp:TextBox>
<asp:TextBox ID="confirmflag" Text="0" runat="server" style="display:none;" ></asp:TextBox>
<asp:TextBox ID="playMarkflag" Text="0" runat="server" style="display:none;" ></asp:TextBox>
<asp:TextBox ID="x_videocount" Text="0" style="display:none;" runat="server"></asp:TextBox><div id="coplayer" style="box-shadow:2px 0px 35px  #000;  -webkit-box-shadow:2px 0px 35px  #000; background-color:rgb(69,69,69); position:fixed;top:40px;left:0px;width:80%;height:100px;  margin: 0px auto;"><video id="realcoplayer" autoplay="autoplay" controls="controls" webkit-playsinline playsinline x5-playsinline x-webkit-airplay="allow"  runat="server" ></video><a id="b_rate" onclick="rate(this);" style=" float:right; line-height:25px; margin-right:10px; color:#fff;display:none;">1x</a> 
</div><script language="javascript">var windowheight=$(window).height();form = document.forms[0];function checkVideo() {if (!!document.createElement('video').canPlayType) {var vidTest = document.createElement("video");oggTest = vidTest.canPlayType('video/ogg; codecs="theora, vorbis"');if (!oggTest) {h264Test = vidTest.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"');if (!h264Test) {return false;}else {if (h264Test == "probably") {return true;}else {return false;}}}else {if (oggTest == "probably") {return true;}else {return false;}}}else {return false;}return true;}if (!checkVideo()) {alert('您的浏览器不支持Video播放,请使用支持H5技术的浏览器!');}    var timer=null;var curtime=0;function stimer(){ timer=window.setInterval("setpmark()",1000);}function etimer(){window.clearInterval(timer);}function secondToDate(result) {var h = Math.floor(result / 3600) < 10 ? '0'+Math.floor(result / 3600) : Math.floor(result / 3600);var m = Math.floor((result / 60 % 60)) < 10 ? '0' + Math.floor((result / 60 % 60)) : Math.floor((result / 60 % 60));var s = Math.floor((result % 60)) < 10 ? '0' + Math.floor((result % 60)) : Math.floor((result % 60));if(h=="00"){return result = m + ":" + s;}else{return result = h + ":" + m + ":" + s;}}var _w = $(document).width();if(_w>=1200){_w=640;}_h=_w/16*9;function resizeAll(){var _w = $(document).width();if(_w>=1200){_w=640;}_h=_w/16*9;if(player.isFullscreen()==true){}document.getElementById('coplayer').style.left=($(document).width()-_w)/2+'px';document.getElementById('coplayer').style.width=_w+'px';document.getElementById('coplayer').style.height=_h+'px';function aiplaymark(curtime){player.currentTime(curtime);player.play();}var debug=document.getElementById('debug');var curtime=0;var seeked=false;var player = new TCPlayer('realcoplayer', { fileID: document.getElementById('x_fileid').value, appID: '12540',playbackRates: [0.5, 1, 1.25, 1.5, 2],autoplay: false,live: false,x5_player: true,volume: 0.5,flash: true,x5_player: true,systemFullscreen: false,playsinline: true,x5_orientation: 0,x5_type: 'h5',allowFullScreen: false,width:_w,height:_h,});player.on('timeupdate',function(){ document.getElementById("current").value=player.currentTime();})player.on('play',function(){stimer();updcountinfo('play',0);})player.on('fullscreenchange',function(){})player.on('seeked',function(){})player.on('pause',function(){etimer();})player.on('ended',function(){etimer();})player.on('canplay',function(){})player.on('loadeddata',function(){player.poster(document.getElementById('x_CoverUrl').value);if(judgeBrand(navigator.userAgent.toLowerCase())=='huawei'){$("#b_rate").html="1x";$("#b_rate").css("display","");}else{$("#b_rate").css("display","none");}this.currentTime(document.getElementById("current").value);})player.on('ratechange',function(){$('#b_rate').html($('.vjs-playback-rate-value').html());})function rate(o) {         document.querySelectorAll('.vjs-playback-rate')[1].click();}function judgeBrand(sUserAgent) {var isIphone = sUserAgent.match(/iphone/i) == "iphone";var isHuawei = sUserAgent.match(/huawei/i) == "huawei";var isHonor = sUserAgent.match(/honor/i) == "honor";var isOppo = sUserAgent.match(/oppo/i) == "oppo";var isOppoR15 = sUserAgent.match(/pacm00/i) == "pacm00";var isVivo = sUserAgent.match(/vivo/i) == "vivo";var isXiaomi = sUserAgent.match(/mi\s/i) == "mi ";var isXiaomi2s = sUserAgent.match(/mix\s/i) == "mix ";var isRedmi = sUserAgent.match(/redmi/i) == "redmi";var isSamsung = sUserAgent.match(/sm-/i) == "sm-";if (isIphone) {return 'iphone';} else if (isHuawei || isHonor) {return 'huawei';} else if (isOppo || isOppoR15) {return 'oppo';} else if (isVivo) {return 'vivo';} else if (isXiaomi || isRedmi || isXiaomi2s) {return 'xiaomi';} else if (isSamsung) {return 'samsung';} else {return 'default';}}function updcountinfo(ctype,counts){if(ctype=='play'){if(document.getElementById('x_videocount').value=='0'){document.getElementById('x_videocount').value='1';}else{return;}}callServerFunction("", "updateCountInfo","{cid:'"+$("#x_cid").val()+"',ctype:'"+ctype+"',counts:'"+counts+"'}", sscount);}function setpmark(){curtime++;callServerFunction("", "updatePersonLearnInfo","{cid:'"+$("#x_cid").val()+"',uid:'"+$("#x_uid").val()+"',pid:'"+$("#x_pid").val()+"',playmark:'"+$('#current').val()+"',steptime:'1'}", ss);}var sTime;</script>

小结

(1)关于更多的超级播放器 SDK 开发介绍,请参照如下链接:

https://cloud.tencent.com/document/product/881/30818

(2)实现代码中事件代码仅供参考,对于服务器静态方法实现需要根据我们实际的应用需求进行开发。

(3)实现代码中的前端控件,只为演示实例使用,可根据需要改造符合自己的开发规范。

感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

域名地址是什么意思?

域名地址&#xff0c;通常简称为域名&#xff0c;是互联网上用于标识一个网站或网络服务的人类可读的名称。它相当于互联网上的门牌号码&#xff0c;使得用户能够方便地访问和记住网站的确切位置。本文将探讨域名地址的含义、其工作原理以及对网站的重要性。 域名地址的含义 …

android studio 导入github里的项目后提示:Add Configuration

原文链接&#xff1a;https://blog.csdn.net/weixin_45677723/article/details/125940912 从github上面clone项目&#xff0c;出现下图问题&#xff1a; 解决问题&#xff1a; 我这个的情况是因为多文件嵌套了&#xff0c;我用Android Studio打开的是A文件&#xff0c;而B项…

移除重复节点

题目链接 移除重复节点 题目描述 注意点 链表未排序链表长度在[0, 20000]范围内链表元素在[0, 20000]范围内 解答思路 使用Set存储访问过的链表中出现的节点值&#xff0c;当遍历到链表的某个节点在Set中出现过&#xff0c;则需要将该节点的前一个节点next指针指向该节点的…

你见过的最差的程序员是怎样的?

之前看过一个段子&#xff0c;也可能是真事。 题目是“你见过的最差的程序员是怎样的&#xff1f;” 底下有位匿名用户回答到&#xff1a;还是新人的时候&#xff0c;接手过一座屎山&#xff0c;奈何技术不足&#xff0c;也不敢乱动这座屎山&#xff0c;只好继续在屎山拉屎。…

MySQL字符串函数

1.ASCII(char)返回字符的ASCII值。 2.1个字符8个字节(byte)bit_length(str)表示的是返回字符串的字节长度即比特长度一个汉字2字符(16个字节) 3.concat(s1,s2..sn)即将s1,s2..sn连接成字符串。4.concat(sep,s1,s2,..sn)将连接的字符串用分隔符separater分 开连接。mysql> se…

InternLM2-Math-Plus全面升级,全尺寸最强的开源数学模型

总览 数学能力是大语言模型推理水平的重要体现。上海人工智能实验室在推出领先的开源数学模型InternLM2-Math的三个月之后对其进行了升级&#xff0c;发布了全新的 InternLM2-Math-Plus。升级后的 InternLM2-Math-Plus 在预训练和微调数据方面进行了全面的优化&#xff0c;显著…

FILE* file实际项目操作

遇到一个三维的二进制文件&#xff0c;通过FILE指针进行IO操作&#xff0c;并存入三维Mat中&#xff0c;通过二维Mat进行分层显示 一、打开文件 fopen_s(&file, "XXX.uint16_scv", "rb"&#xff0c;通过file文件指针打开XXX.uint16_scv文件&#xff…

【二叉树】非递归实现前中后序遍历

目录 前言 算法思想 非递归实现前序遍历 过程分析 代码 非递归实现中序遍历 过程分析 代码 非递归实现后序遍历 过程分析 代码 前言 1&#xff09;前序&#xff1a;根 左子树 右子树 2&#xff09;中序&#xff1a;左子树 根 右子树 3&#xff09;后序&#xff1…

邮箱调用接口的服务有哪些?怎么配置接口?

邮箱调用接口安全性如何保障&#xff1f;使用邮箱服务器的方法&#xff1f; 邮箱调用接口为各种应用和系统提供了便捷的电子邮件发送与接收功能。选择合适的邮箱调用接口服务可以大大提升工作效率和用户体验。本AokSend将探讨一些主要的邮箱调用接口服务。 邮箱调用接口&…

北大国际医院腹膜后纤维化课题组 多学科协作开辟治疗新径

腹膜后纤维化(Retroperitoneal Fibrosis,简称RPF)是一种罕见的自身免疫性疾病,其核心特征是纤维组织的异常增生与硬化。这种疾病主要影响肾脏下方的腹主动脉和髂动脉区域,增生的纤维组织会逐渐压迫周围的输尿管和下腔静脉,从而导致一系列并发症,包括主动脉瘤、肾功能衰竭等,甚至…

Oracle数据库之锁(十五)

Oracle的锁机制是用于控制对共享资源的并发访问&#xff0c;以确保数据库的一致性和完整性。以下是关于Oracle锁的详细解释&#xff1a; 1. 锁的类型 DML锁&#xff08;Data Locks&#xff09;&#xff1a; 用于控制数据操纵语言&#xff08;如INSERT、UPDATE、DELETE等&…

【图像超分】论文精读:Reflash Dropout in Image Super-Resolution(RDSR)

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related Work3. Obs…

国内对运筹学的认识

发展时间还不够&#xff0c;很多硬性&#xff08;商业需求&#xff09;软性&#xff08;人力资源&#xff0c;文化&#xff09;的条件还不成熟。先歪个楼。20世纪50年代&#xff0c;美国军方需要优化每个战区配置多少艘航空母舰&#xff0c;当时的线性规划给出的答案可能是某个…

MySQL(进阶)--索引

目录 一.存储引擎 1.MySQL体系结构​编辑 2.存储引擎简介 3.存储引擎特点 (1.InnoDB (2.MyISAM (3.Memory 4.存储引擎选择 二.索引 1.索引概述 2.索引结构 3.索引分类 4.索引语法 (1.创建索引 (2.查看索引 (3.删除索引 5.SQL性能分析 (1.SQL执行频率 (2.慢查…

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言随机查询语…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例&#xff1a; 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例&#xff1a; 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

电瓶车进电梯识别报警摄像机

随着电动车的普及&#xff0c;越来越多的人选择电动车作为出行工具。在诸多场景中&#xff0c;电梯作为一种常见的交通工具&#xff0c;也受到了电动车用户的青睐。然而&#xff0c;电动车进入电梯时存在一些安全隐患&#xff0c;为了提高电动车进电梯的安全性&#xff0c;可以…

小程序自动化辅助渗透脚本(2024)

简介 1.还在一个个反编译小程序吗&#xff1f; 2.还在自己一个个注入hook吗&#xff1f; 3.还在一个个查看找接口、查找泄露吗&#xff1f; 现在有自动化辅助渗透脚本了&#xff0c;自动化辅助反编译、自动化注入hook、自动化查看泄露 注&#xff1a;本工具仅用于学习交流&…

Java中的JSON神器,如何轻松玩转复杂数据结构

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、揭秘JSON世界的基石 在Java的世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于文本&#xff0c;易于阅读和编写&#xff0c;同时也易于…

站内信设计

参考文章&#xff1a;https://cloud.tencent.com/developer/article/1684449 b站站内信业务设计&#xff1a; 消息的类型分为&#xff1a; 1、系统消息 2、、点赞、回复等用户行为之间的消息(事件提醒) 3、用户之间的消息 系统消息 用一个用户消息表可以吗&#xff1f; 可…