feat: 看板排版调整,多语言翻译

This commit is contained in:
TsMask
2024-01-31 18:48:19 +08:00
parent edb8bda2d3
commit d2ebb261e3
7 changed files with 179 additions and 574 deletions

View File

@@ -110,35 +110,53 @@
/* 概览区域 */
.skim {
min-height: 6.167rem;
height: 14%;
min-height: 7.78rem;
height: 14.4%;
}
.skim .inner {
.skim .inner .data {
display: flex;
flex-wrap: wrap;
flex-direction: row;
align-items: center;
height: 90%;
}
.skim .inner .item {
width: 50%;
.skim .inner .data .item {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: baseline;
width: 33%;
}
.skim .inner .item h4 {
font-size: 1.167rem;
padding-left: 0.2rem;
.skim .inner .data .item div {
font-size: 1.467rem;
color: #fff;
margin-bottom: 0.333rem;
margin-bottom: 0;
display: flex;
align-items: baseline;
line-height: 2rem;
}
.skim .inner .item span {
font-size: 0.667rem;
.skim .inner .data .item span {
color: #4c9bfd;
font-size: 0.833rem;
width: 100%;
position: relative;
line-height: 2rem;
}
.skim .inner .data .item span::before {
content: ' ';
position: absolute;
top: 2px;
left: 0;
right: 0;
bottom: 0;
z-index: 0;
background-image: linear-gradient(to right, #fff, #fff0);
height: 1px;
border-radius: 4px;
}
/* 用户行为 */
.userActivity {
min-height: 22rem;
height: 82%;
min-height: 35.8rem;
height: 66.3%;
}
.userActivity .inner .chart {
width: 100%;
@@ -146,15 +164,19 @@
margin-top: 1rem;
}
/* 流量 */
/* 流量统计 */
.upfFlowTotal {
min-height: 6.167rem;
height: 14%;
min-height: 7.5rem;
height: 14.6%;
}
.upfFlowTotal .inner .filter {
.upfFlowTotal .inner h3 {
display: flex;
justify-content: space-between;
}
.upfFlowTotal .inner h3 .filter {
display: flex;
}
.upfFlowTotal .inner .filter span {
.upfFlowTotal .inner h3 .filter span {
display: block;
height: 0.75rem;
line-height: 1;
@@ -164,37 +186,46 @@
border-right: 0.083rem solid #00f2f1;
cursor: pointer;
}
.upfFlowTotal .inner .filter span:first-child {
.upfFlowTotal .inner h3 .filter span:first-child {
padding-left: 0;
}
.upfFlowTotal .inner .filter span:last-child {
.upfFlowTotal .inner h3 .filter span:last-child {
border-right: none;
}
.upfFlowTotal .inner .filter span.active {
.upfFlowTotal .inner h3 .filter span.active {
color: #fff;
font-size: 0.833rem;
}
.upfFlowTotal .data {
.upfFlowTotal .inner .chart {
width: 100%;
height: 100%;
margin-top: 1rem;
}
.upfFlowTotal .inner .chart .data {
display: flex;
margin-top: 1.833rem;
flex-direction: column;
justify-content: space-around;
height: 72%;
}
.upfFlowTotal .item {
width: 50%;
.upfFlowTotal .inner .chart .data .item {
display: flex;
justify-content: space-between;
align-items: baseline;
}
.upfFlowTotal h4 {
font-size: 1.167rem;
.upfFlowTotal .inner .chart .data .item h4 {
font-size: 1.467rem;
color: #fff;
margin-bottom: 0.417rem;
margin-bottom: 0;
}
.upfFlowTotal span {
.upfFlowTotal .inner .chart .data .item span {
color: #4c9bfd;
font-size: 0.667rem;
font-size: 0.867rem;
}
/* 资源情况 */
.resources {
min-height: 14rem;
height: 26%;
min-height: 13.6rem;
height: 25.5%;
}
.resources .inner .chart {
width: 100%;
@@ -212,480 +243,3 @@
height: 100%;
margin-top: 1rem;
}
/* 监控 */
.monitor {
height: 20rem;
}
.monitor .inner {
padding: 1rem 0;
display: flex;
flex-direction: column;
}
.monitor .tabs {
padding: 0 1.5rem;
margin-bottom: 0.75rem;
}
.monitor .tabs a {
color: #1950c4;
font-size: 0.75rem;
padding: 0 1.125rem;
}
.monitor .tabs a:first-child {
border-right: 0.083rem solid #00f2f1;
padding-left: 0;
}
.monitor .tabs a.active {
color: #fff;
}
.monitor .content {
flex: 1;
display: none;
position: relative;
}
.monitor .head {
background: rgba(255, 255, 255, 0.1);
font-size: 0.583rem;
padding: 0.5rem 1.5rem;
color: #68d8fe;
display: flex;
justify-content: space-between;
line-height: 1.05;
}
.monitor .col:nth-child(1) {
width: 3.2rem;
}
.monitor .col:nth-child(2) {
width: 8.4rem;
/* 不换行 一行省略*/
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.monitor .col:nth-child(3) {
width: 3.2rem;
}
.monitor .marquee-view {
position: absolute;
top: 1.6rem;
bottom: 0;
width: 100%;
overflow: hidden;
}
.monitor .row {
line-height: 1.05;
padding: 0.5rem 1.5rem;
color: #61a8ff;
font-size: 0.5rem;
position: relative;
display: flex;
justify-content: space-between;
}
.monitor .row:hover {
color: #68d8ff;
background: rgba(255, 255, 255, 0.1);
}
.monitor .row:hover .icon-dot {
opacity: 1;
}
.monitor .icon-dot {
position: absolute;
left: 0.64rem;
opacity: 0;
}
.monitor .marquee-view {
position: absolute;
top: 1.6rem;
bottom: 0;
width: 100%;
overflow: hidden;
}
.monitor .row {
line-height: 1.05;
padding: 0.5rem 1.5rem;
color: #61a8ff;
font-size: 0.5rem;
position: relative;
display: flex;
justify-content: space-between;
}
.monitor .row:hover {
color: #68d8ff;
background: rgba(255, 255, 255, 0.1);
}
.monitor .row:hover .icon-dot {
opacity: 1;
}
.monitor .icon-dot {
position: absolute;
left: 0.64rem;
opacity: 0;
}
/* ------------------------------------------------------------动画 */
@keyframes row {
0% {
}
100% {
transform: translateY(-50%);
}
}
/* 调用动画 */
.monitor .marquee {
/* //infinite永久调用动画 */
animation: row 10s linear infinite;
}
/*鼠标划入 停止动画 */
.monitor .marquee:hover {
animation-play-state: paused;
}
/* 点位 */
.point {
height: 14.167rem;
}
.point .chart {
display: flex;
margin-top: 1rem;
justify-content: space-between;
}
.point .pie {
width: 13rem;
height: 10rem;
margin-left: -0.4rem;
}
.point .data {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 7rem;
padding: 1.5rem 1.25rem;
box-sizing: border-box;
background-image: url(../images/rect.png);
background-size: cover;
}
.point h4 {
margin-bottom: 0.5rem;
font-size: 1.167rem;
color: #fff;
}
.point span {
display: block;
color: #4c9bfd;
font-size: 0.667rem;
}
/* 地图 */
.map {
height: 24.1rem;
margin-bottom: 0.833rem;
display: flex;
flex-direction: column;
}
.map h3 {
line-height: 1;
padding: 0.667rem 0;
margin: 0;
font-size: 0.833rem;
color: #fff;
}
.map .icon-cube {
color: #68d8fe;
}
.map .chart {
flex: 1;
background-color: rgba(255, 255, 255, 0.05);
}
.map .geo {
width: 100%;
height: 100%;
}
/* 用户模块 */
.users {
height: 14.167rem;
display: flex;
}
.users .chart {
display: flex;
margin-top: 1rem;
}
.users .bar {
width: 24.5rem;
height: 10rem;
}
.users .data {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 7rem;
padding: 1.5rem 1.25rem;
box-sizing: border-box;
background-image: url(../images/rect.png);
background-size: cover;
}
.users h4 {
margin-bottom: 0.5rem;
font-size: 1.167rem;
color: #fff;
}
.users span {
display: block;
color: #4c9bfd;
font-size: 0.667rem;
}
/* 销售区域 */
.sales {
height: 10.333rem;
}
.sales .caption {
display: flex;
line-height: 1;
}
.sales h3 {
height: 0.75rem;
padding-right: 0.75rem;
border-right: 0.083rem solid #00f2f1;
}
.sales a {
padding: 0.167rem;
font-size: 0.667rem;
margin: -0.125rem 0 0 0.875rem;
border-radius: 0.125rem;
color: #0bace6;
}
.sales a.active {
background-color: #4c9bfd;
color: #fff;
}
.sales .inner {
display: flex;
flex-direction: column;
}
.sales .chart {
flex: 1;
padding-top: 0.6rem;
position: relative;
}
.sales .label {
position: absolute;
left: 1.75rem;
top: 0.75rem;
color: #4996f5;
font-size: 0.583rem;
}
.sales .line {
width: 100%;
height: 100%;
}
/* 渠道区块 */
.wrap {
display: flex;
}
.channel,
.quarter {
flex: 1;
height: 9.667rem;
}
.channel {
margin-right: 0.833rem;
}
.channel .data {
overflow: hidden;
}
.channel .item {
margin-top: 0.85rem;
}
.channel .item:first-child {
float: left;
}
.channel .item:last-child {
float: right;
}
.channel h4 {
color: #fff;
font-size: 1.333rem;
margin-bottom: 0.2rem;
}
.channel small {
font-size: 50%;
}
.channel span {
display: block;
color: #4c9bfd;
font-size: 0.583rem;
}
/* 季度区块 */
.quarter .inner {
display: flex;
flex-direction: column;
margin: 0 -0.25rem;
}
.quarter .chart {
flex: 1;
padding-top: 0.75rem;
}
.quarter .box {
position: relative;
}
.quarter .label {
transform: translate(-50%, -30%);
color: #fff;
font-size: 1.25rem;
position: absolute;
left: 50%;
top: 50%;
}
.quarter .label small {
font-size: 50%;
}
.quarter .gauge {
height: 3.5rem;
}
.quarter .data {
display: flex;
justify-content: space-between;
}
.quarter .item {
width: 50%;
}
.quarter h4 {
color: #fff;
font-size: 1rem;
margin-bottom: 0.4rem;
}
.quarter span {
display: block;
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
color: #4c9bfd;
font-size: 0.583rem;
}
/* 排行榜 */
.top {
height: 11.8rem;
}
.top .inner {
display: flex;
}
.top .all {
display: flex;
flex-direction: column;
width: 7rem;
color: #4c9bfd;
font-size: 0.6rem;
vertical-align: middle;
}
.top .all ul {
padding-left: 0.5rem;
margin-top: 0.5rem;
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.top .all li {
overflow: hidden;
}
.top .all [class^='icon-'] {
font-size: 1.5rem;
vertical-align: middle;
margin-right: 0.5rem;
}
.top .province {
flex: 1;
display: flex;
flex-direction: column;
color: #fff;
}
.top .province i {
padding: 0 0.5rem;
margin-top: 0.208rem;
float: right;
font-style: normal;
font-size: 0.583rem;
color: #0bace6;
}
.top .province s {
display: inline-block;
transform: scale(0.8);
text-decoration: none;
}
.top .province .icon-up {
color: #dc3c33;
}
.top .province .icon-down {
color: #36be90;
}
.top .province .data {
flex: 1;
display: flex;
margin-top: 0.6rem;
}
.top .province ul {
flex: 1;
line-height: 1;
margin-bottom: 0.25rem;
}
.top .province ul li {
display: flex;
justify-content: space-between;
}
.top .province ul span {
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.top .province ul.sup {
font-size: 0.583rem;
}
.top .province ul.sup li {
color: #4995f4;
padding: 0.5rem;
}
.top .province ul.sup li.active {
color: #a3c6f2;
background-color: rgba(10, 67, 188, 0.2);
}
.top .province ul.sub {
display: flex;
flex-direction: column;
justify-content: space-around;
font-size: 0.5rem;
background-color: rgba(10, 67, 188, 0.2);
}
.top .province ul.sub li {
color: #52ffff;
padding: 0.417rem 0.6rem;
}
.clock {
position: absolute;
top: -1.5rem;
right: 1.667rem;
font-size: 0.833rem;
color: #0bace6;
}
.clock i {
margin-right: 5px;
font-size: 0.833rem;
}
@media screen and (max-width: 1600px) {
.top span {
transform: scale(0.9);
}
.top .province ul.sup li {
padding: 0.4rem 0.5rem;
}
.top .province ul.sub li {
padding: 0.23rem 0.5rem;
}
.quarter span {
transform: scale(0.9);
}
}

View File

@@ -1,5 +1,8 @@
<script setup lang="ts">
import { onBeforeUnmount, onMounted, reactive, ref } from 'vue';
import svgBase from '@/assets/svg/base.svg';
import svgUserIMS from '@/assets/svg/userIMS.svg';
import svgUserSMF from '@/assets/svg/userSMF.svg';
import useI18n from '@/hooks/useI18n';
import Topology from './components/Topology/index.vue';
import NeResources from './components/NeResources/index.vue';
@@ -112,7 +115,6 @@ onMounted(() => {
pageSize: 1,
}),
listBase5G({
//
neType: 'AMF',
neId: '001',
id: '',
@@ -183,33 +185,62 @@ onBeforeUnmount(() => {
<!--概览-->
<div class="skim panel">
<div class="inner">
<div class="item">
<h4>{{ skimState.udmSubNum }}</h4>
<span>
<UserOutlined style="color: #006cff" />
{{ t('views.dashboard.overview.skim.users') }}
</span>
<h3>
<IdcardOutlined style="color: #68d8fe" />&nbsp;&nbsp;
{{ t('views.dashboard.overview.skim.userTitle') }}
</h3>
<div class="data">
<div class="item">
<div>
<UserOutlined
style="color: #4096ff; margin-right: 8px; font-size: 1.1rem"
/>
{{ skimState.udmSubNum }}
</div>
<span>
{{ t('views.dashboard.overview.skim.users') }}
</span>
</div>
<div class="item" style="margin: 0 12px">
<div>
<img :src="svgUserIMS" style="width: 18px; margin-right: 8px" />
{{ skimState.imsUeNum }}
</div>
<span>
IMS {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
<div class="item">
<div>
<img :src="svgUserSMF" style="width: 18px; margin-right: 8px" />
{{ skimState.smfUeNum }}
</div>
<span>
Data {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
</div>
<div class="item">
<h4>{{ skimState.nbNum }}</h4>
<span>
<GlobalOutlined style="color: #edcb35" />
{{ t('views.dashboard.overview.skim.base') }}
</span>
</div>
<div class="item">
<h4>{{ skimState.imsUeNum }}</h4>
<span>
<UserSwitchOutlined style="color: #6acca3" />
IMS {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
<div class="item">
<h4>{{ skimState.smfUeNum }}</h4>
<span>
<UserSwitchOutlined style="color: #6acca3" />
Data {{ t('views.dashboard.overview.skim.session') }}
</span>
</div>
</div>
<div class="skim panel">
<div class="inner">
<h3>
<GlobalOutlined style="color: #68d8fe" />&nbsp;&nbsp;
{{ t('views.dashboard.overview.skim.baseTitle') }}
</h3>
<div class="data">
<div class="item">
<div style="align-items: flex-start">
<img
:src="svgBase"
style="width: 18px; margin-right: 8px; height: 2rem"
/>
{{ skimState.nbNum }}
</div>
<span>
{{ t('views.dashboard.overview.skim.base') }}
</span>
</div>
</div>
</div>
</div>
@@ -262,48 +293,58 @@ onBeforeUnmount(() => {
</div>
</div>
<div class="column">
<!-- UPF总流量 -->
<!-- 流量统计 -->
<div class="upfFlowTotal panel">
<div class="inner">
<!-- 筛选 -->
<div class="filter">
<span
:data-key="v"
:class="{ active: upfTFActive === i }"
v-for="(v, i) in ['0', '7', '30']"
:key="v"
@click="
() => {
upfTFActive = i;
}
"
>
{{
v === '0'
? '24' + t('common.units.hour')
: v + t('common.units.day')
}}
<h3>
<span>
<SwapOutlined style="color: #68d8fe" />&nbsp;&nbsp;
{{ t('views.dashboard.overview.upfFlowTotal.title') }}
</span>
</div>
<!-- 数据 -->
<div class="data">
<div class="item">
<h4>{{ upfTotalFlow[upfTFActive].up }}</h4>
<span>
<ArrowUpOutlined style="color: #597ef7" />
{{ t('views.dashboard.overview.upfFlowTotal.up') }}
<!-- 筛选 -->
<div class="filter">
<span
:data-key="v"
:class="{ active: upfTFActive === i }"
v-for="(v, i) in ['0', '7', '30']"
:key="v"
@click="
() => {
upfTFActive = i;
}
"
>
{{
v === '0'
? '24' + t('common.units.hour')
: v + t('common.units.day')
}}
</span>
</div>
<div class="item">
<h4>{{ upfTotalFlow[upfTFActive].down }}</h4>
<span>
<ArrowDownOutlined style="color: #52c41a" />
{{ t('views.dashboard.overview.upfFlowTotal.down') }}
</span>
</h3>
<div class="chart">
<!-- 数据 -->
<div class="data">
<div class="item">
<span>
<ArrowUpOutlined style="color: #597ef7" />
{{ t('views.dashboard.overview.upfFlowTotal.up') }}
</span>
<h4>{{ upfTotalFlow[upfTFActive].up }}</h4>
</div>
<div class="item">
<span>
<ArrowDownOutlined style="color: #52c41a" />
{{ t('views.dashboard.overview.upfFlowTotal.down') }}
</span>
<h4>{{ upfTotalFlow[upfTFActive].down }}</h4>
</div>
</div>
</div>
</div>
</div>
<!-- 资源情况 -->
<div class="resources panel">
<div class="inner">
@@ -317,6 +358,7 @@ onBeforeUnmount(() => {
</div>
</div>
</div>
<!-- 告警统计 -->
<div class="alarmType panel">
<div class="inner">