250 lines
9.0 KiB
Markdown
250 lines
9.0 KiB
Markdown
|
|
# 注册界面 + 设置界面 功能设计
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
为 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. 注册表单验证正常 - 密码强度、格式校验有效
|