【腾讯云IM】即时通讯的登录,登出,用户列表,私聊,图片发送

news2024/12/26 0:39:52

uniapp即时通讯

      • 1,初始化(刚开始就紧跟着文档走)
      • 2,App.vue中项目引入腾讯云,(附上账号在其他地方登陆的监听)
      • 3,登录前必需
        • 3.1,获取登录id
        • 3.2,生成userSig,独立封装一下
          • 3.2.1,文档下载生成UserSig的内容
          • 3.2.2,新建GenerateTestUserSig.js
          • 3.2.3,页面使用生成Usersig
        • 3.3,App.vue中的onshow要监听登录,因为IM的sdk会在app重新进入的时候登出
        • 3.4,登录完,你可以获取用户信息来更新IM的用户信息,为将来用户列表的头像和昵称做铺垫
      • 4,用户模块,先给看一下成品的消息推送的截图
        • 4.0,先上一下HTMl截图
        • 4.1,先发送消息,然后才能获取用户列表
        • 4.2,滚动到底部的代码
        • 4.3,发送图片
        • 4.4,历史聊天记录
        • 4.5,监听对面发来的消息
        • 4.5,向上拉到获取旧历史记录
        • 4.6,向上拉到获取旧历史记录
        • 4.7,当用户列表展示未读数量的时候,进来聊天页面需要将消息已读
      • 5,用户列表展示,先看一下HTML截图
      • 5,嘿嘿,提供思路~

附上腾讯云文档链接:https://cloud.tencent.com/document/product/269/75285

1,初始化(刚开始就紧跟着文档走)

// 从v2.11.2起,SDK 支持了 WebSocket,推荐接入;v2.10.2及以下版本,使用 HTTP
npm install tim-wx-sdk --save
// 发送图片、文件等消息需要腾讯云 即时通信 IM 上传插件
npm install tim-upload-plugin --save
// 拦截或替换敏感词需要本地审核插件
npm install tim-profanity-filter-plugin --save

2,App.vue中项目引入腾讯云,(附上账号在其他地方登陆的监听)

<script>
	import TIM from 'tim-wx-sdk';
	import TIMUploadPlugin from 'tim-upload-plugin';
	import TIMProfanityFilterPlugin from 'tim-profanity-filter-plugin';
	import Vue from 'vue'
	export default {
		onLaunch: function() {
			console.log('App Launch')
			let options = {
				SDKAppID: xxxx// 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID
			};
			// 秘钥e8e585a65c480847f1a53046d5ba92c383168ba50dfd7dd8cb54325f18bc4fd5
			// 创建 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(1); // 普通级别,日志量较多,接入时建议使用
			// tim.setLogLevel(1); // release 级别,SDK 输出关键信息,生产环境时建议使用

			// 注册腾讯云即时通信 IM 上传插件
			tim.registerPlugin({
				'tim-upload-plugin': TIMUploadPlugin
			});
			// 注册腾讯云即时通信 IM 本地审核插件
			tim.registerPlugin({
				'tim-profanity-filter-plugin': TIMProfanityFilterPlugin
			});
			let onKickedOut = function(event) {
				console.log(event.data.type, "被踢了,被踢了");
				uni.showToast({
					title: "账号在其他地方登陆,请重新登录!",
					icon: "none"
				})
				uni.clearStorage()
				setTimeout(() => {
					uni.reLaunch({
						url: "/pages/login/login"
					})
				}, 1000)
				// 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);
			//注册为全局变量
			Vue.prototype.$tim = tim
			Vue.prototype.$TIM = TIM
			

		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}
</script>

<style lang="scss">
</style>

3,登录前必需

3.1,获取登录id

这个id相当于用户标识,一般采用用户id,但注意,传的 时候要转成字符串格式

3.2,生成userSig,独立封装一下

3.2.1,文档下载生成UserSig的内容

点击去下载:
在这里插入图片描述
在这里插入图片描述

3.2.2,新建GenerateTestUserSig.js
import LibGenerateTestUserSig from '@/common/lib-generate-test-usersig-es.min.js'
const _SECRETKEY = '';
/*
 * Module:   GenerateTestUserSig
 *
 * Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。
 *           其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
 *
 * Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
 *
 *            本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,
 *            这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
 *            一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
 *
 *            正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
 *            由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。
 *
 * Reference:https://cloud.tencent.com/document/product/647/17275#Server
 */
function genTestUserSig(userID) {
	//调用的时候,传入userID
	/**
	 * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
	 *
	 * 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,
	 * 它是腾讯云用于区分客户的唯一标识。
	 */
	var SDKAPPID = xxxx;//替换为您自己账号下的 SDKAppId
	/**
	 * 签名过期时间,建议不要设置的过短
	 * <p>
	 * 时间单位:秒
	 * 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
	 */
	var EXPIRETIME = 604800;


	/**
	 * 计算签名用的加密密钥,获取步骤如下:
	 *
	 * step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
	 * step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
	 * step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
	 *
	 * 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
	 * 文档:https://cloud.tencent.com/document/product/647/17275#Server
	 */
	var SECRETKEY = 'xxxxx';//填入秘钥哦

	var generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);
	var userSig = generator.genTestUserSig(userID);
	return {
		sdkappid: SDKAPPID,
		userSig: userSig
	};
}
export {
	genTestUserSig
}
3.2.3,页面使用生成Usersig
	import {
		genTestUserSig 
	} from "@/common/GenerateTestUserSig.js"

在这里插入图片描述

getlogin() {
	let that = this
	that.POST('/login', {
		mobile: this.form.mobile,
		password: this.form.password,
	}).then(res => {
		console.log(res)
		if (res.code == 1) {
			let userid = String(res.data.userinfo.id)//拿到id
			let UserSig = genTestUserSig(userid).userSig //生成UserSig
			console.log(UserSig, "")
			let getlogin = that.$tim.login({
				userID: userid,
				userSig: UserSig
			});
			getlogin.then(function(imResponse) {
				console.log(imResponse, "登陆成功"); // 登录成功
				uni.setStorageSync('userinfo', res.data.userinfo)
				uni.setStorageSync('token', res.data.userinfo.token)
				if (imResponse.data.repeatLogin === true) {
					// 标识帐号已登录,本次登录操作为重复登录。v2.5.1 起支持
					console.log(imResponse.data.errorInfo);
					that.myuserinfo()
				} else {
					that.myuserinfo()
				}
			}).catch(function(imError) {
				console.warn('重复登录', imError); // 登录失败的相关信息
			});
		} else {
			uni.showToast({
				title: res.msg,
				icon: "none"
			})
		}
	}).catch(err => {
		console.log(err)
	})

3.3,App.vue中的onshow要监听登录,因为IM的sdk会在app重新进入的时候登出

onShow: function() {
	console.log('App Show')
	if (uni.getStorageSync('token')) {
		let that = this
		let userinfo = uni.getStorageSync('userinfo')
		let userid = String(userinfo.id)
		let UserSig = genTestUserSig(userid).userSig //生成UserSig
		let getlogin = that.$tim.login({
			userID: userid,
			userSig: UserSig
		});
		getlogin.then(function(imResponse) {
			console.log(imResponse, "登陆成功"); // 登录成功
			if (imResponse.data.repeatLogin === true) {
				// 标识帐号已登录,本次登录操作为重复登录。v2.5.1 起支持
				console.log(imResponse.data.errorInfo);
			} else {
			}
		}).catch(function(imError) {
			console.warn('重复登录', imError); // 登录失败的相关信息
		});
	}
},

3.4,登录完,你可以获取用户信息来更新IM的用户信息,为将来用户列表的头像和昵称做铺垫

//个人信息
myuserinfo() {
	let that = this
	that.GET('/uInfo').then((res) => {
		if (res.code == 1) {
			let user;
			user = res.data
			setTimeout(() => {
				console.log(user)
				// 修改个人标配资料
				let promise = that.$tim.updateMyProfile({
					nick: user.shop_name ? user.shop_name : user.nickname,
					avatar: user.avatar,
					gender: that.$TIM.TYPES.GENDER_UNKNOWN,
					selfSignature: user.shop_name ? user.shop_name : '用户',
					allowType: that.$TIM.TYPES.ALLOW_TYPE_ALLOW_ANY
				});
				promise.then(function(imResponse) {
					console.log(imResponse.data, "更新成功"); // 更新资料成功
					uni.switchTab({
						url: "/pages/index/index"
					})
				}).catch(function(imError) {
					console.warn('updateMyProfile error:',
						imError); // 更新资料失败的相关信息
				})
			}, 500)
		} else {
			uni.showToast({
				title: res.msg,
				icon: "none"
			})
		}
	})
},

4,用户模块,先给看一下成品的消息推送的截图

在这里插入图片描述

4.0,先上一下HTMl截图

在这里插入图片描述

4.1,先发送消息,然后才能获取用户列表

//发送消息
Go() {
	// 发送文本消息,Web 端与小程序端相同
	// 1. 创建消息实例,接口返回的实例可以上屏
	let that = this
	let message = that.$tim.createTextMessage({
		to: that.To_user_id,//接受者ID
		conversationType: 'C2C',//c2c代表单聊
		payload: {
			text: that.Keyword,//要发送的内容
		},
		cloudCustomData:"",//
		needReadReceipt: true
	});
	// 2. 发送消息
	let promise = that.$tim.sendMessage(message);
	promise.then(function(imResponse) {
		// 发送成功.输入框清空
		that.Keyword = ""
		//消息列表push当前消息
		that.chatlist.push(imResponse.data.message)
		//列表滚动到底部
		that.scrollToBottom()
	}).catch(function(imError) {
		// 发送失败
		console.warn('sendMessage error:', imError);
	});
}

4.2,滚动到底部的代码

//滚动至聊天底部
scrollToBottom() {
	let that = this
	that.$nextTick(() => {
		that.intoindex = "text" + Number(that.chatlist.length - 1)
	})
},

4.3,发送图片

//发送图片
GoImage() {
	let that = this
	uni.chooseImage({
		count: 2,
		sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
		sourceType: ['album'], // 从相册选择
		success: (res) => {
			console.log(res)
			let message = that.$tim.createImageMessage({
				// to: '5MYfeMTrSEvmAF1cLct',
				to: that.To_user_id,
				conversationType: 'C2C',
				payload: {
					file: res
				},
				onProgress: function(event) {
					console.log('file uploading:', event)
				}
			});
			// 3. 发送图片
			let promise = that.$tim.sendMessage(message);
			promise.then(function(imResponse) {
				// 发送成功
				console.log(imResponse);
				that.chatlist.push(imResponse.data.message)
				that.scrollToBottom()
			}).catch(function(imError) {
				// 发送失败
				console.warn('sendMessage error:', imError);
			});
		}
	});
},

4.4,历史聊天记录

// 拉取历史消息
GetMessageList(groupid) {
	let that = this
	// 根据 sequence 拉群漫游消息,direction 0 向上拉,拉更旧的消息,direction 1 向下拉,拉更新的消息
	let promise = this.$tim.getMessageListHopping({
		conversationID: 'C2C' + that.To_user_id,
		count: 15,
		direction: 0
	});
	promise.then(function(imResponse) {
		console.log(imResponse, '历史消息')
		const messageList = imResponse.data.messageList; // 消息列表。
		that.nextReqMessageID = imResponse.data.messageList[0].ID; // 用于续拉,分页续拉时需传入该字段。
		console.log(that.nextReqMessageID)
		that.chatlist = messageList
		console.log(that.chatlist[that.chatlist.length - 1].type == "TIMImageElem")
		that.scrollToBottom()
	});
},

4.5,监听对面发来的消息

// 接收消息监听
function accentmiss(event) {
	vue.accentmiss(event)
}
export default {
	data() {
		return {
		
		};
	},
	onLoad(options) {
		this.To_user_id = String(options.To_user_id)
		// 接收消息监听
		this.$tim.on(this.$TIM.EVENT.MESSAGE_RECEIVED, accentmiss);
	}
	methods:{
		// 接收消息
		accentmiss(event) {
			console.log(event, "收到消息了")
			this.chatlist.push(event.data[0])
			this.readmiss()
			this.scrollToBottom()
		}
	},
	// 页面卸载,关闭监听
	onUnload() {
		this.$tim.off(this.$TIM.EVENT.MESSAGE_RECEIVED, accentmiss);
	},
},

4.5,向上拉到获取旧历史记录

上面第一次获取历史记录的时候,拿到了历史记录的第一条历史记录ID,nextReqMessageID
接下来,pages.json,开启为true
在这里插入图片描述

onPullDownRefresh() {
	// 下拉查看更多消息
	let that = this
	let promise = this.$tim.getMessageList({
		conversationID: 'C2C' + that.To_user_id,//c2c是必要的
		nextReqMessageID: that.nextReqMessageID,
		direction: 0,//0向上,1向下
		count: 15,//拉取数量
	});
	promise.then(function(imResponse) {
		console.log(imResponse)
		setTimeout(function() {
			uni.stopPullDownRefresh();
		}, 1000);
		that.nextReqMessageID = imResponse.data.messageList[0].ID; // 用于续拉,分页续拉时需传入该字段。
		that.chatlist = [...imResponse.data.messageList, ...that.chatlist]//通过扩展运算符,向前拼接
	});
},

4.6,向上拉到获取旧历史记录

//聊天图片放大功能
openimg(index) {
	console.log(index)
	let that = this
	let list = []
	list.push(that.chatlist[index].payload.imageInfoArray[0].url)
	uni.previewImage({
		urls: list,
		current: 1,
		longPressActions: {
			// itemList: ['发送给朋友', '保存图片', '收藏'],
			success: function(data) {
				console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
			},
			fail: function(err) {
				console.log(err.errMsg);
			}
		}
	});
},

4.7,当用户列表展示未读数量的时候,进来聊天页面需要将消息已读

//消息已读
readmiss() {
	// 将某会话下所有未读消息已读上报
	let that = this
	let promise = that.$tim.setMessageRead({
		conversationID: 'C2C' + that.To_user_id
	});
	promise.then(function(imResponse) {
		console.log("已读成功")
		// 已读上报成功,指定 ID 的会话的 unreadCount 属性值被置为0
	}).catch(function(imError) {
		// 已读上报失败
		console.warn('setMessageRead error:', imError);
	});
},

5,用户列表展示,先看一下HTML截图

在这里插入图片描述
在这里插入图片描述

//获取会话列表
getchatlist() {
	let that = this
	that.userlist = []
	let promise = that.$tim.getConversationList();
	promise.then(function(imResponse) {
		that.conversationList = imResponse.data.conversationList; // 全量的会话列表,用该列表覆盖原有的会话列表
		that.conversationList.forEach(item => {
			item.lastMessage.lastTime1 = that.stampTime(item.lastMessage.lastTime * 1000)//最新消息的时间
		})
		console.log(that.conversationList)
		const isSyncCompleted = imResponse.data.isSyncCompleted; // 从云端同步会话列表是否完成
	}).catch(function(imError) {
		console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息
	});
},

5,嘿嘿,提供思路~

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

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

相关文章

K8s 内存泄漏处理方法

问题描述&#xff1a; 1. 安装go环境 2. 下载地址: https://golang.google.cn/dl/[rootk8s-master home]# rm -rf /usr/local/go && tar -C /usr/local/ -zxvf go1.17.3.linux-amd64.tar.gz3. 永久配置go 环境[rootk8s-master home]# vim /etc/profile export GOPATH…

win10、mac如何使用desktop中的docker

1、安装相应系统的docker&#xff0c;安装完什么都不需要修改。 2、需要安装mysql的话首先使用命令行 3、需要把mysql等其他软件端口映射出来使用的命令 4、搞定&#xff1b;点击关闭和启动 可以安装很多软件哦&#xff0c;非常方便两条命令搞定&#xff0c;mysql、redis、mogo…

建筑物防雷工程的设计与施工

本文会介绍建筑物防雷工程的设计与施工的基本原理、方法和要求&#xff0c;以及一些典型的案例分析。建筑物防雷工程是为了保护建筑物及其内部设备、人员和财产免受雷电危害而采取的一系列技术措施。建筑物防雷工程应遵循《建筑物防雷设计规范》GB 50057-2010和《建筑物防雷工程…

ros2 机器人imu传感器 加速度计 陀螺仪精度和数据填充单位换算

起因&#xff0c;imu解算出了加速度 角速度&#xff0c;但原始数据是没有单位的&#xff0c;只是在一个精度范围的值&#xff0c;要使用这些数据&#xff0c;就需要把这些没有单位的数据换算成带单位的数据&#xff0c;下面解说一下换算原理。 imu读取数据代码参考上期的博客&…

什么是操作系统中的kernel

什么是操作系统中的kernel 一&#xff0c;图解&#xff0c;kernel在操作系统中的结构位置 二&#xff0c;文字描述解释 系统启动后,Kernel会常驻内存,负责系统的基础功能, 如进程调度,硬件管理.普通程序就是用户态程序, 在Kernel中的程序叫做内核态程序. 普通程序如果想申请…

经典图像识别卷积神经网络总结记录

这篇博文主要是延续前文系列的总结记录&#xff0c;这里主要是总结汇总日常主流的图像识别模型相关知识内容。 下面对上述列出的卷积神经网络模型进行逐个详细介绍、算法原理分析以及优缺点总结&#xff1a; (1)LeNet-5 算法原理&#xff1a; LeNet-5是最早应用于手写数字识别…

(22)LED灯(外部)

文章目录 前言 22.1 带有I2C连接的RGB LEDs/显示器 22.2 串行连接的设备 22.3 NTF LED的含义 前言 外部 LED 或 LED 显示屏可以通过连接到自动驾驶仪的 I2C 端口&#xff0c;或者在 4.0 及以后的版本中&#xff0c;如果是串行编程的设备&#xff0c;可以通过输出使用 SERV…

【Redis】3、Redis 作为缓存(Redis中的穿透、雪崩、击穿、工具类)

目录 一、什么是缓存二、给业务添加缓存&#xff08;减少数据库访问次数&#xff09;三、给店铺类型查询业务添加缓存(1) 使用 String 类型(2) 使用 List 类型 四、缓存的更新策略(1) 主动更新(2) 最佳实现方案(3) 给查询商铺的缓存添加超时剔除和主动更新的策略① 存缓存&…

mysql 练习---表和表的字段的增删改

环境&#xff1a; 命令&#xff1a; (1)create database Market; (2) create table customers( c_num int(11) primary key auto_increment, c_name varchar(50), c_contact varchar(50), c_city varchar(50), c_birth datetime not null );(3) alter table customers mod…

[github-100天机器学习]day1 data preprocessing-版本问题已修正

https://github.com/LiuChuang0059/100days-ML-code/blob/master/Day1_Data_preprocessing/README.md#step-6-feature-scaling—特征缩放 数据预处理 导入库&#xff1a;numpy包含数学计算函数&#xff0c;pandas用于导入和管理数据集 #!/usr/bin/env python3 # -*- coding: …

flutter 更新分支内容

有三个分支&#xff0c;主分支&#xff0c;A分支&#xff0c;B分支&#xff0c;别人在B分支开发了内容&#xff0c;我在A分支进行开发。别人在B分支提交了代码&#xff0c;让我去拉下来。这时候我就是需要切到B分支&#xff0c;拉代码下来&#xff0c;然后再回到A分支&#xff…

python使用代理ip——案例

python爬虫是指使用Python编写的程序&#xff0c;通过网络爬取信息并提取有效数据。它通过模拟浏览器请求&#xff0c;获取网页数据&#xff0c;并通过解析HTML/XML等文档结构&#xff0c;从中提取数据。 Python爬虫常用的库和工具包括&#xff1a; Requests&#xff1a;用于…

Lightroom Classic 2023(12.4) for Mac

Lightroom Classic是一款图像处理软件&#xff0c;是数字摄影后期制作的重要工具之一。与其他图像处理软件相比&#xff0c; Lightroom Classic具有以下特点&#xff1a; 高效的图像管理&#xff1a;Lightroom Classic提供了强大的图像管理功能&#xff0c;可以轻松导入、整理…

Springboot接口返回参数以及入参RSA加密解密

网上有好多通过aop切面以及自定义的RSA工具类进行加密解密的方法&#xff0c;期中的过程繁琐也不好用&#xff0c;博主研究了一天从网上到了超好用的基于Springboot框架实现的接口RSA加密解密方式&#xff0c;通过rsa-encrypt-body-spring-boot实现了对Spring Boot接口返回值、…

MySQL库表操作

目录 1、SQL语句分类 2、书写规范 &#xff08;二&#xff09;关键字不区分大小写 &#xff08;三&#xff09;字符串和日期时间常数要用单引号 &#xff08;四&#xff09;单词之间需要使用半角空格或者换行符进行分隔 &#xff08;五&#xff09;注释 3、库操作 创建…

关于PHP 使用 Elastic Search8的相关经历

你好&#xff01; 如果你也是第一次使用ES8和PHP对接使用&#xff0c;这里或许有一些心得可以为你解决一些问题。 本地环境所需工具 windows 版本搭建 Elastic Search 如下图&#xff0c;通过官网下载一个windows版本的Elastic Search 执行.bat文件即可启动 https://localhos…

基于OpenCV 和 Python 实现车牌检测--附免费源码

文末提供免费的源代码下载链接 车牌检测是使用计算机视觉技术自动检测和识别图像或视频流中的车牌/车牌的过程。 此任务在许多应用中都很有用,例如交通管理、自动收费和停车控制。 车牌检测基本上分为两个任务: 车牌检测:这是指识别图像或视频帧中车牌位置的过程。这涉…

优化篇--vxe-table 大数据表格替代方案

解决数据量过大及内容复杂时造成的Table渲染滚动的卡顿问题 vxe-table官方文档 npm install xe-utils vxe-tablelegacyvex-table.vue <template><div class"page"><vxe-gridclass"mytable"ref"xGrid2"v-bind"gridOptions2&…

langchain系列1- langchain-ChatGLM

源码阅读 1 服务启动 (demo.queue(concurrency_count3).launch(server_name0.0.0.0,server_port7860,show_apiFalse,shareFalse,inbrowserFalse))这部分代码使用了 Gradio 库提供的两个函数&#xff1a;queue 和 launch。 在这里&#xff0c;demo 是一个 Interface 类的实例…

win go vscode安装配置-智能提示

win go vscode安装配置-智能提示 0.前提 go1.17.1之后不允许go get安装库 vscode是免费的go开发工具&#xff0c;想要代码智能提示 go推荐go mod和go install&#xff0c;不推荐GOPATH了 1.安装步骤 [1] vscode安装-百度一堆 [2] go安装-从官网 https://go.dev/dl/ 下载win 6…