一、 项目背景

在移动支付日益普及的今天,个人消费行为呈现出高频化、碎片化的显著特征。从日常餐饮到交通出行,从线上购物到生活缴费,每一笔支出都在悄然影响着个人的财务健康。与此同时,全球个人理财软件市场持续扩张,预计2032年将达到21.9亿美元规模,反映出日益增长的财务管理需求。然而,现实中大多数用户仍面临“钱花哪儿了”的困惑,缺乏有效的收支管理工具来建立健康的消费习惯。

现有记账应用虽种类繁多,但存在三个核心痛点:一是记账流程繁琐,用户难以坚持长期记录;二是缺乏直观的数据分析,无法清晰呈现消费结构;三是预算管理形同虚设,缺少实时预警机制。此外,68%的用户对财务数据存储在第三方服务器存在安全焦虑,多设备间的数据同步体验也普遍不佳。

鸿蒙系统的分布式架构和原生安全能力为记账应用提供了独特的技术优势。基于API 12 SDK 5.0.0进行开发,可利用HarmonyOS NEXT在分布式数据管理、端云加密传输等方面的增强能力。通过ArkTS声明式UI框架和ArkUI组件,可构建流畅易用的用户界面;结合Preferences轻量级存储或关系型数据库,实现本地数据的持久化管理。鸿蒙的多设备协同特性则能实现手机、平板间的数据无缝同步,让用户随时随地掌握财务状况。

本课题旨在设计并实现一款基于HarmonyOS SDK 12的省钱记账本App,涵盖收支记录、分类管理、数据统计、预算管控等核心功能,帮助用户清晰掌握资金流向,养成理性消费习惯,为个人财务管理提供便捷高效的工具支撑。

二、技术介绍

本项目基于HarmonyOS API 17 SDK 5.0.5进行开发,使用DevEco Studio 2024/2025版本作为集成开发环境。API 17作为HarmonyOS NEXT的重要版本,在ArkTS语言能力、ArkUI组件库和系统服务层面均有显著增强,为应用开发提供了更稳定、高效的技术底座。

前端采用ArkTS语言和ArkUI声明式UI框架构建界面。ArkUI提供丰富的原子化组件和布局容器,配合@State@Prop@Provide/@Consume等状态管理装饰器,能够实现响应式数据驱动UI更新,提升开发效率。页面路由基于Router模块进行管理,支持参数传递和页面栈操作,确保界面切换流畅。

数据持久化方面,应用采用Preferences轻量级数据库存储用户配置和收支记录,该数据库以键值对形式存储,读写性能优异,适合记账本场景下频繁的数据存取需求。对于需要复杂查询的场景,可配合关系型数据库(RDB) 进行数据管理,支持SQL语句操作,保障数据的一致性与完整性。

在系统能力层面,应用充分利用HarmonyOS的Stage模型进行应用生命周期管理,通过AbilityAbilityStage实现组件的启动与调度。DevEco Studio 5.0.5版本针对API 17进行了深度适配,增强了多设备预览、热重载和性能分析工具,配合模拟器和真机调试,能够高效完成开发、测试与部署全流程。整体架构采用MVVM模式,将视图与业务逻辑分离,确保代码结构清晰、易于维护和扩展。

三、功能介绍

本应用围绕个人记账核心场景,共设计五个主要页面,为用户提供从账户管理到收支记录、数据统计的完整闭环体验。

用户注册与登录页面:用户可通过手机号或邮箱完成注册,填写密码等必要信息后即可创建账户。登录页面支持账号密码验证,登录成功后进入应用主界面。利用Preferences缓存技术存储用户登录状态和Token信息,实现“记住我”功能,用户再次打开应用时无需重复登录,提升了使用便捷性。

记录支出及收入页面:这是应用的核心功能页面,用户可通过表单记录每一笔收支,包括金额、类别(餐饮、交通、购物、工资等)、日期和备注信息。页面提供分类选择器,帮助用户快速归类。记录提交后,数据通过RDB Store关系型数据库持久化存储,保障数据安全不丢失。用户还可随时查看、编辑或删除已有记录,实现收支数据的灵活管理。

统计列表查看页面:该页面以列表和图表形式集中展示用户的收支数据,支持按日、周、月等维度筛选查看。通过直观的统计信息,用户可以清晰了解各消费类别的占比和趋势,帮助识别非必要支出,培养理性消费习惯。

我的页面:作为个人中心,展示用户头像、昵称等基本信息,提供修改密码、清空数据、查看累计收支总额等功能入口,方便用户管理账户与数据。

页面导航采用NavDestination组件配合NavPathStack路由栈进行管理,支持页面间的参数传递和返回,实现流畅的跳转体验。整体功能设计简洁高效,满足日常记账需求。

四、代码设计

// Preferences工具类 PreferencesUtil.ets
import preferences from '@ohos.data.preferences';
import { BusinessError } from '@ohos.base';

export class PreferencesUtil {
  private static instance: PreferencesUtil;
  private prefs: preferences.Preferences | null = null;
  private context: Context | null = null;

  public static getInstance(): PreferencesUtil {
    if (!PreferencesUtil.instance) {
      PreferencesUtil.instance = new PreferencesUtil();
    }
    return PreferencesUtil.instance;
  }

  public initPreferences(context: Context): void {
    this.context = context;
    preferences.getPreferences(context, 'user_prefs')
      .then((prefs: preferences.Preferences) => {
        this.prefs = prefs;
        console.info('Preferences初始化成功');
      })
      .catch((err: BusinessError) => {
        console.error('Preferences初始化失败: ' + err.message);
      });
  }

  // 存储用户登录状态
  public async saveUserInfo(userId: string, isLoggedIn: boolean): Promise<void> {
    if (!this.prefs) return;
    try {
      await this.prefs.put('userId', userId);
      await this.prefs.put('isLoggedIn', isLoggedIn);
      await this.prefs.flush();
    } catch (err) {
      let error = err as BusinessError;
      console.error('保存用户信息失败: ' + error.message);
    }
  }

  // 获取登录状态
  public async getLoginStatus(): Promise<boolean> {
    if (!this.prefs) return false;
    try {
      const status = await this.prefs.get('isLoggedIn', false);
      return status as boolean;
    } catch (err) {
      let error = err as BusinessError;
      console.error('获取登录状态失败: ' + error.message);
      return false;
    }
  }

  // 获取用户ID
  public async getUserId(): Promise<string> {
    if (!this.prefs) return '';
    try {
      const userId = await this.prefs.get('userId', '');
      return userId as string;
    } catch (err) {
      let error = err as BusinessError;
      console.error('获取用户ID失败: ' + error.message);
      return '';
    }
  }

  // 清除缓存(退出登录)
  public async clearAll(): Promise<void> {
    if (!this.prefs) return;
    try {
      await this.prefs.clear();
      await this.prefs.flush();
    } catch (err) {
      let error = err as BusinessError;
      console.error('清除缓存失败: ' + error.message);
    }
  }
}

五、系统实现

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐