Files
observer/server/h5/index.html
T
admin a0b115d954 训练体系整合与标注单阶段化
- 标注:AI 预标注直写 labels_json(去候选确认两阶段);重叠去重(minIoU);全量标注按钮
- 训练:脚本迁移入 server/training/(Go 化 prepare_yolo/analyze_rfdetr,保留 train_server.py);tflite 产物自检并入训练流程(check_tflite)
- 数据目录/权重不进 git;.gitignore 迁移至仓库根
2026-08-26 18:22:56 +08:00

202 lines
9.7 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<meta name="format-detection" content="telephone=no">
<meta name="description" content="视野 App Android 版下载">
<title>视野 - App 下载</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
html, body { height: 100%; }
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", "Microsoft YaHei", Arial, sans-serif;
background: #f5f6f7; color: #1f2329; min-height: 100vh;
display: flex; justify-content: center;
}
.wrap { width: 100%; max-width: 420px; padding: 24px 24px 48px; }
/* ---------- 下载视图(非微信) ---------- */
.download-view { text-align: center; padding-top: 56px; }
.logo {
width: 84px; height: 84px; margin: 0 auto 18px; border-radius: 20px;
background: linear-gradient(145deg, #34c759, #1a9e4b);
display: flex; align-items: center; justify-content: center;
box-shadow: 0 10px 24px rgba(26, 158, 75, .28);
}
.logo svg { width: 46px; height: 46px; }
.app-name { font-size: 26px; font-weight: 700; letter-spacing: 2px; }
.app-slogan { margin-top: 6px; font-size: 14px; color: #8a9199; }
.version-tip { margin-top: 4px; font-size: 12px; color: #b0b6bd; }
.btn-download {
display: flex; align-items: center; justify-content: center; gap: 10px;
margin: 40px auto 0; width: 100%; max-width: 300px; height: 54px;
background: #07c160; border-radius: 27px; color: #fff; font-size: 18px; font-weight: 600;
text-decoration: none; box-shadow: 0 8px 20px rgba(7, 193, 96, .32);
transition: transform .1s ease;
}
.btn-download:active { transform: scale(.97); }
.btn-download svg { width: 22px; height: 22px; flex: none; }
.hint { margin-top: 18px; font-size: 12px; line-height: 1.9; color: #9aa1a9; }
/* ---------- 微信引导视图 ---------- */
.wechat-view { text-align: center; padding-top: 24px; }
.wechat-title { font-size: 20px; font-weight: 700; }
.wechat-sub { margin-top: 8px; font-size: 14px; color: #8a9199; }
.steps { margin: 28px auto 0; max-width: 300px; text-align: left; }
.step { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 18px; }
.step-num {
flex: none; width: 26px; height: 26px; border-radius: 50%;
background: #07c160; color: #fff; font-size: 14px; font-weight: 600;
display: flex; align-items: center; justify-content: center; margin-top: 1px;
}
.step-text { font-size: 15px; line-height: 1.7; color: #333; }
.step-text b { color: #07c160; }
.btn-copy {
display: inline-flex; align-items: center; gap: 8px;
margin-top: 28px; height: 46px; padding: 0 34px;
border: 1.5px solid #07c160; border-radius: 23px;
background: #fff; color: #07c160; font-size: 16px; font-weight: 600;
cursor: pointer;
}
.btn-copy:active { background: #f0fdf4; }
.btn-copy svg { width: 18px; height: 18px; }
.copy-ok { margin-top: 12px; font-size: 13px; color: #07c160; visibility: hidden; }
.copy-ok.show { visibility: visible; }
.foot { margin-top: 40px; font-size: 12px; color: #b0b6bd; text-align: center; line-height: 1.8; }
</style>
</head>
<body>
<div class="wrap">
<!-- 非微信:下载视图 -->
<div id="downloadView" class="download-view" hidden>
<div class="logo">
<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
<path d="M12 3c2.2 0 4 1.8 4 4 0 1.5-.8 2.8-2 3.5V13c0 1.1.9 2 2 2h1v-1.5c0-1.1.9-2 2-2 1.7 0 3 1.3 3 3v3.5c0 1.7-1.3 3-3 3h-2c-.6 0-1-.4-1-1v-3h-1.2c-.8 1.2-2.2 2-3.8 2H9.5c-.6 0-1-.4-1-1v-3.2C6 17.3 4 15.4 4 13V8c0-2.8 2.2-5 5-5h3zm0 2H9c-1.7 0-3 1.3-3 3v1c1.7 0 3 1.3 3 3h.5V8c0-.6.4-1 1-1s1 .4 1 1v1c0 .4.2.7.5.9v-2.9C12 6 12 5.5 12 5zm1 4v.4c0 .3.1.7.3 1.1L15 13l1.7 1.1h.3v-.6c0-.3-.1-.6-.3-.9l-2-2.6V9h-1.7zm4.5 5.5c.8 0 1.5.7 1.5 1.5v3.5c0 .8-.7 1.5-1.5 1.5H18v-3h-1v3h-2c-.3 0-.5-.2-.5-.5v-5h-1v-1c0-.6.4-1 1-1h2z" fill="#fff"/>
</svg>
</div>
<div class="app-name">视野</div>
<div class="app-slogan">动物实时识别</div>
<div class="version-tip">Android 版</div>
<a class="btn-download" href="http://observer.redpowerfuture.com/download/observer-latest.apk">
<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
<path d="M12 3a1 1 0 0 1 1 1v9.6l3.3-3.3a1 1 0 1 1 1.4 1.4l-5 5a1 1 0 0 1-1.4 0l-5-5a1 1 0 1 1 1.4-1.4l3.3 3.3V4a1 1 0 0 1 1-1zM5 20a1 1 0 0 1 1-1h12a1 1 0 1 1 0 2H6a1 1 0 0 1-1-1z" fill="#fff"/>
</svg>
下载 Android 版 App
</a>
<div class="hint">安装时如提示,请允许「安装未知应用」权限<br>仅支持 Android 系统,请勿在 iPhone 上安装</div>
</div>
<!-- 微信:引导视图 -->
<div id="wechatView" class="wechat-view" hidden>
<div class="wechat-title">无法在微信内直接下载</div>
<div class="wechat-sub">请按以下步骤,使用手机浏览器打开本页</div>
<svg class="phone-svg" width="240" height="300" viewBox="0 0 240 300" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<!-- 手机外框 -->
<rect x="60" y="12" width="120" height="236" rx="20" fill="#2b3138"/>
<rect x="66" y="18" width="108" height="224" rx="16" fill="#ffffff"/>
<!-- 状态栏 -->
<text x="74" y="32" font-size="8" fill="#1f2329" font-family="Arial">9:41</text>
<rect x="152" y="27" width="10" height="6" rx="1.5" fill="#1f2329"/>
<rect x="144" y="27" width="6" height="6" rx="1.5" fill="#1f2329"/>
<rect x="136" y="27" width="6" height="6" rx="1.5" fill="#1f2329"/>
<!-- 浏览器地址栏 -->
<rect x="70" y="38" width="100" height="14" rx="7" fill="#eef0f2"/>
<text x="82" y="47" font-size="6.5" fill="#8a9199" font-family="Arial">observer.redpowerfuture.com</text>
<!-- 右上角 ··· 按钮 -->
<circle cx="166" cy="45" r="6.5" fill="#f2f3f5" stroke="#d8dce0" stroke-width="0.8"/>
<circle cx="163.4" cy="45" r="0.9" fill="#1f2329"/>
<circle cx="166" cy="45" r="0.9" fill="#1f2329"/>
<circle cx="168.6" cy="45" r="0.9" fill="#1f2329"/>
<!-- 页面内容占位 -->
<rect x="74" y="62" width="92" height="10" rx="5" fill="#e8eaed"/>
<rect x="74" y="78" width="70" height="10" rx="5" fill="#e8eaed"/>
<rect x="74" y="94" width="92" height="7" rx="3.5" fill="#f2f3f5"/>
<rect x="74" y="106" width="92" height="7" rx="3.5" fill="#f2f3f5"/>
<rect x="74" y="118" width="80" height="7" rx="3.5" fill="#f2f3f5"/>
<rect x="74" y="140" width="92" height="46" rx="10" fill="#eef0f2"/>
<rect x="74" y="196" width="92" height="7" rx="3.5" fill="#f2f3f5"/>
<rect x="74" y="208" width="60" height="7" rx="3.5" fill="#f2f3f5"/>
<!-- 弹出菜单气泡 -->
<rect x="128" y="62" width="78" height="26" rx="9" fill="#ffffff" stroke="#07c160" stroke-width="1.2"/>
<circle cx="140" cy="75" r="4" fill="#07c160" opacity="0.25"/>
<text x="148" y="78" font-size="9.5" fill="#1f2329" font-family="Arial">在浏览器打开</text>
<!-- 箭头:··· → 菜单 -->
<path d="M166 51.5 C166 58 158 61 149 62.5" stroke="#07c160" stroke-width="2.2" stroke-linecap="round" stroke-dasharray="1 4" fill="none"/>
<path d="M149.5 60.4 L145.8 63 L148.2 58.4" stroke="#07c160" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" fill="#07c160"/>
<!-- 底部提示条 -->
<rect x="66" y="228" width="108" height="6" rx="3" fill="#f2f3f5"/>
</svg>
<div class="steps">
<div class="step">
<div class="step-num">1</div>
<div class="step-text">点击右上角 <b>···</b> 按钮</div>
</div>
<div class="step">
<div class="step-num">2</div>
<div class="step-text">选择 <b>在浏览器打开</b></div>
</div>
<div class="step">
<div class="step-num">3</div>
<div class="step-text">在浏览器中点击 <b>下载</b> 按钮即可安装</div>
</div>
</div>
<button id="copyBtn" class="btn-copy" type="button">
<svg viewBox="0 0 24 24" fill="none" aria-hidden="true">
<path d="M8 6V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-1M5 8h9a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2z" stroke="#07c160" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
复制链接
</button>
<div id="copyOk" class="copy-ok">已复制,请到手机浏览器中粘贴打开</div>
</div>
<div class="foot">视野 · 动物实时识别</div>
</div>
<script>
(function () {
var isWechat = /MicroMessenger/i.test(navigator.userAgent || '');
document.getElementById('downloadView').hidden = isWechat;
document.getElementById('wechatView').hidden = !isWechat;
var copyBtn = document.getElementById('copyBtn');
var copyOk = document.getElementById('copyOk');
function showCopied() {
copyOk.classList.add('show');
setTimeout(function () { copyOk.classList.remove('show'); }, 2600);
}
copyBtn.addEventListener('click', function () {
var url = location.href;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(url).then(showCopied, function () {
legacyCopy(url);
});
} else {
legacyCopy(url);
}
});
function legacyCopy(text) {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.opacity = '0';
document.body.appendChild(ta);
ta.select();
try {
document.execCommand('copy');
showCopied();
} catch (e) { /* 剪贴板不可用,提示手动复制 */ }
document.body.removeChild(ta);
}
})();
</script>
</body>
</html>