news 2026/9/12 16:16:37

Actual 报表(Reports)视图全解析:内置报表、净资产与现金流、自定义报表实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Actual 报表(Reports)视图全解析:内置报表、净资产与现金流、自定义报表实战指南

Actual 报表(Reports)视图全解析:内置报表、净资产与现金流、自定义报表实战指南

【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual

Actual 的 Reports(报表)视图是这款本地优先个人财务应用中进行交易数据深度分析的统一入口:它既聚合了内置的净资产(Net Worth)、现金流(Cash Flow)等仪表盘报表,也承载了完全由用户自定义的报表体系。本文将带你理解该视图的平铺展示与全屏交互,结合 Reports Dashboard 与 Custom Reports 两份配套文档详解每个内置报表的定义与自定义报表的完整配置项,并通过 服务端报表模型 与 前端报表数据层 的源码,揭示报表从点击保存到落库、排序、读取的完整链路。

Reports 视图:一次点击,从平铺到全屏

Reports 视图是整个 Actual 应用中同时承载内置报表自定义报表的单一入口。所有报表在视图中都以平铺(tiled)形式展示,点击任意一张平铺卡片即可进入该报表的全屏版本,获得完整的阅读与交互空间。

该视图本身只是入口,真正详细的功能说明分散在两条文档链路上:内置报表及其仪表盘能力详见 Reports Dashboard(报表仪表盘),自定义报表的完整操作手册见 Custom Reports(自定义报表)。

内置报表:净资产(Net Worth)与现金流(Cash Flow)

净资产(Net Worth)

净资产表示你所有账户随时间变化的总体余额。它的计算方式是:用现金与资产的总值减去所有负债,其中包含全部投资账户。从本质上讲,净资产就是「如果你卖掉所有资产并还清所有债务之后,手中还能剩下的钱」。

在 Reports Dashboard 中,净资产图有两种展示模式:

  • Trend(趋势)模式:展示净资产总额随时间变化的整体曲线;
  • Stacked(堆叠)模式:按账户分别展示余额随时间的变化(例如储蓄账户与投资账户分开呈现)。需要注意的是,当正余额账户与负余额账户混合存在时,堆叠模式会比较难以解读。

现金流(Cash Flow)

现金流专注于追踪预算账户的余额随时间的变化,以此反映你的支出情况。它包含收入支出两套独立的可视化视图,让你可以快速看出收入与支出如何影响你的可用资金。由于预算账户被视为「手头现金(cash on hand)」,现金流图表能够清晰地展示可用资金的波动轨迹。

仪表盘上的更多内置报表

根据 Reports Dashboard 文档,Actual 内置的报表与小组件还包括:

报表/组件作用
Spending Analysis(支出分析)在指定时间段内追踪并对比支出,突出趋势、波动以及超支或节省的区域
Summary Card(汇总卡片)概览所选时间段内的全部交易,支持总金额月均两种统计口径
Calendar Card(日历卡片)以日历形式展示指定时间段内每日的收入与支出
Text Widget(文本组件)使用 Markdown 生成文本框,用作报表标题或组织性标签
Crossover Point(交叉点)借鉴《Your Money or Your Life》方法论的财务规划工具,可视化「被动收入覆盖预计支出」的财务独立时点

其中 Crossover Point 需要四类关键输入参数:费用类别(退休后仍会持续的开支分类)、收入账户(401k、IRA 等退休与投资账户)、安全提款率(默认 4%,源自 Trinity Study 的「4% 法则」)、费用预测类型(Hampel 滤波中位数 / 中位数 / 均值),以及可选的预计回报率(不填时按收入账户余额随时间的变化推算历史回报)。当被动收入增长到超过预测费用时,即意味着达成财务独立。

此外,以下报表以实验性功能形式提供:Budget Analysis report、Balance Forecast report、Sankey report 与 Monte Carlo Analysis。

自定义报表:对支出与收入的深度分析

内置报表之外,Actual 的自定义报表让你创建针对消费习惯收入的深度分析。完整操作手册见 Custom Reports,共支持五种展示形式:

  1. Table View(数据表)
  2. Bar Graph(柱状图)
  3. Line Graph(折线图)
  4. Area Graph(面积图)
  5. Donut Graph(环形图)

左侧菜单:类型、拆分与时间模式

左侧的Type(类型)菜单决定报表统计的交易口径:

  • Payment(支出):预算账户的流出;
  • Deposit(存入):预算账户的流入;
  • Net(净额):预算账户流入与流出的总和,即预算页 Spent 与 Received 列所显示的数值。此口径当前仅完整支持 Data Table、Area Graph,Bar Graph 与 Donut Graph 为部分支持。

统计结果可以按Category(分类)、Group(分组)、Payee(收款方)、Account(账户)或 Month(月份)进行Split(拆分)。注意:按账户拆分显示的是预算账户的交易金额总和,而非账户的周期性余额。将Mode(模式)从 Total 切换为 Time,即可获得按月拆分的月度明细。

日期筛选:Live Date 与 Static Date

交易可以按时间段过滤:Live Date(动态日期)让交易数据随当前时间动态变化,例如「本月(This month)」;Static Date(静态日期)则在两个固定日期之间展示交易。

Options 选项:隐藏分类、空行与预算外账户

在 Options 下可以调整报表行为:

  • Show hidden categories:启用预算页中被标记为隐藏的分类;
  • Show empty rows:显示 Split 所选维度中数值为 0 的项目;
  • Show off budget:启用两类内容——
    • Transfers:包含预算账户间的全部转账(预算内账户转往预算外账户的转账不计入);
    • Off budget:包含预算外账户中的全部交易(预算内转往预算外的转账不计入);
  • Show uncategorized:显示未分配分类的交易。

此外,可以通过左下角的列表单独排除某个分类或整个分组;下拉菜单中呈灰色不可选的选项,表示当前报表类型尚不支持该功能。

中间菜单:图例、汇总、标签与过滤器

中间菜单的第一组图标用于切换报表显示类型;第二组用于控制图例(legend)、汇总(summary)与标签(label)的显隐;漏斗形图标用于过滤交易;最右侧的菜单则用于将自定义报表保存到 Reports 页面

保存报表:覆盖、另存与恢复

自定义报表可通过右侧菜单保存。已保存的报表被修改后,可以选择覆盖原报表或将修改另存为新报表;同一菜单还提供恢复为默认值(reset to default),可快速回到已保存版本。如果未做任何保存操作,离开当前报表时改动会被自动丢弃。已保存的报表在 Reports 页面中按字母顺序排列。

示例:过去六个月的「每日支出」

官方文档给出一个覆盖过去六个月的《Daily Expenses(每日支出)》示例:一个版本以图表呈现,另一个以数据表呈现。数据表版本还会额外显示各个分类的总和(sum)六个月平均值(average),便于在观察趋势之外直接读取统计口径。

更复杂的组合玩法可参考 Custom Reports 文档中的进阶示例:选择 Bar Graph 并切换 Time 模式、按 Group 拆分、使用 Live Date 的 Year to date 范围、勾选排除 Savings 分类、用过滤器排除指定 Payee,最后开启图例、汇总与标签,即可构建一张「按月 X 轴、按分组堆叠」的柱状图。

源码视角:报表的存储、校验与 CRUD 链路

报表功能在源码中是一条完整的前后端链路,理解它能帮助你把握自定义报表的行为边界。

服务端:报表模型与字母序排序

loot-core 服务端报表模块 定义了reportModel,包含校验与字段映射两个核心部分(app.ts#L13-L56):

  • 校验规则conditionsOp(条件组合操作符)为必填字段,且只能是'and''or',否则抛出ValidationError('Invalid filter conditionsOp: ...')
  • 字段映射toJS将数据库行(snake_case,如start_datedate_staticgroup_byshow_offbudget)转换为前端实体(camelCase);fromJS负责反向转换。可见报表持久化的字段非常完整:日期范围、静态/动态日期标志、分组维度、排序、间隔、余额类型、空行/预算外/隐藏分类/未分类展示开关、趋势线、包含当前周期、图表类型以及过滤条件等。

报表读取时按名称排序:sort函数使用localeCompare且开启ignorePunctuation进行不区分标点的字母序排序(app.ts#L85-L94),这与文档中「已保存报表按字母顺序展示」的行为完全对应。getReports通过 AQL 查询custom_reports表并在服务端完成反序列化(例如自动解析 JSON 列conditions)。

前端:查询与变更

前端在 desktop-client 的 reports 模块 下拆分为查询与变更两层:

  • queries.ts 中reportQueries.list通过send('report/get')拉取全部自定义报表;dashboardQueries则通过 AQL 查询dashboarddashboard_pages等表,支撑多仪表盘页与各组件的按页筛选;
  • mutations.ts 封装了report/createreport/updatereport/delete以及一系列仪表盘操作(dashboard-createdashboard-renamedashboard-update-widgetdashboard-add-widgetdashboard-copy-widgetdashboard-import等),每个变更成功后都会通过invalidateQueries使对应查询缓存失效,从而让 Reports 页面与仪表盘即时刷新。

由此可以推断:你在界面上点击「保存报表」时,前端会调用report/createreport/update,服务端经reportModel校验与字段映射后写入custom_reports表,并在下一次进入 Reports 视图时按字母序平铺展示——这正是本文开头「平铺视图 + 全屏交互」体验背后的完整实现链路。

总结

Reports 视图把内置报表与自定义报表统一在同一个平铺入口中:净资产、现金流等内置报表负责回答「我整体有多少钱、钱怎么流动」的总览问题,而支持五种图形、动态/静态日期、多维度拆分与细致 Options 的自定义报表则负责回答「我的钱花在哪、趋势如何」的深度分析问题。配合 Reports Dashboard 与 Custom Reports 两份文档,以及 服务端报表模型 与 前端报表数据层 的源码,你可以从使用到实现全面掌握 Actual 的报表体系。

【免费下载链接】actualA local-first personal finance app项目地址: https://gitcode.com/GitHub_Trending/ac/actual

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

WT2003Hx B1指令实现毫秒级语音插播

1. 项目概述:为什么“插播”在语音播报场景里不是锦上添花,而是生死线 我做嵌入式语音模块开发快八年了,从WT2003S、WT2003M一路用到现在的WT2003Hx,踩过的坑比走过的路还多。去年给一个地铁站台广播系统做升级时,客户…

作者头像 李华
网站建设 2026/9/12 16:12:53

Claude Code UI 完整指南:10 分钟远程管好你的 AI 编码会话

Claude Code UI 完整指南:10 分钟远程管好你的 AI 编码会话 【免费下载链接】claudecodeui Use Claude Code, OpenCode, Cursor CLI, and Codex on mobile and web with CloudCLI (aka Claude Code UI). CloudCLI is a free open source webui/GUI that helps you m…

作者头像 李华