鸿蒙开发中常用的工具类(不定时更新)

410 阅读3分钟

日志工具类

// 负责对整个项目的日志输出封装
import { hilog } from '@kit.PerformanceAnalysisKit'

// 定义日志域的标识符,此处值为0
const domain: number = 0x0000
// 定义日志的标签,用于标识日志来源
const tag: string = 'mylog'
// 定义日志输出的格式,占位符将会被实际内容替换
const format: string = '%{public}s,%{public}s'

// 定义一个Logger类,定义四个静态方法 debug、info、warn、error
export class Logger {
  // 调用hilog的debug方法,传入日志域标识符、标签、占位符和实际参数
  static debug(...args: string[]) {
    hilog.debug(domain, tag, format, ...args)
  }

  // 调用hilog的info方法,传入日志域标识符、标签、占位符和实际参数
  static info(...args: string[]) {
    hilog.info(domain, tag, format, ...args)
  }

  // 调用hilog的warn方法,传入日志域标识符、标签、占位符和实际参数
  static warn(...args: string[]) {
    hilog.warn(domain, tag, format, ...args)
  }

  // 调用hilog的error方法,传入日志域标识符、标签、占位符和实际参数
  static error(...args: string[]) {
    hilog.error(domain, tag, format, ...args)
  }
}

沉浸式模式类封装

import { window } from '@kit.ArkUI'

export class windowManager {
  // 启用全屏
  static async enableFullScreen() {
    const win = await window.getLastWindow(getContext())
    win.setWindowLayoutFullScreen(true)
  }

  // 禁用全屏
  static async disableFullScreen() {
    const win = await window.getLastWindow(getContext())
    win.setWindowLayoutFullScreen(false)
  }

  // 获取顶部安全区域高度
  static async getAvoidAreaTop() {
    const win = await window.getLastWindow(getContext())
    const area = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM)
    const topHeight = px2vp(area.topRect.height)
    AppStorage.setOrCreate('topHeight', topHeight)
    return topHeight
  }

  // 获取底部安全区域高度
  static async getAvoidAreeBottom() {
    const win = await window.getLastWindow(getContext())
    const area = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR)
    const bottomHeight = px2vp(area.bottomRect.height)
    AppStorage.setOrCreate('bottomHeight', bottomHeight)
    return bottomHeight
  }

  // 设置状态栏内容颜色
  static async settingStatusBarContentColor(color: '#FFFFFF' | '#000000') {
    const win = await window.getLastWindow(getContext())
    win.setWindowSystemBarProperties({ statusBarContentColor: color })
  }
}

封装request泛型方法

import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from '@ohos/axios'
import { iLoginUserModel, iResponseModel } from '../models/datamodel'
import { promptAction, router } from '@kit.ArkUI'

// 1. 准备一个axios的对象实例,同时设置好baseUrl
export const req = axios.create({
  baseURL: 'https://api-harmony-teach.itheima.net'
})

export class HdHttp {
  static async post<T>(url: string, data?: object) {
    return await HdHttp.request<T>('POST', url, data)
  }

  static async get<T>(url: string, params?: object) {
    return await HdHttp.request<T>('GET', url, params)
  }
  /*
  method:表示服务器的请求方法,Get,POST,PUT,Delete
   url:代表的是服务器的url路径(不包含基本域名地址) ,例如:hm/studyInfo
   * paramsOrData:请求传参,可选
   *
   * T:代表的是服务器响应数据中的 data这个属性的类型
   * */
  private static async request<T>(method: string, url: string, paramsOrData?: object) {
    try {
      //   1. 使用req来发送请求
      let reqConfig: AxiosRequestConfig = {
        method: method,
        url: url, //是请求接口的url路径部分,并且不带有/
      }
      // 2. 分请求类型来决定传参参数是parmas还是data
      if (method == 'GET') {
        reqConfig.params = paramsOrData
      } else {
        reqConfig.data = paramsOrData
      }

      // 3. 在请求前在header中携带token
      // 获取token
      let user = AppStorage.get<iLoginUserModel>('user')
      if (user && user.token) {
        reqConfig.headers = {
          'Authorization': `Bearer ${user.token}`
        }
      }

      let res: AxiosResponse<iResponseModel<T>> = await req.request(reqConfig)

      // 4. 处理服务器响应体中的code值为非10000的情况
      if (res.data.code != 10000) {
        //  将服务器的逻辑问题信息提示给用户
        promptAction.showToast({ message: res.data.message })
        return Promise.reject(res.data.message) //传递给外部调用者的 catch()中的信息
      }
      //   3. 返回结果(返回的是服务器的响应报文体的数据)
      return res.data

    } catch (err) {
      //  当服务器的http状态码为非200,就会执行catch
      let errObj: AxiosError = err
      // 判断服务器的响应状态码如果是401,表示token失效,此时应该提示用户和跳转到登录页面
      if (errObj.response?.status == 401) {
        promptAction.showToast({ message: '登录已失效,请重新登录' })
        router.replaceUrl({ url: 'pages/LoginPage' })
      } else {
        //  提示用户是什么错误即可
        promptAction.showToast({ message: '网络异常:' + errObj.message })
      }
      return Promise.reject(errObj.message) //传递给外部调用者的 catch()中的信息 外面使用者使用try{}catch(err){}
    }
  }
}