Update: 将子项目从 submodule 转为完整内容

- 移除 GovAI, nomifun-tauri, 算力盒子 的 submodule 引用
- 添加所有子项目的完整源代码
- 保留原始 .git 为 .git.bak 备份
This commit is contained in:
freedak
2026-07-04 19:20:46 +08:00
parent 54d6465fa7
commit f7a720204a
3360 changed files with 802660 additions and 3 deletions
+470
View File
@@ -0,0 +1,470 @@
# 通用AI工作台底座平台 — 需求文档
> 文档编号:REQ-COMMONSP-001
> 版本:v2.0.0
> 日期:2026-03-14
> 状态:单租户优先架构
> 项目缩写:COMMONSPCommons 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 未来需要支持多租户 SaaSTHEN 系统 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.3WebSocket + 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 可视化可选
---
> 文档结束 — 已调整为**单租户优先**架构,请检查确认。