skyline66/dsh-family-budget:把家庭月度预算做成 DSH 侧栏里的一张表

前言

给 DSH Web UI 写插件时,常见的需求是把一套固定的记录表单挂进侧栏,让用户每月填一次、自动算好。已有的做法要么是让模型每次重新生成一份清单,数据散落在对话里;要么是单独起一个 Web 应用,脱离 Harness 的窗口。下面介绍的 skyline66/dsh-family-budget 走的是插件这条路:侧栏多一个入口,点进去是一张月度家庭预算表。

它是个人维护的客户端插件,只做记账,不做投资建议。事实依据来自插件的 GitHub README 与 package.json,未在资料中出现的行为不做推测。

这是什么

一句话:在 DSH Web UI 的侧栏里加一个「家庭财务」页面,按月记录收入、固定支出、可变支出、储蓄、应急金、债务,并给出复盘和目标进度。

谁维护:skyline66,MIT 许可证,package.json 里 version 为 1.0.2。

解决什么问题:家庭每月的钱分散在工资、房贷、日常开销和储蓄目标里,缺少一张能持续更新、自动算差额的表。这个插件把这张表放进 Harness 窗口,数据落在本地磁盘,不需要外部服务。

它明确不是理财工具。README 里写明不做市场数据、不推产品、不做预测、不给投资建议,页面本身也标注了这一点。

核心功能

侧栏入口是「家庭财务 / Family budget」,点开后一个月一张表。表内分七个区块,每个区块写什么、算什么如下。

区块 你录入 页面计算
收入 Income 工资、奖金、其他进项 收入合计,占各比例的基数
固定支出 Fixed 房贷/房租、水电燃气、通讯、保险、教育 固定支出合计,占收入比例
可变支出 Variable 每项的预算与实际 预算合计、实际合计、逐项差额、超支项
储蓄 Savings 计划储蓄、已累计储蓄 本月可存(结余)、距计划差额、一键记入累计
应急金 Emergency fund 现有应急金、目标月数(3/6/12) 目标金额 = 固定支出 × 月数,覆盖率与缺口
债务 Debt 每笔余额、月供、本月已还 余额合计、月供合计、已还合计
复盘 Review 做得好的/超支原因/下月调整 自动核对:储蓄率、超支项、固定支出占比、应急金覆盖

另有一行目标条,可以在储蓄、还债、买房之间切换,跟踪一个目标及你录入的累计金额。

输出能力:可导出 CSV 给电子表格使用,可导出 / 导入 JSON 做备份。导入时页面会先确认,再替换文档。

安装与启用

在 DSH 的 Settings → Plugins → Add 中填入仓库 spec:

github:skyline66/dsh-family-budget

也可以从 releases 页面取预构建的 dsh-family-budget.tgz:

https://github.com/skyline66/dsh-family-budget/releases/latest

无论哪种方式,装完都要重载窗口,然后在侧栏打开「家庭财务 / Family budget」。

注意:这个包没有发布到 npm,所以只写 dsh-family-budget 名字是解析不到的。

数据落在哪里

所有数据放在一个文档里:<dsh home>/family-budget/budget.json。

写入由 Host 端校验,规则是:

  1. 未知键直接丢弃。
  2. 金额被约束为非负数,四舍五入到分。
  3. 月份键必须是 YYYY-MM。
  4. 复盘文字有长度上限。
  5. 文件损坏或不可读时,先把它挪到一旁,而不是直接覆盖。

页面不往外发数据,只跟自己的插件路由通信。显示金额用的 ¥ 前缀只是格式化约定,插件不做货币换算。

用法示例

装好之后的日常流程是:每个月新建一月,填收入和固定支出,可变支出逐项填预算与实际,然后看页面给出的差额和超支项。

储蓄区块有个一键动作:把「本月可存」记入累计储蓄。应急金区块填现有金额和目标月数(3、6 或 12),页面按固定支出乘月数算出目标金额和缺口。债务区块逐笔录入余额、月供和本月已还,页面给出合计。

复盘区块填三项自由文本,页面随后自动核对储蓄率、超支项、固定支出占比和应急金覆盖率。

代码结构

插件分 Host 端和 Client 端两部分,主要文件:

index.js            Host half: /family-budget/api/{doc,health}, validation, atomic write
client.js           Client half: sidebar entry + budget page (plain JS, React from the host)
locale/{en,zh}.json plugin title and description for the plugin list
cordis.patch.yml    the bundle row and its storage root
test/               arithmetic, wiring and live-API tests

本地验证命令:

npm test        # arithmetic + module wiring (no browser needed)
npm run test:api -- http://127.0.0.1:57253   # live Host round-trip against a running Harness

npm test 跑的是 test/calc.test.mjs(直接取 client.js 里的算术块求值)和 test/wiring.test.mjs(加载 client.js,套到 stub 上下文,检查两个 slot 注册以及中英文案字典的一致性),不需要浏览器。npm run test:api 则向 running 的 Harness 发一轮真实 Host 往返,test/api.test.mjs 会往线上路由 POST 一份恶意文档,检查清洗后的结果,再把原文档恢复。

适用场景与注意

适合想在 DSH 窗口里长期维护一份家庭月度账、且不想依赖外部工具的用户,或者想在 DSH Web UI 上学习 Host / Client 两段式插件写法的开发者——这个插件的结构足够小,index.js 负责校验和落盘,client.js 负责渲染,可作为参考。

安装前注意几点:

  1. 插件以当前 dsh 进程的权限运行,安装前应先读一遍源码(index.js、client.js、cordis.patch.yml)和 LICENSE,确认写入路径和路由行为符合预期。
  2. 数据目录是 <dsh home>/family-budget/,备份靠 CSV / JSON 导出,不是自动同步。
  3. 它不做货币换算,也不提供任何投资判断,遇到这类需求要另找工具。
  4. 目录页把分类标为「客户端」,星标数为 0,说明使用者还很少,遇到问题主要靠自己读代码或提 issue 到仓库。

结尾

这个插件的价值在于把月度家庭账收敛成一张表,输入由你控制,算术由插件保证,数据留在本地。对于想在自己的 DSH 实例里加一套家庭记账入口的人来说,它是目前比较直接的选择。

目录页:https://www.skillhub.cn/plugins/skyline66/dsh-family-budget

GitHub:https://github.com/skyline66/dsh-family-budget

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜