mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +00:00
阶段1 网络加速 - 发现隧道在跑 QUIC(ExecStart 丢了 --protocol http2), 实测 QUIC 可用率 48% vs HTTP/2 80%+,是重大性能回退。 恢复后公网延迟从 4141ms 降到 690ms(快 6 倍),可用率 92%。 - 优选 IP 结论:无效。hosts 覆盖确实生效了(日志里连的就是指定 IP), 但落点仍是 lax —— 运营商把所有 Cloudflare anycast 都路由到美西。 已清掉这段无效配置。 - BBR 不可用:设备是自定义内核 6.4.0-rc4-jsbsbxjxh66, 没编 tcp_bbr 模块也没配置项。改用 cubic + 调优: TCP 缓冲 4MB、tcp_fastopen=3、tcp_slow_start_after_idle=0 (长轮询场景关键)、tcp_tw_reuse=1。 阶段2 官网重做 - 拆出独立模块 relay/landing.py(relay.py 已两千多行, 再塞 HTML 没法看) - 信息结构参考成熟产品站:吸顶导航 / Hero / 九宫格功能 / 三步上手 / 下载 / FAQ / 页脚 - 保持白色简洁:底白、浅灰面板、细边框、大量留白 - logo 用内联 SVG(ICO 放 img 里实测是破图) - 管理入口从官网移除(管理不对外开放) 过程中被自己的测试抓到两个 bug: - 模块叫 site.py 会和 Python 标准库重名,import site 拿到的是标准库 - _logo() 里把 % 格式化和字符串拼接混用,直接抛 TypeError
197 lines
16 KiB
HTML
197 lines
16 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>ykxmz · 教室电脑手表遥控</title>
|
|
<meta name="description" content="老师用手表管教室里那台电脑:放课件、投图、下课关机,不用走回讲台。">
|
|
<link rel="icon" href="/favicon.ico">
|
|
<style>
|
|
*{box-sizing:border-box;margin:0;padding:0}
|
|
html{scroll-behavior:smooth}
|
|
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",
|
|
"Microsoft YaHei","PingFang SC",sans-serif;
|
|
background:#ffffff;color:#1a1d21;line-height:1.75;
|
|
-webkit-font-smoothing:antialiased}
|
|
a{color:inherit;text-decoration:none}
|
|
.wrap{max-width:960px;margin:0 auto;padding:0 24px}
|
|
|
|
/* 吸顶导航 */
|
|
nav{position:sticky;top:0;z-index:50;background:rgba(255,255,255,.86);
|
|
backdrop-filter:saturate(180%) blur(12px);
|
|
border-bottom:1px solid #e6e8eb}
|
|
.nav-in{display:flex;align-items:center;justify-content:space-between;
|
|
height:60px}
|
|
.brand{display:flex;align-items:center;gap:9px;font-weight:700;
|
|
font-size:17px;letter-spacing:-.2px}
|
|
.brand img{width:26px;height:26px;border-radius:7px}
|
|
.nav-links{display:flex;gap:26px;font-size:14px;color:#6b7280}
|
|
.nav-links a:hover{color:#1a1d21}
|
|
|
|
/* Hero */
|
|
.hero{padding:88px 0 72px;text-align:center}
|
|
.hero h1{font-size:46px;line-height:1.2;letter-spacing:-1.2px;
|
|
font-weight:800;margin-bottom:18px}
|
|
.hero p{font-size:18px;color:#6b7280;max-width:600px;margin:0 auto 34px}
|
|
.cta{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
|
|
.btn{display:inline-flex;align-items:center;gap:8px;
|
|
padding:12px 26px;border-radius:10px;font-weight:600;font-size:15px;
|
|
transition:all .15s}
|
|
.btn-p{background:#2563eb;color:#fff}
|
|
.btn-p:hover{background:#1d4ed8;transform:translateY(-1px)}
|
|
.btn-s{background:#fafbfc;color:#1a1d21;
|
|
border:1px solid #e6e8eb}
|
|
.btn-s:hover{border-color:#d1d5db;background:#f3f4f6}
|
|
.badge{display:inline-block;margin-top:22px;padding:4px 14px;
|
|
border-radius:999px;background:#eff6ff;color:#2563eb;
|
|
font-size:13px;font-weight:600}
|
|
|
|
/* 通用区段 */
|
|
section{padding:72px 0;border-top:1px solid #e6e8eb}
|
|
.sec-head{text-align:center;margin-bottom:48px}
|
|
.sec-head h2{font-size:30px;letter-spacing:-.6px;font-weight:700;
|
|
margin-bottom:10px}
|
|
.sec-head p{color:#6b7280;font-size:16px}
|
|
|
|
/* 功能网格 */
|
|
.feats{display:grid;gap:1px;background:#e6e8eb;
|
|
border:1px solid #e6e8eb;border-radius:14px;overflow:hidden}
|
|
@media(min-width:640px){.feats{grid-template-columns:repeat(3,1fr)}}
|
|
.feat{background:#ffffff;padding:28px 24px}
|
|
.feat-icon{color:#2563eb;margin-bottom:14px}
|
|
.feat-title{font-weight:650;font-size:16px;margin-bottom:6px}
|
|
.feat-desc{color:#6b7280;font-size:14px;line-height:1.7}
|
|
|
|
/* 三步 */
|
|
.steps{display:grid;gap:20px}
|
|
@media(min-width:640px){.steps{grid-template-columns:repeat(3,1fr)}}
|
|
.step{padding:26px 22px;border:1px solid #e6e8eb;border-radius:14px;
|
|
background:#fafbfc}
|
|
.step-num{width:30px;height:30px;border-radius:50%;background:#2563eb;
|
|
color:#fff;display:flex;align-items:center;justify-content:center;
|
|
font-weight:700;font-size:14px;margin-bottom:14px}
|
|
.step-title{font-weight:650;font-size:16px;margin-bottom:6px}
|
|
.step-desc{color:#6b7280;font-size:14px;line-height:1.7}
|
|
|
|
/* 下载 */
|
|
.dls{display:grid;gap:16px}
|
|
@media(min-width:760px){.dls{grid-template-columns:repeat(3,1fr)}}
|
|
.dl-card{border:1px solid #e6e8eb;border-radius:14px;padding:24px 20px;
|
|
display:flex;flex-direction:column;background:#ffffff;
|
|
transition:border-color .15s}
|
|
.dl-card:hover{border-color:#d1d5db}
|
|
.dl-head{display:flex;align-items:baseline;gap:8px;margin-bottom:4px}
|
|
.dl-tag{font-weight:700;font-size:17px}
|
|
.dl-who{color:#9ca3af;font-size:13px}
|
|
.dl-note{color:#6b7280;font-size:13px;margin-bottom:18px;flex:1}
|
|
.dl-btn{display:block;text-align:center;background:#2563eb;color:#fff;
|
|
padding:11px 16px;border-radius:9px;font-weight:600;font-size:14px;
|
|
transition:background .15s}
|
|
.dl-btn:hover{background:#1d4ed8}
|
|
.dl-file{color:#9ca3af;font-size:11px;margin-top:9px;text-align:center;
|
|
word-break:break-all}
|
|
.dl-soon{text-align:center;color:#9ca3af;font-size:14px;padding:11px 0;
|
|
border:1px dashed #e6e8eb;border-radius:9px}
|
|
.dl-req{color:#9ca3af;font-size:12px;margin-top:12px;text-align:center}
|
|
|
|
/* FAQ */
|
|
.faqs{max-width:720px;margin:0 auto}
|
|
.faq{border-bottom:1px solid #e6e8eb}
|
|
.faq summary{padding:20px 0;font-weight:600;font-size:16px;cursor:pointer;
|
|
list-style:none;display:flex;justify-content:space-between;
|
|
align-items:center;gap:16px}
|
|
.faq summary::-webkit-details-marker{display:none}
|
|
.faq-mark{width:9px;height:9px;border-right:2px solid #9ca3af;
|
|
border-bottom:2px solid #9ca3af;transform:rotate(45deg);
|
|
transition:transform .2s;flex:none;margin-right:4px}
|
|
.faq[open] .faq-mark{transform:rotate(-135deg)}
|
|
.faq-body{color:#6b7280;font-size:15px;padding:0 0 22px;line-height:1.8}
|
|
|
|
/* 页脚 */
|
|
footer{padding:52px 0 64px;border-top:1px solid #e6e8eb;
|
|
color:#6b7280;font-size:14px}
|
|
.foot-in{display:flex;justify-content:space-between;gap:24px;
|
|
flex-wrap:wrap;align-items:center}
|
|
.foot-links{display:flex;gap:22px}
|
|
.foot-links a:hover{color:#1a1d21}
|
|
.copy{color:#9ca3af;font-size:13px;margin-top:26px;text-align:center}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<nav><div class="wrap nav-in">
|
|
<a class="brand" href="/">
|
|
<svg width="26" height="26" viewBox="0 0 32 32" fill="none" aria-hidden="true"><rect x="3" y="3" width="26" height="26" rx="8" fill="#2563eb"/><rect x="10" y="9" width="12" height="14" rx="4" stroke="#fff" stroke-width="2"/><path d="M13 9V6h6v3M13 23v3h6v-3" stroke="#fff" stroke-width="2" stroke-linecap="round"/></svg>
|
|
<span>ykxmz</span>
|
|
</a>
|
|
<div class="nav-links">
|
|
<a href="#features">功能</a>
|
|
<a href="#how">怎么用</a>
|
|
<a href="#download">下载</a>
|
|
<a href="#faq">常见问题</a>
|
|
</div>
|
|
</div></nav>
|
|
|
|
<div class="wrap hero">
|
|
<h1>老师抬一下手腕<br>就能管教室那台电脑</h1>
|
|
<p>放课件、放音频、投图到大屏、看看有没有人在跑无关程序、下课关机 ——
|
|
不用走回讲台去点鼠标。</p>
|
|
<div class="cta">
|
|
<a class="btn btn-p" href="#download">下载安装</a>
|
|
<a class="btn btn-s" href="#how">先看看怎么用</a>
|
|
</div>
|
|
<div class="badge">最新版 1.7.1</div>
|
|
</div>
|
|
|
|
<section id="features"><div class="wrap">
|
|
<div class="sec-head">
|
|
<h2>上课用得上的,基本都在这</h2>
|
|
<p>手表上十个分页,常用操作都在第一屏</p>
|
|
</div>
|
|
<div class="feats"><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 5h18v11H3z"/><path d="M1 20h22"/></svg></div><div class="feat-title">屏幕查看</div><div class="feat-desc">手表上看教室里那台电脑在显示什么,顺手一键截屏存到手表</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M6 4l14 8-14 8z"/></svg></div><div class="feat-title">课件播放</div><div class="feat-desc">放音频、放视频、调音量、静音 —— 不用走回讲台去点鼠标</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="8.5" cy="9.5" r="1.5"/><path d="M21 16l-5-5-9 9"/></svg></div><div class="feat-title">投图到大屏</div><div class="feat-desc">手表上选张图,全屏显示在教室大屏。考试时贴个提示特别方便</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/></svg></div><div class="feat-title">传文件</div><div class="feat-desc">课件在两台机器之间来回倒腾,不用插 U 盘</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="6" width="12" height="12" rx="3"/><path d="M9 6V3h6v3M9 18v3h6v-3"/></svg></div><div class="feat-title">课堂专注</div><div class="feat-desc">一键限制游戏相关站点、关闭游戏窗口,下课一键恢复</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v10"/><path d="M6 6a9 9 0 1 0 12 0"/></svg></div><div class="feat-title">电源控制</div><div class="feat-desc">锁屏、睡眠、关机、重启,还能设「30 分钟后自动关机」</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12.5a10 10 0 0 1 14 0"/><path d="M8.5 16a5.5 5.5 0 0 1 7 0"/><circle cx="12" cy="19.5" r="1"/></svg></div><div class="feat-title">局域网优先</div><div class="feat-desc">手表和电脑在同一个 WiFi 时直连,几十毫秒,不绕服务器</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2l8 4v6c0 5-3.5 8.5-8 10-4.5-1.5-8-5-8-10V6z"/></svg></div><div class="feat-title">跨网络</div><div class="feat-desc">不在同一个网络时自动走中转,办公室也能管教室</div></div><div class="feat"><div class="feat-icon"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="10" width="16" height="11" rx="2"/><path d="M8 10V7a4 4 0 0 1 8 0v3"/></svg></div><div class="feat-title">可见可控</div><div class="feat-desc">屏幕被看时电脑上一定有提示条,关不掉;本机随时能掐断</div></div></div>
|
|
</div></section>
|
|
|
|
<section id="how"><div class="wrap">
|
|
<div class="sec-head">
|
|
<h2>三步装好</h2>
|
|
<p>电脑装一个程序,手表装一个 App,一台电脑配一次就行</p>
|
|
</div>
|
|
<div class="steps"><div class="step"><div class="step-num">1</div><div class="step-title">电脑端</div><div class="step-desc">在教室那台 Windows 电脑上运行安装包,填一个 6 位配对码,装完自动后台运行</div></div><div class="step"><div class="step-num">2</div><div class="step-title">手表端</div><div class="step-desc">在安卓手表上装 APK,首页点「局域网连接」或「输入配对码连接」</div></div><div class="step"><div class="step-num">3</div><div class="step-title">连上就用</div><div class="step-desc">配对一次之后,以后打开就自动连,不用再输数字</div></div></div>
|
|
</div></section>
|
|
|
|
<section id="download"><div class="wrap">
|
|
<div class="sec-head">
|
|
<h2>下载</h2>
|
|
<p>当前版本 1.7.1</p>
|
|
</div>
|
|
<div class="dls"><div class="dl-card"><div class="dl-head"><span class="dl-tag">电脑端</span><span class="dl-who">教室那台 Windows 电脑</span></div><div class="dl-note">装完自动后台运行</div><a class="dl-btn" href="/download/ykxmz-setup-1.7.1.exe">下载 安装包</a><div class="dl-file">ykxmz-setup-1.7.1.exe · 14.4 MB</div><div class="dl-req">Windows 10 / 11</div></div><div class="dl-card"><div class="dl-head"><span class="dl-tag">手表端</span><span class="dl-who">安卓手表</span></div><div class="dl-note">直接安装,不用 root</div><a class="dl-btn" href="/download/ykxmz-watch-1.7.1.apk">下载 APK</a><div class="dl-file">ykxmz-watch-1.7.1.apk · 0.2 MB</div><div class="dl-req">Android 7.0+</div></div><div class="dl-card"><div class="dl-head"><span class="dl-tag">服务器端</span><span class="dl-who">一台能上外网的小机器</span></div><div class="dl-note">只在跨网络时才需要</div><a class="dl-btn" href="/download/ykxmz-server-1.7.1.zip">下载 压缩包</a><div class="dl-file">ykxmz-server-1.7.1.zip · 0.2 MB</div><div class="dl-req">Debian / Ubuntu</div></div></div>
|
|
</div></section>
|
|
|
|
<section id="faq"><div class="wrap">
|
|
<div class="sec-head"><h2>常见问题</h2></div>
|
|
<div class="faqs"><details class="faq"><summary>手表连不上电脑怎么办?<span class="faq-mark"></span></summary><div class="faq-body">先确认电脑上程序在运行(任务管理器里找 ykxmz.exe)。如果被控端窗口提示「防火墙未放行」,点旁边的一键修复。还是不行就跑一次网络自检 —— 电脑上打开工具箱选 3,然后手表上点「检查服务器」。</div></details><details class="faq"><summary>为什么显示「延迟 2000 毫秒」这么慢?<span class="faq-mark"></span></summary><div class="faq-body">跨网络时数据要绕到中转服务器再回来,延迟取决于你那台小机器的线路。如果手表和电脑在同一个 WiFi,会自动走局域网直连,延迟通常只有几十毫秒。</div></details><details class="faq"><summary>需要另外买服务器吗?<span class="faq-mark"></span></summary><div class="faq-body">只有一个教室用的话不需要 —— 手表和电脑连同一个 WiFi 就能直连。要在办公室管教室才需要一台能上外网的小机器当中转。</div></details><details class="faq"><summary>配对码忘了怎么办?<span class="faq-mark"></span></summary><div class="faq-body">电脑上双击程序图标打开窗口就能看到。也可以在窗口里改一个自己好记的。</div></details><details class="faq"><summary>手表重装了还能连上原来的电脑吗?<span class="faq-mark"></span></summary><div class="faq-body">能。重新输一次那个 6 位配对码就行 —— 配对码本身就是钥匙。</div></details><details class="faq"><summary>屏幕被别人看着,我能知道吗?<span class="faq-mark"></span></summary><div class="faq-body">能。只要有人在看你的屏幕,电脑右上角就会出现一条红色提示条,没有开关能关掉它。电脑前面的人随时可以点「停止共享」断开。</div></details></div>
|
|
</div></section>
|
|
|
|
<footer><div class="wrap">
|
|
<div class="foot-in">
|
|
<div class="brand"><svg width="26" height="26" viewBox="0 0 32 32" fill="none" aria-hidden="true"><rect x="3" y="3" width="26" height="26" rx="8" fill="#2563eb"/><rect x="10" y="9" width="12" height="14" rx="4" stroke="#fff" stroke-width="2"/><path d="M13 9V6h6v3M13 23v3h6v-3" stroke="#fff" stroke-width="2" stroke-linecap="round"/></svg><span>ykxmz</span></div>
|
|
<div class="foot-links">
|
|
<a href="https://gitee.com/xmz7891/ykxmz" target="_blank" rel="noopener">源码</a>
|
|
<a href="https://gitee.com/xmz7891/ykxmz/releases" target="_blank" rel="noopener">历史版本</a>
|
|
<a href="#faq">常见问题</a>
|
|
</div>
|
|
</div>
|
|
<div class="copy">ykxmz · 教室电脑手表遥控</div>
|
|
</div></footer>
|
|
|
|
<script>
|
|
// 点导航链接后收起移动端(这里没做汉堡菜单,留个锚点平滑滚动就行)
|
|
document.querySelectorAll('a[href^="#"]').forEach(function (a) {
|
|
a.addEventListener('click', function (e) {
|
|
var target = document.querySelector(a.getAttribute('href'));
|
|
if (target) { e.preventDefault(); target.scrollIntoView({behavior:'smooth'}); }
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |