/** * Scert 首次初始化向导 - 全 4 步骤 UI 设计方案选型核心脚本 * 支持 3 套视觉体系(Deck、Ops、Minimal)无缝切换与全 4 步无损联动 */ let currentTheme = 'deck'; // 'deck' | 'ops' | 'minimal' let currentStep = 1; // 1 | 2 | 3 | 4 // 页面步骤元数据定义 const stepMetadata = { 1: { num: '01', title: '超级管理员与基础配置', sub: '初始化向导 • 第 1 步 / 共 4 步 (账户与持久化存储)' }, 2: { num: '02', title: '服务与通知配置', sub: '初始化向导 • 第 2 步 / 共 4 步 (出站 SMTP 告警通道)' }, 3: { num: '03', title: 'DNS 授权与验证', sub: '初始化向导 • 第 3 步 / 共 4 步 (DNS-01 自动化凭据)' }, 4: { num: '04', title: '管理页面证书与部署生效', sub: '初始化向导 • 第 4 步 / 共 4 步 (证书目录与核心服务)' } }; // 步骤切换处理 function goStep(step) { if (step < 1 || step > 4) return; currentStep = step; render(); } function nextStep() { if (currentStep < 4) { currentStep++; render(); } else { alert('恭喜!初始化向导全部 4 个步骤已演练完成,点击确认后可向后端发起完整生效请求。'); } } function prevStep() { if (currentStep > 1) { currentStep--; render(); } } // 方案切换处理 function switchTheme(theme) { currentTheme = theme; document.querySelectorAll('.nav-btn').forEach(btn => { if (btn.getAttribute('data-theme') === theme) { btn.classList.add('active'); } else { btn.classList.remove('active'); } }); render(); } // 渲染通用步骤进度条 function renderStepper() { const steps = [ { num: 1, name: '超级管理员', desc: '账号 / 网络 / 存储' }, { num: 2, name: '服务与通知', desc: 'SMTP 告警出站通道' }, { num: 3, name: 'DNS 验证', desc: 'DNS-01 API 授权' }, { num: 4, name: '证书与生效', desc: '证书目录 / 签发环境' } ]; return ` `; } // ========================================================================= // 方案 A:卡片式分体与状态联运流 (Card-Deck Flow) 全 4 步表单 // ========================================================================= function renderDeckStep(step) { if (step === 1) { return `
01

超级管理员凭据录入

账号用于登录 Scert Web 与受保护运维 CLI
02

网络与管理访问定位

支持通过公网 IP 或独立域名接入
03

持久化存储引擎 (Database)

建议轻量环境使用 SQLite 本地免运维引擎
SQLite 读写权限已在线校验通过
高安全受保护体系说明: 生产环境已彻底移除公网 /reset HTTP 入口。若遗忘超级管理员密码,请在物理宿主机通过系统管理员终端运行 scert.exe admin localreset,在受保护的本地 IPC 域内安全重置。
`; } else if (step === 2) { return `
01

SMTP 出站告警通知服务

仅作为出站邮件客户端向管理员分发证书通知
02

高级通知策略与重试控制

保障高可用投递与敏感信息收敛
`; } else if (step === 3) { return `
01

DNS 服务商授权配置

支持通过 API 自动化注入 _acme-challenge TXT 记录
02

DNS API 联调探针 (Live Verification)

API 权限三阶段检验状态: 探针通过 • 有效期 15 分钟
① TXT 临时记录创建
✔ 注入成功 (Status 200)
② 权威 DNS 节点解析
✔ 权威节点秒级生效
③ 残留记录原子清理
✔ 临时记录清理完成
`; } else if (step === 4) { return `
01

证书部署根目录与环境

填写服务器宿主机绝对路径,系统将自动创建受保护目录
02

HTTPS 模式与服务入口设定

支持直接核心接管或前置反向代理
初始化已就绪: 点击下方“完成初始化并启动服务”后,Scert 将在后台安全签发管理证书、固化数据库配置并直接进入主控制台。
`; } } // ========================================================================= // 方案 B:沉浸式专业运维仪表板 (Ops-Console Split) 全 4 步表单与实时链路拓扑 // ========================================================================= function renderOpsStep(step) { let formContent = ''; let topoContent = ''; if (step === 1) { formContent = `
SEC

管理员安全凭据

NET

网络拓扑与存储核心

`; topoContent = `
实时系统链路 (TOPOLOGY) ● READY
INBOUND TRAFFIC
HTTP/HTTPS :5200 (127.0.0.1)
▼ 协议隔离与拦截
SCERT CORE ENGINE
Strict-Same-Origin Check
▼ 本地事务锁
STORAGE BACKEND
scert.db (WAL 模式)
Same-Origin HeaderPASS
Database TokenVERIFIED
DNS API ProbeSTEP 3 PENDING
Admin Reset ModeLOCAL IPC ONLY
`; } else if (step === 2) { formContent = `
MAIL

SMTP 出站路由通道

OPT

高级通知策略

`; topoContent = `
出站通知拓扑 (OUTBOUND MAIL) ● CONFIGURED
ALERT TRIGGER SOURCE
Certificate Expiry / Renew Hook
▼ STARTTLS 587
GATEWAY HOST
smtp.solit.cn
▼ 直达运维邮箱
RECIPIENTS
ops@solit.cn (2 targets)
SMTP Host DNSRESOLVED
STARTTLS HandshakeSTANDBY
`; } else if (step === 3) { formContent = `
DNS

DNS-01 验证适配器凭据

`; topoContent = `
DNS-01 挑战拓扑 (CHALLENGE) ● READY
ACME SERVER REQUEST
_acme-challenge.solit.cn
▼ API 注入 TXT 记录
ALIYUN DNS CLOUD
AliyunDNSFullAccess API
▼ 全球 DNS 权威解析节点
PROPAGATION STATUS
300s SLA Max (Avg: 2.1s)
API CredentialsVALID
Live ProbePASSED (1.3s)
`; } else if (step === 4) { formContent = `
SSL

证书根目录与签发引擎环境

`; topoContent = `
生产证书生效链路 (CERT OPS) ● READY TO ISSUE
MANAGED ROOT DIR
D:/Desktop/Scert/.../ssl
▼ 自动下发受信任证书
PRODUCTION CA
Let's Encrypt Production
▼ 绑定核心端口并启动
HTTPS LISTENER
Direct TLS :5200 (Active)
Directory AccessWRITABLE
Bootstrap LockFINAL READY
`; } return `
${formContent}
${topoContent}
`; } // ========================================================================= // 方案 C:极简轻奢分步引导台 (Minimalist Focus) 全 4 步表单 // ========================================================================= function renderMinimalStep(step) { if (step === 1) { return `
01 / ADMIN IDENTITY (超级管理员账户)
02 / ACCESS & PERSISTENCE (访问入口与存储)
✔ SQLite 存储文件读写状态验证正常
`; } else if (step === 2) { return `
01 / NOTIFICATION ROUTE (告警通知路由)
`; } else if (step === 3) { return `
01 / DNS-01 API INTEGRATION (DNS-01 自动化接口)
`; } else if (step === 4) { return `
01 / CERTIFICATE & ENGINE FINALIZE (证书与最终部署)
`; } } // ========================================================================= // 统一渲染调度主函数 render() // ========================================================================= function render() { const frame = document.getElementById('preview-frame'); if (!frame) return; const meta = stepMetadata[currentStep]; // 1. 侧边栏 const brandSidebar = ` `; // 2. 右侧主体 let stepBody = ''; if (currentTheme === 'deck') { stepBody = renderDeckStep(currentStep); } else if (currentTheme === 'ops') { stepBody = renderOpsStep(currentStep); } else if (currentTheme === 'minimal') { stepBody = renderMinimalStep(currentStep); } // 3. 底部操作栏 const isLast = currentStep === 4; const isFirst = currentStep === 1; const footer = ` `; // 4. 组装整个容器 frame.innerHTML = ` ${brandSidebar}
${meta.sub}

${meta.title}

受保护的 HTTPS 初始化 (Strict-Same-Origin)
${renderStepper()}
${stepBody}
${footer}
`; } // 页面加载完成后自动触发初始渲染 window.addEventListener('DOMContentLoaded', () => { render(); }); render();