Files
JARVIS/docs/superpowers/specs/2026-03-20-settings-register-design.md

9.0 KiB
Raw Blame History

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

概述

为 Jarvis 系统添加用户注册功能和完整的设置界面。用户可以:

  • 在前端注册账号
  • 在设置界面管理个人信息和 LLM 配置
  • 配置定时任务等系统参数

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

现状分析

已有的功能

  • 后端已有 /api/auth/register API
  • 后端使用 pydantic-settings.env 读取配置
  • 前端只有登录页面,无注册入口

需要改动的地方

  • 前端 LoginView 添加注册表单
  • User 模型增加 llm_configscheduler_config JSON 字段
  • 新建 Settings 路由和服务
  • 新建 SettingsView 页面

数据模型

User 表扩展

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

字段结构

llm_config (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):

{
  "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

{
  path: 'settings',
  name: 'settings',
  component: () => import('@/views/SettingsView.vue'),
}

SidebarNav.vue

{ 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. 注册表单验证正常 - 密码强度、格式校验有效