feat: 新增支付页面接口,为接入支付宝做准备

- GET /payment: 套餐选择页(无需认证,外部浏览器打开)
- GET /payment/page: 支付引导页(需 JWT,创建订单)
- GET /payment/pay: 支付宝电脑网站支付占位页(需 JWT)
- AppState 新增支付宝配置字段(可选)
- afterbody.js: PDF下载增加状态提示和重试按钮
This commit is contained in:
2026-04-23 10:48:31 +08:00
parent fe0e831210
commit 8c9552fbfc
7 changed files with 575 additions and 12 deletions

View File

@@ -232,17 +232,95 @@ const WeatherReport = (function () {
html2pdf().set(options).from(htmlContent).save();
}
// 下载状态管理(供重试使用)
let downloadState = {
ready: false,
html: null,
filename: null,
};
// 下载提示浮层
function showDownloadPrompt(type, message) {
let overlay = document.getElementById("download-overlay");
if (!overlay) {
overlay = document.createElement("div");
overlay.id = "download-overlay";
overlay.innerHTML = `
<style>
#download-overlay {
position: fixed;
top: 0; left: 0; right: 0;
z-index: 9999;
padding: 16px;
text-align: center;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
transition: opacity 0.3s;
pointer-events: none;
}
#download-overlay .msg {
display: inline-block;
background: rgba(0,0,0,0.75);
color: #fff;
padding: 12px 24px;
border-radius: 8px;
font-size: 14px;
}
#download-overlay .retry-btn {
display: inline-block;
margin-left: 12px;
background: #1677ff;
color: #fff;
border: none;
padding: 8px 16px;
border-radius: 6px;
font-size: 13px;
cursor: pointer;
pointer-events: auto;
}
</style>
<span class="msg" id="dl-msg"></span>
<span class="retry-btn" id="dl-retry" style="display:none" onclick="WeatherReport.retryDownload()">重新下载</span>
`;
document.body.appendChild(overlay);
}
const msgEl = document.getElementById("dl-msg");
const retryEl = document.getElementById("dl-retry");
if (msgEl) msgEl.textContent = message;
if (retryEl) {
if (type === "loading" || type === "success") {
retryEl.style.display = "none";
} else {
retryEl.style.display = "inline-block";
}
}
}
function hideDownloadPrompt() {
const overlay = document.getElementById("download-overlay");
if (overlay) {
overlay.style.opacity = "0";
setTimeout(() => { if (overlay) overlay.remove(); }, 300);
}
}
function retryDownload() {
if (!downloadState.ready || !downloadState.html || !downloadState.filename) {
showDownloadPrompt("error", "数据未准备好,请刷新页面重试");
return;
}
downloadPDF(downloadState.html, downloadState.filename);
showDownloadPrompt("success", "正在重新下载,请稍候...");
}
function init() {
if (typeof window.weatherData === "undefined") {
console.error("错误window.weatherData 未定义");
showDownloadPrompt("error", "数据加载失败,请刷新页面重试");
return;
}
const data = window.weatherData;
console.log("【调试】从后端获取的 weatherData:", data);
console.log("【调试】inspectionType:", data.inspectionType);
console.log("【调试】assignmentNumber:", data.assignmentNumber);
console.log("【调试】title:", data.title);
const versionEl = document.querySelector(".version");
if (versionEl) {
@@ -251,7 +329,30 @@ const WeatherReport = (function () {
const html = buildReportHTML(data);
const filename = `${data.id}-${data.version || "unknown"}.pdf`;
downloadPDF(html, filename);
// 保存下载状态,供重试使用
downloadState.ready = true;
downloadState.html = html;
downloadState.filename = filename;
// 显示下载中提示
showDownloadPrompt("loading", "正在生成 PDF请稍候...");
// 延迟执行下载,让用户看到提示
setTimeout(() => {
downloadPDF(html, filename);
// 显示成功提示3秒后消失
showDownloadPrompt("success", "PDF 开始下载...");
setTimeout(() => hideDownloadPrompt(), 3000);
// 额外等3秒如果提示已消失下载成功则不再显示重试
// 如果提示还在(下载失败),则替换为重试按钮
setTimeout(() => {
const overlay = document.getElementById("download-overlay");
if (overlay) {
showDownloadPrompt("retry", "下载未开始,请点击重试");
}
}, 3300);
}, 300);
}
document.addEventListener("DOMContentLoaded", function () {
@@ -293,5 +394,6 @@ const WeatherReport = (function () {
init,
toggleFormula,
showNotification,
retryDownload,
};
})();