邵佳豪 5 years ago
parent
commit
ab09b35c52
  1. 8
      src/app/app-routing.module.ts
  2. 2
      src/app/app.component.ts
  3. 2
      src/app/http-interceptors/base-interceptor.ts
  4. 2
      src/app/is-login.service.ts
  5. 2
      src/app/navigation/navigation.component.html
  6. 4
      src/app/navigation/navigation.component.scss
  7. 54
      src/app/pages/login/login.component.html
  8. 149
      src/app/pages/login/login.component.scss
  9. 63
      src/app/pages/login/login.component.ts
  10. 8
      src/app/tabbar/tabbar.component.html
  11. 2
      src/app/tabbar/tabbar.component.ts
  12. 1
      src/app/ui/all-file/all-file.component.scss
  13. 1
      src/app/ui/login/login.component.ts
  14. BIN
      src/assets/images/loginBackground.jpg

8
src/app/app-routing.module.ts

@ -11,13 +11,19 @@ import {AuthGuard} from './auth.guard'
const routes: Routes = [
{path:'',redirectTo:'login',pathMatch:'full'},
{
path:'',
path:'home',
component:NavigationComponent,
canActivate: [AuthGuard],//守卫验证
children:[
{path:'',loadChildren:() => import('./ui/ui.module').then(m => m.UiModule)}
]
},
{
path:'login',
component:LoginComponent,
},
];

2
src/app/app.component.ts

@ -28,12 +28,10 @@ export class AppComponent {
}).subscribe((data:any) => {
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.isLogin.isLogin = true
this.token.startUp()
})
} else {
sessionStorage.clear()
this.isLogin.isLogin = false
this.token.delete()
}

2
src/app/http-interceptors/base-interceptor.ts

@ -46,7 +46,7 @@ export class BaseInterceptor implements HttpInterceptor {
// 用户认证失败返回登录页
if (error.status === 401||error.status === 614) {
sessionStorage.clear()
this.isLogin.isLogin = false
this.router.navigate(['/login'])
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000

2
src/app/is-login.service.ts

@ -8,7 +8,7 @@ export class IsLoginService {
constructor(private http: HttpClient) { }
isLogin:boolean = false; //登录状态
isDownloading:boolean = false; //下载状态
downloadProgress:number = 0;//下载进度

2
src/app/navigation/navigation.component.html

@ -23,7 +23,7 @@
(mouseleave)="liLeave(item)"
>{{item.name}}
<h4 class="editli" [ngClass]="{'editlihover': item.id === hoverDataBank}"
*ngIf="islogin.isLogin && item.name != '法律法规' && item.name != '消防知识' && item.name != '装备车辆' && item.name != '设备设施'">
*ngIf="item.name != '法律法规' && item.name != '消防知识' && item.name != '装备车辆' && item.name != '设备设施'">
<span><mat-icon class="editicon" (click)="editDataBankName($event,item)">edit</mat-icon></span>
<span><mat-icon class="deleteicon" (click)="deleteDataBank($event,item)" style="color: #e02626;">delete</mat-icon></span>
</h4>

4
src/app/navigation/navigation.component.scss

@ -220,3 +220,7 @@ mat-sidenav{
margin: 0 5px;
}
}
.example-sidenav-content{
height: 100%;
overflow: hidden;
}

54
src/app/pages/login/login.component.html

@ -1,52 +1,32 @@
<div class="login">
<div class="loginbox">
<div class="content">
<div class="loginBox">
<h1 class="header">指挥长 (员) 战术战法培训系统</h1>
<div class="intro">
<p>数据采集管理平台</p>
<!-- <span>
数字化预案编制管理应用平台集重点单位的数字化预案资源的管理、分析及调用为一体,可实现辖区内预案使用的高效化、集约化、统一化、标准化管理。同时,可将消防现有的三维预案、图片式预案、卡片式预案、二维预案、视频预案等接入至系统中进行更加全面、真实、直观、生动的展示各项单位预案数据,方便进行预案资源调用,更好的服务实战指挥。
</span> -->
</div>
<div class="card">
<div class="loginImg">
<img src="../../../assets/images/login.gif">
<div class="center">
<form (ngSubmit)="onSubmit(form.value)" #form="ngForm" class="example-container">
<p class="cardheader">登录</p>
<div class="input">
<mat-icon class="icon">account_box</mat-icon>
<input id="name" name="name" required ngModel placeholder="请输入账号">
</div>
<mat-card>
<form (ngSubmit)="onSubmit(form.value)" #form="ngForm" class="example-container">
<mat-icon class="icon">account_box</mat-icon>
<div class="input">
<mat-icon class="icon2">lock</mat-icon>
<mat-form-field>
<input matInput id="name" name="name"
required
ngModel #name="ngModel" placeholder="请输入账号">
</mat-form-field>
<input id="password" name="password" type='password' required ngModel placeholder="请输入密码">
</div>
<mat-form-field>
<input matInput id="password" name="password" type='password'
required minlength="8"
ngModel #password="ngModel" placeholder="请输入密码">
</mat-form-field>
<div class="forget">
<label (click)='forget()'>忘记密码?</label>
</div>
<div *ngIf="errmsg" class="alert-danger">
{{errmsg}}
</div>
<a href="javascript:void(0);" (click)='open()'>
忘记密码?
</a>
<button type="submit" [disabled]="!form.form.valid" class="loginbtn"mat-button>登录</button>
</form>
<div class="website">
<p>北京安信科创有限公司提供技术支持和维护</p>
</div>
</mat-card>
<button type="submit" [disabled]="!form.form.valid" class="loginBtn" mat-raised-button color="primary">登录</button>
</form>
</div>
</div>
<p class="footer">Copyright 2019 北京安信科创软件有限公司出品</p>
</div>

149
src/app/pages/login/login.component.scss

@ -1,115 +1,88 @@
.login {
.content {
width: 100%;
height: 100%;
// background: url('../../../assets/images/bg_login.jpg');
.loginbox {
width: 100%;
height: 100%;
background-color: #000;
background: rgba(0,0,0,0.5);/*盒子背景透明*/
position: relative;
}
max-height: 100%;
background: url('../../../assets//images/loginBackground.jpg');
background-repeat:no-repeat;
background-size:100% 100%;
-moz-background-size:100% 100%;
}
.intro {
width: 35%;
position: fixed;
top:35%;
left: 15%;
p {
font-size: 36px;
color:white;
margin-bottom: 35px;
}
span {
font-size: 16px;
color:white;
opacity: 0.5;
}
.loginBox {
margin: 0 auto;
width: 40%;
text-align: center;
box-sizing: border-box;
padding: 8% 0;
.header {
font-size: 34px;
font-weight: 650;
font-family: 'NSimSun';
}
.card{
width: 460px;
height: 100%;
background-color: #fff;
position: absolute;
right: 0;
.center {
padding: 100px 0;
width: 50%;
box-sizing: border-box;
margin: 0 auto;
}
}
.example-container {
display: flex;
flex-direction: column;
.footer {
width: 100%;
}
.loginbtn {
margin-top: 25px;
height: 35px;
background-color:#039be5;
border-radius: 15px;
color: #fff;;
}
.mat-card {
box-shadow: 0 0 0;
margin-top: 140px;
text-align: center;
position: fixed;
bottom: 35px;
color: #858688;
font-size: 14px;
}
.applyfor {
font-size: 16px;
a {
color: #039be5;
}
}
.website {
font-size: 14px;
text-align: center;
margin-top: 60px;
// 表单内部样式
.forget{
margin: 30px auto;
label {
margin-left: 80%;
box-sizing: border-box;
font-size: 14px;
color: #2196f3;
cursor:pointer;
}
}
.alert-danger {
margin-bottom: 30px;
text-align: left;
font-size: 14px;
color: red;
}
.cardheader{
font-size: 26px;
font-weight: 500;
margin-top: 20px;
}
.mat-card {
margin-top: 10px;
padding-left: 20px;
}
.mat-form-field {
padding-left: 20px;;
}
.loginImg {
margin-top: 90px;
text-align: center;
.loginBtn {
width: 100%;
}
.mat-input-element {
//input + 字体图标
.input {
width: 100%;
margin: 30px auto;
position: relative;
input {
width: 90%;
border-radius: 5px;
border: 1px solid #999;
height: 36px;
padding-left: 30px;
}
}
.mat-card .example-container .icon {
.icon {
width: 24px;
color: #666;
color: #B5BBBC;
font-size: 24px;
position: absolute;
top:36px;
left: 15px;
top: 7px;
left: 8px;
}
.mat-card .example-container .icon2 {
.icon2 {
width: 24px;
color: #666;
color: #B5BBBC;
font-size: 24px;
position: absolute;
top:100px;
left: 15px;
}
a {
font-size: 14px;
color: #0066FF;
margin-left: 250px;
top: 7px;
left: 8px;
}

63
src/app/pages/login/login.component.ts

@ -1,10 +1,12 @@
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http'
import { Data } from '../../interface'
import { Router,ActivatedRoute } from '@angular/router'
import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
import { IsLoginService } from '../../is-login.service'//引入服务
import {CacheTokenService} from '../../http-interceptors/cache-token.service'//引入服务
import { MatSnackBar } from '@angular/material/snack-bar';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
@ -13,51 +15,36 @@ import { MatSnackBar } from '@angular/material/snack-bar';
})
export class LoginComponent implements OnInit {
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,public snackBar: MatSnackBar) { }
constructor(private http:HttpClient,private router:Router,private route:ActivatedRoute,public token:CacheTokenService,public snackBar: MatSnackBar,private isLogin:IsLoginService) { }
ngOnInit() {
}
errmsg :string = ''
onSubmit(e){
this.http.post(
'/api/Account/SignIn',
{
name: e.name,
password: e.password
}
).subscribe(
(data: Data) =>
{
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.router.navigate(['/datacollection'])
errmsg :string = ''; //错误信息
if(e.notlogin){
console.log("true")
localStorage.setItem("isnologin","true")
localStorage.setItem("token",data.token)
localStorage.setItem("refreshToken",data.refreshToken)
}else{
console.log("false")
}
//调用服务中的function刷新token
this.token.startUp()
//调用服务中的function获取菜单
},
(err) =>
{this.errmsg = err}
)
//登录
onSubmit(e){
this.http.post('/api/Account/SignIn',e).subscribe((data:any)=>{
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.token.startUp(); //登陆成功启动定时器刷新token
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.router.navigate(['/home']) //登陆成功跳转页面
this.snackBar.open('登陆成功','确定',config);
},(err) => {this.errmsg = err})
}
//打开弹窗
open () {
this.snackBar.open('请联系管理员', '确定', {
duration: 3000
});
//忘记密码弹窗
forget () {
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000
this.snackBar.open('如果您忘记了密码,请联系管理员重置密码!','确定',config);
}

8
src/app/tabbar/tabbar.component.html

@ -4,13 +4,13 @@
<p style="color: white;border-bottom: 3px solid #fff;border-radius: 3px; font-size: 16px;padding: 0 4px;">指挥长(员)战术战法培训系统</p>
<!-- 未登录状态 -->
<button mat-icon-button class="login" *ngIf="!isLogin.isLogin" (click)='login()'>
<!-- <button mat-icon-button class="login" *ngIf="!isLogin.isLogin" (click)='login()'>
<mat-icon>account_circle</mat-icon>
</button>
</button> -->
<span style="position: absolute;right:100px;color: white;font-size: 16px;" *ngIf="isLogin.isLogin">欢迎您,管理员</span>
<span style="position: absolute;right:100px;color: white;font-size: 16px;">欢迎您,管理员</span>
<!-- 已登录状态 -->
<button mat-icon-button [matMenuTriggerFor]="appMenu" class="login" *ngIf="isLogin.isLogin">
<button mat-icon-button [matMenuTriggerFor]="appMenu" class="login">
<mat-icon>account_circle</mat-icon>
</button>
<mat-menu #appMenu="matMenu">

2
src/app/tabbar/tabbar.component.ts

@ -50,8 +50,8 @@ export class TabbarComponent implements OnInit {
if(out) {
this.http.post('/api/Account/SignOut',{}).subscribe(data=>{
sessionStorage.clear()
this.isLogin.isLogin = false
this.token.delete()
this.router.navigate(['/login'])
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';
config.duration = 3000

1
src/app/ui/all-file/all-file.component.scss

@ -174,6 +174,7 @@
}
}
.mainbox{
overflow-y: auto;
table{
td{
img{

1
src/app/ui/login/login.component.ts

@ -29,7 +29,6 @@ export class LoginComponent implements OnInit {
this.http.post('/api/Account/SignIn',loginMsg).subscribe((data:any)=>{
sessionStorage.setItem("token",data.token);
sessionStorage.setItem("refreshToken",data.refreshToken);
this.isLogin.isLogin = true; //登陆成功设置登录状态为true
this.token.startUp(); //登陆成功启动定时器刷新token
const config = new MatSnackBarConfig();
config.verticalPosition = 'top';

BIN
src/assets/images/loginBackground.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Loading…
Cancel
Save