style+feat: 金属灰深蓝工业主题 + 紧凑组件 + 工业控制首页
- 主题色:深钢蓝#1c2b3a侧边栏 + 金属灰#607d8b + 海军蓝#1d4e89主色 - 去除所有绿色,成功态改用钢蓝 - 全局组件缩小:输入框28px/按钮12px/表格行5px/表单间距12px - 新首页:状态栏+KPI卡片+双机架工艺参数+计划表+L2/L3通信状态 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,26 +1,110 @@
|
||||
/**
|
||||
* 冷轧二级控制系统 — Element-UI 主题(工业蓝)
|
||||
* 冷轧二级控制系统 — Element-UI 主题(金属灰·深蓝)
|
||||
*/
|
||||
|
||||
/* 主色:工业蓝 */
|
||||
$--color-primary: #1565c0;
|
||||
$--color-success: #52c41a;
|
||||
$--color-warning: #faad14;
|
||||
$--color-danger: #f5222d;
|
||||
$--color-info: #909399;
|
||||
/* 主色:深海军蓝 */
|
||||
$--color-primary: #1d4e89;
|
||||
/* 成功:用钢蓝替代绿色 */
|
||||
$--color-success: #2471a3;
|
||||
/* 警告:琥珀 */
|
||||
$--color-warning: #d68910;
|
||||
/* 危险:暗红 */
|
||||
$--color-danger: #c0392b;
|
||||
/* 信息:金属灰 */
|
||||
$--color-info: #607d8b;
|
||||
|
||||
$--button-font-weight: 500;
|
||||
|
||||
$--border-color-light: #dde1e7;
|
||||
$--border-color-light: #dde1e6;
|
||||
$--border-color-lighter: #ebeef5;
|
||||
|
||||
$--table-border: 1px solid #e8eaec;
|
||||
$--table-border: 1px solid #e4e7ed;
|
||||
|
||||
/* icon font path */
|
||||
$--font-path: '~element-ui/lib/theme-chalk/fonts';
|
||||
|
||||
@import "~element-ui/packages/theme-chalk/src/index";
|
||||
|
||||
// ────────────────────────────────────────────────────────────
|
||||
// 紧凑尺寸覆盖(全局缩小所有组件)
|
||||
// ────────────────────────────────────────────────────────────
|
||||
|
||||
// 输入框
|
||||
.el-input__inner {
|
||||
height: 28px !important;
|
||||
line-height: 28px !important;
|
||||
font-size: 12px !important;
|
||||
padding: 0 8px !important;
|
||||
}
|
||||
.el-input--medium .el-input__inner { height: 28px !important; line-height: 28px !important; }
|
||||
.el-input--small .el-input__inner { height: 24px !important; line-height: 24px !important; }
|
||||
.el-input--mini .el-input__inner { height: 22px !important; line-height: 22px !important; }
|
||||
|
||||
// textarea
|
||||
.el-textarea__inner { font-size: 12px !important; padding: 4px 8px !important; }
|
||||
|
||||
// 按钮
|
||||
.el-button { padding: 5px 12px !important; font-size: 12px !important; }
|
||||
.el-button--medium { padding: 6px 14px !important; font-size: 12px !important; }
|
||||
.el-button--small { padding: 4px 10px !important; font-size: 12px !important; }
|
||||
.el-button--mini { padding: 3px 8px !important; font-size: 12px !important; }
|
||||
|
||||
// 表格
|
||||
.el-table {
|
||||
font-size: 12px !important;
|
||||
th.el-table__cell { padding: 5px 0 !important; font-size: 12px !important; font-weight: 600; background-color: #f2f4f7 !important; color: #2c3e50 !important; }
|
||||
td.el-table__cell { padding: 4px 0 !important; }
|
||||
.cell { padding: 0 8px !important; }
|
||||
}
|
||||
|
||||
// 表单
|
||||
.el-form-item { margin-bottom: 12px !important; }
|
||||
.el-form-item__label { font-size: 12px !important; line-height: 28px !important; padding-right: 8px !important; }
|
||||
.el-form-item__content { line-height: 28px !important; font-size: 12px !important; }
|
||||
|
||||
// 卡片
|
||||
.el-card__header { padding: 10px 14px !important; font-size: 13px !important; font-weight: 600; color: #1c2b3a; border-bottom: 1px solid #e4e7ed; }
|
||||
.el-card__body { padding: 12px 14px !important; }
|
||||
.el-card { border-radius: 3px !important; border: 1px solid #dde1e6 !important; box-shadow: 0 1px 4px rgba(0,0,0,.06) !important; }
|
||||
|
||||
// 分页
|
||||
.el-pagination { padding: 4px 0 !important; font-size: 12px !important; }
|
||||
.el-pagination .el-select .el-input { width: 90px; }
|
||||
.el-pagination button, .el-pagination .el-pager li { font-size: 12px !important; min-width: 26px !important; height: 26px !important; line-height: 26px !important; }
|
||||
|
||||
// 下拉/select
|
||||
.el-select-dropdown__item { font-size: 12px !important; padding: 0 16px !important; height: 28px !important; line-height: 28px !important; }
|
||||
.el-select .el-input__inner { height: 28px !important; line-height: 28px !important; }
|
||||
|
||||
// 日期选择器
|
||||
.el-date-editor .el-input__inner { padding-left: 28px !important; }
|
||||
.el-date-editor.el-input { width: 150px !important; }
|
||||
|
||||
// 对话框
|
||||
.el-dialog__header { padding: 12px 16px !important; border-bottom: 1px solid #e4e7ed; }
|
||||
.el-dialog__title { font-size: 14px !important; font-weight: 600; color: #1c2b3a; }
|
||||
.el-dialog__body { padding: 16px !important; font-size: 12px !important; }
|
||||
.el-dialog__footer { padding: 10px 16px !important; border-top: 1px solid #e4e7ed; }
|
||||
|
||||
// Tag
|
||||
.el-tag { font-size: 11px !important; height: 20px !important; line-height: 18px !important; padding: 0 6px !important; border-radius: 2px !important; }
|
||||
.el-tag--success { background-color: #d6e8f5 !important; border-color: #aacce8 !important; color: #1d4e89 !important; }
|
||||
.el-tag--warning { background-color: #fdf3e0 !important; border-color: #f5cba7 !important; color: #a04000 !important; }
|
||||
.el-tag--danger { background-color: #fadbd8 !important; border-color: #f1948a !important; color: #922b21 !important; }
|
||||
.el-tag--info { background-color: #eaecee !important; border-color: #bdc3c7 !important; color: #4d5f6e !important; }
|
||||
|
||||
// 开关
|
||||
.el-switch__label { font-size: 12px !important; }
|
||||
.el-switch { height: 20px !important; line-height: 20px !important; }
|
||||
.el-switch__core { height: 18px !important; }
|
||||
.el-switch.is-checked .el-switch__core { background-color: #1d4e89 !important; border-color: #1d4e89 !important; }
|
||||
|
||||
// 面包屑
|
||||
.el-breadcrumb { font-size: 12px !important; line-height: 24px !important; }
|
||||
|
||||
// 搜索栏内组件对齐
|
||||
.filter-container .el-input,
|
||||
.filter-container .el-select { vertical-align: middle; }
|
||||
|
||||
// webpack JS/SCSS 变量共享
|
||||
:export {
|
||||
theme: $--color-primary;
|
||||
|
||||
@@ -9,35 +9,26 @@ body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
background-color: #f0f2f5;
|
||||
color: #303133;
|
||||
color: #2c3e50;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Microsoft YaHei',
|
||||
'Source Han Sans CN', Arial, sans-serif;
|
||||
font-size: 14px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
label { font-weight: 600; }
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
label { font-weight: 600; color: #4a5568; }
|
||||
|
||||
html { height: 100%; box-sizing: border-box; }
|
||||
#app { height: 100%; }
|
||||
|
||||
*, *:before, *:after { box-sizing: inherit; }
|
||||
|
||||
a:focus, a:active { outline: none; }
|
||||
a, a:focus, a:hover {
|
||||
cursor: pointer;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a, a:focus, a:hover { cursor: pointer; color: inherit; text-decoration: none; }
|
||||
div:focus { outline: none; }
|
||||
|
||||
// ── 工具类 ──────────────────────────────────────────────────
|
||||
.fr { float: right; }
|
||||
.fl { float: left; }
|
||||
.pr-5 { padding-right: 5px; }
|
||||
@@ -50,109 +41,138 @@ div:focus { outline: none; }
|
||||
.padding-content { padding: 4px 0; }
|
||||
|
||||
.clearfix:after {
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
font-size: 0;
|
||||
content: " ";
|
||||
clear: both;
|
||||
height: 0;
|
||||
visibility: hidden; display: block; font-size: 0;
|
||||
content: " "; clear: both; height: 0;
|
||||
}
|
||||
|
||||
// 页面内容容器
|
||||
.app-container {
|
||||
padding: 16px 20px;
|
||||
}
|
||||
// ── 页面容器 ─────────────────────────────────────────────────
|
||||
.app-container { padding: 12px 16px; }
|
||||
|
||||
// 搜索过滤栏
|
||||
// ── 搜索栏 ───────────────────────────────────────────────────
|
||||
.filter-container {
|
||||
padding: 16px;
|
||||
margin-bottom: 12px;
|
||||
padding: 10px 12px;
|
||||
margin-bottom: 10px;
|
||||
background: #ffffff;
|
||||
border: 1px solid #e8eaec;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #dde1e6;
|
||||
border-radius: 3px;
|
||||
|
||||
.filter-item {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-bottom: 8px;
|
||||
margin-right: 8px;
|
||||
margin-bottom: 6px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
// 机组运行状态点
|
||||
.status-dot {
|
||||
display: inline-block;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
margin-right: 6px;
|
||||
|
||||
&.running { background-color: #52c41a; box-shadow: 0 0 5px #52c41a; }
|
||||
&.stopped { background-color: #f5222d; box-shadow: 0 0 5px #f5222d; }
|
||||
&.standby { background-color: #faad14; box-shadow: 0 0 5px #faad14; }
|
||||
&.offline { background-color: #909399; }
|
||||
// ── 顶部导航栏 ───────────────────────────────────────────────
|
||||
.navbar {
|
||||
background-color: #1c2b3a !important;
|
||||
border-bottom: 1px solid #253547 !important;
|
||||
box-shadow: 0 1px 4px rgba(0,0,0,.2) !important;
|
||||
height: 44px !important;
|
||||
line-height: 44px !important;
|
||||
}
|
||||
|
||||
// 工艺参数数值
|
||||
.param-value {
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: #1565c0;
|
||||
letter-spacing: 1px;
|
||||
// ── 标签页 ───────────────────────────────────────────────────
|
||||
.tags-view-container {
|
||||
background: #ffffff !important;
|
||||
border-bottom: 1px solid #dde1e6 !important;
|
||||
height: 30px !important;
|
||||
|
||||
.tags-view-wrapper .tags-view-item {
|
||||
height: 24px !important;
|
||||
line-height: 22px !important;
|
||||
font-size: 11px !important;
|
||||
border: 1px solid #dde1e6 !important;
|
||||
background: #f0f2f5 !important;
|
||||
color: #4a5568 !important;
|
||||
margin-top: 3px !important;
|
||||
padding: 0 8px !important;
|
||||
border-radius: 2px !important;
|
||||
|
||||
&.active {
|
||||
background: #1d4e89 !important;
|
||||
border-color: #1d4e89 !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.param-unit {
|
||||
font-size: 11px;
|
||||
color: #909399;
|
||||
margin-left: 4px;
|
||||
// ── 侧边栏 Logo ──────────────────────────────────────────────
|
||||
.sidebar-logo-container {
|
||||
background-color: #152231 !important;
|
||||
border-bottom: 1px solid #0f1a27 !important;
|
||||
|
||||
.sidebar-title {
|
||||
font-size: 13px !important;
|
||||
font-weight: 700 !important;
|
||||
color: #ecf0f1 !important;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
}
|
||||
|
||||
// 告警闪烁
|
||||
@keyframes alarmBlink {
|
||||
0%, 100% { opacity: 1; }
|
||||
50% { opacity: 0.3; }
|
||||
}
|
||||
.alarm-blink {
|
||||
animation: alarmBlink 1s ease-in-out infinite;
|
||||
color: #f5222d;
|
||||
// ── 面包屑 ───────────────────────────────────────────────────
|
||||
.el-breadcrumb__inner { color: #7f8c8d !important; }
|
||||
.el-breadcrumb__inner.is-link:hover { color: #1d4e89 !important; }
|
||||
.el-breadcrumb__separator { color: #bdc3c7 !important; }
|
||||
|
||||
// ── 右侧 aside 提示 ──────────────────────────────────────────
|
||||
aside {
|
||||
background: #eaf2fb;
|
||||
padding: 6px 14px;
|
||||
margin-bottom: 12px;
|
||||
border-left: 3px solid #1d4e89;
|
||||
border-radius: 2px;
|
||||
line-height: 28px;
|
||||
font-size: 12px;
|
||||
color: #4a5568;
|
||||
a { color: #1d4e89; &:hover { color: #2e86c1; } }
|
||||
}
|
||||
|
||||
.link-type, .link-type:focus {
|
||||
color: #1890ff;
|
||||
cursor: pointer;
|
||||
&:hover { color: #40a9ff; }
|
||||
}
|
||||
|
||||
aside {
|
||||
background: #e8f4ff;
|
||||
padding: 8px 16px;
|
||||
margin-bottom: 16px;
|
||||
border-left: 3px solid #1890ff;
|
||||
border-radius: 2px;
|
||||
display: block;
|
||||
line-height: 32px;
|
||||
font-size: 13px;
|
||||
color: #606266;
|
||||
a { color: #1890ff; &:hover { color: #40a9ff; } }
|
||||
color: #1d4e89; cursor: pointer;
|
||||
&:hover { color: #2979cc; }
|
||||
}
|
||||
|
||||
.sub-navbar {
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
padding-right: 20px;
|
||||
background: linear-gradient(90deg, #1565c0 0%, #1890ff 100%);
|
||||
|
||||
.subtitle { font-size: 16px; color: #fff; letter-spacing: 1px; }
|
||||
height: 40px; line-height: 40px;
|
||||
position: relative; width: 100%;
|
||||
text-align: right; padding-right: 16px;
|
||||
background: linear-gradient(90deg, #1c2b3a 0%, #1d4e89 100%);
|
||||
.subtitle { font-size: 13px; color: #fff; }
|
||||
}
|
||||
|
||||
.components-container {
|
||||
margin: 20px 30px;
|
||||
position: relative;
|
||||
.components-container { margin: 16px 24px; position: relative; }
|
||||
|
||||
// ── 机组状态指示 ─────────────────────────────────────────────
|
||||
.status-dot {
|
||||
display: inline-block;
|
||||
width: 7px; height: 7px;
|
||||
border-radius: 50%;
|
||||
margin-right: 5px;
|
||||
&.running { background-color: #2471a3; box-shadow: 0 0 4px #2471a3; }
|
||||
&.stopped { background-color: #c0392b; box-shadow: 0 0 4px #c0392b; }
|
||||
&.standby { background-color: #d68910; box-shadow: 0 0 4px #d68910; }
|
||||
&.offline { background-color: #95a5a6; }
|
||||
}
|
||||
|
||||
// ── 工艺参数数值 ─────────────────────────────────────────────
|
||||
.param-value {
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
font-size: 18px; font-weight: 700;
|
||||
color: #1d4e89; letter-spacing: 1px;
|
||||
}
|
||||
.param-unit { font-size: 11px; color: #7f8c8d; margin-left: 3px; }
|
||||
|
||||
// ── 告警闪烁 ─────────────────────────────────────────────────
|
||||
@keyframes alarmBlink { 0%,100%{opacity:1} 50%{opacity:.3} }
|
||||
.alarm-blink { animation: alarmBlink 1s ease-in-out infinite; color: #c0392b; }
|
||||
|
||||
// ── 滚动条 ───────────────────────────────────────────────────
|
||||
::-webkit-scrollbar { width: 5px; height: 5px; }
|
||||
::-webkit-scrollbar-track { background: #f0f2f5; }
|
||||
::-webkit-scrollbar-thumb { background: #bdc3c7; border-radius: 3px; }
|
||||
::-webkit-scrollbar-thumb:hover { background: #95a5a6; }
|
||||
|
||||
.multiselect { line-height: 16px; }
|
||||
.multiselect--active { z-index: 1000 !important; }
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
.submenu-title-noDropdown,
|
||||
.el-submenu__title {
|
||||
&:hover {
|
||||
background-color: rgba(255, 255, 255, 0.06) !important;
|
||||
background-color: rgba(255,255,255,.06) !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,26 +89,21 @@
|
||||
}
|
||||
|
||||
.el-menu-item.is-active {
|
||||
background-color: #1565c0 !important;
|
||||
background-color: #1d4e89 !important;
|
||||
color: #ffffff !important;
|
||||
border-left: 3px solid #5dade2;
|
||||
}
|
||||
|
||||
& .nest-menu .el-submenu>.el-submenu__title,
|
||||
& .el-submenu .el-menu-item {
|
||||
min-width: $base-sidebar-width !important;
|
||||
|
||||
&:hover {
|
||||
background-color: rgba(255, 255, 255, 0.06) !important;
|
||||
}
|
||||
&:hover { background-color: rgba(255,255,255,.06) !important; }
|
||||
}
|
||||
|
||||
& .theme-dark .nest-menu .el-submenu>.el-submenu__title,
|
||||
& .theme-dark .el-submenu .el-menu-item {
|
||||
background-color: $base-sub-menu-background !important;
|
||||
|
||||
&:hover {
|
||||
background-color: $base-sub-menu-hover !important;
|
||||
}
|
||||
&:hover { background-color: $base-sub-menu-hover !important; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,32 +1,31 @@
|
||||
// ============================================================
|
||||
// 冷轧双机架二级控制系统 — 工业标准配色
|
||||
// 深色侧边栏 + 浅灰内容区(工业管理系统经典布局)
|
||||
// 冷轧双机架二级控制系统 — 金属灰 · 深蓝工业主题
|
||||
// ============================================================
|
||||
|
||||
// btn.scss 依赖变量
|
||||
$blue: #1565c0;
|
||||
$light-blue:#1890ff;
|
||||
$red: #f5222d;
|
||||
$pink: #eb2f96;
|
||||
$green: #52c41a;
|
||||
$tiffany: #13c2c2;
|
||||
$yellow: #faad14;
|
||||
$panGreen: #52c41a;
|
||||
// btn.scss 依赖变量(全部替换为金属/蓝色系,禁用绿色)
|
||||
$blue: #1d4e89;
|
||||
$light-blue:#2979cc;
|
||||
$red: #c0392b;
|
||||
$pink: #a93226;
|
||||
$green: #2e86c1; // 原绿色位置改用蓝色
|
||||
$tiffany: #2471a3;
|
||||
$yellow: #d68910;
|
||||
$panGreen: #2e86c1;
|
||||
|
||||
// 侧边栏(深钢蓝)
|
||||
$base-menu-color: #b8cce4;
|
||||
// ── 侧边栏(深钢色)──────────────────────────────────────────
|
||||
$base-menu-color: #b0bec5; // 未激活文字:金属浅灰
|
||||
$base-menu-color-active: #ffffff;
|
||||
$base-menu-background: #1b2a3b;
|
||||
$base-logo-title-color: #ffffff;
|
||||
$base-menu-background: #1c2b3a; // 深钢蓝
|
||||
$base-logo-title-color: #ecf0f1;
|
||||
|
||||
$base-menu-light-color: rgba(0,0,0,.65);
|
||||
$base-menu-light-background: #ffffff;
|
||||
$base-logo-light-title-color:#001529;
|
||||
$base-logo-light-title-color:#1c2b3a;
|
||||
|
||||
$base-sub-menu-background: #132233;
|
||||
$base-sub-menu-hover: #0d1e2e;
|
||||
$base-sub-menu-background: #152231;
|
||||
$base-sub-menu-hover: #0f1a27;
|
||||
|
||||
$base-sidebar-width: 210px;
|
||||
$base-sidebar-width: 200px;
|
||||
|
||||
// webpack JS/SCSS 变量共享
|
||||
:export {
|
||||
|
||||
@@ -1,169 +1,366 @@
|
||||
<template>
|
||||
<div class="app-container home">
|
||||
<el-row :gutter="20">
|
||||
<el-col :xs="24" :sm="24" :md="12" :lg="14">
|
||||
<el-card class="update-log">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>联系信息</span>
|
||||
<div class="mill-dashboard">
|
||||
|
||||
<!-- 顶部状态栏 -->
|
||||
<div class="status-bar">
|
||||
<div class="status-bar__left">
|
||||
<span class="system-name">冷轧双机架二级控制系统</span>
|
||||
<span class="divider">|</span>
|
||||
<span class="unit-tag">2FK 机组</span>
|
||||
</div>
|
||||
<div class="status-bar__right">
|
||||
<span class="sys-status online">
|
||||
<i class="el-icon-connection"></i> 系统在线
|
||||
</span>
|
||||
<span class="clock">{{ currentTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- KPI 汇总卡片 -->
|
||||
<el-row :gutter="12" class="kpi-row">
|
||||
<el-col :span="6" v-for="kpi in kpiList" :key="kpi.label">
|
||||
<div class="kpi-card">
|
||||
<div class="kpi-card__icon" :style="{ background: kpi.color }">
|
||||
<i :class="kpi.icon"></i>
|
||||
</div>
|
||||
<div class="body">
|
||||
<p>
|
||||
<i class="el-icon-user-solid"></i> QQ群:
|
||||
<a href="https://jq.qq.com/?_wv=1027&k=2zE87c2G" target="_blank"
|
||||
> 782924350</a
|
||||
>
|
||||
</p>
|
||||
<p>
|
||||
<i class="el-icon-chat-dot-round"></i> 微信:<a
|
||||
>Almost-2y</a
|
||||
>
|
||||
</p>
|
||||
<p style="color: #f54a4a;font-size:16px">
|
||||
<i class="el-icon-bell"></i> 说明:<a
|
||||
>技术咨询、业务定制等其它支持可添加 微信: Almost-2y / QQ: 846249920 进行沟通交流</a
|
||||
>
|
||||
</p>
|
||||
<p>
|
||||
<i class="el-icon-shopping-bag-2"></i> 腾讯云秒杀:<a style="color: #365be4" href="https://curl.qcloud.com/W5KFkBG4" target="_blank"
|
||||
>点我进入</a>
|
||||
</p>
|
||||
<p>
|
||||
<i class="el-icon-shopping-bag-2"></i> 腾讯云服务器:<a style="color: #365be4" href="https://curl.qcloud.com/AacfyRxq" target="_blank"
|
||||
>点我进入</a>
|
||||
</p>
|
||||
<p>
|
||||
<i class="el-icon-shopping-bag-2"></i> 阿里云优惠:<a style="color: #365be4" href="https://www.aliyun.com/activity/daily/bestoffer?userCode=q2b8atsa" target="_blank"
|
||||
>点我进入</a>
|
||||
</p>
|
||||
<p>
|
||||
<i class="el-icon-shopping-bag-2"></i> 阿里云服务器:<a style="color: #365be4" href="https://www.aliyun.com/daily-act/ecs/activity_selection?userCode=q2b8atsa" target="_blank"
|
||||
>点我进入</a>
|
||||
</p>
|
||||
<div class="kpi-card__body">
|
||||
<div class="kpi-card__value">{{ kpi.value }}</div>
|
||||
<div class="kpi-card__label">{{ kpi.label }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="12" :lg="10">
|
||||
<el-card class="update-log">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>捐赠支持</span>
|
||||
</div>
|
||||
<div class="body">
|
||||
<img
|
||||
src="https://foruda.gitee.com/images/1672215449995765124/596b46c3_2042292.png"
|
||||
alt="donate"
|
||||
width="100%"
|
||||
/>
|
||||
<span style="display: inline-block; height: 30px; line-height: 30px"
|
||||
>可以请作者喝杯咖啡以示鼓励!</span
|
||||
>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-divider />
|
||||
<el-row :gutter="20">
|
||||
<el-col :xs="24" :sm="24" :md="12" :lg="8">
|
||||
<el-card class="update-log">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>流程功能列表</span>
|
||||
|
||||
<!-- 机架状态 + 工艺参数 -->
|
||||
<el-row :gutter="12" class="stand-row">
|
||||
<el-col :span="12" v-for="stand in stands" :key="stand.name">
|
||||
<div class="stand-card">
|
||||
<div class="stand-card__header">
|
||||
<span class="stand-name">{{ stand.name }}</span>
|
||||
<span :class="['stand-badge', stand.running ? 'running' : 'stopped']">
|
||||
{{ stand.running ? '▶ 运行中' : '■ 停机' }}
|
||||
</span>
|
||||
</div>
|
||||
<p>1.单节点配置表单</p>
|
||||
<p>2.多实例会签任务</p>
|
||||
<p>3.节点任务/执行监听器</p>
|
||||
<p>4.动态配置任务候选人</p>
|
||||
<p>5.其它模块优化</p>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="12" :lg="16">
|
||||
<el-card class="update-log">
|
||||
<div slot="header" class="clearfix">
|
||||
<span>流程演示</span>
|
||||
<div class="stand-card__params">
|
||||
<div class="param-item" v-for="p in stand.params" :key="p.label">
|
||||
<span class="param-label">{{ p.label }}</span>
|
||||
<span class="param-val">{{ p.value }}</span>
|
||||
<span class="param-u">{{ p.unit }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<img style="width: 850px" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f248dea817f74341b70f4087f425975b~tplv-k3u1fbpfcp-watermark.image?"/>
|
||||
</el-card>
|
||||
<div class="stand-card__footer">
|
||||
<span>当前卷号:<b>{{ stand.coilNo }}</b></span>
|
||||
<span>钢种:<b>{{ stand.steelGrade }}</b></span>
|
||||
<span>班次:<b>{{ stand.shift }}</b></span>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<!-- 最近生产计划 & 通信状态 -->
|
||||
<el-row :gutter="12" class="bottom-row">
|
||||
<el-col :span="17">
|
||||
<div class="table-card">
|
||||
<div class="table-card__header">
|
||||
<span><i class="el-icon-document"></i> 近期生产计划</span>
|
||||
<el-button type="primary" size="mini" @click="$router.push('/mill/plan')">查看全部</el-button>
|
||||
</div>
|
||||
<el-table :data="planList" size="mini" stripe border style="width:100%">
|
||||
<el-table-column prop="planNo" label="计划号" width="130" />
|
||||
<el-table-column prop="inMatNo" label="入口钢卷号" width="130" />
|
||||
<el-table-column prop="sgSign" label="钢种" width="80" />
|
||||
<el-table-column prop="inMatThick" label="目标厚度(mm)" width="100" align="right" />
|
||||
<el-table-column prop="inMatWidth" label="宽度(mm)" width="90" align="right" />
|
||||
<el-table-column prop="planStatus" label="状态" width="80" align="center">
|
||||
<template slot-scope="{ row }">
|
||||
<el-tag :type="statusType(row.planStatus)" size="mini">{{ statusText(row.planStatus) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" min-width="130" />
|
||||
</el-table>
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :span="7">
|
||||
<div class="comm-card">
|
||||
<div class="table-card__header">
|
||||
<span><i class="el-icon-cpu"></i> L2/L3 通信状态</span>
|
||||
</div>
|
||||
<div class="comm-item" v-for="c in commStatus" :key="c.label">
|
||||
<span class="comm-label">{{ c.label }}</span>
|
||||
<span :class="['comm-dot', c.ok ? 'ok' : 'err']"></span>
|
||||
<span :class="['comm-state', c.ok ? 'ok' : 'err']">{{ c.ok ? '正常' : '断开' }}</span>
|
||||
<span class="comm-time">{{ c.lastTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "index",
|
||||
name: 'MillDashboard',
|
||||
data() {
|
||||
return {
|
||||
// 版本号
|
||||
version: "3.4.0",
|
||||
};
|
||||
currentTime: '',
|
||||
timer: null,
|
||||
kpiList: [
|
||||
{ label: '今日计划数', value: 24, icon: 'el-icon-document', color: '#1d4e89' },
|
||||
{ label: '已完成', value: 18, icon: 'el-icon-circle-check', color: '#2471a3' },
|
||||
{ label: '在产中', value: 2, icon: 'el-icon-loading', color: '#d68910' },
|
||||
{ label: '异常/待处理', value: 1, icon: 'el-icon-warning-outline', color: '#c0392b' }
|
||||
],
|
||||
stands: [
|
||||
{
|
||||
name: '1# 机架(入口机架)',
|
||||
running: true,
|
||||
coilNo: 'C2026042800012',
|
||||
steelGrade: 'DC04',
|
||||
shift: '甲班',
|
||||
params: [
|
||||
{ label: '入口厚度', value: '2.500', unit: 'mm' },
|
||||
{ label: '出口厚度', value: '1.800', unit: 'mm' },
|
||||
{ label: '轧制速度', value: '380', unit: 'm/min' },
|
||||
{ label: '轧制力', value: '12400', unit: 'kN' },
|
||||
{ label: '前张力', value: '85.0', unit: 'kN' },
|
||||
{ label: '后张力', value: '92.0', unit: 'kN' }
|
||||
]
|
||||
},
|
||||
{
|
||||
name: '2# 机架(出口机架)',
|
||||
running: true,
|
||||
coilNo: 'C2026042800012',
|
||||
steelGrade: 'DC04',
|
||||
shift: '甲班',
|
||||
params: [
|
||||
{ label: '入口厚度', value: '1.800', unit: 'mm' },
|
||||
{ label: '出口厚度', value: '0.800', unit: 'mm' },
|
||||
{ label: '轧制速度', value: '855', unit: 'm/min' },
|
||||
{ label: '轧制力', value: '9800', unit: 'kN' },
|
||||
{ label: '前张力', value: '110.0', unit: 'kN' },
|
||||
{ label: '后张力', value: '85.0', unit: 'kN' }
|
||||
]
|
||||
}
|
||||
],
|
||||
planList: [
|
||||
{ planNo: 'P20260428001', inMatNo: 'C2026042800012', sgSign: 'DC04', inMatThick: '2.500', inMatWidth: '1250', planStatus: 1, createTime: '2026-04-28 08:00:10' },
|
||||
{ planNo: 'P20260428002', inMatNo: 'C2026042800013', sgSign: 'SPCC', inMatThick: '2.000', inMatWidth: '1000', planStatus: 0, createTime: '2026-04-28 08:01:05' },
|
||||
{ planNo: 'P20260428003', inMatNo: 'C2026042800014', sgSign: 'DC01', inMatThick: '2.800', inMatWidth: '1100', planStatus: 0, createTime: '2026-04-28 08:01:30' },
|
||||
{ planNo: 'P20260427021', inMatNo: 'C2026042700085', sgSign: 'DC04', inMatThick: '3.000', inMatWidth: '1250', planStatus: 2, createTime: '2026-04-27 21:15:00' },
|
||||
{ planNo: 'P20260427020', inMatNo: 'C2026042700084', sgSign: 'SPCE', inMatThick: '2.500', inMatWidth: '900', planStatus: 2, createTime: '2026-04-27 20:50:00' }
|
||||
],
|
||||
commStatus: [
|
||||
{ label: 'L3→L2 作业命令', ok: true, lastTime: '13:24:08' },
|
||||
{ label: 'L2→L3 计划应答', ok: true, lastTime: '13:24:09' },
|
||||
{ label: 'L2→L3 产出信息', ok: true, lastTime: '13:20:33' },
|
||||
{ label: 'L3→L2 产出应答', ok: false, lastTime: '12:58:01' }
|
||||
]
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.updateTime()
|
||||
this.timer = setInterval(this.updateTime, 1000)
|
||||
},
|
||||
beforeDestroy() {
|
||||
clearInterval(this.timer)
|
||||
},
|
||||
methods: {
|
||||
goTarget(href) {
|
||||
window.open(href, "_blank");
|
||||
updateTime() {
|
||||
const now = new Date()
|
||||
const pad = n => String(n).padStart(2, '0')
|
||||
this.currentTime = `${now.getFullYear()}-${pad(now.getMonth()+1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.home {
|
||||
blockquote {
|
||||
padding: 10px 20px;
|
||||
margin: 0 0 20px;
|
||||
font-size: 17.5px;
|
||||
border-left: 5px solid #eee;
|
||||
}
|
||||
hr {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
border: 0;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
.col-item {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 13px;
|
||||
color: #676a6c;
|
||||
overflow-x: hidden;
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 10px;
|
||||
font-size: 26px;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 10px;
|
||||
|
||||
b {
|
||||
font-weight: 700;
|
||||
}
|
||||
}
|
||||
|
||||
.update-log {
|
||||
ol {
|
||||
display: block;
|
||||
list-style-type: decimal;
|
||||
margin-block-start: 1em;
|
||||
margin-block-end: 1em;
|
||||
margin-inline-start: 0;
|
||||
margin-inline-end: 0;
|
||||
padding-inline-start: 40px;
|
||||
statusText(s) {
|
||||
return { 0: '待生产', 1: '生产中', 2: '已完成', 3: '已撤销' }[s] || '-'
|
||||
},
|
||||
statusType(s) {
|
||||
return { 0: 'info', 1: 'warning', 2: '', 3: 'danger' }[s] || 'info'
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.mill-dashboard {
|
||||
padding: 12px 16px;
|
||||
background: #f0f2f5;
|
||||
min-height: 100%;
|
||||
font-size: 12px;
|
||||
color: #2c3e50;
|
||||
}
|
||||
|
||||
/* ── 顶部状态栏 ── */
|
||||
.status-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
background: #1c2b3a;
|
||||
color: #ecf0f1;
|
||||
padding: 0 16px;
|
||||
height: 36px;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 12px;
|
||||
font-size: 12px;
|
||||
|
||||
&__left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
&__right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
}
|
||||
.system-name { font-weight: 700; font-size: 13px; letter-spacing: .5px; }
|
||||
.divider { color: #4a6275; }
|
||||
.unit-tag { background: #1d4e89; padding: 1px 8px; border-radius: 2px; font-size: 11px; }
|
||||
.sys-status { font-size: 11px; &.online { color: #7fb3d3; } }
|
||||
.clock { font-family: 'Courier New', monospace; font-size: 12px; color: #aab7c4; }
|
||||
|
||||
/* ── KPI 卡片 ── */
|
||||
.kpi-row { margin-bottom: 12px; }
|
||||
|
||||
.kpi-card {
|
||||
background: #ffffff;
|
||||
border: 1px solid #dde1e6;
|
||||
border-radius: 3px;
|
||||
padding: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
box-shadow: 0 1px 4px rgba(0,0,0,.05);
|
||||
|
||||
&__icon {
|
||||
width: 42px; height: 42px;
|
||||
border-radius: 4px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 18px; color: #ffffff;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
&__value {
|
||||
font-size: 24px; font-weight: 700;
|
||||
color: #1c2b3a; line-height: 1;
|
||||
font-family: 'Courier New', monospace;
|
||||
}
|
||||
&__label {
|
||||
font-size: 11px; color: #7f8c8d;
|
||||
margin-top: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── 机架状态卡片 ── */
|
||||
.stand-row { margin-bottom: 12px; }
|
||||
|
||||
.stand-card {
|
||||
background: #ffffff;
|
||||
border: 1px solid #dde1e6;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 1px 4px rgba(0,0,0,.05);
|
||||
overflow: hidden;
|
||||
|
||||
&__header {
|
||||
background: #1c2b3a;
|
||||
color: #ecf0f1;
|
||||
padding: 7px 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
}
|
||||
&__params {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 1px;
|
||||
background: #e4e7ed;
|
||||
border-bottom: 1px solid #e4e7ed;
|
||||
}
|
||||
&__footer {
|
||||
padding: 6px 12px;
|
||||
font-size: 11px;
|
||||
color: #606266;
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
background: #fafafa;
|
||||
b { color: #1c2b3a; }
|
||||
}
|
||||
}
|
||||
|
||||
.stand-name { letter-spacing: .5px; }
|
||||
|
||||
.stand-badge {
|
||||
font-size: 11px; padding: 2px 8px;
|
||||
border-radius: 2px; font-weight: 600;
|
||||
&.running { background: #1d4e89; color: #fff; }
|
||||
&.stopped { background: #c0392b; color: #fff; }
|
||||
}
|
||||
|
||||
.param-item {
|
||||
background: #ffffff;
|
||||
padding: 7px 10px;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 4px;
|
||||
}
|
||||
.param-label {
|
||||
font-size: 11px; color: #7f8c8d;
|
||||
min-width: 52px; flex-shrink: 0;
|
||||
}
|
||||
.param-val {
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 15px; font-weight: 700;
|
||||
color: #1d4e89;
|
||||
}
|
||||
.param-u { font-size: 10px; color: #95a5a6; }
|
||||
|
||||
/* ── 底部表格 & 通信状态 ── */
|
||||
.bottom-row {}
|
||||
|
||||
.table-card, .comm-card {
|
||||
background: #ffffff;
|
||||
border: 1px solid #dde1e6;
|
||||
border-radius: 3px;
|
||||
box-shadow: 0 1px 4px rgba(0,0,0,.05);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table-card__header {
|
||||
background: #f7f9fc;
|
||||
border-bottom: 1px solid #e4e7ed;
|
||||
padding: 7px 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #1c2b3a;
|
||||
}
|
||||
|
||||
/* 通信状态 */
|
||||
.comm-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 7px 12px;
|
||||
border-bottom: 1px solid #f0f2f5;
|
||||
font-size: 11px;
|
||||
gap: 6px;
|
||||
&:last-child { border-bottom: none; }
|
||||
}
|
||||
.comm-label { flex: 1; color: #4a5568; }
|
||||
.comm-dot {
|
||||
width: 7px; height: 7px; border-radius: 50%;
|
||||
&.ok { background: #2471a3; box-shadow: 0 0 4px #2471a3; }
|
||||
&.err { background: #c0392b; box-shadow: 0 0 4px #c0392b; animation: alarmBlink 1.2s infinite; }
|
||||
}
|
||||
.comm-state {
|
||||
font-weight: 600; width: 28px;
|
||||
&.ok { color: #2471a3; }
|
||||
&.err { color: #c0392b; }
|
||||
}
|
||||
.comm-time { color: #95a5a6; font-family: 'Courier New', monospace; font-size: 11px; }
|
||||
|
||||
@keyframes alarmBlink { 0%,100%{opacity:1} 50%{opacity:.2} }
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user