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:
@@ -0,0 +1,27 @@
|
||||
// 登录态与当前用户的本地存取
|
||||
export function getToken() {
|
||||
return localStorage.getItem('token') || ''
|
||||
}
|
||||
|
||||
export function getUser() {
|
||||
try {
|
||||
return JSON.parse(localStorage.getItem('user')) || null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export function getRealName(fallback = '') {
|
||||
const u = getUser()
|
||||
return (u && (u.realName || u.username)) || fallback
|
||||
}
|
||||
|
||||
export function setSession(token, user) {
|
||||
localStorage.setItem('token', token)
|
||||
localStorage.setItem('user', JSON.stringify(user))
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('user')
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// 公共格式化工具
|
||||
export function fmtTime(v) {
|
||||
if (!v) return '-'
|
||||
const d = new Date(typeof v === 'number' ? v * 1000 : v)
|
||||
if (Number.isNaN(d.getTime())) return String(v)
|
||||
const p = (n) => String(n).padStart(2, '0')
|
||||
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
|
||||
}
|
||||
|
||||
export function fmtNum(v) {
|
||||
const n = Number(v)
|
||||
return Number.isNaN(n) ? (v ?? '-') : n.toLocaleString('zh-CN')
|
||||
}
|
||||
|
||||
export function fmtDateOnly(v) {
|
||||
if (!v) return '-'
|
||||
const s = String(v)
|
||||
if (/^\d+$/.test(s)) return fmtTime(Number(s)).slice(0, 10)
|
||||
return s.slice(0, 10)
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getToken } from './auth'
|
||||
|
||||
// 统一请求实例:baseURL /api,响应为 { code, message, data }
|
||||
const request = axios.create({ baseURL: '/api', timeout: 30000 })
|
||||
|
||||
request.interceptors.request.use((config) => {
|
||||
const token = getToken()
|
||||
if (token) config.headers.Authorization = `Bearer ${token}`
|
||||
return config
|
||||
})
|
||||
|
||||
request.interceptors.response.use(
|
||||
(resp) => {
|
||||
// WMS 滑动续签:保存新 token
|
||||
const renewed = resp.headers?.['x-renewed-token']
|
||||
if (renewed) localStorage.setItem('token', renewed)
|
||||
|
||||
const body = resp.data
|
||||
if (body && typeof body === 'object' && 'code' in body) {
|
||||
if (body.code !== 0) {
|
||||
const msg = body.message || '操作失败'
|
||||
ElMessage.error(msg)
|
||||
return Promise.reject(new Error(msg))
|
||||
}
|
||||
return body.data !== undefined ? body.data : body
|
||||
}
|
||||
return body
|
||||
},
|
||||
(error) => {
|
||||
if (error.response?.status === 401) {
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('user')
|
||||
ElMessage.error('登录已失效,请重新登录')
|
||||
if (!window.location.pathname.startsWith('/login')) {
|
||||
window.location.href = '/login'
|
||||
}
|
||||
} else {
|
||||
const msg = error.response?.data?.message || error.message || '网络错误'
|
||||
ElMessage.error(msg)
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
export default request
|
||||
Reference in New Issue
Block a user