环信IM Demo登录方式如何修改为自己项目的?

在环信即时通讯云IM 官网下载Demo,本地运行只有手机+验证码的方式登录?怎么更改为自己项目的Appkey和用户去进行登录呢?

👇👇👇本文以Web端为例,教大家如何更改代码来实现

1、 VUE2 Demo

vue2 demo源码下载

vue2 demo线上体验

第一步:更改appkey

webim-vue-demo===>src===>utils===>WebIMConfig.js
在这里插入图片描述

第二步:更改代码

webim-vue-demo===>src===>pages===>login===>index.vue

<template><a-layout><div class="login"><div class="login-panel"><div class="logo">Web IM</div><a-input v-model="username" :maxLength="64" placeholder="用户名" /><a-input v-model="password" :maxLength="64" v-on:keyup.13="toLogin" type="password" placeholder="密码" /><a-input v-model="nickname" :maxLength="64" placeholder="昵称" v-show="isRegister == true" /><a-button type="primary" @click="toRegister" v-if="isRegister == true">注册</a-button><a-button type="primary" @click="toLogin" v-else>登录</a-button></div><p class="tip" v-if="isRegister == true">已有账号?<span class="green" v-on:click="changeType">去登录</span></p><p class="tip" v-else>没有账号?<span class="green" v-on:click="changeType">注册</span></p><!-- <div class="login-panel"><div class="logo">Web IM</div><a-form :form="form" ><a-form-item has-feedback><a-inputplaceholder="手机号码"v-decorator="['phone',{rules: [{ required: true, message: 'Please input your phone number!' }],},]"style="width: 100%"><a-selectinitialValue="86"slot="addonBefore"v-decorator="['prefix', { initialValue: '86' }]"style="width: 70px"><a-select-option value="86">+86</a-select-option></a-select></a-input></a-form-item><a-form-item><a-row :gutter="8"><a-col :span="14"><a-inputplaceholder="短信验证码"v-decorator="['captcha',{ rules: [{ required: true, message: 'Please input the captcha you got!' }] },]"/></a-col><a-col :span="10"><a-button v-on:click="getSmsCode" class="getSmsCodeBtn">{{btnTxt}}</a-button></a-col></a-row></a-form-item><a-button style="width: 100%" type="primary" @click="toLogin" class="login-rigester-btn">登录</a-button></a-form> --><!-- </div> --></div></a-layout>
</template><script>
import './index.less';
import { mapState, mapActions } from 'vuex';
import axios from 'axios'
import { Message } from 'ant-design-vue';
const domain = window.location.protocol+'//a1.easemob.com'
const userInfo = localStorage.getItem('userInfo') && JSON.parse(localStorage.getItem('userInfo'));
let times = 60;
let timer
export default{data(){return {username: userInfo && userInfo.userId || '',password: userInfo && userInfo.password || '',nickname: '',btnTxt: '获取验证码'};},beforeCreate() {this.form = this.$form.createForm(this, { name: 'register' });},mounted: function(){const path = this.isRegister ? '/register' : '/login';if(path !== location.pathname){this.$router.push(path);}if(this.isRegister){this.getImageVerification()}},watch: {isRegister(result){if(result){this.getImageVerification()}}},components: {},computed: {isRegister(){return  this.$store.state.login.isRegister;},imageUrl(){return this.$store.state.login.imageUrl},imageId(){return this.$store.state.login.imageId}},methods: {...mapActions(['onLogin', 'setRegisterFlag', 'onRegister', 'getImageVerification', 'registerUser', 'loginWithToken']),toLogin(){this.onLogin({username: this.username.toLowerCase(),password: this.password});// const form = this.form;// form.validateFields(['phone', 'captcha'], { force: true }, (err, value) => {// 	if(!err){// 		const {phone, captcha} = value// 		this.loginWithToken({phone, captcha})// 	}// });},toReset(){this.$router.push('/resetpassword')},toRegister(e){e.preventDefault(e);// this.form.validateFieldsAndScroll((err, values) => {//     if (!err) {//     	this.registerUser({//     		userId: values.username,//             userPassword: values.password,//             phoneNumber: values.phone,//             smsCode: values.captcha,//     	})//     }// });this.onRegister({username: this.username.toLowerCase(),password: this.password,nickname: this.nickname.toLowerCase(),});},changeType(){this.setRegisterFlag(!this.isRegister);},getSmsCode(){if(this.$data.btnTxt != '获取验证码') returnconst form = this.form;form.validateFields(['phone'], { force: true }, (err, value) => {if(!err){const {phone, imageCode} = valuethis.getCaptcha({phoneNumber: phone, imageCode})}});},getCaptcha(payload){const self = thisconst imageId = this.imageIdaxios.post(domain+`/inside/app/sms/send/${payload.phoneNumber}`, {phoneNumber: payload.phoneNumber,}).then(function (response) {Message.success('短信已发送')self.countDown()}).catch(function (error) {if(error.response && error.response.status == 400){if(error.response.data.errorInfo == 'Image verification code error.'){self.getImageVerification()}if(error.response.data.errorInfo == 'phone number illegal'){Message.error('请输入正确的手机号!')}else if(error.response.data.errorInfo == 'Please wait a moment while trying to send.'){Message.error('你的操作过于频繁,请稍后再试!')}else if(error.response.data.errorInfo.includes('exceed the limit')){Message.error('获取已达上限!')}else{Message.error(error.response.data.errorInfo)}}});},countDown(){this.$data.btnTxt = timestimer = setTimeout(() => {this.$data.btnTxt--times--if(this.$data.btnTxt === 0){times = 60this.$data.btnTxt = '获取验证码'return clearTimeout(timer)}this.countDown()}, 1000)}}
};
</script>

webim-vue-demo===>src===>store===>login.js
只用更改actions下的onLogin,其余不用动

onLogin: function(context, payload){context.commit('setUserName', payload.username);let options = {user: payload.username,pwd: payload.password,appKey: WebIM.config.appkey,apiUrl: 'https://a1.easecdn.com'};WebIM.conn.open(options).then((res)=>{localStorage.setItem('userInfo', JSON.stringify({ userId: payload.username, password: payload.password,accessToken:res.accessToken}));});},

2、VUE3 DEMO:

vue3 demo源码下载

vue3 demo线上体验

第一步:更改appkey

webim-vue-demo===>src===>IM===>config===>index.js

c27eca4aefd5861bb4014d86d7b080de.png

第二步:更改代码

webim-vue-demo===>src===>views===>Login===>components===>LoginInput===>index.vue

<script setup>
import { ref, reactive, watch, computed } from 'vue'
import { ElMessage } from 'element-plus'
import { EaseChatClient } from '@/IM/initwebsdk'
import { handleSDKErrorNotifi } from '@/utils/handleSomeData'
import { fetchUserLoginSmsCode, fetchUserLoginToken } from '@/api/login'
import { useStore } from 'vuex'
import { usePlayRing } from '@/hooks'
const store = useStore()
const loginValue = reactive({phoneNumber: '',smsCode: ''
})
const buttonLoading = ref(false)
//根据登陆初始化一部分状态
const loginState = computed(() => store.state.loginState)
watch(loginState, (newVal) => {if (newVal) {buttonLoading.value = falseloginValue.phoneNumber = ''loginValue.smsCode = ''}
})
const rules = reactive({phoneNumber: [{ required: true, message: '请输入手机号', trigger: 'blur' },{pattern: /^1[3-9]\d{9}$/,message: '请输入正确的手机号',trigger: ['blur', 'change']}],smsCode: [{required: true,message: '请输入短信验证码',trigger: ['blur', 'change']}]
})
//登陆接口调用
const loginIM = async () => {const { clickRing } = usePlayRing()clickRing()buttonLoading.value = true/* SDK 登陆的方式 */try {let { accessToken } = await EaseChatClient.open({user: loginValue.phoneNumber.toLowerCase(),pwd: loginValue.smsCode.toLowerCase(),});window.localStorage.setItem(`EASEIM_loginUser`, JSON.stringify({ user: loginValue.phoneNumber, accessToken: accessToken }))} catch (error) {console.log('>>>>登陆失败', error);const { data: { extraInfo } } = errorhandleSDKErrorNotifi(error.type, extraInfo.errDesc);loginValue.phoneNumber = '';loginValue.smsCode = '';}finally {buttonLoading.value = false;}/*  !环信后台接口登陆(仅供环信线上demo使用!) */// const params = {//     phoneNumber: loginValue.phoneNumber.toString(),//     smsCode: loginValue.smsCode.toString()// }// try {//     const res = await fetchUserLoginToken(params)//     if (res?.code === 200) {//         console.log('>>>>>>登陆token获取成功', res.token)//         EaseChatClient.open({//             user: res.chatUserName.toLowerCase(),//             accessToken: res.token//         })//         window.localStorage.setItem(//             'EASEIM_loginUser',//             JSON.stringify({//                 user: res.chatUserName.toLowerCase(),//                 accessToken: res.token//             })//         )//     }// } catch (error) {//     console.log('>>>>登陆失败', error)//     if (error.response?.data) {//         const { code, errorInfo } = error.response.data//         if (errorInfo.includes('does not exist.')) {//             ElMessage({//                 center: true,//                 message: `用户${loginValue.username}不存在!`,//                 type: 'error'//             })//         } else {//             handleSDKErrorNotifi(code, errorInfo)//         }//     }// } finally {//     buttonLoading.value = false// }
}
/* 短信验证码相关 */
const isSenedAuthCode = ref(false)
const authCodeNextCansendTime = ref(60)
const sendMessageAuthCode = async () => {const phoneNumber = loginValue.phoneNumbertry {await fetchUserLoginSmsCode(phoneNumber)ElMessage({type: 'success',message: '验证码获取成功!',center: true})startCountDown()} catch (error) {ElMessage({ type: 'error', message: '验证码获取失败!', center: true })}
}
const startCountDown = () => {isSenedAuthCode.value = truelet timer = nulltimer = setInterval(() => {if (authCodeNextCansendTime.value <= 60 &&authCodeNextCansendTime.value > 0) {authCodeNextCansendTime.value--} else {clearInterval(timer)timer = nullauthCodeNextCansendTime.value = 60isSenedAuthCode.value = false}}, 1000)
}
</script><template><el-form :model="loginValue" :rules="rules"><el-form-item prop="phoneNumber"><el-inputclass="login_input_style"v-model="loginValue.phoneNumber"placeholder="手机号"clearable/></el-form-item><el-form-item prop="smsCode"><el-inputclass="login_input_style"v-model="loginValue.smsCode"placeholder="请输入短信验证码"><template #append><el-buttontype="primary":disabled="loginValue.phoneNumber && isSenedAuthCode"@click="sendMessageAuthCode"v-text="isSenedAuthCode? `${authCodeNextCansendTime}S`: '获取验证码'"></el-button></template></el-input></el-form-item><el-form-item><div class="function_button_box"><el-buttonv-if="loginValue.phoneNumber && loginValue.smsCode"class="haveValueBtn":loading="buttonLoading"@click="loginIM">登录</el-button><el-button v-else class="notValueBtn">登录</el-button></div></el-form-item></el-form>
</template><style lang="scss" scoped>
.login_input_style {margin: 10px 0;width: 400px;height: 50px;padding: 0 16px;
}::v-deep .el-input__inner {padding: 0 20px;font-style: normal;font-weight: 400;font-size: 14px;line-height: 20px;letter-spacing: 1.75px;color: #3a3a3a;&::placeholder {font-family: 'PingFang SC';font-style: normal;font-weight: 400;font-size: 14px;line-height: 20px;/* identical to box height */letter-spacing: 1.75px;color: #cccccc;}
}::v-deep .el-input__suffix-inner {font-size: 20px;margin-right: 15px;
}::v-deep .el-form-item__error {margin-left: 16px;
}::v-deep .el-input-group__append {background: linear-gradient(90deg, #04aef0 0%, #5a5dd0 100%);width: 60px;color: #fff;border: none;font-weight: 400;button {font-weight: 300;}
}.login_text {font-family: 'PingFang SC';font-style: normal;font-weight: 400;font-size: 12px;line-height: 17px;text-align: right;.login_text_isuserid {display: inline-block;// width: 100px;color: #f9f9f9;}.login_text_tologin {margin-right: 20px;width: 80px;color: #05b5f1;cursor: pointer;&:hover {text-decoration: underline;}}
}.function_button_box {margin-top: 10px;width: 400px;button {margin: 10px;width: 380px;height: 50px;border-radius: 57px;}.haveValueBtn {background: linear-gradient(90deg, #04aef0 0%, #5a5dd0 100%);border: none;font-weight: 300;font-size: 17px;color: #f4f4f4;&:active {background: linear-gradient(90deg, #0b83b2 0%, #363df4 100%);}}.notValueBtn {border: none;font-weight: 300;font-size: 17px;background: #000000;mix-blend-mode: normal;opacity: 0.3;color: #ffffff;cursor: not-allowed;}
}
</style>

3、React DEMO:

React Demo源码下载

React Demo线上体验

第一步:更改appkey

webim-dev===>demo===>src===>config===>WebIMConfig.js
在这里插入图片描述

第二步:更改代码

webim-dev===>demo===>src===>config===>WebIMConfig.js
将usePassword改为true

在这里插入图片描述

4、Uniapp Demo:

uniapp vue2 demo源码下载

uniapp vue3 demo源码下载

第一步:更改appkey

uniapp vue2 demo
webim-uniapp-demo===>utils===>WebIMConfig.js
在这里插入图片描述

uniapp vue3 demo
webim-uniapp-demo===>EaseIM===>config===>index.js

7fc3d3d4077b50be4fdba689acb2f9a4.png

第二步:更改代码

webim-uniapp-demo===>pages===>login===>login.vue

c18a811eba8546dc53bebca8fa0b31da.png

5、微信小程序 Demo:

微信小程序源码下载

第一步:更改appkey

webim-weixin-demo===>src===>utils===>WebIMConfig.js

109f65d6690a9ace085c47e9b5e9eb49.png

第二步:更改代码

webim-weixin-demo===>src===>pages===>login===>login.wxml

<import src="../../comps/toast/toast.wxml" />
<view class="login">
<view class="login_title">
<text bindlongpress="longpress">登录</text>
</view><!-- 测试用 请忽略 -->
<view class="config" wx:if="{{ show_config }}">
<view>
<text>使用沙箱环境</text>
<switch class="config_swich" checked="{{isSandBox? true: false}}" color="#0873DE" bindchange="changeConfig" />
</view>
</view><view class="login_user {{nameFocus}}">
<input type="text" placeholder="请输入用户名" placeholder-style="color:rgb(173,185,193)" bindinput="bindUsername" bindfocus="onFocusName" bindblur="onBlurName" />
</view>
<view class="login_pwd {{psdFocus}}">
<input type="text" password placeholder="用户密码" placeholder-style="color:rgb(173,185,193)" bindinput="bindPassword" bindfocus="onFocusPsd" bindblur="onBlurPsd"/>
</view>
<view class="login_btn">
<button hover-class="btn_hover" bind:tap="login">登录</button>
</view>
<template is="toast" data="{{ ..._toast_ }}"></template>
</view>

webim-weixin-demo===>src===>pages===>login===>login.js

let WebIM = require("../../utils/WebIM")["default"];
let __test_account__, __test_psword__;
let disp = require("../../utils/broadcast");let runAnimation = true
Page({
data: {
name: "",
psd: "",
grant_type: "password",
rtcUrl: '',
show_config: false,
isSandBox: false
},statechange(e) {
console.log('live-player code:', e.detail.code)
},error(e) {
console.error('live-player error:', e.detail.errMsg)
},onLoad: function(option){
const me = this;
const app = getApp();
new app.ToastPannel.ToastPannel();disp.on("em.xmpp.error.passwordErr", function(){
me.toastFilled('用户名或密码错误');
});
disp.on("em.xmpp.error.activatedErr", function(){
me.toastFilled('用户被封禁');
});wx.getStorage({
key: 'isSandBox',
success (res) {
console.log(res.data)
me.setData({
isSandBox: !!res.data
})
}
})if (option.username && option.password != '') {
this.setData({
name: option.username,
psd: option.password
})
}
},bindUsername: function(e){
this.setData({
name: e.detail.value
});
},bindPassword: function(e){
this.setData({
psd: e.detail.value
});
},
onFocusPsd: function(){
this.setData({
psdFocus: 'psdFocus'
})
},
onBlurPsd: function(){
this.setData({
psdFocus: ''
})
},
onFocusName: function(){
this.setData({
nameFocus: 'nameFocus'
})
},
onBlurName: function(){
this.setData({
nameFocus: ''
})
},login: function(){
runAnimation = !runAnimation
if(!__test_account__ && this.data.name == ""){
this.toastFilled('请输入用户名!')
return;
}
else if(!__test_account__ && this.data.psd == ""){
this.toastFilled('请输入密码!')
return;
}
wx.setStorage({
key: "myUsername",
data: __test_account__ || this.data.name.toLowerCase()
});getApp().conn.open({
user: __test_account__ || this.data.name.toLowerCase(),
pwd: __test_psword__ || this.data.psd,
grant_type: this.data.grant_type,
appKey: WebIM.config.appkey
});
},longpress: function(){
console.log('长按')
this.setData({
show_config: !this.data.show_config
})
},changeConfig: function(){
this.setData({
isSandBox: !this.data.isSandBox
}, ()=>{
wx.setStorage({
key: "isSandBox",
data: this.data.isSandBox
});
})}});

相关文档:

注册环信:https://console.easemob.com/user/register

集成文档:https://docs-im-beta.easemob.com/document/ios/quickstart.html

社区支持:https://www.imgeek.net/

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

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

相关文章

自定义列表里面实现多选功能

需求 我们在开发过程中有时候会遇到列表里面会有多选&#xff0c;然后列表样式也要进行自定义。这里我们如果直接使用ElementUI组件el-table表格的时候这里实现起来可能比较复杂不方便&#xff0c;我们这里手写自定义一下列表里面多选的功能。 实现效果如下图所示&#xff1a…

云渲染适合什么场景下使用?

云渲染作为影视动画主流的渲染方案&#xff0c;通常云渲染服务商拥有专属的渲染农场&#xff0c;通过渲染农场庞大的高新能数量机器&#xff0c;可协助你在短时间内完成渲染任务。 云渲染使用场景有哪些&#xff1f; 1、硬件限制&#xff1a; 如果你的个人或公司电脑硬件不足…

Java内存模型(JMM)是基于多线程的吗

Java内存模型&#xff08;JMM&#xff09;是基于多线程的吗 这个问题按我的思路转换了下&#xff0c;其实就是在问&#xff1a;为什么需要Java内存模型 总结起来可以由几个角度来看待「可见性」、「有序性」和「原子性」 面试官&#xff1a;今天想跟你聊聊Java内存模型&#…

重新认识一下 vue3 应用实例

重新认识一下 vue 应用实例 &#x1f495; 创建应用实例 每个 Vue 应用都是通过 createApp 函数创建一个新的 应用实例 应用实例必须在调用了 .mount() 方法后才会渲染出来。该方法接收一个“容器”参数&#xff0c;可以是一个实际的 DOM 元素或是一个 CSS 选择器字符串 //…

【bug】【VSCode】远程终端TERMINAL打不开

【bug】【VSCode】远程终端TERMINAL打不开 可能的原因现象分析解决 可能的原因 昨天晚上vscode在打开多个TERMINAL的情况下&#xff0c;挂了一晚上&#xff0c;今早上来看的时候全都lost connections…。然后关闭再打开就出现了如上现象。 早上一来到实验室就要debug… 现象…

【UE Niagara学习笔记】03 - 火焰喷射效果

目录 效果 步骤 一、创建粒子系统 二、制作火焰动画 三、改为GPU粒子 四、循环播放粒子动画 五、火焰喷射效果雏形 六、火焰颜色 效果 步骤 一、创建粒子系统 1. 新建一个Niagara系统&#xff0c;选择模板 命名为“NS_Flame_Thrower”&#xff08;火焰喷射&#…

IntelliJ IDEA 如何编译 Maven 工程项目

在当今的Java开发领域&#xff0c;Maven已经成为项目构建和依赖管理的标准工具。IntelliJ IDEA作为一款集成度高的Java开发环境&#xff0c;提供了许多强大的功能来简化和优化Maven项目的构建流程。本文将深入介绍如何使用IntelliJ IDEA编译Maven工程的详细步骤以及一些高级技巧…

day6:进程间的通信

思维导图&#xff1a; 实现多个进程之间的收发信息操作 create.c&#xff1a; #include <head.h> int main(int argc, const char *argv[]) {if(mkfifo("a_send_b",0664)!0){perror("");return -1;}if(mkfifo("b_send_a",0664)!0){perro…

用Java编写图书网站信息采集程序教程

目录 一、准备工作 二、分析目标网站结构 三、选择信息采集方式 四、安装Jsoup库 五、编写信息采集程序 六、注意事项 总结&#xff1a; 编写图书网站信息采集程序需要掌握HTML、CSS、JavaScript、Java等前端和后端技术。下面是一个简单的教程&#xff0c;介绍如何使用…

Java后端开发——SSM整合实验

文章目录 Java后端开发——SSM整合实验一、常用方式整合SSM框架二、纯注解方式整合SSM框架 Java后端开发——SSM整合实验 一、常用方式整合SSM框架 1.搭建数据库环境&#xff1a;MySQL数据库中创建一个名称为ssm的数据库&#xff0c;在该数据库中创建一个名称为tb_book的表 …

Spring MVC(day1)

什么是MVC MVC是一种设计模式&#xff0c;将软件按照模型、视图、控制器来划分&#xff1a; M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为数据承载Bean&#xff1a;专门存储业务数据…

代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com) 总结 332.重新安排行程 欧拉通路和欧拉回路&#xff1a; 欧拉通路&#xff1a;对于图G来说&#xff0c;如果存在一条通路包含G的所有边&#xff0c;则该通路称为欧拉通路&#xff0c;也称欧拉路径。欧拉回路&#xff1a;如果欧拉路径是一条…

06-微服务-SpringAMQP

SpringAMQP SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交…

Scrum的工件

我们采用了Scrum进行开发方面的管理&#xff0c;那么所有的计划和工作都应该是透明的&#xff0c;这给了我们检查这些东西的机会&#xff0c;以便能够即时做出调整来适应即将发生的变化。 那么Scrum为我们设计了一些工件帮助我们检查我们的工作和计划&#xff0c;每个工件都有…

QT qss文件设置样式

方式一 &#xff08;单个&#xff09; 方式二 &#xff08;全局&#xff09; 所有按钮都会采用这个样式。 方式三 &#xff08;qss文件&#xff09; 创建资源文件 创建qss文件&#xff08;Button.qss&#xff09; 引用qss文件 QApplication a(argc, argv);QString qss;QFile…

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好&#xff0c;我是独孤风。元数据管理平台层出不穷&#xff0c;但目前主流的还是Atlas、Datahub、Openmetadata三家&#xff0c;那么我们该如何选择呢&#xff1f; 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台&#xff0c;先要从架构说起。 正文共&am…

k8s的pod基础

pod概念 pod是k8s中最小的资源管理组件。 pod也是最小化运行容器化的应用的资源管理对象。 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。在一个pod当中同时运行多个容器&#xff0c;在一个pod当中…

阿里云服务器ECS入门与基础运维

一、云服务器简介 1、服务器&#xff1a; (1) 概念&#xff1a; 服务器本身就是一种电脑&#xff0c;同样具备CPU、内存、硬盘、网卡、电源等硬件。 互联网对外提供网站、游戏、在线会议、网盘等服务&#xff0c;都需要将这些互联网服务部署到服务器中。 (2) 特点&#xf…

通过盲对抗性扰动实时击败基于DNN的流量分析系统

文章信息 论文题目&#xff1a;Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊&#xff08;会议&#xff09;&#xff1a;30th USENIX Security Symposium 时间&#xff1a;2021 级别&#xff1a;CCF A 文章链接&…

校招社招,认知能力测验,③如何破解语言常识类测试题?

作为认知能力测评中的一个环节&#xff0c;语言常识类&#xff0c;是大概率的出现&#xff0c;不同的用人单位可能略有不同&#xff0c;语言是一切的基础&#xff0c;而常识则意味着我们的知识面的宽度。 语言常识类的测试&#xff0c;如果要说技巧&#xff1f;难说....更多的…