feat(pay): points-to-VIP exchange and remaining-days upgrade pricing

Add pay_vip_points_exchange packages (level|points|days|title), REST redeem
for non-VIP users, unit|daily upgrade product for residual VIP1 days, and UI.
This commit is contained in:
kate522 committed 2026-07-14 18:52:11 +08:00
1 parent ba6ae854f8
commit 9eaddce457
6 files changed
+504 -66

No files matched your search

+45 -1
View File
@@ -318,7 +318,49 @@
}
// ===== VIP 开通 =====
// ===== VIP 积分兑换 =====
function initVipPointsExchange() {
var root = document.querySelector('[data-aksrt-vip-points]');
if (!root) return;
var tip = root.querySelector('[data-aksrt-vip-points-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
root.addEventListener('click', function (e) {
var btn = e.target.closest('[data-aksrt-vip-points-buy]');
if (!btn || busy || btn.disabled) return;
e.preventDefault();
var packageId = parseInt(btn.getAttribute('data-package-id') || '0', 10);
if (!packageId) return;
busy = true;
btn.classList.add('is-loading');
setTip('正在兑换…');
api('/pay/vip/points-exchange', {
method: 'POST',
body: JSON.stringify({ package_id: packageId })
}).then(function (r) {
busy = false;
btn.classList.remove('is-loading');
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '兑换失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
setTip((data && data.message) || '兑换成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
btn.classList.remove('is-loading');
setTip('网络错误,请重试', true);
});
});
}
// ===== VIP 开通 =====
function initVipShop() {
var root = document.querySelector('[data-aksrt-vip-shop]');
if (!root) return;
@@ -405,10 +447,12 @@
initSignin();
initInvite();
initVipShop();
initVipPointsExchange();
});
} else {
initSignin();
initInvite();
initVipShop();
initVipPointsExchange();
}
})();