From f4903d9eecc8102dcaa5c3c5751961556b12d172 Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Fri, 28 Aug 2026 10:25:05 +0800 Subject: [PATCH] Refactor UI components for improved layout and styling - Updated VoiceConversation.vue to set a fixed font size for the header. - Changed index.vue to use an aside element for the header and adjusted layout to a grid system. - Enhanced lock.vue by restructuring the layout and improving visual elements for better user experience. - Revamped login.vue to introduce a visual section and reorganized form elements for clarity. - Redesigned register.vue to include a visual brand section and improved form layout for user registration. --- src/assets/styles/sidebar.scss | 4 +- src/assets/styles/variables.module.scss | 4 +- src/components/Breadcrumb/index.vue | 12 +- src/components/TableSearch/index.vue | 92 +++-- src/layout/components/AppMain.vue | 210 +++++++++- src/layout/components/Navbar.vue | 105 ++++- src/layout/components/Sidebar/Logo.vue | 64 ++- src/layout/components/Sidebar/index.vue | 93 ++++- src/layout/components/TagsView/index.vue | 59 ++- src/styles/minimalist.css | 151 ++++++- src/views/corpusManger/corpus/index.vue | 93 ++++- .../components/MainWorkspace.vue | 15 +- .../corpusManger/speech_synthesis/index.vue | 79 +++- src/views/device/register/index.vue | 145 ++++--- src/views/flow/index.vue | 352 +++++++++++----- src/views/index.vue | 153 ++++--- .../inspection/cockpit/components/Header.vue | 264 +++++++----- .../ManualTakeover/VoiceConversation.vue | 2 +- src/views/inspection/cockpit/index.vue | 52 ++- src/views/lock.vue | 182 ++++++--- src/views/login.vue | 378 ++++++++++++++---- src/views/register.vue | 279 ++++++++----- 22 files changed, 2093 insertions(+), 695 deletions(-) diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index 20bebfa..95ceb41 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -47,7 +47,7 @@ &.has-logo { .el-scrollbar { - height: calc(100% - 56px); + height: auto; } } @@ -62,7 +62,7 @@ } .svg-icon { - margin-right: 12px; + margin-right: 14px; } .el-menu { diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss index 03d675f..305dcdf 100644 --- a/src/assets/styles/variables.module.scss +++ b/src/assets/styles/variables.module.scss @@ -21,8 +21,8 @@ $menuLightText: #374151; $menuLightActiveText: #0052d9; // 基础变量 -$base-sidebar-width: 216px; -$sideBarWidth: 216px; +$base-sidebar-width: 248px; +$sideBarWidth: 248px; // 菜单暗色变量 $base-menu-color: #374151; diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index c13e5e9..5a9b904 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -85,14 +85,14 @@ getBreadcrumb() \ No newline at end of file + diff --git a/src/components/TableSearch/index.vue b/src/components/TableSearch/index.vue index 6bb4556..74e74ec 100644 --- a/src/components/TableSearch/index.vue +++ b/src/components/TableSearch/index.vue @@ -37,33 +37,75 @@ const resetQuery = () => { - - - - - - - 搜索 - 重置 - - - - - - {{ formData.search ? "收起" : "展开" }} - - - - - + + + FILTER + 条件筛选 + + + + + + + + 搜索 + 重置 + + + + + + {{ formData.search ? "收起" : "展开" }} + + + + + + diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 827d9ce..cc9b674 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -1,12 +1,31 @@ - - - - - - - - + + + + + {{ sectionCode }} + + + + {{ sectionLabel }} + {{ routeTitle }} + + + 当前位置 + {{ routeTrail }} + + + + + + + + + + + + + @@ -20,6 +39,33 @@ import useTagsViewStore from '@/store/modules/tagsView' const route = useRoute() const tagsViewStore = useTagsViewStore() +const sectionMap = { + system: ['SYS', '系统管理'], + monitor: ['OPS', '运行监控'], + tool: ['DEV', '开发工具'], + device: ['DEV', '设备中心'], + inspection: ['INS', '巡检业务'], + intelligenceTest: ['AIT', '智能测试'], + test: ['TST', '测试管理'], + corpusManger: ['COR', '语料中心'], + vi: ['VOC', '语音测试'], + is: ['HMI', '交互测试'], + evaluate: ['EVA', '评价中心'], +} + +const pathSection = computed(() => route.path.split('/').filter(Boolean)[0] || 'index') +const sectionMeta = computed(() => sectionMap[pathSection.value] || ['CMV', '业务工作台']) +const sectionCode = computed(() => sectionMeta.value[0]) +const sectionLabel = computed(() => sectionMeta.value[1]) +const routeTitle = computed(() => route.meta?.title || route.name || '工作台') +const routeTrail = computed(() => { + const titles = route.matched + .map(item => item.meta?.title) + .filter(Boolean) + return titles.length ? titles.join(' / ') : routeTitle.value +}) +const isImmersive = computed(() => route.path === '/index') + onMounted(() => { addIframe() }) @@ -38,8 +84,8 @@ function addIframe() { @@ -75,9 +254,4 @@ function addIframe() { height: 6px; } -@media (max-width: 768px) { - .app-main { - padding: 16px; - } -} diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index a92c654..a073414 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,7 +1,13 @@ - + + + CONTROL DESK + {{ currentTitle }} + + + @@ -88,6 +94,7 @@ const appStore = useAppStore() const userStore = useUserStore() const lockStore = useLockStore() const settingsStore = useSettingsStore() +const currentTitle = computed(() => route.meta?.title || route.name || '工作台') function toggleSideBar() { appStore.toggleSideBar() @@ -175,7 +182,7 @@ async function toggleTheme(event) { diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index dee7020..e0d93fd 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -6,8 +6,13 @@ {{ title }} - - {{ title }} + + + + + {{ title }} + TEST OPERATIONS + @@ -67,36 +72,71 @@ const getLogoTextColor = computed(() => { .sidebar-logo-container { position: relative; width: 100%; - height: 56px; - line-height: 56px; + height: 72px; + line-height: 72px; background: v-bind(getLogoBackground); - text-align: center; + text-align: left; overflow: hidden; & .sidebar-logo-link { height: 100%; width: 100%; + padding: 0 18px; + display: flex; + align-items: center; & .sidebar-logo { width: 28px; height: 28px; - vertical-align: middle; - margin-right: 12px; + object-fit: contain; } & .sidebar-title { - display: inline-block; + display: block; margin: 0; color: v-bind(getLogoTextColor); font-weight: 600; - line-height: 56px; - font-size: 14px; - font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; - vertical-align: middle; + overflow: hidden; + line-height: 1.25; + font-size: 13px; + font-family: var(--min-font-family); + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .sidebar-brand-mark { + width: 36px; + height: 36px; + flex: 0 0 36px; + border: 1px solid var(--min-border-light); + display: grid; + place-items: center; + } + + .sidebar-brand-copy { + min-width: 0; + margin-left: 12px; + display: flex; + flex-direction: column; + gap: 3px; + + small { + color: var(--min-text-secondary); + font-size: 9px; + line-height: 1.2; + font-weight: 500; } } &.collapse { + text-align: center; + + .sidebar-logo-link { + padding: 0; + justify-content: center; + } + .sidebar-logo { margin-right: 0px; } diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index bfe790e..db2c162 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -1,6 +1,10 @@ + + 工作导航 + 01 + + + + + CMVR CONTROL OS + 系统在线 + + @@ -71,11 +82,38 @@ const activeMenu = computed(() => { diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index e03f766..1149348 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -1,5 +1,9 @@ + + OPEN + {{ String(visitedViews.length).padStart(2, '0') }} + .tags-view-container { - height: 40px; + height: 44px; width: 100%; - background: var(--tags-bg, #fff); + display: flex; + background: var(--min-bg-subtle); border-bottom: 1px solid var(--tags-item-border, #d8dce5); box-shadow: none; + .tags-view-index { + width: 72px; + flex: 0 0 72px; + border-right: 1px solid var(--tags-item-border); + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + color: var(--min-text-secondary); + font-size: 9px; + + strong { + color: var(--min-primary); + font-size: 10px; + font-weight: 600; + } + } + .tags-view-wrapper { + min-width: 0; + flex: 1; + .tags-view-item { display: inline-block; position: relative; cursor: pointer; - height: 32px; - line-height: 31px; + height: 43px; + line-height: 43px; border: 0; + border-right: 1px solid var(--tags-item-border); border-bottom: 2px solid transparent; color: var(--tags-item-text); background: transparent; - padding: 0 12px; + padding: 0 16px; font-size: 12px; - margin-left: 4px; - margin-top: 4px; + margin: 0; &:first-of-type { - margin-left: 12px; + margin-left: 0; } &:last-of-type { @@ -281,6 +307,7 @@ function handleScroll() { &.active { color: var(--min-primary); border-bottom-color: var(--min-primary); + background: var(--min-bg-white); font-weight: 600; } } @@ -311,6 +338,22 @@ function handleScroll() { } } } + +@media (max-width: 768px) { + .tags-view-container { + height: 42px; + + .tags-view-index { + display: none; + } + + .tags-view-wrapper .tags-view-item { + height: 41px; + line-height: 41px; + padding: 0 12px; + } + } +} \ No newline at end of file + diff --git a/src/views/corpusManger/speech_synthesis/components/MainWorkspace.vue b/src/views/corpusManger/speech_synthesis/components/MainWorkspace.vue index dc61992..8844e07 100644 --- a/src/views/corpusManger/speech_synthesis/components/MainWorkspace.vue +++ b/src/views/corpusManger/speech_synthesis/components/MainWorkspace.vue @@ -325,16 +325,18 @@ const cancel = () => { diff --git a/src/views/device/register/index.vue b/src/views/device/register/index.vue index 513c565..014fe1d 100644 --- a/src/views/device/register/index.vue +++ b/src/views/device/register/index.vue @@ -2,8 +2,8 @@ - 机器人设备 - 设备由机器人在线上报,切换机器人后自动刷新。 + DEVICE / INVENTORY + 机器人设备台账 当前机器人 @@ -16,58 +16,64 @@ - - {{ devices.length }}设备总数 - {{ onlineCount }}在线设备 - {{ faultCount }}故障设备 - - - - - - - + + - - - - - - {{ row.deviceName || row.deviceId }}{{ row.deviceId }} - - - - - {{ kindLabel(row.deviceKind, row.typeName) }} - - - - - {{ row.onlineStatus === '1' ? '在线' : '离线' }} - - - - - - - {{ isFault(row) ? '故障' : '正常' }} - - - - - {{ row.errorMessage || '运行正常' }} - - - - - 示教 - - - - - + + + DEVICE LIST + + + + + + + + + + + {{ row.deviceName || row.deviceId }}{{ row.deviceId }} + + + + + {{ kindLabel(row.deviceKind, row.typeName) }} + + + + + {{ row.onlineStatus === '1' ? '在线' : '离线' }} + + + + + + + {{ isFault(row) ? '故障' : '正常' }} + + + + + {{ row.errorMessage || '运行正常' }} + + + + + 示教 + - + + + + + @@ -155,19 +161,26 @@ onMounted(async () => { diff --git a/src/views/flow/index.vue b/src/views/flow/index.vue index 49e3264..2f82128 100644 --- a/src/views/flow/index.vue +++ b/src/views/flow/index.vue @@ -4,20 +4,23 @@ --> - + - {{ flowInfoData.name || "未命名流程" }} - - - {{ stateMap[flowState] }} + FLOW / 01 + + {{ flowInfoData.name || "未命名流程" }} + + + {{ stateMap[flowState] }} + + + 当前发布 V{{ publishedVersionNo }} + + + 正在查看 V{{ previewingVersionNo }} + - - 当前发布 V{{ publishedVersionNo }} - - - 正在查看 V{{ previewingVersionNo }} - @@ -121,61 +124,83 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + @@ -849,6 +874,10 @@ const flowInfoData = ref({ isLog: false, name: "流程", }); +const flowMetrics = computed(() => ({ + nodeCount: (vueFlow.getNodes.value || []).length, + edgeCount: (vueFlow.getEdges.value || []).length, +})); /** * 试运行 @@ -2744,24 +2773,44 @@ onUnmounted(() => { overflow: hidden; .page__container { + display: flex; + flex-direction: column; width: 100%; height: 100%; position: relative; .el-header { display: flex; + height: auto; + min-height: 92px; align-items: center; justify-content: space-between; - padding: 0 16px; + padding: 14px 20px; border-bottom: 1px solid var(--min-border-light); background: var(--min-bg-white); - gap: 18px; + gap: 24px; .flow-heading { + display: flex; + flex: 0 0 230px; + min-width: 0; + flex-direction: column; + align-items: flex-start; + gap: 8px; + } + + .flow-heading__index { + color: var(--min-primary); + font-size: 10px; + font-weight: 600; + } + + .flow-heading__identity { display: flex; min-width: 0; align-items: center; - gap: 10px; + flex-wrap: wrap; + gap: 8px; } .flow-heading__name { @@ -2796,37 +2845,26 @@ onUnmounted(() => { } .flow-status--release, - .flow-status--testRunFinish { - border-color: #c8ead5; - background: #effaf3; - color: #1e7d49; - } - .flow-status--testRunning, - .flow-status--updateData { - border-color: #cbdcf8; - background: #f0f6ff; - color: #2f6fca; - } - + .flow-status--testRunFinish, + .flow-status--updateData, .flow-status--testRunError, - .flow-status--stop { - border-color: #f1cecb; - background: #fff3f2; - color: #c33b32; - } - + .flow-status--stop, .flow-status--pause { - border-color: #ead9b8; - background: #fff9eb; - color: #9a6700; + border-color: var(--min-primary-border); + background: var(--min-primary-soft); + color: var(--min-primary); } .btn__container { display: flex; + flex: 1; min-width: 0; align-items: center; + justify-content: flex-end; gap: 10px; + overflow-x: auto; + scrollbar-width: thin; .btn { display: flex; @@ -2844,13 +2882,17 @@ onUnmounted(() => { } .container { - height: calc(100% - 60px); + flex: 1; + min-height: 0; } .el-main { + display: grid; + grid-template-columns: minmax(0, 1fr) 216px; padding: 0; position: relative; overflow: hidden; + background: var(--min-bg-white); } .el-aside { @@ -2861,6 +2903,13 @@ onUnmounted(() => { background: var(--min-bg-page); } + .canvas-stage { + position: relative; + min-width: 0; + overflow: hidden; + border-right: 1px solid var(--min-border-light); + } + .canvas-toolbar { display: flex; position: absolute; @@ -2972,6 +3021,129 @@ onUnmounted(() => { box-shadow: none; } } + + .flow-summary { + display: flex; + min-width: 0; + flex-direction: column; + background: var(--min-bg-white); + + > header { + display: flex; + min-height: 74px; + flex-direction: column; + justify-content: center; + gap: 4px; + padding: 14px 18px; + border-bottom: 1px solid var(--min-border-light); + + span { + color: var(--min-primary); + font-size: 10px; + font-weight: 600; + } + + strong { + color: var(--min-text-primary); + font-size: 15px; + font-weight: 600; + } + } + } + + .flow-summary__metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + border-bottom: 1px solid var(--min-border-light); + + > div { + display: flex; + min-width: 0; + height: 86px; + align-items: center; + justify-content: center; + flex-direction: column; + border-right: 1px solid var(--min-border-light); + + &:last-child { border-right: 0; } + } + + strong { + color: var(--min-text-primary); + font-size: 20px; + font-weight: 600; + } + + span { + margin-top: 4px; + color: var(--min-text-secondary); + font-size: 10px; + } + } + + .flow-summary__list { + margin: 0; + padding: 8px 18px; + + > div { + display: flex; + min-height: 48px; + align-items: center; + justify-content: space-between; + gap: 12px; + border-bottom: 1px solid var(--min-border-light); + } + + dt, + dd { margin: 0; } + + dt { + color: var(--min-text-secondary); + font-size: 11px; + } + + dd { + overflow: hidden; + color: var(--min-text-primary); + font-size: 11px; + font-weight: 600; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + } + + .flow-summary__fit { + display: flex; + height: 44px; + align-items: center; + justify-content: center; + gap: 8px; + margin: auto 18px 18px; + border: 1px solid var(--min-border-light); + border-radius: var(--min-radius-sm); + background: var(--min-bg-white); + color: var(--min-text-regular); + cursor: pointer; + + &:hover { + border-color: var(--min-primary); + color: var(--min-primary); + } + } + } + + @media (max-width: 1280px) { + .page__container .el-main { grid-template-columns: minmax(0, 1fr) 192px; } + .page__container .el-aside { width: 236px; } + } + + @media (max-width: 1080px) { + .page__container .el-main { grid-template-columns: minmax(0, 1fr); } + .page__container .flow-summary { display: none; } + .page__container .el-header { align-items: flex-start; flex-direction: column; } + .page__container .el-header .flow-heading { flex-basis: auto; } + .page__container .el-header .btn__container { width: 100%; justify-content: flex-start; } } } diff --git a/src/views/index.vue b/src/views/index.vue index ca72905..95ebd75 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -8,7 +8,7 @@ 招商车研机器人智能测试管理系统 - 连接设备、编排流程、执行测试与巡检任务,集中管理机器人全生命周期测试业务。 + DEVICE {{ stats.device.value }} / FLOW {{ stats.flow.value }} / INSPECTION {{ stats.inspection.value }} / INSTANCE {{ stats.instance.value }} @@ -29,7 +29,8 @@ - + + SYSTEM OVERVIEW @@ -55,10 +56,11 @@ 无权限 - + - - + + + LIVE OPERATIONS @@ -98,9 +100,9 @@ {{ activeTasksRestricted ? '暂无任务查看权限' : '当前没有运行中的任务' }} {{ activeTasksRestricted ? '请联系管理员分配巡检任务权限' : '新的巡检任务启动后会显示在这里' }} - + - + CAPABILITIES @@ -121,15 +123,14 @@ {{ feature.title }} - {{ feature.description }} - - + + - + RECENT EXECUTIONS @@ -159,7 +160,9 @@ {{ recentInstancesRestricted ? '暂无测试实例查看权限' : '暂无测试执行记录' }} - + + + @@ -445,23 +448,23 @@ onBeforeUnmount(() => { width: 100%; height: 100%; overflow-y: auto; - padding: 0 2px 24px; + padding: 0 32px 32px; color: var(--el-text-color-primary); } .hero-panel { position: relative; - min-height: 196px; - padding: 32px; + min-height: 320px; + padding: 48px; overflow: hidden; display: flex; align-items: center; justify-content: space-between; gap: 32px; - border: 1px solid var(--min-border-light); - border-radius: var(--min-radius-base); - background: var(--min-bg-white); - color: var(--min-text-primary); + border: 0; + border-radius: 0; + background: #18202a; + color: #ffffff; } .hero-panel::before { @@ -472,8 +475,16 @@ onBeforeUnmount(() => { background-image: url('../assets/images/index-background.jpg'); background-position: center 48%; background-size: cover; - filter: grayscale(1); - opacity: 0.07; + filter: grayscale(1) contrast(1.08); + opacity: 0.78; +} + +.hero-panel::after { + content: ''; + position: absolute; + inset: 0; + z-index: 0; + background: rgba(17, 24, 39, 0.62); } .hero-content, @@ -483,7 +494,7 @@ onBeforeUnmount(() => { } .hero-content { - max-width: 760px; + max-width: 720px; } .platform-state { @@ -491,7 +502,7 @@ onBeforeUnmount(() => { align-items: center; gap: 9px; margin-bottom: 13px; - color: var(--min-text-secondary); + color: rgba(255, 255, 255, 0.74); font-size: 13px; font-weight: 600; } @@ -505,7 +516,8 @@ onBeforeUnmount(() => { .hero-content h1 { margin: 0; - font-size: 24px; + max-width: 680px; + font-size: 36px; line-height: 1.28; font-weight: 600; letter-spacing: 0; @@ -514,8 +526,8 @@ onBeforeUnmount(() => { .hero-description { max-width: 670px; margin: 12px 0 22px; - color: var(--min-text-secondary); - font-size: 14px; + color: rgba(255, 255, 255, 0.76); + font-size: 15px; line-height: 1.65; } @@ -538,21 +550,21 @@ onBeforeUnmount(() => { } .cockpit-button { - border-color: var(--min-border-light) !important; - background: var(--min-bg-white) !important; - color: var(--min-text-regular) !important; + border-color: rgba(255, 255, 255, 0.62) !important; + background: transparent !important; + color: #ffffff !important; } .cockpit-button:hover { - border-color: var(--min-primary) !important; - background: var(--min-primary-soft) !important; - color: var(--min-primary) !important; + border-color: #ffffff !important; + background: rgba(255, 255, 255, 0.12) !important; + color: #ffffff !important; } .hero-time { min-width: 190px; padding-left: 26px; - border-left: 1px solid var(--min-border-light); + border-left: 1px solid rgba(255, 255, 255, 0.36); display: flex; flex-direction: column; align-items: flex-end; @@ -568,12 +580,25 @@ onBeforeUnmount(() => { .hero-time > span:last-child, .time-label { - color: var(--min-text-secondary); + color: rgba(255, 255, 255, 0.72); font-size: 13px; } +.operations-layout { + display: grid; + grid-template-columns: 292px minmax(0, 1fr); + gap: 24px; + padding-top: 24px; +} + +.operations-main { + min-width: 0; +} + .overview-section { - padding: 24px 0 20px; + padding: 0; + border-top: 2px solid var(--min-primary); + background: var(--min-bg-white); } .section-heading, @@ -585,7 +610,12 @@ onBeforeUnmount(() => { } .section-heading { - margin-bottom: 14px; + min-height: 72px; + margin: 0; + padding: 14px 16px; + border-right: 1px solid var(--min-border-light); + border-bottom: 1px solid var(--min-border-light); + border-left: 1px solid var(--min-border-light); } .section-kicker { @@ -612,19 +642,22 @@ onBeforeUnmount(() => { .metric-grid { display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 14px; + grid-template-columns: minmax(0, 1fr); + gap: 0; } .metric-card { position: relative; - min-height: 116px; - padding: 20px; + min-height: 104px; + padding: 16px; display: flex; align-items: center; gap: 16px; - border: 1px solid var(--el-border-color-lighter); - border-radius: var(--min-radius-base); + border: 0; + border-right: 1px solid var(--min-border-light); + border-bottom: 1px solid var(--min-border-light); + border-left: 1px solid var(--min-border-light); + border-radius: 0; background: var(--el-bg-color); transition: border-color 160ms ease, background-color 160ms ease; } @@ -655,7 +688,7 @@ onBeforeUnmount(() => { .metric-content { min-width: 0; display: grid; - grid-template-columns: 1fr auto; + grid-template-columns: minmax(0, 1fr) auto; align-items: baseline; column-gap: 10px; } @@ -691,16 +724,17 @@ onBeforeUnmount(() => { .workspace-grid { display: grid; - grid-template-columns: minmax(0, 1.25fr) minmax(360px, 0.75fr); - gap: 16px; - margin-bottom: 16px; + grid-template-columns: minmax(0, 1.35fr) minmax(320px, 0.65fr); + gap: 24px; + margin-bottom: 24px; } .dashboard-panel { min-width: 0; padding: 20px; - border: 1px solid var(--el-border-color-lighter); - border-radius: var(--min-radius-base); + border: 1px solid var(--min-border-light); + border-top: 2px solid var(--min-primary); + border-radius: 0; background: var(--el-bg-color); } @@ -841,7 +875,7 @@ onBeforeUnmount(() => { min-height: 76px; padding: 10px; border: 1px solid transparent; - border-radius: var(--min-radius-base); + border-radius: 0; display: grid; grid-template-columns: 38px minmax(0, 1fr) 14px; align-items: center; @@ -889,7 +923,7 @@ onBeforeUnmount(() => { } .recent-panel { - margin-bottom: 2px; + margin-bottom: 0; } .recent-list { @@ -969,8 +1003,17 @@ onBeforeUnmount(() => { } @media (max-width: 1200px) { + .operations-layout { + grid-template-columns: 1fr; + } + .metric-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .metric-card { + border-top: 1px solid var(--min-border-light); + border-left: 0; } .workspace-grid { @@ -980,12 +1023,12 @@ onBeforeUnmount(() => { @media (max-width: 768px) { .home-dashboard { - padding-bottom: 16px; + padding: 0 16px 16px; } .hero-panel { min-height: 0; - padding: 28px 22px; + padding: 36px 24px; align-items: flex-start; flex-direction: column; } @@ -1016,6 +1059,10 @@ onBeforeUnmount(() => { grid-template-columns: 1fr; } + .metric-card { + border-left: 1px solid var(--min-border-light); + } + .recent-item:nth-child(2) { border-top: 1px solid var(--el-border-color-extra-light); } diff --git a/src/views/inspection/cockpit/components/Header.vue b/src/views/inspection/cockpit/components/Header.vue index a69355a..4b1f864 100644 --- a/src/views/inspection/cockpit/components/Header.vue +++ b/src/views/inspection/cockpit/components/Header.vue @@ -1,20 +1,25 @@ - - - {{ currentTime }} - {{ weekText }} - - {{ binaryText }} + + CMVR / INS + 两江鱼复智能网联新能源汽车产业基地数字化平台 - 两江鱼复智能网联新能源汽车产业基地数字化平台 - - {{ binaryText }} - - 地图总览 - 智能监控 - 人工接管 - + 工作视图03 + + + 01地图总览MAP OVERVIEW + + + 02智能监控LIVE MONITOR + + + 03人工接管MANUAL CONTROL + + + + SYSTEM LIVE + {{ currentTime }} + {{ weekText }} @@ -26,8 +31,6 @@ const emits = defineEmits(['activePage']) const currentTime = ref('') const weekText = ref('') -const binaryText = ref('13513034532438213') - const weekNames = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六']; const updateClock = () => { const now = new Date(); @@ -41,122 +44,181 @@ const updateClock = () => { weekText.value = weekNames[now.getDay()] } -const genBinary = (len) => { - let str = ''; - for (let i = 0; i < len; i++) str += Math.round(Math.random()).toString(); - return str; -} - -const animateBinary = () => { - binaryText.value = genBinary(30) -} - const activePage = ref('home') const handleBtn = (page) => { activePage.value = page emits("activePage", page); } -let clockTimer, binaryTimer; +let clockTimer; onMounted(() => { updateClock(); clockTimer = setInterval(updateClock, 1000); - animateBinary() - binaryTimer = setInterval(animateBinary, 400); }) onUnmounted(() => { clearInterval(clockTimer) - clearInterval(binaryTimer) }) diff --git a/src/views/inspection/cockpit/components/ManualTakeover/VoiceConversation.vue b/src/views/inspection/cockpit/components/ManualTakeover/VoiceConversation.vue index 9dad101..bfd19ea 100644 --- a/src/views/inspection/cockpit/components/ManualTakeover/VoiceConversation.vue +++ b/src/views/inspection/cockpit/components/ManualTakeover/VoiceConversation.vue @@ -822,7 +822,7 @@ $panel-border: rgb(112 192 255 / 24%); h1 { margin: 0; - font-size: clamp(23px, 3vw, 30px); + font-size: 28px; line-height: 1.2; letter-spacing: 5px; text-shadow: 0 0 25px rgb(79 159 255 / 25%); diff --git a/src/views/inspection/cockpit/index.vue b/src/views/inspection/cockpit/index.vue index 7901b90..ea879ba 100644 --- a/src/views/inspection/cockpit/index.vue +++ b/src/views/inspection/cockpit/index.vue @@ -1,8 +1,8 @@ - + + @@ -34,21 +34,33 @@ const activePage = (page) => { position: relative; z-index: 1; background-color: var(--min-bg-page); - display: flex; - flex-direction: column; + display: grid; + grid-template-columns: 248px minmax(0, 1fr); .header { - height: 64px; + min-width: 0; + height: 100%; background: var(--min-bg-white); - border-bottom: 1px solid var(--min-border-light); + border-right: 1px solid var(--min-border-light); } .body-box { - flex: 1; min-height: 0; - padding: 16px; + min-width: 0; + padding: 20px; overflow: hidden; } + + @media (max-width: 900px) { + grid-template-columns: minmax(0, 1fr); + grid-template-rows: 176px minmax(0, 1fr); + + .header { + height: 176px; + border-right: 0; + border-bottom: 1px solid var(--min-border-light); + } + } } diff --git a/src/views/login.vue b/src/views/login.vue index 474cd1d..e9ce9dc 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,66 +1,89 @@ - - {{ title }} - - - - - - - - - - - - - - - - + + + CMVR / 2026 + {{ title }} + + + INTELLIGENT TEST OPERATIONS + 机器人智能测试运行中枢 + + 设备接入 + 流程编排 + 巡检执行 - - 记住密码 - - - 登 录 - 登 录 中... - - - 立即注册 + + + + + + SECURE ACCESS + 01 + + + + ACCOUNT + 登录工作台 - - - - + + + + + + + + + + + + + + + + + + + + 记住密码 + 立即注册 + + + + 进入系统 + 正在登录... + + + + + @@ -167,26 +190,140 @@ getCookie() diff --git a/src/views/register.vue b/src/views/register.vue index bd39f76..4ff1dc3 100644 --- a/src/views/register.vue +++ b/src/views/register.vue @@ -1,77 +1,79 @@ - - {{ title }} - - - - - - - - - - - - - - - - - - - - - - - - - - 注 册 - 注 册 中... - - - 使用已有账户登录 - - - - - + + ACCOUNT02 + + USER REGISTRATION创建账户{{ title }} + + + + + + + + + + + + + + + + + + + + + + + + + + 注册账户 + 注册中... + + 返回登录 + + + + + + CMVR / BID{{ title }} + CONTROL ENVIRONMENT统一测试运营与设备控制 + FLOWINSPECTIONCORPUS + @@ -156,40 +158,61 @@ getCode()
设备由机器人在线上报,切换机器人后自动刷新。
- 连接设备、编排流程、执行测试与巡检任务,集中管理机器人全生命周期测试业务。 + DEVICE {{ stats.device.value }} / FLOW {{ stats.flow.value }} / INSPECTION {{ stats.inspection.value }} / INSTANCE {{ stats.instance.value }}
{{ title }}