文件概述
AuthUserStore.ets
是一个用于管理用户认证状态的工具类,主要功能包括:
- 初始化本地偏好存储
- 存储与读取用户信息(如 token)
- 控制页面跳转时的鉴权逻辑
该类基于 HarmonyOS 的 preferences
模块实现数据持久化,适用于 ArkTS 项目中用户的登录态管理。
引入依赖
typescript
import { USER_INFO, CONTEXT, NAV_PATH_STACK } from '../constants'
USER_INFO
: 用户信息在本地存储中的键名。CONTEXT
: 应用上下文标识,用于初始化preferences
。NAV_PATH_STACK
: 页面导航栈的键名,用于记录页面跳转路径。
typescript
import { preferences } from '@kit.ArkData'
HarmonyOS 提供的轻量级数据存储模块,支持同步和异步操作。
typescript
import { ILoginResult, INavPathJump } from '../../modules'
ILoginResult
: 登录成功后返回的数据结构,通常包含token
等字段。INavPathJump
: 页面跳转参数结构,包含页面名称name
和参数params
。
类定义:AuthUserStore
typescript
class AuthUserStore {
// 声明首选项存储对象
preferences?: preferences.Preferences
}
类成员 preferences
是本地存储实例。初始化调用 init()
后赋值。
核心方法详解
1. 初始化本地存储:init()
typescript
// 初始化首选项仓库
init() {
// 从存储中获取上下文
const ctx = AppStorage.get<Context>(CONTEXT)
if (ctx) { // 如果上下文存在
// 获取指定名称的首选项
this.preferences = preferences.getPreferencesSync(ctx, { name: USER_INFO })
}
}
说明:
- 通过
AppStorage
获取应用上下文ctx
。 - 使用
preferences.getPreferencesSync(...)
创建一个同步的偏好存储实例。 - 存储名为
USER_INFO
,后续所有用户数据都保存在此命名空间下。
调用建议:
在应用启动或首次使用前调用一次
authUser.init()
。
2. 保存用户信息:setUser(user: ILoginResult)
typescript
setUser(user: ILoginResult) {
this.preferences?.putSync(USER_INFO, user) // 将用户信息存入首选项
this.preferences?.flushSync() // 刷新首选项以确保数据保存
}
说明:
- 使用
putSync
将用户信息以键值对形式写入本地存储。 - 调用
flushSync
确保数据立即落盘,防止意外丢失。
3. 获取用户信息:getUser()
typescript
getUser() {
// 从首选项中获取用户信息
return this.preferences?.getSync(USER_INFO, {} as ILoginResult) as ILoginResult
}
说明:
- 使用
getSync
从本地存储中获取用户信息。 - 如果没有找到数据,则返回一个空对象
{}
并转换为ILoginResult
类型。
4. 页面跳转鉴权:routerPromistions(arg: Function | INavPathJump)
typescript
// 用户鉴权
routerPromistions(arg: Function | INavPathJump) {
const routerstack = AppStorage.get(NAV_PATH_STACK) as NavPathStack // 获取导航路径栈
const token = (this.getUser() as ILoginResult).token // 获取用户令牌
const isLogin = token ? true : false // 判断用户是否已登录
if (typeof arg === 'function') { // 如果参数是函数
isLogin ? arg() : routerstack.pushPathByName('LoginView', `${arg()}`) // 已登录则执行函数,否则跳转到登录页面
} else { // 如果参数是导航跳转对象
isLogin ? routerstack.pushPathByName(arg.name, arg.params || '') : // 已登录则跳转到目标页面
routerstack.pushPathByName('LoginView', arg) // 否则跳转到登录页面
}
}
说明:
- 获取当前用户 token,判断是否已登录。
- 如果已登录,执行正常跳转;否则跳转至登录页,并携带原始目标路径作为参数。
- 支持两种传参方式:
- 函数:返回目标路径字符串。
- 对象:包含
name
和params
字段。
单例导出
typescript
export const authUser = new AuthUserStore()
注意事项
-
上下文依赖:
必须确保
AppStorage
中已设置CONTEXT
和NAV_PATH_STACK
,否则可能导致运行时错误。 -
线程安全:
所有方法均为同步调用,适合主线程使用,不适用于高并发写入场景。
-
数据安全:
preferences
存储的是明文数据,敏感信息(如 token)建议加密后再存储。 -
生命周期管理:
用户登出时应主动清除本地数据,避免残留数据影响鉴权逻辑。
完整代码
typescript
import { USER_INFO, CONTEXT, NAV_PATH_STACK } from '../constants' // 导入常量定义
import { preferences } from '@kit.ArkData' // 导入首选项相关模块
import { ILoginResult, INavPathJump } from '../../modules' // 导入登录结果和导航跳转接口
class AuthUserStore {
preferences?: preferences.Preferences // 声明首选项存储对象
// 初始化首选项仓库
init() {
const ctx = AppStorage.get<Context>(CONTEXT) // 从存储中获取上下文
if (ctx) { // 如果上下文存在
this.preferences = preferences.getPreferencesSync(ctx, { name: USER_INFO }) // 获取指定名称的首选项
}
}
// 设置用户信息
setUser(user: ILoginResult) {
this.preferences?.putSync(USER_INFO, user) // 将用户信息存入首选项
this.preferences?.flushSync() // 刷新首选项以确保数据保存
}
// 获取用户信息
getUser() {
return this.preferences?.getSync(USER_INFO, {} as ILoginResult) as ILoginResult // 从首选项中获取用户信息
}
// 用户鉴权
routerPromistions(arg: Function | INavPathJump) {
const routerstack = AppStorage.get(NAV_PATH_STACK) as NavPathStack // 获取导航路径栈
const token = (this.getUser() as ILoginResult).token // 获取用户令牌
const isLogin = token ? true : false // 判断用户是否已登录
if (typeof arg === 'function') { // 如果参数是函数
isLogin ? arg() : routerstack.pushPathByName('LoginView', `${arg()}`) // 已登录则执行函数,否则跳转到登录页面
} else { // 如果参数是导航跳转对象
isLogin ? routerstack.pushPathByName(arg.name, arg.params || '') : // 已登录则跳转到目标页面
routerstack.pushPathByName('LoginView', arg) // 否则跳转到登录页面
}
}
}
export const authUser = new AuthUserStore() // 导出AuthUserStore实例
总结
AuthUserStore
是一个典型的用户状态管理类,结合 HarmonyOS 的本地数据存储机制,实现了简洁高效的登录状态管理和页面跳转控制。适用于需要用户身份验证的 HarmonyOS 应用开发场景。