# 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 <token>` 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.
