From d7634d1ff6e3287e0b22fcfa9020fb1bdee92943 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 23 Aug 2026 20:59:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/admin/src/components/form/AksField.vue | 11 +- .../src/components/form/AksGalleryField.vue | 234 ++++++++++++++++++ assets/css/routes/sign.css | 3 +- src/Admin/ControllerBase.php | 4 + src/Admin/SchemaProvider.php | 11 + src/Settings/AuthReader.php | 27 +- templates/pages/page-sign.php | 8 +- templates/parts/modal-auth.php | 18 +- .../auth-source-contract.test.cjs | 24 ++ 9 files changed, 316 insertions(+), 24 deletions(-) create mode 100644 assets/admin/src/components/form/AksGalleryField.vue diff --git a/assets/admin/src/components/form/AksField.vue b/assets/admin/src/components/form/AksField.vue index ffb665f5..20557f2a 100644 --- a/assets/admin/src/components/form/AksField.vue +++ b/assets/admin/src/components/form/AksField.vue @@ -215,6 +215,14 @@ @update:model-value="emit('update:modelValue', $event)" /> + + + + + + + + + diff --git a/assets/css/routes/sign.css b/assets/css/routes/sign.css index 09b56ebf..9541ddee 100644 --- a/assets/css/routes/sign.css +++ b/assets/css/routes/sign.css @@ -89,7 +89,8 @@ #u_sign.has-sign-img .modal-dialog { width: 800px; } #u_sign .modal-content { position: relative; min-height: 300px; max-height: calc(100vh - 36px); overflow-x: hidden; overflow-y: auto; border: 0; border-radius: 8px; background: var(--main-bg-color, #fff); box-shadow: 0 12px 50px rgba(0, 0, 0, .22); } .auth-modal-close { position: absolute; top: 13px; right: 15px; z-index: 4; width: 30px; height: 30px; border: 0; border-radius: 50%; background: rgba(0, 0, 0, .04); color: var(--muted-color, #777); cursor: pointer; } -.sign-img { position: absolute; inset: 0 55% 0 0; background-position: center; background-size: cover; } +.sign-img { position: absolute; inset: 0 55% 0 0; overflow: hidden; } +.sign-img img { display: block; width: 100%; height: 100%; border-radius: 8px 0 0 8px; object-fit: cover; } .sign-img + .sign { max-width: unset; margin-left: 55%; padding: 34px 44px; } .page-template-user-sign { min-height: 100vh; background: var(--body-bg-color, #f5f6f7); } diff --git a/src/Admin/ControllerBase.php b/src/Admin/ControllerBase.php index e9b6c9f0..707b15b4 100644 --- a/src/Admin/ControllerBase.php +++ b/src/Admin/ControllerBase.php @@ -92,6 +92,10 @@ abstract class ControllerBase { case 'array': $out[$key] = is_array($val) ? $val : []; break; + case 'attachment_ids': + $ids = is_array($val) ? array_filter(array_map('absint', $val)) : []; + $out[$key] = array_values(array_unique($ids)); + break; default: $out[$key] = sanitize_text_field($val); } diff --git a/src/Admin/SchemaProvider.php b/src/Admin/SchemaProvider.php index 66b4ae93..0ed2926b 100644 --- a/src/Admin/SchemaProvider.php +++ b/src/Admin/SchemaProvider.php @@ -443,6 +443,12 @@ class SchemaProvider { private function sanitize_value($value, string $type) { switch ($type) { + case 'attachment_ids': + if (!is_array($value)) { + return []; + } + $ids = array_values(array_filter(array_map('absint', $value))); + return array_values(array_unique($ids)); case 'html': return wp_kses_post((string) $value); case 'textarea': @@ -488,6 +494,10 @@ class SchemaProvider { return $this->sanitize_value($value, $sanitize_type); } + if ($type === 'gallery') { + return $this->sanitize_value($value, 'attachment_ids'); + } + if (in_array($type, ['fieldset', 'accordion'], true)) { return $this->sanitize_object_fields($value, (array) ($field['fields'] ?? [])); } @@ -658,6 +668,7 @@ class SchemaProvider { 'icon' => 'string', 'media' => 'url', 'upload' => 'url', + 'gallery' => 'attachment_ids', 'code' => 'code', ]; diff --git a/src/Settings/AuthReader.php b/src/Settings/AuthReader.php index 100ad10a..a4d86024 100644 --- a/src/Settings/AuthReader.php +++ b/src/Settings/AuthReader.php @@ -86,7 +86,7 @@ trait AuthReader { $theme_mode = 'no'; } return [ - 'background' => self::get_value('sign_page_background', []), + 'background' => self::auth_gallery_ids('sign_page_background'), 'theme_mode' => $theme_mode, 'show_header' => (bool) self::get_value('sign_show_header', true), 'card_position' => in_array((string) self::get_value('sign_card_position', 'right'), ['left', 'center', 'right'], true) @@ -99,16 +99,27 @@ trait AuthReader { /** 弹窗 UI 配置数组 */ public static function modal_ui(): array { return [ - 'background' => self::get_value('sign_modal_background', []), + 'background' => self::auth_gallery_ids('sign_modal_background'), 'show_logo' => (bool) self::get_value('sign_modal_show_logo', false), ]; } + /** 认证图片库的唯一存储格式:正整数附件 ID 数组。 */ + private static function auth_gallery_ids(string $key): array { + $value = self::get_value($key, []); + if (!is_array($value)) { + return []; + } + + $ids = array_values(array_filter(array_map('absint', $value))); + return array_values(array_unique($ids)); + } + /** 登录框日间 LOGO URL(空时回退全局 logo_url) */ public static function user_logo_url(): string { - $ids = self::get_value('user_logo', []); - if (is_array($ids) && !empty($ids)) { - $url = wp_get_attachment_url((int) $ids[0]); + $ids = self::auth_gallery_ids('user_logo'); + if ($ids) { + $url = wp_get_attachment_image_url($ids[0], 'full'); if ($url) return $url; } return self::logo_url(); @@ -116,9 +127,9 @@ trait AuthReader { /** 登录框夜间 LOGO URL(空时回退全局 logo_dark_url) */ public static function user_logo_dark_url(): string { - $ids = self::get_value('user_logo_dark', []); - if (is_array($ids) && !empty($ids)) { - $url = wp_get_attachment_url((int) $ids[0]); + $ids = self::auth_gallery_ids('user_logo_dark'); + if ($ids) { + $url = wp_get_attachment_image_url($ids[0], 'full'); if ($url) return $url; } return self::logo_dark_url(); diff --git a/templates/pages/page-sign.php b/templates/pages/page-sign.php index 80ecd3a0..a2b44072 100644 --- a/templates/pages/page-sign.php +++ b/templates/pages/page-sign.php @@ -34,10 +34,8 @@ remove_action('wp_footer', 'aksrt_render_footer_tabbar', 20); remove_action('wp_footer', 'aksrt_render_float_buttons', 30); $ui = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::sign_page_ui() : []; $images = $ui['background'] ?? []; -if (is_string($images)) { - $images = array_filter(array_map('absint', explode(',', $images))); -} -$background_url = is_array($images) && $images ? (string) wp_get_attachment_url((int) $images[array_rand($images)]) : ''; +$background_id = $images ? (int) $images[array_rand($images)] : 0; +$background_url = $background_id > 0 ? (string) wp_get_attachment_image_url($background_id, 'full') : ''; $theme_mode = (string) ($ui['theme_mode'] ?? 'no'); $position = (string) ($ui['card_position'] ?? 'right'); $aksrt_auth_context = [ @@ -59,7 +57,7 @@ $aksrt_auth_context = [ > -
>
+
diff --git a/templates/parts/modal-auth.php b/templates/parts/modal-auth.php index 39122e01..ca8c36ca 100644 --- a/templates/parts/modal-auth.php +++ b/templates/parts/modal-auth.php @@ -13,13 +13,13 @@ if (is_user_logged_in() || (class_exists('\AKSRT\Settings\Settings') && \AKSRT\S $modal_ui = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::modal_ui() : []; $images = $modal_ui['background'] ?? []; -if (is_string($images)) { - $images = array_filter(array_map('absint', explode(',', $images))); -} -$image_url = ''; -if (is_array($images) && $images) { - $image_url = (string) wp_get_attachment_url((int) $images[array_rand($images)]); -} +$image_id = $images ? (int) $images[array_rand($images)] : 0; +$image_html = $image_id > 0 ? wp_get_attachment_image($image_id, 'full', false, [ + 'class' => 'fit-cover radius8', + 'alt' => get_bloginfo('name'), + 'loading' => 'lazy', + 'decoding' => 'async', +]) : ''; $auto = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::sign_modal_auto() : ['enabled' => false, 'waiting' => 5, 'expires' => 1]; $wechat = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_weixingzh_settings() : []; $initial_tab = !empty($wechat['priority']) && class_exists('\AKSRT\Auth\WeixinGzh') && \AKSRT\Auth\WeixinGzh::is_enabled() ? 'oauth' : 'signin'; @@ -30,12 +30,12 @@ $aksrt_auth_context = [ 'redirect_to' => home_url('/'), ]; ?> -