From 08ecb6c60f9e5c0e54cda836aed440e2d63fdb5a Mon Sep 17 00:00:00 2001 From: SHAOJIAHAO <55341701@qq.com> Date: Thu, 18 Nov 2021 14:05:27 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E5=A2=9E]=E5=AE=8C=E6=88=90=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=BA=A7=E4=BB=8A=E6=97=A5=E9=A2=84=E8=AD=A6=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=9B=E6=96=B0=E5=A2=9E=E5=88=86=E6=9E=90=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 5 + package.json | 1 + src/app/app.component.html | 2 +- src/app/http-interceptors/base-interceptor.ts | 11 +- .../criminal-records-admin.component.html | 20 +-- .../criminal-records.component.html | 24 ++- .../criminal-records.component.ts | 97 ++++++++++ .../equipment-info.component.ts | 6 +- src/app/pages/home/home.component.html | 10 +- src/app/pages/home/home.component.ts | 32 +++- src/app/pages/login/login.component.ts | 23 +-- .../oil-station-info.component.ts | 4 +- src/app/pages/pages-routing.module.ts | 4 +- src/app/pages/pages.module.ts | 3 +- .../plan-admin/plan-admin.component.html | 14 +- .../plan-admin/plan-admin.component.scss | 5 +- .../pages/plan-admin/plan-admin.component.ts | 25 ++- .../today-warning-admin.component.html | 120 ++++++------- .../today-warning-admin.component.scss | 7 +- .../today-warning-admin.component.ts | 150 +++++++++++----- .../warning-details.component.html | 0 .../warning-details.component.scss | 0 .../warning-details.component.spec.ts | 25 +++ .../warning-details.component.ts | 15 ++ .../get-out-of-line-details.component.html | 119 ++++++++++++- .../get-out-of-line-details.component.scss | 165 +++++++++++++++++- .../get-out-of-line-details.component.ts | 9 +- .../today-warning.component.html | 17 +- .../today-warning/today-warning.component.ts | 32 ++-- src/app/service/navChange.service.ts | 22 +++ .../addcamera/addcamera.component.html | 18 ++ .../addcamera/addcamera.component.scss | 0 .../addcamera/addcamera.component.ts | 22 +++ .../analysis-of-the-host.component.html | 43 ++++- .../analysis-of-the-host.component.scss | 1 + .../analysis-of-the-host.component.ts | 143 +++++++++++++-- .../editcamera/editcamera.component.html | 1 + .../editcamera/editcamera.component.scss | 0 .../editcamera/editcamera.component.ts | 15 ++ .../edithost/edithost.component.html | 12 +- .../edithost/edithost.component.ts | 14 +- .../navigation/navigation.component.html | 2 +- .../navigation/navigation.component.ts | 2 +- .../organization/addor/addor.component.html | 4 +- .../organization/addor/addor.component.ts | 2 +- .../organization/editor/editor.component.html | 4 +- .../organization/editor/editor.component.ts | 2 +- .../organization/organization.component.ts | 11 +- .../system-management.module.ts | 6 +- .../user/adduser/adduser.component.ts | 2 +- .../user/edituser/edituser.component.html | 2 +- .../system-management/user/user.component.ts | 8 +- src/app/ui/tabbar/tabbar.component.html | 2 +- src/app/ui/tabbar/tabbar.component.ts | 5 +- src/assets/images/left.png | Bin 0 -> 2175 bytes src/assets/images/left2.png | Bin 0 -> 5240 bytes src/assets/images/right.png | Bin 0 -> 2199 bytes src/assets/images/right2.png | Bin 0 -> 5354 bytes src/assets/images/warning1.png | Bin 0 -> 7105 bytes src/assets/images/warning2.png | Bin 0 -> 7302 bytes src/assets/images/warning3.png | Bin 0 -> 7092 bytes src/assets/images/warning4.png | Bin 0 -> 7480 bytes 62 files changed, 1039 insertions(+), 249 deletions(-) create mode 100644 src/app/pages/today-warning-admin/warning-details/warning-details.component.html create mode 100644 src/app/pages/today-warning-admin/warning-details/warning-details.component.scss create mode 100644 src/app/pages/today-warning-admin/warning-details/warning-details.component.spec.ts create mode 100644 src/app/pages/today-warning-admin/warning-details/warning-details.component.ts create mode 100644 src/app/service/navChange.service.ts create mode 100644 src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.html create mode 100644 src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.scss create mode 100644 src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.ts create mode 100644 src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.html create mode 100644 src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.scss create mode 100644 src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.ts create mode 100644 src/assets/images/left.png create mode 100644 src/assets/images/left2.png create mode 100644 src/assets/images/right.png create mode 100644 src/assets/images/right2.png create mode 100644 src/assets/images/warning1.png create mode 100644 src/assets/images/warning2.png create mode 100644 src/assets/images/warning3.png create mode 100644 src/assets/images/warning4.png diff --git a/package-lock.json b/package-lock.json index 9f9c12a..1b64b40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10828,6 +10828,11 @@ "resolved": "https://registry.npm.taobao.org/lineclip/download/lineclip-1.1.5.tgz", "integrity": "sha1-K/JgZ9lDVP6r+R5CdoI221YW/RM=" }, + "linqjs": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/linqjs/download/linqjs-1.0.2.tgz", + "integrity": "sha1-u6n9aUvvP7DmTLfAvNlfzbxHD+w=" + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1574712695617&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", diff --git a/package.json b/package.json index fc9157d..3c370ef 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "echarts": "^4.9.0", "firebase": "^7.6.2", "install": "^0.13.0", + "linqjs": "^1.0.2", "moment": "^2.29.1", "ng-zorro-antd": "^9.3.0", "ngx-cookie-service": "^3.0.2", diff --git a/src/app/app.component.html b/src/app/app.component.html index d838fa8..0dbe5df 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -8,7 +8,7 @@
- 您有一条新的违规事件! + 您有一条新的预警提醒! 这是详细描述这是详细描述这是详细描述...
diff --git a/src/app/http-interceptors/base-interceptor.ts b/src/app/http-interceptors/base-interceptor.ts index 778beae..16de0ab 100644 --- a/src/app/http-interceptors/base-interceptor.ts +++ b/src/app/http-interceptors/base-interceptor.ts @@ -18,7 +18,16 @@ export class BaseInterceptor implements HttpInterceptor { constructor(private router: Router, public token: CacheTokenService, private cookieService: CookieService, private message: NzMessageService) { } intercept(req, next: HttpHandler) { - + + let params = req.params; + for (const key of req.params.keys()) { + if (params.get(key) === undefined || params.get(key) === null) { + params = params.delete(key, undefined); + } + } + req = req.clone({ params }); +// debugger +// console.log('xxxxxx',req) let newReq = req.clone({ url: req.hadBaseurl ? `${req.url}` : `${req.url}`, }); diff --git a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html index 9169916..7311c5f 100644 --- a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html +++ b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html @@ -54,17 +54,17 @@
- +
- 违规事件统计 + 预警事件统计
-
违规事件总数
+
预警事件总数
206
@@ -74,14 +74,14 @@
- 违规趋势 + 预警趋势
+ [ngClass]="{'selectedbtn': selectedRankingType == '站点排名'}">油站 - + [ngClass]="{'selectedbtn': selectedRankingType == '事件排名'}">事件 +
@@ -92,7 +92,7 @@
- +
@@ -119,7 +119,7 @@ 摄像头
- 违规时间 + 预警时间
操作 @@ -131,7 +131,7 @@ Ⅰ级
- 日常违规行为 + 日常预警行为
中化某某省公司 diff --git a/src/app/pages/criminal-records/criminal-records.component.html b/src/app/pages/criminal-records/criminal-records.component.html index aa55342..815a2fb 100644 --- a/src/app/pages/criminal-records/criminal-records.component.html +++ b/src/app/pages/criminal-records/criminal-records.component.html @@ -54,17 +54,17 @@
- +
- 违规事件统计 + 预警事件统计
-
违规事件总数
+
预警事件总数
206
@@ -74,8 +74,16 @@
- 违规趋势 + 预警趋势 +
+ + + +
@@ -84,7 +92,7 @@
- +
@@ -96,13 +104,13 @@ 预警类型
- 违规信息 + 预警信息
摄像头
- 违规时间 + 预警时间
操作 @@ -114,7 +122,7 @@ Ⅰ级
- 日常违规行为 + 日常预警行为
工作人员倚靠加油机或立柱 diff --git a/src/app/pages/criminal-records/criminal-records.component.ts b/src/app/pages/criminal-records/criminal-records.component.ts index 727604e..a20a60a 100644 --- a/src/app/pages/criminal-records/criminal-records.component.ts +++ b/src/app/pages/criminal-records/criminal-records.component.ts @@ -89,6 +89,86 @@ export class CriminalRecordsComponent implements OnInit { top: '45px' } }; + baroption2 = { + xAxis: { + type: 'value', + show: false + }, + yAxis: { + type: 'category', + data: ['预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名', '预警事件名'], + axisLine: { + show: false, + lineStyle: { + color: '#91CCFF', + } + }, + axisTick: {//刻度线 + show: false + }, + axisLabel: { + formatter: function (value, index) { + // 格式化成月/日,只在第一个刻度显示年份 + return '{s|·}' + `{a|${value}}`; + }, + rich: { + a: { + color: '#C4E2FC', + padding: [0, 0, 0, 8], + }, + s: { + color: '#fff', + borderWidth: 1, + borderColor: '#23D9FF', + backgroundColor: '#fff', + width: 4, + height: 4, + shadowBlur: 3, + shadowColor: "#fff" + } + } + } + + }, + series: + { + label: { + // 柱图头部显示值 + show: true, + position: "right", + color: "#fff", + fontSize: 12, + formatter: '{c}', + offset: [6, 0] + }, + data: [40, 36, 30, 25, 19, 15, 14, 11, 10, 8].reverse(), + type: 'bar', + itemStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 1, + y2: 0, + colorStops: [{ + offset: 0, color: '#063d72' // 0% 处的颜色 + }, { + offset: 1, color: '#FF9963' // 100% 处的颜色 + }], + global: false // 缺省为 false + } + }, + barWidth: '36%', + + } + , + grid: { + left: '100px', + right: '60px', + bottom: '3px', + top: '20px' + } + } getThirtyDays() { //获取当前日期 let myDate = new Date(); @@ -219,4 +299,21 @@ export class CriminalRecordsComponent implements OnInit { list: any = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + + selectedType = '分布' + selectedRankingType = '站点排名' + echartClick(type) { + this.selectedType = type + this.mybarChart.dispose() + this.mybarChart = echarts.init(document.getElementById('barchart')); + if (type == '排名') { + this.mybarChart.setOption(this.baroption2); + } else { + this.mybarChart.setOption(this.baroption); + } + + } + // echartClick2(type) { + // this.selectedRankingType = type + // } } diff --git a/src/app/pages/equipment-info/equipment-info.component.ts b/src/app/pages/equipment-info/equipment-info.component.ts index cc09f12..c62f119 100644 --- a/src/app/pages/equipment-info/equipment-info.component.ts +++ b/src/app/pages/equipment-info/equipment-info.component.ts @@ -29,7 +29,7 @@ export class EquipmentInfoComponent implements OnInit { this.http.get('/api/services/app/FireEquipment/GetAll', { params: { Name:this.validateForm.value.search ? this.validateForm.value.search : '', - OrganizationId: JSON.parse(sessionStorage.getItem('userdata')).organization.id, + organizationUnitId: JSON.parse(sessionStorage.getItem('userdata')).organization.id, SkipCount: String(this.SkipCount), MaxResultCount: String(this.MaxResultCount) } @@ -75,7 +75,7 @@ export class EquipmentInfoComponent implements OnInit { productionDate: instance.validateForm.value.prodtime, purchaseDate: instance.validateForm.value.buytime, validityEndTime: instance.validateForm.value.validitytime, - organizationId: JSON.parse(sessionStorage.getItem('userdata')).organization.id + organizationUnitId: JSON.parse(sessionStorage.getItem('userdata')).organization.id } this.http.post('/api/services/app/FireEquipment/Create', body).subscribe(data => { resolve(data) @@ -121,7 +121,7 @@ export class EquipmentInfoComponent implements OnInit { productionDate: instance.validateForm.value.prodtime, purchaseDate: instance.validateForm.value.buytime, validityEndTime: instance.validateForm.value.validitytime, - organizationId: item.organizationId + organizationUnitId: item.organizationUnitId } this.http.put('/api/services/app/FireEquipment/Update', body).subscribe(data => { resolve(data) diff --git a/src/app/pages/home/home.component.html b/src/app/pages/home/home.component.html index 49d7d83..4c4d150 100644 --- a/src/app/pages/home/home.component.html +++ b/src/app/pages/home/home.component.html @@ -4,13 +4,13 @@
diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index d120480..625431d 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Router, NavigationEnd, ActivatedRoute } from '@angular/router'; import { Title } from '@angular/platform-browser' import { filter } from 'rxjs/operators'; +import { NavChangeService } from 'src/app/service/navChange.service'; @Component({ selector: 'app-home', templateUrl: './home.component.html', @@ -9,15 +10,33 @@ import { filter } from 'rxjs/operators'; }) export class HomeComponent implements OnInit { - constructor(private router: Router) { } + constructor(private router: Router, private navChangeService: NavChangeService) { } isGasStationNav: boolean isGasStation: boolean isWarning: boolean = false//是否是今日预警页面 + num ngOnInit(): void { - if(sessionStorage.getItem('isGasStation') == 'true'){ + this.navChangeService.getMessage().subscribe((message: any) => { + console.log(message);//send a message + if(message.name == 'oilstation'){ + this.isGasStationNav = true + } + if(message.name == '改变数量'){ + this.isWarning = true + this.num = message.num + } + }); + + if (this.router.url.indexOf('petrolStation') != -1 && sessionStorage.getItem('isGasStation') == 'false') {//控制返回按钮显示 + this.isGasStation = true + } else { + this.isGasStation = false + } + + if (sessionStorage.getItem('isGasStation') == 'true') { this.isGasStationNav = true - }else{ + } else { this.isGasStationNav = false } @@ -31,15 +50,16 @@ export class HomeComponent implements OnInit { } if (event.url.indexOf('petrolStation') != -1 && sessionStorage.getItem('isGasStation') == 'false') {//控制返回按钮显示 this.isGasStation = true - }else{ + } else { this.isGasStation = false } }); } - goback(){ - history.go(-1) + goback() { + this.router.navigate(['/plan']) + this.isGasStationNav = false } } diff --git a/src/app/pages/login/login.component.ts b/src/app/pages/login/login.component.ts index 6d85972..61dd9c4 100644 --- a/src/app/pages/login/login.component.ts +++ b/src/app/pages/login/login.component.ts @@ -43,37 +43,40 @@ export class LoginComponent implements OnInit { this.message.create('error', `请输入账号密码`); return } - // if (!this.selectedRole) { - // this.message.create('error', `请选择登录角色`); - // return - // } this.isLoading = true; this.http.post('/api/TokenAuth/Authenticate', { userNameOrEmailAddress: this.validateForm.value.userName, password: this.validateForm.value.password }).subscribe( (data: any) => { - sessionStorage.setItem("token", data.result.accessToken); this.cookieService.set("token", data.result.accessToken, null, '/'); this.cookieService.set("refreshToken", data.result.encryptedAccessToken, null, '/'); this.http.get('/api/services/app/Session/GetCurrentLoginInformations').subscribe((data: any) => { sessionStorage.setItem('userdata', JSON.stringify(data.result.user)) + sessionStorage.setItem('userdataOfgasstation', JSON.stringify(data.result.user)) this.isLoading = false; - if (data.result.user.organization.isGasStation) { - sessionStorage.setItem("isGasStation", 'true'); - this.router.navigate(['/plan/petrolStation']) + if (data.result.user.userName == 'admin') { + this.router.navigate(['/system/organization']) } else { - sessionStorage.setItem("isGasStation", 'false'); - this.router.navigate(['/plan']) + if (data.result.user.organization.isGasStation) { + sessionStorage.setItem("isGasStation", 'true'); + this.router.navigate(['/plan/petrolStation']) + } else { + sessionStorage.setItem("isGasStation", 'false'); + this.router.navigate(['/plan']) + } } this.message.create('success', `登陆成功`); + }, err => { + this.isLoading = false; }) //调用服务中的function刷新token // this.token.startUp() }, (err) => { + this.isLoading = false; this.message.create('error', err.error.error.details); } ) diff --git a/src/app/pages/oil-station-info/oil-station-info.component.ts b/src/app/pages/oil-station-info/oil-station-info.component.ts index 677f626..0b917eb 100644 --- a/src/app/pages/oil-station-info/oil-station-info.component.ts +++ b/src/app/pages/oil-station-info/oil-station-info.component.ts @@ -62,7 +62,7 @@ export class OilStationInfoComponent implements OnInit { getInfo() { this.http.get('/api/services/app/GasStation/Get', { params: { - organizationId: this.userdata.organization.id + organizationUnitId: this.userdata.organization.id } }).subscribe((data: any) => { console.log('油站信息', data) @@ -112,7 +112,7 @@ export class OilStationInfoComponent implements OnInit { httpBody = { id: null, stationName: JSON.parse(sessionStorage.getItem('userdata')).organization.displayName, - organizationId: JSON.parse(sessionStorage.getItem('userdata')).organization.id, + organizationUnitId: JSON.parse(sessionStorage.getItem('userdata')).organization.id, validityStartTime: '', validityEndTime: '', openTime: '', diff --git a/src/app/pages/pages-routing.module.ts b/src/app/pages/pages-routing.module.ts index 19af134..bd1ba89 100644 --- a/src/app/pages/pages-routing.module.ts +++ b/src/app/pages/pages-routing.module.ts @@ -11,8 +11,8 @@ import { EquipmentInfoComponent } from './equipment-info/equipment-info.componen import { PlanAdminComponent } from './plan-admin/plan-admin.component'; const routes: Routes = [ - { path: 'plan', component: PlanAdminComponent , data: { permission: 'xxxx' },canActivate: [AuthGuard]}, - { path: 'plan/petrolStation', component: PlanComponent , data: { permission: 'xxxx' },canActivate: [AuthGuard]}, + { path: 'plan', component: PlanAdminComponent }, + { path: 'plan/petrolStation', component: PlanComponent }, { path: 'warning', component: TodayWarningAdminComponent }, { path: 'warning/petrolStation', component: TodayWarningComponent }, { path: 'records', component: CriminalRecordsAdminComponent }, diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts index 17142f1..73d4f96 100644 --- a/src/app/pages/pages.module.ts +++ b/src/app/pages/pages.module.ts @@ -41,13 +41,14 @@ import { EditequipmentComponent } from './equipment-info/editequipment/editequip import { NzTreeSelectModule } from 'ng-zorro-antd/tree-select'; import { PlanAdminComponent } from './plan-admin/plan-admin.component'; import { GetOutOfLineDetailsComponent } from './today-warning/get-out-of-line-details/get-out-of-line-details.component'; +import { WarningDetailsComponent } from './today-warning-admin/warning-details/warning-details.component'; @NgModule({ declarations: [LoginComponent, RegisterComponent, HomeComponent, PlanComponent, TodayWarningComponent, CriminalRecordsComponent, TodayWarningAdminComponent, CriminalRecordsAdminComponent, LeftDomainComponent, EquipmentInfoComponent, OilStationInfoComponent, - AddequipmentComponent, EditequipmentComponent,PlanAdminComponent, GetOutOfLineDetailsComponent], + AddequipmentComponent, EditequipmentComponent,PlanAdminComponent, GetOutOfLineDetailsComponent, WarningDetailsComponent], imports: [ diff --git a/src/app/pages/plan-admin/plan-admin.component.html b/src/app/pages/plan-admin/plan-admin.component.html index ab4456a..c5ce805 100644 --- a/src/app/pages/plan-admin/plan-admin.component.html +++ b/src/app/pages/plan-admin/plan-admin.component.html @@ -37,7 +37,7 @@ - + @@ -70,13 +70,13 @@
-
+
加油站名称
-
+
区域
@@ -94,13 +94,13 @@
-
- 自营 +
+
中化山东省淄博市第6加油站
-
+
山东-淄博
diff --git a/src/app/pages/plan-admin/plan-admin.component.scss b/src/app/pages/plan-admin/plan-admin.component.scss index 00604e8..8d23276 100644 --- a/src/app/pages/plan-admin/plan-admin.component.scss +++ b/src/app/pages/plan-admin/plan-admin.component.scss @@ -53,7 +53,7 @@ width: 100%; height: 32px; display: flex; - justify-content: space-around; + justify-content: flex-end; input { background: none; @@ -62,11 +62,12 @@ } .searchParams { - width: 28%; + width: 22%; } .btn { width: 5%; + margin-left: 16px; } } diff --git a/src/app/pages/plan-admin/plan-admin.component.ts b/src/app/pages/plan-admin/plan-admin.component.ts index 73538f4..8ecf84e 100644 --- a/src/app/pages/plan-admin/plan-admin.component.ts +++ b/src/app/pages/plan-admin/plan-admin.component.ts @@ -5,6 +5,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { NzContextMenuService, NzDropdownMenuComponent } from 'ng-zorro-antd/dropdown'; import { NzFormatEmitEvent, NzTreeComponent, NzTreeNode } from 'ng-zorro-antd/tree'; import { Router } from '@angular/router'; +import { NavChangeService } from 'src/app/service/navChange.service'; @Component({ selector: 'app-plan-admin', templateUrl: './plan-admin.component.html', @@ -13,7 +14,7 @@ import { Router } from '@angular/router'; export class PlanAdminComponent implements OnInit { validateForm!: FormGroup; @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; - constructor(private http: HttpClient, private toTree: TreeService, private fb: FormBuilder, private nzContextMenuService: NzContextMenuService, private router: Router) { } + constructor(private navChangeService: NavChangeService, private http: HttpClient, private toTree: TreeService, private fb: FormBuilder, private nzContextMenuService: NzContextMenuService, private router: Router) { } list: any = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ngOnInit(): void { this.validateForm = this.fb.group({ @@ -41,11 +42,22 @@ export class PlanAdminComponent implements OnInit { nodes: any = [] nzExpandAll = false getAllOrganization() { - this.http.get('/api/services/app/Organization/GetAll').subscribe((data: any) => { - data.result.items.forEach(element => { + this.http.get('/api/services/app/Organization/GetAll', { + params: { + SkipCount: '0', + MaxResultCount: '9999' + } + }).subscribe((data: any) => { + + data.result.items = data.result.items.filter((item, i) => { + return !item.isGasStation + }) + for (let index = 0; index < data.result.items.length; index++) { + const element = data.result.items[index]; element.key = element.id element.title = element.displayName - }); + } + this.nodes = [...this.toTree.toTree(data.result.items)] this.nzExpandAll = true }) @@ -53,6 +65,11 @@ export class PlanAdminComponent implements OnInit { look() { this.router.navigate(['/plan/petrolStation']) + + let obj = { + name: 'oilstation' + } + this.navChangeService.sendMessage(obj);//发布一条消息 } nzExpandedKeys: any = [] activatedNode?: NzTreeNode; diff --git a/src/app/pages/today-warning-admin/today-warning-admin.component.html b/src/app/pages/today-warning-admin/today-warning-admin.component.html index 5bead1f..117dfd3 100644 --- a/src/app/pages/today-warning-admin/today-warning-admin.component.html +++ b/src/app/pages/today-warning-admin/today-warning-admin.component.html @@ -1,6 +1,6 @@
- +
- -
-
+
预警级别
-
- 预警类型 -
-
- 违规信息 -
- 所属公司 + 预警类型
-
- 区域 +
+ 预警事件
- 站点 + 油站名称
- 摄像头 + 区域
-
- 违规时间 +
+ 预警时间
操作
-
- - +
+ + Ⅰ级 - - + + Ⅱ级 - - + + Ⅲ级 -
-
- 加油站违规 -
-
- 工作人员倚靠加油机或立柱 + + + Ⅳ级 +
- 中化北京分公司 + {{item.violation.violationType}}
-
- 北京-朝阳 +
+ {{item.violation.violationName}}
- 北京市第十九加油站 - 自营 - 加盟 + {{item.gasStation.stationName}}
- 加油区2号摄像头 + {{item.violateArea}}
-
- 2021-10-12 09:28:13 +
+ {{item.violateTime | date:"yyyy-MM-dd HH:mm:ss"}}
- +
- -
+ +
\ No newline at end of file diff --git a/src/app/pages/today-warning-admin/today-warning-admin.component.scss b/src/app/pages/today-warning-admin/today-warning-admin.component.scss index ac58c65..2d1bdf1 100644 --- a/src/app/pages/today-warning-admin/today-warning-admin.component.scss +++ b/src/app/pages/today-warning-admin/today-warning-admin.component.scss @@ -27,7 +27,7 @@ justify-content: space-around; .searchParams { - width: 22%; + width: 14.6%; } .btn { @@ -46,7 +46,10 @@ background-color: rgba(0, 0, 0, 0); width: 145%; } - + nz-range-picker { + background-color: rgba(0, 0, 0, 0); + width: 100%; + } } } diff --git a/src/app/pages/today-warning-admin/today-warning-admin.component.ts b/src/app/pages/today-warning-admin/today-warning-admin.component.ts index 230fa7d..51e5ec4 100644 --- a/src/app/pages/today-warning-admin/today-warning-admin.component.ts +++ b/src/app/pages/today-warning-admin/today-warning-admin.component.ts @@ -1,8 +1,17 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, ViewContainerRef } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Router } from '@angular/router'; import { HttpClient } from '@angular/common/http'; import { TreeService } from 'src/app/service/tree.service'; +import { NzModalService } from 'ng-zorro-antd/modal'; +import { GetOutOfLineDetailsComponent } from '../today-warning/get-out-of-line-details/get-out-of-line-details.component'; + +import * as moment from 'moment'; +import { NavChangeService } from 'src/app/service/navChange.service'; + +import 'linqjs'; + + @Component({ selector: 'app-today-warning-admin', templateUrl: './today-warning-admin.component.html', @@ -11,49 +20,110 @@ import { TreeService } from 'src/app/service/tree.service'; export class TodayWarningAdminComponent implements OnInit { validateForm!: FormGroup; - constructor(private http: HttpClient,private fb: FormBuilder, private router: Router, private toTree: TreeService) { } + constructor(private http: HttpClient, private fb: FormBuilder, private router: Router, private toTree: TreeService, private modal: NzModalService, private viewContainerRef: ViewContainerRef, private navChangeService: NavChangeService) { } ngOnInit(): void { this.validateForm = this.fb.group({ level: [null], type: [null], - company: [null], + event: [null], + organization: [null], area: [null], - site: [null], datePicker: [null] }); - this.yujingType() + this.warningType() this.getAllOrganization() } + //预警类型接口 - yujingTypes:any //预警接口数据 - yujingType(){ + warningTypes: any //预警接口数据 + warningTypesDetails:any + warningType() { this.http.get('/api/services/app/Violation/GetAllList').subscribe((data: any) => { - this.yujingTypes=data.result + this.warningTypesDetails = data.result + this.warningTypes = (data.result as any).groupBy((t) => { return t.violationType }); + }) + } + typeChange(e){ + this.warningTypes.forEach(element => { + if(element.key == e){ + this.warningTypesDetails = element } - ) + }); + this.validateForm.patchValue({ + event: null, + }); } + + defaultOrId: string //获取所有组织机构 - nodes:any = [] + nodes: any = [] getAllOrganization() { this.http.get('/api/services/app/Organization/GetAll').subscribe((data: any) => { data.result.items.forEach(element => { - element.key = element.code + element.key = element.id element.title = element.displayName }); this.nodes = [...this.toTree.toTree(data.result.items)] - console.log(this.nodes) + this.defaultOrId = JSON.parse(sessionStorage.getItem('userdata')).organization.id + this.validateForm.value.organization = this.defaultOrId + this.getEarlyWarningList() + }) + } + + + //获得预警列表 + list: any = [ + ] + totalCount: string //预警总数 + getEarlyWarningList() { + let ViolationIds = [] + if(this.validateForm.value.event){ + ViolationIds.push(this.validateForm.value.event) + } + if(this.validateForm.value.type && !this.validateForm.value.event){ + this.warningTypesDetails.forEach(item => { + item.id ? ViolationIds.push(item.id) : null + }); + } + let params = { + Level: this.validateForm.value.level, + ViolationIds: ViolationIds, + ViolateArea: this.validateForm.value.area, + organizationUnitId: this.validateForm.value.organization, + ViolateTime: this.validateForm.value.datePicker ? [moment(this.validateForm.value.datePicker[0]).format('YYYY-MM-DD'), moment(this.validateForm.value.datePicker[1]).format('YYYY-MM-DD')] : null, + SkipCount: '0', + MaxResultCount: '9999' + } + this.http.get('/api/services/app/ViolateRecord/GetAll', { + params: params + }).subscribe((data: any) => { + this.list = data.result.items + this.totalCount = data.result.totalCount + console.log('预警列表', this.list) + + let obj = { + name: '改变数量', + num: this.totalCount + } + setTimeout(() => { + console.log('走这里了') + this.navChangeService.sendMessage(obj);//发布一条消息 + }, 0); + }) } + + submitForm(): void { for (const i in this.validateForm.controls) { this.validateForm.controls[i].markAsDirty(); this.validateForm.controls[i].updateValueAndValidity(); } - - console.log(this.validateForm) + this.getEarlyWarningList() } + resetForm(e: MouseEvent): void { e.preventDefault(); this.validateForm.reset(); @@ -61,37 +131,33 @@ export class TodayWarningAdminComponent implements OnInit { this.validateForm.controls[key].markAsPristine(); this.validateForm.controls[key].updateValueAndValidity(); } + this.defaultOrId = JSON.parse(sessionStorage.getItem('userdata')).organization.id + this.validateForm.value.organization = this.defaultOrId + this.getEarlyWarningList() } - list: any = [ - { level: 1, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 2, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 3, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, name: '北京市第十九加油站', prop: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', company: '中化北京分公司', area: '北京-朝阳', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' } - ] - isVisible = false; - showModal(): void { - this.isVisible = true; - } - handleOk(): void { - console.log('Button ok clicked!'); - this.isVisible = false; - } - handleCancel(): void { - console.log('Button cancel clicked!'); - this.isVisible = false; - } - look() { - this.router.navigate(['warning/petrolStation']) + look(item) { + const modal = this.modal.create({ + nzContent: GetOutOfLineDetailsComponent, + nzViewContainerRef: this.viewContainerRef, + nzWidth: 1200, + nzBodyStyle: { + 'border': '1px solid #6d9cc7', + 'border-radius': '0px', + 'padding': '0px', + 'box-shadow': '0 0 8px 0 #fff', + 'background': '#000D21', + }, + nzComponentParams: { + data: item + }, + nzFooter: null, + nzOnOk: async () => { + + } + }); + const instance = modal.getContentComponent(); } } diff --git a/src/app/pages/today-warning-admin/warning-details/warning-details.component.html b/src/app/pages/today-warning-admin/warning-details/warning-details.component.html new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/today-warning-admin/warning-details/warning-details.component.scss b/src/app/pages/today-warning-admin/warning-details/warning-details.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/pages/today-warning-admin/warning-details/warning-details.component.spec.ts b/src/app/pages/today-warning-admin/warning-details/warning-details.component.spec.ts new file mode 100644 index 0000000..3e13d28 --- /dev/null +++ b/src/app/pages/today-warning-admin/warning-details/warning-details.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WarningDetailsComponent } from './warning-details.component'; + +describe('WarningDetailsComponent', () => { + let component: WarningDetailsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WarningDetailsComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WarningDetailsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/today-warning-admin/warning-details/warning-details.component.ts b/src/app/pages/today-warning-admin/warning-details/warning-details.component.ts new file mode 100644 index 0000000..bcb568b --- /dev/null +++ b/src/app/pages/today-warning-admin/warning-details/warning-details.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-warning-details', + templateUrl: './warning-details.component.html', + styleUrls: ['./warning-details.component.scss'] +}) +export class WarningDetailsComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.html b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.html index 993acf0..4227ace 100644 --- a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.html +++ b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.html @@ -3,21 +3,128 @@
- 违规截图 + 预警截图
- 违规视频 + 预警视频
+
-
- 违规截图 +
+ +
+ +
-
- 违规视频 +
+
+
\ No newline at end of file diff --git a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.scss b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.scss index 78ae625..7b55b3b 100644 --- a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.scss +++ b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.scss @@ -28,8 +28,9 @@ font-family: sybold; font-size: 16px; position: relative; - cursor: pointer; - margin: 0 18px; + cursor: pointer; + margin: 0 18px; + .border { position: absolute; bottom: -7px; @@ -58,4 +59,164 @@ flex: 1; box-sizing: border-box; padding: 18px; + overflow: hidden; + .imgbox { + display: flex; + width: 100%; + height: 100%; + + .imglist { + display: flex; + flex-direction: column; + width: 196px; + height: 100%; + overflow-y: auto; + box-sizing: border-box; + padding-right: 12px; + border-right: 1px solid rgba(145, 204, 255, 0.3); + + .imglisttitle { + font-size: 16px; + font-family: sybold; + margin-bottom: 16px; + } + + .img { + width: 178px; + height: 108px; + margin-bottom: 8px; + + img { + width: 100%; + height: 100%; + cursor: pointer; + } + } + } + + .bigimg { + flex: 1; + box-sizing: border-box; + padding-left: 13px; + + img { + width: 100%; + height: 100%; + } + } + } + + + .oilbox { + display: flex; + width: 100%; + height: 100%; + + .imgDetailsbox { + width: 280px; + height: 100%; + box-sizing: border-box; + padding-right: 12px; + border-right: 1px solid rgba(145, 204, 255, 0.3); + display: flex; + flex-direction: column; + // justify-content: center; + align-items: center; + + .bigimage { + width: 264px; + height: 264px; + border: 1px solid #FF4B65; + box-shadow: 0px 0px 12px #FF4B65; + opacity: 1; + border-radius: 0px; + // margin-top: 40px; + margin-bottom: 24px; + + img { + width: 100%; + height: 100%; + } + } + + h1 { + font-weight: bold; + font-size: 24px; + color: #FF4B65; + margin-bottom: 32px; + margin-top: 36%; + } + + h3 { + font-size: 18px; + font-weight: 400; + color: #FFFFFF; + } + } + + .flowpathbox { + flex: 1; + box-sizing: border-box; + padding-left: 73px; + position: relative; + + // border: 1px solid red; + .name { + color: rgba(145, 204, 255, 1); + font-size: 15px; + margin-bottom: 12px; + } + + .flowpathlist { + display: flex; + flex-wrap: wrap; + + .flowpathimgbox { + width: 160px; + height: 200px; + display: flex; + flex-direction: column; + + img { + width: 158px; + height: 158px; + border: 1px solid rgba(0,0,0,0); + cursor: pointer; + } + + span { + text-align: center; + margin-top: 6px; + } + } + + .arrowsbox { + width: 40px; + height: 200px; + display: flex; + justify-content: center; + + img { + width: 38px; + height: 38px; + margin-top: 65px; + } + } + } + + .leftimg { + display: block; + position: absolute; + left: 20px; + bottom: 76px + } + + .rightimg { + display: block; + position: absolute; + right: -3px; + top: 99px; + } + } + } } diff --git a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.ts b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.ts index 9b914cf..60540bf 100644 --- a/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.ts +++ b/src/app/pages/today-warning/get-out-of-line-details/get-out-of-line-details.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit,Input } from '@angular/core'; @Component({ selector: 'app-get-out-of-line-details', @@ -7,9 +7,16 @@ import { Component, OnInit } from '@angular/core'; }) export class GetOutOfLineDetailsComponent implements OnInit { + @Input() data:any + constructor() { } + + imgUrl:string + vedioUrl:string ngOnInit(): void { + this.imgUrl = this.data.violateImage + this.vedioUrl = this.data.violateVideo } diff --git a/src/app/pages/today-warning/today-warning.component.html b/src/app/pages/today-warning/today-warning.component.html index 6285804..cc6ecf4 100644 --- a/src/app/pages/today-warning/today-warning.component.html +++ b/src/app/pages/today-warning/today-warning.component.html @@ -1,6 +1,6 @@
- +
- 违规信息: {{item.content}} + 预警信息: {{item.content}}
摄像头: {{item.site}}
- 违规时间: {{item.time}} + 预警时间: {{item.time}}
diff --git a/src/app/pages/today-warning/today-warning.component.ts b/src/app/pages/today-warning/today-warning.component.ts index 08d17e0..5ca8c93 100644 --- a/src/app/pages/today-warning/today-warning.component.ts +++ b/src/app/pages/today-warning/today-warning.component.ts @@ -1,9 +1,9 @@ import { Component, OnInit, ViewContainerRef } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { HttpClient } from '@angular/common/http'; -import { TreeService } from 'src/app/service/tree.service'; import { NzModalService } from 'ng-zorro-antd/modal'; import { GetOutOfLineDetailsComponent } from './get-out-of-line-details/get-out-of-line-details.component'; +import { TreeService } from 'src/app/service/tree.service'; @Component({ selector: 'app-today-warning', templateUrl: './today-warning.component.html', @@ -52,18 +52,18 @@ export class TodayWarningComponent implements OnInit { } list: any = [ - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 2, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 3, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, - { level: 1, type: '加油区违规', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' } + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 2, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 3, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' }, + { level: 1, type: '加油区预警', content: '工作人员倚靠加油机或者立柱', site: '加油区2号摄像头', time: '2021-10-12 09:28:13' } ] @@ -83,7 +83,11 @@ export class TodayWarningComponent implements OnInit { 'box-shadow': '0 0 8px 0 #fff', 'background': '#000D21', }, - nzComponentParams: {}, + nzComponentParams: { + data: { + type: 1 + } + }, nzFooter: null, nzOnOk: async () => { diff --git a/src/app/service/navChange.service.ts b/src/app/service/navChange.service.ts new file mode 100644 index 0000000..b96032f --- /dev/null +++ b/src/app/service/navChange.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { Observable, ReplaySubject } from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class NavChangeService { + + constructor() { } + private _sendMessage: ReplaySubject = new ReplaySubject(1); + /** * 向其他组件发送信息 ** + * @param message 需要发送的信息 * + * @returns {Observavle} */ + + public sendMessage(message: any) { + this._sendMessage.next(message); + } + + public getMessage(): Observable { + return this._sendMessage.asObservable(); + } +} diff --git a/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.html b/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.html new file mode 100644 index 0000000..b1d07c8 --- /dev/null +++ b/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.html @@ -0,0 +1,18 @@ +
+ + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.scss b/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.ts b/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.ts new file mode 100644 index 0000000..a8b97d8 --- /dev/null +++ b/src/app/system-management/analysis-of-the-host/addcamera/addcamera.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { HttpClient } from '@angular/common/http'; +@Component({ + selector: 'app-addcamera', + templateUrl: './addcamera.component.html', + styleUrls: ['./addcamera.component.scss'] +}) +export class AddcameraComponent implements OnInit { + + validateForm!: FormGroup; + constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient) { } + + ngOnInit(): void { + this.validateForm = this.fb.group({ + name: [null, [Validators.required]], + code: [null, [Validators.required]] + }); + } + +} diff --git a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.html b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.html index 776d383..637c86d 100644 --- a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.html +++ b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.html @@ -15,8 +15,8 @@
+ [nzExpandedKeys]="defaultExpandedKeys" [nzSelectedKeys]='nzSelectedKeys' (nzClick)="nzClick($event)" + [nzTreeTemplate]="nzTreeTemplate" [nzExpandedIcon]="multiExpandedIconTpl">
@@ -38,13 +38,13 @@
- 加油站分析主机列表 + {{selectedOilStation ? selectedOilStation.displayName : '加油站'}} 分析主机列表 (请从左侧选择加油站)
+ nzTheme="outline">新增分析主机
@@ -57,14 +57,45 @@ - {{data.ip}} + {{data.hostIPAddress}} - 编辑 + 编辑 删除
+
\ No newline at end of file diff --git a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.scss b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.scss index bc0564a..b6dee8d 100644 --- a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.scss +++ b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.scss @@ -85,6 +85,7 @@ .hostListbox { flex: 1; margin-left: 26px; + overflow-y: auto; } .tablebox { diff --git a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.ts b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.ts index a10f11b..724ab45 100644 --- a/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.ts +++ b/src/app/system-management/analysis-of-the-host/analysis-of-the-host.component.ts @@ -6,6 +6,8 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { NzModalService } from 'ng-zorro-antd/modal'; import { NzMessageService } from 'ng-zorro-antd/message'; import { AddhostComponent } from './addhost/addhost.component'; +import { AddcameraComponent } from './addcamera/addcamera.component'; +import { EdithostComponent } from './edithost/edithost.component'; @Component({ selector: 'app-analysis-of-the-host', templateUrl: './analysis-of-the-host.component.html', @@ -24,7 +26,12 @@ export class AnalysisOfTheHostComponent implements OnInit { nzExpandAll = false; totalCount: string getAllOrganization() { - this.http.get('/api/services/app/Organization/GetAll').subscribe((data: any) => { + this.http.get('/api/services/app/Organization/GetAll', { + params: { + SkipCount: '0', + MaxResultCount: '9999' + } + }).subscribe((data: any) => { this.totalCount = data.result.totalCount data.result.items.forEach(element => { element.key = element.id @@ -43,30 +50,54 @@ export class AnalysisOfTheHostComponent implements OnInit { nodes: any[] = [] nzSelectedKeys: any[] = [] - selectedOilStation:any + selectedOilStation: any nzClick(event: NzFormatEmitEvent): void { console.log(event.node.origin); - if(event.node.origin.isGasStation){//如果点击的是加油站才生效 + if (event.node.origin.isGasStation) {//如果点击的是加油站才生效 this.nzSelectedKeys[0] = event.node.origin.id this.nzSelectedKeys = [...this.nzSelectedKeys] this.selectedOilStation = event.node.origin this.getHost() - }else{ + } else { this.message.info('只有加油站才可以增加主机'); } } //获得加油站的主机 - getHost(){ - + listOfData: any[] = []; + getHost() { + this.http.get('/api/services/app/EdgeDevice/GetAll', { + params: { + organizationUnitId: this.selectedOilStation.id + } + }).subscribe((data: any) => { + console.log('主机列表', data.result.items) + this.listOfData = data.result.items + }) } + + //获得加油站摄像头 + listOfDataCamera: any[] = []; + getCamera() { + this.http.get('/api/services/app/Camera/GetAll', { + params: { + organizationUnitId: this.selectedOilStation.id + } + }).subscribe((data: any) => { + console.log('摄像头列表', data) + this.listOfDataCamera = data + }) + } + + ngAfterViewInit(): void { } //新增分析主机 addHost() { + console.log(this.selectedOilStation) const modal = this.modal.create({ nzTitle: '新增加油站主机', nzContent: AddhostComponent, @@ -77,16 +108,14 @@ export class AnalysisOfTheHostComponent implements OnInit { if (instance.validateForm.valid) { await new Promise(resolve => { console.log('表单信息', instance.validateForm) - let body = { - // name: instance.validateForm.value.name, - // DisplayName: instance.validateForm.value.name, - // grantedPermissions: arr + hostIPAddress: instance.validateForm.value.ip, + organizationUnitId: this.selectedOilStation.id } - this.http.post('/api/services/app/Role/Create', body).subscribe(data => { + this.http.post('/api/services/app/EdgeDevice/Create', body).subscribe(data => { resolve(data) this.message.create('success', '创建成功!'); - // this.getAllRoles() + this.getHost() return true }) }) @@ -99,10 +128,96 @@ export class AnalysisOfTheHostComponent implements OnInit { const instance = modal.getContentComponent(); } edit(data) { + console.log(data) + const modal = this.modal.create({ + nzTitle: '编辑加油站主机', + nzContent: EdithostComponent, + nzViewContainerRef: this.viewContainerRef, + nzWidth: 288, + nzComponentParams: { + ip: data.hostIPAddress + }, + nzOnOk: async () => { + if (instance.validateForm.valid) { + await new Promise(resolve => { + console.log('表单信息', instance.validateForm) + data.hostIPAddress = instance.validateForm.value.ip, + this.http.put('/api/services/app/EdgeDevice/Update', data).subscribe(data => { + resolve(data) + this.message.create('success', '修改成功!'); + this.getHost() + return true + }) + }) + } else { + this.message.create('warning', '请填写完整!'); + return false + } + } + }); + const instance = modal.getContentComponent(); + } + delete(item) { + console.log(item) + this.modal.confirm({ + nzTitle: `确定要删除${item.name}这个主机吗?`, + nzOkText: '确定', + nzOkType: 'danger', + nzOnOk: () => { + this.http.delete('/api/services/app/EdgeDevice/Delete', { + params: { + Id: item.id + } + }).subscribe(data => { + this.message.create('success', '删除成功!'); + this.getHost() + }) + }, + nzCancelText: '取消' + }); + } + + //摄像头 + addCamera() { + console.log(this.selectedOilStation) + const modal = this.modal.create({ + nzTitle: '新增加油站摄像头', + nzContent: AddcameraComponent, + nzViewContainerRef: this.viewContainerRef, + nzWidth: 288, + nzComponentParams: {}, + nzOnOk: async () => { + if (instance.validateForm.valid) { + await new Promise(resolve => { + console.log('表单信息', instance.validateForm) + let body = { + organizationUnitId: this.selectedOilStation.id, + code: instance.validateForm.value.code, + name: instance.validateForm.value.name, + description: "", + } + this.http.post('/api/services/app/Camera/Create', body).subscribe(data => { + resolve(data) + this.message.create('success', '创建成功!'); + this.getCamera() + return true + }, err => { + return false + }) + }) + } else { + this.message.create('warning', '请填写完整!'); + return false + } + } + }); + const instance = modal.getContentComponent(); } - delete(data) { + editCamera(data) { + + } + deleteCamera(data) { } - listOfData: any[] = []; } diff --git a/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.html b/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.html new file mode 100644 index 0000000..b2ee9c5 --- /dev/null +++ b/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.html @@ -0,0 +1 @@ +

editcamera works!

diff --git a/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.scss b/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.ts b/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.ts new file mode 100644 index 0000000..b57a77c --- /dev/null +++ b/src/app/system-management/analysis-of-the-host/editcamera/editcamera.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-editcamera', + templateUrl: './editcamera.component.html', + styleUrls: ['./editcamera.component.scss'] +}) +export class EditcameraComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/system-management/analysis-of-the-host/edithost/edithost.component.html b/src/app/system-management/analysis-of-the-host/edithost/edithost.component.html index 25287ae..4e62039 100644 --- a/src/app/system-management/analysis-of-the-host/edithost/edithost.component.html +++ b/src/app/system-management/analysis-of-the-host/edithost/edithost.component.html @@ -1 +1,11 @@ -

edithost works!

+
+
+ + + + + + + +
+
\ No newline at end of file diff --git a/src/app/system-management/analysis-of-the-host/edithost/edithost.component.ts b/src/app/system-management/analysis-of-the-host/edithost/edithost.component.ts index 83c9af2..22fc01b 100644 --- a/src/app/system-management/analysis-of-the-host/edithost/edithost.component.ts +++ b/src/app/system-management/analysis-of-the-host/edithost/edithost.component.ts @@ -1,4 +1,7 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Input } from '@angular/core'; +import { NzModalRef } from 'ng-zorro-antd/modal'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-edithost', @@ -7,9 +10,14 @@ import { Component, OnInit } from '@angular/core'; }) export class EdithostComponent implements OnInit { - constructor() { } + @Input() ip: any + + validateForm!: FormGroup; + constructor(private modal: NzModalRef, private fb: FormBuilder, private http: HttpClient) { } ngOnInit(): void { + this.validateForm = this.fb.group({ + ip: [null, [Validators.required]] + }); } - } diff --git a/src/app/system-management/navigation/navigation.component.html b/src/app/system-management/navigation/navigation.component.html index c32cf4d..43a4f69 100644 --- a/src/app/system-management/navigation/navigation.component.html +++ b/src/app/system-management/navigation/navigation.component.html @@ -22,7 +22,7 @@ - Hey,欢迎登录中化油站可视化智能安全管理系统 + Hey,欢迎登陆加油站可视化智能安全管理系统 diff --git a/src/app/system-management/navigation/navigation.component.ts b/src/app/system-management/navigation/navigation.component.ts index 6604860..d5ca598 100644 --- a/src/app/system-management/navigation/navigation.component.ts +++ b/src/app/system-management/navigation/navigation.component.ts @@ -13,6 +13,6 @@ export class NavigationComponent implements OnInit { ngOnInit(): void { } signOut() { - this.router.navigate(['/plan']) + this.router.navigate(['/login']) } } diff --git a/src/app/system-management/organization/addor/addor.component.html b/src/app/system-management/organization/addor/addor.component.html index b8a3678..a56e67b 100644 --- a/src/app/system-management/organization/addor/addor.component.html +++ b/src/app/system-management/organization/addor/addor.component.html @@ -7,13 +7,13 @@ - + diff --git a/src/app/system-management/organization/addor/addor.component.ts b/src/app/system-management/organization/addor/addor.component.ts index c853619..177ff23 100644 --- a/src/app/system-management/organization/addor/addor.component.ts +++ b/src/app/system-management/organization/addor/addor.component.ts @@ -15,7 +15,7 @@ export class AddorComponent implements OnInit { ngOnInit(): void { this.validateForm = this.fb.group({ name: [null, [Validators.required]], - code: [null, [Validators.required]], + // code: [null, [Validators.required]], isGasStation: [false] }); } diff --git a/src/app/system-management/organization/editor/editor.component.html b/src/app/system-management/organization/editor/editor.component.html index ef277b3..d2a5386 100644 --- a/src/app/system-management/organization/editor/editor.component.html +++ b/src/app/system-management/organization/editor/editor.component.html @@ -7,13 +7,13 @@ - + diff --git a/src/app/system-management/organization/editor/editor.component.ts b/src/app/system-management/organization/editor/editor.component.ts index 6069106..a154f55 100644 --- a/src/app/system-management/organization/editor/editor.component.ts +++ b/src/app/system-management/organization/editor/editor.component.ts @@ -17,7 +17,7 @@ export class EditorComponent implements OnInit { ngOnInit(): void { this.validateForm = this.fb.group({ name: [null, [Validators.required]], - code: [null, [Validators.required]], + // code: [null, [Validators.required]], isGasStation: [] }); this.datacopy = JSON.parse(JSON.stringify(this.data)) diff --git a/src/app/system-management/organization/organization.component.ts b/src/app/system-management/organization/organization.component.ts index 15b2533..e071506 100644 --- a/src/app/system-management/organization/organization.component.ts +++ b/src/app/system-management/organization/organization.component.ts @@ -36,7 +36,12 @@ export class OrganizationComponent implements OnInit { nzExpandAll = false; totalCount: string getAllOrganization() { - this.http.get('/api/services/app/Organization/GetAll').subscribe((data: any) => { + this.http.get('/api/services/app/Organization/GetAll',{ + params:{ + SkipCount:'0', + MaxResultCount:'9999' + } + }).subscribe((data: any) => { this.totalCount = data.result.totalCount // console.log('组织机构',data.result.totalCount) data.result.items.forEach(element => { @@ -98,7 +103,7 @@ export class OrganizationComponent implements OnInit { await new Promise(resolve => { let body = { parentId: node ? Number(node.key) : null, - code: instance.validateForm.value.code, + // code: instance.validateForm.value.code, displayName: instance.validateForm.value.name, isGasStation: instance.validateForm.value.isGasStation } @@ -142,7 +147,7 @@ export class OrganizationComponent implements OnInit { let body = { id: node.origin.id, parentId: node.origin.parentId, - code: instance.validateForm.value.code, + // code: instance.validateForm.value.code, displayName: instance.validateForm.value.name, isGasStation: instance.validateForm.value.isGasStation } diff --git a/src/app/system-management/system-management.module.ts b/src/app/system-management/system-management.module.ts index d0fc6ae..77f63bb 100644 --- a/src/app/system-management/system-management.module.ts +++ b/src/app/system-management/system-management.module.ts @@ -30,8 +30,10 @@ import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; import { AnalysisOfTheHostComponent } from './analysis-of-the-host/analysis-of-the-host.component'; import { AddhostComponent } from './analysis-of-the-host/addhost/addhost.component'; import { EdithostComponent } from './analysis-of-the-host/edithost/edithost.component'; +import { AddcameraComponent } from './analysis-of-the-host/addcamera/addcamera.component'; +import { EditcameraComponent } from './analysis-of-the-host/editcamera/editcamera.component'; @NgModule({ - declarations: [OrganizationComponent, UserComponent, RoleComponent, NavigationComponent, AdduserComponent, EdituserComponent, AddroleComponent, EditroleComponent, AddorComponent, EditorComponent, AnalysisOfTheHostComponent, AddhostComponent, EdithostComponent], + declarations: [OrganizationComponent, UserComponent, RoleComponent, NavigationComponent, AdduserComponent, EdituserComponent, AddroleComponent, EditroleComponent, AddorComponent, EditorComponent, AnalysisOfTheHostComponent, AddhostComponent, EdithostComponent, AddcameraComponent, EditcameraComponent], imports: [ CommonModule, SystemRoutingModule, @@ -53,7 +55,7 @@ import { EdithostComponent } from './analysis-of-the-host/edithost/edithost.comp NzTreeSelectModule, NzCheckboxModule ], - entryComponents :[AdduserComponent,EdituserComponent,AddroleComponent,EditroleComponent,AddorComponent,EditorComponent,AddhostComponent,EdithostComponent] + entryComponents :[AdduserComponent,EdituserComponent,AddroleComponent,EditroleComponent,AddorComponent,EditorComponent,AddhostComponent,EdithostComponent,AddcameraComponent,EditcameraComponent] }) export class SystemManagementModule { } diff --git a/src/app/system-management/user/adduser/adduser.component.ts b/src/app/system-management/user/adduser/adduser.component.ts index 290dbbc..4320adf 100644 --- a/src/app/system-management/user/adduser/adduser.component.ts +++ b/src/app/system-management/user/adduser/adduser.component.ts @@ -45,7 +45,7 @@ export class AdduserComponent implements OnInit { getAllOrganization() { this.http.get('/api/services/app/Organization/GetAll').subscribe((data: any) => { data.result.items.forEach(element => { - element.key = element.code + element.key = element.id element.title = element.displayName }); this.nodes = [...this.toTree.toTree(data.result.items)] diff --git a/src/app/system-management/user/edituser/edituser.component.html b/src/app/system-management/user/edituser/edituser.component.html index dc1a983..f7084b7 100644 --- a/src/app/system-management/user/edituser/edituser.component.html +++ b/src/app/system-management/user/edituser/edituser.component.html @@ -16,7 +16,7 @@ - + diff --git a/src/app/system-management/user/user.component.ts b/src/app/system-management/user/user.component.ts index eabc922..18ac3df 100644 --- a/src/app/system-management/user/user.component.ts +++ b/src/app/system-management/user/user.component.ts @@ -76,7 +76,7 @@ export class UserComponent implements OnInit { let body = { userName: instance.validateForm.value.account, name: instance.validateForm.value.name, - organizationId: Number(instance.validateForm.value.organization), + organizationUnitId: Number(instance.validateForm.value.organization), roleNames: instance.validateForm.value.role, phoneNumber: instance.validateForm.value.phonenum, isActive: true @@ -108,6 +108,7 @@ export class UserComponent implements OnInit { //编辑用户 editUser(data): void { + console.log(data) const modal = this.modal.create({ nzTitle: '编辑用户', nzContent: EdituserComponent, @@ -121,14 +122,15 @@ export class UserComponent implements OnInit { if (instance.validateForm.valid) { await new Promise(resolve => { let body = { + id:data.id, userName: instance.validateForm.value.account, name: instance.validateForm.value.name, - organizationId: instance.validateForm.value.organization, + organizationUnitId: instance.validateForm.value.organization, roleNames: instance.validateForm.value.role, phoneNumber: instance.validateForm.value.phonenum, isActive: true } - this.http.post('/api/services/app/User/Create', body).subscribe(data => { + this.http.put('/api/services/app/User/Update', body).subscribe(data => { resolve(data) this.message.create('success', '创建成功!'); this.getAllUsers() diff --git a/src/app/ui/tabbar/tabbar.component.html b/src/app/ui/tabbar/tabbar.component.html index cb138f4..267f8da 100644 --- a/src/app/ui/tabbar/tabbar.component.html +++ b/src/app/ui/tabbar/tabbar.component.html @@ -18,7 +18,7 @@
  • 基本信息
  • 器材信息
  • -
  • 系统管理
  • +
  • 退出系统
diff --git a/src/app/ui/tabbar/tabbar.component.ts b/src/app/ui/tabbar/tabbar.component.ts index 87f7986..9b62cba 100644 --- a/src/app/ui/tabbar/tabbar.component.ts +++ b/src/app/ui/tabbar/tabbar.component.ts @@ -21,10 +21,7 @@ export class TabbarComponent implements OnInit { setInterval(() => { this.getTime() }, 1000); - this.surname = JSON.parse(sessionStorage.getItem('userdata')).surname - // this.http.get('/api/services/app/Session/GetCurrentLoginInformations').subscribe((data: any) => { - // this.surname = data.result.user.surname - // }) + this.surname = JSON.parse(sessionStorage.getItem('userdata')).name } //获得时间 diff --git a/src/assets/images/left.png b/src/assets/images/left.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb4fc09be341b2cbfce7c8ca850f6fa7d1cb3f5 GIT binary patch literal 2175 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 R{GKQRR1`HIRLNV1{0|Of^mG6K literal 0 HcmV?d00001 diff --git a/src/assets/images/right.png b/src/assets/images/right.png new file mode 100644 index 0000000000000000000000000000000000000000..0342bf4898e35254a18a366c2b5edbc9437dcab6 GIT binary patch literal 2199 zcmV;I2x#|-P)IK8ODF-e1H7eah$YWTc`@#%EUzxSG_{wA{Ph=i5ny;rXh9WrrWe4Z3vJiK9AnJR(acFdt|OcsmRXA*#J?@Y}kCGu(RJTg40wU^oc0 z2(|LIjEvj?fm`I!iF5}vi0Uw+kw?TnB6VAr#ib_@a$^gmn_}$c$C!KrlaZOk%qFt* zY}|%G7w~R*fapZpf)2~b^dZFBYe)+`_K{k)2}~no3Bz^pifBh+ZZy#TI&>jKTOz~T z(CtjzRW{})&@B_2U>oiAh=Bnpk05QNo0CZW0HWVTHpg&MA6f7+5>hphrcEMKh{iYp zIv1eoSJAmVs#-$%QH#iiGCIq~2xi6~cj%3|1UlevMqLbmm;oLj*LujXieteBO`OET z@#EIBN^pGH%7PJC7)EMLtkIrB8mB1VC5?U3T!gCkkOob3Uj;ok8;eV7VFE3wNNdVU zAJRsAZ4WXm;KU7_AlCxyCAf))D;sz^kK-s@rEpw{?ASQfXvaY*Me0ftElE^F5=atD zq*x=JE}>?!F@UC1trju(Yyvl>W8W9shLIM0Si$Kn;zYSD(r%pMx<0O>@DhV3HJ^)CP++S_tup_v5sKQTQtMI;-q$VZCp$SA7 zn!=-DUmHP`G)Q_J5-X|FG-|_E^w7aBUo7B>E&?-ECzDQj19G~A(^JQ-D?Cr*IRPG! zBPNGWE_ZQ8Q(B z9x2@<(9-{`=m*VAF1`h2M0Vu|@8kEt(b0qtK3`-PAg?PfKXs8;4{YWej@6VzZ1LIb z+7AU8f=I)4P4wz@4(`9fNu#Mrr~*|js96$eN=QIc)rk8y5QkOLtUCQ0&Gsx4HX^gS zuDJw2UKquxhPe3>o~V(dhrlG{T}k2l_c0tu4*x6S-R*sR#{!;8`Om}S{Cem?2CZyz z(i(%T3`q&bV7*LiprPSRgEP-x<=|M#We28#X_Hd3M5Iedm55%VWC*Gu22P`S{e8vAqkVkag1nM4{+09m?$kp(?b!?nu+JHR zc8F~Flp!la4Fi*k%8OI%J5uHE7%CX14OE?kdeTd%t3>^VI4qEkUO>_D!eSZd5O62( z8Rh3YewrorhH8sgbpLE6tw;1`R2P}cDh^?Q(u>>Y2@I^m49g}xFdX%Opp!dfg z;dr8X^SzkS$JX*ho4~|Z$9U`1CwSyeBxIvswWd}uk;26kCN*)Y*?*wIiy480hA7aq zKG-<1f&}(#;J6VSABh{-5vZy~Ty8U0d`)0;eo$|+|*?(ub- z0aq~j!wFt_?xQ^2C!ybMk+5>I)yLNU8ycom3%HexQq;y3zZ|M_y1R^ef?AZLao1&Z zV3C9DGXcY&^f_5G3>#Wyv|lpyi|f3wYaN4YB&>6xWDhd|T0l+R1aD0%1s|NO^3u5G z;>3^SzRb>5=H7 zWW6O|53XrTKxZ;a8=9ksr#Z6nt%U6xTV2MAG;=%Gu-6q3w~gz;wUae|G?q}#nmMu3 z&D>1_OK+!b8{O53+IIR2C0=g(Lj{sk2XF8ah6rdXO+(6g+UZUw+L;NK)=pc;wK~!{ z)7Vl68iV`kJcmE#QB4fbzggvPvj&=!NCeq1lMOd3G|nayuNHq8?Rix>GC282Nvq+3wBhi(~AhOR;B?rtO{9Vt<- z?|ohOTi;seJg4{ioxRQ<`|MaNw9lfx|eU|Mi~!Y|}x@$=9#7^GC6ZJd;3E6DliK9_3_w%6@VcFuT%&`h8uO4@UB4}EeMcIGf@!8poAo%D~766Zf&EoL2PzMPer zG=45WEuO!4yvRuUSTL=swYBQU-Qn-N-~MC9tKxBpi|AY4J^PFht4-uqvYcPmctA-| zSHB-@UDfXzR2tM zmma5!`0H3mxDA{q)HI}h^IILX2q!cAQk+ply`4b-WuA`!!h+oher}V%+PZLL2rgL_ zwBzrOW7+k> zuO-3aOnRkWqJsW2E`Hjat?|pVb878IT-Yhairu|~1O8T$9sYaxn~4RP&qhf?URJq; zGIWKcM-6ZJw$v2tpeWuH5qP{`IHegv=}B}Cw^}LgE@P8D|1=FSb&EFcG-=Y$)$(eL zuO3g%JKd~eT3HY~`AnD}u+my&-t&^k2EtynLNRkE;p)hYx)U(#=6dLR#ooHyS0dW# zF$sA4a>7axSfSChz^(g}QycG+lZS7^Q7}nEeL-*zP`U-E&DaEkoWv}WlY7$}ra9x? z9NyzWR(iEYlk-eg7@*=C&$)M=QbO}q?@H3G%AX-SpZT4M zEN*$r5y|kt2aEyCs^h{1R(GUjC^`d{PexS>Mo9w>pdqUAM78B0Stw~W(;Q^v*37>B zlgsm(Z}Sdq(dSzgq{mOQ0KPxp#fAaP<+LICr)ocJh9(MCRZW+MrY927y9g15#u`ajP&baWsvSgiHCz2C66p6W+m*fLJ?p6tTMsNl!sI(Jz`K7*UJaj)Osaj0=|&lWUSj;Qxg+kkXOqzS~i zq2J)KI{38qQ%Qe3`RJ&V2*{_q{Iq*!X@Q9RK-7*vGi7q%0g1bdTzj<2J-JKDD_;7W zJ^{o!&b6F%s>fBwGHjgWp2e1e*qCeY&5XC6((KZT@8ea%j`{JaWd`z@>G9MMsuo$J z+mIqFC;9+b-05COIjjro*D%{JSA!UZ@%63BUq=F09{4J3V=%+zW6vE~|_uOD2m zCJ!6-nH1DKopGZ@vix<_ZN_HL6s%EB*dV?UGQA%Ftysg|17GSD5aHJ7siUp~zI&-^zHq0%BCDHXd znn)%4x|p|<{mlvYZT~neWNTAC$N~#j5h(0R5Ry>Oc`hZ9kQ!e?Df5VhIMsFc)R^lQ ztpLMNvpml)wRqYeAVBv~s9G7@ig&WBa44zd>AD+D?60PrAQZ9ybNIT|kmGipaZkJ` zfjIng1hiRSFqCn+u0ISE{(`9H!IO$DQuvuYU|-(3eQTu_E1IF|XU!Lg-bUAQukJC) z%T7*Xc{06?b@M+XI!3uPekqYSitnIGQS3nCuT5U8e2tEXO#L;M;j6Zj5Q}xRUx~!K z@CDhbiuRw9WF&GAHHLE$yX&hx@_@&-1-9MSZ$yv2jdx9EW;@IZcNILYs@JA$_h*T+q54PZ9J=2M->@MAXgNYgkJ4N^Cg(FJ~}mv z`|?{Bg4pJ@w$FDdYs^=5aH-~wais%|D8HOpJG$0E{ZK2p^Ut@as*8 z9K%VkTd<@>il4lieVAn#BR*636ir^VtOHYyIWbIOsIouaDwx1mW+8@q`Ky#$`XUQS zN#G(F^gnYeP;qCTQ~KKi8!@y)*dR^{0hf4#qlb@;*W^YKS|vOlkB&s>RTe+_6iAJV zO)Elz;%_Gqv#EK1z!UZ;*oeF{qHeqC1lcRvBrBDm^2tQvFOa>a{~7>VNHn{6O^Otg ziQoPgwyz`Mf{6@H7{j1z$oS|j?*4beSrJRZ>C(SwrBx*n`g`mjAUQLv|EhHrE99d3i}_@tu=roTZTl+( zBfK#$a^gI7G=VL zV#`Hsy`#Lq**&9wCBqhHT&Y`1D+SpJ;WglMB1_Er^X?Xx?H1guU;fs$PqB;J=ApF- zra(=B1d|H;ftf_^>?n=iB;DCW3L9_$S00aA?Z!4zp_^nDT6c2*sIpY%6s_{XTWw=n zwLmu*u&!JNTo=8A;mxzDlq_`$@RR>|}9<$SPs0IoeP*(<)58U*u7* zt7?gycM%kq(ImUGKcW%5weT$xTkaK4*a5@eIJ9@g_o;{+d#>{)WbkI@i zDmiipd{k>AE6={lJ}0Vo7z2_#j%`3Y<=>A9C5+2vKaDP??~?-u-_R;RHE~k#fItB$ z5-%bPhUAQAqQx{Lhr=Mfj{8qcp;#3q7rAx_v4v&ol+)Euh#+X}6IH$M3dZ#ZG{ww) zzi(KtPT$z9yqz}3{n@_lv9A-zA&$qDQVn%N! zulUBZ>6_m{;B(gGaQOZO3e2+7=K4|bNJ?Q&*fK@kes^Q_1muL58Aix2SPP|d)q5D zAlJMxE60)Mb2$s~<*}pp>reILiBTgHy7JjW)Mc9mH-++dhvqpe;!ZK8lawA819EaX zUQ3~eG7@~JPQavK_cT2{?X;5?(UWbwRTcp(sTsympB!o1Uj8bf(tPe0F3DnXj+hYJ z_43P$P6YDI$Bw$FufTMmEf)9z)4wfaTbUW*@LL%_`bbI<{pKteU$Ae=SjV)gzBJuY z!VqK-Wg%7@w9MmkrFHfTqG_;Eq~C(pO?ei`#+b^z-ZHt~*vTR6Nd${a;v1)o5+Czs zZmUl2#VZ*3GNxtAx5`da(zx%#R~T#8P?dG}S%L)y&yz}GY}gU;Ccj7J*ywiV;fB9_ zk6E@?bwc1BbdGn7ceq!=cGS>?Q*>}MJmY7m!@Xv&2R~Pi_c<8~!E~Dk5|SyC1^xRu z&jOB-Nf!qU!@n4a>>ZO6gCBcG1W$90vnR!~kV!^nuX`OBcB5N_ zr{2ra2VOfJ_Hz3hS660V1!j zwG9A3Bduq$@?bHd19s_D=*6WuJ46x9gtb1ogO(g`<05hDiu|c3nwTr1^5G;WLE646 z>HED%b)cnR7yr3C22G7~_9yU`?)@h^l+J(%8QP_%(3q8J$f7tte*6Tm;sUKpqw}JP zliV`jlCL`3CPk`~6gxIwPDfavSDtcO4)|p~x&>HitIL$(*ElI*3u87m#aC4OOy5f* z9t%A-sZamolLMpuj^Ok)@0NxP1Km`nK8IkRglMsGOL1Dx0)4+sF-EvPtBOkKVSw5Y zryv`W!}bZtoOI0jOrH=TJKCY`Z6zyYV|p2v=Jza6t~BK{=HxN>G4)0rWGh1zHl489 z*~*qLidz!#wOKIA+U_x6{(IeSfq_T4qjr047=VXPdCb($iz`ytdgmA>v}M}oGw3>J z#(Qj~;eV+8%3sm1eLpChF89v!Fw-@Z$&y?(HeNvNf1x+I)NCm|hm|{eqG=)OU2_ z=NUtLtCPGcyELZ1Ta0^yGd90SmJX&4N9sWDNxI9qzc=+sOs~PM;rDvz+eVYTOL*`x zdLI528WON|7+t$G>N_ZVC(JwOlR7N}>J;i$@p0@dHlaLgZDd z-Z9)e%$8QDoRs*XA+5ZaiRsHh*`MFDhUYHpL2S?X#hpI`uBPYmXoRsI3ZfuYldP}u zKV+S|6Axs-t*Uf0nTe@Mdw-kjVgi}r7%aYFkYl=xIyBGj2P9VkEv}B0GQ#1 zRD(7HJ8prC=uZyu{pSM2LubB{YXgW)JG7Ds zC^8Ed3Ka06`QwL)vuGz$XXy3I4;-VcP|Cuw>hnhGZp98$SK1?AY^GY~KKTUFt)}MI zTKIn8eP=jrrRNJZK~8?y@r0Zok@!oy59xm0n6AJQpuzBsrC~aVo!P}wHj`5Y8cXto zOf4R|NvdrNdAO#3{mhwv!SRtI}1-Z)I8TB zY=?w)fWCb0tkn$brA57wWV=w4b7*y_l%)GO+7+zI;|(HlF1 zyG3S&{GLI-+>I+{wBV)kh3Eza!RP~s!S3Rh2KSh$4i)a@FgyJA& z(q_#kVZqRY&F|o>++bqA*DY|$uV{eU7!q|pN^`drv^bB~f4tm%tc^x@%6uNBqbruK zb8NVw+{Y2df^*)IoU$zD@^8|{%im~(Bw`bNafA2Xa;K@ohs)nzRUTiG)q6%SI~N#f z7yOe?%ZUyv3Tdxb6wnxMdSqdh+DE3qfoXKV+0|XCM7I%7y01BvGZsL*beW01$P_7_ zx4WDf(KxJ=+CKU`yLSHe&v*Xyk?~4TC$vq7%FI|Hp!s3#!wo+cX|KSxeF|l2z9_fr tI@ML1ZrdF1?L?vwsgtF(T>oEBsue307uG8C{^T&R)K#=WwMsT&{{ac4UjzUE literal 0 HcmV?d00001 diff --git a/src/assets/images/warning1.png b/src/assets/images/warning1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd769fe5ece32ecdd83247af7cec5868e0423717 GIT binary patch literal 7105 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/warning2.png b/src/assets/images/warning2.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c23733c587c562c58bff443dd472b34c091860 GIT binary patch literal 7302 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