122 lines
2.3 KiB
Vue
122 lines
2.3 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="not-found-page">
|
|||
|
|
<div class="container">
|
|||
|
|
<div class="error-content">
|
|||
|
|
<div class="error-visual">
|
|||
|
|
<div class="error-number">
|
|||
|
|
404
|
|||
|
|
</div>
|
|||
|
|
<div class="error-icon">
|
|||
|
|
<n-icon size="120">
|
|||
|
|
<Search />
|
|||
|
|
</n-icon>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="error-text">
|
|||
|
|
<h1>页面未找到</h1>
|
|||
|
|
<p>抱歉,您访问的页面不存在或已被移除。</p>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div class="error-actions">
|
|||
|
|
<n-button
|
|||
|
|
type="primary"
|
|||
|
|
size="large"
|
|||
|
|
@click="router.push('/')"
|
|||
|
|
>
|
|||
|
|
返回首页
|
|||
|
|
</n-button>
|
|||
|
|
<n-button
|
|||
|
|
size="large"
|
|||
|
|
@click="router.back()"
|
|||
|
|
>
|
|||
|
|
返回上一页
|
|||
|
|
</n-button>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import { useRouter } from 'vue-router'
|
|||
|
|
import { Search } from '@vicons/ionicons5'
|
|||
|
|
|
|||
|
|
const router = useRouter()
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped lang="scss">
|
|||
|
|
.not-found-page {
|
|||
|
|
min-height: 100vh;
|
|||
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
padding: var(--spacing-lg);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* 深色主题下背景 */
|
|||
|
|
[data-theme="dark"] .not-found-page {
|
|||
|
|
background: linear-gradient(135deg, #0f172a 0%, #1f2937 100%);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-content {
|
|||
|
|
text-align: center;
|
|||
|
|
color: white;
|
|||
|
|
max-width: 600px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-visual {
|
|||
|
|
position: relative;
|
|||
|
|
margin-bottom: var(--spacing-xl);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-number {
|
|||
|
|
font-size: 12rem;
|
|||
|
|
font-weight: var(--font-weight-bold);
|
|||
|
|
opacity: 0.1;
|
|||
|
|
line-height: 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-icon {
|
|||
|
|
position: absolute;
|
|||
|
|
top: 50%;
|
|||
|
|
left: 50%;
|
|||
|
|
transform: translate(-50%, -50%);
|
|||
|
|
opacity: 0.6;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-text {
|
|||
|
|
margin-bottom: var(--spacing-2xl);
|
|||
|
|
|
|||
|
|
h1 {
|
|||
|
|
font-size: var(--font-size-3xl);
|
|||
|
|
font-weight: var(--font-weight-bold);
|
|||
|
|
margin-bottom: var(--spacing-md);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
p {
|
|||
|
|
font-size: var(--font-size-lg);
|
|||
|
|
opacity: 0.9;
|
|||
|
|
margin: 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-actions {
|
|||
|
|
display: flex;
|
|||
|
|
gap: var(--spacing-md);
|
|||
|
|
justify-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@media (max-width: 640px) {
|
|||
|
|
.error-number {
|
|||
|
|
font-size: 8rem;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.error-actions {
|
|||
|
|
flex-direction: column;
|
|||
|
|
align-items: center;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|