Files
erp-next/ruoyi-ui/src/views/index.vue
王文昊 f5b91c3bd0 feat: 完成订单履约菜单重构与业务优化
1. 调整token有效期从30分钟改为60分钟
2. 重构订单履约菜单结构,拆分出供应商履约子目录
3. 修复发货单状态校验逻辑,允许confirmed状态发货
4. 调整页面表格样式与列宽适配
5. 新增供应商履约相关路由与菜单权限
6. 替换首页仪表盘为福安德平台首页
7. 新增批量客户初始化SQL与重复菜单清理脚本
8. 移除顶部导航栏的源码和文档地址入口
2026-06-16 19:35:52 +08:00

243 lines
4.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<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>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: "Dashboard",
computed: {
...mapGetters(['nickName', 'roles']),
isSupplier() {
return this.roles && this.roles.includes('supplier')
}
},
data() {
return {
currentTime: '',
currentDate: '',
greeting: '',
timer: null,
quickActions: [
{ 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' },
]
}
},
mounted() {
this.updateTime()
this.timer = setInterval(this.updateTime, 1000)
},
beforeDestroy() {
clearInterval(this.timer)
},
methods: {
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())
},
getGreeting(hour) {
if (hour >= 5 && hour < 12) return '上午好'
if (hour >= 12 && hour < 14) return '中午好'
if (hour >= 14 && hour < 18) return '下午好'
return '晚上好'
}
}
}
</script>
<style lang="scss" scoped>
.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;
}
</style>