# Platform 应用配置说明

## AES 加密配置

### 密钥配置

**配置文件**：`src/config/index.ts`

```typescript
export const AES_SECRET_KEY = '1234567890qwer'
```

**注意事项**：
1. ✅ 密钥已配置为 `1234567890qwer`，与后端保持一致
2. ⚠️ 该密钥与后端 `application.yml` 中的 `security.aes.secret-key` 必须相同
3. 🔒 生产环境应从环境变量或配置中心获取，不要硬编码

### 对应后端配置

**Gateway** (`gateway/src/main/resources/application.yml`):
```yaml
security:
  aes:
    secret-key: 1234567890qwer
```

**Auth Service** (`auth/src/main/resources/application.yml`):
```yaml
security:
  aes:
    secret-key: 1234567890qwer
```

## 使用示例

### 1. 登录时加密密码

```typescript
import { authAPI } from '@shared/api/auth'
import { getAesInstance } from '@shared/utils'

async function handleLogin(username: string, password: string) {
    try {
        // 1. 获取 AES 加密实例
        const aes = getAesInstance()
        
        // 2. 加密密码
        const encryptedPassword = await aes.encryptPassword(password)
        
        // 3. 发送登录请求
        const response = await authAPI.login({
            username,
            password: encryptedPassword,  // 使用加密后的密码
            loginType: 'password'
        })
        
        if (response.data.success) {
            console.log('登录成功')
            // 保存 token 等操作
        }
    } catch (error) {
        console.error('登录失败:', error)
    }
}
```

### 2. 注册时加密手机号和密码

```typescript
import { authAPI } from '@shared/api/auth'
import { getAesInstance } from '@shared/utils'

async function handleRegister(phone: string, password: string, smsCode: string, sessionId: string) {
    try {
        const aes = getAesInstance()
        
        // 加密敏感信息
        const encryptedPhone = await aes.encryptPhone(phone)
        const encryptedPassword = await aes.encryptPassword(password)
        
        // 发送注册请求
        const response = await authAPI.register({
            registerType: 'phone',
            phone: encryptedPhone,
            password: encryptedPassword,
            confirmPassword: encryptedPassword,
            smsCode,
            smsSessionId: sessionId
        })
        
        if (response.data.success) {
            console.log('注册成功')
        }
    } catch (error) {
        console.error('注册失败:', error)
    }
}
```

### 3. 数据脱敏显示

```typescript
import { AesUtils } from '@shared/utils'

// 显示脱敏手机号
const phone = '13812345678'
const maskedPhone = AesUtils.maskPhone(phone)
console.log(maskedPhone)  // 输出：138****5678

// 显示脱敏身份证号
const idCard = '110101199001011234'
const maskedIdCard = AesUtils.maskIdCard(idCard)
console.log(maskedIdCard)  // 输出：110101********1234
```

## 初始化流程

### 应用启动时自动初始化

**文件**：`src/main.ts`

```typescript
import { AES_SECRET_KEY } from './config'
import { initAesEncrypt } from '@shared/utils'

async function initApp() {
    // 初始化 AES 加密工具
    await initAesEncrypt(AES_SECRET_KEY)
    
    // ... 其他初始化操作
}

initApp()
```

### 初始化状态检查

```typescript
import { getAesInstance } from '@shared/utils'

try {
    const aes = getAesInstance()
    console.log('✅ AES 加密工具已初始化')
} catch (error) {
    console.error('❌ AES 加密工具未初始化:', error)
}
```

## 加密流程图

```
用户输入密码
    ↓
前端 AES 加密 (1234567890qwer)
    ↓
发送加密后的密码
    ↓
Gateway (不解密，直接转发)
    ↓
Auth Service 接收
    ↓
AES 解密 (1234567890qwer)
    ↓
BCrypt 再次加密
    ↓
存入数据库
```

## 安全建议

### 开发环境
- ✅ 使用固定密钥 `1234567890qwer`
- ✅ 密钥在代码中配置

### 生产环境
- 🔒 从环境变量获取密钥
- 🔒 使用配置中心（Nacos）
- 🔒 定期轮换密钥
- 🔒 密钥长度至少 32 字符

### 示例：从环境变量获取

```typescript
// 生产环境配置
export const AES_SECRET_KEY = process.env.VUE_APP_AES_SECRET_KEY || '1234567890qwer'
```

## 故障排查

### 问题：登录时提示"密码错误"

**可能原因**：前后端密钥不一致

**排查步骤**：
1. 检查前端配置：`src/config/index.ts` 中的 `AES_SECRET_KEY`
2. 检查后端配置：`application.yml` 中的 `security.aes.secret-key`
3. 确保两者完全一致

**解决方案**：
```bash
# 前端
export const AES_SECRET_KEY = '1234567890qwer'

# 后端
security:
  aes:
    secret-key: 1234567890qwer
```

### 问题："AES 加密工具未初始化"

**原因**：`initAesEncrypt()` 未被调用

**解决**：检查 `main.ts` 中是否正确调用初始化函数

### 问题：加密后的数据无法解密

**可能原因**：
1. 密钥不正确
2. 数据被篡改
3. Base64 编码问题

**调试方法**：
```typescript
const aes = getAesInstance()
const original = 'test123'
const encrypted = await aes.encrypt(original)
const decrypted = await aes.decrypt(encrypted)
console.log(original === decrypted)  // 应该输出 true
```

## API 参考

### 配置项

| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `AES_SECRET_KEY` | `string` | `'1234567890qwer'` | AES 加密密钥 |
| `API_BASE_URL` | `string` | `'http://localhost:8180'` | API 基础地址 |
| `APP_CONFIG.name` | `string` | `'泰豪电源 AI 数智化平台'` | 应用名称 |
| `APP_CONFIG.version` | `string` | `'1.0.0'` | 应用版本 |

### 环境变量

| 变量名 | 说明 | 示例 |
|--------|------|------|
| `VITE_API_BASE_URL` | API 基础地址 | `https://api.example.com` |
| `VUE_APP_AES_SECRET_KEY` | AES 密钥（生产） | `your-secret-key-32-chars-long` |

## 更多信息

- AES 加密工具详细文档：`@shared/utils/crypto/README.md`
- Auth API 文档：`@shared/api/auth/auth.ts`
- 后端 AES 实现：`urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java`
