import {Injectable} from '@angular/core'; import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild, UrlTree } from '@angular/router'; import {AuthService} from "../../core/services/auth/auth-service"; import {MenuUtilsService} from "../../core/services/menu/menu-utils.service"; import * as dd from 'dingtalk-jsapi'; import {ApiAnon} from '../../core/services/http/apiAnon'; import {User} from '../../models/system/user'; import {AppData} from '../../../df-ext/app-data'; @Injectable({ providedIn: 'root', }) export class DingtalkRegisterGuard implements CanActivate, CanActivateChild { constructor(private authService: AuthService, private apiAnon: ApiAnon, private menuUtilsService: MenuUtilsService, private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise | Promise { const url: string = state.url; console.warn('canActivate'); return this.checkLogin(url); } canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise | Promise { return this.canActivate(route, state); } checkLogin(url: string): Promise | Promise { // Store the attempted URL for redirecting this.authService.redirectUrl = url; // 需要等待authService完成自己的加载 return new Promise((resolve, reject) => { this.authService.ready().then(() => { // console.log('this.authService.getUser()', this.authService.getUser()); if (this.authService.getUser() && this.authService.getUser().dingtalkInfo && this.authService.getUser().dingtalkInfo.ddName) { resolve(true); } else { dd.ready(() => { dd.runtime.permission.requestAuthCode({corpId: AppData.config.CORP_ID}) .then((result) => { this.apiAnon.post('dingding/token', result.code) .subscribe((res: any) => { if (res && res.code === 1) { // 记住用户信息,再次打开不再使用钉钉免登 const _user = new User(); _user.id = res.result.id; _user.name = res.result.name; _user.accessToken = res.result.accessToken; _user.resourceList = res.result.resourceList; _user.office = res.result.office; _user.roleList = res.result.sysRoleInfoDtos; _user.dingtalkInfo = res.result.dingtalkInfo; this.authService.setAccessToken(_user).then(() => { resolve(true); }); } else if (res && res.code === 0) { const _user = new User(); _user.accessToken = ""; _user.dingtalkInfo = res.result.dingtalkInfo; this.authService.setAccessToken(_user).then(() => { resolve(true); }); } else { resolve(this.router.parseUrl("error")); } }, (err) => { resolve(this.router.parseUrl("error")); }); }); }); } }); }); } }