Skip to content

Commit 4e96f49

Browse files
committed
feat(docs): add demo WebM videos and 2.1.2 演示视频 page
- Record overview, rule-engine datasource, and instruct flows from demo.fluxmq.com via scripts/record-demo-videos.mjs (npm run record:demos). - Ship WebM under static/video; document regeneration in static/video/README. - Add product/demos to version-2.1.2 sidebar. Made-with: Cursor
1 parent 68b128b commit 4e96f49

8 files changed

Lines changed: 155 additions & 2 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"clear": "docusaurus clear",
1212
"serve": "docusaurus serve",
1313
"write-translations": "docusaurus write-translations",
14-
"write-heading-ids": "docusaurus write-heading-ids"
14+
"write-heading-ids": "docusaurus write-heading-ids",
15+
"record:demos": "node scripts/record-demo-videos.mjs"
1516
},
1617
"dependencies": {
1718
"@docusaurus/core": "3.6.2",

scripts/record-demo-videos.mjs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#!/usr/bin/env node
2+
/**
3+
* 使用 Playwright 从 demo.fluxmq.com 录制短演示视频(WebM),输出到 static/video/。
4+
*
5+
* 用法:
6+
* cd fluxmq-doc && npm install playwright --no-save && npx playwright install chromium
7+
* node scripts/record-demo-videos.mjs
8+
*
9+
* 环境变量:
10+
* FLUXMQ_DEMO_USER / FLUXMQ_DEMO_PASS — 默认 fluxmq / fluxmq
11+
*/
12+
import { chromium } from 'playwright';
13+
import fs from 'fs';
14+
import path from 'path';
15+
import { fileURLToPath } from 'url';
16+
17+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
18+
const ROOT = path.join(__dirname, '..');
19+
const OUT = path.join(ROOT, 'static', 'video');
20+
21+
const BASE = process.env.FLUXMQ_DEMO_URL || 'http://demo.fluxmq.com';
22+
const USER = process.env.FLUXMQ_DEMO_USER || 'fluxmq';
23+
const PASS = process.env.FLUXMQ_DEMO_PASS || 'fluxmq';
24+
25+
const delay = (ms) => new Promise((r) => setTimeout(r, ms));
26+
27+
async function login(page) {
28+
await page.goto(`${BASE}/#/login`, { waitUntil: 'domcontentloaded', timeout: 90000 });
29+
await delay(1000);
30+
await page.fill('input[name="username"]', USER);
31+
await page.fill('input[name="password"]', PASS);
32+
await page.click('button.ant-btn-primary');
33+
await delay(3500);
34+
}
35+
36+
async function recordClip(name, runner) {
37+
fs.mkdirSync(OUT, { recursive: true });
38+
const browser = await chromium.launch({ headless: true });
39+
const context = await browser.newContext({
40+
viewport: { width: 1280, height: 720 },
41+
recordVideo: { dir: OUT, size: { width: 1280, height: 720 } },
42+
});
43+
const page = await context.newPage();
44+
try {
45+
await runner(page);
46+
} finally {
47+
await context.close();
48+
await browser.close();
49+
}
50+
const files = fs
51+
.readdirSync(OUT)
52+
.filter((f) => f.endsWith('.webm'))
53+
.map((f) => ({ f, t: fs.statSync(path.join(OUT, f)).mtimeMs }))
54+
.sort((a, b) => b.t - a.t);
55+
if (!files.length) {
56+
console.warn(`No webm produced for ${name}`);
57+
return;
58+
}
59+
const latest = path.join(OUT, files[0].f);
60+
const target = path.join(OUT, `${name}.webm`);
61+
if (fs.existsSync(target)) fs.unlinkSync(target);
62+
fs.renameSync(latest, target);
63+
console.log('Wrote', target);
64+
}
65+
66+
async function main() {
67+
await recordClip('overview', async (page) => {
68+
await login(page);
69+
await page.goto(`${BASE}/index.html#/dashboard/overview`, {
70+
waitUntil: 'networkidle',
71+
timeout: 90000,
72+
}).catch(() => page.goto(`${BASE}/#/dashboard/overview`, { waitUntil: 'networkidle', timeout: 90000 }));
73+
await delay(4000);
74+
await page.mouse.wheel(0, 400);
75+
await delay(2000);
76+
});
77+
78+
await recordClip('rule-engine-datasource', async (page) => {
79+
await login(page);
80+
await page.goto(`${BASE}/index.html#/rule-engine/datasource`, {
81+
waitUntil: 'networkidle',
82+
timeout: 90000,
83+
}).catch(() => page.goto(`${BASE}/#/rule-engine/datasource`, { waitUntil: 'networkidle', timeout: 90000 }));
84+
await delay(5000);
85+
});
86+
87+
await recordClip('instruct', async (page) => {
88+
await login(page);
89+
await page.goto(`${BASE}/index.html#/instruct/index`, {
90+
waitUntil: 'networkidle',
91+
timeout: 90000,
92+
}).catch(() => page.goto(`${BASE}/#/instruct/index`, { waitUntil: 'networkidle', timeout: 90000 }));
93+
await delay(5000);
94+
});
95+
96+
console.log('Done. Files in', OUT);
97+
}
98+
99+
main().catch((e) => {
100+
console.error(e);
101+
process.exit(1);
102+
});

static/video/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# 演示视频(WebM)
2+
3+
本目录由仓库内脚本录制,也可将同名文件上传到 OBS/CDN 后把文档中的地址改为公网 URL。
4+
5+
## 生成
6+
7+
```bash
8+
cd fluxmq-doc
9+
npm install playwright --no-save
10+
npx playwright install chromium
11+
node scripts/record-demo-videos.mjs
12+
```
13+
14+
默认使用 `http://demo.fluxmq.com` 与账号 `fluxmq` / `fluxmq`,可通过环境变量 `FLUXMQ_DEMO_URL``FLUXMQ_DEMO_USER``FLUXMQ_DEMO_PASS` 覆盖。
15+
16+
## 文件说明
17+
18+
| 文件 | 内容概要 |
19+
|------|----------|
20+
| `overview.webm` | 控制台总览 / 仪表盘 |
21+
| `rule-engine-datasource.webm` | 规则引擎 — 数据源 |
22+
| `instruct.webm` | 指令消费列表 |
23+
24+
构建后访问路径为:`/video/<文件名>`(见 [产品演示视频](/product/demos))。

static/video/instruct.webm

698 KB
Binary file not shown.

static/video/overview.webm

683 KB
Binary file not shown.
736 KB
Binary file not shown.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 演示视频
2+
3+
以下视频基于在线演示环境录制,便于快速了解 FluxMQ 控制台主要能力。若浏览器无法播放 WebM,可使用 Chrome / Edge,或将视频下载后本地播放。
4+
5+
## 控制台总览
6+
7+
<video controls width="100%" preload="metadata">
8+
<source src="/video/overview.webm" type="video/webm" />
9+
</video>
10+
11+
## 规则引擎 · 数据源
12+
13+
<video controls width="100%" preload="metadata">
14+
<source src="/video/rule-engine-datasource.webm" type="video/webm" />
15+
</video>
16+
17+
## 指令消费
18+
19+
<video controls width="100%" preload="metadata">
20+
<source src="/video/instruct.webm" type="video/webm" />
21+
</video>
22+
23+
---
24+
25+
**说明:** 若仓库中尚未包含 `static/video/*.webm` 文件,请在 `fluxmq-doc` 目录执行 `node scripts/record-demo-videos.mjs` 生成;或将视频上传至对象存储后,将本页各 `<source src="...">` 改为公网地址。

versioned_sidebars/version-2.1.2-sidebars.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"items": [
1010
"README",
1111
"product/introduction",
12-
"product/core"
12+
"product/core",
13+
"product/demos"
1314
]
1415
},
1516
{

0 commit comments

Comments
 (0)