Files
JARVIS/docs/superpowers/specs/2026-03-21-forum-redesign-design.md

17 KiB
Raw Blame History

交互广场重新设计

1. 概述与目标

将现有的论坛(交互广场)从传统的帖子/回复模式重构为三个AI驱动的智能板块

  1. AI学习板块 - 模型分析用户活动,学习客观知识并加入知识图谱,向用户汇报学习成果
  2. AI建议板块 - 基于用户习惯和数据,提供个性化建议
  3. AI交互板块 - 用户发起学习主题或AI主动探索补充知识

2. 设计风格

沿用项目现有的深色赛博朋克/终端风格:

  • 背景:var(--bg-void) 深空黑
  • 强调色:紫色 #a855f7 (用于交互广场专属色调)
  • 卡片背景:var(--bg-card)
  • 边框:1px solid var(--border-dim)hover时发光
  • 字体:等宽字体 var(--font-mono),标题用 var(--font-display)

3. 页面结构

┌─────────────────────────────────────────────────────────────┐
│  // INTERACTIVE PLAZA                         [页面标题]    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ [MODEL LEARNING]  AI学习板块                         │   │
│  │ AI分析你的活动学习知识并汇报                        │   │
│  ├─────────────────────────────────────────────────────┤   │
│  │ • 今日学习摘要                                      │   │
│  │ • 学习历史时间线                                    │   │
│  │ • 知识图谱更新统计                                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ [SUGGESTIONS]  AI建议板块                           │   │
│  │ 基于你的习惯提供个性化建议                           │   │
│  ├─────────────────────────────────────────────────────┤   │
│  │ • 知识补充建议                                      │   │
│  │ • 效率优化建议                                      │   │
│  │ • 技能深耕建议                                      │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │ [INTERACTIVE]  AI交互学习板块                        │   │
│  │ 用户发起学习主题AI主动探索                         │   │
│  ├─────────────────────────────────────────────────────┤   │
│  │ • 用户发起的学习主题                                │   │
│  │ • AI主动学习的内容                                  │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4. 功能详情

4.1 AI学习板块 (MODEL LEARNING)

数据来源:

  • 对话记录(messagesMessage模型- 分析对话内容提取概念
  • 看板任务(tasksTask模型- 识别技术栈和工作流程
  • 知识库(documents, kg_nodes 表)- 补充知识缺口

学习流程:

定时任务触发 → 分析近期活动 → 提取概念/术语/事实
→ 存入知识图谱(KGNode) → 生成学习报告 → 存入learning_records表

数据库扩展:

# 新增 learning_records 表
# 继承 app.models.base.BaseModel自动获得 id, created_at, updated_at
from app.models.base import BaseModel

class LearningRecord(BaseModel):
    __tablename__ = "learning_records"

    user_id = Column(String(36), ForeignKey("users.id"), nullable=False, index=True)
    learning_type = Column(String(50), nullable=False)  # concept, technology, workflow
    topic = Column(String(500), nullable=False)  # 学习主题
    summary = Column(Text, nullable=False)  # AI生成的学习摘要
    source = Column(String(50), nullable=False)  # conversation, kanban, knowledge
    source_ids = Column(JSON, nullable=True)  # 来源ID列表如 {conversation_ids: [...], task_ids: [...]}
    kg_nodes_created = Column(JSON, nullable=True)  # 创建的KGNode ID列表

KGNode实体类型扩展

  • learned_concept - 从对话中学到的概念
  • technology - 识别出的技术栈
  • workflow - 从看板任务中提取的工作流程

前端展示:

  1. 今日学习摘要卡片

    • AI生成的自然语言总结
    • 示例:"今日学习了依赖注入和异步编程两个概念它们都来自你关于FastAPI的讨论"
    • 显示来源标签:对话/看板/知识库
  2. 学习历史时间线

    • 垂直时间线布局
    • 每条记录显示:时间、主题、摘要
    • 点击展开查看详情
  3. 知识图谱更新统计

    • 今日新增节点数
    • 今日新建关系数
    • 迷你柱状图显示各类别占比(可复用 MiniBarChart

4.2 AI建议板块 (SUGGESTIONS)

建议类型:

  1. 知识补充建议 (knowledge)

    • 检测知识图谱薄弱领域
    • 基于用户提问推断知识缺口
    • 示例:"你的知识图谱在'微服务架构'领域较为薄弱,建议深入学习"
  2. 效率优化建议 (efficiency)

    • 分析用户使用模式
    • 推荐最佳实践
    • 示例:"你通常在下午工作效率最高,建议将复杂任务安排在这个时段"
  3. 技能深耕建议 (skill)

    • 基于高频话题
    • 推荐深入学习方向
    • 示例:"你最近频繁讨论API设计建议学习REST最佳实践和GraphQL"

数据库扩展:

# 新增 suggestions 表
from app.models.base import BaseModel

class Suggestion(BaseModel):
    __tablename__ = "suggestions"

    user_id = Column(String(36), ForeignKey("users.id"), nullable=False, index=True)
    suggestion_type = Column(String(50), nullable=False)  # knowledge, efficiency, skill
    title = Column(String(500), nullable=False)  # 建议标题
    content = Column(Text, nullable=False)  # 建议内容
    source_data = Column(JSON, nullable=True)  # 分析依据,如 {knowledge_gaps: [...], usage_patterns: {...}}
    is_read = Column(Boolean, default=False)  # 是否已读
    is_dismissed = Column(Boolean, default=False)  # 是否忽略

前端展示:

  • 卡片列表布局
  • 每个建议显示:图标、类型标签、标题、内容
  • 右侧显示建议来源分析
  • 提供"查看详情"和"忽略"按钮

4.3 AI交互板块 (INTERACTIVE)

用户发起学习:

  1. 用户输入想学习的主题
  2. AI分析主题搜索知识库
  3. 如有需要AI主动抓取外部资源
  4. 生成学习报告
  5. 自动存入知识图谱
  6. 在交互板块展示

数据库扩展:

# 新增 interactive_topics 表
from app.models.base import BaseModel

class InteractiveTopic(BaseModel):
    __tablename__ = "interactive_topics"

    user_id = Column(String(36), ForeignKey("users.id"), nullable=False, index=True)
    topic = Column(String(500), nullable=False)  # 学习主题
    status = Column(String(50), nullable=False)  # pending, learning, completed, failed
    result = Column(Text, nullable=True)  # 学习结果/报告
    kg_nodes_created = Column(JSON, nullable=True)  # 创建的KGNode ID列表
    source = Column(String(50), nullable=False)  # user_initiated, ai_proactive
    completed_at = Column(DateTime, nullable=True)

AI主动学习

  1. AI分析用户历史提问
  2. 发现知识缺口或关联主题
  3. 主动学习并生成报告
  4. 在交互板块标记为"AI主动"

前端展示:

  • 两个子区块:用户发起 / AI主动
  • 输入框:"让AI学习 [主题]"
  • 正在进行的学习任务显示进度
  • 已完成的学习显示结果摘要

5. API 设计

5.1 后端接口

GET  /api/forum/learning/summary
     - 获取今日学习摘要
     - 返回: { summary, records[], stats{ nodes_created, edges_created } }

GET  /api/forum/learning/history?page=1&limit=20
     - 获取学习历史
     - 返回: { records[], total }

GET  /api/forum/suggestions
     - 获取所有建议
     - 返回: { suggestions[] }

GET  /api/forum/suggestions/{id}
     - 获取单个建议详情
     - 返回: Suggestion

PATCH /api/forum/suggestions/{id}/read
     - 标记建议为已读

DELETE /api/forum/suggestions/{id}/dismiss
     - 忽略/删除建议

GET  /api/forum/interactive/topics
     - 获取交互主题列表
     - 返回: { user_initiated[], ai_proactive[] }

POST /api/forum/interactive/learn
     - 用户发起学习
     - Body: { topic: string }
     - 返回: { topic_id, status }

GET  /api/forum/interactive/topics/{id}
     - 获取学习主题详情/结果

5.2 前端API

// TypeScript 类型定义
interface LearningSummary {
  summary: string
  records: LearningRecord[]
  stats: {
    nodes_created: number
    edges_created: number
  }
}

interface LearningRecord {
  id: string
  learning_type: 'concept' | 'technology' | 'workflow'
  topic: string
  summary: string
  source: string
  source_ids?: { conversation_ids?: string[]; task_ids?: string[] }
  kg_nodes_created?: string[]
  created_at: string
}

interface Suggestion {
  id: string
  suggestion_type: 'knowledge' | 'efficiency' | 'skill'
  title: string
  content: string
  source_data?: Record<string, any>
  is_read: boolean
  is_dismissed: boolean
  created_at: string
}

interface InteractiveTopic {
  id: string
  topic: string
  status: 'pending' | 'learning' | 'completed' | 'failed'
  result?: string
  kg_nodes_created?: string[]
  source: 'user_initiated' | 'ai_proactive'
  created_at: string
  completed_at?: string
}

// API 方法
const forumApi = {
  // learning
  fetchLearningSummary(): Promise<LearningSummary>,
  fetchLearningHistory(params: { page: number, limit: number }): Promise<{ records: LearningRecord[], total: number }>,

  // suggestions
  fetchSuggestions(): Promise<Suggestion[]>,
  getSuggestion(id: string): Promise<Suggestion>,
  markSuggestionRead(id: string): Promise<void>,
  dismissSuggestion(id: string): Promise<void>,

  // interactive
  fetchInteractiveTopics(): Promise<{ user_initiated: InteractiveTopic[], ai_proactive: InteractiveTopic[] }>,
  initiateLearning(topic: string): Promise<InteractiveTopic>,
  getTopicDetail(id: string): Promise<InteractiveTopic>,
}

6. 组件结构

frontend/src/views/ForumView.vue     # 主页面,三板块布局
frontend/src/components/forum/
├── LearningSection.vue              # AI学习板块
│   ├── LearningSummaryCard.vue      # 今日摘要卡片
│   ├── LearningTimeline.vue         # 学习历史时间线
│   └── LearningStats.vue           # 图谱更新统计复用MiniBarChart
├── SuggestionSection.vue            # AI建议板块
│   ├── SuggestionCard.vue          # 建议卡片
│   └── SuggestionList.vue          # 建议列表
└── InteractiveSection.vue           # AI交互板块
    ├── LearningInput.vue            # 学习主题输入框
    ├── UserInitiatedList.vue        # 用户发起列表
    └── AIProactiveList.vue          # AI主动列表

# 新增通用组件
frontend/src/components/forum/MiniDonutChart.vue   # 环形图(用于知识类别占比)

7. 服务层

7.1 LearningService

from app.core.llm import get_llm_client

class LearningService:
    def __init__(self, db: AsyncSession):
        self.llm = get_llm_client()

    async def generate_daily_summary(user_id: str) -> str:
        """分析用户今日活动,生成学习摘要"""
        # 使用 LLM 分析提取的概念,生成自然语言摘要
        concepts = await self.extract_concepts(...)
        prompt = f"根据以下学习内容生成简短摘要:{concepts}"
        return await self.llm.chat(prompt)

    async def extract_concepts_from_conversations(user_id: str, since: datetime) -> list[dict]:
        """从对话中提取概念"""

    async def identify_technologies_from_kanban(user_id: str) -> list[dict]:
        """从看板任务中识别技术栈"""

    async def create_kg_nodes(user_id: str, learnings: list[dict]) -> list[str]:
        """创建知识图谱节点"""

    async def record_learning(...) -> LearningRecord:
        """记录学习成果"""

7.2 SuggestionService

class SuggestionService:
    def __init__(self, db: AsyncSession):
        self.llm = get_llm_client()

    async def generate_suggestions(user_id: str) -> list[Suggestion]:
        """生成个性化建议"""
        # 分析知识缺口、使用模式、技能机会
        gaps = await self.analyze_knowledge_gaps(user_id)
        patterns = await self.analyze_usage_patterns(user_id)
        skills = await self.analyze_skill_opportunities(user_id)

        # 使用 LLM 生成建议
        prompt = f"基于以下分析生成建议:知识缺口{gaps},使用模式{patterns},技能机会{skills}"
        return await self.llm.chat(prompt)

    async def analyze_knowledge_gaps(user_id: str) -> list[dict]:
        """分析知识图谱缺口"""

    async def analyze_usage_patterns(user_id: str) -> dict:
        """分析使用模式"""

    async def identify_skill_opportunities(user_id: str) -> list[dict]:
        """识别技能提升机会"""

7.3 InteractiveService

class InteractiveService:
    def __init__(self, db: AsyncSession):
        self.llm = get_llm_client()

    async def initiate_learning(user_id: str, topic: str) -> InteractiveTopic:
        """用户发起学习"""

    async def execute_learning(topic_id: str) -> dict:
        """执行学习任务:
        1. 搜索知识库相关节点
        2. 使用 LLM 深入学习主题
        3. 生成学习报告
        4. 创建 KGNode
        5. 更新 topic 状态
        """
        topic = await self.get_topic(topic_id)
        content = await self.research_topic(topic.topic)
        report = await self.generate_learning_report(topic, content)
        await self.create_kg_nodes_from_report(report)
        await self.update_topic_status(topic_id, 'completed', report)

    async def generate_learning_report(self, topic: InteractiveTopic, content: str) -> str:
        """使用 LLM 生成结构化学习报告"""

8. 定时任务

每日凌晨生成学习报告:

  • 分析昨日用户活动
  • 提取新概念和技术栈
  • 更新知识图谱
  • 生成学习摘要存入数据库

集成方式: 使用项目现有的 scheduler_service.py

# 在 scheduler_service.py 的 start_scheduler() 中添加
from app.services.learning_service import LearningService

async def daily_learning_job():
    """每日凌晨0:30生成学习报告"""
    from app.database import get_db_session

    async for db in get_db_session():
        service = LearningService(db)
        users = await get_all_active_users(db)
        for user in users:
            await service.generate_and_record_daily_learning(user.id)
        break

# 在 start_scheduler() 中注册
scheduler.add_job(daily_learning_job, "cron", hour=0, minute=30, id="daily_learning")

9. 错误处理

场景 处理
无活动数据 显示"今日暂无学习成果",不生成空记录
知识图谱更新失败 回滚学习记录,标记为失败状态
AI生成失败 记录原始数据,标记需要重试
用户发起学习主题为空 前端验证拦截,不发送请求

10. 访问控制

所有板块需要用户登录后访问:

  • 未登录用户显示"请先登录"提示
  • 不发送无效API请求
  • 保持页面结构完整

11. 技术实现

前端:

  • Vue 3 + TypeScript
  • 复用现有组件样式StatsView.vue模式
  • CSS实现迷你图表
  • lucide-vue-next图标

后端:

  • FastAPI + SQLAlchemy
  • 复用现有数据库连接
  • 新增三个Service类
  • 复用现有认证机制

数据流:

用户活动 → LearningService分析 → KGNode创建 → LearningRecord存储
                                    ↓
                              AI生成摘要 → 前端展示