apipost 8.x 腳本循環調用接口

apipost 8.x 腳本循環調用接口

  • 背景
  • 實現
    • 先說整體邏輯:
  • 最后

背景

上周為了找某OA 偶爾出現的詭異現象,需要用測試工具來壓測,看看這個問題能否重現。以前用過Jmeter,但是沒有裝,正好有個國產的apipost看看如何?剛開始使用界面調用接口,還挺順利。但是到腳本調用接口,就是token校驗不通過,這還是問deepseek,這里還有有趣地方:百度查詢apipost 腳本給出例子,然后給deepseek發過去,它說那是postman 例子,隨后給我“正確”的apipost 腳本,我暗自贊嘆,真厲害!但是執行就是校驗不通過,老報301,重定向到登錄界面。后來我就問APIPOST客服,它apipost 里面ai助手,扔給它搞定就行。結果它給我就是postman腳本。我就詫異,我問客服,為何不給apipost 的腳本,她回答:兼容postman。結果一試,真能跑通。太神奇了!這是不是側面說明:apipost自身腳本還不夠成熟。

實現

先說整體邏輯:

在這里插入圖片描述
前面1-4 就是模擬瀏覽器操作,發起流程一個過程。因為這個只做一遍,不需要循環。
第5步:因為需要循環多個接口,不能使用界面定義接口。它里面又分為
5.1 查詢當前流程最后處理人員
5.2登錄
5.3 保存流程
5.4 移動到下一個操作人員
5.5 提交流程
5.6 登出
重復5.1-5.5 直到5.1 查詢不到最后處理人員為止
主函數如下:

// 定義一個異步函數來處理循環
async function loopRequests() {try {let baseUrl = pm.environment.get("base_url");if (!baseUrl) {throw new Error('base_url 環境變量未設置');}let jsessionId = pm.environment.get("JSESSIONID");let cwbbsAuth = pm.environment.get("cwbbs.auth");let flowId = pm.environment.get('flowId');console.log('jsessionId:' + jsessionId)if (!jsessionId) {throw new Error('jsessionId 環境變量未設置');}if (!flowId) {throw new Error('flowId 環境變量未設置');} else {console.info('開始處理流程flowId:' + flowId)}let hasMore = true;let count = 0;while (hasMore) {console.log(`正在發起第 ${count + 1} 次請求`);try {// 1. 查詢當前流程最后處理人員const url = baseUrl + '/flow/getLastHandlingPersonnel';const headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Cookie': 'JSESSIONID=' + jsessionId + ';cwbbs.auth=' + cwbbsAuth};const body = `flowId=${flowId}`;const res = await pm.sendRequest({url,method: 'POST',header: headers,body: {mode: 'raw',raw: body}});const responseText = String(res.stream);console.log('responseText:' + responseText)const responseData = JSON5.parse(responseText);console.log(`${count + 1} 次請求成功:`, responseData);// 4. 根據最后處理人登錄->保存->提交->登出if (responseData.ret == 1) {console.log('開始處理流程...');await login(responseData);await saveFlow(responseData);let nextInternalName = await moveNextPerson(responseData);await finish(responseData, nextInternalName);await logout();console.log('流程處理完成');} else {console.log('ret不為1,停止循環。響應:', responseData);hasMore = false;}count++;if (count >= 20) {console.log('達到最大循環次數20,停止循環');hasMore = false;}} catch (innerError) {console.error(`${count + 1} 次請求失敗:`, innerError.message);console.error('錯誤堆棧:', innerError.stack);hasMore = false; // 出錯時停止循環}}} catch (outerError) {console.error('loopRequests 外部錯誤:', outerError.message);console.error('外部錯誤堆棧:', outerError.stack);throw outerError;}
}

5.2 登錄接口:

async function login(loginData) {try {console.log('開始登錄,用戶:', loginData.userName);const baseUrl = pm.environment.get("base_url");if (!baseUrl) {throw new Error('base_url 環境變量未設置');}if (!loginData.userName) {throw new Error('loginData 中缺少 userName');}const url = baseUrl + '/doLogin.do';const headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'};const body = `name=${loginData.userName}&wdmm=TY%2BD6EZV1gPtH3dQJJkwrA%3D%3D&signature=&op=&mainTitle=&mainPage=&form_token=17560851885711572739&isSavePwd=on`;const res = await pm.sendRequest({url,method: 'POST',header: headers,body: {mode: 'raw',raw: body}});const responseText = String(res.stream);console.log('responseText:' + responseText)const responseData = JSON5.parse(responseText);console.log('after JSON5.parse')if (responseData.ret != '1') {throw new Error(`登錄失敗,ret: ${responseData.ret}, msg: ${responseData.msg}`);}// cookies 保存到環境變量const headers1 = res.headers;// 遍歷所有響應頭headers1.each(header1 => {//console.log(header1.key + ': ' + header1.value);// 專門處理Set-Cookie頭if (header1.key.toLowerCase() === 'set-cookie') {const setCookieValue = header1.value;console.log('Set-Cookie原始值:', setCookieValue);// 解析JSESSIONIDconst jsessionIdMatch = setCookieValue.match(/JSESSIONID=([^;]+)/);if (jsessionIdMatch && jsessionIdMatch[1]) {const jsessionId = jsessionIdMatch[1];pm.environment.set("JSESSIONID", jsessionId);console.log('? 已設置JSESSIONID:', jsessionId);}// 解析cwbbs.authconst cwbbsAuthMatch = setCookieValue.match(/cwbbs\.auth=([^;]*)/);if (cwbbsAuthMatch) {const cwbbsAuth = cwbbsAuthMatch[1] || ''; // 如果是空值也保存pm.environment.set("cwbbs.auth", cwbbsAuth);console.log('? 已設置cwbbs.auth:', cwbbsAuth);}}});} catch (error) {console.error('登錄過程中出錯:', error.message);console.error('登錄錯誤堆棧:', error.stack);throw error;}
}

5.3 保存流程

async function saveFlow(flowResponse) { // 重命名參數避免沖突try {let jsessionId = pm.environment.get("JSESSIONID"); // 獲取cookie值let cwbbsAuth = pm.environment.get("cwbbs.auth");   // 獲取cookie值let flowId = pm.environment.get('flowId');let baseUrl = pm.environment.get("base_url"); // 獲取base_urlif (!baseUrl) {throw new Error('base_url 環境變量未設置');}console.log('---saveFlow開始-----')console.log('jessionId:' + jsessionId + ',cwbbsAuth:' + cwbbsAuth)const url = baseUrl + '/flow/finishAction.do';// 使用FormData對象,讓Postman自動處理multipart格式// 構建URL編碼的表單數據// 定義邊界符const boundary = '----WebKitFormBoundary' + Date.now().toString(16);const crlf = '\r\n';// 構建multipart/form-data bodylet multipartBody = '';// 輔助函數:添加表單字段const addFormField = (name, value) => {multipartBody += `--${boundary}${crlf}`;multipartBody += `Content-Disposition: form-data; name="${name}"${crlf}${crlf}`;multipartBody += `${value}${crlf}`;};// 添加所有字段addFormField('isUseMsg', 'true');addFormField('flowAction', '');addFormField('cwsWorkflowTitle', 'xxx發布test');addFormField('cwsWorkflowResult', '');addFormField('att1', '');addFormField('flowId', flowId);addFormField('actionId', flowResponse.actionId);addFormField('myActionId', flowResponse.myActionId);addFormField('XorNextActionInternalNames', '');addFormField('op', 'saveformvalueBeforeXorCondSelect');addFormField('isAfterSaveformvalueBeforeXorCondSelect', '');addFormField('formReportContent', '');addFormField('gzhlx', 'xxx平臺');addFormField('wzbt', '111');addFormField('tgr', 'test');addFormField('ngr', 'test');addFormField('wzlx', '一般信息');addFormField('tgbm', flowResponse.deptCode); // 不需要手動encodeURIComponent,邊界符會自動處理addFormField('zzlj', '');addFormField('bqsm', '1');addFormField('mgxxjc', '1');addFormField('wznr', '<p>test</p>');addFormField('bmjlyj', '同意');addFormField('gzfzryj', '');addFormField('jycldyj', '');addFormField('dgbfgldyj', '');addFormField('zjlyj', '');addFormField('dszyj', '');addFormField('cws_textarea_sf', '是');addFormField('cws_textarea_ngr', 'test');addFormField('cws_textarea_tgr', 'test');addFormField('cws_textarea_bqsm', '1');addFormField('cws_textarea_tgbm', flowResponse.deptCode);addFormField('cws_textarea_wzbt', '111');addFormField('cws_textarea_wzlx', '一般信息');addFormField('cws_textarea_wznr', '<p>test</p>');addFormField('cws_textarea_zzlj', '');addFormField('cws_textarea_dszyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_gzhlx', 'xxx平臺');addFormField('cws_textarea_zjlyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_bmjlyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_mgxxjc', '1');addFormField('cws_textarea_gzfzryj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_jycldyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_dgbfgldyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('myReplyTextareaContent', '');addFormField('isSecret0', '0');addFormField('myActionId0', flowResponse.myActionId);addFormField('discussId0', '0');addFormField('flow_id0', flowId);addFormField('action_id0', '0');addFormField('user_name0', flowResponse.userName);addFormField('userRealName0', flowResponse.userRealName);addFormField('reply_name0', flowResponse.userName);addFormField('parent_id0', '-1');addFormField('returnBack', 'true');// 添加結束邊界multipartBody += `--${boundary}--${crlf}`;const headers = {'Content-Type': `multipart/form-data; boundary=${boundary}`,'Cookie': 'JSESSIONID=' + jsessionId + ';cwbbs.auth=' + cwbbsAuth};console.log('headers:' + headers);const res = await pm.sendRequest({url,method: 'POST',header: headers,body: {mode: 'raw',raw: multipartBody}});const responseText = String(res.stream);console.log('保存流程,請求:' + multipartBody);console.log('responseText:' + responseText)const responseData = JSON5.parse(responseText);if (responseData.ret == '1') {console.log('? 保存成功');return responseData;} else {console.warn('? 保存失敗,返回值:', responseData.ret);throw new Error(`保存失敗: ${responseData.msg || '未知錯誤'}`);}} catch (error) {console.error('保存流程時出錯:', error.message);throw error; // 重新拋出錯誤}
}

5.4 移動到下一個操作人員

async function moveNextPerson(flowResponse) {try {console.info('開始處理移動到下一個操作人員')const baseUrl = pm.environment.get("base_url");if (!baseUrl) {throw new Error('base_url 環境變量未設置');}const url = baseUrl + '/flow/moveNextPersonnels';const headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'};const body = `op=matchNextBranch&actionId=${flowResponse.actionId}&myActionId=${flowResponse.myActionId}`;console.log('moveNextPerson 請求:' + body);const res = await pm.sendRequest({url,method: 'POST',header: headers,body: {mode: 'raw',raw: body}});const responseText = String(res.stream);console.log('responseText:' + responseText)const responseData = JSON5.parse(responseText);console.log('after JSON5.parse')if (responseData.ret != '1') {throw new Error(`移動下一個操作人員失敗,ret: ${responseData.ret}, msg: ${responseData.msg}`);} else {return responseData.nextInternalName;}} catch (error) {console.error('移動到下一個操作人員出錯:', error.message);console.error('移動到下一個操作人員錯誤堆棧:', error.stack);throw error;}
}

5.5 提交流程

async function finish(flowResponse,nextInternalName) {try {let jsessionId = pm.environment.get("JSESSIONID"); // 獲取cookie值let cwbbsAuth = pm.environment.get("cwbbs.auth");   // 獲取cookie值let flowId = pm.environment.get('flowId');let baseUrl = pm.environment.get("base_url"); // 獲取base_urlif (!baseUrl) {throw new Error('base_url 環境變量未設置');}const boundary = '----WebKitFormBoundaryuUyGuZA3IOGaIBch' + Date.now().toString(16);const crlf = '\r\n';let multipartBody = '';// 定義添加表單字段的方法const addFormField = (name, value) => {multipartBody += `--${boundary}${crlf}`;multipartBody += `Content-Disposition: form-data; name="${name}"${crlf}${crlf}`;multipartBody += `${value}${crlf}`;};// 添加所有字段addFormField('deptOfUserWithMultiDept0', '');addFormField('XorActionSelected', nextInternalName);addFormField(`WorkflowAction_${flowResponse.actionId}`, flowResponse.userName);addFormField('isUseMsg', 'true');addFormField('flowAction', '');addFormField('cwsWorkflowTitle', 'xxx發布test');addFormField('cwsWorkflowResult', '');addFormField('att1', '');addFormField('flowId', flowId);addFormField('actionId', flowResponse.actionId);addFormField('myActionId', flowResponse.myActionId);addFormField('XorNextActionInternalNames', nextInternalName);addFormField('op', 'finish');addFormField('isAfterSaveformvalueBeforeXorCondSelect', 'true');addFormField('formReportContent', '');addFormField('gzhlx', 'xxx平臺');addFormField('wzbt', '111');addFormField('tgr', 'test');addFormField('ngr', 'test');addFormField('wzlx', '一般信息');addFormField('tgbm', flowResponse.deptCode);addFormField('zzlj', '');addFormField('bqsm', '1');addFormField('mgxxjc', '1');addFormField('wznr', '<p>test</p>');addFormField('bmjlyj', '同意');addFormField('gzfzryj', '');addFormField('jycldyj', '');addFormField('dgbfgldyj', '');addFormField('zjlyj', '');addFormField('dszyj', '');addFormField('cws_textarea_sf', '是');addFormField('cws_textarea_ngr', 'test');addFormField('cws_textarea_tgr', 'test');addFormField('cws_textarea_bqsm', '1');addFormField('cws_textarea_tgbm', flowResponse.deptCode);addFormField('cws_textarea_wzbt', '111');addFormField('cws_textarea_wzlx', '一般信息');addFormField('cws_textarea_wznr', '<p>test</p>');addFormField('cws_textarea_zzlj', '');addFormField('cws_textarea_dszyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_gzhlx', 'xxx平臺');addFormField('cws_textarea_zjlyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_bmjlyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_mgxxjc', '1');addFormField('cws_textarea_gzfzryj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_jycldyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('cws_textarea_dgbfgldyj', '<?xml version="1.0" encoding="utf-8"?><myactions></myactions>');addFormField('myReplyTextareaContent', '');addFormField('isSecret0', '0');addFormField('myActionId0', flowResponse.myActionId);addFormField('discussId0', '0');addFormField('flow_id0', flowId);addFormField('action_id0', '0');addFormField('user_name0', flowResponse.userName);addFormField('userRealName0', flowResponse.userRealName);addFormField('reply_name0', flowResponse.userName);addFormField('parent_id0', '-1');addFormField('returnBack', 'true');// 添加結束邊界multipartBody += `--${boundary}--${crlf}`;const url = baseUrl + '/flow/finishAction.do';const headers = {'Content-Type': `multipart/form-data; boundary=${boundary}`,'Cookie': 'JSESSIONID=' + jsessionId + ';cwbbs.auth=' + cwbbsAuth};const res = await pm.sendRequest({url,method: 'POST',header: headers,body: {mode: 'raw',raw: multipartBody}});const responseText = String(res.stream);console.log('提交流程,請求:' + multipartBody);console.log('responseText:' + responseText)const responseData = JSON5.parse(responseText);if (responseData.ret == '1') {console.log('? 提交成功');return responseData;} else {console.warn('? 提交失敗,返回值:', responseData.ret);throw new Error(`提交失敗: ${responseData.msg || '未知錯誤'}`);}} catch (error) {console.error('提交流程時出錯:', error.message);throw error; // 重新拋出錯誤}
}

5.6 登出

async function logout() {try {let jsessionId = pm.environment.get("JSESSIONID"); // 獲取cookie值let cwbbsAuth = pm.environment.get("cwbbs.auth");   // 獲取cookie值    let baseUrl = pm.environment.get("base_url"); // 獲取base_urlif (!baseUrl) {throw new Error('base_url 環境變量未設置');}const url = baseUrl + '/logout?skincode=lte';const headers = {'Cookie': 'JSESSIONID=' + jsessionId + ';cwbbs.auth=' + cwbbsAuth};const res = await pm.sendRequest({url,method: 'GET',header: headers});const responseText = String(res.stream);console.log('登出成功:' + responseText)} catch (error) {console.error('登出出錯:', error.message);throw error; // 重新拋出錯誤}
}

// 執行函數

try {console.log('開始執行主循環...');loopRequests().then(() => {console.log('主循環執行完成');}).catch(error => {console.error('主循環執行失敗:', error.message);console.error('主循環錯誤堆棧:', error.stack);});
} catch (error) {console.error('執行過程中出錯:', error.message);console.error('執行錯誤堆棧:', error.stack);

因為一個流程發起后,經過多少人處理是動態的,不能指定循環多少次。

最后

apipost 腳本寫到這里,這個工具感覺比國外的postman,jemeter 要輕量一些。
另外,它的寫接口和用例分開的
在這里插入圖片描述

如需溝通,聯系:lita2lz

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97816.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32 - Embedded IDE - GCC - 使用 GCC 鏈接腳本限制 Flash 區域

導言如上所示&#xff0c;Keil限制flash區域只需要在IROM1里將Start框框與Size框框填入具體信息即可。比如bootloader程序一般從0x8000000開始&#xff0c;大小0x10000&#xff08;64KB&#xff09;。此時&#xff0c;flash的范圍被限制在0x8000000 ~ 0x800FFFF。 另外&#xf…

Jenkins和Fastlane的原理、優缺點、用法、如何選擇

Jenkins 和 Fastlane 是軟件開發中用于自動化流程的工具一、Jenkins實現自動化打包1.1具體實現步驟安裝與配置&#xff1a;首先在服務器上安裝 Jenkins&#xff0c;可以通過官方提供的安裝包進行安裝&#xff0c;支持多種操作系統。安裝完成后&#xff0c;通過 Web 界面進行初始…

DOM常見的操作有哪些?

1.DOM文檔對象模型&#xff08;DOM&#xff09;是HTML和XML文檔的編程接口它提供了對文檔結構化表述&#xff0c;并定義了一種方式可以使從程序中對該結構進行訪問&#xff0c;從而改變文檔的結構&#xff0c;樣式和內容任何HTML或XML文檔都可以用DOM表示一個由節點構成的層級結…

【Kubernetes】知識點3

25. 說明Job與CronJob的功能。答&#xff1a;Job&#xff1a;一次性作業&#xff0c;處理短暫的一次性任務&#xff0c;僅執行一次&#xff0c;并保證處理的一個或者多個 Pod 成功結束。CronJob&#xff1a;周期性作業&#xff0c;可以指定每過多少周期執行一次任務。26. Kuber…

LINUX-網絡編程-TCP-UDP

1.目的&#xff1a;不同主機&#xff0c;進程間通信。2.解決的問題1&#xff09;主機與主機之間物理層面必須互相聯通。2&#xff09;進程與進程在軟件層面必須互通。IP地址&#xff1a;計算機的軟件地址&#xff0c;用來標識計算機設備MAC地址&#xff1a;計算機的硬件地址&am…

目標檢測定位損失函數:Smooth L1 loss 、IOU loss及其變體

Smooth L1 Loss 概述 Smooth L1 Loss&#xff08;平滑 L1 損失&#xff09;&#xff0c;是一個在回歸任務&#xff0c;特別是計算機視覺中的目標檢測領域&#xff08;如 Faster R-CNN, SSD&#xff09;非常核心的損失函數。 xxx 表示模型的預測值&#xff0c;yyy 表示真實值&am…

Android開發之fileprovider配置路徑path詳細說明

第一步在清單文件配置fileprovider屬性<providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.fileprovider"android:exported"false"android:grantUriPermissions"true"><meta-d…

【ComfyUI】圖像描述詞潤色總結

在 ComfyUI 的工作流中&#xff0c;圖像反推描述詞能幫我們從圖像里抽取語義信息&#xff0c;但這些原始描述往往還顯得生硬&#xff0c;缺乏創意或流暢性。為了讓提示詞更自然、更有表現力&#xff0c;就需要“潤色”環節。潤色節點的任務&#xff0c;不是重新生成描述&#x…

java面試中經常會問到的IO、NIO問題有哪些(基礎版)

文章目錄一、IO 基礎與分類二、NIO 核心組件與原理三、NIO 與 BIO 的實戰對比四、AIO 與 NIO 的區別五、Netty 相關&#xff08;NIO 的高級應用&#xff09;總結Java 中的 IO&#xff08;輸入輸出&#xff09;和 NIO&#xff08;非阻塞 IO&#xff09;是面試中的重要考點&#…

時序數據庫選型指南:如何為工業場景挑選最強“數據底座”

工業4.0時代&#xff0c;工廠化身為巨大的數據生產中心。數以萬計的傳感器、PLC和設備每時每刻都在產生著海量的時間序列數據&#xff08;Time-Series Data&#xff09;&#xff1a;溫度、壓力、流速、振動、設備狀態……這些帶時間戳的數據是工業互聯網的血液&#xff0c;蘊含…

【排序算法】冒泡 選排 插排 快排 歸并

一、冒泡排序// 冒泡排序var bubbleSort function (arr) {const len arr.length;for (let i 0; i < len; i) {let isSwap false;for (let j 0; j < len - 1; j) {// 每一次遍歷都要比較相鄰元素的大小&#xff0c;如果滿足條件就交換位置if (arr[j] > arr[j 1])…

電子病歷空缺句的語言學特征描述與自動分類探析(以GPT-5為例)(中)

語言學特征刻畫(特征庫) 句法特征 句法特征是識別 SYN 類電子病歷空缺句的核心語言學維度,其量化分析通過構建依存句法結構的形式化指標,實現對語法不完整性的客觀描述。該類特征主要包括依存樹不完備指標、謂詞-論元覆蓋率及從屬連詞未閉合三類核心參數,共同構成 SYN 類…

InnoDB存儲引擎-事務

1. 事務概述事務可由一條簡單的SQL語句組成,也可以由一組復雜的SQL語句組成. 事務是訪問并更新數據庫中各種數據項的一個程序執行單元. 在事務中的操作, 要么都做修改, 要么都不做. 對于 InnoDB存儲引擎而言, 其默認的事務隔離級別 RR , 完全遵循和滿足了事務的 ACID 特性. 1.1…

web項目的目錄結構

web項目的目錄結構 WEB-INF 存放class文件、jar文件和配置文件&#xff0c;對于用戶來說該文件夾是不可見的WEB-INF/web.xml web應用程序的描述文件&#xff0c;用來配置資源&#xff0c;如servlet、過濾器、監聽器等WEB-INF/classes 用于存放class文件&#xff0c;也是該web應…

數據結構_隊列Queue(C語言實現)

一、隊列的基本概念 1.隊列定義 隊列是一種先進先出的線性表數據結構&#xff08;First in First out&#xff09;,現實中的例子就是&#xff0c;排隊購票&#xff0c;先排隊的先購票&#xff0c;購完票之后直接從這個隊中離開&#xff0c;后來的在這個隊后面排隊&#xff0c;這…

C++對CPU緩存的合理利用

緩存體系 在計算機的體系結構中,存儲速度是分了好幾層: CPU緩存,又分成了L1/L2/L3等多層緩存,我們暫時看成同一層。訪問速度最快 內存,訪問速度次之,大概是CPU緩存的幾十分之一 硬盤,訪問速度最慢,是內存訪問速度的幾十分之一 所以,在計算機體系結構中,把下一層的數…

貝葉斯定理:理解概率更新與實際場景應用

貝葉斯定理及其應用&#xff1a;從基礎到實戰 貝葉斯定理&#xff08;Bayes’ Theorem&#xff09;是概率論中最基礎也是最強大的工具之一。它通過將先驗知識與新證據結合&#xff0c;能夠幫助我們在不確定的情況下做出更加精準的判斷。本文將從貝葉斯定理的核心概念、公式開始…

組件之間的傳遞參數傳遞(常用父向子傳遞)

現在&#xff0c;有子組件<MdsWxSourceDetailref"mdsWx":rank-obj"activeRankObj":media-name"activeObj.mediaName" :error-info"activeErrorInfo" ></MdsWxSourceDetail>以上代碼在MdsIndexRankDetail&#xff0…

java畢業設計-基于springboot區塊鏈的電子病歷數據共享平臺設計與實現(附源碼數據庫文檔資料)

博主介紹&#xff1a;??碼農一枚 &#xff0c;專注于大學生項目實戰開發、講解和畢業&#x1f6a2;文撰寫修改等。全棧領域優質創作者&#xff0c;博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰 ??技術范圍&#xff1a;&am…

【新啟航】3D 逆向抄數的三維能力架構:數據采集工具操作 × 幾何處理算法應用 × 行業場景適配技能

摘要3D 逆向抄數的落地效果依賴多維度能力協同&#xff0c;本文提出 “數據采集工具操作 - 幾何處理算法應用 - 行業場景適配技能” 的三維能力架構。通過拆解各維度核心要素&#xff0c;分析數據采集工具&#xff08;激光、結構光等&#xff09;的操作要點&#xff0c;解析幾何…