update server

This commit is contained in:
2026-07-30 11:12:31 +08:00
commit 4312cb878c
99 changed files with 24034 additions and 0 deletions
+219
View File
@@ -0,0 +1,219 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data:; style-src 'self'; script-src 'self'">
<title>ReinLoop B 端工作台</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="topbar">
<div>
<p class="eyebrow">REINLOOP / B CONSOLE</p>
<h1>数据评审工作台</h1>
</div>
<div id="status" class="status" data-tone="idle">未连接</div>
</header>
<section id="connection-screen" class="connection-screen" aria-labelledby="connection-title">
<form id="connection-form" class="connection-form">
<p class="section-kicker">SERVER ACCESS</p>
<h2 id="connection-title">连接管理服务</h2>
<label><span>Server API URL</span><input id="api-url" type="url" placeholder="https://server.example.com/api" required></label>
<label><span>Admin Token</span><input id="admin-token" type="password" autocomplete="current-password" placeholder="请输入管理令牌"></label>
<button id="connect-button" class="button primary" type="submit">连接并校验</button>
<p id="connection-message" class="connection-message">校验通过后开放业务工作台</p>
</form>
</section>
<main id="workspace" hidden>
<section class="connection-band" aria-label="当前业务目标">
<label>
<span>公司</span>
<select id="company-select" aria-label="选择公司"><option value="">请先刷新组织</option></select>
</label>
<label>
<span>产线</span>
<select id="device-id" aria-label="选择产线"><option value="">请选择产线</option></select>
</label>
</section>
<nav class="tabs" aria-label="功能切换">
<button class="tab active" data-target="plot-panel">绘图预览</button>
<button class="tab" data-target="identification-data-panel">辨识数据</button>
<button class="tab" data-target="config-panel">配置发布</button>
<button class="tab" data-target="model-panel">模型管理</button>
<button class="tab" data-target="license-panel">许可证</button>
<button class="tab" data-target="organization-panel">组织管理</button>
</nav>
<section id="plot-panel" class="panel active">
<div class="panel-head">
<div>
<p class="section-kicker">IDENTIFICATION REVIEW</p>
<h2>数据曲线</h2>
</div>
<div class="review-actions">
<span id="review-target">等待辨识结果</span>
<button id="reject-review" class="button danger" disabled>未通过</button>
<button id="approve-review" class="button primary" disabled>通过</button>
</div>
</div>
<div class="plot-grid">
<article class="plot-item">
<div class="plot-title">
<div>
<span>辨识 CSV</span>
<strong>阀门开度与压力</strong>
</div>
<div class="plot-actions"><button class="button icon" data-open-plot="csv" title="放大图像" disabled aria-label="放大辨识图">+</button><button id="show-csv-image" class="button icon" title="在文件夹中显示" disabled aria-label="在文件夹中显示辨识图"></button></div>
</div>
<div class="plot-stage">
<div id="empty-csv-plot" class="empty-state">
<strong>尚未载入辨识曲线</strong>
<span>等待 ReinLoop 上传 CSV</span>
</div>
<img id="csv-plot-image" alt="辨识 CSV 绘图预览" hidden>
</div>
<div class="plot-meta">
<p id="csv-image-path" class="file-path">未接收 CSV</p>
<p id="csv-upload-time" class="upload-time">等待数据</p>
</div>
</article>
<article class="plot-item">
<div class="plot-title">
<div>
<span>行程 JSON</span>
<strong>行程与稳态压力</strong>
</div>
<div class="plot-actions"><button class="button icon" data-open-plot="json" title="放大图像" disabled aria-label="放大行程图">+</button><button id="show-json-image" class="button icon" title="在文件夹中显示" disabled aria-label="在文件夹中显示行程图"></button></div>
</div>
<div class="plot-stage">
<div id="empty-json-plot" class="empty-state">
<strong>尚未载入行程曲线</strong>
<span>等待 ReinLoop 上传行程 JSON</span>
</div>
<img id="json-plot-image" alt="行程稳态压力绘图预览" hidden>
</div>
<div class="plot-meta">
<p id="json-image-path" class="file-path">未接收行程 JSON</p>
<p id="json-upload-time" class="upload-time">等待数据</p>
</div>
</article>
</div>
</section>
<section id="identification-data-panel" class="panel">
<div class="panel-head">
<div><p class="section-kicker">IDENTIFICATION ARCHIVE</p><h2>辨识数据暂存</h2></div>
<button id="refresh-identification-files" class="button secondary">刷新</button>
</div>
<div class="data-surface">
<table><thead><tr><th>上传时间</th><th>文件名</th><th>类型</th><th>大小</th><th>状态</th><th>操作</th></tr></thead><tbody id="identification-file-list"></tbody></table>
<p id="identification-file-empty" class="empty-row">选择公司和产线后刷新辨识数据</p>
</div>
</section>
<section id="config-panel" class="panel">
<div class="panel-head">
<div>
<p class="section-kicker">FUNCTION PARAMETERS</p>
<h2>配置数据</h2>
</div>
<div class="segmented" aria-label="配置类型">
<button class="segment active" data-type="volume">容积测量</button>
<button class="segment" data-type="identification">系统辨识</button>
</div>
</div>
<div class="editor-layout">
<div class="editor-column">
<div class="editor-toolbar">
<span id="config-label">容积测量配置</span>
<button id="import-config" class="text-button">导入 JSON</button>
</div>
<textarea id="config-editor" spellcheck="false" aria-label="JSON 配置编辑器"></textarea>
<p id="config-path" class="file-path">可直接编辑,或从本地 JSON 导入</p>
</div>
<aside class="publish-aside">
<h3>发布检查</h3>
<dl>
<div><dt>目标</dt><dd id="publish-target">Server 配置文件</dd></div>
<div><dt>格式</dt><dd>JSON</dd></div>
<div><dt>鉴权</dt><dd>Admin Token</dd></div>
</dl>
<button id="load-server" class="button secondary full">读取 Server 配置</button>
<button id="publish-config" class="button primary full">上传容积配置</button>
<p id="publish-result" class="result">等待操作</p>
</aside>
</div>
</section>
<section id="model-panel" class="panel">
<div class="panel-head">
<div><p class="section-kicker">MODEL CONTROL</p><h2>产线模型</h2></div>
<div class="actions">
<button id="refresh-models" class="button secondary">刷新</button>
<button id="upload-model" class="button primary">上传模型</button>
</div>
</div>
<div class="data-surface">
<table><thead><tr><th>文件名</th><th>上传时间</th><th>大小</th><th>操作</th></tr></thead><tbody id="model-list"></tbody></table>
<p id="model-empty" class="empty-row">选择公司和产线后刷新模型列表</p>
</div>
</section>
<section id="license-panel" class="panel">
<div class="panel-head">
<div><p class="section-kicker">LICENSE REGISTRY</p><h2>许可证签发与管理</h2></div>
<button id="refresh-licenses" class="button secondary">刷新列表</button>
</div>
<div class="management-layout">
<form id="license-form" class="form-surface">
<h3>签发许可证</h3>
<label><span>当前目标</span><input id="license-target" readonly placeholder="请先选择公司和产线"></label>
<label><span>签发时间</span><input id="license-issued" type="datetime-local" required></label>
<label><span>到期时间</span><input id="license-expiry" type="datetime-local" required></label>
<label><span>功能</span><input id="license-features" value="*" required></label>
<button class="button primary" type="submit">选择私钥并签发</button>
<p class="form-note">许可证保存到本地后同步登记到 Server;私钥不会上传或保存。</p>
</form>
<div class="data-surface">
<table><thead><tr><th>公司 / 产线</th><th>有效期</th><th>状态</th><th>操作</th></tr></thead><tbody id="license-list"></tbody></table>
<p id="license-empty" class="empty-row">尚未读取许可证</p>
<pre id="license-detail" class="detail-view" hidden></pre>
</div>
</div>
</section>
<section id="organization-panel" class="panel">
<div class="panel-head">
<div><p class="section-kicker">ORGANIZATION</p><h2>公司与产线</h2></div>
<button id="refresh-organizations" class="button secondary">刷新组织</button>
</div>
<div class="management-layout equal">
<form id="company-form" class="form-surface">
<h3>添加公司</h3>
<label><span>公司名称</span><input id="company-name" required></label>
<label><span>公司编码</span><input id="company-code" pattern="[a-z0-9][a-z0-9_-]{1,63}" required></label>
<button class="button primary" type="submit">添加公司</button>
</form>
<form id="line-form" class="form-surface">
<h3>添加产线</h3>
<label><span>所属公司</span><select id="line-company" required><option value="">请选择公司</option></select></label>
<label><span>产线名称</span><input id="line-name" required></label>
<label><span>产线编码</span><input id="line-code" pattern="[a-z0-9][a-z0-9_-]{1,63}" required></label>
<button class="button primary" type="submit">添加产线</button>
</form>
</div>
</section>
</main>
<div id="image-lightbox" class="lightbox" hidden role="dialog" aria-modal="true" aria-labelledby="lightbox-title">
<div class="lightbox-shell">
<div class="lightbox-toolbar"><strong id="lightbox-title">图像预览</strong><div class="lightbox-actions"><button id="zoom-out" class="button icon" title="缩小" aria-label="缩小图像">-</button><button id="zoom-in" class="button icon" title="放大" aria-label="放大图像">+</button><button id="zoom-fit" class="button secondary" type="button">适应窗口</button><button id="zoom-reset" class="button secondary" type="button">原始比例</button><button id="close-lightbox" class="button icon" title="关闭" aria-label="关闭图像预览">x</button></div></div>
<div id="lightbox-canvas" class="lightbox-canvas"><img id="lightbox-image" alt="放大的图像预览"></div>
</div>
</div>
<script src="renderer.js"></script>
</body>
</html>