CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# 更新日志
本项目遵循 [Semantic Versioning](https://semver.org/),
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
## [1.2.0] - 2026-11-06
### 新功能
- **PWA 可安装**:手机浏览器通过 HTTPS 域名访问后「安装应用」(Android)或
「添加到主屏幕」(iOS),桌面出现「装修账本」图标,点开全屏运行(无地址栏);
顺带补齐站点标签页图标
- **移动端清单工作台**:手机上不再是只读——板块内就地添加项目;点卡片弹出
详情抽屉(记为已买/修正实付/+订单/编辑/删除全部收敛在抽屉内);板块可
新增/改名/删除;项目长把手拖拽排序(展开板块内,松手即保存)
- 「记」页项目联想覆盖规格与板块名,跨板块同名项目(如两个「瓷砖」)不再选错
### 修复
- **恢复入口双算守卫**:项目软删期间记订单付款不再静默放行;恢复「已勾已买
且名下订单有付款」的项目/板块前先确认——否则已买实付与订单付款两路支出
重复计入实际合计
- **导出脱敏补漏**:单板块导出勾「不含价格」时不再附带付款明细表——该表
本质是金额清单,此前每笔金额照常外泄给收件人
- 备份 zip 解析加条目累计上限:多条目各自合法但合计超大的压缩包不再可能
拖垮服务进程(单条目防线之外的第二道闸)
- 备份恢复链:换库瞬间失败不再误报「原数据未受影响」(此时磁盘已是备份库);
校验库与回滚点临时文件在全部失败路径清理干净
- 票据上传到已删除的付款时 404 立即返回(上一版实现无效,弱网下连接悬挂
至超时,实测 12 秒 → 0.01 秒)
- 分析页「累计支出」与清单页「实际已花」命名区分,同屏不再出现两个口径
不同的「已花」
- 订单关联/筛选下拉的项目联想补规格后缀,同名不同规格项目可区分
- 移动端弱网序号守卫:连续操作时过期的响应不再覆盖新数据(已删项目不再
「复活」);暗色主题下拖拽行可读;把手触达 48px;结余卡不再显示多余负号;
超长备注不再把抽屉操作按钮顶出屏外;板块管理提交有 loading 态
### 变更
- 发版镜像按版本号打 tag(1.2.0 / 1.2 / 1,如 `docker pull ghcr.io/baoxinwen/renovation-expenses:1.2.0`)——NAS 上拉新版出问题可退回
指定版本,不再只有滚动覆盖的 latest
- 客户端测试重新纳入 TypeScript 类型检查
## [1.1.0] - 2026-11-04
### 修复
- **双算守卫补全**:以下时序不再静默重复计入实际,都会先弹确认、确认后
才按显式双算放行——误删订单后给项目勾「已买」再撤销恢复;未买项目建
订单后勾「已买」再记首笔付款;已买项目在移动端修正实付(金额与购买
日期一并预填原值,不再被静默覆盖成当天);付款与同订单同金额同日期的
已有记录撞车时(弱网超时后盲目重试)给出重复提示
- **口径统一**:分析页月度趋势/花费日历的已买支出改按实付计(未登记回退
数量×单价),与「实际已花」仪表盘一致,不再同屏两套「已花」
- **板块撤销**:恢复板块只带回本次删除连带的项目,更早单独删除的项目不再
凭空复活
- **票据导出**:数据库里的越界文件名不再把上传目录外的文件打包进 zip
- **参数健壮性**:导入 mode 拼错回 400(不再静默按替换清空清单);订单
item_id 非法值回 400;板块软删改名撞名回 400;导入/恢复/票据上传的
早退分支排干请求体,中文错误提示可达
- **失败可见**:清单/订单/记录/设置四页加载失败都给错误卡与重试入口,
不再停在「没有订单」「预算 ¥0」之类的误导空态;订单详情并行票据上传
不再被旧响应覆盖;底部导航「首页」选中态修复
### 安全
- **备份恢复链重做**:票据先写暂存目录再原子替换,恢复失败时数据库与票据
都可完整还原(此前失败只回滚数据库,票据不可逆丢失,回滚点还可能抹掉
最近未 checkpoint 的写入;回滚点创建失败或清理异常时也不再误删活库);
备份与恢复互斥;zip 条目解压加 300MB 上限防炸弹;旧版本 schema 的备份
恢复时自动补齐列迁移
- **执行率排行 tooltip 转义项目名**:Excel 导入的项目名不再进入 HTML
渲染,杜绝导入内容注入脚本
### 变更
- 已结清订单可在详情页「重新打开」(此前结清是单向开关,补记尾款/质保金/
退款只能删除重录)
- 删除付款的确认弹窗写明「N 张票据照片将一并永久删除」(付款为硬删且连带
物理删除票据文件,此前确认只有一句话)
- 清单行「+订单」打开的新建弹窗预选该关联项目,不再在几十项的下拉里二次
检索
- 分析页预算仪表盘更名「累计支出」(含未挂项目付款),与清单页「实际已花」
(清单内口径)区分命名——存在未关联付款时两页数字不再同名不同值
- 分析页移除与项目排行表同数据的 TOP10 条形图(排行表另有差额与下钻,
信息严格更多);月度柱状图保留
- 界面文案清理:移除开发视角的模型说明与实现词,交互描述对齐实际行为
- 请求超时:连接停滞 15 秒(票据上传 60 秒)自动中断并给中文提示——弱网
悬挂不再卡死提交按钮
- 移动端专项:底部导航加「分析」成五栏、「记」回到正中;订单列表与付款
记录卡片化(此前是横滚宽表格);「买了东西」区分已买项、预填改为
数量×单价;输入框统一 16px、金额框弹数字键盘;断点翻转不再丢表单;
共享页(设置/分析/订单详情)窄屏布局适配
- 路由级代码分割:首屏 JS 2.5MB → 1.35MB,echarts 进分析页按需加载
## [1.0.1] - 2026-09-28
### 新功能
- **板块单独导出**:清单页每个板块可单独导出 Excel(可选含价格列,不含价时仅
名称/规格/单位/数量/备注),或打开打印视图经浏览器「另存为 PDF」——微信发给
装修公司/工长直接看,不再暴露全案总计与预算目标(7b9662b、db668eb、a9a6147、
3778b26、469c5db、b680d5f)
- **预算与实付分离**:勾「已买」登记实际支付金额(支持抹零/打包价),不再覆盖
预算单价;预算漂移对比从此可信(ed440f0)
- **清单整行弹窗编辑**:点击行打开编辑弹窗,一次修改名称/规格/数量/单价/备注,
取代旧的单元格行内编辑(459b207、446ad3f、dcad3a4)
### 修复
- **记账口径**:导出 Sheet1「实际已花」与应用首页口径对齐(df9a1fa);「已买」
挂订单的双算守卫只拦跃迁、结构化 needForce 确认重试,补齐订单编辑缺口
(ec57498、0b2eb1b、3e2306a、c1da59e)
- **票据**:上传限制改为流内生效,杜绝单请求内存耗尽(90ec645);同名票据不再
串写内容(82608d9);上传早退消费完 multipart 流防请求悬挂(3a73a59);zip
清单如实反映缺失文件(8911528);打包异常不再击穿进程(e250939);删除票据
增加二次确认(51212ee)
- **数据安全**:旧库升级改名的迁移携带 -wal/-shm,防止未 checkpoint 数据丢失
(228910c);备份归档原子写入,失败不残留残档(02c311a)
- **Docker / 备份**:compose 显式透传 EXTRA_ALLOWED_HOSTS(2cf2a2c);备份改用
SQLite 在线快照、失败写入 backup.log 留痕(0c25cea);备份 cron 显式 PATH 并
以 gosu 降权运行(7d86c76);备份时区对齐文档(b7848ad)
- **客户端**:板块折叠状态真正持久化(19baf23);排行榜在预算为 0 时不渲染
百分比(cd50fba);订单搜索加序号守卫与防抖(42a8789、8848fb3);删除订单
后返回列表页(2c7e9ce);移动端加载失败可重试、未知路由不高亮首页、排行
rowKey 防同名冲突(cfa4cc7、b7feb41、a5ab765);添加项目弹窗接通提交
(d53cb62)
- **工程**:CI 发布镜像前先跑回归测试(60e7332);项目迁移并统一命名规范
Renovation → renovation-expenses(ae6bc7c);测试基建加固——隔离服务就绪
判定校验响应者身份、存活探针独立连接、回归链纳入新增用例(91c73b9、
1fa43a2、f4ae130、69877c2)
## [1.0.0] - 2026-09-01
首个正式版本:装修预算清单与记账工具,数据全部保存在本机,
无账号、无广告,日常使用完全离线。
### 亮点
- **清单式预算管理**:板块 → 项目两级结构,与家庭装修评估表同构;
表格内点击即改、失焦即存,预算总价自动计算,超支/结余一目了然;
支持从现有 Excel 评估表一键导入,导出表可继续在 Excel 中使用
- **大件订单与票据留存**:定金/尾款多次付款挂到预算项目下,
每笔付款可拍发票/收据留存,按订单打包导出;小件勾「已买」记成交价,
自动沉淀预算漂移分析
- **开箱即用的自托管**:Docker 单容器部署(NAS/Linux,amd64/arm64
双架构镜像),数据落在本机目录,每天凌晨自动备份、保留 30 份;
手机同 WiFi 访问自动切换「记录优先」移动布局
### 破坏性变更
- 无(首个正式版本)
### 新功能
- 表格内直接编辑清单(名称/数量/单价),行内编辑即存 + 金额滚动动画
- 订单「一次付清」快捷购买:一个表单完成建单、记付款、传票据、自动结清
- 购买登记:勾「已买」升级为登记弹窗(成交价 + 购买日期),可再编辑;
首次改价自动存预算基线,分析页展示预算漂移
- 待付尾款汇总卡片,支持行内记付款
- 清单按名称/规格/备注搜索;板块折叠状态本地持久化
- 项目/订单/板块软删除,8 秒内一键撤销恢复
- 移动端适配:顶部标题栏 + 底部 TabBar,记一笔三流程,触控目标 ≥48px
- 统计图表:板块预算 vs 实际、月度付款趋势、最近付款流水、项目排行
- 打印样式、加载骨架屏、深浅双主题(可跟随系统)
- GitHub Actions 自动构建双架构镜像并推送 ghcr.io,NAS 拉取即更新
- 一键启动脚本(Windows 双击 `start.bat`),Docker Compose 部署支持
### 修复
- 软删订单的统计口径、导出再导入 round-trip、月度趋势与实际合计对齐
- 票据上传失败时的孤儿文件清理;订单/详情页删除确认行为统一
- Origin/Host 白名单加固(本机与局域网段、IPv6 私网放行,公网拒绝)
- 容器 entrypoint 自动修复数据目录权限后降权运行,NAS 任意 uid 开箱即用
- 备份脚本随镜像分发并并入主容器 cron,消除挂载依赖与崩溃循环
- Excel 导入的空单元格/负数/截断容错与明确报错
### 安全
- 升级 fastify ^5.12.1、@fastify/static ^10.1.3、@fastify/multipart ^10.1.1,
修复静态服务路径穿越与鉴权绕过(GHSA-8pvw-jcv7-9cmj、
GHSA-83w8-p2f5-377r)及 DoS/请求头伪造(GHSA-mrq3-vjjr-p77c、
GHSA-jx2c-rxcm-jvmq、GHSA-444r-cwp2-x5xf)
- 升级 vite ^7.3.6,修复 dev server 路径穿越与 Windows fs.deny 绕过
- 已知遗留 moderate:echarts(XSS,待升级 v6)、uuid 依赖
(经 exceljs,待上游兼容)
[1.2.0]: https://github.com/baoxinwen/renovation-expenses/releases/tag/v1.2.0
[1.1.0]: https://github.com/baoxinwen/renovation-expenses/releases/tag/v1.1.0
[1.0.1]: https://github.com/baoxinwen/renovation-expenses/releases/tag/v1.0.1
[1.0.0]: https://github.com/baoxinwen/renovation-expenses/releases/tag/v1.0.0