- add authorized nine-source crawler connectors with security controls and packaged schemas - add the school internship contract to the vendor data standard center - add bidirectional campus data-to-report lineage with gap ownership and remediation Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
677 lines
41 KiB
HTML
677 lines
41 KiB
HTML
<!doctype html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta
|
|
name="description"
|
|
content="产教数据中台,面向厂商数据运营团队管理招聘数据采集、标准契约、导入导出、质量治理与审计交付"
|
|
/>
|
|
<title>产教数据中台 · 厂商运营中心</title>
|
|
<link rel="icon" href="./favicon.svg" type="image/svg+xml" />
|
|
<link rel="stylesheet" href="./styles.css" />
|
|
</head>
|
|
<body>
|
|
<div class="app-shell">
|
|
<aside class="sidebar" id="sidebar">
|
|
<div class="brand">
|
|
<span class="brand-mark" aria-hidden="true"><i></i><i></i><i></i></span>
|
|
<span>
|
|
<strong>产教数据中台</strong>
|
|
<small>INDUSTRY DATA OPS</small>
|
|
</span>
|
|
</div>
|
|
|
|
<nav class="main-nav" aria-label="数据中台主导航">
|
|
<span class="nav-label">运营工作台</span>
|
|
<button class="nav-item active" data-view="overview">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 13h6V4H4v9Zm0 7h6v-4H4v4Zm10 0h6v-9h-6v9Zm0-16v4h6V4h-6Z" /></svg>
|
|
<span>运行总览</span>
|
|
</button>
|
|
<button class="nav-item" data-view="operations">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 4h16v5H4V4Zm0 11h7v5H4v-5Zm11 0h5v5h-5v-5ZM7 9v6m10-6v6" /></svg>
|
|
<span>运营处置</span>
|
|
<em class="warning" id="operationsNavCount">3</em>
|
|
</button>
|
|
<button class="nav-item" data-view="sources">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><ellipse cx="12" cy="5" rx="8" ry="3" /><path d="M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6" /></svg>
|
|
<span>数据源管理</span>
|
|
<em id="sourceNavCount">9</em>
|
|
</button>
|
|
<button class="nav-item" data-view="collectors">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 4h14v5H5V4Zm0 11h14v5H5v-5ZM8 9v6m8-6v6M9 6h.01M9 17h.01" /></svg>
|
|
<span>采集任务</span>
|
|
<i class="nav-live"></i>
|
|
</button>
|
|
<button class="nav-item" data-view="records">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16v14H4V5Zm0 5h16M9 5v14m6-9v9" /></svg>
|
|
<span>采集数据</span>
|
|
</button>
|
|
<button class="nav-item" data-view="contracts">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M7 3h8l4 4v14H7V3Zm8 0v5h4M10 12h6m-6 4h6M4 7v14h11" /></svg>
|
|
<span>数据标准</span>
|
|
</button>
|
|
<button class="nav-item" data-view="exchange">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 7h11M15 3l4 4-4 4M16 17H5m4-4-4 4 4 4" /></svg>
|
|
<span>导入与导出</span>
|
|
</button>
|
|
<button class="nav-item" data-view="quality">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="m12 3 8 4v5c0 5-3.4 8.3-8 9-4.6-.7-8-4-8-9V7l8-4Zm-4 9 2.5 2.5L16 9" /></svg>
|
|
<span>质量与归一</span>
|
|
<em class="warning">27</em>
|
|
</button>
|
|
<button class="nav-item" data-view="audit">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 3h6l1 3h4v15H4V6h4l1-3Zm0 9 2 2 4-4m-6 8h6" /></svg>
|
|
<span>审计与交付</span>
|
|
</button>
|
|
</nav>
|
|
|
|
<div class="sidebar-runtime">
|
|
<span><i></i>生产环境运行正常</span>
|
|
<strong>华东主集群</strong>
|
|
<small>采集节点 24 / 24 · 队列延迟 18s</small>
|
|
</div>
|
|
</aside>
|
|
|
|
<div class="workspace">
|
|
<header class="topbar">
|
|
<button class="icon-button mobile-menu" id="mobileMenu" aria-label="打开导航">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16" /></svg>
|
|
</button>
|
|
<div class="topbar-context">
|
|
<small>全国招聘数据运营中心</small>
|
|
<strong id="breadcrumbCurrent">运行总览</strong>
|
|
</div>
|
|
<label class="global-search">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7" /><path d="m20 20-4-4" /></svg>
|
|
<input id="globalSearch" type="search" placeholder="搜索数据源、任务或版本" />
|
|
</label>
|
|
<div class="topbar-actions">
|
|
<span class="environment-chip"><i></i>生产环境</span>
|
|
<button class="icon-button" id="notificationButton" aria-label="运行通知">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18 8a6 6 0 0 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9M10 21h4" /></svg>
|
|
<b>4</b>
|
|
</button>
|
|
<button class="operator-card" id="operatorButton">
|
|
<span>陈</span>
|
|
<span><strong>陈致远</strong><small>厂商数据运营管理员</small></span>
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="m7 10 5 5 5-5" /></svg>
|
|
</button>
|
|
</div>
|
|
</header>
|
|
|
|
<main class="main-content">
|
|
<section class="view active" id="view-overview" data-title="运行总览">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> DATA OPERATIONS CONTROL PLANE</div>
|
|
<h1>招聘数据生产运行总览</h1>
|
|
<p>统一管理商业招聘平台、公共就业平台和校内业务系统,从采集到交付全链路可追溯。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" data-open-export>
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m0 0 4-4m-4 4-4-4M5 21h14" /></svg>
|
|
导出运行日报
|
|
</button>
|
|
<button class="button secondary" data-open-source-modal>
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14" /></svg>
|
|
新增数据源
|
|
</button>
|
|
<button class="button primary" data-view-jump="records">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16v14H4V5Zm0 5h16M9 5v14m6-9v9" /></svg>
|
|
查看采集数据
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<article class="production-hero">
|
|
<div>
|
|
<span class="hero-kicker"><i></i> NATIONAL DATA PIPELINE</span>
|
|
<h2>今日生产批次 EDU-JOB-20260823</h2>
|
|
<p>9 个数据源进入调度,7 个已完成,2 个持续采集中;当前稳定版本不受运行中任务影响。</p>
|
|
<div class="hero-status-row">
|
|
<span>运行中<strong>2</strong></span>
|
|
<span>今日入湖<strong>190,420</strong></span>
|
|
<span>隔离记录<strong>1,286</strong></span>
|
|
<span>预计完成<strong>11:40</strong></span>
|
|
</div>
|
|
</div>
|
|
<div class="hero-score">
|
|
<span class="score-ring"><strong>94.7</strong><small>综合质量</small></span>
|
|
<span><strong id="overviewReleaseState">候选发布受阻</strong><small id="overviewReleaseDetail">杭州人才网修复重放尚未验证</small></span>
|
|
</div>
|
|
</article>
|
|
|
|
<div class="metric-grid">
|
|
<article><span>有效岗位总量</span><strong>12.84<small>百万</small></strong><em>近90天去重信号</em><i class="positive">↑ 8.6%</i></article>
|
|
<article><span>今日采集成功率</span><strong>98.7<small>%</small></strong><em>1,428 / 1,447 分片</em><i class="positive">SLA内</i></article>
|
|
<article><span>岗位归一覆盖</span><strong>96.4<small>%</small></strong><em>国标 + 行业词典 V4.3</em><i class="warning">27项待审</i></article>
|
|
<article><span>数据交付租户</span><strong>36<small>所</small></strong><em>旗舰版与区域项目</em><i class="positive">全部有效</i></article>
|
|
</div>
|
|
|
|
<div class="overview-grid">
|
|
<article class="panel source-health-panel">
|
|
<div class="panel-head">
|
|
<div><span>来源运行状态</span><h2>核心数据源健康度</h2></div>
|
|
<button class="text-button" data-view-jump="sources">查看全部来源</button>
|
|
</div>
|
|
<div class="source-health-list" id="overviewSourceHealth"></div>
|
|
</article>
|
|
|
|
<article class="panel flow-panel">
|
|
<div class="panel-head">
|
|
<div><span>处理链路</span><h2>今日数据流水线</h2></div>
|
|
<span class="live-label"><i></i>实时</span>
|
|
</div>
|
|
<div class="pipeline-flow">
|
|
<span class="done"><b>01</b><strong>源端采集</strong><small>190,420 条</small></span><i></i>
|
|
<span class="done"><b>02</b><strong>原始留存</strong><small>100% 哈希</small></span><i></i>
|
|
<span class="active"><b>03</b><strong>清洗归一</strong><small>96.4% 完成</small></span><i></i>
|
|
<span><b>04</b><strong>质量验收</strong><small>11:20 预计</small></span><i></i>
|
|
<span><b>05</b><strong>版本交付</strong><small>待审批</small></span>
|
|
</div>
|
|
<div class="flow-caption">
|
|
<span><strong>RAW-20260823-09</strong> 原始快照</span>
|
|
<span><strong>JOB-SIGNAL 3.0</strong> 目标契约</span>
|
|
<span><strong>SHA-256</strong> 全量校验</span>
|
|
</div>
|
|
</article>
|
|
|
|
<article class="panel alert-panel">
|
|
<div class="panel-head">
|
|
<div><span>运营关注</span><h2>待处理事项</h2></div>
|
|
<em>4 项</em>
|
|
</div>
|
|
<div class="alert-list" id="overviewIssueList">
|
|
<button data-open-issue="ISSUE-NORM-20260823-01"><i class="red"></i><span><strong>27 个岗位别名待人工归一</strong><small>涉及具身智能、低空经济等新增岗位</small></span><em>高</em></button>
|
|
<button data-open-issue="ISSUE-HZRC-20260823-01"><i class="amber"></i><span><strong>杭州人才网响应时延升高</strong><small>最近 20 分钟 P95 为 4.8s,任务已自动降速</small></span><em>中</em></button>
|
|
<button data-open-issue="ISSUE-CONTRACT-20260823-01"><i class="blue"></i><span><strong>校内就业契约 V2.2 待发布</strong><small>新增就业质量和去向确认字段</small></span><em>中</em></button>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="view" id="view-operations" data-title="运营处置">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> OPERATIONS RESOLUTION LOOP</div>
|
|
<h1>运营问题、发布与学校交付</h1>
|
|
<p>从告警确认、排障和质量复核,到独立审批、版本发布、逐学校回执与租户级回滚,全程保留状态与审计证据。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="resetOperationsSeed">重置演示数据</button>
|
|
<button class="button primary" id="operationsPrimaryAction">处理最高优先级问题</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="operations-metrics" id="operationsMetrics"></div>
|
|
|
|
<nav class="operations-tabs" id="operationsTabs" aria-label="运营处置工作区">
|
|
<button class="active" data-operations-tab="issues">问题队列</button>
|
|
<button data-operations-tab="releases">候选发布</button>
|
|
<button data-operations-tab="deliveries">学校交付</button>
|
|
</nav>
|
|
|
|
<div class="operations-workspace active" id="operations-issues">
|
|
<article class="panel operations-panel">
|
|
<div class="panel-head">
|
|
<div><span>ISSUE & WORK ORDER</span><h2>问题处置队列</h2></div>
|
|
<em id="issueQueueSummary">加载中</em>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table operations-table">
|
|
<thead><tr><th>问题与追踪</th><th>级别 / SLA</th><th>影响</th><th>负责人</th><th>状态</th><th>最近动作</th><th>操作</th></tr></thead>
|
|
<tbody id="operationsIssueTable"></tbody>
|
|
</table>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
|
|
<div class="operations-workspace" id="operations-releases">
|
|
<div id="releaseWorkspace"></div>
|
|
</div>
|
|
|
|
<div class="operations-workspace" id="operations-deliveries">
|
|
<article class="panel operations-panel">
|
|
<div class="panel-head">
|
|
<div><span>TENANT DELIVERY</span><h2>逐学校交付与回执</h2></div>
|
|
<button class="text-button" id="startPendingDeliveries">启动待发送学校</button>
|
|
</div>
|
|
<div class="delivery-boundary-note">静态原型只模拟并持久化交付状态,不会向学校网络、接口或业务系统真实发送数据。</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table delivery-table">
|
|
<thead><tr><th>学校 / 租户</th><th>包与数据版本</th><th>交付状态</th><th>记录数回执</th><th>SHA-256 回执</th><th>最近动作</th><th>操作</th></tr></thead>
|
|
<tbody id="deliveryTable"></tbody>
|
|
</table>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="view" id="view-sources" data-title="数据源管理">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> SOURCE REGISTRY</div>
|
|
<h1>统一数据源注册中心</h1>
|
|
<p>商业招聘平台、公共就业平台、活动聚合平台和校内系统使用同一套资产、版本和运行模型。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="sourceCatalogExport">导出数据源目录</button>
|
|
<button class="button primary" data-open-source-modal>新增数据源</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="summary-strip">
|
|
<span><small>数据源总数</small><strong id="sourceTotal">9</strong><em>7外部 · 2校内</em></span>
|
|
<span><small>正式运行</small><strong id="sourceRunning">8</strong><em>1个降速保护</em></span>
|
|
<span><small>今日新增记录</small><strong>190,420</strong><em>有效率 98.1%</em></span>
|
|
<span><small>稳定交付版本</small><strong>V2026.08.23</strong><em>36所学校引用</em></span>
|
|
</div>
|
|
|
|
<article class="panel source-registry-panel">
|
|
<div class="source-toolbar">
|
|
<div class="filter-pills" id="sourceFilters">
|
|
<button class="active" data-source-filter="all">全部来源</button>
|
|
<button data-source-filter="commercial">商业平台</button>
|
|
<button data-source-filter="public">公共平台</button>
|
|
<button data-source-filter="school">校内系统</button>
|
|
</div>
|
|
<label class="inline-search">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7" /><path d="m20 20-4-4" /></svg>
|
|
<input id="sourceSearch" type="search" placeholder="按名称、域名、适配器搜索" />
|
|
</label>
|
|
</div>
|
|
<div class="source-grid" id="sourceGrid"></div>
|
|
<div class="list-summary" id="sourceListSummary">当前展示 9 个数据源</div>
|
|
</article>
|
|
</section>
|
|
|
|
<section class="view" id="view-collectors" data-title="采集任务">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> COLLECTION ORCHESTRATION</div>
|
|
<h1>采集任务编排中心</h1>
|
|
<p>按来源、地域、行业和岗位族编排任务,支持分片、限速、失败隔离、断点续采和版本化原始留存。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="pauseAllJobs">暂停全部</button>
|
|
<button class="button primary" id="newCollectionJob">新建采集任务</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="collector-metrics">
|
|
<article><span><i class="green"></i>运行中</span><strong id="runningJobCount">3</strong><small>64 个活跃分片</small></article>
|
|
<article><span><i class="blue"></i>今日完成</span><strong>18</strong><small>平均耗时 42 分钟</small></article>
|
|
<article><span><i class="amber"></i>自动保护</span><strong>1</strong><small>源端延迟触发降速</small></article>
|
|
<article><span><i class="red"></i>失败分片</span><strong>6</strong><small>已进入重试队列</small></article>
|
|
</div>
|
|
|
|
<article class="panel collector-table-panel">
|
|
<div class="table-toolbar">
|
|
<div class="segmented" id="jobFilters">
|
|
<button class="active" data-job-filter="all">全部任务</button>
|
|
<button data-job-filter="running">运行中</button>
|
|
<button data-job-filter="scheduled">等待调度</button>
|
|
<button data-job-filter="attention">需要关注</button>
|
|
</div>
|
|
<span>调度器心跳:刚刚 · 队列延迟 18s</span>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table">
|
|
<thead><tr><th>任务与来源</th><th>采集范围</th><th>运行策略</th><th>进度</th><th>本批次数据</th><th>状态</th><th>操作</th></tr></thead>
|
|
<tbody id="collectionJobTable"></tbody>
|
|
</table>
|
|
</div>
|
|
</article>
|
|
</section>
|
|
|
|
<section class="view" id="view-records" data-title="采集数据">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> DATA RECORD EXPLORER</div>
|
|
<h1>采集数据浏览与追溯</h1>
|
|
<p>按数据层、来源、地区和关键词检索岗位明细,向下追溯源端记录、原始快照、采集任务与内容哈希。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="recordRefresh">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 7v5h-5M4 17v-5h5M18 9a7 7 0 0 0-12-2l-2 3m2 5a7 7 0 0 0 12 2l2-3" /></svg>
|
|
刷新查询
|
|
</button>
|
|
<button class="button primary" id="recordExport">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3v12m0 0 4-4m-4 4-4-4M5 21h14" /></svg>
|
|
导出当前结果
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="summary-strip record-summary-strip">
|
|
<span><small>稳定标准岗位</small><strong>12.84M</strong><em>JOB-SIGNAL V3.0</em></span>
|
|
<span><small>今日源端入湖</small><strong>190,420</strong><em>9个来源批次</em></span>
|
|
<span><small>今日标准入湖</small><strong>189,134</strong><em>已通过生产质量规则</em></span>
|
|
<span><small>隔离记录</small><strong>1,286</strong><em>未进入稳定版本</em></span>
|
|
</div>
|
|
|
|
<article class="panel record-browser-panel">
|
|
<div class="record-layer-tabs" id="recordLayers" aria-label="数据层">
|
|
<button class="active" data-record-layer="standard"><span>STANDARD</span><strong>标准岗位</strong><small>清洗归一后的生产数据</small></button>
|
|
<button data-record-layer="source"><span>SOURCE</span><strong>源端记录</strong><small>保留来源原始业务字段</small></button>
|
|
<button data-record-layer="raw"><span>RAW</span><strong>原始快照</strong><small>请求响应、文件与内容哈希</small></button>
|
|
<button data-record-layer="quarantine"><span>QUARANTINE</span><strong>隔离记录</strong><small>质量失败与人工处置</small></button>
|
|
</div>
|
|
|
|
<div class="record-query-bar">
|
|
<label><span>数据来源</span><select id="recordSourceFilter"></select></label>
|
|
<label><span>工作地区</span><select id="recordRegionFilter"><option value="all">全部地区</option><option value="杭州">杭州</option><option value="宁波">宁波</option><option value="嘉兴">嘉兴</option><option value="绍兴">绍兴</option><option value="上海">上海</option><option value="苏州">苏州</option></select></label>
|
|
<label class="record-search-field"><span>检索条件</span><input id="recordSearch" type="search" placeholder="岗位、企业、记录编号、任务或快照" /></label>
|
|
</div>
|
|
|
|
<div class="query-service-note">
|
|
<span><i></i>查询服务</span>
|
|
<strong>当前绑定稳定版本 V2026.08.23</strong>
|
|
<small>静态原型展示契约化结构样例;正式环境由数据查询服务分页返回已采集明细,并执行租户范围与字段权限控制。</small>
|
|
</div>
|
|
|
|
<div id="recordTableContainer"></div>
|
|
<div class="record-list-footer">
|
|
<span id="recordQuerySummary">正在加载查询结果</span>
|
|
<small>点击“查看”可核对业务字段、来源URL、任务、快照和SHA-256证据。</small>
|
|
</div>
|
|
</article>
|
|
</section>
|
|
|
|
<section class="view" id="view-contracts" data-title="数据标准">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> DATA CONTRACT GOVERNANCE</div>
|
|
<h1>产教数据标准与契约中心</h1>
|
|
<p>第三方招聘数据和校内业务数据按版本化契约交付,字段、代码、质量、脱敏和变更策略一次定义、全链路执行。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="compareContractVersions">版本对比</button>
|
|
<button class="button primary" id="downloadStandardKit">下载标准包</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="contract-tabs" id="contractTabs">
|
|
<button class="active" data-contract="external-job"><span>JOB-SIGNAL</span><strong>外部岗位信号</strong><small>V3.0 · 39字段</small></button>
|
|
<button data-contract="school-employment"><span>SCHOOL-EMPLOYMENT</span><strong>校内就业事实</strong><small>V2.2 · 32字段</small></button>
|
|
<button data-contract="school-internship"><span>SCHOOL-INTERNSHIP</span><strong>校内实习事实</strong><small>V2.1 · 30字段</small></button>
|
|
<button data-contract="package-manifest"><span>PACKAGE-MANIFEST</span><strong>交付包清单</strong><small>V1.2 · 21字段</small></button>
|
|
</div>
|
|
<div id="contractContent"></div>
|
|
</section>
|
|
|
|
<section class="view" id="view-exchange" data-title="导入与导出">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> DATA EXCHANGE</div>
|
|
<h1>数据导入与交付中心</h1>
|
|
<p>支持标准文件导入、Schema 预检、字段映射、质量干跑和带清单、校验和、质量报告的版本化导出。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<a class="button secondary" href="./samples/external-job-sample.csv" download>下载导入样例</a>
|
|
<button class="button primary" id="buildExportPackage">创建交付包</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="exchange-grid">
|
|
<article class="panel import-panel">
|
|
<div class="panel-head"><div><span>标准导入</span><h2>上传并校验数据文件</h2></div><em>CSV / JSONL / XLSX / Parquet</em></div>
|
|
<label class="upload-zone" id="uploadZone">
|
|
<input id="importFile" type="file" accept=".csv,.json,.jsonl,.xlsx,.parquet" />
|
|
<span class="upload-icon">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 16V4m0 0 4 4m-4-4L8 8M5 20h14" /></svg>
|
|
</span>
|
|
<strong>选择文件或拖放到此处</strong>
|
|
<small>最大 2GB;大文件将自动分片并计算 SHA-256</small>
|
|
</label>
|
|
<div class="import-configuration">
|
|
<label><span>目标契约</span><select id="importContract"><option value="external-job">JOB-SIGNAL V3.0</option><option value="school-employment">SCHOOL-EMPLOYMENT V2.2</option><option value="school-internship">SCHOOL-INTERNSHIP V2.1</option></select></label>
|
|
<label><span>导入模式</span><select id="importMode"><option>新增或更新 UPSERT</option><option>初次全量 FULL</option><option>仅质量验证 DRY-RUN</option></select></label>
|
|
</div>
|
|
<div class="import-preview" id="importPreview">
|
|
<span><small>等待文件</small><strong>尚未选择导入文件</strong></span>
|
|
<button class="button primary" id="validateImport" disabled>执行预检</button>
|
|
</div>
|
|
</article>
|
|
|
|
<article class="panel export-panel">
|
|
<div class="panel-head"><div><span>版本交付</span><h2>构建数据交付包</h2></div><em>可复核、可回滚</em></div>
|
|
<div class="export-form">
|
|
<label><span>数据产品</span><select id="exportProduct"><option>区域招聘岗位基础包</option><option>薪资与企业画像增强包</option><option>产业趋势与政策信号包</option></select></label>
|
|
<label><span>目标租户</span><select id="exportTenant"><option>36所已授权学校</option><option>杭州科技职业技术学院</option><option>华东区域项目组</option></select></label>
|
|
<label><span>数据截止日期</span><input id="exportAsOf" type="date" value="2026-08-23" /></label>
|
|
<label><span>格式</span><select id="exportFormat"><option>Parquet + Manifest</option><option>CSV UTF-8 + Manifest</option><option>JSONL + Manifest</option></select></label>
|
|
</div>
|
|
<div class="package-includes">
|
|
<span><i>✓</i>业务数据文件</span><span><i>✓</i>JSON Schema</span><span><i>✓</i>代码字典</span>
|
|
<span><i>✓</i>质量报告</span><span><i>✓</i>血缘与来源清单</span><span><i>✓</i>SHA-256 校验和</span>
|
|
</div>
|
|
<button class="button primary wide" id="generatePackage">生成候选包 / Manifest</button>
|
|
</article>
|
|
</div>
|
|
|
|
<article class="panel recent-exchange-panel">
|
|
<div class="panel-head"><div><span>交换记录</span><h2>最近导入与交付任务</h2></div><button class="text-button" id="exportExchangeLog">导出记录</button></div>
|
|
<div class="table-wrap">
|
|
<table class="data-table compact">
|
|
<thead><tr><th>追踪编号</th><th>类型</th><th>对象</th><th>数据版本</th><th>记录数</th><th>执行人</th><th>结果</th><th>时间</th></tr></thead>
|
|
<tbody id="exchangeLogTable"></tbody>
|
|
</table>
|
|
</div>
|
|
</article>
|
|
</section>
|
|
|
|
<section class="view" id="view-quality" data-title="质量与归一">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> QUALITY & NORMALIZATION</div>
|
|
<h1>数据质量与岗位归一</h1>
|
|
<p>执行结构、完整性、唯一性、时效性和业务规则校验,将多来源岗位映射到统一岗位与技能体系。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="qualityRuleButton">质量规则</button>
|
|
<button class="button primary" id="normalizationBatch">批量处理待审项</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="quality-layout">
|
|
<article class="quality-score-card">
|
|
<span class="quality-ring"><strong>94.7</strong><small>综合质量</small></span>
|
|
<div><span>生产发布阈值 ≥ 90</span><strong id="qualityReleaseState">当前批次仍需修复重放复核</strong><small id="qualityReleaseDetail">质量分达标不等于门禁通过,稳定版本继续保持不变</small></div>
|
|
</article>
|
|
<div class="quality-dimensions">
|
|
<span><small>完整性</small><strong>97.8%</strong><i><b style="width:97.8%"></b></i></span>
|
|
<span><small>唯一性</small><strong>99.6%</strong><i><b style="width:99.6%"></b></i></span>
|
|
<span><small>时效性</small><strong>93.1%</strong><i><b style="width:93.1%"></b></i></span>
|
|
<span><small>岗位归一</small><strong>96.4%</strong><i><b style="width:96.4%"></b></i></span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="quality-grid">
|
|
<article class="panel rule-panel">
|
|
<div class="panel-head"><div><span>规则执行</span><h2>当前质量规则组</h2></div><em>32条启用</em></div>
|
|
<div class="rule-list" id="qualityRuleList"></div>
|
|
</article>
|
|
<article class="panel normalization-panel">
|
|
<div class="panel-head"><div><span>人工复核</span><h2>岗位归一待审队列</h2></div><em>27项</em></div>
|
|
<div class="normalization-list" id="normalizationList"></div>
|
|
</article>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="view" id="view-audit" data-title="审计与交付">
|
|
<div class="page-heading">
|
|
<div>
|
|
<div class="eyebrow"><i></i> AUDIT & DELIVERY</div>
|
|
<h1>全链路审计与生产交付</h1>
|
|
<p>记录来源、采集任务、代码版本、原始快照、处理规则、发布审批和租户交付,实现问题可定位、版本可回滚。</p>
|
|
</div>
|
|
<div class="heading-actions">
|
|
<button class="button secondary" id="auditPolicyButton">审计策略</button>
|
|
<button class="button primary" id="exportAuditLog">导出审计日志</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="audit-summary">
|
|
<article><small>今日审计事件</small><strong>2,846</strong><em>全部已签名</em></article>
|
|
<article><small>数据版本</small><strong>128</strong><em>保留 36 个月</em></article>
|
|
<article><small>可追踪任务</small><strong>100%</strong><em>原始快照已绑定</em></article>
|
|
<article><small>交付租户</small><strong>36</strong><em>范围策略有效</em></article>
|
|
</div>
|
|
|
|
<article class="panel audit-table-panel">
|
|
<div class="table-toolbar">
|
|
<div class="segmented" id="auditFilters">
|
|
<button class="active" data-audit-filter="all">全部事件</button>
|
|
<button data-audit-filter="collect">采集</button>
|
|
<button data-audit-filter="quality">质量</button>
|
|
<button data-audit-filter="publish">发布</button>
|
|
<button data-audit-filter="operations">运营处置</button>
|
|
<button data-audit-filter="exchange">导入导出</button>
|
|
</div>
|
|
<span>审计存储 WORM · 每日校验</span>
|
|
</div>
|
|
<div class="table-wrap">
|
|
<table class="data-table">
|
|
<thead><tr><th>时间与追踪编号</th><th>事件</th><th>对象</th><th>操作者/服务</th><th>结果</th><th>证据</th></tr></thead>
|
|
<tbody id="auditTable"></tbody>
|
|
</table>
|
|
</div>
|
|
</article>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="sidebar-scrim" id="sidebarScrim"></div>
|
|
<div class="toast-region" id="toastRegion" aria-live="polite"></div>
|
|
|
|
<div class="drawer-backdrop" id="sourceDrawer" aria-hidden="true">
|
|
<aside class="drawer" role="dialog" aria-modal="true" aria-labelledby="sourceDrawerTitle">
|
|
<header class="drawer-header">
|
|
<div>
|
|
<span id="sourceDrawerKicker">SOURCE DETAIL</span>
|
|
<h2 id="sourceDrawerTitle">数据源详情</h2>
|
|
<p id="sourceDrawerDescription">查看采集策略、映射、运行和审计证据。</p>
|
|
</div>
|
|
<button class="icon-button" id="closeSourceDrawer" aria-label="关闭数据源详情">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
</header>
|
|
<nav class="drawer-tabs" id="sourceDrawerTabs">
|
|
<button class="active" data-source-tab="overview">资产概览</button>
|
|
<button data-source-tab="acquisition">采集配置</button>
|
|
<button data-source-tab="mapping">字段映射</button>
|
|
<button data-source-tab="runtime">运行记录</button>
|
|
<button data-source-tab="audit">审计证据</button>
|
|
</nav>
|
|
<div class="drawer-content" id="sourceDrawerContent"></div>
|
|
<footer class="drawer-footer" id="sourceDrawerFooter"></footer>
|
|
</aside>
|
|
</div>
|
|
|
|
<div class="drawer-backdrop" id="recordDrawer" aria-hidden="true">
|
|
<aside class="drawer record-drawer" role="dialog" aria-modal="true" aria-labelledby="recordDrawerTitle">
|
|
<header class="drawer-header">
|
|
<div>
|
|
<span id="recordDrawerKicker">DATA RECORD</span>
|
|
<h2 id="recordDrawerTitle">采集记录详情</h2>
|
|
<p id="recordDrawerDescription">查看业务字段和全链路来源证据。</p>
|
|
</div>
|
|
<button class="icon-button" id="closeRecordDrawer" aria-label="关闭采集记录详情">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
</header>
|
|
<div class="drawer-content" id="recordDrawerContent"></div>
|
|
<footer class="drawer-footer" id="recordDrawerFooter"></footer>
|
|
</aside>
|
|
</div>
|
|
|
|
<div class="drawer-backdrop" id="issueDrawer" aria-hidden="true">
|
|
<aside class="drawer issue-drawer" role="dialog" aria-modal="true" aria-labelledby="issueDrawerTitle">
|
|
<header class="drawer-header">
|
|
<div>
|
|
<span id="issueDrawerKicker">OPERATIONS ISSUE</span>
|
|
<h2 id="issueDrawerTitle">问题详情</h2>
|
|
<p id="issueDrawerDescription">查看负责人、SLA、影响、证据和处置时间线。</p>
|
|
</div>
|
|
<button class="icon-button" id="closeIssueDrawer" aria-label="关闭问题详情">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
</header>
|
|
<div class="drawer-content" id="issueDrawerContent"></div>
|
|
<footer class="drawer-footer issue-drawer-footer" id="issueDrawerFooter"></footer>
|
|
</aside>
|
|
</div>
|
|
|
|
<div class="modal-backdrop" id="sourceModal" aria-hidden="true">
|
|
<section class="modal" role="dialog" aria-modal="true" aria-labelledby="sourceModalTitle">
|
|
<button class="modal-close" data-close-modal aria-label="关闭">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
<span class="modal-kicker">SOURCE ONBOARDING</span>
|
|
<h2 id="sourceModalTitle">注册新数据源</h2>
|
|
<p>登记来源、连接方式和目标契约,保存后自动创建连接测试与初次全量任务。</p>
|
|
<form id="sourceForm">
|
|
<div class="form-grid">
|
|
<label><span>数据源名称</span><input id="newSourceName" required placeholder="例如:区域人才招聘平台" /></label>
|
|
<label><span>来源类别</span><select id="newSourceCategory"><option value="commercial">商业招聘平台</option><option value="public">公共就业平台</option><option value="school">校内业务系统</option></select></label>
|
|
<label class="full"><span>入口域名或接口地址</span><input id="newSourceDomain" required placeholder="https://example.com/jobs" /></label>
|
|
<label><span>接入方式</span><select id="newSourceMode"><option>网页采集器</option><option>官方 API</option><option>授权数据包</option><option>数据库视图</option><option>标准文件导入</option></select></label>
|
|
<label><span>目标契约</span><select id="newSourceContract"><option>JOB-SIGNAL V3.0</option><option>SCHOOL-EMPLOYMENT V2.2</option><option>SCHOOL-INTERNSHIP V2.1</option></select></label>
|
|
<label><span>更新频率</span><select id="newSourceSchedule"><option>每 6 小时</option><option>每日 02:00</option><option>每周一</option><option>人工触发</option></select></label>
|
|
<label><span>技术负责人</span><input id="newSourceOwner" value="平台采集工程组" /></label>
|
|
<label class="full"><span>采集范围</span><textarea id="newSourceScope" rows="3">全国 · 应届生与实习岗位 · 重点产业岗位族</textarea></label>
|
|
</div>
|
|
<div class="modal-actions">
|
|
<button type="button" class="button secondary" data-close-modal>取消</button>
|
|
<button type="submit" class="button primary">注册并创建连接测试</button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
|
|
<div class="modal-backdrop" id="jobModal" aria-hidden="true">
|
|
<section class="modal" role="dialog" aria-modal="true" aria-labelledby="jobModalTitle">
|
|
<button class="modal-close" data-close-modal aria-label="关闭">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
<span class="modal-kicker">COLLECTION JOB</span>
|
|
<h2 id="jobModalTitle">新建采集任务</h2>
|
|
<p>选择来源、范围和运行策略,任务会先进行小样本预检,再进入生产队列。</p>
|
|
<form id="jobForm">
|
|
<div class="form-grid">
|
|
<label><span>任务名称</span><input id="jobName" required value="重点产业岗位增量采集" /></label>
|
|
<label><span>数据源</span><select id="jobSource"></select></label>
|
|
<label><span>地域范围</span><input id="jobRegion" value="杭州、宁波、嘉兴、绍兴" /></label>
|
|
<label><span>岗位范围</span><input id="jobScope" value="数字技术、智能制造、现代服务" /></label>
|
|
<label><span>任务模式</span><select id="jobMode"><option>增量采集</option><option>初次全量</option><option>样本验证</option></select></label>
|
|
<label><span>优先级</span><select id="jobPriority"><option>P1 标准</option><option>P0 紧急</option><option>P2 后台</option></select></label>
|
|
<label><span>调度时间</span><select id="jobSchedule"><option>立即执行</option><option>下个调度窗口</option><option>每日 02:00</option></select></label>
|
|
<label><span>失败策略</span><select><option>分片隔离,其他继续</option><option>任一失败则停止</option></select></label>
|
|
</div>
|
|
<div class="modal-actions">
|
|
<button type="button" class="button secondary" data-close-modal>取消</button>
|
|
<button type="submit" class="button primary">创建并进入预检</button>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
</div>
|
|
|
|
<div class="modal-backdrop" id="infoModal" aria-hidden="true">
|
|
<section class="modal compact-modal" role="dialog" aria-modal="true" aria-labelledby="infoModalTitle">
|
|
<button class="modal-close" data-close-modal aria-label="关闭">
|
|
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
|
|
</button>
|
|
<span class="modal-kicker" id="infoModalKicker">DETAIL</span>
|
|
<h2 id="infoModalTitle">详情</h2>
|
|
<div id="infoModalContent"></div>
|
|
<div class="modal-actions"><button class="button primary" data-close-modal>完成</button></div>
|
|
</section>
|
|
</div>
|
|
|
|
<script src="./app.js"></script>
|
|
</body>
|
|
</html>
|