# 数据模型

## 一、plugin_state 表（新增）

```sql
CREATE TABLE plugin_state (
    plugin_id    TEXT PRIMARY KEY,
    source       TEXT NOT NULL DEFAULT 'builtin',
    enabled      INTEGER DEFAULT 1,
    config       TEXT,
    install_path TEXT,
    version      TEXT,
    installed_at DATETIME,
    updated_at   DATETIME,
    created_at   DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_plugin_source ON plugin_state(source);
CREATE INDEX idx_plugin_enabled ON plugin_state(enabled);
```

### 字段说明

| 字段 | 类型 | 说明 |
|------|------|------|
| `plugin_id` | TEXT PK | 对应 PluginMetadata.ID，如 `"builtin-drawio"` |
| `source` | TEXT | `'builtin'` 或 `'market'` |
| `enabled` | INTEGER | 1=启用 0=停用 |
| `config` | TEXT | JSON 格式的插件私有配置 |
| `install_path` | TEXT | 外部插件磁盘路径（内置为 NULL） |
| `version` | TEXT | 当前安装的版本号 |
| `installed_at` | DATETIME | 安装时间 |
| `updated_at` | DATETIME | 最后状态变更时间 |

## 二、与现有表的关系

```
app_config 表（已有）          plugin_state 表（新增）
┌──────────────┐              ┌──────────────┐
│ key='tab_config'│           │ plugin_id PK │
│ value=JSON    │ ← 合并Tab →│ source       │
│ (全局配置)     │              │ enabled      │
├──────────────┤              │ version      │
│ key='plugin_  │ ← 全局设置→│ config       │
│  global'      │              │ install_path │
│ (Phase 3 新增)│              └──────────────┘
└──────────────┘
```

- `app_config`：存全局应用配置（tab_config、plugin_global 等）
- `plugin_state`：存每个插件的运行状态和独立配置
- 两者通过 `plugin_id` 关联

## 三、初始种子数据

应用首次启动时由 Go 代码写入：

```sql
INSERT OR IGNORE INTO plugin_state (plugin_id, source, enabled, version) VALUES
    ('builtin-file-system',  'builtin', 1, '0.4.0'),
    ('builtin-markdown',      'builtin', 1, '0.4.0'),
    ('builtin-drawio',        'builtin', 0, '1.0.0');
```

## 四、配置存储策略

| 存储位置 | 内容 | 写入时机 |
|---------|------|---------|
| `app_config['tab_config']` | Tab 可见性/排序/默认值 | Phase 3 动态合并 |
| `app_config['plugin_global']` | 插件全局设置（自动更新间隔等） | Phase 3 |
| `plugin_state.enabled` | 每个插件的启停状态 | Phase 3 SetPluginEnabled |
| `plugin_state.version` | 当前安装版本 | 安装/更新时 |
| `plugin_state.config` | 插件私有配置（如 Draw.io 端口号） | 用户修改插件设置时 |
