feat: 新增作息报时器功能并替换短链接前缀为/to/
- 新增作息报时器独立模块,包含完整的日程管理、语音播报和待机功能 - 短链接正式前缀由/l/改为/to/,解决手机小屏下与I、i、1字形混淆问题 - 保留旧前缀/l/、/L/、/I/、/i/兼容已分发的旧短链 - 新增短码大小写兜底匹配,仅唯一匹配时生效避免歧义 - 新增防爆紧急替换功能,可轮换首页鉴权并替换短链接 - 新增多个调试和集成测试脚本,保障数据安全和功能回归
This commit is contained in:
@@ -31,11 +31,66 @@
|
||||
</header>
|
||||
|
||||
<nav id="toolTabs" class="tab-nav" hidden>
|
||||
<button class="tab-btn" data-tab="emergency">首页导航防爆紧急替换</button>
|
||||
<button class="tab-btn active" data-tab="nav">首页导航生成器</button>
|
||||
<button class="tab-btn" data-tab="tool">Tool 令牌生成器</button>
|
||||
</nav>
|
||||
|
||||
<main id="appMain" hidden>
|
||||
<section class="tab-panel" data-panel="emergency">
|
||||
<div class="layout-grid">
|
||||
<section class="card">
|
||||
<div class="card-head">
|
||||
<h2>首页导航防爆紧急替换</h2>
|
||||
</div>
|
||||
<p class="card-desc">
|
||||
怀疑首页 token 或短链接被窥屏、被泄露,或有危险预感时,按顺序点下面两个按钮即可完成更换。
|
||||
旧 token 与旧短链接都会<strong>立即失效</strong>,无需手工改文件、改数据库。
|
||||
</p>
|
||||
|
||||
<div class="actions wrap">
|
||||
<button id="btnEmergencyRotate" class="btn btn-primary">自动生成向后 X 个月的鉴权,且当前鉴权立即失效</button>
|
||||
<select id="emergencyMonths" class="input emergency-months" title="有效期(月)"></select>
|
||||
<button id="btnEmergencyRelink" class="btn btn-primary">将新的首页鉴权token,自动生成新的短链接,且当前短链接立即失效</button>
|
||||
</div>
|
||||
|
||||
<label class="field">
|
||||
<span>执行过程</span>
|
||||
<textarea id="emergencyLog" class="textarea mono emergency-log" rows="14" readonly wrap="off" placeholder="点击上方按钮后,这里会滚动显示每一步的执行过程…"></textarea>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>最终 token(第 1 步产出)</span>
|
||||
<textarea id="emergencyTokenOut" class="textarea mono" rows="4" readonly wrap="off" placeholder="第 1 步完成后,新的首页鉴权 token 会显示在这里"></textarea>
|
||||
</label>
|
||||
<div class="actions">
|
||||
<button id="btnEmergencyCopyToken" class="btn">复制 token</button>
|
||||
</div>
|
||||
|
||||
<label class="field">
|
||||
<span>最终短链接(第 2 步产出)</span>
|
||||
<textarea id="emergencyShortUrlOut" class="textarea mono" rows="2" readonly wrap="off" placeholder="第 2 步完成后,新的短链接会显示在这里"></textarea>
|
||||
</label>
|
||||
<div class="actions">
|
||||
<button id="btnEmergencyCopyShortUrl" class="btn">复制短链接</button>
|
||||
</div>
|
||||
|
||||
<div id="emergencyMeta" class="result-grid"></div>
|
||||
|
||||
<details class="raw-details">
|
||||
<summary>说明与回滚</summary>
|
||||
<div class="card-desc">
|
||||
第 1 步:轮换导航密钥对(`config/nav-private.jwk.json` 与 `config/nav.jwk.json`),
|
||||
并用新私钥签发一枚有效期 30 天的首页 token。旧 token 会因旧公钥离开信任池而立即失效。<br>
|
||||
第 2 步:把新 token 绑到一条全新的短链接上,同时把旧的首页短链置为停用,旧短链立即失效。<br>
|
||||
两步执行前都会自动备份(密钥文件 + 短链库)到 `config/_nav-key-backup-时间戳/`,需要回滚时把备份覆盖回原位即可。<br>
|
||||
原有的手工做法(首页导航生成器 / Tool 令牌生成器 / 物理替换文件)全部保留有效,本页签只是快捷通道。
|
||||
</div>
|
||||
</details>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="tab-panel active" data-panel="nav">
|
||||
<div class="layout-grid">
|
||||
<section class="card">
|
||||
|
||||
Reference in New Issue
Block a user