import { Component, OnInit } from "@angular/core"; import { Router } from "@angular/router"; import { FormBuilder, Validators, FormGroup } from "@angular/forms"; import { NzMessageService } from "ng-zorro-antd/message"; import { MainService } from "../../services/main.service"; import http from "../../../assets/js/http"; import { AES, mode, pad, enc } from "crypto-js"; import { baseUrlType } from "src/app/type/types"; import { ToolService } from 'src/app/services/tool.service'; import { Title } from '@angular/platform-browser'; import { MarkingService } from 'src/app/services/marking.service'; @Component({ selector: "app-login", templateUrl: "./login.component.html", styleUrls: ["./login.component.less"], }) export class LoginComponent implements OnInit { http: baseUrlType; validateForm: FormGroup; loading: boolean = false; // 加载状态 isSingleSignOn: boolean = false; // 是否单点登录 constructor( private router: Router, private fb: FormBuilder, private mainService: MainService, private msg: NzMessageService, private tool: ToolService, private titleService: Title, private markingService: MarkingService, ) {} ngOnInit() { this.http = http; this.isSingleSignOn = location.href.includes("?"); if (this.isSingleSignOn) { this.singleSignOn(); } else { this.initForm(); } } //单点登录 singleSignOn() { let url = location.href; let paramsStr = url.split("?")[1]; let paramsObj = {}; paramsStr.split("&").forEach((item) => { let arr = item.split("="); paramsObj[arr[0] + 1] = arr[1]; }); this.singleSignOnLogin(paramsObj); } // 单点登录 singleSignOnLogin(paramsObj): void { const loadingId = this.msg.loading("登录中..", { nzDuration: 0 }).messageId; this.loading = true; this.mainService.singleSignOnLogin(paramsObj).subscribe( (data) => { this.loading = false; this.msg.remove(loadingId); this.apiLogin(data.userId, data.pwd, true); }, (err) => { this.loading = false; this.msg.remove(loadingId); this.msg.error("登录失败", { nzDuration: 1000, }); this.router.navigateByUrl("/login"); } ); } //aes加密 encryptByEnAES(data: string): string { let Key = "dsadmin"; let tmpAES = AES.encrypt(data, Key, { mode: mode.CBC, padding: pad.Pkcs7, }); return tmpAES.toString(); } //aes解密 encryptByDeAES(data: string): string { let Key = "dsadmin"; let tmpDeAES = AES.decrypt(data, Key, { mode: mode.CBC, padding: pad.Pkcs7, }); return tmpDeAES.toString(enc.Utf8); } // 初始化菜单 initMenu(menu) { let menuLis = this.transform(menu); menuLis.forEach((item) => { item.flag = false; item.flagBg = false; if (item.childrens) { item.childrens.forEach((value) => { value.flag = false; }); } }); localStorage.setItem("menu", JSON.stringify(menuLis)); localStorage.setItem("index", "true"); //首页默认高亮 } // 初始化登录表单 initForm() { let username, passsword; // 如果本地存储的有remember字段(记住密码功能) if (localStorage.getItem("remember")) { let remember = JSON.parse(localStorage.getItem("remember")); // 比较记住密码的功能是否在有效期内 if (remember.date > new Date().getTime()) { username = this.encryptByDeAES(remember.username); passsword = this.encryptByDeAES(remember.password); } } // 初始化登录表单 this.validateForm = this.fb.group({ userName: [username || null, [Validators.required]], password: [passsword || null, [Validators.required]], remember: [Boolean(localStorage.getItem("remember"))], }); } // enter触发 enterUp(e): void { let keyCode = e.which || e.keyCode || 0; if (keyCode == 13) { this.submitForm(); } } // 登录 submitForm(): void { for (const i in this.validateForm.controls) { this.validateForm.controls[i].markAsDirty(); this.validateForm.controls[i].updateValueAndValidity(); } // 用户名和密码必填 if ( !this.validateForm.value.userName || !this.validateForm.value.password ) { this.msg.info("用户名或密码不能为空!"); return; } this.apiLogin( this.validateForm.value.userName, this.validateForm.value.password ); } // 登录接口,true是单点登录 apiLogin(user, pwd, flag = false) { const loadingId = this.msg.loading("登录中..", { nzDuration: 0 }).messageId; this.loading = true; this.mainService.login(user, pwd).subscribe((data) => { this.loading = false; this.msg.remove(loadingId); if (data.status == 200) { if (!flag) { // 记住密码勾选中 if (this.validateForm.value.remember) { let remember = { username: this.encryptByEnAES(this.validateForm.value.userName), password: this.encryptByEnAES(this.validateForm.value.password), date: new Date().getTime() + 90 * 24 * 3600 * 1000, //3个月 }; localStorage.setItem("remember", JSON.stringify(remember)); } else { localStorage.removeItem("remember"); } } // 重置系统名称和大屏名称 console.log(data.user); let hosId = data.user.user.currentHospital ? data.user.user.currentHospital.id : '' this.tool.getSysNameAndLogoAsync(hosId).subscribe(result => { let marking = result.project || ''; let logoTitle = result.sysName || ''; let logoUrl = location.origin + '/file' + result.logo || ''; let faviconUrl = location.origin + '/file' + result.favicon || ''; this.markingService.setMarking(marking); this.tool.setSysName(logoTitle); this.tool.setLogo(logoUrl); this.tool.setFavicon(faviconUrl); this.titleService.setTitle(this.tool.logoTitle); (document.querySelector('#favicon') as any).href = this.tool.faviconUrl; this.toRoute2(data); this.initMenu(data.user.menu); }) } else { this.msg.error(data.remarks, { nzDuration: 1000, }); } }); } // 页面跳转 toRoute2(data) { let roleMenus = data.user.menu; let canLogin = false; //是否可以进入系统主页面(无护士端,调度台,药房端权限) let successLoginMsg = true; //登录成功提示,true是提示,false不提示 let fwt = false; let ddt = false; let yfang = false; roleMenus.forEach((e) => { if (e.link == "pharmacy") { yfang = true; console.log("药房端"); } else if (e.link == "nurse") { fwt = true; console.log("护士端"); } else if (e.link == "dispatchingDesk") { ddt = true; console.log("调度台"); } canLogin = true; }); if (fwt) { // 护士角色跳护士端 if (successLoginMsg) { this.msg.success("登录成功!", { nzDuration: 1000, }); } successLoginMsg = false; localStorage.setItem("user", JSON.stringify(data.user)); this.router.navigateByUrl("/nurse"); return; } else if (ddt) { // 调度台 if (successLoginMsg) { this.msg.success("登录成功!", { nzDuration: 1000, }); } successLoginMsg = false; localStorage.setItem("user", JSON.stringify(data.user)); this.router.navigateByUrl("/dispatchingDesk"); return; } else if (yfang) { // 药房端2 if (successLoginMsg) { this.msg.success("登录成功!", { nzDuration: 1000, }); } successLoginMsg = false; localStorage.setItem("user", JSON.stringify(data.user)); this.router.navigateByUrl("/pharmacy2"); return; } // 有菜单可以进入系统主页面 if (!canLogin) { this.msg.success("暂无权限进入系统!", { nzDuration: 1000, }); } else { if (successLoginMsg) { this.msg.success("登录成功!", { nzDuration: 1000, }); } successLoginMsg = false; localStorage.setItem("user", JSON.stringify(data.user)); this.router.navigateByUrl("/main/home"); } } // 处理树数据(parent格式转为children格式) transform(nodes): any { let parents = []; const idMapping = nodes.reduce((acc, el, i) => { acc[el.id] = i; return acc; }, {}); nodes.forEach((el) => { if (el.parentid === null || el.parentid === undefined) { parents.push(el); } else { const parentEl = nodes[idMapping[el.parentid]]; parentEl.childrens = [...(parentEl.childrens || []), el]; } }); return parents; } }