2025-05-11 Unity 網絡基礎11——UnityWebRequest

文章目錄

  • 1 UnityWebRequest 介紹
  • 2 搭建 HTTP 服務器
  • 3 常用操作
    • 3.1下載資源
      • 3.1.1 下載文本
      • 3.1.2 下載圖片
      • 3.1.3 下載 AB 包
    • 3.2 上傳資源
      • 3.2.1 上傳數據類
      • 3.2.2 POST 上傳
      • 3.3.3 PUT 上傳
  • 4 自定義操作
    • 4.1 下載資源
      • 4.1.1 Unity 內置 Handler
      • 4.1.2 自定義 Handler
    • 4.2 上傳資源
      • 4.2.1 UploadHandlerRaw
      • 4.2.2 UploadHandlerFile

本文環境

  • Windows 11
  • Unity 6000.0.42f1

1 UnityWebRequest 介紹

? UnityWebRequest 是 Unity 提供的模塊化的系統類,用于構成 HTTP 請求和處理 HTTP 響應。

? 它主要目標是讓 Unity 游戲和 Web 服務端進行交互,將之前 WWW 的相關功能都集成在了其中,新版本中都建議使用 UnityWebRequest 類代替 WWW 類。

? UnityWebRequest 在使用上和 WWW 很類似,主要區別是 UnityWebRequest 把下載下來的數據處理單獨提取出來,可以根據自己的需求選擇對應的數據處理對象來獲取數據。

注意

  1. UnityWebRequest 和 WWW 一樣,需要配合協同程序使用。
  2. UnityWebRequest 和 WWW 一樣,支持 http、ftp、file 協議下載或加載資源。
  3. UnityWebRequest 能夠上傳文件到 HTTP 資源服務器。

常用操作

  1. 使用 Get 請求獲取文本或二進制數據。
  2. 使用 Get 請求獲取紋理數據。
  3. 使用 Get 請求獲取 AB 包數據。
  4. 使用 Post 請求發送數據。
  5. 使用 Put 請求上傳數據。

2 搭建 HTTP 服務器

  • 搭建 HTTP 服務器過程參考:2025-05-11 Unity 網絡基礎10——HTTP通信-CSDN博客。

? Unity 默認不允許不安全的連接(如 HTTP),如果服務器是本地開發服務器,可以啟用 Unity 的 Allow downloads over HTTP 選項(位于 Edit > Project Settings > Player > Other Settings)。

image-20250511112546176

3 常用操作

3.1下載資源

3.1.1 下載文本

  • 獲取文本或二進制數據時

    使用 UnityWebRequest.Get()

using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;public class Lesson30 : MonoBehaviour{// 在Start方法中啟動LoadText協程private void Start(){StartCoroutine(LoadText());}// 定義LoadText協程IEnumerator LoadText(){// 發送GET請求var req = UnityWebRequest.Get("http://你的 IP 地址:8000/HTTP Server/test.txt");// 等待請求完成yield return req.SendWebRequest();// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 打印下載的文本print(req.downloadHandler.text);// 獲取下載的字節數組var bytes = req.downloadHandler.data;// 打印字節數組的長度print("字節數組長度: " + bytes.Length);}// 如果請求失敗else{// 打印錯誤信息print($"獲取失敗: {req.error} | {req.result} | {req.responseCode}");}}}
}

? 將腳本掛載到 Unity 場景上并運行,得到以下結果。

image-20250511112629771

3.1.2 下載圖片

  • 獲取紋理圖片數據時

    使用 UnityWebRequestTexture.GetTexture()

    以及 DownloadHandlerTexture.GetContent()

    該方法也支持

    • ftp 下載。
    • file 本地文件下載。
using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson30 : MonoBehaviour{// 聲明一個RawImage類型的變量Imgpublic RawImage Img;// 在Start方法中啟動LoadText協程private void Start(){StartCoroutine(LoadTexture());}IEnumerator LoadTexture(){// 創建一個UnityWebRequestTexture對象,用于獲取指定URL的紋理var req = UnityWebRequestTexture.GetTexture("http://你的 IP 地址:8000/HTTP Server/test.png");// var req = UnityWebRequestTexture.GetTexture("ftp://你的 IP 地址:8000/HTTP Server/test.png");// var req = UnityWebRequestTexture.GetTexture("file://" + Application.streamingAssetsPath + "/test.png");// 發送網絡請求yield return req.SendWebRequest();// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 方法一// Img.texture = (req.downloadHandler as DownloadHandlerTexture).texture;// 方法二// 獲取下載的紋理Img.texture = DownloadHandlerTexture.GetContent(req);}else{// 打印錯誤信息print($"獲取失敗: {req.error} | {req.result} | {req.responseCode}");}}}
}

? 將腳本掛載到 Unity 場景上,并在 Unity 場景中創建一個 RawImage 關聯至 Img。

? 運行 Unity,RawImage 上出現了從服務器下載的圖片。

image-20250511114140792

3.1.3 下載 AB 包

  • 獲取 AB 包數據時

    使用 UnityWebRequestAssetBundle.GetAssetBundle()

    以及 DownloadHandlerAssetBundle.GetContent()

using UnityEngine;namespace Lesson
{using System.Collections;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson30 : MonoBehaviour{// 在Start方法中啟動LoadText協程private void Start(){StartCoroutine(LoadAB());}IEnumerator LoadAB(){// 創建一個UnityWebRequest對象,用于獲取AssetBundleUnityWebRequest req = UnityWebRequestAssetBundle.GetAssetBundle("http://你的 IP 地址:8000/HTTP Server/ab2");// 發送請求req.SendWebRequest();// 循環等待請求完成while (!req.isDone){// 打印下載進度print(req.downloadProgress);// 打印已下載的字節數print(req.downloadedBytes);// 等待一幀yield return null;}//yield return req.SendWebRequest();// 打印下載進度print(req.downloadProgress);// 打印已下載的字節數print(req.downloadedBytes);// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 獲取AssetBundle對象// AssetBundle ab = (req.downloadHandler as DownloadHandlerAssetBundle).assetBundle;// 獲取AssetBundle對象var ab = DownloadHandlerAssetBundle.GetContent(req);// 打印AssetBundle的名稱print(ab.name);}else{// 打印錯誤信息print($"獲取失敗: {req.error} | {req.result} | {req.responseCode}");}}}
}

3.2 上傳資源

3.2.1 上傳數據類

父接口:IMultipartFormSection

  • 所有上傳數據類的父接口
  • 可以使用父類容器存儲子類對象
var dataList = new List<IMultipartFormSection>();

子類1:MultipartFormDataSection

  • 用于上傳普通數據
// 1. 二進制字節數組
dataList.Add(new MultipartFormDataSection(Encoding.UTF8.GetBytes("123123123123123")));// 2. 字符串
dataList.Add(new MultipartFormDataSection("12312312312312312dsfasdf"));// 3. 帶參數名和編碼類型(常用)
dataList.Add(new MultipartFormDataSection("Name", "xxx", Encoding.UTF8, "application/...."));// 4. 帶參數名的字節數組
dataList.Add(new MultipartFormDataSection("Msg", new byte[1024], "appl....."));

子類2:MultipartFormFileSection

  • 用于上傳文件數據
// 1. 簡單字節數組
dataList.Add(new MultipartFormFileSection(File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));// 2. 帶文件名的字節數組(常用)
dataList.Add(new MultipartFormFileSection("上傳的文件.png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")));// 3. 字符串數據+文件名(常用)
dataList.Add(new MultipartFormFileSection("12312313212312", "test.txt"));// 4. 帶編碼格式的字符串數據+文件名(常用)
dataList.Add(new MultipartFormFileSection("12312313212312", Encoding.UTF8, "test.txt"));// 5. 完整參數:表單名+字節數組+文件名+文件類型
dataList.Add(new MultipartFormFileSection("file", new byte[1024], "test.txt", ""));// 6. 完整參數:表單名+字符串數據+編碼格式+文件名
dataList.Add(new MultipartFormFileSection("file", "123123123", Encoding.UTF8, "test.txt"));

3.2.2 POST 上傳

基本流程

  1. 準備上傳數據列表。
  2. 創建 UnityWebRequest.POST 請求。
  3. 發送請求并監控進度。
  4. 處理響應結果。
using UnityEngine;namespace Lesson
{using System;using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson31 : MonoBehaviour{// 在Start方法中啟動LoadText協程private void Start(){StartCoroutine(Upload());}IEnumerator Upload(){// 創建一個包含要上傳的數據的列表var data = new List<IMultipartFormSection>{// 添加一個名為Name的表單字段,值為xxxnew MultipartFormDataSection("Name", "xxx"),// 添加一個名為png的文件字段,值為test.png文件的內容new MultipartFormFileSection("png", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png")),// 添加一個名為txt的文本字段,值為12312321231232123new MultipartFormFileSection("txt", "12312321231232123"),};// 創建一個POST請求,將數據發送到指定的URLvar req = UnityWebRequest.Post("http://你的 IP 地址:8000/HTTP Server/", data);// 發送請求req.SendWebRequest();// 循環等待請求完成while (!req.isDone){// 打印上傳進度print(req.uploadProgress);// 打印已上傳的字節數print(req.uploadedBytes);// 等待一幀yield return null;}// 打印上傳進度print(req.uploadProgress);// 打印已上傳的字節數print(req.uploadedBytes);// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 打印上傳成功print("上傳成功");// req.downloadHandler.data}else{// 打印獲取失敗的信息print($"獲取失敗: {req.error} | {req.result} | {req.responseCode}");}}}
}

? 將腳本掛載到 Unity 場景上并運行,得到以下結果。

image-20250511121305306

? 在服務器文件夾中,可看到上傳了 2 個文件(注意要確認可以匿名訪問服務器,才可上傳成功)。

image-20250511121803853

3.3.3 PUT 上傳

  • 不是所有服務器都支持 PUT 方法。
  • 需要服務器端明確支持 PUT 請求處理。
IEnumerator UploadPut()
{var req = UnityWebRequest.Put("http://你的 IP 地址:8000/HTTP Server/", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png"));yield return req.SendWebRequest();if (req.result == UnityWebRequest.Result.Success){print("Put 上傳成功");}else{ }
}

4 自定義操作

? 自定義作指使用 UnityWebRequest 提供的底層功能來處理常規封裝方法無法滿足的需求,核心思想是將數據處理與網絡傳輸分離。通過自定義 DownloadHandler 和 UploadHandler,實現更靈活的數據獲取和上傳功能。

相關 API

// 1.構造函數
UnityWebRequest req = new UnityWebRequest();// 2.請求地址
req.url = "服務器地址";// 3.請求類型
req.method = UnityWebRequest.kHttpVerbPOST;// 4.進度
req.downloadProgress
req.uploadProgress// 5.超時設置
req.timeout = 2000;// 6.上傳、下載的字節數
req.downloadedBytes
req.uploadedBytes// 7.重定向次數 設置為0表示不進行重定向 可以設置次數
req.redirectLimit = 10;// 8.狀態碼、結果、錯誤內容
req.result
req.error
req.responseCode// 9.下載、上傳處理對象
req.downloadHandler
req.uploadHandler

4.1 下載資源

4.1.1 Unity 內置 Handler

處理器類型用途示例獲取數據方式特點
DownloadHandlerBuffer原始二進制數據new DownloadHandlerBuffer()handler.data最基礎的處理方式
DownloadHandlerFile直接保存到文件new DownloadHandlerFile(path)自動保存到指定路徑內存占用少,適合大文件
DownloadHandlerTexture圖片下載new DownloadHandlerTexture()handler.texture自動轉換為 Texture2D
DownloadHandlerAssetBundleAB 包下載new DownloadHandlerAssetBundle(url, crc)handler.assetBundle支持 CRC 校驗
DownloadHandlerAudioClip音頻下載UnityWebRequestMultimedia.GetAudioClip()DownloadHandlerAudioClip.GetContent(req)需要指定音頻類型

? DownloadHandler 的使用基本遵循以下模式:

  1. 創建 UnityWebRequest 對象:指定 URL 和請求方法。
  2. 創建特定類型的 DownloadHandler:根據要下載的數據類型選擇。
  3. 將 DownloadHandler 賦給請求對象:req.downloadHandler = handler
  4. 發送請求:yield return req.SendWebRequest()
  5. 處理結果:檢查req.result,成功后通過 handler 獲取數據。

DownLoadTexture 示例

IEnumerator DownLoadTexture()
{// 創建一個UnityWebRequest對象,用于發送HTTP請求var req = new UnityWebRequest("http://你的 IP 地址:8000/Http Server/test.png",UnityWebRequest.kHttpVerbGET);// 創建一個DownloadHandlerTexture對象,用于處理下載的紋理var textureHandler = new DownloadHandlerTexture();// 將DownloadHandlerTexture對象賦值給UnityWebRequest對象的downloadHandler屬性req.downloadHandler = textureHandler;// 發送HTTP請求yield return req.SendWebRequest();// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 將下載的紋理賦值給Image對象的texture屬性Image.texture = textureHandler.texture;}else{// 打印錯誤信息print("獲取數據失敗" + req.result + req.error + req.responseCode);}
}

DownLoadAB 示例

IEnumerator DownLoadAB()
{// 創建一個UnityWebRequest對象,用于發送HTTP請求var req = new UnityWebRequest("http://你的 IP 地址:8000/Http Server/ab", UnityWebRequest.kHttpVerbGET);// 創建一個DownloadHandlerAssetBundle對象,用于處理下載的AssetBundle// 第二個參數需要已知校檢碼才能進行比較,檢查完整性。如果不知道的話只能傳0,不進行完整性的檢查// 所以一般只有進行AB包熱更新時,服務器發送對應的文件列表中包含了驗證碼才能進行檢查var handler = new DownloadHandlerAssetBundle(req.url, 0);// 將DownloadHandlerAssetBundle對象賦值給UnityWebRequest對象的downloadHandler屬性req.downloadHandler = handler;// 發送HTTP請求yield return req.SendWebRequest();// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 獲取下載的AssetBundlevar ab = handler.assetBundle;// 打印AssetBundle的名稱print(ab.name);}// 如果請求失敗else{// 打印錯誤信息print("獲取數據失敗" + req.result + req.error + req.responseCode);}
}

DownLoadAudioClip 示例

IEnumerator DownLoadAudioClip()
{// 創建一個UnityWebRequestMultimedia對象,用于獲取音頻文件var req = UnityWebRequestMultimedia.GetAudioClip("http://你的 IP 地址:8000/Http Server/Night Changes.mp3", AudioType.MPEG);// 發送網絡請求yield return req.SendWebRequest();// 如果請求成功if (req.result == UnityWebRequest.Result.Success){// 獲取音頻文件內容var a = DownloadHandlerAudioClip.GetContent(req);}// 如果請求失敗else{// 打印錯誤信息print("獲取數據失敗" + req.result + req.error + req.responseCode);}
}

? DownLoadAudioClip 中,由于創建時不是 new UnityWebRequest(),而是指定了特殊的創建方法。因此不設置 DownloadHandlerAudioClip,而是通過 DownloadHandlerAudioClip 獲得音頻文件。

4.1.2 自定義 Handler

? 以上這些類是 Unity 中實現的用于解析下載下來的數據的類,使用對應的類處理下載數據,他們就會在內部將下載的數據處理為對應的類型。

? DownloadHandlerScript 是一個特殊類,本身而言不會執行任何操作。但此類可由用戶定義的類繼承,接收來自 UnityWebRequest 系統的回調,然后使用這些回調在數據從網絡到達時執行完全自定義的數據處理。

自定義下載器

public class CustomDownLoadFileHandler : DownloadHandlerScript
{// 用于保存本地存儲時的路徑private string _savePath;// 用于緩存收到的數據的容器private byte[] _cacheBytes;// 這是當前已收到的數據長度private int _index = 0;public CustomDownLoadFileHandler() : base(){ }public CustomDownLoadFileHandler(byte[] bytes) : base(bytes){ }public CustomDownLoadFileHandler(string path) : base(){_savePath = path;}protected override byte[] GetData(){// 返回字節數組return _cacheBytes;}/// <summary>/// 從網絡收到數據后,每幀會自動調用的方法/// </summary>protected override bool ReceiveData(byte[] data, int dataLength){Debug.Log("收到數據長度:" + data.Length);Debug.Log("收到數據長度dataLength:" + dataLength);data.CopyTo(_cacheBytes, _index);_index += dataLength;return true;}/// <summary>/// 從服務器收到 Content-Length標頭時,會自動調用的方法/// </summary>protected override void ReceiveContentLengthHeader(ulong contentLength){// base.ReceiveContentLengthHeader(contentLength);Debug.Log("收到數據長度:" + contentLength);// 根據收到的標頭,決定字節數組容器的大小_cacheBytes = new byte[contentLength];}/// <summary>/// 當消息收完了會自動調用的方法/// </summary>protected override void CompleteContent(){Debug.Log("消息收完");// 把收到的字節數組進行自定義處理,我們在這處理成存儲到本地File.WriteAllBytes(_savePath, _cacheBytes);}
}

使用自定義下載器

using UnityEngine;namespace Lesson
{using System.Collections;using System.IO;using UnityEngine.Networking;using UnityEngine.UI;public class Lesson32 : MonoBehaviour{// 在Start方法中啟動LoadText協程private void Start(){StartCoroutine(DownLoadCustomHandler());}IEnumerator DownLoadCustomHandler(){// 創建一個UnityWebRequest對象,用于發送HTTP請求var req = new UnityWebRequest("http://你的 IP 地址:8000/Http Server/Night Changes.mp3", UnityWebRequest.kHttpVerbGET);// 使用自定義的下載處理對象來處理獲取到的2進制字節數組req.downloadHandler = new CustomDownLoadFileHandler(Application.streamingAssetsPath + "/Night Changes.mp3");// 發送HTTP請求yield return req.SendWebRequest();// 判斷請求是否成功if (req.result == UnityWebRequest.Result.Success){// 打印成功信息print("存儲本地成功");}else{// 打印失敗信息print("獲取數據失敗" + req.result + req.error + req.responseCode);}}public class CustomDownLoadFileHandler : DownloadHandlerScript{...}}
}

4.2 上傳資源

? UnityWebRequest 類的常用操作中,上傳數據相關內容已經封裝的很好了,可以很方便的上傳參數和文件,因此使用常用操作已經能夠滿足常用需求,以下內容主要做了解。

? UnityWebRequest 提供了兩種主要的上傳數據處理方式:

  1. UploadHandlerRaw - 用于上傳字節數組數據。
  2. UploadHandlerFile - 用于上傳文件數據。

? 這些上傳處理器會自動處理數據轉換和傳輸過程,只需提供原始數據即可。

4.2.1 UploadHandlerRaw

  • 功能:上傳原始字節數組數據。
  • 特點
    • 適合上傳結構化數據如 JSON、XML 等。
    • 需要手動設置 contentType。
    • 數據會被復制到 native 內存中。
IEnumerator UpLoadRaw()
{// 創建一個UnityWebRequest對象,指定請求的URL和請求方法var req = new UnityWebRequest("http://你的 IP 地址:8000/Http Server/", UnityWebRequest.kHttpVerbPOST);// 將字符串轉換為字節數組byte[] bytes = Encoding.UTF8.GetBytes("123123123123123");// 設置上傳處理程序,將字節數組作為上傳數據req.uploadHandler = new UploadHandlerRaw(bytes);// 設置上傳處理程序的Content-Type為application/octet-streamreq.uploadHandler.contentType = "application/octet-stream";// 發送請求,并等待響應yield return req.SendWebRequest();// 打印請求結果print(req.result);
}

4.2.2 UploadHandlerFile

  • 功能:直接上傳文件內容。
  • 特點
    • 適合上傳大文件,內存占用低。
    • 文件會分塊讀取和上傳。
    • 默認 contentType 為 application/octet-stream
IEnumerator UpLoadFile()
{// 創建一個UnityWebRequest對象,指定請求的URL和請求方法var req = new UnityWebRequest("http://你的 IP 地址:8000/Http Server/", UnityWebRequest.kHttpVerbPOST);// 設置上傳文件的路徑req.uploadHandler = new UploadHandlerFile(Application.streamingAssetsPath + "/test.png");// 發送請求并等待響應yield return req.SendWebRequest();// 打印請求結果print(req.result);
}

? UploadHandler 會自動處理 contentType,優先級如下:

  1. 如果在 UnityWebRequest 上手動設置了 Content-Type 頭,則使用該值。
  2. 如果在 UploadHandler 上設置了 contentType,則使用該值。
  3. 默認使用 application/octet-stream

常見 contentType 值

  • application/json - JSON數據
  • application/xml - XML數據
  • image/png - PNG圖片
  • application/octet-stream - 二進制流(默認)

注意事項

  1. UnityWebRequest 默認會在 Dispose 時自動釋放 uploadHandler。

  2. 如果需要保留 uploadHandler 引用,需設置

    req.disposeUploadHandlerOnDispose = false;
    
  3. 使用 using 語句確保資源釋放。

    using(UnityWebRequest req = new UnityWebRequest(...))
    {// 使用請求
    }
    

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

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

相關文章

GitHub 趨勢日報 (2025年05月09日)

本日報由 TrendForge 系統生成 https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日整體趨勢 Top 10 排名項目名稱項目描述今日獲星總星數語言1voideditor/void? 1879? 15214TypeScript2ruanyf/weekly科技愛好者周刊&…

.NET MAUI 基礎知識

文章目錄 什么是 .NET MAUI&#xff1f;MAUI的核心特點與Xamarin.Forms的區別 開發環境搭建安裝Visual Studio 2022安裝必要組件配置Android開發環境配置iOS開發環境驗證安裝 創建第一個MAUI應用創建新項目MAUI項目結構解析理解關鍵文件運行應用程序簡單修改示例使用熱重載 MAU…

卷積神經網絡全連接層詳解:特征匯總、FCN替代與性能影響分析

【內容摘要】 本文聚焦卷積神經網絡&#xff08;CNN&#xff09;的全連接層&#xff0c;詳細介紹其將二維特征圖轉化為一維向量的過程&#xff0c;闡述全卷積網絡&#xff08;FCN&#xff09;如何通過轉置卷積替代全連接層以實現像素級分類&#xff0c;并分析全連接層對圖像分類…

在C++中進行套接字編程時,主要使用以下頭文件

目錄 一.基本套接字頭文件<sys/socket.h><netinet/in.h><arpa/inet.h><unistd.h><netdb.h> 二. 完整示例頭文件包含三. 注意事項 在C中進行套接字編程時&#xff0c;主要使用以下頭文件&#xff1a; 一.基本套接字頭文件 <sys/socket.h>…

【Linux網絡】HTTP

應用層協議 HTTP 前置知識 我們上網的所有行為都是在做IO&#xff0c;&#xff08;我的數據給別人&#xff0c;別人的數據給我&#xff09;圖片。視頻&#xff0c;音頻&#xff0c;文本等等&#xff0c;都是資源答復前需要先確認我要的資源在哪臺服務器上&#xff08;網絡IP&…

JAVA異常體系

在 Java 里&#xff0c;異常體系是其錯誤處理機制的核心內容&#xff0c;它能夠幫助開發者有效應對程序運行時出現的各種意外狀況。 異常體系的基本架構 它主要包含兩個重要分支&#xff1a; Error&#xff08;錯誤&#xff09;&#xff1a;這類異常是程序自身無法處理的嚴重…

vue 去掉右邊table的下拉條與下面的白色邊框并補充滿

::v-deep table {width: 100% !important; } ::v-deep .el-table::after, .el-table::before {display: none !important; }/* 隱藏滾動條但保留滾動功能 */ ::v-deep .el-table__body-wrapper::-webkit-scrollbar {width: 0 !important;height: 0 !important; }::v-deep .el-t…

uniapp+vue3+uview來開發我們的項目

前言&#xff1a; 就像我們vue的web的框架element、iview等一樣&#xff0c;我們的uni-app開發也有適合的他的框架&#xff0c;除了他本身的擴展組件以外&#xff0c;第三方好用的就是就是uview了。 實現效果&#xff1a; 官網信息&#xff1a; vue2版本&#xff1a;uview-ui …

數據倉庫:企業數據管理的核心引擎

一、數據倉庫的由來 數據倉庫&#xff08;Data Warehouse, DW&#xff09;概念的誕生源于企業對數據價值的深度挖掘需求。在1980年代&#xff0c;隨著OLTP&#xff08;聯機事務處理&#xff09;系統在企業中的普及&#xff0c;傳統關系型數據庫在處理海量數據分析時顯露出明顯瓶…

YOLOv12模型部署(保姆級)

一、下載YOLOv12源碼 1.通過網盤分享的文件&#xff1a;YOLOv12 鏈接: https://pan.baidu.com/s/12-DEbWx1Gu7dC-ehIIaKtQ 提取碼: sgqy &#xff08;網盤下載&#xff09; 2.進入github克隆YOLOv12源碼包 二、安裝Anaconda/pycharm 點擊獲取官網鏈接(anaconda) 點擊獲取…

一篇解決Redis:持久化機制

目錄 認識持久化 持久化方案 RDB&#xff08;Redis DataBase&#xff09; 手動觸發 自動觸發 小結 AOF(Append-Only File) AOF緩沖區刷新機制 AOF重寫機制 AOF重寫流程 ?編輯 混合持久化 認識持久化 我們都知道Mysql有四大特征&#xff0c;原子性&#xff0c;持久…

從 Vue3 回望 Vue2:事件總線的前世今生

從 Vue3 回望 Vue2&#xff1a;事件總線的前世今生 以 Vue3 開發者視角回顧 Vue2 中事件總線機制 的文章。文章將圍繞事件總線的緣起、用法、局限與演進展開&#xff0c;幫助 Vue3 開發者理解 Vue2 通信方式的歷史意義及現代替代方案。 一、前言&#xff1a;Vue3 時代&#xff…

CSS結構性偽類、UI偽類與動態偽類全解析:從文檔結構到交互狀態的精準選擇

一、結構性偽類選擇器&#xff1a;文檔樹中的位置導航器 結構性偽類選擇器是CSS中基于元素在HTML文檔樹中的層級關系、位置索引或結構特征進行匹配的一類選擇器。它們無需依賴具體的類名或ID&#xff0c;僅通過文檔結構即可精準定位元素&#xff0c;是實現響應式布局和復雜文檔…

【SSL證書系列】SSL證書工作原理解讀

SSL&#xff08;Secure Sockets Layer&#xff09;及其繼任者TLS&#xff08;Transport Layer Security&#xff09;是用于保護網絡通信安全的加密協議。SSL證書是實現HTTPS協議的核心&#xff0c;其工作原理涉及加密技術、身份驗證和信任機制。以下是其工作原理的詳細分步解析…

第二十四天打卡

import os os.getcwd() os.listdir() path_a r"C:\Users\renshuaicheng\Documents" path_b "MyProjectData" file "results.csv" file_path os.path.join(path_a,path_b,file) file_path import osstart_directory os.getcwd() # 假設這個目…

【CUDA】Sgemm單精度矩陣乘法(下)

目錄 前言1. 優化技巧5&#xff1a;使用register模擬二級緩存&#xff08;內積轉外積&#xff09;2. 優化技巧6&#xff1a;使用register模擬二級緩存 float43. 優化技巧7&#xff1a;global memory轉置再存放shared memory4. 優化技巧8&#xff1a;使用double buffer加速矩陣…

【1000以內具有12個以上因子的整數并輸出它的因子】2021-12-27

緣由c語言輸入1000以內具有12個以上因子的整數 并輸出它的因子-編程語言-CSDN問答 int 求因子個數(int 數, int* 因子 { 0 }) {//緣由https://bbs.csdn.net/topics/399168406int 和 0, 求 1, 商 0, 含 0;//因子不含1和數本身while (求 < (商 數 / 求))if (!(數 % 求)…

C#中的dynamic與var:看似相似卻迥然不同

在C#編程的世界里&#xff0c;var和dynamic這兩個關鍵字常常讓初學者感到困惑。它們看起來都在定義變量時省略了顯式類型聲明&#xff0c;但實際上它們的工作方式和應用場景有著天壤之別。今天&#xff0c;讓我們一起揭開這兩個關鍵字的神秘面紗。 var&#xff1a;編譯時的類型…

流速儀數據處理及流量斷面線繪制

1 需求描述 在實際航道測量項目中&#xff0c;有測量斷面線流量流速的需求&#xff0c;得使用流速儀在現場進行測量&#xff0c;相關操作在之前已經寫了記錄。本次手冊記錄后期數據處理與流量線繪制&#xff0c;以該區域為例。 流速儀設備操作說明 2 規范要求 3 流量斷面表格…

購物車構件示例

通用購物車構件設計 注:代碼僅用于演示原理,不可用于生產環境。 一、設計目標 設計一個高度可復用的購物車構件,具備以下特點: 與具體業務系統解耦支持多種應用場景(商城、積分系統等)提供標準化接口易于集成和擴展二、核心架構設計 1. 分層架構 ┌─────────…