59 lines
1.8 KiB
Vue
59 lines
1.8 KiB
Vue
<script setup lang="ts">
|
||
import { computed, onMounted } from 'vue'
|
||
import { storeToRefs } from 'pinia'
|
||
// 页面容器:只做组件引入、props 分发、事件中转,数据只经 store
|
||
import { useHomeStore } from '@/stores/modules/home'
|
||
import type { BusinessType } from '@/types/api'
|
||
import HomeWelcome from './cpns/HomeWelcome.vue'
|
||
import HomeStats from './cpns/HomeStats.vue'
|
||
import HomeQuickEntries from './cpns/HomeQuickEntries.vue'
|
||
import HomeBusinessCards from './cpns/HomeBusinessCards.vue'
|
||
import HomeCaseShowcase from './cpns/HomeCaseShowcase.vue'
|
||
import HomeServiceTabs from './cpns/HomeServiceTabs.vue'
|
||
|
||
const homeStore = useHomeStore()
|
||
const { stats, businessLines, featuredCases } = storeToRefs(homeStore)
|
||
|
||
const todaySummary = computed(() => `今天有${stats.value.inProgress}个项目正在进行`)
|
||
|
||
// 服务 Tab 展示互联网软件线内容(服务内容区默认锚点)
|
||
const serviceLine = computed(
|
||
() => businessLines.value.find((line) => line.id === 'internet') ?? businessLines.value[0],
|
||
)
|
||
|
||
function onCategoryChange(category: BusinessType | 'all'): void {
|
||
void homeStore.fetchFeaturedCases(category)
|
||
}
|
||
|
||
onMounted(() => {
|
||
void homeStore.fetchHomeData()
|
||
})
|
||
</script>
|
||
|
||
<template>
|
||
<div class="home">
|
||
<HomeWelcome :summary="todaySummary" />
|
||
<HomeStats :stats="stats" />
|
||
<HomeQuickEntries />
|
||
<HomeBusinessCards :lines="businessLines" />
|
||
<HomeCaseShowcase
|
||
:cases="featuredCases"
|
||
@category-change="onCategoryChange"
|
||
/>
|
||
<HomeServiceTabs
|
||
v-if="serviceLine"
|
||
:service-types="serviceLine.serviceTypes"
|
||
:service-content="serviceLine.serviceContent"
|
||
/>
|
||
</div>
|
||
</template>
|
||
|
||
<style lang="less" scoped>
|
||
.home {
|
||
.flex(column, flex-start);
|
||
gap: @spacing-xl;
|
||
padding-top: @spacing-xl;
|
||
padding-bottom: @spacing-xxl;
|
||
}
|
||
</style>
|