2026-05-22 10:07:56 +08:00
|
|
|
|
<template>
|
2026-06-16 19:35:52 +08:00
|
|
|
|
<div class="home-page">
|
|
|
|
|
|
<!-- Logo -->
|
|
|
|
|
|
<div class="logo-section">
|
|
|
|
|
|
<div class="logo-box">
|
|
|
|
|
|
<img src="@/assets/logo/logo.svg" alt="福安德" class="logo-img">
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 系统名称 -->
|
|
|
|
|
|
<div class="title-section">
|
|
|
|
|
|
<h1 class="main-title">福安德智慧报价平台</h1>
|
|
|
|
|
|
<p class="sub-title">FUANDE SMART QUOTATION PLATFORM</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 分隔线 -->
|
|
|
|
|
|
<div class="divider"></div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 欢迎语 -->
|
|
|
|
|
|
<div class="welcome-section">
|
|
|
|
|
|
<p class="welcome-text">{{ greeting }},{{ nickName }}!欢迎回来</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 时间 -->
|
|
|
|
|
|
<div class="time-section">
|
|
|
|
|
|
<div class="time-display">{{ currentTime }}</div>
|
|
|
|
|
|
<div class="date-display">{{ currentDate }}</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 底部标语 -->
|
|
|
|
|
|
<div class="slogan-section">
|
|
|
|
|
|
<p class="slogan">原料·研发·生产·销售·服务 全产业链数智运营</p>
|
|
|
|
|
|
</div>
|
2026-05-22 10:07:56 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
2026-06-16 19:35:52 +08:00
|
|
|
|
import { mapGetters } from 'vuex'
|
2026-05-22 10:07:56 +08:00
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
|
name: "Dashboard",
|
2026-06-06 15:20:46 +08:00
|
|
|
|
computed: {
|
2026-06-16 19:35:52 +08:00
|
|
|
|
...mapGetters(['nickName', 'roles']),
|
2026-06-06 15:20:46 +08:00
|
|
|
|
isSupplier() {
|
2026-06-16 19:35:52 +08:00
|
|
|
|
return this.roles && this.roles.includes('supplier')
|
2026-06-06 15:20:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
},
|
2026-05-22 10:07:56 +08:00
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
2026-06-16 19:35:52 +08:00
|
|
|
|
currentTime: '',
|
|
|
|
|
|
currentDate: '',
|
|
|
|
|
|
greeting: '',
|
|
|
|
|
|
timer: null,
|
2026-05-22 10:07:56 +08:00
|
|
|
|
quickActions: [
|
2026-06-16 19:35:52 +08:00
|
|
|
|
{ label: '物料管理', icon: 'el-icon-goods', path: '/material' },
|
|
|
|
|
|
{ label: '甲方报价', icon: 'el-icon-document-copy', path: '/clientquote' },
|
|
|
|
|
|
{ label: '供应商报价', icon: 'el-icon-money', path: '/quotation' },
|
|
|
|
|
|
{ label: '订单管理', icon: 'el-icon-s-order', path: '/bid/order/pending' },
|
2026-05-22 10:07:56 +08:00
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2026-06-16 19:35:52 +08:00
|
|
|
|
mounted() {
|
|
|
|
|
|
this.updateTime()
|
|
|
|
|
|
this.timer = setInterval(this.updateTime, 1000)
|
|
|
|
|
|
},
|
|
|
|
|
|
beforeDestroy() {
|
|
|
|
|
|
clearInterval(this.timer)
|
2026-05-22 10:07:56 +08:00
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
2026-06-16 19:35:52 +08:00
|
|
|
|
updateTime() {
|
|
|
|
|
|
const now = new Date()
|
|
|
|
|
|
this.currentTime = now.toLocaleTimeString('zh-CN', {
|
|
|
|
|
|
hour12: false,
|
|
|
|
|
|
hour: '2-digit',
|
|
|
|
|
|
minute: '2-digit',
|
|
|
|
|
|
second: '2-digit'
|
|
|
|
|
|
})
|
|
|
|
|
|
this.currentDate = now.toLocaleDateString('zh-CN', {
|
|
|
|
|
|
year: 'numeric',
|
|
|
|
|
|
month: 'long',
|
|
|
|
|
|
day: 'numeric',
|
|
|
|
|
|
weekday: 'long'
|
|
|
|
|
|
})
|
|
|
|
|
|
this.greeting = this.getGreeting(now.getHours())
|
2026-05-22 10:07:56 +08:00
|
|
|
|
},
|
2026-06-16 19:35:52 +08:00
|
|
|
|
getGreeting(hour) {
|
|
|
|
|
|
if (hour >= 5 && hour < 12) return '上午好'
|
|
|
|
|
|
if (hour >= 12 && hour < 14) return '中午好'
|
|
|
|
|
|
if (hour >= 14 && hour < 18) return '下午好'
|
|
|
|
|
|
return '晚上好'
|
|
|
|
|
|
}
|
2026-05-22 10:07:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
2026-06-16 19:35:52 +08:00
|
|
|
|
.home-page {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
min-height: calc(100vh - 84px);
|
|
|
|
|
|
background: #ffffff;
|
|
|
|
|
|
padding: 40px 20px 24px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ Logo ═══ */
|
|
|
|
|
|
.logo-section {
|
|
|
|
|
|
margin-bottom: 24px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.logo-box {
|
|
|
|
|
|
width: 72px;
|
|
|
|
|
|
height: 72px;
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
justify-content: center;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.logo-img {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
object-fit: contain;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 标题 ═══ */
|
|
|
|
|
|
.title-section {
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.main-title {
|
|
|
|
|
|
font-size: 28px;
|
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
|
color: #333333;
|
|
|
|
|
|
margin: 0 0 8px 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.sub-title {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: #999999;
|
|
|
|
|
|
letter-spacing: 2px;
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
text-transform: uppercase;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 分隔线 ═══ */
|
|
|
|
|
|
.divider {
|
|
|
|
|
|
width: 60px;
|
|
|
|
|
|
height: 2px;
|
|
|
|
|
|
background: #e4393c;
|
|
|
|
|
|
margin-bottom: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 欢迎语 ═══ */
|
|
|
|
|
|
.welcome-section {
|
|
|
|
|
|
margin-bottom: 16px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.welcome-text {
|
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: #666666;
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 时间 ═══ */
|
|
|
|
|
|
.time-section {
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
margin-bottom: 40px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.time-display {
|
|
|
|
|
|
font-size: 48px;
|
|
|
|
|
|
font-weight: 300;
|
|
|
|
|
|
color: #e4393c;
|
|
|
|
|
|
font-family: 'Roboto Mono', 'Courier New', monospace;
|
|
|
|
|
|
letter-spacing: 2px;
|
|
|
|
|
|
margin-bottom: 8px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.date-display {
|
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: #999999;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 标语 ═══ */
|
|
|
|
|
|
.slogan-section {
|
|
|
|
|
|
text-align: center;
|
|
|
|
|
|
margin-bottom: 40px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.slogan {
|
|
|
|
|
|
font-size: 13px;
|
|
|
|
|
|
font-weight: 400;
|
|
|
|
|
|
color: #cccccc;
|
|
|
|
|
|
margin: 0;
|
|
|
|
|
|
letter-spacing: 1px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ═══ 快捷入口 ═══ */
|
|
|
|
|
|
.quick-section {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
max-width: 520px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.quick-grid {
|
|
|
|
|
|
display: grid;
|
|
|
|
|
|
grid-template-columns: repeat(4, 1fr);
|
|
|
|
|
|
gap: 12px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.quick-item {
|
|
|
|
|
|
display: flex;
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
align-items: center;
|
|
|
|
|
|
gap: 8px;
|
|
|
|
|
|
padding: 16px 8px;
|
|
|
|
|
|
border: 1px solid #f0f0f0;
|
|
|
|
|
|
border-radius: 4px;
|
|
|
|
|
|
text-decoration: none;
|
|
|
|
|
|
transition: all 0.2s;
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
|
|
border-color: #e4393c;
|
|
|
|
|
|
background: #fff5f5;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.quick-item-icon {
|
|
|
|
|
|
font-size: 24px;
|
|
|
|
|
|
color: #e4393c;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.quick-item-label {
|
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
|
color: #666666;
|
|
|
|
|
|
}
|
2026-05-22 10:07:56 +08:00
|
|
|
|
</style>
|