docs: initialize YoVision requirements and architecture

This commit is contained in:
QiuSW
2026-08-03 17:22:22 +08:00
commit 8a99b388c4
26 changed files with 6216 additions and 0 deletions
+303
View File
@@ -0,0 +1,303 @@
<title>系统怎么工作 · 一张图看懂</title>
<style>
:root{
--paper: #EBEDE8;
--paper-raised: #F7F8F5;
--ink: #1B2A33;
--ink-soft: #566A76;
--rule: #C6CEC8;
--sodium: #E9A13C;
--board: #3A7A72;
--font-body: "PingFang SC","Hiragino Sans GB","Microsoft YaHei","Source Han Sans SC","Noto Sans CJK SC","Heiti SC",sans-serif;
--font-display: "Songti SC","STSong","Source Han Serif SC","Noto Serif CJK SC","SimSun",serif;
--font-mono: ui-monospace,"SF Mono","Menlo","Consolas","Liberation Mono",monospace;
}
@media (prefers-color-scheme: dark){
:root{
--paper:#131B20; --paper-raised:#1A242A;
--ink:#E3E8E4; --ink-soft:#96A7B0; --rule:#2B383F;
}
}
:root[data-theme="dark"]{
--paper:#131B20; --paper-raised:#1A242A;
--ink:#E3E8E4; --ink-soft:#96A7B0; --rule:#2B383F;
}
:root[data-theme="light"]{
--paper:#EBEDE8; --paper-raised:#F7F8F5;
--ink:#1B2A33; --ink-soft:#566A76; --rule:#C6CEC8;
}
*{ box-sizing:border-box; }
.page{
font-family: var(--font-body);
background: var(--paper);
color: var(--ink);
min-height:100dvh;
padding: clamp(28px, 5vw, 72px) clamp(20px, 4vw, 56px) clamp(40px, 6vw, 80px);
display:flex;
flex-direction:column;
gap: clamp(28px, 4vw, 52px);
}
header{ max-width: 62ch; }
.eyebrow{
font-family: var(--font-mono);
font-size:12px;
letter-spacing:.16em;
color: var(--ink-soft);
margin:0 0 14px;
}
h1{
font-family: var(--font-display);
font-weight:700;
font-size: clamp(28px, 4.6vw, 46px);
line-height:1.2;
letter-spacing:.01em;
text-wrap:balance;
margin:0 0 .45em;
}
.sub{
margin:0;
font-size: clamp(15px,1.7vw,18px);
line-height:1.75;
color: var(--ink-soft);
}
/* ── 主流程 ── */
.flow{
display:flex;
align-items:stretch;
gap: 0;
overflow-x:auto;
padding-bottom:6px;
}
.node{
flex: 1 1 0;
min-width: 176px;
background: var(--paper-raised);
border:1px solid var(--rule);
padding: clamp(18px,2vw,26px);
display:flex;
flex-direction:column;
gap:12px;
}
.node .top{
display:flex;
align-items:center;
justify-content:space-between;
gap:10px;
}
.node svg{
width:26px; height:26px;
stroke: var(--ink);
stroke-width:1.4;
fill:none;
stroke-linecap:round;
stroke-linejoin:round;
flex:none;
}
.verb{
font-family: var(--font-display);
font-size: clamp(22px,2.6vw,30px);
font-weight:700;
line-height:1;
color: var(--sodium);
}
.node h2{
margin:0;
font-size: clamp(16px,1.8vw,19px);
font-weight:600;
letter-spacing:.01em;
}
.node .tech{
font-family: var(--font-mono);
font-size:11px;
letter-spacing:.06em;
color: var(--ink-soft);
margin:-6px 0 0;
}
.node p{
margin:0;
font-size: clamp(13.5px,1.5vw,15px);
line-height:1.7;
color: var(--ink-soft);
}
.arrow{
flex:none;
width: clamp(26px,3vw,48px);
display:flex;
align-items:center;
justify-content:center;
color: var(--rule);
}
.arrow svg{ width:100%; height:16px; stroke:currentColor; stroke-width:1.4; fill:none; }
/* ── 回流 ── */
.loop{
display:flex;
align-items:center;
gap: clamp(12px,2vw,20px);
border:1px dashed var(--rule);
padding: clamp(16px,2vw,22px) clamp(18px,2.4vw,28px);
background: transparent;
}
.loop .badge{
font-family: var(--font-mono);
font-size:11px;
letter-spacing:.1em;
color: var(--board);
border:1px solid var(--board);
padding:5px 9px;
white-space:nowrap;
}
.loop p{
margin:0;
font-size: clamp(14px,1.6vw,16px);
line-height:1.7;
color: var(--ink-soft);
}
.loop strong{ color: var(--ink); font-weight:600; }
/* ── 三条说明 ── */
.notes{
display:grid;
grid-template-columns: repeat(auto-fit, minmax(240px,1fr));
gap: clamp(18px,2.6vw,34px);
border-top:1px solid var(--rule);
padding-top: clamp(22px,3vw,32px);
}
.note h3{
margin:0 0 8px;
font-size: clamp(15px,1.7vw,17px);
font-weight:600;
display:flex;
align-items:baseline;
gap:9px;
}
.note h3::before{
content:"";
width:9px; height:1px;
background: var(--sodium);
flex:none;
transform: translateY(-4px);
}
.note p{
margin:0;
font-size:14px;
line-height:1.75;
color: var(--ink-soft);
}
footer{
font-size:12.5px;
line-height:1.7;
color: var(--ink-soft);
border-top:1px solid var(--rule);
padding-top:16px;
}
@media (max-width: 860px){
.flow{ flex-direction:column; overflow-x:visible; }
.node{ min-width:0; }
.arrow{ width:100%; height:30px; }
.arrow svg{ width:16px; height:100%; transform: rotate(90deg); }
}
</style>
<div class="page">
<header>
<p class="eyebrow">YOVISION · 系统工作原理</p>
<h1>摄像头拍到 → 有人来管,中间发生了什么</h1>
<p class="sub">整套系统只做一件事:把「装了但没人看」的摄像头,变成「出事时会主动叫人」的系统。下面是完整的五步。</p>
</header>
<div class="flow">
<div class="node">
<div class="top">
<svg viewBox="0 0 24 24"><path d="M3 7.5h13l3.5-2v13L16 16.5H3z"/><circle cx="9" cy="12" r="2.6"/></svg>
<span class="verb">看</span>
</div>
<h2>摄像头</h2>
<p class="tech">IP CAMERA</p>
<p>装在围墙、走廊、客厅这些地方,对着现场。用你已经装好的,不用换新的。</p>
</div>
<div class="arrow"><svg viewBox="0 0 40 16" preserveAspectRatio="none"><path d="M0 8h34m-6-5 6 5-6 5"/></svg></div>
<div class="node">
<div class="top">
<svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="7" rx="1.5"/><rect x="3" y="13" width="18" height="7" rx="1.5"/><path d="M6.5 7.5h.01M6.5 16.5h.01"/></svg>
<span class="verb">收</span>
</div>
<h2>录像主机</h2>
<p class="tech">NVR · 边缘盒子</p>
<p>把所有摄像头的画面汇到一起,存在本地。视频先留在现场,平时不往外传。</p>
</div>
<div class="arrow"><svg viewBox="0 0 40 16" preserveAspectRatio="none"><path d="M0 8h34m-6-5 6 5-6 5"/></svg></div>
<div class="node">
<div class="top">
<svg viewBox="0 0 24 24"><path d="M2 12s3.6-6 10-6 10 6 10 6-3.6 6-10 6-10-6-10-6Z"/><circle cx="12" cy="12" r="2.8"/></svg>
<span class="verb">判断</span>
</div>
<h2>AI 分析</h2>
<p class="tech">推理服务</p>
<p>替你盯着这些画面。有人翻墙、有人摔倒、有人进了不该进的地方——它认得出来,也分得清什么是正常走动。</p>
</div>
<div class="arrow"><svg viewBox="0 0 40 16" preserveAspectRatio="none"><path d="M0 8h34m-6-5 6 5-6 5"/></svg></div>
<div class="node">
<div class="top">
<svg viewBox="0 0 24 24"><rect x="2.5" y="4" width="19" height="12.5" rx="1.5"/><path d="M9 20h6M12 16.5V20M6.5 12l2.8-3 2.6 2.6L16 8"/></svg>
<span class="verb">记录</span>
</div>
<h2>管理后台</h2>
<p class="tech">值班台账</p>
<p>每一次异常变成一条记录,带上那一小段视频。谁在几点确认的、怎么处理的,全都留着,随时能查。</p>
</div>
<div class="arrow"><svg viewBox="0 0 40 16" preserveAspectRatio="none"><path d="M0 8h34m-6-5 6 5-6 5"/></svg></div>
<div class="node">
<div class="top">
<svg viewBox="0 0 24 24"><rect x="6.5" y="2.5" width="11" height="19" rx="2.2"/><path d="M10.5 18.5h3"/><path d="M19.5 5.5a5 5 0 0 1 0 5M21.8 3.5a8 8 0 0 1 0 9"/></svg>
<span class="verb">叫人</span>
</div>
<h2>手机 App</h2>
<p class="tech">预警投递</p>
<p>推到值班员和负责人手机上。<strong style="color:var(--ink);font-weight:600">没有人点确认,它会一直往上找人</strong>,不会停在「已发送」。</p>
</div>
</div>
<div class="loop">
<span class="badge">← 反馈回流</span>
<p>如果这次报错了,值班员点一下<strong>「误报」</strong>,这段画面会自动回到 AI 那里当作教材。<strong>用得越久,报得越准。</strong></p>
</div>
<div class="notes">
<div class="note">
<h3>平时不打扰</h3>
<p>没有异常的时候,系统一句话不说,也不往外传视频。只有出事的那一小段才会被留下来、发出去。</p>
</div>
<div class="note">
<h3>视频不出现场</h3>
<p>录像和 AI 分析都在本地完成。上传到平台的只有告警记录和作为证据的那一小段画面。</p>
</div>
<div class="note">
<h3>不认人,只认事</h3>
<p>系统判断的是「有人翻墙」,不是「谁翻了墙」。默认不做人脸识别,不建人脸库。</p>
</div>
</div>
<footer>YoVision 智能视频事件平台 · 通用场景流程说明 · 2026</footer>
</div>