短信登录获取图形验证码调用过程

文章目录

  • 短信登录获取图形验证码调用过程
      • 1、输入某个要获取短信验证的电话

短信登录获取图形验证码调用过程

1、输入某个要获取短信验证的电话

在这里插入图片描述

调用到skin皮肤里面的sms_login里面的xml的按钮控件:

在这里插入图片描述

这个按钮属于点击信息在Notify里面收到:

void CSMSLoginDlg::Notify(TNotifyUI& msg)
{
	if (_tcsicmp(msg.sType, _T("windowinit")) == 0)
	{
		this->OnPrepare(msg);
	}else if(_tcsicmp(msg.sType,_T("click")) == 0){
		if (msg.pSender == this->m_pBtnVerifyCode)
		{
			this->onBtnGetVerifyCode();
		}else if(msg.pSender == this->m_pBtnLogin)
		{
			this->OnBtnOk();
		}
		else if(NULL != m_pOptSaveLoginState && msg.pSender->GetName() == m_pOptSaveLoginState->GetRelatedBtnName())
		{
			m_pOptSaveLoginState->Selected(!m_pOptSaveLoginState->IsSelected());
		}
		else
		{
		}
	}
}

随机跳转到:onBtnGetVerifyCode接口:

void CSMSLoginDlg::onBtnGetVerifyCode()
{
	if (this->m_pEditMobile == NULL)
	{
		return ;
	}

	m_pEditCode->SetEnabled(true);

	//简单的手机号码验证
	if(this->m_pEditMobile->GetText().GetLength() == 0){
		this->ShowUserPrompt(-105240030,_T("请输入手机号"));
		this->m_pEditMobile->SetFocus();
		return;
	}

	//验证手机号码是否为数字
	for(int i=0;i<m_pEditMobile->GetText().GetLength();++i){
		if(m_pEditMobile->GetText().GetData()[i] < '0' || m_pEditMobile->GetText().GetData()[i] > '9'){
			this->ShowUserPrompt(-105240030,_T("请输入数字手机号码"));
			this->m_pEditMobile->SetFocus();
			return;
		}
	}
	
	tstring strCellphoneNumber = this->m_pEditMobile->GetText();

	if (CAuthenManager::GetInstance()->AsyncSendSmsCheckCode(strCellphoneNumber.c_str(),this) == FALSE)
	{
		this->ShowUserPrompt(-105240030, _T("获取短信验证码失败,请您重试!"));
		return;
	}
	
}

在这个接口里面调用发送给服务器的异步接口CAuthenManager::GetInstance()->AsyncSendSmsCheckCode(strCellphoneNumber.c_str(),this)

//新增短信验证码验证函数
BOOL CAuthenManager::AsyncSendSmsCheckCode(const tstring& strCellPhoneNumber, void *pUserData){
	TRACET();

	if (m_pSdoBaseHandle == NULL)
	{
		TRACEE("AM -- a.s.sscc -- sbh is NULL!");
		return FALSE;
	}

	if (strCellPhoneNumber.empty())
	{
		TRACEW("AM -- a.s.sscc -- cpn is empty!");
		return FALSE;
	}

	CTimeRecorder::GetInstance()->RecordStartTime(CallInterface_SendSmsCheckCode, ::GetTickCount());
	m_nLastActionId = CallInterface_SendSmsCheckCode;

	SdoBase_SetUserData(m_pSdoBaseHandle, pUserData);

	string strCellPhoneNumberA = StringHelper::UnicodeToANSI(strCellPhoneNumber);
	std::string scene = "pc_sms";
	if(CSystemUtil::SystemIsLowwerAndEqualXP()){
		scene="xp_sms";
	}

	int nError = SdoBase_SendSms(m_pSdoBaseHandle, m_strSmsSessionKey.c_str(), strCellPhoneNumberA.c_str(), 4, scene.c_str());
	if (nError != 0)
	{
		TRACEW(_T("AM -- a.s.sb_ss -- Failed. Error[%d]"), nError);
	}

	return (nError == 0);
}

随即调用**SdoBase_SendSms(m_pSdoBaseHandle, m_strSmsSessionKey.c_str(), strCellPhoneNumberA.c_str(), 4, scene.c_str())**接口:

/**短信发送
/
typedef void (SDOAPI
SdoBase_SendSmsCallback)(int resultCode, const char *failReason, const char smsSessionKey, const char checkCodeUrl, int needCheckCode,int width,int height, SdoBaseHandle handle);
int SdoBase_SendSms(SdoBaseHandle
handle, const char *smsSessionKey, const char phone, int smsType,const char scene=NULL);
然后收到短信验证码发送的回调函数:

/设置获取短信验证码回调
static void SDOAPI onSendSmsCallback(int resultCode, const char *failReason, const char *smsSessionKey, const char checkCodeUrl, int needCheckCode,int width,int height, SdoBaseHandle handle);

void SDOAPI CAuthenManager::onSendSmsCallback(int resultCode, const char *failReason, const char *smsSessionKey, const char *checkCodeUrl, int needCheckCode,int width,int height, SdoBaseHandle* handle)
{
	TRACET();
	SGetSmsCodeResult res;
	res.resultCode = resultCode;
	res.failReason = StringHelper::ANSIToUnicode(failReason);
	res.needCheckCode = needCheckCode;
	res.checkCodeUrl = checkCodeUrl;
	res.width=width;
	res.height=height;

	m_strSmsSessionKey = smsSessionKey;//保存短信登录session

	sm_pAuthenManager->NotifyLoginWnd(WM_LOGIN_GETSMSCODE_RESULT,&res,0);

}

这个时候就调用sm_pAuthenManager->NotifyLoginWnd(WM_LOGIN_GETSMSCODE_RESULT,&res,0);会向登录器发生一个WM_LOGIN_GETSMSCODE_RESULT这个消息。

void CAuthenManager::NotifyLoginWnd(int nNotifyType, void* result, void* ud)
{
	TRACET();

	// 全部采用PostMessage 防止阻塞认证组件中的线程
	// 动态分配的内存 在相关窗口收到相应消息后再释放

	switch(nNotifyType)
	{
	case WM_LOGIN_GET_DYNAMICKEY:
		{
			SGetDynamicKeyResult *pResult = new SGetDynamicKeyResult(*(SGetDynamicKeyResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GET_DYNAMICKEY, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_AUTHEN_RESULT:
		{
			SAuthenResult *pResult = new SAuthenResult(*(SAuthenResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_AUTHEN_RESULT, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_AUTHEN_CONTINUE:	
		{
			SAuthenContinue *pResult = new SAuthenContinue(*(SAuthenContinue*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_AUTHEN_CONTINUE, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_CHECKCODE_LOGIN_CONTINUE:
		{
			SCheckCodeLoginContinue *pResult = new SCheckCodeLoginContinue(*(SCheckCodeLoginContinue*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_CHECKCODE_LOGIN_CONTINUE, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_MOBILE_GETMOBILEVALIDATECODE_RESULT:
		{
			SGetMobileValidateCodeResult *pResult = new SGetMobileValidateCodeResult(*(SGetMobileValidateCodeResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_MOBILE_GETMOBILEVALIDATECODE_RESULT, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_CHECK_ACCOUNT_TYPE: 
		{
			SAccountTypeCheckingResult *pResult = new SAccountTypeCheckingResult(*(SAccountTypeCheckingResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_CHECK_ACCOUNT_TYPE, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_UPDATE_FCM_INFO:
		{
			SUpdateFcmInfoResult *pResult = NULL;
			if (result != NULL)
			{
				pResult = new SUpdateFcmInfoResult(*(SUpdateFcmInfoResult*)result);
			}

			::PostMessage(this->m_hWnd, WM_LOGIN_UPDATE_FCM_INFO, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GETCODEKEY_RESULT:
		{
			SGetCodeKeyResult *pResult = new SGetCodeKeyResult(*(SGetCodeKeyResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GETCODEKEY_RESULT, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GETPUSHMESSAGE_RESULT:
		{
			SSendPushMessageResult *pResult = new SSendPushMessageResult(*(SSendPushMessageResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GETPUSHMESSAGE_RESULT, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GET_ACCOUNT_INFO:
		{
			SGetAccountInfoResult *pResult = new SGetAccountInfoResult(*(SGetAccountInfoResult*)result);
			::PostMessage(m_notifyHwnd, WM_LOGIN_GET_ACCOUNT_INFO, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GET_LOGIN_HISTORY:
		{
			SGetLoginHistoryResult *pResult = new SGetLoginHistoryResult(*(SGetLoginHistoryResult*)result);
			::PostMessage(m_notifyHwnd, WM_LOGIN_GET_LOGIN_HISTORY, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GET_PUSHMESSAGE_STATUS:
		{
			SGetPushMessageStatusResult *pResult = new SGetPushMessageStatusResult(*(SGetPushMessageStatusResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GET_PUSHMESSAGE_STATUS, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_GET_CLIENT_VKEY:
		{
			SGetClientVKeyResult *pResult = new SGetClientVKeyResult(*(SGetClientVKeyResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GET_CLIENT_VKEY, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_SEND_USER_ACCOUNT:
		{
			SSendUserAccountResult *pResult = new SSendUserAccountResult(*(SSendUserAccountResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_SEND_USER_ACCOUNT, WPARAM(pResult), 0);
		}
		break;

	case WM_LOGIN_CANCEL_SEND_PUSHMESSAGE:
		{
			::PostMessage(this->m_hWnd, WM_LOGIN_CANCEL_SEND_PUSHMESSAGE, 0, 0);
		}
		break;

	case WM_LOGIN_SEND_MIGU_SMS:
		{
			SNormalCommonResult *pResult = new SNormalCommonResult(*(SNormalCommonResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_SEND_MIGU_SMS, WPARAM(pResult), 0);
		}
		break;
	case WM_LOGIN_GETSMSCODE_RESULT:
		{
			SGetSmsCodeResult *pResult = new SGetSmsCodeResult(*(SGetSmsCodeResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GETSMSCODE_RESULT, WPARAM(pResult), 0);
		}
		break;
	case WM_LOGIN_GETSMSCODEWITHCAPTCHA_RESULT:
		{
			SGetSmsCodeResult *pResult = new SGetSmsCodeResult(*(SGetSmsCodeResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GETSMSCODEWITHCAPTCHA_RESULT, WPARAM(pResult), 0);
		}
		break;
	case WM_APPMSG_REFRESHQRCODE_NOTIFY:
		{
			FaceVerifyInitResult *pResult = new FaceVerifyInitResult(*(FaceVerifyInitResult*)result);
			::PostMessage(this->m_notifyHwnd, WM_APPMSG_REFRESHQRCODE_NOTIFY, WPARAM(pResult), 0);
		}break;
	case WM_APPMSG_FACECODERESULT_NOTIFY:
		{
			FaceCodeResult *pResult = new FaceCodeResult(*(FaceCodeResult*)result);
			::PostMessage(this->m_notifyHwnd, WM_APPMSG_FACECODERESULT_NOTIFY, WPARAM(pResult), 0);
		}break;
	default:
		break;
	}
}

根据消息id找到对应实现逻辑:

	case WM_LOGIN_GETSMSCODE_RESULT:
		{
			SGetSmsCodeResult *pResult = new SGetSmsCodeResult(*(SGetSmsCodeResult*)result);
			::PostMessage(this->m_hWnd, WM_LOGIN_GETSMSCODE_RESULT, WPARAM(pResult), 0);
		}
		break;

再次向窗口发送消息id为WM_LOGIN_GETSMSCODE_RESULT发送消息:随即在SMSLoginDlg短信登录界面收到这个消息id:

LRESULT CSMSLoginDlg::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	bHandled = FALSE;
	LRESULT lResult = 0;
	switch( uMsg )
	{
	case WM_TIMER:
		lResult = OnTimer(uMsg, wParam, lParam, bHandled);
		break;
	case WM_LOGIN_GET_DYNAMICKEY:
		{
			SGetDynamicKeyResult *pGetDynamicKeyResult = (SGetDynamicKeyResult*)wParam;
			this->OnGetDynamicKeyResult(pGetDynamicKeyResult);

			SAFE_DELETE(pGetDynamicKeyResult);
		}
		break;
	case WM_LOGIN_GETSMSCODE_RESULT:
		{
			SGetSmsCodeResult *pSGetSmsCodeResult = (SGetSmsCodeResult*)wParam;
			if(pSGetSmsCodeResult->resultCode != 0){
				this->ShowUserPrompt(-105240030,pSGetSmsCodeResult->failReason);
				//this->m_pEditCode->SetFocus();
				return 0;
			}
			this->OnSGetSmsCodeResult(pSGetSmsCodeResult);

			SAFE_DELETE(pSGetSmsCodeResult);
		}break;
	case WM_LOGIN_GETSMSCODEWITHCAPTCHA_RESULT:
		{
			SGetSmsCodeResult *pSGetSmsCodeResult = (SGetSmsCodeResult*)wParam;
			if(pSGetSmsCodeResult->resultCode != 0){
				this->ShowUserPrompt(pSGetSmsCodeResult->resultCode,pSGetSmsCodeResult->failReason);
				return 0;
			}

			this->OnSGetSmsCodeResult(pSGetSmsCodeResult);

			SAFE_DELETE(pSGetSmsCodeResult);
		}
		break;
	case WM_LOGIN_GETSMSCODEWITHCAPTCHA_SUCCESS:
		{
			this->m_pEditCode->SetFocus();
			//倒计时
			m_nRemainTime = 60;
			this->m_pBtnVerifyCode->SetVisible(false);
			this->m_pLabelTimer->SetVisible(true);

			TCHAR szText[10]={0};
			swprintf_s(szText,_countof(szText),_T("%ds"),m_nRemainTime);
			this->m_pLabelTimer->SetText(szText);
			::SetTimer(m_pParentWindow->GetHWND(),IDT_REMAIN,1000,NULL);

			//当弹出图形验证码时,改变了登录窗口句柄,重新还原
			CAuthenManager::GetInstance()->SetLoginWndHandle(m_pParentWindow->GetHWND());
		}
		break;
	case WM_LOGIN_AUTHEN_CONTINUE:
		{
			SAuthenContinue* pSdoaAuthenContinue = (SAuthenContinue*)wParam;
			this->OnAuthenContinue(pSdoaAuthenContinue);

			SAFE_DELETE(pSdoaAuthenContinue);
		}
		break;
	case WM_LOGIN_AUTHEN_RESULT:
		{
			SAuthenResult* pSdoaAuthenResult = (SAuthenResult*)wParam;
			this->OnAuthenResult(pSdoaAuthenResult);

			SAFE_DELETE(pSdoaAuthenResult);
		}
		break;
	case WM_LOGIN_UPDATE_FCM_INFO:
		{
			SUpdateFcmInfoResult* pSUpdateFcmInfoResult = (SUpdateFcmInfoResult*)wParam;
			if(pSUpdateFcmInfoResult != NULL){
				this->m_bIsNewWithFcm = pSUpdateFcmInfoResult->m_bIsNew;
			}
			this->m_bIsFcm=true;
			this->ShowFcmDlg(pSUpdateFcmInfoResult);
			SAFE_DELETE(pSUpdateFcmInfoResult);
		}
		break;
	default:
		bHandled = FALSE;
		break;
	}
	return lResult;
}

根据消息id找到实现逻辑:

	case WM_LOGIN_GETSMSCODE_RESULT:
		{
			SGetSmsCodeResult *pSGetSmsCodeResult = (SGetSmsCodeResult*)wParam;
			if(pSGetSmsCodeResult->resultCode != 0){
				this->ShowUserPrompt(-105240030,pSGetSmsCodeResult->failReason);
				//this->m_pEditCode->SetFocus();
				return 0;
			}
			this->OnSGetSmsCodeResult(pSGetSmsCodeResult);

			SAFE_DELETE(pSGetSmsCodeResult);
		}
		break;

随后调用**this->OnSGetSmsCodeResult(pSGetSmsCodeResult);**接口:

void CSMSLoginDlg::OnSGetSmsCodeResult(SGetSmsCodeResult* pOnSGetSmsCodeResult)
{
	if(pOnSGetSmsCodeResult->needCheckCode == 0){
		::PostMessage(m_pParentWindow->GetHWND(),WM_LOGIN_GETSMSCODEWITHCAPTCHA_SUCCESS,0,0);
		return;
	}
	CAuthenManager::GetInstance()->SetLoginWndHandle(m_pParentWindow->GetHWND());
	SCheckCodeLoginContinue checkCodeLoginContinue;
	checkCodeLoginContinue.strCheckCodeUrl=pOnSGetSmsCodeResult->checkCodeUrl;
	checkCodeLoginContinue.needCheckCode=pOnSGetSmsCodeResult->needCheckCode;
	checkCodeLoginContinue.height=pOnSGetSmsCodeResult->height;
	checkCodeLoginContinue.width=pOnSGetSmsCodeResult->width;
	checkCodeLoginContinue.type=2;
	checkCodeLoginContinue.pUserData=this;
	int ret = this->OnCheckCodeLoginContinue(&checkCodeLoginContinue);//验证码
	if(ret != DialogResult::OK){
		//当弹出图形验证码时,改变了登录窗口句柄,重新还原
		CAuthenManager::GetInstance()->SetLoginWndHandle(m_pParentWindow->GetHWND());
		return;
	}

}

然后调用在LoginCommon.h种调用**this->OnCheckCodeLoginContinue(&checkCodeLoginContinue);**接口:

	int OnCheckCodeLoginContinue(SCheckCodeLoginContinue* pSdoaCheckCodeLoginContinue)
	{
		if(pSdoaCheckCodeLoginContinue->pUserData != this) return -1;
		if(pSdoaCheckCodeLoginContinue->needCheckCode == 4) return this->ShowGeetestCodeDlg(pSdoaCheckCodeLoginContinue);
		else if(pSdoaCheckCodeLoginContinue->needCheckCode == 1){
			if(pSdoaCheckCodeLoginContinue->type == 1)
				return this->ShowProtectCodeDlg(pSdoaCheckCodeLoginContinue);
			else if(pSdoaCheckCodeLoginContinue->type == 2)
				return this->ShowCaptchaCodeDlg(pSdoaCheckCodeLoginContinue);
		}
	}

根据type为2调用return this->ShowCaptchaCodeDlg(pSdoaCheckCodeLoginContinue);

	int ShowCaptchaCodeDlg(SCheckCodeLoginContinue* pSdoaCheckCodeLoginContinue)
	{
		::EnableWindow(m_pParentWindow->GetHWND(),false);
		CCaptchaDlg::SetOwner(this);
		int ret = CCaptchaDlg::Show(m_pParentWindow, pSdoaCheckCodeLoginContinue);
		::EnableWindow(m_pParentWindow->GetHWND(),true);
		this->OnModalDone(ret);
		return ret;
	}

最后调用CCaptchaDlg::Show(m_pParentWindow, pSdoaCheckCodeLoginContinue);接口

int CCaptchaDlg::Show(CWindowWnd* pParent, SCheckCodeLoginContinue* pSdoaCheckCodeLoginContinue)
{
	TRACET();
	CCaptchaDlg *pDlg = new CCaptchaDlg(pSdoaCheckCodeLoginContinue,pParent);

	if (pDlg == NULL)
	{
		return DialogResult::Cancel;
	}
	
	pDlg->Create(pParent->GetHWND());

	if (CConfigManager::GetInstance()->GetClientInfoValue(_T("ToolWindow")) == _T("True"))
	{
		pDlg->CenterWindow();
	}
	else
	{
		pDlg->CenterWindow();
	}

	CAuthenManager::GetInstance()->SetLoginWndHandle(pDlg->GetHWND());

	pDlg->ShowModal();

	int ret = pDlg->m_nResult;
	delete pDlg;
	pDlg=NULL;
	return ret;
}

这样图形验证码框就显示出来了。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

自动化测试,5个技巧轻松搞定

想要在质量保证团队中赢得核心&#xff1f;当你组建你的网络应用时要记住这些技巧&#xff0c;可以变得更容易分析并快速创建更多准确可重复的自动化测试。 1.歧义是敌人 尽可能使你的代码具体化。当然&#xff0c;你已经遵循了W3C标准&#xff0c;对吗&#xff1f;以下有三件…

EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(二):EtherCAT总线初始化

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡&#xff0c;可选6-64轴运动控制&#xff0c;支持多路高速数字输入输出&#xff0c;可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能&#xff0c;结合MotionRT7运动…

Isight 2023 新功能介绍

​​Isight是一个仿真分析流程自动化和多学科多目标优化工具&#xff0c;它提供了一个可视化的灵活的仿真流程搭建平台&#xff0c;同时提供与多种主流CAE分析工具的专用接口&#xff0c;利用此工具&#xff0c;用户可以方便的以拖拽的方式可视化的快速建立复杂的仿真分析流程&…

达芬奇DaVinci Resolve Studio 18.6.3 for Mac

DaVinci Resolve Studio 18是一款专业的视频编辑和调色软件&#xff0c;适用于电影、电视节目、广告等各种视觉媒体的制作。它具有完整的后期制作功能&#xff0c;包括剪辑、调色、特效、音频处理等。 以下是DaVinci Resolve Studio 18的主要特点&#xff1a; - 提供了全面的视…

一、认识STM32

目录 一、初识STM32 1.1 STM32的命名规则介绍 1.2 STM32F103ZET6资源配置介绍 二、如何识别芯片管脚 2.1 如何寻找 IO 的功能说明 三、构成最小系统的要素 一、初识STM32 1.1 STM32的命名规则介绍 以 STM32F103ZET6 来讲解下 STM32 的命名方法&#xff1a; &…

SpringBoot 2.x 实战仿B站高性能后端项目

SpringBoot 2.x 实战仿B站高性能后端项目 下栽の地止&#xff1a;请看文章末尾 通常SpringBoot新建项目&#xff0c;默认是集成了Maven&#xff0c;然后所有内容都在一个主模块中。 如果项目架构稍微复杂一点&#xff0c;就需要用到Maven多模块。 本文简单概述一下&#xff0c…

无线振动温度传感器设备的振动监测故障诊断

近年来&#xff0c;随着工业领域技术水平的不断提高&#xff0c;工业设备的管理水平也必须紧随其后&#xff0c;既要保证设备的正常运转&#xff0c;同时也要做好日常的保养维护工作。旋转类设备是一种较为常见的工业设备&#xff0c;随着无线振动温度传感器设备的引入&#xf…

百家网约车平台发布“阳光五条” 多举措加强司机保障

11月17日&#xff0c;免佣联盟百家网约车平台发布“阳光五条”&#xff0c;通过加大免佣力度、实行车费保镖司机版、72小时保护期等措施&#xff0c;加强对网约车司机的权益保障。 近年&#xff0c;交通运输部推动交通运输新业态平台企业落实“阳光行动”等工作&#xff0c;加…

MyCat基础入门

1. MyCat安装 去官网下载安装包&#xff1a; 下载路径&#xff1a; 官方网站&#xff1a;http://www.mycat.org.cn/ github地址https://github.com/MyCATApache 上传到服务器上并解压&#xff1a; 它解压后是一个叫mycat的文件夹 去maycat的bin目录下&#xff0c;执行命令 ./my…

修完这个 Bug 后,MySQL 性能提升了 300%

最近 MySQL 官方在 8.0.35 上修复了一个 bug&#xff1a; 这个 bug 是由 Mark Callaghan 发现的。Mark 早年在 Google MySQL 团队&#xff0c;后来去了 Meta MySQL&#xff0c;也主导了 RocksDB 的开发。 Mark 在 #109595 的 bug report 给出了非常详细的复现步骤 在官方修复后…

电源模块输出过冲如何产生?测试标准及其测试方法是什么?

输出电压过冲是一个常见的电路问题&#xff0c;它是指在电路中的电压超过了规定的范围&#xff0c;严重的话会造成系统不稳定&#xff0c;导致元器件、负载以及设备损坏。那么造成输出电压过冲的原因有哪些呢&#xff1f;电源自动测试系统要怎么测试输出过冲? 输出电压过冲产生…

基于SpringBoot、Vue的电影院管理系统

一、管理端 1.登陆界面 2.影院管理界面 3.电影信息管理页 4.订单信息管理页 二、 用户 1.登录页 2.首页 3.个人中心 4.监控大屏&#xff08;此功能可单加&#xff09; 需要的同学可以私我v哟 jg低廉 包调试安装

人体状态检测YOLOV8 NANO

人体状态检测Y8N&#xff0c;能检测站立、奔跑、跌倒、坐下、蹲下五种状态&#xff0c;采用YOLOV8NANO训练&#xff0c;转换成ONNX&#xff0c;OPENCV DNN调用&#xff0c;支持C/PYTHON/ANDROID开发 人体状态检测Y8N

Visual Components数字化工厂虚拟仿真软件 衡祖仿真

数字孪生、人工智能、工业互联网、边缘计算这些概念在整个产业里非常的火热&#xff0c;但是&#xff0c;如果这些概念没有“模型”作为基础的话&#xff0c;那么这些概念都只能是空中楼阁无法落地。而仿真技术是利用这些模型在计算机中构建一比一的真实场景&#xff0c;使得在…

MessageSourceUtil读取资源文件

在处理返回值提示的时候&#xff0c;需要根据local返回中文或者英文&#xff0c;因此要使用到国际化内容 操作 1&#xff0c;新建资源文件 在src/main/resources源文件夹下创建一个i18n的子目录&#xff0c; 然后创建中文和英文对应properties文件&#xff0c;然后输入自己的…

Hive Lateral View explode列为空时导致数据异常丢失

一、问题描述 日常工作中我们经常会遇到一些非结构化数据&#xff0c;因此常常会将Lateral View 结合explode使用&#xff0c;达到将非结构化数据转化成结构化数据的目的&#xff0c;但是该方法对应explode的内容是有非null限制的&#xff0c;否则就有可能造成数据缺失。 SE…

【机器学习10】循环神经网络

1循环神经网络 RNN通过将神经元串行起来处理序列化的数据。 由于每个神经元能用它的内部变量保存之前输入的序列信息&#xff0c;因此整个序列被浓缩成抽象的表示&#xff0c; 并可以据此进行分类或生成新的序列。 2 循环神经网络的梯度消失或梯度爆炸问题 传统的循环神经网…

websocket学习

写在前面 新公司用到了websocket技术&#xff0c;所以这里学习下。 1&#xff1a;Java原生 1.1&#xff1a;maven <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.3</ver…

代码随想录算法训练营第五十七天丨 动态规划part17

647. 回文子串 思路 动态规划 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 如果大家做了很多这种子序列相关的题目&#xff0c;在定义dp数组的时候 很自然就会想题目求什么&#xff0c;我们就如何定义dp数组。 绝大多数题目确实是…

【java学习—十五】经典例题:生产者/消费者问题(7)

文章目录 1. 题目2. 答案 1. 题目 生产者 (Productor) 将产品交给店员 (Clerk) &#xff0c;而消费者 (Customer)从店员处取走产品&#xff0c;店员一次只能持有固定数量的产品 ( 比如 4 &#xff09;&#xff0c;如果生产者试图生产更多的产品&#xff0c;店员会叫生产者停一下…