From 0ceb4a2b2506753c545d78e80e40c0153c2c7045 Mon Sep 17 00:00:00 2001 From: Zhang Chengdong Date: Thu, 17 Sep 2026 16:13:16 +0000 Subject: [PATCH] feat(mall): authenticate against the live API Wave 2 of replacing the fixed-data mock adapter: the auth domain joins the live list, so credentials, roles and tokens belong to the real user. - session: validate a restored token through /auth/me instead of trusting localStorage, clearing it on 401/403 but keeping it when the API is merely unreachable; the route guard now uses the validated session - login: report a 401 as invalid credentials rather than a generic failure, and drop the 6-character client rule so the API owns the password policy - register: raise the rule to the API's 8 characters, remove the verification-code field (its button only counted down and the value was never sent), and report a duplicate email (409) distinctly - TopBar and the user profile render their session-dependent branch client-only: validating the session before hydration made those localStorage-backed branches report hydration mismatches the previous code did not Verified against the running backend: wrong password rejected, real JWT issued, /user reachable, a short password refused with no network call, duplicate email reported, a tampered token cleared and bounced to sign-in, a stale token kept when the API is down, and the fixed-data rollback still signs in with the backend stopped. Also re-cuts docs/TBD-migrate-wave.md: auth is done, and cart, orders, shipments and invoices must move together, because the mock adapter keeps their state in one shared object and a partial flip fails at checkout. OpenSpec change: openspec/changes/replace-mock-api-wave-2 --- apps/mall/components/shell/TopBar.vue | 32 ++++++---- apps/mall/locales/auth.ts | 8 ++- apps/mall/middleware/auth.ts | 21 +++---- apps/mall/nuxt.config.ts | 4 +- apps/mall/pages/forgot-password.vue | 3 +- apps/mall/pages/login.vue | 14 +++-- apps/mall/pages/register.vue | 41 +++--------- apps/mall/pages/user.vue | 3 +- apps/mall/stores/session.ts | 37 ++++++++++- docs/TBD-migrate-wave.md | 63 +++++++++++-------- .../replace-mock-api-wave-2/.openspec.yaml | 2 + .../changes/replace-mock-api-wave-2/design.md | 60 ++++++++++++++++++ .../replace-mock-api-wave-2/proposal.md | 32 ++++++++++ .../specs/frontend-mall/spec.md | 26 ++++++++ .../changes/replace-mock-api-wave-2/tasks.md | 28 +++++++++ 15 files changed, 280 insertions(+), 94 deletions(-) create mode 100644 openspec/changes/replace-mock-api-wave-2/.openspec.yaml create mode 100644 openspec/changes/replace-mock-api-wave-2/design.md create mode 100644 openspec/changes/replace-mock-api-wave-2/proposal.md create mode 100644 openspec/changes/replace-mock-api-wave-2/specs/frontend-mall/spec.md create mode 100644 openspec/changes/replace-mock-api-wave-2/tasks.md diff --git a/apps/mall/components/shell/TopBar.vue b/apps/mall/components/shell/TopBar.vue index 64a1fdd..0ab59bb 100644 --- a/apps/mall/components/shell/TopBar.vue +++ b/apps/mall/components/shell/TopBar.vue @@ -18,17 +18,27 @@ const { t } = useI18n();
  • {{ t("shell.city") }}