From 4f2e7984e3f63ac3b869f7301cda7e74914922a1 Mon Sep 17 00:00:00 2001
From: he wei <858544502@qq.com>
Date: 星期三, 21 五月 2025 17:55:12 +0800
Subject: [PATCH] U 修改

---
 src/styles/YouSheBiaoTiHei-2.ttf   |    0 
 src/assets/images/bg_bottom.png    |    0 
 src/assets/images/img-hr.png       |    0 
 src/styles/blue.css                |   33 +
 src/styles/blue.less               |   40 ++
 src/components/card.vue            |   58 +++
 src/assets/images/img-acdc.png     |    0 
 src/layout/index.vue               |   24 +
 src/views/datas/device.vue         |    4 
 src/assets/images/img-batt.png     |    0 
 /dev/null                          |    0 
 src/globalComponents.js            |    8 
 src/styles/index.css               |  268 +++++++++++++++
 src/assets/images/img-charge.png   |    0 
 src/router/modules/datas.js        |    6 
 src/views/dashboard/index.vue      |    2 
 src/router/modules/general.js      |   24 
 src/views/realtime/index.vue       |  187 +++++++++++
 src/styles/index.less              |    1 
 src/layout/components/AppMain.vue  |   22 +
 src/views/realtime/tabs/power.vue  |   96 +++++
 src/assets/images/bg_bottom0.png   |    0 
 src/views/realtime/tabs/system.vue |  210 ++++++++++++
 23 files changed, 955 insertions(+), 28 deletions(-)

diff --git a/src/assets/images/bg_bottom.png b/src/assets/images/bg_bottom.png
index 6777f1b..0a69eb1 100644
--- a/src/assets/images/bg_bottom.png
+++ b/src/assets/images/bg_bottom.png
Binary files differ
diff --git a/src/assets/images/bg_bottom0.png b/src/assets/images/bg_bottom0.png
new file mode 100644
index 0000000..6777f1b
--- /dev/null
+++ b/src/assets/images/bg_bottom0.png
Binary files differ
diff --git a/src/assets/images/img-acdc.png b/src/assets/images/img-acdc.png
new file mode 100644
index 0000000..e115730
--- /dev/null
+++ b/src/assets/images/img-acdc.png
Binary files differ
diff --git a/src/assets/images/img-batt.png b/src/assets/images/img-batt.png
new file mode 100644
index 0000000..6e6f584
--- /dev/null
+++ b/src/assets/images/img-batt.png
Binary files differ
diff --git a/src/assets/images/img-charge.png b/src/assets/images/img-charge.png
new file mode 100644
index 0000000..a6b7e8a
--- /dev/null
+++ b/src/assets/images/img-charge.png
Binary files differ
diff --git a/src/assets/images/img-hr.png b/src/assets/images/img-hr.png
new file mode 100644
index 0000000..45fe16a
--- /dev/null
+++ b/src/assets/images/img-hr.png
Binary files differ
diff --git a/src/assets/images/page-header.png b/src/assets/images/page-header.png
deleted file mode 100644
index 1f9b164..0000000
--- a/src/assets/images/page-header.png
+++ /dev/null
Binary files differ
diff --git a/src/components/card.vue b/src/components/card.vue
new file mode 100644
index 0000000..1761a87
--- /dev/null
+++ b/src/components/card.vue
@@ -0,0 +1,58 @@
+<script setup name="Card">
+import { ref } from "vue";
+const props = defineProps({
+  title: {
+    type: String,
+    default: ''
+  }
+});
+
+</script>
+
+<template>
+  <div class="card pos-r">
+    <div class="title ys-title" v-if="title">{{ title }}</div>
+    <div class="tools">
+      <slot name="tools"></slot>
+    </div>
+    <div class="content pos-r">
+      <div class="pos-full">
+        <slot></slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="less">
+  .card {
+    height: 100%;
+    padding: 6px;
+    display: flex;
+    flex-direction: column;
+
+    background: linear-gradient(#62cee3, #62cee3) left top e('/') 16px 1px no-repeat,
+          linear-gradient(#62cee3, #62cee3) left top e('/') 1px 16px no-repeat,
+          linear-gradient(#62cee3, #62cee3) right top e('/') 16px 1px no-repeat,
+          linear-gradient(#62cee3, #62cee3) right top e('/') 1px 16px no-repeat,
+          linear-gradient(#62cee3, #62cee3) left bottom e('/') 16px 1px no-repeat,
+          linear-gradient(#62cee3, #62cee3) left bottom e('/') 1px 16px no-repeat,
+          linear-gradient(#62cee3, #62cee3) right bottom e('/') 16px 1px no-repeat,
+          linear-gradient(#62cee3, #62cee3) right bottom e('/') 1px 16px no-repeat,
+
+          radial-gradient(farthest-side at center center, transparent, transparent 50%, rgba(25,59,99, 0.3) 100%, #193B63 180%, #193B63) left top e('/') contain no-repeat
+          ;
+    
+    .title {
+      padding-left: 1.4em;
+      background: url("@/assets/images/tb1.png") 6px center e('/') auto 82% no-repeat;
+    }
+    .tools {
+      position: absolute;
+      top: 6px;
+      right: 6px;
+    }
+    .content {
+      flex: 1;
+    }
+  }
+</style>
\ No newline at end of file
diff --git a/src/globalComponents.js b/src/globalComponents.js
index 41f28a1..f2ec1f2 100644
--- a/src/globalComponents.js
+++ b/src/globalComponents.js
@@ -1,7 +1,7 @@
-// import hdwTree from '@/components/HdwTree/index.vue';
-// import ycCard from '@/components/ycCard/index.vue';
+import card from '@/components/card.vue';
+import ycCard from '@/components/ycCard/index.vue';
 
 export function registerGlobalComponents(app) {
-  // app.component('hdwTree', hdwTree);
-  // app.component('ycCard', ycCard);
+  app.component('card', card);
+  app.component('ycCard', ycCard);
 }
\ No newline at end of file
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
index d355f61..6a64c48 100644
--- a/src/layout/components/AppMain.vue
+++ b/src/layout/components/AppMain.vue
@@ -16,15 +16,17 @@
 import { storeToRefs } from 'pinia';
 const tagsViewStore = useTagsViewStore();
 const { cachedViews } = storeToRefs(tagsViewStore);
+
 </script>
 
 <style lang="less" scoped>
 .app-main {
   /* 50= navbar  50  */
-  min-height: calc(100vh - 148px);
+  // min-height: calc(100vh - 148px);
   width: 100%;
   position: relative;
   overflow: hidden;
+  z-index: 0;
 }
 
 .fixed-header+.app-main {
@@ -34,7 +36,23 @@
 .hasTagsView {
   .app-main {
     /* 84 = navbar + tags-view = 50 + 34 */
-    height: 100vh;
+    // height: 100vh;
+
+    height: calc(100vh - 148px);
+    background: url("@/assets/images/bg-side.png") calc(100% + 8px) top e('/') auto 80% no-repeat;
+    // position: relative;
+    z-index: 0;
+    &::before {
+      content: '';
+      position: absolute;
+      z-index: -1;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      transform: scaleX(-1);
+      background: url("@/assets/images/bg-side.png") calc(100% + 8px) top e('/') auto 80% no-repeat;
+    }
   }
 
   // .fixed-header+.app-main {
diff --git a/src/layout/index.vue b/src/layout/index.vue
index 2df6a43..9f28ae7 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -1,18 +1,20 @@
 <template>
   <div :class="classObj" class="app-wrapper">
-    <div
+    <!-- <div
       v-if="device === 'mobile' && sidebar.opened"
       class="drawer-bg"
       @click="handleClickOutside"
-    />
+    /> -->
     <!--    <sidebar class="sidebar-container" />-->
     <div :class="{ hasTagsView: needTagsView }" class="main-container">
       <div :class="{ 'fixed-header': fixedHeader }">
         <navbar />
-        <tags-view v-if="needTagsView" />
         <!-- <TestTagsView /> -->
       </div>
-      <app-main />
+      <tags-view class="tags-view" v-if="needTagsView" />
+      <div class="main-wrap pos-r">
+        <app-main class="app-main pos-full" />
+      </div>
       <!-- <right-panel v-if="showSettings">
           <settings />
         </right-panel> -->
@@ -139,7 +141,7 @@
   position: fixed;
   top: 0;
   right: 0;
-  z-index: 9;
+  z-index: 0;
   width: calc(100%);
   transition: width 0.28s;
 }
@@ -151,4 +153,16 @@
 .mobile .fixed-header {
   width: 100%;
 }
+
+.main-container {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  .tags-view {
+    margin-top: 120px;
+  }
+  .main-wrap {
+    flex: 1;
+  }
+}
 </style>
diff --git a/src/router/modules/datas.js b/src/router/modules/datas.js
index 56a64ce..741ed2e 100644
--- a/src/router/modules/datas.js
+++ b/src/router/modules/datas.js
@@ -11,6 +11,12 @@
   },
   children: [
     {
+      path: 'realtime',
+      component: () => import('@/views/realtime/index.vue'),
+      name: 'realtime',
+      meta: { title: '瀹炴椂鐩戞祴', icon: 'component', noCache: false }
+    },
+    {
       path: 'device',
       component: () => import('@/views/datas/device.vue'),
       name: 'device',
diff --git a/src/router/modules/general.js b/src/router/modules/general.js
index 7301833..593eed2 100644
--- a/src/router/modules/general.js
+++ b/src/router/modules/general.js
@@ -16,24 +16,24 @@
     //   name: 'AuthManage',
     //   meta: { title: '鎺堟潈绠$悊', icon: 'auth-hdw', noCache: false }
     // },
-    {
-      path: 'log',
-      component: () => import('@/views/general/log/index.vue'),
-      name: 'LogManage',
-      meta: { title: '閿佸叿鏃ュ織', icon: 'log-hdw', noCache: false }
-    },
+    // {
+    //   path: 'log',
+    //   component: () => import('@/views/general/log/index.vue'),
+    //   name: 'LogManage',
+    //   meta: { title: '閿佸叿鏃ュ織', icon: 'log-hdw', noCache: false }
+    // },
     {
       path: 'alarm-rt',
       component: () => import('@/views/general/alarm/alarmRt.vue'),
       name: 'alarmRt',
       meta: { title: '瀹炴椂鍛婅', icon: 'log-hdw', noCache: false }
     },
-    {
-      path: 'alarm-his',
-      component: () => import('@/views/general/alarm/alarmHis.vue'),
-      name: 'alarmHis',
-      meta: { title: '鍘嗗彶鍛婅', icon: 'log-hdw', noCache: false }
-    },
+    // {
+    //   path: 'alarm-his',
+    //   component: () => import('@/views/general/alarm/alarmHis.vue'),
+    //   name: 'alarmHis',
+    //   meta: { title: '鍘嗗彶鍛婅', icon: 'log-hdw', noCache: false }
+    // },
     // {
     //   path: 'map',
     //   component: () => import('@/views/general/map/index.vue'),
diff --git a/src/styles/YouSheBiaoTiHei-2.ttf b/src/styles/YouSheBiaoTiHei-2.ttf
new file mode 100644
index 0000000..3729151
--- /dev/null
+++ b/src/styles/YouSheBiaoTiHei-2.ttf
Binary files differ
diff --git a/src/styles/blue.css b/src/styles/blue.css
index dcdab39..5448ec5 100644
--- a/src/styles/blue.css
+++ b/src/styles/blue.css
@@ -25,7 +25,6 @@
   border-top: 2px solid #2f517f;
   border-bottom: 2px solid #2f517f;
   height: auto;
-  margin-top: 2px;
 }
 html.blue-theme #app .tags-view-container .tags-view-wrapper .tags-view-item {
   color: #ffffff;
@@ -122,6 +121,14 @@
 }
 html.blue-theme .page-content .el-table {
   background: transparent;
+}
+html.blue-theme .ys-title {
+  font-family: 'YouSheBiaoTiHei';
+}
+html.blue-theme .panel-title {
+  font-family: 'YouSheBiaoTiHei';
+  padding-left: 1.4em;
+  background: url("@/assets/images/tb1.png") 6px center / auto 82% no-repeat;
 }
 .el-tree.el-tree.el-tree {
   color: #1fcbe1;
@@ -234,3 +241,27 @@
   text-align: right;
   padding-right: 10px;
 }
+.pos-r {
+  position: relative;
+}
+.pos-full.pos-full.pos-full {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.page-contain {
+  height: 100%;
+}
+.page-contain.bg-footer {
+  background: url("@/assets/images/bg_bottom.png") center calc(100% - 20px) / 100% auto no-repeat;
+}
+.page-contain .page-main {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+@font-face {
+  font-family: "YouSheBiaoTiHei";
+  src: url(YouSheBiaoTiHei-2.ttf) format("truetype");
+}
diff --git a/src/styles/blue.less b/src/styles/blue.less
index 153c183..7bbfa30 100644
--- a/src/styles/blue.less
+++ b/src/styles/blue.less
@@ -45,7 +45,7 @@
       border-bottom: 2px solid #2f517f;
       // border-bottom: 1px solid #164973;
       height: auto;
-      margin-top: 2px;
+      // margin-top: 2px;
       .tags-view-wrapper {
         .tags-view-item {
           &:first-of-type {
@@ -161,6 +161,16 @@
     .el-table {
       background: transparent;
     }
+  }
+
+  .ys-title {
+    font-family: 'YouSheBiaoTiHei';
+  }
+
+  .panel-title {
+    font-family: 'YouSheBiaoTiHei';
+    padding-left: 1.4em;
+    background: url("@/assets/images/tb1.png") 6px center e('/') auto 82% no-repeat;
   }
 }
 
@@ -293,3 +303,31 @@
     padding-right: 10px;
   }
 }
+
+.pos-r {
+  position: relative;
+}
+.pos-full.pos-full.pos-full {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+
+.page-contain {
+  height: 100%;
+  &.bg-footer {
+    background: url("@/assets/images/bg_bottom.png") center calc(100% - 20px) e('/') 100% auto no-repeat;
+  }
+  .page-main {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+  // background: gray;
+}
+
+@font-face {
+  font-family: "YouSheBiaoTiHei";
+  src: url(./YouSheBiaoTiHei-2.ttf) format("truetype");
+}
\ No newline at end of file
diff --git a/src/styles/index.css b/src/styles/index.css
index d3c1a15..ff73526 100644
--- a/src/styles/index.css
+++ b/src/styles/index.css
@@ -168,6 +168,273 @@
   background: #99a9bf;
   border-radius: 20px;
 }
+html.blue-theme #app {
+  --base-color: #4ba1fa;
+  --light-color: #00feff;
+  --bg-color: #072d44;
+  --el-text-color-placeholder: #4ba1fa;
+  --el-fill-color-lighter: #1F3C64;
+  --border-light-color: #143a92;
+  --filter-input-border-color: rgba(255, 227, 41, 0.2);
+  --el-dialog-bg-color: var(--bg-color);
+}
+html.blue-theme #app .el-drawer__body {
+  padding: 0;
+}
+html.blue-theme #app .app-wrapper {
+  background: #071426;
+}
+html.blue-theme #app .scroll-container .el-scrollbar__wrap {
+  height: auto;
+}
+html.blue-theme #app .app-breadcrumb.el-breadcrumb .no-redirect {
+  color: #4ba1fa;
+}
+html.blue-theme #app .tags-view-container {
+  box-sizing: border-box;
+  border-top: 2px solid #2f517f;
+  border-bottom: 2px solid #2f517f;
+  height: auto;
+}
+html.blue-theme #app .tags-view-container .tags-view-wrapper .tags-view-item {
+  color: #ffffff;
+  height: 32px;
+  line-height: 32px;
+  padding: 0 16px;
+  border: 0;
+  margin-left: 0;
+  margin-top: 0;
+  background: none;
+}
+html.blue-theme #app .tags-view-container .tags-view-wrapper .tags-view-item:first-of-type {
+  margin-left: 0;
+}
+html.blue-theme #app .tags-view-container .tags-view-wrapper .tags-view-item.router-link-exact-active {
+  background-color: #004986;
+  border-color: #004986;
+  color: #fff;
+}
+html.blue-theme #app .hdw-card {
+  box-sizing: border-box;
+  color: #ffffff;
+}
+html.blue-theme .el-tree {
+  --el-tree-node-content-height: 26px;
+  --el-tree-node-hover-bg-color: #214865;
+  --el-tree-text-color: var(--el-text-color-regular);
+  --el-tree-expand-icon-color: #1FCBE1;
+  background: none;
+  color: #ffffff;
+  cursor: default;
+  font-size: var(--el-font-size-base);
+  position: relative;
+}
+html.blue-theme .el-tree .is-current > .el-tree-node__content.el-tree-node__content {
+  background: #214865;
+}
+html.blue-theme .el-tree .is-current > .el-tree-node__content.el-tree-node__content .el-text {
+  color: #fff;
+}
+html.blue-theme .el-tree .is-current > .el-tree-node__content.el-tree-node__content:hover .el-text {
+  color: #fff;
+}
+html.blue-theme .el-table {
+  --el-table-border-color: none;
+  --el-table-border: 0;
+  --el-table-text-color: var(--el-text-color-regular);
+  --el-table-header-text-color: #fff;
+  --el-table-row-hover-bg-color: #1a5a8b;
+  --el-table-current-row-bg-color: var(--el-color-primary-light-9);
+  --el-table-header-bg-color: #1F3C64;
+  --el-table-fixed-box-shadow: var(--el-box-shadow-light);
+  --el-table-bg-color: var(--bg-color);
+  --el-table-tr-bg-color: #0D2B4D;
+  --el-table-expanded-cell-bg-color: var(--el-fill-color-blank);
+  --el-table-index: var(--el-index-normal);
+  background-color: var(--bg-color);
+  color: #ffffff;
+}
+html.blue-theme .tools-filter .el-input {
+  --el-input-text-color: #ffe329;
+  --el-input-border: var(--el-border);
+  --el-input-hover-border: var(--el-border-color-hover);
+  --el-input-focus-border: var(--el-color-primary);
+  --el-input-transparent-border: 0 0 0 1px transparent inset;
+  --el-input-border-color: var(--filter-input-border-color);
+  --el-input-border-radius: var(--el-border-radius-base);
+  --el-input-bg-color: var(--filter-input-border-color);
+  --el-input-icon-color: var(--el-text-color-placeholder);
+  --el-input-placeholder-color: #ffe32990;
+  --el-input-hover-border-color: var(--el-border-color-hover);
+  --el-input-clear-hover-color: var(--el-text-color-secondary);
+  --el-input-focus-border-color: var(--el-color-primary);
+}
+html.blue-theme .tools-filter .el-select {
+  --el-select-border-color-hover: var(--el-border-color-hover);
+  --el-select-disabled-color: var(--el-disabled-text-color);
+  --el-select-disabled-border: var(--el-disabled-border-color);
+  --el-select-font-size: var(--el-font-size-base);
+  --el-select-close-hover-color: var(--el-text-color-secondary);
+  --el-select-input-color: #ffe329;
+  --el-select-multiple-input-color: var(--el-text-color-regular);
+  --el-select-input-focus-border-color: var(--el-color-primary);
+}
+html.blue-theme .tools-filter .el-select .el-select__wrapper {
+  background-color: var(--filter-input-border-color);
+  box-shadow: 0 0 0 1px var(--filter-input-border-color) inset;
+}
+html.blue-theme .tools-filter .el-select .el-select__wrapper .el-select__placeholder {
+  color: #ffe329;
+}
+html.blue-theme .page-content {
+  padding-bottom: 20px;
+}
+html.blue-theme .page-content .el-table {
+  background: transparent;
+}
+html.blue-theme .ys-title {
+  font-family: 'YouSheBiaoTiHei';
+}
+html.blue-theme .panel-title {
+  font-family: 'YouSheBiaoTiHei';
+  padding-left: 1.4em;
+  background: url("@/assets/images/tb1.png") 6px center / auto 82% no-repeat;
+}
+.el-tree.el-tree.el-tree {
+  color: #1fcbe1;
+}
+.el-tabs--border-card > .el-tabs__header.el-tabs__header {
+  border-bottom: 1px solid #00fefe;
+  background-color: #00243e;
+}
+.el-tabs--border-card > .el-tabs__header.el-tabs__header .el-tabs__item {
+  color: #00fefe;
+}
+.el-tabs--border-card > .el-tabs__header.el-tabs__header .el-tabs__item.is-active {
+  background-color: #00fefe;
+  border-color: #00fefe;
+  color: #041f6c;
+}
+.el-pagination__sizes.el-pagination__sizes,
+.el-pagination__total.el-pagination__total {
+  color: #fff;
+  font-size: 16px;
+}
+.el-pagination .el-select__wrapper.el-select__wrapper {
+  background-color: #134BA8;
+  color: #fff;
+  box-shadow: 0 0 0 1px #436DA8 inset;
+}
+.el-pagination .el-select__wrapper.el-select__wrapper .el-select__placeholder,
+.el-pagination .el-select__wrapper.el-select__wrapper .el-select__input {
+  color: #fff;
+}
+.el-pagination.el-pagination.el-pagination button {
+  background: transparent;
+  color: #fff;
+}
+.el-pagination.el-pagination.el-pagination button.is-disabled,
+.el-pagination.el-pagination.el-pagination button:disabled {
+  background-color: transparent;
+  color: #fff;
+  cursor: not-allowed;
+}
+.el-pagination .el-pager.el-pager.el-pager li {
+  background: transparent;
+  color: #fff;
+}
+.el-pagination .el-pager.el-pager.el-pager li.is-active,
+.el-pagination .el-pager.el-pager.el-pager li:hover {
+  color: #529ac1;
+}
+.el-pagination__jump.el-pagination__jump {
+  color: #fff;
+}
+.el-pagination__jump.el-pagination__jump .el-input__wrapper {
+  background-color: #134BA8;
+  box-shadow: 0 0 0 1px #436DA8 inset;
+}
+.el-pagination__jump.el-pagination__jump .el-input__wrapper .el-input__inner {
+  color: #fff;
+}
+.el-tree-node:focus > .el-tree-node__content.el-tree-node__content {
+  background: transparent;
+}
+.el-tabs--border-card.el-tabs--border-card {
+  background: transparent;
+  border: 0 none;
+}
+.el-button.el-button:focus-visible {
+  outline: none;
+}
+.el-tooltip__popper.el-tooltip__popper {
+  z-index: 9999;
+  /* 璁剧疆杈冮珮鐨� z-index */
+}
+.el-transfer .el-checkbox__input.is-indeterminate .el-checkbox__inner,
+.el-transfer .el-checkbox__input.is-checked .el-checkbox__inner {
+  background-color: #46CAFE;
+  border-color: #46CAFE;
+}
+.el-transfer .el-checkbox__input.is-indeterminate .el-checkbox__inner::before,
+.el-transfer .el-checkbox__input.is-checked .el-checkbox__inner::before {
+  background-color: #333;
+}
+.el-transfer .el-checkbox__input.is-indeterminate .el-checkbox__inner::after,
+.el-transfer .el-checkbox__input.is-checked .el-checkbox__inner::after {
+  border-color: #333;
+}
+.page-filter {
+  display: table;
+  border-bottom: 1px solid #304A75;
+  margin-top: 8px;
+  padding: 6px;
+  margin-bottom: 6px;
+}
+.page-filter .el-select__wrapper.el-select__wrapper {
+  background-color: #103047;
+  color: #48A5D0;
+  box-shadow: 0 0 0 1px #103047 inset;
+}
+.page-filter .el-select__placeholder {
+  color: #48a5d0;
+}
+.page-filter .table-row {
+  display: table-row;
+}
+.page-filter .table-row .table-cell {
+  display: table-cell;
+  white-space: nowrap;
+  color: #48A5D0;
+}
+.page-filter .table-cell.text-right {
+  text-align: right;
+  padding-right: 10px;
+}
+.pos-r {
+  position: relative;
+}
+.pos-full.pos-full.pos-full {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+}
+.page-contain {
+  height: 100%;
+}
+.page-contain.bg-footer {
+  background: url("@/assets/images/bg_bottom.png") center calc(100% - 20px) / 100% auto no-repeat;
+}
+.page-contain .page-main {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+@font-face {
+  font-family: "YouSheBiaoTiHei";
+  src: url(YouSheBiaoTiHei-2.ttf) format("truetype");
+}
 body {
   height: 100%;
   font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "寰蒋闆呴粦", Arial, sans-serif;
@@ -176,6 +443,7 @@
   text-rendering: optimizeLegibility;
   margin: 0;
   color: #ffffff;
+  overflow: hidden;
 }
 label {
   font-weight: 700;
diff --git a/src/styles/index.less b/src/styles/index.less
index 3d3225c..96e8c21 100644
--- a/src/styles/index.less
+++ b/src/styles/index.less
@@ -18,6 +18,7 @@
   text-rendering: optimizeLegibility;
   margin: 0;
   color: #ffffff;
+  overflow: hidden;
 }
 
 label {
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
index 145bc32..a9541e4 100644
--- a/src/views/dashboard/index.vue
+++ b/src/views/dashboard/index.vue
@@ -3,7 +3,7 @@
 </script>
 
 <template>
-  <div class="dashboard-wrapper">
+  <div class="page-contain bg-footer">
     棣栭〉
   </div>
 </template>
diff --git a/src/views/datas/device.vue b/src/views/datas/device.vue
index 1df7cbc..306e0bf 100644
--- a/src/views/datas/device.vue
+++ b/src/views/datas/device.vue
@@ -507,8 +507,8 @@
     // border-top: 1px solid var(--border-light-color);
     box-sizing: border-box;
     flex: 1;
-    margin-left: 18px;
-    margin-right: 18px;
+    margin-left: 26px;
+    margin-right: 26px;
   }
 
   .page-content-page {
diff --git a/src/views/realtime/index.vue b/src/views/realtime/index.vue
new file mode 100644
index 0000000..0b04e2f
--- /dev/null
+++ b/src/views/realtime/index.vue
@@ -0,0 +1,187 @@
+<script setup>
+import { ref, reactive } from "vue";
+import tabPower from "./tabs/power.vue";
+import tabSystem from "./tabs/system.vue";
+
+const statusList = reactive([
+	{ label: '绯荤粺鐘舵��', value: '鍏呯數' },
+	{ label: '璁惧鐘舵��', value: '姝e父' },
+	{ label: '鐢垫簮鐘舵��', value: '姝e父' },
+	{ label: '鐢垫睜鐘舵��', value: '姝e父' },
+	{ label: '姣嶇嚎鐢靛帇', value: 60 },
+	{ label: '鍦ㄧ嚎鐢靛帇', value: 60 },
+	{ label: '缁勭鐢靛帇', value: 60 },
+	{ label: '鐢垫睜鐢垫祦', value: 60 },
+	{ label: '娴嬭瘯鏃堕暱', value: 60 },
+	{ label: '娴嬭瘯瀹归噺', value: 60 },
+	{ label: '棰勪及鍓╀綑瀹归噺', value: 60 },
+	{ label: '棰勪及鍓╀綑缁埅', value: 60 },
+	{ label: '鍛婅', value: '鏃�' },
+	{ label: '鏇存柊鏃ユ湡', value: '2022-01-01' },
+]);
+
+const tabs = ref([
+	{ label: '绯荤粺姒傝', name: 'system' },
+	{ label: '鐢垫簮', name: 'power' },
+	{ label: '鐢靛帇', name: 'vol' },
+	{ label: '鍐呴樆', name: 'res' },
+	{ label: '娓╁害', name: 'temp' },
+	{ label: '3D', name: '3d' },
+	{ label: '鑷剤鑳藉姏', name: 'self' },
+	{ label: '绠$悊淇℃伅', name: 'manage' },
+	{ label: '鐢垫簮鍛婅鍙傛暟璁剧疆', name: 'powerAlarmSet' },
+	{ label: '鐢垫睜鍛婅鍙傛暟璁剧疆', name: 'battAlarmSet' },
+	{ label: '鍥剧墖', name: 'img' },
+	{ label: '鍘嗗彶娴嬭瘯鏁版嵁', name: 'history' },
+	{ label: '鍘嗗彶瀹炴椂鏁版嵁', name: 'hisRt' },
+]);
+
+const acTab = ref(tabs.value[0].name);
+
+const fullName = ref('婀栧寳鐪�-姝︽眽甯�-姝︽槍鍖�-姝︽槍鏈烘埧-鐢垫睜缁�1');
+
+
+function tabClick(item) {
+	acTab.value = item.name;
+}
+</script>
+
+<template>
+  <div class="page-contain">
+    <div class="page-header">
+      <div class="p-title">{{ fullName }}</div>
+      <div class="status-bar">
+        <div
+          :class="['status-item',]"
+          v-for="(item, index) in statusList"
+          :key="'status_' + index"
+        >
+          <div class="item-value">{{ item.value }}</div>
+          <div class="item-name">{{ item.label }}</div>
+        </div>
+      </div>
+      <div class="p-tabs">
+        <div
+          :class="['tab-item', {'active': item.name == acTab}]"
+          v-for="(item, index) in tabs"
+          :key="'tab_' + index"
+          @click="tabClick(item)"
+        >
+          {{ item.label }}
+        </div>
+      </div>
+    </div>
+    <div class="page-main">
+      <div class="tab-contain" v-if="acTab == 'system'">
+        <tab-system></tab-system>
+      </div>
+      <div class="tab-contain" v-if="acTab == 'power'">
+        <tab-power></tab-power>
+      </div>
+      <div class="tab-contain" v-if="acTab == 'vol'">2</div>
+      <div class="tab-contain" v-if="acTab == 'res'">3</div>
+      <div class="tab-contain" v-if="acTab == 'temp'">4</div>
+      <div class="tab-contain" v-if="acTab == '3d'">5</div>
+      <div class="tab-contain" v-if="acTab == 'self'">6</div>
+      <div class="tab-contain" v-if="acTab == 'manage'">7</div>
+      <div class="tab-contain" v-if="acTab == 'powerAlarmSet'">8</div>
+      <div class="tab-contain" v-if="acTab == 'battAlarmSet'">9</div>
+      <div class="tab-contain" v-if="acTab == 'img'">10</div>
+      <div class="tab-contain" v-if="acTab == 'history'">11</div>
+      <div class="tab-contain" v-if="acTab == 'hisRt'">12</div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="less">
+.page-contain {
+  display: flex;
+  flex-direction: column;
+
+  .page-header {
+    // border: 1px solid #0ff;
+    background: #071426;
+
+    .p-title {
+      font-size: 18px;
+      font-weight: 700;
+      color: #50c7f1;
+      height: 42px;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      border-bottom: 1px solid #497AAB;
+    }
+
+    .status-bar {
+      height: 72px;
+      display: flex;
+      flex-direction: row;
+
+      .status-item {
+        flex: 1;
+        font-size: 14px;
+        font-weight: 700;
+        color: #50c7f1;
+        // border: 1px solid #0F6B79;
+        border-radius: 6px;
+        margin: 4px 6px;
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        box-shadow: inset 0 0 30px -10px #0F6B79;
+        background: radial-gradient(circle at -10% center, #1F6571 5%, transparent 20%) no-repeat,
+            radial-gradient(circle at 110% center, #1F6571 5%, transparent 20%) no-repeat,
+            radial-gradient(circle at center -72%, #1F6571 12%, transparent 50%) no-repeat,
+            radial-gradient(circle at center 138%, #1F6571 12%, transparent 50%) no-repeat;
+
+        .item-value {
+          margin-bottom: 6px;
+          color: #ff0;
+          font-size: 20px;
+        }
+
+        .item-name {
+          color: #6DCCE6;
+        }
+      }
+    }
+
+    .p-tabs {
+      display: flex;
+      flex-direction: row;
+      height: 46px;
+      border: 1px solid #426EA0;
+      padding: 4px;
+
+      .tab-item {
+        font-size: 14px;
+        font-weight: 700;
+        flex: 1;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        margin-left: 2px;
+        margin-right: 2px;
+        background: #073451;
+        cursor: pointer;
+
+        &.active {
+          background: #47CAFE;
+          color: #03216e;
+        }
+      }
+    }
+  }
+
+  .page-main {
+    flex: 1;
+
+    .tab-contain {
+      height: 100%;
+    }
+
+  }
+}
+</style>
diff --git a/src/views/realtime/tabs/power.vue b/src/views/realtime/tabs/power.vue
new file mode 100644
index 0000000..7630054
--- /dev/null
+++ b/src/views/realtime/tabs/power.vue
@@ -0,0 +1,96 @@
+<script setup name="Power">
+import { ref } from "vue";
+const lineIdx = ref(0);
+
+</script>
+
+<template>
+  <div class="tab-content">
+    <div class="p-left">
+      <div class="p-item">
+        <card title="浜ゆ祦杈撳叆鐢靛帇">
+          <template #tools>
+            <el-radio-group class="line-idx" v-model="lineIdx" size="small">
+              <el-radio-button label="涓�璺�" :value="0" />
+              <el-radio-button label="浜岃矾" :value="1" />
+            </el-radio-group>
+          </template>
+        </card>
+      </div>
+      <div class="p-item">
+        <card title="浜ゆ祦姣嶇嚎鐢靛帇"></card>
+      </div>
+    </div>
+    <div class="p-right">
+      <div class="p-item">
+        <card title="鏁存祦鍣ㄥ紑鍏崇姸鎬�"></card>
+      </div>
+      <div class="p-item large">
+        <card title="鏁存祦鍣ㄨ緭鍑虹數娴�"></card>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="less">
+.tab-content {
+  display: flex;
+  flex-direction: row;
+  height: 100%;
+
+  .p-left {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+
+    .p-item {
+      flex: 1;
+      margin: 8px;
+    }
+  }
+
+  .p-right {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+
+    .p-item {
+      flex: 1;
+      margin: 8px;
+
+      &.large {
+        flex: 2;
+      }
+    }
+  }
+
+  .line-idx {
+
+    :deep(.el-radio-button:first-child .el-radio-button__inner) {
+      border-left: 1px solid #4D81BA;
+      border-radius: 0;
+      box-shadow: none !important;
+    }
+    // .el-radio-button--small .el-radio-button__inner {
+    //     border-radius: 0;
+    //     font-size: 12px;
+    //     padding: 5px 11px;
+    // }
+    :deep(.el-radio-button__inner) {
+        background: #183A55;
+        border: 1px solid #4D81BA;
+        border-left: 0;
+        border-radius: 0;
+        color: #fff;
+        font-weight: 500;
+        padding: 4px 10px;
+    }
+    :deep(.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner) {
+        background: linear-gradient(69deg, #6EABE4, #6EABE4 25%,  #0A3E77 75%, #0A3E77);
+        // border: 0 none;
+        box-shadow: none;
+        color: #fff;
+    }
+  }
+}
+</style>
diff --git a/src/views/realtime/tabs/system.vue b/src/views/realtime/tabs/system.vue
new file mode 100644
index 0000000..574443b
--- /dev/null
+++ b/src/views/realtime/tabs/system.vue
@@ -0,0 +1,210 @@
+<script setup>
+import { ref } from "vue";
+
+
+</script>
+
+<template>
+  <div class="tab-content">
+    <div class="row pos-r">
+      <div class="pos-full row-content">
+        <div class="p-left">
+          <div class="p-item">
+            <div class="panel-title">褰撳墠鏍稿淇℃伅</div>
+            <div class="panel">
+              <div class="panel-row">
+                <div class="label">澶辫触鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+            </div>
+          </div>
+          <div class="p-item">
+            <div class="panel-title">褰撳墠鏍稿淇℃伅</div>
+            <div class="panel">
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+              <div class="panel-row">
+                <div class="label">鍋滄鍘熷洜</div>
+                <div class="value">鏃�</div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="p-main"></div>
+        <div class="p-right">
+          <div class="control-contain">
+            <div class="control-title">鎺у埗绠$悊</div>
+            <div class="control-btn">鏍稿娴嬭瘯</div>
+            <div class="control-btn">鍋滄鏍稿娴嬭瘯</div>
+          </div>
+          <div class="control-contain">
+            <div class="control-title">璁惧绠$悊</div>
+            <div class="control-btn">杩滅▼閲嶅惎</div>
+            <div class="control-btn">绯荤粺鍙傛暟璁剧疆</div>
+            <div class="control-btn">鍛婅鍙傛暟璁剧疆</div>
+          </div>
+          <div class="control-contain no-wrap">
+            <div class="control-btn">鏀剧數鐢宠</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="row row2">
+      <div class="card-item">
+        <card title="浜ゆ祦杈撳叆"></card>
+      </div>
+      <div class="card-item">
+        <card title="鐩存祦杈撳叆"></card>
+      </div>
+      <div class="card-item">
+        <card title="鏍稿璁惧淇℃伅"></card>
+      </div>
+      <div class="card-item">
+        <card title="钃勭數姹犱俊鎭�"></card>
+      </div>
+    </div>
+  </div>
+</template>
+
+<style scoped lang="less">
+.tab-content {
+  height: 100%;
+  padding-left: 8px;
+  padding-right: 8px;
+  display: flex;
+  flex-direction: column;
+  .row {
+    flex: 1.52;
+    .row-content {
+      display: flex;
+      flex-direction: row;
+      height: 100%;
+    }
+    .p-left {
+      width: 240px;
+      display: flex;
+      flex-direction: column;
+      .p-item {
+        margin: 8px;
+        display: flex;
+        flex-direction: column;
+        .panel {
+          border: 1px solid #5FA9CF;
+          background: #073451;
+          border-radius: 6px;
+          padding: 10px 6px;
+          margin-top: 6px;
+          margin-bottom: 30px;
+          font-size: 12px;
+          display: flex;
+          flex-direction: column;
+          .panel-row {
+            display: flex;
+            flex-direction: row;
+            margin-bottom: 4px;
+            .label {
+              flex: 0 0 6em;
+              margin-right: 0.6em;
+              text-align: right;
+              &::after {
+                content: ":";
+              }
+            }
+            .value {
+              flex: 1;
+            }
+          }
+        }
+      }
+    }
+    .p-main {
+      flex: 1;
+    }
+    .p-right {
+      width: 160px;
+      margin-left: 20px;
+      margin-right: 6px;
+      padding-top: 20px;
+      display: flex;
+      flex-direction: column;
+      .control-contain {
+        display: flex;
+        flex-direction: column;
+        background: #08354F;
+        border-radius: 6px 6px 0 0;
+        margin-top: 6px;
+        margin-bottom: 8px;
+        padding-bottom: 4px;
+        overflow: hidden;
+        font-size: 12px;
+        .control-title {
+          background: #0B415D;
+          font-size: 20px;
+          padding: 6px 0;
+          text-align: center;
+          font-weight: 700;
+          margin-bottom: 4px;
+        }
+        .control-btn {
+          margin: 2px 4px;
+          cursor: pointer;
+          border: 1px solid #3D9CC9;
+          box-shadow: inset 0 0 10px 4px #3D9CC9;
+          padding: 6px 0;
+          text-align: center;
+          border-radius: 4px;
+          &:hover {
+            color: #FDFE01;
+            border: 1px solid #DF7B26;
+            box-shadow: inset 0 0 10px 4px #DF7B26;
+          }
+        }
+        &.no-wrap {
+          background: transparent;
+          .control-btn {
+            flex: 1;
+            border: 1px solid #0BF9FE;
+            color: #0bf9fe;
+            font-weight: bold;
+            font-size: 14px;
+            box-shadow: inset 0 0 10px 4px #0BF9FE;
+            &:hover {
+              color: #FDFE01;
+              border: 1px solid #DF7B26;
+              box-shadow: inset 0 0 10px 4px #DF7B26;
+            }
+          }
+        }
+      }
+    }
+    &.row2 {
+      flex: 1;
+      margin-top: 4px;
+      display: flex;
+      flex-direction: row;
+      .card-item {
+        flex: 1;
+        margin: 4px;
+      }
+    }
+  }
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.1