主頁 > 企業開發 > 基于SqlSugar的開發框架循序漸進介紹(26)-- 實作本地上傳、FTP上傳、阿里云OSS上傳三者合一處理

基于SqlSugar的開發框架循序漸進介紹(26)-- 實作本地上傳、FTP上傳、阿里云OSS上傳三者合一處理

2023-04-11 08:17:32 企業開發

在前面介紹的隨筆《基于SqlSugar的開發框架循序漸進介紹(7)-- 在檔案上傳模塊中采用選項模式【Options】處理常規上傳和FTP檔案上傳》中介紹過在檔案上傳處理的程序中,整合了本地檔案上傳和基于FTP方式的上傳檔案的處理整合,本篇隨筆繼續介紹檔案上傳的處理,基于選項模式【Options】方式整合基于阿里云OSS物件存盤的處理方式,

1、選項模式【Options】的處理

檔案上傳處理應該由程式進行配置,決定使用那種方式,那么這里面我們為了彈性化處理, 在檔案上傳模塊中采用選項模式【Options】處理常規上傳和FTP檔案上傳的配置引數資訊,

微軟引入選項模式,它是用于配置框架服務使用的設定. 選項模式由Microsoft.Extensions.OptionsNuGet包實作,除了ASP.NET Core應用,它還適用于任何型別的應用程式,如果需要了解,微軟的檔案詳細解釋了選項模式,

選項模式的限制之一是你只能決議(注入) IOptions <MyOptions> 并在依賴注入配置完成(即所有模塊的ConfigureServices方法完成)后獲取選項值,如果你正在開發一個模塊,可能需要讓開發者能夠設定一些選項,并在依賴注入注冊階段使用這些選項. 你可能需要根據選項值配置其他服務或更改依賴注入的注冊代碼,IOptions<>是單例,因此一旦生成了,除非通過代碼的方式更改,它的值是不會更新的,

 之前介紹過的檔案上傳處理,

一個是本地檔案處理,一個是FTP檔案處理,它們選擇那種方式,依賴于配置引數的資訊,如下示意圖所示,

當我們增加了物件存盤OSS方式后,可以擴展下這個圖示如下所示,

在本地檔案處理程序中,如果是Web API方式呼叫服務層,那么就在Web API所在的檔案系統中,如果是Winform界面直接呼叫服務層,那么就是在當前系統中處理檔案,這種方式可以有效的管理我們的檔案資訊,

在FTP檔案處理程序中,則是根據選項引數的資訊,呼叫FluentFTP類別庫進行檔案的上傳操作,

在OSS物件存盤處理程序中,我們一般基于阿里云、騰訊云等這些云服務OSS的處理方式,一般它們會提供相應開發語言的SDK,我們參考并進行整合即可,

基于選項模式,根據我們的處理方式,我們定義一個物件,用于承載上傳引數的資訊,如下代碼所示,

    /// <summary>
    /// 檔案上傳處理的選項資訊
    /// </summary>
    public class UploadSettingOptions
    {
        /// <summary>
        /// 可指定的存盤物理地址,如C:\\Attachment,如果沒有配置項AttachmentBasePath,則默認一個相對目錄,
        /// </summary>
        public string AttachmentBasePath { get; set; }

        /// <summary>
        /// 指定附件上傳的方式,如ftp為FTP方式,為空則為普通方式
        /// </summary>
        public string AttachmentUploadType { get; set; }


        /// <summary>
        /// FTP上傳配置
        /// </summary>
        public FtpProviderOptions FtpProvider { get; set; }

        /// <summary>
        /// OSS存盤的配置
        /// </summary>
        public OSSProviderOptions OSSProvider { get; set; }
    }

其中本地介紹OSS存盤處理的配置選項物件如下所示,

    /// <summary>
    /// OSS物件存盤配置選項
    /// </summary>
    public sealed class OSSProviderOptions
    {
        /// <summary>
        /// 指定提供商
        /// </summary>
        public OSSProvider Provider { get; set; }
        /// <summary>
        /// 終結點
        /// </summary>
        public string Endpoint { get; set; }
        public string AccessKey { get; set; }
        public string SecretKey { get; set; }
        public string Region { get; set; }
        public bool IsEnableHttps { get; set; } = true;
        public bool IsEnableCache { get; set; }
        public string Bucket { get; set; }
    }

對應WebAPI的appSettngs.json檔案配置項內容如下:

 

2、阿里云的OSS存盤設定處理

對于阿里云的OSS來說,對應的AccesKey和SecretKey自己可以通過查看賬戶的資訊可以獲取到,

我們開始需要添加一個Bucket節點,用來存放相關的檔案,并且需要開啟對應的權限,如下所示,

一旦正式允許可以上傳檔案,那么檔案存盤在對應的Bucket專案中,如下所示,

 準備好這些前期作業后,我們如果需要在WebAPI端進行OSS存盤的處理,可以利用阿里云的OSS 的SDK進行處理即可,如下所示,

 SDK的常規使用很簡單,我們可以參考它的aliyun-oss-csharp-sdk 案例來上傳處理即可,

例如它的上傳檔案的處理代碼如下所示:

    OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret); 
    client.PutObject(bucketName, key, filePathToUpload);

在檔案處理的通用上傳處理函式里面,我們根據配置內容選擇不同的上傳模式,

        /// <summary>
        /// 上傳檔案(根據組態檔選擇合適的上傳方式)
        /// </summary>
        /// <param name="info">檔案資訊(包含流資料)</param>
        /// <returns></returns>
        public async Task<CommonResult> Upload(FileUploadInfo info)
        {
            var uploadType = this._options.AttachmentUploadType;

            if (string.IsNullOrEmpty(uploadType))
            {
                return await this.UploadByNormal(info);
            }
            else if (uploadType.Equals("ftp", StringComparison.OrdinalIgnoreCase))
            {
                return await this.UploadByFTP(info);
            }
            else if(uploadType.Equals("oss", StringComparison.OrdinalIgnoreCase))
            {
                return await this.UploadByOSS(info);
            }
            else
            {
                throw new ArgumentException("AttachmentUploadType配置指定了無效的值, 請置空, 填寫ftp或者填寫oss,");
            }
        }

由于本篇主要介紹OSS的物件存盤方式,因此我們來看看對應的OSS上傳處理的操作,

和其他上傳(如FTP上傳)方式類似,我們也是構建對應的資訊后呼叫OSS的SDK處理即可,如下代碼所示,

/// <summary>
/// 使用阿里云的OSS服務上傳檔案
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public async Task<CommonResult> UploadByOSS(FileUploadInfo info)
{
    var result = new CommonResult();
    var ossOptions = this._options.OSSProvider;
    if(ossOptions != null)
    {
        //上傳獲得的相對路徑
        string category = info.Category;
        if (string.IsNullOrEmpty(category))
        {
            category = "Photo";
        }

        //OSS的檔案路徑不能以正斜線(/)或者反斜線(\)字符開頭,
        //確定日期時間目錄(格式:yyyy-MM),不存在則創建
        string savePath = string.Format("{0}-{1:D2}/{2}", DateTime.Now.Year, DateTime.Now.Month, category);
        var ext = FileUtil.GetExtension(info.FileName);
        var finalName = string.Format("{0}{1}", Guid.NewGuid().ToString(), ext);//FileUtil.GetFileName(file);

        var filePath = string.Concat(savePath, "/", finalName);
        var stream = FileUtil.BytesToStream(info.FileData);

        //使用阿里云的OSS服務上傳檔案
        var client = new OssClient(ossOptions.Endpoint, ossOptions.AccessKey, ossOptions.SecretKey);
        client.PutObject(ossOptions.Bucket, filePath, stream);

        //基礎路徑和部分路徑
        info.BasePath = $"{(ossOptions.IsEnableHttps ? "https" : "http")}://{ossOptions.Bucket}.{ossOptions.Endpoint}";
        info.SavePath = filePath;
        info.AddTime = DateTime.Now;


        result.Success = await base.InsertAsync(info);
        if (result.Success)
        {
            //記錄回傳值, Data1為具體的URL路徑
            //生成外鏈地址 方便前端預覽
            result.Data1 = info.BasePath.UriCombine(savePath);
            result.Data2 = savePath;
        }
        else
        {
            result.ErrorMessage = "資料寫入資料庫出錯,";
        }
    }
    else
    {
        result.ErrorMessage = "OSS配置資訊不正確或沒有啟用";
    }

    return result;
}

最終我們上傳的檔案串列如上圖所示,

 

3、在Vue3+ElementPlus+Vite的前端專案上測驗前端上傳檔案的處理

我們在一個前端的編輯器 @wangeditor 上整合圖片上傳的處理來展示這個OSS物件保存的操作,案例需要前端專案安裝對應的插件,如下所示,

 前端頁面參考插件物件的代碼如下所示

    <div class="wangeditor">
      <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" />
      <Editor style="height: 500px; overflow-y: hidden" v-model="valueHtml" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" />
    </div>

在腳本代碼中引入物件的樣式和物件,

<script setup lang="ts">
import '@wangeditor/editor/dist/css/style.css'; // 引入 css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';


defineOptions({
  name: 'Editor'
});

const mode = 'default';
// 編輯器實體,必須用 shallowRef
const editorRef = shallowRef();

為了配置上傳圖片檔案的處理操作,我們需要根據編輯器的介紹,以及我們WebAPI端的處理函式定義,在腳本部分中增加對應的配置資訊,如下代碼所示

const editorConfig = {
  placeholder: '請輸入內容...',
  MENU_CONF: {
    // 配置默認字號
    // 配置上傳圖片
    uploadImage: {
      // 上傳圖片請求介面路徑
      server: '/api/FileUpload/PostUpload',
      // 后端接收的檔案名稱
      fieldName: 'multipartFile',
      maxFileSize: 10 * 1024 * 1024, // 上傳圖片10M
      // 上傳的圖片型別
      allowedFileTypes: ['image/*'],
      // 自定義增加 http  header
      headers: {
        Authorization: 'Bearer ' + getAccessToken()
      },
      // 自定義上傳引數,例如傳遞驗證的 token 等,引數會被添加到 formData 中,一起上傳到服務端,
      meta: {
        guid: '',
        folder: '檔案圖片'
      },
      // 將 meta 拼接到 url 引數中,默認 false
      metaWithUrl: false,
      // 小于該值就插入 base64 格式(而不上傳),默認為 0
      base64LimitSize: 10 * 1024, // 10MB
      // 自定義上傳圖片回傳格式【后端回傳的格式】
      customInsert(res: any, insertFn: InsertFnType) {
        console.log(res);
        if (!res.success) {
          ElMessage.error('上傳檔案失敗,' + res.error);
          return;
        }
        // 從 res 中找到 url alt href ,然后插入圖片 ,根據后端實際回傳的欄位來
        var result = res.result as Array<ResponseFileInfo>;
        if (result.length > 0) {
          console.log(result[0]);
          insertFn(result[0].url, result[0].name, result[0].url);
        }
      },
      // 單個檔案上傳成功之后
      onSuccess(file: File, res: any) {
        if (res.success) {
          ElMessage.success(`${file.name} 上傳成功`);
          return;
        } else {
          ElMessage.warning(`${file.name} 上傳出了點例外`);
          return;
        }
      },
      // 單個檔案上傳失敗
      onFailed(file: File, res: any) {
        console.log(res);
        ElMessage.error(`${file.name} 上傳失敗`);
      },
      // 上傳錯誤,或者觸發 timeout 超時
      one rror(file: File, err: any, res: any) {
        console.log(err, res);
        ElMessage.error(`${file.name} 上傳出錯`);
      }
    }
  }
};

其中主要的就是需要增加授權的令牌頭部資訊,以及對應上傳需要用到的引數,還有就是回傳的介面物件里面,需要根據Web API的定義,然后轉換為本地識別的類別進行展示即可,如定義的 customInsert 函式

 

 檔案上傳成功后,可以看到在編輯器中插入了對應的圖片檔案,圖片地址指向的是阿里云OSS的路徑,

在資料庫的檔案記錄中,我們可以看到對應的路徑資訊,如下所示,

如果我們需要在專案中實作業務的圖片上傳功能,如下界面所示的效果,

可以參考隨筆《基于SqlSugar的開發框架循序漸進介紹(13)-- 基于ElementPlus的上傳組件進行封裝,便于專案使用》介紹內容進行自定義上傳檔案的處理即可,

<el-form-item label="資料檔案">
     <my-upload v-model="viewForm.attachGUID" :data="{ guid: viewForm.attachGUID, folder: '用戶圖片' }"   disabled />
 </el-form-item>

 

以上就是我們針對不同的上傳方式處理的操作,對于OSS的檔案上傳,我們通過整合阿里云的OSS的SDK,直接呼叫進行處理即可,非常方便,對于其他類似的平臺,也可以針對它們提供的SDK進行擴展即可,

 

SqlSugar開發框架介紹:https://www.iqidi.com/Framework/sugarIndex.htm 

系列文章:

《基于SqlSugar的開發框架的循序漸進介紹(1)--框架基礎類的設計和使用》

《基于SqlSugar的開發框架循序漸進介紹(2)-- 基于中間表的查詢處理》

《基于SqlSugar的開發框架循序漸進介紹(3)-- 實作代碼生成工具Database2Sharp的整合開發》

《基于SqlSugar的開發框架循序漸進介紹(4)-- 在資料訪問基類中對GUID主鍵進行自動賦值處理 》

《基于SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面注入方式實作IOC控制反轉》

《基于SqlSugar的開發框架循序漸進介紹(6)-- 在基類介面中注入用戶身份資訊介面 》

《基于SqlSugar的開發框架循序漸進介紹(7)-- 在檔案上傳模塊中采用選項模式【Options】處理常規上傳和FTP檔案上傳》

 《基于SqlSugar的開發框架循序漸進介紹(8)-- 在基類函式封裝實作用戶操作日志記錄》

《基于SqlSugar的開發框架循序漸進介紹(9)-- 結合Winform控制元件實作欄位的權限控制》

《基于SqlSugar的開發框架循序漸進介紹(10)-- 利用axios組件的封裝,實作對后端API資料的訪問和基類的統一封裝處理》

《基于SqlSugar的開發框架循序漸進介紹(11)-- 使用TypeScript和Vue3的Setup語法糖撰寫頁面和組件的總結》

《基于SqlSugar的開發框架循序漸進介紹(12)-- 拆分頁面模塊內容為組件,實作分而治之的處理》

《基于SqlSugar的開發框架循序漸進介紹(13)-- 基于ElementPlus的上傳組件進行封裝,便于專案使用》

《基于SqlSugar的開發框架循序漸進介紹(14)-- 基于Vue3+TypeScript的全域物件的注入和使用》

 《基于SqlSugar的開發框架循序漸進介紹(15)-- 整合代碼生成工具進行前端界面的生成》

《基于SqlSugar的開發框架循序漸進介紹(16)-- 作業流模塊的功能介紹》

《基于SqlSugar的開發框架循序漸進介紹(17)-- 基于CSRedis實作快取的處理》

 《基于SqlSugar的開發框架循序漸進介紹(18)-- 基于代碼生成工具Database2Sharp,快速生成Vue3+TypeScript的前端界面和Winform端界面》

《基于SqlSugar的開發框架循序漸進介紹(19)-- 基于UniApp+Vue的移動前端的功能介紹》

《基于SqlSugar的開發框架循序漸進介紹(20)-- 在基于UniApp+Vue的移動端實作多條件查詢的處理》

《基于SqlSugar的開發框架循序漸進介紹(21)-- 在作業流串列頁面中增加一些轉義資訊的輸出,在后端進行內容轉換》

 《基于SqlSugar的開發框架循序漸進介紹(22)-- Vue3+TypeScript的前端作業流模塊中實作統一的表單編輯和表單詳情查看處理 》

《基于SqlSugar的開發框架循序漸進介紹(23)-- Winform端管理系統中平滑增加對Web API對接的需求》

《基于SqlSugar的開發框架循序漸進介紹(24)-- 使用Serialize.Linq對Lambda運算式進行序列化和反序列化 》

 基于SqlSugar的開發框架循序漸進介紹(25)-- 基于SignalR實作多端的訊息通訊

基于SqlSugar的開發框架循序漸進介紹(26)-- 實作本地上傳、FTP上傳、阿里云OSS上傳三者合一處理

 

專注于代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用,著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品,
轉載請注明出處:撰寫人:伍華聰 http://www.iqidi.com

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/549688.html

標籤:其他

上一篇:CSS樣式中顏色與顏色值的應用

下一篇:低代碼 系列 —— 中后臺集成低代碼預研

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more