# Index: Mall storefront app (`apps/mall`) Guidelines: `docs/frontend-guidelines.md`. | Path | Holds | |---|---| | `plugins/api.ts` | `$api` composition: mock base + per-domain live picks (`LiveDomain`, `LIVE_PICKS`, `DEFAULT_LIVE_DOMAINS`) | | `mock/api.ts` | deterministic fixed-data adapter; versioned persisted state (`STORAGE_KEY`) | | `mock/data.ts` | seed fixtures for the mock adapter | | `nuxt.config.ts` | `liveDomains` runtime default (JSON array env `NUXT_PUBLIC_LIVE_DOMAINS` overrides) | | `pages/index.vue` | home: banners/promos/quick links/category floors | | `pages/search.vue`, `pages/goods/[id].vue` | catalog browsing; goods detail has reviews tab | | `pages/cart.vue`, `pages/checkout/*` | cart and checkout (address → quote → submit → pay → success) | | `pages/stores/*` | store directory + store detail | | `pages/user/*` | buyer center: orders, aftersales, reviews, coupons, addresses, invoices, favorites, wallet | | `pages/user/wallet.vue` | wallet balances, paginated ledger entries, demo recharge, withdrawal request/history | | `pages/user/membership.vue` | level/benefits, growth total, progress to the next threshold, growth history | | `pages/user/messages.vue` | system message center: unread filter, mark read, mark-all-read, soft delete | | `pages/merchant/join.vue` | 商家入驻 multi-step application form (anonymous fill, sign-in gate, draft return) | | `pages/merchant/status.vue` | applicant's own application status, rejection reason, re-apply | | `locales/.ts` + `locales-extra.ts` | app-local bilingual strings deep-merged over the shared locales (mall namespaces: shell/home/search/product/cart/checkout/auth/user/stores/marketing/wallet/merchant/membership/messaging) | | `pages/seckill.vue`, `collective.vue`, `integral.vue` | flash sale, group buying, points mall | | `app.vue` + `components/shell/*` | header/footer shell; `SiteHeader.vue` carries the unread-message badge | | `composables/` | session/cart stores, `usePrice` (currency conversion display), `useUnreadMessages` (header badge count) | Remember: mall is the only app with a mock adapter; every new live domain needs mock parity so `NUXT_PUBLIC_LIVE_DOMAINS` rollback keeps working.