Molore — 系统架构总览(开发版)
面向开发团队的完整架构文档。包含双脑分离(个人脑 + 网络脑)和管理员后台(Admin Dashboard)的完整设计。可直接作为开发输入。
1. 项目概述
1.1 核心定位
Molore 是一个本地优先、AI 增强的个人知识管理系统。它将用户自身产生的数据(个人脑)与从互联网采集的数据(网络脑)彻底分离,同时提供完整的 SaaS 运营后台。
1.2 双脑理念
| 维度 | 个人脑(Personal Brain) | 网络脑(Network Brain) |
|---|---|---|
| 数据归属 | 用户自己产生 | 外部互联网采集 |
| 隐私级别 | 🔴 最高(敏感,不离开本地) | 🟡 中等(公开互联网内容) |
| 默认 LLM | 本地模型(Ollama) | 外部模型(OpenAI/Claude/Kimi/千问) |
| 视觉标识 | 暖色调(琥珀色 #d29922) | 冷色调(蓝色 #58a6ff) |
| 核心操作 | 创作、思考、记忆、决策、情感 | 采集、阅读、研究、追踪、验证 |
| 导出策略 | 完全导出,无限制 | 可导出,保留来源链 |
1.3 功能模块总览(8 大主菜单)
📥 采集(Ingestion) ← 网络脑:剪藏、RSS、邮件、社交、LLM集成
🔗 图谱(Graph) ← 双脑:知识网络、全局搜索、双向链接
🧬 认知镜像(Cognitive Mirror) ← 个人脑:思维指纹、认知偏差、决策审计、未来模拟
💡 涌现工作室(Emergence Studio) ← 双脑:跨域联想、创意碰撞、概念杂交、反事实探索
🎯 注意力管家(Attention) ← 个人脑:投资组合、深度工作、模式分析
⏳ 时间胶囊(Time Capsule) ← 个人脑:封存、解锁、跨时空对话
🛡️ 反脆弱知识库(Anti-Fragile) ← 网络脑:来源追溯、多模型验证、时效追踪、反证收集
⚙️ 设置(Settings) ← 系统:账户、隐私、AI、同步、插件、数据、外观1.4 管理员后台(Admin Dashboard)
面向平台运营人员,提供:用户管理、内容审核、数据统计、订阅计费、系统管理、日志审计、客服工单。
2. 系统架构
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户层 (User Layer) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Web App │ │ Desktop App │ │ Browser Ext │ │ Mobile App (Future) │ │
│ │ (React) │ │ (Tauri) │ │ (Chrome/FF) │ │ │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └─────────────────────┘ │
│ │ │ │ │
│ └────────────────┴────────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ API Gateway │ ← 统一入口,鉴权,限流,路由 │
│ │ (Nginx/ │ │
│ │ Traefik) │ │
│ └──────┬──────┘ │
│ │ │
├───────────────────────────┼────────────────────────────────────────────────────┤
│ │ 服务层 (Service Layer) │
│ ┌────────────────────────┼────────────────────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Ingestion │ │ Graph │ │ Cognitive │ │ Emergence │ │ │
│ │ │ Service │ │ Service │ │ Service │ │ Service │ │ │
│ │ │ :8001 │ │ :8002 │ │ :8003 │ │ :8004 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Attention │ │ Capsule │ │ AntiFragile │ │ LLM Router │ │ │
│ │ │ Service │ │ Service │ │ Service │ │ Service │ │ │
│ │ │ :8005 │ │ :8006 │ │ :8007 │ │ :8008 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Brain │ │ Admin │ ← 双脑切换 + 融合查询 │ │
│ │ │ Service │ │ Service │ ← 管理员后台 │ │
│ │ │ :8009 │ │ :8010 │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ 共享层:Redis Pub/Sub + SQLite Pool + Shared Cache │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
├───────────────────────────┼────────────────────────────────────────────────────┤
│ │ 数据层 (Data Layer) │
│ ┌────────────────────────┼────────────────────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ SQLite │ │ ChromaDB │ │ Redis │ │ File Store │ │ │
│ │ │ (SQLCipher)│ │ (向量数据库) │ │ (缓存/队列) │ │ (附件存储) │ │ │
│ │ │ • 双脑标记 │ │ • 语义嵌入 │ │ • 会话缓存 │ │ • 图片 │ │ │
│ │ │ • 用户数据 │ │ • 相似度搜索 │ │ • 任务队列 │ │ • 文档 │ │ │
│ │ │ • 关系图谱 │ │ • 聚类分析 │ │ • 实时状态 │ │ • 语音 │ │ │
│ │ │ • Admin 表 │ │ │ │ • 限流计数 │ │ • 备份 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ FTS5 + Hybrid Search Engine │ │ │
│ │ │ • 全文搜索 (FTS5) • 向量搜索 (Chroma) • 混合搜索 │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘3. 技术栈
3.1 前端
| 技术 | 用途 | 版本 |
|---|---|---|
| React | UI 框架 | ^19.0.0 |
| TypeScript | 类型系统 | ^5.3.0 |
| Vite | 构建工具 | ^5.0.0 |
| Tailwind CSS | 样式系统 | ^3.4.0 |
| Zustand | 状态管理 | ^4.5.0 |
| React Query | 数据同步 | ^5.0.0 |
| Framer Motion | 动画 | ^11.0.0 |
| React Router | 路由 | ^6.21.0 |
| D3.js / React-Flow | 图谱可视化 | ^7.8 / ^12.0 |
| TipTap | 富文本编辑 | ^2.1.0 |
| Recharts | 图表 | ^2.10 |
| Dexie.js | 前端 IndexedDB | ^3.2 |
| Lucide React | 图标 | ^0.300 |
3.2 后端
| 技术 | 用途 | 版本 |
|---|---|---|
| FastAPI | Web 框架 | ^0.109 |
| SQLAlchemy | ORM | ^2.0 |
| Alembic | 数据库迁移 | ^1.13 |
| Pydantic | 数据验证 | ^2.5 |
| SQLite + SQLCipher | 加密数据库 | 3.x |
| ChromaDB | 向量数据库 | ^0.4 |
| Redis | 缓存/队列/实时 | ^7.0 |
| Ollama | 本地 LLM | 最新 |
| httpx | HTTP 客户端 | ^0.26 |
| python-jose | JWT | ^3.3 |
| passlib | 密码哈希 | ^1.7 |
| apscheduler | 定时任务 | ^3.10 |
| pytest | 测试 | ^7.4 |
3.3 浏览器插件
| 技术 | 用途 |
|---|---|
| Manifest V3 | Chrome/Edge 扩展 |
| Manifest V2 兼容 | Firefox 扩展 |
| Vite | 构建系统 |
| Readability.js | 内容提取 |
| declarativeNetRequest | 网络拦截 |
3.4 基础设施
| 技术 | 用途 |
|---|---|
| Docker + Docker Compose | 容器化部署 |
| Traefik | API 网关/反向代理 |
| Prometheus + Grafana | 监控告警 |
| GitHub Actions | CI/CD |
4. 数据库设计
4.1 全局字段
sql
-- 所有内容表共享的 brain_side 字段
ALTER TABLE knowledge_units ADD COLUMN brain_side TEXT DEFAULT 'network'
CHECK(brain_side IN ('personal', 'network', 'both', 'unknown'));
ALTER TABLE notes ADD COLUMN brain_side TEXT DEFAULT 'personal'
CHECK(brain_side = 'personal');
ALTER TABLE capsules ADD COLUMN brain_side TEXT DEFAULT 'personal'
CHECK(brain_side = 'personal');
ALTER TABLE browser_clips ADD COLUMN brain_side TEXT DEFAULT 'network'
CHECK(brain_side = 'network');
ALTER TABLE rss_items ADD COLUMN brain_side TEXT DEFAULT 'network'
CHECK(brain_side = 'network');
ALTER TABLE attention_activities ADD COLUMN brain_side TEXT;
ALTER TABLE graph_nodes ADD COLUMN brain_side TEXT DEFAULT 'unknown';
ALTER TABLE graph_edges ADD COLUMN source_brain_side TEXT DEFAULT 'unknown';
ALTER TABLE graph_edges ADD COLUMN target_brain_side TEXT DEFAULT 'unknown';
ALTER TABLE graph_edges ADD COLUMN cross_brain BOOLEAN DEFAULT false;4.2 核心表结构
sql
-- ==================== users(用户)====================
CREATE TABLE users (
id TEXT PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT,
avatar TEXT,
password_hash TEXT,
status TEXT DEFAULT 'active' CHECK(status IN ('active', 'inactive', 'suspended')),
subscription_tier TEXT DEFAULT 'free' CHECK(subscription_tier IN ('free', 'pro', 'team', 'enterprise')),
subscription_status TEXT DEFAULT 'active',
subscription_expires_at TIMESTAMP,
storage_used INTEGER DEFAULT 0,
storage_limit INTEGER DEFAULT 1073741824, -- 1GB default
last_login_at TIMESTAMP,
last_login_ip TEXT,
mfa_enabled BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tenant_id TEXT -- 多租户
);
-- ==================== notes(笔记 - 个人脑)====================
CREATE TABLE notes (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
brain_side TEXT DEFAULT 'personal' CHECK(brain_side = 'personal'),
title TEXT NOT NULL,
content TEXT NOT NULL,
content_format TEXT DEFAULT 'markdown' CHECK(content_format IN ('markdown', 'tiptap_json', 'plain')),
backlinks TEXT, -- JSON
forward_links TEXT, -- JSON
mood_emotion TEXT,
mood_intensity REAL,
mood_energy_level REAL,
location TEXT,
weather TEXT,
capsule_refs TEXT, -- JSON
is_private BOOLEAN DEFAULT true,
encryption_level TEXT DEFAULT 'local_aes',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_notes_user ON notes(user_id);
-- ==================== capsules(时间胶囊 - 个人脑)====================
CREATE TABLE capsules (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
brain_side TEXT DEFAULT 'personal' CHECK(brain_side = 'personal'),
content_type TEXT CHECK(content_type IN ('text', 'voice', 'image', 'mixed')),
content_body TEXT NOT NULL,
content_attachments TEXT, -- JSON
mood_emotion TEXT,
mood_intensity REAL,
mood_energy_level REAL,
mood_trigger TEXT,
mood_weather TEXT,
mood_location TEXT,
sealed_at TIMESTAMP,
sealed_context TEXT, -- JSON
sealed_fingerprint TEXT,
unlock_type TEXT CHECK(unlock_type IN ('temporal', 'eventual', 'milestone', 'conditional', 'compound')),
unlock_config TEXT NOT NULL, -- JSON
unlock_status TEXT DEFAULT 'locked' CHECK(unlock_status IN ('locked', 'unlocked', 'opened', 'revisited')),
privacy_require_auth BOOLEAN DEFAULT false,
privacy_allow_export BOOLEAN DEFAULT true,
privacy_encryption_level TEXT DEFAULT 'local',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_capsules_user_status ON capsules(user_id, unlock_status);
-- ==================== capsule_dialogues(胶囊对话)====================
CREATE TABLE capsule_dialogues (
id TEXT PRIMARY KEY,
capsule_id TEXT NOT NULL,
opened_at TIMESTAMP,
opened_by TEXT DEFAULT 'user',
present_context TEXT, -- JSON
present_mood TEXT, -- JSON
present_reflection TEXT,
conversation TEXT, -- JSON
insights_pattern TEXT,
insights_growth TEXT,
insights_warning TEXT,
insights_suggestion TEXT,
closed_at TIMESTAMP,
closure TEXT,
FOREIGN KEY (capsule_id) REFERENCES capsules(id) ON DELETE CASCADE
);
-- ==================== browser_clips(浏览器剪藏 - 网络脑)====================
CREATE TABLE browser_clips (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
brain_side TEXT DEFAULT 'network' CHECK(brain_side = 'network'),
title TEXT NOT NULL,
url TEXT NOT NULL,
domain TEXT NOT NULL,
excerpt TEXT,
full_text TEXT,
readability_score REAL,
author TEXT,
publish_date TIMESTAMP,
site_type TEXT CHECK(site_type IN ('blog', 'news', 'academic', 'forum', 'social', 'wiki', 'docs', 'other')),
credibility_score REAL,
capture_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
capture_method TEXT CHECK(capture_method IN ('browser_extension', 'api_fetch', 'rss_import', 'manual_paste')),
user_agent TEXT,
screenshot_url TEXT,
extracted BOOLEAN DEFAULT false,
summarized BOOLEAN DEFAULT false,
tagged BOOLEAN DEFAULT false,
embedded BOOLEAN DEFAULT false,
verification_status TEXT DEFAULT 'unverified' CHECK(verification_status IN ('unverified', 'checking', 'confirmed', 'disputed', 'debunked')),
verification_consensus REAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_browser_clips_user ON browser_clips(user_id);
CREATE INDEX idx_browser_clips_domain ON browser_clips(domain);
CREATE INDEX idx_browser_clips_verification ON browser_clips(verification_status);
-- ==================== rss_items(RSS 条目 - 网络脑)====================
CREATE TABLE rss_items (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
brain_side TEXT DEFAULT 'network' CHECK(brain_side = 'network'),
feed_id TEXT NOT NULL,
title TEXT NOT NULL,
summary TEXT,
full_text TEXT,
url TEXT NOT NULL,
feed_name TEXT,
feed_url TEXT,
site_url TEXT,
author TEXT,
publish_date TIMESTAMP,
reading_status TEXT DEFAULT 'unread' CHECK(reading_status IN ('unread', 'read', 'later', 'archived')),
read_at TIMESTAMP,
reading_time INTEGER,
ai_summary TEXT,
ai_key_points TEXT, -- JSON
ai_related_notes TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (feed_id) REFERENCES rss_feeds(id)
);
CREATE INDEX idx_rss_items_user ON rss_items(user_id);
CREATE INDEX idx_rss_items_feed ON rss_items(feed_id);
CREATE INDEX idx_rss_items_status ON rss_items(reading_status);
-- ==================== knowledge_units(知识单元)====================
CREATE TABLE knowledge_units (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
brain_side TEXT DEFAULT 'network' CHECK(brain_side IN ('personal', 'network', 'both', 'unknown')),
content_raw TEXT NOT NULL,
content_processed TEXT,
content_type TEXT CHECK(content_type IN ('claim', 'opinion', 'data', 'methodology', 'prediction', 'diary', 'thought')),
content_confidence REAL,
source_url TEXT,
source_title TEXT,
source_type TEXT,
source_author TEXT,
source_publish_date TIMESTAMP,
source_access_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
source_credibility_score REAL,
source_bias_indicator TEXT,
source_funding_source TEXT,
verification_status TEXT DEFAULT 'unverified' CHECK(verification_status IN ('unverified', 'checking', 'confirmed', 'disputed', 'debunked', 'outdated')),
verification_consensus REAL,
last_verified TIMESTAMP,
next_scheduled TIMESTAMP,
timeliness_status TEXT CHECK(timeliness_status IN ('fresh', 'stable', 'aging', 'outdated', 'superseded')),
timeliness_half_life INTEGER,
timeliness_deprecation_warning TEXT,
trust_level TEXT DEFAULT 'tentative' CHECK(trust_level IN ('trusted', 'tentative', 'suspicious', 'rejected')),
first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
last_reviewed TIMESTAMP,
review_count INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_knowledge_user_status ON knowledge_units(user_id, verification_status);
CREATE INDEX idx_knowledge_brain ON knowledge_units(brain_side);
-- ==================== attention_activities(注意力活动)====================
CREATE TABLE attention_activities (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
category_id TEXT NOT NULL,
activity_source TEXT DEFAULT 'unknown' CHECK(activity_source IN ('local_app', 'network_browser', 'unknown')),
brain_side TEXT,
description TEXT,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
actual_duration INTEGER,
source TEXT CHECK(source IN ('manual', 'browser_extension', 'desktop_app', 'ai_detected')),
metadata_url TEXT,
metadata_app TEXT,
metadata_title TEXT,
completion_status TEXT CHECK(completion_status IN ('completed', 'interrupted', 'abandoned')),
focus_score REAL,
focus_duration REAL,
focus_intensity REAL,
focus_recovery REAL,
focus_switching REAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES attention_categories(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_activities_user_time ON attention_activities(user_id, start_time);
CREATE INDEX idx_activities_brain ON attention_activities(brain_side);
-- ==================== attention_categories(注意力分类)====================
CREATE TABLE attention_categories (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
name TEXT NOT NULL,
icon TEXT,
color TEXT,
allocated_minutes INTEGER NOT NULL,
min_required INTEGER,
max_allowed INTEGER,
priority TEXT CHECK(priority IN ('critical', 'high', 'medium', 'low')),
auto_rebalance_from TEXT, -- JSON
notify_at REAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- ==================== deep_work_sessions(深度工作会话)====================
CREATE TABLE deep_work_sessions (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
task TEXT NOT NULL,
planned_duration INTEGER NOT NULL,
actual_duration INTEGER,
started_at TIMESTAMP,
ended_at TIMESTAMP,
rules_block_notifications BOOLEAN,
rules_blocked_apps TEXT, -- JSON
rules_blocked_websites TEXT, -- JSON
rules_allowed_websites TEXT, -- JSON
rules_ambient_sound TEXT,
focus_score_avg REAL,
interruptions INTEGER DEFAULT 0,
blocked_attempts INTEGER DEFAULT 0,
completion_status TEXT,
end_reason TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- ==================== graph_nodes(图谱节点)====================
CREATE TABLE graph_nodes (
id TEXT PRIMARY KEY,
entity_id TEXT NOT NULL,
entity_type TEXT CHECK(entity_type IN ('note', 'clip', 'rss_item', 'email', 'knowledge_unit', 'capsule', 'concept')),
brain_side TEXT DEFAULT 'unknown' CHECK(brain_side IN ('personal', 'network', 'both', 'unknown')),
label TEXT NOT NULL,
color TEXT,
icon TEXT,
properties TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_graph_nodes_brain ON graph_nodes(brain_side);
CREATE INDEX idx_graph_nodes_entity ON graph_nodes(entity_id, entity_type);
-- ==================== graph_edges(图谱边)====================
CREATE TABLE graph_edges (
id TEXT PRIMARY KEY,
source_id TEXT NOT NULL,
target_id TEXT NOT NULL,
source_brain_side TEXT DEFAULT 'unknown',
target_brain_side TEXT DEFAULT 'unknown',
type TEXT CHECK(type IN ('references', 'similar', 'parent', 'child', 'tags', 'mentions', 'contradicts', 'supports', 'derived_from')),
strength REAL,
context TEXT,
cross_brain BOOLEAN DEFAULT false,
cross_brain_confidence REAL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (source_id) REFERENCES graph_nodes(id),
FOREIGN KEY (target_id) REFERENCES graph_nodes(id),
UNIQUE(source_id, target_id, type)
);
CREATE INDEX idx_graph_edges_cross ON graph_edges(cross_brain);
-- ==================== vector_embeddings(向量嵌入)====================
CREATE TABLE vector_embeddings (
id TEXT PRIMARY KEY,
entity_type TEXT CHECK(entity_type IN ('capsule', 'knowledge', 'note', 'bookmark', 'clip', 'rss_item')),
entity_id TEXT NOT NULL,
embedding BLOB NOT NULL,
model TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(entity_type, entity_id)
);
-- ==================== 全文搜索虚拟表 ====================
CREATE VIRTUAL TABLE knowledge_fts USING fts5(
content_raw,
content='knowledge_units',
content_rowid='rowid'
);
-- FTS5 同步触发器
CREATE TRIGGER knowledge_fts_insert AFTER INSERT ON knowledge_units BEGIN
INSERT INTO knowledge_fts(rowid, content_raw) VALUES (new.rowid, new.content_raw);
END;
CREATE TRIGGER knowledge_fts_update AFTER UPDATE ON knowledge_units BEGIN
UPDATE knowledge_fts SET content_raw = new.content_raw WHERE rowid = new.rowid;
END;
CREATE TRIGGER knowledge_fts_delete AFTER DELETE ON knowledge_units BEGIN
DELETE FROM knowledge_fts WHERE rowid = old.rowid;
END;4.3 管理员后台表
sql
-- ==================== admin_users(管理员用户)====================
CREATE TABLE admin_users (
id TEXT PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
avatar TEXT,
password_hash TEXT NOT NULL,
role TEXT NOT NULL CHECK(role IN ('super_admin', 'platform_admin', 'operator', 'finance_admin', 'support', 'auditor', 'readonly')),
permissions TEXT, -- JSON: 动态权限覆盖
status TEXT DEFAULT 'pending' CHECK(status IN ('active', 'inactive', 'suspended', 'pending')),
last_login_at TIMESTAMP,
last_login_ip TEXT,
mfa_enabled BOOLEAN DEFAULT false,
mfa_secret TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tenant_id TEXT,
managed_tenants TEXT -- JSON
);
CREATE INDEX idx_admin_users_role ON admin_users(role);
CREATE INDEX idx_admin_users_status ON admin_users(status);
-- ==================== admin_login_logs(管理员登录日志)====================
CREATE TABLE admin_login_logs (
id TEXT PRIMARY KEY,
admin_id TEXT NOT NULL,
ip_address TEXT,
user_agent TEXT,
login_method TEXT,
status TEXT CHECK(status IN ('success', 'failed', 'mfa_required')),
fail_reason TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (admin_id) REFERENCES admin_users(id)
);
CREATE INDEX idx_admin_login_logs_admin ON admin_login_logs(admin_id);
CREATE INDEX idx_admin_login_logs_time ON admin_login_logs(created_at);
-- ==================== admin_audit_logs(操作审计日志)====================
CREATE TABLE admin_audit_logs (
id TEXT PRIMARY KEY,
admin_id TEXT NOT NULL,
admin_name TEXT,
admin_role TEXT,
action TEXT NOT NULL,
resource_type TEXT NOT NULL,
resource_id TEXT,
before_state TEXT,
after_state TEXT,
changes TEXT,
ip_address TEXT,
user_agent TEXT,
request_id TEXT,
risk_level TEXT DEFAULT 'low' CHECK(risk_level IN ('low', 'medium', 'high', 'critical')),
risk_reason TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (admin_id) REFERENCES admin_users(id)
);
CREATE INDEX idx_admin_audit_logs_admin ON admin_audit_logs(admin_id);
CREATE INDEX idx_admin_audit_logs_action ON admin_audit_logs(action, resource_type);
CREATE INDEX idx_admin_audit_logs_risk ON admin_audit_logs(risk_level);
-- ==================== announcements(系统公告)====================
CREATE TABLE announcements (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
content TEXT NOT NULL,
type TEXT DEFAULT 'info' CHECK(type IN ('info', 'warning', 'critical', 'feature', 'maintenance')),
target_roles TEXT,
target_tenants TEXT,
status TEXT DEFAULT 'draft' CHECK(status IN ('draft', 'published', 'archived')),
scheduled_at TIMESTAMP,
published_at TIMESTAMP,
expires_at TIMESTAMP,
view_count INTEGER DEFAULT 0,
created_by TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES admin_users(id)
);
-- ==================== feature_flags(功能开关)====================
CREATE TABLE feature_flags (
id TEXT PRIMARY KEY,
key TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
description TEXT,
enabled BOOLEAN DEFAULT false,
scope_type TEXT DEFAULT 'global' CHECK(scope_type IN ('global', 'tenant', 'user', 'percentage')),
scope_value TEXT,
rollout_percentage INTEGER DEFAULT 0 CHECK(rollout_percentage BETWEEN 0 AND 100),
category TEXT,
depends_on TEXT,
created_by TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (created_by) REFERENCES admin_users(id)
);
-- ==================== system_configs(系统配置)====================
CREATE TABLE system_configs (
id TEXT PRIMARY KEY,
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL,
value_type TEXT DEFAULT 'string' CHECK(value_type IN ('string', 'number', 'boolean', 'json')),
description TEXT,
editable BOOLEAN DEFAULT true,
requires_restart BOOLEAN DEFAULT false,
scope TEXT DEFAULT 'global',
tenant_id TEXT,
updated_by TEXT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (updated_by) REFERENCES admin_users(id)
);
-- ==================== user_reports(用户举报)====================
CREATE TABLE user_reports (
id TEXT PRIMARY KEY,
reporter_id TEXT,
reported_id TEXT,
reported_type TEXT CHECK(reported_type IN ('user', 'content', 'comment', 'message')),
reason TEXT NOT NULL,
category TEXT CHECK(category IN ('spam', 'abuse', 'illegal', 'copyright', 'privacy', 'other')),
evidence TEXT,
status TEXT DEFAULT 'pending' CHECK(status IN ('pending', 'investigating', 'resolved', 'dismissed')),
resolution TEXT,
resolved_by TEXT,
resolved_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (resolved_by) REFERENCES admin_users(id)
);
CREATE INDEX idx_user_reports_status ON user_reports(status);
-- ==================== support_tickets(客服工单)====================
CREATE TABLE support_tickets (
id TEXT PRIMARY KEY,
ticket_number TEXT NOT NULL UNIQUE,
user_id TEXT NOT NULL,
title TEXT NOT NULL,
description TEXT,
category TEXT CHECK(category IN ('billing', 'technical', 'feature_request', 'bug', 'account', 'other')),
priority TEXT DEFAULT 'medium' CHECK(priority IN ('low', 'medium', 'high', 'critical')),
status TEXT DEFAULT 'open' CHECK(status IN ('open', 'in_progress', 'waiting_user', 'resolved', 'closed', 'escalated')),
assigned_to TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolved_at TIMESTAMP,
satisfaction_rating INTEGER,
satisfaction_comment TEXT,
FOREIGN KEY (assigned_to) REFERENCES admin_users(id)
);
CREATE INDEX idx_support_tickets_status ON support_tickets(status);
CREATE INDEX idx_support_tickets_assigned ON support_tickets(assigned_to);
-- ==================== ticket_replies(工单回复)====================
CREATE TABLE ticket_replies (
id TEXT PRIMARY KEY,
ticket_id TEXT NOT NULL,
author_id TEXT NOT NULL,
author_type TEXT CHECK(author_type IN ('user', 'admin')),
content TEXT NOT NULL,
is_internal BOOLEAN DEFAULT false,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (ticket_id) REFERENCES support_tickets(id)
);
-- ==================== orders(订单/订阅)====================
CREATE TABLE orders (
id TEXT PRIMARY KEY,
order_number TEXT NOT NULL UNIQUE,
user_id TEXT NOT NULL,
tier TEXT NOT NULL,
period TEXT CHECK(period IN ('monthly', 'yearly', 'lifetime')),
amount INTEGER NOT NULL, -- 分(避免浮点)
currency TEXT NOT NULL,
status TEXT CHECK(status IN ('pending', 'paid', 'failed', 'refunded', 'disputed')),
payment_method TEXT,
payment_provider TEXT,
transaction_id TEXT,
paid_at TIMESTAMP,
expires_at TIMESTAMP,
refunded_at TIMESTAMP,
refund_amount INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_orders_user ON orders(user_id);
CREATE INDEX idx_orders_status ON orders(status);
-- ==================== tenants(多租户)====================
CREATE TABLE tenants (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
config TEXT,
max_users INTEGER,
max_storage_gb INTEGER,
max_api_calls_per_month INTEGER,
status TEXT DEFAULT 'active' CHECK(status IN ('active', 'suspended', 'trial', 'expired')),
trial_ends_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);5. API 路由总览
5.1 用户端 API (/api/v1)
POST /api/v1/auth/register 用户注册
POST /api/v1/auth/login 用户登录
POST /api/v1/auth/refresh 刷新 Token
POST /api/v1/auth/logout 登出
GET /api/v1/brain/status 双脑状态
POST /api/v1/brain/switch 切换当前脑
POST /api/v1/brain/fusion-search 融合查询(跨脑搜索)
POST /api/v1/brain/cross-link 创建跨脑关联
GET /api/v1/brain/cross-brain-graph 跨脑关联图谱
POST /api/v1/capsules 创建胶囊
GET /api/v1/capsules 胶囊列表
GET /api/v1/capsules/:id 胶囊详情
POST /api/v1/capsules/:id/unlock 解锁胶囊
POST /api/v1/capsules/:id/dialogue 提交对话
GET /api/v1/capsules/stats 胶囊统计
GET /api/v1/capsules/events SSE 实时推送
POST /api/v1/attention/activities 记录活动
GET /api/v1/attention/activities 活动历史
GET /api/v1/attention/dashboard 仪表盘
GET /api/v1/attention/realtime 实时状态
POST /api/v1/attention/deep-work 启动深度工作
DELETE /api/v1/attention/deep-work/:id 结束深度工作
GET /api/v1/attention/distractions 干扰日志
GET /api/v1/attention/patterns 模式报告
POST /api/v1/knowledge 添加知识
GET /api/v1/knowledge 知识列表
GET /api/v1/knowledge/:id 知识详情
POST /api/v1/knowledge/:id/verify 触发验证
GET /api/v1/knowledge/:id/verification/:vid 验证进度
POST /api/v1/knowledge/:id/counter-evidence 提交反证
POST /api/v1/knowledge/batch-verify 批量验证
POST /api/v1/knowledge/:id/search-counter 反证搜索
GET /api/v1/knowledge/stats 统计
GET /api/v1/knowledge/:id/network 知识网络
GET /api/v1/graph/nodes 图谱节点
GET /api/v1/graph/edges 图谱边
GET /api/v1/graph/search 图谱搜索
POST /api/v1/graph/expand 节点扩展
POST /api/v1/llm/chat LLM 对话
POST /api/v1/llm/embed 生成嵌入
POST /api/v1/llm/summarize 摘要
POST /api/v1/llm/extract-tags 标签提取
POST /api/v1/llm/route 路由测试
GET /api/v1/sync/status 同步状态
POST /api/v1/sync/trigger 触发同步
GET /api/v1/sync/conflicts 冲突列表
POST /api/v1/sync/resolve 解决冲突5.2 管理员端 API (/api/admin)
POST /api/admin/auth/login 管理员登录
POST /api/admin/auth/refresh 刷新 Token
POST /api/admin/auth/logout 登出
GET /api/admin/auth/me 当前管理员信息
GET /api/admin/users 用户列表
GET /api/admin/users/:id 用户详情
PATCH /api/admin/users/:id 更新用户
POST /api/admin/users/batch 批量操作
GET /api/admin/users/:id/login-history 登录历史
POST /api/admin/users/:id/export 数据导出
GET /api/admin/stats/dashboard 全局仪表盘
GET /api/admin/stats/timeseries 时间序列
GET /api/admin/stats/funnel 漏斗分析
GET /api/admin/stats/popular 热门内容
GET /api/admin/content 内容审核列表
GET /api/admin/content/:id 内容详情
POST /api/admin/content/:id/audit 审核操作
POST /api/admin/content/batch-audit 批量审核
GET /api/admin/reports 举报列表
POST /api/admin/reports/:id/resolve 处理举报
GET /api/admin/billing/orders 订单列表
GET /api/admin/billing/orders/:id 订单详情
POST /api/admin/billing/orders/:id/refund 退款
GET /api/admin/billing/subscriptions 订阅列表
PATCH /api/admin/billing/subscriptions/:id 更新订阅
GET /api/admin/billing/promotions 促销列表
POST /api/admin/billing/promotions 创建促销
GET /api/admin/billing/revenue-report 收入报告
GET /api/admin/system/configs 系统配置
PUT /api/admin/system/configs/:id 更新配置
GET /api/admin/system/feature-flags Feature Flags
POST /api/admin/system/feature-flags 创建/更新
GET /api/admin/system/announcements 公告列表
POST /api/admin/system/announcements 创建公告
GET /api/admin/system/health 系统健康
GET /api/admin/logs/audit 操作日志
GET /api/admin/logs/security 安全事件
POST /api/admin/logs/export 日志导出
GET /api/admin/support/tickets 工单列表
GET /api/admin/support/tickets/:id 工单详情
POST /api/admin/support/tickets/:id/replies 回复工单
GET /api/admin/support/stats 客服统计
GET /api/admin/system/admins 管理员列表
POST /api/admin/system/admins 创建管理员
PATCH /api/admin/system/admins/:id 更新管理员6. 前端模块结构
6.1 用户端路由
/ → 首页 / 默认仪表盘
/ingest/* → 采集(剪藏、笔记、RSS、标签、邮件、社交、LLM)
/graph/* → 图谱(网络、搜索、路径、标签、时间轴、链接、视觉)
/cognitive/* → 认知镜像(指纹、偏差、审计、模拟)
/emergence/* → 涌现工作室(联想、碰撞、杂交、探索)
/attention/* → 注意力管家(仪表盘、深度工作、统计)
/capsules/* → 时间胶囊(列表、创建、详情、统计)
/knowledge/* → 反脆弱知识库(列表、验证、来源、统计)
/settings/* → 设置(账户、隐私、AI、同步、插件、数据、外观)6.2 管理端路由
/admin → 管理员登录页(公开)
/admin/dashboard → 仪表盘(认证后)
/admin/users → 用户管理
/admin/users/:id → 用户详情
/admin/content → 内容审核
/admin/stats/* → 数据统计
/admin/billing/* → 订阅计费
/admin/system/* → 系统管理
/admin/logs/* → 日志审计
/admin/support/* → 客服工单6.3 目录结构(更新后)
grzhishiku/
├── frontend/ # React + Vite 用户端
│ ├── src/
│ │ ├── api/ # API 封装层
│ │ │ ├── client.ts # Axios/HTTP 客户端
│ │ │ ├── capsules.ts
│ │ │ ├── attention.ts
│ │ │ ├── knowledge.ts
│ │ │ ├── graph.ts
│ │ │ ├── llm.ts
│ │ │ ├── brain.ts # 双脑 API
│ │ │ └── sync.ts
│ │ ├── components/
│ │ │ ├── navigation/ # 导航组件
│ │ │ │ ├── TopNavigation.tsx
│ │ │ │ ├── SubMenuPanel.tsx
│ │ │ │ ├── BrainSwitcher.tsx # 双脑切换器
│ │ │ │ └── Sidebar.tsx # 左侧边栏
│ │ │ ├── search/
│ │ │ │ └── GlobalSearch.tsx
│ │ │ ├── brain/
│ │ │ │ ├── BrainCard.tsx
│ │ │ │ ├── CrossBrainGraph.tsx
│ │ │ │ └── FusionSearch.tsx
│ │ │ ├── ui/ # 基础 UI 组件
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Card.tsx
│ │ │ │ ├── Modal.tsx
│ │ │ │ ├── Progress.tsx
│ │ │ │ └── Badge.tsx
│ │ │ ├── charts/ # 图表组件
│ │ │ │ ├── DonutChart.tsx
│ │ │ │ ├── LineChart.tsx
│ │ │ │ └── BarChart.tsx
│ │ │ └── forms/ # 表单组件
│ │ │ ├── Input.tsx
│ │ │ ├── TextArea.tsx
│ │ │ └── Select.tsx
│ │ ├── layouts/
│ │ │ ├── AppLayout.tsx # 用户端布局
│ │ │ └── BrainLayout.tsx # 双脑感知布局
│ │ ├── pages/ # 用户端页面
│ │ │ ├── Dashboard.tsx
│ │ │ ├── ingest/
│ │ │ │ ├── IngestPage.tsx
│ │ │ │ ├── ClipperPage.tsx
│ │ │ │ ├── NotesPage.tsx
│ │ │ │ ├── RSSPage.tsx
│ │ │ │ └── TagsPage.tsx
│ │ │ ├── graph/
│ │ │ │ ├── GraphPage.tsx
│ │ │ │ └── GraphVisualization.tsx
│ │ │ ├── cognitive/
│ │ │ │ ├── CognitivePage.tsx
│ │ │ │ ├── ThinkingFingerprint.tsx
│ │ │ │ └── DecisionAudit.tsx
│ │ │ ├── emergence/
│ │ │ │ ├── EmergencePage.tsx
│ │ │ │ └── CollisionRoom.tsx
│ │ │ ├── attention/
│ │ │ │ ├── AttentionPage.tsx
│ │ │ │ └── DeepWorkPanel.tsx
│ │ │ ├── capsules/
│ │ │ │ ├── CapsuleList.tsx
│ │ │ │ ├── CapsuleCreate.tsx
│ │ │ │ └── CapsuleDetail.tsx
│ │ │ ├── knowledge/
│ │ │ │ ├── KnowledgePage.tsx
│ │ │ │ └── VerificationPanel.tsx
│ │ │ └── settings/
│ │ │ └── SettingsPage.tsx
│ │ ├── admin/ # 管理员后台
│ │ │ ├── AdminApp.tsx # 管理端路由
│ │ │ ├── layouts/
│ │ │ │ └── AdminLayout.tsx
│ │ │ ├── pages/
│ │ │ │ ├── AdminLogin.tsx
│ │ │ │ ├── AdminDashboard.tsx
│ │ │ │ ├── AdminUsers.tsx
│ │ │ │ ├── AdminUserDetail.tsx
│ │ │ │ ├── AdminContent.tsx
│ │ │ │ ├── AdminStats.tsx
│ │ │ │ ├── AdminBilling.tsx
│ │ │ │ ├── AdminSystem.tsx
│ │ │ │ ├── AdminLogs.tsx
│ │ │ │ └── AdminSupport.tsx
│ │ │ ├── components/
│ │ │ │ ├── StatCard.tsx
│ │ │ │ ├── DataTable.tsx
│ │ │ │ ├── AuditLogViewer.tsx
│ │ │ │ └── ContentModerator.tsx
│ │ │ └── hooks/
│ │ │ └── useAdminAuth.ts
│ │ ├── store/
│ │ │ ├── navigation.ts # 导航状态
│ │ │ ├── brain.ts # 双脑状态
│ │ │ ├── capsules.ts
│ │ │ ├── attention.ts
│ │ │ ├── knowledge.ts
│ │ │ ├── settings.ts
│ │ │ └── admin.ts # 管理员状态
│ │ ├── hooks/
│ │ │ ├── useAuth.ts
│ │ │ ├── useBrain.ts # 双脑 Hook
│ │ │ ├── useCapsules.ts
│ │ │ ├── useAttention.ts
│ │ │ └── useKnowledge.ts
│ │ ├── types/
│ │ │ ├── brain.ts # 双脑类型
│ │ │ ├── capsule.ts
│ │ │ ├── attention.ts
│ │ │ ├── knowledge.ts
│ │ │ └── admin.ts # 管理员类型
│ │ ├── utils/
│ │ │ ├── format.ts
│ │ │ ├── validators.ts
│ │ │ └── constants.ts
│ │ ├── App.tsx
│ │ └── main.tsx
│ ├── public/
│ ├── index.html
│ ├── vite.config.ts
│ ├── tailwind.config.js
│ └── package.json
│
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── main.py # FastAPI 入口
│ │ ├── core/
│ │ │ ├── config.py # 配置管理
│ │ │ ├── database.py # SQLite + SQLCipher
│ │ │ ├── security.py # JWT + 密码哈希
│ │ │ ├── vector_db.py # ChromaDB 配置
│ │ │ └── redis.py # Redis 连接
│ │ ├── api/
│ │ │ ├── v1/ # 用户端 API
│ │ │ │ ├── router.py
│ │ │ │ └── endpoints/
│ │ │ │ ├── auth.py
│ │ │ │ ├── brain.py # 双脑路由
│ │ │ │ ├── capsules.py
│ │ │ │ ├── attention.py
│ │ │ │ ├── knowledge.py
│ │ │ │ ├── graph.py
│ │ │ │ ├── llm.py
│ │ │ │ └── sync.py
│ │ │ └── admin/ # 管理员端 API
│ │ │ ├── router.py
│ │ │ ├── middleware.py # 管理员认证中间件
│ │ │ ├── decorators.py # 审计日志装饰器
│ │ │ └── endpoints/
│ │ │ ├── auth.py
│ │ │ ├── users.py
│ │ │ ├── content.py
│ │ │ ├── stats.py
│ │ │ ├── billing.py
│ │ │ ├── system.py
│ │ │ ├── logs.py
│ │ │ └── support.py
│ │ ├── models/ # SQLAlchemy 模型
│ │ │ ├── base.py
│ │ │ ├── user.py
│ │ │ ├── note.py
│ │ │ ├── capsule.py
│ │ │ ├── attention.py
│ │ │ ├── knowledge.py
│ │ │ ├── graph.py
│ │ │ ├── brain.py # 双脑模型
│ │ │ └── admin.py # 管理员模型
│ │ ├── schemas/ # Pydantic 模型
│ │ │ ├── brain.py
│ │ │ ├── capsule.py
│ │ │ ├── attention.py
│ │ │ ├── knowledge.py
│ │ │ └── admin.py
│ │ ├── services/ # 业务逻辑
│ │ │ ├── brain_service.py # 双脑服务
│ │ │ ├── capsule_service.py
│ │ │ ├── attention_service.py
│ │ │ ├── knowledge_service.py
│ │ │ ├── llm_service.py
│ │ │ ├── graph_service.py
│ │ │ ├── sync_service.py
│ │ │ └── admin_service.py # 管理员服务
│ │ └── utils/
│ │ ├── validators.py
│ │ ├── formatters.py
│ │ └── constants.py
│ ├── tests/
│ ├── alembic/
│ ├── Dockerfile
│ └── requirements.txt
│
├── browser-extension/ # 浏览器插件
│ ├── manifest.json
│ ├── background.js
│ ├── content.js
│ ├── content.css
│ ├── popup.html
│ ├── popup.js
│ ├── options.html
│ ├── options.js
│ ├── capsule-create.html
│ ├── modules/
│ │ ├── attention.js
│ │ ├── clipper.js
│ │ ├── capsule-bridge.js
│ │ └── sync.js
│ ├── icons/
│ ├── vite.config.js
│ └── package.json
│
├── docker-compose.yml
├── Makefile
├── README.md
└── LICENSE7. 开发优先级
7.1 Phase 1: MVP 核心(3 周)
| 周 | 天 | 任务 | 交付物 |
|---|---|---|---|
| W1 | D1 | 项目脚手架(前后端 + 插件) | 可运行的基础框架 |
| W1 | D2 | 数据库设计 + 双脑字段 | 完整 Schema + 初始迁移 |
| W1 | D3 | API 框架 + 基础接口 | Swagger 可访问 |
| W1 | D4 | 前端布局(8 菜单 + 平铺二级) | 可交互导航 |
| W1 | D5 | 全局搜索 + 状态管理 | Zustand + React Query |
| W2 | D6 | 时间胶囊前端 | 创建/列表/解锁流程 |
| W2 | D7 | 时间胶囊后端完善 | 解锁检查 + AI 对话 |
| W2 | D8 | 注意力管家前端 | 仪表盘 + 深度工作面板 |
| W2 | D9 | 注意力插件 | 追踪 + 拦截 + Popup |
| W2 | D10 | 反脆弱知识库 | 列表 + 验证 UI |
| W3 | D11 | LLM 路由服务 | 本地 + 外部模型切换 |
| W3 | D12 | 浏览器插件完整打包 | Chrome/Firefox 双版本 |
| W3 | D13 | 端到端联调 | 完整用户旅程测试 |
| W3 | D14 | 打磨 + 文档 + 演示 | MVP 可对外演示 |
7.2 Phase 2: 双脑架构(2 周)
| 周 | 任务 | 说明 |
|---|---|---|
| W4 | 双脑切换器 UI + 数据模型 | 所有表添加 brain_side 字段,切换器组件 |
| W4 | 融合查询 API + 跨脑关联 | 跨脑搜索、关联创建、图谱可视化 |
| W5 | 左侧边栏双脑感知 + LLM 路由策略 | 不同脑不同路由策略 |
| W5 | 数据隔离 + 隐私策略 | 个人脑本地加密、网络脑云端增强 |
7.3 Phase 3: 管理员后台(2 周)
| 周 | 任务 | 说明 |
|---|---|---|
| W6 | 管理员认证 + RBAC + 仪表盘 | 登录、权限、KPI 卡片 |
| W6 | 用户管理 + 数据统计 + 内容审核 | 用户列表、图表、审核面板 |
| W7 | 订阅计费 + 系统管理 + 日志审计 | 订单、Feature Flags、审计日志 |
| W7 | 客服工单 + 多租户 + 安全合规 | 工单系统、GDPR、数据脱敏 |
7.4 Phase 4: 高级功能(后续)
- 认知镜像(思维指纹、偏差检测、决策审计)
- 涌现工作室(跨域联想、创意碰撞、概念杂交)
- 知识图谱 D3.js 可视化
- 团队协作(共享空间、权限管理)
- 移动端 App
- 桌面端 Tauri 应用
8. 里程碑
| 里程碑 | 时间 | 验证标准 |
|---|---|---|
| M1: 基础架构 | W1D5 | 前后端可独立运行,数据库可读写,API 文档可访问,导航 UI 可交互 |
| M2: MVP 核心 | W3D14 | 用户可安装插件剪藏,内容进入知识库,创建时间胶囊并解锁对话,启动深度工作守护 |
| M3: 双脑架构 | W5 | 个人脑/网络脑可切换,融合查询可跨脑搜索,LLM 路由按脑选择模型 |
| M4: Admin 后台 | W7 | 管理员可登录后台,管理用户/内容/订阅,查看统计图表,处理工单 |
| M5: 生产就绪 | W8 | 多租户隔离、GDPR 合规、监控告警、自动化部署、性能达标 |
9. 快速启动命令
bash
# 1. 克隆项目后,一键启动全部服务
make dev # 启动前端 + 后端 + 插件热更新
# 2. 手动启动
# 前端
cd frontend && npm run dev
# 后端
cd backend && uvicorn app.main:app --reload --port 8000
# 插件(开发模式)
cd browser-extension && npm run dev
# 3. 构建
cd frontend && npm run build
cd backend && docker build -t psb-backend .
cd browser-extension && npm run build
# 4. 部署
docker-compose up -d
# 5. 数据库迁移
cd backend && alembic upgrade head
# 6. 初始化管理员账户
cd backend && python scripts/create_admin.py --email admin@psb.local --name "Super Admin" --role super_admin10. 设计 Token(CSS 变量)
css
:root {
/* 背景 */
--bg-primary: #0d1117;
--bg-secondary: #161b22;
--bg-tertiary: #21262d;
--bg-hover: #30363d;
--bg-active: #1f242c;
/* 文字 */
--text-primary: #c9d1d9;
--text-secondary: #8b949e;
--text-muted: #6e7681;
--text-inverse: #ffffff;
/* 边框 */
--border-color: #30363d;
--border-light: #21262d;
/* 个人脑(暖色) */
--personal-primary: #d29922;
--personal-secondary: #e3b341;
--personal-bg: rgba(210, 153, 34, 0.1);
/* 网络脑(冷色) */
--network-primary: #58a6ff;
--network-secondary: #79b8ff;
--network-bg: rgba(88, 166, 255, 0.1);
/* 融合(紫色) */
--fusion-primary: #a371f7;
--fusion-secondary: #bc8cff;
/* 语义色 */
--success: #238636;
--success-bg: rgba(35, 134, 54, 0.1);
--warning: #d29922;
--warning-bg: rgba(210, 153, 34, 0.1);
--danger: #f85149;
--danger-bg: rgba(248, 81, 73, 0.1);
--info: #58a6ff;
--info-bg: rgba(88, 166, 255, 0.1);
/* 图表 */
--chart-1: #58a6ff;
--chart-2: #d29922;
--chart-3: #a371f7;
--chart-4: #3fb950;
--chart-5: #f85149;
}下一步: 按 Phase 1 的 Day-by-Day 计划开始开发。建议先启动
frontend和backend脚手架,然后同步创建数据库模型和基础 API。双脑切换器 UI 可作为前端第一个独立组件完成,不依赖后端数据。