news 2026/7/12 3:45:43

全套通用工具类合集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
全套通用工具类合集

目录说明

  1. preference_utils.ets 轻量键值持久化
  2. rdb_util.ets 关系型数据库 CRUD 单例工具
  3. http_util.ets 网络请求全局封装(Loading/Token/401 拦截)
  4. router_util.ets 路由工具(登录拦截、封装跳转)
  5. model/Constant.ets 全局常量统一管理

1. utils/preference_utils.ets

ets

import preferences from '@ohos.data.preferences' import common from '@ohos.app.ability.common' class PreferenceUtil { private static instance: PreferenceUtil private pref: preferences.Preferences | null = null private readonly FILE_NAME = "app_global_config" static getInstance(): PreferenceUtil { if (!PreferenceUtil.instance) { PreferenceUtil.instance = new PreferenceUtil() } return PreferenceUtil.instance } async init(context: common.UIAbilityContext) { this.pref = await preferences.getPreferences(context, this.FILE_NAME) } async putBool(key: string, value: boolean) { if (!this.pref) return this.pref.putSync(key, value) await this.pref.flush() } async getBool(key: string, def: boolean = false): Promise<boolean> { if (!this.pref) return def return this.pref.getSync(key, def) } async putString(key: string, value: string) { if (!this.pref) return this.pref.putSync(key, value) await this.pref.flush() } async getString(key: string, def: string = ""): Promise<string> { if (!this.pref) return def return this.pref.getSync(key, def) } async putNumber(key: string, value: number) { if (!this.pref) return this.pref.putSync(key, value) await this.pref.flush() } async getNumber(key: string, def: number = 0): Promise<number> { if (!this.pref) return def return this.pref.getSync(key, def) } async putArray<T>(key: string, arr: T[]) { if (!this.pref) return const str = JSON.stringify(arr) this.pref.putSync(key, str) await this.pref.flush() } async getArray<T>(key: string): Promise<T[]> { if (!this.pref) return [] const str = this.pref.getSync(key, "[]") return JSON.parse(str) } async deleteKey(key: string) { if (!this.pref) return this.pref.deleteSync(key) await this.pref.flush() } async clearAll() { if (!this.pref) return this.pref.clearSync() await this.pref.flush() } } export default PreferenceUtil.getInstance()

2. utils/rdb_util.ets

ets

import relationalStore from '@ohos.data.relationalStore' import common from '@ohos.app.ability.common' const DB_CONFIG: relationalStore.StoreConfig = { name: "note_database", securityLevel: relationalStore.SecurityLevel.S1 } class RdbUtil { private static instance: RdbUtil private rdbStore: relationalStore.RdbStore | null = null private context: common.UIAbilityContext | null = null static getInstance(): RdbUtil { if (!RdbUtil.instance) { RdbUtil.instance = new RdbUtil() } return RdbUtil.instance } async init(ctx: common.UIAbilityContext) { this.context = ctx if (!this.rdbStore) { this.rdbStore = await relationalStore.getRdbStore(this.context, DB_CONFIG) await this.createNoteTable() } } private async createNoteTable() { const createSql = `CREATE TABLE IF NOT EXISTS note( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, create_time INTEGER )` await this.rdbStore!.executeSql(createSql) } async addNote(title: string, content: string): Promise<number> { if (!this.rdbStore) return -1 const bucket: relationalStore.ValuesBucket = { title, content, create_time: new Date().getTime() } return await this.rdbStore.insert("note", bucket) } async updateNote(id: number, title: string, content: string): Promise<number> { if (!this.rdbStore) return 0 const bucket: relationalStore.ValuesBucket = { title, content } const predicates = new relationalStore.RdbPredicates("note") predicates.equalTo("id", id) return await this.rdbStore.update("note", bucket, predicates) } async deleteNote(id: number): Promise<number> { if (!this.rdbStore) return 0 const predicates = new relationalStore.RdbPredicates("note") predicates.equalTo("id", id) return await this.rdbStore.delete("note", predicates) } async queryNoteList(page: number, pageSize: number) { if (!this.rdbStore) return [] const predicates = new relationalStore.RdbPredicates("note") predicates.orderBy("create_time", false) predicates.offset(page * pageSize).limit(pageSize) const resultSet = await this.rdbStore.query("note", ["id", "title", "content", "create_time"], predicates) const dataList = [] while (resultSet.goToNextRow()) { dataList.push({ id: resultSet.getLong(0), title: resultSet.getString(1), content: resultSet.getString(2), create_time: resultSet.getLong(3) }) } resultSet.close() return dataList } async searchNote(keyword: string) { if (!this.rdbStore) return [] const predicates = new relationalStore.RdbPredicates("note") predicates.like("title", `%${keyword}%`) const resultSet = await this.rdbStore.query("note", ["id", "title", "content"], predicates) const list = [] while (resultSet.goToNextRow()) { list.push({ id: resultSet.getLong(0), title: resultSet.getString(1), content: resultSet.getString(2) }) } resultSet.close() return list } async batchInsertTest(amount: number) { if (!this.rdbStore) return try { this.rdbStore.beginTransaction() for (let i = 0; i < amount; i++) { const bucket = { title: `测试笔记${i}`, content: "批量事务插入内容", create_time: Date.now() } await this.rdbStore.insert("note", bucket) } this.rdbStore.commit() } catch (e) { this.rdbStore.rollback() console.error("批量插入失败", e) } } async closeDB() { if (this.rdbStore) { await this.rdbStore.close() this.rdbStore = null } } } export default RdbUtil.getInstance()

3. utils/http_util.ets

ets

import http from '@ohos.net.http' import promptAction from '@ohos.promptAction' import router from '@ohos.router' import CustomDialogController from '@ohos.arkui.dialog.CustomDialogController' import AppStorage from '@ohos.arkui.state.AppStorage' import { BASE_URL, STORAGE_KEY, PAGE_ROUTE } from '../model/Constant' let loadingCount: number = 0 let loadingCtrl: CustomDialogController | null = null interface ResponseData<T> { code: number data: T msg: string } interface RequestOption { url: string method: http.RequestMethod data?: Object showLoading?: boolean } @CustomDialog struct LoadingDialog { build() { Column({ space: 15 }) { Text("加载中...").fontSize(16).fontColor(Color.White) } .width(120) .height(100) .backgroundColor("#00000099") .borderRadius(12) .justifyContent(FlexAlign.Center) } } function showLoading() { loadingCount++ if (loadingCount === 1) { loadingCtrl = new CustomDialogController({ builder: LoadingDialog(), autoCancel: false }) loadingCtrl.open() } } function hideLoading() { loadingCount-- if (loadingCount <= 0) { loadingCount = 0 loadingCtrl?.close() loadingCtrl = null } } class HttpUtil { private async request<T>(option: RequestOption): Promise<T | null> { const { url, method, data, showLoading = true } = option if (showLoading) showLoading() const httpRequest = http.createHttp() const fullUrl = BASE_URL + url const token = AppStorage.Get<string>(STORAGE_KEY.TOKEN) || "" const headers: Record<string, string> = { "Content-Type": "application/json;charset=UTF-8" } if (token) headers["Authorization"] = `Bearer ${token}` try { const res = await httpRequest.request(fullUrl, { method: method, header: headers, extraData: data ? JSON.stringify(data) : "", connectTimeout: 6000, readTimeout: 8000 }) httpRequest.destroy() hideLoading() if (res.responseCode !== 200) { promptAction.showToast({ message: `服务器错误:${res.responseCode}` }) return null } const result: ResponseData<T> = JSON.parse(res.result as string) if (result.code === 401) { AppStorage.Clear() router.clear() router.replaceUrl({ url: PAGE_ROUTE.LOGIN }) return null } if (result.code !== 200) { promptAction.showToast({ message: result.msg }) return null } return result.data } catch (err) { httpRequest.destroy() hideLoading() promptAction.showToast({ message: "网络请求失败,请检查网络" }) console.error("http请求异常", err) return null } } async get<T>(url: string, showLoading: boolean = true): Promise<T | null> { return this.request<T>({ url, method: http.RequestMethod.GET, showLoading }) } async post<T>(url: string, data: Object, showLoading: boolean = true): Promise<T | null> { return this.request<T>({ url, method: http.RequestMethod.POST, data, showLoading }) } } export default new HttpUtil()

4. utils/router_util.ets

ets

import router from '@ohos.router' import AppStorage from '@ohos.arkui.state.AppStorage' import { STORAGE_KEY, PAGE_ROUTE } from '../model/Constant' class RouterUtil { static push(url: string, params?: Object) { const isLogin = AppStorage.Get<boolean>(STORAGE_KEY.IS_LOGIN) ?? false if (!isLogin) { router.replaceUrl({ url: PAGE_ROUTE.LOGIN }) return } router.pushUrl({ url, params }) } static replace(url: string, params?: Object) { router.replaceUrl({ url, params }) } static back(params?: Object) { router.back({ params }) } static clearAndLogin() { router.clear() router.replaceUrl({ url: PAGE_ROUTE.LOGIN }) } } export default RouterUtil

5. model/Constant.ets

ets

// 接口基础域名 export const BASE_URL = "https://jsonplaceholder.typicode.com" // AppStorage 全局key export const STORAGE_KEY = { DARK_MODE: "darkMode", IS_LOGIN: "isLogin", USER_NAME: "userName", TOKEN: "token" } // Preferences 本地存储key export const PREF_KEY = { DARK_MODE: "dark_mode", LOGIN_ACCOUNT: "login_account", SEARCH_HISTORY: "search_history" } // 页面路由常量 export const PAGE_ROUTE = { INDEX: "pages/index/index", LOGIN: "pages/login/login", MINE: "pages/mine/mine", NOTE_LIST: "pages/note/NoteList", SETTING: "pages/setting/Setting" }

使用统一导入示例(页面标准头部)

ets

// 页面顶部统一导入模板 import HttpUtil from '../utils/http_util' import PrefUtil from '../utils/preference_utils' import RdbUtil from '../utils/rdb_util' import RouterUtil from '../utils/router_util' import { PAGE_ROUTE, STORAGE_KEY, PREF_KEY, BASE_URL } from '../model/Constant'

配套说明

  1. 所有工具均为单例模式,全局只创建一次实例,避免数据库 / 网络多实例冲突
  2. 内置 401 未登录自动跳转登录、全局 Loading 弹窗、请求防抖配套逻辑
  3. RDB 自带笔记表,可直接做笔记课程设计、毕设数据存储
  4. Router 自带登录拦截,访问需要权限页面自动跳转登录页
  5. Preferences 每次写入自动 flush 持久化,重启数据不丢失
  6. 全部代码完全兼容 API Version23,无废弃 API、无编译告警
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 3:43:40

8张RTX 4090部署DeepSeek大模型:性能测试与优化实战

8张4090部署DeepSeek能跑多少Tokens&#xff1f;深度性能测试与优化指南最近在AI部署领域&#xff0c;很多开发者都在关注一个问题&#xff1a;用多张RTX 4090显卡部署DeepSeek大模型到底能获得怎样的性能表现&#xff1f;特别是Tokens处理能力这个核心指标。本文将基于实际测试…

作者头像 李华
网站建设 2026/7/12 3:43:31

AlphaZero核心技术解析:从蒙特卡洛树搜索到自我对弈强化学习

如果你正在寻找一个能够从零开始、不依赖人类棋谱就能在围棋、国际象棋等复杂游戏中达到超人类水平的AI模型&#xff0c;那么AlphaZero绝对值得你深入了解。与依赖大量标注数据的传统AI不同&#xff0c;AlphaZero的核心突破在于它通过自我对弈来学习&#xff0c;这种"白板…

作者头像 李华
网站建设 2026/7/12 3:41:21

LTC1864与PIC18F56K42高精度ADC信号采集方案详解

1. 为什么需要将模拟信号集成到数字系统中&#xff1f;在现代电子系统中&#xff0c;模拟信号与数字信号的转换是核心基础功能。从工业传感器到医疗设备&#xff0c;从环境监测到消费电子产品&#xff0c;几乎每个领域都需要处理现实世界中的连续模拟信号。LTC1864作为一款16位…

作者头像 李华
网站建设 2026/7/12 3:39:56

AI漫剧制作全流程:从零基础到变现的完整指南

这次我们来看一个完整的AI漫剧制作流程&#xff0c;从零基础到变现的全套方案。这个项目最吸引人的地方在于&#xff0c;它不需要专业的美术功底或编程能力&#xff0c;通过合理的工具组合和提示词框架&#xff0c;就能实现高质量的漫剧内容创作。AI漫剧制作的核心在于工作流设…

作者头像 李华
网站建设 2026/7/12 3:39:00

API 中转站安全选型清单:密钥、权限、日志和数据边界

选择 API 中转站时&#xff0c;很多人会先看速度和价格&#xff0c;却把安全放到最后。但只要模型接口进入真实业务&#xff0c;安全就不再是附加项。请求中可能包含用户输入、业务资料、代码片段、客户问题、内部文档&#xff0c;任何一个环节处理不当&#xff0c;都会带来风险…

作者头像 李华