当前位置: 首页 > news >正文

快速登录界面关于如何登录以及多账号列表解析以及config配置文件是如何读取(1)

快速登录界面关于如何登录以及多账号列表解析以及config配置文件是如何读取

1、快速登录界面关于如何登录以及快速登录界面账号如何显示

在这里插入图片描述

如图所示:根据按下按钮一键登录中途会发生什么。

  • 关于一键登录按钮皮肤skin的设置:

     <Button name="QuickLoginOkBtn" text="{f 2}一键登录{/f}" float="true" pos="105,186,0,0" width="205" height="33" textcolor="#ff38220c" disabledtextcolor="#FFA7A6AA" showhtml="true" align="center" normalimage="common/login_n.png" hotimage="common/login_o.png" pushedimage="common/login_c.png" />
    

    在这里插入图片描述

  • 根据Button中的name名字来找相关Button实现逻辑:

在这里插入图片描述

  • 根据m_pBtnLogin就可以找实现逻辑:
void CSecureUnisignonDlg::Notify(TNotifyUI& msg)
{if(msg.sType == _T("click")){if(m_pBtnCancel == msg.pSender){this->OnClickBtnCancel();}else if(m_pBtnLogin == msg.pSender){this->OnClickBtnLogin();}}else if(msg.sType == _T("itemactivate")){CLoginedAccountListContainerElementUI* pElem = dynamic_cast<CLoginedAccountListContainerElementUI*>(msg.pSender);this->OnClickBtnLogin();}else if (_tcsicmp(msg.sType, _T("link")) == 0){}
}
  • 这段代码是一个 DuiLib(DirectUI Library)窗口类 CSecureUnisignonDlg 中的 Notify 函数。该函数用于处理窗口中的通知消息,根据不同的消息类型执行相应的操作。下面是对这段代码的解释:

    • 这段代码是一个 DuiLib(DirectUI Library)窗口类 CSecureUnisignonDlg 中的 Notify 函数。该函数用于处理窗口中的通知消息,根据不同的消息类型执行相应的操作。下面是对这段代码的解释:

      void CSecureUnisignonDlg::Notify(TNotifyUI& msg)
      {// 判断消息类型if(msg.sType == _T("click")){// 处理按钮点击事件if(m_pBtnCancel == msg.pSender){this->OnClickBtnCancel();}else if(m_pBtnLogin == msg.pSender){this->OnClickBtnLogin();}}else if(msg.sType == _T("itemactivate")){// 处理列表项激活事件CLoginedAccountListContainerElementUI* pElem = dynamic_cast<CLoginedAccountListContainerElementUI*>(msg.pSender);this->OnClickBtnLogin();}else if (_tcsicmp(msg.sType, _T("link")) == 0){// 处理链接点击事件// 暂时没有具体的处理代码}
      }

      解释:

      • Notify 函数是 DuiLib 中的消息通知函数,用于处理窗口中各种控件的事件。
      • 通过检查 msg.sType 的值,可以确定收到的是哪种类型的消息。
      • 如果消息类型是 “click”,则表示按钮被点击。根据发送者的身份(msg.pSender),分别调用 OnClickBtnCancelOnClickBtnLogin 函数,以执行相应的操作。
      • 如果消息类型是 “itemactivate”,则表示列表项被激活。通过 dynamic_castmsg.pSender 转换为列表项类型,然后调用 OnClickBtnLogin 函数,执行相应的操作。
      • 如果消息类型是 “link”,则表示链接被点击。目前该部分代码中没有具体的处理逻辑,您可以根据需要添加相应的处理代码。
    • 这段代码主要用于处理窗口中按钮点击、列表项激活和链接点击等事件。根据实际需求,您可以在对应的事件处理函数中添加具体的业务逻辑。

  • 然后按钮点击事件的话找到相应后续逻辑:

    在这里插入图片描述

BOOL CSecureUnisignonDlg::OnClickBtnLogin()
{// 打印跟踪信息TRACET();// 检查是否已选择协议if (!((ContainerDlg*)m_pParentWindow)->GetProtocolSelected()){// 如果未选择协议,显示用户提示this->ShowUserPrompt(-1, _T("请您详细阅读协议,并勾选同意!"));return FALSE;}// 检查账号列表是否为空if (NULL == m_pAccountListUI) return TRUE;// 如果账号列表为空,返回if (0 == m_pAccountListUI->GetCount()) return TRUE;// 设置登录按钮为焦点,并禁用if (NULL != m_pBtnLogin){m_pBtnLogin->SetFocus();m_pBtnLogin->SetEnabled(false);}// 更新应用程序信息CSDOLApp::GetInstance()->UpdateAppInfo();// 打印日志,输出账号列表项的数量TRACEI("[!SL-SUD-OCBL!] Count = %u\n", m_pAccountListUI->GetCount());// 检查区域选择if (this->CheckAreaSelected() == false){return FALSE;}// 异步获取动态密钥CAuthenManager::GetInstance()->AsyncGetDynamicKey(this);return TRUE;
}
  • 这是一个在 CSecureUnisignonDlg 类中定义的 OnClickBtnLogin 函数。以下是对该函数的主要步骤的解释:

    • 函数首先打印跟踪信息,这有助于调试和追踪程序执行流程。
    • 检查是否已选择协议,如果没有选择,则显示用户提示信息,并返回 FALSE
    • 检查账号列表是否为空,如果为空,则返回 TRUE
    • 设置登录按钮为焦点,并禁用按钮,防止重复点击。
    • 更新应用程序信息,可能是某些全局数据的初始化。
    • 打印日志,输出账号列表项的数量。
    • 检查区域选择,如果检查失败,则返回 FALSE
    • 最后,通过 CAuthenManager 异步获取动态密钥,该过程可能包含网络请求等异步操作。
  • 总体而言,该函数执行了一系列的前提条件检查,更新了一些状态,禁用了按钮,然后触发了异步操作。具体操作会根据函数中调用的其他方法和类的实现而有所不同。

  • 根据**CAuthenManager::GetInstance()->AsyncGetDynamicKey(this);**触发异步操作获取动态密钥后续实现逻辑:

    BOOL CAuthenManager::AsyncGetDynamicKey(void *pUserData)
    {// 打印跟踪信息TRACET();// 检查 SdoBase 句柄是否为空if (m_pSdoBaseHandle == NULL){TRACEE("AM - ag.dk - sbh is NULL!");return FALSE;}// 记录开始时间CTimeRecorder::GetInstance()->RecordStartTime(CallInterface_GetDynamicKey, ::GetTickCount());m_nLastActionId = CallInterface_GetDynamicKey;int nError = 0;int nRetryTimes = 3;// 循环重试获取动态密钥while (nRetryTimes-- != 0){TRACED("%d", nRetryTimes);// 设置用户数据SdoBase_SetUserData(m_pSdoBaseHandle, pUserData);// 调用 SdoBase_GetDynamicKey 获取动态密钥nError = SdoBase_GetDynamicKey(m_pSdoBaseHandle);// 如果返回错误为 ERROR_PROCESSING,则取消请求并等待一段时间后重试if (nError == ERROR_PROCESSING){AsyncCancelRequests(pUserData);Sleep(300);continue;}// 如果没有错误,跳出循环break;}// 返回操作是否成功return (nError == 0);
    }
    • 解释:

      • 函数首先打印跟踪信息,这有助于调试和追踪程序执行流程。
      • 检查 SdoBase 句柄是否为空,如果为空,则返回 FALSE
      • 记录开始时间,这可能用于计算异步操作的执行时间。
      • 初始化错误码和重试次数。
      • 进行重试循环,最多重试 3 次。
      • 在每次循环中,设置用户数据,并调用 SdoBase_GetDynamicKey 获取动态密钥。
      • 如果返回错误为 ERROR_PROCESSING,则取消异步请求并等待 300 毫秒后继续下一次循环。
      • 如果没有错误,跳出循环。
      • 最后,返回操作是否成功,即检查最终的错误码是否为 0。
    • 该函数的主要目的是通过 SdoBase_GetDynamicKey 异步获取动态密钥,具体的异步操作可能涉及到网络请求等。循环重试部分是为了处理可能的错误情况。

    • 然后如果 SdoBase_GetDynamicKey 调用成功的话就会执行相应回调函数:

      • 在这里插入图片描述

      • void SDOAPI CAuthenManager::onGetDynamicKeyCallback(int nResultCode, const char* szFailReason, const char* szDynamicKey, const char* guid, SdoBaseHandle* handle)
        {// 打印跟踪信息TRACET();// 如果结果码不为 0,表示获取动态密钥失败if (nResultCode != 0){// 对特定范围的错误码进行映射if (nResultCode >= -10130200 && nResultCode <= -10130100){// 将认证组件中的错误码 [-10130200, -10130100] 映射到区间 [-10524200, -10524100]nResultCode = nResultCode - 394000;}// 如果失败原因不为空,打印警告信息if (szFailReason != NULL){TRACEW("AM -- o.g.dkcb --- %d --- %s", nResultCode, szFailReason);}}else{// 获取动态密钥成功,缓存动态密钥if (szDynamicKey != NULL){sm_pAuthenManager->m_strDynamicKey = StringHelper::ANSIToUnicode(szDynamicKey);}}// 记录最后一次时间差并上报sm_pAuthenManager->RecordLastTimeSpanAndReport(nResultCode);// 构造获取动态密钥结果对象SGetDynamicKeyResult result;result.m_nResult = nResultCode;result.m_strFailReason = StringHelper::ANSIToUnicode(szFailReason);result.m_strDynamicKey = (szDynamicKey != NULL) ? StringHelper::ANSIToUnicode(szDynamicKey) : _T("");result.m_pUserData = SdoBase_GetUserData(sm_pAuthenManager->m_pSdoBaseHandle);result.m_strguid = StringHelper::ANSIToUnicode(guid);// 通知登录窗口,发送 WM_LOGIN_GET_DYNAMICKEY 消息sm_pAuthenManager->NotifyLoginWnd(WM_LOGIN_GET_DYNAMICKEY, &result, 0);
        }
        • 解释:

          • 函数首先打印跟踪信息,这有助于调试和追踪程序执行流程。
          • 如果结果码不为 0,表示获取动态密钥失败,对特定范围的错误码进行映射。
          • 如果失败原因不为空,打印警告信息。
          • 如果结果码为 0,表示获取动态密钥成功,将动态密钥缓存在 CAuthenManager 类的成员变量中。
          • 调用 RecordLastTimeSpanAndReport 函数记录最后一次时间差并上报,可能用于性能统计。
          • 构造 SGetDynamicKeyResult 对象,存储获取动态密钥的结果和相关信息。
          • 通过 NotifyLoginWnd 函数通知登录窗口,发送 WM_LOGIN_GET_DYNAMICKEY 消息,传递获取动态密钥的结果。
        • 然后调用**sm_pAuthenManager->NotifyLoginWnd(WM_LOGIN_GET_DYNAMICKEY, &result, 0);**通知相关窗口获取动态密钥成功或者失败:

        • 在这里插入图片描述

          • 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;// ... 其他消息类型的处理default:break;}
            }
            • 这是 CAuthenManager 类中的 NotifyLoginWnd 函数,该函数用于通过 PostMessage 发送消息通知登录窗口(或其他窗口)。该函数根据传入的消息类型(nNotifyType)构造相应的消息结构体,并将消息通过 PostMessage 发送到窗口的消息队列中。以下是对该函数的主要步骤的解释:

              • 函数首先打印跟踪信息,这有助于调试和追踪程序执行流程。
              • 根据传入的消息类型(nNotifyType)使用 switch 语句进行分支处理,构造不同类型的消息结构体。
              • 对于每种消息类型,动态分配一个新的消息结构体对象,并通过 PostMessage 发送消息给窗口。WPARAM 参数用于传递指向消息结构体的指针。
              • 在动态分配的内存上述消息结构体被窗口收到相应消息后进行释放,因为它是通过 new 进行的动态分配。
            • 这样的设计允许在异步操作完成后以非阻塞的方式向窗口发送消息,实现了消息的异步通知和处理。不同的消息类型对应不同的消息结构体,以便在消息处理时能够根据消息类型获取相应的信息。

            • 然后根据对应的窗口收到的WM_LOGIN_GET_DYNAMICKEY消息:

            • 在这里插入图片描述

              • LRESULT CSecureUnisignonDlg::HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
                {// 打印跟踪信息TRACET();bHandled = FALSE;switch( uMsg ){// 根据不同的消息类型调用相应的处理函数case WM_LOGIN_GET_DYNAMICKEY:{// 转换消息参数为相应的结构体类型SGetDynamicKeyResult *pGetDynamicKeyResult = (SGetDynamicKeyResult*)wParam;// 调用处理函数处理获取动态密钥的结果this->OnGetDynamicKeyResult(pGetDynamicKeyResult);// 释放动态分配的结构体内存SAFE_DELETE(pGetDynamicKeyResult);}break;case WM_LOGIN_AUTHEN_RESULT:{SAuthenResult *pSdoMobileAuthenResult = (SAuthenResult*)wParam;this->OnAuthenResult(pSdoMobileAuthenResult);SAFE_DELETE(pSdoMobileAuthenResult);}break;case WM_LOGIN_AUTHEN_CONTINUE:{SAuthenContinue* pSdoaAuthenContinue = (SAuthenContinue*)wParam;this->OnAuthenContinue(pSdoaAuthenContinue);SAFE_DELETE(pSdoaAuthenContinue);}break;case WM_LOGIN_UPDATE_FCM_INFO:{SUpdateFcmInfoResult* pSUpdateFcmInfoResult = (SUpdateFcmInfoResult*)wParam;this->ShowFcmDlg(pSUpdateFcmInfoResult);SAFE_DELETE(pSUpdateFcmInfoResult);}break;default:// 如果是其他消息类型,则标记为未处理bHandled = FALSE;}return 0;
                }
                • 这是 CSecureUnisignonDlg 类中的 HandleCustomMessage 函数,用于处理自定义的窗口消息。根据收到的消息类型(uMsg),该函数调用相应的处理函数,然后标记消息已经被处理。以下是对该函数的主要步骤的解释:

                  • 函数首先打印跟踪信息,这有助于调试和追踪程序执行流程。
                  • 使用 switch 语句根据消息类型(uMsg)进行分支处理。
                  • 对于每个消息类型,转换消息参数为相应的结构体类型。
                  • 调用相应的处理函数(例如 OnGetDynamicKeyResultOnAuthenResult 等)来处理消息。
                  • 释放动态分配的结构体内存,以避免内存泄漏。
                  • 标记消息已经被处理,以防止消息传递到默认的消息处理函数中。
                • 这样的设计允许在窗口收到自定义消息时执行特定的操作,根据消息类型调用相应的处理函数,以实现定制的消息处理逻辑。

                • 然后调用**this->OnGetDynamicKeyResult(pGetDynamicKeyResult);**把获取动态密钥的结果传入接口:

                  • 在这里插入图片描述

                  • void CSecureUnisignonDlg::OnGetDynamicKeyResult(SGetDynamicKeyResult *pGetDynamicKeyResult)
                    {// 检查用户数据,确保与当前窗口关联if (pGetDynamicKeyResult->m_pUserData != this){return;}// 如果获取动态密钥失败if (pGetDynamicKeyResult->m_nResult != 0){// 打印警告信息TRACEW("Get dk failed!");// 启用登录按钮m_pBtnLogin->SetEnabled(true);// 显示用户提示信息this->ShowUserPrompt(pGetDynamicKeyResult->m_nResult, pGetDynamicKeyResult->m_strFailReason);return;}// 记录收集登录数据的开始时间CTimeRecorder::GetInstance()->RecordStartTime(CollectLoginData, ::GetTickCount());// 调用 OnSSOLogin 函数进行单点登录操作BOOL bLoginResult = OnSSOLogin();// 打印日志,输出登录结果TRACEI("[!SL-SUD-OCBL!] Result = %d\n", bLoginResult);// 如果登录结果为 FALSE,表示是异步操作if (!bLoginResult){// 启用登录按钮m_pBtnLogin->SetEnabled(true);// 发送自定义消息 WM_NOTIFY_SECUREUNISIGNON_RETURN 到父窗口::SendMessage(m_pParentWindow->GetHWND(), WM_NOTIFY_SECUREUNISIGNON_RETURN, 0, 0);}
                    }

相关文章:

快速登录界面关于如何登录以及多账号列表解析以及config配置文件是如何读取(1)

快速登录界面关于如何登录以及多账号列表解析以及config配置文件是如何读取 1、快速登录界面关于如何登录以及快速登录界面账号如何显示 如图所示:根据按下按钮一键登录中途会发生什么。 关于一键登录按钮皮肤skin的设置: <Button name"QuickLoginOkBtn" text&q…...

finebi 新手入门案例

finebi 新手入门案例 连锁超市销售数据分析 步骤&#xff1a; 准备公共数据新建分析主题处理数据在数据中分析在图形中分析数据大屏 准备公共数据 点击公共数据 点击新建文件夹 修改文件夹名称 上传数据 鼠标悬停在文件夹上&#xff0c;右侧出现 鼠标悬停在文件夹上&#x…...

1. 小游戏(贪心)

题干&#xff1a; 谷同学很喜欢玩计算机游戏&#xff0c;特别是战略游戏&#xff0c;但是有时他不能尽快找到解所以常常感到很沮丧。现在面临如下问题&#xff1a;他必须在一个中世纪的城堡里设防&#xff0c;城堡里的道路形成一棵无向树。要在结点上安排最少的士兵使得他们可以…...

记录 | c++打印变量类型

c打印变量类型: 使用 typeid(变量名).name() int main(){std::cout << "type of ss : " << typeid(ss).name() << std::endl; }...

nodejs_vue+vscode美容理发店会员管理系统un1dm

按照设计开发一个系统的常用流程来描述系统&#xff0c;可以把系统分成分析阶段&#xff0c;设计阶段&#xff0c;实现阶段&#xff0c;测试阶段。所以在编写系统的说明文档时&#xff0c;根据系统所处的阶段来描述系统的内容。 绪论&#xff1a;这是对选题的背景&#xff0c;意…...

C语言 操作符详解

C语言学习 目录 文章目录 前言 一、算术操作符 二、移位操作符 2.1 左移操作符 2.2 右移操作符 三、位操作符 3.1 按位与操作符 & 3.2 按位或操作符 | 3.3 按位异或操作符 ^ 四、赋值操作符 五、单目操作符 5.1 逻辑反操作符&#xff01; 5.2 正值、负值-操作符 5.3 取地址…...

成为AI产品经理——回归模型评估(MSE、RMSE、MAE、R方)

分类问题的评估是看实际类别和预测类别是否一致&#xff0c;它的评估指标主要有混淆矩阵、AUC、KS。回归问题的评估是看实际值和预测值是否一致&#xff0c;它的评估指标包括MAE、MSE、RMSE、R方。 如果我们预测第二天某支股票的价格&#xff0c;给一个模型 y1.5x&#xff0c;…...

【C++11(一)】右值引用以及列表初始化

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 统一的列表初始化3. initializer…...

通俗理解Jenkins是什么?

目录 通俗理解 Jenkins是什么&#xff1f; 通俗理解 假设你有一个软件项目&#xff0c;多个开发者在一起写代码。每当有人提交新的代码时&#xff0c;你想要自动地构建、测试这些代码&#xff0c;确保它们没有引入问题。 Jenkins就像一个聪明的助手&#xff0c;会在有人提交…...

格雷希尔帮助仪器仪表测试时快速密封的G60C系列接头其优势有哪些

仪器仪表在工业领域中扮演着重要的角色&#xff0c;如&#xff1a;压力表&#xff0c;压力传感器、压力变送器、压力开关、压力歧管等这些&#xff0c;在工业领域中都是随处可见的&#xff0c;其数据的精度直接影响着产品在生产过程中的质量和安全性&#xff1b;因此&#xff0…...

系统运维工具KSysAK——让运维回归简单

系统运维工具KSysAK——让运维回归简单 1.基本信息 1.1概述 系统异常定位分析工具KSysAK是云峦操作系统研发及运维人员总结开发及运维经验&#xff0c;设计和研发的多个运维工具的集合&#xff0c;可以覆盖系统的日常监控、线上问题诊断和系统故障修复等常见运维场景。 工具…...

NowCoder | KY11 二叉树遍历

NowCoder | KY11 二叉树遍历 OJ链接 简单来说就是构建这个二叉树定义结构体通过递归方式根据输入的字符串构建二叉树。对于输入字符串中的每个字符&#xff0c;如果是 ‘#’ 表示空节点&#xff0c;否则创建一个新节点&#xff0c;并递归地构建左右子树。 #include <limit…...

android.view.WindowLeaked解决方法

问题 我在使用WindowManager添加一个button&#xff0c; windowManager.addView(button,layoutParams);然后关闭当前的这个Activity的时候遇到了WindowLeak这个问题&#xff0c;也就是所谓的窗体泄露。 原因 主要原因是因为android只允许在UI主线程操作&#xff0c;我在使用W…...

浪潮信息KeyarchOS的飞跃之路

1.背景 在正式向大家介绍KOS之前&#xff0c;我们先关注这样一些问题。 传统操作系统在大规模数据处理、高性能计算和人工智能应用方面面临着一些瓶颈问题&#xff0c;包括存储和访问效率、数据传输和通信效率、并行计算性能等等问题。为了能够更好的改进这些问题&#xff0c…...

C++基础 -41- 迭代器

每个stl 模板接口都有一个专用的迭代器 迭代器就是 stl 库中的 一个特殊指针&#xff0c;功能与指针类似(类似但不是) 迭代器定义格式 迭代器的使用,使用迭代器遍历向量容器的参数 代码运行结果 无论使用普通方式还是迭代器方式去都可以遍历vector容器...

zookeeper心跳检测 (实操课程)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读来学习和测试zookeeper。 阅读本文之前&#xff0c;请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09;zookeeper 客户端常用命令简单记录…...

社区新零售:重塑零售业的全新模式

社区新零售&#xff1a;重塑零售业的全新模式 近年来&#xff0c;新零售业成为了研究的焦点&#xff0c;它是一种以互联网为基础的零售形式。新零售通过运用先进技术手段&#xff0c;如大数据和人工智能&#xff0c;对商品的生产、流通和销售过程进行升级改造&#xff0c;重新构…...

北京华联BHGMall“宠粉模式”不断迭代,强体验注互动成行业UP主

在今年双11热度遇冷后&#xff0c;双十二被官宣取消&#xff0c;而这背后本质已经间接印证&#xff1a;传统“电商大促”的模式&#xff0c;已经难以为继。反观线下消费市场&#xff0c;则是以持续恢复和增长成为经济恢复的亮点&#xff0c;从线下客流量的快速回升&#xff0c;…...

前端时间的失败总结复盘

分享失败经验&#xff0c;前段时间的总结复盘&#xff1a; 与伙伴合作面对异常决策要及时提出质疑&#xff0c;怼&#xff0c;别太客气&#xff0c;客气起来&#xff0c;小心翼翼在意他人情绪那么这个项目就会让人难受&#xff0c;不要因为因为伙伴身上有标签/光环/权威就觉得…...

Ribbon 负载均衡

1、负载均衡整体流程 2、负载均衡流程逐级跟踪运行 (1) LoadBlanced 注解可以使LoadBalancerInterceptor拦截到&#xff1b; (2)LoadBalancerInterceptor 实现了ClientHttpRequestInterceptor接口&#xff1b; (3)ClientHttpRequestInterceptor接口释义如下&#xff1b; (4)int…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...