Files
aitu/apps/web/index.html
T
2026-02-08 22:44:36 +08:00

248 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>