HarmonyOS:Navigation實現導航之頁面設置和路由操作

導讀

  • 設置標題欄模式
  • 設置菜單欄
  • 設置工具欄
  • 路由操作
    • 頁面跳轉
    • 頁面返回
    • 頁面替換
    • 頁面刪除
    • 移動頁面
    • 參數獲取
    • 路由攔截
  • 子頁面
    • 頁面顯示類型
    • 頁面生命周期
    • 頁面監聽和查詢
  • 頁面轉場
    • 關閉轉場
    • 自定義轉場
    • 共享元素轉場
  • 跨包動態路由
    • 系統路由表
    • 自定義路由表
  • 示例代碼

Navigation組件適用于模塊內和跨模塊的路由切換,通過組件級路由能力實現更加自然流暢的轉場體驗,并提供多種標題欄樣式來呈現更好的標題和內容聯動效果。一次開發,多端部署場景下,Navigation組件能夠自動適配窗口顯示大小,在窗口較大的場景下自動切換分欄展示效果。

本文從組件導航(Navigation)的顯示模式、路由操作、子頁面管理、跨包跳轉以及跳轉動效等幾個方面進行詳細介紹。

Navigation組件主要包含?導航頁和子頁。導航頁由標題欄(包含菜單欄)、內容區和工具欄組成,可以通過hideNavBar屬性進行隱藏,導航頁不存在頁面棧中,與子頁,以及子頁之間可以通過路由操作進行切換。

在API Version 9上,Navigation需要配合NavRouter組件實現頁面路由。從API Version 10開始,更推薦使用NavPathStack實現頁面路由。

設置標題欄模式

標題欄在界面頂部,用于呈現界面名稱和操作入口,Navigation組件通過titleMode屬性設置標題欄模式。

說明
Navigation或NavDestination未設置主副標題并且沒有返回鍵時,不顯示標題欄。

  • Mini模式
    普通型標題欄,用于一級頁面不需要突出標題的場景。

    Navigation() {// ...
    }
    .titleMode(NavigationTitleMode.Mini)
    

    Mini模式標題欄

  • Full模式
    強調型標題欄,用于一級頁面需要突出標題的場景。

    Navigation() {// ...
    }
    .titleMode(NavigationTitleMode.Full)
    

    Full模式標題欄

設置菜單欄

菜單欄位于Navigation組件的右上角,可以通過menus屬性進行設置。
menus支持Array和CustomBuilder兩種參數類型。
使用Array類型時,豎屏最多支持顯示3個圖標,橫屏最多支持顯示5個圖標,多余的圖標會被放入自動生成的更多圖標。

  • 設置了3個圖標的菜單欄
    設置了3個圖標的菜單欄

    let TooTmp: NavigationMenuItem = {'value': "", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
    let TooTmpFromResource: NavigationMenuItem = {'value': "", 'icon': "resources/base/media/ic_public_highlights.svg", 'action': ()=> {}}
    Navigation() {// ...
    }
    .menus([TooTmp,TooTmp,TooTmp])
    
  • 設置了4個圖標的菜單欄
    設置了4個圖標的菜單欄

    let TooTmp: NavigationMenuItem = {'value': "", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
    Navigation() {// ...
    }
    // 豎屏最多支持顯示3個圖標,多余的圖標會被放入自動生成的更多圖標。
    .menus([TooTmp,TooTmp,TooTmp,TooTmp])
    

設置工具欄

工具欄位于Navigation組件的底部,開發者可以通過toolbarConfiguration屬性進行設置。
底部的工具欄

let TooTmp: ToolbarItem = {'value': "func", 'icon': "./image/ic_public_highlights.svg", 'action': ()=> {}}
let TooBar: ToolbarItem[] = [TooTmp,TooTmp,TooTmp]
Navigation() {// ...
}
.toolbarConfiguration(TooBar)

路由操作

Navigation路由相關的操作都是基于頁面棧NavPathStack提供的方法進行,每個Navigation都需要創建并傳入一個NavPathStack對象,用于管理頁面。主要涉及頁面跳轉、頁面返回、頁面替換、頁面刪除、參數獲取、路由攔截等功能。

不建議通過監聽生命周期的方式管理自己的頁面棧。



struct Index {// 創建一個頁面棧對象并傳入NavigationpageStack: NavPathStack = new NavPathStack()build() {Navigation(this.pageStack) {}.title('Main')}
}

頁面跳轉

NavPathStack通過Push相關的接口去實現頁面跳轉的功能,主要分為以下三類:

  • 普通跳轉,通過頁面的name去跳轉,并可以攜帶param。

    this.pageStack.pushPath({ name: "PageOne", param: "PageOne Param" })
    this.pageStack.pushPathByName("PageOne", "PageOne Param")
    
  • 帶返回回調的跳轉,跳轉時添加onPop回調,能在頁面出棧時獲取返回信息,并進行處理。

    this.pageStack.pushPathByName('PageOne', "PageOne Param", (popInfo) => {console.log('Pop page name is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result))
    });
    
  • 帶錯誤碼的跳轉,跳轉結束會觸發異步回調,返回錯誤碼信息。

    this.pageStack.pushDestination({name: "PageOne", param: "PageOne Param"}).catch((error: BusinessError) => {console.error(`Push destination failed, error code = ${error.code}, error.message = ${error.message}.`);}).then(() => {console.info('Push destination succeed.');});this.pageStack.pushDestinationByName("PageOne", "PageOne Param").catch((error: BusinessError) => {console.error(`Push destination failed, error code = ${error.code}, error.message = ${error.message}.`);}).then(() => {console.info('Push destination succeed.');});
    

頁面返回

NavPathStack通過Pop相關接口去實現頁面返回功能。

// 返回到上一頁
this.pageStack.pop()
// 返回到上一個PageOne頁面
this.pageStack.popToName("PageOne")
// 返回到索引為1的頁面
this.pageStack.popToIndex(1)
// 返回到根首頁(清除棧中所有頁面)
this.pageStack.clear()

頁面替換

NavPathStack通過Replace相關接口去實現頁面替換功能。

// 將棧頂頁面替換為PageOne
this.pageStack.replacePath({ name: "PageOne", param: "PageOne Param" })
this.pageStack.replacePathByName("PageOne", "PageOne Param")
// 帶錯誤碼的替換,跳轉結束會觸發異步回調,返回錯誤碼信息
this.pageStack.replaceDestination({name: "PageOne", param: "PageOne Param"}).catch((error: BusinessError) => {console.error(`Replace destination failed, error code = ${error.code}, error.message = ${error.message}.`);}).then(() => {console.info('Replace destination succeed.');})

頁面刪除

NavPathStack通過Remove相關接口去實現刪除頁面棧中特定頁面的功能。

// 刪除棧中name為PageOne的所有頁面
this.pageStack.removeByName("PageOne")
// 刪除指定索引的頁面
this.pageStack.removeByIndexes([1,3,5])
// 刪除指定id的頁面
this.pageStack.removeByNavDestinationId("1");

移動頁面

NavPathStack通過Move相關接口去實現移動頁面棧中特定頁面到棧頂的功能。

// 移動棧中name為PageOne的頁面到棧頂
this.pageStack.moveToTop("PageOne");
// 移動棧中索引為1的頁面到棧頂
this.pageStack.moveIndexToTop(1);

參數獲取

NavPathStack通過Get相關接口去獲取頁面的一些參數。

// 獲取棧中所有頁面name集合
this.pageStack.getAllPathName()
// 獲取索引為1的頁面參數
this.pageStack.getParamByIndex(1)
// 獲取PageOne頁面的參數
this.pageStack.getParamByName("PageOne")
// 獲取PageOne頁面的索引集合
this.pageStack.getIndexByName("PageOne")

路由攔截

NavPathStack提供了setInterception方法,用于設置Navigation頁面跳轉攔截回調。該方法需要傳入一個NavigationInterception對象,該對象包含三個回調函數:

名稱描述
willShow頁面跳轉前回調,允許操作棧,在當前跳轉生效。
didShow頁面跳轉后回調,在該回調中操作棧會在下一次跳轉生效。
modeChangeNavigation單雙欄顯示狀態發生變更時觸發該回調。

說明
無論是哪個回調,在進入回調時頁面棧都已經發生了變化。

可以在willShow回調中通過修改路由棧來實現路由攔截重定向的能力。

this.pageStack.setInterception({willShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",operation: NavigationOperation, animated: boolean) => {if (typeof to === "string") {console.log("target page is navigation home page.");return;}// 將跳轉到PageTwo的路由重定向到PageOnelet target: NavDestinationContext = to as NavDestinationContext;if (target.pathInfo.name === 'PageTwo') {target.pathStack.pop();target.pathStack.pushPathByName('PageOne', null);}}
})

子頁面

NavDestination是Navigation子頁面的根容器,用于承載子頁面的一些特殊屬性以及生命周期等。NavDestination可以設置獨立的標題欄和菜單欄等屬性,使用方法與Navigation相同。NavDestination也可以通過mode屬性設置不同的顯示類型,用于滿足不同頁面的訴求。

頁面顯示類型

  • 標準類型
    NavDestination組件默認為標準類型,此時mode屬性為NavDestinationMode.STANDARD。標準類型的NavDestination的生命周期跟隨其在NavPathStack頁面棧中的位置變化而改變。

  • 彈窗類型
    NavDestination設置mode為NavDestinationMode.DIALOG彈窗類型,此時整個NavDestination默認透明顯示。彈窗類型的NavDestination顯示和消失時不會影響下層標準類型的NavDestination的顯示和生命周期,兩者可以同時顯示。

    // Dialog NavDestination
    
    struct Index {('NavPathStack') pageStack: NavPathStack = new NavPathStack()PagesMap(name: string) {if (name == 'DialogPage') {DialogPage()}}build() {Navigation(this.pageStack) {Button('Push DialogPage').margin(20).width('80%').onClick(() => {this.pageStack.pushPathByName('DialogPage', '');})}.mode(NavigationMode.Stack).title('Main').navDestination(this.PagesMap)}}export struct DialogPage {('NavPathStack') pageStack: NavPathStack;build() {NavDestination() {Stack({ alignContent: Alignment.Center }) {Column() {Text("Dialog NavDestination").fontSize(20).margin({ bottom: 100 })Button("Close").onClick(() => {this.pageStack.pop()}).width('30%')}.justifyContent(FlexAlign.Center).backgroundColor(Color.White).borderRadius(10).height('30%').width('80%')}.height("100%").width('100%')}.backgroundColor('rgba(0,0,0,0.5)').hideTitleBar(true).mode(NavDestinationMode.DIALOG)}}
    

彈窗類型的NavDestination,代碼效果圖
彈窗類型的NavDestination

頁面生命周期

Navigation作為路由容器,其生命周期承載在NavDestination組件上,以組件事件的形式開放。

其生命周期大致可分為三類,自定義組件生命周期、通用組件生命周期和自有生命周期。其中,aboutToAppear和aboutToDisappear是自定義組件的生命周期(NavDestination外層包含的自定義組件),OnAppear和OnDisappear是組件的通用生命周期。剩下的六個生命周期為NavDestination獨有。

生命周期時序如下圖所示:
生命周期時序圖

  • aboutToAppear:在創建自定義組件后,執行其build()函數之前執行(NavDestination創建之前),允許在該方法中改變狀態變量,更改將在后續執行build()函數中生效。
  • onWillAppear:NavDestination創建后,掛載到組件樹之前執行,在該方法中更改狀態變量會在當前幀顯示生效。
  • onAppear:通用生命周期事件,NavDestination組件掛載到組件樹時執行。
  • onWillShow:NavDestination組件布局顯示之前執行,此時頁面不可見(應用切換到前臺不會觸發)。
  • onShown:NavDestination組件布局顯示之后執行,此時頁面已完成布局。
  • onWillHide:NavDestination組件觸發隱藏之前執行(應用切換到后臺不會觸發)。
  • onHidden:NavDestination組件觸發隱藏后執行(非棧頂頁面push進棧,棧頂頁面pop出棧或應用切換到后臺)。
  • onWillDisappear:NavDestination組件即將銷毀之前執行,如果有轉場動畫,會在動畫前觸發(棧頂頁面pop出棧)。
  • onDisappear:通用生命周期事件,NavDestination組件從組件樹上卸載銷毀時執行。
  • aboutToDisappear:自定義組件析構銷毀之前執行,不允許在該方法中改變狀態變量。

頁面監聽和查詢

為了方便組件跟頁面解耦,在NavDestination子頁面內部的自定義組件可以通過全局方法監聽或查詢到頁面的一些狀態信息。

  • 頁面信息查詢

    自定義組件提供queryNavDestinationInfo方法,可以在NavDestination內部查詢到當前所屬頁面的信息,返回值為NavDestinationInfo,若查詢不到則返回undefined。

     import { uiObserver } from '@kit.ArkUI';// NavDestination內的自定義組件struct MyComponent {navDesInfo: uiObserver.NavDestinationInfo | undefinedaboutToAppear(): void {this.navDesInfo = this.queryNavDestinationInfo();Logger.info("所屬頁面Name: " + this.navDesInfo?.name)}}
    
  • 頁面狀態監聽

    uiObserver.on('navDestinationUpdate', (info) => {console.info('NavDestination state update', JSON.stringify(info));});
    

    也可以注冊頁面切換的狀態回調,能在頁面發生路由切換的時候拿到對應的頁面信息NavDestinationSwitchInfo,并且提供了UIAbilityContext和UIContext不同范圍的監聽:

     // 在UIAbility中使用import { UIContext, uiObserver } from '@kit.ArkUI';// callBackFunc 是開發者定義的監聽回調函數function callBackFunc(info: uiObserver.NavDestinationSwitchInfo) {}uiObserver.on('navDestinationSwitch', this.context, callBackFunc);// 可以通過窗口的getUIContext()方法獲取對應的UIContentuiContext: UIContext | null = null;uiObserver.on('navDestinationSwitch', this.uiContext, callBackFunc);
    

頁面轉場

Navigation默認提供了頁面切換的轉場動畫,通過頁面棧操作時,會觸發不同的轉場效果(Dialog類型的頁面默認無轉場動畫),Navigation也提供了關閉系統轉場、自定義轉場以及共享元素轉場的能力。

關閉轉場

  • 全局關閉

    Navigation通過NavPathStack中提供的disableAnimation方法可以在當前Navigation中關閉或打開所有轉場動畫。

    pageStack: NavPathStack = new NavPathStack()aboutToAppear(): void {this.pageStack.disableAnimation(true)
    }
    
  • 單次關閉

    NavPathStack中提供的Push、Pop、Replace等接口中可以設置animated參數,默認為true表示有轉場動畫,需要單次關閉轉場動畫可以置為false,不影響下次轉場動畫。

    pageStack: NavPathStack = new NavPathStack()this.pageStack.pushPath({ name: "PageOne" }, false)
    this.pageStack.pop(false)
    

自定義轉場

avigation通過customNavContentTransition事件提供自定義轉場動畫的能力,參考Navigation自定義轉場示例。

共享元素轉場

NavDestination之間切換時可以通過geometryTransition實現共享元素轉場。配置了共享元素轉場的頁面同時需要關閉系統默認的轉場動畫。

  1. 為需要實現共享元素轉場的組件添加geometryTransition屬性,id參數必須在兩個NavDestination之間保持一致。

    // 起始頁配置共享元素id
    NavDestination() {Column() {// ...Image($r('app.media.startIcon')).geometryTransition('sharedId').width(100).height(100)}
    }
    .title('FromPage')// 目的頁配置共享元素id
    NavDestination() {Column() {// ...Image($r('app.media.startIcon')).geometryTransition('sharedId').width(200).height(200)}
    }
    .title('ToPage')
    
  2. 將頁面路由的操作,放到animateTo動畫閉包中,配置對應的動畫參數以及關閉系統默認的轉場。

    NavDestination() {Column() {Button('跳轉目的頁').width('80%').height(40).margin(20).onClick(() => {this.getUIContext()?.animateTo({ duration: 1000 }, () => {this.pageStack.pushPath({ name: 'ToPage' }, false)})})}
    }
    .title('FromPage')
    

跨包動態路由

通過靜態import頁面再進行路由跳轉的方式會造成不同模塊之間的依賴耦合,以及首頁加載時間長等問題。

動態路由設計的初衷旨在解決多個模塊(HAR/HSP)能夠復用相同的業務邏輯,實現各業務模塊間的解耦,同時支持路由功能的擴展與整合。

動態路由的優勢:

路由定義除了跳轉的URL以外,可以豐富的配置擴展信息,如橫豎屏默認模式,是否需要鑒權等等,做路由跳轉時統一處理。
給每個路由頁面設置一個名字,按照名稱進行跳轉而不是文件路徑。
頁面的加載可以使用動態import(按需加載),防止首個頁面加載大量代碼導致卡頓。
動態路由提供系統路由表和自定義路由表兩種實現方式。

系統路由表相對自定義路由表,使用更簡單,只需要添加對應頁面跳轉配置項,即可實現頁面跳轉。

自定義路由表使用起來更復雜,但是可以根據應用業務進行定制處理。

支持自定義路由表和系統路由表混用。

系統路由表

  1. 在跳轉目標模塊的配置文件module.json5添加路由表配置:

      {"module" : {"routerMap": "$profile:route_map"}}
    
  2. 添加完路由配置文件地址后,需要在工程resources/base/profile中創建route_map.json文件。添加如下配置信息:

      {"routerMap": [{"name": "PageOne","pageSourceFile": "src/main/ets/pages/PageOne.ets","buildFunction": "PageOneBuilder","data": {"description" : "this is PageOne"}}]}
    

    配置說明如下:

    配置項說明
    name跳轉頁面名稱。
    pageSourceFile跳轉目標頁在包內的路徑,相對src目錄的相對路徑。
    buildFunction跳轉目標頁的入口函數名稱,必須以@Builder修飾。
    data應用自定義字段。可以通過配置項讀取接口getConfigInRouteMap獲取。
  3. 在跳轉目標頁面中,需要配置入口Builder函數,函數名稱需要和route_map.json配置文件中的buildFunction保持一致,否則在編譯時會報錯。

      // 跳轉頁面入口函數export function PageOneBuilder() {PageOne()}struct PageOne {pathStack: NavPathStack = new NavPathStack()build() {NavDestination() {}.title('PageOne').onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack})}}
    
  4. 通過pushPathByName等路由接口進行頁面跳轉。(注意:此時Navigation中可以不用配置navDestination屬性)。

      struct Index {pageStack : NavPathStack = new NavPathStack();build() {Navigation(this.pageStack){}.onAppear(() => {this.pageStack.pushPathByName("PageOne", null, false);}).hideNavBar(true)}}
    

自定義路由表

開發者可以通過自定義路由表的方式來實現跨包動態路由,具體實現方法請參考Navigation自定義動態路由 示例。

示例代碼

Navigation系統路由

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

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

相關文章

雪花算法

目錄 一、什么是雪花算法 二、使用雪花算法 ?三、使用UUID 使用自增主鍵是數據庫中常用的唯一標識,今天嘗試使用mybatisplus來實現三種方式的主鍵ID 使用起來也很簡單 用注解指定一下使用那種方式的主鍵 一、什么是雪花算法 一種特殊的算法可以計算得到一個唯…

HarmonyOs @hadss/hmrouter路由接入

參考文檔:官方文檔 在根目錄oh-package.json5配置 {"dependencies": {"hadss/hmrouter": "^1.0.0-rc.11"} }加入路由編譯插件 hvigor/hvigor-config.json文件 {"dependencies": {"hadss/hmrouter-plugin": &…

C++學習筆記(三十八)——STL之修改算法

STL 算法分類: 類別常見算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器內容刪除remove、remove_if、unique等刪除元素歸約for…

Crawl4AI 部署安裝及 n8n 調用,實現自動化工作流(保證好使)

Crawl4AI 部署安裝及 n8n 調用,實現自動化工作流(保證好使) 簡介 Crawl4AI 的介紹 一、Crawl4AI 的核心功能 二、Crawl4AI vs Firecrawl Crawl4AI 的本地部署 一、前期準備 二、部署步驟 1、檢查系統的網絡環境 2、下載 Crawl4AI 源…

32單片機——外部中斷

STM32F103ZET6的系統中斷有10個,外部中斷有60個 1、中斷的概念 中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的,中斷功能的存在,很大程度上提高了單片機處理外部或內部事件的能力 eg::你打開火&…

UG NX二次開發(C#)-獲取具有相同屬性名稱的體對象

文章目錄 1、前言2、在UG NX中的屬性的賦予3、通過UG NX二次開發獲取相同屬性的體對象1、前言 UG NX中每個對象都可以屬于屬性的,包括體、面、邊、特征、基準等。在QQ群中有個群有提出一個問題,就是獲取相同屬性的體對象,然后將這個體對象導出到一個part文件中。我們今天先…

手動實現legend 與 echarts圖交互 通過元素和js事件實現圖標某項的高亮 顯示與隱藏

通過html實現legend的樣式 提供調用echarts的api實現與echarts圖表交互的效果 實現餅圖element實現類似于legend與echartstu表交互效果 效果圖 配置代碼 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

SpringBoot與BookKeeper整合,實現金融級別的日志存儲系統

BookKeeper的優勢 高吞吐量和低延遲 分布式架構: Apache BookKeeper采用分布式的架構設計&#xff0c;能夠支持高并發的寫入和讀取操作。 批量寫入: 支持批量寫入日志條目&#xff0c;顯著提高寫入效率。 異步I/O: 使用異步I/O操作&#xff0c;減少等待時間&#xff0c;提升…

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

當你在進行深度學習相關操作時&#xff0c;若因缺少本地的 CA 證書而無法下載資源&#xff0c;下面為你介紹幾種解決辦法&#xff1a; 方法一&#xff1a;更新 CA 證書 在大多數 Linux 發行版中&#xff0c;你可以使用包管理器來更新 CA 證書。例如&#xff0c;在基于 Debian…

Vue3中AbortController取消請求的用法詳解

在 Vue3 中&#xff0c;AbortController 用于取消 fetch 請求&#xff0c;避免組件卸載后仍執行異步操作導致的潛在問題&#xff08;如內存泄漏或更新已銷毀組件的狀態&#xff09;。以下是詳細用法和最佳實踐&#xff1a; 一、基本用法 創建 AbortController 實例 在組件 setu…

【刷題Day26】Linux命令、分段分頁和中斷(淺)

說下你常用的 Linux 命令&#xff1f; 文件與目錄操作&#xff1a; ls&#xff1a;列出當前目錄的文件和子目錄&#xff0c;常用參數如-l&#xff08;詳細信息&#xff09;、-a&#xff08;包括隱藏文件&#xff09;cd&#xff1a;切換目錄&#xff0c;用于在文件系統中導航m…

Spring Boot 參考文檔導航手冊

&#x1f4da; Spring Boot 參考文檔導航手冊 &#x1f5fa;? ? 新手入門 &#x1f476; 1?? &#x1f4d6; 基礎入門&#xff1a;概述文檔 | 環境要求 | 安裝指南 2?? &#x1f527; 實操教程&#xff1a;上篇 | 下篇 3?? &#x1f680; 示例運行&#xff1a;基礎篇 …

卷積神經網絡(CNN)詳細教程

卷積神經網絡&#xff08;CNN&#xff09;詳細教程 一、引言 卷積神經網絡&#xff08;Convolutional Neural Networks, CNN&#xff09;是一種深度學習模型&#xff0c;廣泛應用于圖像識別、視頻分析、自然語言處理等領域。CNN通過模擬人類視覺系統的層次結構&#xff0c;能夠…

解決SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption faile的問題

問題描述&#xff1a; 在pip安裝第三方庫時&#xff0c;出現SSL的問題。 傳輸層安全性協議&#xff08;TLS&#xff09;及其前身安全套接層&#xff08;SSL&#xff09;是現在的 HTTPS 協議中的一種安全協議&#xff0c;目的是為互聯網通信提供安全及數據完整性保障。而較新版…

SpringBoot程序的創建以及特點,配置文件,LogBack記錄日志,配置過濾器、攔截器、全局異常

目錄 一、創建一個SpringBoot程序 二、SpringBoot的特點 ①主要特點 ②其他特點 ③熱部署 啟動熱部署 關閉熱部署 三、SpringBoot的配置文件 ①SpringBoot三種配置文件的格式&#xff08;以設置端口號為例&#xff09;&#xff1a; ②配置文件的優先級 ③常見配置項 1…

i18n-ai-translate開源程序,可以使用DeepSeek等模型將您的 i18nJSON翻譯成任何語言

一、軟件介紹 文末提供程序和源碼下載 i18n-ai-translate開源程序使用 DeepSeek等模型可以將您的 i18n JSON 翻譯成任何語言。 無縫翻譯本地化文件。支持嵌套翻譯文件的目錄。需要i18next樣式的JSON 文件&#xff08;文末一并提供下載&#xff09;。 二、模式 CSV 模式 三個…

Flask + ajax上傳文件(一)--單文件上傳

一、概述 本教程將教你如何使用Flask后端和AJAX前端實現文件上傳功能,包含完整的代碼實現和詳細解釋。 二、環境準備 1. 所需工具和庫 Python 3.xFlask框架jQuery庫Bootstrap(可選,用于美化界面)2. 安裝Flask pip install flask三、項目結構 upload_project/ ├── a…

如何在 Postman 中,自動獲取 Token 并將其賦值到環境變量

在 Postman 中&#xff0c;你可以通過 預請求腳本&#xff08;Pre-request Script&#xff09; 和 測試腳本&#xff08;Tests&#xff09; 實現自動獲取 Token 并將其賦值到環境變量&#xff0c;下面是完整的操作步驟&#xff1a; ? 一、創建獲取 Token 的請求 通常這個請求…

北斗導航 | 基于Transformer+LSTM+激光雷達的接收機自主完好性監測算法研究

基于Transformer+LSTM+激光雷達的接收機自主完好性監測算法研究 接收機自主完好性監測(RAIM)是保障全球導航衛星系統(GNSS)定位可靠性的核心技術。傳統RAIM算法依賴最小二乘殘差法,存在故障漏檢、對復雜環境適應性差等問題。結合Transformer、LSTM與激光雷達的多模態融合…

基于Python爬蟲的豆瓣電影信息爬取(可以根據選擇電影編號得到需要的電影信息)

# 豆瓣電影信息爬蟲(展示效果如下圖所示:) 這是一個功能強大的豆瓣電影信息爬蟲程序,可以獲取豆瓣電影 Top 250 的詳細信息。 ## 功能特點 - 自動爬取豆瓣電影 Top 250 的所有電影信息 - 支持分頁獲取,每頁 25 部電影,共 10 頁 - 獲取每部電影的詳細信息,包括: - 標題…