feat(前端界面): 新增安全标签,集中加密与签名

This commit is contained in:
xiaoqidun committed 2026-10-25 21:28:12 +08:00
1 parent 17383adab6
commit 2eaf5366bf
3 files changed
+24 -17

No files matched your search

+14 -11
View File
@@ -805,6 +805,7 @@
<div id="metaTabs" class="navigation-tabs"> <div id="metaTabs" class="navigation-tabs">
<button id="documentMetaTab" type="button" data-selected="true">文档</button> <button id="documentMetaTab" type="button" data-selected="true">文档</button>
<button id="fontsMetaTab" type="button" data-selected="false" tabindex="-1">字体</button> <button id="fontsMetaTab" type="button" data-selected="false" tabindex="-1">字体</button>
<button id="securityMetaTab" type="button" data-selected="false" tabindex="-1">安全</button>
</div> </div>
<div id="metaContent" class="meta-content"> <div id="metaContent" class="meta-content">
<div id="metaDocumentPanel"> <div id="metaDocumentPanel">
@@ -904,17 +905,6 @@
<summary>提示</summary> <summary>提示</summary>
<div id="conversionWarnings" class="panel-detail"></div> <div id="conversionWarnings" class="panel-detail"></div>
</details> </details>
<section id="securityPanel" class="security-panel" hidden>
<div class="panel-row"><div id="securityPanelTitle" class="panel-title compact">安全</div><div class="panel-actions"><button id="encryptSaveButton" class="small-button" type="button" disabled>加密</button><button id="signButton" class="small-button" type="button" disabled>签章</button><button id="verifyButton" class="small-button" type="button" disabled>验签</button></div></div>
<dl class="meta-list"><div><dt>加密</dt><dd id="securityEncryption">未加密</dd></div><div id="securitySchemeRow" hidden><dt>方式</dt><dd id="securityScheme"></dd></div><div id="securityMethodRow" hidden><dt>算法</dt><dd id="securityMethod"></dd></div></dl>
</section>
<section id="signaturePanel" class="signature-panel" hidden>
<div class="panel-row">
<div id="signaturePanelTitle" class="panel-title compact">签名</div>
<span id="signatureSummary" class="count-pill">0</span>
</div>
<div id="signatureList" class="signature-list"></div>
</section>
<section id="structurePanel" class="structure-panel" hidden> <section id="structurePanel" class="structure-panel" hidden>
<div class="panel-row"><div id="structurePanelTitle" class="panel-title compact">结构</div><div class="panel-actions"><span id="structureSummary" class="count-pill">0</span><button id="structureManage" class="small-button" type="button" hidden>管理</button></div></div> <div class="panel-row"><div id="structurePanelTitle" class="panel-title compact">结构</div><div class="panel-actions"><span id="structureSummary" class="count-pill">0</span><button id="structureManage" class="small-button" type="button" hidden>管理</button></div></div>
<div id="structureList" class="structure-list"></div> <div id="structureList" class="structure-list"></div>
@@ -942,6 +932,19 @@
<div id="fontList" class="font-list"></div> <div id="fontList" class="font-list"></div>
</section> </section>
</div> </div>
<div id="metaSecurityPanel" hidden>
<section id="securityPanel" class="security-panel" hidden>
<div class="panel-row"><div id="securityPanelTitle" class="panel-title compact">安全</div><div class="panel-actions"><button id="encryptSaveButton" class="small-button" type="button" disabled>加密</button><button id="signButton" class="small-button" type="button" disabled>签章</button><button id="verifyButton" class="small-button" type="button" disabled>验签</button></div></div>
<dl class="meta-list"><div><dt>加密</dt><dd id="securityEncryption">未加密</dd></div><div id="securitySchemeRow" hidden><dt>方式</dt><dd id="securityScheme"></dd></div><div id="securityMethodRow" hidden><dt>算法</dt><dd id="securityMethod"></dd></div></dl>
</section>
<section id="signaturePanel" class="signature-panel" hidden>
<div class="panel-row">
<div id="signaturePanelTitle" class="panel-title compact">签名</div>
<span id="signatureSummary" class="count-pill">0</span>
</div>
<div id="signatureList" class="signature-list"></div>
</section>
</div>
</div> </div>
</aside> </aside>
</main> </main>
+2 -1
View File
@@ -1896,7 +1896,8 @@ body[data-hide-meta] .meta-panel {
margin-bottom: 12px; margin-bottom: 12px;
} }
#metaFontsPanel > .doc-font-panel { #metaFontsPanel > .doc-font-panel,
#metaSecurityPanel > .security-panel {
margin-top: 0; margin-top: 0;
padding-top: 0; padding-top: 0;
border-top: 0; border-top: 0;
+8 -5
View File
@@ -184,7 +184,7 @@ function createDocumentState() {
showPages: !COMPACT_LAYOUT.matches, showPages: !COMPACT_LAYOUT.matches,
showMeta: !COMPACT_LAYOUT.matches, showMeta: !COMPACT_LAYOUT.matches,
metaTab: "document", metaTab: "document",
metaScroll: {document: 0, fonts: 0}, metaScroll: {document: 0, fonts: 0, security: 0},
}; };
} }
@@ -598,8 +598,10 @@ const el = {
metaContent: document.querySelector("#metaContent"), metaContent: document.querySelector("#metaContent"),
documentMetaTab: document.querySelector("#documentMetaTab"), documentMetaTab: document.querySelector("#documentMetaTab"),
fontsMetaTab: document.querySelector("#fontsMetaTab"), fontsMetaTab: document.querySelector("#fontsMetaTab"),
securityMetaTab: document.querySelector("#securityMetaTab"),
metaDocumentPanel: document.querySelector("#metaDocumentPanel"), metaDocumentPanel: document.querySelector("#metaDocumentPanel"),
metaFontsPanel: document.querySelector("#metaFontsPanel"), metaFontsPanel: document.querySelector("#metaFontsPanel"),
metaSecurityPanel: document.querySelector("#metaSecurityPanel"),
renderVectorButton: document.querySelector("#renderVectorButton"), renderVectorButton: document.querySelector("#renderVectorButton"),
renderRasterButton: document.querySelector("#renderRasterButton"), renderRasterButton: document.querySelector("#renderRasterButton"),
refreshAppButton: document.querySelector("#refreshAppButton"), refreshAppButton: document.querySelector("#refreshAppButton"),
@@ -1745,9 +1747,10 @@ el.outlinesTab.addEventListener("click", () => showNavigation(el.outlinesTab));
el.searchTab.addEventListener("click", focusSearch); el.searchTab.addEventListener("click", focusSearch);
el.documentMetaTab.addEventListener("click", () => showMetaSection(el.documentMetaTab)); el.documentMetaTab.addEventListener("click", () => showMetaSection(el.documentMetaTab));
el.fontsMetaTab.addEventListener("click", () => showMetaSection(el.fontsMetaTab)); el.fontsMetaTab.addEventListener("click", () => showMetaSection(el.fontsMetaTab));
el.securityMetaTab.addEventListener("click", () => showMetaSection(el.securityMetaTab));
for (const [container, buttons, show] of [ for (const [container, buttons, show] of [
[el.navigationTabs, [el.pagesTab, el.outlinesTab, el.annotationsTab, el.searchTab], showNavigation], [el.navigationTabs, [el.pagesTab, el.outlinesTab, el.annotationsTab, el.searchTab], showNavigation],
[el.metaTabs, [el.documentMetaTab, el.fontsMetaTab], showMetaSection], [el.metaTabs, [el.documentMetaTab, el.fontsMetaTab, el.securityMetaTab], showMetaSection],
]) container.addEventListener("keydown", (event) => { ]) container.addEventListener("keydown", (event) => {
if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) { if (event.isComposing || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
return; return;
@@ -6532,7 +6535,7 @@ async function openDocument(options = {}) {
el.navigationContent.scrollLeft = 0; el.navigationContent.scrollLeft = 0;
el.navigationContent.scrollTop = 0; el.navigationContent.scrollTop = 0;
state.metaTab = "document"; state.metaTab = "document";
state.metaScroll = {document: 0, fonts: 0}; state.metaScroll = {document: 0, fonts: 0, security: 0};
el.metaContent.scrollLeft = 0; el.metaContent.scrollLeft = 0;
renderMetaSections(); renderMetaSections();
} }
@@ -11636,12 +11639,12 @@ function focusSearch() {
function showMetaSection(selected) { function showMetaSection(selected) {
state.metaScroll[state.metaTab] = el.metaContent.scrollTop; state.metaScroll[state.metaTab] = el.metaContent.scrollTop;
state.metaTab = selected === el.fontsMetaTab ? "fonts" : "document"; state.metaTab = selected === el.securityMetaTab ? "security" : selected === el.fontsMetaTab ? "fonts" : "document";
renderMetaSections(); renderMetaSections();
} }
function renderMetaSections() { function renderMetaSections() {
for (const [tab, panel, name] of [[el.documentMetaTab, el.metaDocumentPanel, "document"], [el.fontsMetaTab, el.metaFontsPanel, "fonts"]]) { for (const [tab, panel, name] of [[el.documentMetaTab, el.metaDocumentPanel, "document"], [el.fontsMetaTab, el.metaFontsPanel, "fonts"], [el.securityMetaTab, el.metaSecurityPanel, "security"]]) {
const active = name === state.metaTab; const active = name === state.metaTab;
panel.hidden = !active; panel.hidden = !active;
tab.setAttribute("data-selected", String(active)); tab.setAttribute("data-selected", String(active));