【精華+1】HarmonyOS官方模板優(yōu)秀案例-第3期:教育行業(yè) ·?教育備考
?? 鴻蒙生態(tài)為開發(fā)者提供海量的HarmonyOS模板/組件,助力開發(fā)效率原地起飛 ??
★ 一鍵直達(dá)生態(tài)市場(chǎng)組件&模板市場(chǎng)?, 快速應(yīng)用DevEco Studio插件市場(chǎng)集成組件&模板?★
前兩期案例介紹了便捷生活、新聞行業(yè),大家是不是意猶未盡?
第三期-教育行業(yè)的案例加急發(fā)布啦!
?? 覆蓋20+行業(yè),本帖以匯總形式持續(xù)更新中,點(diǎn)擊收藏!一鍵三連!??闯P?!
【第3期】教育行業(yè) ·?教育備考
概述
1.行業(yè)洞察
行業(yè)訴求:
-
- 精準(zhǔn)分發(fā):面對(duì)不同的受眾教育類應(yīng)用有不同的業(yè)務(wù)場(chǎng)景,產(chǎn)出適配內(nèi)容、精準(zhǔn)題庫(kù)等,并以高效且契合場(chǎng)景的方式進(jìn)行分發(fā),最終實(shí)現(xiàn)優(yōu)質(zhì)教育資源的有效傳遞。
- 高效流暢、操作敏捷是教育類應(yīng)用不同場(chǎng)景重要訴求,在線學(xué)習(xí)、考試等場(chǎng)景出現(xiàn)卡頓會(huì)嚴(yán)重影響學(xué)習(xí)、考試的。
- 需具備智能刷題與精準(zhǔn)輔導(dǎo)能力:基于大數(shù)據(jù)和算法,依據(jù)答題情況判斷用戶知識(shí)掌握狀況,動(dòng)態(tài)調(diào)整出題難度,推送契合的學(xué)習(xí)內(nèi)容。
- 多端協(xié)同能力:實(shí)現(xiàn)手機(jī)、平板、PC 端數(shù)據(jù)實(shí)時(shí)互通,提供離線功能,便于用戶利用碎片化時(shí)間用于刷題或知識(shí)點(diǎn)復(fù)習(xí),并可在線后同步學(xué)習(xí)進(jìn)度。
行業(yè)常用三方SDK
SDK鏈接:騰訊瀏覽服務(wù)SDK、高德定位SDK、百度地圖SDK 、極光Push SDK、火山引擎SDK、同盾SDK、友盟SDK、微信支付SDK、支付寶SDK、聽云SDK、福昕?PDF SDK、網(wǎng)易云信?IM SDK、保利威視頻直播webSDK、支付寶分享SDK
說(shuō)明:“以上三方庫(kù)及鏈接僅為示例,三方庫(kù)由三方開發(fā)者獨(dú)立提供,以其官方內(nèi)容為準(zhǔn)”
2.行業(yè)案例概覽(下載模板)
基于以上行業(yè)分析,本期將介紹鴻蒙生態(tài)市場(chǎng)教育行業(yè)模板——教育備考應(yīng)用模板,為行業(yè)提供常用功能的開發(fā)案例,模板主要分練習(xí)、課程和我的三大模塊。
- Stage開發(fā)模型 + 聲明式UI開發(fā)范式。
- 分層架構(gòu)設(shè)計(jì) + 組件化拆分,支持開發(fā)者在開發(fā)時(shí)既可以選擇完整使用模板,也可以根據(jù)需求單獨(dú)選用其中的業(yè)務(wù)組件。
- 本模板已集成華為賬號(hào)服務(wù),只需做少量配置和定制即可快速實(shí)現(xiàn)華為賬號(hào)的登錄等功能。
本模板主要頁(yè)面及核心功能如下所示:
?題庫(kù)模板 ?|-- 開屏頁(yè) ?|-- 練習(xí) ?| ???|-- banner ?| ???|-- 搜索 ?| ???└-- 答題練習(xí) ?|-- 課程 ?| ???|-- 分類列表 ?| ???|-- 精選課程 ?| ???| ???|-- 課程詳情 ?| ???| ???└-- 支付購(gòu)買 ?| ???└-- 已購(gòu)我的課程 ?| ????????|-- 練習(xí)模式 ?| ????????|-- 考試模式 ?| ????????|-- 錯(cuò)題記錄 ?| ????????└-- 收藏記錄 ?| ????????└-- 筆記記錄 ?└-- 我的 ??????|-- 用戶信息 ??????| ???|-- 登錄 ??????| ???|-- 用戶信息 ??????|-- 我的訂單 ??????|-- 我的錯(cuò)題 ??????|-- 我的收藏 ??????|-- 練習(xí)記錄 ??????|-- 瀏覽記錄 ??????└-- 設(shè)置 ???????????|-- 個(gè)人信息 ???????????|-- 意見反饋 ???????????|-- 反饋記錄 ???????????|-- 隱私協(xié)議 ???????????|-- 清除緩存 ???????????└-- 退出登錄 |
二、應(yīng)用架構(gòu)設(shè)計(jì)
- 分層模塊化設(shè)計(jì)
產(chǎn)品定制層:專注于滿足不同設(shè)備或使用場(chǎng)景的個(gè)性化需求,作為應(yīng)用的入口,是用戶直接互動(dòng)的界面。
本實(shí)踐暫時(shí)只支持直板機(jī),為單HAP包形式,包含路由根節(jié)點(diǎn)、底部導(dǎo)航欄等。
基礎(chǔ)特性層:用于存放相對(duì)獨(dú)立的功能UI和業(yè)務(wù)邏輯實(shí)現(xiàn)。
本實(shí)踐的基礎(chǔ)特性層將應(yīng)用功能拆分成6個(gè)相對(duì)獨(dú)立的業(yè)務(wù)功能模塊。
每個(gè)功能模塊都具備高內(nèi)聚、低耦合、可定制的特點(diǎn),支持產(chǎn)品的靈活部署。
公共能力層:存放公共能力,包括公共UI組件、數(shù)據(jù)管理、外部交互和工具庫(kù)等共享功能。
本實(shí)踐的公共能力層分為公共基礎(chǔ)能力和行業(yè)組件,均打包為HAR包被基礎(chǔ)特性層的業(yè)務(wù)模塊引用。
公共基礎(chǔ)能力包含賬號(hào)管理、動(dòng)態(tài)布局等工具,公共類型定義,網(wǎng)絡(luò)庫(kù),以及彈窗、加載等公共組件。
行業(yè)組件將包含行業(yè)特點(diǎn)、可完全自閉環(huán)的能力抽出獨(dú)立的組件模塊,支持開發(fā)者在開發(fā)中單獨(dú)集成使用,詳見業(yè)務(wù)組件設(shè)計(jì)章節(jié)。
- 業(yè)務(wù)組件設(shè)計(jì)
為支持開發(fā)者單獨(dú)獲取特定場(chǎng)景的頁(yè)面和功能,本模板將功能完全自閉環(huán)的部分能力抽離出獨(dú)立的行業(yè)組件模塊,不依賴公共基礎(chǔ)能力包,開發(fā)者可以單獨(dú)集成,開箱即用,降低使用難度。
三、行業(yè)場(chǎng)景技術(shù)方案
- 一鍵搜題
場(chǎng)景說(shuō)明
用戶可在首頁(yè)-搜題進(jìn)入一鍵搜題頁(yè)面,可輸入、語(yǔ)音輸入,拍照識(shí)別,粘貼和清除功能。
技術(shù)方案
- 語(yǔ)音輸入
根據(jù)語(yǔ)音識(shí)別可實(shí)現(xiàn)功能。
- 拍照識(shí)別
根據(jù)拍照可實(shí)現(xiàn)拍照功能,
圖片獲取后參考recognizeText獲取具體結(jié)果。
代碼參考
部分核心代碼參見搜題組件實(shí)現(xiàn)章節(jié)。
- 多級(jí)分欄
場(chǎng)景說(shuō)明
用戶可通過(guò)首頁(yè)右上角的按鈕拉起多級(jí)選擇界面,可進(jìn)行多級(jí)別職稱的選擇。
技術(shù)方案
采用左右兩個(gè)List做為基礎(chǔ)組件來(lái)實(shí)現(xiàn)業(yè)務(wù),三級(jí)、多級(jí)目錄采用數(shù)據(jù)源刷新特性實(shí)現(xiàn)具體業(yè)務(wù)。
- 答題
場(chǎng)景說(shuō)明
用戶可通過(guò)首頁(yè)點(diǎn)擊每日一練可進(jìn)入答題練習(xí)頁(yè)面,可添加筆記、收藏、答題等相關(guān)業(yè)務(wù),答題這塊只做了單選業(yè)務(wù)。
技術(shù)方案
核心是狀態(tài)變量的使用@ObservedV2通過(guò)首選項(xiàng)記錄相關(guān)操作業(yè)務(wù)。
四、模板代碼
- 工程結(jié)構(gòu)(下載模板)
詳細(xì)代碼結(jié)構(gòu)如下所示:
Exam ??├─commons/commonLib/src/main ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????CommonHeader.ets?????????????????// 一級(jí)頁(yè)面標(biāo)題組件 ??│ ?│ ?│ ?????TopBar.ets???????????????????????// 標(biāo)題菜單內(nèi)容組件 ??│ ?│ ?├─utils ??│ ?│ ?│ ?????Logger.ets???????????????????????// 日志 ??│ ?│ ?│ ?????PreferenceUtil.ets???????????????// 首選項(xiàng) ??│ ?│ ?├─viewModel ??│ ?│ ?│ ?????BrowsingHistoryModel.ets?????????// 記錄模塊數(shù)據(jù)模型 ??│ ?│ ?│ ?????OrderInfo.ets????????????????????// 訂單數(shù)據(jù)模型 ??│ ?│ ?│ ?????PracticeRecordModel.ets??????????// 練習(xí)數(shù)據(jù)模型 ??│ ?└─resources ??├─commons/router_module/src/main ??│ ?├─ets ??│ ?│ ?├─routerModule ??│ ?│ ?│ ?│ ???RouterModule.ets????????????????// 路由 ??│ ?│ ?│ ?│ ?├─constants ??│ ?│ ?│ ?│ ?│ ?│ RouterMap.ets????????????????// 路由Key ??│ ?└─resources?? ??│─components/aggregated_payment/src/main??? ??│ ?├─ets ??│ ?│ ?├─common ??│ ?│ ?│ ?????Constant.ets?????????????????????// 常量類 ??│ ?│ ?├─components ??│ ?│ ?│ ?????AggregatedPaymentPicker.ets??????// 支付組件 ??│ ?│ ?├─model ??│ ?│ ?│ ?????Index.ets????????????????????????// 數(shù)據(jù)類型 ??│ ?│ ?│ ?????WXApiWrap.ets????????????????????// 微信支付數(shù)據(jù)類型 ??│ ?│ ?└─viewmodel ??│ ?│ ????????AggregatedPaymentVM.ets??????????// 支付組件數(shù)據(jù)模型 ??│ ?└─resources ??│─components/answer_questions/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????AnswerQuestionsPage.ets???????????// 答題組件 ??│ ?│ ?│ ?????AddNotePage.ets???????????????????// 添加筆記組件 ??│ ?│ ?│ ?????AnswerSheetPage.ets???????????????// 答題卡組件 ??│ ?│ ?├─dialog ??│ ?│ ?│ ?????AddNoteDialog.ets?????????????????// 添加筆記彈框 ??│ ?│ ?│ ?????AnswerSheetDialog.ets?????????????// 答題卡彈框 ??│ ?│ ?└─viewModel ??│ ?│ ????????TopicItemModel.ets????????????????// 答題選項(xiàng)模型 ??│ ?│ ????????TopicPageModel.ets????????????????// 答題模型 ??│ ?└─resources ??│─components/feed_back/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????Feedback.ets??????????????????????// 意見反饋功能組件 ??│ ?│ ?├─model ??│ ?│ ?│ ?????FeedbackRecordModel.ets???????????// 數(shù)據(jù)類型 ??│ ?│ ?├─utils ??│ ?│ ?│ ?????FileSelect.ets????????????????????// 意見反饋功工具類 ??│ ?└─resources ??│─components/select_category/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????MainPage.ets??????????????????????// 二級(jí)分類組件 ??│ ?│ ?│ ?????ThirdcatePage.ets?????????????????// 三級(jí)分類組件 ??│ ?│ ?├─model ??│ ?│ ?│ ?????SelectCateModel.ets???????????????// 數(shù)據(jù)類型 ???? ??│ ?└─resources ??│─components/login_info/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????AgreementDialog.ets???????????????// 同意協(xié)議彈窗組件 ??│ ?│ ?│ ?????QuickLogin.ets????????????????????// 一鍵登錄組件 ??│ ?│ ?├─model ??│ ?│ ?│ ?????ErrorCode.ets?????????????????????// 錯(cuò)誤碼類型 ??│ ?│ ?│ ?????UserInfo.ets??????????????????????// 用戶類型 ??│ ?│ ?└─utils ??│ ?│ ????????AccountUtil.ets???????????????????// 賬戶工具類 ??│ ?└─resources ??│─components/search/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????SearchPage.ets????????????????????// 搜索組件 ??│ ?└─resources ??│─components/search_question/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????SearchQuestionPage.ets????????????// 一鍵搜題組件 ??│ ?└─resources ??│─components/base_select/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????MainPage.ets??????????????????????// 基礎(chǔ)通用組件 ??│ ?│ ?├─model ??│ ?│ ?│ ?????SelectModel.ets???????????????????// 選項(xiàng)數(shù)據(jù)模型 ??│ ?└─resources?? ??│─features/homePage/src/main??? ??│ ?├─ets ??│ ?│ ?├─components?????????????????????????????// 封裝組件 ??│ ?│ ?│ ?????CourseBookComponent.ets???????????// 資料卡片組件 ??????? ??│ ?│ ?│ ?????CourseComponent.ets???????????????// 課程卡片 ????? ??│ ?│ ?├─model ??│ ?│ ?│ ????ChapterPractice.ets????????????????// 分類頁(yè)面數(shù)據(jù)模型 ??│ ?│ ?│ ????CommonTopic.ets????????????????????// 分類數(shù)據(jù)模型 ??│ ?│ ?│ ????Course.ets?????????????????????????// 課程數(shù)據(jù)模型 ? ??│ ?│ ?│ ????CourseArray.ets????????????????????// 課程數(shù)組模型 ??│ ?│ ?│ ????CourseBook.ets?????????????????????// 資料模型 ??│ ?│ ?│ ????CourseQuestions.ets????????????????// 科目數(shù)據(jù)模型 ??│ ?│ ?│ ????PracticeMode.ets???????????????????// 業(yè)務(wù)類型數(shù)據(jù)模型 ? ??│ ?│ ?│ ????TopicItemModel.ets?????????????????// 答題類型數(shù)據(jù)模型 ? ??│ ?│ ?│ ????TopicModel.ets?????????????????????// 分類數(shù)據(jù)源 ? ??│ ?│ ?├─pages ??│ ?│ ?│ ?????ChapterPractice.ets???????????????// 科目頁(yè)面 ??│ ?│ ?│ ?????FeaturedCourses.ets???????????????// 精選課程頁(yè)面 ??│ ?│ ?│ ?????MainPage.ets??????????????????????// 練習(xí)首頁(yè)面 ??│ ?│ ?│ ?????MaterialDownload.ets??????????????// 資料頁(yè)面 ??│ ?│ ?│ ?????SearchIndexPage.ets???????????????// 搜索頁(yè)面 ??│ ?│ ?│ ?????SearchInputPage.ets???????????????// 搜索輸入框頁(yè)面 ? ??│ ?│ ?│ ?????SecondListPage.ets????????????????// 2級(jí)分類 ??│ ?│ ?│ ?????ThirdListPage.ets?????????????????// 3級(jí)分類 ??│ ?│ ?│ ?????TopicHomePage.ets?????????????????// 1級(jí)分類 ? ??│ ?│ ??│ ?└─resources ??│─features/topicPage/src/main??? ??│ ?├─ets ??│ ?│ ?├─views ??│ ?│ ?│ ?????AnswerQuestionsPage.ets???????????// 答題模式一頁(yè)面 ??│ ?│ ?│ ?????AnswerQuestionsTwoPage.ets????????// 答題模式二頁(yè)面 ??│ ?│ ?│ ?????CourseHomePage.ets????????????????// 課程頁(yè)面 ??│ ?│ ?│ ?????CourseIntroductionPage.ets????????// 課程詳情頁(yè)面 ??│ ?│ ?│ ?????ExamResultPage.ets????????????????// 答題結(jié)果頁(yè)面 ??│ ?│ ?│ ?????GoodCourseDetailPage.ets??????????// 精選課程頁(yè)面 ??│ ?│ ?│ ?????MockTestPage.ets??????????????????// 科目練習(xí)頁(yè)面 ??│ ?│ ?│ ?????MyCollectionPage.ets??????????????// 收藏頁(yè)面 ??│ ?│ ?│ ?????MyNotesPage.ets???????????????????// 筆記頁(yè)面 ??│ ?│ ?│ ?????MyWrongPage.ets???????????????????// 錯(cuò)題頁(yè)面 ??│ ?│ ?│ ?????TestReportPage.ets????????????????// 測(cè)試報(bào)告頁(yè)面 ??│ ?│ ?│ ?????ViewNotePage.ets??????????????????// 筆記組件 ??│ ?│ ?└─viewModel ??│ ?│ ?│ ?????CourseHomeModel.ets???????????????// 課程頁(yè)面數(shù)據(jù)模型 ??│ ?│ ?│ ?????PracticeMode.ets??????????????????// 科目數(shù)據(jù)模型 ??│ ?│ ?│ ?????SecondListModel.ets???????????????// 選項(xiàng)類型數(shù)據(jù)模型 ??│─features/minePage/src/main??? ??│ ?├─ets ??│ ?│ ?├─components ??│ ?│ ?│ ?????Header.ets????????????????????????// Header組件 ??│ ?│ ?├─viewModel??????????????????????????????// 數(shù)據(jù)類型 ??│ ?│ ?│ ?????MessageModel.ets????????????? ??│ ?│ ?│ ?????setUpModel.ets????????????????????// 設(shè)置相關(guān)模型數(shù)據(jù)模型 ??│ ?│ ?│ ?????MineModel.ets?????????????????????// 用戶資料信息數(shù)據(jù)模型 ??│ ?│ ?├─views ??│ ?│ ?│ ?????AboutPage.ets?????????????????????// 關(guān)于頁(yè)面 ??│ ?│ ?│ ?????AuthenticationPage.ets????????????// 用戶認(rèn)證協(xié)議頁(yè)面 ??│ ?│ ?│ ?????BrowsingHistoryPage.ets???????????// 瀏覽頁(yè)面 ??│ ?│ ?│ ?????CollectionPage.ets????????????????// 課程收藏頁(yè)面 ??│ ?│ ?│ ?????CoursePage.ets????????????????????// 課程精選頁(yè)面 ??│ ?│ ?│ ?????EditPersonalCenterPage.ets????????// 個(gè)人信息詳情頁(yè)面 ??│ ?│ ?│ ?????FeedbackPage.ets??????????????????// 意見反饋?lái)?yè)面 ??│ ?│ ?│ ?????FeedbackRecordPage.ets????????????// 反饋記錄頁(yè)面 ??│ ?│ ?│ ?????MessageCenterPage.ets?????????????// 消息頁(yè)面 ??│ ?│ ?│ ?????MinePage.ets??????????????????????// 我的頁(yè)面 ??│ ?│ ?│ ?????MyOrderPage.ets???????????????????// 訂單首頁(yè)頁(yè)面 ??│ ?│ ?│ ?????OneDayPracticeRecordsPage.ets?????// 單個(gè)練習(xí)記錄頁(yè)面 ??│ ?│ ?│ ?????OrderDetailPage.ets???????????????// 訂單詳情頁(yè)面 ??│ ?│ ?│ ?????OrderListPage.ets?????????????????// 訂單頁(yè)面 ??│ ?│ ?│ ?????PracticeDetailsPage.ets???????????// 反饋?lái)?yè)面 ??│ ?│ ?│ ?????PracticeRecordsPage.ets???????????// 練習(xí)記錄頁(yè)面 ??│ ?│ ?│ ?????PrivacyAgreementPage.ets??????????// 同意 ??│ ?│ ?│ ?????PrivacyPage.ets???????????????????// 協(xié)議 ??│ ?│ ?│ ?????PrivacyStatementPage.ets??????????// 隱私頁(yè)面 ??│ ?│ ?│ ?????SetupPage.ets?????????????????????// 設(shè)置頁(yè)面 ??│ ?│ ?│ ?????TermsOfServicePage.ets????????????// 用戶服務(wù)頁(yè)面 ??└─products/entry/src/main??? ?????├─ets ?????│ ?├─entryability ?????│ ?│ ?????EntryAbility.ets??????????????????// 應(yīng)用程序入口 ?????│ ?├─entrybackupability ?????│ ?│ ?????EntryBackupAbility.ets????????????// Backup配置入口 ???? ?????│ ?├─pages ?????│ ?│ ?????Index.ets?????????????????????????// 入口頁(yè)面 ?????│ ?│ ?????LoginPage.ets?????????????????????// login頁(yè)面 ?????│ ?├─model ?????│ ?│ ?????TabListItem.ets???????????????????// 數(shù)據(jù)聲明 ?????│ ?├─viewmodels ?????│ ?│ ?????MainVM.ets????????????????????????// 頁(yè)面數(shù)據(jù)模型 ?????│ ?├─common?????????????????????????????????// 常量及Tab數(shù)據(jù)源 ?????│ ????????TabConstants.ets ?????└─resources |
- 關(guān)鍵代碼解讀
本篇代碼非應(yīng)用的全量代碼,只包括應(yīng)用的部分能力的關(guān)鍵代碼。
若需獲取全量代碼,請(qǐng)查看模板集成章節(jié)。
一鍵搜題
// 語(yǔ)音識(shí)別 // 請(qǐng)求權(quán)限后創(chuàng)建服務(wù)并監(jiān)聽 this.atManager.requestPermissionsFromUser(this.context, ['ohos.permission.MICROPHONE']) ????????????.then(async (data) => { ??????????????if (data.authResults[0] === 0) { ????????????????await this.createSREngine() ????????????????this.startListener() ??????????????} ????????????}) ????????????.catch(() => { ??????????????//在此處進(jìn)行異常處理 ????????????}); ? async createSREngine() { ????const extraParams: Record<string, Object> = { ??????'locate': 'CN', ??????'recognizerMode': 'short' ????} ????const initParamsInfo: speechRecognizer.CreateEngineParams = { ??????language: 'zh-CN', ??????online: 1, ??????extraParams ????} ????try { ??????this.asrEngine = await speechRecognizer.createEngine(initParamsInfo) ??????this.setListener() ????} catch (e) { ??????//在此處進(jìn)行異常處理 ????} ??} ? ?startListener() { ????const audioParam: speechRecognizer.AudioInfo = { ??????audioType: 'pcm', ??????sampleRate: 16000, ??????soundChannel: 1, ??????sampleBit: 16 ????}; ????const extraParam: Record<string, Object> = { 'maxAudioDuration': 40000, 'recognitionMode': 0 }; ????this.sessionId = new Date().getTime().toString() ????const recognizerParams: speechRecognizer.StartParams = { ??????sessionId: this.sessionId, ??????audioInfo: audioParam, ??????extraParams: extraParam ????}; ????this.asrEngine?.startListening(recognizerParams) ??} ? ??setListener() { ????let that = this ????// 創(chuàng)建回調(diào)對(duì)象 ????let setListener: speechRecognizer.RecognitionListener = { ??????// 開始識(shí)別成功回調(diào) ??????onStart() { ??????}, ??????// 事件回調(diào) ??????onEvent() { ??????}, ??????// 識(shí)別結(jié)果回調(diào),包括中間結(jié)果和最終結(jié)果 ??????onResult(_sessionId: string, result: speechRecognizer.SpeechRecognitionResult) { ????????that.textInput = that.textInputPre + result.result ??????}, ??????// 識(shí)別完成回調(diào) ??????onComplete() { ????????that.textInputPre = that.textInput ??????}, ??????// 錯(cuò)誤回調(diào),錯(cuò)誤碼通過(guò)本方法返回 ??????// 返回錯(cuò)誤碼1002200002,開始識(shí)別失敗,重復(fù)啟動(dòng)startListening方法時(shí)觸發(fā) ??????// 更多錯(cuò)誤碼請(qǐng)參考錯(cuò)誤碼參考 ??????onError() { ??????}, ????} ????// 設(shè)置回調(diào) ????this.asrEngine?.setListener(setListener); ??}; ? // 拍照識(shí)別 async startCameraPicker() { ????let pickerProfile: picker.PickerProfile = { ??????cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK, ????}; ????let result: picker.PickerResult = ??????await picker.pick(getContext(), [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], ????????pickerProfile); ????let uri = result.resultUri; ????let imageSource: image.ImageSource; ????let chooseImage: PixelMap; ????setTimeout(async () => { ??????let fileSource = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY); ??????imageSource = image.createImageSource(fileSource.fd); ??????chooseImage = await imageSource.createPixelMap(); ??????if (!chooseImage) { ????????return; ??????} ??????// 獲取圖片后調(diào)用文本識(shí)別接口 ??????let visionInfo: textRecognition.VisionInfo = { ????????pixelMap: chooseImage ??????}; ??????let textConfiguration: textRecognition.TextRecognitionConfiguration = { ????????isDirectionDetectionSupported: true ??????}; ??????await textRecognition.recognizeText(visionInfo, textConfiguration).then((textRecognitionResult) => { ????????if (textRecognitionResult.value !== '') { ??????????this.search(textRecognitionResult.value) ????????} ??????}) ????}, 100) ??}
系統(tǒng)路由封裝及使用
?// 1、定義路由工具類 import { RouterMap } from './constants/RouterMap'; ? export default interface NavRouterInfo { ??url: string; // 跳轉(zhuǎn)路由名 ??mode?: NavDestinationMode; // NavDestination類型 ??param?: Object; // 傳遞參數(shù) ??onPop?: Callback<PopInfo>; // 回調(diào)事件 } ? class RouterModule { ??public static stack: NavPathStack = new NavPathStack(); ??static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>(); ? ??// 頁(yè)面跳轉(zhuǎn)(指定頁(yè)面) ??public static push(info: NavRouterInfo, animated?: boolean) { ????try { ??????RouterModule.stack.pushPathByName(info.url, info.param, info.onPop, animated); ????} catch (err) { ????} ??} ? ??// 頁(yè)面替換(指定頁(yè)面) ??public static replace(info: NavRouterInfo) { ????try { ??????RouterModule.stack.replacePathByName(info.url, info.param); ????} catch (err) { ????} ??} ? ??// 頁(yè)面回退(上個(gè)頁(yè)面) ??public static pop<T = boolean>(result?: T, animated?: boolean) { ????try { ??????RouterModule.stack.pop(result, animated); ????} catch (err) { ????} ??} ? ??// 頁(yè)面回退(攜帶參數(shù)) ??public static popWithRes(res: ESObject, animated?: boolean) { ????try { ??????RouterModule.stack.pop(res, animated); ????} catch (err) { ????} ??} ? ??// 頁(yè)面回退(至對(duì)應(yīng)頁(yè)面名) ??public static popToName(name: string, animated?: boolean) { ????try { ??????RouterModule.stack.popToName(name, animated); ????} catch (err) { ????} ??} ? ??// 頁(yè)面棧清空(回Navigation) ??public static clear(animated?: boolean) { ????try { ??????RouterModule.stack.clear(animated); ????} catch (err) { ????} ??} ? ??// 獲取頁(yè)面棧大小 ??public static size(): number { ????return RouterModule.stack.size(); ??} ? ??// 獲取參數(shù)(指定頁(yè)面) ??public static getNavParam<T = Object>(info: NavRouterInfo): T | undefined { ????try { ??????const paramsArr = RouterModule.stack.getParamByName(info.url) as T[] | undefined[]; ??????return paramsArr.pop(); ????} catch (err) { ????} ????return undefined; ??} ? ??// 獲取頁(yè)面名(頁(yè)面棧前一個(gè)) ??public static getSourcePage(): string | undefined { ????const pathNames = RouterModule.stack.getAllPathName(); ????pathNames.pop(); ????return pathNames.pop(); ??} } ? export { RouterModule, RouterMap }; ? // 2、定義RouterMap 注冊(cè)路由表時(shí)用 export enum RouterMap { ??// 主頁(yè) ??MAIN_PAGE = 'MainPage', } // 3、注冊(cè)路由表 export class RouterTable { ??static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>(); ? ??// 初始化路由表 ??public static routerInit() { ????RouterTable.builderMap.set(RouterMap.MAIN_PAGE, wrapBuilder(MainPageBuilder)); ??} ? ??// 通過(guò)名稱獲取builder ??public static getBuilder(builderName: string): WrappedBuilder<[]> { ????let builder = RouterTable.builderMap.get(builderName); ????return builder as WrappedBuilder<[]>; ??} } ? 4、使用前需先init注冊(cè) ?// 初始化路由表 ????RouterTable.routerInit() ? // 創(chuàng)建導(dǎo)航Navigation @Builder ??pageMap(name: string) { ????NavDestination() { ??????RouterTable.getBuilder(name).builder() ????} ????.mode(NavDestinationMode.STANDARD) ????.hideTitleBar(true) ????.onBackPressed(() => { ??????return this.backPress(name) ????}) ??} ? ??build() { ????Column() { ??????Navigation(RouterModule.stack) { ??????} ??????.hideNavBar(true) ??????.hideToolBar(true) ??????.hideTitleBar(true) ??????.hideBackButton(true) ??????.mode(NavigationMode.Stack) ??????.navDestination(this.pageMap) ????} ??} |
- 模板集成
本模板提供了兩種代碼集成方式,供開發(fā)者自由選用。
整體集成(下載模板)
開發(fā)者可以選擇直接基于模板工程開發(fā)自己的應(yīng)用工程。
模板代碼獲?。?/strong>
- 通過(guò)IDE插件創(chuàng)建模板工程,開發(fā)指導(dǎo)。
- 通過(guò)生態(tài)市場(chǎng)下載源碼,下載模板。
- 通過(guò)開源倉(cāng)訪問(wèn)源碼,倉(cāng)庫(kù)地址。
打開模板工程,根據(jù)README說(shuō)明中的快速入門章節(jié),將自己的應(yīng)用信息配置在模板工程內(nèi),即可運(yùn)行并查看模板效果。
根據(jù)自己的業(yè)務(wù)內(nèi)容修改模板,進(jìn)行定制化開發(fā)。
按需集成
若開發(fā)者已搭建好自己的應(yīng)用工程,但暫未實(shí)現(xiàn)其中的部分場(chǎng)景能力,可以選擇取用其中的業(yè)務(wù)組件,集成在自己的工程中。
組件代碼獲?。?/strong>
- 通過(guò)IDE插件下載組件源碼。開發(fā)指導(dǎo)
- 通過(guò)生態(tài)市場(chǎng)下載組件源碼。下載地址
下載組件源碼,根據(jù)README中的說(shuō)明,將組件包配置在自己的工程中。
根據(jù)API參考和示例代碼,將組件集成在自己的對(duì)應(yīng)場(chǎng)景中。
以上是第三期“教育行業(yè)-教育備考”行業(yè)優(yōu)秀案例的內(nèi)容,更多行業(yè)敬請(qǐng)期待~
歡迎下載使用行業(yè)模板“點(diǎn)擊下載”,若您有體驗(yàn)和開發(fā)問(wèn)題,或者迫不及待想了解XX行業(yè)的優(yōu)秀案例,歡迎在評(píng)論區(qū)留言,小編會(huì)快馬加鞭為您解答~
同時(shí)誠(chéng)邀您添加下方二維碼加入“組件模板活動(dòng)社群”,精彩上新&活動(dòng)不錯(cuò)過(guò)!
?? 本系列持續(xù)更新,歡迎收藏本帖!
第1期 HarmonyOS官方模板優(yōu)秀案例 | 便捷生活行業(yè) · 購(gòu)物中心>>點(diǎn)擊查看
第2期 HarmonyOS官方模板優(yōu)秀案例 | 新聞行業(yè) · 綜合新聞>>點(diǎn)擊查看
第3期 HarmonyOS官方模板優(yōu)秀案例 | 教育行業(yè) · 教育備考>>點(diǎn)擊查看
第4期 HarmonyOS官方模板優(yōu)秀案例 | 餐飲行業(yè) · 美食菜譜>>馬上發(fā)布
第5期 HarmonyOS官方模板優(yōu)秀案例 | 工具行業(yè) · 日歷應(yīng)用>>馬上發(fā)布
?? HarmonyOS組件模板相關(guān)推薦
- 【活動(dòng)ing】HarmonyOS組件/模板集成創(chuàng)新活動(dòng),報(bào)名時(shí)間截止2025年8月30日,點(diǎn)擊查看
- 鴻蒙應(yīng)用開發(fā)者激勵(lì)計(jì)劃2025,點(diǎn)擊查看
- 目前還沒評(píng)論,等你發(fā)揮!