login.component.ts 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. import { Component, OnInit } from "@angular/core";
  2. import { Router } from "@angular/router";
  3. import { FormBuilder, Validators, FormGroup } from "@angular/forms";
  4. import { NzMessageService } from "ng-zorro-antd/message";
  5. import { MainService } from "../../services/main.service";
  6. import http from "../../../assets/js/http";
  7. import { AES, mode, pad, enc } from "crypto-js";
  8. import { baseUrlType } from "src/app/type/types";
  9. import { ToolService } from 'src/app/services/tool.service';
  10. import { Title } from '@angular/platform-browser';
  11. import { MarkingService } from 'src/app/services/marking.service';
  12. @Component({
  13. selector: "app-login",
  14. templateUrl: "./login.component.html",
  15. styleUrls: ["./login.component.less"],
  16. })
  17. export class LoginComponent implements OnInit {
  18. http: baseUrlType;
  19. validateForm: FormGroup;
  20. loading: boolean = false; // 加载状态
  21. isSingleSignOn: boolean = false; // 是否单点登录
  22. constructor(
  23. private router: Router,
  24. private fb: FormBuilder,
  25. private mainService: MainService,
  26. private msg: NzMessageService,
  27. private tool: ToolService,
  28. private titleService: Title,
  29. private markingService: MarkingService,
  30. ) {}
  31. ngOnInit() {
  32. this.http = http;
  33. this.isSingleSignOn = location.href.includes("?");
  34. if (this.isSingleSignOn) {
  35. this.singleSignOn();
  36. } else {
  37. this.initForm();
  38. }
  39. }
  40. //单点登录
  41. singleSignOn() {
  42. let url = location.href;
  43. let paramsStr = url.split("?")[1];
  44. let paramsObj = {};
  45. paramsStr.split("&").forEach((item) => {
  46. let arr = item.split("=");
  47. paramsObj[arr[0] + 1] = arr[1];
  48. });
  49. this.singleSignOnLogin(paramsObj);
  50. }
  51. // 单点登录
  52. singleSignOnLogin(paramsObj): void {
  53. const loadingId = this.msg.loading("登录中..", { nzDuration: 0 }).messageId;
  54. this.loading = true;
  55. this.mainService.singleSignOnLogin(paramsObj).subscribe(
  56. (data) => {
  57. this.loading = false;
  58. this.msg.remove(loadingId);
  59. this.apiLogin(data.userId, data.pwd, true);
  60. },
  61. (err) => {
  62. this.loading = false;
  63. this.msg.remove(loadingId);
  64. this.msg.error("登录失败", {
  65. nzDuration: 1000,
  66. });
  67. this.router.navigateByUrl("/login");
  68. }
  69. );
  70. }
  71. //aes加密
  72. encryptByEnAES(data: string): string {
  73. let Key = "dsadmin";
  74. let tmpAES = AES.encrypt(data, Key, {
  75. mode: mode.CBC,
  76. padding: pad.Pkcs7,
  77. });
  78. return tmpAES.toString();
  79. }
  80. //aes解密
  81. encryptByDeAES(data: string): string {
  82. let Key = "dsadmin";
  83. let tmpDeAES = AES.decrypt(data, Key, {
  84. mode: mode.CBC,
  85. padding: pad.Pkcs7,
  86. });
  87. return tmpDeAES.toString(enc.Utf8);
  88. }
  89. // 初始化菜单
  90. initMenu(menu) {
  91. let menuLis = this.transform(menu);
  92. menuLis.forEach((item) => {
  93. item.flag = false;
  94. item.flagBg = false;
  95. if (item.childrens) {
  96. item.childrens.forEach((value) => {
  97. value.flag = false;
  98. });
  99. }
  100. });
  101. localStorage.setItem("menu", JSON.stringify(menuLis));
  102. localStorage.setItem("index", "true"); //首页默认高亮
  103. }
  104. // 初始化登录表单
  105. initForm() {
  106. let username, passsword;
  107. // 如果本地存储的有remember字段(记住密码功能)
  108. if (localStorage.getItem("remember")) {
  109. let remember = JSON.parse(localStorage.getItem("remember"));
  110. // 比较记住密码的功能是否在有效期内
  111. if (remember.date > new Date().getTime()) {
  112. username = this.encryptByDeAES(remember.username);
  113. passsword = this.encryptByDeAES(remember.password);
  114. }
  115. }
  116. // 初始化登录表单
  117. this.validateForm = this.fb.group({
  118. userName: [username || null, [Validators.required]],
  119. password: [passsword || null, [Validators.required]],
  120. remember: [Boolean(localStorage.getItem("remember"))],
  121. });
  122. }
  123. // enter触发
  124. enterUp(e): void {
  125. let keyCode = e.which || e.keyCode || 0;
  126. if (keyCode == 13) {
  127. this.submitForm();
  128. }
  129. }
  130. // 登录
  131. submitForm(): void {
  132. for (const i in this.validateForm.controls) {
  133. this.validateForm.controls[i].markAsDirty();
  134. this.validateForm.controls[i].updateValueAndValidity();
  135. }
  136. // 用户名和密码必填
  137. if (
  138. !this.validateForm.value.userName ||
  139. !this.validateForm.value.password
  140. ) {
  141. this.msg.info("用户名或密码不能为空!");
  142. return;
  143. }
  144. this.apiLogin(
  145. this.validateForm.value.userName,
  146. this.validateForm.value.password
  147. );
  148. }
  149. // 登录接口,true是单点登录
  150. apiLogin(user, pwd, flag = false) {
  151. const loadingId = this.msg.loading("登录中..", { nzDuration: 0 }).messageId;
  152. this.loading = true;
  153. this.mainService.login(user, pwd).subscribe((data) => {
  154. this.loading = false;
  155. this.msg.remove(loadingId);
  156. if (data.status == 200) {
  157. if (!flag) {
  158. // 记住密码勾选中
  159. if (this.validateForm.value.remember) {
  160. let remember = {
  161. username: this.encryptByEnAES(this.validateForm.value.userName),
  162. password: this.encryptByEnAES(this.validateForm.value.password),
  163. date: new Date().getTime() + 90 * 24 * 3600 * 1000, //3个月
  164. };
  165. localStorage.setItem("remember", JSON.stringify(remember));
  166. } else {
  167. localStorage.removeItem("remember");
  168. }
  169. }
  170. // 重置系统名称和大屏名称
  171. console.log(data.user);
  172. let hosId = data.user.user.currentHospital ? data.user.user.currentHospital.id : ''
  173. this.tool.getSysNameAndLogoAsync(hosId).subscribe(result => {
  174. let marking = result.project || '';
  175. let logoTitle = result.sysName || '';
  176. let logoUrl = location.origin + '/file' + result.logo || '';
  177. let faviconUrl = location.origin + '/file' + result.favicon || '';
  178. this.markingService.setMarking(marking);
  179. this.tool.setSysName(logoTitle);
  180. this.tool.setLogo(logoUrl);
  181. this.tool.setFavicon(faviconUrl);
  182. this.titleService.setTitle(this.tool.logoTitle);
  183. (document.querySelector('#favicon') as any).href = this.tool.faviconUrl;
  184. this.toRoute2(data);
  185. this.initMenu(data.user.menu);
  186. })
  187. } else {
  188. this.msg.error(data.remarks, {
  189. nzDuration: 1000,
  190. });
  191. }
  192. });
  193. }
  194. // 页面跳转
  195. toRoute2(data) {
  196. let roleMenus = data.user.menu;
  197. let canLogin = false; //是否可以进入系统主页面(无护士端,调度台,药房端权限)
  198. let successLoginMsg = true; //登录成功提示,true是提示,false不提示
  199. let fwt = false;
  200. let ddt = false;
  201. let yfang = false;
  202. roleMenus.forEach((e) => {
  203. if (e.link == "pharmacy") {
  204. yfang = true;
  205. console.log("药房端");
  206. } else if (e.link == "nurse") {
  207. fwt = true;
  208. console.log("护士端");
  209. } else if (e.link == "dispatchingDesk") {
  210. ddt = true;
  211. console.log("调度台");
  212. }
  213. canLogin = true;
  214. });
  215. if (fwt) {
  216. // 护士角色跳护士端
  217. if (successLoginMsg) {
  218. this.msg.success("登录成功!", {
  219. nzDuration: 1000,
  220. });
  221. }
  222. successLoginMsg = false;
  223. localStorage.setItem("user", JSON.stringify(data.user));
  224. this.router.navigateByUrl("/nurse");
  225. return;
  226. } else if (ddt) {
  227. // 调度台
  228. if (successLoginMsg) {
  229. this.msg.success("登录成功!", {
  230. nzDuration: 1000,
  231. });
  232. }
  233. successLoginMsg = false;
  234. localStorage.setItem("user", JSON.stringify(data.user));
  235. this.router.navigateByUrl("/dispatchingDesk");
  236. return;
  237. } else if (yfang) {
  238. // 药房端2
  239. if (successLoginMsg) {
  240. this.msg.success("登录成功!", {
  241. nzDuration: 1000,
  242. });
  243. }
  244. successLoginMsg = false;
  245. localStorage.setItem("user", JSON.stringify(data.user));
  246. this.router.navigateByUrl("/pharmacy2");
  247. return;
  248. }
  249. // 有菜单可以进入系统主页面
  250. if (!canLogin) {
  251. this.msg.success("暂无权限进入系统!", {
  252. nzDuration: 1000,
  253. });
  254. } else {
  255. if (successLoginMsg) {
  256. this.msg.success("登录成功!", {
  257. nzDuration: 1000,
  258. });
  259. }
  260. successLoginMsg = false;
  261. localStorage.setItem("user", JSON.stringify(data.user));
  262. this.router.navigateByUrl("/main/home");
  263. }
  264. }
  265. // 处理树数据(parent格式转为children格式)
  266. transform(nodes): any {
  267. let parents = [];
  268. const idMapping = nodes.reduce((acc, el, i) => {
  269. acc[el.id] = i;
  270. return acc;
  271. }, {});
  272. nodes.forEach((el) => {
  273. if (el.parentid === null || el.parentid === undefined) {
  274. parents.push(el);
  275. } else {
  276. const parentEl = nodes[idMapping[el.parentid]];
  277. parentEl.childrens = [...(parentEl.childrens || []), el];
  278. }
  279. });
  280. return parents;
  281. }
  282. }