增加ai配置和ai广场功能

This commit is contained in:
hero920103 committed 2026-11-09 16:44:11 +08:00
1 parent 244b4bd9fd
commit d9a50e23dd
27 files changed
+3808 -57

No files matched your search

+33 -22
View File
@@ -42,7 +42,6 @@ const glyph = computed(() => props.item.title.slice(0, 1));
<span class="content-card__deco" aria-hidden="true"></span>
<span class="content-card__glyph" aria-hidden="true">{{ glyph }}</span>
</template>
<span class="content-card__badge">{{ categoryLabel }}</span>
</div>
<div class="content-card__body">
@@ -53,15 +52,18 @@ const glyph = computed(() => props.item.title.slice(0, 1));
<p class="content-card__summary">{{ item.summary }}</p>
<div class="content-card__foot">
<span v-if="item.date" class="content-card__date">
<AppIcon name="clock" :size="14" />
{{ item.date }}
</span>
<span v-else class="content-card__tags">
<em v-for="tag in (item.tags ?? []).slice(0, 2)" :key="tag">
{{ tag }}
</em>
</span>
<div class="content-card__foot-left">
<span class="content-card__badge">{{ categoryLabel }}</span>
<span v-if="item.date" class="content-card__date">
<AppIcon name="clock" :size="14" />
{{ item.date }}
</span>
<span v-else class="content-card__tags">
<em v-for="tag in (item.tags ?? []).slice(0, 2)" :key="tag">
{{ tag }}
</em>
</span>
</div>
<span class="content-card__more">
查看详情
@@ -149,17 +151,26 @@ const glyph = computed(() => props.item.title.slice(0, 1));
opacity 0.4s ease;
}
/* 分类标签:位于正文区日期上方,不再覆盖在封面图上 */
&__badge {
position: absolute;
left: 22px;
top: 22px;
padding: 5px 13px;
display: inline-flex;
align-items: center;
align-self: flex-start;
padding: 4px 12px;
border-radius: 100px;
background: rgba(255, 255, 255, 0.16);
backdrop-filter: blur(6px);
font-size: 11.5px;
background: @bg-soft;
font-size: 12px;
font-weight: 500;
letter-spacing: 0.06em;
letter-spacing: 0.04em;
color: @ink-600;
}
&__foot-left {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 10px;
min-width: 0;
}
/* ---------------- 正文 ---------------- */
@@ -248,7 +259,7 @@ const glyph = computed(() => props.item.title.slice(0, 1));
flex-direction: column;
.content-card__cover {
height: 176px;
aspect-ratio: 25 / 14;
}
}
@@ -258,7 +269,7 @@ const glyph = computed(() => props.item.title.slice(0, 1));
.content-card__cover {
width: 300px;
min-height: 200px;
aspect-ratio: 25 / 14;
}
.content-card__glyph {
@@ -283,7 +294,7 @@ const glyph = computed(() => props.item.title.slice(0, 1));
.content-card--list {
.content-card__cover {
width: 230px;
min-height: 176px;
aspect-ratio: 25 / 14;
}
.content-card__glyph {
@@ -298,7 +309,7 @@ const glyph = computed(() => props.item.title.slice(0, 1));
.content-card__cover {
width: 100%;
min-height: 148px;
aspect-ratio: 25 / 14;
}
}
+59
View File
@@ -7,6 +7,11 @@ import { navMenus } from "@/config/nav";
const route = useRoute();
// 统一认证中心地址:登录/注册均跳转到认证中心页面
const AUTH_CENTER = "https://api.yunzer.cn";
const authLoginUrl = `${AUTH_CENTER}/auth/login`;
const authRegisterUrl = `${AUTH_CENTER}/auth/register`;
const stuck = ref(false);
const menuOpen = ref(false);
@@ -118,6 +123,12 @@ const onHomeClick = () => {
</div>
</nav>
<!-- 登录 / 注册:跳转统一认证中心 -->
<div class="header-auth">
<a class="auth-link auth-link--login" :href="authLoginUrl">登录</a>
<a class="auth-link auth-link--register" :href="authRegisterUrl">试用</a>
</div>
<button
class="menu-toggle"
type="button"
@@ -181,6 +192,8 @@ const onHomeClick = () => {
>
{{ item.label }}
</RouterLink>
<a :href="authLoginUrl">登录</a>
<a :href="authRegisterUrl">试用</a>
</div>
</div>
</nav>
@@ -403,6 +416,52 @@ const onHomeClick = () => {
}
}
/* ---------- 登录 / 注册入口 ---------- */
.header-auth {
display: flex;
align-items: center;
gap: 12px;
flex-shrink: 0;
margin-left: 24px;
}
.auth-link {
display: inline-flex;
align-items: center;
justify-content: center;
height: 38px;
padding: 0 22px;
border-radius: 19px;
font-size: 14px;
font-weight: 600;
letter-spacing: 0.04em;
white-space: nowrap;
transition: color 0.2s ease, background-color 0.2s ease,
border-color 0.2s ease;
&--login {
color: @ink-700;
border: 1px solid @ink-300;
background: @white;
&:hover {
color: @blue-600;
border-color: @blue-600;
}
}
&--register {
color: @white;
background: @blue-600;
border: 1px solid @blue-600;
&:hover {
background: darken(@blue-600, 8%);
border-color: darken(@blue-600, 8%);
}
}
}
.menu-toggle {
display: none;
width: 30px;
+8
View File
@@ -221,6 +221,10 @@ watch(() => `${section.value.key}|${slug.value}`, load, { immediate: true });
grid-template-columns: minmax(0, 1fr) 340px;
gap: 64px;
align-items: start;
/* 全站容器 1680px 偏宽,详情页正文+侧栏收敛到 1400px 居中 */
max-width: 1400px;
margin-left: auto;
margin-right: auto;
}
}
@@ -390,6 +394,10 @@ watch(() => `${section.value.key}|${slug.value}`, load, { immediate: true });
/* ---------------- 相关推荐 ---------------- */
.detail-related {
margin-top: 96px;
/* 与上方正文网格同宽对齐(1400px 居中) */
max-width: 1400px;
margin-left: auto;
margin-right: auto;
&__head {
display: flex;