diff --git a/assets/admin/src/schema/sections/page-display/index.js b/assets/admin/src/schema/sections/page-display/index.js index 27de3175..237fc00c 100644 --- a/assets/admin/src/schema/sections/page-display/index.js +++ b/assets/admin/src/schema/sections/page-display/index.js @@ -313,6 +313,7 @@ export const pageDisplaySchemas = { user_home_tabs_mobile_hide: '', user_home_sidebar: false, user_home_cover: true, + user_home_route_identifier: 'nicename', user_home_follow: true, user_home_posts_per_page: 10, user_home_avatar: true, @@ -332,6 +333,7 @@ export const pageDisplaySchemas = { icon: 'fas fa-th-large', fields: [ { key: 'user_home_cover', label: '封面区域', type: 'switch', default: true, help: '用户主页顶部封面图' }, + { key: 'user_home_route_identifier', label: '主页 URL 标识', type: 'select', default: 'nicename', options: [{ label: '用户名 URL slug', value: 'nicename' }, { label: '数字用户 ID', value: 'uid' }] }, { key: 'user_home_sidebar', label: '侧边栏(已弃用)', type: 'switch', default: false, help: '公开主页为通栏布局(对齐 Zibll author);运行时强制关闭。交易服务请去用户中心。' }, { key: 'user_home_follow', label: '关注按钮', type: 'switch', default: true }, { key: 'user_home_posts_per_page', label: '每页文章数', type: 'number', default: 10, min: 5, max: 50 }, diff --git a/assets/admin/src/schema/sections/payment/recharge.js b/assets/admin/src/schema/sections/payment/recharge.js index d8d773bd..5759c6ba 100644 --- a/assets/admin/src/schema/sections/payment/recharge.js +++ b/assets/admin/src/schema/sections/payment/recharge.js @@ -24,7 +24,6 @@ export const rechargeSchema = { pay_balance_exchange_rate: 100, pay_balance_exchange_desc: '', pay_balance_withdraw_s: false, - pay_balance_withdraw_lowest_money: 50, }, groups: [ { @@ -94,7 +93,6 @@ export const rechargeSchema = { icon: 'fas fa-hand-holding-usd', fields: [ { key: 'pay_balance_withdraw_s', label: '启用余额提现', type: 'switch', default: false, dependsOn: { key: 'pay_balance_s', value: true } }, - { key: 'pay_balance_withdraw_lowest_money', label: '最低提现金额', type: 'number', default: 50, min: 1, max: 99999, dependsOn: { key: 'pay_balance_withdraw_s', value: true } }, ], }, ], diff --git a/assets/admin/src/schema/sections/payment/withdrawal.js b/assets/admin/src/schema/sections/payment/withdrawal.js index 2457f15d..ba497b41 100644 --- a/assets/admin/src/schema/sections/payment/withdrawal.js +++ b/assets/admin/src/schema/sections/payment/withdrawal.js @@ -2,11 +2,13 @@ export const withdrawalSchema = { key: 'payment.withdrawal', title: '提现管理', icon: 'fas fa-hand-holding-usd', - description: '配置提现门槛、手续费比例和提现说明。', + description: '配置提现门槛、手续费比例与每日限制。', defaults: { pay_rebate_withdraw_lowest_money: 50, - withdraw_service_charge: 0, - pay_rebate_withdraw_text_details: '
可提现金额达到50元后即可发起提现
\n
申请提现需后台人工处理,一般2-3小时,请耐心等待
\n
如有其它疑问,请与客服联系
', + withdraw_service_charge: 5, + withdraw_daily_count: 3, + withdraw_daily_limit: 50, + withdraw_reset_time: '00:00', }, groups: [ { @@ -14,9 +16,11 @@ export const withdrawalSchema = { title: '提现设置', icon: 'fas fa-sliders-h', fields: [ - { key: 'pay_rebate_withdraw_lowest_money', label: '最低提现金额', type: 'number', default: 50, min: 1, max: 99999 }, - { key: 'withdraw_service_charge', label: '提现手续费(%)', type: 'number', default: 0, min: 0, max: 50 }, - { key: 'pay_rebate_withdraw_text_details', label: '提现说明', type: 'textarea', default: '
可提现金额达到50元后即可发起提现
\n
申请提现需后台人工处理,一般2-3小时,请耐心等待
\n
如有其它疑问,请与客服联系
' }, + { key: 'pay_rebate_withdraw_lowest_money', label: '最低提现金额', type: 'number', default: 50, min: 0, max: 99999 }, + { key: 'withdraw_service_charge', label: '提现手续费(%)', type: 'number', default: 5, min: 0, max: 50 }, + { key: 'withdraw_daily_count', label: '每日可提现次数', type: 'number', default: 3, min: 0, max: 99999 }, + { key: 'withdraw_daily_limit', label: '每日提现上限', type: 'number', default: 50, min: 0, max: 999999 }, + { key: 'withdraw_reset_time', label: '重置时间', type: 'input', default: '00:00', help: '按站点 WordPress 时区重置,格式 HH:MM。' }, ], }, ], diff --git a/assets/js/credits.js b/assets/js/credits.js index 1c0692f4..8146c21e 100644 --- a/assets/js/credits.js +++ b/assets/js/credits.js @@ -930,11 +930,27 @@ var amountEl = form.querySelector('[data-aksrt-withdraw-amount]'); var methodEl = form.querySelector('[data-aksrt-withdraw-method]'); var accountEl = form.querySelector('[data-aksrt-withdraw-account]'); - var amount = amountEl ? parseFloat(amountEl.value || '0') : 0; + var rawAmount = amountEl ? String(amountEl.value || '').trim() : ''; + var amount = rawAmount ? Number(rawAmount) : 0; + var minAmount = amountEl ? Number(amountEl.getAttribute('data-withdraw-min') || '0') : 0; + var remainingAmount = amountEl ? Number(amountEl.getAttribute('data-withdraw-remaining-amount') || '0') : 0; + var remainingCount = amountEl ? Number(amountEl.getAttribute('data-withdraw-remaining-count') || '0') : 0; var method = methodEl ? methodEl.value : 'alipay'; var account = accountEl ? String(accountEl.value || '').trim() : ''; - if (!(amount > 0)) { - setTip('请输入提现金额', true); + if (!Number.isInteger(amount) || !(amount > 0)) { + setTip('提现金额必须为正整数', true); + return; + } + if (amount < minAmount) { + setTip('提现金额低于最低提现门槛', true); + return; + } + if (remainingCount <= 0) { + setTip('当日提现次数已用尽', true); + return; + } + if (amount > remainingAmount) { + setTip('本次提现后将超出单日提现总额上限', true); return; } if (!account) { @@ -953,8 +969,20 @@ return; } var data = (r.json && r.json.data) ? r.json.data : r.json; - setTip((data && data.message) || '申请已提交,正在刷新…'); - window.location.reload(); + setTip((data && data.message) || '申请已提交'); + closeModal(modal); + var panel = modal.closest ? modal.closest('.dashboard-panel') : null; + panel = panel || document.getElementById('panel-credits'); + var rest = (window.aksrtData && (window.aksrtData.restUrl || window.aksrtData.apiUrl)) || (window.aksrtUserCenter && window.aksrtUserCenter.restUrl) || ''; + if (panel && rest) { + fetch(rest.replace(/\/$/, '') + '/user-center/panel/credits', { credentials: 'same-origin', headers: { 'X-WP-Nonce': (window.aksrtData && (window.aksrtData.restNonce || window.aksrtData.nonce)) || '' } }) + .then(function (response) { return response.json(); }) + .then(function (payload) { + if (!payload || !payload.success || !payload.data || typeof payload.data.html !== 'string') return; + panel.innerHTML = payload.data.html; + if (window.AksrtFrontend && typeof window.AksrtFrontend.rehydrate === 'function') window.AksrtFrontend.rehydrate(panel, 'ajax'); + }); + } }).catch(function () { busy = false; setTip('网络错误,请重试', true); diff --git a/assets/js/routes/user-center.js b/assets/js/routes/user-center.js index 5cceb3eb..c62a25fe 100644 --- a/assets/js/routes/user-center.js +++ b/assets/js/routes/user-center.js @@ -124,16 +124,17 @@ } function tabFromUrl() { - var m = window.location.search.match(/[?&]tab=([^&]+)/); - var name = m ? decodeURIComponent(m[1]) : (cfg.activeTab || defaultTab); + var pathParts = window.location.pathname.replace(/\/+$/, '').split('/'); + var pathTab = pathParts.length > 2 && pathParts[pathParts.length - 2] === 'user' ? pathParts[pathParts.length - 1] : ''; + var name = pathTab || (cfg.activeTab || defaultTab); + if (name === 'balance') name = 'credits'; return tabAliases[name] || name; } function updateUrl(name) { if (!window.history.replaceState) return; - var u = new URL(window.location); - if (name === defaultTab) u.searchParams.delete('tab'); - else u.searchParams.set('tab', name); + var pathTab = name === 'credits' ? 'balance' : name; + var u = new URL('/user/' + pathTab + '/', window.location.origin); window.history.replaceState({}, '', u); } diff --git a/inc/helpers/aksrt-user-center.php b/inc/helpers/aksrt-user-center.php index 2e35a609..9a3f32be 100644 --- a/inc/helpers/aksrt-user-center.php +++ b/inc/helpers/aksrt-user-center.php @@ -106,13 +106,7 @@ if (!function_exists('aksrt_get_user_center_tab_url')) { if ('invite' === $tab || 'promotion' === $tab) { $tab = 'revenue'; } - $url = remove_query_arg([ - 'tab', 'posts_page', 'comments_page', 'favorites_page', 'credits_page', - 'post_status', 'creator_page', 'creator_status', 'saved', 'profile_error', - 'order_tab', 'otab', 'order_status', 'order_page', 'order_type', 'income_currency', 'income_status', 'income_page', 'section', - ], aksrt_get_user_center_url()); - - return add_query_arg('tab', $tab, $url); + return aksrt_get_user_center_url($tab); } } @@ -282,7 +276,10 @@ if (!function_exists('aksrt_user_center_resolve_tabs')) { $default = in_array('vip', $keys, true) ? 'vip' : (in_array('profile', $keys, true) ? 'profile' : ($keys[0] ?? 'profile')); - $active = isset($_GET['tab']) ? sanitize_key(wp_unslash($_GET['tab'])) : $default; + $active = (string) get_query_var('aksrt_user_center_tab') ?: $default; + if ($active === 'balance') { + $active = 'credits'; + } if ('signin' === $active || 'assets' === $active) { $active = 'credits'; } elseif ('invite' === $active || 'promotion' === $active) { diff --git a/inc/helpers/user-center-renderers/credits-wallet.php b/inc/helpers/user-center-renderers/credits-wallet.php index 59590781..818f3967 100644 --- a/inc/helpers/user-center-renderers/credits-wallet.php +++ b/inc/helpers/user-center-renderers/credits-wallet.php @@ -32,13 +32,16 @@ $withdraw_on = !empty($all_settings['pay_balance_withdraw_s']); if ($withdraw_on && class_exists('\AKSRT\Settings\Capabilities') && !\AKSRT\Settings\Capabilities::user_can('balance_withdraw', $uid)) { $withdraw_on = false; } -$withdraw_min = max(1, (float) ($all_settings['pay_balance_withdraw_lowest_money'] ?? $all_settings['pay_rebate_withdraw_lowest_money'] ?? 50)); +$withdraw_settings = class_exists('\\AKSRT\\Settings\\Settings') ? \AKSRT\Settings\Settings::get_withdrawal_settings() : []; +$withdraw_min = max(0, (float) ($withdraw_settings['min_amount'] ?? 50)); +$withdraw_usage = ['remaining_count' => 0, 'remaining_amount' => 0]; $withdraw_pending_hold = 0.0; $withdraw_history = []; if ($withdraw_on && class_exists('\AKSRT\Payment\Withdrawal')) { $wd_svc = \AKSRT\Payment\Withdrawal::get_instance(); $withdraw_pending_hold = $wd_svc->sum_pending_hold((int) ($user_id ?? 0)); $withdraw_history = $wd_svc->get_user_withdrawals((int) ($user_id ?? 0), ['limit' => 30]); + $withdraw_usage = $wd_svc->daily_usage((int) ($user_id ?? 0), $withdraw_settings); } $withdraw_processing = $withdraw_pending_hold > 0; $card_pass_balance = ['enabled' => false, 'desc' => '', 'only_password' => true]; @@ -66,7 +69,7 @@ $mark = (string) ($charge_view['currency_mark'] ?? '元'); @@ -81,11 +84,7 @@ $mark = (string) ($charge_view['currency_mark'] ?? '元'); - - - - - + @@ -100,9 +99,8 @@ $mark = (string) ($charge_view['currency_mark'] ?? '元'); -
+
-
diff --git a/inc/helpers/user-center-renderers/withdraw-modal.php b/inc/helpers/user-center-renderers/withdraw-modal.php index 5dc442e5..9247135d 100644 --- a/inc/helpers/user-center-renderers/withdraw-modal.php +++ b/inc/helpers/user-center-renderers/withdraw-modal.php @@ -1,19 +1,14 @@ 0, 'remaining_amount' => 0]; +$withdraw_fee_rate = (int) ($withdraw_settings['service_charge_rate'] ?? 5); ?>