# 注册界面 + 设置界面 功能设计

## 概述

为 Jarvis 系统添加用户注册功能和完整的设置界面。用户可以：
- 在前端注册账号
- 在设置界面管理个人信息和 LLM 配置
- 配置定时任务等系统参数

**核心价值：** 支持多用户、每个用户独立配置自己的 LLM 提供商和参数。

## 现状分析

### 已有的功能
- 后端已有 `/api/auth/register` API
- 后端使用 `pydantic-settings` 从 `.env` 读取配置
- 前端只有登录页面，无注册入口

### 需要改动的地方
- 前端 LoginView 添加注册表单
- User 模型增加 `llm_config` 和 `scheduler_config` JSON 字段
- 新建 Settings 路由和服务
- 新建 SettingsView 页面

## 数据模型

### User 表扩展

```sql
ALTER TABLE users ADD COLUMN llm_config TEXT;
ALTER TABLE users ADD COLUMN scheduler_config TEXT;
```

### 字段结构

**llm_config (JSON):**
```json
{
  "chat": {
    "provider": "openai|claude|ollama|deepseek|custom",
    "model": "gpt-4o",
    "base_url": "https://api.openai.com/v1",
    "api_key": "sk-..."
  },
  "vlm": {
    "provider": "openai",
    "model": "gpt-4o",
    "base_url": "...",
    "api_key": "..."
  },
  "embedding": {
    "provider": "openai",
    "model": "text-embedding-3-small",
    "base_url": "...",
    "api_key": "..."
  },
  "rerank": {
    "provider": "openai",
    "model": "bge-reranker-v2",
    "base_url": "...",
    "api_key": "..."
  }
}
```

**scheduler_config (JSON):**
```json
{
  "daily_plan_time": "08:00",
  "forum_scan_interval_minutes": 30,
  "todo_ai_generate_time": "08:00",
  "enabled": true
}
```

## API 设计

### 1. 注册 API (已有)
```
POST /api/auth/register
Body: { email, password, full_name }
Response: UserOut
```

### 2. 获取用户设置
```
GET /api/settings
Response: {
  profile: { id, email, full_name, created_at },
  llm_config: { ... },
  scheduler_config: { ... }
}
```

### 3. 更新用户资料
```
PUT /api/settings/profile
Body: { full_name?, password? }
Response: UserOut
```

### 4. 更新 LLM 配置
```
PUT /api/settings/llm
Body: { chat?: {...}, vlm?: {...}, embedding?: {...}, rerank?: {...} }
Response: { llm_config: { ... } }  // 返回更新后的完整配置
```

### 5. 测试 LLM 连接
```
POST /api/settings/llm/test
Body: { type: "chat"|"vlm"|"embedding"|"rerank", provider, model, base_url, api_key }
Response: { success: true, message: "连接成功" } 或 { success: false, error: "错误信息" }
```

### 6. 更新定时任务配置
```
PUT /api/settings/scheduler
Body: { daily_plan_time?, forum_scan_interval_minutes?, todo_ai_generate_time?, enabled? }
Response: { scheduler_config: { ... } }  // 返回更新后的完整配置
```

## 前端页面

### LoginView.vue 改动
- 添加"注册"和"登录"切换 Tab
- 注册表单：邮箱、密码、确认密码、用户名
- 复用现有 sci-fi 登录风格

### SettingsView.vue (新建)

#### 页面布局
```
┌─────────────────────────────────────────────────┐
│  [⚙] SETTINGS                                   │
├─────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────┐ │
│ │ PROFILE                                       │ │
│ │  Email: operator@jarvis.ai                   │ │
│ │  Name:  [___________]                        │ │
│ │  Password: [********] [Change]               │ │
│ └─────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ LLM CONFIGURATION                           │ │
│ │  ┌─ Chat ────────────────────────────────┐  │ │
│ │  │ Provider: [OpenAI ▼]                  │  │ │
│ │  │ Model:   [gpt-4o ____________]       │  │ │
│ │  │ Base URL:[https://...]        ]       │  │ │
│ │  │ API Key: [•••••••••••••••••]         │  │ │
│ │  └──────────────────────────────────────┘  │ │
│ │  ┌─ VLM ─────────────────────────────────┐  │ │
│ │  │ ... (同上结构)                         │  │ │
│ │  └──────────────────────────────────────┘  │ │
│ │  ┌─ Embedding ───────────────────────────┐  │ │
│ │  │ ... (同上结构)                         │  │ │
│ │  └──────────────────────────────────────┘  │ │
│ │  ┌─ Rerank ──────────────────────────────┐  │ │
│ │  │ ... (同上结构)                         │  │ │
│ │  └──────────────────────────────────────┘  │ │
│ └─────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ SCHEDULER                                   │ │
│ │  Daily Plan Time:    [08:00]                │ │
│ │  Forum Scan Interval: [30] 分钟             │ │
│ │  Todo AI Generate:   [08:00]               │ │
│ │  Scheduler Enabled:   [ON]                  │ │
│ └─────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────┐ │
│ │ [SAVE ALL SETTINGS]                         │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
```

#### 交互行为
- 修改后点击"保存"按钮，按钮显示 loading 状态
- 保存成功显示 toast 提示"保存成功"
- 保存失败显示 toast 提示错误信息
- 密码修改需二次确认弹窗
- API Key 字段支持显示/隐藏切换
- 每个模型配置卡片有独立的"测试"按钮
- Provider 切换时自动填充默认值（如 Ollama 切换到 localhost:11434）
- Scheduler enabled 关闭时，时间输入框显示禁用状态
- 空配置时显示"点击配置"占位提示

#### 注册表单
- 邮箱：必填，格式校验
- 用户名：必填，2-20 字符
- 密码：必填，最少 8 字符
- 确认密码：必填，需与密码一致
- 密码强度指示器（弱/中/强）

## 路由和侧边栏

### router/index.ts
```typescript
{
  path: 'settings',
  name: 'settings',
  component: () => import('@/views/SettingsView.vue'),
}
```

### SidebarNav.vue
```typescript
{ name: '设置', path: '/settings', icon: Settings }
```

## 技术实现

### 后端文件
```
backend/app/
  models/
    user.py          # 修改：添加 llm_config, scheduler_config 字段
  schemas/
    auth.py          # 修改：UserCreate 支持 full_name
    settings.py      # 新建：SettingsOut, LLMConfigIn, SchedulerConfigIn
  routers/
    settings.py      # 新建：settings router
  services/
    settings_service.py  # 新建：设置逻辑服务
```

### 前端文件
```
frontend/src/
  api/
    settings.ts      # 新建：settings API 客户端
  views/
    LoginView.vue    # 修改：添加注册 Tab
    SettingsView.vue # 新建：设置页面
  router/
    index.ts         # 修改：添加 /settings 路由
  components/
    SidebarNav.vue   # 修改：添加设置菜单
```

## 验证清单

1. 注册功能正常 - 可以通过注册页面创建新账号
2. 登录功能正常 - 新老用户都可以登录
3. 设置页面可访问 - 登录后可进入设置页面
4. 个人信息修改正常 - 用户名、密码可修改
5. LLM 配置保存正常 - 四种模型配置可保存
6. LLM 测试连接正常 - 可以验证配置是否正确
7. 定时任务配置正常 - 时间间隔可修改
8. 配置持久化正常 - 重新登录后配置保留
9. UI 风格一致 - 设置页面与其他页面风格统一
10. 注册表单验证正常 - 密码强度、格式校验有效
