企业版组织模块 ⭐新增核心模块
本文档是 系统设计主文档 的子文档,详细描述企业版去中心化组织协作模块的设计。
2.5 企业版(去中心化组织)⭐新增核心模块
2.5.1 功能描述
企业版是基于去中心化P2P网络的团队协作系统,支持多身份切换、组织管理、权限控制和知识库共享。每个组织拥有独立的DID标识、数据库和P2P网络,真正实现去中心化的团队协作。
核心特性:
- 多身份架构: 一个用户DID可拥有个人身份+多个组织身份
- 数据完全隔离: 每个身份对应独立的数据库文件(personal.db, org_xxx.db)
- RBAC权限系统: 基于角色的访问控制(Owner/Admin/Member/Viewer)
- 邀请机制: 支持邀请码和DID邀请两种方式
- P2P组织网络: 基于libp2p的去中心化组织网络(规划中)
- 活动审计: 所有操作自动记录,支持审计和回溯
适用场景:
- 创业团队(Startup)- 小型公司(Company)- 技术社区(Community)
- 开源项目(Opensource)
- 教育机构(Education)
2.5.2 架构设计
企业版(去中心化组织)
├── 身份管理层
│ ├── 个人身份(Primary DID)
│ │ ├── personal.db(个人数据库)
│ │ └── 个人知识库、项目
│ │
│ ├── 组织身份1(Org DID)
│ │ ├── org_abc123.db(组织数据库)
│ │ ├── 组织知识库
│ │ ├── 组织项目
│ │ └── 成员列表
│ │
│ └── 组织身份2(Org DID)
│ └── org_xyz789.db
│
├── 组织管理层
│ ├── OrganizationManager(核心模块)✅已实现
│ │ ├── 组织创建/删除
│ │ ├── 成员管理(添加/移除/角色变更)
│ │ ├── 邀请管理(生成邀请码、DID邀请)
│ │ ├── 权限检查(RBAC)
│ │ └── 活动日志记录
│ │
│ ├── IdentityStore(Pinia状态管理)✅已实现
│ │ ├── 当前激活身份
│ │ ├── 所有身份上下文
│ │ ├── 组织列表
│ │ └── 身份切换逻辑
│ │
│ └── DIDManager扩展 ✅已实现
│ ├── 个人DID创建
│ └── 组织DID创建(支持org前缀)
│
├── 数据隔离层
│ ├── DatabaseManager扩展 ✅已实现
│ │ ├── switchDatabase()(数据库切换)
│ │ ├── getDatabasePath()(根据身份获取路径)
│ │ └── 多数据库连接管理
│ │
│ ├── 数据库文件
│ │ ├── data/personal.db(个人)
│ │ ├── data/org_abc123.db(组织1)
│ │ └── data/org_xyz789.db(组织2)
│ │
│ └── Git仓库隔离
│ ├── git-repos/personal/(个人仓库)
│ ├── git-repos/org_abc123/(组织1仓库)
│ └── git-repos/org_xyz789/(组织2仓库)
│
├── P2P网络层(规划中)
│ ├── 组织Topic订阅
│ ├── 成员发现机制
│ ├── 组织消息路由
│ └── Bootstrap节点
│
├── 权限控制层
│ ├── RBAC(基于角色)
│ │ ├── Owner(所有权限)
│ │ ├── Admin(管理权限)
│ │ ├── Member(读写权限)
│ │ └── Viewer(只读权限)
│ │
│ └── ACL(资源级访问控制)
│ ├── knowledge.read/write/delete
│ ├── project.read/write/delete
│ ├── member.read/manage
│ └── org.manage
│
└── UI组件层
├── IdentitySwitcher(身份切换器)✅已实现
│ ├── 当前身份显示
│ ├── 身份列表
│ ├── 创建组织对话框
│ └── 加入组织对话框
│
├── OrganizationMembersPage(成员管理)✅已实现
│ ├── 成员列表
│ ├── 角色管理
│ └── 邀请管理
│
└── OrganizationSettingsPage(组织设置)✅已实现
├── 组织信息编辑
├── 权限配置
└── 安全设置2.5.3 核心流程
组织创建流程:
1. 用户点击"创建组织"
2. 填写组织信息(名称、类型、描述)
3. 调用 org:create-organization IPC
4. OrganizationManager 创建组织
├── 生成组织ID(UUID)
├── 创建组织DID(did:chainlesschain:org:xxxxx)
├── 初始化组织数据库(org_xxx.db)
├── 创建组织Git仓库
├── 设置Owner角色
└── 记录活动日志
5. 返回组织信息
6. 刷新身份列表身份切换流程:
1. 用户选择要切换的身份(personal 或 org_xxx)
2. 调用 identityStore.switchContext(contextId)
3. 保存当前身份状态
4. 调用 db:switch-database IPC
5. DatabaseManager.switchDatabase()
├── 关闭当前数据库连接
├── 根据contextId获取新数据库路径
├── 打开新数据库
└── 初始化表结构
6. 加载新身份的数据
├── 知识库列表
├── 项目列表
└── 组织成员(如果是组织身份)
7. 更新UI显示
8. 切换完成邀请加入流程:
1. Owner/Admin创建邀请
├── 生成6位邀请码(A-Z0-9)
├── 设置角色和有效期
└── 保存到 organization_invitations表
2. 邀请码分享给新成员
3. 新成员输入邀请码
4. 调用 org:join-organization IPC
5. OrganizationManager.joinOrganization()
├── 验证邀请码
├── 检查邀请是否有效(未过期、未达到使用次数)
├── 添加成员到 organization_members表
├── 创建身份上下文
├── 初始化组织数据库
└── 记录活动日志
6. 返回组织信息
7. 新成员可切换到组织身份2.5.4 数据模型 ✅已实现
新增企业版表结构(9个表):
sql
-- 身份上下文表(用户级别,加密)
CREATE TABLE IF NOT EXISTS identity_contexts (
context_id TEXT PRIMARY KEY, -- 'personal' 或 'org_xxx'
user_did TEXT NOT NULL, -- 用户主DID
context_type TEXT NOT NULL, -- 'personal' 或 'organization'
org_id TEXT, -- 组织ID(如果是组织身份)
org_name TEXT, -- 组织名称
org_avatar TEXT, -- 组织头像
role TEXT, -- 用户在组织中的角色
display_name TEXT, -- 显示名称
db_path TEXT NOT NULL, -- 数据库文件路径
is_active INTEGER DEFAULT 0, -- 是否当前激活(唯一)
created_at INTEGER NOT NULL,
last_accessed_at INTEGER
);
-- 组织成员关系表(缓存)
CREATE TABLE IF NOT EXISTS organization_memberships (
id TEXT PRIMARY KEY,
user_did TEXT NOT NULL,
org_id TEXT NOT NULL,
org_did TEXT NOT NULL, -- 组织DID
role TEXT NOT NULL, -- 角色
joined_at INTEGER NOT NULL,
UNIQUE(user_did, org_id)
);
-- 组织元数据表
CREATE TABLE IF NOT EXISTS organization_info (
org_id TEXT PRIMARY KEY,
org_did TEXT NOT NULL, -- 组织DID
name TEXT NOT NULL,
description TEXT,
type TEXT CHECK(type IN ('startup', 'company', 'community', 'opensource', 'education')),
avatar TEXT,
owner_did TEXT NOT NULL, -- 组织Owner DID
settings_json TEXT, -- 组织设置JSON
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
-- 组织成员表
CREATE TABLE IF NOT EXISTS organization_members (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
member_did TEXT NOT NULL, -- 成员DID
display_name TEXT,
avatar TEXT,
role TEXT NOT NULL CHECK(role IN ('owner', 'admin', 'member', 'viewer')),
permissions TEXT, -- 自定义权限JSON
joined_at INTEGER NOT NULL,
last_active_at INTEGER,
status TEXT DEFAULT 'active' CHECK(status IN ('active', 'inactive', 'removed')),
UNIQUE(org_id, member_did)
);
-- 组织角色表
CREATE TABLE IF NOT EXISTS organization_roles (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
name TEXT NOT NULL, -- 角色名称
description TEXT,
permissions TEXT, -- 权限列表JSON
is_builtin INTEGER DEFAULT 0, -- 是否内置角色
created_at INTEGER NOT NULL,
UNIQUE(org_id, name)
);
-- 组织邀请表
CREATE TABLE IF NOT EXISTS organization_invitations (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
invite_code TEXT UNIQUE, -- 6位邀请码(A-Z0-9)
invited_by TEXT NOT NULL, -- 邀请人DID
role TEXT DEFAULT 'member', -- 被邀请者将获得的角色
max_uses INTEGER DEFAULT 1, -- 最大使用次数
used_count INTEGER DEFAULT 0, -- 已使用次数
expire_at INTEGER, -- 过期时间
created_at INTEGER NOT NULL
);
-- 组织项目表
CREATE TABLE IF NOT EXISTS organization_projects (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
owner_did TEXT NOT NULL, -- 项目Owner
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL
);
-- 组织活动日志表
CREATE TABLE IF NOT EXISTS organization_activities (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
actor_did TEXT NOT NULL, -- 操作者DID
action TEXT NOT NULL, -- 操作类型(create_organization, add_member等)
resource_type TEXT, -- 资源类型
resource_id TEXT, -- 资源ID
metadata TEXT, -- 元数据JSON
timestamp INTEGER NOT NULL
);
-- P2P同步状态表
CREATE TABLE IF NOT EXISTS p2p_sync_state (
id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
resource_type TEXT NOT NULL, -- 'knowledge', 'project', 'member'
resource_id TEXT NOT NULL,
local_version INTEGER DEFAULT 1,
remote_version INTEGER DEFAULT 1,
cid TEXT, -- IPFS CID(规划中)
sync_status TEXT DEFAULT 'synced' CHECK(sync_status IN ('synced', 'pending', 'conflict')),
last_synced_at INTEGER,
UNIQUE(org_id, resource_type, resource_id)
);扩展现有表(knowledge_items):
sql
-- 新增企业版字段
ALTER TABLE knowledge_items ADD COLUMN org_id TEXT; -- 所属组织ID
ALTER TABLE knowledge_items ADD COLUMN created_by TEXT; -- 创建者DID
ALTER TABLE knowledge_items ADD COLUMN updated_by TEXT; -- 更新者DID
ALTER TABLE knowledge_items ADD COLUMN share_scope TEXT DEFAULT 'private'; -- 共享范围
ALTER TABLE knowledge_items ADD COLUMN permissions TEXT; -- 权限JSON
ALTER TABLE knowledge_items ADD COLUMN version INTEGER DEFAULT 1; -- 版本号
ALTER TABLE knowledge_items ADD COLUMN parent_version_id TEXT; -- 父版本ID
ALTER TABLE knowledge_items ADD COLUMN cid TEXT; -- IPFS CID2.5.5 权限系统设计
内置角色权限:
javascript
// Owner - 所有权限
{
permissions: ["*"]; // 通配符表示所有权限
}
// Admin - 管理权限
{
permissions: [
"org.manage", // 组织管理
"member.manage", // 成员管理
"role.manage", // 角色管理
"knowledge.*", // 知识库所有权限
"project.*", // 项目所有权限
"invitation.create", // 创建邀请
];
}
// Member - 读写权限
{
permissions: [
"knowledge.read",
"knowledge.create",
"knowledge.write",
"project.read",
"project.create",
"project.write",
"member.read",
];
}
// Viewer - 只读权限
{
permissions: ["knowledge.read", "project.read", "member.read"];
}权限检查逻辑:
javascript
async checkPermission(orgId, userDID, permission) {
// 1. 获取用户角色
const member = await this.getMember(orgId, userDID);
// 2. 获取角色权限
const role = await this.getRole(orgId, member.role);
// 3. 检查通配符权限
if (role.permissions.includes('*')) {
return true;
}
// 4. 检查精确匹配
if (role.permissions.includes(permission)) {
return true;
}
// 5. 检查前缀匹配(knowledge.* 匹配 knowledge.read)
const prefix = permission.split('.')[0];
if (role.permissions.includes(`${prefix}.*`)) {
return true;
}
// 6. 无权限
return false;
}2.5.6 技术选型
后端模块:
- OrganizationManager: 组织管理核心逻辑(701行代码)
- DIDManager扩展: 支持组织DID创建(did:chainlesschain:org:xxxx)
- DatabaseManager扩展: 多数据库切换和隔离
前端模块:
- IdentityStore (Pinia): 状态管理(385行代码)
- IdentitySwitcher.vue: 身份切换UI组件(361行代码)
- OrganizationMembersPage.vue: 成员管理页面(新增)
- OrganizationSettingsPage.vue: 组织设置页面(新增)
P2P网络(规划中):
- libp2p: P2P网络基础
- GossipSub: 组织Topic订阅
- Signal Protocol: E2E加密消息
数据同步(规划中):
- IPFS: 内容寻址存储
- OrbitDB: 去中心化数据库(考虑中)
- Y.js: CRDT协同编辑
2.5.7 Phase 56 — Terraform Provider (Infrastructure as Code)
实现时间: 2026-02-27 (Q4 2026) 状态: ✅ 已实现 (v1.1.0-alpha)
2.5.7.1 功能概述
Terraform Provider集成为企业级用户提供基础设施即代码(IaC)能力,支持通过Terraform管理ChainlessChain的组织资源、用户权限、配置策略等。
核心能力:
- 工作空间管理: CRUD操作,环境隔离(dev/staging/prod)
- Plan/Apply/Destroy: 完整的Terraform工作流
- 状态管理: 远程状态后端,版本控制
- 变量管理: 环境变量、Terraform变量配置
- 运行历史: 执行日志、输出读取、错误追踪
2.5.7.2 Terraform Manager
文件: desktop-app-vue/src/main/enterprise/terraform-manager.js
工作空间管理:
javascript
class TerraformManager {
async createWorkspace(name, terraformVersion = '1.6.0', variables = {}) {
const workspace = {
workspace_id: uuidv4(),
name,
terraform_version: terraformVersion,
variables: JSON.stringify(variables),
created_at: Date.now()
}
await this.db.run(
'INSERT INTO terraform_workspaces (...) VALUES (...)',
[workspace.workspace_id, ...]
)
return workspace
}
async listWorkspaces() { ... }
async deleteWorkspace(workspaceId) { ... }
}Terraform运行管理:
javascript
async planRun(workspaceId) {
const run = {
run_id: uuidv4(),
workspace_id: workspaceId,
type: 'plan',
status: 'pending',
created_at: Date.now()
}
// 执行terraform plan
const planOutput = await this._executeTerraformCommand(workspaceId, 'plan')
run.status = 'completed'
run.plan_output = planOutput
await this.db.run('INSERT INTO terraform_runs (...) VALUES (...)', [...])
return run
}
async applyRun(workspaceId, planRunId) { ... }
async destroyRun(workspaceId) { ... }状态管理:
- Local Backend: 本地状态文件存储(
terraform.tfstate) - Remote Backend: S3/HTTP/Terraform Cloud集成
- State Locking: 防止并发修改
- State Version Control: 状态历史追踪
2.5.7.3 数据库设计
terraform_workspaces表:
sql
CREATE TABLE terraform_workspaces (
workspace_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
terraform_version TEXT DEFAULT '1.6.0',
variables TEXT, -- JSON: {"env": "prod", "region": "us-east-1"}
state_backend TEXT, -- local/s3/http/terraform_cloud
state_backend_config TEXT, -- JSON配置
created_at INTEGER NOT NULL
)terraform_runs表:
sql
CREATE TABLE terraform_runs (
run_id TEXT PRIMARY KEY,
workspace_id TEXT NOT NULL,
type TEXT NOT NULL, -- plan/apply/destroy
status TEXT DEFAULT 'pending', -- pending/running/completed/failed
plan_output TEXT,
apply_output TEXT,
state_version INTEGER,
error_message TEXT,
created_at INTEGER NOT NULL,
completed_at INTEGER,
FOREIGN KEY (workspace_id) REFERENCES terraform_workspaces(workspace_id)
)2.5.7.4 IPC接口
Terraform IPC (enterprise/terraform-ipc.js) - 4个处理器:
javascript
const CHANNELS = [
"terraform:list-workspaces",
"terraform:create-workspace",
"terraform:plan-run",
"terraform:list-runs",
];
function registerTerraformIPC(deps) {
const { ipcMain, terraformManager } = deps;
ipcMain.handle("terraform:list-workspaces", async () => {
return await terraformManager.listWorkspaces();
});
ipcMain.handle(
"terraform:create-workspace",
async (event, { name, variables }) => {
return await terraformManager.createWorkspace(name, "1.6.0", variables);
},
);
ipcMain.handle("terraform:plan-run", async (event, { workspaceId }) => {
return await terraformManager.planRun(workspaceId);
});
ipcMain.handle("terraform:list-runs", async (event, { workspaceId }) => {
return await terraformManager.listRuns(workspaceId);
});
return { handlerCount: CHANNELS.length };
}2.5.7.5 前端集成
Pinia Store (stores/terraform.ts):
typescript
export const useTerraformStore = defineStore("terraform", {
state: () => ({
workspaces: [] as Workspace[],
currentWorkspace: null as Workspace | null,
runs: [] as TerraformRun[],
planOutput: "",
}),
actions: {
async fetchWorkspaces() {
this.workspaces = await (window as any).electronAPI.invoke(
"terraform:list-workspaces",
);
},
async createWorkspace(name: string, variables: Record<string, any>) {
const ws = await (window as any).electronAPI.invoke(
"terraform:create-workspace",
{ name, variables },
);
this.workspaces.push(ws);
return ws;
},
async executePlan(workspaceId: string) {
const run = await (window as any).electronAPI.invoke(
"terraform:plan-run",
{ workspaceId },
);
this.planOutput = run.plan_output;
return run;
},
async fetchRuns(workspaceId: string) {
this.runs = await (window as any).electronAPI.invoke(
"terraform:list-runs",
{ workspaceId },
);
},
},
});UI页面 (pages/enterprise/TerraformProviderPage.vue):
- 工作空间列表: 名称/环境/Terraform版本/创建时间
- 工作空间创建向导: 名称输入/环境选择/变量配置(key-value表单)
- Plan预览: Terraform plan输出(语法高亮),资源变更摘要(+N create, ~M modify, -K destroy)
- Apply执行: 确认对话框,执行进度,Apply输出日志
- 状态查看: 当前状态版本,资源列表,输出变量
- 运行历史: 运行类型/状态/时间/持续时间,日志查看
2.5.7.6 Terraform配置示例
hcl
# main.tf - ChainlessChain Terraform Provider
terraform {
required_providers {
chainlesschain = {
source = "chainlesschain/chainlesschain"
version = "~> 1.0"
}
}
}
provider "chainlesschain" {
api_url = "http://localhost:9090"
api_key = var.api_key
}
# 组织资源
resource "chainlesschain_organization" "example" {
name = "Example Org"
description = "Example organization created via Terraform"
owner_did = var.owner_did
}
# 用户资源
resource "chainlesschain_user" "admin" {
organization_id = chainlesschain_organization.example.id
did = var.admin_did
role = "admin"
}
# 权限策略
resource "chainlesschain_permission_policy" "read_only" {
organization_id = chainlesschain_organization.example.id
name = "read-only"
permissions = ["read:notes", "read:projects"]
}2.5.8 实现进度
| 模块 | 状态 | 完成度 |
|---|---|---|
| 数据库架构(8个表) | ✅ 完成 | 100% |
| OrganizationManager | ✅ 完成 | 100% |
| IdentityStore | ✅ 完成 | 100% |
| IdentitySwitcher UI | ✅ 完成 | 95% |
| 成员管理UI | ✅ 完成 | 95% |
| 多身份数据库隔离 | ✅ 完成 | 90% |
| 组织DID创建 | ✅ 完成 | 100% |
| 邀请码系统 | ✅ 完成 | 100% |
| RBAC权限系统 | ✅ 完成 | 100% |
| 活动日志 | ✅ 完成 | 100% |
| 角色管理 | ✅ 完成 | 100% |
| DID邀请机制 | ✅ 完成 | 85% |
| 协作管理器 | ✅ 完成 | 85% |
| 组织项目管理 | ✅ 完成 | 90% |
| P2P组织网络 | ⚠️ 基础框架 | 30% |
| 数据同步 | ⚠️ 开发中 | 40% |
总体完成度: 85%(核心功能已完成,可生产使用)
实现亮点:
- ✅ 完整的组织CRUD操作
- ✅ 多身份切换和数据隔离
- ✅ 完善的成员和角色管理
- ✅ 基于DID的邀请系统
- ✅ 协作式文档编辑基础框架
实现状态 (v0.20.0)
完成度: 45% 🚧
已实现:
- RBAC权限系统
- 组织管理
- DID邀请机制
开发中:
- 实时协作编辑
- 组织知识库隔离
- 高级权限管理
实现位置: desktop-app-vue/src/main/organization/ (12个文件)
