+
+
+
+
+
+
+ {{ t('views.dashboard.overview.upfFlowTotal.title') }}
+
+
+
+
+ {
+ upfTFActive = v;
+ }
+ "
+ >
+ {{
+ v === '0'
+ ? '24' + t('common.units.hour')
+ : v + t('common.units.day')
+ }}
+
+
+
+
+
+
+
+
+
+ {{ t('views.dashboard.overview.upfFlowTotal.up') }}
+
+
{{ upfTotalFlow[upfTFActive].upFrom }}
+
+
+
+
+ {{ t('views.dashboard.overview.upfFlowTotal.down') }}
+
+
{{ upfTotalFlow[upfTFActive].downFrom }}
+
+
+
+
+
+
+
+
+
+
+ {{ t('views.dashboard.overview.alarmTypeBar.alarmSum') }}
+
+
+
+
+
+
+
+
+
+ {{ t('views.dashboard.overview.resources.title') }}:
+ {{ graphNodeClickID }}
+
+
+
@@ -674,24 +661,22 @@ onBeforeUnmount(() => {
diff --git a/src/views/dashboard/overview/components/IMSActivity/index.vue b/src/views/dashboard/overview2/components/IMSActivity/index.vue
similarity index 100%
rename from src/views/dashboard/overview/components/IMSActivity/index.vue
rename to src/views/dashboard/overview2/components/IMSActivity/index.vue
diff --git a/src/views/dashboard/overview2/components/NeResources/index.vue b/src/views/dashboard/overview2/components/NeResources/index.vue
new file mode 100644
index 00000000..669214c8
--- /dev/null
+++ b/src/views/dashboard/overview2/components/NeResources/index.vue
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/overview2/components/Topology/index.vue b/src/views/dashboard/overview2/components/Topology/index.vue
new file mode 100644
index 00000000..1b9e04c8
--- /dev/null
+++ b/src/views/dashboard/overview2/components/Topology/index.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/overview2/components/UPFFlow/index.vue b/src/views/dashboard/overview2/components/UPFFlow/index.vue
new file mode 100644
index 00000000..ac864183
--- /dev/null
+++ b/src/views/dashboard/overview2/components/UPFFlow/index.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/overview2/components/UserActivity/index.vue b/src/views/dashboard/overview2/components/UserActivity/index.vue
new file mode 100644
index 00000000..614b19a2
--- /dev/null
+++ b/src/views/dashboard/overview2/components/UserActivity/index.vue
@@ -0,0 +1,324 @@
+
+
+
+
+
+
+
+
+
+ {{ t('views.dashboard.overview.userActivity.type') }}:
+
+
+
+
+
+ IMSI: {{ item.data.imsi }}
+
+
+
+
+
+
+ GNB ID: {{ item.data.gNBID }}
+
+
+ Cell ID: {{ item.data.cellID }}
+
+
+ TAC ID: {{ item.data.tacID }}
+
+
+
+ {{ t('views.dashboard.overview.userActivity.time') }}:
+
+ {{ parseDateToStr(item.data.time) }}
+
+
+ {{ parseDateToStr(+item.data.timestamp * 1000) }}
+
+ -
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+
+
+
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+ {{ t('views.dashboard.overview.userActivity.resultOK') }}
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+
+
+
+
+
+
+
+
+
+ {{ t('views.dashboard.overview.userActivity.type') }}:
+
+ {{
+ dict.ueEventType
+ .find(s => s.value === item.type)
+ ?.label.replace('CM', 'ECM')
+ }}
+
+
+
+
+
+
+ IMSI: {{ item.data?.imsi }}
+
+
+
+
+
+
+ ENB ID: {{ item.data.eNBID }}
+
+
+ Cell ID: {{ item.data.cellID }}
+
+
+ TAC ID: {{ item.data.tacID }}
+
+
+
+ {{ t('views.dashboard.overview.userActivity.time') }}:
+
+ {{ parseDateToStr(item.data.time) }}
+
+
+ {{
+ typeof item.data?.timestamp === 'number'
+ ? parseDateToStr(+item.data?.timestamp * 1000)
+ : parseDateToStr(item.data?.timestamp)
+ }}
+
+ -
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+
+
+
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+ {{ t('views.dashboard.overview.userActivity.resultOK') }}
+
+
+ {{ t('views.dashboard.overview.userActivity.result') }}:
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/overview2/css/index.css b/src/views/dashboard/overview2/css/index.css
new file mode 100644
index 00000000..35fff9fb
--- /dev/null
+++ b/src/views/dashboard/overview2/css/index.css
@@ -0,0 +1,399 @@
+.viewport {
+ /* 限定大小 */
+ min-width: 1024px;
+ max-width: 1920px;
+ min-height: 780px;
+ margin: 0 auto;
+ position: relative;
+ display: flex;
+ padding: 5rem 0.833rem 0;
+ line-height: 1.15;
+ background-image: url(../images/bj.png);
+ height: 100vh;
+ margin-bottom: -20px;
+ background-size:80% 80%;
+ background-attachment:fixed;
+ -webkit-background-size: cover;
+}
+
+
+.column {
+ flex: 3;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+}
+
+/* 边框 */
+.panel {
+ box-sizing: border-box;
+ border: 2px solid rgba(252, 252, 252, 0);
+ border-width: 2.125rem 1.583rem 0.875rem 5.5rem;
+ position: relative;
+ margin-bottom: 0.833rem;
+}
+.panel .inner {
+ /* 装内容 */
+ /* height: 60px; */
+ position: absolute;
+ top: -2.125rem;
+ right: -1.583rem;
+ bottom: -0.875rem;
+ left: -5.5rem;
+ padding: 1rem 1.5rem;
+}
+.panel h3 {
+ font-size: 0.833rem;
+ color: #fff;
+}
+
+.leftright {
+ width: 100%;
+ min-height: 2.5rem;
+ background: url(../images/title.png) no-repeat center center;
+ background-size: 100%;
+ color: #4c9bfd;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+ padding: 0.5rem 1.2rem;
+ border-radius: 0.7rem 0.7rem 0 0;
+ margin: 0;
+ box-sizing: border-box;
+ text-shadow: 0 1px 4px #000a;
+ flex-wrap: nowrap;
+ /* 保证内容不换行且居中 */
+}
+
+.leftright .title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ font-size: 1rem;
+ padding-left: 0;
+}
+
+.centerStyle {
+ width: 100%;
+ min-height: 2.5rem;
+ background: url(../images/title.png) no-repeat center center;
+ background-size: 90%;
+ color: #4c9bfd;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+ padding: 0.5rem 1.2rem;
+ border-radius: 0.7rem 0.7rem 0 0;
+ margin: 0;
+ box-sizing: border-box;
+ text-shadow: 0 1px 4px #000a;
+ flex-wrap: nowrap;
+ /* 保证内容不换行且居中 */
+}
+
+.centerStyle .title {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ font-size: 1rem;
+ padding-left: 0;
+}
+
+/* 总览标题 */
+.brand {
+ background-image: url(../images/newBrand.png);
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center center;
+ position: absolute;
+ top: 0.833rem;
+ left: 0;
+ right: 0;
+ width: 100%;
+ height: 5rem;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ cursor: pointer;
+}
+.brand .brand-title {
+ color: #ffffff;
+ font-size: 1.4rem;
+ font-weight: 600;
+ padding-top: 1rem;
+ padding-bottom: 0.5rem;
+}
+.brand .brand-desc {
+ color: #d9d9d9;
+ font-size: 0.9rem;
+}
+
+/* 实时流量 */
+.upfFlow {
+ /* min-height: 16rem; */
+ height: 40%;
+}
+.upfFlow .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 0rem;
+}
+
+/* 网络拓扑 */
+.topology {
+ /* min-height: 27.8rem; */
+ height: 46.4%;
+ flex: 1;
+}
+.topology .inner h3 {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: baseline;
+}
+.topology .inner h3 .normal {
+ color: #52c41a;
+ font-size: 1.1rem;
+ margin-right: 8px;
+}
+.topology .inner h3 .abnormal {
+ color: #f5222d;
+ font-size: 1.1rem;
+}
+.topology .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 1rem;
+}
+
+/* 概览区域 */
+.skim {
+ /* min-height: 7.78rem; */
+ height: 14.4%;
+}
+.skim .inner .data {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: 90%;
+}
+.skim .inner .data .item {
+ display: flex;
+ flex-direction: column;
+ align-items: baseline;
+ width: 33%;
+}
+.skim .inner .data .item div {
+ font-size: 1.467rem;
+ color: #fff;
+ margin-bottom: 0;
+ display: flex;
+ align-items: baseline;
+ line-height: 2rem;
+}
+.skim .inner .data .item span {
+ color: #4c9bfd;
+ font-size: 0.833rem;
+ width: 100%;
+ position: relative;
+ line-height: 2rem;
+ white-space: nowrap;
+ text-align: start;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+.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;
+}
+
+/* 概览区域 衍生基站信息 */
+.skim.base {
+ height: 11.25%;
+}
+
+.skim.base .inner .data {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ height: 75%;
+}
+.skim.base .inner .data .item {
+ display: flex;
+ flex-direction: column;
+ align-items: baseline;
+ width: 50%;
+}
+
+/* 用户行为 */
+.userActivity {
+ /* min-height: 35.8rem; */
+ height: 54.6%;
+ flex: 1;
+}
+.userActivity .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 1rem;
+}
+
+/* 流量统计 */
+.upfFlowTotal1 {
+ /* min-height: 7.5rem; */
+ height: 14.4%;
+}
+.upfFlowTotal1 .inner h3 {
+ display: flex;
+ justify-content: space-between;
+}
+.upfFlowTotal1 .inner h3 .filter {
+ display: flex;
+}
+.upfFlowTotal1 .inner h3 .filter span {
+ display: block;
+ height: 0.75rem;
+ line-height: 1;
+ padding: 0 0.75rem;
+ color: #1950c4;
+ font-size: 0.75rem;
+ border-right: 0.083rem solid #00f2f1;
+ cursor: pointer;
+}
+.upfFlowTotal1 .inner h3 .filter span:first-child {
+ padding-left: 0;
+}
+.upfFlowTotal1 .inner h3 .filter span:last-child {
+ border-right: none;
+}
+.upfFlowTotal1 .inner h3 .filter span.active {
+ color: #fff;
+ font-size: 0.833rem;
+}
+.upfFlowTotal1 .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 0.1rem;
+}
+.upfFlowTotal1 .inner .chart .data {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ height: 60%;
+}
+.upfFlowTotal1 .inner .chart .data .item {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+}
+.upfFlowTotal1 .inner .chart .data .item h4 {
+ font-size: 1.467rem;
+ color: #fff;
+ margin-bottom: 0;
+}
+.upfFlowTotal1 .inner .chart .data .item span {
+ color: #4c9bfd;
+ font-size: 0.867rem;
+}
+
+
+/* 流量统计 */
+.upfFlowTotal {
+ /* min-height: 7.5rem; */
+ height: 14.4%;
+}
+.upfFlowTotal .inner h3 {
+ display: flex;
+ justify-content: space-between;
+}
+.upfFlowTotal .inner h3 .filter {
+ display: flex;
+}
+.upfFlowTotal .inner h3 .filter span {
+ display: block;
+ height: 0.75rem;
+ line-height: 1;
+ padding: 0 0.75rem;
+ color: #1950c4;
+ font-size: 0.75rem;
+ border-right: 0.083rem solid #00f2f1;
+ cursor: pointer;
+}
+.upfFlowTotal .inner h3 .filter span:first-child {
+ padding-left: 0;
+}
+.upfFlowTotal .inner h3 .filter span:last-child {
+ border-right: none;
+}
+.upfFlowTotal .inner h3 .filter span.active {
+ color: #fff;
+ font-size: 0.833rem;
+}
+.upfFlowTotal .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 0.1rem;
+}
+.upfFlowTotal .inner .chart .data {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ height: 60%;
+}
+.upfFlowTotal .inner .chart .data .item {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+}
+.upfFlowTotal .inner .chart .data .item h4 {
+ font-size: 1.467rem;
+ color: #fff;
+ margin-bottom: 0;
+}
+.upfFlowTotal .inner .chart .data .item span {
+ color: #4c9bfd;
+ font-size: 0.867rem;
+}
+
+/* 资源情况 */
+.resources {
+ /* min-height: 18rem; */
+ height: 24.4%;
+}
+.resources .inner .chart {
+ width: 100%;
+ height: 100%;
+ margin-top: 1rem;
+}
+
+
+/* 告警统计 */
+.alarmType {
+ /* min-height: 25rem; */
+ height: 35%;
+}
+.alarmType .inner .chart {
+ width: 100%;
+ height: 100%;
+}
+
+/* 跳转鼠标悬浮 */
+.toRouter:hover {
+ cursor: pointer;
+ color: #fff !important;
+}
+.toRouter:hover > *,
+.toRouter:hover > * > * {
+ color: #fff !important;
+}
diff --git a/src/views/dashboard/overview2/hooks/useTopology.ts b/src/views/dashboard/overview2/hooks/useTopology.ts
new file mode 100644
index 00000000..ff83a840
--- /dev/null
+++ b/src/views/dashboard/overview2/hooks/useTopology.ts
@@ -0,0 +1,197 @@
+import { parseDateToStr } from '@/utils/date-utils';
+import { computed, reactive, ref } from 'vue';
+
+/**非网元元素 */
+export const notNeNodes = [
+ '5GC',
+ 'DN',
+ 'UE',
+ 'Base',
+ 'lan',
+ 'lan1',
+ 'lan2',
+ 'lan3',
+ 'lan4',
+ 'lan5',
+ 'lan6',
+ 'lan7',
+ 'LAN',
+ 'NR',
+];
+
+/**图状态 */
+export const graphState = reactive
>({
+ /**当前图组名 */
+ group: '5GC System Architecture',
+ /**图数据 */
+ data: {
+ combos: [],
+ edges: [],
+ nodes: [],
+ },
+});
+
+/**图实例对象 */
+export const graphG6 = ref(null);
+
+/**图点击选择 */
+export const graphNodeClickID = ref('UPF_001');
+
+/**图节点网元信息状态 */
+export const graphNodeState = computed(() =>{
+ return graphState.data.nodes.map((item: any) => ({
+ id: item.id,
+ label: item.label,
+ neInfo: item.neInfo,
+ neState: item.neState,
+ neInfoList:item.neInfoList,
+ neStateMap: item.neStateMap,
+ }))
+}
+
+);
+
+/**图节点网元状态数量 */
+export const graphNodeStateNum = computed(() => {
+ let normal = 0;
+ let abnormal = 0;
+ for (const item of graphState.data.nodes) {
+ const neId = item.neState.neId;
+ if (neId) {
+ if (item.neState.online) {
+ normal += 1;
+ } else {
+ abnormal += 1;
+ }
+ }
+ }
+ return [normal, abnormal];
+});
+
+/**网元状态请求标记 */
+export const neStateRequestMap = ref