# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview This is a **小智AI (Xiaozhi AI)** voice assistant front-end application built with **uni-app (Vue 3)** targeting multiple platforms (H5, WeChat Mini Program, and other mini-program platforms). The app provides AI conversation, voice interaction, script management, voice cloning, and IoT device configuration capabilities. **Core Technologies:** - uni-app 3.x with Vue 3 Composition API - Vite 5.2.8 for build tooling - Pinia 2.1.7 for state management - vue-i18n 9.1.9 for internationalization **Backend Integration:** - Java Spring Boot backend at `http://localhost:8091` (configurable in `src/utils/api.js`) - Alibaba Cloud voice services for TTS/ASR/voice cloning - WeChat OAuth 2.0 for user authentication ## Development Commands ```bash # Install dependencies npm install # H5 development (web browser) npm run dev:h5 # WeChat Mini Program development npm run dev:mp-weixin # Build for H5 production npm run build:h5 # Build for WeChat Mini Program npm run build:mp-weixin # Other platforms (Alipay, Baidu, etc.) npm run dev:mp-[platform] # development npm run build:mp-[platform] # production ``` Build outputs go to `dist/build/h5/` or `dist/build/mp-weixin/` respectively. ## Architecture & Code Structure ### Entry Points - **`src/main.js`**: Application bootstrap, creates SSR app and registers Pinia - **`src/App.vue`**: Root component with global lifecycle hooks - **`src/pages.json`**: Page routing, tabBar configuration, and navigation styles (all pages use custom navigation) - **`src/manifest.json`**: Platform-specific configurations (WeChat AppID: `wxff56c34ef9aceb62`) ### State Management (Pinia) - **`src/stores/user.js`**: User authentication state - Manages `token`, `nickName`, `avatarUrl`, `openid`, `isLoggedIn`, `hasAgreedToTerms`, `hasVisitedMinePage` - Provides `login()`, `logout()`, `setUserInfo()`, `clearFakeLoginData()` methods - Persists state to uni-app local storage (`userInfo`, `custom_token`, `user_token`) - **Important**: Token is checked from multiple sources (store, `custom_token`, `user_token`, `userInfo.token`) ### API Layer (`src/utils/api.js`) - **Request interceptor**: Automatically adds `Authorization: Bearer ` header from multiple token sources - **Response handling**: Smart extraction of backend responses from various nested structures - **Text cleaning**: `cleanText()` function strips HTML/Markdown and keeps only text and punctuation **API Modules:** - **`chatAPI`**: - `syncChat()` - Synchronous chat with fallback for anonymous users - `asyncChat()` - Asynchronous chat (if needed) - `getChatHistory()`, `createConversation()` - Conversation management - **Note**: When user is not logged in, returns `isAnonymous: true` to trigger local simulation - **`voiceAPI`**: - `textToSpeech()` - TTS (Text-to-Speech) - `chatWithTTS()` - AI chat + voice synthesis - `voiceChat()` - Complete voice interaction (uploads AAC, backend converts to WAV) - `uploadVoiceChat()` - Audio file upload for voice chat - **Important**: Frontend sends AAC format, backend must convert to WAV for processing - Response parsing handles complex nested structures: `data.llmResult.response`, `data.sttResult.text`, `data.ttsResult.audioPath` - **`rechargeAPI`**: `getUserBalance()`, `createRechargeOrder()`, `getOrderStatus()`, `getRechargeHistory()` - **`roleAPI`**: `getRoles()`, `getRoleById()` - AI character management - **`configAPI`**: `getAllConfigs()`, `getModels()`, `getSTTConfigs()`, `getTemplates()`, `getTTSConfigs()` ### Page Structure Pages are organized by feature under `src/pages/`: **Core Pages:** - `splash/splash` - Launch screen with agreement flow - `index/index` - Homepage with drama characters and AI voices (has tabBar) - `mine/mine` - User profile and settings (has tabBar) - `chat/chat` - AI conversation with text and voice input - `create/create` - Script creation entry - `script/editor` - Script editing interface - `drama/index` - Drama character details - `voice/clone` - Voice cloning feature - `agreement/agreement` - User agreement display - `recharge/recharge` - Recharge/payment - `recharge/history` - Recharge history (with pull-down refresh enabled) All pages use `navigationStyle: "custom"` for custom navigation bars. ### Global Styles - **`src/uni.scss`**: Global SCSS variables and mixins - **`src/styles/`**: Common stylesheets - **`src/static/`**: Static assets (images, icons, etc.) ### Components - **`src/components/UserAgreement.vue`**: User agreement component - **`src/components/UserAuth.vue`**: User authentication component ## Key Architectural Patterns ### Authentication Flow 1. User triggers login from UI 2. `useUserStore.login()` orchestrates: - Call `uni.getUserProfile()` for WeChat user info - Call `uni.login()` to get WeChat `code` - POST to `/app/login` with `code` - Save `token`, `nickName`, `avatarUrl`, `openid` to store and local storage 3. All subsequent API calls auto-inject token from store/storage via request interceptor ### Anonymous User Handling - When not logged in, `chatAPI.syncChat()` returns `isAnonymous: true` - UI layer should implement local simulation/fallback responses - Voice APIs skip backend calls and use degradation handling ### Voice Interaction Flow 1. **Record**: User records voice (AAC format) using `uni.getRecorderManager()` 2. **Upload**: Frontend uploads AAC to backend via `voiceAPI.voiceChat()` or `uploadVoiceChat()` 3. **Backend Processing**: - Convert AAC to WAV - STT (Speech-to-Text) via Alibaba Cloud ASR - LLM processing for AI response - TTS (Text-to-Speech) via Alibaba Cloud TTS 4. **Response**: Backend returns structured response with `sttResult.text`, `llmResult.response`, `ttsResult.audioPath` 5. **Playback**: Frontend plays audio using `uni.createInnerAudioContext()` ### Response Data Extraction Pattern The API layer uses a flexible extraction strategy to handle varying backend response structures: - Try multiple field names: `response`, `message`, `content`, `reply`, `answer`, `text` - Check nested paths: `data.data.response`, `data.response`, root-level `response` - For voice APIs, specifically look for: `data.llmResult.response`, `data.sttResult.text`, `data.ttsResult.audioPath` - Always clean responses with `cleanText()` to remove markup ## Important Configuration Files ### `src/pages.json` Defines all pages, tabBar, and global styles. Key settings: - All pages have `navigationStyle: "custom"` (custom nav bars) - TabBar: Homepage (`pages/index/index`) and Mine (`pages/mine/mine`) - `lazyCodeLoading: "requiredComponents"` for performance - Splash and agreement pages have `disableScroll: true` and `popGesture: "none"` (prevent back gesture) ### `src/manifest.json` Platform-specific configurations: - WeChat Mini Program AppID: `wxff56c34ef9aceb62` - App permissions and capabilities - Platform-specific optimizations ### `vite.config.js` Minimal Vite config using `@dcloudio/vite-plugin-uni` plugin. ## Documentation References Refer to these files for detailed specifications: - **`API接口文档.md`**: Complete backend API documentation with request/response examples - **`产品设计需求文档.md`**: Product requirements, functional specifications, AI service integration details, IoT device configuration requirements - **`前端交接文档.md`**: Project handoff document with module descriptions and development notes ## Development Best Practices ### Working with uni-app - Use `uni.*` APIs for cross-platform compatibility (e.g., `uni.request`, `uni.showToast`, `uni.navigateTo`) - Test on both H5 and WeChat Mini Program to ensure compatibility - WeChat Mini Program has stricter restrictions (e.g., requires HTTPS for production, domain whitelist) ### State Management - Always use Pinia store for shared state - Persist critical state (user info, tokens) to local storage via `uni.setStorageSync()` - Initialize stores on app launch by calling store's `init()` method ### API Integration - Never hardcode API endpoints; use `BASE_URL` in `src/utils/api.js` - Handle both logged-in and anonymous states gracefully - Always check for multiple possible response structures when parsing backend data - Use `cleanText()` for AI-generated text to strip formatting ### Audio Handling - Record audio using `uni.getRecorderManager()` with AAC format - Play audio using `uni.createInnerAudioContext()` - Always inform backend that AAC will be sent and needs WAV conversion - Cache frequently used audio responses for better performance ### Error Handling - Display user-friendly error messages using `uni.showToast()` - Log errors to console for debugging - Implement fallback mechanisms for non-critical features when backend is unavailable ### Performance - Use `lazyCodeLoading: "requiredComponents"` (already configured) - Optimize images and static assets - Implement code splitting for large pages - Cache API responses where appropriate (e.g., config data, role lists) ## Platform-Specific Notes ### WeChat Mini Program - Requires domain whitelist configuration in WeChat Developer Console - OAuth login flow uses `uni.login({ provider: 'weixin' })` - Recording and playback permissions must be requested from user - Payment integration uses WeChat Pay API ### H5 (Web) - Can be deployed to any web server - Use browser DevTools for debugging - May need CORS configuration on backend for local development ## Git Workflow Main branch: `master` Current branch: `test` When creating PRs, target the `master` branch.