腾讯TIM实现即时通信 v3+ts实践

news/2024/4/26 1:23:36/文章来源:https://blog.csdn.net/qq_63358859/article/details/129235247

目录

初始化sdk

功能描述

初始化

准备 SDKAppID

调用初始化接口

 监听事件

发送消息

创建消息

创建文本消息

登录登出

功能描述

登录

登出

销毁

登录设置

获取会话列表

功能描述

获取会话列表

获取全量的会话列表

 历史消息

功能描述

拉取消息列表

分页拉取指定会话的消息列表

根据指定的消息 sequence 或消息时间跳拉会话的消息列表

 接收消息

功能描述

监听事件

取消监听事件

 总结


初始化sdk

功能描述

在使用 IM SDK 的各项功能前,必须先进行初始化。

初始化

初始化 SDK 需要操作以下步骤:

  1. 准备 SDKAppID。
  2. 调用 TIM.create 初始化 SDK。
  3. 添加 SDK 事件监听器。

下面我们将分步骤依次为您详细讲解。

准备 SDKAppID

您必须拥有正确的 SDKAppID,才能进行初始化。
SDKAppID 是腾讯云 IM 服务区分客户帐号的唯一标识。我们建议每一个独立的 App 都申请一个新的 SDKAppID。不同 SDKAppID 之间的消息是天然隔离的,不能互通。
您可以在 即时通信 IM 控制台 查看所有的 SDKAppID,单击 创建新应用,可以创建新的 SDKAppID。

调用初始化接口

操作完上述步骤后,您可以调用 TIM.create 初始化 SDK。

接口

TIM.create(options);

参数 options 为 Object 类型,包含的属性值如下:

NameTypeDescription
SDKAppIDNumber即时通信 IM 应用的 SDKAppID
        public tim: ChatSDK | undefinedprivate initTimSdk(SDKAppID: number) {let options = {SDKAppID,// 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID};// 创建 SDK 实例,`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例let tim = TIM.create(options); // SDK 实例通常用 tim 表示// 设置 SDK 日志输出级别,详细分级请参见 setLogLevel https://web.sdk.qcloud.com/im/doc/zh-cn/SDK.html#setLogLevel 接口的说明</a>tim.setLogLevel(0); // 普通级别,日志量较多,接入时建议使用// tim.setLogLevel(1); // release 级别,SDK 输出关键信息,生产环境时建议使用// 注册腾讯云即时通信 IM 上传插件tim.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin })this.tim = tim}

 监听事件

SDK 进入 ready 状态时触发,接入侧监听此事件,然后可调用 SDK 发送消息等 API,使用 SDK 的各项功能

// 监听sdk准备完成的事件private bindTIMEvent() {this.tim?.on(TIM.EVENT.SDK_READY, this.handleSDKReady, this)}

  SDK 收到推送的单聊、群聊、群提示、群系统通知的新消息,接入侧可通过遍历 event.data 获取消息列表数据并渲染到页面

    private handleSDKReady = () => {console.log('sdk准备完成');this.onReady()console.log('执行');this.tim?.on(TIM.EVENT.MESSAGE_RECEIVED, this.handleMessageReceived, this)}private handleMessageReceived = (event: TextMessageEvent) => {console.log('接收到消息', event);this.messageReceived(event)}public messageReceived = (event: TextMessageEvent) => { }

发送消息

创建消息

创建文本消息

创建文本消息的接口,此接口返回一个消息实例,可以在需要发送文本消息时调用 发送消息 接口发送消息实例。

接口

tim.createTextMessage(options);

参数

参数 options 为 Object 类型,包含的属性值如下:

NameTypeDefaultDescription
toString-消息接收方的 userID 或 groupID
conversationTypeString-会话类型,取值TIM.TYPES.CONV_C2C(端到端会话)或TIM.TYPES.CONV_GROUP(群组会话)
priorityStringTIM.TYPES.MSG_PRIORITY_NORMAL消息优先级
payloadObject-消息内容的容器
cloudCustomDataString''消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)

payload 的描述如下:

NameTypeDescription
textString消息文本内容

返回值

消息实例 Message。

示例

        private getMessageOptions = (userID: string, payload: ITextPayload) => {return this.tim?.createTextMessage({to: userID,conversationType: TIM.TYPES.CONV_C2C,// 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)// 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST// priority: TIM.TYPES.MSG_PRIORITY_NORMAL,payload,// v2.20.0起支持C2C消息已读回执功能,如果您发消息需要已读回执,需购买旗舰版套餐,并且创建消息时将 needReadReceipt 设置为 trueneedReadReceipt: true// 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)// cloudCustomData: 'your cloud custom data'})}public sendMessage = async (userID: string, payload: ITextPayload) => {// 创建消息const messOption = this.getMessageOptions(userID, payload)await this.tim?.sendMessage(messOption!)console.log('发送成功');}public sendMessage = async (userID: string, payload: ITextPayload) => {// 创建消息const messOption = this.getMessageOptions(userID, payload)await this.tim?.sendMessage(messOption!)console.log('发送成功');}

返回  消息实例 Message。

登录登出

功能描述

用户登录 IM SDK 才能正常收发消息,登录需要用户提供 UserID、UserSig 等信息,具体含义请参见 登录鉴权。

登录

注意:

  • 登录成功,需等待 sdk 处于 ready 状态后(监听事件 TIM.EVENT.SDK_READY)才能调用 sendMessage 等需要鉴权的接口。
  • 如需支持多实例登录(允许在多个网页中同时登录同一帐号),请登录 即时通信 IM 控制台,找到相应 SDKAppID,选择应用配置>功能配置>登录与消息>登录设置>Web 端可同时在线个数配置实例个数。配置将在5分钟内生效。

接口

tim.login(options);

参数

参数 options 为 Object 类型,包含的属性值如下:

名称类型描述
userIDString用户 ID。
userSigString用户登录即时通信 IM 的密码,其本质是对 UserID 等信息加密后得到的密文。
具体生成方法请参见 生成 UserSig。

返回值

Promise 对象。

示例

    public timLogin = async (options: TIMCoreLoginParams) => {//第一步登录sdkawait this.tim?.login(options)// 持久化相关密钥localStorage.setItem('TIMCoreLoginParams', JSON.stringify(options))this.userID = options.userIDthis.bindTIMEvent()}

实例生成后缓存登录态

    private persistedLogin = () => {console.log('缓存');const TIMCoreLoginParams = JSON.parse(localStorage.getItem('TIMCoreLoginParams') || '{}')if (TIMCoreLoginParams.userID) {console.log('存在登录');this.timLogin(TIMCoreLoginParams)}}

 

登出

登出即时通信 IM,通常在切换帐号的时候调用,清除登录态以及内存中的所有数据。

注意:

  • 调用此接口的实例会发布 SDK_NOT_READY 事件,此时该实例下线,无法收、发消息。
  • 如果您在即时通信 IM 控制台配置的“Web 端实例同时在线个数”大于 1,且同一帐号登录了a1a2两个实例(含小程序端),当执行a1.logout()后,a1会下线,无法收、发消息。而a2实例不会受影响。
  • 多实例被踢:基于第 2 点,如果“Web 端实例同时在线个数”配置为 2,且您的某一帐号已经登录了 a1a2两个实例,当使用此帐号成功登录第三个实例a3时,a1a2中的一个实例会被踢下线(通常是最先处在登录态的实例会触发),这种情况称之为“多实例被踢”。假设a1实例被踢下线,a1实例内部会执行登出流程,然后抛出KICKED_OUT事件,接入侧可以监听此事件,并在触发时跳转到登录页。此时a1实例下线,而a2a3实例可以正常运行。

接口

tim.logout();

参数

返回值

Promise 对象。

示例

let promise = tim.logout();
promise.then(function(imResponse) {console.log(imResponse.data); // 登出成功
}).catch(function(imError) {console.warn('logout error:', imError);
});

销毁

销毁 SDK 实例,包括:登出,断开长连接,并释放所有资源。

接口

tim.destroy();

参数

返回值

Promise 对象。

示例

tim.destroy().then(() => {console.log('sdk destroyed');
});

关闭监听

    public unBindTIMEvent = () => {this.tim?.off(TIM.EVENT.MESSAGE_RECEIVED, () => { })this.tim?.off(TIM.EVENT.SDK_READY, () => { })}

 

登录设置

默认情况下,不支持多实例登录,即如果此帐号已在其他页面登录,若继续在当前页面登录成功,有可能会将其他页面踢下线。用户被踢下线时会触发事件TIM.EVENT.KICKED_OUT,用户可在监听到事件后做相应处理。示例如下:

let onKickedOut = function (event) {console.log(event.data.type);// TIM.TYPES.KICKED_OUT_MULT_ACCOUNT(Web 端,同一帐号,多页面登录被踢)// TIM.TYPES.KICKED_OUT_MULT_DEVICE(同一帐号,多端登录被踢)// TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED(签名过期)// TIM.TYPES.KICKED_OUT_REST_API(REST API kick 接口踢出。v2.20.0起支持)
};
tim.on(TIM.EVENT.KICKED_OUT, onKickedOut);

获取会话列表

功能描述

用户在登录 App 后,可以像微信或 QQ 那样展示最近会话列表,方便找到目标会话。
会话列表如下图所示:

会话列表功能主要分为获取会话列表、监听会话列表更新事件。核心数据结构 Conversation。

获取会话列表

接入侧可通过调用 getConversationList 接口主动获取会话列表。

获取全量的会话列表

  // 获取会话列表async getSessionList() {console.log('aaaa');const { data: { conversationList } } = await this.timeCore.tim?.getConversationList()this.conversationList = conversationListconsole.log(this.conversationList, '数据');// 他没有回话并且不是客服if (conversationList.length == 0 && this.timeCore.userID !== 'admin') {this.conversationList.push({lastMessage: {},userProfile: {userID: 'admin',} as Profile})}const userId = this.conversationList[0].userProfile?.userIDconsole.log(conversationList[0], '--------');if (userId) {this.selectedKeys = [userId]this.getMessageHistoryList(userId)}},

 历史消息

功能描述

SDK 既支持分页续拉消息列表,也支持根据指定的消息 sequence 或消息时间跳拉消息列表。

云端存储的历史消息有存储时长的限制:

  • 体验版:免费存储 7 天,不支持延长
  • 专业版:免费存储 7 天,支持延长
  • 旗舰版:免费存储 30 天,支持延长

说明:

  • 延长历史消息存储时长是增值服务,您可以登录 即时通信 IM 控制台 修改相关配置,具体计费说明请参加 增值服务资费 。
  • 富媒体消息(图片、文件、语音等)对应的文件存储时长,与历史消息存储时长保持一致。

拉取消息列表

分页拉取指定会话的消息列表

分页拉取指定会话的消息列表的接口,当用户进入会话首次渲染消息列表或者用户“下拉查看更多消息”时,需调用该接口。

注意:

该接口可用于"拉取历史消息",每次调用 SDK 最多返回20条消息。

接口

tim.getMessageList(options);

参数

参数 options 为 Object 类型,包含的属性值如下:

名称类型描述
conversationIDString会话 ID。会话 ID 组成方式:
  • C2C${userID}(单聊)
  • GROUP${groupID}(群聊)
  • GROUP${topicID}(话题)v2.19.1 起支持
  • @TIM#SYSTEM(系统通知会话)
nextReqMessageIDString | undefined用于分页续拉的消息 ID。第一次拉取时该字段不要填值,续拉时填入上次调用 getMessageList 接口返回的该字段的值。

返回值

Promise 对象。

示例

      async getMessageHistoryList(userId: string) {const data = await this.timeCore.tim?.getMessageList({ conversationID: `C2C${userId}` })this.historMessage = data.data.messageListconsole.log(data, '我是历史记录');}
// 下拉查看更多消息
let promise = tim.getMessageList({conversationID: 'C2Ctest', nextReqMessageID});
promise.then(function(imResponse) {const messageList = imResponse.data.messageList; // 消息列表。const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。
});

根据指定的消息 sequence 或消息时间跳拉会话的消息列表

根据指定的消息 sequence 或 消息时间拉取会话的消息列表的接口。

注意:

v2.20.0起支持。

接口

tim.getMessageListHopping(options);

参数

参数 options 为 Object 类型,包含的属性值如下:

名称类型描述
conversationIDString会话 ID。会话 ID 组成方式:
  • C2C${userID}(单聊)
  • GROUP${groupID}(群聊)
  • GROUP${topicID}(话题)v2.19.1 起支持
sequenceNumber | undefined用于拉群组会话漫游消息的起始 sequence。
timeNumber | undefined消息的服务端时间,用于拉 C2C 会话漫游消息的起始时间。
directionNumber消息拉取方向,默认 0。
  • 0 向上拉,拉更旧的消息
  • 1 向下拉,拉更新的消息
countNumber | undefined需要拉取的消息数量,默认值和最大值为15,即一次拉取至多返回15条消息。

返回值

Promise 对象。

示例

// 根据 sequence 拉群漫游消息,direction 0 向上拉,拉更旧的消息,direction 1 向下拉,拉更新的消息
let promise = tim.getMessageListHopping({conversationID: 'GROUPtest', sequence: xxx, count: 15, direction: 0});
promise.then(function(imResponse) {const messageList = imResponse.data.messageList; // 消息列表。
});
// 根据时间拉 C2C 会话漫游消息,direction 0 向上拉,拉更旧的消息,direction 1 向下拉,拉更新的消息
let promise = tim.getMessageListHopping({conversationID: 'C2Ctest', time: xxx, count: 15, direction: 0});
promise.then(function(imResponse) {const messageList = imResponse.data.messageList; // 消息列表。
});

 接收消息

功能描述

接收消息需要通过事件监听实现。

监听事件

注意:

请在调用 login 接口前调用此接口监听事件,避免漏掉 SDK 派发的事件。

接口

tim.on(eventName, handler, context);

参数

名称类型描述
eventNameString事件名称。所有的事件名称都存放在 TIM.EVENT 变量中,如需要查看可以使用 console.log(TIM.EVENT) 把所有的事件显示出来。事件列表。
handlerFunction处理事件的方法,当事件触发时,会调用此 handler 进行处理。
context* | undefined期望 handler 执行时的上下文

返回值

示例

let onMessageReceived = function(event) {// event.data - 存储 Message 对象的数组 - [Message]const messageList = event.data;messageList.forEach((message) => {if (message.type === TIM.TYPES.MSG_TEXT) {// 文本消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.TextPayload} else if (message.type === TIM.TYPES.MSG_IMAGE) {// 图片消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.ImagePayload} else if (message.type === TIM.TYPES.MSG_SOUND) {// 音频消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.AudioPayload} else if (message.type === TIM.TYPES.MSG_VIDEO) {// 视频消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.VideoPayload} else if (message.type === TIM.TYPES.MSG_FILE) {// 文件消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.FilePayload} else if (message.type === TIM.TYPES.MSG_CUSTOM) {// 自定义消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.CustomPayload} else if (message.type === TIM.TYPES.MSG_MERGER) {// 合并消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.MergerPayload} else if (message.type === TIM.TYPES.MSG_LOCATION) {// 地理位置消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.LocationPayload} else if (message.type === TIM.TYPES.MSG_GRP_TIP) {// 群提示消息 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.GroupTipPayload} else if (message.type === TIM.TYPES.MSG_GRP_SYS_NOTICE) {// 群系统通知 - https://web.sdk.qcloud.com/im/doc/zh-cn/Message.html#.GroupSystemNoticePayload}});
};
tim.on(TIM.EVENT.MESSAGE_RECEIVED, onMessageReceived);

取消监听事件

接口

tim.off(eventName, handler, context, once);

参数

名称类型描述
eventNameString事件名称。所有的事件名称都存放在 TIM.EVENT 变量中,如需要查看可以使用 console.log(TIM.EVENT) 把所有的事件显示出来。事件列表。
handlerFunction处理事件的方法,当事件触发时,会调用此 handler 进行处理。
context* | undefined期望 handler 执行时的上下文
onceBoolean | undefined是否只解绑一次

返回值

示例

let onMessageReceived = function(event) {// 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面// event.name - TIM.EVENT.MESSAGE_RECEIVED// event.data - 存储 Message 对象的数组 - [Message]
};
tim.off(TIM.EVENT.MESSAGE_RECEIVED, onMessageReceived);

 总结

  • 引入pinia的聊天模块开始进行sdk初始化
  • 在登录完成后 完成tim的登录 并且持久化登录
  • 在顶层页面完成消息的接收,也就是监听消息的变化每次变化通知一下pina事件的分法
  • 在页面收到action发过来的消息后,要把消息主动放在当前聊天记录里面
  • 当选择一个新的联系人的时候要获取这个人的聊天信息
  • 每次发送消息要注意清空输入框,并且把最新消息手动push到当前聊天数组中
import TIM, { ChatSDK } from 'tim-js-sdk';
import TIMUploadPlugin from 'tim-upload-plugin';
import { ChartDefineStoreOptions, ITextPayload, TextMessageEvent, TIMCoreLoginParams } from './type';export default class TIMCore {public tim: ChatSDK | undefinedpublic userID = ''constructor(props: ChartDefineStoreOptions) {this.initTimSdk(props.SDKAppID)}private initTimSdk(SDKAppID: number) {let options = {SDKAppID,// 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID};// 创建 SDK 实例,`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例let tim = TIM.create(options); // SDK 实例通常用 tim 表示// 设置 SDK 日志输出级别,详细分级请参见 setLogLevel https://web.sdk.qcloud.com/im/doc/zh-cn/SDK.html#setLogLevel 接口的说明</a>tim.setLogLevel(0); // 普通级别,日志量较多,接入时建议使用// tim.setLogLevel(1); // release 级别,SDK 输出关键信息,生产环境时建议使用// 注册腾讯云即时通信 IM 上传插件tim.registerPlugin({ 'tim-upload-plugin': TIMUploadPlugin })this.tim = timthis.persistedLogin()}public timLoginout = () => {//退出登录this.tim?.logout()}public unBindTIMEvent = () => {this.tim?.off(TIM.EVENT.MESSAGE_RECEIVED, () => { })this.tim?.off(TIM.EVENT.SDK_READY, () => { })}private persistedLogin = () => {console.log('缓存');const TIMCoreLoginParams = JSON.parse(localStorage.getItem('TIMCoreLoginParams') || '{}')if (TIMCoreLoginParams.userID) {console.log('存在登录');this.timLogin(TIMCoreLoginParams)}}public timLogin = async (options: TIMCoreLoginParams) => {//第一步登录sdkawait this.tim?.login(options)// 持久化相关密钥localStorage.setItem('TIMCoreLoginParams', JSON.stringify(options))this.userID = options.userIDthis.bindTIMEvent()}// 监听sdk准备完成的事件private bindTIMEvent() {this.tim?.on(TIM.EVENT.SDK_READY, this.handleSDKReady, this)}private handleSDKReady = () => {console.log('sdk准备完成');this.onReady()console.log('执行');this.tim?.on(TIM.EVENT.MESSAGE_RECEIVED, this.handleMessageReceived, this)}public onReady = () => {}private handleMessageReceived = (event: TextMessageEvent) => {console.log('接收到消息', event);// 接收到消息后 最好手动设置成已读this.tim?.setMessageRead({conversationID: event.data[0].conversationID})this.messageReceived(event)}// 对外暴露接受消息的方法public messageReceived = (event: TextMessageEvent) => { }// 创建对应消息类型private getMessageOptions = (userID: string, payload: ITextPayload) => {return this.tim?.createTextMessage({to: userID,conversationType: TIM.TYPES.CONV_C2C,// 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)// 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST// priority: TIM.TYPES.MSG_PRIORITY_NORMAL,payload,// v2.20.0起支持C2C消息已读回执功能,如果您发消息需要已读回执,需购买旗舰版套餐,并且创建消息时将 needReadReceipt 设置为 trueneedReadReceipt: true// 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)// cloudCustomData: 'your cloud custom data'})}public sendMessage = async (userID: string, payload: ITextPayload) => {// 创建消息const messOption = this.getMessageOptions(userID, payload)await this.tim?.sendMessage(messOption!)console.log('发送成功');}
}

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

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

相关文章

C++ Primer Plus 第6版 读书笔记(2)第2章 开始学习 C++

C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言&#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了 C的基本概念和技术&#xff0c;并专辟一章介绍了C11新增的功能…

Telnet 基础实验2: SSH 实验

Telnet 基础实验2&#xff1a; SSH 实验 本实验只能使用 eNSP中 AR 系统的路由器做 拓扑图 SSH &#xff1a; Secure Shell 是一个网络安全协议&#xff0c;基本于 TCP 协议 22 端口传输数据&#xff0c;通过对网络数据的加密&#xff0c;使其能够在一个不安全的网络环境中&a…

浅析Tomcat架构上的Valve内存马(内存马系列篇十一)

写在前面 这篇也是在Tomcat容器上面构造的内存马(收回之前说的不搞Tomcat了)&#xff0c;这是建立在Tomcat的管道上面做文章的一个内存马的实现方式。这是内存马系列的第十一篇文章了。 前置 什么是Pipeline-Valve管道&#xff1f; 根据前面Tomcat架构的相关知识&#xff0…

Java中的this与super关键字深度解析

一、this关键字this 关键字是 Java 常用的关键字&#xff0c;可用于任何实例方法内指向当前对象&#xff0c;也可指向对其调用当前方法的对象&#xff0c;或者在需要当前类型对象引用时使用。&#xff08;1&#xff09;this.属性名this修饰的变量用于指代成员变量方法的形参如果…

3 决策树及Python实现

1 主要思想 1.1 数据 1.2 训练和使用模型 训练&#xff1a;建立模型&#xff08;树&#xff09; 测试&#xff1a;使用模型&#xff08;树&#xff09; Weka演示ID3&#xff08;终端用户模式&#xff09; 双击weka.jar选择Explorer载入weather.arff选择trees–>ID3构建树…

SVIP优先办理服务-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

【案例8-2】 Svip优先办理服务 【案例介绍】 1.任务描述 在日常工作生活中&#xff0c;无论哪个行业都会设置一些Svip用户&#xff0c;Svip用户具有超级优先权&#xff0c;在办理业务时&#xff0c;Svip用户具有最大的优先级。 本案例要求编写一个模拟Svip优先办理业务的程…

newbing的注册使用

newbing是一款全新的智能搜索引擎&#xff0c;它可以帮助你快速、准确地找到你想要的信息&#xff0c;还可以与你进行友好、有趣的对话。newbing不仅拥有强大的搜索功能&#xff0c;还具备创造性和逻辑性&#xff0c;可以为你生成诗歌、故事、代码、歌词等各种内容。newbing还可…

【Spring从成神到升仙系列 一】2023年再不会动态代理,就要被淘汰了

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

浅析 Redis 主从同步与故障转移原理

我们在生产中使用 Redis&#xff0c;如果只部署一个 Redis 实例&#xff0c;当该实例宕机&#xff0c;到恢复之前都不可用&#xff1b;虽说 Redis 一般都用来做缓存&#xff0c;但不可用给业务系统带来的影响也是不小的&#xff0c;流量大时甚至会导致整个服务宕机。所以 Redis…

芯驰(E3-gateway)开发板环境搭建

1-Windows下环境配置 可以在Windows上使用命令行或者IAR IDE编译SSDK项目。Windows编译依赖的工具已经包含在 prebuilts/windows 目录中&#xff0c;包括编译器、Python和命令行工具。 1.1.1 CMD SSDK集成 msys 工具&#xff0c;可以在Windows命令行中完成SDK的配置、编译和…

Binder系统-C程序示例_框架分析

IPC&#xff1a;进程间的通信&#xff0c;远程调用&#xff0c;比如我们的A进程需要打开LED灯&#xff0c;调用led_open/led_ctl方法&#xff0c;但是他是没有权限去操作的&#xff0c;所以进程A通过&#xff1a;1.首先构造一些数据&#xff0c;2.通过IPC发送数据到进程B&#…

【分布式系统】MinIO之Multi-Node Multi-Drive架构分析

文章目录架构分析节点资源硬盘资源服务安装安装步骤创建系统服务新建用户和用户组创建环境变量启动服务负载均衡代码集成注意最近打算使用MinIO替代原来使用的FastDFS&#xff0c;所以一直在学习MinIO的知识。这篇文章是基于MinIO多节点多驱动的部署进行研究。 架构分析 节点资…

SpringBoot配置文件(properties yml)

查看官网更多系统配置项&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties 1.配置⽂件作⽤ 整个项⽬中所有重要的数据都是在配置⽂件中配置的&#xff0c;⽐如&#xff1a;数据库的连接信息&am…

怎么把音乐传到苹果手机上?如何将铃声导入iphone

很多人肯定都有这样的经验—比起电脑&#xff0c;使用iPhone和iPad播放音乐能获得更好的声音体验。 因此&#xff0c;现在有越来越多的用户将音乐传输到iPhone/iPad上播放。怎么把音乐传到苹果手机上&#xff1f;把音乐导入苹果手机&#xff0c;主要有2种方法&#xff1a;一种是…

vue中的百度地图的搜索定位功能

效果图 申请百度地图AK 前往 百度地图开放平台控制台 &#xff0c;登录百度账号&#xff0c;创建应用即得。 封装loadBMap.js文件 /*** 动态加载百度地图api函数* param {String} ak 百度地图AK&#xff0c;必传*/ export default function loadBMap(ak) {return new Promise…

Python曲线肘部点检测-膝部点自动检测

文章目录一. 术语解释二. 拐点检测肘部法则是经常使用的法则。很多时候&#xff0c;可以凭人工经验去找最优拐点&#xff0c;但有时需要自动寻找拐点。最近解决了一下这个问题&#xff0c;希望对各位有用。一. 术语解释 **肘形曲线(elbow curve)**类似人胳膊状的曲线&#xff…

【ArcGIS Pro二次开发】(10):属性表字段(field)的修改

在ArcGIS Pro中&#xff0c;经常会遇到用字段计算器对要素的属性表进行计算。下面以一个例子演示如何在ArcGIS Pro SDK二次开发中实现。 一、要实现的功能 如上图所示的要素图层&#xff0c;要实现如下功能&#xff1a; 当字段【市级行政区】的值为【泉州市】时&#xff0c;将…

服务网格领域的百花齐放

服务网格是一种技术架构&#xff0c;它用于管理微服务系统中各个服务之间的通信&#xff0c;旨在处理微服务间的流量&#xff08;也称为东西向流量&#xff09;。 ​ 在云原生应用中&#xff0c;一个应用的背后可能存在着成百上千个服务&#xff0c;各个服务可能又有着若干个实…

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务

【论文速递】EMNLP 2020 - 将事件抽取作为机器阅读理解任务 【论文原文】&#xff1a;Event Extraction as Machine Reading Comprehension 【作者信息】&#xff1a;Jian Liu and Yubo Chen and Kang Liu and Wei Bi and Xiaojiang Liu 论文&#xff1a;https://aclantholo…

[音视频] wav 格式

wav 格式结构 WAV文件遵循RIFF规则&#xff0c;其内容以区块&#xff08;chunk&#xff09;为最小单位进行存储。WAV文件一般由3个区块组成&#xff1a;RIFF chunk、Format chunk和Data chunk。另外&#xff0c;文件中还可能包含一些可选的区块&#xff0c;如&#xff1a;Fact…