feat: 五项目业务实现并对接完成

- MES(B): 工单/BOM/备料/工序字典/PLC下发/拧紧/扫码报工/半成品/AGV/追溯逻辑,WMS与海康RCS客户端,看板Redis缓存API(概览/设备/进度/报警/趋势)+SSE
- WMS(C): JWT滑动续签、Excel导入、盘点、内部API、种子数据、独立Postgres配置
- WMS客户端(E): Go网关8891反向代理+内嵌Vue3十页
- 工位终端(D): SQLite本地缓存+模拟拧紧源+内嵌Vue3页面
- Dashboard(A): 看板数据改接MES内部缓存API,SSE实时刷新+vite代理
- 清理各项目球形磨遗留代码,新增部署手册.md
This commit is contained in:
SunYF
2026-08-27 19:50:57 +08:00
parent c85c3bd6f1
commit a2afd2f6dc
335 changed files with 87495 additions and 7357 deletions
@@ -0,0 +1,85 @@
<script setup>
import { computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import {
HomeFilled, Download, Upload, Search, CircleCheck, List,
Box, Tickets, Monitor
} from '@element-plus/icons-vue'
import { getUser, logout } from '../utils/auth'
const route = useRoute()
const router = useRouter()
const user = getUser()
const pageTitle = computed(() => route.meta?.title || '')
const menus = [
{ path: '/', title: '工作台', icon: HomeFilled },
{ path: '/inbound', title: '入库管理', icon: Download },
{ path: '/outbound', title: '备料出库', icon: Upload },
{ path: '/inventory', title: '库存查询', icon: Search },
{ path: '/inspection', title: '质量检验', icon: CircleCheck },
{ path: '/stocktake', title: '库存盘点', icon: List },
{ path: '/package', title: '包装绑定', icon: Box },
{ path: '/ledger', title: '物料台账', icon: Tickets }
]
function onLogout() {
logout()
ElMessage.success('已退出登录')
router.push('/login')
}
</script>
<template>
<el-container class="layout">
<el-aside width="210px" class="aside">
<div class="brand">
<el-icon :size="22"><Box /></el-icon>
<span>北自所库房客户端</span>
</div>
<el-menu :default-active="route.path" class="menu" background-color="#001529"
text-color="#c2cad8" active-text-color="#ffffff" router>
<el-menu-item v-for="m in menus" :key="m.path" :index="m.path">
<el-icon><component :is="m.icon" /></el-icon>
<span>{{ m.title }}</span>
</el-menu-item>
</el-menu>
</el-aside>
<el-container>
<el-header height="56px" class="header">
<span class="title">{{ pageTitle }}</span>
<div class="spacer"></div>
<el-button text type="primary" @click="router.push('/display')">
<el-icon style="margin-right:4px"><Monitor /></el-icon>免登录大屏
</el-button>
<el-tag effect="plain">{{ user?.realName || user?.username || '未登录' }}</el-tag>
<el-button text type="danger" @click="onLogout">退出登录</el-button>
</el-header>
<el-main class="main">
<router-view />
</el-main>
</el-container>
</el-container>
</template>
<style scoped>
.layout { height: 100vh; }
.aside { background: #001529; }
.brand {
display: flex; align-items: center; gap: 8px;
height: 56px; padding: 0 16px;
color: #fff; font-weight: 600; font-size: 15px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.menu { border-right: none; }
.header {
display: flex; align-items: center; gap: 10px;
background: #fff; border-bottom: 1px solid #ebeef5;
}
.title { font-size: 16px; font-weight: 600; }
.spacer { flex: 1; }
.main { background: #f0f2f5; padding: 14px; overflow: auto; }
</style>