@fgbg/mdocs 0.8.8 → 0.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-skills/changelog/SKILL.md +286 -0
- package/agent-skills/core-concepts-all-files/SKILL.md +53 -0
- package/agent-skills/core-concepts-domain/SKILL.md +106 -0
- package/agent-skills/core-concepts-invitation/SKILL.md +61 -0
- package/agent-skills/core-concepts-no-account/SKILL.md +85 -0
- package/agent-skills/deployment-config/SKILL.md +47 -0
- package/agent-skills/deployment-requirements/SKILL.md +50 -0
- package/agent-skills/deployment-reverse-proxy/SKILL.md +71 -0
- package/agent-skills/faq/SKILL.md +48 -0
- package/agent-skills/getting-started-first-kb/SKILL.md +40 -0
- package/agent-skills/getting-started-installation/SKILL.md +119 -0
- package/agent-skills/index/SKILL.md +47 -0
- package/agent-skills/index.json +184 -0
- package/agent-skills/usage-bookmarks/SKILL.md +93 -0
- package/agent-skills/usage-cli-token/SKILL.md +128 -0
- package/agent-skills/usage-comments/SKILL.md +149 -0
- package/agent-skills/usage-domain-members/SKILL.md +104 -0
- package/agent-skills/usage-drafts/SKILL.md +111 -0
- package/agent-skills/usage-flowchart/SKILL.md +88 -0
- package/agent-skills/usage-markdown/SKILL.md +105 -0
- package/agent-skills/usage-merge-conflicts/SKILL.md +42 -0
- package/agent-skills/usage-my-documents/SKILL.md +106 -0
- package/agent-skills/usage-onboarding-ai/SKILL.md +49 -0
- package/agent-skills/usage-recovery-code/SKILL.md +72 -0
- package/agent-skills/usage-search/SKILL.md +34 -0
- package/agent-skills/usage-settings/SKILL.md +118 -0
- package/agent-skills/why-mdocs/SKILL.md +13 -0
- package/dist/server/agent/Agent/run.js +222 -0
- package/dist/server/agent/Agent/run.js.map +1 -0
- package/dist/server/agent/Agent/session-manager.js +147 -0
- package/dist/server/agent/Agent/session-manager.js.map +1 -0
- package/dist/server/agent/Agent/system-prompt.js +13 -0
- package/dist/server/agent/Agent/system-prompt.js.map +1 -0
- package/dist/server/agent/Agent/tools.js +37 -0
- package/dist/server/agent/Agent/tools.js.map +1 -0
- package/dist/server/agent/Config/config.js +113 -0
- package/dist/server/agent/Config/config.js.map +1 -0
- package/dist/server/agent/Skill/skill-loader.js +46 -0
- package/dist/server/agent/Skill/skill-loader.js.map +1 -0
- package/dist/server/app.js +2 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/db/repositories/agent-model-config.repo.js +17 -0
- package/dist/server/db/repositories/agent-model-config.repo.js.map +1 -0
- package/dist/server/db/schema.js +10 -0
- package/dist/server/db/schema.js.map +1 -1
- package/dist/server/routes/agent.routes.js +135 -0
- package/dist/server/routes/agent.routes.js.map +1 -0
- package/dist/web/assets/{MergeView-BBr64bam.js → MergeView-Da6W6Mwd.js} +1 -1
- package/dist/web/assets/{_baseUniq-DPiuTO9O.js → _baseUniq-DIXaUG3P.js} +1 -1
- package/dist/web/assets/{arc-BjFiPdRI.js → arc-BdrqKgEt.js} +1 -1
- package/dist/web/assets/{architectureDiagram-Q4EWVU46-Bg5q-eAF.js → architectureDiagram-Q4EWVU46-C7DbabmE.js} +1 -1
- package/dist/web/assets/{blockDiagram-DXYQGD6D-BD2W9g1m.js → blockDiagram-DXYQGD6D-xpzHPtBf.js} +1 -1
- package/dist/web/assets/{c4Diagram-AHTNJAMY-EutGBUph.js → c4Diagram-AHTNJAMY-C55XB-0p.js} +1 -1
- package/dist/web/assets/channel-R2F1bwis.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-DjI4WDbc.js → chunk-4BX2VUAB-Cw9cGcvA.js} +1 -1
- package/dist/web/assets/{chunk-4TB4RGXK-STKj2CZp.js → chunk-4TB4RGXK-Bb7TaNsp.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DjjX4E45.js → chunk-55IACEB6-ClfU0bTR.js} +1 -1
- package/dist/web/assets/{chunk-EDXVE4YY-BV5S3HvN.js → chunk-EDXVE4YY-DEYQg7so.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-BqEWdzLG.js → chunk-FMBD7UC4-l0uxylnu.js} +1 -1
- package/dist/web/assets/{chunk-OYMX7WX6-CaY5tJMJ.js → chunk-OYMX7WX6-CTuAfYj2.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-Dpnf7BSM.js → chunk-QZHKN3VN-Cd5BdpCj.js} +1 -1
- package/dist/web/assets/{chunk-YZCP3GAM-CkhOhodd.js → chunk-YZCP3GAM-C4AFz6HK.js} +1 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-D8Aoi_kK.js +1 -0
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-D8Aoi_kK.js +1 -0
- package/dist/web/assets/clone-D3UTWyOI.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-TnRvn8wH.js → cose-bilkent-S5V4N54A-DPbGSIxQ.js} +1 -1
- package/dist/web/assets/{dagre-KV5264BT-sJWGoaLD.js → dagre-KV5264BT-BAqCvioS.js} +1 -1
- package/dist/web/assets/{diagram-5BDNPKRD-D-m_kU_W.js → diagram-5BDNPKRD-BVhjoylL.js} +1 -1
- package/dist/web/assets/{diagram-G4DWMVQ6-Czc0GOtJ.js → diagram-G4DWMVQ6-BgdBEUo2.js} +1 -1
- package/dist/web/assets/{diagram-MMDJMWI5-IOAJuFuD.js → diagram-MMDJMWI5-v3XiVR4L.js} +1 -1
- package/dist/web/assets/{diagram-TYMM5635-B6J_V3un.js → diagram-TYMM5635-Bnlc4JL7.js} +1 -1
- package/dist/web/assets/{erDiagram-SMLLAGMA-Dzv2Z19V.js → erDiagram-SMLLAGMA-DZNfy5XO.js} +1 -1
- package/dist/web/assets/{flowDiagram-DWJPFMVM-BEVdVQjJ.js → flowDiagram-DWJPFMVM-CyNHaoXD.js} +1 -1
- package/dist/web/assets/{ganttDiagram-T4ZO3ILL-CqDRowWZ.js → ganttDiagram-T4ZO3ILL-D9XKVK6L.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-id1A35b6.js → gitGraphDiagram-UUTBAWPF-BsoJR5By.js} +1 -1
- package/dist/web/assets/{graph-D1ZUACO1.js → graph-C6hZEMMA.js} +1 -1
- package/dist/web/assets/{index-CG_5hNy2.js → index-BiYwrQhS.js} +1245 -1196
- package/dist/web/assets/index-C4tGH1XB.css +1 -0
- package/dist/web/assets/{infoDiagram-42DDH7IO-VCo7Y_XY.js → infoDiagram-42DDH7IO-EsbSvvwg.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-2zkFwtGK.js → ishikawaDiagram-UXIWVN3A-opc9PUAq.js} +1 -1
- package/dist/web/assets/{journeyDiagram-VCZTEJTY-9xfjIDzZ.js → journeyDiagram-VCZTEJTY-CGoqXdQp.js} +1 -1
- package/dist/web/assets/{kanban-definition-6JOO6SKY-CtlIC6o7.js → kanban-definition-6JOO6SKY-BsMSOTEO.js} +1 -1
- package/dist/web/assets/{layout-BwiWnDDL.js → layout-dka4PN3u.js} +1 -1
- package/dist/web/assets/{linear-BCmqTrEt.js → linear-C7358dWt.js} +1 -1
- package/dist/web/assets/{min-HUIhyFEJ.js → min-CkhEOvqb.js} +1 -1
- package/dist/web/assets/{mindmap-definition-QFDTVHPH-CxMrCCZd.js → mindmap-definition-QFDTVHPH-Cw5Uw5sO.js} +1 -1
- package/dist/web/assets/{pieDiagram-DEJITSTG-DfotdBjp.js → pieDiagram-DEJITSTG-D_2NhEs9.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-34T5L4WZ-BQP7wk7X.js → quadrantDiagram-34T5L4WZ-CCoI5QqP.js} +1 -1
- package/dist/web/assets/{requirementDiagram-MS252O5E-B_TtEKSs.js → requirementDiagram-MS252O5E-DlRuHrpI.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-XADWPNL6-DaSKJ2JV.js → sankeyDiagram-XADWPNL6-CqeHUQiU.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-FGHM5R23-BjmdElN-.js → sequenceDiagram-FGHM5R23-bAgSxA1M.js} +1 -1
- package/dist/web/assets/{stateDiagram-FHFEXIEX-BNaY_Ekl.js → stateDiagram-FHFEXIEX-BY710eMg.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-BQw6J9EK.js +1 -0
- package/dist/web/assets/{timeline-definition-GMOUNBTQ-BsVGIy02.js → timeline-definition-GMOUNBTQ-Dm1cJJzA.js} +1 -1
- package/dist/web/assets/{vennDiagram-DHZGUBPP-DvxeoAnH.js → vennDiagram-DHZGUBPP-x15pVuxW.js} +1 -1
- package/dist/web/assets/wardley-RL74JXVD-Baa2vTyp.js +162 -0
- package/dist/web/assets/{wardleyDiagram-NUSXRM2D-IHiVP54x.js → wardleyDiagram-NUSXRM2D-DD4pCNVv.js} +1 -1
- package/dist/web/assets/{xychartDiagram-5P7HB3ND-juQThxJ3.js → xychartDiagram-5P7HB3ND-Cj82t7kB.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +8 -2
- package/dist/web/assets/channel-DXrjDOYn.js +0 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-9bBkEPwQ.js +0 -1
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-9bBkEPwQ.js +0 -1
- package/dist/web/assets/clone-CeG9DhNI.js +0 -1
- package/dist/web/assets/index-BUN3YDVd.css +0 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-spf8Ruqx.js +0 -1
- package/dist/web/assets/wardley-RL74JXVD-Cefj9jwz.js +0 -162
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-cli-token
|
|
3
|
+
name: "CLI Token"
|
|
4
|
+
description: "CLI Token 是给命令行工具和 AI Agent(如 Claude Code)使用的身份令牌,继承你在 mdocs 中的所有权限。Token 与你的访客身份绑定,创建后可以通过 HTTP API 读写文档。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/cli-token.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# CLI Token
|
|
10
|
+
|
|
11
|
+
CLI Token 是给命令行工具和 AI Agent(如 Claude Code)使用的身份令牌,继承你在 mdocs 中的所有权限。Token 与你的访客身份绑定,创建后可以通过 HTTP API 读写文档。
|
|
12
|
+
|
|
13
|
+
## 适用场景
|
|
14
|
+
|
|
15
|
+
- **命令行管理**:在服务器上通过脚本批量创建或更新文档
|
|
16
|
+
- **Agent 集成**:让 AI 编程助手直接读写你的知识库
|
|
17
|
+
- **CI/CD 流水线**:在自动化流程中同步文档
|
|
18
|
+
|
|
19
|
+
## 创建 Token
|
|
20
|
+
|
|
21
|
+
1. 打开 mdocs 的设置页,切换到「通用」Tab。
|
|
22
|
+
2. 找到 **CLI Token** 卡片,点击「创建」。
|
|
23
|
+
3. 系统会生成一个新的 Token,**仅在此时展示一次**,请立即复制保存。
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
> Token 是高熵随机字符串(32 字节,base64url 编码),安全强度与 Web 端访客令牌相同。
|
|
28
|
+
|
|
29
|
+
## 重置 Token
|
|
30
|
+
|
|
31
|
+
如果 Token 泄露或想更换,点击「重置」:
|
|
32
|
+
|
|
33
|
+
1. 点击「重置」按钮,弹出确认弹窗。
|
|
34
|
+
2. 确认后,系统会吊销所有已有 Token 并生成一个新的。
|
|
35
|
+
3. 新的 Token 同样**仅在此时展示一次**,请立即复制保存。
|
|
36
|
+
|
|
37
|
+
## CLI 客户端
|
|
38
|
+
|
|
39
|
+
mdocs 提供了独立的命令行客户端 `mdocs-cli`([GitHub 仓库](https://github.com/xuhuafeifei/mdocs-cli)),通过 Token 认证操作文档。
|
|
40
|
+
|
|
41
|
+
### 安装
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/xuhuafeifei/mdocs-cli.git ~/.mdocs-cli
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
入口文件:`~/.mdocs-cli/mdocs.mjs`(需 Node.js 18+)
|
|
48
|
+
|
|
49
|
+
### 连接与认证
|
|
50
|
+
|
|
51
|
+
全局选项可放在命令任意位置,**优先级高于环境变量**:
|
|
52
|
+
|
|
53
|
+
| 来源 | Token | 服务端 |
|
|
54
|
+
|------|-------|--------|
|
|
55
|
+
| 命令行 | `--token <token>`(必填其一) | `--ip <host[:port]>` 可选 |
|
|
56
|
+
| 环境变量 | `MDOCS_TOKEN` | `MDOCS_SERVER` |
|
|
57
|
+
| 默认 | — | `http://127.0.0.1:4000` |
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 连远程服务器(一次性)
|
|
61
|
+
node ~/.mdocs-cli/mdocs.mjs --token <token> --ip 101.132.222.88:4000 domains
|
|
62
|
+
|
|
63
|
+
# 或写入环境变量
|
|
64
|
+
export MDOCS_TOKEN="<你的 token>"
|
|
65
|
+
export MDOCS_SERVER="http://101.132.222.88:4000"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 命令参考
|
|
69
|
+
|
|
70
|
+
| 命令 | 用途 |
|
|
71
|
+
| ---------------------------------------------------------------------------------- | ----------------------------- |
|
|
72
|
+
| `search --q <关键词> [--domain <域ID>] [--topn <数量>]` | 全文检索文档 |
|
|
73
|
+
| `get <文档ID>` | 读取文档完整内容 |
|
|
74
|
+
| `create --name <文件名.md> --content <正文> [--domain <域ID>] [--parent <目录ID>]` | 创建文档 |
|
|
75
|
+
| `update <文档ID> --content <新正文> [--title <新标题>]` | 更新文档内容 |
|
|
76
|
+
| `domains` | 列出当前 Token 可访问的所有域 |
|
|
77
|
+
| `mkdir --domain <域ID> --name <目录名> [--parent <目录ID>]` | 创建目录 |
|
|
78
|
+
| `ls <documentId>` 或 `ls "关键词" --domain <域ID>` | 列出目录下子节点 |
|
|
79
|
+
|
|
80
|
+
### 使用示例
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 搜索文档
|
|
84
|
+
node ~/.mdocs-cli/mdocs.mjs search --q "测试文章"
|
|
85
|
+
|
|
86
|
+
# 创建文档到指定目录
|
|
87
|
+
node ~/.mdocs-cli/mdocs.mjs create \
|
|
88
|
+
--name "笔记.md" \
|
|
89
|
+
--title "我的笔记" \
|
|
90
|
+
--content "# 标题\n\n正文内容" \
|
|
91
|
+
--domain <域ID> \
|
|
92
|
+
--parent <目录ID>
|
|
93
|
+
|
|
94
|
+
# 更新文档
|
|
95
|
+
node ~/.mdocs-cli/mdocs.mjs update <文档ID> \
|
|
96
|
+
--content "新内容" \
|
|
97
|
+
--title "新标题"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
> 创建和更新文档时,`--content` 支持 Markdown 格式,后端会自动转换为富文本。
|
|
101
|
+
|
|
102
|
+
## 使用 Token
|
|
103
|
+
|
|
104
|
+
在命令行或 Agent 配置中,通过 `x-cli-token` 请求头发送:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# 使用 curl
|
|
108
|
+
curl -H "x-cli-token: <你的 token>" https://your-mdocs-server.com/api/documents
|
|
109
|
+
|
|
110
|
+
# 环境变量(与 --token 二选一)
|
|
111
|
+
export MDOCS_TOKEN="<你的 token>"
|
|
112
|
+
export MDOCS_SERVER="http://your-mdocs-server.com:4000" # 可选,默认本机 4000
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
也可在每条命令上用 `--token` / `--ip` 覆盖,见上文「连接与认证」。
|
|
116
|
+
|
|
117
|
+
Token 继承你当前访客的所有权限——能读的文档它也能读,能写的文档它也能写。
|
|
118
|
+
|
|
119
|
+
## 管理 Token
|
|
120
|
+
|
|
121
|
+
在设置页的 CLI Token 卡片中,你可以看到所有已创建的 Token 列表及状态(「活跃」/「已吊销」)。当前同一访客只保持一个活跃 Token,重置时会自动吊销旧的。
|
|
122
|
+
|
|
123
|
+
## 安全说明
|
|
124
|
+
|
|
125
|
+
- 服务端只存储 Token 的 SHA-256 哈希值,即使数据库泄露也无法伪造请求
|
|
126
|
+
- 原始 Token 仅在创建时展示一次,关闭后无法再次查看
|
|
127
|
+
- 如怀疑 Token 泄露,请立即重置
|
|
128
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-comments
|
|
3
|
+
name: "评论功能"
|
|
4
|
+
description: "评论功能提供文档内的协作讨论能力,支持对整篇文档发表评论和回复,便于团队协作文档时的沟通与反馈。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/comments.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 评论功能
|
|
10
|
+
|
|
11
|
+
## 功能概述
|
|
12
|
+
|
|
13
|
+
评论功能提供文档内的协作讨论能力,支持对整篇文档发表评论和回复,便于团队协作文档时的沟通与反馈。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 打开评论面板
|
|
18
|
+
|
|
19
|
+
### 入口:文档信息菜单
|
|
20
|
+
|
|
21
|
+
1. 打开任意文档
|
|
22
|
+
2. 点击编辑器工具栏最右侧的 **⋮ 更多按钮**
|
|
23
|
+
3. 在下拉菜单中点击 **评论**
|
|
24
|
+
4. 右侧滑出评论面板
|
|
25
|
+
|
|
26
|
+
评论面板会显示当前文档的所有评论,按时间倒序排列(最新的在最上面)。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 发表评论
|
|
31
|
+
|
|
32
|
+
### 评论输入框
|
|
33
|
+
|
|
34
|
+
在评论面板顶部的输入框中输入评论内容:
|
|
35
|
+
|
|
36
|
+
- 支持纯文本输入
|
|
37
|
+
- 最多 512 字符
|
|
38
|
+
- 实时显示剩余字数提示
|
|
39
|
+
|
|
40
|
+
点击**发送**按钮发表评论。发表后:
|
|
41
|
+
- 评论立即出现在列表中
|
|
42
|
+
- 显示你的访客昵称
|
|
43
|
+
- 显示评论发表时间(相对时间,如「5 分钟前」)
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 回复评论
|
|
48
|
+
|
|
49
|
+
每篇根评论下可以嵌套多条回复,形成讨论线程:
|
|
50
|
+
|
|
51
|
+
1. 找到想要回复的评论
|
|
52
|
+
2. 点击该评论右下角的 **回复** 按钮
|
|
53
|
+
3. 在出现的输入框中输入回复内容(最多 512 字符)
|
|
54
|
+
4. 点击**发送**
|
|
55
|
+
|
|
56
|
+
回复会显示在对应根评论的下方,缩进显示,并标注回复人。
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 删除评论
|
|
61
|
+
|
|
62
|
+
### 权限说明
|
|
63
|
+
|
|
64
|
+
你只能删除**自己发表**的评论或回复,无论它是根评论还是回复。
|
|
65
|
+
|
|
66
|
+
### 删除操作
|
|
67
|
+
|
|
68
|
+
1. 找到自己发表的评论
|
|
69
|
+
2. 评论右下角会显示红色的 **删除** 按钮
|
|
70
|
+
3. 点击删除,弹出确认对话框
|
|
71
|
+
4. 点击**确定**完成删除
|
|
72
|
+
|
|
73
|
+
删除后该评论会从列表中即时消失。
|
|
74
|
+
|
|
75
|
+
### 删除根评论的影响
|
|
76
|
+
|
|
77
|
+
删除根评论时,该评论下的所有回复也会被一并删除。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 评论计数
|
|
82
|
+
|
|
83
|
+
评论面板顶部显示当前文档的**有效评论数**:
|
|
84
|
+
|
|
85
|
+
- 只统计未删除的评论
|
|
86
|
+
- 根评论和回复合计计数
|
|
87
|
+
- 实时更新(发表/删除后立即刷新)
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 权限规则
|
|
92
|
+
|
|
93
|
+
| 操作 | 权限要求 |
|
|
94
|
+
|-----|---------|
|
|
95
|
+
| 查看评论 | 能阅读该文档即可 |
|
|
96
|
+
| 发表评论 | 有该文档的编辑权限 |
|
|
97
|
+
| 发表回复 | 有该文档的编辑权限 |
|
|
98
|
+
| 删除评论 | 仅该评论的发表者 |
|
|
99
|
+
|
|
100
|
+
### 不同场景下的权限表现
|
|
101
|
+
|
|
102
|
+
| 文档权限 | 能否查看评论 | 能否发表/回复 | 能否删除自己的评论 |
|
|
103
|
+
|---------|-------------|--------------|------------------|
|
|
104
|
+
| 公开可读 | ✅ 可以 | ❌ 不可以 | ❌ 不可以 |
|
|
105
|
+
| 公开可编辑 | ✅ 可以 | ✅ 可以 | ✅ 可以 |
|
|
106
|
+
| 受限域成员 | ✅ 可以 | ✅ 可以 | ✅ 可以 |
|
|
107
|
+
| 被邀请只读 | ✅ 可以 | ❌ 不可以 | ❌ 不可以 |
|
|
108
|
+
| 被邀请可编辑 | ✅ 可以 | ✅ 可以 | ✅ 可以 |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 使用建议
|
|
113
|
+
|
|
114
|
+
### 建议用于
|
|
115
|
+
|
|
116
|
+
- **文档反馈**:对内容提出修改建议
|
|
117
|
+
- **疑问讨论**:就文档中的某个点提问和解答
|
|
118
|
+
- **协作备忘**:记录编辑思路和决策理由
|
|
119
|
+
|
|
120
|
+
### 不建议用于
|
|
121
|
+
|
|
122
|
+
- 存储敏感信息(评论无加密,与文档内容同级别安全)
|
|
123
|
+
- 长篇大论(建议直接编辑文档正文)
|
|
124
|
+
- 发送与文档无关的闲聊消息
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 常见问题
|
|
129
|
+
|
|
130
|
+
### 评论保存在哪里?会同步吗?
|
|
131
|
+
|
|
132
|
+
评论存储在服务器数据库中,与文档绑定,不会写入 Markdown 文件。所有访问该文档的访客都能看到相同的评论列表。
|
|
133
|
+
|
|
134
|
+
### 可以编辑评论吗?
|
|
135
|
+
|
|
136
|
+
目前不支持编辑已发表的评论,只能删除后重新发表。
|
|
137
|
+
|
|
138
|
+
### 评论有通知吗?
|
|
139
|
+
|
|
140
|
+
目前没有通知机制,需要手动打开评论面板查看新评论。
|
|
141
|
+
|
|
142
|
+
### 删除的评论可以恢复吗?
|
|
143
|
+
|
|
144
|
+
不可以。删除操作不可逆,请谨慎操作。
|
|
145
|
+
|
|
146
|
+
### 为什么我看不到删除按钮?
|
|
147
|
+
|
|
148
|
+
只有评论的发表者才能看到删除按钮。如果不是你发的评论,就不会显示该按钮。
|
|
149
|
+
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-domain-members
|
|
3
|
+
name: "受限域成员与名单模板"
|
|
4
|
+
description: "本文说明如何在 mdocs 里维护 **restricted(受限)域** 的成员,以及如何使用 **域成员模板** 减少重复勾选。与权限模型相关的设计背景见 [域隔离](../core-concepts/domain.md)。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/domain-members.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 受限域成员与名单模板
|
|
10
|
+
|
|
11
|
+
本文说明如何在 mdocs 里维护 **restricted(受限)域** 的成员,以及如何使用 **域成员模板** 减少重复勾选。与权限模型相关的设计背景见 [域隔离](../core-concepts/domain.md)。
|
|
12
|
+
|
|
13
|
+
## 谁能用这些功能
|
|
14
|
+
|
|
15
|
+
- **管理某受限域的成员**:仅限该域的 **创建者**(你在域列表里对该域拥有完整操作按钮的那个人)。
|
|
16
|
+
- **创建 / 编辑 / 删除成员模板**:当前登录访客自己的模板列表;模板数据按创建者隔离,其他人看不到你的模板。
|
|
17
|
+
|
|
18
|
+
公开域、个人域 **没有**「成员」名单能力:前者对所有人开放入口,后者只有域主一人。
|
|
19
|
+
|
|
20
|
+
## UI 界面
|
|
21
|
+
|
|
22
|
+

|
|
23
|
+
|
|
24
|
+
> 域管理界面显示的域,都是用户可见的域. 公开域,团队成员的受限域,私域 (如果域中存在一篇文章邀请了别的用户,那么该域对那名用户也是可见的,哪怕是私域)
|
|
25
|
+
|
|
26
|
+
## 入口在哪里
|
|
27
|
+
|
|
28
|
+
点击应用左下角,包含用户头像的栏目
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
| 侧栏项(中文界面示例) | 作用 |
|
|
33
|
+
| ---------------------- | ------------------------------------------------------ |
|
|
34
|
+
| **域管理** | 新建域、筛选域类型、对 **受限域** 打开「成员」维护弹窗 |
|
|
35
|
+
| **域成员模板** | 维护可复用的访客 ID 名单(名称 + 一套勾选结果) |
|
|
36
|
+
|
|
37
|
+
「活跃访客目录」来自服务端的访客列表接口:一般包含当前未停用的访客,用于左侧勾选。
|
|
38
|
+
|
|
39
|
+
## 创建受限域与首批成员
|
|
40
|
+
|
|
41
|
+
1. 进入 **设置 → 域管理**。
|
|
42
|
+
2. 在「新建域」里填写名称,类型选择 **受限**(restricted),提交创建。
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
3. 创建成功后,**你(创建者)会自动写入该域的 `domain_members`**,无需额外操作。
|
|
46
|
+
|
|
47
|
+
之后团队其他成员要 **完整进入该域**(侧栏树、在域内 **新建文档** 等),需要由创建者把他们加进成员名单。
|
|
48
|
+
|
|
49
|
+
## 维护成员名单
|
|
50
|
+
|
|
51
|
+
1. 在 **域管理** 表格中找到目标 **受限域**,且你仍是创建者。
|
|
52
|
+
2. 点击 **成员**(或界面中与「管理成员」同义的按钮),打开 **访客选择器** 弹窗。
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+
弹窗习惯用法:
|
|
56
|
+
|
|
57
|
+
- **左栏**:当前可选的访客目录,支持搜索昵称或 UUID 片段;勾选即加入右侧。
|
|
58
|
+
- **右栏**:即将保存的成员;每人显示完整 **visitor_id**(UUID),便于复制给队友核对。
|
|
59
|
+
- **域创建者** 在行内会锁定,**不能从名单中移除**;服务端在保存时也会 **自动把创建者并回名单**,所以不要依赖「删掉创建者」来转让域。
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
保存时的规则简述:
|
|
64
|
+
|
|
65
|
+
- 只允许提交 **在库里仍然存在的** visitor id;若包含从未注册过的 id,接口会报错,需对照 UUID 修正。
|
|
66
|
+
- **已停用** 的访客若仍在历史成员里,界面可能以灰色或标签提示「停用」;创建者仍可保留这些 id 在名单中(是否保留由团队策略决定)。
|
|
67
|
+
|
|
68
|
+
仅从 **左栏目录** 勾选时,列表里只会出现 **当前「活跃」访客**。若某人已停用,但 **曾经写入过成员表**,打开弹窗时仍可能在 **右栏** 看到完整 UUID 与相应提示(数据来自成员接口,不依赖左栏是否展示)。
|
|
69
|
+
|
|
70
|
+
### 套用模板(在成员弹窗内)
|
|
71
|
+
|
|
72
|
+
弹窗顶部可选择 **已有模板** 并点击 **套用**:
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
- 会把模板里保存的访客 ID **与当前左栏目录求交集**:只有 **此刻仍在活跃目录里** 的 ID 会被 **追加** 进右侧勾选(不会清空你已选的人)。
|
|
77
|
+
- 若模板里有 ID 暂不在目录(例如对方访客已停用),套用 **不会** 自动带上这些 ID;需要你改模板、或等对方恢复为活跃访客后再套用 / 勾选。
|
|
78
|
+
|
|
79
|
+
编辑某一模板时,选择器里 **不会** 把「当前正在编辑的这一条」放进套用下拉,避免无意义的自引用。
|
|
80
|
+
|
|
81
|
+
## 维护「域成员模板」
|
|
82
|
+
|
|
83
|
+
在 **设置 → 域成员模板**:
|
|
84
|
+
|
|
85
|
+
1. **新建**:填模板显示名称,用访客选择器(与域成员相同的双栏界面)选好一组人,保存。
|
|
86
|
+
2. **编辑**:在列表中选一条,改名称或人员后保存。
|
|
87
|
+
3. **删除**:删除前会有确认提示。
|
|
88
|
+
|
|
89
|
+

|
|
90
|
+
|
|
91
|
+
模板 **不会** 自动同步到任何域;只是在 **域管理 → 成员** 弹窗里作为「一键追加勾选」的快捷方式。真正生效仍以你在成员弹窗里 **确认保存** 后的结果为准。
|
|
92
|
+
|
|
93
|
+
## 与文档邀请的区别
|
|
94
|
+
|
|
95
|
+
- **域成员**:决定谁能 **完整进入** 受限域(与创建者同级入口)、能否在该域 **新建文档** 等。
|
|
96
|
+
- **文档级邀请**(`document_invites` 叠加层):细到单篇文档。非域成员也可只被邀请到某几篇文档,此时在域侧往往是 **受限入口**,不能随意在域内开新档。详见 [文档级邀请](../core-concepts/invitation.md)。
|
|
97
|
+
|
|
98
|
+
> 注意:邀请与域成员**互斥**——已是域成员的人不能被邀请。
|
|
99
|
+
|
|
100
|
+
## 设计取舍
|
|
101
|
+
|
|
102
|
+
- **受限域** mdocs偏向于小规模团队文档维护,在设计之初并未考虑引入组织架构的复杂管理能力。但很多场景下,存在团队成员这一概念,因此引入受限域,只允许团队成员进入
|
|
103
|
+
- **成员模板** 项目不维护组织架构,因此受限域的域成员需要重复添加,为了解决该问题,引入成员模板导入功能,避免重复行为
|
|
104
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-drafts
|
|
3
|
+
name: "草稿与同步"
|
|
4
|
+
description: "编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用**本地优先 + 按需发布**的草稿机制来解决这个问题。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/drafts.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 草稿与同步
|
|
10
|
+
|
|
11
|
+
## 设计意图
|
|
12
|
+
|
|
13
|
+
编辑环境中存在一个天然矛盾:用户希望内容「随时保存,永不丢失」,但网络可能不稳定,服务器可能暂时不可用。mdocs 用**本地优先 + 按需发布**的草稿机制来解决这个问题。
|
|
14
|
+
|
|
15
|
+
## 架构
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
用户编辑
|
|
19
|
+
│
|
|
20
|
+
▼
|
|
21
|
+
Lexical 编辑器(富文本)
|
|
22
|
+
│
|
|
23
|
+
├── 自动保存(1000ms 防抖)──────────────────┐
|
|
24
|
+
│ │ │
|
|
25
|
+
│ ▼ │
|
|
26
|
+
│ IndexedDB(浏览器本地数据库) │
|
|
27
|
+
│ 存储:正文 + 开编 commit(localBaseCommitId)│
|
|
28
|
+
│ │
|
|
29
|
+
├── 自动发布(空闲 30 秒后)───────────────────┤
|
|
30
|
+
│ │ (每 10 秒扫描一次) │
|
|
31
|
+
│ ▼ │
|
|
32
|
+
│ 后端 API(更新正文 + 提交图) │
|
|
33
|
+
│ │
|
|
34
|
+
├── 手动「发布」──────────────────────────────┤
|
|
35
|
+
│ │
|
|
36
|
+
└── 失焦 / 切换标签页 ────────────────────────┘
|
|
37
|
+
立即保存当前内容
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 本地数据分工(v0.7.9+)
|
|
41
|
+
|
|
42
|
+
| 数据 | 作用 |
|
|
43
|
+
|------|------|
|
|
44
|
+
| **IndexedDB 草稿** | 未发布正文、标题、开编时的 `localBaseCommitId` |
|
|
45
|
+
| **activeDocMeta**(内存) | 当前打开这篇的**服务端元信息**(权限、路径、owner、当前 head 等),供界面共用;**不含正文** |
|
|
46
|
+
| **编辑器** | 显示与编辑正文;有草稿时以草稿为准,无草稿时以服务器 GET 为准 |
|
|
47
|
+
|
|
48
|
+
打开文档时:**一定会请求服务器**更新 meta;正文则 **有草稿读草稿、无草稿读服务器**,二者互斥,不会把两套正文混在一个对象里。
|
|
49
|
+
|
|
50
|
+
## 三层保存策略
|
|
51
|
+
|
|
52
|
+
| 触发时机 | 保存目标 | 说明 |
|
|
53
|
+
|---------|---------|------|
|
|
54
|
+
| 编辑后 1 秒无操作 | IndexedDB | 防抖,避免频繁写入 |
|
|
55
|
+
| 编辑器失焦(blur) | IndexedDB | 切换到其他元素时立即保存 |
|
|
56
|
+
| 标签页隐藏(visibilitychange) | IndexedDB | 用户切走或关闭标签时保底 |
|
|
57
|
+
|
|
58
|
+
补充说明:
|
|
59
|
+
|
|
60
|
+
- **首次编辑**时才创建草稿(不是打开文档就创建)。
|
|
61
|
+
- 首次落盘会记录 **`localBaseCommitId`**(开编时服务端 head)。
|
|
62
|
+
- 后续自动保存只更新正文和标题,**不**重置开编基准。
|
|
63
|
+
|
|
64
|
+
## 发布流程
|
|
65
|
+
|
|
66
|
+
### 自动发布(可选)
|
|
67
|
+
|
|
68
|
+
在 [设置](./settings.md) 中开启「自动同步至云端」后:
|
|
69
|
+
|
|
70
|
+
- **每 10 秒**扫描 IndexedDB;
|
|
71
|
+
- 某篇草稿 **超过 30 秒** 没有新的自动保存 → 尝试发布。
|
|
72
|
+
|
|
73
|
+
### 手动发布
|
|
74
|
+
|
|
75
|
+
1. 点击「发布」
|
|
76
|
+
2. 编辑器内容序列化后 `PUT` 到服务器(带开编 commit 做版本校验)
|
|
77
|
+
3. **成功后**:删除本地草稿 → 再 GET 拉取最新 meta;正文与刚发布内容一致时**不重载编辑器 DOM**(避免视口跳动),仅在服务端正文不一致时才整棵刷新编辑器
|
|
78
|
+
|
|
79
|
+
### 无草稿也能发布
|
|
80
|
+
|
|
81
|
+
若打开后尚未触发自动保存(尚无 IndexedDB 草稿),仍可直接发布:内容以编辑器为准,版本号以当前 meta 中的 head 为准。
|
|
82
|
+
|
|
83
|
+
## 发布失败
|
|
84
|
+
|
|
85
|
+
无论自动还是手动,失败时草稿一般仍保留在本地。
|
|
86
|
+
|
|
87
|
+
| 情况 | 行为 |
|
|
88
|
+
|------|------|
|
|
89
|
+
| **任意自动发布失败**(v0.8.5+) | 草稿标记 `publishError`,**停止自动重试**;设置页「未发布草稿」显示失败原因;手动点「发布」会先清除标记再重试 |
|
|
90
|
+
| **缺少版本基准** | 多见于旧版创建的目录描述(`___desc___.md`);升级到 **0.8.5+** 并重启服务后重新打开该目录可恢复;或删除本地草稿 |
|
|
91
|
+
| **自动发布 404** | 服务端文档已删、本地仍有草稿;可 **另存为新文档** |
|
|
92
|
+
| **409 版本冲突** | 进入 [版本冲突与合并](./merge-conflicts.md) 流程 |
|
|
93
|
+
|
|
94
|
+
重新打开文档且服务端已有 `headCommitId` 时,会自动补写草稿的 `localBaseCommitId` 并清除「缺版本基准」类失败标记。
|
|
95
|
+
|
|
96
|
+
## 断网场景
|
|
97
|
+
|
|
98
|
+
- **断网时**:继续编辑,草稿在 IndexedDB
|
|
99
|
+
- **重新打开**:有草稿则恢复草稿正文;meta 仍会从服务器 GET(需联网)
|
|
100
|
+
|
|
101
|
+
## 拉取更新(Pull)
|
|
102
|
+
|
|
103
|
+
- **无未发布草稿**:可拉取远端最新正文与 meta。
|
|
104
|
+
- **有未发布草稿**:不覆盖式 pull,避免误盖本地副本。
|
|
105
|
+
|
|
106
|
+
## 设计取舍
|
|
107
|
+
|
|
108
|
+
- **本地优先**:编辑不依赖网络;恢复后自动或手动发布
|
|
109
|
+
- **发布后强制对齐**:删草稿 + GET,减少「单用户自动发布后又冲突」的困惑
|
|
110
|
+
- **IndexedDB**:容量大、异步,不阻塞 UI
|
|
111
|
+
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-flowchart
|
|
3
|
+
name: "流程图生成"
|
|
4
|
+
description: "mdocs 的流程图基于 **Meta2d** 绘图引擎,设计目标是让用户像使用 Visio 或 draw.io 一样拖拽绘制,同时将图表数据嵌入文档内容。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/flowchart.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 流程图生成
|
|
10
|
+
|
|
11
|
+
## 设计思路
|
|
12
|
+
|
|
13
|
+
mdocs 的流程图基于 **Meta2d** 绘图引擎,设计目标是让用户像使用 Visio 或 draw.io 一样拖拽绘制,同时将图表数据嵌入文档内容。
|
|
14
|
+
|
|
15
|
+
## 插入方式
|
|
16
|
+
|
|
17
|
+
在编辑器新行中输入以下内容后回车:
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
---meta2d---
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
编辑器会自动识别并打开 Meta2d 画布编辑器。
|
|
24
|
+
|
|
25
|
+
## 数据格式
|
|
26
|
+
|
|
27
|
+
图表在文档中以 `---meta2d---` 围栏块的形式内嵌存储:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
---meta2d---
|
|
31
|
+
{ "pens": [ … ] }
|
|
32
|
+
---/meta2d---
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
编辑器渲染时:
|
|
36
|
+
- 识别到 `---meta2d---` 块 → 调用 canvas2svg 渲染为 SVG 预览
|
|
37
|
+
- 双击块 → 打开 Meta2d 画布编辑器,可拖拽编辑
|
|
38
|
+
- 保存 → 将 JSON 写回文档内容
|
|
39
|
+
|
|
40
|
+
## 编辑器界面
|
|
41
|
+
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
## 支持的图形
|
|
45
|
+
|
|
46
|
+
矩形、圆角矩形、圆形、菱形、三角形、五边形、文本、线条、数据节点、数据库、文档、显示、手动输入、并行、注释、子流程、队列、内部/外部存储等。
|
|
47
|
+
|
|
48
|
+
## 设计取舍
|
|
49
|
+
|
|
50
|
+
- **为什么用 Meta2d 而非 Mermaid**:Mermaid 适合由文本生成图表,但交互式编辑体验不够直观。Meta2d 提供了拖拽式 GUI 编辑器,更接近白板体验
|
|
51
|
+
- **数据内嵌在文档内容中**:图表以 JSON 格式内嵌在文档内容里,随文档一起存储,复制、备份都很方便
|
|
52
|
+
|
|
53
|
+
## Markmap 思维导图
|
|
54
|
+
|
|
55
|
+
### 使用方式
|
|
56
|
+
|
|
57
|
+
在编辑器中创建 `markmap` 代码块:
|
|
58
|
+
|
|
59
|
+
````markdown
|
|
60
|
+
```markmap
|
|
61
|
+
# 根节点
|
|
62
|
+
## 分支 1
|
|
63
|
+
### 子节点 1.1
|
|
64
|
+
### 子节点 1.2
|
|
65
|
+
## 分支 2
|
|
66
|
+
```
|
|
67
|
+
````
|
|
68
|
+
|
|
69
|
+
### 特性
|
|
70
|
+
|
|
71
|
+
- **Markdown 语法**:使用标准 Markdown 标题层级(`#`)定义树形结构
|
|
72
|
+
- **实时渲染**:编辑 Markdown 时下方实时预览思维导图
|
|
73
|
+
- **交互一致**:与 Mermaid 代码块交互方式完全相同
|
|
74
|
+
- 点击内部显示源码编辑器
|
|
75
|
+
- 点击外部隐藏源码,只显示思维导图
|
|
76
|
+
- 点击图表进入全屏预览模式
|
|
77
|
+
- **全屏预览**:支持缩放、拖拽,查看复杂导图更方便
|
|
78
|
+
- **错误提示**:Markdown 语法有误时显示红色错误框
|
|
79
|
+
|
|
80
|
+
### 与 Mermaid 的区别
|
|
81
|
+
|
|
82
|
+
| 特性 | Markmap | Mermaid |
|
|
83
|
+
|------|----------|---------|
|
|
84
|
+
| 语法 | Markdown 标题层级 | Mermaid 专有语法 |
|
|
85
|
+
| 用途 | 思维导图、知识树 | 流程图、时序图、类图等 |
|
|
86
|
+
| 交互 | 点击折叠/展开节点 | 静态渲染 |
|
|
87
|
+
| 适合场景 | 头脑风暴、知识梳理 | 技术架构、业务流程 |
|
|
88
|
+
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: usage-markdown
|
|
3
|
+
name: "编辑体验"
|
|
4
|
+
description: "mdocs 的编辑器基于 Lexical(Meta 开源的富文本引擎),配合 `@lobehub/editor` 插件体系。核心思路是:**用富文本编辑,以 JSON 存储**。"
|
|
5
|
+
keywords: []
|
|
6
|
+
source: usage/markdown.md
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# 编辑体验
|
|
10
|
+
|
|
11
|
+
## 设计思路
|
|
12
|
+
|
|
13
|
+
mdocs 的编辑器基于 Lexical(Meta 开源的富文本引擎),配合 `@lobehub/editor` 插件体系。核心思路是:**用富文本编辑,以 JSON 存储**。
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
编辑时
|
|
17
|
+
用户操作 → Lexical JSON(保留全部格式信息)
|
|
18
|
+
自动保存 → IndexedDB(Lexical JSON)
|
|
19
|
+
|
|
20
|
+
发布时
|
|
21
|
+
内容写入 → 文件系统(Lexical JSON 文件)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
这意味着:
|
|
25
|
+
|
|
26
|
+
- 编辑时享受完整的富文本体验(标题、加粗、表格、代码块等)
|
|
27
|
+
- 文档以 Lexical JSON 格式持久化,保留全部语义信息,重新打开时精确恢复
|
|
28
|
+
- 由于是自有格式,文档**只能由 mdocs 加载**(未来会提供导出 Markdown 功能)
|
|
29
|
+
|
|
30
|
+
## Markdown 导入
|
|
31
|
+
|
|
32
|
+
mdocs 支持直接粘贴或通过 API 传入 Markdown 文本,后端会自动转换为 Lexical JSON 存储。
|
|
33
|
+
|
|
34
|
+
### 粘贴 Markdown
|
|
35
|
+
|
|
36
|
+
在编辑器中直接粘贴(`Ctrl+V`)Markdown 文本,内容会按富文本格式渲染,保留标题、粗体、列表、表格、代码块等结构。
|
|
37
|
+
|
|
38
|
+
### API / CLI 传入 Markdown
|
|
39
|
+
|
|
40
|
+
通过 API 或命令行客户端创建/更新文档时,传入的 Markdown 内容会自动转换:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# CLI 创建文档,直接传 Markdown
|
|
44
|
+
node ~/.mdocs-cli/mdocs.mjs create \
|
|
45
|
+
--name "笔记.md" \
|
|
46
|
+
--content "# 标题\n\n这是**粗体**和*斜体*"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
转换能力包括:
|
|
50
|
+
- 标题 h1-h6、段落、换行
|
|
51
|
+
- 粗体/斜体/删除线/行内代码/超链接
|
|
52
|
+
- 有序/无序列表(支持嵌套)
|
|
53
|
+
- 代码块(保留语言标识)
|
|
54
|
+
- 引用块、分隔线
|
|
55
|
+
- 表格(含表头、合并单元格)
|
|
56
|
+
|
|
57
|
+
## 编辑器功能
|
|
58
|
+
|
|
59
|
+
### 富文本工具栏
|
|
60
|
+
|
|
61
|
+
编辑器顶部提供了格式化工具栏,支持斜杠命令(输入 `/` 触发):
|
|
62
|
+
|
|
63
|
+
- **撤销 / 重做**
|
|
64
|
+
- **文档首尾插行**:在全文最上方或最后一行之后插入空段落,光标进入新行
|
|
65
|
+
- **标题**:H1 ~ H3
|
|
66
|
+
- **文本格式**:加粗、斜体、行内代码
|
|
67
|
+
- **插入元素**:表格、链接、图片、分割线、数学公式(TeX)、Meta2d、Markmap
|
|
68
|
+
- **代码块**:基于 CodeMirror 的代码编辑器,支持语法高亮
|
|
69
|
+
- **文件附件**:上传并插入文件
|
|
70
|
+
|
|
71
|
+
斜杠菜单可搜索上述插入项(含 Meta2d / Markmap)。
|
|
72
|
+
|
|
73
|
+
### 大纲面板
|
|
74
|
+
|
|
75
|
+
编辑器右侧自动提取文档标题层级,生成可点击的导航大纲,方便在长文档中快速跳转。
|
|
76
|
+
|
|
77
|
+

|
|
78
|
+
|
|
79
|
+
### 文档信息菜单
|
|
80
|
+
|
|
81
|
+
编辑器工具栏右侧提供文档信息入口(三条线图标),点击可查看:
|
|
82
|
+
|
|
83
|
+
**元信息区**
|
|
84
|
+
- **创建者**:显示访客昵称,未设置昵称时显示 visitorId 前 8 位
|
|
85
|
+
- **创建时间**:文档创建的本地化日期格式
|
|
86
|
+
- **大小**:文件体积(KB/MB 自动适配)
|
|
87
|
+
- **上次编辑**:最后修改的本地化时间
|
|
88
|
+
|
|
89
|
+
**操作区**
|
|
90
|
+
- **收藏/取消收藏**:一键切换当前文档的收藏状态
|
|
91
|
+
- **修改文章权限**:后续版本开放完整的权限修改对话框
|
|
92
|
+
|
|
93
|
+
> 💡 点击菜单外部区域可自动关闭下拉菜单。收藏按钮 hover 时有缩放动画效果。
|
|
94
|
+
|
|
95
|
+
### 流程图
|
|
96
|
+
|
|
97
|
+
支持 **Meta2d** 流程图,输入 `---meta2d---` 后回车即可打开画布编辑器,拖拽绘制流程图。
|
|
98
|
+
|
|
99
|
+
详见[流程图生成](./flowchart.md)。
|
|
100
|
+
|
|
101
|
+
## 设计取舍
|
|
102
|
+
|
|
103
|
+
- **选择 Lexical 而非 Prosemirror/Slate**:Lexical 对 React 生态更友好,插件系统清晰,且 `@lobehub/editor` 提供了开箱即用的工具栏和斜杠菜单。只需在lobehub项目基础上进行额外开发,避免重复造轮子
|
|
104
|
+
- **JSON 存储**:保留完整的富文本结构,重新打开时精确还原编辑状态。代价是数据不能直接用文本编辑器阅读——未来会提供 Markdown 导出
|
|
105
|
+
|