创新实训——飞讯(九)

论文阅读:Visual Relationship Detection with Language Priors Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio... 阅读详情

目录

聊天界面的im交互

一、初始化

二、聊天信息相关功能


聊天界面的im交互

一、初始化

创建sdk实例,初始化sdk;

跳转到该页面时,接收跳转前页面传来的会话id、会话对象id和会话类型,设置消息监听,用以接受新消息时进行处理。

之后,获取个人资料、根据会话类型调用相应的获取会话对象资料接口、并拉取相应会话的消息列表,存储在相应变量中。

onLoad:function(options){
	this.conversationID = options.conversationID;
	this.detailsId = options.userid;
	this.type = options.type;
	//console.log(this.detailsId);

	//this.getMsg(this.nowpage);
	//this.nextPage();
	
},
onShow:function(options){
	
	tim.on(TIM.EVENT.MESSAGE_RECEIVED, (event)=> {
	  this.getMsg();
	});
},
onReady() {
	this.getMyInfo();
	
	if(this.type == 1){
		this.getDetails();
	}
	else if(this.type == 0){
		this.getGroup();
		this.getMemberList();
	}
	
	this.getMsg();
},

部分im接口调用:

getMsg:function(){
	let promise = tim.getMessageList({conversationID: this.conversationID, count: 15});
	promise.then((imResponse)=> {
	  const messageList = imResponse.data.messageList; // 消息列表。
	  const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。
	  const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。
	  this.message = messageList;
	  this.nextReqMessageID = nextReqMessageID;
	  this.isCompleted = isCompleted;

	  this.msgReaded();
	  let len = this.message.length;
	  this.$nextTick(function(){
		this.scrollToView = 'msg' + len;
	  },0)
	});
},

二、聊天信息相关功能

播放语音:调用uniapp自带播放函数,传递语音地址url进行播放;

播放视频:点击后跳转到另一个播放视频页面,传递视频url,使用video组件播放视频;

地图定位:点击定位信息后根据消息内的经纬度和地点名称,调用uniapp的相关接口;

playVoice:function(e){
	innerAudioContext.src = e;
	innerAudioContext.play();
},
playVideo:function(e){
	uni.navigateTo({
		url:"../video/video?videourl=" + e,
	})
},
openLocation:function(e){
	uni.openLocation({
		latitude:e.latitude,
		longitude:e.longitude,
		name:e.description,
		success:function(){
			console.log('success');
		}
	});
},

提交输入信息:

从提交组件部分传来要提交的信息,根据其中的对话和消息类型设置参数和确定要调用的函数。

inputs:function(e){
	let conversationType = TIM.TYPES.CONV_C2C;
	if(this.type == 1){
		conversationType = TIM.TYPES.CONV_C2C;
	}
	else if(this.type == 0){
		conversationType = TIM.TYPES.CONV_GROUP
	}
	
	if(e.types == 0){
		//console.log(e.message);
		// 发送文本消息,Web 端与小程序端相同
		// 1. 创建消息实例,接口返回的实例可以上屏
		let message = tim.createTextMessage({
		  to: this.detailsId,
		  conversationType: conversationType,
		  // 消息优先级,用于群聊(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: {
			text: e.message
		  },
		  // 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)
		  // cloudCustomData: 'your cloud custom data'
		});
		// 2. 发送消息
		let promise = tim.sendMessage(message);
		promise.then((imResponse)=> {
		  // 发送成功
		  this.getMsg(1);
		}).catch((imError)=> {
		  // 发送失败
		  console.warn('sendMessage error:', imError);
		});
	}
	else if(e.types == 1){
		// Web 端发送图片消息示例1 - 传入 DOM 节点	
		// 1. 创建消息实例,接口返回的实例可以上屏
		let message = tim.createImageMessage({
		  to: this.detailsId,
		  conversationType: conversationType,
		  // 消息优先级,用于群聊(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: {
			file: e.message,
		  },
		  // 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)
		  // cloudCustomData: 'your cloud custom data'
		  onProgress: function(event) { console.log('file uploading:', event) }
		});
		// 2. 发送消息
		let promise = tim.sendMessage(message);
		promise.then((imResponse)=> {
		  // 发送成功
		  this.getMsg(1);
		}).catch(function(imError) {
		  // 发送失败
		  uni.showToast({
			title:"发送图片失败",
			duration:2000
		  })
		  console.warn('sendMessage error:', imError);
		});
	}
	else if(e.types == 2){
		let message = tim.createVideoMessage({
			  to: this.detailsId,
			  conversationType: conversationType,
			  payload: { 
				  file: e.message,
				  },
			  onProgress: function(event) { console.log('file uploading:', event) }
			});
			// 2. 发送消息
			let promise = tim.sendMessage(message);
			promise.then((imResponse)=> {
			  // 发送成功
			  this.getMsg(1);
			}).catch(function(imError) {
			  // 发送失败
			  uni.showToast({
				title:"发送视频失败",
				duration:2000
			  })
			  console.warn('sendMessage error:', imError);
			});
	}
	else if(e.types == 3){
		let message = tim.createFileMessage({
			  to: this.detailsId,
			  conversationType: conversationType,
			  payload: { 
				  file: e.message,
				  },
			  onProgress: function(event) { console.log('file uploading:', event) }
			});
			// 2. 发送消息
			let promise = tim.sendMessage(message);
			promise.then((imResponse)=> {
			  // 发送成功
			  this.getMsg(1);
			}).catch(function(imError) {
			  // 发送失败
			  console.warn('sendMessage error:', imError);
			});
	}
	else if(e.types == 4){
		// 发送地理位置消息,Web 端与小程序端相同(v2.15.0起支持)
		// 1. 创建消息实例,接口返回的实例可以上屏
		let message = tim.createLocationMessage({
		  to: this.detailsId,
		  conversationType: conversationType,
		  // 消息优先级,用于群聊(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: {
			description: e.message.name,
			longitude: e.message.longitude, // 经度
			latitude: e.message.latitude // 纬度
		  }
		});
		// 2. 发送消息
		let promise = tim.sendMessage(message);
		promise.then(function(imResponse) {
		  // 发送成功
		}).catch(function(imError) {
		  // 发送失败
		  console.warn('sendMessage error:', imError);
		});
	}
	else if(e.types == 5){
		if(this.type == 1){
			TUICalling.call({ userID: this.detailsId, type: 1 });
		}
		else if(this.type == 0){
			let userIDs = [];
			for (let i = 0; i < this.memberList.length; i++) {
				userIDs.push(this.memberList[i].userID);
			}
			TUICalling.groupCall({ userIDList: userIDs, type: 1 });
		}
		
	}
	else if(e.types == 6){
		if(this.type == 1){
			TUICalling.call({ userID: this.detailsId, type: 2 });
		}
		else if(this.type == 0){
			let userIDs = [];
			for (let i = 0; i < this.memberList.length; i++) {
				userIDs.push(this.memberList[i].userID);
			}
			//console.log(userIDs);
			TUICalling.groupCall({ userIDList: userIDs, type: 2 });
		}
	}
	else if(e.types == 7){
		const message = tim.createAudioMessage({
			to: this.detailsId,
			conversationType: conversationType,
			payload: {
			  file: e.message.voice
			},
		  let promise = tim.sendMessage(message);
		  promise.then((imResponse)=> {
			// 发送成功
			this.getMsg(1);
			console.log(imResponse);
		  }).catch(function(imError) {
			// 发送失败
			console.warn('sendMessage error:', imError);
		  });
	}
	
	let len = this.message.length;
	this.$nextTick(function(){
		this.scrollToView = 'msg' + len;
	},0)
},

浅谈python反序列化漏洞 0x01 python序列化与反序列化 Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。python中的序列化操作是通过pickle模块,而该模块主要包含l dumps将dict转化为str格式,loads将str格式转化为dict格式。 dump和load与文件操作结合起来, pickle.dump(obj, f... 阅读详情

相关推荐

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 934

山东大学软件学院创新实训——飞讯(四)

山东大学创新实训第4次记录

weixin_54533613的博客 1915

Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译

0、加密的原理 Unity3D 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。 Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 文件没什么区别。 为了防止别人破解,我们会对游戏资源加密,简单点的 比如修改文件的一个字节 或者 位移一下

Circle 8689

微信小程序上拉加载更多

data:{ by_no: 1, //页码 } onLoad: function (options) { this.getmessageList() }, getmessageList:function(){ var that = this wx.showLoading({ title: '加载中...', }) wx.request({ url: '' method: "POST", // 请求头部 heade

candyy5的博客 263

React 实践 - 获取历史聊天消息

分页加载原因 在一个系统数据很大,在接口数据交互,海量数据查询,服务器接口返回的数据不可能一次性返回。 数据量大,从数据库一次性查询,再到网络传输是要花费更多的时间客户端才能响应拿到数据进行 UI 界面渲染。 从接口拿到大量数据渲染,Web 端会造成界面卡顿,移动端处理大量数据,会出现 OOM。 所以获取数据可以通过分页加载的方式处理数据和UI交互。这样解决性能问题,让 UED 效果更好一点。 通常前端可以通过上拉刷新、下拉加载更多等方式。 解决当前聊天问题 在单聊,会获取聊天历史记录,分页拉取 获取

狮子大大 1245

对话形式的留言列表展示

基于vue实现了一个类似微信聊天框的留言展示框,左侧展示留言人和被留言对象,另外在左侧上方设置了搜索框,可以快速查找想要浏览的对象留言;右侧上半部区域用作留言展示,增设滚动条,配合加载中的显示调取获取留言列表接口的方法,实现了效果上的列表懒加载。另外右侧下半部区域一是起到占位的作用,便于上半部实现列表的懒加载;其次就是多加一个提示,一旦列表的数据加载完成就提示‘暂无更多留言’,如果提示‘上滑加载更多’就表示列表还有数据,可以进行列表懒加载。整个界面的样式效果是由css样式实现的............

yolo_link的博客 681

vue中this.$nextTick()的用法

将回调延迟到下次DOM更新循环之后执行。在修改数据之后立即使用它,然后等待DOM更新。 我在开发的过程中,有一个页面,需要根据不同角色去判断显示页面。相当于两个页面,根据不同角色去判断显示。但是我一开始把两个页面封装成了两个组件。 当调用接口的时候。就只能使用created()去调用接口。但是这个页面有二级页面。在二级页面修改状态之后,返回一级页面的时候。一级页面需要重新请求接口。这时就很尴尬,用created()只有页面加载第一次的时候,才会调用,我从二级页面返回一级页面时,并不会重新调用接口。。。 如果

qq_43628847的博客 1224

php集成腾讯云im

官网文档 https://cloud.tencent.com/document/product/269/37413 由于我是用的laravel,所以用的web方式 <script src="/public/vendor/tim/tim-js.js"></script> <script src="/public/vendor/tim/cos-js-sdk-v5.min.js"></script> 1、后端签名 https://cloud.tencen

征途人生&梦 1545

山东大学软件学院创新实训——飞讯

山东大学创新实训第9次记录

weixin_54533613的博客 332

创新实训——飞讯(一)

一、项目简介 飞讯是一款为使小型团队作业更加便捷而设计的软件,包括单聊、群聊等功能。本人负责Windows端的开发。 二、第一周工作 采用QT开发,故第一周学习QT相关UI知识,包括可视化UI设计、代码化UI设计以及混合设计的方法;并了解了QT中基本的组件的用途和用法、样式表的写法等。 ............

leaf_er的博客 463

山东大学创新实训进度

进度记录

weixin_54533613的博客 440

山东大学软件学院创新实训——飞讯(八)

山东大学创新实训第8次记录

weixin_54533613的博客 428

山东大学软件学院创新实训——飞讯(一)

山东大学创新实训第一次记录

weixin_54533613的博客 517

创新实训——飞讯(六)

一、创建群聊界面 由于毫无经验,界面是参考教学视频编写的;基本步骤为编写结构、调整样式、编写功能等。 效果和部分代码如下: 设置了一个变量记录已选择的人数,判断所选人数大于0且输入了群名称(群名称长度大于0)后创建按钮才不为灰; <view class="bottom-btn btn1" :class="{notselected:selectedNumber<=0||groupname.length<=0}">创建({{selectedNumber}})</v

leaf_er的博客 251

创新实训——飞讯(二)

一、设计登录、注册界面 利用所学的QT知识,利用可视化设计了一个基础的界面; 由于QT窗口自带一个较为丑陋的边框,为了后续方便设计,调用相关函数去掉边框; //去掉边框 setWindowFlags(Qt::WindowType::FramelessWindowHint); 但是去掉边框后,界面便不可移动等,查询解决方法后,重写了鼠标按压事件和点击事件函数; //计算鼠标与窗口左上角差值 void Login::mousePressEvent(QMouseEvent *even

leaf_er的博客 411

创新实训——飞讯(七)

群聊相关im交互

leaf_er的博客 279

创新实训——飞讯(四)

由于组内人员调动原因,组长找了一个可以实现web、小程序、Android、ios的跨平台运行的框架uni-app,考虑到便利性,移动端的制作很重要,且该框架可以实现较多运行方式,考虑到时间因素和经验因素,故我和组长一起进行移动端的开发。PC端的制作内容会在本章内简单讲述,细节部分不再详谈,并暂停PC端开发,视后续情况再考虑是否继续。 目录 一、界面设计基础完善 1、聊天界面 2、注册界面 二、功能实现 1、登陆后拉取并展示所需数据 (1)拉取数据 (2)展示数据 一、界...

leaf_er的博客 185

创新实训——飞讯(八)

聊天界面

leaf_er的博客 224

山东大学软件学院创新实训——飞讯(六)

山东大学创新实训第6次记录

weixin_54533613的博客 2731

创新实训——飞讯(十)

工作日志与问卷

leaf_er的博客 360

创新实训——飞讯(五)

如(四)中所说,之后为移动端开发相关内容; 目录 一、基础学习 二、编写修改弹框 一、基础学习 对于uni-app相关内容的学习,主要包括函数、组件样式设置等; 二、编写修改弹框 <view class="modify":style="{bottom:-+widHeight+'px'}" :animation="animationData"> <view class="modify-header"> <view class="c

leaf_er的博客 289

山东大学软件学院创新实训——飞讯(三)

山东大学创新实训第3次记录

weixin_54533613的博客 723

美赛各题型常见参考代码汇总.zip

美国大学生数学建模竞赛,美赛各题型常见参考代码汇总(全).zip

【无线光通信】基于深度学习的大气湍流相位预测与补偿系统设计:OAM光束畸变修复及性能评估(含详细代码及解释)

内容概要:本文档详细介绍了基于深度学习的无线光通信大气湍流相位预测与补偿的研究,重点在于MATLAB仿真和Python深度学习模型的结合。研究流程包括:1) 使用MATLAB创建包含湍流相位的数据集;2) 使用Python训练深度学习模型进行相位预测;3) 将训练好的模型应用于测试集并在MATLAB中评估补偿效果。文档解决了代码复现中的常见问题,如`ift2`函数未定义和数组索引越界,并提供了详细的代码解释和解决方案。;适合人群:具有MATLAB和Python编程基础,对无线光通信、深度学习和大气湍流相位补偿感兴趣的科研人员及研究生。;使用场景及目标:①理解和复现基于深度学习的OAM光束大气湍流相位补偿技术;②掌握MATLAB和Python在无线光通信研究中的联合使用方法;③学习如何创建湍流相位数据集、训练深度学习模型以及评估补偿效果。;阅读建议:此文档不仅提供详细的代码实现,还包含了对各个函数和流程的深入解释,因此在阅读时应结合代码逐行理解,并尝试运行代码以加深理解。同时,对于遇到的问题,可以根据文档提供的解决方案进行调试和修正。

上一篇: 创新实训——飞讯(八)
下一篇: 创新实训——飞讯(十)
leaf_er
博客等级 码龄5年 0粉丝 · 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值