news 2026/10/29 0:41:26

财务目标页面 UI 与进度展示 - Cordova与OpenHarmony混合开发实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
财务目标页面 UI 与进度展示 - Cordova与OpenHarmony混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

本文对应模块:pages.js中“财务目标”页面的 HTML 模板与 UI 结构,以及与db.js中 goals 表的配合;同时会补充一段鸿蒙 ArkTS 代码,说明目标数据如何通过 FileManager 插件参与导出与导入。


1. 模块定位:从“记账”到“有目标地记账”

前面的模块更多关注日常收支、账户和预算,本模块要解决的是另一个问题:

不只是记录历史,而是给未来定一个可以量化的目标,并在页面中清楚地看到当前达成进度。

典型的财务目标示例:

  • 存 5 万元作为应急金;
  • 在一年内攒够首付;
  • 在半年内还清某笔贷款。

在 UI 层面,我们需要一个页面:

  • 列出所有目标;
  • 展示当前进度(进度条或百分比);
  • 提供新增/编辑目标的入口。

2. 页面整体结构:目标列表 + 进度概览

在pages.js中,“财务目标”页面的结构可以设计为:

// ==================== 财务目标页面 ===================='goals':()=>`<div class="pc-page-container"> <div class="pc-page-header"> <h2>🎯 财务目标</h2> <p>制定和跟踪你的长期财务目标</p> </div> <div class="pc-card"> <div class="pc-card-header"> <h3>目标列表</h3> <button id="goal-add-btn" class="pc-button pc-button-primary">新增目标</button> </div> <div class="pc-card-body"> <div id="goals-list" class="pc-goals-list"> <!-- JS 动态渲染每个目标及其进度条 --> </div> </div> </div> </div>`,

这里沿用了熟悉的 PC 布局骨架:

  • pc-page-container+pc-page-header作为页面的统一头部;
  • 用一张pc-card承载“目标列表”;
  • goal-add-btn是新增目标的主入口;
  • goals-list容器承载每一个目标项的 UI 结构。

3. 单个目标项的 UI 结构

一个目标项至少需要展示:

  • 目标名称;
  • 目标金额;
  • 当前已完成金额;
  • 进度条和百分比;
  • 操作按钮(编辑 / 删除)。

示例结构:

functionrenderGoalItem(goal){constratio=goal.targetAmount>0?Math.min(goal.currentAmount/goal.targetAmount,1):0;constpercent=Math.round(ratio*100);return`<div class="pc-goal-item">${goal.id}"> <div class="pc-goal-main"> <div class="pc-goal-title">${goal.name}</div> <div class="pc-goal-amounts"> <span>目标:¥${goal.targetAmount.toFixed(2)}</span> <span>当前:¥${goal.currentAmount.toFixed(2)}</span> </div> <div class="pc-goal-progress"> <div class="pc-goal-progress-bar"> <div class="pc-goal-progress-inner" style="width:${percent}%;" ></div> </div> <span class="pc-goal-progress-text">${percent}%</span> </div> </div> <div class="pc-goal-actions"> <button class="pc-button pc-button-sm">`;}

通过pc-goal-progress-inner的宽度控制进度条长度,配合百分比文本,使用户一眼就能看到目标完成度。


4. 从数据库加载目标并渲染

在db.js中,我们可以有一个goals表,结构类似:

// 目标表if(!db.objectStoreNames.contains('goals')){constgoalStore=db.createObjectStore('goals',{keyPath:'id'});goalStore.createIndex('createdAt','createdAt',{unique:false});}asyncgetGoals(){returnthis.getAll('goals');}

在pages.js中加载并渲染:

asyncloadGoalsPage(){constcontainer=document.getElementById('goals-list');if(!container)return;constgoals=awaitwindow.financeDB.getGoals();if(!goals||goals.length===0){container.innerHTML='<p class="pc-text-muted">暂时还没有任何财务目标,可以点击右上角“新增目标”创建一个。</p>';return;}consthtml=goals.map(g=>renderGoalItem(g)).join('');container.innerHTML=html;}

这段逻辑与前面交易列表、账户列表的加载方式是同一种思路:

  • 从 IndexedDB 取出所有目标;
  • 映射成 HTML 片段;
  • 写入页面容器。

5. 新增和编辑目标:表单与保存逻辑

新增目标可以通过一个模态框或右侧表单来完成,这里展示一个简化的保存逻辑:

asyncsaveGoal(){constnameInput=document.getElementById('goal-name');consttargetInput=document.getElementById('goal-target');constcurrentInput=document.getElementById('goal-current');constname=nameInput?.value.trim();consttargetAmount=parseFloat(targetInput?.value||'0');constcurrentAmount=parseFloat(currentInput?.value||'0');if(!name){Toast.error('请输入目标名称');return;}if(!targetAmount||targetAmount<=0){Toast.error('请输入合理的目标金额');return;}if(currentAmount<0){Toast.error('当前金额不能为负数');return;}constgoal={name,targetAmount,currentAmount,};awaitwindow.financeDB.addGoal(goal);Toast.success('目标已保存');this.loadGoalsPage();}

对应的数据库操作(示例):

asyncaddGoal(goal){goal.id=this.generateId();goal.createdAt=newDate().toISOString();returnthis.add('goals',goal);}

编辑目标则是在 UI 中找出对应data-id,从goals表读取后填充表单,再通过updateGoal保存修改即可。


6. ArkTS 侧:财务目标数据的导出与导入

财务目标作为goals表的一部分,同样需要在导出/导入时被保留下来。导出调用链和前面预算模块类似:

  1. Web 层调用financeDB.exportData(),返回包含goals在内的完整数据对象;
  2. JS 使用JSON.stringify序列化;
  3. 通过cordova.exec('FileManager', 'exportData', [json])把字符串交给 ArkTS 插件;
  4. ArkTS 插件使用fileIo将其写入备份文件。

下面是FileManagerPlugin.ets中的鸿蒙 ArkTS 片段(与前文保持一致风格):

import{CordovaPlugin,CallbackContext}from'@magongshou/harmony-cordova/Index';import{PluginResult,MessageStatus}from'@magongshou/harmony-cordova/Index';import{common}from'@kit.AbilityKit';import{fileIo}from'@kit.CoreFileKit';exportclassFileManagerPluginextendsCordovaPlugin{asyncexportData(callbackContext:CallbackContext,args:string[]):Promise<void>{try{constjson=args[0];// 其中包含 goals 表以及其他所有表的数据constcontext=getContext()ascommon.UIAbilityContext;constcacheDir:string=context.cacheDir;constfilePath:string=`${cacheDir}/finance-backup.json`;constfile=awaitfileIo.open(filePath,fileIo.OpenMode.WRITE_ONLY|fileIo.OpenMode.CREATE);awaitfileIo.write(file.fd,json);awaitfileIo.close(file.fd);constresult=PluginResult.createByString(MessageStatus.OK,filePath);callbackContext.sendPluginResult(result);}catch(error){constresult=PluginResult.createByString(MessageStatus.ERROR,(errorasError).message);callbackContext.sendPluginResult(result);}}}

从目标模块视角看:

  • Web 层专注于目标的创建、进度计算和展示;
  • ArkTS 插件专注于“把包含目标在内的全部数据安全写入文件”;
  • 当在新设备上导入备份后,只要goals表被正确恢复,目标页面 UI 就能重新渲染出所有目标及其进度。

7. 小结:财务目标页面 UI 的关键设计点

  1. 统一 PC 布局与组件风格:

    • 继续复用pc-page-container、pc-card等组件,让目标页面在整体视觉上与其他模块保持一致;
  2. 进度条直观表达完成度:

    • 通过pc-goal-progress-inner的宽度和百分比文本,让用户一眼看懂“目标完成了多少”;
  3. 与 goals 表结构紧密结合:

    • 目标名称、目标金额、当前金额在 UI 与数据库之间一一映射,便于后续做统计或报表;
  4. 新增/编辑操作与列表展示解耦:

    • 使用独立的表单负责新增/编辑,列表只负责展示和触发操作事件,代码结构更清晰;
  5. 与 ArkTS FileManager 插件协同:

    • 目标数据作为整体数据库快照的一部分,由 ArkTS 插件负责导出/导入,保证在多设备之间迁移时不会丢失;

通过本模块,你的应用从“记录历史 + 管理当前”进一步扩展到了“规划未来”:用户不仅能看到资产现状,还能在目标页面上持续跟踪自己距离目标的差距和进展,这也是一个财务管理工具真正开始“有温度”的地方。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 0:16:19

2025年AI不是宠物,是会思考的幽灵!

想象一下&#xff0c;你养了个宠物&#xff0c;它能帮你写代码、画图、做PPT&#xff0c;偶尔还跟你聊聊人生哲学。听起来很美好&#xff1f;等等&#xff0c;如果我告诉你这个"宠物"有时候聪明得像爱因斯坦&#xff0c;有时候却笨得像刚学会说话的三岁小孩&#xff…

作者头像 李华
网站建设 2026/10/27 3:02:36

java农村集体产权管理系统springboot-vue

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 java农村集体产权管理系统springboot-vue 主要技术与…

作者头像 李华
网站建设 2026/10/28 15:28:34

【课程设计/毕业设计】基于SpringBoot+Vue的宠物健康咨询系统基于springboot的养宠物指南服务平台系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/28 7:01:37

最小二乘问题详解6:梯度下降法

4. 实例从上述求解过程可以看到&#xff0c;梯度下降法其实比之前文章中介绍的Gauss-Newton方法要简单很多&#xff0c;那么这里还是给出一个只使用Eigen实现梯度下降法求解非线性最小二乘问题的例子。例子中模型函数为f(x;θ)aebx&#xff1a;#include <Eigen/Dense>#in…

作者头像 李华
网站建设 2026/10/28 14:56:40

Kamailio转发机制

目录 一&#xff0e;Kamailio转发机制 1.有状态的请求转发 2.无状态的请求转发 3.有状态的响应转发 4.无状态的响应转发 二&#xff0e;示例 1.有状态的请求转发 2.无状态的请求转发 一&#xff0e;Kamailio转发机制 基于路由规则和SIP消息头&#xff08;可以是Request…

作者头像 李华
网站建设 2026/10/28 4:59:54

Thinkphp和Laravelpython桂平旅游管理系统vue

目录具体实现截图项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;带文档1万字以上 同行可拿货,招校园代理 Thinkphp和Laravelpython桂平旅游管理系统vue 项目开发技…

作者头像 李华