Skip to content

企业版组织模块 ⭐新增核心模块

本文档是 系统设计主文档 的子文档,详细描述企业版去中心化组织协作模块的设计。


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 CID

2.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个文件)

ChainlessChain 系统设计文档 — 面向开发者