换脸拍照机 · 管理后台
设备管理 · 远程运维
{{ loginErr }}
换脸拍照机 · 管理后台
全部设备 (点击卡片进入设备)
暂无设备
{{ d.name || d.id.slice(0,8) }}虚拟待批准 ● {{ d.online? '在线':'离线' }}
{{ d.site_name || '未分配站点' }} · {{ d.virtual?'网页虚拟设备':(d.ip || '—') }}{{ d.virtual?'':' · v'+(d.app_version||'?') }}
{{ d.program || '—' }}

{{ sel.name || '未命名设备' }}

● {{ sel.online? '在线':'离线' }}
{{ sel.id }}
CPU
{{ fmt(sel.cpu_pct,'%') }}
内存
{{ fmt(sel.mem_pct,'%') }}
磁盘
{{ fmt(sel.disk_pct,'%') }}
电源
{{ sel.power_state==='on'?'🟢 开机':'⚫ 关机' }}
软件版本
{{ sel.app_version||'—' }}
IP
{{ sel.ip||'—' }}
当前状态
{{ sel.program || '—' }}· {{ screenState }}
待批准:批准前该设备不能提交换脸任务
确认这是你们自己的设备后点「批准」。分配站点也会自动批准。
批准 ✓ 已批准 令牌 {{ sel.has_token?'已签发':'未注册' }} 型号 {{ sel.model||'—' }} MAC {{ sel.mac||'—' }} 最后心跳 {{ sel.last_seen? fmtTime(sel.last_seen):'—' }} 登记于 {{ fmtTime(sel.created_at) }} 备注 {{ sel.note }}
⬇ 设备正在下载文件
{{ f.kind==='video'?'🎬':(f.kind==='image'?'🖼':'📄') }} {{ f.name }}
{{ dlLabel(f) }}
拍照机参数 (没有本机覆盖的项跟随「设置」页的全局默认值)
配置版本 {{ cfg.data.effective.revision==null?'—':cfg.data.effective.revision }} 设备已应用 {{ cfgApplied==null?'—':cfgApplied }} 虚拟设备无需同步 ✓ 已同步 待设备同步
加载中…
{{ cfg.err || '读取参数失败' }}
端侧屏幕 + 遥控器 (竖屏;截图来自设备诊断通道,不是实时视频)
截图于 {{ fmtTime(shot.ts) }}
🖥
{{ shot.msg }}
主菜单 · {{ sel.name || sel.id }}
{{ it.icon }} {{ it.label }}
▲▼ 选择 · OK 进入 · 返回 / 主页 关闭
{{ vm.panelTitle }}
{{ vm.panelBody }}
OK / 返回 关闭
最近命令 (最近 10 条)
{{ fmtTime(c.created_at) }} {{ cmdLabel(c.action) }}
{{ cmdStatusLabel(c.status) }}
暂无命令记录
命令历史 · {{ histDev&&histDev.name||'' }}
共 {{ hist.total }} 条
加载中…
没有符合条件的记录
时间操作action执行情况
{{ fmtTime(c.created_at) }} {{ cmdLabel(c.action) }} {{ c.action }} {{ cmdStatusLabel(c.status) }}
{{ hist.total? (hist.offset+1)+'–'+Math.min(hist.offset+hist.limit,hist.total):'0' }} / {{ hist.total }}
设备诊断 · {{ diagDev&&(diagDev.name||diagDev.id)||'' }}
采集于 {{ fmtTime(diag.ts) }}
{{ diag.msg }}
还没有诊断包。设备在线时点「重新采集」,设备会在几秒到几十秒内上传日志与状态。
等待设备上传…
{{ k }}
{{ prettyJson(v) }}

站点

站点 = 一处摆放拍照机的地点(商场、景区、门店…)。设备在「监控」页的设备卡片里归入站点;设备首次联网时为「未分配站点」。

站点名称
备注(可不填)
还没有站点。
名称备注 设备数创建时间操作
{{ s.device_count || 0 }} {{ s.created_at ? fmtDate(s.created_at) : '—' }}

模板

模板 = 一张摆拍人物图,脸部留位。上传后要「🎯 标注脸框」、启用并分配给设备,才会下发到拍照机;拍照机待机时让用户把脸对进这个框。

模板图片(JPEG / PNG,可多选批量新建)
名称(可不填,默认取文件名)
算法素材(可选,如模板视频)
批量新建时名称取各自的文件名;算法素材请建好后在模板卡片上单独上传。
{{ tplUp.msg }}
{{ tplLoading ? '加载中…' : '还没有模板。' }}
{{ t.name || '未命名模板' }}
{{ t.id }} · {{ tplDim(t).known ? tplDim(t).w+'×'+tplDim(t).h : '尺寸未知' }} · {{ fmtTimeMs(t.createdAt) }}
未标注脸框 · 不会下发 已标注脸框 有算法素材 已停用
📟 {{ tplAssignLabel(t) }}

分配设备 · {{ tplAssign.tpl && (tplAssign.tpl.name||tplAssign.tpl.id) }}

还没有设备
{{ tplAssign.all ? '将下发到所有设备' : ('已选 '+tplAssign.ids.length+' 台'+(tplAssign.ids.length?'':'(不分配 = 不会下发)')) }}

任务记录

每一次换脸任务一条记录,只记耗时与结果,不含任何图像。停留在本页时每 5 秒自动刷新。

{{ jobsQ.err }} 共 {{ jobsQ.total }} 条
加载中…
没有符合条件的任务
时间设备模板状态 排队首帧可播总耗时 结果大小播放遍数引擎操作
{{ fmtTimeMs(j.createdAt) }}
{{ j.id }}
{{ j.deviceName || j.deviceId }}
{{ j.siteName || '未分配站点' }}
{{ j.templateName || j.templateId || '—' }} {{ jobStateLabel(j.state) }}
{{ jobErrLabel(j.errorCode) }}
{{ fmtMs(j.queueMs) }} {{ fmtMs(j.firstByteMs) }} {{ fmtMs(j.totalMs) }} {{ fmtBytes(j.resultBytes) }}
结果已清理
{{ j.loopsCompleted==null ? '—' : j.loopsCompleted }} {{ j.engine || '—' }}
{{ jobsQ.total ? (jobsQ.offset+1)+'–'+Math.min(jobsQ.offset+jobsQ.limit,jobsQ.total) : '0' }} / {{ jobsQ.total }}

设置

全局设置,仅管理员可改。参数默认值对所有没有「本机覆盖」的设备生效,保存后会重新下发。

{{ setErr || '加载中…' }}

用户管理

后台登录账号。管理员可管理用户与全部功能;操作员可使用设备监控、站点等日常功能,看不到本页。

用户名
密码
角色
{{ u.username }} {{ u.role==='admin'?'管理员':'操作员' }} 已禁用 {{ u.last_login ? '上次登录 '+fmtTime(u.last_login) : '从未登录' }}

API 令牌

供外部系统调用开放接口,目前只有 GET /api/v1/devices(设备列表)。令牌自动生成、以 pb_ 开头,可设有效期;请求头用 X-API-TokenAuthorization: Bearer

生成新令牌
有效期
✓ 新令牌已生成 —— 请立即复制保存(之后列表只显示掩码,但仍可在此系统内复制)
{{ newToken }}
还没有令牌。
名称令牌 状态有效期至操作
{{ t.name || '—' }} {{ t.masked }} {{ {active:'● 有效',revoked:'○ 已停用',expired:'⚠ 已过期'}[t.status] }} {{ t.expires_at ? fmtDate(t.expires_at) : '长期有效' }}

重置设备「高级设置」密码

设备菜单里的「高级设置」需要密码才能进入。忘记密码时在这里重置。
留空 = 恢复默认密码 888888;也可以直接填一个 6 位数字作为新密码。只能送达在线设备。

软件更新

目标:{{ updateTarget.length }} 台设备
上传新版本 DEB
上传中…
更新进度(实时)
{{ v.name }} {{ updStatusLabel(v.status) }}
共 {{ Object.keys(progressData).length }} 台 · 完成 {{ doneCount }} 台
选择版本推送
还没有上传任何版本
v{{ a.version }}
{{ (a.size/1048576).toFixed(1) }} MB · {{ a.filename }}

🧪 试跑一次换脸 · {{ tj.dev && (tj.dev.name||tj.dev.id) }}

🎬
{{ tj.job ? (isTerminal(tj.job.state) ? '没有可播放的结果' : '任务进入「可播放」后,这里边生成边播') : '结果视频' }}
视频加载失败(流地址可能已过期,或结果已被清理)
渐进式 fMP4 结果流(带签名的直链)