18 changed files with 554 additions and 26 deletions
@ -1,35 +1,50 @@ |
|||||||
import { NgModule } from '@angular/core'; |
import { NgModule } from "@angular/core"; |
||||||
import { Routes, RouterModule } from '@angular/router'; |
import { Routes, RouterModule } from "@angular/router"; |
||||||
import { LoginComponent } from './pages/login/login.component'; |
import { LoginComponent } from "./pages/login/login.component"; |
||||||
import { RegisterComponent } from './pages/register/register.component'; |
import { RegisterComponent } from "./pages/register/register.component"; |
||||||
|
|
||||||
//路由守卫
|
//路由守卫
|
||||||
import { AuthGuard } from './auth.guard' |
import { AuthGuard } from "./auth.guard"; |
||||||
import { HomeComponent } from './pages/home/home.component'; |
import { HomeComponent } from "./pages/home/home.component"; |
||||||
import { NavigationComponent } from './system-management/navigation/navigation.component'; |
import { NavigationComponent } from "./system-management/navigation/navigation.component"; |
||||||
import { HomePageNologinComponent } from './pages/home-page-nologin/home-page-nologin.component'; |
import { HomePageNologinComponent } from "./pages/home-page-nologin/home-page-nologin.component"; |
||||||
|
import { GisHomeComponent } from "./pages/gis-home/gis-home.component"; |
||||||
|
|
||||||
|
|
||||||
const routes: Routes = [ |
const routes: Routes = [ |
||||||
{ path: '', redirectTo: 'login', pathMatch: 'full' }, |
{ path: "", redirectTo: "login", pathMatch: "full" }, |
||||||
{ path: 'login', component: LoginComponent }, //登录页
|
{ path: "login", component: LoginComponent }, //登录页
|
||||||
{ path: 'register', component: RegisterComponent }, //注册页
|
{ path: "register", component: RegisterComponent }, //注册页
|
||||||
// { path: 'homepagenologin', component: HomePageNologinComponent }, //注册页
|
{ path: "gishome", component: GisHomeComponent }, //地图首页
|
||||||
{ |
{ |
||||||
path: '', component: HomeComponent, canActivate: [AuthGuard], children: [ |
path: "", |
||||||
{ path: '', loadChildren: () => import('./pages/pages.module').then(m => m.PagesModule) } |
component: HomeComponent, |
||||||
]
|
canActivate: [AuthGuard], |
||||||
|
children: [ |
||||||
|
{ |
||||||
|
path: "", |
||||||
|
loadChildren: () => |
||||||
|
import("./pages/pages.module").then((m) => m.PagesModule), |
||||||
|
}, |
||||||
|
], |
||||||
}, //首页
|
}, //首页
|
||||||
{ |
{ |
||||||
path: '', component: NavigationComponent, canActivate: [AuthGuard], children: [ |
path: "", |
||||||
{ path: 'system', loadChildren: () => import('./system-management/system-management.module').then(m => m.SystemManagementModule) } |
component: NavigationComponent, |
||||||
] |
canActivate: [AuthGuard], |
||||||
}//系统管理
|
children: [ |
||||||
|
{ |
||||||
|
path: "system", |
||||||
|
loadChildren: () => |
||||||
|
import("./system-management/system-management.module").then( |
||||||
|
(m) => m.SystemManagementModule |
||||||
|
), |
||||||
|
}, |
||||||
|
], |
||||||
|
}, //系统管理
|
||||||
]; |
]; |
||||||
|
|
||||||
@NgModule({ |
@NgModule({ |
||||||
imports: [RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' })], |
imports: [RouterModule.forRoot(routes, { relativeLinkResolution: "legacy" })], |
||||||
exports: [RouterModule] |
exports: [RouterModule], |
||||||
}) |
}) |
||||||
export class AppRoutingModule {} |
export class AppRoutingModule {} |
||||||
|
@ -0,0 +1,4 @@ |
|||||||
|
<div class="box"> |
||||||
|
<span class="title">{{title}}</span> |
||||||
|
<span class="subtitle">{{subtitle}}</span> |
||||||
|
</div> |
@ -0,0 +1,29 @@ |
|||||||
|
.box { |
||||||
|
width: 100%; |
||||||
|
height: 52px; |
||||||
|
background-image: url(../../../../assets/gismap/cardtitle.png); |
||||||
|
background-repeat: no-repeat; |
||||||
|
background-size: 100% 100%; |
||||||
|
position: absolute; |
||||||
|
top: -6px; |
||||||
|
left: 0px; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
.title { |
||||||
|
font-size: 20px; |
||||||
|
margin-left: 60px; |
||||||
|
margin-top: 10px; |
||||||
|
color: #fff; |
||||||
|
font-family: titlefont; |
||||||
|
// background: linear-gradient(to bottom, #fff, #88c3ec); |
||||||
|
// -webkit-background-clip: text; |
||||||
|
// -webkit-text-fill-color: transparent; |
||||||
|
} |
||||||
|
.subtitle { |
||||||
|
font-size: 12px; |
||||||
|
color: rgba(185, 233, 255, 0.4); |
||||||
|
font-family: titlefont; |
||||||
|
margin-left: 6px; |
||||||
|
margin-top: 16px; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
import { Component, Input, OnInit } from "@angular/core"; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
selector: "app-card-title", |
||||||
|
templateUrl: "./card-title.component.html", |
||||||
|
styleUrls: ["./card-title.component.scss"], |
||||||
|
}) |
||||||
|
export class CardTitleComponent implements OnInit { |
||||||
|
@Input() title: string; |
||||||
|
@Input() subtitle: string; |
||||||
|
constructor() {} |
||||||
|
|
||||||
|
ngOnInit(): void {} |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
<div class="box"> |
||||||
|
<div id="mapDiv"></div> |
||||||
|
<div class="mask" style="pointer-events: none;"></div> |
||||||
|
<div class="leftBox"> |
||||||
|
<div class="left1 cardItem"> |
||||||
|
<app-card-title [title]="'预案统计'" [subtitle]="'Plan statistics'"></app-card-title> |
||||||
|
<app-unit-title [num]="33"></app-unit-title> |
||||||
|
<div class="content"> |
||||||
|
<div id="echartleft1"></div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="left2 cardItem"> |
||||||
|
<app-card-title [title]="'演练统计'" [subtitle]="'Exercise statistics'"></app-card-title> |
||||||
|
<app-unit-title [num]="33"></app-unit-title> |
||||||
|
<div class="content"> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="left3 cardItem"> |
||||||
|
<app-card-title [title]="'风险管控平台统计'" [subtitle]="'Risk management'"></app-card-title> |
||||||
|
<app-unit-title [num]="33"></app-unit-title> |
||||||
|
<div class="content"> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="rightBox"> |
||||||
|
<div class="right1 cardItem"> |
||||||
|
<app-card-title [title]="'接入类型'" [subtitle]="'Intervention type'"></app-card-title> |
||||||
|
<div class="content"> |
||||||
|
<div class="accessList"> |
||||||
|
<div class="accessitem" *ngFor="let item of accessList"> |
||||||
|
<div class="img"> |
||||||
|
<img [src]="item.img" alt=""> |
||||||
|
</div> |
||||||
|
<div class="namebox"> |
||||||
|
<span class="name">{{item.name}}</span> |
||||||
|
<span class="value" [ngStyle]="{'color': item.color}">{{item.value}}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="right2 cardItem"> |
||||||
|
<app-card-title [title]="'预警统计'" [subtitle]="'Warning statistics'"></app-card-title> |
||||||
|
<div class="content"> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div class="right3 cardItem"> |
||||||
|
<app-card-title [title]="'卸油事件'" [subtitle]="'Oil unloading event'"></app-card-title> |
||||||
|
<div class="content"> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
@ -0,0 +1,122 @@ |
|||||||
|
.box { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
.mask { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
position: absolute; |
||||||
|
left: 0; |
||||||
|
top: 0; |
||||||
|
z-index: 500; |
||||||
|
// background: radial-gradient( |
||||||
|
// rgba(255, 255, 255, 0) 0%, |
||||||
|
// rgba(6, 24, 50, 0.6) 50%, |
||||||
|
// rgb(5, 26, 56) 100% |
||||||
|
// ); |
||||||
|
background: radial-gradient( |
||||||
|
rgba(255, 255, 255, 0), |
||||||
|
rgba(255, 255, 255, 0), |
||||||
|
rgba(6, 24, 50, 0.6), |
||||||
|
rgba(6, 24, 50, 1) |
||||||
|
); |
||||||
|
} |
||||||
|
#mapDiv { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
.leftBox, |
||||||
|
.rightBox { |
||||||
|
width: 430px; |
||||||
|
height: 100%; |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
z-index: 500; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: space-between; |
||||||
|
box-sizing: border-box; |
||||||
|
padding-top: 20px; |
||||||
|
padding-bottom: 10px; |
||||||
|
} |
||||||
|
.leftBox { |
||||||
|
left: 20px; |
||||||
|
.left1 { |
||||||
|
height: 38%; |
||||||
|
} |
||||||
|
.left2 { |
||||||
|
height: 29%; |
||||||
|
} |
||||||
|
.left3 { |
||||||
|
height: 29%; |
||||||
|
} |
||||||
|
} |
||||||
|
.rightBox { |
||||||
|
right: 20px; |
||||||
|
.right1 { |
||||||
|
height: 25%; |
||||||
|
} |
||||||
|
.right2 { |
||||||
|
height: 36%; |
||||||
|
} |
||||||
|
.right3 { |
||||||
|
height: 36%; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.cardItem { |
||||||
|
background-image: url(../../../assets/gismap/cardbg.png); |
||||||
|
background-repeat: no-repeat; |
||||||
|
background-size: 100% 100%; |
||||||
|
position: relative; |
||||||
|
box-sizing: border-box; |
||||||
|
padding-top: 50px; |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
.content { |
||||||
|
flex: 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
.accessList { |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
align-items: center; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
box-sizing: border-box; |
||||||
|
padding: 12px 35px 12px 12px; |
||||||
|
.accessitem { |
||||||
|
width: 50%; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
.img { |
||||||
|
margin-left: 20%; |
||||||
|
margin-right: 12px; |
||||||
|
} |
||||||
|
.namebox { |
||||||
|
display: flex; |
||||||
|
flex-direction: column; |
||||||
|
justify-content: center; |
||||||
|
.name { |
||||||
|
font-size: 16px; |
||||||
|
// font-family: Alibaba PuHuiTi; |
||||||
|
font-weight: 500; |
||||||
|
color: #ffffff; |
||||||
|
} |
||||||
|
.value { |
||||||
|
font-size: 20px; |
||||||
|
font-family: DINPro; |
||||||
|
font-weight: bold; |
||||||
|
color: #479ffe; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#echartleft1 { |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
} |
@ -0,0 +1,197 @@ |
|||||||
|
import { Component, OnInit } from "@angular/core"; |
||||||
|
import * as echarts from "echarts"; |
||||||
|
declare var T: any; |
||||||
|
@Component({ |
||||||
|
selector: "app-gis-home", |
||||||
|
templateUrl: "./gis-home.component.html", |
||||||
|
styleUrls: ["./gis-home.component.scss"], |
||||||
|
}) |
||||||
|
export class GisHomeComponent implements OnInit { |
||||||
|
constructor() {} |
||||||
|
|
||||||
|
ngOnInit(): void { |
||||||
|
this.initMap(); |
||||||
|
this.initEcharts(); |
||||||
|
} |
||||||
|
|
||||||
|
echartleft1; |
||||||
|
|
||||||
|
echartleft1Data = [ |
||||||
|
{ value: 1312, name: "综合应急预案" }, |
||||||
|
{ value: 1583, name: "专项应急预案" }, |
||||||
|
{ value: 1235, name: "现场处置方案" }, |
||||||
|
{ value: 1852, name: "应急处置卡" }, |
||||||
|
{ value: 1735, name: "应急预案" }, |
||||||
|
{ value: 1258, name: "类型预案" }, |
||||||
|
{ value: 600, name: "I-V级预案" }, |
||||||
|
]; |
||||||
|
echartleft1Option = { |
||||||
|
tooltip: { |
||||||
|
trigger: "item", |
||||||
|
}, |
||||||
|
title: { |
||||||
|
text: "9,333", |
||||||
|
subtext: "预案总数", |
||||||
|
left: "28.5%", |
||||||
|
x: "center", |
||||||
|
y: "center", |
||||||
|
textAlign: "center", |
||||||
|
textStyle: { |
||||||
|
color: "#fff", |
||||||
|
fontSize: 26, |
||||||
|
lineHeight: 15, |
||||||
|
fontWeight: "bold", |
||||||
|
textShadowBlur: 20, |
||||||
|
textShadowColor: "#fff", |
||||||
|
}, |
||||||
|
subtextStyle: { |
||||||
|
color: "#759EBB", |
||||||
|
fontSize: 14, |
||||||
|
fontWeight: "normal", |
||||||
|
}, |
||||||
|
}, |
||||||
|
color: [ |
||||||
|
"#1DA7C0", |
||||||
|
"#01CFA1", |
||||||
|
"#F67B44", |
||||||
|
"#CECE41", |
||||||
|
"#7641CE", |
||||||
|
"#CE4148", |
||||||
|
"#FFA192", |
||||||
|
], |
||||||
|
legend: { |
||||||
|
orient: "vertical", |
||||||
|
left: "55%", //图例距离左的距离
|
||||||
|
y: "center", //图例上下居中
|
||||||
|
itemWidth: 8, |
||||||
|
itemHeight: 8, |
||||||
|
itemGap: 18, |
||||||
|
textStyle: { |
||||||
|
color: "#fff", |
||||||
|
rich: { |
||||||
|
name: { |
||||||
|
fontSize: 13, |
||||||
|
color: "#9698A0", |
||||||
|
width: 80, |
||||||
|
padding: [-2, 0, 0, 0], |
||||||
|
}, |
||||||
|
num: { |
||||||
|
fontSize: 13, |
||||||
|
padding: [-2, 0, 0, 0], |
||||||
|
color: "#fff", |
||||||
|
}, |
||||||
|
}, |
||||||
|
}, |
||||||
|
formatter: (name) => { |
||||||
|
//图例后添加数值
|
||||||
|
let data = this.echartleft1Data; |
||||||
|
let tarValue; |
||||||
|
for (let i = 0; i < data.length; i++) { |
||||||
|
if (data[i].name === name) { |
||||||
|
tarValue = data[i].value; |
||||||
|
} |
||||||
|
} |
||||||
|
return `{name|${name}}` + " | " + `{num|${tarValue}}`; |
||||||
|
}, |
||||||
|
}, |
||||||
|
series: [ |
||||||
|
{ |
||||||
|
// name: "Access From",
|
||||||
|
type: "pie", |
||||||
|
radius: ["40%", "55%"], |
||||||
|
center: ["30%", "50%"], //图的位置,距离左跟上的位置
|
||||||
|
avoidLabelOverlap: false, |
||||||
|
label: { |
||||||
|
show: false, |
||||||
|
position: "center", |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
labelLine: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: this.echartleft1Data, |
||||||
|
}, |
||||||
|
// 边框的设置
|
||||||
|
{ |
||||||
|
radius: ["36%", "41%"], |
||||||
|
center: ["30%", "50%"], //图的位置,距离左跟上的位置
|
||||||
|
type: "pie", |
||||||
|
label: { |
||||||
|
normal: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
labelLine: { |
||||||
|
normal: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
emphasis: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
}, |
||||||
|
animation: false, |
||||||
|
tooltip: { |
||||||
|
show: false, |
||||||
|
}, |
||||||
|
data: [ |
||||||
|
{ |
||||||
|
value: 1, |
||||||
|
itemStyle: { |
||||||
|
color: "#183E57", |
||||||
|
}, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
|
||||||
|
], |
||||||
|
}; |
||||||
|
echartleft2; |
||||||
|
echartleft3; |
||||||
|
initEcharts() { |
||||||
|
let echartleft1 = document.getElementById("echartleft1"); |
||||||
|
this.echartleft1 = echarts.init(echartleft1); |
||||||
|
this.echartleft1Option && |
||||||
|
this.echartleft1.setOption(this.echartleft1Option); |
||||||
|
} |
||||||
|
|
||||||
|
accessList = [ |
||||||
|
{ |
||||||
|
name: "油站", |
||||||
|
img: "../../../assets/gismap/icon/1.png", |
||||||
|
value: 3822, |
||||||
|
color: "#479FFE", |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "油库", |
||||||
|
img: "../../../assets/gismap/icon/2.png", |
||||||
|
value: 6422, |
||||||
|
color: "#A485FF", |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "石油化工", |
||||||
|
img: "../../../assets/gismap/icon/3.png", |
||||||
|
value: 7855, |
||||||
|
color: "#90FFAD", |
||||||
|
}, |
||||||
|
{ |
||||||
|
name: "企业", |
||||||
|
img: "../../../assets/gismap/icon/4.png", |
||||||
|
value: 1877, |
||||||
|
color: "#E5B55B", |
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
map; |
||||||
|
zoom = 5; |
||||||
|
initMap() { |
||||||
|
this.map = new T.Map("mapDiv", { |
||||||
|
projection: "EPSG:4326", |
||||||
|
}); |
||||||
|
this.map.centerAndZoom(new T.LngLat(116.40769, 39.89945), this.zoom); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
<div class="box"> |
||||||
|
<div class="numbox"> |
||||||
|
截至{{time}} , 已接入单位数 : <div class="num" *ngFor="let item of numArr">{{item}}</div> 家 |
||||||
|
</div> |
||||||
|
<button class="btn">选择</button> |
||||||
|
</div> |
@ -0,0 +1,36 @@ |
|||||||
|
.box { |
||||||
|
color: #fff; |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
font-size: 13px; |
||||||
|
margin-top: 3px; |
||||||
|
margin-left: 30px; |
||||||
|
} |
||||||
|
.numbox { |
||||||
|
display: flex; |
||||||
|
align-items: center; |
||||||
|
white-space: nowrap; |
||||||
|
overflow: hidden; |
||||||
|
text-overflow: ellipsis; |
||||||
|
margin-right: 12px; |
||||||
|
.num { |
||||||
|
width: 22px; |
||||||
|
height: 22px; |
||||||
|
display: flex; |
||||||
|
justify-content: center; |
||||||
|
align-items: center; |
||||||
|
border: 1px solid rgba(129, 197, 200, 0.6); |
||||||
|
font-family: DS-Digital; |
||||||
|
font-weight: bold; |
||||||
|
color: #ef9c00; |
||||||
|
margin: 0 2px; |
||||||
|
} |
||||||
|
} |
||||||
|
.btn { |
||||||
|
width: 50px; |
||||||
|
height: 24px; |
||||||
|
border: 1px solid #46bbf1; |
||||||
|
background: linear-gradient(0deg, #4ad0ff 0%, #2d3d5b 100%); |
||||||
|
border-radius: 3px; |
||||||
|
cursor: pointer; |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
import { Component, Input, OnInit } from "@angular/core"; |
||||||
|
|
||||||
|
@Component({ |
||||||
|
selector: "app-unit-title", |
||||||
|
templateUrl: "./unit-title.component.html", |
||||||
|
styleUrls: ["./unit-title.component.scss"], |
||||||
|
}) |
||||||
|
export class UnitTitleComponent implements OnInit { |
||||||
|
@Input() num: number; |
||||||
|
constructor() {} |
||||||
|
|
||||||
|
time: string; |
||||||
|
ngOnInit(): void { |
||||||
|
console.log(this.num); |
||||||
|
this.getTime(); |
||||||
|
this.transformationNum(this.num); |
||||||
|
} |
||||||
|
|
||||||
|
getTime() { |
||||||
|
let today = new Date(); |
||||||
|
let year = today.getFullYear(); |
||||||
|
let month = today.getMonth() + 1; // 月份是从0开始的,所以要加1
|
||||||
|
let day = today.getDate(); |
||||||
|
this.time = year + "/" + month + "/" + day; |
||||||
|
} |
||||||
|
|
||||||
|
numArr = []; |
||||||
|
transformationNum(num) { |
||||||
|
let str = String(num); |
||||||
|
switch (str.length) { |
||||||
|
case 1: |
||||||
|
this.numArr = ["0", "0", str]; |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
this.numArr = ["0", str[0], str[1]]; |
||||||
|
break; |
||||||
|
default: |
||||||
|
this.numArr = str.split(""); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 7.6 KiB |
After Width: | Height: | Size: 7.7 KiB |
Loading…
Reference in new issue