diff --git a/assets/admin/src/schema/sections/payment/vip.js b/assets/admin/src/schema/sections/payment/vip.js
index 6a8ef4a4..10d8c43e 100644
--- a/assets/admin/src/schema/sections/payment/vip.js
+++ b/assets/admin/src/schema/sections/payment/vip.js
@@ -21,11 +21,8 @@ export const vipSchema = {
pay_user_vip_desc: '',
pay_user_vip_more: '',
pay_download_limit: 0,
- pay_download_speed: 0,
pay_download_limit_vip_1: 0,
- pay_download_speed_vip_1: 0,
pay_download_limit_vip_2: 0,
- pay_download_speed_vip_2: 0,
pay_vip_pass_charge_s: false,
pay_vip_pass_charge_desc: '',
pay_vip_pass_charge_only_password: true,
@@ -51,12 +48,12 @@ export const vipSchema = {
{ key: 'pay_user_vip_1_name', label: '一级会员名称', type: 'input', default: '一级会员', dependsOn: { key: 'pay_user_vip_1_s', value: true } },
{ key: 'pay_user_vip_1_desc', label: '一级会员一句话简介', type: 'input', default: '尊享一级会员特权', dependsOn: { key: 'pay_user_vip_1_s', value: true } },
{ key: 'pay_user_vip_1_equity', label: '一级会员权益 HTML', type: 'textarea', default: '
免费下载部分资源会员专属身份标识付费内容会员价', dependsOn: { key: 'pay_user_vip_1_s', value: true }, help: '建议使用 列表项' },
- { key: 'vip_1_img_icon', label: '一级会员图标 URL', type: 'input', default: '', dependsOn: { key: 'pay_user_vip_1_s', value: true } },
+ { key: 'vip_1_img_icon', label: '一级会员图标 URL', type: 'input', default: '', dependsOn: { key: 'pay_user_vip_1_s', value: true }, help: '留空使用内置 vip-1.svg 图标' },
{ key: 'pay_user_vip_2_s', label: '启用二级会员', type: 'switch', default: true },
{ key: 'pay_user_vip_2_name', label: '二级会员名称', type: 'input', default: '二级会员', dependsOn: { key: 'pay_user_vip_2_s', value: true } },
{ key: 'pay_user_vip_2_desc', label: '二级会员一句话简介', type: 'input', default: '尊享二级会员特权', dependsOn: { key: 'pay_user_vip_2_s', value: true } },
{ key: 'pay_user_vip_2_equity', label: '二级会员权益 HTML', type: 'textarea', default: '更高免费下载额度更高等级身份标识更多付费内容会员价', dependsOn: { key: 'pay_user_vip_2_s', value: true } },
- { key: 'vip_2_img_icon', label: '二级会员图标 URL', type: 'input', default: '', dependsOn: { key: 'pay_user_vip_2_s', value: true } },
+ { key: 'vip_2_img_icon', label: '二级会员图标 URL', type: 'input', default: '', dependsOn: { key: 'pay_user_vip_2_s', value: true }, help: '留空使用内置 vip-2.svg 图标' },
{ key: 'pay_user_vip_desc', label: '弹窗顶部会员说明', type: 'textarea', default: '' },
{ key: 'pay_user_vip_more', label: '弹窗底部补充说明 HTML', type: 'textarea', default: '' },
],
@@ -109,11 +106,8 @@ export const vipSchema = {
icon: 'fas fa-gift',
fields: [
{ key: 'pay_download_limit', label: '普通用户下载限制', type: 'number', default: 0, min: 0, max: 9999, help: '0为不限制' },
- { key: 'pay_download_speed', label: '普通用户下载速度(KB/s)', type: 'number', default: 0, min: 0, max: 99999, help: '0为不限制' },
{ key: 'pay_download_limit_vip_1', label: '一级会员下载限制', type: 'number', default: 0, min: 0, max: 9999, dependsOn: { key: 'pay_user_vip_1_s', value: true } },
- { key: 'pay_download_speed_vip_1', label: '一级会员下载速度(KB/s)', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'pay_user_vip_1_s', value: true } },
{ key: 'pay_download_limit_vip_2', label: '二级会员下载限制', type: 'number', default: 0, min: 0, max: 9999, dependsOn: { key: 'pay_user_vip_2_s', value: true } },
- { key: 'pay_download_speed_vip_2', label: '二级会员下载速度(KB/s)', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'pay_user_vip_2_s', value: true } },
{ key: 'pay_vip_pass_charge_s', label: '会员卡密兑换', type: 'switch', default: false },
{ key: 'pay_vip_pass_charge_desc', label: '卡密兑换说明', type: 'textarea', default: '', dependsOn: { key: 'pay_vip_pass_charge_s', value: true } },
{ key: 'pay_vip_pass_charge_only_password', label: '仅密码兑换', type: 'switch', default: true, dependsOn: { key: 'pay_vip_pass_charge_s', value: true }, help: '开启后只需输入卡密;关闭则需卡号+卡密。' },
diff --git a/assets/css/frontend/credits.css b/assets/css/frontend/credits.css
index 68c8ae29..d9b39852 100644
--- a/assets/css/frontend/credits.css
+++ b/assets/css/frontend/credits.css
@@ -361,6 +361,22 @@
vertical-align: middle;
}
+.aksrt-vip-level-icon {
+ display: inline-block;
+ width: 1.4em;
+ height: 1.4em;
+ object-fit: contain;
+ vertical-align: middle;
+}
+
+.aksrt-vip-badge__icon {
+ display: inline-block;
+ width: 1.1em;
+ height: 1.1em;
+ object-fit: contain;
+ vertical-align: -.15em;
+}
+
.aksrt-vip-badge i {
font-size: 10px;
}
diff --git a/assets/css/routes/user-center/credits.css b/assets/css/routes/user-center/credits.css
index e382f941..c48c9a41 100644
--- a/assets/css/routes/user-center/credits.css
+++ b/assets/css/routes/user-center/credits.css
@@ -691,6 +691,19 @@ body.uc-modal-open {
padding: 22px;
color: #fff;
}
+.aksrt-vip-level-icon {
+ display: inline-block;
+ width: 1.4em;
+ height: 1.4em;
+ object-fit: contain;
+ vertical-align: middle;
+}
+
+.uc-vip-card__icon .aksrt-vip-level-icon {
+ width: 28px;
+ height: 28px;
+}
+
.uc-vip-card__header {
display: flex;
align-items: center;
diff --git a/assets/img/user/vip/vip-1.svg b/assets/img/user/vip/vip-1.svg
new file mode 100644
index 00000000..a1d2934c
--- /dev/null
+++ b/assets/img/user/vip/vip-1.svg
@@ -0,0 +1 @@
+
diff --git a/assets/img/user/vip/vip-2.svg b/assets/img/user/vip/vip-2.svg
new file mode 100644
index 00000000..b700f4ff
--- /dev/null
+++ b/assets/img/user/vip/vip-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/js/pay-vip.js b/assets/js/pay-vip.js
index 23801c86..c37d993a 100644
--- a/assets/js/pay-vip.js
+++ b/assets/js/pay-vip.js
@@ -297,6 +297,14 @@
var row = node("div", "pay-vip-form-row");
var info = node("div", "pay-vip-info level-" + level);
var levelInfo = levels[String(level)] || {};
+ if (levelInfo.img_icon) {
+ var levelIcon = node("img", "aksrt-vip-level-icon");
+ levelIcon.src = text(levelInfo.img_icon);
+ levelIcon.alt = "";
+ levelIcon.loading = "lazy";
+ levelIcon.decoding = "async";
+ append(info, levelIcon);
+ }
append(info, node("div", "v-name font-bold", group.name || levelInfo.name || "VIP" + level));
if (levelInfo.desc) append(info, node("div", "muted-2-color em09 mb6", levelInfo.desc));
renderEquity(info, levelInfo.equity);
diff --git a/inc/helpers/aksrt-vip.php b/inc/helpers/aksrt-vip.php
index f5ea4c8a..a00790f3 100644
--- a/inc/helpers/aksrt-vip.php
+++ b/inc/helpers/aksrt-vip.php
@@ -230,31 +230,6 @@ if (!function_exists('aksrt_get_user_free_download_limit')) {
}
}
-/**
- * Download speed cap in KB/s for a user (0 = unlimited).
- */
-if (!function_exists('aksrt_get_user_download_speed')) {
- function aksrt_get_user_download_speed(int $user_id = 0): int {
- if ($user_id <= 0) {
- $user_id = get_current_user_id();
- }
- if ($user_id <= 0 || !class_exists('\AKSRT\Settings\Settings')) {
- return 0;
- }
-
- $vip = \AKSRT\Settings\Settings::get_payment_vip_settings();
- $level = function_exists('aksrt_get_user_vip_level') ? aksrt_get_user_vip_level($user_id) : 0;
- $levels = is_array($vip['levels'] ?? null) ? $vip['levels'] : [];
- $benefit = is_array($vip['benefit'] ?? null) ? $vip['benefit'] : [];
-
- if ($level >= 1 && !empty($levels[$level]['enabled'])) {
- return max(0, (int) ($levels[$level]['download_speed'] ?? 0));
- }
-
- return max(0, (int) ($benefit['download_speed'] ?? 0));
- }
-}
-
/**
* Count free downloads used today for a user (zibll pay_down_number).
*/
@@ -383,7 +358,16 @@ function aksrt_render_vip_badge(int $user_id = 0, string $size = 'sm'): string {
$size_class = 'aksrt-vip-badge--' . $size;
$level_class = $level >= 2 ? 'aksrt-vip-badge--vip2' : 'aksrt-vip-badge--vip1';
- return ' ' . esc_html($badge_text) . '';
+ $icon_url = '';
+ if (class_exists('\AKSRT\Settings\Settings')) {
+ $vip_settings = \AKSRT\Settings\Settings::get_payment_vip_settings();
+ $icon_url = esc_url((string) ($vip_settings['levels'][$level]['img_icon'] ?? ''));
+ }
+ $icon = $icon_url !== ''
+ ? '
'
+ : '';
+
+ return '' . $icon . ' ' . esc_html($badge_text) . '';
}
/**
diff --git a/inc/helpers/user-center-renderers/credits-vip.php b/inc/helpers/user-center-renderers/credits-vip.php
index 374d555e..f274bd4e 100644
--- a/inc/helpers/user-center-renderers/credits-vip.php
+++ b/inc/helpers/user-center-renderers/credits-vip.php
@@ -50,7 +50,10 @@ if ($vip_level >= 1 && !empty($vip_settings['levels'][$vip_level]['name'])) {
$level_name = (string) $vip_settings['levels'][$vip_level]['name'];
}
-$cash_symbol = '¥';
+$level_icon_url = esc_url((string) ($vip_settings['levels'][$vip_level]['img_icon'] ?? ''));
+$level_icon = $level_icon_url !== ''
+ ? '
'
+ : '';
if (class_exists('\AKSRT\Settings\Settings')) {
$paid_display = \AKSRT\Settings\Settings::get_paid_content_settings();
$cash_symbol = (string) ($paid_display['display']['currency_symbol'] ?? '¥');
@@ -79,7 +82,7 @@ if (class_exists('\AKSRT\Payment\ChargeCard')) {