f7a720204a
- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用 - 添加所有子项目的完整源代码 - 保留原始 .git 为 .git.bak 备份
470 lines
16 KiB
Markdown
470 lines
16 KiB
Markdown
# 通用AI工作台底座平台 — 需求文档
|
||
|
||
> 文档编号:REQ-COMMONSP-001
|
||
> 版本:v2.0.0
|
||
> 日期:2026-03-14
|
||
> 状态:单租户优先架构
|
||
> 项目缩写:COMMONSP(Commons Platform)
|
||
|
||
---
|
||
|
||
## 1. 引言
|
||
|
||
### 1.1 背景
|
||
|
||
nomifun-tauri 是目前已有的通用AI工作台底座,采用 Rust(axum) + Vue 前端架构,本地优先(SQLite)+ 插件驱动。核心能力包括 Agent Engine、Skills System、Knowledge RAG、MCP Gateway、Channels Bus。
|
||
|
||
现有系统是**单租户单用户**架构,需要演进为**单租户优先 + 可扩展租户模型**平台,支持政府/企业/教育三大领域定制,即 PrivBox-AIStation 软硬一体化产品的软件核心。
|
||
|
||
**架构决策**:PrivBox 典型部署场景为单台设备私有化部署(医院/学校/企业),物理隔离已满足数据安全需求。因此 Phase 1 采用**单租户优先**模式,保留租户抽象作为扩展点,未来需要多租户 SaaS 时改动最小。
|
||
|
||
本文档定义 **Phase 1 MVP** 的完整需求,目标是建立单租户定制框架(主题/领域/品牌)、多用户管理体系、审计日志能力,为后续三大领域包奠定底座。
|
||
|
||
### 1.2 范围
|
||
|
||
| 范围 | 说明 |
|
||
|------|------|
|
||
| **本文档** | Phase 1 MVP 软件系统需求 |
|
||
| **不包括** | 硬件适配(PrivBox HAL)、领域包开发(GovPack/EntPack/EduPack)、插件市场 |
|
||
| **技术栈** | Rust(axum) + Vue + SQLite/sqlx(复用 nomifun-tauri 技术栈) |
|
||
|
||
### 1.3 与现有 nomifun-tauri 的关系
|
||
|
||
```
|
||
nomifun-tauri (当前)
|
||
│
|
||
│ Phase 1: 单租户优先 + 主题引擎 + 领域框架 + 多用户
|
||
▼
|
||
nomifun-tauri (演进后) = Commons Platform v1.0
|
||
│ - 默认单租户,数据天然隔离
|
||
│ - 保留 tenant_id 字段,未来扩展多租户成本低
|
||
│
|
||
│ Phase 2: 三大领域包
|
||
▼
|
||
PrivBox-AIStation 软件层
|
||
```
|
||
|
||
### 1.4 架构决策
|
||
|
||
| 决策项 | 选择 | 理由 |
|
||
|--------|------|------|
|
||
| 租户隔离策略 | 无需激活 | 单机部署物理隔离已满足需求 |
|
||
| 数据层 tenant_id | 保留字段 | 未来扩展多租户 SaaS 成本最低 |
|
||
| 默认租户 | 自动创建 | 首次启动自动初始化,无需手动注册 |
|
||
| 租户配置 | 保留 | 用于单租户的品牌定制、主题切换 |
|
||
|
||
---
|
||
|
||
## 2. 术语表
|
||
|
||
| 术语 | 英文 | 定义 |
|
||
|------|------|------|
|
||
| **租户配置** | Tenant Config | 单租户场景下的全局配置,包含品牌、主题、功能开关 |
|
||
| **主题** | Theme | 视觉定制包,包含配色、Logo、品牌元素 |
|
||
| **领域** | Domain | 行业分类(Government/Enterprise/Education/Custom) |
|
||
| **领域配置** | Domain Config | 领域特定的初始化参数、分类体系、模板 |
|
||
| **技能包** | Skill Pack | 一组相关技能的集合,可按领域打包 |
|
||
| **知识库模板** | Knowledge Template | 领域特定的知识库分类和初始数据 |
|
||
| **RBAC** | Role-Based Access Control | 基于角色的访问控制 |
|
||
| **审计日志** | Audit Log | 记录所有敏感操作的不可篡改日志 |
|
||
|
||
---
|
||
|
||
## 3. 角色定义
|
||
|
||
| 角色 | 说明 | 权限范围 |
|
||
|------|------|---------|
|
||
| **系统管理员** | 安装部署后的初始管理员 | 所有配置、用户管理、功能开关 |
|
||
| **普通用户** | 终端用户 | 使用 AI 对话、技能、知识库等业务功能 |
|
||
|
||
> **说明**:单租户模式下,"租户管理员"等价于"系统管理员"。保留"系统管理员"角色,未来扩展多租户时再区分"系统管理员"和"租户管理员"。
|
||
|
||
---
|
||
|
||
## 4. 功能性需求
|
||
|
||
### 4.1 租户系统(单租户优先)
|
||
|
||
#### FR-TENANT-001:默认租户自动初始化
|
||
- WHEN 首次启动系统,THEN 系统 SHALL 自动创建默认租户配置
|
||
- WHEN 初始化时,THEN 用户 SHALL 提供组织名称、选择领域类型(Government/Enterprise/Education/Custom)
|
||
- WHEN 初始化完成后,THEN 系统 SHALL 自动应用对应的预设主题和领域配置
|
||
|
||
#### FR-TENANT-002:租户配置(系统配置)
|
||
- WHEN 系统管理员访问配置页,THEN 系统 SHALL 展示并允许修改:组织名称、品牌定制、功能开关、数据策略
|
||
- WHEN 功能开关变更时,THEN 系统 SHALL 实时生效,无需重启
|
||
- **说明**:单租户模式下,所有配置直接生效,无需租户上下文路由
|
||
|
||
#### FR-TENANT-003:数据迁移与备份
|
||
- WHEN 系统管理员触发数据备份,THEN 系统 SHALL 导出全部数据(SQLite schema + 文件存储)
|
||
- WHEN 导入备份时,THEN 系统 SHALL 验证数据完整性并重建
|
||
|
||
#### FR-TENANT-004:多租户扩展点(预留)
|
||
- WHEN 未来需要支持多租户 SaaS,THEN 系统 SHALL 可通过 tenant_id 字段实现数据隔离
|
||
- **说明**:Phase 1 所有表保留 tenant_id 字段,但默认不激活隔离逻辑
|
||
|
||
### 4.2 主题引擎
|
||
|
||
#### FR-THEME-001:动态主题切换
|
||
- WHEN 系统管理员切换主题,THEN 系统 SHALL 在 100ms 内完成切换,前端无需刷新
|
||
- WHEN 用户访问工作台时,THEN 系统 SHALL 自动应用当前配置的主题
|
||
|
||
#### FR-THEME-002:预设主题包
|
||
- WHEN 选择预设主题,THEN 系统 SHALL 支持以下主题:
|
||
- **政务蓝主题**:GovAI 政务配色体系
|
||
- **企业专业主题**:商务蓝色调
|
||
- **学术清新主题**:简洁学术风格
|
||
- WHEN 主题包含 Logo 定制,THEN 系统 SHALL 支持上传 PNG/SVG 格式
|
||
|
||
#### FR-THEME-003:主题预览
|
||
- WHEN 系统管理员在主题编辑器中修改,THEN 系统 SHALL 提供实时预览
|
||
- WHEN 预览满意后,THEN 管理员 SHALL 一键发布生效
|
||
|
||
### 4.3 领域框架
|
||
|
||
#### FR-DOMAIN-001:领域配置 Schema
|
||
- WHEN 初始化系统时,THEN 系统 SHALL 根据选择的领域类型加载对应的领域配置 Schema
|
||
- WHEN 领域配置包含分类体系时,THEN 系统 SHALL 自动创建对应的知识库分类和应用模板入口
|
||
|
||
#### FR-DOMAIN-002:领域初始化向导
|
||
- WHEN 首次配置系统,THEN 系统 SHALL 提供领域初始化向导,引导配置:
|
||
- 部门/科室设置(如适用)
|
||
- 知识库分类初始化
|
||
- 预置技能包选择
|
||
|
||
#### FR-DOMAIN-003:领域特定技能包注册
|
||
- WHEN 安装领域技能包时,THEN 系统 SHALL 自动注册到该领域的技能目录
|
||
- WHEN 技能包与领域不兼容时,THEN 系统 SHALL 提示警告但不阻止安装
|
||
|
||
### 4.4 多用户认证与权限
|
||
|
||
#### FR-AUTH-001:用户注册与登录
|
||
- WHEN 新用户注册时,THEN 系统 SHALL 支持用户名+密码方式
|
||
- WHEN 用户登录时,THEN 系统 SHALL 使用现有的 JWT 认证机制
|
||
- WHEN 登录失败时,THEN 系统 SHALL 返回错误信息,不泄露账户是否存在
|
||
|
||
#### FR-AUTH-002:角色权限模型(RBAC)
|
||
- WHEN 系统管理员创建用户时,THEN 系统 SHALL 支持分配角色(普通用户/系统管理员)
|
||
- WHEN 普通用户访问管理员功能时,THEN 系统 SHALL 返回 403 权限不足
|
||
- WHEN 角色权限变更时,THEN 系统 SHALL 实时生效
|
||
|
||
#### FR-AUTH-003:会话管理
|
||
- WHEN 用户登录后,THEN 系统 SHALL 生成带刷新令牌的 JWT
|
||
- WHEN JWT 过期时,THEN 系统 SHALL 支持静默刷新
|
||
- WHEN 用户登出时,THEN 系统 SHALL 使 refresh token 失效
|
||
|
||
### 4.5 审计日志
|
||
|
||
#### FR-AUDIT-001:操作审计记录
|
||
- WHEN 用户执行以下操作时,THEN 系统 SHALL 记录审计日志:
|
||
- 用户登录/登出
|
||
- 系统配置变更
|
||
- 用户创建/删除/权限变更
|
||
- 知识库上传/删除
|
||
- 敏感技能包安装/卸载
|
||
- WHEN 记录审计日志时,THEN 系统 SHALL 包含:操作时间、操作用户、操作类型、操作对象、操作结果、来源IP
|
||
|
||
#### FR-AUDIT-002:审计日志查询
|
||
- WHEN 系统管理员访问审计日志页,THEN 系统 SHALL 支持按时间范围、操作类型、用户筛选
|
||
- WHEN 导出审计日志时,THEN 系统 SHALL 支持 CSV 格式导出
|
||
|
||
#### FR-AUDIT-003:审计日志不可篡改
|
||
- WHEN 审计日志写入后,THEN 系统 SHALL 保证不可修改、不可删除
|
||
- WHEN 需要追加日志时,THEN 系统 SHALL 仅允许追加操作
|
||
|
||
### 4.6 配置导入导出
|
||
|
||
#### FR-CONFIG-001:配置导出
|
||
- WHEN 系统管理员触发配置导出,THEN 系统 SHALL 导出完整配置(不含敏感数据)
|
||
- WHEN 导出时,THEN 系统 SHALL 包含系统配置、用户列表、知识库索引、主题配置
|
||
|
||
#### FR-CONFIG-002:配置导入
|
||
- WHEN 管理员导入配置文件,THEN 系统 SHALL 验证配置合法性
|
||
- WHEN 配置导入时,THEN 系统 SHALL 支持合并或覆盖模式
|
||
|
||
---
|
||
|
||
## 5. 非功能性需求
|
||
|
||
### 5.1 性能
|
||
|
||
| 指标 | 目标值 |
|
||
|------|--------|
|
||
| 冷启动时间 | < 3s |
|
||
| 主题切换延迟 | < 100ms |
|
||
| 租户创建时间 | < 1min |
|
||
| 对话响应延迟 | < 500ms(不含模型推理) |
|
||
|
||
### 5.2 安全
|
||
|
||
| 需求 | 说明 |
|
||
|------|------|
|
||
| 数据隔离 | 单机部署物理隔离已满足,无需额外租户隔离 |
|
||
| 传输加密 | HTTPS/TLS 1.3(WebSocket + REST) |
|
||
| 存储加密 | SQLite 数据库加密(AES-256,可选) |
|
||
| 密钥管理 | JWT secret 独立存储,不硬编码 |
|
||
|
||
### 5.3 可用性
|
||
|
||
| 需求 | 说明 |
|
||
|------|------|
|
||
| 离线优先 | 网络中断时核心功能可用 |
|
||
| 错误恢复 | 异常操作自动回滚,不破坏数据完整性 |
|
||
| 日志诊断 | 完整的错误日志,便于问题定位 |
|
||
|
||
### 5.4 可扩展性
|
||
|
||
| 需求 | 说明 |
|
||
|------|------|
|
||
| 领域扩展 | 新增领域类型时,无需修改核心代码 |
|
||
| 插件集成 | 保持与现有 MCP 插件系统的兼容性 |
|
||
| 数据迁移 | 未来可平滑迁移到 PostgreSQL |
|
||
|
||
---
|
||
|
||
## 6. 关键约束与假设
|
||
|
||
### 6.1 约束
|
||
|
||
1. **复用 nomifun-tauri**:Phase 1 不重写现有模块,在现有架构上扩展单租户定制能力
|
||
2. **SQLite 本地优先**:继续使用 SQLite 作为主要数据存储,暂不引入 PostgreSQL
|
||
3. **前端改动最小化**:主题引擎优先通过 CSS 变量 + 动态加载实现,减少 Vue 组件改动
|
||
4. **不涉及硬件**:本文档不包含 PrivBox 硬件适配内容
|
||
5. **单租户优先**:不激活多租户隔离逻辑,简化开发和部署
|
||
|
||
### 6.2 假设
|
||
|
||
1. 假设 Phase 1 部署场景为单机私有化部署
|
||
2. 假设物理隔离已满足数据安全需求
|
||
3. 假设管理员可通过管理后台完成所有配置操作(无需命令行)
|
||
4. 假设审计日志存储在 SQLite 中
|
||
|
||
---
|
||
|
||
## 7. 数据模型(核心扩展)
|
||
|
||
### 7.1 新增数据模型
|
||
|
||
```rust
|
||
// 系统配置(单租户模式,单条记录)
|
||
struct SystemConfig {
|
||
id: String, // "default"
|
||
org_name: String, // 组织名称
|
||
domain: DomainType, // Government / Enterprise / Education / Custom
|
||
created_at: TimestampMs,
|
||
updated_at: TimestampMs,
|
||
}
|
||
|
||
// 品牌配置(单租户模式)
|
||
struct BrandingConfig {
|
||
config_id: String, // "default"
|
||
logo_url: Option<String>,
|
||
logo_svg: Option<String>, // SVG 内联
|
||
primary_color: String,
|
||
secondary_color: String,
|
||
accent_color: String,
|
||
theme_preset: ThemePreset,
|
||
}
|
||
|
||
// 功能开关(单租户模式)
|
||
struct FeatureFlags {
|
||
config_id: String,
|
||
app_store: bool,
|
||
skill_market: bool,
|
||
multi_user: bool,
|
||
cloud_sync: bool,
|
||
}
|
||
|
||
// 领域配置
|
||
struct DomainConfig {
|
||
id: i64, // 自增主键
|
||
domain_type: DomainType,
|
||
config_json: String, // 领域特定配置的 JSON 序列化
|
||
created_at: TimestampMs,
|
||
}
|
||
|
||
// 审计日志
|
||
struct AuditLog {
|
||
id: i64, // 自增主键
|
||
user_id: String,
|
||
action: String,
|
||
object_type: String,
|
||
object_id: Option<String>,
|
||
result: String, // success / failure
|
||
source_ip: Option<String>,
|
||
extra: String, // JSON 额外信息
|
||
created_at: TimestampMs,
|
||
}
|
||
|
||
// 扩展:用户表新增角色
|
||
struct User {
|
||
// ... 现有字段 ...
|
||
role: UserRole, // admin / user
|
||
}
|
||
```
|
||
|
||
### 7.2 现有模型扩展
|
||
|
||
| 现有表 | 扩展字段 | 说明 |
|
||
|--------|---------|------|
|
||
| `users` | `role` | 用户角色(保留 tenant_id 字段但不使用) |
|
||
| `conversations` | - | 保持不变(单租户无需隔离) |
|
||
| `messages` | - | 保持不变 |
|
||
| `knowledge_bases` | - | 保持不变 |
|
||
| `providers` | - | 保持不变 |
|
||
| `assistants` | - | 保持不变 |
|
||
|
||
### 7.3 多租户扩展点(预留)
|
||
|
||
> 以下字段保留以备未来扩展,Phase 1 不激活隔离逻辑
|
||
|
||
```rust
|
||
// 未来多租户场景下启用
|
||
struct FutureMultiTenant {
|
||
tenant_id: String, // 保留字段
|
||
}
|
||
|
||
// 所有表可选添加 tenant_id
|
||
ALTER TABLE users ADD COLUMN tenant_id TEXT; -- 保留但默认填充 "default"
|
||
```
|
||
|
||
---
|
||
|
||
## 8. API 设计(核心接口)
|
||
|
||
### 8.1 系统配置
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/config` | GET | 获取系统配置(组织名、领域) |
|
||
| `/api/config` | PUT | 更新系统配置 |
|
||
| `/api/config/init` | POST | 初始化系统(首次启动) |
|
||
| `/api/config/backup` | POST | 触发数据备份 |
|
||
| `/api/config/restore` | POST | 导入备份 |
|
||
|
||
### 8.2 用户与认证
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/auth/register` | POST | 用户注册 |
|
||
| `/api/auth/login` | POST | 用户登录 |
|
||
| `/api/auth/logout` | POST | 用户登出 |
|
||
| `/api/auth/refresh` | POST | 刷新 Token |
|
||
| `/api/users` | GET | 列出所有用户(管理员) |
|
||
| `/api/users` | POST | 创建用户(管理员) |
|
||
| `/api/users/{id}` | PUT | 更新用户(管理员) |
|
||
| `/api/users/{id}` | DELETE | 删除用户(管理员) |
|
||
|
||
### 8.3 主题与品牌配置
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/branding` | GET | 获取当前品牌配置 |
|
||
| `/api/branding` | PUT | 更新品牌配置 |
|
||
| `/api/branding/presets` | GET | 获取预设主题列表 |
|
||
| `/api/branding/preview` | POST | 预览主题 |
|
||
|
||
### 8.4 审计日志
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/audit-logs` | GET | 查询审计日志 |
|
||
| `/api/audit-logs/export` | GET | 导出审计日志(CSV) |
|
||
|
||
### 8.5 领域配置
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/api/domains` | GET | 获取当前领域配置 |
|
||
| `/api/domains/init` | POST | 领域初始化向导 |
|
||
| `/api/domains/skill-packs` | GET | 获取领域技能包列表 |
|
||
|
||
---
|
||
|
||
## 9. 前端改造要点
|
||
|
||
### 9.1 视图层新增
|
||
|
||
| 视图 | 说明 |
|
||
|------|------|
|
||
| 系统初始化向导 | 首次启动引导创建管理员、选择领域 |
|
||
| 用户管理 | 管理员管理系统内用户 |
|
||
| 品牌配置 | 可视化配置 Logo、主题配色 |
|
||
| 审计日志查看 | 筛选和导出审计日志 |
|
||
| 领域初始化向导 | 创建后引导配置部门/知识库/技能包 |
|
||
|
||
### 9.2 现有视图改造
|
||
|
||
| 视图 | 改造内容 |
|
||
|------|---------|
|
||
| 登录页 | 新增注册入口、首次启动引导 |
|
||
| 工作台 | 顶部栏根据品牌配置动态渲染 Logo/配色 |
|
||
| 设置页 | 新增系统配置、用户管理、品牌配置入口 |
|
||
|
||
### 9.3 CSS 变量主题方案
|
||
|
||
```css
|
||
/* 主题变量注入点(替换原有硬编码颜色) */
|
||
:root {
|
||
--color-primary: var(--theme-primary, #1a56db);
|
||
--color-secondary: var(--theme-secondary, #6b7280);
|
||
--color-bg: var(--theme-bg, #ffffff);
|
||
--color-surface: var(--theme-surface, #f9fafb);
|
||
--color-text: var(--theme-text, #111827);
|
||
--color-border: var(--theme-border, #e5e7eb);
|
||
--logo-url: var(--theme-logo, url('/assets/default-logo.png'));
|
||
}
|
||
|
||
/* 动态切换 */
|
||
.theme-gov {
|
||
--theme-primary: #1e3a8a; /* 政务蓝 */
|
||
--theme-bg: #f0f4f8;
|
||
--theme-surface: #ffffff;
|
||
--theme-text: #1a202c;
|
||
}
|
||
|
||
.theme-enterprise {
|
||
--theme-primary: #2563eb; /* 企业蓝 */
|
||
--theme-bg: #f8fafc;
|
||
--theme-surface: #ffffff;
|
||
--theme-text: #0f172a;
|
||
}
|
||
|
||
.theme-academic {
|
||
--theme-primary: #059669; /* 学术绿 */
|
||
--theme-bg: #fafaf9;
|
||
--theme-surface: #f5f5f4;
|
||
--theme-text: #1c1917;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 10. 风险与依赖
|
||
|
||
### 10.1 技术风险
|
||
|
||
| 风险 | 影响 | 缓解措施 |
|
||
|------|------|---------|
|
||
| 单租户限制 | 未来需要多租户时改动成本 | 保留 tenant_id 字段,隔离逻辑模块化 |
|
||
| SQLite 并发限制 | 多用户同时使用性能下降 | 监控慢查询,必要时迁移 PostgreSQL |
|
||
| 前端主题系统侵入性 | 改动范围过大 | 使用 CSS 变量 + 动态类名,避免大规模重构 |
|
||
|
||
### 10.2 依赖项
|
||
|
||
| 依赖 | 说明 |
|
||
|------|------|
|
||
| nomifun-tauri 主分支 | Phase 1 基于最新 stable 版本开发 |
|
||
| nomifun-auth | 复用现有 JWT 认证,扩展角色体系 |
|
||
| nomifun-db | 复用现有 sqlx 基础设施,扩展 schema |
|
||
|
||
### 10.3 决策点(已确认)
|
||
|
||
- [x] 租户隔离策略:**单租户优先**,不激活数据层隔离
|
||
- [x] 是否需要多租户 SaaS 支持:**Phase 1 不支持**,保留扩展点
|
||
- [x] 审计日志存储:**同库单表**,按用户筛选
|
||
- [x] 主题编辑器:**先做配置文件形式**,UI 可视化可选
|
||
|
||
---
|
||
|
||
> 文档结束 — 已调整为**单租户优先**架构,请检查确认。 |