From 9ce8807ed63c3bead99ee84e752eb242524c8745 Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Wed, 8 Jul 2026 13:38:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(micro/acid):=20=E9=85=B8=E8=BD=A7=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=8C=E6=A8=A1=E5=9E=8B=E3=80=8Dtab=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E5=85=AD=E6=9C=BA=E6=9E=B6=E8=BD=A7=E5=88=B6?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增/mill-api代理(dev+nginx),指向klp-ml-mill FastAPI服务 - Model.vue:当前卷/下一卷,L2实测 vs 我们模型预测,逐机架对照 - 鉴权Key通过VUE_APP_MILL_API_KEY环境变量注入,不写死在源码里 --- klp-ui/src/api/l2/mill.js | 26 ++ klp-ui/src/utils/millRequest.js | 41 ++ .../micro/pages/acid/components/Model.vue | 360 ++++++++++++++++++ klp-ui/src/views/micro/pages/acid/index.vue | 14 +- klp-ui/vue.config.js | 8 + script/docker/nginx/conf/nginx.conf | 9 + 6 files changed, 456 insertions(+), 2 deletions(-) create mode 100644 klp-ui/src/api/l2/mill.js create mode 100644 klp-ui/src/utils/millRequest.js create mode 100644 klp-ui/src/views/micro/pages/acid/components/Model.vue diff --git a/klp-ui/src/api/l2/mill.js b/klp-ui/src/api/l2/mill.js new file mode 100644 index 000000000..0b100f817 --- /dev/null +++ b/klp-ui/src/api/l2/mill.js @@ -0,0 +1,26 @@ +import request from '@/utils/millRequest' + +// 当前卷 + 下一卷:L2真实数据 与 我们模型预测数据,四组一起返回 +export function getLatestMillData() { + return request({ + url: '/latest', + method: 'get' + }) +} + +// 单次预测(静态/序贯两种模式,见klp-ml-mill/api.py PredictRequest) +export function predictMill(data) { + return request({ + url: '/predict', + method: 'post', + data + }) +} + +// 服务健康检查 + 数据库摘要 +export function getMillHealth() { + return request({ + url: '/health', + method: 'get' + }) +} diff --git a/klp-ui/src/utils/millRequest.js b/klp-ui/src/utils/millRequest.js new file mode 100644 index 000000000..32c38dc94 --- /dev/null +++ b/klp-ui/src/utils/millRequest.js @@ -0,0 +1,41 @@ +import axios from 'axios' +import { Message } from 'element-ui' + +// 酸轧六机架轧制模型服务(klp-ml-mill FastAPI)专用请求实例。 +// 这是一套独立的 Python 服务,不走若依后端的 {code,msg,data} 包装协议, +// 直接返回业务 JSON,所以单独起一个 axios 实例,不复用 utils/request.js 的响应拦截逻辑。 +const service = axios.create({ + baseURL: '/mill-api', + timeout: 60000, + headers: { + 'Content-Type': 'application/json;charset=utf-8', + // 临时鉴权Key,服务端在请求头 X-API-Key 校验(见 klp-ml-mill/api.py)。 + // 值不写死在代码里,从 VUE_APP_MILL_API_KEY 读(见 klp-ui/.env.local,未入库)。 + 'X-API-Key': process.env.VUE_APP_MILL_API_KEY || '' + } +}) + +if (!process.env.VUE_APP_MILL_API_KEY) { + // eslint-disable-next-line no-console + console.warn('[millRequest] 未配置 VUE_APP_MILL_API_KEY,模型服务接口会被拒绝(401)。' + + '请在 klp-ui/.env.local 里设置该变量。') +} + +service.interceptors.response.use( + res => res.data, + error => { + let message = error.message || '请求失败' + if (error.response) { + const detail = error.response.data && error.response.data.detail + message = detail || `模型服务接口异常(${error.response.status})` + } else if (message === 'Network Error') { + message = '无法连接模型服务(klp-ml-mill),请确认服务是否已启动' + } else if (message.includes('timeout')) { + message = '模型服务请求超时' + } + Message({ message, type: 'error', duration: 5000 }) + return Promise.reject(error) + } +) + +export default service diff --git a/klp-ui/src/views/micro/pages/acid/components/Model.vue b/klp-ui/src/views/micro/pages/acid/components/Model.vue new file mode 100644 index 000000000..29872bbb7 --- /dev/null +++ b/klp-ui/src/views/micro/pages/acid/components/Model.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/klp-ui/src/views/micro/pages/acid/index.vue b/klp-ui/src/views/micro/pages/acid/index.vue index e8e39034b..b6ea99577 100644 --- a/klp-ui/src/views/micro/pages/acid/index.vue +++ b/klp-ui/src/views/micro/pages/acid/index.vue @@ -26,6 +26,10 @@ 规程 + + + 模型 + 计划 @@ -39,7 +43,7 @@ 实绩 - + 配辊 @@ -76,6 +80,7 @@ import Stoppage from '@/views/timing/stoppage/index.vue'; import AcidTiming from '@/views/lines/acid/index.vue'; import TrackingView from './components/TrackingView.vue'; import ProcessSpec from './components/ProcessSpec.vue'; +import Model from './components/Model.vue'; export default { name: 'AcidSystem', @@ -92,7 +97,8 @@ export default { Stoppage, AcidTiming, TrackingView, - ProcessSpec + ProcessSpec, + Model }, data() { return { @@ -115,6 +121,7 @@ export default { acidTiming: 'AcidTiming', tracking: 'TrackingView', processSpec: 'ProcessSpec', + model: 'Model', }; return componentMap[this.activeMenu]; }, @@ -159,6 +166,7 @@ export default { color: #606266; padding: 0 20px; font-size: 14px; + transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease; &:hover { background-color: #ecf5ff; @@ -169,11 +177,13 @@ export default { background-color: #ecf5ff; color: #409eff; border-right: 3px solid #409eff; + font-weight: 600; } i { font-size: 18px; margin-right: 8px; + transition: color 0.2s ease; } } } diff --git a/klp-ui/vue.config.js b/klp-ui/vue.config.js index b14f87c2e..48eec3ae6 100644 --- a/klp-ui/vue.config.js +++ b/klp-ui/vue.config.js @@ -54,6 +54,14 @@ module.exports = { ['^' + '/zinc-api']: '/api' } }, + // 酸轧六机架轧制模型服务(klp-ml-mill FastAPI),/predict /latest /sync /retrain /health + '/mill-api': { + target: `http://117.72.159.31:10001`, + changeOrigin: true, + pathRewrite: { + ['^' + '/mill-api']: '' + } + }, // 直接代理WebSocket相关路径 '/websocket': { target: `http://localhost:8080`, diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf index e9630aaf7..b1a677310 100644 --- a/script/docker/nginx/conf/nginx.conf +++ b/script/docker/nginx/conf/nginx.conf @@ -81,6 +81,15 @@ http { proxy_pass http://server/; } + # 酸轧六机架轧制模型服务(klp-ml-mill FastAPI) + location /mill-api/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header REMOTE-HOST $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_pass http://117.72.159.31:10001/; + } + # https 会拦截内链所有的 http 请求 造成功能无法使用 # 解决方案1 将 admin 服务 也配置成 https # 解决方案2 将菜单配置为外链访问 走独立页面 http 访问