|
@ -86,20 +86,28 @@ |
|
|
</template> |
|
|
</template> |
|
|
</a-card> |
|
|
</a-card> |
|
|
<a-card title="随机文章" :bordered="false" hoverable> |
|
|
<a-card title="随机文章" :bordered="false" hoverable> |
|
|
<div v-for="article in 3"> |
|
|
|
|
|
<a-image :preview="false" :width="300" |
|
|
|
|
|
src="https://cdn.naccl.top/blog/blogHosting/2024/02/B01/f56c5bbe-469c-4eb7-a994-9281d6eed689.png" /> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div v-for="article in homepagelist"> |
|
|
|
|
|
<div v-if="article.blogtitle"> |
|
|
|
|
|
<div class="article-text"> |
|
|
|
|
|
<span>{{ article.blogtitle }}</span> |
|
|
|
|
|
<span>{{ article.create_at }}</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
<a-image :preview="false" :width="300" :src="article.imglink" /> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div v-if="article.diarytitle"> |
|
|
<div class="article-text"> |
|
|
<div class="article-text"> |
|
|
<span>2021-02-01</span> |
|
|
|
|
|
<span>操作系统</span> |
|
|
|
|
|
|
|
|
<span>{{ article.diarytitle }}</span> |
|
|
|
|
|
<span>{{ article.create_at }}</span> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<a-image :preview="false" :width="300" :src="article.imglink" /> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</a-card> |
|
|
</a-card> |
|
|
|
|
|
|
|
|
<a-card title="标签云" :bordered="false" hoverable> |
|
|
<a-card title="标签云" :bordered="false" hoverable> |
|
|
sces |
|
|
|
|
|
|
|
|
<a-tag :color=randomColor() v-for="label in labellist">{{ label.labelname }}</a-tag> |
|
|
</a-card> |
|
|
</a-card> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
@ -168,7 +176,8 @@ import { get } from "@/tools/request" |
|
|
import { createEcharts } from "@/hooks/intex" |
|
|
import { createEcharts } from "@/hooks/intex" |
|
|
import { useRouter, useRoute } from 'vue-router'; |
|
|
import { useRouter, useRoute } from 'vue-router'; |
|
|
import iconComponents from "@/assets/index"; |
|
|
import iconComponents from "@/assets/index"; |
|
|
import type { classticInterface, comLinkInterface } from '@/api/admin'; |
|
|
|
|
|
|
|
|
import type { classticInterface, comLinkInterface, labelInterface } from '@/api/admin'; |
|
|
|
|
|
import type { homePageInterface } from '@/api'; |
|
|
const router = useRouter() |
|
|
const router = useRouter() |
|
|
const route = useRoute() |
|
|
const route = useRoute() |
|
|
const author = ref("SunFree.") |
|
|
const author = ref("SunFree.") |
|
@ -246,7 +255,7 @@ const items = ref<MenuProps['items']>([ |
|
|
]); |
|
|
]); |
|
|
const searchValue = ref("") |
|
|
const searchValue = ref("") |
|
|
const jumpMenu = ({ key }: { key: string }) => { |
|
|
const jumpMenu = ({ key }: { key: string }) => { |
|
|
router.push(key) |
|
|
|
|
|
|
|
|
router.push(`/${key}`) |
|
|
}; |
|
|
}; |
|
|
const updateCarouselVisibility = (routeName: any) => { |
|
|
const updateCarouselVisibility = (routeName: any) => { |
|
|
handleScrollEnabled.value = false; |
|
|
handleScrollEnabled.value = false; |
|
@ -545,16 +554,41 @@ const heatMapData = reactive( |
|
|
) |
|
|
) |
|
|
// 音乐组件 |
|
|
// 音乐组件 |
|
|
const random = ref(); |
|
|
const random = ref(); |
|
|
|
|
|
const homepagelist = ref<homePageInterface[]>([]) |
|
|
|
|
|
// 随机文章 |
|
|
|
|
|
const homePageList = async () => { |
|
|
|
|
|
await get( |
|
|
|
|
|
"/statistics/homepage" |
|
|
|
|
|
).then(response => { |
|
|
|
|
|
homepagelist.value = response.data.data.sort(() => 0.5 - Math.random()).slice(0, 3); |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const labellist = ref<labelInterface[]>([]) |
|
|
|
|
|
const randomColor = () => { |
|
|
|
|
|
const labelColor = ref(["processing", "success", "error", "warning", "magenta", "red", "volcano", "orange", "gold", "lime", "green", "cyan", "blue", "geekblue", "purple"]) |
|
|
|
|
|
return labelColor.value[Math.floor(Math.random() * labelColor.value.length)]; |
|
|
|
|
|
} |
|
|
|
|
|
const labelList = async () => { |
|
|
|
|
|
try { |
|
|
|
|
|
await get("/labels/list").then(response => { |
|
|
|
|
|
if (response) { |
|
|
|
|
|
labellist.value = response.data.data; |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
onMounted(() => { |
|
|
onMounted(() => { |
|
|
classticList() |
|
|
classticList() |
|
|
blogList() |
|
|
blogList() |
|
|
|
|
|
labelList() |
|
|
diaryList() |
|
|
diaryList() |
|
|
comLinkList() |
|
|
comLinkList() |
|
|
statisticList() |
|
|
statisticList() |
|
|
updateCurrentDate(); |
|
|
updateCurrentDate(); |
|
|
|
|
|
homePageList() |
|
|
setInterval(updateCurrentDate, 24 * 60 * 60 * 1000); |
|
|
setInterval(updateCurrentDate, 24 * 60 * 60 * 1000); |
|
|
createEcharts(heat, heatMapData); |
|
|
createEcharts(heat, heatMapData); |
|
|
nextTick(() => { |
|
|
nextTick(() => { |
|
@ -625,12 +659,25 @@ watch( |
|
|
() => route.name, |
|
|
() => route.name, |
|
|
(newRouteName) => { |
|
|
(newRouteName) => { |
|
|
updateCarouselVisibility(newRouteName); |
|
|
updateCarouselVisibility(newRouteName); |
|
|
|
|
|
|
|
|
if (newRouteName) { |
|
|
if (newRouteName) { |
|
|
const menuItem = items.value?.find((item: any) => item.key === newRouteName); |
|
|
|
|
|
|
|
|
// 尝试从菜单项中找到与当前路由名称匹配的项 |
|
|
|
|
|
const menuItem = items.value?.find((item: any) => { |
|
|
|
|
|
// 这里可以根据实际情况来匹配路由名称或路径 |
|
|
|
|
|
// 例如,可以根据 route.name 或 route.path 来匹配 |
|
|
|
|
|
if (newRouteName === 'blogdetail') { |
|
|
|
|
|
return item.key === 'blog'; // 匹配博客详情页,选中博客菜单 |
|
|
|
|
|
} else if (newRouteName === 'diarydetail') { |
|
|
|
|
|
return item.key === 'diary'; // 匹配日记详情页,选中日记菜单 |
|
|
|
|
|
} else { |
|
|
|
|
|
return item.key === newRouteName; // 默认匹配路由名称 |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
if (menuItem) { |
|
|
if (menuItem) { |
|
|
current.value = [menuItem.key as string]; |
|
|
current.value = [menuItem.key as string]; |
|
|
} else { |
|
|
} else { |
|
|
current.value = ['home']; // 如果找不到对应的菜单项,默认选中 'home' |
|
|
|
|
|
|
|
|
current.value = ['home']; // 找不到对应的菜单项,默认选中 'home' |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
current.value = ['home']; // 如果 route.name 不存在,默认选中 'home' |
|
|
current.value = ['home']; // 如果 route.name 不存在,默认选中 'home' |
|
@ -763,20 +810,12 @@ watch( |
|
|
margin-bottom: 24px; |
|
|
margin-bottom: 24px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.rightBar>:nth-child(4) div { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
position: relative; |
|
|
|
|
|
margin-bottom: 24px; |
|
|
|
|
|
|
|
|
.rightBar .article-text{ |
|
|
|
|
|
margin: 12px 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.rightBar>:nth-child(4) div .article-text { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: column; |
|
|
|
|
|
position: absolute; |
|
|
|
|
|
bottom: 5%; |
|
|
|
|
|
left: 10%; |
|
|
|
|
|
color: rgb(187, 185, 187); |
|
|
|
|
|
|
|
|
.rightBar .article-text span{ |
|
|
|
|
|
margin-right: 12px; |
|
|
|
|
|
font-family: "Lato, 'Helvetica Neue', Arial, Helvetica, sans-serif"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#aplayer { |
|
|
#aplayer { |
|
|