From 63c6cec81b449891c036aff6382c50789cf9278d Mon Sep 17 00:00:00 2001 From: openclaw Date: Sat, 25 Jul 2026 00:55:00 +0800 Subject: [PATCH] feat: add asynchronous multi-currency conversion --- .env.example | 2 + apps/web/src/components/CurrencyPicker.vue | 83 +++++ apps/web/src/components/QuickEntryDrawer.vue | 44 ++- apps/web/src/components/QuickEntryHost.vue | 4 +- apps/web/src/data/db.ts | 52 ++- apps/web/src/data/entries.ts | 17 +- apps/web/src/stores/entries.ts | 85 ++++- apps/web/src/styles.css | 9 + apps/web/src/views/EntryDetailView.vue | 50 ++- apps/web/src/views/LedgerSettingsView.vue | 6 +- apps/web/src/views/LedgerView.vue | 19 +- apps/web/src/views/LedgersView.vue | 2 +- apps/web/src/views/StatsView.vue | 15 +- compose.pro.yaml | 2 + docs/多币种与汇率.md | 2 +- packages/domain/src/index.test.ts | 14 + packages/domain/src/index.ts | 56 ++- services/api/src/db.ts | 96 ++++- services/api/src/exchange-rates.ts | 360 +++++++++++++++++++ services/api/src/server.ts | 136 ++++++- 20 files changed, 996 insertions(+), 58 deletions(-) create mode 100644 apps/web/src/components/CurrencyPicker.vue create mode 100644 packages/domain/src/index.test.ts create mode 100644 services/api/src/exchange-rates.ts diff --git a/.env.example b/.env.example index 2776c8f..e22096c 100644 --- a/.env.example +++ b/.env.example @@ -19,3 +19,5 @@ TEST_MODE=false POSTGRES_DB=cents POSTGRES_USER=cents POSTGRES_PASSWORD=change-me +APP_TIME_ZONE=Asia/Shanghai +EXCHANGE_RATE_API_URL=https://api.frankfurter.dev diff --git a/apps/web/src/components/CurrencyPicker.vue b/apps/web/src/components/CurrencyPicker.vue new file mode 100644 index 0000000..cdd8f7a --- /dev/null +++ b/apps/web/src/components/CurrencyPicker.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/apps/web/src/components/QuickEntryDrawer.vue b/apps/web/src/components/QuickEntryDrawer.vue index 46ca6d0..beb4ee1 100644 --- a/apps/web/src/components/QuickEntryDrawer.vue +++ b/apps/web/src/components/QuickEntryDrawer.vue @@ -1,9 +1,10 @@ @@ -205,7 +227,9 @@ function saveEntry() {
- ¥ + {{ displayAmount }}
{{ calculationLabel }} @@ -306,4 +330,6 @@ function saveEntry() {
+ + diff --git a/apps/web/src/components/QuickEntryHost.vue b/apps/web/src/components/QuickEntryHost.vue index a473d23..eb2a354 100644 --- a/apps/web/src/components/QuickEntryHost.vue +++ b/apps/web/src/components/QuickEntryHost.vue @@ -1,4 +1,5 @@