Root cause: nav-bar.vue styles compiled with [data-v-xxxxx] attribute
selectors by uni-app Vite plugin, but Vue didn't add the attribute to
DOM elements (styles were not scoped). The CSS selector mismatch meant
no sidebar styles ever applied.
Fix:
- Remove all CSS from nav-bar.vue (<style> block deleted entirely)
- Move ALL nav-bar styles to App.vue's global <style>
- Use .app-wrapper > .nav-bar selector (no data-v issues)
- Mobile: display:none; Desktop (>=1024px): display:flex sidebar
- Also fixed: nav-bar was accidentally visible as block on mobile
- Replace uni-app custom-tab-bar with manual NavBar component in App.vue
(uni-app auto-detection was not including component in build)
- Mobile: NavBar hidden via CSS display:none, uni-app default tab bar handles nav
- Desktop: NavBar visible as 220px left sidebar, uni-app tab bar hidden
- Content area: max-width 1200px with margin-left:220px, centered
- Buttons/inputs/cards: global desktop CSS overrides for reasonable sizing
- Clean approach: NavBar always in DOM, CSS media queries control visibility
(no v-if, no conflicting !important)
Desktop (≥1024px):
- Tab bar becomes a 220px left sidebar with brand name and nav items
- Page content shifts right and max-width constrained to 1200px
- Base font-size reset to 16px for readable text
- AI assistant floating button stays in bottom-right corner
- No change to mobile layout (bottom tab bar preserved)
The marketing landing page is served at root (/), and the uni-app SPA
is served at /app/. Setting base: '/app/' ensures all static asset
references (CSS, JS, favicon) are correctly prefixed for the new
subdirectory deployment.
- WeChat Pay APIv3 integration (JSAPI + Native) with cert-based auth
- TranslationQuota model + admin management UI (配额 tab)
- Alibaba MT provider now checks quota before translation
- Fix: admin tabs scrollable on mobile, remove header-card
- Fix: profile/login navigation - logout stays on profile, login returns to profile
- Fix: login form now visible by default (no extra click to show)
- Fix: home page translate link uses navigateTo (was switchTab to non-tabBar page)
- Add .coverage and apiclient_key.pem to gitignore
Centralizes all hardcoded page paths, storage keys, external URLs, and branding into a single uni-app/src/config.js. Fixes trackMarketingEffect sending wrong field names (action/content_preview -> event_type/content) that silently dropped tracking data. Adds notes, estimated_value, next_followup_at to Customer response. Removes '翻译' from bottom tab nav (5 tabs now), adds quick translate card on home page. Makes profile page header color consistent with app theme (#1890ff).
- Admin-configurable AI prompt/quick questions from system_configs DB
- GET /api/v1/ai/quick-questions endpoint for fetching quick questions
- Local FAQ matching for instant responses (avoid AI calls for common Qs)
- AI action extraction: "add customer" intent detected, structured data returned
- Frontend action confirmation card with editable fields, calls customer API on confirm
- NVIDIA provider (stepfun-ai/step-3.5-flash) for faster chat vs deepseek-v4-flash
- Fixed httpx client timeout preventing backend hangs
- Added log_usage calls for auth events (register/login/guest/wechat)
- Admin tabs (users/stats/logs/config) fully functional with real backend
- AiAssistant component added to all tabbar pages
- Switch back to custom tabbar (custom: true) with emoji fix (line-height, font-family)
- Redesign home quick-actions: product/followup/analytics/notifications replace redundant nav items
- Refactor goToPage to auto-detect tabbar vs non-tabbar pages
- Update PROGRESS.md
- Backend: guest UUID format fix, /auth/me guest branch, UUID validation in deps.py, CORS config fix
- Frontend: switch to native tabbar (custom: false), cleanup App.vue, redesign quick-actions with colored icons, conditional wechat login, proxy API requests via Vite