优化服务提供卡片样式,并增加仅校内访问tag

This commit is contained in:
2026-03-10 21:05:44 +08:00
parent 589e221f2d
commit 8f7503f9cd
4 changed files with 140 additions and 9 deletions
+3
View File
@@ -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` 作为默认图标。
- 勾选“是否为校内服务”后,服务卡片右上角会显示“仅校内访问”标签;不勾选则不显示该标签。
- 新增内容类型后若前台路由未生效,请进入 **设置 > 固定链接** 点击一次“保存更改”刷新重写规则。
## 🎨 设计规范
+97 -8
View File
@@ -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;
}
}
+34
View File
@@ -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');
?>
<p>
@@ -824,6 +829,18 @@ function itstudio_render_service_link_meta_box($post) {
<p class="description">
<?php esc_html_e('支持分别填写中英文名称与简介;未填写时会回退到标题/摘要。', 'itstudio'); ?>
</p>
<p>
<label for="itstudio_service_campus_only">
<input
type="checkbox"
id="itstudio_service_campus_only"
name="itstudio_service_campus_only"
value="1"
<?php checked($is_campus_only); ?>
>
<?php esc_html_e('是否为校内服务(勾选后前台显示“仅校内访问”)', 'itstudio'); ?>
</label>
</p>
<?php
}
@@ -864,6 +881,14 @@ function itstudio_save_service_meta($post_id) {
}
}
$campus_only_meta_key = itstudio_get_service_campus_only_meta_key();
$is_campus_only = isset($_POST['itstudio_service_campus_only']) && (string) wp_unslash($_POST['itstudio_service_campus_only']) === '1';
if ($is_campus_only) {
update_post_meta($post_id, $campus_only_meta_key, '1');
} else {
delete_post_meta($post_id, $campus_only_meta_key);
}
$url_meta_key = itstudio_get_service_url_meta_key();
$raw_url = isset($_POST['itstudio_service_url']) ? trim((string) wp_unslash($_POST['itstudio_service_url'])) : '';
@@ -962,6 +987,15 @@ function itstudio_get_service_target_url($service_id) {
return (string) get_permalink($service_id);
}
function itstudio_is_service_campus_only($service_id) {
$service_id = (int) $service_id;
if ($service_id <= 0) {
return false;
}
return (string) get_post_meta($service_id, itstudio_get_service_campus_only_meta_key(), true) === '1';
}
function itstudio_service_admin_columns($columns) {
$columns['service_category'] = __('分类', 'itstudio');
$columns['service_url'] = __('跳转链接', 'itstudio');
+6 -1
View File
@@ -47,6 +47,7 @@ if ($services_query->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)) {
<div class="services-directory-grid">
<?php foreach ($section['items'] as $item) : ?>
<a class="services-directory-card" href="<?php echo esc_url($item['url']); ?>" target="_blank" rel="noopener noreferrer">
<?php $card_classes = 'services-directory-card' . (!empty($item['is_campus_only']) ? ' is-campus-only' : ''); ?>
<a class="<?php echo esc_attr($card_classes); ?>" href="<?php echo esc_url($item['url']); ?>" target="_blank" rel="noopener noreferrer">
<?php if (!empty($item['is_campus_only'])) : ?>
<span class="services-directory-access services-directory-access-campus" data-cn="仅校内访问" data-en="Campus-only">仅校内访问</span>
<?php endif; ?>
<div class="services-directory-card-head">
<div class="services-directory-icon-wrap">
<?php if ($item['has_thumb']) : ?>