feat: add customer service chat, optimize case and homepage, fix api proxy

这一提交完成了多项功能升级与优化:
1.  新增全局浮动客服组件,集成腾讯云TRTC聊天能力并添加错误格式化工具
2.  新增图片资源并调整部分静态文件结构
3.  优化案例页面:重构筛选逻辑、新增空状态处理、添加加载更多功能
4.  优化首页布局:修复统计数字动画、调整移动端适配样式、优化轮播逻辑
5.  重构官方内容获取工具:添加缓存机制、优化媒体资源处理
6.  优化API代理配置,移除默认本地代理并新增环境变量配置
7.  新增页面数据恢复刷新逻辑,优化页面交互体验
8.  修复按钮组件冗余代码,调整头部导航移动端样式
This commit is contained in:
2026-07-24 18:55:51 +08:00
parent 314cd6ccd7
commit 2ff1064de7
25 changed files with 4596 additions and 327 deletions
+28 -7
View File
@@ -30,15 +30,32 @@ const caseTags = computed(() =>
)
const relatedCases = computed(() =>
(pageData.value?.cases || []).filter((item) => item.slug !== slug).slice(0, 4)
(pageData.value?.cases || [])
.filter((item) => item.slug !== slug && item.isRecommended === true)
.slice(0, 4)
)
const recommendedCases = computed(() =>
(pageData.value?.cases || [])
.filter(
(item) => item.slug !== slug && item.isRecommended === true && item.isFullCase && item.slug
)
.slice(0, 5)
)
function caseListLink(item) {
return item.isFullCase && item.slug ? `/cases/${item.slug}` : '/cases'
}
useHead(() => ({
title: `${articleTitle.value}|客户案例`,
meta: [
{
name: 'description',
content: caseStudy.value.seoDescription || caseStudy.value.description || caseStudy.value.summary || articleTitle.value
content:
caseStudy.value.seoDescription ||
caseStudy.value.description ||
caseStudy.value.summary ||
articleTitle.value
},
{ property: 'og:title', content: articleTitle.value },
{ property: 'og:description', content: caseStudy.value.description || caseStudy.value.summary },
@@ -229,11 +246,11 @@ function buildCaseArticleHtml(caseData) {
</article>
<aside class="news-sidebar" aria-label="相关推荐">
<section class="sidebar-panel">
<section v-if="relatedCases.length" class="sidebar-panel">
<h2>相关案例</h2>
<ol class="hot-list">
<li v-for="(item, index) in relatedCases" :key="item.industry">
<NuxtLink to="/cases">
<li v-for="(item, index) in relatedCases" :key="item.id || item.slug">
<NuxtLink :to="caseListLink(item)">
<span>{{ index + 1 }}</span>
<strong>{{ item.title }}</strong>
<em>{{ item.metric }}</em>
@@ -242,10 +259,14 @@ function buildCaseArticleHtml(caseData) {
</ol>
</section>
<section class="sidebar-panel">
<section v-if="recommendedCases.length" class="sidebar-panel">
<h2>推荐案例</h2>
<div class="recommend-list">
<NuxtLink v-for="item in relatedCases.slice(0, 3)" :key="item.title" to="/cases">
<NuxtLink
v-for="item in recommendedCases"
:key="item.id || item.slug"
:to="`/cases/${item.slug}`"
>
<img :src="item.cover" :alt="item.title" />
<span>
<strong>{{ item.title }}</strong>