Skip to content

feat: 商店上架素材 + 跨设备同步收尾 + UI/i18n 修复合并#258

Open
TNT-Likely wants to merge 3 commits intomainfrom
feature/3.0.1
Open

feat: 商店上架素材 + 跨设备同步收尾 + UI/i18n 修复合并#258
TNT-Likely wants to merge 3 commits intomainfrom
feature/3.0.1

Conversation

@TNT-Likely
Copy link
Copy Markdown
Owner

合并 b4dfdc2 之后的 15 个 commit:

分类图标 byName 重构:

  • 删除 read-time byName 模糊匹配,改 v23 Drift migration 一次性回填到 DB
  • CategoryService.resolveIconNameByName 新增,与服务端 src/services/category_icon.py 的 resolve_icon_by_name 1:1 对齐
  • getCategoryIconData 移除 name fallback,永远只信 category.icon
  • getCategoryIcon switch 补齐之前 default 兜底的图标(subway/hotel 等)

跨设备同步收尾:

  • 删分类时连带清理自定义图标本地文件
  • 跨设备同步删除时清理本地孤立附件/图标 + 启动一次性 GC
  • Account 的 recordChange 走 ledgerId=0,跟 Category/Tag 对齐
  • ChangeTracker 契约 API 化(recordUserGlobalChange/recordLedgerChange)
    • 单元测试锁死

商店上架素材:

  • scripts/gen_store_test_data.py: 100 条中英演示账本(CSV)+ 配置(YAML), 含彩色标签和多账户(CNY/USD)
  • assets/store/screenshots: HTML+html2canvas 一键合成 9 主题双语 iPhone 6.5/Android 截图 + Play feature 横版图,18+18 张原图
  • assets/store/listings: 中英繁三语完整描述,无 emoji,3000 字内
  • output 38 张上架成品(apple 18 + google-play 20)

UI/i18n 修复:

  • 账户选择器 '无账户' 走 l10n.accountNone
  • AI 记账成功卡片: ledger 名走 translateLedgerName,时间按 locale 格式化, 分类回退用 commonOther,新增 commonYesterday i18n key
  • 首页 Header 重排: BeeIcon + Title(自然宽度)
    • Expanded(Align(Pill ellipsize)) + Actions,空间不够时只省略账本名
  • 底栏 tab 文字加 maxLines:1/softWrap:false/textScaler.noScaling 防换行, 英文 'Insights' 改 'Stats'(更短且贴合页面内容)
  • AI 提示词为空时回退到内置默认模板,避免新装无法识账

跨设备同步收尾(BeeCount Cloud V2):
- 同步漏推 / 错推一揽子修复
- BeeCount Cloud 版本号自动刷新
- 资产管理页货币符号跟随账户而非账本
- 编辑转账卡死(getTransferCategory 多条脏数据)自愈
- 清空未使用分类 / 标签的静默路径显式触发 sync(对齐 tags 行为)+ 诊断日志

死代码清理:
- 删除 CloudRepository 整组 + AppMode.cloud(从未真正使用)

商店上架素材 + UI/i18n 修复:
- 商店截图 / preview 视频上架素材
- Android 小组件 scaleType 改为 fitCenter 不再裁减内容
- 资产管理页总资产/总负债跟横线之间加 20px 间距
- 分类预算图标支持自定义图片(BudgetSection CategoryIcon)
- gitignore: 忽略本地 marketing/ 物料目录

README 重构:
- 主 README 瘦身,拆云配置教程到 docs/cloud-setup.md / docs/cloud-setup_EN.md
- 截图区切到 raw/{zh,en}/ 9 主题素材
- 去过时发现页 + 手动目录(GitHub 自带右上大纲)
- 顶部 Platform badge 加 Web(由 BeeCount Cloud 自带)
- 中英文 README 截图路径用对应 locale 素材
TNT-Likely added 2 commits May 6, 2026 12:10
App 仅做登录验证(启用/管理在 Web 端):
- BeeCountCloudAuthService 接入 2FA:_authenticate 检测 requires_2fa,silent
  模式跳过弹窗(供后台 token recovery 用),用户主动登录走 _handleTwoFactorChallenge
- TwoFactorChallengeRequest 带 verify callback,UI 在对话框内调用,失败拿 server
  错误消息就地展示让用户重试(不闪退)
- BeeCountCloudProvider.globalTwoFactorHandler 全局钩子,App 启动时注册
- getTwoFactorStatus(GET /auth/2fa/status):云同步页只读状态行用

UI:
- lib/widgets/biz/login_2fa_challenge_view.dart:Login2FAChallengeDialog
  (showDialog 弹窗,non-dismissible,内联错误展示 + 重试,无废话提示无倒计时)
- lib/main.dart:globalNavigatorKey + handler 注册,MaterialApp 挂 navigator key
- beecount_cloud_sync_page:_TwoFactorStatusRow 加在账号 section 下方,
  未登录 / 拉取失败自动隐藏,监听 syncStatusRefreshProvider 重新登录后自动刷新
- 三语 i18n 完整(zh / en / zh_TW)+ regenerated app_localizations*.dart

token refresh 并发去重(关键修复):
- 服务端用 rotating refresh token(每次 refresh 立刻 revoke 老 token);cold start
  时 initialize() 与 UI 渲染会并发触发 refresh,两个 POST 用同一个老 refresh_token
  → 第一个成功旋转,第二个用已 revoke 的 token 拿到 401 → _clearSession 把刚保存
  的新 session 又清掉 → 下次启动撞 silent recovery 又被 2FA 拦截
- tryRefreshSession 加 _refreshInFlight 去重,并发调用共享同一个 future,
  _refreshSessionOrClear 也走 dedup 路径
- silent recovery 失败后加 30 秒冷却(_silentRecoveryCooldownUntil),防止 UI
  rebuild 撞 server 30/min 限流让用户主动「重新登录」时反而 429

设计文档:BeeCount-Platform/.docs/2fa-design.md。
budgetRefreshProvider 触发 budgetOverviewProvider invalidate 后,原
AsyncValue.when 的 loading 分支返回 SizedBox.shrink → 进度条卸载 → 闪烁。
改用 valueOrNull 拿 Riverpod AsyncLoading 自带的 previous value,loading
期间继续渲染旧数据,新数据到达自然覆盖。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant