feat(credits): exchange balance for points

Replace the legacy points-to-balance and external points purchase flows
with direct integer balance-to-points exchange. Enforce exchange and
points-transfer limits and capability checks across the UI and REST API.
This commit is contained in:
kate522 committed 2026-08-13 15:20:06 +08:00
1 parent f9bce15c9a
commit 1247f9bf4e
18 files changed
+234 -648

No files matched your search

@@ -20,9 +20,11 @@ export const rechargeSchema = {
pay_balance_pass_charge_s: false,
pay_balance_pass_charge_desc: '',
pay_balance_pass_charge_only_password: false,
pay_balance_exchange_s: false,
pay_balance_exchange_rate: 100,
pay_balance_exchange_desc: '',
pay_balance_points_exchange_s: false,
pay_balance_points_exchange_rate: 100,
pay_balance_points_exchange_min_points: 100,
pay_balance_points_exchange_daily_max_points: 100000,
pay_balance_points_exchange_desc: '',
pay_balance_withdraw_s: false,
},
groups: [
@@ -79,12 +81,14 @@ export const rechargeSchema = {
},
{
key: 'exchange',
title: '积分兑换',
title: '余额兑换积分',
icon: 'fas fa-coins',
fields: [
{ key: 'pay_balance_exchange_s', label: '启用积分兑换', type: 'switch', default: false },
{ key: 'pay_balance_exchange_rate', label: '兑换比例', type: 'number', default: 100, min: 1, max: 10000, help: 'N 积分 = 1 元', dependsOn: { key: 'pay_balance_exchange_s', value: true } },
{ key: 'pay_balance_exchange_desc', label: '兑换说明', type: 'textarea', default: '', dependsOn: { key: 'pay_balance_exchange_s', value: true } },
{ key: 'pay_balance_points_exchange_s', label: '启用余额兑换积分', type: 'switch', default: false, dependsOn: { key: 'pay_balance_s', value: true } },
{ key: 'pay_balance_points_exchange_rate', label: '兑换比例', type: 'number', default: 100, min: 1, max: 10000, help: '1 余额 = N 积分', dependsOn: { key: 'pay_balance_points_exchange_s', value: true } },
{ key: 'pay_balance_points_exchange_min_points', label: '单笔最低购买积分', type: 'number', default: 100, min: 1, max: 10000000, dependsOn: { key: 'pay_balance_points_exchange_s', value: true } },
{ key: 'pay_balance_points_exchange_daily_max_points', label: '每日最高购买积分', type: 'number', default: 100000, min: 1, max: 10000000, dependsOn: { key: 'pay_balance_points_exchange_s', value: true } },
{ key: 'pay_balance_points_exchange_desc', label: '兑换说明', type: 'textarea', default: '', dependsOn: { key: 'pay_balance_points_exchange_s', value: true } },
],
},
{