248 lines
11 KiB
HTML
248 lines
11 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<!-- 权限策略:禁止 unload 事件(不影响 beforeunload) -->
|
||
<!-- 基本 SEO Meta 标签 (中文) -->
|
||
<title>OpenTu - AI图片视频创作</title>
|
||
<meta
|
||
name="description"
|
||
content="OpenTu 是一款强大的AI图片视频创作工具(https://github.com/ljquan/aitu),集成思维导图、流程图等功能。基于 Plait 框架开发,支持插件扩展,提供自动保存、无限画布等特性。爱创作,图未来。"
|
||
/>
|
||
<meta
|
||
name="keywords"
|
||
content="OpenTu,白板工具,白板,思维导图,流程图,开源白板,开源思维导图,在线绘图,在线白板,协作工具,协作白板,Plait 框架"
|
||
/>
|
||
<!-- 基本 SEO Meta 标签 (英文) -->
|
||
<meta
|
||
name="description"
|
||
lang="en"
|
||
content="OpenTu is a powerful open-source whiteboard tool featuring mind mapping and flowchart capabilities. Built on the Plait framework, it offers plugin extensibility, auto-save, infinite canvas, and more. Love Creation, Visualize the Future."
|
||
/>
|
||
<meta
|
||
name="keywords"
|
||
lang="en"
|
||
content="OpenTu,whiteboard tool, whiteboard,mind mapping,flowchart,open source whiteboard, open source mind mapping,online drawing,collaboration tool, collaboration whiteboard,Plait framework"
|
||
/>
|
||
<!-- Open Graph Meta 标签 (中文) -->
|
||
<meta
|
||
property="og:title"
|
||
content="OpenTu - AI图片视频创作 | 思维导图 | 流程图 | 白板 | 协作白板"
|
||
/>
|
||
<meta
|
||
property="og:description"
|
||
content="OpenTu 一体化AI图片视频创作工具(在线白板 | 协作白板),支持思维导图、流程图,基于 Plait 框架开发"
|
||
/>
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="https://opentu.ai" />
|
||
<meta property="og:site_name" content="OpenTu" />
|
||
<!-- Open Graph Meta 标签 (英文) -->
|
||
<meta
|
||
property="og:title"
|
||
lang="en"
|
||
content="OpenTu - Open Source Whiteboard | Mind Mapping | Flowchart | Whiteboard | Collaboration Whiteboard"
|
||
/>
|
||
<meta
|
||
property="og:description"
|
||
lang="en"
|
||
content="An integrated open-source whiteboard tool(online whiteboard | collaboration whiteboard) supporting mind mapping and flowcharts, built on the Plait framework"
|
||
/>
|
||
<!-- Twitter Card Meta 标签 (英文) -->
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
<meta
|
||
name="twitter:title"
|
||
content="OpenTu - Open Source Whiteboard | Mind Mapping | Flowchart | Whiteboard | Collaboration Whiteboard"
|
||
/>
|
||
<meta
|
||
name="twitter:description"
|
||
content="An integrated open-source whiteboard tool(online whiteboard | collaboration whiteboard) supporting mind mapping and flowcharts, built on the Plait framework"
|
||
/>
|
||
<!-- 其他重要 Meta 标签 -->
|
||
<meta name="robots" content="index, follow" />
|
||
<meta name="author" content="OpenTu Team" />
|
||
<link rel="canonical" href="https://opentu.ai" />
|
||
<!-- 语言替代链接 -->
|
||
<link rel="alternate" hreflang="zh-CN" href="https://opentu.ai" />
|
||
<!-- <link rel="alternate" hreflang="en" href="https://drawnix.com/en"> -->
|
||
<link rel="alternate" hreflang="x-default" href="https://opentu.ai" />
|
||
<!-- 结构化数据 (JSON-LD) - 中英双语 -->
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "SoftwareApplication",
|
||
"name": "OpenTu",
|
||
"alternateName": [
|
||
"OpenTu",
|
||
"AI图片视频创作",
|
||
"Open Source Whiteboard Tool"
|
||
],
|
||
"description": {
|
||
"zh-CN": "OpenTu 是一款强大的AI图片视频创作工具,集成思维导图、流程图等功能。基于 Plait 框架开发,支持插件扩展,提供自动保存、无限画布等特性。",
|
||
"en": "OpenTu is a powerful open-source whiteboard tool featuring mind mapping and flowchart capabilities. Built on the Plait framework, it offers plugin extensibility, auto-save, infinite canvas, and more."
|
||
},
|
||
"url": "https://opentu.ai",
|
||
"applicationCategory": "DesignApplication",
|
||
"operatingSystem": "Any",
|
||
"offers": {
|
||
"@type": "Offer",
|
||
"price": "0",
|
||
"priceCurrency": "USD"
|
||
},
|
||
"creator": {
|
||
"@type": "Organization",
|
||
"name": "OpenTu Team"
|
||
},
|
||
"keywords": [
|
||
"whiteboard",
|
||
"mind mapping",
|
||
"flowchart",
|
||
"open source",
|
||
"思维导图",
|
||
"流程图",
|
||
"白板"
|
||
],
|
||
"inLanguage": ["zh-CN", "en"],
|
||
"license": "https://github.com/ljquan/aitu/blob/master/LICENSE"
|
||
}
|
||
</script>
|
||
<!-- base href 由构建工具处理,CDN 模式下使用相对路径 -->
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
|
||
<meta name="app-version" content="0.5.93" />
|
||
|
||
<link
|
||
rel="icon"
|
||
type="image/svg+xml"
|
||
sizes="16x16"
|
||
href="./icons/favicon-16x16.svg"
|
||
/>
|
||
<link
|
||
rel="icon"
|
||
type="image/svg+xml"
|
||
sizes="32x32"
|
||
href="./icons/favicon-32x32.svg"
|
||
/>
|
||
<link rel="icon" type="image/svg+xml" href="./icons/favicon-new.svg" />
|
||
<link rel="icon" type="image/ico" href="./favicon.ico" />
|
||
|
||
<!-- PWA Manifest -->
|
||
<link rel="manifest" href="./manifest.json?v=0.1.0" />
|
||
|
||
<!-- PWA Meta Tags -->
|
||
<meta name="theme-color" content="#ffffff" />
|
||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
|
||
<meta name="apple-mobile-web-app-title" content="OpenTu" />
|
||
<meta name="mobile-web-app-capable" content="yes" />
|
||
<meta name="msapplication-TileColor" content="#ffffff" />
|
||
<meta name="msapplication-tap-highlight" content="no" />
|
||
|
||
<!-- Apple Touch Icons -->
|
||
<link
|
||
rel="apple-touch-icon"
|
||
sizes="192x192"
|
||
href="./icons/icon-192x192.svg"
|
||
/>
|
||
|
||
<!-- Windows Tiles -->
|
||
<meta name="msapplication-TileImage" content="./icons/icon-192x192.svg" />
|
||
<meta
|
||
name="msapplication-square310x310logo"
|
||
content="./icons/icon-512x512.svg"
|
||
/>
|
||
|
||
<link rel="stylesheet" href="./src/styles.scss" />
|
||
|
||
<!-- CDN 智能选择器(可选,用于提前检测最佳 CDN) -->
|
||
<script src="./cdn-config.js" defer></script>
|
||
</head>
|
||
<body>
|
||
<div id="root"></div>
|
||
<script type="module" src="./src/main.tsx"></script>
|
||
</body>
|
||
<!-- PostHog Analytics -->
|
||
<!-- 本地开发环境(localhost/127.0.0.1)默认不加载,除非 URL 带 report=1 参数 -->
|
||
<script>
|
||
(function() {
|
||
var isLocalDev = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';
|
||
var forceReport = new URLSearchParams(window.location.search).get('report') === '1';
|
||
|
||
// 本地开发环境且没有 report=1 参数时,不加载 PostHog
|
||
if (isLocalDev && !forceReport) {
|
||
return;
|
||
}
|
||
|
||
!(function (t, e) {
|
||
var o, n, p, r;
|
||
e.__SV ||
|
||
(window.posthog && window.posthog.__loaded) ||
|
||
((window.posthog = e),
|
||
(e._i = []),
|
||
(e.init = function (i, s, a) {
|
||
function g(t, e) {
|
||
var o = e.split('.');
|
||
2 == o.length && ((t = t[o[0]]), (e = o[1])),
|
||
(t[e] = function () {
|
||
t.push([e].concat(Array.prototype.slice.call(arguments, 0)));
|
||
});
|
||
}
|
||
((p = t.createElement('script')).type = 'text/javascript'),
|
||
(p.crossOrigin = 'anonymous'),
|
||
(p.async = !0),
|
||
(p.src =
|
||
s.api_host.replace('.i.posthog.com', '-assets.i.posthog.com') +
|
||
'/static/array.js'),
|
||
(r = t.getElementsByTagName('script')[0]).parentNode.insertBefore(
|
||
p,
|
||
r
|
||
);
|
||
var u = e;
|
||
for (
|
||
void 0 !== a ? (u = e[a] = []) : (a = 'posthog'),
|
||
u.people = u.people || [],
|
||
u.toString = function (t) {
|
||
var e = 'posthog';
|
||
return (
|
||
'posthog' !== a && (e += '.' + a), t || (e += ' (stub)'), e
|
||
);
|
||
},
|
||
u.people.toString = function () {
|
||
return u.toString(1) + '.people (stub)';
|
||
},
|
||
o =
|
||
'init Dr Ur fi Lr zr ci Or jr capture Ai calculateEventProperties qr register register_once register_for_session unregister unregister_for_session Jr getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Gr Br createPersonProfile Vr Cr Kr opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing Hr debug O Wr getPageViewId captureTraceFeedback captureTraceMetric Rr'.split(
|
||
' '
|
||
),
|
||
n = 0;
|
||
n < o.length;
|
||
n++
|
||
)
|
||
g(u, o[n]);
|
||
e._i.push([i, s, a]);
|
||
}),
|
||
(e.__SV = 1));
|
||
})(document, window.posthog || []);
|
||
posthog.init('phc_13URtidKwTR9POlwnB153NsN99shRykvPguKWf3vZVn', {
|
||
api_host: 'https://us.i.posthog.com',
|
||
defaults: '2025-11-30',
|
||
person_profiles: 'identified_only',
|
||
// 关闭 Session Recording,避免 rrweb 主线程开销(wheel/setInterval)与 413
|
||
disable_session_recording: true,
|
||
// 限制单次 flush 体积,避免 413 Content Too Large
|
||
rate_limiting: { events_per_second: 10, events_burst_limit: 30 },
|
||
request_queue: { flush_interval_ms: 2000 },
|
||
// 白板 SPA 点击多,关闭 autocapture 减少事件量与请求体
|
||
autocapture: false,
|
||
// 静默网络错误;413 时打 debug 避免重试风暴干扰
|
||
on_xhr_error: function(err) {
|
||
var code = err && (typeof err.statusCode !== 'undefined' ? err.statusCode : err.status);
|
||
if (code === 413) {
|
||
if (typeof console !== 'undefined' && console.debug) {
|
||
console.debug('[PostHog] 413 Content Too Large, batch dropped');
|
||
}
|
||
}
|
||
},
|
||
});
|
||
})();
|
||
</script>
|
||
</html>
|