feat(forum,admin): plate follow-pay MVP, sales column, order type tabs
Wire paid plate follow (admin meta + points/balance purchase + AJAX), re-check plate gate on topics, post list sales column, and order type subtabs; update gap matrix and admin IA map.
This commit is contained in:
1 parent
bccb14a487
commit
cf6ad0e972
12 files changed
+672
-12
No files matched your search
@@ -718,6 +718,110 @@
|
||||
});
|
||||
}
|
||||
|
||||
function formatFollowPayLabel(pay) {
|
||||
pay = pay || {};
|
||||
if (pay.is_free) {
|
||||
return 'VIP 免费关注';
|
||||
}
|
||||
if (pay.label) {
|
||||
return String(pay.label);
|
||||
}
|
||||
if (pay.modo === 'points') {
|
||||
return String(pay.amount || 0) + ' 积分';
|
||||
}
|
||||
return '¥' + String(pay.amount || '0');
|
||||
}
|
||||
|
||||
function purchasePlateFollow(plateId, button, payHint) {
|
||||
var confirmMsg = '确认付费关注该版块?';
|
||||
if (payHint && payHint.is_free) {
|
||||
confirmMsg = '确认使用 VIP 免费关注该版块?';
|
||||
} else if (payHint) {
|
||||
confirmMsg = '确认支付 ' + formatFollowPayLabel(payHint) + ' 关注该版块?';
|
||||
}
|
||||
if (!window.confirm(confirmMsg)) {
|
||||
button.disabled = false;
|
||||
return;
|
||||
}
|
||||
|
||||
var data = new FormData();
|
||||
data.append('action', 'aksrt_forum_purchase_plate_follow');
|
||||
data.append('plate_id', plateId);
|
||||
data.append('_nonce', rootData.forumNonce || '');
|
||||
|
||||
fetch((rootData.ajaxUrl || '/wp-admin/admin-ajax.php'), {
|
||||
method: 'POST',
|
||||
body: data,
|
||||
credentials: 'same-origin',
|
||||
}).then(function (r) { return r.json(); }).then(function (payload) {
|
||||
if (!payload.success) {
|
||||
throw new Error((payload.data && payload.data.message) || '支付失败');
|
||||
}
|
||||
var res = payload.data || {};
|
||||
button.setAttribute('data-followed', '1');
|
||||
button.classList.add('is-followed');
|
||||
var label = button.querySelector('span') || button;
|
||||
if (button.querySelector('i') && button.childNodes.length) {
|
||||
// keep icon, replace trailing text via last text-ish content
|
||||
button.innerHTML = '<i class="fas fa-heart"></i> 已关注';
|
||||
} else {
|
||||
button.textContent = '已关注';
|
||||
}
|
||||
if (typeof window.aksrtToast === 'function') {
|
||||
window.aksrtToast(res.message || '关注成功', 'success');
|
||||
}
|
||||
setTimeout(function () { window.location.reload(); }, 600);
|
||||
}).catch(function (error) {
|
||||
var msg = error.message || '支付失败';
|
||||
if (typeof window.aksrtToast === 'function') { window.aksrtToast(msg, 'error'); }
|
||||
else { window.alert(msg); }
|
||||
button.disabled = false;
|
||||
});
|
||||
}
|
||||
|
||||
function bindFollowPlateButton(button) {
|
||||
button.addEventListener('click', function () {
|
||||
var plateId = parseInt(button.getAttribute('data-plate-id') || '0', 10);
|
||||
if (!plateId || button.disabled) {
|
||||
return;
|
||||
}
|
||||
button.disabled = true;
|
||||
|
||||
var data = new FormData();
|
||||
data.append('action', 'aksrt_forum_follow_plate');
|
||||
data.append('plate_id', plateId);
|
||||
data.append('_nonce', rootData.forumNonce || '');
|
||||
|
||||
fetch((rootData.ajaxUrl || '/wp-admin/admin-ajax.php'), {
|
||||
method: 'POST',
|
||||
body: data,
|
||||
credentials: 'same-origin',
|
||||
}).then(function (r) { return r.json(); }).then(function (payload) {
|
||||
// Paid follow required
|
||||
if (!payload.success && payload.data && payload.data.require_pay) {
|
||||
purchasePlateFollow(plateId, button, payload.data.pay || {});
|
||||
return;
|
||||
}
|
||||
if (!payload.success) {
|
||||
throw new Error((payload.data && payload.data.message) || '操作失败');
|
||||
}
|
||||
var res = payload.data || {};
|
||||
var followed = !!res.followed;
|
||||
button.setAttribute('data-followed', followed ? '1' : '0');
|
||||
button.classList.toggle('is-followed', followed);
|
||||
button.innerHTML = followed
|
||||
? '<i class="fas fa-heart"></i> 已关注'
|
||||
: '<i class="fas fa-heart"></i> 关注';
|
||||
button.disabled = false;
|
||||
}).catch(function (error) {
|
||||
var msg = error.message || '操作失败';
|
||||
if (typeof window.aksrtToast === 'function') { window.aksrtToast(msg, 'error'); }
|
||||
else { window.alert(msg); }
|
||||
button.disabled = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function bindComposeCoverToggle(form) {
|
||||
var coverTypeSelect = form.querySelector('#compose-cover-type');
|
||||
var imageField = form.querySelector('#compose-cover-image-field');
|
||||
@@ -1455,6 +1559,7 @@
|
||||
document.querySelectorAll('.js-aksrt-adopt-answer').forEach(bindAdoptButton);
|
||||
document.querySelectorAll('.js-aksrt-unlock-topic').forEach(bindUnlockButton);
|
||||
document.querySelectorAll('.js-aksrt-purchase-topic').forEach(bindPurchaseButton);
|
||||
document.querySelectorAll('.js-aksrt-follow-plate').forEach(bindFollowPlateButton);
|
||||
bindForumCommentEngine();
|
||||
bindForumHomeTabs();
|
||||
bindBoardSortTabs();
|
||||
|
||||
Reference in new issue
Block a user