成就等界面接口调整
This commit is contained in:
@@ -31,13 +31,24 @@
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<h2 class="section-title">热门资源推荐</h2>
|
||||
<div class="more-link">
|
||||
<div class="more-link" @click="handleMoreClick('hot')">
|
||||
<span>查看更多</span>
|
||||
<el-icon><ArrowRight /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="article-grid">
|
||||
<HotArticleCard v-for="item in 3" :key="item" />
|
||||
<div v-if="hotResourcesLoading" class="loading-container">
|
||||
<div class="loading-spinner"></div>
|
||||
<p>加载中...</p>
|
||||
</div>
|
||||
<div v-else-if="hotResources.length > 0" class="article-grid">
|
||||
<HotArticleCard
|
||||
v-for="resource in hotResources"
|
||||
:key="resource.id || resource.resourceID"
|
||||
:resource="resource"
|
||||
/>
|
||||
</div>
|
||||
<div v-else class="empty-container">
|
||||
<p>暂无热门资源</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -45,13 +56,24 @@
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<h2 class="section-title">思政新闻概览</h2>
|
||||
<div class="more-link">
|
||||
<div class="more-link" @click="handleMoreClick('ideological')">
|
||||
<span>查看更多</span>
|
||||
<el-icon><ArrowRight /></el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div class="article-grid">
|
||||
<IdeologicalArticleCard v-for="item in 3" :key="item" />
|
||||
<div v-if="ideologicalResourcesLoading" class="loading-container">
|
||||
<div class="loading-spinner"></div>
|
||||
<p>加载中...</p>
|
||||
</div>
|
||||
<div v-else-if="ideologicalResources.length > 0" class="article-grid">
|
||||
<IdeologicalArticleCard
|
||||
v-for="resource in ideologicalResources"
|
||||
:key="resource.id || resource.resourceID"
|
||||
:resource="resource"
|
||||
/>
|
||||
</div>
|
||||
<div v-else class="empty-container">
|
||||
<p>暂无思政资源</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -59,7 +81,7 @@
|
||||
<div class="section">
|
||||
<div class="section-header">
|
||||
<h2 class="section-title">我的学习数据</h2>
|
||||
<div class="more-link">
|
||||
<div class="more-link" @click="handleMoreClick('learning')">
|
||||
<span>查看更多</span>
|
||||
<el-icon><ArrowRight /></el-icon>
|
||||
</div>
|
||||
@@ -76,14 +98,26 @@ import { HotArticleCard, IdeologicalArticleCard } from '@/views/public/article';
|
||||
import { Carousel } from '@/components/base';
|
||||
import { ArrowRight } from '@element-plus/icons-vue';
|
||||
import { bannerApi } from '@/apis/resource/banner';
|
||||
import { recommendApi } from '@/apis/homepage';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import type { Banner } from '@/types';
|
||||
import type { Banner, ResourceRecommendVO } from '@/types';
|
||||
import dangIcon from '@/assets/imgs/dang.svg';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
const router = useRouter();
|
||||
|
||||
// 轮播数据
|
||||
const banners = ref<Banner[]>([]);
|
||||
const loading = ref(false);
|
||||
|
||||
// 热门资源数据
|
||||
const hotResources = ref<ResourceRecommendVO[]>([]);
|
||||
const hotResourcesLoading = ref(false);
|
||||
|
||||
// 思政资源数据
|
||||
const ideologicalResources = ref<ResourceRecommendVO[]>([]);
|
||||
const ideologicalResourcesLoading = ref(false);
|
||||
|
||||
// 加载轮播图数据
|
||||
async function loadBanners() {
|
||||
try {
|
||||
@@ -104,9 +138,55 @@ async function loadBanners() {
|
||||
}
|
||||
}
|
||||
|
||||
// 加载热门资源数据
|
||||
async function loadHotResources() {
|
||||
try {
|
||||
hotResourcesLoading.value = true;
|
||||
const result = await recommendApi.getHotResources(3);
|
||||
|
||||
if (result.code === 200 && result.dataList) {
|
||||
hotResources.value = result.dataList;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载热门资源失败:', error);
|
||||
ElMessage.error('加载热门资源失败');
|
||||
} finally {
|
||||
hotResourcesLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
// 加载思政资源数据
|
||||
async function loadIdeologicalResources() {
|
||||
try {
|
||||
ideologicalResourcesLoading.value = true;
|
||||
const result = await recommendApi.getIdeologicalResources(3);
|
||||
|
||||
if (result.code === 200 && result.dataList) {
|
||||
ideologicalResources.value = result.dataList;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('加载思政资源失败:', error);
|
||||
ElMessage.error('加载思政资源失败');
|
||||
} finally {
|
||||
ideologicalResourcesLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
function handleMoreClick(type: string) {
|
||||
if (type === 'hot') {
|
||||
router.push('/resource-hot');
|
||||
} else if (type === 'ideological') {
|
||||
router.push('/resource-center');
|
||||
} else if (type === 'learning') {
|
||||
router.push('/learning-center');
|
||||
}
|
||||
}
|
||||
|
||||
// 组件挂载时加载数据
|
||||
onMounted(() => {
|
||||
loadBanners();
|
||||
loadHotResources();
|
||||
loadIdeologicalResources();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -208,5 +288,34 @@ onMounted(() => {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.loading-container,
|
||||
.empty-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 60px 0;
|
||||
min-height: 200px;
|
||||
|
||||
p {
|
||||
margin-top: 16px;
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
.loading-spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 3px solid #e4e7ed;
|
||||
border-top-color: #E7000B;
|
||||
border-radius: 50%;
|
||||
animation: spin 0.8s linear infinite;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user