feat(payment): 卡密管理改为独立页面并对齐参考主题

- 移除「余额充值」设置中的充值卡(card_pass_*)配置组,PHP schema 与 SPA mirror 双轨同步
- 重写后台卡密管理页:列表过滤/排序/搜索/批量删除/同款分页/点击复制、自动生成与导入、text/xls 导出
- ChargeCard 服务新增 generate_cards/rand_number/rand_password/delete_by_ids/get_export_rows,get_list 支持参考主题排序别名与标识过滤
- 删除无消费方的 /payment/charge-cards REST 路由及 batch_create/disable 死代码,数据层零迁移
This commit is contained in:
kate522 committed 2026-09-16 22:05:37 +08:00
1 parent ba1c8c2822
commit 678143e7b9
9 files changed
+1227 -788

No files matched your search

-9
View File
@@ -175,15 +175,6 @@ trait CreditsPaymentGroups {
return PaymentRuntime::get_order_settings();
}
/**
* 获取充值卡设置
*
* @return array{enabled:bool,desc:string,type:string,prefix:string,length:int,batch_size:int,max_redeem:int,expiry_days:int,amount:string,vip_days:int,credits:int,redeem_page:string,success_msg:string,fail_msg:string}
*/
public static function get_card_pass_settings(): array {
return PaymentRuntime::get_card_pass_settings();
}
/**
* 获取提现管理设置
*
-1
View File
@@ -272,7 +272,6 @@ trait DisplayPageGroups {
'affiliate' => self::get_payment_affiliate_settings(),
'gateway' => self::get_payment_gateway_settings(),
'order' => self::get_order_settings(),
'card_pass' => self::get_card_pass_settings(),
'withdrawal' => self::get_withdrawal_settings(),
];
}
-4
View File
@@ -242,10 +242,6 @@ class HomeCms {
return PaymentRuntime::get_order_settings();
}
public static function get_card_pass_settings(): array {
return PaymentRuntime::get_card_pass_settings();
}
public static function get_withdrawal_settings(): array {
return PaymentRuntime::get_withdrawal_settings();
}
+1 -31
View File
@@ -504,38 +504,8 @@ class PaymentRuntime {
}
/**
* @return array<string,mixed>
* @return array{min_amount:string,service_charge_rate:int,daily_count:int,daily_limit:string,reset_time:string,payout_channels:string[]}
*/
public static function get_card_pass_settings(): array {
$s = Settings::get_all();
$type = sanitize_key((string) ($s['card_pass_type'] ?? 'balance'));
if (!in_array($type, ['balance', 'vip', 'credits'], true)) {
$type = 'balance';
}
$success_msg = trim((string) ($s['card_pass_success_msg'] ?? ''));
$fail_msg = trim((string) ($s['card_pass_fail_msg'] ?? ''));
return [
'enabled' => !empty($s['card_pass_enabled']),
'desc' => sanitize_textarea_field((string) ($s['card_pass_desc'] ?? '')),
'type' => $type,
'prefix' => sanitize_text_field((string) ($s['card_pass_prefix'] ?? 'AK')),
'length' => max(8, min(32, (int) ($s['card_pass_length'] ?? 16))),
'batch_size' => max(1, min(500, (int) ($s['card_pass_batch_size'] ?? 50))),
'max_redeem' => max(1, min(100, (int) ($s['card_pass_max_redeem'] ?? 1))),
'expiry_days' => max(0, (int) ($s['card_pass_expiry'] ?? 0)),
'amount' => self::money_decimal($s['card_pass_amount'] ?? '10.00', '10.00', 999900),
'vip_days' => max(1, min(3650, (int) ($s['card_pass_vip_days'] ?? 30))),
'credits' => max(0, min(99999, (int) ($s['card_pass_credits'] ?? 0))),
'redeem_page' => esc_url_raw((string) ($s['card_pass_redeem_page'] ?? '')),
'success_msg' => $success_msg !== '' ? $success_msg : __('兑换成功!', 'aksrt'),
'fail_msg' => $fail_msg !== '' ? $fail_msg : __('卡号无效或已过期', 'aksrt'),
];
}
/** @return array{min_amount:string,service_charge_rate:int,daily_count:int,daily_limit:string,reset_time:string,payout_channels:string[]} */
public static function get_withdrawal_settings(): array {
$s = Settings::get_all();
$channels = array_values(array_intersect(['alipay', 'wechat'], array_map('sanitize_key', (array) ($s['affiliate_payout_channels'] ?? ['alipay', 'wechat']))));