diff --git a/README.md b/README.md index cee1892..7571d31 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git - 简介:服务双语字段(中文简介 / 英文简介) - 类别:服务分类双语字段(中文名称 / 英文名称) - 跳转链接:编辑页中的“服务跳转链接”字段 +- 访问属性:编辑页中的“是否为校内服务”勾选项 后台新增步骤: 1. 进入 **便民服务 > 新增便民服务**。 @@ -108,6 +109,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git - 中文名称 / 英文名称 - 中文简介 / 英文简介 - 服务跳转链接 + - 是否为校内服务(可选) 3. 设置特色图作为服务图标。 4. 在右侧选择或新建“服务分类”。 5. 发布后,该服务会自动出现在 `/services` 页面中。 @@ -120,6 +122,7 @@ git clone https://github.com/itstudio-2002/ITStudioMainSite.git 说明: - 若未设置“服务跳转链接”,前端会回退到该服务文章自身链接。 - 若未设置特色图,前端会使用 `resources/it_logo_2024.svg` 作为默认图标。 +- 勾选“是否为校内服务”后,服务卡片右上角会显示“仅校内访问”标签;不勾选则不显示该标签。 - 新增内容类型后若前台路由未生效,请进入 **设置 > 固定链接** 点击一次“保存更改”刷新重写规则。 ## 🎨 设计规范 diff --git a/assets/css/services-page.css b/assets/css/services-page.css index e51dc25..b4466f7 100644 --- a/assets/css/services-page.css +++ b/assets/css/services-page.css @@ -110,20 +110,65 @@ .services-directory-card { display: block; - border: 1px solid var(--border-default); - border-radius: 12px; - background: color-mix(in srgb, var(--bg-card) 94%, transparent); - padding: 12px; + position: relative; + overflow: hidden; + border: 1px solid color-mix(in srgb, var(--border-default) 86%, transparent); + border-radius: 6px; + background: + linear-gradient( + 132deg, + color-mix(in srgb, var(--color-primary) 10%, transparent) 0%, + transparent 38% + ), + linear-gradient( + 180deg, + color-mix(in srgb, var(--bg-card) 92%, #0f1726 8%) 0%, + color-mix(in srgb, var(--bg-card) 98%, transparent) 100% + ); + padding: 12px 12px 11px; min-height: 0; color: inherit; text-decoration: none; - transition: transform var(--duration-fast) var(--ease-in-out), border-color var(--duration-fast) var(--ease-in-out), box-shadow var(--duration-fast) var(--ease-in-out); + box-shadow: + 0 14px 26px -22px color-mix(in srgb, #000000 68%, transparent), + inset 0 1px 0 color-mix(in srgb, #ffffff 8%, transparent); + transition: transform var(--duration-fast) var(--ease-in-out), border-color var(--duration-fast) var(--ease-in-out), box-shadow var(--duration-fast) var(--ease-in-out), background var(--duration-fast) var(--ease-in-out); +} + +.services-directory-card::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + background: + linear-gradient(90deg, color-mix(in srgb, var(--color-primary) 64%, transparent), transparent) + top left / 58px 1px no-repeat, + linear-gradient(180deg, color-mix(in srgb, var(--color-primary) 64%, transparent), transparent) + top left / 1px 24px no-repeat; + opacity: 0.5; } .services-directory-card:hover { transform: translateY(-2px); - border-color: color-mix(in srgb, var(--color-primary) 52%, var(--border-default) 48%); - box-shadow: var(--shadow-sm); + border-color: color-mix(in srgb, var(--color-primary) 58%, var(--border-default) 42%); + box-shadow: + 0 20px 32px -24px color-mix(in srgb, #000000 72%, transparent), + inset 0 1px 0 color-mix(in srgb, #ffffff 10%, transparent); + background: + linear-gradient( + 132deg, + color-mix(in srgb, var(--color-primary) 14%, transparent) 0%, + transparent 40% + ), + linear-gradient( + 180deg, + color-mix(in srgb, var(--bg-card) 90%, #0f1726 10%) 0%, + color-mix(in srgb, var(--bg-card) 97%, transparent) 100% + ); +} + +.services-directory-card:hover .services-directory-name { + color: color-mix(in srgb, var(--text-primary) 82%, var(--color-primary) 18%); } .services-directory-card-head { @@ -135,7 +180,7 @@ .services-directory-icon-wrap { width: 54px; height: 54px; - border-radius: 12px; + border-radius: 6px; border: none; background: transparent; overflow: hidden; @@ -173,6 +218,39 @@ color: var(--text-secondary); } +.services-directory-access { + position: absolute; + top: 10px; + right: 10px; + z-index: 2; + margin: 0; + display: inline-flex; + align-items: center; + gap: 5px; + padding: 2px 8px 2px 7px; + border-radius: 4px; + font-size: 0.68rem; + font-weight: 700; + line-height: 1.35; + letter-spacing: 0.02em; + border: 1px solid color-mix(in srgb, var(--color-primary) 62%, var(--border-default) 38%); + background: color-mix(in srgb, var(--color-primary) 20%, var(--bg-card) 80%); + color: var(--color-primary); +} + +.services-directory-access::before { + content: ""; + width: 5px; + height: 5px; + border-radius: 1px; + background: currentColor; + opacity: 0.9; +} + +.services-directory-card.is-campus-only .services-directory-card-head { + padding-right: 98px; +} + .services-directory-desc { margin: 10px 0 0; padding-top: 10px; @@ -277,4 +355,15 @@ .services-directory-card { min-height: 0; } + + .services-directory-access { + top: 8px; + right: 8px; + font-size: 0.64rem; + padding: 2px 6px; + } + + .services-directory-card.is-campus-only .services-directory-card-head { + padding-right: 88px; + } } diff --git a/functions.php b/functions.php index 576085d..5aeb0e1 100644 --- a/functions.php +++ b/functions.php @@ -655,6 +655,10 @@ function itstudio_get_service_excerpt_en_meta_key() { return '_itstudio_service_excerpt_en'; } +function itstudio_get_service_campus_only_meta_key() { + return '_itstudio_service_campus_only'; +} + function itstudio_get_service_category_name_cn_meta_key() { return 'itstudio_service_category_name_cn'; } @@ -756,6 +760,7 @@ function itstudio_render_service_link_meta_box($post) { $title_en = (string) get_post_meta($post->ID, itstudio_get_service_title_en_meta_key(), true); $excerpt_cn = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_cn_meta_key(), true); $excerpt_en = (string) get_post_meta($post->ID, itstudio_get_service_excerpt_en_meta_key(), true); + $is_campus_only = itstudio_is_service_campus_only($post->ID); wp_nonce_field('itstudio_save_service_meta', 'itstudio_service_meta_nonce'); ?>
@@ -824,6 +829,18 @@ function itstudio_render_service_link_meta_box($post) {
+
+ +
have_posts()) { 'excerpt_cn' => $i18n_content['excerpt_cn'], 'excerpt_en' => $i18n_content['excerpt_en'], 'has_thumb' => has_post_thumbnail($service_id), + 'is_campus_only' => function_exists('itstudio_is_service_campus_only') ? itstudio_is_service_campus_only($service_id) : false, 'term_name_cn' => '', 'term_name_en' => '', ); @@ -158,7 +159,11 @@ if (!empty($uncategorized_items)) {