大地之道免安装绿色版
766M · 2025-09-17
? 鸿蒙生态为开发者提供海量的HarmonyOS模板/组件,助力开发效率原地起飞 ?
★ 一键直达 , 快速应用 ★
? 覆盖20+行业,本帖以汇总形式持续更新中,!一键三连!常看常新!
分类 |
三方库名称 |
功能 |
SDK链接 |
第三方登录类 |
创蓝闪验SDK、阿里一键登录SDK、中国移动号码认证服务、中国联通号码认证服务、中国电信号码认证服务 |
一键登录和验证用户手机号码与本机流量卡是否一致的服务 |
|
数据分析 |
com.umeng(友盟)SDK、百度统计SDK、com.efs SDK、GrowingIO SDK、阿里云数据分析 |
移动统计 |
|
浏览引擎 |
腾讯X5浏览内核SDK |
用于展现html页面 |
|
文档浏览 |
com.tencent.tbs(腾讯浏览服务)SDK、福昕SDK |
本地文档浏览 |
|
第三方应用开发支持 |
微信开放SDK |
支持微信授权登录、微信分享和微信支付以及ApplePay支付 |
|
三方支付 |
阿里支付 SDK、微信支付SDK、京东支付SDK、招商支付SDK |
支持支付宝支付 |
|
应用维护 |
阿里云热修复SDK、Logan、腾讯Bugly SDK |
线上问题修复、日志分析、提高服务稳定性,服务崩溃后快速定位问题 |
|
应用安全 |
阿里云HttpDNS SDK、网易易盾SDK、数盟、同盾业务安全 SDK、阿里APP防护 SDK |
防止域名劫持、提升应用安全;登录验证码 ;检测是否为风险设备;提供应用安全防护 |
|
地图 |
高德定位 SDK、百度地图SDK |
实现定位 |
|
推送 |
极光推送SDK、腾讯Push SDK、七陌Push SDK |
推送消息 |
|
互动小游戏 |
org.cocos2dx.lib(Cocos) SDK |
互动题目引擎 |
|
分享 |
腾讯QQ分享 SDK、QQ分享、小红书分享、抖音分享 |
动态分享 |
|
图片识别 |
科大讯飞SDK、随时问SDK、人教点读SDK |
文字转语音、图片识别、点读 |
|
APP投屏 |
乐播SDK |
APP投屏 |
|
音视频 |
火山引擎SDK、声网SDK、即构SDK、声通语音SDK |
在线直播、观看录播视频、语音识别 |
|
课堂管理 |
腾讯云课堂SDK |
课程列表、课程详情、在线直播、互动白板、聊天室等功能 |
说明:“以上三方库及链接仅为示例,三方库由三方开发者独立提供,以其官方内容为准”
基于以上行业分析,本期将介绍鸿蒙生态市场教育行业模板——教育备考应用模板,为行业提供常用功能的开发案例,模板主要分练习、课程和我的三大模块。
本模板主要页面及核心功能如下所示:
题库模板|-- 开屏页|-- 练习| |-- banner| |-- 搜索| └-- 答题练习|-- 课程| |-- 分类列表| |-- 精选课程| | |-- 课程详情| | └-- 支付购买| └-- 已购我的课程| |-- 练习模式| |-- 考试模式| |-- 错题记录| └-- 收藏记录| └-- 笔记记录└-- 我的|-- 用户信息| |-- 登录| |-- 用户信息|-- 我的订单|-- 我的错题|-- 我的收藏|-- 练习记录|-- 浏览记录└-- 设置|-- 个人信息|-- 意见反馈|-- 反馈记录|-- 隐私协议|-- 清除缓存└-- 退出登录
为支持开发者单独获取特定场景的页面和功能,本模板将功能完全自闭环的部分能力抽离出独立的行业组件模块,不依赖公共基础能力包,开发者可以单独集成,开箱即用,降低使用难度。
用户可在首页-搜题进入一键搜题页面,可输入、语音输入,拍照识别,粘贴和清除功能。
采用左右两个做为基础组件来实现业务,三级、多级目录采用数据源刷新特性实现具体业务。
用户可通过首页点击每日一练可进入答题练习页面,可添加笔记、收藏、答题等相关业务,答题这块只做了单选业务。
详细代码结构如下所示:
Exam ├─commons/commonLib/src/main │ ├─ets │ │ ├─components │ │ │ CommonHeader.ets // 一级页面标题组件 │ │ │ TopBar.ets // 标题菜单内容组件 │ │ ├─utils │ │ │ Logger.ets // 日志 │ │ │ PreferenceUtil.ets // 首选项 │ │ ├─viewModel │ │ │ BrowsingHistoryModel.ets // 记录模块数据模型 │ │ │ OrderInfo.ets // 订单数据模型 │ │ │ PracticeRecordModel.ets // 练习数据模型 │ └─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 // 数据类型 │ │ │ WXApiWrap.ets // 微信支付数据类型 │ │ └─viewmodel │ │ AggregatedPaymentVM.ets // 支付组件数据模型 │ └─resources │─components/answer_questions/src/main │ ├─ets │ │ ├─components │ │ │ AnswerQuestionsPage.ets // 答题组件 │ │ │ AddNotePage.ets // 添加笔记组件 │ │ │ AnswerSheetPage.ets // 答题卡组件 │ │ ├─dialog │ │ │ AddNoteDialog.ets // 添加笔记弹框 │ │ │ AnswerSheetDialog.ets // 答题卡弹框 │ │ └─viewModel │ │ TopicItemModel.ets // 答题选项模型 │ │ TopicPageModel.ets // 答题模型 │ └─resources │─components/feed_back/src/main │ ├─ets │ │ ├─components │ │ │ Feedback.ets // 意见反馈功能组件 │ │ ├─model │ │ │ FeedbackRecordModel.ets // 数据类型 │ │ ├─utils │ │ │ FileSelect.ets // 意见反馈功工具类 │ └─resources │─components/select_category/src/main │ ├─ets │ │ ├─components │ │ │ MainPage.ets // 二级分类组件 │ │ │ ThirdcatePage.ets // 三级分类组件 │ │ ├─model │ │ │ SelectCateModel.ets // 数据类型 │ └─resources │─components/login_info/src/main │ ├─ets │ │ ├─components │ │ │ AgreementDialog.ets // 同意协议弹窗组件 │ │ │ QuickLogin.ets // 一键登录组件 │ │ ├─model │ │ │ ErrorCode.ets // 错误码类型 │ │ │ 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 // 基础通用组件 │ │ ├─model │ │ │ SelectModel.ets // 选项数据模型 │ └─resources │─features/homePage/src/main │ ├─ets │ │ ├─components // 封装组件 │ │ │ CourseBookComponent.ets // 资料卡片组件 │ │ │ CourseComponent.ets // 课程卡片 │ │ ├─model │ │ │ ChapterPractice.ets // 分类页面数据模型 │ │ │ CommonTopic.ets // 分类数据模型 │ │ │ Course.ets // 课程数据模型 │ │ │ CourseArray.ets // 课程数组模型 │ │ │ CourseBook.ets // 资料模型 │ │ │ CourseQuestions.ets // 科目数据模型 │ │ │ PracticeMode.ets // 业务类型数据模型 │ │ │ TopicItemModel.ets // 答题类型数据模型 │ │ │ TopicModel.ets // 分类数据源 │ │ ├─pages │ │ │ ChapterPractice.ets // 科目页面 │ │ │ FeaturedCourses.ets // 精选课程页面 │ │ │ MainPage.ets // 练习首页面 │ │ │ MaterialDownload.ets // 资料页面 │ │ │ SearchIndexPage.ets // 搜索页面 │ │ │ SearchInputPage.ets // 搜索输入框页面 │ │ │ SecondListPage.ets // 2级分类 │ │ │ ThirdListPage.ets // 3级分类 │ │ │ TopicHomePage.ets // 1级分类 │ │ │ └─resources │─features/topicPage/src/main │ ├─ets │ │ ├─views │ │ │ AnswerQuestionsPage.ets // 答题模式一页面 │ │ │ AnswerQuestionsTwoPage.ets // 答题模式二页面 │ │ │ CourseHomePage.ets // 课程页面 │ │ │ CourseIntroductionPage.ets // 课程详情页面 │ │ │ ExamResultPage.ets // 答题结果页面 │ │ │ GoodCourseDetailPage.ets // 精选课程页面 │ │ │ MockTestPage.ets // 科目练习页面 │ │ │ MyCollectionPage.ets // 收藏页面 │ │ │ MyNotesPage.ets // 笔记页面 │ │ │ MyWrongPage.ets // 错题页面 │ │ │ TestReportPage.ets // 测试报告页面 │ │ │ ViewNotePage.ets // 笔记组件 │ │ └─viewModel │ │ │ CourseHomeModel.ets // 课程页面数据模型 │ │ │ PracticeMode.ets // 科目数据模型 │ │ │ SecondListModel.ets // 选项类型数据模型 │─features/minePage/src/main │ ├─ets │ │ ├─components │ │ │ Header.ets // Header组件 │ │ ├─viewModel // 数据类型 │ │ │ MessageModel.ets │ │ │ setUpModel.ets // 设置相关模型数据模型 │ │ │ MineModel.ets // 用户资料信息数据模型 │ │ ├─views │ │ │ AboutPage.ets // 关于页面 │ │ │ AuthenticationPage.ets // 用户认证协议页面 │ │ │ BrowsingHistoryPage.ets // 浏览页面 │ │ │ CollectionPage.ets // 课程收藏页面 │ │ │ CoursePage.ets // 课程精选页面 │ │ │ EditPersonalCenterPage.ets // 个人信息详情页面 │ │ │ FeedbackPage.ets // 意见反馈页面 │ │ │ FeedbackRecordPage.ets // 反馈记录页面 │ │ │ MessageCenterPage.ets // 消息页面 │ │ │ MinePage.ets // 我的页面 │ │ │ MyOrderPage.ets // 订单首页页面 │ │ │ OneDayPracticeRecordsPage.ets // 单个练习记录页面 │ │ │ OrderDetailPage.ets // 订单详情页面 │ │ │ OrderListPage.ets // 订单页面 │ │ │ PracticeDetailsPage.ets // 反馈页面 │ │ │ PracticeRecordsPage.ets // 练习记录页面 │ │ │ PrivacyAgreementPage.ets // 同意 │ │ │ PrivacyPage.ets // 协议 │ │ │ PrivacyStatementPage.ets // 隐私页面 │ │ │ SetupPage.ets // 设置页面 │ │ │ TermsOfServicePage.ets // 用户服务页面 └─products/entry/src/main ├─ets │ ├─entryability │ │ EntryAbility.ets // 应用程序入口 │ ├─entrybackupability │ │ EntryBackupAbility.ets // Backup配置入口 │ ├─pages │ │ Index.ets // 入口页面 │ │ LoginPage.ets // login页面 │ ├─model │ │ TabListItem.ets // 数据声明 │ ├─viewmodels │ │ MainVM.ets // 页面数据模型 │ ├─common // 常量及Tab数据源 │ TabConstants.ets └─resources
本篇代码非应用的全量代码,只包括应用的部分能力的关键代码。
若需获取全量代码,请查看模板集成章节。
// 语音识别// 请求权限后创建服务并监听this.atManager.requestPermissionsFromUser(this.context, ['ohos.permission.MICROPHONE']) .then(async (data) => { if (data.authResults[0] === 0) { await this.createSREngine() this.startListener() } }) .catch(() => { //在此处进行异常处理 });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) { //在此处进行异常处理 } } 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 // 创建回调对象 let setListener: speechRecognizer.RecognitionListener = { // 开始识别成功回调 onStart() { }, // 事件回调 onEvent() { }, // 识别结果回调,包括中间结果和最终结果 onResult(_sessionId: string, result: speechRecognizer.SpeechRecognitionResult) { that.textInput = that.textInputPre + result.result }, // 识别完成回调 onComplete() { that.textInputPre = that.textInput }, // 错误回调,错误码通过本方法返回 // 返回错误码1002200002,开始识别失败,重复启动startListening方法时触发 // 更多错误码请参考错误码参考 onError() { }, } // 设置回调 this.asrEngine?.setListener(setListener); };// 拍照识别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; } // 获取图片后调用文本识别接口 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) }
// 1、定义路由工具类import { RouterMap } from './constants/RouterMap';export default interface NavRouterInfo { url: string; // 跳转路由名 mode?: NavDestinationMode; // NavDestination类型 param?: Object; // 传递参数 onPop?: Callback<PopInfo>; // 回调事件}class RouterModule { public static stack: NavPathStack = new NavPathStack(); static builderMap: Map<string, WrappedBuilder<[object]>> = new Map<string, WrappedBuilder<[object]>>(); // 页面跳转(指定页面) public static push(info: NavRouterInfo, animated?: boolean) { try { RouterModule.stack.pushPathByName(info.url, info.param, info.onPop, animated); } catch (err) { } } // 页面替换(指定页面) public static replace(info: NavRouterInfo) { try { RouterModule.stack.replacePathByName(info.url, info.param); } catch (err) { } } // 页面回退(上个页面) public static pop<T = boolean>(result?: T, animated?: boolean) { try { RouterModule.stack.pop(result, animated); } catch (err) { } } // 页面回退(携带参数) public static popWithRes(res: ESObject, animated?: boolean) { try { RouterModule.stack.pop(res, animated); } catch (err) { } } // 页面回退(至对应页面名) public static popToName(name: string, animated?: boolean) { try { RouterModule.stack.popToName(name, animated); } catch (err) { } } // 页面栈清空(回Navigation) public static clear(animated?: boolean) { try { RouterModule.stack.clear(animated); } catch (err) { } } // 获取页面栈大小 public static size(): number { return RouterModule.stack.size(); } // 获取参数(指定页面) 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; } // 获取页面名(页面栈前一个) public static getSourcePage(): string | undefined { const pathNames = RouterModule.stack.getAllPathName(); pathNames.pop(); return pathNames.pop(); }}export { RouterModule, RouterMap };// 2、定义RouterMap 注册路由表时用 export enum RouterMap { // 主页 MAIN_PAGE = 'MainPage',}// 3、注册路由表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)); } // 通过名称获取builder public static getBuilder(builderName: string): WrappedBuilder<[]> { let builder = RouterTable.builderMap.get(builderName); return builder as WrappedBuilder<[]>; }}4、使用前需先init注册 // 初始化路由表 RouterTable.routerInit()// 创建导航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) } }
本模板提供了两种代码集成方式,供开发者自由选用。
开发者可以选择直接基于模板工程开发自己的应用工程。
根据自己的业务内容修改模板,进行定制化开发。
若开发者已搭建好自己的应用工程,但暂未实现其中的部分场景能力,可以选择取用其中的业务组件,集成在自己的工程中。
以上是第三期“教育行业-教育备考”行业优秀案例的内容,更多行业敬请期待~
欢迎下载使用行业模板“”,若您有体验和开发问题,或者迫不及待想了解XX行业的优秀案例,欢迎在评论区留言,小编会快马加鞭为您解答~
同时诚邀您添加下方二维码加入“组件模板活动社群”,精彩上新&活动不错过!
? 本系列持续更新,欢迎点击帖子末尾左下角“”收藏本帖!
期数 |
帖子 |
链接 |
第1期 |
HarmonyOS官方模板优秀案例 | 便捷生活行业 · 购物中心 |
|
第2期 |
HarmonyOS官方模板优秀案例 | 新闻行业 · 综合新闻 |
|
第3期 |
HarmonyOS官方模板优秀案例 | 教育行业 · 教育备考 |
|
第4期 |
HarmonyOS官方模板优秀案例 | 餐饮行业 · 美食菜谱 |
马上发布 |
第5期 |
HarmonyOS官方模板优秀案例 | 工具行业 · 日历应用 |
马上发布 |
第6期 |
小编加急整理中,敬请期待 |