鴻蒙NEXT項目實戰-百得知識庫01

代碼倉地址,大家記得點個star

IbestKnowTeach: 百得知識庫基于鴻蒙NEXT穩定版實現的一款企業級開發項目案例。 本案例涉及到多個鴻蒙相關技術知識點: 1、布局 2、配置文件 3、組件的封裝和使用 4、路由的使用 5、請求響應攔截器的封裝 6、位置服務 7、三方庫的使用和封裝 8、頭像上傳 9、應用軟件更新等https://gitee.com/xt1314520/IbestKnowTeach

項目準備

項目介紹

“百得知識庫軟件”是一款專注于編程技術領域的學習資源App,旨在為開發者提供豐富的學習材料。這里涵蓋了廣泛的IT相關知識,無論是編程語言、軟件開發,還是最新的技術趨勢,都能找到詳盡的資料。該軟件不僅有助于開發者提升專業技能,還通過完善的社區和文檔支持促進交流與合作。用戶可以輕松獲取解決方案,參與討論,從而加速個人成長和技術問題的解決。

通過項目學到什么

  1. 華為賬號授權登錄
  2. 三方庫的使用和封裝
  3. 組件的封裝和使用
  4. 頭像上傳
  5. 應用軟件更新
  6. 日歷組件的使用
  7. 地理位置定位

......

創建項目

1、點擊文件,新建項目

2、選擇模板

修改項目名,包名,項目名等信息

3、完成創建

4、打開模擬器,運行項目

5、修改應用名稱和圖標

1、在跟目錄下面AppScope/resources/base/media替換app_icon圖片

2、修改module.json5文件

替換成app_icon

3、修改應用名稱

將label修改成百得知識庫

導入靜態資源

1、resources/base/element

📎color.json

📎float.json

📎string.json

2、resources/en_US/element

📎string.json

3、resources/zh_CN/element

📎string.json

4、百得知識庫里面的靜態圖片資源

https://download.csdn.net/download/weixin_51166786/90426858

5、修改module.json5里面的startWindowIcon里面的值

"startWindowIcon": "$media:start_icon"

項目三方庫依賴

三方庫官方地址:

OpenHarmony三方庫中心倉

1、@ohos/axios (網絡請求三方庫)

ohpm install @ohos/axios@2.2.0

2、@ibestservices/ibest-ui (組件三方庫)

ohpm install @ibestservices/ibest-ui@2.0.3

日志的封裝

在ets下面新建utils目錄,然后在這個目錄下面新建Logger.ets

import { hilog } from '@kit.PerformanceAnalysisKit'const DOMAIN = 0x0000
const TAG = 'wdl'
const FORMAT = '%{public}s %{public}s'export class Logger {static debug(...args: string[]) {hilog.debug(DOMAIN, TAG, FORMAT, args)}static info(...args: string[]) {hilog.info(DOMAIN, TAG, FORMAT, args)}static warn(...args: string[]) {hilog.warn(DOMAIN, TAG, FORMAT, args)}static error(...args: string[]) {hilog.error(DOMAIN, TAG, FORMAT, args)}
}

文本提示框的封裝

在ets/utils目錄下面新建Toast.ets

import promptAction from '@ohos.promptAction'/*** 顯示toast* @param { string } message 顯示的信息*/
export function showToast(message: string) {promptAction.showToast({message: message || '請求錯誤',duration: 2000,})
}

用戶首選項的封裝

在ets/utils目錄下面新建PreferencesUtil.ets

import { preferences } from '@kit.ArkData'export class PreferencesUtil {/*** 保存數據到首選項* @param preferencesName* @param key* @param value*/static async savaData<T extends keyof number | number | string | boolean | Array<number> | Array<string> | Array<boolean>>(preferencesName: string,key: string, value: T) {const pre = preferences.getPreferencesSync(getContext(), { name: preferencesName })pre.putSync(key, value as preferences.ValueType)await pre.flush()}/*** 獲取數據* @param preferencesName* @param key* @param defaultValue* @returns*/static getData<T extends keyof number | number | string | boolean | Array<number> | Array<string> | Array<boolean>>(preferencesName: string,key: string, defaultValue: T) {const pre = preferences.getPreferencesSync(getContext(), { name: preferencesName })return pre.getSync(key, defaultValue as preferences.ValueType) as T}/*** 刪除數據* @param preferencesName* @param key*/static async delAllData(preferencesName: string, key: string) {const pre = preferences.getPreferencesSync(getContext(), { name: preferencesName })pre.deleteSync(key)await pre.flush()}
}

新建常量類

在ets/contants目錄下面新建CommonConstant.ets和RouterConstant.ets

1、CommonConstant.ets

export class CommonConstant {/*** 百分百寬度*/static readonly WIDTH_FULL = '100%'/*** 百分百高度*/static readonly HEIGHT_FULL = '100%'/*** 開屏廣告頁面默認展示時間,單位秒*/static readonly ADVERTISING_TIME: number = 3;/*** 結束時間,單位秒*/static readonly ADVERTISING_END_TIME: number = 0;/*** 存token值的名稱(token)*/static readonly TOKEN_NAME: string = 'token';/*** 用戶首選項實例的名稱*/static readonly PREFERENCES_NAME: string = 'preferences';/*** 存用戶信息的本地存儲名稱*/static readonly USER_INFO: string = 'userInfo';/*** 登錄錯誤*/static readonly DEFAULT_LOGIN_ERROR: string = '登錄錯誤';
}

2、RouterConstant.ets

export class RouterConstant {/*** 首頁*/static readonly PAGE_INDEX = 'pages/Index'/*** 登錄*/static readonly PAGE_LOGIN = 'pages/LoginPage'/*** 打卡*/static readonly VIEWS_CLOCK = 'views/Learn/Clock'/*** 打卡記錄*/static readonly VIEWS_CLOCK_RECORD = 'views/Learn/ClockRecord'/*** 學習目標*/static readonly VIEWS_LEARN_TARGET = 'views/Learn/LearnTarget'/*** 學習工具*/static readonly VIEWS_LEARN_TOOL = 'views/Learn/LearnTool'/*** 學習平臺內容*/static readonly VIEWS_LEARN_CONTENT = 'views/Learn/LearnContent'/*** 面試平臺內容*/static readonly VIEWS_INTERVIEW_CONTENT = 'views/Learn/InterviewContent'/*** home頁面*/static readonly VIEWS_HOME_HOME = 'views/Home/Home'/*** 文章詳情頁面*/static readonly VIEWS_HOME_ARTICLE_INFO = 'views/Home/ArticleInfo'/*** home搜索頁面*/static readonly VIEWS_HOME_SEARCH = 'views/Home/Search'/*** 消息列表頁面*/static readonly VIEWS_MESSAGE_LIST = 'views/Message/MessageList'/*** 個人信息*/static readonly VIEWS_MINE_INFO = 'views/Mine/MineInfo'/*** 我的收藏*/static readonly VIEWS_MINE_COLLECT = 'views/Mine/MineCollect'/*** 我的點贊*/static readonly VIEWS_MINE_LIKE = 'views/Mine/MineLike'/*** 關于我們*/static readonly VIEWS_MINE_ABOUT_US = 'views/Mine/AboutUS'/*** 設置*/static readonly VIEWS_MINE_SET_UP = 'views/Mine/SetUp'/*** 隱私政策*/static readonly PAGE_PRIVACY_POLICY = 'pages/PrivacyPolicyPage'/*** 用戶協議*/static readonly PAGE_USER_POLICY = 'pages/UserPolicyPage'
}

請求響應攔截器的封裝

在ets下面新建request目錄,然后在這個目錄下面新建Request.ets和Request.type.ets

1、Request.ets

import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios'
import { CODE_TYPE, BASE_HOST } from "./Request.type"
import { Logger } from '../utils/Logger';
import { showToast } from '../utils/Toast';
import { CommonConstant } from '../contants/CommonConstant';
import { PreferencesUtil } from '../utils/PreferencesUtil';
import { router } from '@kit.ArkUI';
import { RouterConstant } from '../contants/RouterConstant';/*** axios封裝*/
const http = axios.create({baseURL: `http://${BASE_HOST}`,headers: {'Content-Type': 'application/json',"Channel": "B2B"}
},)/*** 添加請求攔截器*/
http.interceptors.request.use((config: InternalAxiosRequestConfig) => {// 獲取數據const token: string | undefined = AppStorage.get("token")// 獲取tokenif (token) {config.headers.Authorization = token}return config;
}, (error: AxiosError) => {// 對請求錯誤做些什么return Promise.reject(error);
});/*** 添加響應攔截器*/
http.interceptors.response.use((response: AxiosResponse) => {Logger.info("請求狀態碼" + response.data.code, JSON.stringify(response.data));// 判斷響應狀態碼if (response.status === CODE_TYPE.SUCCESS) {// 請求成功if (response.data.code === CODE_TYPE.SUCCESS) {return Promise.resolve(response.data.data);} else if (response.data.code === CODE_TYPE.NO_LOGIN) {clearLoginInfoAndGoLoginPage();}}// 接口響應報錯新信息showToast(response.data.message);return Promise.reject(response);
}, (error: AxiosError) => {showToast('網絡錯誤,換個網絡試試');return Promise.reject(error);
});export default http;/*** 清除用戶信息并跳到登錄頁面*/
async function clearLoginInfoAndGoLoginPage() {// 401錯誤  -> 清理用戶信息,跳轉到登錄頁// 清理token,返回登錄頁// userInfo有訂閱者刪不掉,所以重新賦值空的給userInfoAppStorage.setOrCreate(CommonConstant.USER_INFO, {nickname: '',unionId: '',avatarUri: '',id: 0})AppStorage.delete(CommonConstant.TOKEN_NAME)await PreferencesUtil.delAllData(CommonConstant.PREFERENCES_NAME, CommonConstant.TOKEN_NAME)await PreferencesUtil.delAllData(CommonConstant.PREFERENCES_NAME, CommonConstant.USER_INFO)// 跳轉登錄頁面router.pushUrl({url: RouterConstant.PAGE_LOGIN})
}

2、Request.type.ets

export enum CODE_TYPE {SUCCESS = 200,NO_LOGIN = 401
}/*** host地址*/
export const BASE_HOST = '118.31.50.145:9003'

服務端接口文檔地址

api.md

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

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

相關文章

【DeepSeek應用】本地部署deepseek模型后,如何在vscode中調用該模型進行代碼撰寫,檢視和優化?

若已成功在本地部署了 DeepSeek 模型(例如通過 vscode-llm、ollama 或私有 API 服務),在 VS Code 中調用本地模型進行代碼撰寫、檢視和優化的完整流程如下: 1. 準備工作:確認本地模型服務狀態 模型服務類型: 若使用 HTTP API 服務(如 FastAPI/Flask 封裝),假設服務地址…

jenkins 配置郵件問題整理

版本&#xff1a;Jenkins 2.492.1 插件&#xff1a; A.jenkins自帶的&#xff0c; B.安裝功能強大的插件 配置流程&#xff1a; 1. jenkins->系統配置->Jenkins Location 此處的”系統管理員郵件地址“&#xff0c;是配置之后發件人的email。 2.配置系統自帶的郵件A…

Android Coil3階梯preload批量Bitmap拼接扁平寬圖,Kotlin

Android Coil3階梯preload批量Bitmap拼接扁平寬圖&#xff0c;Kotlin <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-p…

C++基礎 [八] - list的使用與模擬實現

目錄 list的介紹 List的迭代器失效問題 List中sort的效率測試 list 容器的模擬實現思想 模塊分析 作用分析 list_node類設計 list 的迭代器類設計 迭代器類--存在的意義 迭代器類--模擬實現 模板參數 和 成員變量 構造函數 * 運算符的重載 運算符的重載 -- 運…

【系統架構設計師】操作系統 - 特殊操作系統 ③ ( 微內核操作系統 | 單體內核 操作系統 | 內核態 | 用戶態 | 單體內核 與 微內核 對比 )

文章目錄 一、微內核操作系統1、單體內核 操作系統2、微內核操作系統 引入3、微內核操作系統 概念4、微內核操作系統 案例 二、單體內核 與 微內核 對比1、功能對比2、單體內核 優缺點3、微內核 優缺點 一、微內核操作系統 1、單體內核 操作系統 單體內核 操作系統 工作狀態 : …

系統思考:惡性循環

去年&#xff0c;我給一家知名人力資源公司交付了兩個項目——一個在6月&#xff0c;另一個在8月&#xff0c;至今半年多了依然沒有收到課酬。催促多次&#xff0c;得到的答復卻各式各樣&#xff1a;銷售說老板卡了額度&#xff0c;老板說具體情況還需了解。每一次的推諉&#…

基于springboot的房屋租賃系統(008)

摘 要 社會的發展和科學技術的進步&#xff0c;互聯網技術越來越受歡迎。網絡計算機的生活方式逐漸受到廣大人民群眾的喜愛&#xff0c;也逐漸進入了每個用戶的使用。互聯網具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等優點。 因此&#xff0c;構建符…

視頻翻譯器免費哪個好?輕松玩轉視頻直播翻譯

你是不是覺得看外語視頻很麻煩&#xff1f;每次遇到喜歡的外語電影、電視劇或動漫&#xff0c;總是要等字幕組的翻譯&#xff0c;或者因為語言不通而錯過精彩的情節。 這個時候&#xff0c;掌握多語種直播翻譯方案就顯得尤為重要&#xff0c;有了實時字幕&#xff0c;看外語視…

在cherry studio中使用MCP——本地文件管理FileSystem

cherry studio是一款開源的AI助手工具&#xff0c;可以便捷地利用API訪問各種LLM&#xff0c;有關cherry studio的使用這里不再多說&#xff0c;可以參考這篇文章https://blog.csdn.net/m0_65494437/article/details/145478823 官網&#xff1a;https://cherry-ai.com/ MCP是什…

從點燈開始的51單片機生活

陵谷紛紜新事改&#xff0c;筑臺土石未應遲。 目錄 sfr與sbit&#xff1f;不靠定時器的delay_ms延時函數所謂寄存器 sfr與sbit&#xff1f; 這第一課咱們主要來先理解一下sfr與sbit&#xff0c;以下可能是咱們這些新手朋友常見的點燈代碼&#xff1a; #include<regx52.h&g…

Django系列教程(13)——Cookie和Session應用場景及案例

目錄 什么是cookie&#xff0c;cookie的應用場景及缺點 Django中如何使用cookie Cookie使用示例 什么是session及session的工作原理 Django中如何使用會話session Session使用示例 小結 HTTP協議本身是”無狀態”的&#xff0c;在一次請求和下一次請求之間沒有任何狀態保…

c++類和對象(下篇)下

下面就來補充一下c雷和對象最后一點內容. 首先先補充一下上一篇博客上c類和對象(下篇)上-CSDN博客最后學習的靜態成員變量的小練習求123...n_牛客題霸_牛客網 (nowcoder.com)下面就是題解.靈活的運用了靜態成員變量不銷毀的特點,建立數組利用構造函數來完成n次相加. class A{ …

《TCP/IP網絡編程》學習筆記 | Chapter 19:Windows 平臺下線程的使用

《TCP/IP網絡編程》學習筆記 | Chapter 19&#xff1a;Windows 平臺下線程的使用 《TCP/IP網絡編程》學習筆記 | Chapter 19&#xff1a;Windows 平臺下線程的使用內核對象內核對象的定義內核對象歸操作系統所有 基于 Windows 的線程創建進程與線程的關系Windows 中線程的創建方…

分布式事務解決方案:Seata原理詳解與實戰教程

一、為什么需要Seata&#xff1f; 在微服務架構中&#xff0c;跨服務的事務管理成為核心痛點&#xff1a; 傳統事務失效&#xff1a;服務拆分導致無法使用本地事務數據不一致風險&#xff1a;網絡抖動、服務宕機等情況導致數據錯亂復雜場景處理難&#xff1a;涉及多個數據庫、…

docker需要sudo才能使用

一種方法是添加當前用戶到docker組里去&#xff0c;當時添加的時候貌似是沒問題的&#xff0c;但是現在又不可以了 產生的報錯 ? docker images Cannot connect to the Docker daemon at unix:///home/ying/.docker/desktop/docker.sock. Is the docker daemon running?解決…

學習記錄 6 pointnet復現

一、復現代碼 然后去找相關的2d的聲吶圖像分類的算法 融合可以搞的&#xff0c;雖然有文獻但是不多&#xff0c;感覺也是可以的 """ Author: Benny Date: Nov 2019 """import os import sys import torch import numpy as npimport datetime …

Linux 文件操作-標準IO函數3- fread讀取、fwrite寫入、 fprintf向文件寫入格式化數據、fscanf逐行讀取格式化數據的驗證

目錄 1. fread 從文件中讀取數據 1.1 讀取次數 每次讀取字節數 < 原內容字節數 1.2 讀取次數 每次讀取字節數 > 原內容字節數 2.fwrite 向文件中寫入數據 2.1寫入字符串驗證 2.2寫入結構體驗證 3. fprintf 將數據寫入到指定文件 4. fscanf 從文件中逐行讀取內容…

Python 中下劃線 “_” 的多面性:從變量到約定

# Python中下劃線“_”的多面性&#xff1a;從變量到約定 在Python的語法體系里&#xff0c;下劃線“_”看似毫不起眼&#xff0c;實則扮演著極為重要且多樣化的角色。它不僅能作為普通變量參與編程&#xff0c;更在多個特殊場景下有著獨特的用途與約定。深入理解下劃線的各種…

深入 Linux 聲卡驅動開發:核心問題與實戰解析

1. 字符設備驅動如何為聲卡提供操作接口&#xff1f; 問題背景 在 Linux 系統中&#xff0c;聲卡被抽象為字符設備。如何通過代碼讓應用程序能夠訪問聲卡的錄音和播放功能&#xff1f; 核心答案 1.1 字符設備驅動的核心結構 Linux 字符設備驅動通過 file_operations 結構體定…

基于Spring Boot的圖書管理系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…